Startup syntax change.
[privoxy.git] / jcc.c
diff --git a/jcc.c b/jcc.c
index 338bc47..0a06e62 100644 (file)
--- a/jcc.c
+++ b/jcc.c
@@ -1,4 +1,4 @@
-const char jcc_rcs[] = "$Id: jcc.c,v 1.50 2001/10/25 03:40:48 david__schmidt 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,12 @@ const char jcc_rcs[] = "$Id: jcc.c,v 1.50 2001/10/25 03:40:48 david__schmidt 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
+ *
  *    Revision 1.50  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,
@@ -376,6 +382,12 @@ const char jcc_rcs[] = "$Id: jcc.c,v 1.50 2001/10/25 03:40:48 david__schmidt 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__
@@ -398,6 +410,10 @@ const char jcc_rcs[] = "$Id: jcc.c,v 1.50 2001/10/25 03:40:48 david__schmidt Exp
 
 #endif
 
+#ifdef _DEBUG
+int ldebug = 0;
+#endif
+
 #include "project.h"
 #include "list.h"
 #include "jcc.h"
@@ -445,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[] =
@@ -1080,7 +1099,7 @@ static void chat(struct client_state *csp)
                 * switch to non-filtering mode, i.e. make & write the
                 * header, flush the socket and get out of the way.
                 */
-               if (csp->iob->eod - csp->iob->buf + BUFFER_SIZE > csp->config->buffer_limit)
+               if (((size_t)(csp->iob->eod - csp->iob->buf)) + (size_t)BUFFER_SIZE > csp->config->buffer_limit)
                {
                   log_error(LOG_LEVEL_ERROR, "Buffer size limit reached! Flushing and stepping back.");
 
@@ -1343,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"
@@ -1368,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
@@ -1405,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 */