diff options
-rw-r--r-- | lib/extra_opts.c | 83 | ||||
-rw-r--r-- | lib/extra_opts.h | 10 | ||||
-rw-r--r-- | lib/tests/test_opts.c | 68 |
3 files changed, 75 insertions, 86 deletions
diff --git a/lib/extra_opts.c b/lib/extra_opts.c index 3a0ce045..2aeb77ac 100644 --- a/lib/extra_opts.c +++ b/lib/extra_opts.c | |||
@@ -44,23 +44,18 @@ is_option (char *str) | |||
44 | } | 44 | } |
45 | 45 | ||
46 | /* this is the externally visible function used by plugins */ | 46 | /* this is the externally visible function used by plugins */ |
47 | /* Shouldn't se modify directly **argv (passed as a char ***) and argc | 47 | char **np_extra_opts(int *argc, char **argv, const char *plugin_name){ |
48 | * (as int *) ? | 48 | np_arg_list *extra_args=NULL, *ea1=NULL, *ea_tmp=NULL; |
49 | */ | ||
50 | char **np_extra_opts(int argc, char **argv, const char *plugin_name, int *argc_new){ | ||
51 | np_arg_list *extra_args=NULL, *ea_tmp1=NULL, *ea_tmp2=NULL; | ||
52 | char **argv_new=NULL; | 49 | char **argv_new=NULL; |
53 | char *argptr=NULL; | 50 | char *argptr=NULL; |
54 | int i, j, optfound, ea_num=argc; | 51 | int i, j, optfound, argc_new, ea_num=*argc; |
55 | 52 | ||
56 | if(argc<2) { | 53 | if(*argc<2) { |
57 | /* No arguments provided */ | 54 | /* No arguments provided */ |
58 | *argc_new=argc; | 55 | return argv; |
59 | argv_new=argv; | ||
60 | return argv_new; | ||
61 | } | 56 | } |
62 | 57 | ||
63 | for(i=1; i<argc; i++){ | 58 | for(i=1; i<*argc; i++){ |
64 | argptr=NULL; | 59 | argptr=NULL; |
65 | optfound=0; | 60 | optfound=0; |
66 | 61 | ||
@@ -69,86 +64,76 @@ char **np_extra_opts(int argc, char **argv, const char *plugin_name, int *argc_n | |||
69 | /* It is a single argument with value */ | 64 | /* It is a single argument with value */ |
70 | argptr=argv[i]+13; | 65 | argptr=argv[i]+13; |
71 | /* Delete the extra opts argument */ | 66 | /* Delete the extra opts argument */ |
72 | for(j=i;j<argc;j++) argv[j]=argv[j+1]; | 67 | for(j=i;j<*argc;j++) argv[j]=argv[j+1]; |
73 | i--; | 68 | i--; |
74 | argc--; | 69 | *argc--; |
75 | }else if(strcmp(argv[i], "--extra-opts")==0){ | 70 | }else if(strcmp(argv[i], "--extra-opts")==0){ |
76 | if(!is_option(argv[i+1])){ | 71 | if(!is_option(argv[i+1])){ |
77 | /* It is a argument with separate value */ | 72 | /* It is a argument with separate value */ |
78 | argptr=argv[i+1]; | 73 | argptr=argv[i+1]; |
79 | /* Delete the extra-opts argument/value */ | 74 | /* Delete the extra-opts argument/value */ |
80 | for(j=i;j<argc-1;j++) argv[j]=argv[j+2]; | 75 | for(j=i;j<*argc-1;j++) argv[j]=argv[j+2]; |
81 | i-=2; | 76 | i-=2; |
82 | argc-=2; | 77 | *argc-=2; |
83 | ea_num--; | 78 | ea_num--; |
84 | }else{ | 79 | }else{ |
85 | /* It has no value */ | 80 | /* It has no value */ |
86 | optfound=1; | 81 | optfound=1; |
87 | /* Delete the extra opts argument */ | 82 | /* Delete the extra opts argument */ |
88 | for(j=i;j<argc;j++) argv[j]=argv[j+1]; | 83 | for(j=i;j<*argc;j++) argv[j]=argv[j+1]; |
89 | i--; | 84 | i--; |
90 | argc--; | 85 | *argc--; |
91 | } | 86 | } |
92 | } | 87 | } |
93 | 88 | ||
89 | /* If we found extra-opts, expand them and store them for later*/ | ||
94 | if(argptr||optfound){ | 90 | if(argptr||optfound){ |
95 | /* Process ini section, returning a linked list of arguments */ | 91 | /* Process ini section, returning a linked list of arguments */ |
96 | ea_tmp1=np_get_defaults(argptr, plugin_name); | 92 | ea1=np_get_defaults(argptr, plugin_name); |
97 | if(ea_tmp1==NULL) { | 93 | if(ea1==NULL) { |
98 | /* no extra args? */ | 94 | /* no extra args (empty section)? */ |
99 | ea_num--; | 95 | ea_num--; |
100 | continue; | 96 | continue; |
101 | } | 97 | } |
102 | 98 | ||
103 | /* append the list to extra_args */ | 99 | /* append the list to extra_args */ |
104 | if(extra_args==NULL){ | 100 | if(extra_args==NULL){ |
105 | extra_args=ea_tmp2=ea_tmp1; | 101 | extra_args=ea1; |
106 | while(ea_tmp2->next) { | 102 | while(ea1=ea1->next) ea_num++; |
107 | ea_tmp2=ea_tmp2->next; | ||
108 | ea_num++; | ||
109 | } | ||
110 | }else{ | 103 | }else{ |
111 | ea_tmp2=extra_args; | 104 | ea_tmp=extra_args; |
112 | while(ea_tmp2->next) { | 105 | while(ea_tmp=ea_tmp->next) ea_num++; |
113 | ea_tmp2=ea_tmp2->next; | 106 | ea_tmp->next=ea1; |
114 | ea_num++; | ||
115 | } | ||
116 | ea_tmp2->next=ea_tmp1; | ||
117 | } | 107 | } |
118 | ea_tmp1=ea_tmp2=NULL; | 108 | ea1=ea_tmp=NULL; |
119 | } | 109 | } |
120 | /* lather, rince, repeat */ | 110 | /* lather, rince, repeat */ |
121 | } | 111 | } |
122 | 112 | ||
123 | if(ea_num==argc && extra_args==NULL){ | 113 | if(ea_num==*argc && extra_args==NULL){ |
124 | /* No extra-opts */ | 114 | /* No extra-opts */ |
125 | *argc_new=argc; | 115 | return argv; |
126 | argv_new=argv; | ||
127 | return argv_new; | ||
128 | } | 116 | } |
129 | 117 | ||
130 | /* done processing arguments. now create a new argc/argv set... */ | 118 | /* done processing arguments. now create a new argv array... */ |
131 | argv_new=(char**)malloc((ea_num+1)*sizeof(char**)); | 119 | argv_new=(char**)malloc((ea_num+1)*sizeof(char**)); |
132 | if(argv_new==NULL) die(STATE_UNKNOWN, _("malloc() failed!\n")); | 120 | if(argv_new==NULL) die(STATE_UNKNOWN, _("malloc() failed!\n")); |
133 | 121 | ||
134 | /* starting with program name (Should we strdup or just use the poiter?) */ | 122 | /* starting with program name */ |
135 | argv_new[0]=strdup(argv[0]); | 123 | argv_new[0]=strdup(argv[0]); |
136 | *argc_new=1; | 124 | argc_new=1; |
137 | /* then parsed ini opts (frying them up in the same run) */ | 125 | /* then parsed ini opts (frying them up in the same run) */ |
138 | while(extra_args){ | 126 | while(extra_args){ |
139 | argv_new[*argc_new]=strdup(extra_args->arg); | 127 | argv_new[argc_new++]=extra_args->arg; |
140 | *argc_new+=1; | 128 | ea1=extra_args; |
141 | ea_tmp1=extra_args; | ||
142 | extra_args=extra_args->next; | 129 | extra_args=extra_args->next; |
143 | free(ea_tmp1); | 130 | free(ea1); |
144 | } | ||
145 | /* finally the rest of the argv array (Should we strdup or just use the poiter?) */ | ||
146 | for (i=1; i<argc; i++){ | ||
147 | argv_new[*argc_new]=strdup(argv[i]); | ||
148 | *argc_new+=1; | ||
149 | } | 131 | } |
132 | /* finally the rest of the argv array */ | ||
133 | for (i=1; i<*argc; i++) argv_new[argc_new++]=strdup(argv[i]); | ||
134 | *argc=argc_new; | ||
150 | /* and terminate. */ | 135 | /* and terminate. */ |
151 | argv_new[*argc_new]=NULL; | 136 | argv_new[argc_new]=NULL; |
152 | 137 | ||
153 | return argv_new; | 138 | return argv_new; |
154 | } | 139 | } |
diff --git a/lib/extra_opts.h b/lib/extra_opts.h index 5f89d2b2..25bfc6db 100644 --- a/lib/extra_opts.h +++ b/lib/extra_opts.h | |||
@@ -7,9 +7,13 @@ | |||
7 | */ | 7 | */ |
8 | 8 | ||
9 | /* np_extra_opts: Process the --extra-opts arguments and create a new argument | 9 | /* np_extra_opts: Process the --extra-opts arguments and create a new argument |
10 | * array load the default configuration (if present) for | 10 | * array with ini-processed and argument-passed arguments together. The |
11 | * a plugin from the ini file | 11 | * ini-procesed arguments always come first (in the ord of --extra-opts |
12 | * arguments). If no --extra-opts arguments are provided or returned nothing | ||
13 | * it returns **argv otherwise the new array is returned. --extra-opts are | ||
14 | * always removed from **argv and the new array and all its elements can be | ||
15 | * freed with free(); | ||
12 | */ | 16 | */ |
13 | char **np_extra_opts(int argc, char **argv, const char *plugin_name, int *argc_new); | 17 | char **np_extra_opts(int *argc, char **argv, const char *plugin_name); |
14 | 18 | ||
15 | #endif /* _EXTRA_OPTS_H_ */ | 19 | #endif /* _EXTRA_OPTS_H_ */ |
diff --git a/lib/tests/test_opts.c b/lib/tests/test_opts.c index 769a2df2..7c173f30 100644 --- a/lib/tests/test_opts.c +++ b/lib/tests/test_opts.c | |||
@@ -57,7 +57,7 @@ int | |||
57 | main (int argc, char **argv) | 57 | main (int argc, char **argv) |
58 | { | 58 | { |
59 | char **argv_test=NULL, **argv_known=NULL; | 59 | char **argv_test=NULL, **argv_known=NULL; |
60 | int i, argc_test, argc_new; | 60 | int i, argc_test; |
61 | 61 | ||
62 | plan_tests(11); | 62 | plan_tests(11); |
63 | 63 | ||
@@ -68,9 +68,9 @@ main (int argc, char **argv) | |||
68 | argv_known=(char **)realloc(argv_known, 2*sizeof(char **)); | 68 | argv_known=(char **)realloc(argv_known, 2*sizeof(char **)); |
69 | argv_known[0] = "prog_name"; | 69 | argv_known[0] = "prog_name"; |
70 | argv_known[1] = NULL; | 70 | argv_known[1] = NULL; |
71 | argv_test=np_extra_opts(argc_test, argv_test, "check_disk", &argc_new); | 71 | argv_test=np_extra_opts(&argc_test, argv_test, "check_disk"); |
72 | ok(array_diff(argc_new, argv_test, 1, argv_known), "No opts, returns correct argv/argc"); | 72 | ok(array_diff(argc_test, argv_test, 1, argv_known), "No opts, returns correct argv/argc"); |
73 | my_free(&argc_new, argv_test); | 73 | my_free(&argc_test, argv_test); |
74 | 74 | ||
75 | argv_test=(char **)malloc(6*sizeof(char **)); | 75 | argv_test=(char **)malloc(6*sizeof(char **)); |
76 | argv_test[0] = "prog_name"; | 76 | argv_test[0] = "prog_name"; |
@@ -87,9 +87,9 @@ main (int argc, char **argv) | |||
87 | argv_known[3] = "--arg3"; | 87 | argv_known[3] = "--arg3"; |
88 | argv_known[4] = "val2"; | 88 | argv_known[4] = "val2"; |
89 | argv_known[5] = NULL; | 89 | argv_known[5] = NULL; |
90 | argv_test=np_extra_opts(argc_test, argv_test, "check_disk", &argc_new); | 90 | argv_test=np_extra_opts(&argc_test, argv_test, "check_disk"); |
91 | ok(array_diff(argc_new, argv_test, 5, argv_known), "No extra opts, verbatim copy of argv"); | 91 | ok(array_diff(argc_test, argv_test, 5, argv_known), "No extra opts, verbatim copy of argv"); |
92 | my_free(&argc_new,argv_test); | 92 | my_free(&argc_test,argv_test); |
93 | 93 | ||
94 | argv_test=(char **)malloc(3*sizeof(char **)); | 94 | argv_test=(char **)malloc(3*sizeof(char **)); |
95 | argv_test[0] = "prog_name"; | 95 | argv_test[0] = "prog_name"; |
@@ -102,9 +102,9 @@ main (int argc, char **argv) | |||
102 | argv_known[2] = "--this=Your Mother!"; | 102 | argv_known[2] = "--this=Your Mother!"; |
103 | argv_known[3] = "--blank"; | 103 | argv_known[3] = "--blank"; |
104 | argv_known[4] = NULL; | 104 | argv_known[4] = NULL; |
105 | argv_test=np_extra_opts(argc_test, argv_test, "check_disk", &argc_new); | 105 | argv_test=np_extra_opts(&argc_test, argv_test, "check_disk"); |
106 | ok(array_diff(argc_new, argv_test, 4, argv_known), "Only extra opts using default section"); | 106 | ok(array_diff(argc_test, argv_test, 4, argv_known), "Only extra opts using default section"); |
107 | my_free(&argc_new,argv_test); | 107 | my_free(&argc_test,argv_test); |
108 | 108 | ||
109 | argv_test=(char **)malloc(5*sizeof(char **)); | 109 | argv_test=(char **)malloc(5*sizeof(char **)); |
110 | argv_test[0] = "prog_name"; | 110 | argv_test[0] = "prog_name"; |
@@ -119,9 +119,9 @@ main (int argc, char **argv) | |||
119 | argv_known[2] = "--something else=oops"; | 119 | argv_known[2] = "--something else=oops"; |
120 | argv_known[3] = "--this=that"; | 120 | argv_known[3] = "--this=that"; |
121 | argv_known[4] = NULL; | 121 | argv_known[4] = NULL; |
122 | argv_test=np_extra_opts(argc_test, argv_test, "check_disk", &argc_new); | 122 | argv_test=np_extra_opts(argc_test, argv_test, "check_disk"); |
123 | ok(array_diff(argc_new, argv_test, 4, argv_known), "Only extra opts specified twice"); | 123 | ok(array_diff(argc_test, argv_test, 4, argv_known), "Only extra opts specified twice"); |
124 | my_free(&argc_new,argv_test); | 124 | my_free(&argc_test,argv_test); |
125 | 125 | ||
126 | argv_test=(char **)malloc(7*sizeof(char **)); | 126 | argv_test=(char **)malloc(7*sizeof(char **)); |
127 | argv_test[0] = "prog_name"; | 127 | argv_test[0] = "prog_name"; |
@@ -141,9 +141,9 @@ main (int argc, char **argv) | |||
141 | argv_known[5] = "--arg1=val1"; | 141 | argv_known[5] = "--arg1=val1"; |
142 | argv_known[6] = "--arg2"; | 142 | argv_known[6] = "--arg2"; |
143 | argv_known[7] = NULL; | 143 | argv_known[7] = NULL; |
144 | argv_test=np_extra_opts(argc_test, argv_test, "check_disk", &argc_new); | 144 | argv_test=np_extra_opts(argc_test, argv_test, "check_disk"); |
145 | ok(array_diff(argc_new, argv_test, 7, argv_known), "twice extra opts using two sections"); | 145 | ok(array_diff(argc_test, argv_test, 7, argv_known), "twice extra opts using two sections"); |
146 | my_free(&argc_new,argv_test); | 146 | my_free(&argc_test,argv_test); |
147 | 147 | ||
148 | /* Next three checks should die according to N::P - for now they're useful | 148 | /* Next three checks should die according to N::P - for now they're useful |
149 | * to test code is working properly (i.e. no srash or unexpected behavior) | 149 | * to test code is working properly (i.e. no srash or unexpected behavior) |
@@ -162,9 +162,9 @@ main (int argc, char **argv) | |||
162 | argv_known[2] = "--arg3"; | 162 | argv_known[2] = "--arg3"; |
163 | argv_known[3] = "val2"; | 163 | argv_known[3] = "val2"; |
164 | argv_known[4] = NULL; | 164 | argv_known[4] = NULL; |
165 | argv_test=np_extra_opts(argc_test, argv_test, "check_missing", &argc_new); | 165 | argv_test=np_extra_opts(argc_test, argv_test, "check_missing"); |
166 | ok(array_diff(argc_new, argv_test, 4, argv_known), "Missing section 1"); | 166 | ok(array_diff(argc_test, argv_test, 4, argv_known), "Missing section 1"); |
167 | my_free(&argc_new,argv_test); | 167 | my_free(&argc_test,argv_test); |
168 | 168 | ||
169 | argv_test=(char **)malloc(7*sizeof(char **)); | 169 | argv_test=(char **)malloc(7*sizeof(char **)); |
170 | argv_test[0] = "prog_name"; | 170 | argv_test[0] = "prog_name"; |
@@ -181,9 +181,9 @@ main (int argc, char **argv) | |||
181 | argv_known[2] = "--arg3"; | 181 | argv_known[2] = "--arg3"; |
182 | argv_known[3] = "val2"; | 182 | argv_known[3] = "val2"; |
183 | argv_known[4] = NULL; | 183 | argv_known[4] = NULL; |
184 | argv_test=np_extra_opts(argc_test, argv_test, "check_missing", &argc_new); | 184 | argv_test=np_extra_opts(argc_test, argv_test, "check_missing"); |
185 | ok(array_diff(argc_new, argv_test, 4, argv_known), "Missing section 2"); | 185 | ok(array_diff(argc_test, argv_test, 4, argv_known), "Missing section 2"); |
186 | my_free(&argc_new,argv_test); | 186 | my_free(&argc_test,argv_test); |
187 | 187 | ||
188 | argv_test=(char **)malloc(6*sizeof(char **)); | 188 | argv_test=(char **)malloc(6*sizeof(char **)); |
189 | argv_test[0] = "prog_name"; | 189 | argv_test[0] = "prog_name"; |
@@ -199,9 +199,9 @@ main (int argc, char **argv) | |||
199 | argv_known[2] = "--arg3"; | 199 | argv_known[2] = "--arg3"; |
200 | argv_known[3] = "val2"; | 200 | argv_known[3] = "val2"; |
201 | argv_known[4] = NULL; | 201 | argv_known[4] = NULL; |
202 | argv_test=np_extra_opts(argc_test, argv_test, "check_missing", &argc_new); | 202 | argv_test=np_extra_opts(argc_test, argv_test, "check_missing"); |
203 | ok(array_diff(argc_new, argv_test, 4, argv_known), "Missing section 3"); | 203 | ok(array_diff(argc_test, argv_test, 4, argv_known), "Missing section 3"); |
204 | my_free(&argc_new,argv_test); | 204 | my_free(&argc_test,argv_test); |
205 | 205 | ||
206 | setenv("NAGIOS_CONFIG_PATH", ".", 1); | 206 | setenv("NAGIOS_CONFIG_PATH", ".", 1); |
207 | argv_test=(char **)malloc(6*sizeof(char **)); | 207 | argv_test=(char **)malloc(6*sizeof(char **)); |
@@ -219,9 +219,9 @@ main (int argc, char **argv) | |||
219 | argv_known[3] = "--arg3"; | 219 | argv_known[3] = "--arg3"; |
220 | argv_known[4] = "val2"; | 220 | argv_known[4] = "val2"; |
221 | argv_known[5] = NULL; | 221 | argv_known[5] = NULL; |
222 | argv_test=np_extra_opts(argc_test, argv_test, "check_disk", &argc_new); | 222 | argv_test=np_extra_opts(argc_test, argv_test, "check_disk"); |
223 | ok(array_diff(argc_new, argv_test, 5, argv_known), "Default section 1"); | 223 | ok(array_diff(argc_test, argv_test, 5, argv_known), "Default section 1"); |
224 | my_free(&argc_new,argv_test); | 224 | my_free(&argc_test,argv_test); |
225 | 225 | ||
226 | argv_test=(char **)malloc(6*sizeof(char **)); | 226 | argv_test=(char **)malloc(6*sizeof(char **)); |
227 | argv_test[0] = "prog_name"; | 227 | argv_test[0] = "prog_name"; |
@@ -238,9 +238,9 @@ main (int argc, char **argv) | |||
238 | argv_known[3] = "--arg3"; | 238 | argv_known[3] = "--arg3"; |
239 | argv_known[4] = "val2"; | 239 | argv_known[4] = "val2"; |
240 | argv_known[5] = NULL; | 240 | argv_known[5] = NULL; |
241 | argv_test=np_extra_opts(argc_test, argv_test, "check_disk", &argc_new); | 241 | argv_test=np_extra_opts(argc_test, argv_test, "check_disk"); |
242 | ok(array_diff(argc_new, argv_test, 5, argv_known), "Default section 2"); | 242 | ok(array_diff(argc_test, argv_test, 5, argv_known), "Default section 2"); |
243 | my_free(&argc_new,argv_test); | 243 | my_free(&argc_test,argv_test); |
244 | 244 | ||
245 | argv_test=(char **)malloc(6*sizeof(char **)); | 245 | argv_test=(char **)malloc(6*sizeof(char **)); |
246 | argv_test[0] = "prog_name"; | 246 | argv_test[0] = "prog_name"; |
@@ -257,9 +257,9 @@ main (int argc, char **argv) | |||
257 | argv_known[3] = "--arg3"; | 257 | argv_known[3] = "--arg3"; |
258 | argv_known[4] = "val2"; | 258 | argv_known[4] = "val2"; |
259 | argv_known[5] = NULL; | 259 | argv_known[5] = NULL; |
260 | argv_test=np_extra_opts(argc_test, argv_test, "check_disk", &argc_new); | 260 | argv_test=np_extra_opts(argc_test, argv_test, "check_disk"); |
261 | ok(array_diff(argc_new, argv_test, 5, argv_known), "Default section 3"); | 261 | ok(array_diff(argc_test, argv_test, 5, argv_known), "Default section 3"); |
262 | my_free(&argc_new,argv_test); | 262 | my_free(&argc_test,argv_test); |
263 | 263 | ||
264 | return exit_status(); | 264 | return exit_status(); |
265 | } | 265 | } |