X-Git-Url: http://git.tuebingen.mpg.de/?a=blobdiff_plain;f=create.c;h=d08da1c026909de78ccd4386d22d9545de139c80;hb=e14d98641f672c7b687b7259ce9dda130a60e3b4;hp=1ce2e544cec93a85095c1a451083f4d6aaa211bd;hpb=b542a1e3c66b7b01cd2dc91749c5154e25cbff1e;p=adu.git diff --git a/create.c b/create.c index 1ce2e54..d08da1c 100644 --- a/create.c +++ b/create.c @@ -7,48 +7,18 @@ /** \file create.c The create mode of adu. */ #include /* readdir() */ +#include "format.h" #include "adu.h" #include "gcc-compat.h" #include "cmdline.h" #include "fd.h" #include "string.h" #include "error.h" -#include "portable_io.h" +#include "user.h" /* Id of the device containing the base dir. */ static dev_t device_id; -static int write_uid(struct user_info *ui, void *data) -{ - char **p = data; - - write_u32(*p, ui->uid); - *p += sizeof(uint32_t); - return 1; -} - -static int write_uid_list(void) -{ - char *buf, *p, *filename; - uint32_t count = 0; - struct user_info *ui; - size_t size = num_uids * sizeof(uint32_t); - int ret; - - if (!num_uids) - return 0; - buf = p = adu_malloc(size); - ret = for_each_admissible_user(write_uid, &p); - if (ret < 0) - goto out; - filename = get_uid_list_name(); - ret = adu_write_file(filename, buf, size); - free(filename); -out: - free(buf); - return ret; -} - static int add_directory(char *dirname, uint64_t *dir_num, uint64_t *parent_dir_num, uint64_t *dir_size, uint64_t *dir_files) { @@ -117,10 +87,13 @@ static int scan_dir(char *dirname, uint64_t *parent_dir_num) struct dirent *entry; int ret, cwd_fd, ret2; uint64_t dir_size = 0, dir_files = 0; - uint64_t this_dir_num = ++num_dirs; + /* dir count. */ + static uint64_t current_dir_num; + + uint64_t this_dir_num = ++current_dir_num; check_signals(); - DEBUG_LOG("----------------- %llu: %s\n", (long long unsigned)num_dirs, dirname); + DEBUG_LOG("----------------- %llu: %s\n", (long long unsigned)current_dir_num, dirname); ret = adu_opendir(dirname, &dir, &cwd_fd); if (ret < 0) { if (ret != -ERRNO_TO_ERROR(EACCES)) @@ -130,7 +103,7 @@ static int scan_dir(char *dirname, uint64_t *parent_dir_num) } while ((entry = readdir(dir))) { mode_t m; - struct stat s; + struct stat64 s; uint32_t uid; uint64_t size; struct user_info *ui; @@ -139,9 +112,9 @@ static int scan_dir(char *dirname, uint64_t *parent_dir_num) continue; if (!strcmp(entry->d_name, "..")) continue; - if (lstat(entry->d_name, &s) == -1) { - WARNING_LOG("lstat error for %s/%s\n", dirname, - entry->d_name); + if (lstat64(entry->d_name, &s) == -1) { + WARNING_LOG("lstat64 error for %s/%s (%s)\n", + dirname, entry->d_name, strerror(errno)); continue; } m = s.st_mode; @@ -158,11 +131,9 @@ static int scan_dir(char *dirname, uint64_t *parent_dir_num) /* regular file */ size = s.st_size; dir_size += size; - num_bytes += size; dir_files++; - num_files++; uid = s.st_uid; - ret = search_uid(uid, CREATE_USER_TABLE | OPEN_USER_TABLE, &ui); + ret = search_uid(uid, NULL, CREATE_USER_TABLE | OPEN_USER_TABLE, &ui); if (ret < 0) goto out; ui->bytes += size; @@ -182,7 +153,7 @@ out: return ret; } -int com_create() +int com_create(void) { uint64_t zero = 0ULL; int ret; @@ -201,7 +172,7 @@ int com_create() ret = scan_dir(conf.base_dir_arg, &zero); if (ret < 0) goto out; - ret = write_uid_list(); + ret = write_uid_file(); out: close_all_tables(); return ret;