Lines 30-42
Link Here
|
30 |
} |
30 |
} |
31 |
} |
31 |
} |
32 |
|
32 |
|
33 |
static void unknown_arg(void *str, const char *err, ...) |
33 |
typedef struct { |
|
|
34 |
apr_getopt_t *opt; |
35 |
char *formatted; |
36 |
char *param; |
37 |
int errcode; /* Actually an apr_getopt_error_e, but declared |
38 |
int so that it can contain an OOB value. */ |
39 |
} error_data_t; |
40 |
|
41 |
static void unknown_arg(void *arg, const char *err, ...) |
34 |
{ |
42 |
{ |
|
|
43 |
error_data_t *ed = arg; |
35 |
va_list va; |
44 |
va_list va; |
36 |
|
45 |
|
37 |
va_start(va, err); |
46 |
va_start(va, err); |
38 |
apr_vsnprintf(str, 8196, err, va); |
47 |
apr_vsnprintf(ed->formatted, 8196, err, va); |
39 |
va_end(va); |
48 |
va_end(va); |
|
|
49 |
|
50 |
ed->errcode = apr_getopt_errcode(ed->opt); |
51 |
strncpy(ed->param, apr_getopt_errparam(ed->opt), 128); |
40 |
} |
52 |
} |
41 |
|
53 |
|
42 |
static void no_options_found(abts_case *tc, void *data) |
54 |
static void no_options_found(abts_case *tc, void *data) |
Lines 78-90
Link Here
|
78 |
char ch; |
90 |
char ch; |
79 |
const char *opt_arg; |
91 |
const char *opt_arg; |
80 |
char str[8196]; |
92 |
char str[8196]; |
|
|
93 |
char par[128]; |
94 |
error_data_t ed; |
81 |
|
95 |
|
82 |
str[0] = '\0'; |
96 |
str[0] = '\0'; |
|
|
97 |
par[0] = '\0'; |
83 |
rv = apr_getopt_init(&opt, p, largc, largv); |
98 |
rv = apr_getopt_init(&opt, p, largc, largv); |
84 |
ABTS_INT_EQUAL(tc, APR_SUCCESS, rv); |
99 |
ABTS_INT_EQUAL(tc, APR_SUCCESS, rv); |
85 |
|
100 |
|
|
|
101 |
ed.opt = opt; |
102 |
ed.formatted = str; |
103 |
ed.param = par; |
104 |
ed.errcode = -1; |
105 |
|
86 |
opt->errfn = unknown_arg; |
106 |
opt->errfn = unknown_arg; |
87 |
opt->errarg = str; |
107 |
opt->errarg = &ed; |
88 |
|
108 |
|
89 |
while (apr_getopt(opt, "efgh", &ch, &opt_arg) == APR_SUCCESS) { |
109 |
while (apr_getopt(opt, "efgh", &ch, &opt_arg) == APR_SUCCESS) { |
90 |
switch (ch) { |
110 |
switch (ch) { |
Lines 98-104
Link Here
|
98 |
break; |
118 |
break; |
99 |
} |
119 |
} |
100 |
} |
120 |
} |
101 |
ABTS_STR_EQUAL(tc, "testprog: illegal option -- a\n", str); |
121 |
ABTS_STR_EQUAL(tc, "testprog: illegal option: a\n", str); |
|
|
122 |
ABTS_STR_EQUAL(tc, "a", par); |
123 |
ABTS_INT_EQUAL(tc, APR_GETOPT_INVALID_OPTION, ed.errcode); |
102 |
} |
124 |
} |
103 |
|
125 |
|
104 |
static void required_option(abts_case *tc, void *data) |
126 |
static void required_option(abts_case *tc, void *data) |
Lines 110-122
Link Here
|
110 |
char ch; |
132 |
char ch; |
111 |
const char *opt_arg; |
133 |
const char *opt_arg; |
112 |
char str[8196]; |
134 |
char str[8196]; |
|
|
135 |
error_data_t ed; |
113 |
|
136 |
|
114 |
str[0] = '\0'; |
137 |
str[0] = '\0'; |
115 |
rv = apr_getopt_init(&opt, p, largc, largv); |
138 |
rv = apr_getopt_init(&opt, p, largc, largv); |
116 |
ABTS_INT_EQUAL(tc, APR_SUCCESS, rv); |
139 |
ABTS_INT_EQUAL(tc, APR_SUCCESS, rv); |
117 |
|
140 |
|
|
|
141 |
ed.opt = opt; |
142 |
ed.formatted = str; |
143 |
ed.param = NULL; |
144 |
ed.errcode = -1; |
145 |
|
118 |
opt->errfn = unknown_arg; |
146 |
opt->errfn = unknown_arg; |
119 |
opt->errarg = str; |
147 |
opt->errarg = &ed; |
120 |
|
148 |
|
121 |
while (apr_getopt(opt, "a:", &ch, &opt_arg) == APR_SUCCESS) { |
149 |
while (apr_getopt(opt, "a:", &ch, &opt_arg) == APR_SUCCESS) { |
122 |
switch (ch) { |
150 |
switch (ch) { |
Lines 128-133
Link Here
|
128 |
} |
156 |
} |
129 |
} |
157 |
} |
130 |
ABTS_STR_EQUAL(tc, "option: a with foo\n", str); |
158 |
ABTS_STR_EQUAL(tc, "option: a with foo\n", str); |
|
|
159 |
ABTS_INT_EQUAL(tc, -1, ed.errcode); |
131 |
} |
160 |
} |
132 |
|
161 |
|
133 |
static void required_option_notgiven(abts_case *tc, void *data) |
162 |
static void required_option_notgiven(abts_case *tc, void *data) |
Lines 139-151
Link Here
|
139 |
char ch; |
168 |
char ch; |
140 |
const char *opt_arg; |
169 |
const char *opt_arg; |
141 |
char str[8196]; |
170 |
char str[8196]; |
|
|
171 |
char par[128]; |
172 |
error_data_t ed; |
142 |
|
173 |
|
143 |
str[0] = '\0'; |
174 |
str[0] = '\0'; |
|
|
175 |
par[0] = '\0'; |
144 |
rv = apr_getopt_init(&opt, p, largc, largv); |
176 |
rv = apr_getopt_init(&opt, p, largc, largv); |
145 |
ABTS_INT_EQUAL(tc, APR_SUCCESS, rv); |
177 |
ABTS_INT_EQUAL(tc, APR_SUCCESS, rv); |
146 |
|
178 |
|
|
|
179 |
ed.opt = opt; |
180 |
ed.formatted = str; |
181 |
ed.param = par; |
182 |
ed.errcode = -1; |
183 |
|
147 |
opt->errfn = unknown_arg; |
184 |
opt->errfn = unknown_arg; |
148 |
opt->errarg = str; |
185 |
opt->errarg = &ed; |
149 |
|
186 |
|
150 |
while (apr_getopt(opt, "a:", &ch, &opt_arg) == APR_SUCCESS) { |
187 |
while (apr_getopt(opt, "a:", &ch, &opt_arg) == APR_SUCCESS) { |
151 |
switch (ch) { |
188 |
switch (ch) { |
Lines 156-162
Link Here
|
156 |
break; |
193 |
break; |
157 |
} |
194 |
} |
158 |
} |
195 |
} |
159 |
ABTS_STR_EQUAL(tc, "testprog: option requires an argument -- a\n", str); |
196 |
ABTS_STR_EQUAL(tc, "testprog: option requires an argument: a\n", str); |
|
|
197 |
ABTS_STR_EQUAL(tc, "a", par); |
198 |
ABTS_INT_EQUAL(tc, APR_GETOPT_MISSING_ARGUMENT, ed.errcode); |
160 |
} |
199 |
} |
161 |
|
200 |
|
162 |
static void optional_option(abts_case *tc, void *data) |
201 |
static void optional_option(abts_case *tc, void *data) |
Lines 168-180
Link Here
|
168 |
char ch; |
207 |
char ch; |
169 |
const char *opt_arg; |
208 |
const char *opt_arg; |
170 |
char str[8196]; |
209 |
char str[8196]; |
|
|
210 |
error_data_t ed; |
171 |
|
211 |
|
172 |
str[0] = '\0'; |
212 |
str[0] = '\0'; |
173 |
rv = apr_getopt_init(&opt, p, largc, largv); |
213 |
rv = apr_getopt_init(&opt, p, largc, largv); |
174 |
ABTS_INT_EQUAL(tc, APR_SUCCESS, rv); |
214 |
ABTS_INT_EQUAL(tc, APR_SUCCESS, rv); |
175 |
|
215 |
|
|
|
216 |
ed.opt = opt; |
217 |
ed.formatted = str; |
218 |
ed.param = NULL; |
219 |
ed.errcode = -1; |
220 |
|
176 |
opt->errfn = unknown_arg; |
221 |
opt->errfn = unknown_arg; |
177 |
opt->errarg = str; |
222 |
opt->errarg = &ed; |
178 |
|
223 |
|
179 |
while (apr_getopt(opt, "a::", &ch, &opt_arg) == APR_SUCCESS) { |
224 |
while (apr_getopt(opt, "a::", &ch, &opt_arg) == APR_SUCCESS) { |
180 |
switch (ch) { |
225 |
switch (ch) { |
Lines 186-191
Link Here
|
186 |
} |
231 |
} |
187 |
} |
232 |
} |
188 |
ABTS_STR_EQUAL(tc, "option: a with foo\n", str); |
233 |
ABTS_STR_EQUAL(tc, "option: a with foo\n", str); |
|
|
234 |
ABTS_INT_EQUAL(tc, -1, ed.errcode); |
189 |
} |
235 |
} |
190 |
|
236 |
|
191 |
static void optional_option_notgiven(abts_case *tc, void *data) |
237 |
static void optional_option_notgiven(abts_case *tc, void *data) |
Lines 197-209
Link Here
|
197 |
char ch; |
243 |
char ch; |
198 |
const char *opt_arg; |
244 |
const char *opt_arg; |
199 |
char str[8196]; |
245 |
char str[8196]; |
|
|
246 |
char par[128]; |
247 |
error_data_t ed; |
200 |
|
248 |
|
201 |
str[0] = '\0'; |
249 |
str[0] = '\0'; |
|
|
250 |
par[0] = '\0'; |
202 |
rv = apr_getopt_init(&opt, p, largc, largv); |
251 |
rv = apr_getopt_init(&opt, p, largc, largv); |
203 |
ABTS_INT_EQUAL(tc, APR_SUCCESS, rv); |
252 |
ABTS_INT_EQUAL(tc, APR_SUCCESS, rv); |
204 |
|
253 |
|
|
|
254 |
ed.opt = opt; |
255 |
ed.formatted = str; |
256 |
ed.param = par; |
257 |
ed.errcode = -1; |
258 |
|
205 |
opt->errfn = unknown_arg; |
259 |
opt->errfn = unknown_arg; |
206 |
opt->errarg = str; |
260 |
opt->errarg = &ed; |
207 |
|
261 |
|
208 |
while (apr_getopt(opt, "a::", &ch, &opt_arg) == APR_SUCCESS) { |
262 |
while (apr_getopt(opt, "a::", &ch, &opt_arg) == APR_SUCCESS) { |
209 |
switch (ch) { |
263 |
switch (ch) { |
Lines 218-224
Link Here
|
218 |
/* Our version of getopt doesn't allow for optional arguments. */ |
272 |
/* Our version of getopt doesn't allow for optional arguments. */ |
219 |
ABTS_STR_EQUAL(tc, "option: a\n", str); |
273 |
ABTS_STR_EQUAL(tc, "option: a\n", str); |
220 |
#endif |
274 |
#endif |
221 |
ABTS_STR_EQUAL(tc, "testprog: option requires an argument -- a\n", str); |
275 |
ABTS_STR_EQUAL(tc, "testprog: option requires an argument: a\n", str); |
|
|
276 |
ABTS_STR_EQUAL(tc, "a", par); |
277 |
ABTS_INT_EQUAL(tc, APR_GETOPT_MISSING_ARGUMENT, ed.errcode); |
222 |
} |
278 |
} |
223 |
|
279 |
|
224 |
abts_suite *testgetopt(abts_suite *suite) |
280 |
abts_suite *testgetopt(abts_suite *suite) |