]> git.tuebingen.mpg.de Git - adu.git/blobdiff - adu.c
Implement --one-file-system (-x).
[adu.git] / adu.c
diff --git a/adu.c b/adu.c
index 54af136ad789314b88392658077fa88c926d766f..dad9d8c17f83db81d62ef4116f181fd394320825 100644 (file)
--- a/adu.c
+++ b/adu.c
@@ -75,7 +75,7 @@ static inline int check_uid_arg(const char *arg, uint32_t *uid)
         * returns a signed value.
         */
        int64_t val;
-       int ret = para_atoi64(arg, &val);
+       int ret = atoi64(arg, &val);
 
        if (ret < 0)
                return ret;
@@ -88,7 +88,7 @@ static inline int check_uid_arg(const char *arg, uint32_t *uid)
 static int parse_uid_range(const char *orig_arg, struct uid_range *ur)
 {
        int ret;
-       char *arg = para_strdup(orig_arg), *p = strchr(arg, '-');
+       char *arg = adu_strdup(orig_arg), *p = strchr(arg, '-');
 
        if (!p || p == arg) { /* -42 or 42 */
                ret = check_uid_arg(p? p + 1 : arg, &ur->high);
@@ -320,11 +320,11 @@ static int open_user_table(struct user_info *ui, int create)
 {
        int ret;
 
-       ui->desc = para_malloc(sizeof(*ui->desc));
+       ui->desc = adu_malloc(sizeof(*ui->desc));
        ui->desc->num_columns = NUM_UT_COLUMNS;
        ui->desc->flags = 0;
        ui->desc->column_descriptions = user_table_cols;
-       ui->desc->dir = para_strdup(conf.database_dir_arg);
+       ui->desc->dir = adu_strdup(conf.database_dir_arg);
        ui->desc->name = make_message("%u", (unsigned)ui->uid);
        INFO_LOG(".............................uid #%u: %u\n",
                (unsigned)num_uids, (unsigned)ui->uid);
@@ -357,7 +357,7 @@ static uint32_t uid_hash_table_size = 1 << uid_hash_bits;
 
 static void create_hash_table(void)
 {
-       uid_hash_table = para_calloc(uid_hash_table_size
+       uid_hash_table = adu_calloc(uid_hash_table_size
                * sizeof(struct user_info));
 }
 
@@ -371,7 +371,7 @@ static int create_tables(void)
 {
        int ret;
 
-       dir_table_desc.dir = para_strdup(conf.database_dir_arg);
+       dir_table_desc.dir = adu_strdup(conf.database_dir_arg);
        ret = osl(osl_create_table(&dir_table_desc));
        if (ret < 0)
                return ret;
@@ -576,7 +576,10 @@ static uint64_t num_dirs;
 static uint64_t num_files;
 static uint64_t num_bytes;
 
-int scan_dir(char *dirname, uint64_t *parent_dir_num)
+/* id of the device containing the base dir. */
+static dev_t device_id;
+
+static int scan_dir(char *dirname, uint64_t *parent_dir_num)
 {
        DIR *dir;
        struct dirent *entry;
@@ -586,7 +589,7 @@ int scan_dir(char *dirname, uint64_t *parent_dir_num)
 
        check_signals();
        DEBUG_LOG("----------------- %llu: %s\n", (long long unsigned)num_dirs, dirname);
-       ret = para_opendir(dirname, &dir, &cwd_fd);
+       ret = adu_opendir(dirname, &dir, &cwd_fd);
        if (ret < 0) {
                if (ret != -ERRNO_TO_ERROR(EACCES))
                        return ret;
@@ -613,6 +616,8 @@ int scan_dir(char *dirname, uint64_t *parent_dir_num)
                if (!S_ISREG(m) && !S_ISDIR(m))
                        continue;
                if (S_ISDIR(m)) {
+                       if (conf.one_file_system_given && s.st_dev != device_id)
+                               continue;
                        ret = scan_dir(entry->d_name, &this_dir_num);
                        if (ret < 0)
                                goto out;
@@ -638,7 +643,7 @@ int scan_dir(char *dirname, uint64_t *parent_dir_num)
                        &dir_size, &dir_files);
 out:
        closedir(dir);
-       ret2 = para_fchdir(cwd_fd);
+       ret2 = adu_fchdir(cwd_fd);
        if (ret2 < 0 && ret >= 0)
                ret = ret2;
        close(cwd_fd);
@@ -665,7 +670,7 @@ again:
                free(result);
                result = tmp;
        } else
-               result = para_strdup((char *)obj.data);
+               result = adu_strdup((char *)obj.data);
        ret = osl(osl_get_object(dir_table, row, DT_PARENT_NUM, &obj));
        if (ret < 0)
                goto out;
@@ -691,7 +696,7 @@ static int get_dir_name_of_row(struct osl_row *dir_table_row, char **name)
        ret = osl(osl_get_object(dir_table, dir_table_row, DT_NAME, &obj));
        if (ret < 0)
                return ret;
-       this_dir = para_strdup((char *)obj.data);
+       this_dir = adu_strdup((char *)obj.data);
        ret = osl(osl_get_object(dir_table, dir_table_row, DT_PARENT_NUM, &obj));
        if (ret < 0)
                goto out;
@@ -1090,7 +1095,7 @@ static int write_uid_list(void)
 
        if (!num_uids)
                return 0;
-       buf = para_malloc(size);
+       buf = adu_malloc(size);
        FOR_EACH_USER(ui) {
                if (!ui_used(ui) || !ui_admissible(ui))
                        continue;
@@ -1098,7 +1103,7 @@ static int write_uid_list(void)
                write_u32(buf + count++ * sizeof(uint32_t), ui->uid);
        }
        filename = get_uid_list_name();
-       ret = para_write_file(filename, buf, size);
+       ret = adu_write_file(filename, buf, size);
        free(filename);
        free(buf);
        return ret;
@@ -1107,14 +1112,21 @@ static int write_uid_list(void)
 static int open_dir_table(void)
 {
        if (!dir_table_desc.dir) /* we did not create the table */
-               dir_table_desc.dir = para_strdup(conf.database_dir_arg);
+               dir_table_desc.dir = adu_strdup(conf.database_dir_arg);
        return osl(osl_open_table(&dir_table_desc, &dir_table));
 }
 static int com_create()
 {
        uint64_t zero = 0ULL;
-       int ret = create_tables();
-
+       int ret;
+       struct stat statbuf;
+
+       if (lstat(conf.base_dir_arg, &statbuf) == -1)
+               return -ERRNO_TO_ERROR(errno);
+       if (!S_ISDIR(statbuf.st_mode))
+               return -ERRNO_TO_ERROR(ENOTDIR);
+       device_id = statbuf.st_dev;
+       ret = create_tables();
        if (ret < 0)
                return ret;
        check_signals();
@@ -1158,7 +1170,7 @@ static int read_uid_file(void)
                        goto out;
        }
 out:
-       para_munmap(map, size);
+       adu_munmap(map, size);
        return ret;
 }
 
@@ -1207,7 +1219,7 @@ static int check_args(void)
        }
        if (!conf.uid_given)
                return 0;
-       admissible_uids = para_malloc(conf.uid_given * sizeof(*admissible_uids));
+       admissible_uids = adu_malloc(conf.uid_given * sizeof(*admissible_uids));
        for (i = 0; i < conf.uid_given; i++) {
                ret = parse_uid_range(conf.uid_arg[i], admissible_uids + i);
                if (ret < 0)