diff --git a/linux/massStorageCopy b/linux/massStorageCopy index 7e10d84c..4a0db4b9 100755 Binary files a/linux/massStorageCopy and b/linux/massStorageCopy differ diff --git a/linux64/massStorageCopy b/linux64/massStorageCopy index 6373d1cf..41913d2d 100755 Binary files a/linux64/massStorageCopy and b/linux64/massStorageCopy differ diff --git a/src/massStorageCopy/massStorageCopy.bat b/src/massStorageCopy/massStorageCopy.bat deleted file mode 100644 index 746f67a7..00000000 --- a/src/massStorageCopy/massStorageCopy.bat +++ /dev/null @@ -1,9 +0,0 @@ -@ECHO off -SET SOURCE=%2 -SET SRC_PARSE=%SOURCE:/=\% -SET TARGET=%4 -setlocal enabledelayedexpansion -for /F "skip=1 tokens=*" %%a in ('WMIC LOGICALDISK where "volumename like '%TARGET%%%'" get deviceid') do if not defined id set id=%%a -Call Set "deviceid=%%id: =%%" -if not "%deviceid%" == "" (XCOPY %SRC_PARSE% %deviceid% /Y /Q >NUL -echo Upload complete ) else ( echo %TARGET% not found. Please ensure the device is correctly connected) \ No newline at end of file diff --git a/src/massStorageCopy/massStorageCopy.c b/src/massStorageCopy/massStorageCopy.c index 6f7aa5b3..6fd5acce 100644 --- a/src/massStorageCopy/massStorageCopy.c +++ b/src/massStorageCopy/massStorageCopy.c @@ -4,13 +4,38 @@ #include #include #include +#include + +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; +static FILE *aFile = NULL; void usage(char *name) { - printf("Usage: %s [-I ] [-O ]\n\n", 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 destination name\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); + if(aFile) + endmntent(aFile); } int main(int argc, char *argv[]) @@ -18,12 +43,10 @@ int main(int argc, char *argv[]) int c, i; int ret = 0; int device_found = 0; - char input_path[256] = ""; - char output_dev[256] = ""; - char output_path[256] = ""; - char cmd[512] = ""; struct mntent *ent = NULL; - FILE *aFile = NULL; + char *p = NULL; + int n_output_dev = 0; + char scp_cmd[]="scp"; opterr = 0; @@ -31,10 +54,14 @@ int main(int argc, char *argv[]) switch (c) { case 'I': - strcpy(input_path, optarg); + input_path = malloc(strlen(optarg)+1); + if(input_path != NULL) + strcpy(input_path, optarg); break; case 'O': - strcpy(output_dev, optarg); + output_dev = malloc(strlen(optarg)+1); + if(output_dev != NULL) + strcpy(output_dev, optarg); break; case '?': if ((optopt == 'I') || (optopt == 'O')) @@ -46,40 +73,77 @@ int main(int argc, char *argv[]) "Unknown option character `\\x%x'.\n", optopt); usage(argv[0]); - return 1; + free_ressource(); + return EINVAL; default: abort (); } + if((input_path == NULL) || (output_dev == NULL)) + { + free_ressource(); + exit(ENOMEM); + } + if (strlen(input_path) && strlen(output_dev)) { - //get the mounted devives list + /* get the mounted devives list */ aFile = setmntent("/proc/mounts", "r"); if (aFile == NULL) { perror("setmntent"); - exit(1); + free_ressource(); + exit(ENOENT); } - //now lets read the path of the device - while (NULL != (ent = getmntent(aFile))) { - if (strstr(ent->mnt_dir, output_dev)) { - sprintf(output_path, "%s", ent->mnt_dir); - device_found = 1; + 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; + + /* now lets read the path of the device */ + while ((NULL != (ent = getmntent(aFile))) && (!device_found)) { + for (i = 0; (i < (n_output_dev)) && (!device_found); ++i) { + if (strstr(ent->mnt_dir, list_output_dev[i])) { + output_path = malloc(strlen(ent->mnt_dir)+1); + if(output_path != NULL) { + sprintf(output_path, "%s", ent->mnt_dir); + } else { + free_ressource(); + exit(ENOMEM); + } + device_found = 1; + } } } - endmntent(aFile); - 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", output_dev); - ret = -1; + ret = ENODEV; } } else @@ -87,6 +151,6 @@ int main(int argc, char *argv[]) printf("Missing argument\n"); usage(argv[0]); } - + free_ressource(); return ret; } diff --git a/win/massStorageCopy.bat b/win/massStorageCopy.bat index 8325ff38..7a813423 100644 --- a/win/massStorageCopy.bat +++ b/win/massStorageCopy.bat @@ -1,9 +1,39 @@ -@ECHO off -SET SOURCE=%2 -SET SRC_PARSE=%SOURCE:/=\% -SET TARGET=%4 -setlocal enabledelayedexpansion -for /F "skip=1 tokens=*" %%a in ('WMIC LOGICALDISK where "volumename like '%TARGET%%%'" get deviceid') do if not defined id set id=%%a -Call Set "deviceid=%%id: =%%" -if not "%deviceid%" == "" (XCOPY %SRC_PARSE% %deviceid% /Y /Q >NUL -echo Upload complete ) else ( echo %TARGET% not found. Please ensure the device is correctly connected) +@ECHO off + +REM Exit codes for xcopy +REM code | Description +REM 0 | Files were copied without error. +REM 1 | No files were found to copy. +REM 2 | The user pressed CTRL+C to terminate xcopy. +REM 4 | Initialization error occurred. There is not enough memory or disk space, or you entered an invalid drive name or invalid syntax on the command line. +REM 5 | Disk write error occurred. + +SET SOURCE=%2 +SET SRC_PARSE=%SOURCE:/=\% +SET TARGET=%4 +SET TARGET=%TARGET:\=% + +call :parse %TARGET% +echo %TARGET% not found. Please ensure the device is correctly connected. +exit 7 + +:parse +set list=%1 +set list=%list:"=% + +for /f "tokens=1* delims=," %%a in ("%list%") DO ( + if not "%%a" == "" call :sub %%a + if not "%%b" == "" call :parse "%%b" +) +goto :eof + + +:sub +setlocal enabledelayedexpansion +for /F "skip=1 tokens=*" %%a in ('WMIC LOGICALDISK where "volumename like '%~1'" get deviceid 2^>NUL') do if not defined id set id=%%a + call Set "deviceid=%%id: =%%" + if not "%deviceid%" == "" ( + XCOPY %SRC_PARSE% %deviceid% /Y /Q + if !errorlevel! == 0 (echo Upload complete on %1 ^(%deviceid%^)) + exit !errorlevel!) +goto :eof