diff options
author | Shav Kinderlehrer <[email protected]> | 2023-05-03 09:22:02 -0400 |
---|---|---|
committer | Shav Kinderlehrer <[email protected]> | 2023-05-03 09:22:02 -0400 |
commit | 4618e66f550e7e6b8410fba771345dd4730329f1 (patch) | |
tree | c9120bbb63dbf4ac3bf03316092021d026255641 /src/lib | |
parent | 0e157084ea2f576cb1786c6c9064056e28be57c4 (diff) | |
download | lat-4618e66f550e7e6b8410fba771345dd4730329f1.tar.gz lat-4618e66f550e7e6b8410fba771345dd4730329f1.zip |
Add extension exec scaffolding
Diffstat (limited to 'src/lib')
-rw-r--r-- | src/lib/exec.c | 73 |
1 files changed, 73 insertions, 0 deletions
diff --git a/src/lib/exec.c b/src/lib/exec.c new file mode 100644 index 0000000..eb0aebc --- /dev/null +++ b/src/lib/exec.c @@ -0,0 +1,73 @@ +#include <signal.h> +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <unistd.h> + +#include "arg.h" +#include "types.h" +#include "util.h" + +struct line runextension(struct line *data, char *filename, size_t n) { + struct line line; + + int in[2]; + int out[2]; + if (pipe(out) == -1 || pipe(in) == -1) + die("pipe"); + + pid_t pid = fork(); + if (pid == -1) + die("fork"); + + if (pid == 0) { + // child + dup2(out[1], STDOUT_FILENO); + close(out[0]); + close(out[1]); + + dup2(in[1], STDIN_FILENO); + close(in[0]); + close(in[1]); + + char *eargv[4]; + eargv[0] = conf.extension; + eargv[1] = filename; + eargv[2] = malloc((intlen(n) + 1) * sizeof(char)); + if (eargv[2] == NULL) + die("malloc"); + sprintf(eargv[2], "%zu", n); + eargv[3] = NULL; + + if (execvp(conf.extension, eargv) == -1) + die("exec"); + } else { + // parent + close(out[1]); + close(in[1]); + + write(in[0], "test\0", 4); + + char *buf = malloc(256); + memset(buf, '\0', 256); + + size_t len = read(out[0], buf, 256); + + line.buf = buf; + line.len = len; + + int status; + waitpid(pid, &status, 0); + + if (WEXITSTATUS(status) != EXIT_SUCCESS) { + die("exec fail"); + } + } + + close(out[0]); + close(out[1]); + close(in[0]); + close(in[1]); + + return line; +} |