1996-05-04 11:50:46 +04:00
/*
2002-01-30 09:08:46 +03:00
Unix SMB / CIFS implementation .
1996-05-04 11:50:46 +04:00
Test validity of smb . conf
1998-01-22 16:27:43 +03:00
Copyright ( C ) Karl Auer 1993 , 1994 - 1998
1996-05-04 11:50:46 +04:00
Extensively modified by Andrew Tridgell , 1995
2002-07-15 14:35:28 +04:00
Converted to popt by Jelmer Vernooij ( jelmer @ nl . linux . org ) , 2002
1996-05-04 11:50:46 +04: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 23:25:36 +04:00
the Free Software Foundation ; either version 3 of the License , or
1996-05-04 11:50:46 +04: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 04:52:41 +04:00
along with this program . If not , see < http : //www.gnu.org/licenses/>.
1996-05-04 11:50:46 +04:00
*/
/*
* Testbed for loadparm . c / params . c
*
* This module simply loads a specified configuration file and
* if successful , dumps it ' s contents to stdout . Note that the
* operation is performed with DEBUGLEVEL at 3.
*
* Useful for a quick ' syntax check ' of a configuration file .
*
*/
# include "includes.h"
2011-02-26 01:20:06 +03:00
# include "system/filesys.h"
2010-08-05 12:49:53 +04:00
# include "popt_common.h"
2011-06-29 09:33:54 +04:00
# include "lib/param/loadparm.h"
1996-05-04 11:50:46 +04:00
2009-11-27 15:19:30 +03:00
/*******************************************************************
Check if a directory exists .
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
2011-06-02 01:51:55 +04:00
static bool directory_exist_stat ( const char * dname , SMB_STRUCT_STAT * st )
2009-11-27 15:19:30 +03:00
{
SMB_STRUCT_STAT st2 ;
bool ret ;
if ( ! st )
st = & st2 ;
if ( sys_stat ( dname , st , false ) ! = 0 )
return ( False ) ;
ret = S_ISDIR ( st - > st_ex_mode ) ;
if ( ! ret )
errno = ENOTDIR ;
return ret ;
}
1998-05-22 05:51:14 +04:00
/***********************************************
Here we do a set of ' hard coded ' checks for bad
configuration settings .
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
1999-12-13 16:27:58 +03:00
static int do_global_checks ( void )
1998-05-22 05:51:14 +04:00
{
1999-12-13 16:27:58 +03:00
int ret = 0 ;
1998-09-02 00:11:54 +04:00
SMB_STRUCT_STAT st ;
2013-11-04 15:32:46 +04:00
const char * socket_options ;
1999-12-13 16:27:58 +03:00
2002-03-15 12:24:56 +03:00
if ( lp_security ( ) > = SEC_DOMAIN & & ! lp_encrypted_passwords ( ) ) {
2013-11-04 15:32:45 +04:00
fprintf ( stderr , " ERROR: in 'security=domain' mode the "
" 'encrypt passwords' parameter must always be "
" set to 'true'. \n \n " ) ;
1999-12-13 16:27:58 +03:00
ret = 1 ;
1998-11-10 23:51:25 +03:00
}
2011-07-01 09:14:08 +04:00
if ( lp_we_are_a_wins_server ( ) & & lp_wins_server_list ( ) ) {
2013-11-04 15:32:45 +04:00
fprintf ( stderr , " ERROR: both 'wins support = true' and "
" 'wins server = <server list>' cannot be set in "
" the smb.conf file. nmbd will abort with this "
" setting. \n \n " ) ;
1999-12-13 16:27:58 +03:00
ret = 1 ;
1998-08-20 07:11:46 +04:00
}
2011-06-09 09:31:03 +04:00
if ( strequal ( lp_workgroup ( ) , lp_netbios_name ( ) ) ) {
2013-11-04 15:32:45 +04:00
fprintf ( stderr , " WARNING: 'workgroup' and 'netbios name' "
" must differ. \n \n " ) ;
2010-03-24 16:55:15 +03:00
}
2014-02-03 06:46:08 +04:00
if ( ! directory_exist_stat ( lp_lock_directory ( ) , & st ) ) {
2013-11-04 15:32:45 +04:00
fprintf ( stderr , " ERROR: lock directory %s does not exist \n \n " ,
2014-02-03 06:46:08 +04:00
lp_lock_directory ( ) ) ;
1999-12-13 16:27:58 +03:00
ret = 1 ;
2009-05-14 17:34:42 +04:00
} else if ( ( st . st_ex_mode & 0777 ) ! = 0755 ) {
2013-11-04 15:32:45 +04:00
fprintf ( stderr , " WARNING: lock directory %s should have "
" permissions 0755 for browsing to work \n \n " ,
2014-02-03 06:46:08 +04:00
lp_lock_directory ( ) ) ;
1999-12-13 16:27:58 +03:00
}
2009-01-08 22:18:13 +03:00
if ( ! directory_exist_stat ( lp_statedir ( ) , & st ) ) {
2013-11-04 15:32:45 +04:00
fprintf ( stderr , " ERROR: state directory %s does not exist \n \n " ,
2009-01-08 22:18:13 +03:00
lp_statedir ( ) ) ;
ret = 1 ;
2009-05-14 17:34:42 +04:00
} else if ( ( st . st_ex_mode & 0777 ) ! = 0755 ) {
2013-11-04 15:32:45 +04:00
fprintf ( stderr , " WARNING: state directory %s should have "
" permissions 0755 for browsing to work \n \n " ,
2009-01-08 22:18:13 +03:00
lp_statedir ( ) ) ;
}
if ( ! directory_exist_stat ( lp_cachedir ( ) , & st ) ) {
2013-11-04 15:32:45 +04:00
fprintf ( stderr , " ERROR: cache directory %s does not exist \n \n " ,
2009-01-08 22:18:13 +03:00
lp_cachedir ( ) ) ;
ret = 1 ;
2009-05-14 17:34:42 +04:00
} else if ( ( st . st_ex_mode & 0777 ) ! = 0755 ) {
2013-11-04 15:32:45 +04:00
fprintf ( stderr , " WARNING: cache directory %s should have "
" permissions 0755 for browsing to work \n \n " ,
2009-01-08 22:18:13 +03:00
lp_cachedir ( ) ) ;
}
2014-02-03 06:57:21 +04:00
if ( ! directory_exist_stat ( lp_pid_directory ( ) , & st ) ) {
2013-11-04 15:32:45 +04:00
fprintf ( stderr , " ERROR: pid directory %s does not exist \n \n " ,
2014-02-03 06:57:21 +04:00
lp_pid_directory ( ) ) ;
2002-07-15 14:35:28 +04:00
ret = 1 ;
}
2005-12-01 17:46:56 +03:00
if ( lp_passdb_expand_explicit ( ) ) {
fprintf ( stderr , " WARNING: passdb expand explicit = yes is "
2013-11-04 15:32:45 +04:00
" deprecated \n \n " ) ;
2005-12-01 17:46:56 +03:00
}
2013-11-04 15:32:46 +04:00
/*
* Socket options .
*/
socket_options = lp_socket_options ( ) ;
if ( socket_options ! = NULL & &
( strstr ( socket_options , " SO_SNDBUF " ) | |
strstr ( socket_options , " SO_RCVBUF " ) | |
strstr ( socket_options , " SO_SNDLOWAT " ) | |
2013-11-20 10:03:15 +04:00
strstr ( socket_options , " SO_RCVLOWAT " ) ) )
{
2013-11-04 15:32:46 +04:00
fprintf ( stderr ,
" WARNING: socket options = %s \n "
" This warning is printed because you set one of the \n "
" following options: SO_SNDBUF, SO_RCVBUF, SO_SNDLOWAT, \n "
2013-11-20 10:03:15 +04:00
" SO_RCVLOWAT \n "
2013-11-04 15:32:46 +04:00
" Modern server operating systems are tuned for \n "
" high network performance in the majority of situations; \n "
" when you set 'socket options' you are overriding those \n "
" settings. \n "
" Linux in particular has an auto-tuning mechanism for \n "
" buffer sizes (SO_SNDBUF, SO_RCVBUF) that will be \n "
" disabled if you specify a socket buffer size. This can \n "
" potentially cripple your TCP/IP stack. \n \n "
" Getting the 'socket options' correct can make a big \n "
" difference to your performance, but getting them wrong \n "
" can degrade it by just as much. As with any other low \n "
" level setting, if you must make changes to it, make \n "
" small changes and test the effect before making any \n "
" large changes. \n \n " ,
socket_options ) ;
}
1999-12-13 16:27:58 +03:00
/*
* Password server sanity checks .
*/
2014-02-03 06:52:14 +04:00
if ( ( lp_security ( ) > = SEC_DOMAIN ) & & ! * lp_password_server ( ) ) {
2007-12-04 05:48:41 +03:00
const char * sec_setting ;
2012-05-12 14:00:00 +04:00
if ( lp_security ( ) = = SEC_DOMAIN )
2007-12-04 05:48:41 +03:00
sec_setting = " domain " ;
2011-05-18 05:53:34 +04:00
else if ( lp_security ( ) = = SEC_ADS )
sec_setting = " ads " ;
2007-12-04 05:48:41 +03:00
else
sec_setting = " " ;
1999-12-13 16:27:58 +03:00
2013-11-04 15:32:45 +04:00
fprintf ( stderr , " ERROR: The setting 'security=%s' requires the "
" 'password server' parameter be set to the "
" default value * or a valid password server. \n \n " ,
sec_setting ) ;
2011-05-18 05:53:34 +04:00
ret = 1 ;
}
2014-02-03 06:52:14 +04:00
if ( ( lp_security ( ) > = SEC_DOMAIN ) & & ( strcmp ( lp_password_server ( ) , " * " ) ! = 0 ) ) {
2011-05-18 05:53:34 +04:00
const char * sec_setting ;
if ( lp_security ( ) = = SEC_DOMAIN )
sec_setting = " domain " ;
else if ( lp_security ( ) = = SEC_ADS )
sec_setting = " ads " ;
else
sec_setting = " " ;
2013-11-04 15:32:45 +04:00
fprintf ( stderr , " WARNING: The setting 'security=%s' should NOT "
" be combined with the 'password server' "
" parameter. \n "
" (by default Samba will discover the correct DC "
" to contact automatically). \n \n " ,
sec_setting ) ;
1999-12-13 16:27:58 +03:00
}
/*
* Password chat sanity checks .
*/
if ( lp_security ( ) = = SEC_USER & & lp_unix_password_sync ( ) ) {
/*
2001-05-10 10:53:19 +04:00
* Check that we have a valid lp_passwd_program ( ) if not using pam .
1999-12-13 16:27:58 +03:00
*/
2001-05-10 10:53:19 +04:00
# ifdef WITH_PAM
if ( ! lp_pam_password_change ( ) ) {
# endif
2012-07-18 09:37:23 +04:00
if ( ( lp_passwd_program ( talloc_tos ( ) ) = = NULL ) | |
( strlen ( lp_passwd_program ( talloc_tos ( ) ) ) = = 0 ) )
2008-03-18 17:49:31 +03:00
{
2013-11-04 15:32:45 +04:00
fprintf ( stderr ,
" ERROR: the 'unix password sync' "
" parameter is set and there is no valid "
" 'passwd program' parameter. \n \n " ) ;
1999-12-13 16:27:58 +03:00
ret = 1 ;
2001-05-10 10:53:19 +04:00
} else {
2007-12-04 05:48:41 +03:00
const char * passwd_prog ;
char * truncated_prog = NULL ;
2002-11-13 02:20:50 +03:00
const char * p ;
2001-05-10 10:53:19 +04:00
2012-07-18 09:37:23 +04:00
passwd_prog = lp_passwd_program ( talloc_tos ( ) ) ;
2001-05-10 10:53:19 +04:00
p = passwd_prog ;
2007-12-04 05:48:41 +03:00
next_token_talloc ( talloc_tos ( ) ,
& p ,
& truncated_prog , NULL ) ;
if ( truncated_prog & & access ( truncated_prog , F_OK ) = = - 1 ) {
2013-11-04 15:32:45 +04:00
fprintf ( stderr ,
" ERROR: the 'unix password sync' "
" parameter is set and the "
" 'passwd program' (%s) cannot be "
" executed (error was %s). \n \n " ,
truncated_prog ,
strerror ( errno ) ) ;
2001-05-10 10:53:19 +04:00
ret = 1 ;
}
2008-03-18 17:33:25 +03:00
}
2001-05-10 10:53:19 +04:00
# ifdef WITH_PAM
1999-12-13 16:27:58 +03:00
}
2001-05-10 10:53:19 +04:00
# endif
1999-12-13 16:27:58 +03:00
2012-07-18 09:37:23 +04:00
if ( lp_passwd_chat ( talloc_tos ( ) ) = = NULL ) {
2013-11-04 15:32:45 +04:00
fprintf ( stderr ,
" ERROR: the 'unix password sync' parameter is "
" set and there is no valid 'passwd chat' "
" parameter. \n \n " ) ;
1999-12-13 16:27:58 +03:00
ret = 1 ;
2008-03-18 17:50:27 +03:00
}
2012-07-18 09:37:23 +04:00
if ( ( lp_passwd_program ( talloc_tos ( ) ) ! = NULL ) & &
( strlen ( lp_passwd_program ( talloc_tos ( ) ) ) > 0 ) )
2008-03-18 17:50:27 +03:00
{
/* check if there's a %u parameter present */
2012-07-18 09:37:23 +04:00
if ( strstr_m ( lp_passwd_program ( talloc_tos ( ) ) , " %u " ) = = NULL ) {
2013-11-04 15:32:45 +04:00
fprintf ( stderr ,
" ERROR: the 'passwd program' (%s) "
" requires a '%%u' parameter. \n \n " ,
lp_passwd_program ( talloc_tos ( ) ) ) ;
2008-03-18 17:50:27 +03:00
ret = 1 ;
}
1999-12-13 16:27:58 +03:00
}
/*
* Check that we have a valid script and that it hasn ' t
* been written to expect the old password .
*/
if ( lp_encrypted_passwords ( ) ) {
2012-07-18 09:37:23 +04:00
if ( strstr_m ( lp_passwd_chat ( talloc_tos ( ) ) , " %o " ) ! = NULL ) {
2013-11-04 15:32:45 +04:00
fprintf ( stderr ,
" ERROR: the 'passwd chat' script [%s] "
" expects to use the old plaintext "
" password via the %%o substitution. With "
" encrypted passwords this is not "
" possible. \n \n " ,
lp_passwd_chat ( talloc_tos ( ) ) ) ;
1999-12-13 16:27:58 +03:00
ret = 1 ;
}
}
}
2002-04-14 16:20:10 +04:00
if ( strlen ( lp_winbind_separator ( ) ) ! = 1 ) {
2013-11-04 15:32:45 +04:00
fprintf ( stderr , " ERROR: the 'winbind separator' parameter must "
" be a single character. \n \n " ) ;
2002-04-14 16:20:10 +04:00
ret = 1 ;
}
if ( * lp_winbind_separator ( ) = = ' + ' ) {
2013-11-04 15:32:45 +04:00
fprintf ( stderr , " 'winbind separator = +' might cause problems "
" with group membership. \n \n " ) ;
2002-04-14 16:20:10 +04:00
}
2002-11-05 10:20:27 +03:00
if ( lp_algorithmic_rid_base ( ) < BASE_RID ) {
/* Try to prevent admin foot-shooting, we can't put algorithmic
rids below 1000 , that ' s the ' well known RIDs ' on NT */
2013-11-04 15:32:45 +04:00
fprintf ( stderr , " 'algorithmic rid base' must be equal to or "
" above %lu \n \n " , BASE_RID ) ;
2002-11-05 10:20:27 +03:00
}
if ( lp_algorithmic_rid_base ( ) & 1 ) {
2013-11-04 15:32:45 +04:00
fprintf ( stderr , " 'algorithmic rid base' must be even. \n \n " ) ;
2002-11-05 10:20:27 +03:00
}
2003-04-15 02:23:02 +04:00
# ifndef HAVE_DLOPEN
2003-04-15 20:01:14 +04:00
if ( lp_preload_modules ( ) ) {
2013-11-04 15:32:45 +04:00
fprintf ( stderr , " WARNING: 'preload modules = ' set while loading "
" plugins not supported. \n \n " ) ;
2003-04-15 20:01:14 +04:00
}
2003-04-15 02:23:02 +04:00
# endif
2003-04-15 20:01:14 +04:00
2003-06-20 21:41:04 +04:00
if ( ! lp_passdb_backend ( ) ) {
2013-11-04 15:32:45 +04:00
fprintf ( stderr , " ERROR: passdb backend must have a value or be "
" left out \n \n " ) ;
2003-06-20 21:41:04 +04:00
}
2007-09-04 17:21:24 +04:00
if ( lp_os_level ( ) > 255 ) {
2013-11-04 15:32:45 +04:00
fprintf ( stderr , " WARNING: Maximum value for 'os level' is "
" 255! \n \n " ) ;
2007-09-04 17:21:24 +04:00
}
2003-06-20 21:41:04 +04:00
2011-05-18 05:51:37 +04:00
if ( strequal ( lp_dos_charset ( ) , " UTF8 " ) | | strequal ( lp_dos_charset ( ) , " UTF-8 " ) ) {
2013-11-04 15:32:45 +04:00
fprintf ( stderr , " ERROR: 'dos charset' must not be UTF8 \n \n " ) ;
2011-05-18 05:51:37 +04:00
ret = 1 ;
}
1999-12-13 16:27:58 +03:00
return ret ;
1998-05-22 05:51:14 +04:00
}
2008-07-15 15:01:54 +04:00
/**
* per - share logic tests
*/
static void do_per_share_checks ( int s )
{
2014-02-02 17:21:12 +04:00
const char * * deny_list = lp_hosts_deny ( s ) ;
2014-02-02 17:14:09 +04:00
const char * * allow_list = lp_hosts_allow ( s ) ;
2008-07-15 15:01:54 +04:00
int i ;
if ( deny_list ) {
for ( i = 0 ; deny_list [ i ] ; i + + ) {
char * hasstar = strchr_m ( deny_list [ i ] , ' * ' ) ;
char * hasquery = strchr_m ( deny_list [ i ] , ' ? ' ) ;
if ( hasstar | | hasquery ) {
2013-11-04 15:32:45 +04:00
fprintf ( stderr ,
" Invalid character %c in hosts deny list "
" (%s) for service %s. \n \n " ,
hasstar ? * hasstar : * hasquery ,
deny_list [ i ] ,
lp_servicename ( talloc_tos ( ) , s ) ) ;
2008-07-15 15:01:54 +04:00
}
}
}
if ( allow_list ) {
for ( i = 0 ; allow_list [ i ] ; i + + ) {
char * hasstar = strchr_m ( allow_list [ i ] , ' * ' ) ;
char * hasquery = strchr_m ( allow_list [ i ] , ' ? ' ) ;
if ( hasstar | | hasquery ) {
2013-11-04 15:32:45 +04:00
fprintf ( stderr ,
" Invalid character %c in hosts allow "
" list (%s) for service %s. \n \n " ,
hasstar ? * hasstar : * hasquery ,
allow_list [ i ] ,
lp_servicename ( talloc_tos ( ) , s ) ) ;
2008-07-15 15:01:54 +04:00
}
}
}
if ( lp_level2_oplocks ( s ) & & ! lp_oplocks ( s ) ) {
2013-11-04 15:32:45 +04:00
fprintf ( stderr , " Invalid combination of parameters for service "
" %s. Level II oplocks can only be set if oplocks "
" are also set. \n \n " ,
lp_servicename ( talloc_tos ( ) , s ) ) ;
2008-07-15 15:01:54 +04:00
}
2011-07-06 17:10:27 +04:00
if ( ! lp_store_dos_attributes ( s ) & & lp_map_hidden ( s )
& & ! ( lp_create_mask ( s ) & S_IXOTH ) )
{
2013-11-04 15:32:45 +04:00
fprintf ( stderr ,
" Invalid combination of parameters for service %s. Map "
" hidden can only work if create mask includes octal "
" 01 (S_IXOTH). \n \n " ,
lp_servicename ( talloc_tos ( ) , s ) ) ;
2008-07-15 15:01:54 +04:00
}
2011-07-06 17:10:27 +04:00
if ( ! lp_store_dos_attributes ( s ) & & lp_map_hidden ( s )
& & ( lp_force_create_mode ( s ) & S_IXOTH ) )
{
2013-11-04 15:32:45 +04:00
fprintf ( stderr ,
" Invalid combination of parameters for service "
2011-07-06 17:10:27 +04:00
" %s. Map hidden can only work if force create mode "
2013-11-04 15:32:45 +04:00
" excludes octal 01 (S_IXOTH). \n \n " ,
lp_servicename ( talloc_tos ( ) , s ) ) ;
2008-07-15 15:01:54 +04:00
}
2011-07-06 17:10:27 +04:00
if ( ! lp_store_dos_attributes ( s ) & & lp_map_system ( s )
& & ! ( lp_create_mask ( s ) & S_IXGRP ) )
{
2013-11-04 15:32:45 +04:00
fprintf ( stderr ,
" Invalid combination of parameters for service "
2011-07-06 17:10:27 +04:00
" %s. Map system can only work if create mask includes "
2013-11-04 15:32:45 +04:00
" octal 010 (S_IXGRP). \n \n " ,
lp_servicename ( talloc_tos ( ) , s ) ) ;
2008-07-15 15:01:54 +04:00
}
2011-07-06 17:10:27 +04:00
if ( ! lp_store_dos_attributes ( s ) & & lp_map_system ( s )
& & ( lp_force_create_mode ( s ) & S_IXGRP ) )
{
2013-11-04 15:32:45 +04:00
fprintf ( stderr ,
" Invalid combination of parameters for service "
2011-07-06 17:10:27 +04:00
" %s. Map system can only work if force create mode "
2013-11-04 15:32:45 +04:00
" excludes octal 010 (S_IXGRP). \n \n " ,
lp_servicename ( talloc_tos ( ) , s ) ) ;
2008-07-15 15:01:54 +04:00
}
2014-02-04 06:09:07 +04:00
if ( lp_printing ( s ) = = PRINT_CUPS & & * ( lp_print_command ( talloc_tos ( ) , s ) ) ! = ' \0 ' ) {
2013-11-04 15:32:45 +04:00
fprintf ( stderr ,
" Warning: Service %s defines a print command, but "
" parameter is ignored when using CUPS libraries. \n \n " ,
lp_servicename ( talloc_tos ( ) , s ) ) ;
2008-07-15 15:01:54 +04:00
}
}
2003-04-14 07:59:04 +04:00
int main ( int argc , const char * argv [ ] )
1999-12-13 16:27:58 +03:00
{
2007-12-10 22:30:37 +03:00
const char * config_file = get_dyn_CONFIGFILE ( ) ;
2002-07-15 14:35:28 +04:00
int s ;
2007-10-19 22:38:36 +04:00
static int silent_mode = False ;
static int show_all_parameters = False ;
2002-07-15 14:35:28 +04:00
int ret = 0 ;
poptContext pc ;
2005-06-12 20:00:29 +04:00
static char * parameter_name = NULL ;
2005-09-30 21:13:37 +04:00
static const char * section_name = NULL ;
2002-07-15 14:35:28 +04:00
const char * cname ;
const char * caddr ;
2002-09-25 19:19:00 +04:00
static int show_defaults ;
2008-07-15 14:52:25 +04:00
static int skip_logic_checks = 0 ;
1999-12-13 16:27:58 +03:00
2002-07-15 14:35:28 +04:00
struct poptOption long_options [ ] = {
POPT_AUTOHELP
{ " suppress-prompt " , ' s ' , POPT_ARG_VAL , & silent_mode , 1 , " Suppress prompt for enter " } ,
2002-09-25 19:19:00 +04:00
{ " verbose " , ' v ' , POPT_ARG_NONE , & show_defaults , 1 , " Show default options too " } ,
2008-07-15 14:52:25 +04:00
{ " skip-logic-checks " , ' l ' , POPT_ARG_NONE , & skip_logic_checks , 1 , " Skip the global checks " } ,
2005-06-12 20:00:29 +04:00
{ " show-all-parameters " , ' \0 ' , POPT_ARG_VAL , & show_all_parameters , True , " Show the parameters, type, possible values " } ,
{ " parameter-name " , ' \0 ' , POPT_ARG_STRING , & parameter_name , 0 , " Limit testparm to a named parameter " } ,
{ " section-name " , ' \0 ' , POPT_ARG_STRING , & section_name , 0 , " Limit testparm to a named section " } ,
2003-04-14 07:59:04 +04:00
POPT_COMMON_VERSION
2008-07-15 13:26:43 +04:00
POPT_COMMON_DEBUGLEVEL
2011-02-09 15:45:22 +03:00
POPT_COMMON_OPTION
2003-04-14 07:59:04 +04:00
POPT_TABLEEND
2002-07-15 14:35:28 +04:00
} ;
1999-12-13 16:27:58 +03:00
2007-08-31 13:15:57 +04:00
TALLOC_CTX * frame = talloc_stackframe ( ) ;
2005-12-29 01:48:54 +03:00
load_case_tables ( ) ;
2008-07-15 13:26:43 +04:00
/*
* Set the default debug level to 2.
* Allow it to be overridden by the command line ,
* not by smb . conf .
*/
2010-10-29 08:06:36 +04:00
lp_set_cmdline ( " log level " , " 2 " ) ;
2005-12-29 01:48:54 +03:00
2002-09-25 19:19:00 +04:00
pc = poptGetContext ( NULL , argc , argv , long_options ,
POPT_CONTEXT_KEEP_FIRST ) ;
2002-11-09 19:57:45 +03:00
poptSetOtherOptionHelp ( pc , " [OPTION...] <config-file> [host-name] [host-ip] " ) ;
2002-07-15 14:35:28 +04:00
2003-04-14 07:59:04 +04:00
while ( poptGetNextOpt ( pc ) ! = - 1 ) ;
2002-07-15 14:35:28 +04:00
2005-06-12 20:00:29 +04:00
if ( show_all_parameters ) {
show_parameter_list ( ) ;
exit ( 0 ) ;
}
2010-10-29 07:19:32 +04:00
setup_logging ( poptGetArg ( pc ) , DEBUG_STDERR ) ;
2002-07-15 14:35:28 +04:00
if ( poptPeekArg ( pc ) )
config_file = poptGetArg ( pc ) ;
cname = poptGetArg ( pc ) ;
caddr = poptGetArg ( pc ) ;
2003-09-29 06:39:41 +04:00
2008-09-28 00:10:05 +04:00
poptFreeContext ( pc ) ;
2003-09-29 06:39:41 +04:00
if ( cname & & ! caddr ) {
printf ( " ERROR: You must specify both a machine name and an IP address. \n " ) ;
2008-09-28 00:10:44 +04:00
ret = 1 ;
goto done ;
2003-09-29 06:39:41 +04:00
}
2003-10-20 08:51:40 +04:00
fprintf ( stderr , " Load smb config files from %s \n " , config_file ) ;
2002-07-15 14:35:28 +04:00
2008-05-15 04:41:05 +04:00
if ( ! lp_load_with_registry_shares ( config_file , False , True , False , True ) ) {
2003-10-20 08:51:40 +04:00
fprintf ( stderr , " Error loading services. \n " ) ;
2008-09-28 00:10:44 +04:00
ret = 1 ;
goto done ;
2002-07-15 14:35:28 +04:00
}
2003-10-20 08:51:40 +04:00
fprintf ( stderr , " Loaded services file OK. \n " ) ;
2002-07-15 14:35:28 +04:00
2008-07-15 14:52:25 +04:00
if ( skip_logic_checks = = 0 ) {
2008-07-15 02:17:58 +04:00
ret = do_global_checks ( ) ;
}
2002-07-15 14:35:28 +04:00
for ( s = 0 ; s < 1000 ; s + + ) {
if ( VALID_SNUM ( s ) )
2012-07-18 09:37:23 +04:00
if ( strlen ( lp_servicename ( talloc_tos ( ) , s ) ) > 12 ) {
2003-10-20 08:51:40 +04:00
fprintf ( stderr , " WARNING: You have some share names that are longer than 12 characters. \n " ) ;
fprintf ( stderr , " These may not be accessible to some older clients. \n " ) ;
fprintf ( stderr , " (Eg. Windows9x, WindowsMe, and smbclient prior to Samba 3.0.) \n " ) ;
2002-07-15 14:35:28 +04:00
break ;
}
}
for ( s = 0 ; s < 1000 ; s + + ) {
2008-07-15 14:55:57 +04:00
if ( VALID_SNUM ( s ) & & ( skip_logic_checks = = 0 ) ) {
2008-07-15 15:01:54 +04:00
do_per_share_checks ( s ) ;
2002-07-15 14:35:28 +04:00
}
}
2003-02-21 01:09:54 +03:00
2006-01-25 18:43:15 +03:00
if ( ! section_name & & ! parameter_name ) {
2013-11-04 15:32:45 +04:00
fprintf ( stderr ,
" Server role: %s \n \n " ,
server_role_str ( lp_server_role ( ) ) ) ;
2003-02-21 01:09:54 +03:00
}
2002-07-15 14:35:28 +04:00
if ( ! cname ) {
if ( ! silent_mode ) {
2003-10-20 08:51:40 +04:00
fprintf ( stderr , " Press enter to see a dump of your service definitions \n " ) ;
2002-07-15 14:35:28 +04:00
fflush ( stdout ) ;
getc ( stdin ) ;
}
2005-06-12 20:00:29 +04:00
if ( parameter_name | | section_name ) {
2007-10-19 04:40:25 +04:00
bool isGlobal = False ;
2005-06-12 20:00:29 +04:00
s = GLOBAL_SECTION_SNUM ;
if ( ! section_name ) {
section_name = GLOBAL_NAME ;
isGlobal = True ;
} else if ( ( isGlobal = ! strwicmp ( section_name , GLOBAL_NAME ) ) = = 0 & &
( s = lp_servicenumber ( section_name ) ) = = - 1 ) {
fprintf ( stderr , " Unknown section %s \n " ,
section_name ) ;
2008-09-28 00:10:44 +04:00
ret = 1 ;
goto done ;
2005-06-12 20:00:29 +04:00
}
if ( parameter_name ) {
if ( ! dump_a_parameter ( s , parameter_name , stdout , isGlobal ) ) {
fprintf ( stderr , " Parameter %s unknown for section %s \n " ,
parameter_name , section_name ) ;
2008-09-28 00:10:44 +04:00
ret = 1 ;
goto done ;
2005-06-12 20:00:29 +04:00
}
} else {
if ( isGlobal = = True )
lp_dump ( stdout , show_defaults , 0 ) ;
else
lp_dump_one ( stdout , show_defaults , s ) ;
}
2008-09-28 00:10:44 +04:00
goto done ;
2005-06-12 20:00:29 +04:00
}
2002-09-25 19:19:00 +04:00
lp_dump ( stdout , show_defaults , lp_numservices ( ) ) ;
2002-07-15 14:35:28 +04:00
}
if ( cname & & caddr ) {
/* this is totally ugly, a real `quick' hack */
for ( s = 0 ; s < 1000 ; s + + ) {
2003-09-29 06:39:41 +04:00
if ( VALID_SNUM ( s ) ) {
2014-02-02 17:21:12 +04:00
if ( allow_access ( lp_hosts_deny ( - 1 ) , lp_hosts_allow ( - 1 ) , cname , caddr )
& & allow_access ( lp_hosts_deny ( s ) , lp_hosts_allow ( s ) , cname , caddr ) ) {
2003-10-20 08:51:40 +04:00
fprintf ( stderr , " Allow connection from %s (%s) to %s \n " ,
2012-07-18 09:37:23 +04:00
cname , caddr , lp_servicename ( talloc_tos ( ) , s ) ) ;
2002-07-15 14:35:28 +04:00
} else {
2003-10-20 08:51:40 +04:00
fprintf ( stderr , " Deny connection from %s (%s) to %s \n " ,
2012-07-18 09:37:23 +04:00
cname , caddr , lp_servicename ( talloc_tos ( ) , s ) ) ;
2002-07-15 14:35:28 +04:00
}
}
}
}
2008-09-28 00:10:44 +04:00
done :
gfree_loadparm ( ) ;
2008-10-18 16:51:25 +04:00
TALLOC_FREE ( frame ) ;
2008-09-28 00:10:44 +04:00
return ret ;
1996-05-04 11:50:46 +04:00
}
2004-10-06 02:18:32 +04:00