summaryrefslogtreecommitdiffstats
path: root/lib/extra_opts.c
diff options
context:
space:
mode:
Diffstat (limited to 'lib/extra_opts.c')
-rw-r--r--lib/extra_opts.c135
1 files changed, 135 insertions, 0 deletions
diff --git a/lib/extra_opts.c b/lib/extra_opts.c
new file mode 100644
index 0000000..771621d
--- /dev/null
+++ b/lib/extra_opts.c
@@ -0,0 +1,135 @@
+/*****************************************************************************
+*
+* Monitoring Plugins extra_opts library
+*
+* License: GPL
+* Copyright (c) 2007 Monitoring Plugins Development Team
+*
+* This program is free software: you can redistribute it and/or modify
+* it under the terms of the GNU General Public License as published by
+* the Free Software Foundation, either version 3 of the License, or
+* (at your option) any later version.
+*
+* This program is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+* GNU General Public License for more details.
+*
+* You should have received a copy of the GNU General Public License
+* along with this program. If not, see <http://www.gnu.org/licenses/>.
+*
+*****************************************************************************/
+
+#include "common.h"
+#include "utils_base.h"
+#include "parse_ini.h"
+#include "extra_opts.h"
+
+/* FIXME: copied from utils.h; we should move a bunch of libs! */
+bool is_option2 (char *str)
+{
+ if (!str)
+ return false;
+ else if (strspn (str, "-") == 1 || strspn (str, "-") == 2)
+ return true;
+ else
+ return false;
+}
+
+/* this is the externally visible function used by plugins */
+char **np_extra_opts(int *argc, char **argv, const char *plugin_name){
+ np_arg_list *extra_args=NULL, *ea1=NULL, *ea_tmp=NULL;
+ char **argv_new=NULL;
+ char *argptr=NULL;
+ int i, j, optfound, argc_new, ea_num=*argc;
+
+ if(*argc<2) {
+ /* No arguments provided */
+ return argv;
+ }
+
+ for(i=1; i<*argc; i++){
+ argptr=NULL;
+ optfound=0;
+
+ /* Do we have an extra-opts parameter? */
+ if(strncmp(argv[i], "--extra-opts=", 13)==0){
+ /* It is a single argument with value */
+ argptr=argv[i]+13;
+ /* Delete the extra opts argument */
+ for(j=i;j<*argc;j++) argv[j]=argv[j+1];
+ i--;
+ *argc-=1;
+ }else if(strcmp(argv[i], "--extra-opts")==0){
+ if((i+1<*argc)&&!is_option2(argv[i+1])){
+ /* It is a argument with separate value */
+ argptr=argv[i+1];
+ /* Delete the extra-opts argument/value */
+ for(j=i;j<*argc-1;j++) argv[j]=argv[j+2];
+ i-=2;
+ *argc-=2;
+ ea_num--;
+ }else{
+ /* It has no value */
+ optfound=1;
+ /* Delete the extra opts argument */
+ for(j=i;j<*argc;j++) argv[j]=argv[j+1];
+ i--;
+ *argc-=1;
+ }
+ }
+
+ /* If we found extra-opts, expand them and store them for later*/
+ if(argptr||optfound){
+ /* Process ini section, returning a linked list of arguments */
+ ea1=np_get_defaults(argptr, plugin_name);
+ if(ea1==NULL) {
+ /* no extra args (empty section)? */
+ ea_num--;
+ continue;
+ }
+
+ /* append the list to extra_args */
+ if(extra_args==NULL){
+ extra_args=ea1;
+ while((ea1 = ea1->next)) ea_num++;
+ }else{
+ ea_tmp=extra_args;
+ while(ea_tmp->next) {
+ ea_tmp=ea_tmp->next;
+ }
+ ea_tmp->next=ea1;
+ while((ea1 = ea1->next)) ea_num++;
+ }
+ ea1=ea_tmp=NULL;
+ }
+ } /* lather, rince, repeat */
+
+ if(ea_num==*argc && extra_args==NULL){
+ /* No extra-opts */
+ return argv;
+ }
+
+ /* done processing arguments. now create a new argv array... */
+ argv_new=(char**)malloc((ea_num+1)*sizeof(char**));
+ if(argv_new==NULL) die(STATE_UNKNOWN, _("malloc() failed!\n"));
+
+ /* starting with program name */
+ argv_new[0]=argv[0];
+ argc_new=1;
+ /* then parsed ini opts (frying them up in the same run) */
+ while(extra_args){
+ argv_new[argc_new++]=extra_args->arg;
+ ea1=extra_args;
+ extra_args=extra_args->next;
+ free(ea1);
+ }
+ /* finally the rest of the argv array */
+ for (i=1; i<*argc; i++) argv_new[argc_new++]=argv[i];
+ *argc=argc_new;
+ /* and terminate. */
+ argv_new[argc_new]=NULL;
+
+ return argv_new;
+}
+