char *stripe_offset_opt = NULL;
char *stripe_count_opt = NULL;
char *stripe_hash_opt = NULL;
+ char *mode_opt = NULL;
int default_stripe = 0;
+ mode_t mode = S_IRWXU | S_IRWXG | S_IRWXO;
+ mode_t previous_mode = 0;
struct option long_opts[] = {
{"count", required_argument, 0, 'c'},
{"index", required_argument, 0, 'i'},
+ {"mode", required_argument, 0, 'm'},
{"hash-type", required_argument, 0, 't'},
- {"default_stripe", required_argument, 0, 'D'},
+ {"default_stripe", no_argument, 0, 'D'},
{0, 0, 0, 0}
};
optind = 0;
- while ((c = getopt_long(argc, argv, "c:Di:t:", long_opts, NULL)) >= 0) {
+ while ((c = getopt_long(argc, argv, "c:Di:m:t:", long_opts,
+ NULL)) >= 0) {
switch (c) {
case 0:
/* Long options. */
case 'i':
stripe_offset_opt = optarg;
break;
+ case 'm':
+ mode_opt = optarg;
+ break;
case 't':
stripe_hash_opt = optarg;
break;
}
}
+ if (mode_opt != NULL) {
+ mode = strtoul(mode_opt, &end, 8);
+ if (*end != '\0') {
+ fprintf(stderr, "error: %s: bad mode '%s'\n",
+ argv[0], mode_opt);
+ return CMD_HELP;
+ }
+ previous_mode = umask(0);
+ }
+
if (stripe_hash_opt == NULL ||
strcmp(stripe_hash_opt, LMV_HASH_NAME_FNV_1A_64) == 0) {
hash_type = LMV_HASH_TYPE_FNV_1A_64;
stripe_offset, stripe_count,
hash_type, NULL);
} else {
- result = llapi_dir_create_pool(dname, 0, stripe_offset,
+ result = llapi_dir_create_pool(dname, mode,
+ stripe_offset,
stripe_count, hash_type,
NULL);
}
dname = argv[++optind];
} while (dname != NULL);
+ if (mode_opt != NULL)
+ umask(previous_mode);
+
return result;
}