diff options
-rw-r--r-- | pw.c | 37 |
1 files changed, 23 insertions, 14 deletions
@@ -880,6 +880,26 @@ static execode execute(pwstate *pw, const char *cmd, char *resbuf, return res; } +static execode batchexe(pwstate *pw, const char *cmd, char *resbuf, size_t size) +{ + size_t ndigits = strspn(cmd, "0123456789"); + int count = 0; + + if (ndigits > 3) { + snprintf(resbuf, size, "command count out of 0-999 range"); + return exec_failed; + } else if (ndigits) { + (void) sscanf(cmd, "%3d", &count); + cmd += ndigits; + } + switch (cmd[0]) { + case ':': case '?': case '/': + return execute(pw, cmd, resbuf, size, count); + } + snprintf(resbuf, size, "missing command prefix [:/?]"); + return exec_failed; +} + static void ttyset(int fd, struct termios *tty) { if (tcsetattr(fd, TCSANOW, tty) < 0) @@ -1097,21 +1117,10 @@ int main(int argc, char **argv) break; case 'e': { - size_t ndigits = strspn(optarg, "0123456789"); - int count = 0; - const char *cmd = optarg; - - if (ndigits > 3) { - error("-%c option %s: command count out of 0-999 range\n", - opt, optarg); - break; - } else if (ndigits) { - (void) sscanf(cmd, "%3d", &count); - cmd += ndigits; + if (batchexe(&pw, optarg, pw.cmdbuf, cmdsize) == exec_failed) { + error("-%c option: %s: %s\n", opt, optarg, pw.cmdbuf); + return EXIT_FAILURE; } - - if (execute(&pw, cmd, pw.cmdbuf, cmdsize, count) == exec_failed) { - error("-%c option %s: %s\n", opt, optarg, pw.cmdbuf); return EXIT_FAILURE; } } |