From a242b5be0b486fb1137c45c87e2867aef2e1fcb3 Mon Sep 17 00:00:00 2001 From: Rob Landley Date: Wed, 30 Jan 2019 16:16:07 -0600 Subject: Command logging wrapper to help analyze what commands scripts call and how. --- toys/example/logwrapper.c | 76 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 76 insertions(+) create mode 100644 toys/example/logwrapper.c (limited to 'toys/example') diff --git a/toys/example/logwrapper.c b/toys/example/logwrapper.c new file mode 100644 index 00000000..0f87df24 --- /dev/null +++ b/toys/example/logwrapper.c @@ -0,0 +1,76 @@ +/* logwrapper.c - Record commands called out of $PATH to a log + * + * Copyright 2019 Rob Landley + * + * I made it up. Must be built standalone to work. (Is its own multiplexer.) + +USE_LOGWRAPPER(NEWTOY(logwrapper, 0, TOYFLAG_NOHELP|TOYFLAG_USR|TOYFLAG_BIN)) + +config LOGWRAPPER + bool "logwrapper" + default n + help + usage: logwrapper ... + + Append command line to $WRAPLOG, then call second instance + of command in $PATH. +*/ + +#define FOR_logwrapper +#include "toys.h" + +void logwrapper_main(void) +{ + char *log = getenv("WRAPLOG"), *omnom = basename(*toys.argv), + *s, *ss, *sss; + struct string_list *list; + int i, len; + + // Log the command line + if (!log) error_exit("no $WRAPLOG"); + len = strlen(omnom)+2; + for (i = 1; istr, s)) break; + free(llist_pop(&list)); + } + } + + // Skip first instance and try to run next one, until out of instances. + for (;;) { + if (list) free(llist_pop(&list)); + if (!list) error_exit("no %s after logwrapper in $PATH", omnom); + *toys.argv = list->str; + execve(list->str, toys.argv, environ); + } +} -- cgit v1.2.3