Commit
+56 -2 +/-2 browse
1 | diff --git a/Makefile b/Makefile |
2 | index 4ee1724..b3fbc92 100644 |
3 | --- a/Makefile |
4 | +++ b/Makefile |
5 | @@ -1,5 +1,8 @@ |
6 | - default: bin |
7 | - gcc main.c -o bin/main |
8 | + default: bin/qemu-shim |
9 | + |
10 | + .PHONY: bin/qemu-shim |
11 | + bin/qemu-shim: |
12 | + gcc main.c -o $@ |
13 | |
14 | bin: |
15 | mkdir -p bin |
16 | diff --git a/main.c b/main.c |
17 | index 3c552b0..3cc3d2f 100644 |
18 | --- a/main.c |
19 | +++ b/main.c |
20 | @@ -2,6 +2,10 @@ |
21 | #include <stdio.h> |
22 | #include <stdlib.h> |
23 | #include <string.h> |
24 | + #include <unistd.h> |
25 | + #include <errno.h> |
26 | + #include <signal.h> |
27 | + #include <sys/wait.h> |
28 | |
29 | #define _MONITOR_REGEXP "unix:\\([-/.[:alnum:]]*\\)" |
30 | #define _SPICE_REGEXP ".*addr=\\([-/.[:alnum:]]*\\)" |
31 | @@ -54,6 +58,42 @@ char *_get_arg_with_regexp(int argc, char *argv[], char *name, |
32 | return result; |
33 | } |
34 | |
35 | + FILE *run_qemu(int *pid) { |
36 | + pid_t child_pid; |
37 | + int fd[2]; |
38 | + pipe(fd); |
39 | + if ((child_pid = fork()) == -1) { |
40 | + fprintf(stderr, "failed to fork\n"); |
41 | + exit(1); |
42 | + } |
43 | + if (child_pid == 0) { |
44 | + close(fd[0]); |
45 | + dup2(fd[1], 1); |
46 | + |
47 | + setpgid(child_pid, child_pid); |
48 | + execl("/bin/sh", "/bin/sh", "-c", "for i in $(seq 1 10); do echo $i; sleep .5; done", |
49 | + NULL); |
50 | + exit(0); |
51 | + } else { |
52 | + close(fd[1]); |
53 | + } |
54 | + |
55 | + *pid = child_pid; |
56 | + return fdopen(fd[0], "r"); |
57 | + } |
58 | + |
59 | + int shutdown(FILE *fp, pid_t pid) { |
60 | + int stat; |
61 | + fclose(fp); |
62 | + while (waitpid(pid, &stat, 0) == -1) { |
63 | + if (errno != EINTR) { |
64 | + stat = -1; |
65 | + break; |
66 | + } |
67 | + } |
68 | + return stat; |
69 | + } |
70 | + |
71 | int main(int argc, char *argv[]) { |
72 | char *name; |
73 | name = _get_arg_by_name(argc, argv, "-name"); |
74 | @@ -75,6 +115,17 @@ int main(int argc, char *argv[]) { |
75 | if (spice_path != NULL) { |
76 | printf("SPICE: %s\n", spice_path); |
77 | } |
78 | + int pid; |
79 | + FILE *fp; |
80 | + fp = run_qemu(&pid); |
81 | + char output[100] = {0}; |
82 | + |
83 | + while (read(fileno(fp), output, sizeof(output)-1) != 0) { |
84 | + printf("%s", output); |
85 | + } |
86 | + |
87 | + shutdown(fp, pid); |
88 | + printf("..Done?\n"); |
89 | |
90 | /* CATCH SIGNAL TODO */ |
91 | /* POPEN TODO */ |