| 1 |
#! /bin/sh /usr/share/dpatch/dpatch-run |
|---|
| 2 |
## 02_ifexists_else_endif.dpatch by CJ van den Berg <cj@vdbonline.com> |
|---|
| 3 |
## |
|---|
| 4 |
## All lines beginning with `## DP:' are a description of the patch. |
|---|
| 5 |
## DP: add support for .ifexists, .else and .endif meta commands |
|---|
| 6 |
|
|---|
| 7 |
@DPATCH@ |
|---|
| 8 |
|
|---|
| 9 |
diff -Nru pulseaudio-0.9.5-orig/src/pulsecore/cli-command.c pulseaudio-0.9.5/src/pulsecore/cli-command.c |
|---|
| 10 |
--- pulseaudio-0.9.5-orig/src/pulsecore/cli-command.c 2006-08-19 18:25:38.000000000 +0200 |
|---|
| 11 |
+++ pulseaudio-0.9.5/src/pulsecore/cli-command.c 2006-10-06 02:08:00.446876784 +0200 |
|---|
| 12 |
@@ -28,6 +28,7 @@ |
|---|
| 13 |
#include <assert.h> |
|---|
| 14 |
#include <stdlib.h> |
|---|
| 15 |
#include <errno.h> |
|---|
| 16 |
+#include <unistd.h> |
|---|
| 17 |
|
|---|
| 18 |
#include <pulse/xmalloc.h> |
|---|
| 19 |
|
|---|
| 20 |
@@ -63,6 +64,13 @@ |
|---|
| 21 |
#define INCLUDE_META ".include" |
|---|
| 22 |
#define FAIL_META ".fail" |
|---|
| 23 |
#define NOFAIL_META ".nofail" |
|---|
| 24 |
+#define IFEXISTS_META ".ifexists" |
|---|
| 25 |
+#define ELSE_META ".else" |
|---|
| 26 |
+#define ENDIF_META ".endif" |
|---|
| 27 |
+ |
|---|
| 28 |
+#define IFSTATE_NONE 0 |
|---|
| 29 |
+#define IFSTATE_TRUE 1 |
|---|
| 30 |
+#define IFSTATE_FALSE 2 |
|---|
| 31 |
|
|---|
| 32 |
/* Prototypes for all available commands */ |
|---|
| 33 |
static int pa_cli_command_exit(pa_core *c, pa_tokenizer *t, pa_strbuf *buf, int *fail); |
|---|
| 34 |
@@ -953,7 +961,7 @@ |
|---|
| 35 |
return 0; |
|---|
| 36 |
} |
|---|
| 37 |
|
|---|
| 38 |
-int pa_cli_command_execute_line(pa_core *c, const char *s, pa_strbuf *buf, int *fail) { |
|---|
| 39 |
+int pa_cli_command_execute_line_stateful(pa_core *c, const char *s, pa_strbuf *buf, int *fail, int *ifstate) { |
|---|
| 40 |
const char *cs; |
|---|
| 41 |
|
|---|
| 42 |
cs = s+strspn(s, whitespace); |
|---|
| 43 |
@@ -961,6 +969,25 @@ |
|---|
| 44 |
if (*cs == '#' || !*cs) |
|---|
| 45 |
return 0; |
|---|
| 46 |
else if (*cs == '.') { |
|---|
| 47 |
+ if (!strcmp(cs, ELSE_META)) { |
|---|
| 48 |
+ if (!ifstate || *ifstate == IFSTATE_NONE) { |
|---|
| 49 |
+ pa_strbuf_printf(buf, "Meta command %s is not valid in this context\n", cs); |
|---|
| 50 |
+ return -1; |
|---|
| 51 |
+ } else if (*ifstate == IFSTATE_TRUE) |
|---|
| 52 |
+ *ifstate = IFSTATE_FALSE; |
|---|
| 53 |
+ else |
|---|
| 54 |
+ *ifstate = IFSTATE_TRUE; |
|---|
| 55 |
+ return 0; |
|---|
| 56 |
+ } else if (!strcmp(cs, ENDIF_META)) { |
|---|
| 57 |
+ if (!ifstate || *ifstate == IFSTATE_NONE) { |
|---|
| 58 |
+ pa_strbuf_printf(buf, "Meta command %s is not valid in this context\n", cs); |
|---|
| 59 |
+ return -1; |
|---|
| 60 |
+ } else |
|---|
| 61 |
+ *ifstate = IFSTATE_NONE; |
|---|
| 62 |
+ return 0; |
|---|
| 63 |
+ } |
|---|
| 64 |
+ if (ifstate && *ifstate == IFSTATE_FALSE) |
|---|
| 65 |
+ return 0; |
|---|
| 66 |
if (!strcmp(cs, FAIL_META)) |
|---|
| 67 |
*fail = 1; |
|---|
| 68 |
else if (!strcmp(cs, NOFAIL_META)) |
|---|
| 69 |
@@ -974,6 +1001,21 @@ |
|---|
| 70 |
|
|---|
| 71 |
if (pa_cli_command_execute_file(c, filename, buf, fail) < 0) |
|---|
| 72 |
if (*fail) return -1; |
|---|
| 73 |
+ } else if (l == sizeof(IFEXISTS_META)-1 && !strncmp(cs, IFEXISTS_META, l)) { |
|---|
| 74 |
+ if (!ifstate) { |
|---|
| 75 |
+ pa_strbuf_printf(buf, "Meta command %s is not valid in this context\n", cs); |
|---|
| 76 |
+ return -1; |
|---|
| 77 |
+ } else if (*ifstate != IFSTATE_NONE) { |
|---|
| 78 |
+ pa_strbuf_printf(buf, "Nested %s commands not supported\n", cs); |
|---|
| 79 |
+ return -1; |
|---|
| 80 |
+ } else { |
|---|
| 81 |
+ const char *filename = cs+l+strspn(cs+l, whitespace); |
|---|
| 82 |
+ |
|---|
| 83 |
+ if (access(filename, F_OK) == 0) |
|---|
| 84 |
+ *ifstate = IFSTATE_TRUE; |
|---|
| 85 |
+ else |
|---|
| 86 |
+ *ifstate = IFSTATE_FALSE; |
|---|
| 87 |
+ } |
|---|
| 88 |
} else { |
|---|
| 89 |
pa_strbuf_printf(buf, "Invalid meta command: %s\n", cs); |
|---|
| 90 |
if (*fail) return -1; |
|---|
| 91 |
@@ -984,6 +1026,9 @@ |
|---|
| 92 |
int unknown = 1; |
|---|
| 93 |
size_t l; |
|---|
| 94 |
|
|---|
| 95 |
+ if (ifstate && *ifstate == IFSTATE_FALSE) |
|---|
| 96 |
+ return 0; |
|---|
| 97 |
+ |
|---|
| 98 |
l = strcspn(cs, whitespace); |
|---|
| 99 |
|
|---|
| 100 |
for (command = commands; command->name; command++) |
|---|
| 101 |
@@ -1011,9 +1056,14 @@ |
|---|
| 102 |
return 0; |
|---|
| 103 |
} |
|---|
| 104 |
|
|---|
| 105 |
+int pa_cli_command_execute_line(pa_core *c, const char *s, pa_strbuf *buf, int *fail) { |
|---|
| 106 |
+ return pa_cli_command_execute_line_stateful(c, s, buf, fail, NULL); |
|---|
| 107 |
+} |
|---|
| 108 |
+ |
|---|
| 109 |
int pa_cli_command_execute_file(pa_core *c, const char *fn, pa_strbuf *buf, int *fail) { |
|---|
| 110 |
char line[256]; |
|---|
| 111 |
FILE *f = NULL; |
|---|
| 112 |
+ int ifstate = IFSTATE_NONE; |
|---|
| 113 |
int ret = -1; |
|---|
| 114 |
assert(c && fn && buf); |
|---|
| 115 |
|
|---|
| 116 |
@@ -1028,7 +1078,7 @@ |
|---|
| 117 |
char *e = line + strcspn(line, linebreak); |
|---|
| 118 |
*e = 0; |
|---|
| 119 |
|
|---|
| 120 |
- if (pa_cli_command_execute_line(c, line, buf, fail) < 0 && *fail) |
|---|
| 121 |
+ if (pa_cli_command_execute_line_stateful(c, line, buf, fail, &ifstate) < 0 && *fail) |
|---|
| 122 |
goto fail; |
|---|
| 123 |
} |
|---|
| 124 |
|
|---|