From: steudten <steudten@users.sourceforge.net>
Date: Mon, 5 Nov 2001 21:41:43 +0000 (+0000)
Subject: Add changes to be a real daemon just for unix os.
X-Git-Tag: v_2_9_10~45
X-Git-Url: http://www.privoxy.org/gitweb/@default-cgi@/faq/%22https:/developer-manual/static/@default-cgi@show-url-info?a=commitdiff_plain;h=27e7ab19921a75f023658b07d314719875be2062;p=privoxy.git

Add changes to be a real daemon just for unix os.
(change cwd to /, detach from controlling tty, set
process group and session leader to the own process.
Add DBG() Macro.
Add some fatal-error log message for failed malloc().
Add '-d' if compiled with 'configure --with-debug' to
enable debug output.
---

diff --git a/jcc.c b/jcc.c
index 157381df..0a06e62d 100644
--- a/jcc.c
+++ b/jcc.c
@@ -1,4 +1,4 @@
-const char jcc_rcs[] = "$Id: jcc.c,v 1.51 2001/10/26 17:38:28 oes Exp $";
+const char jcc_rcs[] = "$Id: jcc.c,v 1.52 2001/10/26 20:11:20 jongfoster Exp $";
 /*********************************************************************
  *
  * File        :  $Source: /cvsroot/ijbswa/current/jcc.c,v $
@@ -33,6 +33,9 @@ const char jcc_rcs[] = "$Id: jcc.c,v 1.51 2001/10/26 17:38:28 oes Exp $";
  *
  * Revisions   :
  *    $Log: jcc.c,v $
+ *    Revision 1.52  2001/10/26 20:11:20  jongfoster
+ *    Fixing type mismatch
+ *
  *    Revision 1.51  2001/10/26 17:38:28  oes
  *    Cosmetics
  *
@@ -379,6 +382,12 @@ const char jcc_rcs[] = "$Id: jcc.c,v 1.51 2001/10/26 17:38:28 oes Exp $";
 # endif /* ndef __OS2__ */
 # include <sys/time.h>
 # include <sys/stat.h>
+# include <sys/ioctl.h>
+
+#ifdef sun
+#include <sys/termios.h>
+#endif /* sun */
+
 # include <signal.h>
 
 # ifdef __BEOS__
@@ -401,6 +410,10 @@ const char jcc_rcs[] = "$Id: jcc.c,v 1.51 2001/10/26 17:38:28 oes Exp $";
 
 #endif
 
+#ifdef _DEBUG
+int ldebug = 0;
+#endif
+
 #include "project.h"
 #include "list.h"
 #include "jcc.h"
@@ -448,6 +461,9 @@ static int32 server_thread(void *data);
 #define sleep(N)  DosSleep(((N) * 100))
 #endif
 
+#if defined(unix)
+const char *basedir;
+#endif /* defined unix */
 
 /* The vanilla wafer. */
 static const char VANILLA_WAFER[] =
@@ -1346,6 +1362,8 @@ int real_main(int argc, const char *argv[])
 int main(int argc, const char *argv[])
 #endif
 {
+   int 	argc_pos = 1;
+
    configfile =
 #ifdef AMIGA
    "AmiTCP:db/junkbuster/config"
@@ -1371,16 +1389,51 @@ int main(int argc, const char *argv[])
       printf(VERSION "\n");
       exit(2);
    }
+#ifdef _DEBUG
+   if ((argc >= 2) && (strcmp(argv[1], "-d")==0))
+   {
+	ldebug++;
+	argc_pos++;
+	fprintf(stderr,"debugging enabled..\n");
+   }
+#endif /* _DEBUG */
 #endif /* !defined(_WIN32) || defined(_WIN_CONSOLE) */
 
    Argc = argc;
    Argv = argv;
 
-   if (argc > 1)
+   if (argc > argc_pos )
    {
-      configfile = argv[1];
+      configfile = argv[argc_pos];
    }
 
+#if defined(unix)
+	if ( *configfile != '/' )
+	{
+		char	*abs_file;
+
+		DBG(1, ("configfile before '%s'\n",configfile) );
+
+		/* make config-filename absolute here */	
+		if ( !(basedir = getcwd( NULL, 1024 )))
+		{
+			perror("get working dir");
+		}
+		DBG(1, ("working dir '%s'\n",basedir) );
+		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;
+		DBG(1, ("configfile after '%s'\n",configfile) );
+	}
+#endif /* defined unix */
+
+
    files->next = NULL;
 
 #ifdef AMIGA
@@ -1408,6 +1461,52 @@ int main(int argc, const char *argv[])
    /* Initialize the CGI subsystem */
    cgi_init_error_messages();
 
+#if defined(unix)
+{
+	pid_t	pid = 0;
+	int	fd;
+
+	/*
+	** we make us a real daemon
+	*/
+#ifdef _DEBUG
+	if ( !ldebug) 
+#endif
+		pid  = fork();
+	if ( pid < 0 )	/* error */
+	{
+		perror("fork");
+	 	exit( 3 );
+	} 
+	else if ( pid != 0 ) /* parent */
+	{
+		exit( 0 );
+	}
+	/* child */
+	setpgrp();
+	fd = open("/dev/tty", O_RDONLY);
+	if ( fd ) 
+	{
+		/* no error check here */
+		ioctl( fd, TIOCNOTTY,0 );
+		close ( fd );
+	}
+	/* 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.
+	*/
+#ifdef _DEBUG
+	if ( !ldebug ) 
+		close( 0 ); close( 1 ); 
+#else
+	close( 0 ); close( 1 ); 
+#endif /* _DEBUG */
+	chdir("/");
+
+}
+#endif /* defined unix */
+
+   DBG(1, ("call listen_loop() \n") );
    listen_loop();
 
    /* NOTREACHED */
diff --git a/jcc.h b/jcc.h
index f3ee7344..ddd23bdd 100644
--- a/jcc.h
+++ b/jcc.h
@@ -1,6 +1,6 @@
 #ifndef JCC_H_INCLUDED
 #define JCC_H_INCLUDED
-#define JCC_H_VERSION "$Id: jcc.h,v 1.5 2001/07/29 19:32:00 jongfoster Exp $"
+#define JCC_H_VERSION "$Id: jcc.h,v 1.6 2001/07/30 22:08:36 jongfoster Exp $"
 /*********************************************************************
  *
  * File        :  $Source: /cvsroot/ijbswa/current/jcc.h,v $
@@ -35,6 +35,12 @@
  *
  * Revisions   :
  *    $Log: jcc.h,v $
+ *    Revision 1.6  2001/07/30 22:08:36  jongfoster
+ *    Tidying up #defines:
+ *    - All feature #defines are now of the form FEATURE_xxx
+ *    - Permanently turned off WIN_GUI_EDIT
+ *    - Permanently turned on WEBDAV and SPLIT_PROXY_ARGS
+ *
  *    Revision 1.5  2001/07/29 19:32:00  jongfoster
  *    Renaming _main() [mingw32 only] to real_main(), for ANSI compliance.
  *
@@ -65,7 +71,6 @@ extern "C" {
 struct client_state;
 struct file_list;
 
-
 /* Global variables */
 
 #ifdef FEATURE_STATISTICS
diff --git a/loadcfg.c b/loadcfg.c
index d92dbeca..0c0fae2c 100644
--- a/loadcfg.c
+++ b/loadcfg.c
@@ -1,4 +1,4 @@
-const char loadcfg_rcs[] = "$Id: loadcfg.c,v 1.24 2001/10/23 21:40:30 jongfoster Exp $";
+const char loadcfg_rcs[] = "$Id: loadcfg.c,v 1.25 2001/10/25 03:40:48 david__schmidt Exp $";
 /*********************************************************************
  *
  * File        :  $Source: /cvsroot/ijbswa/current/loadcfg.c,v $
@@ -35,6 +35,12 @@ const char loadcfg_rcs[] = "$Id: loadcfg.c,v 1.24 2001/10/23 21:40:30 jongfoster
  *
  * Revisions   :
  *    $Log: loadcfg.c,v $
+ *    Revision 1.25  2001/10/25 03:40:48  david__schmidt
+ *    Change in porting tactics: OS/2's EMX porting layer doesn't allow multiple
+ *    threads to call select() simultaneously.  So, it's time to do a real, live,
+ *    native OS/2 port.  See defines for __EMX__ (the porting layer) vs. __OS2__
+ *    (native). Both versions will work, but using __OS2__ offers multi-threading.
+ *
  *    Revision 1.24  2001/10/23 21:40:30  jongfoster
  *    Added support for enable-edit-actions and enable-remote-toggle config
  *    file options.
@@ -425,6 +431,7 @@ struct configuration_spec * load_config(void)
    struct client_state * fake_csp;
    struct file_list *fs;
 
+   DBG(1, ("load_config() entered..\n") );
    if (!check_file_changed(current_configfile, configfile, &fs))
    {
       /* No need to load */
@@ -436,7 +443,9 @@ struct configuration_spec * load_config(void)
                 configfile);
    }
 
