mirror of
https://github.com/MariaDB/server.git
synced 2025-12-01 17:39:21 +03:00
Addresses #1531 Ported stat/fstat. toku_stat, toku_fstat (struct is toku_struct_stat), poisoned the use of the functions
git-svn-id: file:///svn/toku/tokudb@10491 c7de825b-a66e-492c-adef-691d508d4ae1
This commit is contained in:
@@ -49,7 +49,7 @@ toku_os_get_phys_memory_size(void) {
|
|||||||
|
|
||||||
int
|
int
|
||||||
toku_os_get_file_size(int fildes, int64_t *fsize) {
|
toku_os_get_file_size(int fildes, int64_t *fsize) {
|
||||||
struct stat sbuf;
|
toku_struct_stat sbuf;
|
||||||
int r = fstat(fildes, &sbuf);
|
int r = fstat(fildes, &sbuf);
|
||||||
if (r==0) {
|
if (r==0) {
|
||||||
*fsize = sbuf.st_size;
|
*fsize = sbuf.st_size;
|
||||||
@@ -59,7 +59,7 @@ toku_os_get_file_size(int fildes, int64_t *fsize) {
|
|||||||
|
|
||||||
int
|
int
|
||||||
toku_os_get_unique_file_id(int fildes, struct fileid *id) {
|
toku_os_get_unique_file_id(int fildes, struct fileid *id) {
|
||||||
struct stat statbuf;
|
toku_struct_stat statbuf;
|
||||||
memset(id, 0, sizeof(*id));
|
memset(id, 0, sizeof(*id));
|
||||||
int r=fstat(fildes, &statbuf);
|
int r=fstat(fildes, &statbuf);
|
||||||
if (r==0) {
|
if (r==0) {
|
||||||
@@ -190,3 +190,16 @@ toku_os_get_max_process_data_size(uint64_t *maxdata) {
|
|||||||
r = errno;
|
r = errno;
|
||||||
return r;
|
return r;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
toku_stat(const char *name, toku_struct_stat *buf) {
|
||||||
|
int r = stat(name, buf);
|
||||||
|
return r;
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
toku_stat(int fd, toku_struct_fstat *buf) {
|
||||||
|
int r = fstat(fd, buf);
|
||||||
|
return r;
|
||||||
|
}
|
||||||
|
|
||||||
|
|||||||
49
linux/tests/test-stat.c
Normal file
49
linux/tests/test-stat.c
Normal file
@@ -0,0 +1,49 @@
|
|||||||
|
#include <toku_portability.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
#include <assert.h>
|
||||||
|
#include <sys/stat.h>
|
||||||
|
#include <errno.h>
|
||||||
|
|
||||||
|
void test_stat(char *dirname, int result, int ex_errno) {
|
||||||
|
int r;
|
||||||
|
toku_struct_stat buf;
|
||||||
|
r = toku_stat(dirname, &buf);
|
||||||
|
printf("stat %s %d %d\n", dirname, r, errno); fflush(stdout);
|
||||||
|
assert(r==result);
|
||||||
|
if (r!=0) assert(errno == ex_errno);
|
||||||
|
}
|
||||||
|
|
||||||
|
int main(void) {
|
||||||
|
int r;
|
||||||
|
|
||||||
|
test_stat(".", 0, 0);
|
||||||
|
test_stat("./", 0, 0);
|
||||||
|
|
||||||
|
r = system("rm -rf testdir"); assert(r==0);
|
||||||
|
test_stat("testdir", -1, ENOENT);
|
||||||
|
test_stat("testdir/", -1, ENOENT);
|
||||||
|
test_stat("testdir/foo", -1, ENOENT);
|
||||||
|
test_stat("testdir/foo/", -1, ENOENT);
|
||||||
|
r = toku_os_mkdir("testdir", S_IRWXU);
|
||||||
|
assert(r == 0);
|
||||||
|
test_stat("testdir/foo", -1, ENOENT);
|
||||||
|
test_stat("testdir/foo/", -1, ENOENT);
|
||||||
|
r = system("touch testdir/foo"); assert(r==0);
|
||||||
|
test_stat("testdir/foo", 0, 0);
|
||||||
|
test_stat("testdir/foo/", -1, ENOENT);
|
||||||
|
|
||||||
|
test_stat("testdir", 0, 0);
|
||||||
|
|
||||||
|
test_stat("./testdir", 0, 0);
|
||||||
|
|
||||||
|
test_stat("./testdir/", 0, 0);
|
||||||
|
|
||||||
|
test_stat("/", 0, 0);
|
||||||
|
|
||||||
|
test_stat("/usr", 0, 0);
|
||||||
|
test_stat("/usr/", 0, 0);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
@@ -14,6 +14,8 @@ struct fileid {
|
|||||||
ino_t st_ino;
|
ino_t st_ino;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
typedef struct stat toku_struct_stat;
|
||||||
|
|
||||||
#if !defined(O_BINARY)
|
#if !defined(O_BINARY)
|
||||||
#define O_BINARY 0
|
#define O_BINARY 0
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -1508,9 +1508,9 @@ graceful_open_get_append_fd(const char *db_fname, BOOL *was_dirtyp, BOOL *create
|
|||||||
|
|
||||||
toku_graceful_fill_names(db_fname, cleanbuf, sizeof(cleanbuf), dirtybuf, sizeof(dirtybuf));
|
toku_graceful_fill_names(db_fname, cleanbuf, sizeof(cleanbuf), dirtybuf, sizeof(dirtybuf));
|
||||||
|
|
||||||
struct stat tmpbuf;
|
toku_struct_stat tmpbuf;
|
||||||
clean_exists = (BOOL)(stat(cleanbuf, &tmpbuf) == 0);
|
clean_exists = (BOOL)(toku_stat(cleanbuf, &tmpbuf) == 0);
|
||||||
dirty_exists = (BOOL)(stat(dirtybuf, &tmpbuf) == 0);
|
dirty_exists = (BOOL)(toku_stat(dirtybuf, &tmpbuf) == 0);
|
||||||
mode_t mode = S_IRWXU|S_IRWXG|S_IRWXO;
|
mode_t mode = S_IRWXU|S_IRWXG|S_IRWXO;
|
||||||
int r = 0;
|
int r = 0;
|
||||||
|
|
||||||
@@ -1538,10 +1538,10 @@ graceful_close_get_append_fd(const char *db_fname, BOOL *db_missing) {
|
|||||||
|
|
||||||
toku_graceful_fill_names(db_fname, cleanbuf, sizeof(cleanbuf), dirtybuf, sizeof(dirtybuf));
|
toku_graceful_fill_names(db_fname, cleanbuf, sizeof(cleanbuf), dirtybuf, sizeof(dirtybuf));
|
||||||
|
|
||||||
struct stat tmpbuf;
|
toku_struct_stat tmpbuf;
|
||||||
clean_exists = (BOOL)(stat(cleanbuf, &tmpbuf) == 0);
|
clean_exists = (BOOL)(toku_stat(cleanbuf, &tmpbuf) == 0);
|
||||||
dirty_exists = (BOOL)(stat(dirtybuf, &tmpbuf) == 0);
|
dirty_exists = (BOOL)(toku_stat(dirtybuf, &tmpbuf) == 0);
|
||||||
db_exists = (BOOL)(stat(db_fname, &tmpbuf) == 0);
|
db_exists = (BOOL)(toku_stat(db_fname, &tmpbuf) == 0);
|
||||||
mode_t mode = S_IRWXU|S_IRWXG|S_IRWXO;
|
mode_t mode = S_IRWXU|S_IRWXG|S_IRWXO;
|
||||||
int r = 0;
|
int r = 0;
|
||||||
|
|
||||||
@@ -1564,9 +1564,9 @@ graceful_dirty_get_append_fd(const char *db_fname) {
|
|||||||
|
|
||||||
toku_graceful_fill_names(db_fname, cleanbuf, sizeof(cleanbuf), dirtybuf, sizeof(dirtybuf));
|
toku_graceful_fill_names(db_fname, cleanbuf, sizeof(cleanbuf), dirtybuf, sizeof(dirtybuf));
|
||||||
|
|
||||||
struct stat tmpbuf;
|
toku_struct_stat tmpbuf;
|
||||||
clean_exists = (BOOL)(stat(cleanbuf, &tmpbuf) == 0);
|
clean_exists = (BOOL)(toku_stat(cleanbuf, &tmpbuf) == 0);
|
||||||
dirty_exists = (BOOL)(stat(dirtybuf, &tmpbuf) == 0);
|
dirty_exists = (BOOL)(toku_stat(dirtybuf, &tmpbuf) == 0);
|
||||||
mode_t mode = S_IRWXU|S_IRWXG|S_IRWXO;
|
mode_t mode = S_IRWXU|S_IRWXG|S_IRWXO;
|
||||||
int r = 0;
|
int r = 0;
|
||||||
|
|
||||||
@@ -1687,10 +1687,10 @@ toku_graceful_delete(const char *db_fname) {
|
|||||||
sprintf(cleanbuf, "%s.clean", db_fname);
|
sprintf(cleanbuf, "%s.clean", db_fname);
|
||||||
sprintf(dirtybuf, "%s.dirty", db_fname);
|
sprintf(dirtybuf, "%s.dirty", db_fname);
|
||||||
|
|
||||||
struct stat tmpbuf;
|
toku_struct_stat tmpbuf;
|
||||||
lock_for_graceful();
|
lock_for_graceful();
|
||||||
clean_exists = (BOOL)(stat(cleanbuf, &tmpbuf) == 0);
|
clean_exists = (BOOL)(toku_stat(cleanbuf, &tmpbuf) == 0);
|
||||||
dirty_exists = (BOOL)(stat(dirtybuf, &tmpbuf) == 0);
|
dirty_exists = (BOOL)(toku_stat(dirtybuf, &tmpbuf) == 0);
|
||||||
|
|
||||||
int r = 0;
|
int r = 0;
|
||||||
if (clean_exists) {
|
if (clean_exists) {
|
||||||
|
|||||||
@@ -113,9 +113,9 @@ internal_toku_recover_fopen_or_fcreate (int flags, int mode, char *fixedfname, F
|
|||||||
char cleanname[slen + sizeof(CLEANSUFFIX)];
|
char cleanname[slen + sizeof(CLEANSUFFIX)];
|
||||||
char dirtyname[slen + sizeof(DIRTYSUFFIX)];
|
char dirtyname[slen + sizeof(DIRTYSUFFIX)];
|
||||||
toku_graceful_fill_names(fixedfname, cleanname, sizeof(cleanname), dirtyname, sizeof(dirtyname));
|
toku_graceful_fill_names(fixedfname, cleanname, sizeof(cleanname), dirtyname, sizeof(dirtyname));
|
||||||
struct stat tmpbuf;
|
toku_struct_stat tmpbuf;
|
||||||
BOOL clean_exists = stat(cleanname, &tmpbuf)==0;
|
BOOL clean_exists = toku_stat(cleanname, &tmpbuf)==0;
|
||||||
BOOL dirty_exists = stat(dirtyname, &tmpbuf)==0;
|
BOOL dirty_exists = toku_stat(dirtyname, &tmpbuf)==0;
|
||||||
if (dirty_exists) {
|
if (dirty_exists) {
|
||||||
if (clean_exists) { int r = unlink(dirtyname); assert(r==0); }
|
if (clean_exists) { int r = unlink(dirtyname); assert(r==0); }
|
||||||
else { int r = rename(dirtyname, cleanname); assert(r==0); }
|
else { int r = rename(dirtyname, cleanname); assert(r==0); }
|
||||||
|
|||||||
@@ -35,8 +35,8 @@ test_main (int argc __attribute__((__unused__)),
|
|||||||
r = toku_logger_close(&logger);
|
r = toku_logger_close(&logger);
|
||||||
assert(r == 0);
|
assert(r == 0);
|
||||||
{
|
{
|
||||||
struct stat statbuf;
|
toku_struct_stat statbuf;
|
||||||
r = stat(dname "/log000000000000.tokulog", &statbuf);
|
r = toku_stat(dname "/log000000000000.tokulog", &statbuf);
|
||||||
assert(r==0);
|
assert(r==0);
|
||||||
assert(statbuf.st_size==12+5);
|
assert(statbuf.st_size==12+5);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -53,8 +53,8 @@ test_main (int argc __attribute__((__unused__)),
|
|||||||
if (strncmp(dirent->d_name, "log", 3)!=0) continue;
|
if (strncmp(dirent->d_name, "log", 3)!=0) continue;
|
||||||
char fname[sizeof(dname)+256+1];
|
char fname[sizeof(dname)+256+1];
|
||||||
snprintf(fname, sizeof(fname), "%s/%s", dname, dirent->d_name);
|
snprintf(fname, sizeof(fname), "%s/%s", dname, dirent->d_name);
|
||||||
struct stat statbuf;
|
toku_struct_stat statbuf;
|
||||||
r = stat(fname, &statbuf);
|
r = toku_stat(fname, &statbuf);
|
||||||
assert(r==0);
|
assert(r==0);
|
||||||
assert(statbuf.st_size<=LSIZE);
|
assert(statbuf.st_size<=LSIZE);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -59,8 +59,8 @@ test_main (int argc __attribute__((__unused__)),
|
|||||||
assert(r == 0);
|
assert(r == 0);
|
||||||
|
|
||||||
{
|
{
|
||||||
struct stat statbuf;
|
toku_struct_stat statbuf;
|
||||||
r = stat(dname "/log000000000000.tokulog", &statbuf);
|
r = toku_stat(dname "/log000000000000.tokulog", &statbuf);
|
||||||
assert(r==0);
|
assert(r==0);
|
||||||
assert(statbuf.st_size<=LSIZE);
|
assert(statbuf.st_size<=LSIZE);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -39,16 +39,16 @@ do_1324 (int moreflags)
|
|||||||
r = env->open(env, ENVDIR, envflags, S_IRWXU+S_IRWXG+S_IRWXO); CKERR(r);
|
r = env->open(env, ENVDIR, envflags, S_IRWXU+S_IRWXG+S_IRWXO); CKERR(r);
|
||||||
|
|
||||||
{
|
{
|
||||||
struct stat sbuf;
|
toku_struct_stat sbuf;
|
||||||
r = stat(fname, &sbuf);
|
r = toku_stat(fname, &sbuf);
|
||||||
if (r==0) {
|
if (r==0) {
|
||||||
fprintf(stderr, "The rolltmp file %s should have been deleted, but was not.\n", fname);
|
fprintf(stderr, "The rolltmp file %s should have been deleted, but was not.\n", fname);
|
||||||
}
|
}
|
||||||
assert(r!=0);
|
assert(r!=0);
|
||||||
}
|
}
|
||||||
{
|
{
|
||||||
struct stat sbuf;
|
toku_struct_stat sbuf;
|
||||||
r = stat(fnamekeep, &sbuf);
|
r = toku_stat(fnamekeep, &sbuf);
|
||||||
if (r!=0) {
|
if (r!=0) {
|
||||||
fprintf(stderr, "The keepme file %s should NOT have been deleted, but was not.\n", fnamekeep);
|
fprintf(stderr, "The keepme file %s should NOT have been deleted, but was not.\n", fnamekeep);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -21,7 +21,7 @@ test_db_open_aborts (void) {
|
|||||||
DB *db;
|
DB *db;
|
||||||
|
|
||||||
int r;
|
int r;
|
||||||
struct stat buf;
|
toku_struct_stat buf;
|
||||||
system("rm -rf " ENVDIR);
|
system("rm -rf " ENVDIR);
|
||||||
r=toku_os_mkdir(ENVDIR, S_IRWXU+S_IRWXG+S_IRWXO); assert(r==0);
|
r=toku_os_mkdir(ENVDIR, S_IRWXU+S_IRWXG+S_IRWXO); assert(r==0);
|
||||||
r=db_env_create(&env, 0); assert(r==0);
|
r=db_env_create(&env, 0); assert(r==0);
|
||||||
@@ -35,8 +35,8 @@ test_db_open_aborts (void) {
|
|||||||
r=tid->abort(tid); assert(r==0);
|
r=tid->abort(tid); assert(r==0);
|
||||||
}
|
}
|
||||||
{
|
{
|
||||||
struct stat buf;
|
toku_struct_stat buf;
|
||||||
r=stat(ENVDIR "/foo.db", &buf);
|
r=toku_stat(ENVDIR "/foo.db", &buf);
|
||||||
assert(r!=0);
|
assert(r!=0);
|
||||||
assert(errno==ENOENT);
|
assert(errno==ENOENT);
|
||||||
}
|
}
|
||||||
@@ -59,22 +59,22 @@ test_db_open_aborts (void) {
|
|||||||
r=tid->abort(tid); assert(r==0);
|
r=tid->abort(tid); assert(r==0);
|
||||||
}
|
}
|
||||||
{
|
{
|
||||||
r=stat(ENVDIR "/foo.db", &buf);
|
r=toku_stat(ENVDIR "/foo.db", &buf);
|
||||||
assert(r!=0);
|
assert(r!=0);
|
||||||
assert(errno==ENOENT);
|
assert(errno==ENOENT);
|
||||||
r=stat(ENVDIR "/foo.db.clean", &buf);
|
r=toku_stat(ENVDIR "/foo.db.clean", &buf);
|
||||||
assert(r!=0);
|
assert(r!=0);
|
||||||
assert(errno==ENOENT);
|
assert(errno==ENOENT);
|
||||||
r=stat(ENVDIR "/foo.db.dirty", &buf);
|
r=toku_stat(ENVDIR "/foo.db.dirty", &buf);
|
||||||
assert(r!=0);
|
assert(r!=0);
|
||||||
assert(errno==ENOENT);
|
assert(errno==ENOENT);
|
||||||
}
|
}
|
||||||
|
|
||||||
r=db->close(db, 0); assert(r==0);
|
r=db->close(db, 0); assert(r==0);
|
||||||
r=stat(ENVDIR "/foo.db.clean", &buf);
|
r=toku_stat(ENVDIR "/foo.db.clean", &buf);
|
||||||
assert(r!=0);
|
assert(r!=0);
|
||||||
assert(errno==ENOENT);
|
assert(errno==ENOENT);
|
||||||
r=stat(ENVDIR "/foo.db.dirty", &buf);
|
r=toku_stat(ENVDIR "/foo.db.dirty", &buf);
|
||||||
assert(r!=0);
|
assert(r!=0);
|
||||||
assert(errno==ENOENT);
|
assert(errno==ENOENT);
|
||||||
r=env->close(env, 0); assert(r==0);
|
r=env->close(env, 0); assert(r==0);
|
||||||
@@ -133,8 +133,8 @@ test_db_put_aborts (void) {
|
|||||||
}
|
}
|
||||||
// The database should exist
|
// The database should exist
|
||||||
{
|
{
|
||||||
struct stat buf;
|
toku_struct_stat buf;
|
||||||
r=stat(ENVDIR "/foo.db", &buf);
|
r=toku_stat(ENVDIR "/foo.db", &buf);
|
||||||
assert(r==0);
|
assert(r==0);
|
||||||
}
|
}
|
||||||
// But the item should not be in it.
|
// But the item should not be in it.
|
||||||
|
|||||||
@@ -110,9 +110,9 @@ do_nothing(DBT const *UU(a), DBT const *UU(b), void *UU(c)) {
|
|||||||
|
|
||||||
static void
|
static void
|
||||||
verify_and_tear_down(int close_first) {
|
verify_and_tear_down(int close_first) {
|
||||||
struct stat temp;
|
toku_struct_stat temp;
|
||||||
int r;
|
int r;
|
||||||
r = stat(ENVDIR "/foo.db", &temp);
|
r = toku_stat(ENVDIR "/foo.db", &temp);
|
||||||
CKERR(r);
|
CKERR(r);
|
||||||
if (close_first) {
|
if (close_first) {
|
||||||
r=db->close(db, 0); CKERR(r);
|
r=db->close(db, 0); CKERR(r);
|
||||||
|
|||||||
@@ -149,9 +149,9 @@ do_nothing(DBT const *UU(a), DBT const *UU(b), void *UU(c)) {
|
|||||||
|
|
||||||
static void
|
static void
|
||||||
verify_and_tear_down(int close_first) {
|
verify_and_tear_down(int close_first) {
|
||||||
struct stat temp;
|
toku_struct_stat temp;
|
||||||
int r;
|
int r;
|
||||||
r = stat(ENVDIR "/foo.db", &temp);
|
r = toku_stat(ENVDIR "/foo.db", &temp);
|
||||||
CKERR(r);
|
CKERR(r);
|
||||||
if (close_first) {
|
if (close_first) {
|
||||||
r=db->close(db, 0); CKERR(r);
|
r=db->close(db, 0); CKERR(r);
|
||||||
|
|||||||
@@ -112,8 +112,8 @@ test_main(int argc, const char *argv[]) {
|
|||||||
|
|
||||||
//Verify it went in the right directory.
|
//Verify it went in the right directory.
|
||||||
{
|
{
|
||||||
struct stat buf;
|
toku_struct_stat buf;
|
||||||
r = stat(db_name, &buf);
|
r = toku_stat(db_name, &buf);
|
||||||
CKERR(r);
|
CKERR(r);
|
||||||
}
|
}
|
||||||
#ifdef USE_TDB
|
#ifdef USE_TDB
|
||||||
|
|||||||
@@ -44,8 +44,8 @@ test_main (int UU(argc), const char UU(*argv[])) {
|
|||||||
r=db->close(db, 0); assert(r==0);
|
r=db->close(db, 0); assert(r==0);
|
||||||
r=env->close(env, 0); assert(r==0);
|
r=env->close(env, 0); assert(r==0);
|
||||||
{
|
{
|
||||||
struct stat statbuf;
|
toku_struct_stat statbuf;
|
||||||
r = stat(ENVDIR "/foo.db", &statbuf);
|
r = toku_stat(ENVDIR "/foo.db", &statbuf);
|
||||||
assert(r==0);
|
assert(r==0);
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
|
|||||||
@@ -45,8 +45,8 @@ test_main (int UU(argc), const char UU(*argv[])) {
|
|||||||
r=db->close(db, 0); assert(r==0);
|
r=db->close(db, 0); assert(r==0);
|
||||||
r=env->close(env, 0); assert(r==0);
|
r=env->close(env, 0); assert(r==0);
|
||||||
{
|
{
|
||||||
struct stat statbuf;
|
toku_struct_stat statbuf;
|
||||||
r = stat(ENVDIR "/foo.db", &statbuf);
|
r = toku_stat(ENVDIR "/foo.db", &statbuf);
|
||||||
assert(r==-1);
|
assert(r==-1);
|
||||||
assert(errno==ENOENT);
|
assert(errno==ENOENT);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -18,8 +18,8 @@ check_logmax (int max) {
|
|||||||
#define FULL_LEN (sizeof(ENVDIR)+NAME_MAX+1)
|
#define FULL_LEN (sizeof(ENVDIR)+NAME_MAX+1)
|
||||||
char full_fname[FULL_LEN];
|
char full_fname[FULL_LEN];
|
||||||
snprintf(full_fname, FULL_LEN, "%s/%s", ENVDIR, ent->d_name);
|
snprintf(full_fname, FULL_LEN, "%s/%s", ENVDIR, ent->d_name);
|
||||||
struct stat sbuf;
|
toku_struct_stat sbuf;
|
||||||
int r = stat(full_fname, &sbuf);
|
int r = toku_stat(full_fname, &sbuf);
|
||||||
assert(r==0);
|
assert(r==0);
|
||||||
if (verbose)
|
if (verbose)
|
||||||
printf("%s is of size %"PRId64"\n", ent->d_name, (int64_t)sbuf.st_size);
|
printf("%s is of size %"PRId64"\n", ent->d_name, (int64_t)sbuf.st_size);
|
||||||
|
|||||||
@@ -33,8 +33,8 @@ test_abort_create (void) {
|
|||||||
r = db->open(db, txn, "test.db", 0, DB_BTREE, DB_CREATE, S_IRWXU+S_IRWXG+S_IRWXO); assert(r == 0);
|
r = db->open(db, txn, "test.db", 0, DB_BTREE, DB_CREATE, S_IRWXU+S_IRWXG+S_IRWXO); assert(r == 0);
|
||||||
|
|
||||||
{
|
{
|
||||||
struct stat statbuf;
|
toku_struct_stat statbuf;
|
||||||
r = stat(ENVDIR "/test.db", &statbuf);
|
r = toku_stat(ENVDIR "/test.db", &statbuf);
|
||||||
assert(r==0);
|
assert(r==0);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -44,8 +44,8 @@ test_abort_create (void) {
|
|||||||
r = env->close(env, 0); assert(r == 0);
|
r = env->close(env, 0); assert(r == 0);
|
||||||
|
|
||||||
{
|
{
|
||||||
struct stat statbuf;
|
toku_struct_stat statbuf;
|
||||||
r = stat(ENVDIR "/test.db", &statbuf);
|
r = toku_stat(ENVDIR "/test.db", &statbuf);
|
||||||
assert(r!=0);
|
assert(r!=0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -39,8 +39,8 @@ test_abort_close (void) {
|
|||||||
r = db->open(db, txn, "test.db", 0, DB_BTREE, DB_CREATE, S_IRWXU+S_IRWXG+S_IRWXO); assert(r == 0);
|
r = db->open(db, txn, "test.db", 0, DB_BTREE, DB_CREATE, S_IRWXU+S_IRWXG+S_IRWXO); assert(r == 0);
|
||||||
|
|
||||||
{
|
{
|
||||||
struct stat statbuf;
|
toku_struct_stat statbuf;
|
||||||
r = stat(ENVDIR "/test.db", &statbuf);
|
r = toku_stat(ENVDIR "/test.db", &statbuf);
|
||||||
assert(r==0);
|
assert(r==0);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -52,8 +52,8 @@ test_abort_close (void) {
|
|||||||
r = env->close(env, 0); assert(r == 0);
|
r = env->close(env, 0); assert(r == 0);
|
||||||
|
|
||||||
{
|
{
|
||||||
struct stat statbuf;
|
toku_struct_stat statbuf;
|
||||||
r = stat(ENVDIR "/test.db", &statbuf);
|
r = toku_stat(ENVDIR "/test.db", &statbuf);
|
||||||
assert(r!=0);
|
assert(r!=0);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -39,8 +39,8 @@ test_abort_close (void) {
|
|||||||
r = db->open(db, txn, "test.db", 0, DB_BTREE, DB_CREATE, S_IRWXU+S_IRWXG+S_IRWXO); assert(r == 0);
|
r = db->open(db, txn, "test.db", 0, DB_BTREE, DB_CREATE, S_IRWXU+S_IRWXG+S_IRWXO); assert(r == 0);
|
||||||
|
|
||||||
{
|
{
|
||||||
struct stat statbuf;
|
toku_struct_stat statbuf;
|
||||||
r = stat(ENVDIR "/test.db", &statbuf);
|
r = toku_stat(ENVDIR "/test.db", &statbuf);
|
||||||
assert(r==0);
|
assert(r==0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -41,8 +41,8 @@ test_txn_close_open_commit (void) {
|
|||||||
r = db->open(db, txn, "test.db", 0, DB_BTREE, DB_CREATE, S_IRWXU+S_IRWXG+S_IRWXO); assert(r == 0);
|
r = db->open(db, txn, "test.db", 0, DB_BTREE, DB_CREATE, S_IRWXU+S_IRWXG+S_IRWXO); assert(r == 0);
|
||||||
|
|
||||||
{
|
{
|
||||||
struct stat statbuf;
|
toku_struct_stat statbuf;
|
||||||
r = stat(ENVDIR "/test.db", &statbuf);
|
r = toku_stat(ENVDIR "/test.db", &statbuf);
|
||||||
assert(r==0);
|
assert(r==0);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -64,8 +64,8 @@ test_txn_close_open_commit (void) {
|
|||||||
r = env->close(env, 0); assert(r == 0);
|
r = env->close(env, 0); assert(r == 0);
|
||||||
|
|
||||||
{
|
{
|
||||||
struct stat statbuf;
|
toku_struct_stat statbuf;
|
||||||
r = stat(ENVDIR "/test.db", &statbuf);
|
r = toku_stat(ENVDIR "/test.db", &statbuf);
|
||||||
assert(r==0);
|
assert(r==0);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -39,8 +39,8 @@ test_abort_close (void) {
|
|||||||
r = db->open(db, txn, "test.db", 0, DB_BTREE, DB_CREATE, S_IRWXU+S_IRWXG+S_IRWXO); assert(r == 0);
|
r = db->open(db, txn, "test.db", 0, DB_BTREE, DB_CREATE, S_IRWXU+S_IRWXG+S_IRWXO); assert(r == 0);
|
||||||
|
|
||||||
{
|
{
|
||||||
struct stat statbuf;
|
toku_struct_stat statbuf;
|
||||||
r = stat(ENVDIR "/test.db", &statbuf);
|
r = toku_stat(ENVDIR "/test.db", &statbuf);
|
||||||
assert(r==0);
|
assert(r==0);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -52,8 +52,8 @@ test_abort_close (void) {
|
|||||||
r = env->close(env, 0); assert(r == 0);
|
r = env->close(env, 0); assert(r == 0);
|
||||||
|
|
||||||
{
|
{
|
||||||
struct stat statbuf;
|
toku_struct_stat statbuf;
|
||||||
r = stat(ENVDIR "/test.db", &statbuf);
|
r = toku_stat(ENVDIR "/test.db", &statbuf);
|
||||||
assert(r==0);
|
assert(r==0);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
14
src/ydb.c
14
src/ydb.c
@@ -359,19 +359,19 @@ static int toku_env_open(DB_ENV * env, const char *home, u_int32_t flags, int mo
|
|||||||
{
|
{
|
||||||
BOOL made_new_home = FALSE;
|
BOOL made_new_home = FALSE;
|
||||||
char* new_home = NULL;
|
char* new_home = NULL;
|
||||||
struct stat buf;
|
toku_struct_stat buf;
|
||||||
if (home[strlen(home)-1] == '\\') {
|
if (home[strlen(home)-1] == '\\') {
|
||||||
new_home = toku_malloc(strlen(home));
|
new_home = toku_malloc(strlen(home));
|
||||||
memcpy(new_home, home, strlen(home));
|
memcpy(new_home, home, strlen(home));
|
||||||
new_home[strlen(home) - 1] = 0;
|
new_home[strlen(home) - 1] = 0;
|
||||||
made_new_home = TRUE;
|
made_new_home = TRUE;
|
||||||
}
|
}
|
||||||
r = stat(made_new_home? new_home : home, &buf);
|
r = toku_stat(made_new_home? new_home : home, &buf);
|
||||||
if (made_new_home) {
|
if (made_new_home) {
|
||||||
toku_free(new_home);
|
toku_free(new_home);
|
||||||
}
|
}
|
||||||
if (r!=0) {
|
if (r!=0) {
|
||||||
return toku_ydb_do_error(env, errno, "Error from stat(\"%s\",...)\n", home);
|
return toku_ydb_do_error(env, errno, "Error from toku_stat(\"%s\",...)\n", home);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
unused_flags &= ~DB_PRIVATE;
|
unused_flags &= ~DB_PRIVATE;
|
||||||
@@ -2711,7 +2711,7 @@ static char *construct_full_name(const char *dir, const char *fname) {
|
|||||||
static int find_db_file(DB_ENV* dbenv, const char *fname, char** full_name_out) {
|
static int find_db_file(DB_ENV* dbenv, const char *fname, char** full_name_out) {
|
||||||
u_int32_t i;
|
u_int32_t i;
|
||||||
int r;
|
int r;
|
||||||
struct stat statbuf;
|
toku_struct_stat statbuf;
|
||||||
char* full_name;
|
char* full_name;
|
||||||
|
|
||||||
assert(full_name_out);
|
assert(full_name_out);
|
||||||
@@ -2720,7 +2720,7 @@ static int find_db_file(DB_ENV* dbenv, const char *fname, char** full_name_out)
|
|||||||
for (i = 0; i < dbenv->i->n_data_dirs; i++) {
|
for (i = 0; i < dbenv->i->n_data_dirs; i++) {
|
||||||
full_name = construct_full_name(dbenv->i->data_dirs[0], fname);
|
full_name = construct_full_name(dbenv->i->data_dirs[0], fname);
|
||||||
if (!full_name) return ENOMEM;
|
if (!full_name) return ENOMEM;
|
||||||
r = stat(full_name, &statbuf);
|
r = toku_stat(full_name, &statbuf);
|
||||||
if (r == 0) goto finish;
|
if (r == 0) goto finish;
|
||||||
else {
|
else {
|
||||||
toku_free(full_name);
|
toku_free(full_name);
|
||||||
@@ -2839,8 +2839,8 @@ static int toku_db_open(DB * db, DB_TXN * txn, const char *fname, const char *db
|
|||||||
openflags |= O_RDWR;
|
openflags |= O_RDWR;
|
||||||
|
|
||||||
{
|
{
|
||||||
struct stat statbuf;
|
toku_struct_stat statbuf;
|
||||||
if (stat(db->i->full_fname, &statbuf) == 0) {
|
if (toku_stat(db->i->full_fname, &statbuf) == 0) {
|
||||||
/* If the database exists at the file level, and we specified no db_name, then complain here. */
|
/* If the database exists at the file level, and we specified no db_name, then complain here. */
|
||||||
if (dbname == 0 && is_db_create) {
|
if (dbname == 0 && is_db_create) {
|
||||||
if (is_db_excl) {
|
if (is_db_excl) {
|
||||||
|
|||||||
@@ -63,6 +63,11 @@ int toku_os_initialize_settings(int verbosity) __attribute__((__visibility__("d
|
|||||||
//
|
//
|
||||||
int toku_os_is_absolute_name(const char* path) __attribute__((__visibility__("default")));
|
int toku_os_is_absolute_name(const char* path) __attribute__((__visibility__("default")));
|
||||||
|
|
||||||
|
// Portable linux 'stat'
|
||||||
|
int toku_stat(const char *name, toku_struct_stat *statbuf);
|
||||||
|
// Portable linux 'fstat'
|
||||||
|
int toku_fstat(int fd, toku_struct_stat *statbuf);
|
||||||
|
|
||||||
#if defined __cplusplus
|
#if defined __cplusplus
|
||||||
};
|
};
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -28,6 +28,12 @@ extern "C" {
|
|||||||
|
|
||||||
#include "stdint.h"
|
#include "stdint.h"
|
||||||
#include "inttypes.h"
|
#include "inttypes.h"
|
||||||
|
|
||||||
|
#ifndef TOKU_OFF_T_DEFINED
|
||||||
|
#define TOKU_OFF_T_DEFINED
|
||||||
|
typedef int64_t toku_off_t;
|
||||||
|
#endif
|
||||||
|
|
||||||
#include <direct.h>
|
#include <direct.h>
|
||||||
#include <sys/types.h>
|
#include <sys/types.h>
|
||||||
#include "unistd.h"
|
#include "unistd.h"
|
||||||
@@ -43,6 +49,12 @@ extern "C" {
|
|||||||
|
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
#include <inttypes.h>
|
#include <inttypes.h>
|
||||||
|
|
||||||
|
#ifndef TOKU_OFF_T_DEFINED
|
||||||
|
#define TOKU_OFF_T_DEFINED
|
||||||
|
typedef int64_t toku_off_t;
|
||||||
|
#endif
|
||||||
|
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
#include <sys/types.h>
|
#include <sys/types.h>
|
||||||
#include <sys/time.h>
|
#include <sys/time.h>
|
||||||
@@ -67,17 +79,12 @@ extern "C" {
|
|||||||
#include "toku_os.h"
|
#include "toku_os.h"
|
||||||
#include "toku_htonl.h"
|
#include "toku_htonl.h"
|
||||||
|
|
||||||
#ifndef TOKU_OFF_T_DEFINED
|
|
||||||
#define TOKU_OFF_T_DEFINED
|
|
||||||
typedef int64_t toku_off_t;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#define UU(x) x __attribute__((__unused__))
|
#define UU(x) x __attribute__((__unused__))
|
||||||
|
|
||||||
// Deprecated functions.
|
// Deprecated functions.
|
||||||
#if !defined(TOKU_ALLOW_DEPRECATED)
|
#if !defined(TOKU_ALLOW_DEPRECATED)
|
||||||
# if defined(__ICL) //Windows Intel Compiler
|
# if defined(__ICL) //Windows Intel Compiler
|
||||||
# pragma deprecated (creat, fstat, getpid, syscall, sysconf, mkdir, strdup)
|
# pragma deprecated (creat, fstat, stat, getpid, syscall, sysconf, mkdir, strdup)
|
||||||
# pragma poison off_t
|
# pragma poison off_t
|
||||||
# ifndef DONT_DEPRECATE_MALLOC
|
# ifndef DONT_DEPRECATE_MALLOC
|
||||||
# pragma deprecated (malloc, free, realloc)
|
# pragma deprecated (malloc, free, realloc)
|
||||||
@@ -85,6 +92,7 @@ typedef int64_t toku_off_t;
|
|||||||
# else
|
# else
|
||||||
int creat() __attribute__((__deprecated__));
|
int creat() __attribute__((__deprecated__));
|
||||||
int fstat() __attribute__((__deprecated__));
|
int fstat() __attribute__((__deprecated__));
|
||||||
|
int stat() __attribute__((__deprecated__));
|
||||||
int getpid(void) __attribute__((__deprecated__));
|
int getpid(void) __attribute__((__deprecated__));
|
||||||
long int syscall(long int __sysno, ...) __attribute__((__deprecated__));
|
long int syscall(long int __sysno, ...) __attribute__((__deprecated__));
|
||||||
// Sadly, dlmalloc needs sysconf, and on linux this causes trouble with -combine. So let the warnings show up under windows only.
|
// Sadly, dlmalloc needs sysconf, and on linux this causes trouble with -combine. So let the warnings show up under windows only.
|
||||||
|
|||||||
@@ -1,3 +1,4 @@
|
|||||||
|
#include <toku_portability.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
@@ -93,3 +94,46 @@ closedir(DIR *dir) {
|
|||||||
free(dir);
|
free(dir);
|
||||||
return r;
|
return r;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#define SUPPORT_CYGWIN_STYLE_STAT 0
|
||||||
|
#define CYGWIN_ROOT_DIR_PREFIX "c:/cygwin"
|
||||||
|
#define CYGDRIVE_PREFIX "/cygdrive/"
|
||||||
|
int
|
||||||
|
toku_stat(const char *name, toku_struct_stat *statbuf) {
|
||||||
|
char new_name[strlen(name) + sizeof(CYGWIN_ROOT_DIR_PREFIX)];
|
||||||
|
int bytes;
|
||||||
|
#if SUPPORT_CYGWIN_STYLE_STAT
|
||||||
|
if (name[0] == '/') {
|
||||||
|
char *cygdrive = strstr(name, CYGDRIVE_PREFIX);
|
||||||
|
if (cygdrive==name && isalpha(name[strlen(CYGDRIVE_PREFIX)]))
|
||||||
|
bytes = snprintf(new_name, sizeof(new_name), "%c:%s", name[strlen(CYGDRIVE_PREFIX)], name+strlen(CYGDRIVE_PREFIX)+1); //handle /cygdrive/DRIVELETTER
|
||||||
|
else bytes = snprintf(new_name, sizeof(new_name), "%s%s", CYGWIN_ROOT_DIR_PREFIX, name); //handle /usr/local (for example)
|
||||||
|
}
|
||||||
|
else
|
||||||
|
#endif
|
||||||
|
bytes = snprintf(new_name, sizeof(new_name), "%s", name); //default
|
||||||
|
//Verify no overflow
|
||||||
|
assert(bytes>=0);
|
||||||
|
assert((size_t)bytes < sizeof(new_name));
|
||||||
|
int needdir = 0;
|
||||||
|
if (bytes>1 && new_name[bytes-1]=='/') {
|
||||||
|
//Strip trailing '/', but this implies it is a directory.
|
||||||
|
new_name[bytes-1] = '\0';
|
||||||
|
needdir = 1;
|
||||||
|
}
|
||||||
|
toku_struct_stat temp;
|
||||||
|
int r = _stati64(new_name, &temp);
|
||||||
|
if (r==0 && needdir && !(temp.st_mode&_S_IFDIR)) {
|
||||||
|
r = -1;
|
||||||
|
errno = ENOENT;
|
||||||
|
}
|
||||||
|
if (r==0) *statbuf = temp;
|
||||||
|
return r;
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
toku_fstat(int fd, toku_struct_stat *statbuf) {
|
||||||
|
int r = _fstati64(fd, statbuf);
|
||||||
|
return r;
|
||||||
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,3 +1,4 @@
|
|||||||
|
#include <toku_portability.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
@@ -41,8 +42,8 @@ int main(void) {
|
|||||||
assert(r == sizeof junk);
|
assert(r == sizeof junk);
|
||||||
}
|
}
|
||||||
|
|
||||||
struct stat filestat;
|
toku_struct_stat filestat;
|
||||||
r = fstat(fd, &filestat);
|
r = toku_fstat(fd, &filestat);
|
||||||
assert(r == 0);
|
assert(r == 0);
|
||||||
|
|
||||||
printf("orig size %lu\n", (unsigned long) filestat.st_size); fflush(stdout);
|
printf("orig size %lu\n", (unsigned long) filestat.st_size); fflush(stdout);
|
||||||
@@ -50,7 +51,7 @@ int main(void) {
|
|||||||
r = ftruncate(fd, 0);
|
r = ftruncate(fd, 0);
|
||||||
assert(r == 0);
|
assert(r == 0);
|
||||||
|
|
||||||
r = fstat(fd, &filestat);
|
r = toku_fstat(fd, &filestat);
|
||||||
assert(r == 0);
|
assert(r == 0);
|
||||||
|
|
||||||
printf("truncated size %lu\n", (unsigned long) filestat.st_size); fflush(stdout);
|
printf("truncated size %lu\n", (unsigned long) filestat.st_size); fflush(stdout);
|
||||||
|
|||||||
@@ -4,30 +4,41 @@
|
|||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
#include <assert.h>
|
#include <assert.h>
|
||||||
#include <sys/stat.h>
|
#include <sys/stat.h>
|
||||||
|
#include <errno.h>
|
||||||
|
|
||||||
void test_stat(char *dirname, int result) {
|
void test_stat(char *dirname, int result, int ex_errno) {
|
||||||
int r;
|
int r;
|
||||||
struct stat s;
|
toku_struct_stat buf;
|
||||||
r = stat(dirname, &s);
|
r = toku_stat(dirname, &buf);
|
||||||
printf("stat %s %d\n", dirname, r); fflush(stdout);
|
printf("stat %s %d %d\n", dirname, r, errno); fflush(stdout);
|
||||||
assert(r==result);
|
assert(r==result);
|
||||||
|
if (r!=0) assert(errno == ex_errno);
|
||||||
}
|
}
|
||||||
|
|
||||||
int main(void) {
|
int main(void) {
|
||||||
int r;
|
int r;
|
||||||
|
|
||||||
test_stat(".", 0);
|
test_stat(".", 0, 0);
|
||||||
test_stat("./", 0);
|
test_stat("./", 0, 0);
|
||||||
|
|
||||||
r = system("rm -rf testdir"); assert(r==0);
|
r = system("rm -rf testdir"); assert(r==0);
|
||||||
|
test_stat("testdir", -1, ENOENT);
|
||||||
|
test_stat("testdir/", -1, ENOENT);
|
||||||
|
test_stat("testdir/foo", -1, ENOENT);
|
||||||
|
test_stat("testdir/foo/", -1, ENOENT);
|
||||||
r = toku_os_mkdir("testdir", S_IRWXU);
|
r = toku_os_mkdir("testdir", S_IRWXU);
|
||||||
assert(r == 0);
|
assert(r == 0);
|
||||||
|
test_stat("testdir/foo", -1, ENOENT);
|
||||||
|
test_stat("testdir/foo/", -1, ENOENT);
|
||||||
|
r = system("touch testdir/foo"); assert(r==0);
|
||||||
|
test_stat("testdir/foo", 0, 0);
|
||||||
|
test_stat("testdir/foo/", -1, ENOENT);
|
||||||
|
|
||||||
test_stat("testdir", 0);
|
test_stat("testdir", 0, 0);
|
||||||
|
|
||||||
test_stat("./testdir", 0);
|
test_stat("./testdir", 0, 0);
|
||||||
|
|
||||||
test_stat("./testdir/", 0);
|
test_stat("./testdir/", 0, 0);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -7,6 +7,9 @@ extern "C" {
|
|||||||
|
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <direct.h>
|
#include <direct.h>
|
||||||
|
#include <sys/types.h>
|
||||||
|
#include <sys/stat.h>
|
||||||
|
|
||||||
|
|
||||||
// define an OS handle
|
// define an OS handle
|
||||||
typedef void *toku_os_handle_t;
|
typedef void *toku_os_handle_t;
|
||||||
@@ -18,6 +21,7 @@ struct fileid {
|
|||||||
uint64_t st_ino;
|
uint64_t st_ino;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
typedef struct _stati64 toku_struct_stat;
|
||||||
|
|
||||||
#if defined(__cplusplus)
|
#if defined(__cplusplus)
|
||||||
};
|
};
|
||||||
|
|||||||
Reference in New Issue
Block a user