diff --git a/Makefile b/Makefile index 9ecaf55..3600234 100755 --- a/Makefile +++ b/Makefile @@ -185,7 +185,7 @@ define make-installbinary-rule uninstall-$1 uninstall-$1.exe: $(CHECKCFG) uninstall-doc-$1 $(call rmsg,Uninstalling $1) - $(call qcmd,$(RM) "$(IBINDIR)/$1"{,.exe}) + $(call qcmd,$(RM) "$(IBINDIR)/$1" "$(IBINDIR)/$1.exe") endef $(foreach bin,$(BINARIES),\ $(eval $(call make-installbinary-rule,$(bin)))) diff --git a/src/p7/args.c b/src/p7/args.c index 156fc0f..d51dc6e 100644 --- a/src/p7/args.c +++ b/src/p7/args.c @@ -65,6 +65,11 @@ static const char help_main[] = " --no-exit Does not terminate connection when action is completed.\n" " --no-init Does not initialize connection (should only be used\n" " when --no-exit was used last time p7 was called).\n" +" --use Use the following serial settings (when used with `--com`).\n" +" For example, \"9600N2\" represents 9600 bauds, no parity,\n" +" and two stop bits. (E for even parity, O for odd parity)\n" +" --set Set the following serial settings (when used with `--com`).\n" +" The string has the same format than for `--use`.\n" "\n" "Type \"" QUOTE(BIN) " --help\" for some help about the subcommand.\n" "Report bugs to " QUOTE(MAINTAINER) "."; @@ -171,6 +176,52 @@ FOOT; return (0); \ } +/** + * make_settings: + * Make settings from a string. + * + * @arg fmt the format string. + * @arg settings the settings to set. + * @return if there was an error (0 if ok). + */ + +static int make_settings(const char *argname, + const char *fmt, p7_streamsettings_t *settings) +{ + /* extract data from the string */ + unsigned int speed; char par; int stop; + if (sscanf(fmt, "%u%c%d", &speed, &par, &stop) < 3 + || (par != 'N' && par != 'E' && par != 'O') + || (stop != 1 && stop != 2)) { + log("%s: invalid format, expected , e.g. " + "9600N2 or 115200O1!\n", argname); + return (1); + } + + /* get the speed */ + switch (speed) { + case 9600: speed = P7_B9600; break; + case 19200: speed = P7_B19200; break; + case 38400: speed = P7_B38400; break; + case 57600: speed = P7_B57600; break; + case 115200: speed = P7_B115200; break; + default: + log("%s: %u is not a valid speed!\n", argname, speed); + return (1); + } + + /* set the settings */ + p7_initcomm(settings); + settings->speed = speed; + settings->flags &= ~(P7_TWOSTOPBITS | P7_PARMASK); + settings->flags |= --stop ? P7_TWOSTOPBITS : P7_ONESTOPBIT; + settings->flags |= par == 'N' ? P7_PARDIS : + par == 'E' ? P7_PARENB | P7_PAREVEN : P7_PARENB | P7_PARODD; + + /* no error! */ + return (0); +} + /** * parse_args: * Args parsing main function. @@ -200,18 +251,22 @@ int parse_args(int ac, char **av, args_t *args) /* define options */ char short_options[] = "hvfo:d:t:#"; struct option long_options[] = { - {"help", no_argument, NULL, 'h'}, - {"version", no_argument, NULL, 'v'}, - {"com", required_argument, NULL, 'c'}, - {"storage", required_argument, NULL, 's'}, - {"force", no_argument, NULL, 'f'}, - {"output", required_argument, NULL, 'o'}, + {"help", no_argument, NULL, 'h'}, + {"version", no_argument, NULL, 'v'}, + {"com", required_argument, NULL, 'c'}, + {"storage", required_argument, NULL, 's'}, + {"force", no_argument, NULL, 'f'}, + {"output", required_argument, NULL, 'o'}, {"directory", required_argument, NULL, 'd'}, - {"to", required_argument, NULL, 't'}, - {"no-init", no_argument, NULL, 'i'}, - {"no-start", no_argument, NULL, 'i'}, - {"no-exit", no_argument, NULL, 'e'}, - {"no-term", no_argument, NULL, 'e'}, + {"to", required_argument, NULL, 't'}, + {"no-init", no_argument, NULL, 'i'}, + {"no-start", no_argument, NULL, 'i'}, + {"no-exit", no_argument, NULL, 'e'}, + {"no-term", no_argument, NULL, 'e'}, + {"set", required_argument, NULL, 'S'}, + {"use", required_argument, NULL, 'U'}, + + /* sentinel */ {NULL, 0, NULL, 0} }; @@ -219,6 +274,7 @@ int parse_args(int ac, char **av, args_t *args) int c; opterr = 0; int help = 0; const char *s_out = NULL, *s_dir = NULL, *s_todir = NULL; + const char *s_use = NULL, *s_set = NULL; while ((c = getopt_long(ac, av, short_options, long_options, NULL)) != -1) { switch (c) { /* help */ @@ -246,6 +302,10 @@ int parse_args(int ac, char **av, args_t *args) /* force no exit */ case 'e': args->initflags &= ~P7_TERM; break; + /* use and set settings */ + case 'U': s_use = optarg; break; + case 'S': s_set = optarg; break; + /* in case of error */ case '?': if (optopt == 'o') @@ -349,6 +409,18 @@ int parse_args(int ac, char **av, args_t *args) noerror = 1; if (!noerror) return (0); + /* serial settings */ + if (s_set) { + if (args->com) args->set = &args->_set; + if (make_settings("--set", s_set, &args->_set)) + return (0); + } + if (s_use) { + if (args->com) args->use = &args->_use; + if (make_settings("--use", s_use, &args->_use)) + return (0); + } + /* check local path */ if (args->localpath) { if (fpmode[0] == 'w' && !strcmp(args->localpath, "-")) diff --git a/src/p7/main.c b/src/p7/main.c index 9eb669b..9ed697e 100644 --- a/src/p7/main.c +++ b/src/p7/main.c @@ -194,7 +194,8 @@ int main(int ac, char **av) /* Initialize libp7 and communication */ p7_handle_t *handle = NULL; int err; - if (args.com) err = p7_cominit(&handle, args.initflags, args.com, NULL); + if (args.com) err = p7_cominit(&handle, args.initflags, + args.com, args.use); else err = p7_init(&handle, args.initflags); if (err) { /* display error */ @@ -214,6 +215,12 @@ int main(int ac, char **av) return (1); } + /* Change speed, and things */ + if (args.set) { + err = p7_setlink(handle, args.set); + if (err) goto fail; + } + /* Check according to menu */ switch (args.menu) { case mn_send: @@ -270,41 +277,47 @@ int main(int ac, char **av) } /* put error */ - if (err && err != p7_error_denied_overwrite) { - if (sendfile_display_initialized) - puts("\b\b\b\b\b\bError !"); - - /* close the file */ - if (args.local) fclose(args.local); - if (args.menu == mn_get && args.local != stdout) - remove(args.localpath); - - /* put the error string */ - switch (err) { - case p7_error_fullmem: log(error_nospace); break; - case p7_error_empty: log(error_empty); break; - case p7_error_notfound: log(error_noexists); break; - case p7_error_nocalc: log(error_disconnected); break; - case p7_error_unsupported: log(error_unsupported); break; - case p7_error_unsupported_device: - log(error_unsupported_device, args.storage); break; - default: log(error_unplanned, p7_strerror(err)); - } - - /* that doesn't mean you shouldn't exit, heh. */ - p7_exit(handle); - - /* return that an error has occured */ - return (1); - } + if (err && err != p7_error_denied_overwrite) + goto fail; if (sendfile_display_initialized) puts("\b\b\b\b\b\bTransfer complete."); - if (args.local) fclose(args.local); + if (args.local && args.local != stdout) fclose(args.local); /* terminate communication and de-initialize libp7 */ - p7_exit(handle); + p7_exit(handle); handle = NULL; /* Then we're good */ return (0); +fail: + if (sendfile_display_initialized) + puts("\b\b\b\b\b\bError !"); + + /* close the file */ + if (args.local && args.local != stdout) fclose(args.local); + if (args.menu == mn_get && args.local != stdout) + remove(args.localpath); + + /* put the error string */ + switch (err) { + case p7_error_fullmem: + log(error_nospace); break; + case p7_error_empty: + log(error_empty); break; + case p7_error_notfound: + log(error_noexists); break; + case p7_error_nocalc: + log(error_disconnected); break; + case p7_error_unsupported: + log(error_unsupported); break; + case p7_error_unsupported_device: + log(error_unsupported_device, args.storage); break; + default: log(error_unplanned, p7_strerror(err)); + } + + /* that doesn't mean you shouldn't exit, heh. */ + p7_exit(handle); handle = NULL; + + /* then go away */ + return (1); } diff --git a/src/p7/main.h b/src/p7/main.h index 786ed42..fb39ec6 100644 --- a/src/p7/main.h +++ b/src/p7/main.h @@ -33,8 +33,12 @@ typedef enum { /* Arguments */ typedef struct { /* basic things */ - menu_t menu; - int nicedisp; + menu_t menu; int nicedisp; + + /* libp7 settings */ + unsigned int initflags; + p7_streamsettings_t *use, _use; + p7_streamsettings_t *set, _set; /* for file transferring menus */ const char *dirname, *filename; @@ -43,9 +47,7 @@ typedef struct { int force; /* other options */ - unsigned int initflags; - const char *com; - const char *storage; + const char *com, *storage; } args_t; /* Parsing function */