Prepared windows port by removing a number of spurious reference to unix-specific interfaces, and using some xapian posix adaptor includes

This commit is contained in:
Jean-Francois Dockes 2015-08-19 14:41:10 +02:00
parent e693344c96
commit fca3ad235f
37 changed files with 566 additions and 382 deletions

View file

@ -21,7 +21,8 @@ COMMONCPPFLAGS = -I. \
-I$(top_srcdir)/internfile \ -I$(top_srcdir)/internfile \
-I$(top_srcdir)/rcldb \ -I$(top_srcdir)/rcldb \
-I$(top_srcdir)/unac \ -I$(top_srcdir)/unac \
-I$(top_srcdir)/utils -I$(top_srcdir)/utils \
-I$(top_srcdir)/xaposix
AM_CPPFLAGS = -Wall -Wno-unused \ AM_CPPFLAGS = -Wall -Wno-unused \
$(COMMONCPPFLAGS) \ $(COMMONCPPFLAGS) \
@ -50,10 +51,6 @@ aspell/rclaspell.h \
bincimapmime/config.h \ bincimapmime/config.h \
bincimapmime/convert.cc \ bincimapmime/convert.cc \
bincimapmime/convert.h \ bincimapmime/convert.h \
bincimapmime/iodevice.cc \
bincimapmime/iodevice.h \
bincimapmime/iofactory.cc \
bincimapmime/iofactory.h \
bincimapmime/mime-inputsource.h \ bincimapmime/mime-inputsource.h \
bincimapmime/mime-parsefull.cc \ bincimapmime/mime-parsefull.cc \
bincimapmime/mime-parseonlyheader.cc \ bincimapmime/mime-parseonlyheader.cc \

View file

@ -23,10 +23,6 @@
* Foundation, Inc., 59 Temple Street #330, Boston, MA 02111-1307, USA. * Foundation, Inc., 59 Temple Street #330, Boston, MA 02111-1307, USA.
* -------------------------------------------------------------------- * --------------------------------------------------------------------
*/ */
#ifdef HAVE_CONFIG_H
#include <config.h>
#endif
#ifndef convert_h_included #ifndef convert_h_included
#define convert_h_included #define convert_h_included
#include <string> #include <string>
@ -35,7 +31,6 @@
#include <iostream> #include <iostream>
#include <stdio.h> #include <stdio.h>
#include <sys/stat.h>
#include <cstdlib> #include <cstdlib>
#include <cstring> #include <cstring>

View file

@ -17,29 +17,22 @@
#ifndef TEST_RCLCONFIG #ifndef TEST_RCLCONFIG
#include "autoconfig.h" #include "autoconfig.h"
#include <unistd.h>
#include <fcntl.h>
#include <stdio.h> #include <stdio.h>
#include <errno.h> #include <errno.h>
#include <langinfo.h> #include <langinfo.h>
#include <limits.h> #include <limits.h>
#include "safesysstat.h"
#include <sys/param.h> #include <sys/param.h>
#include <algorithm>
#include <list>
using std::list;
#include <sys/types.h>
#include <sys/stat.h>
#ifdef __FreeBSD__ #ifdef __FreeBSD__
#include <osreldate.h> #include <osreldate.h>
#endif #endif
#include <algorithm>
#include <list>
#include <iostream> #include <iostream>
#include <sstream> #include <sstream>
#include <cstdlib> #include <cstdlib>
#include <cstring> #include <cstring>
using namespace std;
#include "cstr.h" #include "cstr.h"
#include "pathut.h" #include "pathut.h"
@ -52,6 +45,8 @@ using namespace std;
#include "fstreewalk.h" #include "fstreewalk.h"
#include "cpuconf.h" #include "cpuconf.h"
using namespace std;
typedef pair<int,int> RclPII; typedef pair<int,int> RclPII;
// Static, logically const, RclConfig members are initialized once from the // Static, logically const, RclConfig members are initialized once from the

View file

@ -1,45 +0,0 @@
#*
*.cache
*.core
*.o
*~
.#*
.#*
.moc
.obj
.svn
.ui
*.pyc
CVS
TAGS
alldeps
autom4*
config.cache
config.log
config.status
doc/user/usermanual.aux
doc/user/usermanual.log
doc/user/usermanual.out
doc/user/usermanual.pdf
doc/user/usermanual.tex-pdf
doc/user/usermanual.tex-pdf-tmp
excludefile
kde/recoll_applet
lib/librcl.a
makesrcdist.sh
mk/localdefs
mk/manifest.txt
php/recoll/include/
php/recoll/modules/
qtgui/Makefile
qtgui/preview/Makefile
qtgui/preview/preview.pro
qtgui/preview/pvmain.cpp
qtgui/recoll.pro
qt4gui/images
recollinstall
sampleconf/recoll.conf
sysconf
wasabi
wxgui
makesrcdist-force.sh

