/*****************************************************************************
*
* Nagios-plugins extra_opts library
*
* License: GPL
* Copyright (c) 2007 Nagios Plugins Development Team
*
* Last Modified: $Date: 2008-03-15 18:42:01 -0400 (Sat, 15 Mar 2008) $
*
*
* 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 .
*
* $Id: parse_ini.c 1950 2008-03-15 22:42:01Z dermoth $
*
*****************************************************************************/
#include "common.h"
#include "extra_opts.h"
#include "parse_ini.h"
#include "utils_base.h"
#include
/* FIXME: copied from utils.h; we should move a bunch of libs! */
int
is_option (char *str)
{
if (!str)
return 0;
else if (strspn (str, "-") == 1 || strspn (str, "-") == 2)
return 1;
else
return 0;
}
/* this is the externally visible function used by plugins */
/* Shouldn't se modify directly **argv (passed as a char ***) and argc
* (as int *) ?
*/
char **np_extra_opts(int argc, char **argv, const char *plugin_name, int *argc_new){
np_arg_list *extra_args=NULL, *ea_tmp1=NULL, *ea_tmp2=NULL;
char **argv_new=NULL;
char *argptr=NULL;
int i, j, optfound, ea_num=argc;
if(argc<2) {
/* No arguments provided */
*argc_new=argc;
argv_new=argv;
return argv_new;
}
for(i=1; inext) {
ea_tmp2=ea_tmp2->next;
ea_num++;
}
}else{
ea_tmp2=extra_args;
while(ea_tmp2->next) {
ea_tmp2=ea_tmp2->next;
ea_num++;
}
ea_tmp2->next=ea_tmp1;
}
ea_tmp1=ea_tmp2=NULL;
}
/* lather, rince, repeat */
}
if(ea_num==argc && extra_args==NULL){
/* No extra-opts */
*argc_new=argc;
argv_new=argv;
return argv_new;
}
/* done processing arguments. now create a new argc/argv set... */
argv_new=(char**)malloc((ea_num+1)*sizeof(char**));
if(argv_new==NULL) die(STATE_UNKNOWN, _("malloc() failed!\n"));
/* starting with program name (Should we strdup or just use the poiter?) */
argv_new[0]=strdup(argv[0]);
*argc_new=1;
/* then parsed ini opts (frying them up in the same run) */
while(extra_args){
argv_new[*argc_new]=strdup(extra_args->arg);
*argc_new+=1;
ea_tmp1=extra_args;
extra_args=extra_args->next;
free(ea_tmp1);
}
/* finally the rest of the argv array (Should we strdup or just use the poiter?) */
for (i=1; i