dgaudet 97/03/22 15:51:10
Modified: src CHANGES alloc.c http_config.c http_log.c http_main.c mod_log_agent.c mod_log_config.c mod_log_referer.c mod_mime.c mod_rewrite.c util.c Log: errno reporting cleanup. popenf, pclosef, spawn_child all return valid errno. Reviewed by: Chuck, Jim Revision Changes Path 1.209 +5 -0 apache/src/CHANGES Index: CHANGES =================================================================== RCS file: /export/home/cvs/apache/src/CHANGES,v retrieving revision 1.208 retrieving revision 1.209 diff -C3 -r1.208 -r1.209 *** CHANGES 1997/03/20 23:30:48 1.208 --- CHANGES 1997/03/22 23:51:00 1.209 *************** *** 1,5 **** --- 1,10 ---- Changes with Apache 1.2b8 + *) Report extra info from errno with many errors that cause httpd to exit. + spawn_child, popenf, and pclosef now have valid errno returns in the + event of an error. Correct problems where errno was stomped on + before being reported. [Dean Gaudet] + *) In the proxy, if the cache filesystem was full, garbage_coll() was never called, and thus the filesystem would remain full indefinitely. We now also remove incomplete cache files left if the origin server 1.25 +15 -0 apache/src/alloc.c Index: alloc.c =================================================================== RCS file: /export/home/cvs/apache/src/alloc.c,v retrieving revision 1.24 retrieving revision 1.25 diff -C3 -r1.24 -r1.25 *** alloc.c 1997/03/20 17:10:10 1.24 --- alloc.c 1997/03/22 23:51:01 1.25 *************** *** 791,812 **** --- 791,818 ---- int popenf(pool *a, const char *name, int flg, int mode) { int fd; + int save_errno; block_alarms(); fd = open(name, flg, mode); + save_errno = errno; if (fd >= 0) note_cleanups_for_fd (a, fd); unblock_alarms(); + errno = save_errno; return fd; } int pclosef(pool *a, int fd) { int res; + int save_errno; block_alarms(); res = close(fd); + save_errno = errno; kill_cleanup(a, (void *)fd, fd_cleanup); unblock_alarms(); + errno = save_errno; return res; } *************** *** 927,950 **** --- 933,962 ---- int in_fds[2]; int out_fds[2]; int err_fds[2]; + int save_errno; block_alarms(); if (pipe_in && pipe (in_fds) < 0) { + save_errno = errno; unblock_alarms(); + errno = save_errno; return 0; } if (pipe_out && pipe (out_fds) < 0) { + save_errno = errno; if (pipe_in) { close (in_fds[0]); close (in_fds[1]); } unblock_alarms(); + errno = save_errno; return 0; } if (pipe_err && pipe (err_fds) < 0) { + save_errno = errno; if (pipe_in) { close (in_fds[0]); close (in_fds[1]); } *************** *** 952,961 **** --- 964,975 ---- close (out_fds[0]); close (out_fds[1]); } unblock_alarms(); + errno = save_errno; return 0; } if ((pid = fork()) < 0) { + save_errno = errno; if (pipe_in) { close (in_fds[0]); close (in_fds[1]); } *************** *** 966,971 **** --- 980,986 ---- close (err_fds[0]); close (err_fds[1]); } unblock_alarms(); + errno = save_errno; return 0; } 1.47 +4 -2 apache/src/http_config.c Index: http_config.c =================================================================== RCS file: /export/home/cvs/apache/src/http_config.c,v retrieving revision 1.46 retrieving revision 1.47 diff -C3 -r1.46 -r1.47 *** http_config.c 1997/03/20 23:30:48 1.46 --- http_config.c 1997/03/22 23:51:01 1.47 *************** *** 759,767 **** parms.override = (RSRC_CONF|OR_ALL)&~(OR_AUTHCFG|OR_LIMIT); if(!(cfg = fopen(fname, "r"))) { fprintf(stderr,"httpd: could not open document config file %s\n", fname); - perror("fopen"); exit(1); } --- 759,767 ---- parms.override = (RSRC_CONF|OR_ALL)&~(OR_AUTHCFG|OR_LIMIT); if(!(cfg = fopen(fname, "r"))) { + perror("fopen"); fprintf(stderr,"httpd: could not open document config file %s\n", fname); exit(1); } *************** *** 931,938 **** getrlimit ( RLIMIT_NOFILE, &limits ); if ( limits.rlim_cur < limits.rlim_max ) { limits.rlim_cur += 2; ! if ( setrlimit ( RLIMIT_NOFILE, &limits ) < 0 ) fprintf (stderr, "Cannot exceed hard limit for open files"); } #endif --- 931,940 ---- getrlimit ( RLIMIT_NOFILE, &limits ); if ( limits.rlim_cur < limits.rlim_max ) { limits.rlim_cur += 2; ! if ( setrlimit ( RLIMIT_NOFILE, &limits ) < 0 ) { ! perror ("setrlimit(RLIMIT_NOFILE)"); fprintf (stderr, "Cannot exceed hard limit for open files"); + } } #endif 1.13 +6 -7 apache/src/http_log.c Index: http_log.c =================================================================== RCS file: /export/home/cvs/apache/src/http_log.c,v retrieving revision 1.12 retrieving revision 1.13 diff -C3 -r1.12 -r1.13 *** http_log.c 1997/01/10 09:34:41 1.12 --- http_log.c 1997/03/22 23:51:01 1.13 *************** *** 92,110 **** if (*s->error_fname == '|') { FILE *dummy; ! spawn_child(p, error_log_child, (void *)(s->error_fname+1), ! kill_after_timeout, &dummy, NULL); ! ! if (dummy == NULL) { ! fprintf (stderr, "Couldn't fork child for ErrorLog process\n"); ! exit (1); } s->error_log = dummy; } else { if(!(s->error_log = pfopen(p, fname, "a"))) { - fprintf(stderr,"httpd: could not open error log file %s.\n", fname); perror("fopen"); exit(1); } } --- 92,109 ---- if (*s->error_fname == '|') { FILE *dummy; ! if (!spawn_child (p, error_log_child, (void *)(s->error_fname+1), ! kill_after_timeout, &dummy, NULL)) { ! perror ("spawn_child"); ! fprintf (stderr, "Couldn't fork child for ErrorLog process\n"); ! exit (1); } s->error_log = dummy; } else { if(!(s->error_log = pfopen(p, fname, "a"))) { perror("fopen"); + fprintf(stderr,"httpd: could not open error log file %s.\n", fname); exit(1); } } 1.133 +10 -8 apache/src/http_main.c Index: http_main.c =================================================================== RCS file: /export/home/cvs/apache/src/http_main.c,v retrieving revision 1.132 retrieving revision 1.133 diff -C3 -r1.132 -r1.133 *** http_main.c 1997/03/20 23:30:49 1.132 --- http_main.c 1997/03/22 23:51:02 1.133 *************** *** 774,781 **** #endif if (scoreboard_fd == -1) { - fprintf (stderr, "Cannot open scoreboard file:\n"); perror (scoreboard_fname); exit (1); } --- 774,781 ---- #endif if (scoreboard_fd == -1) { perror (scoreboard_fname); + fprintf (stderr, "Cannot open scoreboard file:\n"); exit (1); } *************** *** 800,807 **** #endif if (scoreboard_fd == -1) { - fprintf (stderr, "Cannot open scoreboard file:\n"); perror (scoreboard_fname); exit (1); } #else --- 800,807 ---- #endif if (scoreboard_fd == -1) { perror (scoreboard_fname); + fprintf (stderr, "Cannot open scoreboard file:\n"); exit (1); } #else *************** *** 1192,1213 **** if((x = fork()) > 0) exit(0); else if(x == -1) { - fprintf(stderr,"httpd: unable to fork new process\n"); perror("fork"); exit(1); } #endif #ifndef NO_SETSID if((pgrp=setsid()) == -1) { - fprintf(stderr,"httpd: setsid failed\n"); perror("setsid"); exit(1); } #else #if defined(NEXT) if(setpgrp(0,getpid()) == -1 || (pgrp = getpgrp(0)) == -1) { - fprintf(stderr,"httpd: setpgrp or getpgrp failed\n"); perror("setpgrp"); exit(1); } #else --- 1192,1213 ---- 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); } #else #if defined(NEXT) if(setpgrp(0,getpid()) == -1 || (pgrp = getpgrp(0)) == -1) { perror("setpgrp"); + fprintf(stderr,"httpd: setpgrp or getpgrp failed\n"); exit(1); } #else *************** *** 1216,1223 **** pgrp=-getpid(); #else if((pgrp=setpgrp(getpid(),0)) == -1) { - fprintf(stderr,"httpd: setpgrp failed\n"); perror("setpgrp"); exit(1); } #endif --- 1216,1223 ---- pgrp=-getpid(); #else if((pgrp=setpgrp(getpid(),0)) == -1) { perror("setpgrp"); + fprintf(stderr,"httpd: setpgrp failed\n"); exit(1); } #endif *************** *** 1570,1577 **** int just_say_no = 1; if (setsockopt(s, IPPROTO_TCP, TCP_NODELAY, (char*)&just_say_no, ! sizeof(int)) < 0) fprintf(stderr, "httpd: could not set socket option TCP_NODELAY\n"); } #else #define sock_disable_nagle(s) /* NOOP */ --- 1570,1579 ---- int just_say_no = 1; if (setsockopt(s, IPPROTO_TCP, TCP_NODELAY, (char*)&just_say_no, ! sizeof(int)) < 0) { ! perror ("setsockopt(TCP_NODELAY)"); fprintf(stderr, "httpd: could not set socket option TCP_NODELAY\n"); + } } #else #define sock_disable_nagle(s) /* NOOP */ *************** *** 1932,1941 **** #endif if(bind(s, (struct sockaddr *)server,sizeof(struct sockaddr_in)) == -1) { #ifdef MPE if (ntohs(server->sin_port) < 1024) GETUSERMODE(); #endif - perror("bind"); if (server->sin_addr.s_addr != htonl(INADDR_ANY)) fprintf(stderr,"httpd: could not bind to address %s port %d\n", inet_ntoa(server->sin_addr), ntohs(server->sin_port)); --- 1934,1943 ---- #endif if(bind(s, (struct sockaddr *)server,sizeof(struct sockaddr_in)) == -1) { + perror("bind"); #ifdef MPE 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", inet_ntoa(server->sin_addr), ntohs(server->sin_port)); 1.11 +6 -5 apache/src/mod_log_agent.c Index: mod_log_agent.c =================================================================== RCS file: /export/home/cvs/apache/src/mod_log_agent.c,v retrieving revision 1.10 retrieving revision 1.11 diff -C3 -r1.10 -r1.11 *** mod_log_agent.c 1997/03/07 14:15:42 1.10 --- mod_log_agent.c 1997/03/22 23:51:02 1.11 *************** *** 111,116 **** --- 111,118 ---- #else execl (SHELL_PATH, SHELL_PATH, "-c", (char *)cmd, NULL); #endif + perror ("exec"); + fprintf (stderr, "Exec of shell for logging failed!!!\n"); exit (1); } *************** *** 126,135 **** if (*cls->fname == '|') { FILE *dummy; ! spawn_child(p, agent_log_child, (void *)(cls->fname+1), ! kill_after_timeout, &dummy, NULL); ! ! if (dummy == NULL) { fprintf (stderr, "Couldn't fork child for AgentLog process\n"); exit (1); } --- 128,136 ---- if (*cls->fname == '|') { FILE *dummy; ! if (!spawn_child (p, agent_log_child, (void *)(cls->fname+1), ! kill_after_timeout, &dummy, NULL)) { ! perror ("spawn_child"); fprintf (stderr, "Couldn't fork child for AgentLog process\n"); exit (1); } *************** *** 138,145 **** } else if(*cls->fname != '\0') { if((cls->agent_fd = popenf(p, fname, xfer_flags, xfer_mode)) < 0) { - fprintf(stderr,"httpd: could not open agent log file %s.\n", fname); perror("open"); exit(1); } } --- 139,146 ---- } else if(*cls->fname != '\0') { if((cls->agent_fd = popenf(p, fname, xfer_flags, xfer_mode)) < 0) { perror("open"); + fprintf(stderr,"httpd: could not open agent log file %s.\n", fname); exit(1); } } 1.26 +5 -5 apache/src/mod_log_config.c Index: mod_log_config.c =================================================================== RCS file: /export/home/cvs/apache/src/mod_log_config.c,v retrieving revision 1.25 retrieving revision 1.26 diff -C3 -r1.25 -r1.26 *** mod_log_config.c 1997/03/07 14:15:42 1.25 --- mod_log_config.c 1997/03/22 23:51:02 1.26 *************** *** 687,692 **** --- 687,693 ---- #else execl (SHELL_PATH, SHELL_PATH, "-c", (char *)cmd, NULL); #endif + perror ("exec"); fprintf (stderr, "Exec of shell for logging failed!!!\n"); exit (1); } *************** *** 699,708 **** if (*cls->fname == '|') { FILE *dummy; ! spawn_child(p, config_log_child, (void *)(cls->fname+1), ! kill_after_timeout, &dummy, NULL); ! ! if (dummy == NULL) { fprintf (stderr, "Couldn't fork child for TransferLog process\n"); exit (1); } --- 700,708 ---- if (*cls->fname == '|') { FILE *dummy; ! if (!spawn_child (p, config_log_child, (void *)(cls->fname+1), ! kill_after_timeout, &dummy, NULL)) { ! perror ("spawn_child"); fprintf (stderr, "Couldn't fork child for TransferLog process\n"); exit (1); } *************** *** 712,720 **** else { char *fname = server_root_relative (p, cls->fname); if((cls->log_fd = popenf(p, fname, xfer_flags, xfer_mode)) < 0) { fprintf (stderr, "httpd: could not open transfer log file %s.\n", fname); - perror("open"); exit(1); } } --- 712,720 ---- else { char *fname = server_root_relative (p, cls->fname); if((cls->log_fd = popenf(p, fname, xfer_flags, xfer_mode)) < 0) { + perror("open"); fprintf (stderr, "httpd: could not open transfer log file %s.\n", fname); exit(1); } } 1.11 +5 -5 apache/src/mod_log_referer.c Index: mod_log_referer.c =================================================================== RCS file: /export/home/cvs/apache/src/mod_log_referer.c,v retrieving revision 1.10 retrieving revision 1.11 diff -C3 -r1.10 -r1.11 *** mod_log_referer.c 1997/03/07 14:15:42 1.10 --- mod_log_referer.c 1997/03/22 23:51:03 1.11 *************** *** 125,130 **** --- 125,131 ---- #else execl (SHELL_PATH, SHELL_PATH, "-c", (char *)cmd, NULL); #endif + perror ("execl"); fprintf (stderr, "Exec of shell for logging failed!!!\n"); exit (1); } *************** *** 141,150 **** if (*cls->fname == '|') { FILE *dummy; ! spawn_child(p, referer_log_child, (void *)(cls->fname+1), ! kill_after_timeout, &dummy, NULL); ! ! if (dummy == NULL) { fprintf (stderr, "Couldn't fork child for RefererLog process\n"); exit (1); } --- 142,150 ---- if (*cls->fname == '|') { FILE *dummy; ! if (!spawn_child (p, referer_log_child, (void *)(cls->fname+1), ! kill_after_timeout, &dummy, NULL)) { ! perror ("spawn_child"); fprintf (stderr, "Couldn't fork child for RefererLog process\n"); exit (1); } *************** *** 153,160 **** } else if(*cls->fname != '\0') { if((cls->referer_fd = popenf(p, fname, xfer_flags, xfer_mode)) < 0) { - fprintf(stderr,"httpd: could not open referer log file %s.\n", fname); perror("open"); exit(1); } } --- 153,160 ---- } else if(*cls->fname != '\0') { if((cls->referer_fd = popenf(p, fname, xfer_flags, xfer_mode)) < 0) { perror("open"); + fprintf(stderr,"httpd: could not open referer log file %s.\n", fname); exit(1); } } 1.17 +1 -1 apache/src/mod_mime.c Index: mod_mime.c =================================================================== RCS file: /export/home/cvs/apache/src/mod_mime.c,v retrieving revision 1.16 retrieving revision 1.17 diff -C3 -r1.16 -r1.17 *** mod_mime.c 1997/03/07 14:15:42 1.16 --- mod_mime.c 1997/03/22 23:51:03 1.17 *************** *** 193,201 **** types_confname = server_root_relative (p, types_confname); if(!(f = fopen(types_confname,"r"))) { fprintf(stderr,"httpd: could not open mime types file %s\n", types_confname); - perror("fopen"); exit(1); } --- 193,201 ---- types_confname = server_root_relative (p, types_confname); if(!(f = fopen(types_confname,"r"))) { + perror("fopen"); fprintf(stderr,"httpd: could not open mime types file %s\n", types_confname); exit(1); } 1.23 +7 -4 apache/src/mod_rewrite.c Index: mod_rewrite.c =================================================================== RCS file: /export/home/cvs/apache/src/mod_rewrite.c,v retrieving revision 1.22 retrieving revision 1.23 diff -C3 -r1.22 -r1.23 *** mod_rewrite.c 1997/03/20 18:03:35 1.22 --- mod_rewrite.c 1997/03/22 23:51:03 1.23 *************** *** 2250,2258 **** fname = server_root_relative(p, conf->rewritelogfile); if (*conf->rewritelogfile == '|') { ! spawn_child(p, rewritelog_child, (void *)(conf->rewritelogfile+1), ! kill_after_timeout, &fp, NULL); ! if (fp == NULL) { fprintf (stderr, "mod_rewrite: could not fork child for RewriteLog process\n"); exit (1); } --- 2250,2258 ---- fname = server_root_relative(p, conf->rewritelogfile); if (*conf->rewritelogfile == '|') { ! if (!spawn_child (p, rewritelog_child, (void *)(conf->rewritelogfile+1), ! kill_after_timeout, &fp, NULL)) { ! perror ("spawn_child"); fprintf (stderr, "mod_rewrite: could not fork child for RewriteLog process\n"); exit (1); } *************** *** 2260,2267 **** } else if (*conf->rewritelogfile != '\0') { if ((conf->rewritelogfp = popenf(p, fname, rewritelog_flags, rewritelog_mode)) < 0) { - fprintf(stderr, "mod_rewrite: could not open RewriteLog file %s.\n", fname); perror("open"); exit(1); } } --- 2260,2267 ---- } else if (*conf->rewritelogfile != '\0') { if ((conf->rewritelogfp = popenf(p, fname, rewritelog_flags, rewritelog_mode)) < 0) { perror("open"); + fprintf(stderr, "mod_rewrite: could not open RewriteLog file %s.\n", fname); exit(1); } } *************** *** 2405,2410 **** --- 2405,2411 ---- fpout = NULL; rc = spawn_child(p, rewritemap_program_child, (void *)map->datafile, kill_after_timeout, &fpin, &fpout); if (rc == 0 || fpin == NULL || fpout == NULL) { + perror ("spawn_child"); fprintf (stderr, "mod_rewrite: could not fork child for RewriteMap process\n"); exit (1); } *************** *** 3216,3221 **** --- 3217,3223 ---- #endif if (rc < 0) { + perror ("flock"); fprintf(stderr, "Error getting lock. Exiting!"); exit(1); } *************** *** 3240,3245 **** --- 3242,3248 ---- #endif if (rc < 0) { + perror ("flock"); fprintf(stderr, "Error freeing lock. Exiting!"); exit(1); } 1.51 +1 -1 apache/src/util.c Index: util.c =================================================================== RCS file: /export/home/cvs/apache/src/util.c,v retrieving revision 1.50 retrieving revision 1.51 diff -C3 -r1.50 -r1.51 *** util.c 1997/03/20 17:10:09 1.50 --- util.c 1997/03/22 23:51:04 1.51 *************** *** 1129,1136 **** len = sizeof(struct sockaddr); if(getsockname(sd,&addr,&len) < 0) { - fprintf (stderr, "Can't get local host address!\n"); perror ("getsockname"); exit(1); } --- 1129,1136 ---- len = sizeof(struct sockaddr); if(getsockname(sd,&addr,&len) < 0) { perror ("getsockname"); + fprintf (stderr, "Can't get local host address!\n"); exit(1); }