dgaudet 97/09/14 04:06:53
Modified: src INDENT src/main http_main.c Log: indent Revision Changes Path 1.5 +2 -2 apachen/src/INDENT Index: INDENT =================================================================== RCS file: /export/home/cvs/apachen/src/INDENT,v retrieving revision 1.4 retrieving revision 1.5 diff -u -r1.4 -r1.5 --- INDENT 1997/09/14 10:35:01 1.4 +++ INDENT 1997/09/14 11:06:49 1.5 @@ -21,8 +21,8 @@ http_core.h http_log.c http_log.h - http_main.c RESERVED by Dean - http_main.h + http_main.c DONE by Dean + http_main.h RESERVED by Dean http_protocol.c DONE by Roy http_protocol.h DONE by Roy http_request.c RESERVED while Roy is working on it 1.224 +1269 -1256apachen/src/main/http_main.c Index: http_main.c =================================================================== RCS file: /export/home/cvs/apachen/src/main/http_main.c,v retrieving revision 1.223 retrieving revision 1.224 diff -u -r1.223 -r1.224 --- http_main.c 1997/09/14 10:30:56 1.223 +++ http_main.c 1997/09/14 11:06:51 1.224 @@ -61,9 +61,9 @@ * of processes * * 03-10-95 blong - * Added numerous speed hacks proposed by Robert S. Thau ([EMAIL PROTECTED]) - * including set group before fork, and call gettime before to fork - * to set up libraries. + * Added numerous speed hacks proposed by Robert S. Thau ([EMAIL PROTECTED]) + * including set group before fork, and call gettime before to fork + * to set up libraries. * * 04-14-95 rst / rh * Brandon's code snarfed from NCSA 1.4, but tinkered to work with the @@ -82,7 +82,7 @@ #include "http_protocol.h" /* for read_request */ #include "http_request.h" /* for process_request */ #include "http_conf_globals.h" -#include "http_core.h" /* for get_remote_host */ +#include "http_core.h" /* for get_remote_host */ #include "scoreboard.h" #include "multithread.h" #include <sys/stat.h> @@ -119,14 +119,14 @@ #ifdef __EMX__ /* Add MMAP style functionality to OS/2 */ - #ifdef HAVE_MMAP - #define INCL_DOSMEMMGR - #include <os2.h> - #include <umalloc.h> - #include <stdio.h> - caddr_t create_shared_heap (const char *, size_t); - caddr_t get_shared_heap (const char *); - #endif +#ifdef HAVE_MMAP +#define INCL_DOSMEMMGR +#include <os2.h> +#include <umalloc.h> +#include <stdio.h> +caddr_t create_shared_heap(const char *, size_t); +caddr_t get_shared_heap(const char *); +#endif #endif DEF_Explain @@ -240,7 +240,7 @@ struct other_child_rec { other_child_rec *next; int pid; - void (*maintenance)(int, void *, int); + void (*maintenance) (int, void *, int); void *data; int write_fd; }; @@ -261,7 +261,7 @@ #ifdef WIN32 #define ap_killpg(x, y) -#else +#else #ifdef NO_KILLPG #define ap_killpg(x, y) (kill (-(x), (y))) #else @@ -274,8 +274,8 @@ { char buf[20]; - ap_snprintf( buf, sizeof(buf), ".%u", getpid() ); - lock_fname = pstrcat (p, server_root_relative (p, lock_fname), buf, NULL); + ap_snprintf(buf, sizeof(buf), ".%u", getpid()); + lock_fname = pstrcat(p, server_root_relative(p, lock_fname), buf, NULL); } #endif @@ -294,50 +294,50 @@ /* default is 8, allocate enough for all the children plus the parent */ - if ((old = usconfig(CONF_INITUSERS, HARD_SERVER_LIMIT+1)) == -1) { - perror("usconfig(CONF_INITUSERS)"); - exit(-1); + if ((old = usconfig(CONF_INITUSERS, HARD_SERVER_LIMIT + 1)) == -1) { + perror("usconfig(CONF_INITUSERS)"); + exit(-1); } if ((old = usconfig(CONF_LOCKTYPE, US_NODEBUG)) == -1) { - perror("usconfig(CONF_LOCKTYPE)"); - exit(-1); + perror("usconfig(CONF_LOCKTYPE)"); + exit(-1); } if ((old = usconfig(CONF_ARENATYPE, US_SHAREDONLY)) == -1) { - perror("usconfig(CONF_ARENATYPE)"); - exit(-1); + perror("usconfig(CONF_ARENATYPE)"); + exit(-1); } if ((us = usinit("/dev/zero")) == NULL) { - perror("usinit"); - exit(-1); + perror("usinit"); + exit(-1); } if ((uslock = usnewlock(us)) == NULL) { - perror("usnewlock"); - exit(-1); + perror("usnewlock"); + exit(-1); } } static void accept_mutex_on() { - switch(ussetlock(uslock)) { - case 1: - /* got lock */ - break; - case 0: - fprintf(stderr, "didn't get lock\n"); - exit(-1); - case -1: - perror("ussetlock"); - exit(-1); + switch (ussetlock(uslock)) { + case 1: + /* got lock */ + break; + case 0: + fprintf(stderr, "didn't get lock\n"); + exit(-1); + case -1: + perror("ussetlock"); + exit(-1); } } static void accept_mutex_off() { if (usunsetlock(uslock) == -1) { - perror("usunsetlock"); - exit(-1); + perror("usunsetlock"); + exit(-1); } } @@ -353,8 +353,8 @@ static void accept_mutex_cleanup(void) { - if (munmap ((caddr_t)accept_mutex, sizeof (*accept_mutex))) { - perror ("munmap"); + if (munmap((caddr_t) accept_mutex, sizeof(*accept_mutex))) { + perror("munmap"); } } @@ -363,45 +363,45 @@ pthread_mutexattr_t mattr; int fd; - fd = open ("/dev/zero", O_RDWR); + fd = open("/dev/zero", O_RDWR); if (fd == -1) { - perror ("open(/dev/zero)"); - exit (1); + perror("open(/dev/zero)"); + exit(1); } - accept_mutex = (pthread_mutex_t *)mmap ((caddr_t)0, sizeof (*accept_mutex), - PROT_READ|PROT_WRITE, MAP_SHARED, fd, 0); - if (accept_mutex == (void *)(caddr_t)-1) { - perror ("mmap"); - exit (1); + accept_mutex = (pthread_mutex_t *) mmap((caddr_t) 0, sizeof(*accept_mutex), + PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0); + if (accept_mutex == (void *) (caddr_t) - 1) { + perror("mmap"); + exit(1); } - close (fd); + close(fd); if (pthread_mutexattr_init(&mattr)) { - perror ("pthread_mutexattr_init"); - exit (1); + perror("pthread_mutexattr_init"); + exit(1); } if (pthread_mutexattr_setpshared(&mattr, PTHREAD_PROCESS_SHARED)) { - perror ("pthread_mutexattr_setpshared"); - exit (1); + perror("pthread_mutexattr_setpshared"); + exit(1); } if (pthread_mutex_init(accept_mutex, &mattr)) { - perror ("pthread_mutex_init"); - exit (1); + perror("pthread_mutex_init"); + exit(1); } } static void accept_mutex_on() { - if (pthread_mutex_lock (accept_mutex)) { - perror ("pthread_mutex_lock"); - exit (1); + if (pthread_mutex_lock(accept_mutex)) { + perror("pthread_mutex_lock"); + exit(1); } } static void accept_mutex_off() { - if (pthread_mutex_unlock (accept_mutex)) { - perror ("pthread_mutex_unlock"); - exit (1); + if (pthread_mutex_unlock(accept_mutex)) { + perror("pthread_mutex_unlock"); + exit(1); } } @@ -418,6 +418,7 @@ struct semid_ds *buf; ushort *array; }; + #endif static int sem_cleanup_registered; @@ -432,15 +433,17 @@ * do many things in here... especially nothing that would allocate * memory or use a FILE *. */ -static void accept_mutex_cleanup (void) +static void accept_mutex_cleanup(void) { union semun ick; - if (sem_id < 0) return; - if (getpid() != sem_cleanup_pid) return; + if (sem_id < 0) + return; + if (getpid() != sem_cleanup_pid) + return; /* this is ignored anyhow */ ick.val = 0; - semctl (sem_id, 0, IPC_RMID, ick); + semctl(sem_id, 0, IPC_RMID, ick); } @@ -452,22 +455,22 @@ if (!sem_cleanup_registered) { /* only the parent will try to do cleanup */ sem_cleanup_pid = getpid(); - if (atexit (accept_mutex_cleanup)) { - perror ("atexit"); - exit (1); + if (atexit(accept_mutex_cleanup)) { + perror("atexit"); + exit(1); } sem_cleanup_registered = 1; } /* acquire the semaphore */ sem_id = semget(IPC_PRIVATE, 1, IPC_CREAT | 0600); if (sem_id < 0) { - perror ("semget"); - exit (1); + perror("semget"); + exit(1); } ick.val = 1; if (semctl(sem_id, 0, SETVAL, ick) < 0) { - perror ("semctl(SETVAL)"); - exit (1); + perror("semctl(SETVAL)"); + exit(1); } if (!getuid()) { /* restrict it to use only by the appropriate user_id ... not that this @@ -478,8 +481,8 @@ buf.sem_perm.mode = 0600; ick.buf = &buf; if (semctl(sem_id, 0, IPC_SET, ick) < 0) { - perror ("semctl(IPC_SET)"); - exit (1); + perror("semctl(IPC_SET)"); + exit(1); } } @@ -495,16 +498,16 @@ static void accept_mutex_on() { if (semop(sem_id, &op_on, 1) < 0) { - perror ("accept_mutex_on"); - exit (1); + perror("accept_mutex_on"); + exit(1); } } static void accept_mutex_off() { if (semop(sem_id, &op_off, 1) < 0) { - perror ("accept_mutex_off"); - exit (1); + perror("accept_mutex_off"); + exit(1); } } @@ -512,7 +515,7 @@ static struct flock lock_it; static struct flock unlock_it; -static int lock_fd=-1; +static int lock_fd = -1; #define accept_mutex_cleanup() @@ -523,24 +526,23 @@ static void accept_mutex_init(pool *p) { - lock_it.l_whence = SEEK_SET; /* from current point */ - lock_it.l_start = 0; /* -"- */ - lock_it.l_len = 0; /* until end of file */ - lock_it.l_type = F_WRLCK; /* set exclusive/write lock */ - lock_it.l_pid = 0; /* pid not actually interesting */ - unlock_it.l_whence = SEEK_SET; /* from current point */ - unlock_it.l_start = 0; /* -"- */ - unlock_it.l_len = 0; /* until end of file */ - unlock_it.l_type = F_UNLCK; /* set exclusive/write lock */ - unlock_it.l_pid = 0; /* pid not actually interesting */ + lock_it.l_whence = SEEK_SET; /* from current point */ + lock_it.l_start = 0; /* -"- */ + lock_it.l_len = 0; /* until end of file */ + lock_it.l_type = F_WRLCK; /* set exclusive/write lock */ + lock_it.l_pid = 0; /* pid not actually interesting */ + unlock_it.l_whence = SEEK_SET; /* from current point */ + unlock_it.l_start = 0; /* -"- */ + unlock_it.l_len = 0; /* until end of file */ + unlock_it.l_type = F_UNLCK; /* set exclusive/write lock */ + unlock_it.l_pid = 0; /* pid not actually interesting */ - expand_lock_fname (p); + expand_lock_fname(p); lock_fd = popenf(p, lock_fname, O_CREAT | O_WRONLY | O_EXCL, 0644); - if (lock_fd == -1) - { - perror ("open"); - fprintf (stderr, "Cannot open lock file: %s\n", lock_fname); - exit (1); + if (lock_fd == -1) { + perror("open"); + fprintf(stderr, "Cannot open lock file: %s\n", lock_fname); + exit(1); } unlink(lock_fname); } @@ -548,7 +550,7 @@ static void accept_mutex_on(void) { int ret; - + while ((ret = fcntl(lock_fd, F_SETLKW, &lock_it)) < 0 && errno == EINTR) continue; @@ -561,8 +563,7 @@ static void accept_mutex_off(void) { - if (fcntl (lock_fd, F_SETLKW, &unlock_it) < 0) - { + if (fcntl(lock_fd, F_SETLKW, &unlock_it) < 0) { aplog_error(APLOG_MARK, APLOG_EMERG, server_conf, "fcntl: F_SETLKW: Error freeing accept lock. Exiting!"); exit(1); @@ -571,7 +572,7 @@ #elif defined(USE_FLOCK_SERIALIZED_ACCEPT) -static int lock_fd=-1; +static int lock_fd = -1; #define accept_mutex_cleanup() @@ -582,12 +583,12 @@ static void accept_mutex_init(pool *p) { - expand_lock_fname (p); + expand_lock_fname(p); lock_fd = popenf(p, lock_fname, O_CREAT | O_WRONLY | O_EXCL, 0644); if (lock_fd == -1) { aplog_error(APLOG_MARK, APLOG_EMERG, server_conf, "Cannot open lock file: %s\n", lock_fname); - exit (1); + exit(1); } unlink(lock_fname); } @@ -595,7 +596,7 @@ static void accept_mutex_on(void) { int ret; - + while ((ret = flock(lock_fd, LOCK_EX)) < 0 && errno == EINTR) continue; @@ -608,8 +609,7 @@ static void accept_mutex_off(void) { - if (flock (lock_fd, LOCK_UN) < 0) - { + if (flock(lock_fd, LOCK_UN) < 0) { aplog_error(APLOG_MARK, APLOG_EMERG, server_conf, "flock: LOCK_UN: Error freeing accept lock. Exiting!"); exit(1); @@ -639,12 +639,12 @@ void usage(char *bin) { - fprintf(stderr,"Usage: %s [-d directory] [-f file] [-v] [-h] [-l]\n",bin); - fprintf(stderr,"-d directory : specify an alternate initial ServerRoot\n"); - fprintf(stderr,"-f file : specify an alternate ServerConfigFile\n"); - fprintf(stderr,"-v : show version number\n"); - fprintf(stderr,"-h : list directives\n"); - fprintf(stderr,"-l : list modules\n"); + fprintf(stderr, "Usage: %s [-d directory] [-f file] [-v] [-h] [-l]\n", bin); + fprintf(stderr, "-d directory : specify an alternate initial ServerRoot\n"); + fprintf(stderr, "-f file : specify an alternate ServerConfigFile\n"); + fprintf(stderr, "-v : show version number\n"); + fprintf(stderr, "-h : list directives\n"); + fprintf(stderr, "-l : list modules\n"); exit(1); } @@ -655,9 +655,9 @@ * one timeout in progress at a time... */ -static APACHE_TLS conn_rec * volatile current_conn; -static APACHE_TLS request_rec * volatile timeout_req; -static APACHE_TLS const char * volatile timeout_name = NULL; +static APACHE_TLS conn_rec *volatile current_conn; +static APACHE_TLS request_rec *volatile timeout_req; +static APACHE_TLS const char *volatile timeout_name = NULL; static APACHE_TLS int volatile alarms_blocked = 0; static APACHE_TLS int volatile alarm_pending = 0; static APACHE_TLS int volatile exit_after_unblock = 0; @@ -668,78 +668,84 @@ * from W. Richard Stevens' "Advanced Programming in the UNIX Environment" * (the version that does not automatically restart system calls). */ -Sigfunc *signal(int signo, Sigfunc *func) +Sigfunc *signal(int signo, Sigfunc * func) { struct sigaction act, oact; act.sa_handler = func; sigemptyset(&act.sa_mask); act.sa_flags = 0; -#ifdef SA_INTERRUPT /* SunOS */ +#ifdef SA_INTERRUPT /* SunOS */ act.sa_flags |= SA_INTERRUPT; #endif if (sigaction(signo, &act, &oact) < 0) - return SIG_ERR; + return SIG_ERR; return oact.sa_handler; } #endif -void timeout(int sig) /* Also called on SIGPIPE */ -{ +void timeout(int sig) +{ /* Also called on SIGPIPE */ char errstr[MAX_STRING_LEN]; void *dirconf; - signal(SIGPIPE, SIG_IGN); /* Block SIGPIPE */ + signal(SIGPIPE, SIG_IGN); /* Block SIGPIPE */ if (alarms_blocked) { alarm_pending = 1; return; } if (!current_conn) { - ap_longjmp (jmpbuffer, 1); + ap_longjmp(jmpbuffer, 1); } - - if (timeout_req != NULL) dirconf = timeout_req->per_dir_config; - else dirconf = current_conn->server->lookup_defaults; + + if (timeout_req != NULL) + dirconf = timeout_req->per_dir_config; + else + dirconf = current_conn->server->lookup_defaults; if (sig == SIGPIPE) { - ap_snprintf(errstr, sizeof(errstr), "%s lost connection to %s", + ap_snprintf(errstr, sizeof(errstr), "%s lost connection to %s", timeout_name ? timeout_name : "request", get_remote_host(current_conn, dirconf, REMOTE_NAME)); - } else { - ap_snprintf(errstr, sizeof(errstr), "%s timed out for %s", + } + else { + ap_snprintf(errstr, sizeof(errstr), "%s timed out for %s", timeout_name ? timeout_name : "request", get_remote_host(current_conn, dirconf, REMOTE_NAME)); } - - if (!current_conn->keptalive) + + if (!current_conn->keptalive) aplog_error(APLOG_MARK, APLOG_DEBUG, current_conn->server, errstr); - + if (timeout_req) { /* Someone has asked for this transaction to just be aborted * if it times out... */ - + request_rec *log_req = timeout_req; - + while (log_req->main || log_req->prev) { /* Get back to original request... */ - if (log_req->main) log_req = log_req->main; - else log_req = log_req->prev; + if (log_req->main) + log_req = log_req->main; + else + log_req = log_req->prev; } - - if (!current_conn->keptalive) - log_transaction(log_req); + + if (!current_conn->keptalive) + log_transaction(log_req); bsetflag(timeout_req->connection->client, B_EOUT, 1); bclose(timeout_req->connection->client); - - if (!standalone) exit(0); - ap_longjmp (jmpbuffer, 1); + if (!standalone) + exit(0); + + ap_longjmp(jmpbuffer, 1); } - else { /* abort the connection */ - bsetflag(current_conn->client, B_EOUT, 1); - current_conn->aborted = 1; + else { /* abort the connection */ + bsetflag(current_conn->client, B_EOUT, 1); + current_conn->aborted = 1; } } @@ -749,11 +755,13 @@ * which is itself being cleared); we have to support that here. */ -API_EXPORT(void) block_alarms() { +API_EXPORT(void) block_alarms() +{ ++alarms_blocked; } -API_EXPORT(void) unblock_alarms() { +API_EXPORT(void) unblock_alarms() +{ --alarms_blocked; if (alarms_blocked == 0) { if (exit_after_unblock) { @@ -769,41 +777,38 @@ } -static APACHE_TLS void (* volatile alarm_fn)(int) = NULL; +static APACHE_TLS void (*volatile alarm_fn) (int) = NULL; #ifdef WIN32 static APACHE_TLS unsigned int alarm_expiry_time = 0; #endif /* WIN32 */ #ifndef WIN32 -static void alrm_handler (int sig) +static void alrm_handler(int sig) { if (alarm_fn) { - (*alarm_fn)(sig); + (*alarm_fn) (sig); } } #endif -unsigned int -set_callback_and_alarm(void (*fn)(int), int x) +unsigned int set_callback_and_alarm(void (*fn) (int), int x) { unsigned int old; #ifdef WIN32 old = alarm_expiry_time; - if(old) - old -= time(0); - if(x == 0) - { - alarm_fn = NULL; - alarm_expiry_time = 0; + if (old) + old -= time(0); + if (x == 0) { + alarm_fn = NULL; + alarm_expiry_time = 0; } - else - { - alarm_fn = fn; - alarm_expiry_time = time(NULL) + x; + else { + alarm_fn = fn; + alarm_expiry_time = time(NULL) + x; } #else - if(x) { + if (x) { alarm_fn = fn; } #ifndef OPTIMIZE_TIMEOUTS @@ -817,34 +822,30 @@ ++scoreboard_image->servers[my_child_num].cur_vtime; #endif #endif - return(old); + return (old); } -int -check_alarm(void) +int check_alarm(void) { #ifdef WIN32 - if(alarm_expiry_time) - { - unsigned int t; + if (alarm_expiry_time) { + unsigned int t; - t = time(NULL); - if(t >= alarm_expiry_time) - { - alarm_expiry_time = 0; - (*alarm_fn)(0); - return(-1); - } - else - { - return(alarm_expiry_time - t); - } + t = time(NULL); + if (t >= alarm_expiry_time) { + alarm_expiry_time = 0; + (*alarm_fn) (0); + return (-1); + } + else { + return (alarm_expiry_time - t); + } } else - return(0); + return (0); #else - return(0); + return (0); #endif /* WIN32 */ } @@ -854,12 +855,13 @@ * as long as it hasn't expired already. */ -API_EXPORT(void) reset_timeout (request_rec *r) { +API_EXPORT(void) reset_timeout(request_rec *r) +{ int i; - if (timeout_name) { /* timeout has been set */ - i = set_callback_and_alarm(alarm_fn, r->server->timeout); - if (i == 0) /* timeout already expired, so set it back to 0 */ + if (timeout_name) { /* timeout has been set */ + i = set_callback_and_alarm(alarm_fn, r->server->timeout); + if (i == 0) /* timeout already expired, so set it back to 0 */ set_callback_and_alarm(alarm_fn, 0); } } @@ -867,39 +869,40 @@ -void keepalive_timeout (char *name, request_rec *r) +void keepalive_timeout(char *name, request_rec *r) { unsigned int to; timeout_req = r; timeout_name = name; - if (r->connection->keptalive) - to = r->server->keep_alive_timeout; + if (r->connection->keptalive) + to = r->server->keep_alive_timeout; else - to = r->server->timeout; + to = r->server->timeout; set_callback_and_alarm(timeout, to); } -API_EXPORT(void) hard_timeout (char *name, request_rec *r) +API_EXPORT(void) hard_timeout(char *name, request_rec *r) { timeout_req = r; timeout_name = name; - + set_callback_and_alarm(timeout, r->server->timeout); } -API_EXPORT(void) soft_timeout (char *name, request_rec *r) +API_EXPORT(void) soft_timeout(char *name, request_rec *r) { timeout_name = name; - + set_callback_and_alarm(timeout, r->server->timeout); } -API_EXPORT(void) kill_timeout (request_rec *dummy) { +API_EXPORT(void) kill_timeout(request_rec *dummy) +{ set_callback_and_alarm(NULL, 0); timeout_req = NULL; timeout_name = NULL; @@ -931,9 +934,9 @@ #endif #ifdef USE_SO_LINGER -#define NO_LINGCLOSE /* The two lingering options are exclusive */ +#define NO_LINGCLOSE /* The two lingering options are exclusive */ -static void sock_enable_linger (int s) +static void sock_enable_linger(int s) { struct linger li; @@ -941,15 +944,15 @@ li.l_linger = MAX_SECS_TO_LINGER; if (setsockopt(s, SOL_SOCKET, SO_LINGER, - (char *)&li, sizeof(struct linger)) < 0) { - aplog_error(APLOG_MARK, APLOG_WARNING, server_conf, "setsockopt: (SO_LINGER)"); - /* not a fatal error */ + (char *) &li, sizeof(struct linger)) < 0) { + aplog_error(APLOG_MARK, APLOG_WARNING, server_conf, "setsockopt: (SO_LINGER)"); + /* not a fatal error */ } } #else -#define sock_enable_linger(s) /* NOOP */ -#endif /* USE_SO_LINGER */ +#define sock_enable_linger(s) /* NOOP */ +#endif /* USE_SO_LINGER */ #ifndef NO_LINGCLOSE @@ -961,18 +964,18 @@ alarm_pending = 1; return; } - + if (!current_conn) { - ap_longjmp (jmpbuffer, 1); + ap_longjmp(jmpbuffer, 1); } bsetflag(current_conn->client, B_EOUT, 1); current_conn->aborted = 1; } - -static void linger_timeout (void) + +static void linger_timeout(void) { timeout_name = "lingering close"; - + set_callback_and_alarm(lingerout, MAX_SECS_TO_LINGER); } @@ -982,7 +985,7 @@ * distinguish between a dropped connection and something that might be * worth logging. */ -static void lingering_close (request_rec *r) +static void lingering_close(request_rec *r) { int dummybuf[512]; struct timeval tv; @@ -997,9 +1000,9 @@ /* Send any leftover data to the client, but never try to again */ if (bflush(r->connection->client) == -1) { - kill_timeout(r); - bclose(r->connection->client); - return; + kill_timeout(r); + bclose(r->connection->client); + return; } bsetflag(r->connection->client, B_EOUT, 1); @@ -1026,26 +1029,26 @@ */ do { - /* We use a 2 second timeout because current (Feb 97) browsers - * fail to close a connection after the server closes it. Thus, - * to avoid keeping the child busy, we are only lingering long enough - * for a client that is actively sending data on a connection. - * This should be sufficient unless the connection is massively - * losing packets, in which case we might have missed the RST anyway. - * These parameters are reset on each pass, since they might be - * changed by select. - */ - tv.tv_sec = 2; - tv.tv_usec = 0; - read_rv = 0; - fds_read = lfds; - fds_err = lfds; - - select_rv = ap_select(lsd+1, &fds_read, NULL, &fds_err, &tv); - } while ((select_rv > 0) && /* Something to see on socket */ - !FD_ISSET(lsd, &fds_err) && /* that isn't an error condition */ - FD_ISSET(lsd, &fds_read) && /* and is worth trying to read */ - ((read_rv = read(lsd, dummybuf, sizeof dummybuf)) > 0)); + /* We use a 2 second timeout because current (Feb 97) browsers + * fail to close a connection after the server closes it. Thus, + * to avoid keeping the child busy, we are only lingering long enough + * for a client that is actively sending data on a connection. + * This should be sufficient unless the connection is massively + * losing packets, in which case we might have missed the RST anyway. + * These parameters are reset on each pass, since they might be + * changed by select. + */ + tv.tv_sec = 2; + tv.tv_usec = 0; + read_rv = 0; + fds_read = lfds; + fds_err = lfds; + + select_rv = ap_select(lsd + 1, &fds_read, NULL, &fds_err, &tv); + } while ((select_rv > 0) && /* Something to see on socket */ + !FD_ISSET(lsd, &fds_err) && /* that isn't an error condition */ + FD_ISSET(lsd, &fds_read) && /* and is worth trying to read */ + ((read_rv = read(lsd, dummybuf, sizeof dummybuf)) > 0)); /* Should now have seen final ack. Safe to finally kill socket */ @@ -1060,13 +1063,13 @@ */ #ifndef NO_OTHER_CHILD -void register_other_child (int pid, - void (*maintenance)(int reason, void *, int status), - void *data, int write_fd) +void register_other_child(int pid, + void (*maintenance) (int reason, void *, int status), + void *data, int write_fd) { other_child_rec *ocr; - ocr = palloc (pconf, sizeof (*ocr)); + ocr = palloc(pconf, sizeof(*ocr)); ocr->pid = pid; ocr->maintenance = maintenance; ocr->data = data; @@ -1079,14 +1082,14 @@ * scanning the other_children list, all scanners should protect themself * by loading ocr->next before calling any maintenance function. */ -void unregister_other_child (void *data) +void unregister_other_child(void *data) { other_child_rec **pocr, *nocr; for (pocr = &other_children; *pocr; pocr = &(*pocr)->next) { if ((*pocr)->data == data) { nocr = (*pocr)->next; - (*(*pocr)->maintenance)(OC_REASON_UNREGISTER, (*pocr)->data, -1); + (*(*pocr)->maintenance) (OC_REASON_UNREGISTER, (*pocr)->data, -1); *pocr = nocr; /* XXX: um, well we've just wasted some space in pconf ? */ return; @@ -1096,7 +1099,7 @@ /* test to ensure that the write_fds are all still writable, otherwise * invoke the maintenance functions as appropriate */ -static void probe_writable_fds (void) +static void probe_writable_fds(void) { fd_set writable_fds; int fd_max; @@ -1104,52 +1107,59 @@ struct timeval tv; int rc; - if (other_children == NULL) return; + if (other_children == NULL) + return; fd_max = 0; - FD_ZERO (&writable_fds); + FD_ZERO(&writable_fds); for (ocr = other_children; ocr; ocr = ocr->next) { - if (ocr->write_fd == -1) continue; - FD_SET (ocr->write_fd, &writable_fds); + if (ocr->write_fd == -1) + continue; + FD_SET(ocr->write_fd, &writable_fds); if (ocr->write_fd > fd_max) { fd_max = ocr->write_fd; } } - if (fd_max == 0) return; + if (fd_max == 0) + return; do { tv.tv_sec = 0; tv.tv_usec = 0; - rc = ap_select (fd_max + 1, NULL, &writable_fds, NULL, &tv); + rc = ap_select(fd_max + 1, NULL, &writable_fds, NULL, &tv); } while (rc == -1 && errno == EINTR); if (rc == -1) { /* XXX: uhh this could be really bad, we could have a bad file * descriptor due to a bug in one of the maintenance routines */ - log_unixerr ("probe_writable_fds", "select", - "could not probe writable fds", server_conf); + log_unixerr("probe_writable_fds", "select", + "could not probe writable fds", server_conf); return; } - if (rc == 0) return; + if (rc == 0) + return; for (ocr = other_children; ocr; ocr = nocr) { nocr = ocr->next; - if (ocr->write_fd == -1) continue; - if (FD_ISSET (ocr->write_fd, &writable_fds)) continue; - (*ocr->maintenance)(OC_REASON_UNWRITABLE, ocr->data, -1); + if (ocr->write_fd == -1) + continue; + if (FD_ISSET(ocr->write_fd, &writable_fds)) + continue; + (*ocr->maintenance) (OC_REASON_UNWRITABLE, ocr->data, -1); } } /* possibly reap an other_child, return 0 if yes, -1 if not */ -static int reap_other_child (int pid, int status) +static int reap_other_child(int pid, int status) { other_child_rec *ocr, *nocr; for (ocr = other_children; ocr; ocr = nocr) { nocr = ocr->next; - if (ocr->pid != pid) continue; + if (ocr->pid != pid) + continue; ocr->pid = -1; - (*ocr->maintenance)(OC_REASON_DEATH, ocr->data, status); + (*ocr->maintenance) (OC_REASON_DEATH, ocr->data, status); return 0; } return -1; @@ -1175,21 +1185,22 @@ #undef HAVE_MMAP #define HAVE_MMAP 1 -void reinit_scoreboard (pool *p) +void reinit_scoreboard(pool *p) { ap_assert(!scoreboard_image); - scoreboard_image = (scoreboard *)calloc(HARD_SERVER_LIMIT, sizeof(short_score)); + scoreboard_image = (scoreboard *) calloc(HARD_SERVER_LIMIT, sizeof(short_score)); } -void cleanup_scoreboard () +void cleanup_scoreboard() { ap_assert(scoreboard_image); free(scoreboard_image); scoreboard_image = NULL; } -API_EXPORT(void) sync_scoreboard_image () -{} +API_EXPORT(void) sync_scoreboard_image() +{ +} #else /* MULTITHREAD */ @@ -1203,15 +1214,15 @@ char errstr[MAX_STRING_LEN]; int rc; - m = (caddr_t)create_shared_heap("\\SHAREMEM\\SCOREBOARD", HARD_SERVER_LIMIT*sizeof(short_score)); - if(m == 0) { - fprintf(stderr, "httpd: Could not create OS/2 Shared memory pool.\n"); - exit(1); + m = (caddr_t) create_shared_heap("\\SHAREMEM\\SCOREBOARD", HARD_SERVER_LIMIT * sizeof(short_score)); + if (m == 0) { + fprintf(stderr, "httpd: Could not create OS/2 Shared memory pool.\n"); + exit(1); } - rc = _uopen((Heap_t)m); - if(rc != 0) { - fprintf(stderr, "httpd: Could not uopen() newly created OS/2 Shared memory pool.\n"); + rc = _uopen((Heap_t) m); + if (rc != 0) { + fprintf(stderr, "httpd: Could not uopen() newly created OS/2 Shared memory pool.\n"); } #elif defined(QNX) @@ -1244,19 +1255,19 @@ */ int fd; - fd = shm_open (scoreboard_fname, O_RDWR|O_CREAT, S_IRUSR|S_IWUSR); + fd = shm_open(scoreboard_fname, O_RDWR | O_CREAT, S_IRUSR | S_IWUSR); if (fd == -1) { perror("httpd: could not open(create) scoreboard"); exit(1); } - if (ltrunc(fd, (off_t)SCOREBOARD_SIZE, SEEK_SET) == -1) { + if (ltrunc(fd, (off_t) SCOREBOARD_SIZE, SEEK_SET) == -1) { perror("httpd: could not ltrunc scoreboard"); shm_unlink(scoreboard_fname); exit(1); } - if ((m = (caddr_t)mmap((caddr_t)0, - (size_t)SCOREBOARD_SIZE, PROT_READ|PROT_WRITE, - MAP_SHARED, fd, (off_t)0)) == (caddr_t)-1) { + if ((m = (caddr_t) mmap((caddr_t) 0, + (size_t) SCOREBOARD_SIZE, PROT_READ | PROT_WRITE, + MAP_SHARED, fd, (off_t) 0)) == (caddr_t) - 1) { perror("httpd: cannot mmap scoreboard"); shm_unlink(scoreboard_fname); exit(1); @@ -1278,16 +1289,15 @@ */ { unsigned len = SCOREBOARD_SIZE; - - m = mmap((caddr_t)0xC0000000, &len, - PROT_READ | PROT_WRITE, MAP_ANON | MAP_SHARED, NOFD, 0); + + m = mmap((caddr_t) 0xC0000000, &len, + PROT_READ | PROT_WRITE, MAP_ANON | MAP_SHARED, NOFD, 0); } #else - m = mmap((caddr_t)0, SCOREBOARD_SIZE, + m = mmap((caddr_t) 0, SCOREBOARD_SIZE, PROT_READ | PROT_WRITE, MAP_ANON | MAP_SHARED, -1, 0); #endif - if (m == (caddr_t)-1) - { + if (m == (caddr_t) - 1) { perror("mmap"); fprintf(stderr, "httpd: Could not mmap memory\n"); exit(1); @@ -1297,24 +1307,22 @@ int fd; fd = open("/dev/zero", O_RDWR); - if (fd == -1) - { + if (fd == -1) { perror("open"); fprintf(stderr, "httpd: Could not open /dev/zero\n"); exit(1); } - m = mmap((caddr_t)0, SCOREBOARD_SIZE, + m = mmap((caddr_t) 0, SCOREBOARD_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0); - if (m == (caddr_t)-1) - { + if (m == (caddr_t) - 1) { perror("mmap"); fprintf(stderr, "httpd: Could not mmap /dev/zero\n"); exit(1); } close(fd); #endif - scoreboard_image = (scoreboard *)m; - scoreboard_image->global.exit_generation=0; + scoreboard_image = (scoreboard *) m; + scoreboard_image->global.exit_generation = 0; } #elif defined(HAVE_SHMGET) @@ -1329,13 +1337,12 @@ char *obrk; #endif - if ((shmid = shmget(shmkey, SCOREBOARD_SIZE, IPC_CREAT|SHM_R|SHM_W)) == -1) - { + if ((shmid = shmget(shmkey, SCOREBOARD_SIZE, IPC_CREAT | SHM_R | SHM_W)) == -1) { #ifdef LINUX if (errno == ENOSYS) { fprintf(stderr, - "httpd: Your kernel was built without CONFIG_SYSVIPC\n" - "httpd: please consult the Apache FAQ for details\n"); + "httpd: Your kernel was built without CONFIG_SYSVIPC\n" + "httpd: please consult the Apache FAQ for details\n"); } #endif perror("shmget"); @@ -1356,30 +1363,26 @@ * To get around this, we move the break point "way up there", * attach the segment and then move break back down. Ugly */ - if ((obrk=sbrk(MOVEBREAK)) == (char *)-1) - { + if ((obrk = sbrk(MOVEBREAK)) == (char *) -1) { perror("sbrk"); fprintf(stderr, "httpd: Could not move break\n"); } #endif #define BADSHMAT ((scoreboard *)(-1)) - if ((scoreboard_image = (scoreboard *)shmat(shmid, 0, 0)) == BADSHMAT) - { + if ((scoreboard_image = (scoreboard *) shmat(shmid, 0, 0)) == BADSHMAT) { perror("shmat"); fprintf(stderr, "httpd: Could not call shmat\n"); /* * We exit below, after we try to remove the segment */ } - else /* only worry about permissions if we attached the segment */ - { + else { /* only worry about permissions if we attached the segment */ if (shmctl(shmid, IPC_STAT, &shmbuf) != 0) { perror("shmctl"); fprintf(stderr, "httpd: Could not stat segment #%d\n", shmid); } - else - { + else { shmbuf.shm_perm.uid = user_id; shmbuf.shm_perm.gid = group_id; if (shmctl(shmid, IPC_SET, &shmbuf) != 0) { @@ -1404,15 +1407,14 @@ exit(1); #ifdef MOVEBREAK - if (obrk == (char *)-1) - return; /* nothing else to do */ - if (sbrk(-(MOVEBREAK)) == (char *)-1) - { + if (obrk == (char *) -1) + return; /* nothing else to do */ + if (sbrk(-(MOVEBREAK)) == (char *) -1) { perror("sbrk"); fprintf(stderr, "httpd: Could not move break back\n"); } #endif - scoreboard_image->global.exit_generation=0; + scoreboard_image->global.exit_generation = 0; } #else @@ -1423,81 +1425,79 @@ /* XXX: things are seriously screwed if we ever have to do a partial * read or write ... we could get a corrupted scoreboard */ -static int force_write (int fd, void *buffer, int bufsz) +static int force_write(int fd, void *buffer, int bufsz) { int rv, orig_sz = bufsz; - + do { - rv = write (fd, buffer, bufsz); + rv = write(fd, buffer, bufsz); if (rv > 0) { - buffer = (char *)buffer + rv; + buffer = (char *) buffer + rv; bufsz -= rv; } } while ((rv > 0 && bufsz > 0) || (rv == -1 && errno == EINTR)); - return rv < 0? rv : orig_sz - bufsz; + return rv < 0 ? rv : orig_sz - bufsz; } -static int force_read (int fd, void *buffer, int bufsz) +static int force_read(int fd, void *buffer, int bufsz) { int rv, orig_sz = bufsz; - + do { - rv = read (fd, buffer, bufsz); + rv = read(fd, buffer, bufsz); if (rv > 0) { - buffer = (char *)buffer + rv; + buffer = (char *) buffer + rv; bufsz -= rv; } } while ((rv > 0 && bufsz > 0) || (rv == -1 && errno == EINTR)); - - return rv < 0? rv : orig_sz - bufsz; + + return rv < 0 ? rv : orig_sz - bufsz; } #endif /* Called by parent process */ -void reinit_scoreboard (pool *p) +void reinit_scoreboard(pool *p) { - int exit_gen=0; - if(scoreboard_image) - exit_gen=scoreboard_image->global.exit_generation; - + int exit_gen = 0; + if (scoreboard_image) + exit_gen = scoreboard_image->global.exit_generation; + #ifndef SCOREBOARD_FILE - if (scoreboard_image == NULL) - { + if (scoreboard_image == NULL) { setup_shared_mem(); } memset(scoreboard_image, 0, SCOREBOARD_SIZE); - scoreboard_image->global.exit_generation=exit_gen; + scoreboard_image->global.exit_generation = exit_gen; #else - scoreboard_image=&_scoreboard_image; - scoreboard_fname = server_root_relative (p, scoreboard_fname); + scoreboard_image = &_scoreboard_image; + scoreboard_fname = server_root_relative(p, scoreboard_fname); - scoreboard_fd = popenf(p, scoreboard_fname, O_CREAT|O_BINARY|O_RDWR, 0644); - if (scoreboard_fd == -1) - { - perror (scoreboard_fname); - fprintf (stderr, "Cannot open scoreboard file:\n"); - exit (1); + scoreboard_fd = popenf(p, scoreboard_fname, O_CREAT | O_BINARY | O_RDWR, 0644); + if (scoreboard_fd == -1) { + perror(scoreboard_fname); + fprintf(stderr, "Cannot open scoreboard file:\n"); + exit(1); } - memset ((char*)scoreboard_image, 0, sizeof(*scoreboard_image)); - scoreboard_image->global.exit_generation=exit_gen; - force_write (scoreboard_fd, scoreboard_image, sizeof(*scoreboard_image)); + memset((char *) scoreboard_image, 0, sizeof(*scoreboard_image)); + scoreboard_image->global.exit_generation = exit_gen; + force_write(scoreboard_fd, scoreboard_image, sizeof(*scoreboard_image)); #endif } /* called by child */ -void reopen_scoreboard (pool *p) +void reopen_scoreboard(pool *p) { #ifdef SCOREBOARD_FILE - if (scoreboard_fd != -1) pclosef (p, scoreboard_fd); - - scoreboard_fd = popenf(p, scoreboard_fname, O_CREAT|O_BINARY|O_RDWR, 0666); - if (scoreboard_fd == -1) - { - perror (scoreboard_fname); - fprintf (stderr, "Cannot open scoreboard file:\n"); - exit (1); + if (scoreboard_fd != -1) + pclosef(p, scoreboard_fd); + + scoreboard_fd = popenf(p, scoreboard_fname, O_CREAT | O_BINARY | O_RDWR, 0666); + if (scoreboard_fd == -1) { + perror(scoreboard_fname); + fprintf(stderr, "Cannot open scoreboard file:\n"); + exit(1); } #else #ifdef __EMX__ @@ -1505,23 +1505,23 @@ caddr_t m; int rc; - m = (caddr_t)get_shared_heap("\\SHAREMEM\\SCOREBOARD"); - if(m == 0) { - fprintf(stderr, "httpd: Could not find existing OS/2 Shared memory pool.\n"); - exit(1); + m = (caddr_t) get_shared_heap("\\SHAREMEM\\SCOREBOARD"); + if (m == 0) { + fprintf(stderr, "httpd: Could not find existing OS/2 Shared memory pool.\n"); + exit(1); } - rc = _uopen((Heap_t)m); - scoreboard_image = (scoreboard *)m; + rc = _uopen((Heap_t) m); + scoreboard_image = (scoreboard *) m; #endif #endif #endif } -void cleanup_scoreboard (void) +void cleanup_scoreboard(void) { #ifdef SCOREBOARD_FILE - unlink (scoreboard_fname); + unlink(scoreboard_fname); #elif defined(QNX) && defined(HAVE_MMAP) shm_unlink(scoreboard_fname); #endif @@ -1538,38 +1538,38 @@ * anyway. */ -inline void sync_scoreboard_image (void) +inline void sync_scoreboard_image(void) { #ifdef SCOREBOARD_FILE - lseek (scoreboard_fd, 0L, 0); - force_read (scoreboard_fd, scoreboard_image, sizeof(*scoreboard_image)); + lseek(scoreboard_fd, 0L, 0); + force_read(scoreboard_fd, scoreboard_image, sizeof(*scoreboard_image)); #endif } #endif /* MULTITHREAD */ -API_EXPORT(int) exists_scoreboard_image (void) +API_EXPORT(int) exists_scoreboard_image(void) { return (scoreboard_image ? 1 : 0); } static inline void put_scoreboard_info(int child_num, - short_score *new_score_rec) -{ + short_score *new_score_rec) +{ #ifdef SCOREBOARD_FILE - lseek(scoreboard_fd, (long)child_num * sizeof(short_score), 0); + lseek(scoreboard_fd, (long) child_num * sizeof(short_score), 0); force_write(scoreboard_fd, new_score_rec, sizeof(short_score)); #endif } -int update_child_status (int child_num, int status, request_rec *r) +int update_child_status(int child_num, int status, request_rec *r) { int old_status; short_score *ss; if (child_num < 0) return -1; - + sync_scoreboard_image(); ss = &scoreboard_image->servers[child_num]; old_status = ss->status; @@ -1590,22 +1590,22 @@ ss->my_access_count = 0L; ss->my_bytes_served = 0L; } - ss->conn_count = (unsigned short)0; - ss->conn_bytes = (unsigned long)0; + ss->conn_count = (unsigned short) 0; + ss->conn_bytes = (unsigned long) 0; } if (r) { int slot_size; conn_rec *c = r->connection; slot_size = sizeof(ss->client) - 1; strncpy(ss->client, get_remote_host(c, r->per_dir_config, - REMOTE_NOLOOKUP), slot_size); + REMOTE_NOLOOKUP), slot_size); ss->client[slot_size] = '\0'; slot_size = sizeof(ss->request) - 1; strncpy(ss->request, (r->the_request ? r->the_request : - "NULL"), slot_size); + "NULL"), slot_size); ss->request[slot_size] = '\0'; slot_size = sizeof(ss->vhost) - 1; - strncpy(ss->vhost,r->server->server_hostname, slot_size); + strncpy(ss->vhost, r->server->server_hostname, slot_size); ss->vhost[slot_size] = '\0'; } #endif @@ -1619,14 +1619,14 @@ { #ifdef SCOREBOARD_FILE lseek(scoreboard_fd, - (char *)&scoreboard_image->global-(char *)scoreboard_image,0); - force_write(scoreboard_fd,&scoreboard_image->global, + (char *) &scoreboard_image->global -(char *) scoreboard_image, 0); + force_write(scoreboard_fd, &scoreboard_image->global, sizeof scoreboard_image->global); #endif } #if defined(STATUS) -void time_process_request (int child_num, int status) +void time_process_request(int child_num, int status) { short_score *ss; #if defined(NO_GETTIMEOFDAY) && !defined(NO_TIMES) @@ -1634,8 +1634,8 @@ #endif if (child_num < 0) - return ; - + return; + sync_scoreboard_image(); ss = &scoreboard_image->servers[child_num]; @@ -1644,11 +1644,11 @@ #ifndef NO_TIMES if ((ss->start_time = times(&tms_blk)) == -1) #endif /* NO_TIMES */ - ss->start_time = (clock_t)0; + ss->start_time = (clock_t) 0; #else - if (gettimeofday(&ss->start_time, (struct timezone *)0) < 0) + if (gettimeofday(&ss->start_time, (struct timezone *) 0) < 0) ss->start_time.tv_sec = - ss->start_time.tv_usec = 0L; + ss->start_time.tv_usec = 0L; #endif } else if (status == STOP_PREQUEST) { @@ -1656,13 +1656,13 @@ #ifndef NO_TIMES if ((ss->stop_time = times(&tms_blk)) == -1) #endif - ss->stop_time = ss->start_time = (clock_t)0; + ss->stop_time = ss->start_time = (clock_t) 0; #else - if (gettimeofday(&ss->stop_time, (struct timezone *)0) < 0) + if (gettimeofday(&ss->stop_time, (struct timezone *) 0) < 0) ss->stop_time.tv_sec = - ss->stop_time.tv_usec = - ss->start_time.tv_sec = - ss->start_time.tv_usec = 0L; + ss->stop_time.tv_usec = + ss->start_time.tv_sec = + ss->start_time.tv_usec = 0L; #endif } @@ -1670,33 +1670,34 @@ put_scoreboard_info(child_num, ss); } -static void increment_counts (int child_num, request_rec *r) +static void increment_counts(int child_num, request_rec *r) { - long int bs=0; + long int bs = 0; short_score *ss; sync_scoreboard_image(); ss = &scoreboard_image->servers[child_num]; if (r->sent_bodyct) - bgetopt(r->connection->client, BO_BYTECT, &bs); + bgetopt(r->connection->client, BO_BYTECT, &bs); #ifndef NO_TIMES times(&ss->times); #endif - ss->access_count ++; - ss->my_access_count ++; - ss->conn_count ++; - ss->bytes_served += (unsigned long)bs; - ss->my_bytes_served += (unsigned long)bs; - ss->conn_bytes += (unsigned long)bs; + ss->access_count++; + ss->my_access_count++; + ss->conn_count++; + ss->bytes_served += (unsigned long) bs; + ss->my_bytes_served += (unsigned long) bs; + ss->conn_bytes += (unsigned long) bs; - put_scoreboard_info(child_num, ss); + put_scoreboard_info(child_num, ss); } + #endif -static int find_child_by_pid (int pid) +static int find_child_by_pid(int pid) { int i; @@ -1707,11 +1708,11 @@ return -1; } -static void reclaim_child_processes (int start_tries) +static void reclaim_child_processes(int start_tries) { #ifndef MULTITHREAD int i, status; - long int waittime = 4096; /* in usecs */ + long int waittime = 4096; /* in usecs */ struct timeval tv; int waitret, tries; int not_dead_yet; @@ -1722,13 +1723,13 @@ sync_scoreboard_image(); tries = 0; - for(tries = start_tries; tries < 4; ++tries) { + for (tries = start_tries; tries < 4; ++tries) { /* don't want to hold up progress any more than - * necessary, but we need to allow children a few moments to exit. - * delay with an exponential backoff. - * Currently set for a maximum wait of a bit over - * four seconds. - */ + * necessary, but we need to allow children a few moments to exit. + * delay with an exponential backoff. + * Currently set for a maximum wait of a bit over + * four seconds. + */ tv.tv_sec = waittime / 1000000; tv.tv_usec = waittime % 1000000; waittime = waittime * 2; @@ -1739,9 +1740,10 @@ for (i = 0; i < max_daemons_limit; ++i) { int pid = scoreboard_image->parent[i].pid; - if (pid == my_pid || pid == 0) continue; + if (pid == my_pid || pid == 0) + continue; - waitret = waitpid (pid, &status, WNOHANG); + waitret = waitpid(pid, &status, WNOHANG); if (waitret == pid || waitret == -1) { scoreboard_image->parent[i].pid = 0; continue; @@ -1752,51 +1754,54 @@ /* perhaps it missed the SIGHUP, lets try again */ aplog_error(APLOG_MARK, APLOG_ERR, server_conf, "child process %d did not exit, sending another SIGHUP", - pid); + pid); kill(pid, SIGHUP); break; case 2: /* ok, now it's being annoying */ aplog_error(APLOG_MARK, APLOG_ERR, server_conf, - "child process %d still did not exit, sending a SIGTERM", - pid); + "child process %d still did not exit, sending a SIGTERM", + pid); kill(pid, SIGTERM); break; case 3: /* die child scum */ aplog_error(APLOG_MARK, APLOG_ERR, server_conf, - "child process %d still did not exit, sending a SIGKILL", - pid); + "child process %d still did not exit, sending a SIGKILL", + pid); kill(pid, SIGKILL); break; case 4: /* gave it our best shot, but alas... If this really - * is a child we are trying to kill and it really hasn't - * exited, we will likely fail to bind to the port - * after the restart. - */ + * is a child we are trying to kill and it really hasn't + * exited, we will likely fail to bind to the port + * after the restart. + */ aplog_error(APLOG_MARK, APLOG_ERR, server_conf, - "could not make child process %d exit, " - "attempting to continue anyway", pid); + "could not make child process %d exit, " + "attempting to continue anyway", pid); break; } } #ifndef NO_OTHER_CHILD for (ocr = other_children; ocr; ocr = nocr) { nocr = ocr->next; - if (ocr->pid == -1) continue; + if (ocr->pid == -1) + continue; - waitret = waitpid (ocr->pid, &status, WNOHANG); + waitret = waitpid(ocr->pid, &status, WNOHANG); if (waitret == ocr->pid) { ocr->pid = -1; - (*ocr->maintenance)(OC_REASON_DEATH, ocr->data, status); - } else if (waitret == 0) { - (*ocr->maintenance)(OC_REASON_RESTART, ocr->data, -1); + (*ocr->maintenance) (OC_REASON_DEATH, ocr->data, status); + } + else if (waitret == 0) { + (*ocr->maintenance) (OC_REASON_RESTART, ocr->data, -1); ++not_dead_yet; - } else if (waitret == -1) { + } + else if (waitret == -1) { /* uh what the heck? they didn't call unregister? */ ocr->pid = -1; - (*ocr->maintenance)(OC_REASON_LOST, ocr->data, -1); + (*ocr->maintenance) (OC_REASON_LOST, ocr->data, -1); } } #endif @@ -1811,23 +1816,23 @@ #if defined(BROKEN_WAIT) || defined(NEED_WAITPID) /* -Some systems appear to fail to deliver dead children to wait() at times. -This sorts them out. In fact, this may have been caused by a race condition -in wait_or_timeout(). But this routine is still useful for systems with no -waitpid(). -*/ -int reap_children (void) + Some systems appear to fail to deliver dead children to wait() at times. + This sorts them out. In fact, this may have been caused by a race condition + in wait_or_timeout(). But this routine is still useful for systems with no + waitpid(). + */ +int reap_children(void) { int status, n; int ret = 0; for (n = 0; n < max_daemons_limit; ++n) { if (scoreboard_image->servers[n].status != SERVER_DEAD - && waitpid (scoreboard_image->parent[n].pid, &status, WNOHANG) - == -1 - && errno == ECHILD) { - sync_scoreboard_image (); - update_child_status (n, SERVER_DEAD, NULL); + && waitpid(scoreboard_image->parent[n].pid, &status, WNOHANG) + == -1 + && errno == ECHILD) { + sync_scoreboard_image(); + update_child_status(n, SERVER_DEAD, NULL); ret = 1; } } @@ -1845,40 +1850,36 @@ #endif static int wait_or_timeout_counter; -static int wait_or_timeout (int *status) +static int wait_or_timeout(int *status) { #ifdef WIN32 #define MAXWAITOBJ MAXIMUM_WAIT_OBJECTS HANDLE h[MAXWAITOBJ]; int e[MAXWAITOBJ]; int round, pi, hi, rv, err; - for(round=0; round<=(HARD_SERVER_LIMIT-1)/MAXWAITOBJ+1; round++) - { - hi = 0; - for(pi=round*MAXWAITOBJ; - (pi<(round+1)*MAXWAITOBJ) && (pi<HARD_SERVER_LIMIT); - pi++) - { - if(scoreboard_image->servers[pi].status != SERVER_DEAD) - { - e[hi] = pi; - h[hi++] = (HANDLE)scoreboard_image->parent[pi].pid; - } - - } - if(hi > 0) - { - rv = WaitForMultipleObjects(hi, h, FALSE, 10000); - if(rv == -1) - err = GetLastError(); - if((WAIT_OBJECT_0 <= (unsigned int)rv) && ((unsigned int)rv < (WAIT_OBJECT_0 + hi))) - return(scoreboard_image->parent[e[rv - WAIT_OBJECT_0]].pid); - else if((WAIT_ABANDONED_0 <= (unsigned int)rv) && ((unsigned int)rv < (WAIT_ABANDONED_0 + hi))) - return(scoreboard_image->parent[e[rv - WAIT_ABANDONED_0]].pid); + for (round = 0; round <= (HARD_SERVER_LIMIT - 1) / MAXWAITOBJ + 1; round++) { + hi = 0; + for (pi = round * MAXWAITOBJ; + (pi < (round + 1) * MAXWAITOBJ) && (pi < HARD_SERVER_LIMIT); + pi++) { + if (scoreboard_image->servers[pi].status != SERVER_DEAD) { + e[hi] = pi; + h[hi++] = (HANDLE) scoreboard_image->parent[pi].pid; + } + + } + if (hi > 0) { + rv = WaitForMultipleObjects(hi, h, FALSE, 10000); + if (rv == -1) + err = GetLastError(); + if ((WAIT_OBJECT_0 <= (unsigned int) rv) && ((unsigned int) rv < (WAIT_OBJECT_0 + hi))) + return (scoreboard_image->parent[e[rv - WAIT_OBJECT_0]].pid); + else if ((WAIT_ABANDONED_0 <= (unsigned int) rv) && ((unsigned int) rv < (WAIT_ABANDONED_0 + hi))) + return (scoreboard_image->parent[e[rv - WAIT_ABANDONED_0]].pid); - } + } } - return(-1); + return (-1); #else /* WIN32 */ struct timeval tv; @@ -1891,7 +1892,7 @@ probe_writable_fds(); #endif } - ret = waitpid (-1, status, WNOHANG); + ret = waitpid(-1, status, WNOHANG); if (ret == -1 && errno == EINTR) { return -1; } @@ -1906,22 +1907,24 @@ } -void bus_error(int sig) { +void bus_error(int sig) +{ char emsg[256]; - ap_snprintf(emsg, sizeof(emsg), + ap_snprintf(emsg, sizeof(emsg), "httpd: caught SIGBUS, attempting to dump core in %s", coredump_dir); aplog_error(APLOG_MARK, APLOG_INFO, server_conf, emsg); chdir(coredump_dir); - abort(); + abort(); exit(1); } -void seg_fault(int sig) { +void seg_fault(int sig) +{ char emsg[256]; - ap_snprintf(emsg, sizeof(emsg), + ap_snprintf(emsg, sizeof(emsg), "httpd: caught SIGSEGV, attempting to dump core in %s", coredump_dir); aplog_error(APLOG_MARK, APLOG_INFO, server_conf, emsg); @@ -1934,13 +1937,14 @@ * Connection structures and accounting... */ -void just_die(int sig) /* SIGHUP to child process??? */ -{ +void just_die(int sig) +{ /* SIGHUP to child process??? */ /* if alarms are blocked we have to wait to die otherwise we might * end up with corruption in alloc.c's internal structures */ if (alarms_blocked) { exit_after_unblock = 1; - } else { + } + else { child_exit_modules(pconf, server_conf); destroy_pool(pconf); exit(0); @@ -1950,10 +1954,10 @@ static int volatile usr1_just_die = 1; static int volatile deferred_die; -static void usr1_handler (int sig) +static void usr1_handler(int sig) { if (usr1_just_die) { - just_die (sig); + just_die(sig); } deferred_die = 1; } @@ -1964,11 +1968,12 @@ static int volatile is_graceful; static int volatile generation; -static void sig_term(int sig) { +static void sig_term(int sig) +{ shutdown_pending = 1; } -static void restart (int sig) +static void restart(int sig) { #ifdef WIN32 is_graceful = 0; @@ -2008,10 +2013,10 @@ if (sigaction(SIGUSR1, &sa, NULL) < 0) aplog_error(APLOG_MARK, APLOG_WARNING, server_conf, "sigaction(SIGUSR1)"); #else - if(!one_process) { + if (!one_process) { signal(SIGSEGV, seg_fault); #ifdef SIGBUS - signal(SIGBUS, bus_error); + signal(SIGBUS, bus_error); #endif /* SIGBUS */ } @@ -2039,39 +2044,39 @@ #ifndef MPE /* Don't detach for MPE because child processes can't survive the death of the parent. */ - if((x = fork()) > 0) - exit(0); - else if(x == -1) { - perror("fork"); - fprintf(stderr,"httpd: unable to fork new process\n"); - exit(1); + if ((x = fork()) > 0) + exit(0); + else if (x == -1) { + perror("fork"); + fprintf(stderr, "httpd: unable to fork new process\n"); + exit(1); } #endif #ifndef NO_SETSID - if((pgrp=setsid()) == -1) { - perror("setsid"); - fprintf(stderr,"httpd: setsid failed\n"); - exit(1); + if ((pgrp = setsid()) == -1) { + perror("setsid"); + fprintf(stderr, "httpd: setsid failed\n"); + exit(1); } #elif defined(NEXT) || defined(NEWSOS) - if(setpgrp(0,getpid()) == -1 || (pgrp = getpgrp(0)) == -1) { - perror("setpgrp"); - fprintf(stderr,"httpd: setpgrp or getpgrp failed\n"); - exit(1); + if (setpgrp(0, getpid()) == -1 || (pgrp = getpgrp(0)) == -1) { + perror("setpgrp"); + fprintf(stderr, "httpd: setpgrp or getpgrp failed\n"); + exit(1); } #elif defined(__EMX__) /* OS/2 don't support process group IDs */ - pgrp=-getpid(); + pgrp = -getpid(); #elif defined(MPE) /* MPE uses negative pid for process group */ - pgrp=-getpid(); + pgrp = -getpid(); #else - if((pgrp=setpgrp(getpid(),0)) == -1) { - perror("setpgrp"); - fprintf(stderr,"httpd: setpgrp failed\n"); - exit(1); + if ((pgrp = setpgrp(getpid(), 0)) == -1) { + perror("setpgrp"); + fprintf(stderr, "httpd: setpgrp failed\n"); + exit(1); } -#endif +#endif #endif /* ndef WIN32 */ } @@ -2086,67 +2091,69 @@ * the lookup of to uid --- the same uid may have multiple passwd entries, * with different sets of groups for each. */ - + static void set_group_privs(void) { #ifndef WIN32 - if(!geteuid()) { - char *name; - - /* Get username if passed as a uid */ - - if (user_name[0] == '#') { - struct passwd* ent; - uid_t uid=atoi(&user_name[1]); - - if ((ent = getpwuid(uid)) == NULL) { - aplog_error(APLOG_MARK, APLOG_ALERT, server_conf, - "getpwuid: couldn't determine user name from uid"); - exit(1); - } - - name = ent->pw_name; - } else name = user_name; + if (!geteuid()) { + char *name; + + /* Get username if passed as a uid */ + + if (user_name[0] == '#') { + struct passwd *ent; + uid_t uid = atoi(&user_name[1]); + + if ((ent = getpwuid(uid)) == NULL) { + aplog_error(APLOG_MARK, APLOG_ALERT, server_conf, + "getpwuid: couldn't determine user name from uid"); + exit(1); + } + + name = ent->pw_name; + } + else + name = user_name; #ifndef __EMX__ - /* OS/2 dosen't support groups. */ + /* OS/2 dosen't support groups. */ - /* Reset `groups' attributes. */ - - if (initgroups(name, group_id) == -1) { - aplog_error(APLOG_MARK, APLOG_ALERT, server_conf, - "initgroups: unable to set groups"); - exit (1); - } + /* Reset `groups' attributes. */ + + if (initgroups(name, group_id) == -1) { + aplog_error(APLOG_MARK, APLOG_ALERT, server_conf, + "initgroups: unable to set groups"); + exit(1); + } #ifdef MULTIPLE_GROUPS - if (getgroups(NGROUPS_MAX, group_id_list) == -1) { - aplog_error(APLOG_MARK, APLOG_ALERT, server_conf, - "getgroups: unable to get group list"); - exit (1); - } + if (getgroups(NGROUPS_MAX, group_id_list) == -1) { + aplog_error(APLOG_MARK, APLOG_ALERT, server_conf, + "getgroups: unable to get group list"); + exit(1); + } +#endif + if (setgid(group_id) == -1) { + aplog_error(APLOG_MARK, APLOG_ALERT, server_conf, + "setgid: unable to set group id"); + exit(1); + } #endif - if (setgid(group_id) == -1) { - aplog_error(APLOG_MARK, APLOG_ALERT, server_conf, - "setgid: unable to set group id"); - exit (1); } -#endif - } #endif /* ndef WIN32 */ } /* check to see if we have the 'suexec' setuid wrapper installed */ -int init_suexec (void) +int init_suexec(void) { #ifndef WIN32 struct stat wrapper; - + if ((stat(SUEXEC_BIN, &wrapper)) != 0) - return (suexec_enabled); - + return (suexec_enabled); + if ((wrapper.st_mode & S_ISUID) && wrapper.st_uid == 0) { - suexec_enabled = 1; - fprintf(stderr, "Configuring Apache for use with suexec wrapper.\n"); + suexec_enabled = 1; + fprintf(stderr, "Configuring Apache for use with suexec wrapper.\n"); } #endif /* ndef WIN32 */ return (suexec_enabled); @@ -2163,21 +2170,21 @@ * * Hash function provided by David Hankins. */ -static inline unsigned hash_inaddr( unsigned key ) +static inline unsigned hash_inaddr(unsigned key) { key ^= (key >> 16); return ((key >> 8) ^ key) % VHASH_TABLE_SIZE; } -static server_rec *find_virtual_server (struct in_addr server_ip, - unsigned port, server_rec *server) +static server_rec *find_virtual_server(struct in_addr server_ip, + unsigned port, server_rec *server) { server_addr_rec *sar; server_rec_chain *trav; unsigned buk; /* scan the hash table for an exact match first */ - buk = hash_inaddr( server_ip.s_addr ); + buk = hash_inaddr(server_ip.s_addr); for (trav = vhash_table[buk]; trav; trav = trav->next) { sar = trav->sar; if ((sar->host_addr.s_addr == server_ip.s_addr) @@ -2197,12 +2204,12 @@ } -static void add_to_vhash_bucket (unsigned buk, server_rec *s, - server_addr_rec *sar) +static void add_to_vhash_bucket(unsigned buk, server_rec *s, + server_addr_rec *sar) { server_rec_chain *hashme; - hashme = palloc (pconf, sizeof (*hashme)); + hashme = palloc(pconf, sizeof(*hashme)); hashme->server = s; hashme->sar = sar; hashme->next = vhash_table[buk]; @@ -2215,12 +2222,12 @@ */ #define VHASH_STATISTICS #ifdef VHASH_STATISTICS -static int vhash_compare (const void *a, const void *b) +static int vhash_compare(const void *a, const void *b) { - return (*(const int *)b - *(const int *)a); + return (*(const int *) b - *(const int *) a); } -static void dump_vhash_statistics (void) +static void dump_vhash_statistics(void) { unsigned count[VHASH_TABLE_SIZE + VHASH_EXTRA_SLOP]; int i; @@ -2240,24 +2247,25 @@ } } } - qsort (count, VHASH_TABLE_SIZE, sizeof (count[0]), vhash_compare); - p = buf + ap_snprintf (buf, sizeof (buf), - "vhash: total hashed = %u, avg chain = %u, #default = %u, " - "#name-vhost = %u, chain lengths (count x len):", - total, total / VHASH_TABLE_SIZE, count [VHASH_DEFAULT_BUCKET], - count [VHASH_MAIN_BUCKET]); + qsort(count, VHASH_TABLE_SIZE, sizeof(count[0]), vhash_compare); + p = buf + ap_snprintf(buf, sizeof(buf), + "vhash: total hashed = %u, avg chain = %u, #default = %u, " + "#name-vhost = %u, chain lengths (count x len):", + total, total / VHASH_TABLE_SIZE, count[VHASH_DEFAULT_BUCKET], + count[VHASH_MAIN_BUCKET]); total = 1; for (i = 1; i < VHASH_TABLE_SIZE; ++i) { - if (count[i-1] != count[i]) { - p += ap_snprintf (p, sizeof (buf) - (p - buf), " %ux%u", - total, count[i-1]); + if (count[i - 1] != count[i]) { + p += ap_snprintf(p, sizeof(buf) - (p - buf), " %ux%u", + total, count[i - 1]); total = 1; - } else { + } + else { ++total; } } - p += ap_snprintf(p, sizeof (buf) - (p - buf), " %ux%u", - total, count[VHASH_TABLE_SIZE-1]); + p += ap_snprintf(p, sizeof(buf) - (p - buf), " %ux%u", + total, count[VHASH_TABLE_SIZE - 1]); aplog_error(APLOG_MARK, APLOG_DEBUG, server_conf, buf); } #endif @@ -2271,7 +2279,7 @@ server_addr_rec *sar; server_addr_rec *main_sar; int has_default_vhost_addr; - int from_local=0; + int from_local = 0; server_rec *s; int is_namevhost; @@ -2285,14 +2293,15 @@ def_hostname = s->server_hostname; h = gethostbyname(def_hostname); - if( h == NULL ) { - fprintf(stderr,"httpd: cannot determine the IP address of "); + if (h == NULL) { + fprintf(stderr, "httpd: cannot determine the IP address of "); if (from_local) { - fprintf(stderr,"the local host (%s). Use ServerName to set it manually.\n", - s->server_hostname ? s->server_hostname : "<NULL>"); - } else { - fprintf(stderr,"the specified ServerName (%s).\n", - s->server_hostname ? s->server_hostname : "<NULL>"); + fprintf(stderr, "the local host (%s). Use ServerName to set it manually.\n", + s->server_hostname ? s->server_hostname : "<NULL>"); + } + else { + fprintf(stderr, "the specified ServerName (%s).\n", + s->server_hostname ? s->server_hostname : "<NULL>"); }; exit(1); } @@ -2303,14 +2312,14 @@ * clobbered here if we didn't copy it somewhere. -djg */ for (n = 0; h->h_addr_list[n] != NULL; n++) { - main_sar = pcalloc (pconf, sizeof (*main_sar)); - main_sar->host_addr = *(struct in_addr *)h->h_addr_list[n]; + main_sar = pcalloc(pconf, sizeof(*main_sar)); + main_sar->host_addr = *(struct in_addr *) h->h_addr_list[n]; main_sar->host_port = 0; /* we want this to match all ports */ main_sar->virthost = s->server_hostname; main_sar->next = s->addrs; s->addrs = main_sar; - add_to_vhash_bucket (hash_inaddr (main_sar->host_addr.s_addr), - s, main_sar); + add_to_vhash_bucket(hash_inaddr(main_sar->host_addr.s_addr), + s, main_sar); } /* Then virtual hosts */ @@ -2318,12 +2327,12 @@ for (s = s->next; s; s = s->next) { /* Check to see if we might be a HTTP/1.1 virtual host - same IP */ has_default_vhost_addr = 0; - for(sar = s->addrs; sar; sar = sar->next) { - is_namevhost = 0; /* guess addr doesn't match main server */ - for (main_sar = main_s->addrs; main_sar; main_sar=main_sar->next) { + for (sar = s->addrs; sar; sar = sar->next) { + is_namevhost = 0; /* guess addr doesn't match main server */ + for (main_sar = main_s->addrs; main_sar; main_sar = main_sar->next) { if (sar->host_addr.s_addr == main_sar->host_addr.s_addr && s->port == main_s->port) { - add_to_vhash_bucket (VHASH_MAIN_BUCKET, s, sar); + add_to_vhash_bucket(VHASH_MAIN_BUCKET, s, sar); /* XXX: only add it to the main bucket once since we're * not optimizing name-vhosts yet */ s->is_virtual = 2; @@ -2338,84 +2347,89 @@ * since we need to do a port test */ has_default_vhost_addr = 1; - add_to_vhash_bucket (VHASH_DEFAULT_BUCKET, s, sar); - } else if (!is_namevhost) { - add_to_vhash_bucket (hash_inaddr (sar->host_addr.s_addr), - s, sar); + add_to_vhash_bucket(VHASH_DEFAULT_BUCKET, s, sar); + } + else if (!is_namevhost) { + add_to_vhash_bucket(hash_inaddr(sar->host_addr.s_addr), + s, sar); } } /* FIXME: some of this decision doesn't make a lot of sense in - the presence of multiple addresses on the <VirtualHost> - directive. It should issue warnings here perhaps. -djg */ - if (!s->server_hostname) { + the presence of multiple addresses on the <VirtualHost> + directive. It should issue warnings here perhaps. -djg */ + if (!s->server_hostname) { if (s->is_virtual == 2) { if (s->addrs) { s->server_hostname = s->addrs->virthost; - } else { + } + else { /* what else can we do? at this point this vhost has - no configured name, probably because they used - DNS in the VirtualHost statement. It's disabled - anyhow by the host matching code. -djg */ - s->server_hostname = - pstrdup (pconf, "bogus_host_without_forward_dns"); + no configured name, probably because they used + DNS in the VirtualHost statement. It's disabled + anyhow by the host matching code. -djg */ + s->server_hostname = + pstrdup(pconf, "bogus_host_without_forward_dns"); } - } else if (has_default_vhost_addr) { + } + else if (has_default_vhost_addr) { s->server_hostname = def_hostname; - } else { + } + else { if (s->addrs - && (h = gethostbyaddr ((char *)&(s->addrs->host_addr), - sizeof (struct in_addr), AF_INET))) { - s->server_hostname = pstrdup (pconf, (char *)h->h_name); - } else { + && (h = gethostbyaddr((char *) &(s->addrs->host_addr), + sizeof(struct in_addr), AF_INET))) { + s->server_hostname = pstrdup(pconf, (char *) h->h_name); + } + else { /* again, what can we do? They didn't specify a - ServerName, and their DNS isn't working. -djg */ + ServerName, and their DNS isn't working. -djg */ if (s->addrs) { fprintf(stderr, "Failed to resolve server name " - "for %s (check DNS)\n", - inet_ntoa(s->addrs->host_addr)); + "for %s (check DNS)\n", + inet_ntoa(s->addrs->host_addr)); } s->server_hostname = - pstrdup (pconf, "bogus_host_without_reverse_dns"); + pstrdup(pconf, "bogus_host_without_reverse_dns"); } } } } #ifdef VHASH_STATISTICS - dump_vhash_statistics (); + dump_vhash_statistics(); #endif } -conn_rec *new_connection (pool *p, server_rec *server, BUFF *inout, - const struct sockaddr_in *remaddr, - const struct sockaddr_in *saddr, - int child_num) +conn_rec *new_connection(pool *p, server_rec *server, BUFF *inout, + const struct sockaddr_in *remaddr, + const struct sockaddr_in *saddr, + int child_num) { - conn_rec *conn = (conn_rec *)pcalloc (p, sizeof(conn_rec)); - + conn_rec *conn = (conn_rec *) pcalloc(p, sizeof(conn_rec)); + /* Got a connection structure, so initialize what fields we can * (the rest are zeroed out by pcalloc). */ - + conn->child_num = child_num; - + conn->pool = p; conn->local_addr = *saddr; conn->server = find_virtual_server(saddr->sin_addr, ntohs(saddr->sin_port), server); conn->base_server = conn->server; conn->client = inout; - + conn->remote_addr = *remaddr; - conn->remote_ip = pstrdup (conn->pool, - inet_ntoa(conn->remote_addr.sin_addr)); + conn->remote_ip = pstrdup(conn->pool, + inet_ntoa(conn->remote_addr.sin_addr)); return conn; } #if defined(TCP_NODELAY) && !defined(MPE) -static void sock_disable_nagle (int s) +static void sock_disable_nagle(int s) { /* The Nagle algorithm says that we should delay sending partial * packets in hopes of getting more data. We don't want to do @@ -2428,14 +2442,15 @@ */ int just_say_no = 1; - if (setsockopt(s, IPPROTO_TCP, TCP_NODELAY, (char*)&just_say_no, - sizeof(int)) < 0) { - aplog_error(APLOG_MARK, APLOG_WARNING, server_conf, + if (setsockopt(s, IPPROTO_TCP, TCP_NODELAY, (char *) &just_say_no, + sizeof(int)) < 0) { + aplog_error(APLOG_MARK, APLOG_WARNING, server_conf, "setsockopt: (TCP_NODELAY)"); } } + #else -#define sock_disable_nagle(s) /* NOOP */ +#define sock_disable_nagle(s) /* NOOP */ #endif @@ -2446,11 +2461,11 @@ /* note that because we're about to slack we don't use psocket */ block_alarms(); - if ((s = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP)) == -1) { - aplog_error(APLOG_MARK, APLOG_CRIT, server_conf, + if ((s = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) == -1) { + aplog_error(APLOG_MARK, APLOG_CRIT, server_conf, "socket: Failed to get a socket, exiting child"); unblock_alarms(); - exit(1); + exit(1); } /* Solaris (probably versions 2.4, 2.5, and 2.5.1 with various levels @@ -2465,31 +2480,31 @@ #ifndef WORKAROUND_SOLARIS_BUG s = ap_slack(s, AP_SLACK_HIGH); - note_cleanups_for_socket(p, s); /* arrange to close on exec or restart */ + note_cleanups_for_socket(p, s); /* arrange to close on exec or restart */ unblock_alarms(); #endif #ifndef MPE /* MPE does not support SO_REUSEADDR and SO_KEEPALIVE */ - if (setsockopt(s, SOL_SOCKET, SO_REUSEADDR, (char *)&one, sizeof(int)) < 0) { - aplog_error(APLOG_MARK, APLOG_CRIT, server_conf, + if (setsockopt(s, SOL_SOCKET, SO_REUSEADDR, (char *) &one, sizeof(int)) < 0) { + aplog_error(APLOG_MARK, APLOG_CRIT, server_conf, "setsockopt: (SO_REUSEADDR)"); - exit(1); + exit(1); } one = 1; #ifndef BEOS /* BeOS does not support SO_KEEPALIVE */ - if (setsockopt(s, SOL_SOCKET,SO_KEEPALIVE,(char *)&one,sizeof(int)) < 0) { - aplog_error(APLOG_MARK, APLOG_CRIT, server_conf, + if (setsockopt(s, SOL_SOCKET, SO_KEEPALIVE, (char *) &one, sizeof(int)) < 0) { + aplog_error(APLOG_MARK, APLOG_CRIT, server_conf, "setsockopt: (SO_KEEPALIVE)"); - exit(1); + exit(1); } #endif #endif sock_disable_nagle(s); sock_enable_linger(s); - + /* * To send data over high bandwidth-delay connections at full * speed we must force the TCP window to open wide enough to keep the @@ -2509,11 +2524,11 @@ * * If no size is specified, use the kernel default. */ -#ifndef BEOS /* BeOS does not support SO_SNDBUF */ +#ifndef BEOS /* BeOS does not support SO_SNDBUF */ if (server_conf->send_buffer_size) { - if (setsockopt(s, SOL_SOCKET, SO_SNDBUF, - (char *)&server_conf->send_buffer_size, sizeof(int)) < 0) { - aplog_error(APLOG_MARK, APLOG_WARNING, server_conf, + if (setsockopt(s, SOL_SOCKET, SO_SNDBUF, + (char *) &server_conf->send_buffer_size, sizeof(int)) < 0) { + aplog_error(APLOG_MARK, APLOG_WARNING, server_conf, "setsockopt: (SO_SNDBUF): Failed to set SendBufferSize, using default"); /* not a fatal error */ } @@ -2522,29 +2537,32 @@ #ifdef MPE /* MPE requires CAP=PM and GETPRIVMODE to bind to ports less than 1024 */ - if (ntohs(server->sin_port) < 1024) GETPRIVMODE(); + if (ntohs(server->sin_port) < 1024) + GETPRIVMODE(); #endif - if(bind(s, (struct sockaddr *)server,sizeof(struct sockaddr_in)) == -1) { - perror("bind"); + if (bind(s, (struct sockaddr *) server, sizeof(struct sockaddr_in)) == -1) { + perror("bind"); #ifdef MPE - if (ntohs(server->sin_port) < 1024) GETUSERMODE(); + if (ntohs(server->sin_port) < 1024) + GETUSERMODE(); #endif if (server->sin_addr.s_addr != htonl(INADDR_ANY)) - fprintf(stderr,"httpd: could not bind to address %s port %d\n", + fprintf(stderr, "httpd: could not bind to address %s port %d\n", inet_ntoa(server->sin_addr), ntohs(server->sin_port)); else - fprintf(stderr,"httpd: could not bind to port %d\n", + fprintf(stderr, "httpd: could not bind to port %d\n", ntohs(server->sin_port)); - exit(1); + exit(1); } #ifdef MPE - if (ntohs(server->sin_port) < 1024) GETUSERMODE(); + if (ntohs(server->sin_port) < 1024) + GETUSERMODE(); #endif if (listen(s, listenbacklog) == -1) { aplog_error(APLOG_MARK, APLOG_ERR, server_conf, "listen: unable to listen for connections"); - close (s); + close(s); #ifdef WORKAROUND_SOLARIS_BUG unblock_alarms(); #endif @@ -2554,7 +2572,7 @@ #ifdef WORKAROUND_SOLARIS_BUG s = ap_slack(s, AP_SLACK_HIGH); - note_cleanups_for_socket(p, s); /* arrange to close on exec or restart */ + note_cleanups_for_socket(p, s); /* arrange to close on exec or restart */ unblock_alarms(); #endif return s; @@ -2586,8 +2604,8 @@ do { listen_rec *nr = malloc(sizeof *nr); if (nr == NULL) { - fprintf (stderr, "Ouch! malloc failed in copy_listeners()\n"); - exit (1); + fprintf(stderr, "Ouch! malloc failed in copy_listeners()\n"); + exit(1); } *nr = *lr; kill_cleanups_for_socket(p, nr->fd); @@ -2634,25 +2652,27 @@ int fd; listenmaxfd = -1; - FD_ZERO (&listenfds); + FD_ZERO(&listenfds); lr = listeners; - for(;;) { - fd = find_listener (lr); + for (;;) { + fd = find_listener(lr); if (fd < 0) { - fd = make_sock (p, &lr->local_addr); + fd = make_sock(p, &lr->local_addr); } if (fd >= 0) { - FD_SET (fd, &listenfds); - if (fd > listenmaxfd) listenmaxfd = fd; + FD_SET(fd, &listenfds); + if (fd > listenmaxfd) + listenmaxfd = fd; } lr->fd = fd; - if (lr->next == NULL) break; + if (lr->next == NULL) + break; lr = lr->next; } /* turn the list into a ring */ lr->next = listeners; head_listener = listeners; - close_unused_listeners (); + close_unused_listeners(); } @@ -2660,10 +2680,10 @@ * Find a listener which is ready for accept(). This advances the * head_listener global. */ -static inline listen_rec *find_ready_listener(fd_set *main_fds) +static inline listen_rec *find_ready_listener(fd_set * main_fds) { listen_rec *lr; - + lr = head_listener; do { if (FD_ISSET(lr->fd, main_fds)) { @@ -2678,53 +2698,48 @@ static int s_iInitCount = 0; -int -AMCSocketInitialize(void) +int AMCSocketInitialize(void) { #ifdef WIN32 int iVersionRequested; WSADATA wsaData; int err; - - if(s_iInitCount > 0) - { - s_iInitCount++; - return(0); + + if (s_iInitCount > 0) { + s_iInitCount++; + return (0); } - else if(s_iInitCount < 0) - return(s_iInitCount); + else if (s_iInitCount < 0) + return (s_iInitCount); /* s_iInitCount == 0. Do the initailization */ iVersionRequested = MAKEWORD(1, 1); - err = WSAStartup((WORD)iVersionRequested, &wsaData); - if(err) - { - s_iInitCount = -1; - return(s_iInitCount); - } - if ( LOBYTE( wsaData.wVersion ) != 1 || - HIBYTE( wsaData.wVersion ) != 1 ) - { - s_iInitCount = -2; - WSACleanup(); - return(s_iInitCount); + err = WSAStartup((WORD) iVersionRequested, &wsaData); + if (err) { + s_iInitCount = -1; + return (s_iInitCount); + } + if (LOBYTE(wsaData.wVersion) != 1 || + HIBYTE(wsaData.wVersion) != 1) { + s_iInitCount = -2; + WSACleanup(); + return (s_iInitCount); } #else signal(SIGPIPE, SIG_IGN); #endif /* WIN32 */ s_iInitCount++; - return(s_iInitCount); + return (s_iInitCount); } -void -AMCSocketCleanup(void) +void AMCSocketCleanup(void) { #ifdef WIN32 - if(--s_iInitCount == 0) - WSACleanup(); + if (--s_iInitCount == 0) + WSACleanup(); #else /* not WIN32 */ s_iInitCount--; #endif /* WIN32 */ @@ -2744,12 +2759,12 @@ static int requests_this_child; static fd_set main_fds; -API_EXPORT(void) child_terminate (request_rec *r) +API_EXPORT(void) child_terminate(request_rec *r) { r->connection->keepalive = 0; requests_this_child = max_requests_per_child = 1; } - + void child_main(int child_num_arg) { NET_SIZE_T clen; @@ -2769,108 +2784,111 @@ #ifdef MPE /* Only try to switch if we're running as MANAGER.SYS */ if (geteuid() == 1 && user_id > 1) { - GETPRIVMODE(); - if (setuid(user_id) == -1) { - GETUSERMODE(); + GETPRIVMODE(); + if (setuid(user_id) == -1) { + GETUSERMODE(); + aplog_error(APLOG_MARK, APLOG_ALERT, server_conf, + "setuid: unable to change uid"); + exit(1); + } + GETUSERMODE(); + } #else /* Only try to switch if we're running as root */ if (!geteuid() && setuid(user_id) == -1) { -#endif - aplog_error(APLOG_MARK, APLOG_ALERT, server_conf, + aplog_error(APLOG_MARK, APLOG_ALERT, server_conf, "setuid: unable to change uid"); - exit (1); - } -#ifdef MPE - GETUSERMODE(); + exit(1); } #endif child_init_modules(pconf, server_conf); - (void)update_child_status(my_child_num, SERVER_READY, (request_rec*)NULL); + (void) update_child_status(my_child_num, SERVER_READY, (request_rec *) NULL); /* * Setup the jump buffers so that we can return here after * a signal or a timeout (yeah, I know, same thing). */ - ap_setjmp (jmpbuffer); + ap_setjmp(jmpbuffer); #ifndef __EMX__ signal(SIGURG, timeout); -#endif - signal(SIGPIPE, timeout); +#endif + signal(SIGPIPE, timeout); signal(SIGALRM, alrm_handler); while (1) { BUFF *conn_io; request_rec *r; - + /* Prepare to receive a SIGUSR1 due to graceful restart so that * we can exit cleanly. Since we're between connections right * now it's the right time to exit, but we might be blocked in a * system call when the graceful restart request is made. */ usr1_just_die = 1; - signal (SIGUSR1, usr1_handler); + signal(SIGUSR1, usr1_handler); - /* - * (Re)initialize this child to a pre-connection state. - */ + /* + * (Re)initialize this child to a pre-connection state. + */ kill_timeout(0); /* Cancel any outstanding alarms. */ - timeout_req = NULL; /* No request in progress */ + timeout_req = NULL; /* No request in progress */ current_conn = NULL; - - clear_pool (ptrans); - + + clear_pool(ptrans); + sync_scoreboard_image(); if (scoreboard_image->global.exit_generation >= generation) { child_exit_modules(pconf, server_conf); destroy_pool(pconf); exit(0); } - + if ((max_requests_per_child > 0 - && ++requests_this_child >= max_requests_per_child)) - { + && ++requests_this_child >= max_requests_per_child)) { child_exit_modules(pconf, server_conf); destroy_pool(pconf); exit(0); } - (void)update_child_status(my_child_num, SERVER_READY, (request_rec*)NULL); + (void) update_child_status(my_child_num, SERVER_READY, (request_rec *) NULL); - /* - * Wait for an acceptable connection to arrive. - */ + /* + * Wait for an acceptable connection to arrive. + */ /* Lock around "accept", if necessary */ - SAFE_ACCEPT(accept_mutex_on()); + SAFE_ACCEPT(accept_mutex_on()); - for (;;) { + for (;;) { if (listeners->next != listeners) { /* more than one socket */ memcpy(&main_fds, &listenfds, sizeof(fd_set)); - srv = ap_select(listenmaxfd+1, &main_fds, NULL, NULL, NULL); + srv = ap_select(listenmaxfd + 1, &main_fds, NULL, NULL, NULL); if (srv < 0 && errno != EINTR) { #ifdef LINUX if (errno == EFAULT) { aplog_error(APLOG_MARK, APLOG_ERR, server_conf, - "select: (listen) fatal, exiting"); - child_exit_modules (pconf, server_conf); + "select: (listen) fatal, exiting"); + child_exit_modules(pconf, server_conf); destroy_pool(pconf); exit(1); } #endif aplog_error(APLOG_MARK, APLOG_ERR, server_conf, "select: (listen)"); } - + if (srv <= 0) continue; lr = find_ready_listener(&main_fds); - if (lr == NULL) continue; + if (lr == NULL) + continue; sd = lr->fd; - } else { + } + else { /* only one socket, just pretend we did the other stuff */ sd = listeners->fd; } @@ -2880,10 +2898,11 @@ */ deferred_die = 0; usr1_just_die = 0; - for (;;) { - clen = sizeof(sa_client); - csd = accept(sd, &sa_client, &clen); - if (csd >= 0 || errno != EINTR) break; + for (;;) { + clen = sizeof(sa_client); + csd = accept(sd, &sa_client, &clen); + if (csd >= 0 || errno != EINTR) + break; if (deferred_die) { /* we didn't get a socket, and we were told to die */ child_exit_modules(pconf, server_conf); @@ -2892,20 +2911,20 @@ } } - if (csd >= 0) - break; /* We have a socket ready for reading */ - else { + if (csd >= 0) + break; /* We have a socket ready for reading */ + else { #if defined(EPROTO) && defined(ECONNABORTED) - if ((errno != EPROTO) && (errno != ECONNABORTED)) + if ((errno != EPROTO) && (errno != ECONNABORTED)) #elif defined(EPROTO) - if (errno != EPROTO) + if (errno != EPROTO) #elif defined(ECONNABORTED) - if (errno != ECONNABORTED) + if (errno != ECONNABORTED) #endif - aplog_error(APLOG_MARK, APLOG_ERR, server_conf, - "accept: (client socket)"); - } + aplog_error(APLOG_MARK, APLOG_ERR, server_conf, + "accept: (client socket)"); + } /* go around again, safe to die */ usr1_just_die = 1; @@ -2924,21 +2943,21 @@ destroy_pool(pconf); exit(0); } - } + } - SAFE_ACCEPT(accept_mutex_off()); /* unlock after "accept" */ + SAFE_ACCEPT(accept_mutex_off()); /* unlock after "accept" */ /* We've got a socket, let's at least process one request off the * socket before we accept a graceful restart request. */ - signal (SIGUSR1, SIG_IGN); + signal(SIGUSR1, SIG_IGN); - note_cleanups_for_fd(ptrans,csd); + note_cleanups_for_fd(ptrans, csd); - /* - * We now have a connection, so set it up with the appropriate - * socket options, file descriptors, and read/write buffers. - */ + /* + * We now have a connection, so set it up with the appropriate + * socket options, file descriptors, and read/write buffers. + */ clen = sizeof(sa_server); if (getsockname(csd, &sa_server, &clen) < 0) { @@ -2948,70 +2967,70 @@ sock_disable_nagle(csd); - (void)update_child_status(my_child_num, SERVER_BUSY_READ, - (request_rec*)NULL); + (void) update_child_status(my_child_num, SERVER_BUSY_READ, + (request_rec *) NULL); conn_io = bcreate(ptrans, B_RDWR | B_SOCKET); #ifdef B_SFIO - (void)sfdisc(conn_io->sf_in, SF_POPDISC); + (void) sfdisc(conn_io->sf_in, SF_POPDISC); sfdisc(conn_io->sf_in, bsfio_new(conn_io->pool, conn_io)); sfsetbuf(conn_io->sf_in, NULL, 0); - (void)sfdisc(conn_io->sf_out, SF_POPDISC); + (void) sfdisc(conn_io->sf_out, SF_POPDISC); sfdisc(conn_io->sf_out, bsfio_new(conn_io->pool, conn_io)); sfsetbuf(conn_io->sf_out, NULL, 0); #endif - + dupped_csd = csd; #if defined(NEED_DUPPED_CSD) if ((dupped_csd = dup(csd)) < 0) { aplog_error(APLOG_MARK, APLOG_ERR, server_conf, "dup: couldn't duplicate csd"); - dupped_csd = csd; /* Oh well... */ + dupped_csd = csd; /* Oh well... */ } - note_cleanups_for_fd(ptrans,dupped_csd); + note_cleanups_for_fd(ptrans, dupped_csd); #endif bpushfd(conn_io, csd, dupped_csd); - current_conn = new_connection (ptrans, server_conf, conn_io, - (struct sockaddr_in *)&sa_client, - (struct sockaddr_in *)&sa_server, - my_child_num); - - /* - * Read and process each request found on our connection - * until no requests are left or we decide to close. - */ + current_conn = new_connection(ptrans, server_conf, conn_io, + (struct sockaddr_in *) &sa_client, + (struct sockaddr_in *) &sa_server, + my_child_num); + + /* + * Read and process each request found on our connection + * until no requests are left or we decide to close. + */ - while ((r = read_request(current_conn)) != NULL) { + while ((r = read_request(current_conn)) != NULL) { /* read_request_line has already done a * signal (SIGUSR1, SIG_IGN); */ - (void)update_child_status(my_child_num, SERVER_BUSY_WRITE, r); + (void) update_child_status(my_child_num, SERVER_BUSY_WRITE, r); - process_request(r); + process_request(r); #if defined(STATUS) - increment_counts(my_child_num, r); + increment_counts(my_child_num, r); #endif - if (!current_conn->keepalive || current_conn->aborted) - break; + if (!current_conn->keepalive || current_conn->aborted) + break; - destroy_pool(r->pool); - (void)update_child_status(my_child_num, SERVER_BUSY_KEEPALIVE, - (request_rec*)NULL); + destroy_pool(r->pool); + (void) update_child_status(my_child_num, SERVER_BUSY_KEEPALIVE, + (request_rec *) NULL); - sync_scoreboard_image(); - if (scoreboard_image->global.exit_generation >= generation) { - bclose(conn_io); + sync_scoreboard_image(); + if (scoreboard_image->global.exit_generation >= generation) { + bclose(conn_io); child_exit_modules(pconf, server_conf); destroy_pool(pconf); exit(0); - } + } /* In case we get a graceful restart while we're blocked * waiting for the request. @@ -3027,31 +3046,31 @@ * of network latencies and server timeouts. */ usr1_just_die = 1; - signal (SIGUSR1, usr1_handler); - } + signal(SIGUSR1, usr1_handler); + } - /* - * Close the connection, being careful to send out whatever is still - * in our buffers. If possible, try to avoid a hard close until the - * client has ACKed our FIN and/or has stopped sending us data. - */ + /* + * Close the connection, being careful to send out whatever is still + * in our buffers. If possible, try to avoid a hard close until the + * client has ACKed our FIN and/or has stopped sending us data. + */ #ifdef NO_LINGCLOSE - bclose(conn_io); /* just close it */ + bclose(conn_io); /* just close it */ #else - if (r && r->connection - && !r->connection->aborted - && r->connection->client - && (r->connection->client->fd >= 0)) { - - lingering_close(r); - } - else { - bsetflag(conn_io, B_EOUT, 1); - bclose(conn_io); - } + if (r && r->connection + && !r->connection->aborted + && r->connection->client + && (r->connection->client->fd >= 0)) { + + lingering_close(r); + } + else { + bsetflag(conn_io, B_EOUT, 1); + bclose(conn_io); + } #endif - } + } } static int make_child(server_rec *s, int slot, time_t now) @@ -3063,16 +3082,16 @@ } if (one_process) { - signal (SIGHUP, just_die); - signal (SIGTERM, just_die); - child_main (slot); + signal(SIGHUP, just_die); + signal(SIGTERM, just_die); + child_main(slot); } /* avoid starvation */ head_listener = head_listener->next; - Explain1 ("Starting new child in slot %d", slot); - (void)update_child_status (slot, SERVER_STARTING, (request_rec *)NULL); + Explain1("Starting new child in slot %d", slot); + (void) update_child_status(slot, SERVER_STARTING, (request_rec *) NULL); if ((pid = fork()) == -1) { aplog_error(APLOG_MARK, APLOG_ERR, s, "fork: Unable to fork new process"); @@ -3080,25 +3099,25 @@ /* fork didn't succeed. Fix the scoreboard or else * it will say SERVER_STARTING forever and ever */ - (void)update_child_status (slot, SERVER_DEAD, (request_rec*)NULL); + (void) update_child_status(slot, SERVER_DEAD, (request_rec *) NULL); /* In case system resources are maxxed out, we don't want - Apache running away with the CPU trying to fork over and - over and over again. */ + Apache running away with the CPU trying to fork over and + over and over again. */ sleep(10); return -1; - } - + } + if (!pid) { /* Disable the restart signal handlers and enable the just_die stuff. * Note that since restart() just notes that a restart has been * requested there's no race condition here. */ - signal (SIGHUP, just_die); - signal (SIGUSR1, just_die); - signal (SIGTERM, just_die); - child_main (slot); + signal(SIGHUP, just_die); + signal(SIGUSR1, just_die); + signal(SIGTERM, just_die); + child_main(slot); } #ifdef OPTIMIZE_TIMEOUTS @@ -3108,7 +3127,7 @@ #ifdef SCOREBOARD_FILE lseek(scoreboard_fd, XtOffsetOf(scoreboard, parent[slot]), 0); force_write(scoreboard_fd, &scoreboard_image->parent[slot], - sizeof(parent_score)); + sizeof(parent_score)); #endif return 0; @@ -3116,16 +3135,16 @@ /* start up a bunch of children */ -static void startup_children (int number_to_start) +static void startup_children(int number_to_start) { int i; time_t now = time(0); - for (i = 0; number_to_start && i < daemons_limit; ++i ) { + for (i = 0; number_to_start && i < daemons_limit; ++i) { if (scoreboard_image->servers[i].status != SERVER_DEAD) { continue; } - if (make_child (server_conf, i, now) < 0) { + if (make_child(server_conf, i, now) < 0) { break; } --number_to_start; @@ -3145,7 +3164,7 @@ #endif static int hold_off_on_exponential_spawning; -static void perform_idle_server_maintenance (void) +static void perform_idle_server_maintenance(void) { int i; int to_kill; @@ -3163,9 +3182,10 @@ idle_count = 0; last_non_dead = -1; - sync_scoreboard_image (); + sync_scoreboard_image(); for (i = 0; i < daemons_limit; ++i) { - if (i >= max_daemons_limit && free_length == idle_spawn_rate) break; + if (i >= max_daemons_limit && free_length == idle_spawn_rate) + break; ss = &scoreboard_image->servers[i]; switch (ss->status) { /* We consider a starting server as idle because we started it @@ -3175,7 +3195,7 @@ */ case SERVER_STARTING: case SERVER_READY: - ++idle_count; + ++ idle_count; /* always kill the highest numbered child if we have to... * no really well thought out reason ... other than observing * the server behaviour under linux where lower numbered children @@ -3186,7 +3206,7 @@ break; case SERVER_DEAD: /* try to keep children numbers as low as possible */ - if (free_length < idle_spawn_rate) { + if (free_length < idle_spawn_rate) { free_slots[free_length] = i; ++free_length; } @@ -3204,10 +3224,11 @@ * last_vtime */ ps->last_rtime = now; ps->last_vtime = ss->cur_vtime; - } else if (ps->last_rtime + ss->timeout_len < now) { + } + else if (ps->last_rtime + ss->timeout_len < now) { /* no progress, and the timeout length has been exceeded */ ss->timeout_len = 0; - kill (ps->pid, SIGALRM); + kill(ps->pid, SIGALRM); } } #endif @@ -3219,9 +3240,10 @@ * shut down gracefully, in case it happened to pick up a request * while we were counting */ - kill (scoreboard_image->parent[to_kill].pid, SIGUSR1); + kill(scoreboard_image->parent[to_kill].pid, SIGUSR1); idle_spawn_rate = 1; - } else if (idle_count < daemons_min_free) { + } + else if (idle_count < daemons_min_free) { /* terminate the free list */ if (free_length == 0) { /* only report this condition once */ @@ -3234,26 +3256,29 @@ reported = 1; } idle_spawn_rate = 1; - } else { + } + else { if (idle_spawn_rate >= 4) { aplog_error(APLOG_MARK, APLOG_ERR, server_conf, - "server seems busy, spawning %d children (you may need " - "to increase StartServers, or Min/MaxSpareServers)", + "server seems busy, spawning %d children (you may need " + "to increase StartServers, or Min/MaxSpareServers)", idle_spawn_rate); } for (i = 0; i < free_length; ++i) { - make_child (server_conf, free_slots[i], now); + make_child(server_conf, free_slots[i], now); } /* the next time around we want to spawn twice as many if this * wasn't good enough, but not if we've just done a graceful */ if (hold_off_on_exponential_spawning) { --hold_off_on_exponential_spawning; - } else if (idle_spawn_rate < MAX_SPAWN_RATE) { + } + else if (idle_spawn_rate < MAX_SPAWN_RATE) { idle_spawn_rate *= 2; } } - } else { + } + else { idle_spawn_rate = 1; } } @@ -3276,7 +3301,8 @@ is_graceful = 0; ++generation; - if (!one_process) detach (); + if (!one_process) + detach(); my_pid = getpid(); @@ -3287,18 +3313,18 @@ } #ifdef SCOREBOARD_FILE else { - kill_cleanups_for_fd (pconf, scoreboard_fd); + kill_cleanups_for_fd(pconf, scoreboard_fd); } #endif - clear_pool (pconf); - ptrans = make_sub_pool (pconf); + clear_pool(pconf); + ptrans = make_sub_pool(pconf); - server_conf = read_config (pconf, ptrans, server_confname); - setup_listeners (pconf); - open_logs (server_conf, pconf); - init_modules (pconf, server_conf); - set_group_privs (); - SAFE_ACCEPT(accept_mutex_init (pconf)); + server_conf = read_config(pconf, ptrans, server_confname); + setup_listeners(pconf); + open_logs(server_conf, pconf); + init_modules(pconf, server_conf); + set_group_privs(); + SAFE_ACCEPT(accept_mutex_init(pconf)); if (!is_graceful) { reinit_scoreboard(pconf); } @@ -3308,12 +3334,12 @@ note_cleanups_for_fd(pconf, scoreboard_fd); } #endif - default_server_hostnames (server_conf); + default_server_hostnames(server_conf); set_signals(); log_pid(pconf, pid_fname); - if (daemons_max_free < daemons_min_free + 1) /* Don't thrash... */ + if (daemons_max_free < daemons_min_free + 1) /* Don't thrash... */ daemons_max_free = daemons_min_free + 1; /* If we're doing a graceful_restart then we're going to see a lot @@ -3325,13 +3351,14 @@ * supposed to start up without the 1 second penalty between each fork. */ remaining_children_to_start = daemons_to_start; - if( remaining_children_to_start > daemons_limit ) { + if (remaining_children_to_start > daemons_limit) { remaining_children_to_start = daemons_limit; } if (!is_graceful) { - startup_children (remaining_children_to_start); + startup_children(remaining_children_to_start); remaining_children_to_start = 0; - } else { + } + else { /* give the system some time to recover before kicking into * exponential mode */ hold_off_on_exponential_spawning = 10; @@ -3348,7 +3375,7 @@ while (!restart_pending && !shutdown_pending) { int child_slot; int status; - int pid = wait_or_timeout (&status); + int pid = wait_or_timeout(&status); /* XXX: if it takes longer than 1 second for all our children * to start up and get into IDLE state then we may spawn an @@ -3356,31 +3383,33 @@ */ if (pid >= 0) { /* Child died... note that it's gone in the scoreboard. */ - sync_scoreboard_image (); - child_slot = find_child_by_pid (pid); - Explain2 ("Reaping child %d slot %d", pid, child_slot); + sync_scoreboard_image(); + child_slot = find_child_by_pid(pid); + Explain2("Reaping child %d slot %d", pid, child_slot); if (child_slot >= 0) { - (void)update_child_status (child_slot, SERVER_DEAD, - (request_rec *)NULL); + (void) update_child_status(child_slot, SERVER_DEAD, + (request_rec *) NULL); if (remaining_children_to_start && child_slot < daemons_limit) { /* we're still doing a 1-for-1 replacement of dead * children with new children */ - make_child (server_conf, child_slot, time(0)); + make_child(server_conf, child_slot, time(0)); --remaining_children_to_start; } #ifndef NO_OTHER_CHILD - } else if (reap_other_child (pid, status) == 0) { + } + else if (reap_other_child(pid, status) == 0) { /* handled */ #endif - } else if (is_graceful) { + } + else if (is_graceful) { /* Great, we've probably just lost a slot in the * scoreboard. Somehow we don't know about this * child. */ aplog_error(APLOG_MARK, APLOG_WARNING, server_conf, - "long lost child came home! (pid %d)", pid ); + "long lost child came home! (pid %d)", pid); } /* Don't perform idle maintenance when a child dies, * only do it when there's a timeout. Remember only a @@ -3388,12 +3417,13 @@ * pathological for a lot to die suddenly. */ continue; - } else if (remaining_children_to_start) { + } + else if (remaining_children_to_start) { /* we hit a 1 second timeout in which none of the previous - * generation of children needed to be reaped... so assume + * generation of children needed to be reaped... so assume * they're all done, and pick up the slack if any is left. */ - startup_children (remaining_children_to_start); + startup_children(remaining_children_to_start); remaining_children_to_start = 0; /* In any event we really shouldn't do the code below because * few of the servers we just started are in the IDLE state @@ -3412,7 +3442,7 @@ if (ap_killpg(pgrp, SIGTERM) < 0) { aplog_error(APLOG_MARK, APLOG_WARNING, server_conf, "killpg SIGTERM"); } - reclaim_child_processes(2); /* Start with SIGTERM */ + reclaim_child_processes(2); /* Start with SIGTERM */ aplog_error(APLOG_MARK, APLOG_NOTICE, server_conf, "httpd: caught SIGTERM, shutting down"); @@ -3420,7 +3450,7 @@ destroy_pool(pconf); cleanup_scoreboard(); accept_mutex_cleanup(); - + exit(0); } @@ -3430,7 +3460,7 @@ if (one_process) { /* not worth thinking about */ - exit (0); + exit(0); } if (is_graceful) { @@ -3439,13 +3469,13 @@ #endif /* USE WITH CAUTION: Graceful restarts are not known to work - * in various configurations on the architectures we support. */ + * in various configurations on the architectures we support. */ scoreboard_image->global.exit_generation = generation; - update_scoreboard_global (); + update_scoreboard_global(); aplog_error(APLOG_MARK, APLOG_NOTICE, server_conf, "SIGUSR1 received. Doing graceful restart"); - + /* kill off the idle ones */ if (ap_killpg(pgrp, SIGUSR1) < 0) { aplog_error(APLOG_MARK, APLOG_WARNING, server_conf, "killpg SIGUSR1"); @@ -3457,7 +3487,7 @@ * corruption too easily. */ sync_scoreboard_image(); - for (i = 0; i < daemons_limit; ++i ) { + for (i = 0; i < daemons_limit; ++i) { if (scoreboard_image->servers[i].status != SERVER_DEAD) { scoreboard_image->servers[i].status = SERVER_GRACEFUL; } @@ -3469,7 +3499,7 @@ if (ap_killpg(pgrp, SIGHUP) < 0) { aplog_error(APLOG_MARK, APLOG_WARNING, server_conf, "killpg SIGHUP"); } - reclaim_child_processes(1); /* Not when just starting up */ + reclaim_child_processes(1); /* Not when just starting up */ aplog_error(APLOG_MARK, APLOG_NOTICE, server_conf, "SIGHUP received. Attempting to restart"); } @@ -3479,7 +3509,7 @@ } while (restart_pending); -} /* standalone_main */ +} /* standalone_main */ #else /* prototype */ void STANDALONE_MAIN(int argc, char **argv); @@ -3488,22 +3518,21 @@ extern char *optarg; extern int optind; -int -main(int argc, char *argv[]) +int main(int argc, char *argv[]) { int c; #ifdef AUX - (void)set42sig(); + (void) set42sig(); #endif #ifdef SecureWare - if(set_auth_parameters(argc,argv) < 0) - perror("set_auth_parameters"); - if(getluid() < 0) - if(setluid(getuid()) < 0) + if (set_auth_parameters(argc, argv) < 0) + perror("set_auth_parameters"); + if (getluid() < 0) + if (setluid(getuid()) < 0) perror("setluid"); - if(setreuid(0, 0) < 0) + if (setreuid(0, 0) < 0) perror("setreuid"); #endif @@ -3512,102 +3541,103 @@ ptrans = make_sub_pool(pconf); server_argv0 = argv[0]; - strncpy (server_root, HTTPD_ROOT, sizeof(server_root)-1); - server_root[sizeof(server_root)-1] = '\0'; - strncpy (server_confname, SERVER_CONFIG_FILE, sizeof(server_root)-1); - server_confname[sizeof(server_confname)-1] = '\0'; + strncpy(server_root, HTTPD_ROOT, sizeof(server_root) - 1); + server_root[sizeof(server_root) - 1] = '\0'; + strncpy(server_confname, SERVER_CONFIG_FILE, sizeof(server_root) - 1); + server_confname[sizeof(server_confname) - 1] = '\0'; setup_prelinked_modules(); - while((c = getopt(argc,argv,"Xd:f:vhl")) != -1) { - switch(c) { - case 'd': - strncpy (server_root, optarg, sizeof(server_root)-1); - server_root[sizeof(server_root)-1] = '\0'; - break; - case 'f': - strncpy (server_confname, optarg, sizeof(server_confname)-1); - server_confname[sizeof(server_confname)-1] = '\0'; - break; - case 'v': - printf("Server version %s.\n",SERVER_VERSION); - exit(0); - case 'h': + while ((c = getopt(argc, argv, "Xd:f:vhl")) != -1) { + switch (c) { + case 'd': + strncpy(server_root, optarg, sizeof(server_root) - 1); + server_root[sizeof(server_root) - 1] = '\0'; + break; + case 'f': + strncpy(server_confname, optarg, sizeof(server_confname) - 1); + server_confname[sizeof(server_confname) - 1] = '\0'; + break; + case 'v': + printf("Server version %s.\n", SERVER_VERSION); + exit(0); + case 'h': show_directives(); exit(0); - case 'l': + case 'l': show_modules(); exit(0); - case 'X': + case 'X': ++one_process; /* Weird debugging mode. */ break; - case '?': - usage(argv[0]); - } + case '?': + usage(argv[0]); + } } #ifdef __EMX__ - printf("%s \n",SERVER_VERSION); + printf("%s \n", SERVER_VERSION); printf("OS/2 port by Garey Smiley <[EMAIL PROTECTED]> \n"); #endif suexec_enabled = init_suexec(); - server_conf = read_config (pconf, ptrans, server_confname); - init_modules (pconf, server_conf); - - if(standalone) { - clear_pool (pconf); /* standalone_main rereads... */ - STANDALONE_MAIN(argc, argv); + server_conf = read_config(pconf, ptrans, server_confname); + init_modules(pconf, server_conf); + + if (standalone) { + clear_pool(pconf); /* standalone_main rereads... */ + STANDALONE_MAIN(argc, argv); } else { - conn_rec *conn; + conn_rec *conn; request_rec *r; struct sockaddr sa_server, sa_client; BUFF *cio; NET_SIZE_T l; - + open_logs(server_conf, pconf); - init_modules (pconf, server_conf); + init_modules(pconf, server_conf); set_group_privs(); - default_server_hostnames (server_conf); + default_server_hostnames(server_conf); #ifdef MPE - /* Only try to switch if we're running as MANAGER.SYS */ - if (geteuid() == 1 && user_id > 1) { - GETPRIVMODE(); - if (setuid(user_id) == -1) { - GETUSERMODE(); + /* Only try to switch if we're running as MANAGER.SYS */ + if (geteuid() == 1 && user_id > 1) { + GETPRIVMODE(); + if (setuid(user_id) == -1) { + GETUSERMODE(); + aplog_error(APLOG_MARK, APLOG_ALERT, server_conf, + "setuid: unable to change uid"); + exit(1); + } + GETUSERMODE(); + } #else - /* Only try to switch if we're running as root */ - if(!geteuid() && setuid(user_id) == -1) { -#endif - aplog_error(APLOG_MARK, APLOG_ALERT, server_conf, - "setuid: unable to change uid"); - exit (1); - } -#ifdef MPE - GETUSERMODE(); - } + /* Only try to switch if we're running as root */ + if (!geteuid() && setuid(user_id) == -1) { + aplog_error(APLOG_MARK, APLOG_ALERT, server_conf, + "setuid: unable to change uid"); + exit(1); + } #endif - if (ap_setjmp (jmpbuffer)) { - exit (0); + if (ap_setjmp(jmpbuffer)) { + exit(0); } l = sizeof(sa_client); - if ((getpeername(fileno(stdin), &sa_client, &l)) < 0) - { + if ((getpeername(fileno(stdin), &sa_client, &l)) < 0) { /* get peername will fail if the input isn't a socket */ perror("getpeername"); memset(&sa_client, '\0', sizeof(sa_client)); } l = sizeof(sa_server); - if(getsockname(fileno(stdin), &sa_server, &l) < 0) { + if (getsockname(fileno(stdin), &sa_server, &l) < 0) { perror("getsockname"); fprintf(stderr, "Error getting local address\n"); exit(1); } - server_conf->port =ntohs(((struct sockaddr_in *)&sa_server)->sin_port); + server_conf->port = ntohs(((struct sockaddr_in *) &sa_server)->sin_port); cio = bcreate(ptrans, B_RDWR | B_SOCKET); #ifdef MPE /* HP MPE 5.5 inetd only passes the incoming socket as stdin (fd 0), whereas @@ -3616,26 +3646,28 @@ functionality be documented, and then to enhance the functionality to be like HPUX. */ - cio->fd = fileno(stdin); + cio->fd = fileno(stdin); #else cio->fd = fileno(stdout); #endif cio->fd_in = fileno(stdin); - conn = new_connection (ptrans, server_conf, cio, - (struct sockaddr_in *)&sa_client, - (struct sockaddr_in *)&sa_server,-1); - r = read_request (conn); - if (r) process_request (r); /* else premature EOF (ignore) */ + conn = new_connection(ptrans, server_conf, cio, + (struct sockaddr_in *) &sa_client, + (struct sockaddr_in *) &sa_server, -1); + r = read_request(conn); + if (r) + process_request(r); /* else premature EOF (ignore) */ - while (r && conn->keepalive && !conn->aborted) { + while (r && conn->keepalive && !conn->aborted) { destroy_pool(r->pool); - r = read_request (conn); - if (r) process_request (r); - } + r = read_request(conn); + if (r) + process_request(r); + } bclose(cio); } - exit (0); + exit(0); } #ifdef __EMX__ @@ -3643,31 +3675,31 @@ /* The next two routines are used to access shared memory under OS/2. */ /* This requires EMX v09c to be installed. */ -caddr_t create_shared_heap (const char *name, size_t size) +caddr_t create_shared_heap(const char *name, size_t size) { ULONG rc; void *mem; Heap_t h; - rc = DosAllocSharedMem (&mem, name, size, - PAG_COMMIT | PAG_READ | PAG_WRITE); + rc = DosAllocSharedMem(&mem, name, size, + PAG_COMMIT | PAG_READ | PAG_WRITE); if (rc != 0) - return NULL; - h = _ucreate (mem, size, !_BLOCK_CLEAN, _HEAP_REGULAR | _HEAP_SHARED, - NULL, NULL); + return NULL; + h = _ucreate(mem, size, !_BLOCK_CLEAN, _HEAP_REGULAR | _HEAP_SHARED, + NULL, NULL); if (h == NULL) - DosFreeMem (mem); - return (caddr_t)h; + DosFreeMem(mem); + return (caddr_t) h; } -caddr_t get_shared_heap (const char *Name) +caddr_t get_shared_heap(const char *Name) { - PVOID BaseAddress; /* Pointer to the base address of - the shared memory object */ - ULONG AttributeFlags; /* Flags describing characteristics - of the shared memory object */ - APIRET rc; /* Return code */ + PVOID BaseAddress; /* Pointer to the base address of + the shared memory object */ + ULONG AttributeFlags; /* Flags describing characteristics + of the shared memory object */ + APIRET rc; /* Return code */ /* Request read and write access to */ /* the shared memory object */ @@ -3675,9 +3707,9 @@ rc = DosGetNamedSharedMem(&BaseAddress, Name, AttributeFlags); - if(rc != 0) { - printf("DosGetNamedSharedMem error: return code = %ld", rc); - return 0; + if (rc != 0) { + printf("DosGetNamedSharedMem error: return code = %ld", rc); + return 0; } return BaseAddress; @@ -3690,14 +3722,12 @@ -typedef struct joblist_s -{ +typedef struct joblist_s { struct joblist_s *next; int sock; } joblist; -typedef struct globals_s -{ +typedef struct globals_s { int exit_now; semaphore *jobsemaphore; joblist *jobhead; @@ -3707,60 +3737,58 @@ } globals; -globals allowed_globals = { 0, NULL, NULL, NULL, 0 }; +globals allowed_globals = +{0, NULL, NULL, NULL, 0}; -void -add_job(int sock) +void add_job(int sock) { joblist *new_job; - + ap_assert(allowed_globals.jobmutex); /* TODO: If too many jobs in queue, sleep, check for problems */ acquire_mutex(allowed_globals.jobmutex); - new_job = (joblist *)malloc(sizeof(joblist)); + new_job = (joblist *) malloc(sizeof(joblist)); new_job->next = NULL; new_job->sock = sock; - if(allowed_globals.jobtail != NULL) - allowed_globals.jobtail->next = new_job; + if (allowed_globals.jobtail != NULL) + allowed_globals.jobtail->next = new_job; allowed_globals.jobtail = new_job; - if(!allowed_globals.jobhead) - allowed_globals.jobhead = new_job; + if (!allowed_globals.jobhead) + allowed_globals.jobhead = new_job; allowed_globals.jobcount++; release_semaphore(allowed_globals.jobsemaphore); release_mutex(allowed_globals.jobmutex); } -int -remove_job() +int remove_job() { joblist *job; int sock; - + ap_assert(allowed_globals.jobmutex); acquire_semaphore(allowed_globals.jobsemaphore); acquire_mutex(allowed_globals.jobmutex); - if(allowed_globals.exit_now && !allowed_globals.jobhead) - { - release_mutex(allowed_globals.jobmutex); - return(-1); + if (allowed_globals.exit_now && !allowed_globals.jobhead) { + release_mutex(allowed_globals.jobmutex); + return (-1); } job = allowed_globals.jobhead; ap_assert(job); allowed_globals.jobhead = job->next; - if(allowed_globals.jobhead == NULL) - allowed_globals.jobtail = NULL; + if (allowed_globals.jobhead == NULL) + allowed_globals.jobtail = NULL; release_mutex(allowed_globals.jobmutex); sock = job->sock; free(job); - return(sock); + return (sock); } void child_sub_main(int child_num, int srv, - int csd, int dupped_csd, - int requests_this_child, pool *pchild) + int csd, int dupped_csd, + int requests_this_child, pool *pchild) { #if defined(UW) size_t clen; @@ -3774,7 +3802,7 @@ dupped_csd = -1; requests_this_child = 0; - (void)update_child_status(child_num, SERVER_READY, (request_rec*)NULL); + (void) update_child_status(child_num, SERVER_READY, (request_rec *) NULL); /* * Setup the jump buffers so that we can return here after @@ -3783,63 +3811,62 @@ #if defined(USE_LONGJMP) setjmp(jmpbuffer); #else - sigsetjmp(jmpbuffer,1); + sigsetjmp(jmpbuffer, 1); #endif #ifdef SIGURG signal(SIGURG, timeout); #endif - + pchild = make_sub_pool(NULL); while (1) { BUFF *conn_io; request_rec *r; - - /* - * (Re)initialize this child to a pre-connection state. - */ - set_callback_and_alarm(NULL, 0); /* Cancel any outstanding alarms. */ - timeout_req = NULL; /* No request in progress */ + /* + * (Re)initialize this child to a pre-connection state. + */ + + set_callback_and_alarm(NULL, 0); /* Cancel any outstanding alarms. */ + timeout_req = NULL; /* No request in progress */ current_conn = NULL; #ifdef SIGPIPE - signal(SIGPIPE, timeout); + signal(SIGPIPE, timeout); #endif - - clear_pool (pchild); - (void)update_child_status(child_num, SERVER_READY, (request_rec*)NULL); + clear_pool(pchild); - csd = remove_job(); - if(csd == -1) - break; /* time to exit */ - requests_this_child++; + (void) update_child_status(child_num, SERVER_READY, (request_rec *) NULL); - note_cleanups_for_socket(pchild,csd); + csd = remove_job(); + if (csd == -1) + break; /* time to exit */ + requests_this_child++; - /* - * We now have a connection, so set it up with the appropriate - * socket options, file descriptors, and read/write buffers. - */ + note_cleanups_for_socket(pchild, csd); + + /* + * We now have a connection, so set it up with the appropriate + * socket options, file descriptors, and read/write buffers. + */ clen = sizeof(sa_server); if (getsockname(csd, &sa_server, &clen) < 0) { aplog_error(APLOG_MARK, APLOG_WARNING, server_conf, "getsockname"); continue; } - clen = sizeof(sa_client); - if ((getpeername(csd, &sa_client, &clen)) < 0) - { - /* get peername will fail if the input isn't a socket */ + clen = sizeof(sa_client); + if ((getpeername(csd, &sa_client, &clen)) < 0) { + /* get peername will fail if the input isn't a socket */ perror("getpeername"); memset(&sa_client, '\0', sizeof(sa_client)); } sock_disable_nagle(csd); - (void)update_child_status(child_num, SERVER_BUSY_READ, - (request_rec*)NULL); + (void) update_child_status(child_num, SERVER_BUSY_READ, + (request_rec *) NULL); conn_io = bcreate(pchild, B_RDWR | B_SOCKET); dupped_csd = csd; @@ -3847,73 +3874,72 @@ if ((dupped_csd = dup(csd)) < 0) { aplog_error(APLOG_MARK, APLOG_ERR, server_conf, "dup: couldn't duplicate csd"); - dupped_csd = csd; /* Oh well... */ + dupped_csd = csd; /* Oh well... */ } - note_cleanups_for_socket(pchild,dupped_csd); + note_cleanups_for_socket(pchild, dupped_csd); #endif bpushfd(conn_io, csd, dupped_csd); - current_conn = new_connection (pchild, server_conf, conn_io, - (struct sockaddr_in *)&sa_client, - (struct sockaddr_in *)&sa_server, - child_num); - - /* - * Read and process each request found on our connection - * until no requests are left or we decide to close. - */ + current_conn = new_connection(pchild, server_conf, conn_io, + (struct sockaddr_in *) &sa_client, + (struct sockaddr_in *) &sa_server, + child_num); - while ((r = read_request(current_conn)) != NULL) { - (void)update_child_status(child_num, SERVER_BUSY_WRITE, r); + /* + * Read and process each request found on our connection + * until no requests are left or we decide to close. + */ + + while ((r = read_request(current_conn)) != NULL) { + (void) update_child_status(child_num, SERVER_BUSY_WRITE, r); - process_request(r); + process_request(r); #if defined(STATUS) - increment_counts(child_num, r); + increment_counts(child_num, r); #endif - if (!current_conn->keepalive || current_conn->aborted) - break; + if (!current_conn->keepalive || current_conn->aborted) + break; - destroy_pool(r->pool); - (void)update_child_status(child_num, SERVER_BUSY_KEEPALIVE, - (request_rec*)NULL); + destroy_pool(r->pool); + (void) update_child_status(child_num, SERVER_BUSY_KEEPALIVE, + (request_rec *) NULL); - sync_scoreboard_image(); - } + sync_scoreboard_image(); + } - /* - * Close the connection, being careful to send out whatever is still - * in our buffers. If possible, try to avoid a hard close until the - * client has ACKed our FIN and/or has stopped sending us data. - */ - kill_cleanups_for_socket(pchild,csd); + /* + * Close the connection, being careful to send out whatever is still + * in our buffers. If possible, try to avoid a hard close until the + * client has ACKed our FIN and/or has stopped sending us data. + */ + kill_cleanups_for_socket(pchild, csd); #ifdef NO_LINGCLOSE - bclose(conn_io); /* just close it */ + bclose(conn_io); /* just close it */ #else - if (r && r->connection - && !r->connection->aborted - && r->connection->client - && (r->connection->client->fd >= 0)) { - - lingering_close(r); - } - else { - bsetflag(conn_io, B_EOUT, 1); - bclose(conn_io); - } + if (r && r->connection + && !r->connection->aborted + && r->connection->client + && (r->connection->client->fd >= 0)) { + + lingering_close(r); + } + else { + bsetflag(conn_io, B_EOUT, 1); + bclose(conn_io); + } #endif } destroy_pool(pchild); - (void)update_child_status(child_num,SERVER_DEAD, NULL); + (void) update_child_status(child_num, SERVER_DEAD, NULL); } -void -child_main(int child_num_arg) +void child_main(int child_num_arg) { - + int srv = 0; int csd = 0; int dupped_csd = 0; @@ -3930,21 +3956,20 @@ * damn variables static/global */ child_sub_main(child_num_arg, srv, - csd, dupped_csd, - requests_this_child, ppool); + csd, dupped_csd, + requests_this_child, ppool); } -void -cleanup_thread(thread **handles, int *thread_cnt, int thread_to_clean) +void cleanup_thread(thread **handles, int *thread_cnt, int thread_to_clean) { int i; - + free_thread(handles[thread_to_clean]); - for(i=thread_to_clean; i<((*thread_cnt)-1); i++) - handles[i] = handles[i+1]; + for (i = thread_to_clean; i < ((*thread_cnt) - 1); i++) + handles[i] = handles[i + 1]; (*thread_cnt)--; } @@ -3989,18 +4014,19 @@ max_jobs_after_exit_request = excess_requests_per_child; max_jobs_per_exe = max_requests_per_child; if (nthreads <= 0) - nthreads = 40; + nthreads = 40; if (max_jobs_per_exe <= 0) - max_jobs_per_exe = 0; + max_jobs_per_exe = 0; if (max_jobs_after_exit_request <= 0) - max_jobs_after_exit_request = max_jobs_per_exe/10; - - if (!one_process) detach(); + max_jobs_after_exit_request = max_jobs_per_exe / 10; + + if (!one_process) + detach(); my_pid = getpid(); - + ++generation; - + copy_listeners(pconf); restart_time = time(NULL); @@ -4032,129 +4058,129 @@ allowed_globals.jobmutex = create_mutex(NULL); /* spawn off the threads */ - child_handles = (thread *)alloca(nthreads * sizeof(int)); + child_handles = (thread *) alloca(nthreads * sizeof(int)); { - int i; + int i; - for (i = 0; i < nthreads; i++) { - child_handles[i] = create_thread((void (*)(void *))child_main, (void *)i); - } + for (i = 0; i < nthreads; i++) { + child_handles[i] = create_thread((void (*)(void *)) child_main, (void *) i); + } if (nthreads > max_daemons_limit) { max_daemons_limit = nthreads; } } /* main loop */ - for(;;) { - if(max_jobs_per_exe && (total_jobs > max_jobs_per_exe) && !start_exit) { - start_exit = 1; - wait_time = 1; - count_down = max_jobs_after_exit_request; - release_mutex(start_mutex); - start_mutex_released = 1; - } - if (!start_exit) { - rv = WaitForSingleObject(exit_event, 0); - ap_assert((rv == WAIT_TIMEOUT) || (rv == WAIT_OBJECT_0)); - if (rv == WAIT_OBJECT_0) - break; - rv = WaitForMultipleObjects(nthreads, child_handles, 0, 0); + for (;;) { + if (max_jobs_per_exe && (total_jobs > max_jobs_per_exe) && !start_exit) { + start_exit = 1; + wait_time = 1; + count_down = max_jobs_after_exit_request; + release_mutex(start_mutex); + start_mutex_released = 1; + } + if (!start_exit) { + rv = WaitForSingleObject(exit_event, 0); + ap_assert((rv == WAIT_TIMEOUT) || (rv == WAIT_OBJECT_0)); + if (rv == WAIT_OBJECT_0) + break; + rv = WaitForMultipleObjects(nthreads, child_handles, 0, 0); ap_assert(rv != WAIT_FAILED); - if(rv != WAIT_TIMEOUT) { - rv = rv - WAIT_OBJECT_0; - ap_assert((rv >= 0) && (rv < nthreads)); - cleanup_thread(child_handles, &nthreads, rv); - break; - } - } - if (start_exit && max_jobs_after_exit_request && (count_down-- < 0)) - break; - tv.tv_sec = wait_time; - tv.tv_usec = 0; + if (rv != WAIT_TIMEOUT) { + rv = rv - WAIT_OBJECT_0; + ap_assert((rv >= 0) && (rv < nthreads)); + cleanup_thread(child_handles, &nthreads, rv); + break; + } + } + if (start_exit && max_jobs_after_exit_request && (count_down-- < 0)) + break; + tv.tv_sec = wait_time; + tv.tv_usec = 0; - memcpy(&main_fds, &listenfds, sizeof(fd_set)); - srv = ap_select(listenmaxfd+1, &main_fds, NULL, NULL, &tv); + memcpy(&main_fds, &listenfds, sizeof(fd_set)); + srv = ap_select(listenmaxfd + 1, &main_fds, NULL, NULL, &tv); #ifdef WIN32 - if (srv == SOCKET_ERROR) - errno = WSAGetLastError() - WSABASEERR; + if (srv == SOCKET_ERROR) + errno = WSAGetLastError() - WSABASEERR; #endif /* WIN32 */ - if (srv < 0 && errno != EINTR) - aplog_error(APLOG_MARK, APLOG_ERR, server_conf, "select: (listen)"); - - if (srv < 0) - continue; - if (srv == 0) { - if (start_exit) - break; - else - continue; - } + if (srv < 0 && errno != EINTR) + aplog_error(APLOG_MARK, APLOG_ERR, server_conf, "select: (listen)"); - { + if (srv < 0) + continue; + if (srv == 0) { + if (start_exit) + break; + else + continue; + } + + { listen_rec *lr; - lr = find_ready_listener (&main_fds); + lr = find_ready_listener(&main_fds); if (lr != NULL) { sd = lr->fd; } } - do { - clen = sizeof(sa_client); - csd = accept(sd, (struct sockaddr *)&sa_client, &clen); + do { + clen = sizeof(sa_client); + csd = accept(sd, (struct sockaddr *) &sa_client, &clen); #ifdef WIN32 - if(csd == INVALID_SOCKET) { - csd = -1; - errno = WSAGetLastError() - WSABASEERR; - } + if (csd == INVALID_SOCKET) { + csd = -1; + errno = WSAGetLastError() - WSABASEERR; + } #endif /* WIN32 */ - } while (csd < 0 && errno == EINTR); + } while (csd < 0 && errno == EINTR); - if (csd < 0) { + if (csd < 0) { #if defined(EPROTO) && defined(ECONNABORTED) - if ((errno != EPROTO) && (errno != ECONNABORTED)) + if ((errno != EPROTO) && (errno != ECONNABORTED)) #elif defined(EPROTO) - if (errno != EPROTO) + if (errno != EPROTO) #elif defined(ECONNABORTED) - if (errno != ECONNABORTED) + if (errno != ECONNABORTED) #endif - aplog_error(APLOG_MARK, APLOG_ERR, server_conf, + aplog_error(APLOG_MARK, APLOG_ERR, server_conf, "accept: (client socket)"); - } - else { - add_job(csd); - total_jobs++; - } + } + else { + add_job(csd); + total_jobs++; + } } /* Get ready to shutdown and exit */ allowed_globals.exit_now = 1; if (!start_mutex_released) { - release_mutex(start_mutex); + release_mutex(start_mutex); } for (i = 0; i < nthreads; i++) { - add_job(-1); + add_job(-1); } /* Wait for all your children */ end_time = time(NULL) + 180; while (nthreads) { - rv = WaitForMultipleObjects(nthreads, child_handles, 0, (end_time-time(NULL))*1000); - if (rv != WAIT_TIMEOUT) { - rv = rv - WAIT_OBJECT_0; - ap_assert((rv >= 0) && (rv < nthreads)); - cleanup_thread(child_handles, &nthreads, rv); - continue; - } - break; + rv = WaitForMultipleObjects(nthreads, child_handles, 0, (end_time - time(NULL)) * 1000); + if (rv != WAIT_TIMEOUT) { + rv = rv - WAIT_OBJECT_0; + ap_assert((rv >= 0) && (rv < nthreads)); + cleanup_thread(child_handles, &nthreads, rv); + continue; + } + break; } for (i = 0; i < nthreads; i++) { - kill_thread(child_handles[i]); - free_thread(child_handles[i]); + kill_thread(child_handles[i]); + free_thread(child_handles[i]); } destroy_semaphore(allowed_globals.jobsemaphore); destroy_mutex(allowed_globals.jobmutex); @@ -4165,16 +4191,15 @@ exit(0); -} /* standalone_main */ +} /* standalone_main */ -int -create_event_and_spawn(int argc, char **argv, event **ev, int *child_num, char* prefix) +int create_event_and_spawn(int argc, char **argv, event **ev, int *child_num, char *prefix) { int pid = getpid(); char buf[40], mod[200]; int i, rv; - char **pass_argv = (char **)alloca(sizeof(char *)*(argc+3)); + char **pass_argv = (char **) alloca(sizeof(char *) * (argc + 3)); sprintf(buf, "%s_%d", prefix, ++(*child_num)); _flushall(); @@ -4183,17 +4208,16 @@ pass_argv[0] = argv[0]; pass_argv[1] = "-c"; pass_argv[2] = buf; - for(i=1; i<argc; i++) - { - pass_argv[i+2] = argv[i]; + for (i = 1; i < argc; i++) { + pass_argv[i + 2] = argv[i]; } - pass_argv[argc+2] = NULL; + pass_argv[argc + 2] = NULL; GetModuleFileName(NULL, mod, 200); rv = spawnv(_P_NOWAIT, mod, pass_argv); - return(rv); + return (rv); } @@ -4201,8 +4225,7 @@ static int service_stop = 0; -int -master_main(int argc, char **argv) +int master_main(int argc, char **argv) { /* * 1. Create exit events for children @@ -4223,69 +4246,64 @@ sprintf(buf, "Apache%d", getpid()); start_mutex = create_mutex(buf); - ev = (event **)alloca(sizeof(event *)*nchild); - child = (int *)alloca(sizeof(int)*nchild); - for(i=0; i<nchild; i++) - { - service_set_status(SERVICE_START_PENDING); - child[i] = create_event_and_spawn(argc, argv, &ev[i], &child_num, buf); - ap_assert(child[i] >= 0); + ev = (event **) alloca(sizeof(event *) * nchild); + child = (int *) alloca(sizeof(int) * nchild); + for (i = 0; i < nchild; i++) { + service_set_status(SERVICE_START_PENDING); + child[i] = create_event_and_spawn(argc, argv, &ev[i], &child_num, buf); + ap_assert(child[i] >= 0); } service_set_status(SERVICE_RUNNING); - for(;!service_stop;) - { - rv = WaitForMultipleObjects(nchild, (HANDLE *)child, FALSE, 2000); - ap_assert(rv != WAIT_FAILED); - if(rv == WAIT_TIMEOUT) - continue; - cld = rv - WAIT_OBJECT_0; - ap_assert(rv < nchild); - CloseHandle((HANDLE)child[rv]); - CloseHandle(ev[rv]); - child[rv] = create_event_and_spawn(argc, argv, &ev[rv], &child_num, buf); - ap_assert(child[rv]); + for (; !service_stop;) { + rv = WaitForMultipleObjects(nchild, (HANDLE *) child, FALSE, 2000); + ap_assert(rv != WAIT_FAILED); + if (rv == WAIT_TIMEOUT) + continue; + cld = rv - WAIT_OBJECT_0; + ap_assert(rv < nchild); + CloseHandle((HANDLE) child[rv]); + CloseHandle(ev[rv]); + child[rv] = create_event_and_spawn(argc, argv, &ev[rv], &child_num, buf); + ap_assert(child[rv]); } /* * Tell all your kids to stop. Wait for them for some time * Kill those that haven't yet stopped */ - for(i=0; i<nchild; i++) - { - SetEvent(ev[i]); + for (i = 0; i < nchild; i++) { + SetEvent(ev[i]); } - for(tmstart=time(NULL); nchild && (tmstart < (time(NULL) + 60));) - { - service_set_status(SERVICE_STOP_PENDING); - rv = WaitForMultipleObjects(nchild, (HANDLE *)child, FALSE, 2000); - ap_assert(rv != WAIT_FAILED); - if(rv == WAIT_TIMEOUT) - continue; - cld = rv - WAIT_OBJECT_0; - ap_assert(rv < nchild); - CloseHandle((HANDLE)child[rv]); - CloseHandle(ev[rv]); - for(i=rv; i<(nchild-1); i++) - { - child[i] = child[i+1]; - ev[i] = ev[i+1]; - } - nchild--; + for (tmstart = time(NULL); nchild && (tmstart < (time(NULL) + 60));) { + service_set_status(SERVICE_STOP_PENDING); + rv = WaitForMultipleObjects(nchild, (HANDLE *) child, FALSE, 2000); + ap_assert(rv != WAIT_FAILED); + if (rv == WAIT_TIMEOUT) + continue; + cld = rv - WAIT_OBJECT_0; + ap_assert(rv < nchild); + CloseHandle((HANDLE) child[rv]); + CloseHandle(ev[rv]); + for (i = rv; i < (nchild - 1); i++) { + child[i] = child[i + 1]; + ev[i] = ev[i + 1]; + } + nchild--; } - for(i=0; i<nchild; i++) - { - TerminateProcess((HANDLE)child[i], 1); + for (i = 0; i < nchild; i++) { + TerminateProcess((HANDLE) child[i], 1); } - service_set_status(SERVICE_STOPPED); + service_set_status(SERVICE_STOPPED); destroy_mutex(start_mutex); - return(0); + return (0); } -__declspec(dllexport) int main(int argc, char *argv[]) +__declspec(dllexport) + int main(int argc, char *argv[]) { int c; int child = 0; @@ -4294,16 +4312,16 @@ int install = 0; #ifdef AUX - (void)set42sig(); + (void) set42sig(); #endif #ifdef SecureWare - if(set_auth_parameters(argc,argv) < 0) - perror("set_auth_parameters"); - if(getluid() < 0) - if(setluid(getuid()) < 0) + if (set_auth_parameters(argc, argv) < 0) + perror("set_auth_parameters"); + if (getluid() < 0) + if (setluid(getuid()) < 0) perror("setluid"); - if(setreuid(0, 0) < 0) + if (setreuid(0, 0) < 0) perror("setreuid"); #endif @@ -4317,107 +4335,102 @@ ptrans = make_sub_pool(pconf); server_argv0 = argv[0]; - strncpy (server_root, HTTPD_ROOT, sizeof(server_root)-1); - server_root[sizeof(server_root)-1] = '\0'; - strncpy (server_confname, SERVER_CONFIG_FILE, sizeof(server_root)-1); - server_confname[sizeof(server_confname)-1] = '\0'; + strncpy(server_root, HTTPD_ROOT, sizeof(server_root) - 1); + server_root[sizeof(server_root) - 1] = '\0'; + strncpy(server_confname, SERVER_CONFIG_FILE, sizeof(server_root) - 1); + server_confname[sizeof(server_confname) - 1] = '\0'; setup_prelinked_modules(); - while((c = getopt(argc,argv,"Xd:f:vhlc:ius")) != -1) { - switch(c) { + while ((c = getopt(argc, argv, "Xd:f:vhlc:ius")) != -1) { + switch (c) { #ifdef WIN32 - case 'c': - exit_event = open_event(optarg); - cp = strchr(optarg, '_'); - ap_assert(cp); - *cp = 0; - start_mutex = open_mutex(optarg); - child = 1; - break; - case 'i': - install = 1; - break; - case 'u': - install = -1; - break; - case 's': - run_as_service = 0; - break; + case 'c': + exit_event = open_event(optarg); + cp = strchr(optarg, '_'); + ap_assert(cp); + *cp = 0; + start_mutex = open_mutex(optarg); + child = 1; + break; + case 'i': + install = 1; + break; + case 'u': + install = -1; + break; + case 's': + run_as_service = 0; + break; #endif /* WIN32 */ - case 'd': - strncpy (server_root, optarg, sizeof(server_root)-1); - server_root[sizeof(server_root)-1] = '\0'; - break; - case 'f': - strncpy (server_confname, optarg, sizeof(server_confname)-1); - server_confname[sizeof(server_confname)-1] = '\0'; - break; - case 'v': - printf("Server version %s.\n",SERVER_VERSION); - exit(0); - case 'h': + case 'd': + strncpy(server_root, optarg, sizeof(server_root) - 1); + server_root[sizeof(server_root) - 1] = '\0'; + break; + case 'f': + strncpy(server_confname, optarg, sizeof(server_confname) - 1); + server_confname[sizeof(server_confname) - 1] = '\0'; + break; + case 'v': + printf("Server version %s.\n", SERVER_VERSION); + exit(0); + case 'h': show_directives(); exit(0); - case 'l': + case 'l': show_modules(); exit(0); - case 'X': + case 'X': ++one_process; /* Weird debugging mode. */ break; - case '?': - usage(argv[0]); - } + case '?': + usage(argv[0]); + } } #ifdef __EMX__ - printf("%s \n",SERVER_VERSION); + printf("%s \n", SERVER_VERSION); printf("OS/2 port by Garey Smiley <[EMAIL PROTECTED]> \n"); #endif #ifdef WIN32 - if(!child) - { - printf("%s \n",SERVER_VERSION); - printf("WIN32 port by Ambarish Malpani <[EMAIL PROTECTED]> and the Apache Group.\n"); + if (!child) { + printf("%s \n", SERVER_VERSION); + printf("WIN32 port by Ambarish Malpani <[EMAIL PROTECTED]> and the Apache Group.\n"); } #endif - if(!child && run_as_service) - { - service_cd(); + if (!child && run_as_service) { + service_cd(); } - server_conf = read_config (pconf, ptrans, server_confname); - init_modules (pconf, server_conf); + server_conf = read_config(pconf, ptrans, server_confname); + init_modules(pconf, server_conf); suexec_enabled = init_suexec(); open_logs(server_conf, pconf); set_group_privs(); - if(one_process && !exit_event) - exit_event = create_event(0, 0, NULL); - if(one_process && !start_mutex) - start_mutex = create_mutex(NULL); + if (one_process && !exit_event) + exit_event = create_event(0, 0, NULL); + if (one_process && !start_mutex) + start_mutex = create_mutex(NULL); /* * In the future, the main will spawn off a couple * of children and monitor them. As soon as a child * exits, it spawns off a new one */ - if(child || one_process) - { - if(!exit_event || !start_mutex) - exit(-1); - worker_main(); - destroy_mutex(start_mutex); - destroy_event(exit_event); + if (child || one_process) { + if (!exit_event || !start_mutex) + exit(-1); + worker_main(); + destroy_mutex(start_mutex); + destroy_event(exit_event); + } + else { + service_main(master_main, argc, argv, + &service_pause, &service_stop, "Apache", install, run_as_service); } - else - { - service_main(master_main, argc, argv, - &service_pause, &service_stop, "Apache", install, run_as_service); - } - return(0); + return (0); } #endif /* ndef MULTITHREAD */ -