Slightly more compact handling of argv[]
text data bss dec hex filename
238274 672 20484 259430 3f566 strace.before
238226 672 20484 259382 3f536 strace
* strace.c (main): Slightly more compact handling of argv[]
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
diff --git a/strace.c b/strace.c
index 835003e..745294d 100644
--- a/strace.c
+++ b/strace.c
@@ -1119,6 +1119,8 @@
break;
}
}
+ argv += optind;
+ /* argc -= optind; - no need, argc is not used below */
acolumn_spaces = malloc(acolumn + 1);
if (!acolumn_spaces)
@@ -1126,7 +1128,8 @@
memset(acolumn_spaces, ' ', acolumn);
acolumn_spaces[acolumn] = '\0';
- if ((optind == argc) == !pflag_seen)
+ /* Must have PROG [ARGS], or -p PID. Not both. */
+ if (!argv[0] == !pflag_seen)
usage(stderr, 1);
if (pflag_seen && daemonized_tracer) {
@@ -1187,25 +1190,25 @@
die_out_of_memory();
setvbuf(outf, buf, _IOLBF, BUFSIZ);
}
- if (outfname && optind < argc) {
+ if (outfname && argv[0]) {
interactive = 0;
qflag = 1;
}
/* Valid states here:
- optind < argc pflag_seen outfname interactive
- 1 0 0 1
- 0 1 0 1
- 1 0 1 0
- 0 1 1 1
+ argv[0] pflag_seen outfname interactive
+ yes 0 0 1
+ no 1 0 1
+ yes 0 1 0
+ no 1 1 1
*/
/* STARTUP_CHILD must be called before the signal handlers get
installed below as they are inherited into the spawned process.
Also we do not need to be protected by them as during interruption
in the STARTUP_CHILD mode we kill the spawned process anyway. */
- if (!pflag_seen)
- startup_child(&argv[optind]);
+ if (argv[0])
+ startup_child(argv);
sigemptyset(&empty_set);
sigemptyset(&blocked_set);
@@ -1214,6 +1217,10 @@
sa.sa_flags = 0;
sigaction(SIGTTOU, &sa, NULL);
sigaction(SIGTTIN, &sa, NULL);
+ /* In interactive mode (if no -o OUTFILE, or -p PID is used),
+ * fatal signals are blocked across syscall waits, and acted on
+ * in between. In non-interactive mode, signals are ignored.
+ */
if (interactive) {
sigaddset(&blocked_set, SIGHUP);
sigaddset(&blocked_set, SIGINT);