View file

@ -16,10 +16,9 @@
*/ */
#include "autoconfig.h" #include "autoconfig.h"
#include <unistd.h>
#include <sys/types.h>
#include <string.h> #include <string.h>
#include <errno.h> #include <errno.h>
#include "safesysstat.h"
#include "cstr.h" #include "cstr.h"
#include "pathut.h" #include "pathut.h"
@ -43,9 +42,6 @@
using namespace std; using namespace std;
#include <sys/stat.h>
// Beagle creates a file named .xxx (where xxx is the name for the main file // Beagle creates a file named .xxx (where xxx is the name for the main file
// in the queue), to hold external metadata (http or created by Beagle). // in the queue), to hold external metadata (http or created by Beagle).
// This class reads the .xxx, dotfile, and turns it into an Rcl::Doc holder // This class reads the .xxx, dotfile, and turns it into an Rcl::Doc holder

View file

@ -14,16 +14,10 @@
* Free Software Foundation, Inc., * Free Software Foundation, Inc.,
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/ */
#ifdef HAVE_CONFIG_H
#include "autoconfig.h" #include "autoconfig.h"
#endif
#include <sys/stat.h>
#include <errno.h>
#include "debuglog.h" #include "debuglog.h"
#include "rcldoc.h" #include "rcldoc.h"
#include "fetcher.h" #include "fetcher.h"
#include "bglfetcher.h" #include "bglfetcher.h"
#include "debuglog.h" #include "debuglog.h"

View file

@ -17,7 +17,7 @@
#ifndef _FETCHER_H_INCLUDED_ #ifndef _FETCHER_H_INCLUDED_
#define _FETCHER_H_INCLUDED_ #define _FETCHER_H_INCLUDED_
#include <sys/stat.h> #include "safesysstat.h"
#include <string> #include <string>
#include "rcldoc.h" #include "rcldoc.h"

View file

@ -14,12 +14,10 @@
* Free Software Foundation, Inc., * Free Software Foundation, Inc.,
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/ */
#ifdef HAVE_CONFIG_H
#include "autoconfig.h" #include "autoconfig.h"
#endif
#include <sys/stat.h>
#include <errno.h> #include <errno.h>
#include "safesysstat.h"
#include "debuglog.h" #include "debuglog.h"
#include "cstr.h" #include "cstr.h"

View file

@ -17,10 +17,9 @@
#include "autoconfig.h" #include "autoconfig.h"
#include <stdio.h> #include <stdio.h>
#include <sys/stat.h>
#include <unistd.h>
#include <errno.h> #include <errno.h>
#include <cstring> #include <cstring>
#include "safesysstat.h"
#include <iostream> #include <iostream>
#include <list> #include <list>

View file

