summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDominique Martinet <asmadeus@codewreck.org>2020-05-25 22:00:59 +0200
committerDominique Martinet <asmadeus@codewreck.org>2020-05-25 22:00:59 +0200
commitd7fd098975fe1ae6dc0d5365ef69c3a56806acaa (patch)
treebcddbbd3eecd28d5c725c954675323d6412398a0
parent99f63a608992e09cf49296c9a043f3b8cf258ba5 (diff)
fdgrab: move socket handling in a subfunction
-rw-r--r--fdgrab.c71
1 files changed, 40 insertions, 31 deletions
diff --git a/fdgrab.c b/fdgrab.c
index 8cdac44..86e3cbf 100644
--- a/fdgrab.c
+++ b/fdgrab.c
@@ -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);
}