2002-07-29 09:23:01 +00:00
/*
Unix SMB / CIFS implementation .
Common popt routines
Copyright ( C ) Tim Potter 2001 , 2002
2003-04-14 03:30:20 +00:00
Copyright ( C ) Jelmer Vernooij 2002 , 2003
2006-05-24 04:02:14 +00:00
Copyright ( C ) James Peach 2006
2002-07-29 09:23:01 +00:00
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
2007-07-09 19:25:36 +00:00
the Free Software Foundation ; either version 3 of the License , or
2002-07-29 09:23:01 +00:00
( 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
2007-07-10 00:52:41 +00:00
along with this program . If not , see < http : //www.gnu.org/licenses/>.
2002-07-29 09:23:01 +00:00
*/
# include "includes.h"
2010-08-05 10:49:53 +02:00
# include "popt_common.h"
2014-02-21 12:54:29 +13:00
# include "lib/param/param.h"
2002-07-29 09:23:01 +00:00
2002-10-28 19:44:11 +00:00
/* Handle command line options:
2003-04-14 03:30:20 +00:00
* - d , - - debuglevel
* - s , - - configfile
* - O , - - socket - options
* - V , - - version
2021-03-01 13:36:45 +01:00
* - l , - - log - basename
2003-04-14 03:30:20 +00:00
* - n , - - netbios - name
* - W , - - workgroup
* - i , - - scope
2002-10-28 19:44:11 +00:00
*/
2002-07-29 09:23:01 +00:00
2010-08-11 13:35:14 +10:00
enum { OPT_OPTION = 1 } ;
2007-10-18 17:40:25 -07:00
extern bool override_logfile ;
2002-10-28 19:44:11 +00:00
2006-05-24 04:02:14 +00:00
static void set_logfile ( poptContext con , const char * arg )
2002-07-29 09:23:01 +00:00
{
2006-05-24 04:02:14 +00:00
2019-02-06 12:01:12 +01:00
char lfile [ PATH_MAX ] ;
2002-11-09 16:57:45 +00:00
const char * pname ;
2019-02-06 12:01:12 +01:00
int ret ;
2007-11-15 14:19:52 -08:00
2002-11-09 16:57:45 +00:00
/* Find out basename of current program */
2019-02-06 12:01:12 +01:00
pname = strrchr_m ( poptGetInvocationName ( con ) , ' / ' ) ;
if ( pname = = NULL ) {
2002-11-09 16:57:45 +00:00
pname = poptGetInvocationName ( con ) ;
2019-02-06 12:01:12 +01:00
} else {
2002-11-09 16:57:45 +00:00
pname + + ;
2019-02-06 12:01:12 +01:00
}
2002-11-09 16:57:45 +00:00
2019-02-06 12:01:12 +01:00
ret = snprintf ( lfile , sizeof ( lfile ) , " %s/log.%s " , arg , pname ) ;
if ( ret > = sizeof ( lfile ) ) {
2007-11-15 14:19:52 -08:00
return ;
}
2008-11-03 12:36:34 -08:00
lp_set_logfile ( lfile ) ;
2006-05-24 04:02:14 +00:00
}
2007-10-18 17:40:25 -07:00
static bool PrintSambaVersionString ;
2007-08-22 11:55:48 +00:00
2009-08-03 11:30:44 +02:00
static void popt_s3_talloc_log_fn ( const char * message )
{
DEBUG ( 0 , ( " %s " , message ) ) ;
}
2006-05-24 04:02:14 +00:00
static void popt_common_callback ( poptContext con ,
enum poptCallbackReason reason ,
const struct poptOption * opt ,
const char * arg , const void * data )
{
2019-02-06 00:58:17 +01:00
TALLOC_CTX * mem_ctx = talloc_new ( NULL ) ;
if ( mem_ctx = = NULL ) {
exit ( 1 ) ;
}
2006-05-24 04:02:14 +00:00
2002-11-09 16:57:45 +00:00
if ( reason = = POPT_CALLBACK_REASON_PRE ) {
2007-12-10 11:30:37 -08:00
set_logfile ( con , get_dyn_LOGFILEBASE ( ) ) ;
2009-08-03 11:30:44 +02:00
talloc_set_log_fn ( popt_s3_talloc_log_fn ) ;
talloc_set_abort_fn ( smb_panic ) ;
2019-02-06 00:58:17 +01:00
talloc_free ( mem_ctx ) ;
2002-11-09 16:57:45 +00:00
return ;
}
2007-08-22 11:55:48 +00:00
if ( reason = = POPT_CALLBACK_REASON_POST ) {
2008-02-04 16:16:59 +01:00
if ( PrintSambaVersionString ) {
2009-01-15 22:27:52 +01:00
printf ( " Version %s \n " , samba_version_string ( ) ) ;
2019-02-06 00:58:17 +01:00
talloc_free ( mem_ctx ) ;
2008-02-04 16:16:59 +01:00
exit ( 0 ) ;
}
if ( is_default_dyn_CONFIGFILE ( ) ) {
2019-02-06 00:58:17 +01:00
if ( getenv ( " SMB_CONF_PATH " ) ) {
2008-02-04 16:16:59 +01:00
set_dyn_CONFIGFILE ( getenv ( " SMB_CONF_PATH " ) ) ;
}
}
2018-08-13 15:07:20 -07:00
if ( override_logfile ) {
2019-11-05 10:34:11 +01:00
const struct loadparm_substitution * lp_sub =
loadparm_s3_global_substitution ( ) ;
char * logfile = lp_logfile ( mem_ctx , lp_sub ) ;
2019-02-06 00:58:17 +01:00
if ( logfile = = NULL ) {
talloc_free ( mem_ctx ) ;
exit ( 1 ) ;
}
setup_logging ( logfile , DEBUG_FILE ) ;
2018-08-13 15:07:20 -07:00
}
2008-02-04 16:16:59 +01:00
/* Further 'every Samba program must do this' hooks here. */
2019-02-06 00:58:17 +01:00
talloc_free ( mem_ctx ) ;
2007-08-22 11:55:48 +00:00
return ;
}
2002-07-29 09:23:01 +00:00
switch ( opt - > val ) {
2010-08-11 13:35:14 +10:00
case OPT_OPTION :
2014-02-21 12:54:29 +13:00
{
struct loadparm_context * lp_ctx ;
2019-02-06 00:58:17 +01:00
bool ok ;
2014-02-21 12:54:29 +13:00
2019-02-06 00:58:17 +01:00
lp_ctx = loadparm_init_s3 ( mem_ctx , loadparm_s3_helpers ( ) ) ;
2014-02-21 12:54:29 +13:00
if ( lp_ctx = = NULL ) {
fprintf ( stderr , " loadparm_init_s3() failed! \n " ) ;
2019-02-06 00:58:17 +01:00
talloc_free ( mem_ctx ) ;
2014-02-21 12:54:29 +13:00
exit ( 1 ) ;
}
2019-02-06 00:58:17 +01:00
ok = lpcfg_set_option ( lp_ctx , arg ) ;
if ( ! ok ) {
2010-08-11 13:35:14 +10:00
fprintf ( stderr , " Error setting option '%s' \n " , arg ) ;
2019-02-06 00:58:17 +01:00
talloc_free ( mem_ctx ) ;
2010-08-11 13:35:14 +10:00
exit ( 1 ) ;
}
break ;
2014-02-21 12:54:29 +13:00
}
2002-07-29 09:23:01 +00:00
case ' d ' :
if ( arg ) {
2010-10-29 15:06:36 +11:00
lp_set_cmdline ( " log level " , arg ) ;
2002-07-29 09:23:01 +00:00
}
2002-10-28 19:44:11 +00:00
break ;
2002-07-29 09:23:01 +00:00
2002-10-28 19:44:11 +00:00
case ' V ' :
2007-08-22 11:55:48 +00:00
PrintSambaVersionString = True ;
2002-10-28 19:44:11 +00:00
break ;
case ' O ' :
2002-11-09 16:57:45 +00:00
if ( arg ) {
2014-03-20 09:44:59 +13:00
lp_set_cmdline ( " socket options " , arg ) ;
2002-11-09 16:57:45 +00:00
}
2002-10-28 19:44:11 +00:00
break ;
case ' s ' :
2002-11-09 16:57:45 +00:00
if ( arg ) {
2007-12-10 11:30:37 -08:00
set_dyn_CONFIGFILE ( arg ) ;
2002-11-09 16:57:45 +00:00
}
2002-10-28 19:44:11 +00:00
break ;
case ' n ' :
2002-11-09 16:57:45 +00:00
if ( arg ) {
2011-06-09 15:31:03 +10:00
lp_set_cmdline ( " netbios name " , arg ) ;
2002-11-09 16:57:45 +00:00
}
break ;
case ' l ' :
if ( arg ) {
2006-05-24 04:02:14 +00:00
set_logfile ( con , arg ) ;
2006-06-05 13:00:24 +00:00
override_logfile = True ;
2007-12-10 11:30:37 -08:00
set_dyn_LOGFILEBASE ( arg ) ;
2002-11-09 16:57:45 +00:00
}
2002-07-29 09:23:01 +00:00
break ;
2003-04-14 03:30:20 +00:00
case ' i ' :
if ( arg ) {
2011-06-08 16:27:06 +10:00
lp_set_cmdline ( " netbios scope " , arg ) ;
2003-04-14 03:30:20 +00:00
}
break ;
case ' W ' :
if ( arg ) {
2011-06-08 15:42:22 +10:00
lp_set_cmdline ( " workgroup " , arg ) ;
2003-04-14 03:30:20 +00:00
}
break ;
2002-07-29 09:23:01 +00:00
}
2019-02-06 00:58:17 +01:00
talloc_free ( mem_ctx ) ;
2002-07-29 09:23:01 +00:00
}
2003-04-14 03:30:20 +00:00
struct poptOption popt_common_connection [ ] = {
2018-12-13 10:31:46 +01:00
{
. argInfo = POPT_ARG_CALLBACK ,
. arg = ( void * ) popt_common_callback ,
} ,
{
. longName = " socket-options " ,
. shortName = ' O ' ,
. argInfo = POPT_ARG_STRING ,
. val = ' O ' ,
. descrip = " socket options to use " ,
. argDescrip = " SOCKETOPTIONS " ,
} ,
{
. longName = " netbiosname " ,
. shortName = ' n ' ,
. argInfo = POPT_ARG_STRING ,
. val = ' n ' ,
. descrip = " Primary netbios name " ,
. argDescrip = " NETBIOSNAME "
} ,
{
. longName = " workgroup " ,
. shortName = ' W ' ,
. argInfo = POPT_ARG_STRING ,
. val = ' W ' ,
. descrip = " Set the workgroup name " ,
. argDescrip = " WORKGROUP "
} ,
{
. longName = " scope " ,
. shortName = ' i ' ,
. argInfo = POPT_ARG_STRING ,
. val = ' i ' ,
. descrip = " Use this Netbios scope " ,
. argDescrip = " SCOPE "
} ,
2003-04-14 03:30:20 +00:00
POPT_TABLEEND
2002-07-29 09:23:01 +00:00
} ;
2002-10-28 19:44:11 +00:00
2003-04-14 03:30:20 +00:00
struct poptOption popt_common_samba [ ] = {
2018-12-13 10:31:46 +01:00
{
. argInfo = POPT_ARG_CALLBACK | POPT_CBFLAG_PRE | POPT_CBFLAG_POST ,
. arg = ( void * ) popt_common_callback ,
} ,
{
. longName = " debuglevel " ,
. shortName = ' d ' ,
. argInfo = POPT_ARG_STRING ,
. val = ' d ' ,
. descrip = " Set debug level " ,
. argDescrip = " DEBUGLEVEL " ,
} ,
{
. longName = " configfile " ,
. shortName = ' s ' ,
. argInfo = POPT_ARG_STRING ,
. val = ' s ' ,
. descrip = " Use alternate configuration file " ,
. argDescrip = " CONFIGFILE " ,
} ,
{
. longName = " log-basename " ,
. shortName = ' l ' ,
. argInfo = POPT_ARG_STRING ,
. val = ' l ' ,
. descrip = " Base name for log files " ,
. argDescrip = " LOGFILEBASE " ,
} ,
{
. longName = " version " ,
. shortName = ' V ' ,
. argInfo = POPT_ARG_NONE ,
. val = ' V ' ,
. descrip = " Print version " ,
} ,
{
. longName = " option " ,
. argInfo = POPT_ARG_STRING ,
. val = OPT_OPTION ,
. descrip = " Set smb.conf option from command line " ,
. argDescrip = " name=value " ,
} ,
2003-04-14 03:30:20 +00:00
POPT_TABLEEND
2002-10-28 19:44:11 +00:00
} ;
2007-12-14 19:36:14 +01:00
struct poptOption popt_common_configfile [ ] = {
2018-12-13 10:31:46 +01:00
{
. argInfo = POPT_ARG_CALLBACK | POPT_CBFLAG_PRE | POPT_CBFLAG_POST ,
. arg = ( void * ) popt_common_callback ,
} ,
{
. longName = " configfile " ,
. argInfo = POPT_ARG_STRING ,
. val = ' s ' ,
. descrip = " Use alternate configuration file " ,
. argDescrip = " CONFIGFILE " ,
} ,
2007-12-14 19:36:14 +01:00
POPT_TABLEEND
} ;
2002-10-28 19:44:11 +00:00
struct poptOption popt_common_version [ ] = {
2018-12-13 10:31:46 +01:00
{
. argInfo = POPT_ARG_CALLBACK | POPT_CBFLAG_POST ,
. arg = ( void * ) popt_common_callback
} ,
{
. longName = " version " ,
. shortName = ' V ' ,
. argInfo = POPT_ARG_NONE ,
. val = ' V ' ,
. descrip = " Print version " ,
} ,
2003-04-14 03:30:20 +00:00
POPT_TABLEEND
2002-10-28 19:44:11 +00:00
} ;
2008-07-15 11:26:11 +02:00
struct poptOption popt_common_debuglevel [ ] = {
2018-12-13 10:31:46 +01:00
{
. argInfo = POPT_ARG_CALLBACK ,
. arg = ( void * ) popt_common_callback ,
} ,
{
. longName = " debuglevel " ,
. shortName = ' d ' ,
. argInfo = POPT_ARG_STRING ,
. val = ' d ' ,
. descrip = " Set debug level " ,
. argDescrip = " DEBUGLEVEL " ,
} ,
2008-07-15 11:26:11 +02:00
POPT_TABLEEND
} ;
2011-02-09 13:44:42 +01:00
struct poptOption popt_common_option [ ] = {
2018-12-13 10:31:46 +01:00
{
. argInfo = POPT_ARG_CALLBACK | POPT_CBFLAG_POST ,
. arg = ( void * ) popt_common_callback ,
} ,
{
. longName = " option " ,
. argInfo = POPT_ARG_STRING ,
. val = OPT_OPTION ,
. descrip = " Set smb.conf option from command line " ,
. argDescrip = " name=value " ,
} ,
2011-02-09 13:44:42 +01:00
POPT_TABLEEND
} ;