2005-04-16 15:20:36 -07:00
/*
* getopt . c
*/
2014-04-08 16:04:14 -07:00
# define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
2005-04-16 15:20:36 -07:00
# include <linux/kernel.h>
# include <linux/string.h>
# include <asm/errno.h>
# include "getopt.h"
/**
* ncp_getopt - option parser
* @ caller : name of the caller , for error messages
* @ options : the options string
* @ opts : an array of & struct option entries controlling parser operations
* @ optopt : output ; will contain the current option
* @ optarg : output ; will contain the value ( if one exists )
* @ value : output ; may be NULL ; will be overwritten with the integer value
* of the current argument .
*
* Helper to parse options on the format used by mount ( " a=b,c=d,e,f " ) .
* Returns opts - > val if a matching entry in the ' opts ' array is found ,
* 0 when no more tokens are found , - 1 if an error is encountered .
*/
int ncp_getopt ( const char * caller , char * * options , const struct ncp_option * opts ,
char * * optopt , char * * optarg , unsigned long * value )
{
char * token ;
char * val ;
do {
if ( ( token = strsep ( options , " , " ) ) = = NULL )
return 0 ;
} while ( * token = = ' \0 ' ) ;
if ( optopt )
* optopt = token ;
if ( ( val = strchr ( token , ' = ' ) ) ! = NULL ) {
* val + + = 0 ;
}
* optarg = val ;
for ( ; opts - > name ; opts + + ) {
if ( ! strcmp ( opts - > name , token ) ) {
if ( ! val ) {
if ( opts - > has_arg & OPT_NOPARAM ) {
return opts - > val ;
}
2014-04-08 16:04:14 -07:00
pr_info ( " %s: the %s option requires an argument \n " ,
caller , token ) ;
2005-04-16 15:20:36 -07:00
return - EINVAL ;
}
if ( opts - > has_arg & OPT_INT ) {
2014-06-04 16:12:21 -07:00
int rc = kstrtoul ( val , 0 , value ) ;
2005-04-16 15:20:36 -07:00
2014-06-04 16:12:21 -07:00
if ( rc ) {
pr_info ( " %s: invalid numeric value in %s=%s \n " ,
caller , token , val ) ;
return rc ;
2005-04-16 15:20:36 -07:00
}
2014-06-04 16:12:21 -07:00
return opts - > val ;
2005-04-16 15:20:36 -07:00
}
if ( opts - > has_arg & OPT_STRING ) {
return opts - > val ;
}
2014-04-08 16:04:14 -07:00
pr_info ( " %s: unexpected argument %s to the %s option \n " ,
2005-04-16 15:20:36 -07:00
caller , val , token ) ;
return - EINVAL ;
}
}
2014-04-08 16:04:14 -07:00
pr_info ( " %s: Unrecognized mount option %s \n " , caller , token ) ;
2005-04-16 15:20:36 -07:00
return - EOPNOTSUPP ;
}