2003-08-13 05:53:07 +04:00
/*
Unix SMB / CIFS implementation .
2005-01-30 03:54:57 +03:00
2003-08-13 05:53:07 +04:00
Main SMB server routines
2005-01-30 03:54:57 +03:00
Copyright ( C ) Andrew Tridgell 1992 - 2005
2003-08-13 05:53:07 +04:00
Copyright ( C ) Martin Pool 2002
Copyright ( C ) Jelmer Vernooij 2002
Copyright ( C ) James J Myers 2003 < myersjj @ samba . org >
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 2 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 , write to the Free Software
Foundation , Inc . , 675 Mass Ave , Cambridge , MA 0213 9 , USA .
*/
# include "includes.h"
2005-02-03 14:56:03 +03:00
# include "lib/events/events.h"
2005-01-18 13:10:35 +03:00
# include "version.h"
2005-01-30 03:54:57 +03:00
# include "dynconfig.h"
2004-11-02 05:57:18 +03:00
# include "lib/cmdline/popt_common.h"
2005-01-30 03:54:57 +03:00
# include "system/dir.h"
2003-08-13 05:53:07 +04:00
2005-01-30 03:54:57 +03:00
/*
cleanup temporary files . This is the new alternative to
TDB_CLEAR_IF_FIRST . Unfortunately TDB_CLEAR_IF_FIRST is not
efficient on unix systems due to the lack of scaling of the byte
range locking system . So instead of putting the burden on tdb to
cleanup tmp files , this function deletes them .
*/
static void cleanup_tmp_files ( void )
2003-08-13 05:53:07 +04:00
{
2005-01-30 03:54:57 +03:00
char * path ;
DIR * dir ;
struct dirent * de ;
TALLOC_CTX * mem_ctx = talloc_new ( NULL ) ;
path = smbd_tmp_path ( mem_ctx , NULL ) ;
2003-08-13 05:53:07 +04:00
2005-01-30 03:54:57 +03:00
dir = opendir ( path ) ;
if ( ! dir ) {
talloc_free ( mem_ctx ) ;
return ;
2003-08-13 05:53:07 +04:00
}
2005-01-30 03:54:57 +03:00
for ( de = readdir ( dir ) ; de ; de = readdir ( dir ) ) {
char * fname = talloc_asprintf ( mem_ctx , " %s/%s " , path , de - > d_name ) ;
int ret = unlink ( fname ) ;
if ( ret = = - 1 & &
errno ! = ENOENT & &
errno ! = EISDIR & &
errno ! = EISDIR ) {
DEBUG ( 0 , ( " Unabled to delete '%s' - %s \n " ,
fname , strerror ( errno ) ) ) ;
smb_panic ( " unable to cleanup tmp files " ) ;
}
talloc_free ( fname ) ;
2003-08-13 05:53:07 +04:00
}
2005-01-30 03:54:57 +03:00
closedir ( dir ) ;
talloc_free ( mem_ctx ) ;
}
2003-08-13 05:53:07 +04:00
2005-01-30 03:54:57 +03:00
/*
setup signal masks
*/
static void setup_signals ( void )
{
2005-01-14 04:32:56 +03:00
fault_setup ( NULL ) ;
2003-08-13 05:53:07 +04:00
/* we are never interested in SIGPIPE */
BlockSignals ( True , SIGPIPE ) ;
# if defined(SIGFPE)
/* we are never interested in SIGFPE */
BlockSignals ( True , SIGFPE ) ;
# endif
# if defined(SIGUSR2)
/* We are no longer interested in USR2 */
BlockSignals ( True , SIGUSR2 ) ;
# endif
/* POSIX demands that signals are inherited. If the invoking process has
* these signals masked , we will have problems , as we won ' t recieve them . */
BlockSignals ( False , SIGHUP ) ;
BlockSignals ( False , SIGUSR1 ) ;
BlockSignals ( False , SIGTERM ) ;
2005-01-30 03:54:57 +03:00
}
/*
main server .
*/
static int binary_smbd_main ( int argc , const char * argv [ ] )
{
BOOL interactive = False ;
int opt ;
poptContext pc ;
struct event_context * event_ctx ;
NTSTATUS status ;
const char * model = " standard " ;
struct poptOption long_options [ ] = {
POPT_AUTOHELP
POPT_COMMON_SAMBA
{ " interactive " , ' i ' , POPT_ARG_VAL , & interactive , True ,
" Run interactive (not a daemon) " , NULL } ,
{ " model " , ' M ' , POPT_ARG_STRING , & model , True ,
" Select process model " , " MODEL " } ,
POPT_COMMON_VERSION
POPT_TABLEEND
} ;
pc = poptGetContext ( " smbd " , argc , argv , long_options , 0 ) ;
while ( ( opt = poptGetNextOpt ( pc ) ) ! = - 1 ) /* noop */ ;
poptFreeContext ( pc ) ;
setup_logging ( argv [ 0 ] , interactive ? DEBUG_STDOUT : DEBUG_FILE ) ;
setup_signals ( ) ;
2003-08-13 05:53:07 +04:00
/* we want total control over the permissions on created files,
so set our umask to 0 */
umask ( 0 ) ;
reopen_logs ( ) ;
2004-01-28 15:47:52 +03:00
DEBUG ( 0 , ( " smbd version %s started. \n " , SAMBA_VERSION_STRING ) ) ;
2005-01-14 04:32:56 +03:00
DEBUGADD ( 0 , ( " Copyright Andrew Tridgell and the Samba Team 1992-2005 \n " ) ) ;
2003-08-13 05:53:07 +04:00
2004-07-14 01:04:56 +04:00
if ( sizeof ( uint16_t ) < 2 | | sizeof ( uint32_t ) < 4 | | sizeof ( uint64_t ) < 8 ) {
2003-08-13 05:53:07 +04:00
DEBUG ( 0 , ( " ERROR: Samba is not configured correctly for the word size on your machine \n " ) ) ;
exit ( 1 ) ;
}
2004-07-14 01:04:56 +04:00
2005-01-30 03:54:57 +03:00
lp_load ( dyn_CONFIGFILE , False , False , True ) ;
2003-08-13 05:53:07 +04:00
2005-01-30 03:54:57 +03:00
reopen_logs ( ) ;
load_interfaces ( ) ;
2003-08-13 05:53:07 +04:00
2005-01-30 03:54:57 +03:00
if ( ! interactive ) {
2003-08-13 05:53:07 +04:00
DEBUG ( 3 , ( " Becoming a daemon. \n " ) ) ;
2005-01-30 03:54:57 +03:00
become_daemon ( True ) ;
2003-08-13 05:53:07 +04:00
}
2005-01-30 03:54:57 +03:00
cleanup_tmp_files ( ) ;
2003-08-13 05:53:07 +04:00
if ( ! directory_exist ( lp_lockdir ( ) , NULL ) ) {
mkdir ( lp_lockdir ( ) , 0755 ) ;
}
2005-01-30 03:54:57 +03:00
pidfile_create ( " smbd " ) ;
/* Do *not* remove this, until you have removed
* passdb / secrets . c , and proved that Samba still builds . . . */
/* Setup the SECRETS subsystem */
if ( ! secrets_init ( ) ) {
exit ( 1 ) ;
2003-08-13 05:53:07 +04:00
}
2005-01-30 03:54:57 +03:00
smbd_init_subsystems ;
2004-04-19 15:21:50 +04:00
2005-01-30 03:54:57 +03:00
/* the event context is the top level structure in smbd. Everything else
should hang off that */
event_ctx = event_context_init ( NULL ) ;
2005-01-14 04:32:56 +03:00
2004-07-14 01:04:56 +04:00
DEBUG ( 0 , ( " Using %s process model \n " , model ) ) ;
2005-01-30 03:54:57 +03:00
status = server_service_startup ( event_ctx , model , lp_server_services ( ) ) ;
if ( ! NT_STATUS_IS_OK ( status ) ) {
DEBUG ( 0 , ( " Starting Services failed - %s \n " , nt_errstr ( status ) ) ) ;
2004-07-14 01:04:56 +04:00
return 1 ;
}
2003-08-13 05:53:07 +04:00
2005-01-30 03:54:57 +03:00
/* wait for events - this is where smbd sits for most of its
life */
event_loop_wait ( event_ctx ) ;
2005-01-14 04:32:56 +03:00
2005-01-30 03:54:57 +03:00
/* as everything hangs off this event context, freeing it
should initiate a clean shutdown of all services */
talloc_free ( event_ctx ) ;
2005-01-14 04:32:56 +03:00
return 0 ;
2004-07-14 01:04:56 +04:00
}
int main ( int argc , const char * argv [ ] )
{
return binary_smbd_main ( argc , argv ) ;
2003-08-13 05:53:07 +04:00
}