aboutsummaryrefslogtreecommitdiffstats
path: root/util.c
diff options
context:
space:
mode:
authorMattias Andrée <maandree@kth.se>2020-05-30 17:34:29 +0200
committerMattias Andrée <maandree@kth.se>2020-05-30 17:34:29 +0200
commit712f56fe3369c59d32b9000830b4ed7b25ed24b5 (patch)
tree27ddf931fd2d980d0c4dcdfb025f26f5380fb5d6 /util.c
parentPrint errno names and strings (diff)
downloadsctrace-712f56fe3369c59d32b9000830b4ed7b25ed24b5.tar.gz
sctrace-712f56fe3369c59d32b9000830b4ed7b25ed24b5.tar.bz2
sctrace-712f56fe3369c59d32b9000830b4ed7b25ed24b5.tar.xz
Add support for tracing fork children
Signed-off-by: Mattias Andrée <maandree@kth.se>
Diffstat (limited to 'util.c')
-rw-r--r--util.c56
1 files changed, 56 insertions, 0 deletions
diff --git a/util.c b/util.c
new file mode 100644
index 0000000..76a8a36
--- /dev/null
+++ b/util.c
@@ -0,0 +1,56 @@
+/* See LICENSE file for copyright and license details. */
+#include "common.h"
+
+
+static FILE *trace_fp;
+static char last_char = '\n';
+static pid_t last_pid = 0;
+
+
+void
+set_trace_output(FILE *fp)
+{
+ trace_fp = fp;
+}
+
+
+void
+tprintf(struct process *proc, const char *fmt, ...)
+{
+ va_list ap;
+ if (fmt[0] == '\n' && fmt[1]) {
+ last_pid = 0;
+ fmt = &fmt[1];
+ }
+ if (last_char == '\n')
+ fprintf(trace_fp, "[%ju] ", (uintmax_t)proc->pid);
+ else if (proc->pid != last_pid)
+ fprintf(trace_fp, "\n[%ju] ", (uintmax_t)proc->pid);
+ va_start(ap, fmt);
+ vfprintf(trace_fp, fmt, ap);
+ last_pid = proc->pid;
+ last_char = strchr(fmt, '\0')[-1];
+ va_end(ap);
+}
+
+
+_Noreturn void
+eprintf(const char *fmt, ...)
+{
+ va_list ap;
+ va_start(ap, fmt);
+ fprintf(stderr, "%s%s: ", last_char == '\n' ? "" : "\n", argv0);
+ vfprintf(stderr, fmt, ap);
+ switch (strchr(fmt, '\0')[-1]) {
+ case ':':
+ fprintf(stderr, " %s\n", strerror(errno));
+ break;
+ case '\n':
+ break;
+ default:
+ fprintf(stderr, "\n");
+ break;
+ }
+ va_end(ap);
+ exit(1);
+}