+ } /* -END- while (more arguments) */
+
+#if defined(unix)
+ if ( *configfile != '/' )
+ {
+ char *abs_file;
+
+ /* make config-filename absolute here */
+ if ( !(basedir = getcwd( NULL, 1024 )))
+ {
+ perror("get working dir failed");
+ exit( 1 );
+ }
+
+ if ( !(abs_file = malloc( strlen( basedir ) + strlen( configfile ) + 5 )))
+ {
+ perror("malloc failed");
+ exit( 1 );
+ }
+ strcpy( abs_file, basedir );
+ strcat( abs_file, "/" );
+ strcat( abs_file, configfile );
+ configfile = abs_file;
+ }
+#endif /* defined unix */
+
+
+ files->next = NULL;
+
+#ifdef AMIGA
+ InitAmiga();
+#elif defined(_WIN32)
+ InitWin32();
+#endif
+
+ /*
+ * Unix signal handling
+ *
+ * Catch the abort, interrupt and terminate signals for a graceful exit
+ * Catch the hangup signal so the errlog can be reopened.
+ * Ignore the broken pipe and child signals
+ * FIXME: Isn't ignoring the default for SIGCHLD anyway and why ignore SIGPIPE?
+ */
+#if !defined(_WIN32) && !defined(__OS2__) && !defined(AMIGA)
+{
+ int idx;
+ const int catched_signals[] = { SIGABRT, SIGTERM, SIGINT, SIGHUP, 0 };
+ const int ignored_signals[] = { SIGPIPE, SIGCHLD, 0 };
+
+ for (idx = 0; catched_signals[idx] != 0; idx++)
+ {
+ if (signal(catched_signals[idx], sig_handler) == SIG_ERR)
+ {
+ log_error(LOG_LEVEL_FATAL, "Can't set signal-handler for signal %d: %E", catched_signals[idx]);
+ }
+ }
+
+ for (idx = 0; ignored_signals[idx] != 0; idx++)
+ {
+ if (signal(ignored_signals[idx], SIG_IGN) == SIG_ERR)
+ {
+ log_error(LOG_LEVEL_FATAL, "Can't set ignore-handler for signal %d: %E", ignored_signals[idx]);
+ }
+ }
+
+}
+#else /* ifdef _WIN32 */
+# ifdef _WIN_CONSOLE
+ /*
+ * We *are* in a windows console app.
+ * Print a verbose messages about FAQ's and such
+ */
+ printf(win32_blurb);
+# endif /* def _WIN_CONSOLE */
+#endif /* def _WIN32 */
+
+
+ /* Initialize the CGI subsystem */
+ cgi_init_error_messages();
+
+ /*
+ * If runnig on unix and without the --nodaemon
+ * option, become a daemon. I.e. fork, detach
+ * from tty and get process group leadership
+ */
+#if defined(unix)
+{
+ pid_t pid = 0;
+#if 0
+ int fd;
+#endif
+
+ if (!no_daemon)
+ {
+ pid = fork();
+
+ if ( pid < 0 ) /* error */
+ {
+ perror("fork");
+ exit( 3 );
+ }
+ else if ( pid != 0 ) /* parent */
+ {
+ int status;
+ pid_t wpid;
+ /*
+ * must check for errors
+ * child died due to missing files aso
+ */
+ sleep( 1 );
+ wpid = waitpid( pid, &status, WNOHANG );
+ if ( wpid != 0 )
+ {
+ exit( 1 );
+ }
+ exit( 0 );
+ }
+ /* child */
+#if 1
+ /* Should be more portable, but not as well tested */
+ setsid();
+#else /* !1 */
+#ifdef __FreeBSD__
+ setpgrp(0,0);
+#else /* ndef __FreeBSD__ */
+ setpgrp();
+#endif /* ndef __FreeBSD__ */
+ fd = open("/dev/tty", O_RDONLY);
+ if ( fd )
+ {
+ /* no error check here */
+ ioctl( fd, TIOCNOTTY,0 );
+ close ( fd );
+ }
+#endif /* 1 */
+ /* FIXME: should close stderr (fd 2) here too, but the test
+ * for existence
+ * and load config file is done in listen_loop() and puts
+ * some messages on stderr there.
+ */
+
+ close( 0 );
+ close( 1 );
+ chdir("/");
+
+ } /* -END- if (!no_daemon) */
+
+ /*
+ * As soon as we have written the PID file, we can switch
+ * to the user and group ID indicated by the --user option
+ */
+ write_pid_file();
+
+ if (NULL != pw)
+ {
+ if (((NULL != grp) && setgid(grp->gr_gid)) || (setgid(pw->pw_gid)))
+ {
+ log_error(LOG_LEVEL_FATAL, "Cannot setgid(): Insufficient permissions.");
+ }
+ if (setuid(pw->pw_uid))
+ {
+ log_error(LOG_LEVEL_FATAL, "Cannot setuid(): Insufficient permissions.");
+ }
+ }
+}
+#endif /* defined unix */
+
+ listen_loop();
+
+ /* NOTREACHED */
+ return(-1);
+
+}
+
+
+/*********************************************************************
+ *
+ * Function : bind_port_helper
+ *
+ * Description : Bind the listen port. Handles logging, and aborts
+ * on failure.
+ *
+ * Parameters :
+ * 1 : config = Privoxy configuration. Specifies port
+ * to bind to.
+ *
+ * Returns : Port that was opened.
+ *
+ *********************************************************************/
+static jb_socket bind_port_helper(struct configuration_spec * config)
+{
+ int result;
+ jb_socket bfd;