From da79a6a0e80b6591be92c0782f79625ad07cc683 Mon Sep 17 00:00:00 2001 From: Lephenixnoir Date: Tue, 30 Jan 2024 22:19:19 +0100 Subject: [PATCH] fxlink: add --folder option to fxlink -s to select output folder --- fxlink/fxlink.h | 3 ++- fxlink/main.c | 12 +++++++++--- fxlink/modes/interactive.c | 2 ++ fxlink/modes/udisks2.c | 12 ++++++++++-- 4 files changed, 23 insertions(+), 6 deletions(-) diff --git a/fxlink/fxlink.h b/fxlink/fxlink.h index 841df57..60afbed 100644 --- a/fxlink/fxlink.h +++ b/fxlink/fxlink.h @@ -28,7 +28,8 @@ int main_list(struct fxlink_filter *filter, delay_t *delay, int main_blocks(struct fxlink_filter *filter, delay_t *delay); /* Main function for -s */ -int main_send(struct fxlink_filter *filter, delay_t *delay, char **files); +int main_send(struct fxlink_filter *filter, delay_t *delay, char **files, + char *outfolder); /* Main function for -i */ int main_interactive(struct fxlink_filter *filter, delay_t *delay, diff --git a/fxlink/main.c b/fxlink/main.c index df78491..4a49f5d 100644 --- a/fxlink/main.c +++ b/fxlink/main.c @@ -20,7 +20,7 @@ static const char *help_string = "usage: %1$s (-l|-b|-t) [General options]\n" " %1$s -i [-r] [--fxlink-log[=]] [General options]\n" " %1$s -p [General options]\n" -" %1$s -s ... [General options]\n" +" %1$s -s ... [--folder=OUTFOLDER] [General options]\n" "\n" "fxlink interacts with CASIO calculators of the fx and fx-CG families over\n" "the USB port, using libusb. It can also transfer files for Mass Storage\n" @@ -47,6 +47,7 @@ static const char *help_string = " --fxlink-log[=FILE] -i: Append fxlink text messages to FILE. Without\n" " argument, a unique name is generated.\n" " -r, --repeat -i: Reconnect if the calc disconnects (implies -w)\n" +" --folder=FOLDER -s: Select destination folder for files\n" "\n" "Device filters:\n" " A device filter narrows down what devices we list or connect to by\n" @@ -67,6 +68,7 @@ int main(int argc, char **argv) delay_t delay = delay_seconds(0); struct fxlink_filter *filter = NULL; bool repeat = false; + char *outfolder = NULL; options.log_file = NULL; options.verbose = false; @@ -77,7 +79,7 @@ int main(int argc, char **argv) // Command-line argument parsing //--- - enum { LIBUSB_LOG=1, LOG_TO_FILE=2 }; + enum { LIBUSB_LOG=1, LOG_TO_FILE=2, OUT_FOLDER=3 }; const struct option longs[] = { { "help", no_argument, NULL, 'h' }, { "list", no_argument, NULL, 'l' }, @@ -90,6 +92,7 @@ int main(int argc, char **argv) { "fxlink-log", optional_argument, NULL, LOG_TO_FILE }, { "repeat", no_argument, NULL, 'r' }, { "verbose", no_argument, NULL, 'v' }, + { "folder", required_argument, NULL, OUT_FOLDER }, /* Deprecated options ignored for compatibility: */ { "quiet", no_argument, NULL, 'q' }, { "unmount", no_argument, NULL, 'u' }, @@ -165,6 +168,9 @@ int main(int argc, char **argv) case 'f': filter = fxlink_filter_parse(optarg); break; + case OUT_FOLDER: + outfolder = strdup(optarg); + break; case '?': error = 1; } @@ -219,7 +225,7 @@ int main(int argc, char **argv) } else if(mode == 's') { #ifndef FXLINK_DISABLE_UDISKS2 - rc = main_send(filter, &delay, argv + optind); + rc = main_send(filter, &delay, argv + optind, outfolder); #else rc = elog("this fxlink was built without UDisks2; -s is disabled"); #endif diff --git a/fxlink/modes/interactive.c b/fxlink/modes/interactive.c index 8b2a18f..3c23c7b 100644 --- a/fxlink/modes/interactive.c +++ b/fxlink/modes/interactive.c @@ -44,11 +44,13 @@ static void handle_new_message(struct fxlink_device *fdev, if(options.verbose) printf("------------------\n"); fwrite(str, 1, msg->size, stdout); +#if 0 if(str[msg->size - 1] != '\n') { if(!options.verbose) printf("\e[30;47m%%\e[0m"); printf("\n"); } +#endif if(options.verbose) { printf("------------------\n"); } diff --git a/fxlink/modes/udisks2.c b/fxlink/modes/udisks2.c index 1a2f44a..b56f005 100644 --- a/fxlink/modes/udisks2.c +++ b/fxlink/modes/udisks2.c @@ -16,7 +16,8 @@ #include #include -int main_send(struct fxlink_filter *filter, delay_t *delay, char **files) +int main_send(struct fxlink_filter *filter, delay_t *delay, char **files, + char *outfolder) { fxlink_filter_clean_udisks2(filter); GError *error = NULL; @@ -57,6 +58,10 @@ int main_send(struct fxlink_filter *filter, delay_t *delay, char **files) printf("Already mounted at %s.\n", folder); } + gchar *outpath = folder; + if(outfolder) + asprintf(&outpath, "%s/%s/", folder, outfolder); + /* Copy files with external cp(1) */ int file_count = 0; while(files[file_count]) file_count++; @@ -69,7 +74,7 @@ int main_send(struct fxlink_filter *filter, delay_t *delay, char **files) argv[0] = "cp"; for(int i = 0; files[i]; i++) argv[i+1] = files[i]; - argv[file_count+1] = folder; + argv[file_count+1] = outpath; argv[file_count+2] = NULL; /* Print command */ @@ -97,6 +102,9 @@ int main_send(struct fxlink_filter *filter, delay_t *delay, char **files) } } + if(outfolder) + free(outpath); + /* Unmount the filesystem and eject the device */ GVariant *args = g_variant_new("a{sv}", NULL); udisks_filesystem_call_unmount_sync(fs, args, NULL, &error);