From 68b6a770770262e035092c85ae967125716d8e5b Mon Sep 17 00:00:00 2001 From: fpr Date: Mon, 19 Jun 2017 11:20:06 +0200 Subject: [PATCH] MassStorage updated to manage several node name on MacOSX. Source file modified to be as close as possible than Linux source. Easier to maintain. Signed-off-by: fpr --- macosx/massStorageCopyMacOsX | Bin 8972 -> 13844 bytes src/massStorageCopy/massStorageCopyMacOsX.c | 149 ++++++++++++++++---- 2 files changed, 119 insertions(+), 30 deletions(-) diff --git a/macosx/massStorageCopyMacOsX b/macosx/massStorageCopyMacOsX index 4fa3550f54e8077a82d7df9e2a35fbe48c7fe308..e67acb81243fe6a7dcf3b403b7d660b7493d84eb 100644 GIT binary patch literal 13844 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 #include #include +#include +#include +#include #define MAX_FS 128 +static char *input_path = NULL; +static char *output_path = NULL; +static char *output_dev = NULL; +static char **list_output_dev = NULL; +static char *cmd = NULL; + + +void usage(char *name) +{ + printf("Usage: %s [-I ] [-O ]\n\n", name); + printf("Mandatory options:\n"); + printf("\t-I: filepath binary to copy\n"); + printf("\t-O: mountpoint(s) destination name.\n"); + printf("\t Could be a list (separated by','). Ex: \"NODE_1,NODE2,NODE_3\"\n"); +} + + +void free_ressource() +{ + if(input_path) + free(input_path); + if(output_path) + free(output_path); + if(output_dev) + free(output_dev); + if(list_output_dev) + free(list_output_dev); + if(cmd) + free(cmd); +} + int main(int argc, char *argv[]) { - int i; + int c, i, n; int ret = 0; int device_found = 0; - char input_path[256]; - char output_dev[256]; - char output_path[256]; - char cmd[512]; struct statfs buf[MAX_FS]; int fs_count; + char *p = NULL; + int n_output_dev = 0; + char scp_cmd[]="scp"; - if(argc < 4) { - printf("error: missing parameters\n"); - ret = -1; - } + opterr = 0; - for(i = 1; i < argc; i++) { - - if((strcmp(argv[i], "-I") == 0)&&(i+1 < argc)) { - strcpy(input_path, argv[i+1]); - i++; - } else if((strcmp(argv[i], "-O") == 0)&&(i+1 < argc)) { - strcpy(output_dev, argv[i+1]); - i++; - } else { - printf("error: unknown option %s\n", argv[i]); - ret = -1; + while ((c = getopt (argc, argv, "I:O:")) != -1) { + switch (c) + { + case 'I': + input_path = malloc(strlen(optarg)+1); + if(input_path != NULL) + strcpy(input_path, optarg); + break; + case 'O': + output_dev = malloc(strlen(optarg)+1); + if(output_dev != NULL) + strcpy(output_dev, optarg); + break; + case '?': + if ((optopt == 'I') || (optopt == 'O')) + fprintf (stderr, "Option -%c requires an argument.\n", optopt); + else if (isprint (optopt)) + fprintf (stderr, "Unknown option `-%c'.\n", optopt); + else + fprintf (stderr, "Unknown option character `\\x%x'.\n", optopt); + usage(argv[0]); + free_ressource(); + return EINVAL; + default: + abort (); } } - if(ret == 0) { + if((input_path == NULL) || (output_dev == NULL)) + { + free_ressource(); + exit(ENOMEM); + } + if(strlen(input_path) && strlen(output_dev)) + { + /* get the mounted devices list */ fs_count = getfsstat(NULL,0,MNT_WAIT); if(fs_count < 0) { perror("getfsstat"); - exit(1); + free_ressource(); + exit(ENOENT); } getfsstat(buf,fs_count*sizeof(buf[0]),MNT_WAIT); - for(i = 0; i < fs_count; i++) { - if(strstr(buf[i].f_mntonname,output_dev)) { - sprintf(output_path, "%s", buf[i].f_mntonname); - device_found = 1; + /* " must be removed too */ + p = strtok (output_dev, ",\""); + + /* split output_dev and append tokens to list_output_dev */ + while (p) { + list_output_dev = realloc (list_output_dev, sizeof (char*) * ++n_output_dev); + + if (list_output_dev == NULL) + exit (ENOMEM); + + list_output_dev[n_output_dev-1] = p; + + p = strtok (NULL, ",\""); + } + + /* realloc one extra element for the last NULL */ + list_output_dev = realloc (list_output_dev, sizeof (char*) * (n_output_dev+1)); + list_output_dev[n_output_dev] = 0; + + for(n = 0; (n < fs_count) && (!device_found); n++) { + for(i = 0; (i < n_output_dev) && (!device_found); i++) { + if(strstr(buf[n].f_mntonname,list_output_dev[i])) { + output_path = malloc(strlen(buf[n].f_mntonname)+1); + if(output_path != NULL) { + sprintf(output_path, "%s", buf[n].f_mntonname); + } else { + free_ressource(); + exit(ENOMEM); + } + device_found = 1; + } } } if(device_found) { printf("copying %s to %s\n", input_path, output_path); - sprintf(cmd, "scp %s %s", input_path, output_path); - system(cmd); + cmd = malloc(strlen(scp_cmd)+1+strlen(input_path)+1+strlen(output_path)+1); + if(cmd != NULL) { + sprintf(cmd, "%s %s %s", scp_cmd, input_path, output_path); + } else { + free_ressource(); + exit(ENOMEM); + } + ret = system(cmd); } else { - printf("%s not found. please ensure the device is correctly connected\n", + printf("%s not found. Please ensure the device is correctly connected\n", output_dev); - ret = -1; + ret = ENODEV; } + } else { + printf("Missing argument\n"); + usage(argv[0]); } + free_ressource(); return ret; }