00001
00002
00003
00004
00005
00006
00007
00008 #include "config.h"
00009
00010 #ifndef lint
00011 static const char revid[] = "$Id: os__stat_8c-source.html,v 1.1 2008/06/08 10:21:32 sebdiaz Exp $";
00012 #endif
00013
00014 #ifndef NO_SYSTEM_INCLUDES
00015 #include <sys/types.h>
00016 #include <sys/stat.h>
00017 #include <string.h>
00018 #endif
00019
00020 #include "db_int.h"
00021 #include "os_jump.h"
00022
00023
00024
00025
00026
00027
00028
00029 int
00030 CDB___os_exists(path, isdirp)
00031 const char *path;
00032 int *isdirp;
00033 {
00034 struct stat sb;
00035
00036 if (CDB___db_jump.j_exists != NULL)
00037 return (CDB___db_jump.j_exists(path, isdirp));
00038
00039 if (stat(path, &sb) != 0)
00040 return (CDB___os_get_errno());
00041
00042 #if !defined(S_ISDIR) || defined(STAT_MACROS_BROKEN)
00043 #if defined(_WIN32) || defined(WIN16)
00044 #define S_ISDIR(m) (_S_IFDIR & (m))
00045 #else
00046 #define S_ISDIR(m) (((m) & 0170000) == 0040000)
00047 #endif
00048 #endif
00049 if (isdirp != NULL)
00050 *isdirp = S_ISDIR(sb.st_mode);
00051
00052 return (0);
00053 }
00054
00055
00056
00057
00058
00059
00060
00061
00062
00063 int
00064 CDB___os_ioinfo(dbenv, path, fhp, mbytesp, bytesp, iosizep)
00065 DB_ENV *dbenv;
00066 const char *path;
00067 DB_FH *fhp;
00068 u_int32_t *mbytesp, *bytesp, *iosizep;
00069 {
00070 int ret;
00071 struct stat sb;
00072
00073 if (CDB___db_jump.j_ioinfo != NULL)
00074 return (CDB___db_jump.j_ioinfo(path,
00075 fhp->fd, mbytesp, bytesp, iosizep));
00076
00077 if (fstat(fhp->fd, &sb) == -1) {
00078 ret = CDB___os_get_errno();
00079 CDB___db_err(dbenv, "fstat: %s", strerror(ret));
00080 return (ret);
00081 }
00082
00083
00084 if (mbytesp != NULL)
00085 *mbytesp = sb.st_size / MEGABYTE;
00086 if (bytesp != NULL)
00087 *bytesp = sb.st_size % MEGABYTE;
00088
00089
00090
00091
00092
00093
00094
00095
00096 #ifdef HAVE_ST_BLKSIZE
00097 if (iosizep != NULL && (*iosizep = sb.st_blksize) == 0)
00098 *iosizep = DB_DEF_IOSIZE;
00099 #else
00100 if (iosizep != NULL)
00101 *iosizep = DB_DEF_IOSIZE;
00102 #endif
00103 return (0);
00104 }