From 27e7ab19921a75f023658b07d314719875be2062 Mon Sep 17 00:00:00 2001 From: steudten Date: Mon, 5 Nov 2001 21:41:43 +0000 Subject: [PATCH] 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. --- jcc.c | 105 +++++++++++++++++++++++++++++++++++++++++++++++++++-- jcc.h | 9 ++++- loadcfg.c | 13 ++++++- miscutil.c | 34 +++++++++++++++-- 4 files changed, 151 insertions(+), 10 deletions(-) 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 # include +# include + +#ifdef sun +#include +#endif /* sun */ + # include # 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 +*/ -- 2.39.2