} \
} while (0)
-/*
- pack "LL LL LL LL LL LL LL L L L L L L L L L a60 a60 L L L",
- $obdo->{id}, 0,
- $obdo->{gr}, 0,
- $obdo->{atime}, 0,
- $obdo->{mtime}, 0 ,
- $obdo->{ctime}, 0,
- $obdo->{size}, 0,
- $obdo->{blocks}, 0,
- $obdo->{blksize},
- $obdo->{mode},
- $obdo->{uid},
- $obdo->{gid},
- $obdo->{flags},
- $obdo->{obdflags},
- $obdo->{nlink},
- $obdo->{generation},
- $obdo->{valid},
- $obdo->{inline},
- $obdo->{obdmd},
- 0, 0, # struct list_head
- 0; # struct obd_ops
-}
-
-*/
-
char *obdo_print(struct obdo *obd)
{
char buf[1024];
}
+#define BAD_VERBOSE (-999999999)
#define N2D_OFF 0x100 /* So we can tell between error codes and devices */
* supports a number or name.
* FIXME: support UUID
*/
-static int parse_devname(char * func, char *name)
+static int parse_devname(char *func, char *name)
{
int rc;
int ret = -1;
rc = do_name2dev(func, name + 1);
if (rc >= N2D_OFF) {
ret = rc - N2D_OFF;
- printf("%s is device %d\n", name,
- ret);
+ printf("%s is device %d\n", name, ret);
} else {
fprintf(stderr, "error: %s: %s: %s\n", cmdname(func),
name, "device not found");
}
/* A negative verbosity means to print at most each X seconds */
- if (verbose < 0 && next_time != NULL && difftime(&now, next_time) >= 0) {
+ if (verbose < 0 && next_time != NULL && difftime(&now, next_time) >= 0){
next_time->tv_sec = now.tv_sec - verbose;
next_time->tv_usec = now.tv_usec;
if (next_num)
return 0;
}
-static int get_verbose(const char *arg)
+static int get_verbose(char *func, const char *arg)
{
int verbose;
+ char *end;
if (!arg || arg[0] == 'v')
verbose = 1;
else if (arg[0] == 's' || arg[0] == 'q')
verbose = 0;
- else
- verbose = (int)strtoul(arg, NULL, 0);
+ else {
+ verbose = (int)strtoul(arg, &end, 0);
+ if (*end) {
+ fprintf(stderr, "error: %s: bad verbose option '%s'\n",
+ cmdname(func), arg);
+ return BAD_VERBOSE;
+ }
+ }
if (verbose < 0)
printf("Print status every %d seconds\n", -verbose);
do_disconnect(argv[0], 1);
-#warning Robert: implement timeout per lctl usage for probe
+#warning TODO: implement timeout per lctl usage for probe
if (argc != 1)
return CMD_HELP;
int ret;
int rc;
- if (argc < 3) {
- fprintf(stderr, "usage: %s devno <command [args ...]>\n",
- cmdname(argv[0]));
- return -1;
- }
+ if (argc < 3)
+ return CMD_HELP;
rc = do_device("device", parse_devname(argv[0], argv[1]));
int threads, next_thread;
int verbose;
int rc = 0;
+ char *end;
int i;
- if (argc < 5) {
- fprintf(stderr,
- "usage: %s numthreads verbose devno <cmd [args ...]>\n",
- argv[0]);
- return -1;
- }
+ if (argc < 5)
+ return CMD_HELP;
- threads = strtoul(argv[1], NULL, 0);
+ threads = strtoul(argv[1], &end, 0);
+ if (*end) {
+ fprintf(stderr, "error: %s: invalid page count '%s'\n",
+ cmdname(argv[0]), argv[1]);
+ return CMD_HELP;
+ }
- verbose = get_verbose(argv[2]);
+ verbose = get_verbose(argv[0], argv[2]);
+ if (verbose == BAD_VERBOSE)
+ return CMD_HELP;
if (verbose != 0)
printf("%s: starting %d threads on device %s running %s\n",
* always returns 1 (OK). See wait(2).
*/
int err = WEXITSTATUS(status);
- if (err)
+ if (err || WIFSIGNALED(status))
fprintf(stderr,
"%s: PID %d had rc=%d\n",
argv[0], ret, err);
int count = 1, next_count;
int verbose = 1;
int rc = 0, i;
+ char *end;
IOCINIT(data);
if (argc < 2 || argc > 4)
return CMD_HELP;
- count = strtoul(argv[1], NULL, 0);
+ count = strtoul(argv[1], &end, 0);
+ if (*end) {
+ fprintf(stderr, "error: %s: invalid iteration count '%s'\n",
+ cmdname(argv[0]), argv[1]);
+ return CMD_HELP;
+ }
- if (argc > 2)
- data.ioc_obdo1.o_mode = strtoul(argv[2], NULL, 0);
- else
+ if (argc > 2) {
+ data.ioc_obdo1.o_mode = strtoul(argv[2], &end, 0);
+ if (*end) {
+ fprintf(stderr, "error: %s: invalid mode '%s'\n",
+ cmdname(argv[0]), argv[2]);
+ return CMD_HELP;
+ }
+ } else
data.ioc_obdo1.o_mode = 0100644;
data.ioc_obdo1.o_valid = OBD_MD_FLMODE;
- if (argc > 3)
- verbose = get_verbose(argv[3]);
+ if (argc > 3) {
+ verbose = get_verbose(argv[0], argv[3]);
+ if (verbose == BAD_VERBOSE)
+ return CMD_HELP;
+ }
printf("%s: %d objects\n", cmdname(argv[0]), count);
gettimeofday(&next_time, NULL);
int jt_obd_setattr(int argc, char **argv)
{
struct obd_ioctl_data data;
+ char *end;
int rc;
IOCINIT(data);
if (argc != 2)
return CMD_HELP;
- data.ioc_obdo1.o_id = strtoul(argv[1], NULL, 0);
- data.ioc_obdo1.o_mode = S_IFREG | strtoul(argv[2], NULL, 0);
+ data.ioc_obdo1.o_id = strtoul(argv[1], &end, 0);
+ if (*end) {
+ fprintf(stderr, "error: %s: invalid objid '%s'\n",
+ cmdname(argv[0]), argv[1]);
+ return CMD_HELP;
+ }
+ data.ioc_obdo1.o_mode = S_IFREG | strtoul(argv[2], &end, 0);
+ if (*end) {
+ fprintf(stderr, "error: %s: invalid mode '%s'\n",
+ cmdname(argv[0]), argv[2]);
+ return CMD_HELP;
+ }
data.ioc_obdo1.o_valid = OBD_MD_FLMODE;
rc = ioctl(fd, OBD_IOC_SETATTR, &data);
int jt_obd_destroy(int argc, char **argv)
{
struct obd_ioctl_data data;
+ char *end;
int rc;
IOCINIT(data);
if (argc != 2)
return CMD_HELP;
- data.ioc_obdo1.o_id = strtoul(argv[1], NULL, 0);
+ data.ioc_obdo1.o_id = strtoul(argv[1], &end, 0);
+ if (*end) {
+ fprintf(stderr, "error: %s: invalid objid '%s'\n",
+ cmdname(argv[0]), argv[1]);
+ return CMD_HELP;
+ }
data.ioc_obdo1.o_mode = S_IFREG | 0644;
rc = ioctl(fd, OBD_IOC_DESTROY, &data);
int jt_obd_getattr(int argc, char **argv)
{
struct obd_ioctl_data data;
+ char *end;
int rc;
if (argc != 2)
return CMD_HELP;
IOCINIT(data);
- data.ioc_obdo1.o_id = strtoul(argv[1], NULL, 0);
+ data.ioc_obdo1.o_id = strtoul(argv[1], &end, 0);
+ if (*end) {
+ fprintf(stderr, "error: %s: invalid objid '%s'\n",
+ cmdname(argv[0]), argv[1]);
+ return CMD_HELP;
+ }
/* to help obd filter */
data.ioc_obdo1.o_mode = 0100644;
data.ioc_obdo1.o_valid = 0xffffffff;
struct timeval start, next_time;
int i, count, next_count;
int verbose;
+ char *end;
int rc = 0;
if (argc != 2 && argc != 3)
return CMD_HELP;
IOCINIT(data);
- count = strtoul(argv[1], NULL, 0);
+ count = strtoul(argv[1], &end, 0);
+ if (*end) {
+ fprintf(stderr, "error: %s: invalid iteration count '%s'\n",
+ cmdname(argv[0]), argv[1]);
+ return CMD_HELP;
+ }
- if (argc == 3)
- verbose = get_verbose(argv[2]);
- else
+ if (argc == 3) {
+ verbose = get_verbose(argv[0], argv[2]);
+ if (verbose == BAD_VERBOSE)
+ return CMD_HELP;
+ } else
verbose = 1;
data.ioc_obdo1.o_valid = 0xffffffff;
int pages = 1, objid = 3, count, next_count;
int verbose = 1, write = 0, rw;
long long offset;
+ char *end;
int i;
int len;
int rc = 0;
- if (argc < 2 || argc > 6)
+ if (argc < 2 || argc > 6) {
+ fprintf(stderr, "error: %s: bad number of arguments: %d\n",
+ cmdname(argv[0]), argc);
return CMD_HELP;
+ }
- count = strtoul(argv[1], NULL, 0);
+ count = strtoul(argv[1], &end, 0);
+ if (*end) {
+ fprintf(stderr, "error: %s: bad iteration count '%s'\n",
+ cmdname(argv[0]), argv[1]);
+ return CMD_HELP;
+ }
if (argc >= 3) {
if (argv[2][0] == 'w' || argv[2][0] == '1')
else if (argv[2][0] == 'r' || argv[2][0] == '0')
write = 0;
- verbose = get_verbose(argv[3]);
+ verbose = get_verbose(argv[0], argv[3]);
+ if (verbose == BAD_VERBOSE)
+ return CMD_HELP;
}
- if (argc >= 5)
- pages = strtoul(argv[4], NULL, 0);
- if (argc >= 6)
- objid = strtoul(argv[5], NULL, 0);
+ if (argc >= 5) {
+ pages = strtoul(argv[4], &end, 0);
+ if (*end) {
+ fprintf(stderr, "error: %s: bad page count '%s'\n",
+ cmdname(argv[0]), argv[4]);
+ return CMD_HELP;
+ }
+ }
+ if (argc >= 6) {
+ objid = strtoul(argv[5], &end, 0);
+ if (*end) {
+ fprintf(stderr, "error: %s: bad objid '%s'\n",
+ cmdname(argv[0]), argv[5]);
+ return CMD_HELP;
+ }
+ }
len = pages * PAGE_SIZE;
struct lov_desc desc;
uuid_t *uuidarray;
int rc, size, i;
+ char *end;
+
IOCINIT(data);
if (argc <= 6)
return CMD_HELP;
- if (strlen(argv[1]) > sizeof(uuid_t) - 1) {
- fprintf(stderr, "lov_config: no %dB memory for uuid's\n",
- strlen(argv[1]));
+ if (strlen(argv[1]) > sizeof(*uuidarray) - 1) {
+ fprintf(stderr, "error: %s: no %dB memory for uuid's\n",
+ cmdname(argv[0]), strlen(argv[1]));
return -ENOMEM;
}
memset(&desc, 0, sizeof(desc));
- strcpy(desc.ld_uuid, argv[1]);
- desc.ld_default_stripe_count = strtoul(argv[2], NULL, 0);
- desc.ld_default_stripe_size = strtoul(argv[3], NULL, 0);
- desc.ld_default_stripe_offset = (__u64) strtoul(argv[4], NULL, 0);
- desc.ld_pattern = strtoul(argv[5], NULL, 0);
+ strncpy(desc.ld_uuid, argv[1], sizeof(*uuidarray) - 1);
+ desc.ld_default_stripe_count = strtoul(argv[2], &end, 0);
+ if (*end) {
+ fprintf(stderr, "error: %s: bad default stripe count '%s'\n",
+ cmdname(argv[0]), argv[2]);
+ return CMD_HELP;
+ }
+ desc.ld_default_stripe_size = strtoul(argv[3], &end, 0);
+ if (*end) {
+ fprintf(stderr, "error: %s: bad default stripe size '%s'\n",
+ cmdname(argv[0]), argv[3]);
+ return CMD_HELP;
+ }
+ if (desc.ld_default_stripe_size < 4096) {
+ fprintf(stderr, "error: %s: stripe size %ld too small\n",
+ cmdname(argv[0]), (long)desc.ld_default_stripe_size);
+ return -EINVAL;
+ }
+ desc.ld_default_stripe_offset = (__u64) strtoul(argv[4], &end, 0);
+ if (*end) {
+ fprintf(stderr, "error: %s: bad default stripe offset '%s'\n",
+ cmdname(argv[0]), argv[4]);
+ return CMD_HELP;
+ }
+ desc.ld_pattern = strtoul(argv[5], &end, 0);
+ if (*end) {
+ fprintf(stderr, "error: %s: bad stripe pattern '%s'\n",
+ cmdname(argv[0]), argv[5]);
+ return CMD_HELP;
+ }
desc.ld_tgt_count = argc - 6;
-
- size = sizeof(uuid_t) * desc.ld_tgt_count;
+ size = desc.ld_tgt_count * sizeof(*uuidarray);
uuidarray = malloc(size);
if (!uuidarray) {
- fprintf(stderr, "lov_config: no %dB memory for uuid's\n", size);
+ fprintf(stderr, "error: %s: no %dB memory for uuid's\n",
+ cmdname(argv[0]), size);
return -ENOMEM;
}
memset(uuidarray, 0, size);
for (i = 6; i < argc; i++) {
char *buf = (char *)(uuidarray + i - 6);
- if (strlen(argv[i]) >= sizeof(uuid_t)) {
- fprintf(stderr, "lov_config: arg %d (%s) too long\n",
- i, argv[i]);
+ if (strlen(argv[i]) >= sizeof(*uuidarray)) {
+ fprintf(stderr, "error: %s: arg %d (%s) too long\n",
+ cmdname(argv[0]), i, argv[i]);
free(uuidarray);
return -EINVAL;
}