diff options
author | Serhei Makarov <serhei@serhei.io> | 2023-05-02 16:01:41 -0400 |
---|---|---|
committer | Serhei Makarov <serhei@serhei.io> | 2023-05-02 16:01:41 -0400 |
commit | d89cae6f39b8e91acdd3731c92897f20a0e0060b (patch) | |
tree | bc9375b086afb7d1fb632660a3e039389489069e | |
parent | ac387efd0a863043149a33b0c2b261ffb217a70e (diff) |
eu-stacktrace WIP: simple passthrough for sysprof
Works with the sysprof serhei/samples-via-fifo patchset [1].
Example usage:
- mkfifo /tmp/test.fifo
- eu-stacktrace --input=/tmp/test.fifo --output=test.syscap &
- sysprof-cli --use-fifo=/tmp/test.fifo test.syscap
[1]: https://git.sr.ht/~serhei/sysprof-experiments/log/serhei/samples-via-fifo
-rw-r--r-- | src/stacktrace.c | 57 |
1 files changed, 47 insertions, 10 deletions
diff --git a/src/stacktrace.c b/src/stacktrace.c index 485ddd7f..e09331f1 100644 --- a/src/stacktrace.c +++ b/src/stacktrace.c @@ -16,22 +16,29 @@ along with this program. If not, see <http://www.gnu.org/licenses/>. */ #include <config.h> +#include <assert.h> #include <argp.h> #include <stdio.h> #include <string.h> +#include <fcntl.h> #include <system.h> /* TODO: Make optional through configury. The #ifdefs are included - already so we don't miss any code that needs to be controlled with - this option. */ + now so we don't miss any code that needs to be controlled with this + option. */ #define HAVE_SYSPROF_4_HEADERS #ifdef HAVE_SYSPROF_4_HEADERS #include <sysprof-4/sysprof-capture-types.h> #endif static char *input_path = NULL; +static int input_fd = -1; static char *output_path = NULL; +static int output_fd = -1; + +static size_t passthru_buffer_len = 0; +static char *passthru_buffer = NULL; #define MODE_OPTS "none/passthru" #define MODE_NONE 0x0 @@ -45,10 +52,10 @@ static int processing_mode; #define FORMAT_SYSPROF 0x2 static int input_format; -/* Program exit codes. All samples processed without any errors is - GOOD. Some non-fatal errors during processing is an ERROR. A fatal - error or no samples processed at all is BAD. A command line USAGE - exit is generated by argp_error. */ +/* Program exit codes. All samples processed without any errors is + GOOD. Some non-fatal errors during processing is an ERROR. A + fatal error or no samples processed at all is BAD. A command line + USAGE exit is generated by argp_error. */ #define EXIT_OK 0 #define EXIT_ERROR 1 #define EXIT_BAD 2 @@ -152,11 +159,41 @@ Utility is a work-in-progress, see README.eu-stacktrace in the source branch.") argp_parse(&argp, argc, argv, 0, NULL, NULL); - /* hello world */ -#ifdef HAVE_SYSPROF_4_HEADERS - printf("hello sysprof: %x\n", SYSPROF_CAPTURE_MAGIC); -#else +#ifndef HAVE_SYSPROF_4_HEADERS /* TODO: Should hide corresponding command line options when this is the case. */ error (EXIT_BAD, 0, N_("Sysprof support is not available in this version.")); #endif + + /* TODO Also handle common expansions e.g. ~/foo instead of /home/user/foo. */ + /* TODO Also handle '-' path for stdin/stdout. */ + input_fd = open (input_path, O_RDONLY); + if (input_fd < 0) + error (EXIT_BAD, errno, N_("Cannot open input file or FIFO '%s'"), input_path); + output_fd = open (output_path, O_WRONLY); + if (output_fd < 0) + error (EXIT_BAD, errno, N_("Cannot open output file or FIFO '%s'"), output_path); + + /* TODO For now, just pipe data through with no packet separation. Just a quick 'cat' hack. */ + passthru_buffer_len = 8192; + passthru_buffer = (char *)malloc (passthru_buffer_len); + for (;;) + { + ssize_t n_read; + n_read = read (input_fd, passthru_buffer, passthru_buffer_len); + if (n_read < 0) + error (EXIT_BAD, errno, N_("Read error from file or FIFO '%s'"), input_path); + if (n_read == 0) + break; + if (n_read != write (output_fd, passthru_buffer, n_read)) + error (EXIT_BAD, errno, N_("Write error to file or FIFO '%s'"), output_path); + } + free (passthru_buffer); + /* TODO Also support mode none, which outputs nothing. */ + + if (input_fd != -1) + close (input_fd); + if (output_fd != -1) + close (output_fd); + + return EXIT_OK; } |