+   /*
    log_error(LOG_LEVEL_INFO, "loading configuration file '%s':", configfile);
+   */
 
 #ifdef FEATURE_TOGGLE
    g_bToggleIJB      = 1;
@@ -924,7 +933,7 @@ struct configuration_spec * load_config(void)
  ****************************************************************************/
          case hash_logdir :
             freez(config->logdir);
-            config->logdir = strdup(arg);
+            config->logdir = make_path(NULL, arg);
             continue;
 
 /****************************************************************************
diff --git a/miscutil.c b/miscutil.c
index f79cfd75..beab02b9 100644
--- a/miscutil.c
+++ b/miscutil.c
@@ -1,4 +1,4 @@
-const char miscutil_rcs[] = "$Id: miscutil.c,v 1.22 2001/10/26 17:39:38 oes Exp $";
+const char miscutil_rcs[] = "$Id: miscutil.c,v 1.23 2001/10/29 03:48:10 david__schmidt Exp $";
 /*********************************************************************
  *
  * File        :  $Source: /cvsroot/ijbswa/current/miscutil.c,v $
@@ -36,6 +36,10 @@ const char miscutil_rcs[] = "$Id: miscutil.c,v 1.22 2001/10/26 17:39:38 oes Exp
  *
  * Revisions   :
  *    $Log: miscutil.c,v $
+ *    Revision 1.23  2001/10/29 03:48:10  david__schmidt
+ *    OS/2 native needed a snprintf() routine.  Added one to miscutil, brackedted
+ *    by and __OS2__ ifdef.
+ *
  *    Revision 1.22  2001/10/26 17:39:38  oes
  *    Moved ijb_isspace and ijb_tolower to project.h
  *
@@ -736,8 +740,32 @@ char * make_path(const char * dir, const char * file)
    }
    else
    {
-      char * path = malloc(strlen(dir) + strlen(file) + 2);
+      char * path;
+
+#if defined(unix)
+      if ( *dir != '/' && basedir && *basedir )
+      {
+	      path = malloc( strlen( basedir ) + strlen(dir) + strlen(file) + 3);
+	      if (!path ) log_error(LOG_LEVEL_FATAL, "malloc failed!");
+	      strcpy(path, basedir);
+	      strcat(path, "/");
+	      strcat(path, dir);
+	      DBG(1, ("make_path: path: %s\n",path) );
+      }
+      else
+      {
+	      path = malloc(strlen(dir) + strlen(file) + 2);
+	      if (!path ) log_error(LOG_LEVEL_FATAL, "malloc failed!");
+	      strcpy(path, dir);
+      }
+#else
+
+      path = malloc(strlen(dir) + strlen(file) + 2);
+      if (!path ) log_error(LOG_LEVEL_FATAL, "malloc failed!");
       strcpy(path, dir);
+
+#endif /* defined unix */
+
 #ifdef _WIN32
       if(path[strlen(path)-1] != '\\')
       {
@@ -1529,4 +1557,4 @@ int portable_vsnprintf(char *str, size_t str_m, const char *fmt, va_list ap) {
   Local Variables:
   tab-width: 3
   end:
-*/
\ No newline at end of file
+*/