@ -19,7 +19,6 @@
#endif #endif
#include <stdio.h> #include <stdio.h>
#include "safesystat.h"
#include <errno.h> #include <errno.h>
#include <algorithm> #include <algorithm>
@ -30,6 +29,7 @@
#include "fsindexer.h" #include "fsindexer.h"
#include "beaglequeue.h" #include "beaglequeue.h"
#include "mimehandler.h" #include "mimehandler.h"
#include "pathut.h"
#ifdef RCL_USE_ASPELL #ifdef RCL_USE_ASPELL
#include "rclaspell.h" #include "rclaspell.h"
@ -57,9 +57,7 @@ ConfIndexer::~ConfIndexer()
bool ConfIndexer::runFirstIndexing() bool ConfIndexer::runFirstIndexing()
{ {
// Indexing status file existing and not empty ? // Indexing status file existing and not empty ?
struct stat st; if (path_filesize(m_config->getIdxStatusFile()) > 0) {
if (stat(m_config->getIdxStatusFile().c_str(), &st) == 0 &&
st.st_size > 0) {
LOGDEB0(("ConfIndexer::runFirstIndexing: no: status file not empty\n")); LOGDEB0(("ConfIndexer::runFirstIndexing: no: status file not empty\n"));
return false; return false;
} }

View file

@ -18,7 +18,7 @@
#ifndef TEST_MIMETYPE #ifndef TEST_MIMETYPE
#include "autoconfig.h" #include "autoconfig.h"
#include <sys/stat.h> #include "safesysstat.h"
#include <ctype.h> #include <ctype.h>
#include <string> #include <string>
@ -185,7 +185,7 @@ string mimetype(const string &fn, const struct stat *stp,
#else // TEST-> #else // TEST->
#include <stdio.h> #include <stdio.h>
#include <sys/stat.h> #include "safesysstat.h"
#include <cstdlib> #include <cstdlib>
#include <iostream> #include <iostream>

View file

@ -25,10 +25,7 @@
*/ */
#include <pthread.h> #include <pthread.h>
#include <fcntl.h>
#include <unistd.h>
#include <errno.h> #include <errno.h>
#include <signal.h>
#include <fnmatch.h> #include <fnmatch.h>
#include <cstring> #include <cstring>

View file

@ -16,11 +16,12 @@
* Free Software Foundation, Inc., * Free Software Foundation, Inc.,
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/ */
#include <unistd.h> #include "autoconfig.h"
#include <sys/stat.h>
#include <errno.h> #include <errno.h>
#include <cstdio> #include <cstdio>
#include <cstring> #include <cstring>
#include "safesysstat.h"
#include "debuglog.h" #include "debuglog.h"
#include "rclmon.h" #include "rclmon.h"
@ -298,7 +299,6 @@ bool eraseWatchSubTree(map<int, string>& idtopath, const string& top)
#include <fam.h> #include <fam.h>
#include <sys/select.h> #include <sys/select.h>
#include <setjmp.h> #include <setjmp.h>
#include <unistd.h>
#include <signal.h> #include <signal.h>
/** FAM based monitor class. We have to keep a record of FAM watch /** FAM based monitor class. We have to keep a record of FAM watch

View file

@ -63,7 +63,6 @@ bool subtreelist(RclConfig *config, const string& top,
#include <stdio.h> #include <stdio.h>
#include <stdlib.h> #include <stdlib.h>
#include <unistd.h>
#include <errno.h> #include <errno.h>
#include <string.h> #include <string.h>

View file

@ -19,11 +19,11 @@
#include "autoconfig.h" #include "autoconfig.h"
#include <stdio.h> #include <stdio.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <errno.h> #include <errno.h>
#include "safefcntl.h"
#include <sys/types.h>
#include "safesysstat.h"
#include "safeunistd.h"
#include <string> #include <string>
#include <iostream> #include <iostream>
@ -1117,7 +1117,7 @@ bool FileInterner::maybeUncompressToTemp(TempFile& temp, const string& fn,
#include <stdlib.h> #include <stdlib.h>
#include <iostream> #include <iostream>
#include <string> #include <string>
#include <sys/stat.h> #include "safesysstat.h"
using namespace std; using namespace std;

View file

@ -18,13 +18,11 @@
#include "autoconfig.h" #include "autoconfig.h"
#include <stdio.h> #include <stdio.h>
#include <fcntl.h>
#include <errno.h> #include <errno.h>
#include <unistd.h> #include <sys/types.h>
#include "safesysstat.h"
#include <time.h> #include <time.h>
#include <regex.h> #include <regex.h>
#include <sys/stat.h>
#include <errno.h>
#include <cstring> #include <cstring>
#include <map> #include <map>
@ -272,9 +270,15 @@ bool MimeHandlerMbox::set_document_file(const string& mt, const string &fn)
// perror("fcntl"); // perror("fcntl");
} }
#endif #endif
fseek((FILE *)m_vfp, 0, SEEK_END); // Used to use ftell() here: no good beyond 2GB
m_fsize = ftell((FILE*)m_vfp); {struct stat st;
fseek((FILE*)m_vfp, 0, SEEK_SET); if (fstat(fileno((FILE*)m_vfp), &st) < 0) {
LOGERR(("MimeHandlerMbox:setdocfile: fstat(%s) failed errno %d\n",
fn.c_str(), errno));
return false;
}
m_fsize = st.st_size;
}
m_havedoc = true; m_havedoc = true;
m_offsets.clear(); m_offsets.clear();
m_quirks = 0; m_quirks = 0;

View file

@ -17,15 +17,11 @@
#include "autoconfig.h" #include "autoconfig.h"
#include <stdio.h> #include <stdio.h>
#include <unistd.h>
#include <sys/stat.h>
#include <errno.h> #include <errno.h>
#include <iostream> #include <iostream>
#include <string> #include <string>
#ifndef NO_NAMESPACES
using namespace std; using namespace std;
#endif /* NO_NAMESPACES */
#include "cstr.h" #include "cstr.h"
#include "mh_text.h" #include "mh_text.h"
@ -34,6 +30,7 @@ using namespace std;
#include "md5ut.h" #include "md5ut.h"
#include "rclconfig.h" #include "rclconfig.h"
#include "pxattr.h" #include "pxattr.h"
#include "pathut.h"
const int MB = 1024*1024; const int MB = 1024*1024;
const int KB = 1024; const int KB = 1024;
@ -47,8 +44,8 @@ bool MimeHandlerText::set_document_file(const string& mt, const string &fn)
m_fn = fn; m_fn = fn;
// file size for oversize check // file size for oversize check
struct stat st; long long fsize = path_filesize(m_fn);
if (stat(m_fn.c_str(), &st) < 0) { if (fsize < 0) {
LOGERR(("MimeHandlerText::set_document_file: stat(%s) errno %d\n", LOGERR(("MimeHandlerText::set_document_file: stat(%s) errno %d\n",
m_fn.c_str(), errno)); m_fn.c_str(), errno));
return false; return false;
@ -62,7 +59,7 @@ bool MimeHandlerText::set_document_file(const string& mt, const string &fn)
int maxmbs = 20; int maxmbs = 20;
m_config->getConfParam("textfilemaxmbs", &maxmbs); m_config->getConfParam("textfilemaxmbs", &maxmbs);
if (maxmbs == -1 || st.st_size / MB <= maxmbs) { if (maxmbs == -1 || fsize / MB <= maxmbs) {
// Text file page size: if set, we split text files into // Text file page size: if set, we split text files into
// multiple documents // multiple documents
int ps = 1000; int ps = 1000;

View file

@ -18,14 +18,10 @@
#include "autoconfig.h" #include "autoconfig.h"
#include <errno.h> #include <errno.h>
#include <sys/stat.h>
#include <string> #include <string>
#include <vector> #include <vector>
#include <map> #include <map>
using std::map;
using std::string;
using std::vector;
#include "uncomp.h" #include "uncomp.h"
#include "debuglog.h" #include "debuglog.h"
@ -33,6 +29,10 @@ using std::vector;
#include "execmd.h" #include "execmd.h"
#include "pathut.h" #include "pathut.h"
using std::map;
using std::string;
using std::vector;
Uncomp::UncompCache Uncomp::o_cache; Uncomp::UncompCache Uncomp::o_cache;
bool Uncomp::uncompressfile(const string& ifn, bool Uncomp::uncompressfile(const string& ifn,
@ -70,8 +70,8 @@ bool Uncomp::uncompressfile(const string& ifn,
m_dir->dirname())); m_dir->dirname()));
// Hope for the best // Hope for the best
} else { } else {
struct stat stb; long long fsize = path_filesize(ifn);
if (stat(ifn.c_str(), &stb) < 0) { if (fsize < 0) {
LOGERR(("uncompressfile: stat input file %s errno %d\n", LOGERR(("uncompressfile: stat input file %s errno %d\n",
ifn.c_str(), errno)); ifn.c_str(), errno));
return false; return false;
@ -82,7 +82,7 @@ bool Uncomp::uncompressfile(const string& ifn,
// have enough space before trying. We take a little margin // have enough space before trying. We take a little margin
// use same Mb def as fsocc() // use same Mb def as fsocc()
long long filembs = stb.st_size / (1024 * 1024); long long filembs = fsize / (1024 * 1024);
if (availmbs < 2 * filembs + 1) { if (availmbs < 2 * filembs + 1) {
LOGERR(("uncompressfile. %lld MBs available in %s not enough " LOGERR(("uncompressfile. %lld MBs available in %s not enough "

View file

@ -43,8 +43,8 @@ public:
private: private:
TempDir *m_dir; TempDir *m_dir;
string m_tfile; std::string m_tfile;
string m_srcpath; std::string m_srcpath;
bool m_docache; bool m_docache;
class UncompCache { class UncompCache {
@ -59,8 +59,8 @@ private:
} }
PTMutexInit m_lock; PTMutexInit m_lock;
TempDir *m_dir; TempDir *m_dir;
string m_tfile; std::string m_tfile;
string m_srcpath; std::string m_srcpath;
}; };
static UncompCache o_cache; static UncompCache o_cache;
}; };

View file

@ -17,7 +17,7 @@
#include "autoconfig.h" #include "autoconfig.h"
#include <sys/stat.h> #include "safesysstat.h"
#include <string> #include <string>
#include <vector> #include <vector>

View file

@ -14,10 +14,6 @@
* Free Software Foundation, Inc., * Free Software Foundation, Inc.,
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/ */
#include <unistd.h>
#include <stdlib.h>
#include <time.h>
#include <sys/stat.h>
#include <list> #include <list>
#include <utility> #include <utility>

View file

@ -18,9 +18,7 @@
/** Saving and restoring named queries */ /** Saving and restoring named queries */
#include <fcntl.h> #include "safesysstat.h"
#include <sys/stat.h>
#include <sys/types.h>
#include <QSettings> #include <QSettings>
#include <QMessageBox> #include <QMessageBox>

View file

@ -107,7 +107,7 @@ unix {
@LIBICONV@ $(BDYNAMIC) @LIBQZEITGEIST@ -lz @LIBICONV@ $(BDYNAMIC) @LIBQZEITGEIST@ -lz
INCLUDEPATH += ../common ../index ../internfile ../query ../unac \ INCLUDEPATH += ../common ../index ../internfile ../query ../unac \
../utils ../aspell ../rcldb ../qtgui \ ../utils ../aspell ../rcldb ../qtgui ../xaposix \
confgui confgui
DEPENDPATH += $$INCLUDEPATH DEPENDPATH += $$INCLUDEPATH
} }

View file

@ -17,12 +17,9 @@
#include "autoconfig.h" #include "autoconfig.h"
#include <stdio.h> #include <stdio.h>
#include <unistd.h> #include "safesysstat.h"
#include <fcntl.h>
#include <signal.h>
#include <sys/stat.h>
#include <string> #include <string>
using std::string;
#include <QCheckBox> #include <QCheckBox>
#include <QMessageBox> #include <QMessageBox>
@ -35,6 +32,8 @@ using std::string;
#include "readfile.h" #include "readfile.h"
#include "execmd.h" #include "execmd.h"
using std::string;
static const char *rautostartfile = ".config/autostart/recollindex.desktop"; static const char *rautostartfile = ".config/autostart/recollindex.desktop";
// Just in case we don't find the file in the shared dir, have a // Just in case we don't find the file in the shared dir, have a

View file

@ -16,7 +16,7 @@
*/ */
#include "autoconfig.h" #include "autoconfig.h"
#include <sys/stat.h> #include "safesysstat.h"
#include <string> #include <string>
#include <algorithm> #include <algorithm>

View file

@ -18,16 +18,13 @@
#include <stdio.h> #include <stdio.h>
#include <stdlib.h> #include <stdlib.h>
#include <unistd.h>
#include <errno.h> #include <errno.h>
#include <string.h> #include <string.h>
#include <sys/stat.h>
#include <limits.h> #include <limits.h>
#include <iostream> #include <iostream>
#include <list> #include <list>
#include <string> #include <string>
using namespace std;
#include "rcldb.h" #include "rcldb.h"
#include "rclquery.h" #include "rclquery.h"
@ -43,6 +40,8 @@ using namespace std;
#include "smallut.h" #include "smallut.h"
#include "base64.h" #include "base64.h"
using namespace std;
bool dump_contents(RclConfig *rclconfig, Rcl::Doc& idoc) bool dump_contents(RclConfig *rclconfig, Rcl::Doc& idoc)
{ {
FileInterner interner(idoc, rclconfig, FileInterner::FIF_forPreview); FileInterner interner(idoc, rclconfig, FileInterner::FIF_forPreview);

View file

@ -4,7 +4,7 @@ include ../utils/utmkdefs.mk
PROGS = pxattr trclosefrom trecrontab \ PROGS = pxattr trclosefrom trecrontab \
trnetcon trcopyfile trcircache trmd5 trreadfile trfileudi \ trnetcon trcopyfile trcircache trmd5 trreadfile trfileudi \
trconftree wipedir smallut trfstreewalk trpathut transcode trbase64 \ trconftree wipedir smallut trfstreewalk trpathut transcode trbase64 \
trmimeparse trexecmd utf8iter idfile trmimeparse trexecmd utf8iter idfile ptmutex workqueue trappformime
all: $(PROGS) all: $(PROGS)

View file

@ -19,17 +19,39 @@
#include "autoconfig.h" #include "autoconfig.h"
#include <stdio.h> #include <stdio.h>
#include <errno.h>
#include <sys/stat.h>
#include <assert.h>
#include <fcntl.h>
#include <sys/types.h>
#include <sys/uio.h>
#include <unistd.h>
#include <stdlib.h> #include <stdlib.h>
#include <errno.h>
#include "safefcntl.h"
#include <sys/types.h>
#include "safesysstat.h"
#include "safeunistd.h"
#include <assert.h>
#include <memory.h> #include <memory.h>
#include <zlib.h> #include <zlib.h>
#ifndef _WIN32
#include <sys/uio.h>
#else
struct iovec {
void *iov_base;
size_t iov_len;
};
static ssize_t writev(int fd, const struct iovec *iov, int iovcnt)
{
ssize_t tot = 0;
for (int i = 0; i < iovcnt; i++) {
ssize_t ret = ::write(fd, iov[i].iov_base, iov[i].iov_len);
if (ret > 0)
tot += ret;
if (ret != (ssize_t)iov[i].iov_len) {
return ret == -1 ? -1 : tot;
}
}
return tot;
}
#endif
#include <sstream> #include <sstream>
#include <iostream> #include <iostream>
#include <map> #include <map>
@ -1310,11 +1332,11 @@ static bool inflateToDynBuf(void* inp, UINT inlen, void **outpp, UINT *outlenp)
#include <stdio.h> #include <stdio.h>
#include <stdlib.h> #include <stdlib.h>
#include <unistd.h>
#include <errno.h> #include <errno.h>
#include <string.h> #include <string.h>
#include <sys/stat.h>
#include <sys/types.h> #include <sys/types.h>
#include "safesysstat.h"
#include "safeunistd.h"
#include <string> #include <string>
#include <iostream> #include <iostream>

View file

@ -20,10 +20,9 @@
#ifndef TEST_CONFTREE #ifndef TEST_CONFTREE
#include <unistd.h> // for access(2)
#include <ctype.h> #include <ctype.h>
#include <fnmatch.h> #include <fnmatch.h>
#include <sys/stat.h> #include "safesysstat.h"
#include <fstream> #include <fstream>
#include <sstream> #include <sstream>

View file

@ -16,11 +16,11 @@
*/ */
#ifndef TEST_COPYFILE #ifndef TEST_COPYFILE
#include <stdio.h> #include <stdio.h>
#include <fcntl.h>
#include <errno.h> #include <errno.h>
#include <unistd.h> #include "safefcntl.h"
#include <sys/types.h> #include <sys/types.h>
#include <sys/stat.h> #include "safesysstat.h"
#include "safeunistd.h"
#include <sys/time.h> #include <sys/time.h>
#include <utime.h> #include <utime.h>

View file

@ -28,7 +28,7 @@
#include <errno.h> #include <errno.h>
#include <sys/types.h> #include <sys/types.h>
#include <sys/file.h> #include <sys/file.h>
#include <sys/stat.h> #include "safesysstat.h"
#include <glob.h> #include <glob.h>
// Let's include all files where statfs can be defined and hope for no // Let's include all files where statfs can be defined and hope for no
@ -425,6 +425,14 @@ bool path_isdir(const string& path)
return false; return false;
} }
long long path_filesize(const string& path)
{
struct stat st;
if (stat(path.c_str(), &st) < 0)
return -1;
return (long long)st.st_size;
}
// Allowed punctuation in the path part of an URI according to RFC2396 // Allowed punctuation in the path part of an URI according to RFC2396
// -_.!~*'():@&=+$, // -_.!~*'():@&=+$,
/* /*

View file

@ -72,6 +72,9 @@ extern std::string url_gpath(const std::string& url);
/// Stat parameter and check if it's a directory /// Stat parameter and check if it's a directory
extern bool path_isdir(const std::string& path); extern bool path_isdir(const std::string& path);
/// Retrieve file size
extern long long path_filesize(const std::string& path);
/// Dump directory /// Dump directory
extern bool readdir(const std::string& dir, std::string& reason, extern bool readdir(const std::string& dir, std::string& reason,
std::set<std::string>& entries); std::set<std::string>& entries);

View file

@ -17,14 +17,11 @@
#ifndef TEST_READFILE #ifndef TEST_READFILE
#include "autoconfig.h" #include "autoconfig.h"
#include <unistd.h>
#include <fcntl.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <errno.h> #include <errno.h>
#include <cstdio> #include "safefcntl.h"
#include <cstring> #include <sys/types.h>
#include "safesysstat.h"
#include "safeunistd.h"
#include <string> #include <string>
@ -163,9 +160,9 @@ bool file_scan(const string &fn, FileScanDo* doer, off_t startoffs,
#include "autoconfig.h" #include "autoconfig.h"
#include <stdio.h> #include <stdio.h>
#include <sys/stat.h>
#include <stdlib.h>
#include <sys/types.h> #include <sys/types.h>
#include "safesysstat.h"
#include <stdlib.h>
#include <string> #include <string>
#include <iostream> #include <iostream>

View file

@ -19,22 +19,22 @@
#ifndef TEST_WIPEDIR #ifndef TEST_WIPEDIR
#include "autoconfig.h" #include "autoconfig.h"
#include <unistd.h>
#include <fcntl.h>
#include <dirent.h>
#include <sys/stat.h>
#include <errno.h> #include <errno.h>
#include "safefcntl.h"
#include <sys/types.h>
#include "safesysstat.h"
#include "safeunistd.h"
#include <dirent.h>
#include <cstring> #include <cstring>
#include <string> #include <string>
#ifndef NO_NAMESPACES
using namespace std;
#endif /* NO_NAMESPACES */
#include "debuglog.h" #include "debuglog.h"
#include "pathut.h" #include "pathut.h"
#include "wipedir.h" #include "wipedir.h"
using namespace std;
int wipedir(const string& dir, bool selfalso, bool recurse) int wipedir(const string& dir, bool selfalso, bool recurse)
{ {
struct stat st; struct stat st;
@ -114,7 +114,6 @@ int wipedir(const string& dir, bool selfalso, bool recurse)
#include <stdio.h> #include <stdio.h>
#include <stdlib.h> #include <stdlib.h>
#include <sys/stat.h>
#include "wipedir.h" #include "wipedir.h"

71
src/xaposix/safefcntl.h Normal file
View file

@ -0,0 +1,71 @@
/* safefcntl.h: #include <fcntl.h>, but working around broken platforms.
*
* Copyright (C) 2006,2007 Olly Betts
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License as
* published by the Free Software Foundation; either version 2 of the
* License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301
* USA
*/
#ifndef XAPIAN_INCLUDED_SAFEFCNTL_H
#define XAPIAN_INCLUDED_SAFEFCNTL_H
#include <fcntl.h>
#if defined __cplusplus && defined open
// On some versions of Solaris, fcntl.h pollutes the namespace by #define-ing
// "open" to "open64" when largefile support is enabled. This causes problems
// if you have a method called "open" (other symbols are also #define-d
// e.g. "creat" to "creat64", but only "open" is a problem for Xapian so
// that's the only one we currently fix).
#ifdef _MSC_VER
// MSVC #define-s open but also defines a function called open, so just undef
// the macro.
# undef open
#else
inline int fcntl_open_(const char *filename, int flags, mode_t mode) {
return open(filename, flags, mode);
}
inline int fcntl_open_(const char *filename, int flags) {
return open(filename, flags);
}
#undef open
inline int open(const char *filename, int flags, mode_t mode) {
return fcntl_open_(filename, flags, mode);
}
inline int open(const char *filename, int flags) {
return fcntl_open_(filename, flags);
}
#endif
#endif
// O_BINARY is only useful for platforms like Windows which distinguish between
// text and binary files, but it's cleaner to define it to 0 here for other
// platforms so we can avoid #ifdef where we need to use it in the code.
#ifndef __WIN32__
# ifndef O_BINARY
# define O_BINARY 0
# endif
#endif
#endif /* XAPIAN_INCLUDED_SAFEFCNTL_H */

91
src/xaposix/safesysstat.h Normal file
View file

@ -0,0 +1,91 @@
/* safesysstat.h: #include <sys/stat.h>, but enabling large file support.
*
* Copyright (C) 2007,2012 Olly Betts
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License as
* published by the Free Software Foundation; either version 2 of the
* License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301
* USA
*/
#ifndef XAPIAN_INCLUDED_SAFESYSSTAT_H
#define XAPIAN_INCLUDED_SAFESYSSTAT_H
#include <sys/stat.h>
// For most platforms, AC_SYS_LARGEFILE enables support for large files at
// configure time, but MSVC doesn't use configure so we have to put the
// magic somewhere else - i.e. here!
#ifdef _MSC_VER
// MSVC needs to call _stati64() instead of stat() and the struct which holds
// the information is "struct _stati64" instead of "struct stat" so we just
// use #define to replace both in one go. We also want to use _fstati64()
// instead of fstat() but in this case we can use a function-like macro.
//
// This hack is a problem is we ever want a method called "stat", or one called
// fstat which takes 2 parameters, but we can probably live with these
// limitations.
#ifdef stat
# undef stat
#endif
#ifdef fstat
# undef fstat
#endif
// NB: _stati64 not _stat64 (the latter just returns a 64 bit timestamp).
#define stat _stati64
#define fstat(FD, BUF) _fstati64(FD,BUF)
#endif
#ifdef __WIN32__
// MSVC lacks these POSIX macros and other compilers may too:
#ifndef S_ISDIR
# define S_ISDIR(ST_MODE) (((ST_MODE) & _S_IFMT) == _S_IFDIR)
#endif
#ifndef S_ISREG
# define S_ISREG(ST_MODE) (((ST_MODE) & _S_IFMT) == _S_IFREG)
#endif
// On UNIX, mkdir() is prototyped in <sys/stat.h> but on Windows it's in
// <direct.h>, so just include that from here to avoid build failures on
// MSVC just because of some new use of mkdir(). This also reduces the
// number of conditionalised #include statements we need in the sources.
#include <direct.h>
// Add overloaded version of mkdir which takes an (ignored) mode argument
// to allow source code to just specify a mode argument unconditionally.
//
// The () around mkdir are in case it's defined as a macro.
inline int (mkdir)(const char *pathname, mode_t /*mode*/) {
return _mkdir(pathname);
}
#else
// These were specified by POSIX.1-1996, so most platforms should have
// these by now:
#ifndef S_ISDIR
# define S_ISDIR(ST_MODE) (((ST_MODE) & S_IFMT) == S_IFDIR)
#endif
#ifndef S_ISREG
# define S_ISREG(ST_MODE) (((ST_MODE) & S_IFMT) == S_IFREG)
#endif
#endif
#endif /* XAPIAN_INCLUDED_SAFESYSSTAT_H */

78
src/xaposix/safeunistd.h Normal file
View file

@ -0,0 +1,78 @@
/* safeunistd.h: <unistd.h>, but with compat. and large file support for MSVC.
*
* Copyright (C) 2007 Olly Betts
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License as
* published by the Free Software Foundation; either version 2 of the
* License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301
* USA
*/
#ifndef XAPIAN_INCLUDED_SAFEUNISTD_H
#define XAPIAN_INCLUDED_SAFEUNISTD_H
#ifndef _MSC_VER
# include <unistd.h>
#else
// sys/types.h has a typedef for off_t so make sure we've seen that before
// we hide it behind a #define.
# include <sys/types.h>
// MSVC doesn't even HAVE unistd.h - io.h seems the nearest equivalent.
// We also need to do some renaming of functions to get versions which
// work on large files.
# include <io.h>
# ifdef lseek
# undef lseek
# endif
# ifdef off_t
# undef off_t
# endif
# define lseek(FD, OFF, WHENCE) _lseeki64(FD, OFF, WHENCE)
# define off_t __int64
// process.h is needed for getpid().
# include <process.h>
#endif
#ifdef __WIN32__
inline unsigned int
sleep(unsigned int seconds)
{
// Use our own little helper function to avoid pulling in <windows.h>.
extern void xapian_sleep_milliseconds(unsigned int millisecs);
// Sleep takes a time interval in milliseconds, whereas POSIX sleep takes
// a time interval in seconds, so we need to multiply 'seconds' by 1000.
//
// But make sure the multiplication won't overflow! 4294967 seconds is
// nearly 50 days, so just sleep for that long and return the number of
// seconds left to sleep for. The common case of sleep(CONSTANT) should
// optimise to just xapian_sleep_milliseconds(CONSTANT).
if (seconds > 4294967u) {
xapian_sleep_milliseconds(4294967000u);
return seconds - 4294967u;
}
xapian_sleep_milliseconds(seconds * 1000u);
return 0;
}
#endif
#endif /* XAPIAN_INCLUDED_SAFEUNISTD_H */