1 1.10 riastrad /* $NetBSD: t_refuse_opt.c,v 1.10 2023/11/24 17:31:03 riastradh Exp $ */ 2 1.1 pho 3 1.1 pho /*- 4 1.2 pho * Copyright (c) 2016 The NetBSD Foundation, Inc. 5 1.1 pho * All rights reserved. 6 1.1 pho * 7 1.1 pho * Redistribution and use in source and binary forms, with or without 8 1.1 pho * modification, are permitted provided that the following conditions 9 1.1 pho * are met: 10 1.1 pho * 1. Redistributions of source code must retain the above copyright 11 1.1 pho * notice, this list of conditions and the following disclaimer. 12 1.1 pho * 2. Redistributions in binary form must reproduce the above copyright 13 1.1 pho * notice, this list of conditions and the following disclaimer in the 14 1.1 pho * documentation and/or other materials provided with the distribution. 15 1.1 pho * 16 1.1 pho * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS 17 1.1 pho * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED 18 1.1 pho * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 19 1.1 pho * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS 20 1.1 pho * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 21 1.1 pho * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 22 1.1 pho * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 23 1.1 pho * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 24 1.1 pho * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 25 1.1 pho * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 26 1.1 pho * POSSIBILITY OF SUCH DAMAGE. 27 1.1 pho */ 28 1.1 pho #include <sys/cdefs.h> 29 1.10 riastrad __RCSID("$NetBSD: t_refuse_opt.c,v 1.10 2023/11/24 17:31:03 riastradh Exp $"); 30 1.5 martin 31 1.7 christos #include <sys/types.h> 32 1.1 pho 33 1.1 pho #include <atf-c.h> 34 1.1 pho 35 1.9 pho #define FUSE_USE_VERSION FUSE_MAKE_VERSION(2, 6) 36 1.1 pho #include <fuse.h> 37 1.1 pho 38 1.8 christos #include "h_macros.h" 39 1.1 pho 40 1.4 pho ATF_TC(t_fuse_opt_add_arg); 41 1.4 pho ATF_TC_HEAD(t_fuse_opt_add_arg, tc) 42 1.1 pho { 43 1.1 pho atf_tc_set_md_var(tc, "descr", "Check that fuse_opt_add_arg(3) works"); 44 1.1 pho } 45 1.1 pho 46 1.4 pho ATF_TC_BODY(t_fuse_opt_add_arg, tc) 47 1.1 pho { 48 1.1 pho struct fuse_args args = FUSE_ARGS_INIT(0, NULL); 49 1.1 pho 50 1.10 riastrad RL(fuse_opt_add_arg(&args, "foo")); 51 1.10 riastrad RL(fuse_opt_add_arg(&args, "bar")); 52 1.1 pho 53 1.1 pho ATF_REQUIRE_EQ(args.argc, 2); 54 1.1 pho ATF_CHECK_STREQ(args.argv[0], "foo"); 55 1.1 pho ATF_CHECK_STREQ(args.argv[1], "bar"); 56 1.1 pho ATF_CHECK(args.allocated != 0); 57 1.1 pho } 58 1.1 pho 59 1.4 pho ATF_TC(t_fuse_opt_insert_arg); 60 1.4 pho ATF_TC_HEAD(t_fuse_opt_insert_arg, tc) 61 1.1 pho { 62 1.1 pho atf_tc_set_md_var(tc, "descr", "Check that fuse_opt_insert_arg(3) works"); 63 1.1 pho } 64 1.1 pho 65 1.4 pho ATF_TC_BODY(t_fuse_opt_insert_arg, tc) 66 1.1 pho { 67 1.1 pho struct fuse_args args = FUSE_ARGS_INIT(0, NULL); 68 1.1 pho 69 1.10 riastrad RL(fuse_opt_insert_arg(&args, 0, "foo")); 70 1.10 riastrad RL(fuse_opt_insert_arg(&args, 0, "bar")); 71 1.1 pho 72 1.1 pho ATF_REQUIRE_EQ(args.argc, 2); 73 1.1 pho ATF_CHECK_STREQ(args.argv[0], "bar"); 74 1.1 pho ATF_CHECK_STREQ(args.argv[1], "foo"); 75 1.1 pho ATF_CHECK(args.allocated != 0); 76 1.1 pho } 77 1.1 pho 78 1.4 pho ATF_TC(t_fuse_opt_add_opt); 79 1.4 pho ATF_TC_HEAD(t_fuse_opt_add_opt, tc) 80 1.1 pho { 81 1.1 pho atf_tc_set_md_var(tc, "descr", "Check that fuse_opt_add_opt(3) works"); 82 1.1 pho } 83 1.1 pho 84 1.4 pho ATF_TC_BODY(t_fuse_opt_add_opt, tc) 85 1.1 pho { 86 1.1 pho char* opt = NULL; 87 1.1 pho 88 1.10 riastrad RL(fuse_opt_add_opt(&opt, "fo\\o")); 89 1.2 pho ATF_CHECK_STREQ(opt, "fo\\o"); 90 1.2 pho 91 1.10 riastrad RL(fuse_opt_add_opt(&opt, "ba,r")); 92 1.2 pho ATF_CHECK_STREQ(opt, "fo\\o,ba,r"); 93 1.2 pho } 94 1.2 pho 95 1.4 pho ATF_TC(t_fuse_opt_add_opt_escaped); 96 1.4 pho ATF_TC_HEAD(t_fuse_opt_add_opt_escaped, tc) 97 1.2 pho { 98 1.2 pho atf_tc_set_md_var(tc, "descr", "Check that fuse_opt_add_opt_escaped(3) works"); 99 1.2 pho } 100 1.2 pho 101 1.4 pho ATF_TC_BODY(t_fuse_opt_add_opt_escaped, tc) 102 1.2 pho { 103 1.2 pho char* opt = NULL; 104 1.1 pho 105 1.10 riastrad RL(fuse_opt_add_opt_escaped(&opt, "fo\\o")); 106 1.2 pho ATF_CHECK_STREQ(opt, "fo\\\\o"); 107 1.1 pho 108 1.10 riastrad RL(fuse_opt_add_opt_escaped(&opt, "ba,r")); 109 1.2 pho ATF_CHECK_STREQ(opt, "fo\\\\o,ba\\,r"); 110 1.1 pho } 111 1.1 pho 112 1.4 pho ATF_TC(t_fuse_opt_match); 113 1.4 pho ATF_TC_HEAD(t_fuse_opt_match, tc) 114 1.3 pho { 115 1.3 pho atf_tc_set_md_var(tc, "descr", "Check that fuse_opt_match(3) works" 116 1.3 pho " for every form of templates"); 117 1.3 pho } 118 1.3 pho 119 1.4 pho ATF_TC_BODY(t_fuse_opt_match, tc) 120 1.3 pho { 121 1.3 pho struct fuse_opt o1[] = { FUSE_OPT_KEY("-x" , 0), FUSE_OPT_END }; 122 1.3 pho struct fuse_opt o2[] = { FUSE_OPT_KEY("foo" , 0), FUSE_OPT_END }; 123 1.3 pho struct fuse_opt o3[] = { FUSE_OPT_KEY("foo=" , 0), FUSE_OPT_END }; 124 1.3 pho struct fuse_opt o4[] = { FUSE_OPT_KEY("foo=%s", 0), FUSE_OPT_END }; 125 1.3 pho struct fuse_opt o5[] = { FUSE_OPT_KEY("-x " , 0), FUSE_OPT_END }; 126 1.3 pho struct fuse_opt o6[] = { FUSE_OPT_KEY("-x %s" , 0), FUSE_OPT_END }; 127 1.3 pho 128 1.3 pho ATF_CHECK(fuse_opt_match(o1, "-x") == 1); 129 1.3 pho ATF_CHECK(fuse_opt_match(o1, "x") == 0); 130 1.3 pho 131 1.3 pho ATF_CHECK(fuse_opt_match(o2, "foo") == 1); 132 1.3 pho ATF_CHECK(fuse_opt_match(o2, "-foo") == 0); 133 1.3 pho 134 1.3 pho ATF_CHECK(fuse_opt_match(o3, "foo=bar") == 1); 135 1.3 pho ATF_CHECK(fuse_opt_match(o3, "foo" ) == 0); 136 1.3 pho 137 1.3 pho ATF_CHECK(fuse_opt_match(o4, "foo=bar") == 1); 138 1.3 pho ATF_CHECK(fuse_opt_match(o4, "foo" ) == 0); 139 1.3 pho 140 1.3 pho ATF_CHECK(fuse_opt_match(o5, "-xbar" ) == 1); 141 1.3 pho ATF_CHECK(fuse_opt_match(o5, "-x" ) == 1); 142 1.3 pho ATF_CHECK(fuse_opt_match(o5, "-x=bar") == 1); 143 1.3 pho ATF_CHECK(fuse_opt_match(o5, "bar" ) == 0); 144 1.3 pho 145 1.3 pho ATF_CHECK(fuse_opt_match(o6, "-xbar" ) == 1); 146 1.3 pho ATF_CHECK(fuse_opt_match(o6, "-x" ) == 1); 147 1.3 pho ATF_CHECK(fuse_opt_match(o6, "-x=bar") == 1); 148 1.3 pho ATF_CHECK(fuse_opt_match(o6, "bar" ) == 0); 149 1.3 pho } 150 1.3 pho 151 1.6 pho struct foofs_config { 152 1.6 pho int number; 153 1.6 pho char *string; 154 1.6 pho char* nonopt; 155 1.6 pho }; 156 1.6 pho 157 1.6 pho #define FOOFS_OPT(t, p, v) { t, offsetof(struct foofs_config, p), v } 158 1.6 pho 159 1.6 pho static struct fuse_opt foofs_opts[] = { 160 1.6 pho FOOFS_OPT("number=%i" , number, 0), 161 1.6 pho FOOFS_OPT("-n %i" , number, 0), 162 1.6 pho FOOFS_OPT("string=%s" , string, 0), 163 1.6 pho FOOFS_OPT("number1" , number, 1), 164 1.6 pho FOOFS_OPT("number2" , number, 2), 165 1.6 pho FOOFS_OPT("--number=three", number, 3), 166 1.6 pho FOOFS_OPT("--number=four" , number, 4), 167 1.6 pho FUSE_OPT_END 168 1.6 pho }; 169 1.6 pho 170 1.6 pho static int foo_opt_proc(void *data, const char *arg, int key, struct fuse_args *outargs) { 171 1.6 pho struct foofs_config *config = data; 172 1.6 pho 173 1.6 pho if (key == FUSE_OPT_KEY_NONOPT && config->nonopt == NULL) { 174 1.6 pho config->nonopt = strdup(arg); 175 1.6 pho return 0; 176 1.6 pho } 177 1.6 pho else { 178 1.6 pho return 1; 179 1.6 pho } 180 1.6 pho } 181 1.6 pho 182 1.6 pho ATF_TC(t_fuse_opt_parse_null_args); 183 1.6 pho ATF_TC_HEAD(t_fuse_opt_parse_null_args, tc) 184 1.6 pho { 185 1.6 pho atf_tc_set_md_var(tc, "descr", "NULL args means an empty arguments vector"); 186 1.6 pho } 187 1.6 pho 188 1.6 pho ATF_TC_BODY(t_fuse_opt_parse_null_args, tc) 189 1.6 pho { 190 1.6 pho struct foofs_config config; 191 1.6 pho 192 1.6 pho memset(&config, 0, sizeof(config)); 193 1.6 pho ATF_CHECK(fuse_opt_parse(NULL, &config, NULL, NULL) == 0); 194 1.6 pho ATF_CHECK_EQ(config.number, 0); 195 1.6 pho ATF_CHECK_EQ(config.string, NULL); 196 1.6 pho ATF_CHECK_EQ(config.nonopt, NULL); 197 1.6 pho } 198 1.6 pho 199 1.6 pho ATF_TC(t_fuse_opt_parse_null_opts); 200 1.6 pho ATF_TC_HEAD(t_fuse_opt_parse_null_opts, tc) 201 1.6 pho { 202 1.6 pho atf_tc_set_md_var(tc, "descr", "NULL opts means an opts array which only has FUSE_OPT_END"); 203 1.6 pho } 204 1.6 pho 205 1.6 pho ATF_TC_BODY(t_fuse_opt_parse_null_opts, tc) 206 1.6 pho { 207 1.6 pho struct fuse_args args = FUSE_ARGS_INIT(0, NULL); 208 1.6 pho struct foofs_config config; 209 1.6 pho 210 1.10 riastrad RL(fuse_opt_add_arg(&args, "foofs")); 211 1.10 riastrad RL(fuse_opt_add_arg(&args, "-o")); 212 1.10 riastrad RL(fuse_opt_add_arg(&args, "number=1,string=foo")); 213 1.10 riastrad RL(fuse_opt_add_arg(&args, "bar")); 214 1.6 pho 215 1.6 pho memset(&config, 0, sizeof(config)); 216 1.6 pho ATF_CHECK(fuse_opt_parse(&args, &config, NULL, NULL) == 0); 217 1.6 pho ATF_CHECK_EQ(config.number, 0); 218 1.6 pho ATF_CHECK_EQ(config.string, NULL); 219 1.6 pho ATF_CHECK_EQ(config.nonopt, NULL); 220 1.6 pho ATF_CHECK_EQ(args.argc, 4); 221 1.6 pho ATF_CHECK_STREQ(args.argv[0], "foofs"); 222 1.6 pho ATF_CHECK_STREQ(args.argv[1], "-o"); 223 1.6 pho ATF_CHECK_STREQ(args.argv[2], "number=1,string=foo"); 224 1.6 pho ATF_CHECK_STREQ(args.argv[3], "bar"); 225 1.6 pho } 226 1.6 pho 227 1.6 pho ATF_TC(t_fuse_opt_parse_null_proc); 228 1.6 pho ATF_TC_HEAD(t_fuse_opt_parse_null_proc, tc) 229 1.6 pho { 230 1.6 pho atf_tc_set_md_var(tc, "descr", "NULL proc means a processor function always returning 1," 231 1.6 pho " i.e. keep the argument"); 232 1.6 pho } 233 1.6 pho 234 1.6 pho ATF_TC_BODY(t_fuse_opt_parse_null_proc, tc) 235 1.6 pho { 236 1.6 pho struct fuse_args args = FUSE_ARGS_INIT(0, NULL); 237 1.6 pho struct foofs_config config; 238 1.6 pho 239 1.10 riastrad RL(fuse_opt_add_arg(&args, "foofs")); 240 1.10 riastrad RL(fuse_opt_add_arg(&args, "-o")); 241 1.10 riastrad RL(fuse_opt_add_arg(&args, "number=1,string=foo")); 242 1.10 riastrad RL(fuse_opt_add_arg(&args, "bar")); 243 1.6 pho 244 1.6 pho memset(&config, 0, sizeof(config)); 245 1.6 pho ATF_CHECK(fuse_opt_parse(&args, &config, foofs_opts, NULL) == 0); 246 1.6 pho ATF_CHECK_EQ(config.number, 1); 247 1.6 pho ATF_CHECK_STREQ(config.string, "foo"); 248 1.6 pho ATF_CHECK_EQ(config.nonopt, NULL); 249 1.6 pho ATF_CHECK_EQ(args.argc, 2); 250 1.6 pho ATF_CHECK_STREQ(args.argv[0], "foofs"); 251 1.6 pho ATF_CHECK_STREQ(args.argv[1], "bar"); 252 1.6 pho } 253 1.6 pho 254 1.6 pho ATF_TC(t_fuse_opt_parse); 255 1.6 pho ATF_TC_HEAD(t_fuse_opt_parse, tc) 256 1.6 pho { 257 1.6 pho atf_tc_set_md_var(tc, "descr", "Check that fuse_opt_parse(3) fully works"); 258 1.6 pho } 259 1.6 pho 260 1.6 pho ATF_TC_BODY(t_fuse_opt_parse, tc) 261 1.6 pho { 262 1.6 pho struct fuse_args args = FUSE_ARGS_INIT(0, NULL); 263 1.6 pho struct foofs_config config; 264 1.6 pho 265 1.6 pho /* Standard form */ 266 1.6 pho fuse_opt_free_args(&args); 267 1.10 riastrad RL(fuse_opt_add_arg(&args, "foofs")); 268 1.10 riastrad RL(fuse_opt_add_arg(&args, "-o")); 269 1.10 riastrad RL(fuse_opt_add_arg(&args, "number=1,string=foo")); 270 1.10 riastrad RL(fuse_opt_add_arg(&args, "bar")); 271 1.6 pho 272 1.6 pho memset(&config, 0, sizeof(config)); 273 1.6 pho ATF_CHECK(fuse_opt_parse(&args, &config, foofs_opts, foo_opt_proc) == 0); 274 1.6 pho ATF_CHECK_EQ(config.number, 1); 275 1.6 pho ATF_CHECK_STREQ(config.string, "foo"); 276 1.6 pho ATF_CHECK_STREQ(config.nonopt, "bar"); 277 1.6 pho ATF_CHECK_EQ(args.argc, 1); 278 1.6 pho ATF_CHECK_STREQ(args.argv[0], "foofs"); 279 1.6 pho 280 1.6 pho /* Concatenated -o */ 281 1.6 pho fuse_opt_free_args(&args); 282 1.10 riastrad RL(fuse_opt_add_arg(&args, "foofs")); 283 1.10 riastrad RL(fuse_opt_add_arg(&args, "-onumber=1,unknown,string=foo")); 284 1.10 riastrad RL(fuse_opt_add_arg(&args, "bar")); 285 1.6 pho 286 1.6 pho memset(&config, 0, sizeof(config)); 287 1.6 pho ATF_CHECK(fuse_opt_parse(&args, &config, foofs_opts, foo_opt_proc) == 0); 288 1.6 pho ATF_CHECK_EQ(config.number, 1); 289 1.6 pho ATF_CHECK_STREQ(config.string, "foo"); 290 1.6 pho ATF_CHECK_STREQ(config.nonopt, "bar"); 291 1.6 pho ATF_CHECK_EQ(args.argc, 3); 292 1.6 pho ATF_CHECK_STREQ(args.argv[0], "foofs"); 293 1.6 pho ATF_CHECK_STREQ(args.argv[1], "-o"); 294 1.6 pho ATF_CHECK_STREQ(args.argv[2], "unknown"); 295 1.6 pho 296 1.6 pho /* Sparse -o */ 297 1.6 pho fuse_opt_free_args(&args); 298 1.10 riastrad RL(fuse_opt_add_arg(&args, "foofs")); 299 1.10 riastrad RL(fuse_opt_add_arg(&args, "bar")); 300 1.10 riastrad RL(fuse_opt_add_arg(&args, "baz")); 301 1.10 riastrad RL(fuse_opt_add_arg(&args, "-o")); 302 1.10 riastrad RL(fuse_opt_add_arg(&args, "number=1")); 303 1.10 riastrad RL(fuse_opt_add_arg(&args, "-o")); 304 1.10 riastrad RL(fuse_opt_add_arg(&args, "unknown")); 305 1.10 riastrad RL(fuse_opt_add_arg(&args, "-o")); 306 1.10 riastrad RL(fuse_opt_add_arg(&args, "string=foo")); 307 1.6 pho 308 1.6 pho memset(&config, 0, sizeof(config)); 309 1.6 pho ATF_CHECK(fuse_opt_parse(&args, &config, foofs_opts, foo_opt_proc) == 0); 310 1.6 pho ATF_CHECK_EQ(config.number, 1); 311 1.6 pho ATF_CHECK_STREQ(config.string, "foo"); 312 1.6 pho ATF_CHECK_STREQ(config.nonopt, "bar"); 313 1.6 pho ATF_CHECK_EQ(args.argc, 4); 314 1.6 pho ATF_CHECK_STREQ(args.argv[0], "foofs"); 315 1.6 pho ATF_CHECK_STREQ(args.argv[1], "-o"); 316 1.6 pho ATF_CHECK_STREQ(args.argv[2], "unknown"); 317 1.6 pho ATF_CHECK_STREQ(args.argv[3], "baz"); 318 1.6 pho 319 1.6 pho /* Separate -n %i */ 320 1.6 pho fuse_opt_free_args(&args); 321 1.10 riastrad RL(fuse_opt_add_arg(&args, "foofs")); 322 1.10 riastrad RL(fuse_opt_add_arg(&args, "-n")); 323 1.10 riastrad RL(fuse_opt_add_arg(&args, "3")); 324 1.6 pho 325 1.6 pho memset(&config, 0, sizeof(config)); 326 1.6 pho ATF_CHECK(fuse_opt_parse(&args, &config, foofs_opts, foo_opt_proc) == 0); 327 1.6 pho ATF_CHECK_EQ(config.number, 3); 328 1.6 pho ATF_CHECK_EQ(config.string, NULL); 329 1.6 pho ATF_CHECK_EQ(config.nonopt, NULL); 330 1.6 pho ATF_CHECK_EQ(args.argc, 1); 331 1.6 pho ATF_CHECK_STREQ(args.argv[0], "foofs"); 332 1.6 pho 333 1.6 pho /* Concatenated -n %i */ 334 1.6 pho fuse_opt_free_args(&args); 335 1.10 riastrad RL(fuse_opt_add_arg(&args, "foofs")); 336 1.10 riastrad RL(fuse_opt_add_arg(&args, "-n3")); 337 1.6 pho 338 1.6 pho memset(&config, 0, sizeof(config)); 339 1.6 pho ATF_CHECK(fuse_opt_parse(&args, &config, foofs_opts, foo_opt_proc) == 0); 340 1.6 pho ATF_CHECK_EQ(config.number, 3); 341 1.6 pho ATF_CHECK_EQ(config.string, NULL); 342 1.6 pho ATF_CHECK_EQ(config.nonopt, NULL); 343 1.6 pho ATF_CHECK_EQ(args.argc, 1); 344 1.6 pho ATF_CHECK_STREQ(args.argv[0], "foofs"); 345 1.6 pho 346 1.6 pho /* -o constant */ 347 1.6 pho fuse_opt_free_args(&args); 348 1.10 riastrad RL(fuse_opt_add_arg(&args, "foofs")); 349 1.10 riastrad RL(fuse_opt_add_arg(&args, "-o")); 350 1.10 riastrad RL(fuse_opt_add_arg(&args, "number2")); 351 1.6 pho 352 1.6 pho memset(&config, 0, sizeof(config)); 353 1.6 pho ATF_CHECK(fuse_opt_parse(&args, &config, foofs_opts, foo_opt_proc) == 0); 354 1.6 pho ATF_CHECK_EQ(config.number, 2); 355 1.6 pho ATF_CHECK_EQ(config.string, NULL); 356 1.6 pho ATF_CHECK_EQ(config.nonopt, NULL); 357 1.6 pho ATF_CHECK_EQ(args.argc, 1); 358 1.6 pho ATF_CHECK_STREQ(args.argv[0], "foofs"); 359 1.6 pho 360 1.6 pho /* -x constant */ 361 1.6 pho fuse_opt_free_args(&args); 362 1.10 riastrad RL(fuse_opt_add_arg(&args, "foofs")); 363 1.10 riastrad RL(fuse_opt_add_arg(&args, "--number=four")); 364 1.6 pho 365 1.6 pho memset(&config, 0, sizeof(config)); 366 1.6 pho ATF_CHECK(fuse_opt_parse(&args, &config, foofs_opts, foo_opt_proc) == 0); 367 1.6 pho ATF_CHECK_EQ(config.number, 4); 368 1.6 pho ATF_CHECK_EQ(config.string, NULL); 369 1.6 pho ATF_CHECK_EQ(config.nonopt, NULL); 370 1.6 pho ATF_CHECK_EQ(args.argc, 1); 371 1.6 pho ATF_CHECK_STREQ(args.argv[0], "foofs"); 372 1.6 pho 373 1.6 pho /* end-of-options "--" marker */ 374 1.6 pho fuse_opt_free_args(&args); 375 1.10 riastrad RL(fuse_opt_add_arg(&args, "foofs")); 376 1.10 riastrad RL(fuse_opt_add_arg(&args, "--")); 377 1.10 riastrad RL(fuse_opt_add_arg(&args, "-onumber=1")); 378 1.10 riastrad RL(fuse_opt_add_arg(&args, "-ostring=foo")); 379 1.6 pho 380 1.6 pho memset(&config, 0, sizeof(config)); 381 1.6 pho ATF_CHECK(fuse_opt_parse(&args, &config, foofs_opts, foo_opt_proc) == 0); 382 1.6 pho ATF_CHECK_EQ(config.number, 0); 383 1.6 pho ATF_CHECK_EQ(config.string, NULL); 384 1.6 pho ATF_CHECK_STREQ(config.nonopt, "-onumber=1"); 385 1.6 pho ATF_CHECK_EQ(args.argc, 3); 386 1.6 pho ATF_CHECK_STREQ(args.argv[0], "foofs"); 387 1.6 pho ATF_CHECK_STREQ(args.argv[1], "--"); 388 1.6 pho ATF_CHECK_STREQ(args.argv[2], "-ostring=foo"); 389 1.6 pho 390 1.6 pho /* The "--" marker at the last of outargs should be removed */ 391 1.6 pho fuse_opt_free_args(&args); 392 1.10 riastrad RL(fuse_opt_add_arg(&args, "foofs")); 393 1.10 riastrad RL(fuse_opt_add_arg(&args, "--")); 394 1.10 riastrad RL(fuse_opt_add_arg(&args, "-onumber=1")); 395 1.6 pho 396 1.6 pho memset(&config, 0, sizeof(config)); 397 1.6 pho ATF_CHECK(fuse_opt_parse(&args, &config, foofs_opts, foo_opt_proc) == 0); 398 1.6 pho ATF_CHECK_EQ(config.number, 0); 399 1.6 pho ATF_CHECK_EQ(config.string, NULL); 400 1.6 pho ATF_CHECK_STREQ(config.nonopt, "-onumber=1"); 401 1.6 pho ATF_CHECK_EQ(args.argc, 1); 402 1.6 pho ATF_CHECK_STREQ(args.argv[0], "foofs"); 403 1.6 pho } 404 1.6 pho 405 1.1 pho ATF_TP_ADD_TCS(tp) 406 1.1 pho { 407 1.4 pho ATF_TP_ADD_TC(tp, t_fuse_opt_add_arg); 408 1.4 pho ATF_TP_ADD_TC(tp, t_fuse_opt_insert_arg); 409 1.4 pho ATF_TP_ADD_TC(tp, t_fuse_opt_add_opt); 410 1.4 pho ATF_TP_ADD_TC(tp, t_fuse_opt_add_opt_escaped); 411 1.4 pho ATF_TP_ADD_TC(tp, t_fuse_opt_match); 412 1.6 pho ATF_TP_ADD_TC(tp, t_fuse_opt_parse_null_args); 413 1.6 pho ATF_TP_ADD_TC(tp, t_fuse_opt_parse_null_opts); 414 1.6 pho ATF_TP_ADD_TC(tp, t_fuse_opt_parse_null_proc); 415 1.6 pho ATF_TP_ADD_TC(tp, t_fuse_opt_parse); 416 1.1 pho 417 1.1 pho return atf_no_error(); 418 1.1 pho } 419