#include "adu.h"
#include <dirent.h> /* readdir() */
+#include <pwd.h>
#include "gcc-compat.h"
#include "cmdline.h"
struct user_info {
uint32_t uid;
uint32_t flags;
+ char *pw_name;
struct osl_table *table;
uint64_t files;
uint64_t bytes;
* returns a signed value.
*/
int64_t val;
- int ret = para_atoi64(arg, &val);
+ int ret = atoi64(arg, &val);
if (ret < 0)
return ret;
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);
static int open_user_table(struct user_info *ui, int create)
{
int ret;
+ struct passwd *pw;
- 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);
+ pw = getpwuid(ui->uid);
+ if (pw && pw->pw_name)
+ ui->pw_name = adu_strdup(pw->pw_name);
+
INFO_LOG(".............................uid #%u: %u\n",
(unsigned)num_uids, (unsigned)ui->uid);
if (create) {
err:
free((char *)ui->desc->name);
free((char *)ui->desc->dir);
+ free(ui->pw_name);
free(ui->desc);
ui->desc->name = NULL;
ui->desc->dir = NULL;
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));
}
{
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;
ui->desc->name = NULL;
free((char *)ui->desc->dir);
ui->desc->dir = NULL;
+ free(ui->pw_name);
+ ui->pw_name = NULL;
free(ui->desc);
ui->desc = NULL;
ui->table = NULL;
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;
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;
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;
&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);
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;
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;
struct user_info *ui;
printf("User summary "
- "(uid/dirs%s/files%s/size%s):\n",
+ "(pw_name/uid/dirs%s/files%s/size%s):\n",
count_unit_buf, count_unit_buf, size_unit_buf);
FOR_EACH_USER(ui) {
char formated_dir_count[FORMATED_VALUE_SIZE],
format_size_value(conf.size_unit_arg, ui->bytes,
conf.size_unit_arg == size_unit_arg_h,
formated_bytes);
- printf("\t%u\t%s\t%s\t%s\n", (unsigned)ui->uid,
+ printf("\t%s\t%u\t%s\t%s\t%s\n",
+ ui->pw_name? ui->pw_name : "?",
+ (unsigned)ui->uid,
formated_dir_count,
formated_file_count,
formated_bytes
if (!ui_used(ui) || !ui_admissible(ui))
continue;
usi.flags = USF_PRINT_DIRNAME | USF_PRINT_BYTES | USF_COMPUTE_SUMMARY;
- printf("uid %u, by size%s:\n",
- (unsigned) ui->uid, size_unit_buf);
+ printf("%s (uid %u), by size%s:\n",
+ ui->pw_name? ui->pw_name : "?", (unsigned)ui->uid,
+ size_unit_buf);
ret = adu_loop_reverse(ui->table, UT_BYTES, &usi, user_stats_loop_function,
&usi.ret, &usi.osl_errno);
if (ret < 0)
return ret;
- printf("\nuid %u, by file count%s:\n",
- (unsigned) ui->uid, count_unit_buf);
+ printf("\n%s (uid %u), by file count%s:\n",
+ ui->pw_name? ui->pw_name : "?", (unsigned)ui->uid,
+ count_unit_buf);
usi.count = conf.limit_arg,
usi.flags = USF_PRINT_DIRNAME | USF_PRINT_FILES;
ret = adu_loop_reverse(ui->table, UT_FILES, &usi, user_stats_loop_function,
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;
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;
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();
goto out;
}
out:
- para_munmap(map, size);
+ adu_munmap(map, size);
return ret;
}
}
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)