int jt_changelog_register(int argc, char **argv)
{
- char rawbuf[MAX_IOC_BUFLEN], *buf = rawbuf;
- struct obd_ioctl_data data;
- char devname[30];
- int rc;
+ struct obd_ioctl_data data = { 0 };
+ char rawbuf[MAX_IOC_BUFLEN] = "";
+ char *buf = rawbuf;
+ char *device = lcfg_get_devname();
+ bool print_name_only = false;
+ int c;
+ int rc;
- if (argc > 2)
- return CMD_HELP;
- else if (argc == 2 && strcmp(argv[1], "-n") != 0)
- return CMD_HELP;
- if (cur_device < 0)
- return CMD_HELP;
+ if (argc > 2)
+ return CMD_HELP;
- memset(&data, 0, sizeof(data));
- data.ioc_dev = cur_device;
- memset(buf, 0, sizeof(rawbuf));
- rc = obd_ioctl_pack(&data, &buf, sizeof(rawbuf));
- if (rc) {
- fprintf(stderr, "error: %s: invalid ioctl\n",
- jt_cmdname(argv[0]));
- return rc;
- }
+ while ((c = getopt(argc, argv, "hn")) >= 0) {
+ switch (c) {
+ case 'n':
+ print_name_only = true;
+ break;
+ case 'h':
+ default:
+ return CMD_HELP;
+ }
+ }
- rc = l2_ioctl(OBD_DEV_ID, OBD_IOC_CHANGELOG_REG, buf);
- if (rc < 0) {
- fprintf(stderr, "error: %s: %s\n", jt_cmdname(argv[0]),
- strerror(rc = errno));
- return rc;
- }
- obd_ioctl_unpack(&data, buf, sizeof(rawbuf));
+ if (cur_device < 0 || device == NULL)
+ return CMD_HELP;
+
+ data.ioc_dev = cur_device;
+
+ rc = obd_ioctl_pack(&data, &buf, sizeof(rawbuf));
+ if (rc < 0) {
+ fprintf(stderr, "error: %s: cannot pack ioctl: %s\n",
+ jt_cmdname(argv[0]), strerror(-rc));
+ return rc;
+ }
+
+ rc = l2_ioctl(OBD_DEV_ID, OBD_IOC_CHANGELOG_REG, buf);
+ if (rc < 0) {
+ rc = -errno;
+ fprintf(stderr, "error: %s: %s\n", jt_cmdname(argv[0]),
+ strerror(-rc));
+ return rc;
+ }
+
+ obd_ioctl_unpack(&data, buf, sizeof(rawbuf));
if (data.ioc_u32_1 == 0) {
fprintf(stderr, "received invalid userid!\n");
return -EPROTO;
}
- if (lcfg_get_devname() != NULL) {
- if (strlen(lcfg_get_devname()) > sizeof(devname)-1) {
- fprintf(stderr, "Dev name too long\n");
- return -E2BIG;
- }
- strncpy(devname, lcfg_get_devname(), sizeof(devname));
- } else {
- if (snprintf(devname, sizeof(devname), "dev %d", cur_device) >=
- sizeof(devname)) {
- fprintf(stderr, "Dev name too long\n");
- return -E2BIG;
- }
- }
+ if (print_name_only)
+ printf("%s%u\n", CHANGELOG_USER_PREFIX, data.ioc_u32_1);
+ else
+ printf("%s: Registered changelog userid '%s%u'\n",
+ device, CHANGELOG_USER_PREFIX, data.ioc_u32_1);
- if (argc == 2)
- /* -n means bare name */
- printf(CHANGELOG_USER_PREFIX"%u\n", data.ioc_u32_1);
- else
- printf("%s: Registered changelog userid '"CHANGELOG_USER_PREFIX
- "%u'\n", devname, data.ioc_u32_1);
- return 0;
+ return 0;
}
int jt_changelog_deregister(int argc, char **argv)
{
- char rawbuf[MAX_IOC_BUFLEN], *buf = rawbuf;
- struct obd_ioctl_data data;
- char devname[30];
- int id, rc;
-
- if (argc != 2 || cur_device < 0)
- return CMD_HELP;
+ struct obd_ioctl_data data = { 0 };
+ char rawbuf[MAX_IOC_BUFLEN] = "";
+ char *buf = rawbuf;
+ char *device = lcfg_get_devname();
+ int id;
+ int rc;
- id = strtol(argv[1] + strlen(CHANGELOG_USER_PREFIX), NULL, 10);
- if ((id == 0) || (strncmp(argv[1], CHANGELOG_USER_PREFIX,
- strlen(CHANGELOG_USER_PREFIX)) != 0)) {
- fprintf(stderr, "expecting id of the form '"
- CHANGELOG_USER_PREFIX"<num>'; got '%s'\n", argv[1]);
- return CMD_HELP;
- }
+ if (argc != 2 || cur_device < 0 || device == NULL)
+ return CMD_HELP;
- memset(&data, 0, sizeof(data));
- data.ioc_dev = cur_device;
- data.ioc_u32_1 = id;
- memset(buf, 0, sizeof(rawbuf));
- rc = obd_ioctl_pack(&data, &buf, sizeof(rawbuf));
- if (rc) {
- fprintf(stderr, "error: %s: invalid ioctl\n",
- jt_cmdname(argv[0]));
- return rc;
- }
+ rc = sscanf(argv[1], CHANGELOG_USER_PREFIX"%d", &id);
+ if (rc != 1 || id <= 0) {
+ fprintf(stderr,
+ "error: %s: expected id of the form %s<num> got '%s'\n",
+ jt_cmdname(argv[0]), CHANGELOG_USER_PREFIX, argv[1]);
+ return CMD_HELP;
+ }
- rc = l2_ioctl(OBD_DEV_ID, OBD_IOC_CHANGELOG_DEREG, buf);
- if (rc < 0) {
- fprintf(stderr, "error: %s: %s\n", jt_cmdname(argv[0]),
- strerror(rc = errno));
- return rc;
- }
- obd_ioctl_unpack(&data, buf, sizeof(rawbuf));
+ data.ioc_dev = cur_device;
+ data.ioc_u32_1 = id;
- if (data.ioc_u32_1 != id) {
- fprintf(stderr, "No changelog user '%s'. Blocking user"
- " is '"CHANGELOG_USER_PREFIX"%d'.\n", argv[1],
- data.ioc_u32_1);
- return -ENOENT;
+ rc = obd_ioctl_pack(&data, &buf, sizeof(rawbuf));
+ if (rc < 0) {
+ fprintf(stderr, "error: %s: invalid ioctl\n",
+ jt_cmdname(argv[0]));
+ return rc;
}
- if (lcfg_get_devname() != NULL) {
- if (strlen(lcfg_get_devname()) > sizeof(devname)-1) {
- fprintf(stderr, "Dev name too long\n");
- return -E2BIG;
- }
- strncpy(devname, lcfg_get_devname(), sizeof(devname));
- } else {
- if (snprintf(devname, sizeof(devname), "dev %d", cur_device) >=
- sizeof(devname)) {
- fprintf(stderr, "Dev name too long\n");
- return -E2BIG;
- }
+ rc = l2_ioctl(OBD_DEV_ID, OBD_IOC_CHANGELOG_DEREG, buf);
+ if (rc < 0) {
+ fprintf(stderr, "error: %s: %s\n", jt_cmdname(argv[0]),
+ strerror(rc = errno));
+ return rc;
}
- printf("%s: Deregistered changelog user '"CHANGELOG_USER_PREFIX"%d'\n",
- devname, data.ioc_u32_1);
- return 0;
-}
-
+ obd_ioctl_unpack(&data, buf, sizeof(rawbuf));
+ printf("%s: Deregistered changelog user '%s%u'\n",
+ device, CHANGELOG_USER_PREFIX, data.ioc_u32_1);
+ return 0;
+}