diff options
author | Sergey Poznyakoff <gray@gnu.org> | 2020-04-13 21:50:15 +0300 |
---|---|---|
committer | Sergey Poznyakoff <gray@gnu.org> | 2020-04-13 22:32:40 +0300 |
commit | 2f3ec2402f827066cb55ae562154106433d29ac2 (patch) | |
tree | 87e650e32e90da305478c17e1e9730932e4e3c50 /src/backup.c | |
parent | a9d38e5de5cceb667bec3db15fed68f7e8d96a8b (diff) | |
download | wydawca-2f3ec2402f827066cb55ae562154106433d29ac2.tar.gz wydawca-2f3ec2402f827066cb55ae562154106433d29ac2.tar.bz2 |
Rewrite diskio function so as not to assume any particular cwd
* src/backup.c (get_backup_suffix)
(find_backup_file_name): Get directory descriptor as first argument.
* src/diskio.c: Rewrite using *at() functions.
* src/gpg.c (rmdir_r): Silently skip ENOENT.
(verify_detached_signature): push_dir/pop_dir.
* src/triplet.c: Don't change to spool->source_dir. Underlying
functions don't assume any specific cwd.
* src/wydawca.h (find_backup_file_name)
(create_hierarchy): Change signatures. All uses changed.
* tests/Makefile.am: Add new tests.
* tests/testsuite.at: Likewise.
(AT_WYDAWCA_DAEMON): Take additional argument.
* tests/inotify-rmsymlink.at: New test.
* tests/inotify-symlink.at: New test.
* tests/rmsymlink00.at: New test.
* tests/symlink00.at: New test.
* tests/symlink01.at: New test.
* tests/dist/rmsymlink.directive.asc: New directive file.
* tests/dist/symlink.directive.asc: New directive file.
Diffstat (limited to 'src/backup.c')
-rw-r--r-- | src/backup.c | 27 |
1 files changed, 12 insertions, 15 deletions
diff --git a/src/backup.c b/src/backup.c index 8f94e88..f4ab994 100644 --- a/src/backup.c +++ b/src/backup.c @@ -41,11 +41,10 @@ split_filename(char const *file, char **pdir) #define ISDIGIT(c) ('0' <= (c) && (c) <= '9') static char * -get_backup_suffix(char const *file, enum backup_type type) +get_backup_suffix(int dirfd, char const *file, enum backup_type type) { - char *dirname; - const char *basename; size_t baselen; + int fd; DIR *dir; struct dirent *ent; char *lastsuf = NULL; @@ -58,22 +57,21 @@ get_backup_suffix(char const *file, enum backup_type type) if (type == simple_backups) return grecs_strdup(simple_backup_suffix); - basename = split_filename(file, &dirname); - baselen = strlen(basename); - dir = opendir(dirname); - if (!dir) { - int ec = errno; - free(dirname); - errno = ec; + baselen = strlen(file); + fd = openat(dirfd, ".", O_RDONLY | O_NONBLOCK | O_DIRECTORY); + if (fd == -1) + return NULL; + + dir = fdopendir(fd); + if (!dir) return NULL; - } while ((ent = readdir(dir))) { size_t len = strlen(ent->d_name); const char *p; size_t suflen; - if (len < baselen + 4 || memcmp(ent->d_name, basename, baselen)) + if (len < baselen + 4 || memcmp(ent->d_name, file, baselen)) continue; p = ent->d_name + baselen; suflen = len - baselen; @@ -104,7 +102,6 @@ get_backup_suffix(char const *file, enum backup_type type) } } closedir(dir); - free(dirname); if (lastsuf) { size_t newsuflen; @@ -130,7 +127,7 @@ get_backup_suffix(char const *file, enum backup_type type) } char * -find_backup_file_name(char const *file, enum backup_type type) +find_backup_file_name(int dirfd, char const *file, enum backup_type type) { size_t flen; char *suffix; @@ -141,7 +138,7 @@ find_backup_file_name(char const *file, enum backup_type type) return NULL; } - suffix = get_backup_suffix(file, type); + suffix = get_backup_suffix(dirfd, file, type); if (!suffix) return NULL; flen = strlen(file); |