diff options
author | Reverend Homer <mk.43.ecko@gmail.com> | 2016-11-28 19:45:14 +0300 |
---|---|---|
committer | Reverend Homer <mk.43.ecko@gmail.com> | 2016-11-28 19:45:14 +0300 |
commit | b2da11ca2eb26d55502423c85de1f9ae1b37e415 (patch) | |
tree | 1743f312380019837d8755292fc21ba37705602e | |
parent | 8bd9725624248de99b22df67a3a1339299691f74 (diff) | |
download | libmtp-b2da11ca2eb26d55502423c85de1f9ae1b37e415.tar.gz |
examples: fix arg parsing in connect.c
This commit fixes #1598, #1599 and #1600
-rw-r--r-- | examples/connect.c | 57 |
1 files changed, 40 insertions, 17 deletions
diff --git a/examples/connect.c b/examples/connect.c index 6acfb8b..6566c6e 100644 --- a/examples/connect.c +++ b/examples/connect.c @@ -24,6 +24,7 @@ #include <libgen.h> #include <getopt.h> #include <string.h> +#include <errno.h> #include "common.h" #include "util.h" @@ -34,34 +35,41 @@ LIBMTP_folder_t *folders; LIBMTP_file_t *files; LIBMTP_mtpdevice_t *device; -static void +static int split_arg(char * argument, char ** part1, char ** part2) { char *sepp; + size_t arg_shift; *part1 = NULL; *part2 = NULL; - sepp = argument + strcspn(argument, ","); + arg_shift = strcspn(argument, ","); + if (arg_shift == strlen(argument)) + return -EINVAL; + + sepp = argument + arg_shift; sepp[0] = '\0'; *part1 = argument; *part2 = sepp+1; + return 0; } static void usage(void) { - printf("Usage: connect <command1> <command2>\n"); - printf("Commands: --delete [filename]\n"); - printf(" --sendfile [source] [destination]\n"); - printf(" --sendtrack [source] [destination]\n"); - printf(" --getfile [source] [destination]\n"); - printf(" --newfolder [foldername]\n"); + printf("Usage: mtp-connect [command1] [command2] ...\n"); + printf("Commands: --delete filename\n"); + printf(" --sendfile source,destination\n"); + printf(" --sendtrack source,destination\n"); + printf(" --getfile source,destination\n"); + printf(" --newfolder foldername\n"); } int main (int argc, char **argv) { int ret = 0; + int two_args = 0; checklang(); @@ -111,30 +119,45 @@ int main (int argc, char **argv) char *arg1, *arg2; switch (c) { case 'd': - printf("Delete %s\n",optarg); + printf("Delete %s\n", optarg); ret = delfile_function(optarg); break; case 'f': - printf("Send file %s\n",optarg); - split_arg(optarg,&arg1,&arg2); - ret = sendfile_function(arg1,arg2); + printf("Send file %s\n", optarg); + ret = split_arg(optarg, &arg1, &arg2); + if (ret < 0) { + fprintf(stderr, "Invalid argument: %s\n\n", optarg); + usage(); + return -ret; + } + ret = sendfile_function(arg1, arg2); break; case 'g': - printf("Get file %s\n",optarg); - split_arg(optarg,&arg1,&arg2); + printf("Get file %s\n", optarg); + ret = split_arg(optarg, &arg1, &arg2); + if (ret < 0) { + fprintf(stderr, "Invalid argument: %s\n\n", optarg); + usage(); + return -ret; + } ret = getfile_function(arg1,arg2); break; case 'n': - printf("New folder %s\n",optarg); + printf("New folder %s\n", optarg); ret = newfolder_function(optarg); break; case 't': - printf("Send track %s\n",optarg); - split_arg(optarg,&arg1,&arg2); + printf("Send track %s\n", optarg); + ret = split_arg(optarg, &arg1, &arg2); + if (ret < 0) { + fprintf(stderr, "Invalid argument: %s\n\n", optarg); + usage(); + return -ret; + } ret = sendtrack_function(arg1,arg2,NULL,NULL,NULL,NULL,NULL,NULL,0,0,0,0,0); break; } |