aboutsummaryrefslogtreecommitdiff
path: root/src/backup.c
diff options
context:
space:
mode:
authorSergey Poznyakoff <gray@gnu.org>2020-04-13 21:50:15 +0300
committerSergey Poznyakoff <gray@gnu.org>2020-04-13 22:32:40 +0300
commit2f3ec2402f827066cb55ae562154106433d29ac2 (patch)
tree87e650e32e90da305478c17e1e9730932e4e3c50 /src/backup.c
parenta9d38e5de5cceb667bec3db15fed68f7e8d96a8b (diff)
downloadwydawca-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.c27
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);

Return to:

Send suggestions and report system problems to the System administrator.