diff options
author | Dominique Martinet <asmadeus@codewreck.org> | 2020-05-25 22:00:59 +0200 |
---|---|---|
committer | Dominique Martinet <asmadeus@codewreck.org> | 2020-05-25 22:00:59 +0200 |
commit | d7fd098975fe1ae6dc0d5365ef69c3a56806acaa (patch) | |
tree | bcddbbd3eecd28d5c725c954675323d6412398a0 | |
parent | 99f63a608992e09cf49296c9a043f3b8cf258ba5 (diff) |
fdgrab: move socket handling in a subfunction
-rw-r--r-- | fdgrab.c | 71 |
1 files changed, 40 insertions, 31 deletions
@@ -83,33 +83,11 @@ static void replace_str(const char *orig, char **arg, char *pattern, char *repla } } -int main(int argc, char *argv[]) { - int fd, rc, i, firstarg; - struct arguments arguments = { 0 }; - char **child_argv; - - argp_parse(&argp, argc, argv, ARGP_NO_HELP|ARGP_IN_ORDER, - &firstarg, &arguments); - - if (firstarg == argc) { - // no argument = spawn a shell - child_argv = calloc(2, sizeof(char*)); - if (!child_argv) - return logerr(-errno, "malloc"); - child_argv[0] = getenv("SHELL"); - if (!child_argv[0]) - child_argv[0] = "sh"; - } else { - child_argv = calloc(argc - firstarg + 1, sizeof(char*)); - if (!child_argv) - return logerr(-errno, "malloc"); - for (i = firstarg; i < argc; i++) { - child_argv[i - firstarg] = argv[i]; - } - } +static int handle_socket(struct arguments *arguments, int argc, + char *orig_argv[], char *argv[]) { + int fd, rc, i; - - fd = sock_open(arguments.sun_path, true); + fd = sock_open(arguments->sun_path, true); if (fd < 0) return fd; @@ -127,7 +105,7 @@ int main(int argc, char *argv[]) { (void)close(fd); return rc; } - if (arguments.verbose) + if (arguments->verbose) printf("Got %s on fd %d\n", pattern+1, fd); /* earlier -2 should guarantee this */ @@ -136,20 +114,51 @@ int main(int argc, char *argv[]) { pattern[len] = '}'; pattern[len+1] = 0; rc = snprintf(replace, sizeof(replace), "%d", rc); - + /* XXX fix replace_str and remove check */ if (strlen(replace) > strlen(pattern)) return logerr(-ENOTSUP, "fd %s is longer than replacement pattern %s, make bigger pattern for now", replace, pattern); - for (i = 0; i < argc - firstarg; i++) { - replace_str(argv[i+firstarg], child_argv + i, - pattern, replace); + for (i = 0; i < argc; i++) { + replace_str(orig_argv[i], argv + i, pattern, replace); } } (void)close(fd); + return 0; +} + +int main(int argc, char *argv[]) { + int rc, i, firstarg; + struct arguments arguments = { 0 }; + char **child_argv; + + argp_parse(&argp, argc, argv, ARGP_NO_HELP|ARGP_IN_ORDER, + &firstarg, &arguments); + + if (firstarg == argc) { + // no argument = spawn a shell + child_argv = calloc(2, sizeof(char*)); + if (!child_argv) + return logerr(-errno, "malloc"); + child_argv[0] = getenv("SHELL"); + if (!child_argv[0]) + child_argv[0] = "sh"; + } else { + child_argv = calloc(argc - firstarg + 1, sizeof(char*)); + if (!child_argv) + return logerr(-errno, "malloc"); + for (i = firstarg; i < argc; i++) { + child_argv[i - firstarg] = argv[i]; + } + } + + rc = handle_socket(&arguments, argc - firstarg, + argv + firstarg, child_argv); + if (rc < 0) + return rc; return execvp(child_argv[0], child_argv); } |