Beispiel #1
0
/*
 * 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;
}
Beispiel #2
0
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;
};