Add extension exec scaffolding
This commit is contained in:
parent
0e157084ea
commit
4618e66f55
6
include/exec.h
Normal file
6
include/exec.h
Normal file
@ -0,0 +1,6 @@
|
||||
#ifndef EXEC_H
|
||||
#define exec_h
|
||||
#include "types.h"
|
||||
|
||||
struct line runextension(struct line *data, char *filename, size_t n);
|
||||
#endif
|
73
src/lib/exec.c
Normal file
73
src/lib/exec.c
Normal file
@ -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;
|
||||
}
|
@ -1,11 +1,13 @@
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <unistd.h>
|
||||
|
||||
#include "arg.h"
|
||||
#include "exec.h"
|
||||
#include "file.h"
|
||||
#include "process.h"
|
||||
#include "types.h"
|
||||
#include "util.h"
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <unistd.h>
|
||||
|
||||
#define INVERT_T "\x1b[7m"
|
||||
#define UINVERT_T "\x1b[27m"
|
||||
@ -89,6 +91,7 @@ void run(FILE *fp, char *filename, bool tty) {
|
||||
free(padding);
|
||||
}
|
||||
|
||||
f.lines[i] = runextension(&f.lines[i], filename, i + 1);
|
||||
fwrite(f.lines[i].buf, 1, f.lines[i].len, st);
|
||||
fprintf(st, "\n");
|
||||
linecount++;
|
||||
|
Loading…
Reference in New Issue
Block a user