Merge pull request #8 from stm32duino/issue_6

MassStorageCopy updated to manage several node names.
This commit is contained in:
Frederic Pillon 2017-06-20 09:33:29 +02:00 committed by GitHub
commit 5e8c6764d6
7 changed files with 248 additions and 73 deletions

Binary file not shown.

Binary file not shown.

Binary file not shown.

View file

@ -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)

View file

@ -4,13 +4,39 @@
#include <stdlib.h>
#include <mntent.h>
#include <unistd.h>
#include <errno.h>
#include <ctype.h>
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 <filepath>] [-O <mountpoint> ]\n\n", name);
printf("Usage: %s [-I <filepath>] [-O <mountpoint(s)> ]\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 +44,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 +55,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 +74,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 devices 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",
printf("%s not found. Please ensure the device is correctly connected\n",
output_dev);
ret = -1;
ret = ENODEV;
}
}
else
@ -87,6 +152,6 @@ int main(int argc, char *argv[])
printf("Missing argument\n");
usage(argv[0]);
}
free_ressource();
return ret;
}

View file

@ -3,67 +3,156 @@
#include <string.h>
#include <stdlib.h>
#include <sys/mount.h>
#include <getopt.h>
#include <ctype.h>
#include <errno.h>
#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 <filepath>] [-O <mountpoint(s)> ]\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;
}

View file

@ -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