00001
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022 #include <config.h>
00023
00024 #include "io_utils.h"
00025
00026 #ifdef __WIN32__
00027 # include "msvc_posix_wrapper.h"
00028 #endif
00029
00030 #include "safeerrno.h"
00031 #include "safeunistd.h"
00032
00033 #include <string>
00034
00035 #include <xapian/error.h>
00036
00037 bool
00038 io_unlink(const std::string & filename)
00039 {
00040 #ifdef __WIN32__
00041 if (msvc_posix_unlink(filename.c_str()) == 0) {
00042 #else
00043 if (unlink(filename.c_str()) == 0) {
00044 #endif
00045 return true;
00046 }
00047 if (errno != ENOENT) {
00048 throw Xapian::DatabaseError(filename + ": delete failed", errno);
00049 }
00050 return false;
00051 }
00052
00053 size_t
00054 io_read(int fd, char * p, size_t n, size_t min)
00055 {
00056 size_t total = 0;
00057 while (n) {
00058 ssize_t c = read(fd, p, n);
00059 if (c <= 0) {
00060 if (c == 0) {
00061 if (total >= min) break;
00062 throw Xapian::DatabaseError("Couldn't read enough (EOF)");
00063 }
00064 if (errno == EINTR) continue;
00065 throw Xapian::DatabaseError("Error reading from file", errno);
00066 }
00067 p += c;
00068 total += c;
00069 n -= c;
00070 }
00071 return total;
00072 }
00073
00075 void
00076 io_write(int fd, const char * p, size_t n)
00077 {
00078 while (n) {
00079 ssize_t c = write(fd, p, n);
00080 if (c < 0) {
00081 if (errno == EINTR) continue;
00082 throw Xapian::DatabaseError("Error writing to file", errno);
00083 }
00084 p += c;
00085 n -= c;
00086 }
00087 }