#include <string.h>
#include <errno.h>
#include <assert.h>
-#include <syslog.h>
#include <dirent.h>
#include <stdio.h>
+#include <fcntl.h>
+#include <unistd.h>
+#include "verbose.h"
#include "wgtpkg.h"
struct fdb {
while ('0' <= name[len] && name[len] <= '9') {
nid = 10 * id + (unsigned int)(name[len++] - '0');
if (nid < id || nid == UINT_MAX) {
- syslog(LOG_WARNING, "number too big for %s", name);
+ WARNING("number too big for %s", name);
return 0;
}
id = nid;
/* allocations */
grow = realloc(allfiles.files, (allfiles.count + 1) * sizeof(struct filedesc *));
if (grow == NULL) {
- syslog(LOG_ERR, "realloc failed in get_filedesc");
+ ERROR("realloc failed in get_filedesc");
return NULL;
}
allfiles.files = grow;
if (sig) {
grow = realloc(allsignatures.files, (allsignatures.count + 1) * sizeof(struct filedesc *));
if (grow == NULL) {
- syslog(LOG_ERR, "second realloc failed in get_filedesc");
+ ERROR("second realloc failed in get_filedesc");
return NULL;
}
allsignatures.files = grow;
result = malloc(sizeof(struct filedesc) + strlen(name));
if (!result) {
- syslog(LOG_ERR, "calloc failed in get_filedesc");
+ ERROR("calloc failed in get_filedesc");
return NULL;
}
else if (desc->type == type_unset)
desc->type = type;
else {
- syslog(LOG_ERR, "redeclaration of %s in file_add", name);
+ ERROR("redeclaration of %s in file_add", name);
errno = EEXIST;
desc = NULL;
}
len = asprintf(&name, "%s%u%s", distributor_file_prefix, number, distributor_file_suffix);
if (len < 0)
- syslog(LOG_ERR, "asprintf failed in create_signature");
+ ERROR("asprintf failed in create_signature");
else {
assert(len > 0);
result = file_of_name(name);
static int fill_files_rec(char name[PATH_MAX], int offset)
{
- int len, err;
+ int len, err, fd;
DIR *dir;
struct dirent *ent;
- if (offset == 0)
- dir = opendir(".");
- else {
- dir = opendir(name);
- name[offset++] = '/';
+ fd = openat(workdirfd, offset ? name : ".", O_DIRECTORY|O_RDONLY);
+ if (fd < 0) {
+ ERROR("openat %.*s failed in fill_files_rec", offset, name);
+ return -1;
}
+ dir = fdopendir(fd);
if (!dir) {
- syslog(LOG_ERR, "opendir %.*s failed in zwr", offset, name);
+ ERROR("opendir %.*s failed in fill_files_rec", offset, name);
+ close(fd);
return -1;
}
+ if (offset)
+ name[offset++] = '/';
ent = readdir(dir);
while (ent != NULL) {
;
else if (offset + len >= PATH_MAX) {
closedir(dir);
- syslog(LOG_ERR, "name too long in fill_files_rec");
+ ERROR("name too long in fill_files_rec");
errno = ENAMETOOLONG;
return -1;
} else {