Branch data Line data Source code
1 : : /* utils.cc: Various useful utilities
2 : : *
3 : : * Copyright 1999,2000,2001 BrightStation PLC
4 : : * Copyright 2002 Ananova Ltd
5 : : * Copyright 2003,2004,2005,2007,2008,2009 Olly Betts
6 : : *
7 : : * This program is free software; you can redistribute it and/or
8 : : * modify it under the terms of the GNU General Public License as
9 : : * published by the Free Software Foundation; either version 2 of the
10 : : * License, or (at your option) any later version.
11 : : *
12 : : * This program is distributed in the hope that it will be useful,
13 : : * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 : : * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 : : * GNU General Public License for more details.
16 : : *
17 : : * You should have received a copy of the GNU General Public License
18 : : * along with this program; if not, write to the Free Software
19 : : * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301
20 : : * USA
21 : : */
22 : :
23 : : #include <config.h>
24 : :
25 : : #include "utils.h"
26 : :
27 : : #include "xapian/error.h"
28 : : #include "safedirent.h"
29 : : #include "safeerrno.h"
30 : :
31 : : #include <sys/types.h>
32 : : #include <cfloat>
33 : : #include <cmath>
34 : :
35 : : using namespace std;
36 : :
37 : : bool
38 : 13517 : file_exists(const string &fname)
39 : : {
40 : : struct stat sbuf;
41 : : // exists && is a regular file
42 [ + + ][ + - ]: 13517 : return stat(fname, &sbuf) == 0 && S_ISREG(sbuf.st_mode);
43 : : }
44 : :
45 : : bool
46 : 9 : dir_exists(const string &fname)
47 : : {
48 : : struct stat sbuf;
49 : : // exists && is a directory
50 [ + + ][ + - ]: 9 : return stat(fname, &sbuf) == 0 && S_ISDIR(sbuf.st_mode);
51 : : }
52 : :
53 : : class dircloser {
54 : : DIR * dir;
55 : : public:
56 : 21 : dircloser(DIR * dir_) : dir(dir_) {}
57 : 21 : ~dircloser() {
58 [ + - ]: 21 : if (dir != NULL) {
59 : 21 : closedir(dir);
60 : 21 : dir = NULL;
61 : : }
62 : 21 : }
63 : : };
64 : :
65 : : void
66 : 42 : removedir(const string &dirname)
67 : : {
68 : : DIR * dir;
69 : :
70 : 42 : dir = opendir(dirname.c_str());
71 [ + + ]: 42 : if (dir == NULL) {
72 [ + - ]: 21 : if (errno == ENOENT) return;
73 : 0 : throw Xapian::DatabaseError("Cannot open directory '" + dirname + "'", errno);
74 : : }
75 : :
76 : : {
77 : 21 : dircloser dc(dir);
78 : 276 : while (true) {
79 : 297 : errno = 0;
80 : 297 : struct dirent * entry = readdir(dir);
81 [ + + ]: 297 : if (entry == NULL) {
82 [ - + ]: 21 : if (errno == 0)
83 : : break;
84 : 0 : throw Xapian::DatabaseError("Cannot read entry from directory at '" + dirname + "'", errno);
85 : : }
86 : 276 : string name(entry->d_name);
87 [ + + + + ]: 276 : if (name == "." || name == "..")
[ + + ]
88 : 42 : continue;
89 [ - + ]: 234 : if (unlink(dirname + "/" + name)) {
90 : 234 : throw Xapian::DatabaseError("Cannot remove file '" + string(entry->d_name) + "'", errno);
91 : : }
92 : 21 : }
93 : : }
94 [ - + ]: 21 : if (rmdir(dirname.c_str())) {
95 : 42 : throw Xapian::DatabaseError("Cannot remove directory '" + dirname + "'", errno);
96 : : }
97 : : }
98 : :
99 : : namespace Xapian {
100 : : namespace Internal {
101 : :
102 : 0 : bool within_DBL_EPSILON(double a, double b) {
103 : 0 : return fabs(a - b) >= DBL_EPSILON;
104 : : }
105 : :
106 : : }
107 : : }
|