diff options
author | Amaury Pouly <amaury.pouly@gmail.com> | 2018-11-30 15:15:09 +0100 |
---|---|---|
committer | Amaury Pouly <amaury.pouly@gmail.com> | 2018-11-30 15:37:10 +0100 |
commit | da752d00844bf8f881b344570f815ff063e4b65e (patch) | |
tree | 0d12a1b48bf74eded556178046ea3c3f91c1d49b /utils/nwztools/scsitools | |
parent | e01248efcd622211c0451e6dc4ed47cc4b758cfa (diff) |
nwztools/scsitool: add experimental command to list Sony devices
Change-Id: Ic4f382667c5c84514be661d36032c47fb8f92e75
Diffstat (limited to 'utils/nwztools/scsitools')
-rw-r--r-- | utils/nwztools/scsitools/scsitool.c | 54 |
1 files changed, 51 insertions, 3 deletions
diff --git a/utils/nwztools/scsitools/scsitool.c b/utils/nwztools/scsitools/scsitool.c index da2f708cf4..69a3403b25 100644 --- a/utils/nwztools/scsitools/scsitool.c +++ b/utils/nwztools/scsitools/scsitool.c @@ -965,16 +965,20 @@ int process_cmd(const char *cmd, int argc, char **argv) static void usage(void) { - printf("Usage: scsitool [options] <dev> <command> [arguments]\n"); + printf("Usage:\n"); + printf(" scsitool [options] list_devices\n"); + printf(" scsitool [options] <dev> <command> [arguments]\n"); printf("Options:\n"); printf(" -o <prefix> Set output prefix\n"); printf(" -h/--help Display this message\n"); printf(" -d/--debug Display debug messages\n"); printf(" -c/--no-color Disable color output\n"); printf(" -s/--series <name> Force series (disable auto-detection, use '?' for the list)\n"); + printf(" -a/--all List all devices, not just Sony (for list_devices)\n"); printf("Commands:\n"); + printf(" %-20sList all connected Sony devices (experimental)\n", "list_devices"); for(unsigned i = 0; i < NR_CMDS; i++) - printf(" %s\t%s\n", cmd_list[i].name, cmd_list[i].desc); + printf(" %-20s%s\n", cmd_list[i].name, cmd_list[i].desc); exit(1); } @@ -999,8 +1003,44 @@ static const char *get_model_name(uint32_t model_id) return index == -1 ? "Unknown" : nwz_model[index].name; } +static bool is_sony_device(struct rb_scsi_devent_t *dev) +{ + /* vendor must be SONY */ + if(!dev->vendor || strcmp(dev->vendor, "SONY ") != 0) + return false; + /* model must be WALKMAN */ + if(!dev->model || strcmp(dev->model, "WALKMAN ") != 0) + return false; + return true; +} + +static int list_devices(bool list_all) +{ + printf("%s device(s) found:\n", list_all ? "SCSI" : "Sony"); + struct rb_scsi_devent_t *dev = rb_scsi_list(); + if(dev == NULL) + { + cprintf(GREY, "Could not get the list of devices.\n"); + return 1; + } + bool empty_list = true; + for(struct rb_scsi_devent_t *p = dev; p->scsi_path; p++) + { + /* filter non-Sony devices */ + if(!list_all && !is_sony_device(p)) + continue; + printf("%-20s%-20s%s %s %s\n", p->scsi_path, p->block_path, p->vendor, p->model, p->rev); + empty_list = false; + } + if(empty_list) + cprintf(GREY, "No devices found.\n"); + rb_scsi_free_list(dev); + return 0; +} + int main(int argc, char **argv) { + bool list_all = false; while(1) { static struct option long_options[] = @@ -1009,10 +1049,11 @@ int main(int argc, char **argv) {"debug", no_argument, 0, 'd'}, {"no-color", no_argument, 0, 'c'}, {"series", required_argument, 0, 's'}, + {"all", no_argument, 0, 'a'}, {0, 0, 0, 0} }; - int c = getopt_long(argc, argv, "?dcfo:s:", long_options, NULL); + int c = getopt_long(argc, argv, "?dcfo:s:a", long_options, NULL); if(c == -1) break; switch(c) @@ -1034,6 +1075,9 @@ int main(int argc, char **argv) case 's': g_force_series = optarg; break; + case 'a': + list_all = true; + break; default: abort(); } @@ -1057,6 +1101,10 @@ int main(int argc, char **argv) return 0; } + /* special list_devices command */ + if(argc == optind + 1 && strcmp(argv[optind], "list_devices") == 0) + return list_devices(list_all); + if(argc - optind < 2) { usage(); |