/* * main(): server's main function * * returns: 0 for SUCCESS, non-zero for ERROR * */ int main (int argc, char **argv) { char *binary_name; int ret_val; #if !defined(WINDOWS) sigset_t sigurg_mask; #endif #if defined(WINDOWS) FreeConsole (); __try { #else /* WINDOWS */ register_fatal_signal_handler (SIGABRT); register_fatal_signal_handler (SIGILL); register_fatal_signal_handler (SIGFPE); register_fatal_signal_handler (SIGBUS); register_fatal_signal_handler (SIGSEGV); register_fatal_signal_handler (SIGSYS); #endif /* WINDOWS */ #if !defined(WINDOWS) /* Block SIGURG signal except oob-handler thread */ sigemptyset (&sigurg_mask); sigaddset (&sigurg_mask, SIGURG); sigprocmask (SIG_BLOCK, &sigurg_mask, NULL); #endif /* !WINDOWS */ if (argc < 2) { fprintf (stderr, "Usage: server databasename\n"); return 1; } fprintf (stdout, "\nThis may take a long time depending on the amount " "of recovery works to do.\n"); /* save executable path */ binary_name = basename (argv[0]); (void) envvar_bindir_file (executable_path, PATH_MAX, binary_name); /* save database name */ database_name = argv[1]; #if !defined(WINDOWS) hb_set_exec_path (executable_path); hb_set_argv (argv); /* create a new session */ setsid (); #endif ret_val = net_server_start (database_name); #if defined(WINDOWS) } __except (CreateMiniDump (GetExceptionInformation (), argv[1])) { } #endif return ret_val; }
int main(int argc, char *argv[]) { char stdin_mode=0; char detach_after_net=0; int option_char; char *config_filename=SYSCONFDIR "/" PACKAGE_NAME ".conf"; cwd_fd = open(".", O_RDONLY, 0); if(cwd_fd<0) { syslog(LOG_ERR, "Can't find the CWD"); exit( 1); } while( ( option_char=getopt(argc, argv, "f:hsD") )!=-1) { switch(option_char) { case 'f': config_filename=optarg; break; case 's': stdin_mode=1; break; case 'h': printf("%s\n", HELP_STRING); return 0; case 'D': detach_after_net=1; break; } } openlog(PACKAGE_NAME, LOG_PERROR|LOG_PID, LOG_MAIL); if(!parse_conffile(config_filename)) { syslog(LOG_ERR, "Couldn't open config file '%s'", config_filename); exit( 1); } if(pidfile[0]) { int pidfile_d=open(pidfile, O_WRONLY|O_CREAT|O_EXCL, 0666); if(pidfile_d<0) { syslog(LOG_ERR, "Couldn't create PID file '%s'", pidfile); exit( 1); } FILE *pidfile_p=fdopen(pidfile_d, "w"); pid_t my_pid=getpid(); fprintf(pidfile_p, "%u", my_pid); fclose(pidfile_p); } signal(SIGTERM, just_exit_please); signal(SIGINT, just_exit_please); signal(SIGPIPE, just_exit_please); atexit(remove_pidfile); auth_hookup(NULL); storage_hookup(NULL); if(stdin_mode) { if((!_auth_need_root()) && (_storage_need_user()==wuAny)) drop_privs(); handle_connection(stdin, stdout); exit( 0); } else { if(detach_after_net) { real_master_pid=fork(); if(real_master_pid<0) { syslog(LOG_ERR, "Couldn't fork"); exit( 2); } if(!real_master_pid) { // child exit( net_server_start((!_auth_need_root()) && (_storage_need_user()==wuAny), 1)); } else { sleep(5); // Give enough time to see if the net start worked. int status; if(wait4(real_master_pid, &status, WNOHANG, NULL)!=0) { if(WIFEXITED(status)) { exit( WEXITSTATUS(status)); } else exit( 0); } exit( 0); } } else { exit( net_server_start((!_auth_need_root()) && (_storage_need_user()==wuAny), 0)); } } exit(1); return 1; };