Commit
+108 -0 +/-3 browse
1 | diff --git a/.gitignore b/.gitignore |
2 | index 4b0ab6f..44bc5a2 100644 |
3 | --- a/.gitignore |
4 | +++ b/.gitignore |
5 | @@ -1,3 +1,5 @@ |
6 | pkg |
7 | src |
8 | + bin |
9 | + .ccls-cache |
10 | *.tar.zst |
11 | diff --git a/Makefile b/Makefile |
12 | new file mode 100644 |
13 | index 0000000..4ee1724 |
14 | --- /dev/null |
15 | +++ b/Makefile |
16 | @@ -0,0 +1,5 @@ |
17 | + default: bin |
18 | + gcc main.c -o bin/main |
19 | + |
20 | + bin: |
21 | + mkdir -p bin |
22 | diff --git a/main.c b/main.c |
23 | new file mode 100644 |
24 | index 0000000..3c552b0 |
25 | --- /dev/null |
26 | +++ b/main.c |
27 | @@ -0,0 +1,101 @@ |
28 | + #include <regex.h> |
29 | + #include <stdio.h> |
30 | + #include <stdlib.h> |
31 | + #include <string.h> |
32 | + |
33 | + #define _MONITOR_REGEXP "unix:\\([-/.[:alnum:]]*\\)" |
34 | + #define _SPICE_REGEXP ".*addr=\\([-/.[:alnum:]]*\\)" |
35 | + |
36 | + char *_get_arg_by_name(int argc, char *argv[], char *name) { |
37 | + char *res; |
38 | + int i; |
39 | + for (i = 0; i < argc; i++) { |
40 | + if (strcmp(argv[i], name) == 0 && (i < argc)) { |
41 | + res = malloc(strlen(argv[i + 1])); |
42 | + strcpy(res, argv[i + 1]); |
43 | + return res; |
44 | + } |
45 | + } |
46 | + return NULL; |
47 | + }; |
48 | + |
49 | + char *_get_arg_with_regexp(int argc, char *argv[], char *name, |
50 | + char *expression) { |
51 | + char *arg_raw; |
52 | + arg_raw = _get_arg_by_name(argc, argv, name); |
53 | + if (arg_raw == NULL) { |
54 | + return NULL; |
55 | + } |
56 | + |
57 | + regex_t regex; |
58 | + regmatch_t groups[2]; |
59 | + |
60 | + if (regcomp(®ex, expression, 0) != 0) { |
61 | + fprintf(stderr, "regexp failed to compile\n"); |
62 | + exit(1); |
63 | + } |
64 | + |
65 | + char *result = malloc(strlen(arg_raw) + 1); |
66 | + |
67 | + if (regexec(®ex, arg_raw, 2, groups, 0) == 0) { |
68 | + if (groups[1].rm_so == (size_t)-1) { |
69 | + fprintf(stderr, "cannot match against -montor flag:'%s'\n", arg_raw); |
70 | + exit(1); |
71 | + } |
72 | + strcpy(result, arg_raw); |
73 | + result[groups[1].rm_eo] = 0; |
74 | + result = result + groups[1].rm_so; |
75 | + } else { |
76 | + fprintf(stderr, "cannot match against -montor flag:'%s'\n", arg_raw); |
77 | + exit(1); |
78 | + } |
79 | + |
80 | + regfree(®ex); |
81 | + return result; |
82 | + } |
83 | + |
84 | + int main(int argc, char *argv[]) { |
85 | + char *name; |
86 | + name = _get_arg_by_name(argc, argv, "-name"); |
87 | + int result; |
88 | + if (name == NULL) { |
89 | + printf("-name flag was not specified\n"); |
90 | + return EXIT_FAILURE; |
91 | + } |
92 | + printf("NAME: %s\n", name); |
93 | + char *monitor_path; |
94 | + monitor_path = _get_arg_with_regexp(argc, argv, "-monitor", _MONITOR_REGEXP); |
95 | + if (monitor_path == NULL) { |
96 | + printf("-monitor flag was not specified"); |
97 | + return EXIT_FAILURE; |
98 | + } |
99 | + printf("MONITOR: %s\n", monitor_path); |
100 | + char *spice_path; |
101 | + spice_path = _get_arg_with_regexp(argc, argv, "-spice", _SPICE_REGEXP); |
102 | + if (spice_path != NULL) { |
103 | + printf("SPICE: %s\n", spice_path); |
104 | + } |
105 | + |
106 | + /* CATCH SIGNAL TODO */ |
107 | + /* POPEN TODO */ |
108 | + |
109 | + /* |
110 | + FILE *fp; |
111 | + int status; |
112 | + char buf[128]; |
113 | + fp = popen("ls", "r"); |
114 | + if (fp == NULL) { |
115 | + puts("failed to open process"); |
116 | + return EXIT_FAILURE; |
117 | + } |
118 | + while (fgets(buf, 128, fp) != NULL) { |
119 | + printf("%s", buf); |
120 | + } |
121 | + status = pclose(fp); |
122 | + if (status != 0) { |
123 | + printf("non-zero exit code"); |
124 | + return status; |
125 | + } |
126 | + return EXIT_SUCCESS; |
127 | + */ |
128 | + } |