X-Git-Url: https://git.gag.com/?a=blobdiff_plain;f=common-src%2Ffile.c;h=c5179e4d89d2616f6ea30a86b3c2b4a3475dace0;hb=99080c663209a733fd597a2fcab96a45c9c41291;hp=6f2a0acc4c97ccce7803d9f7fffafe3862b81d9c;hpb=e442edb4d5816c4ad107ad9e71164f845eba70ad;p=debian%2Famanda diff --git a/common-src/file.c b/common-src/file.c index 6f2a0ac..c5179e4 100644 --- a/common-src/file.c +++ b/common-src/file.c @@ -34,47 +34,9 @@ #include "arglist.h" #include "file.h" -static int mk1dir(const char *, mode_t, uid_t, gid_t); static void areads_getbuf(const char *s, int l, int fd); static char *original_cwd = NULL; -/* Make a directory (internal function). - * If the directory already exists then we pretend we created it. - * - * The uid and gid are used only if we are running as root. - */ -static int -mk1dir( - const char *dir, /* directory to create */ - mode_t mode, /* mode for new directory */ - uid_t uid, /* uid for new directory */ - gid_t gid) /* gid for new directory */ -{ - int rc; /* return code */ - - rc = mkdir(dir, mode); - if(rc != 0) { - int serrno; - - serrno = errno; - if(access(dir, F_OK) == 0) - rc = 0; /* someone just beat us to it, so it's OK */ - errno = serrno; - } - - /* mkdir is affected by umask, so set the mode bits manually */ - if (rc == 0) { - rc = chmod(dir, mode); - } - - if (rc == 0 && geteuid() == 0) { - rc = chown(dir, uid, gid); - } - - return rc; -} - - /* * Make a directory hierarchy given an entry to be created (by the caller) * in the new target. In other words, create all the directories down to @@ -94,14 +56,32 @@ mkpdir( rc = 0; - dir = stralloc(file); /* make a copy we can play with */ + /* Remove last member of file, put the result in dir */ + dir = stralloc(file); /* make a copy we can play with */ p = strrchr(dir, '/'); - if(p != dir && p != NULL) { /* got a '/' or a simple name */ - *p = '\0'; + *p = '\0'; - if(access(dir, F_OK) != 0) { /* doesn't exist */ - if(mkpdir(dir, mode, uid, gid) != 0 || - mk1dir(dir, mode, uid, gid) != 0) rc = -1; /* create failed */ + rc = mkdir(dir, mode); + if (rc != 0) { + if (errno == ENOENT) { /* create parent directory */ + rc = mkpdir(dir, mode, uid, gid); + if (rc != 0) + return rc; + rc = mkdir(dir, mode); + } + if (rc != 0 && errno == EEXIST) { + amfree(dir); + return 0; + } + } + + /* mkdir succeded, set permission and ownership */ + if (rc == 0) { + /* mkdir is affected by umask, so set the mode bits manually */ + rc = chmod(dir, mode); + + if (rc == 0 && geteuid() == 0) { + rc = chown(dir, uid, gid); } } @@ -473,7 +453,7 @@ debug_agets( } if (ch == '\\') { - escape = 1; + escape = !escape; } else { if (ch == '"') { if (!escape) @@ -889,6 +869,8 @@ main( g_fprintf(stderr, _(" done.\n")); g_fprintf(stderr, _("Finished.\n")); + + dbclose(); return 0; }