The following reply was made to PR os-other/2320; it has been noted by GNATS.
From: [EMAIL PROTECTED] To: Dean Gaudet <[EMAIL PROTECTED]> Cc: [EMAIL PROTECTED] Subject: Re: os-other/2320: Support of UTS 2.1.2 is broken Date: Fri, 5 Jun 1998 14:58:57 -0500 On Jun 4, 1:36pm, Dean Gaudet wrote: > Hey, could you do us a huge favour... in a few hours, go to > ftp://dev.apache.org/from-cvs/ and grab a snapshot. It has a tweak that > someone else gave us to get NEXTSTEP to compile. That tweak introduced a > #define ap_wait_t, which you could use to do the NEED_UNION_WAIT thing > you've got in this patch... Could you update your patch? > > Thanks > Dean I have now integrated with snapshot apache_19980606010034. The patches are below. I eliminated NEED_UNION_WAIT. I discovered that I had accidentally left out src/main/util_script.c. It is included below now. Thanks for your quick response. - Dave Dykstra *** src/Configure.O Fri Jun 5 11:11:22 1998 --- src/Configure Fri Jun 5 11:12:59 1998 *************** *** 629,636 **** ;; *-uts*) OS='Amdahl UTS' ! CFLAGS="$CFLAGS -Xa -eft -DUTS21" LIBS="$LIBS -lsocket -lbsd -la" ;; *-ultrix) OS='ULTRIX' --- 629,637 ---- ;; *-uts*) OS='Amdahl UTS' ! CFLAGS="$CFLAGS -Xa -eft -DUTS21 -DUSEBCOPY" LIBS="$LIBS -lsocket -lbsd -la" + DEF_WANTHSREGEX=yes ;; *-ultrix) OS='ULTRIX' *** src/include/conf.h.O Fri Jun 5 11:25:15 1998 --- src/include/conf.h Fri Jun 5 11:56:10 1998 *************** *** 573,585 **** #undef NO_KILLPG #define NO_SETSID #define NEED_WAITPID - #define NO_OTHER_CHILD #define STDIN_FILENO 0 #define STDOUT_FILENO 1 #define STDERR_FILENO 2 #define HAVE_SYSLOG 1 #define strftime(buf,bufsize,fmt,tm) ascftime(buf,fmt,tm) #include <sys/types.h> #elif defined(APOLLO) #undef HAVE_GMTOFF --- 573,596 ---- #undef NO_KILLPG #define NO_SETSID #define NEED_WAITPID #define STDIN_FILENO 0 #define STDOUT_FILENO 1 #define STDERR_FILENO 2 #define HAVE_SYSLOG 1 + #define USE_LONGJMP + #define JMP_BUF jmp_buf + #define NO_USE_SIGACTION + #define NEED_STRERROR + #define NEED_STRSTR + #define NEED_POUND_BANG + #define NDELAYPIPERETURNSZERO + #define NO_DATA NO_ADDRESS + #define ap_wait_t union wait + #define WEXITSTATUS(status) (int)((status).w_retcode) + #define WTERMSIG(status) (int)((status).w_termsig) #define strftime(buf,bufsize,fmt,tm) ascftime(buf,fmt,tm) #include <sys/types.h> + #include <sys/time.h> #elif defined(APOLLO) #undef HAVE_GMTOFF *** src/main/http_main.c.O Fri Jun 5 11:18:48 1998 --- src/main/http_main.c Fri Jun 5 15:34:18 1998 *************** *** 2129,2157 **** } ! #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) { ! int status, n; ! int ret = 0; for (n = 0; n < max_daemons_limit; ++n) { ! if (ap_scoreboard_image->servers[n].status != SERVER_DEAD ! && waitpid(ap_scoreboard_image->parent[n].pid, &status, WNOHANG) ! == -1 ! && errno == ECHILD) { ! ap_sync_scoreboard_image(); ap_update_child_status(n, SERVER_DEAD, NULL); ! ret = 1; } } ! return ret; } #endif --- 2129,2154 ---- } ! #if defined(NEED_WAITPID) /* ! Systems without a real waitpid sometimes lose a child's exit while waiting ! for another. Search through the scoreboard for missing children. */ ! int reap_children(ap_wait_t *status) { ! int n, pid; for (n = 0; n < max_daemons_limit; ++n) { ! ap_sync_scoreboard_image(); ! if (ap_scoreboard_image->servers[n].status != SERVER_DEAD && ! kill((pid = ap_scoreboard_image->parent[n].pid), 0) == -1) { ap_update_child_status(n, SERVER_DEAD, NULL); ! /* just mark it as having a successful exit status */ ! *status = 0; ! return(pid); } } ! return 0; } #endif *************** *** 2214,2219 **** --- 2211,2221 ---- if (ret > 0) { return ret; } + #ifdef NEED_WAITPID + if ((ret = reap_children(status)) > 0) { + return ret; + } + #endif tv.tv_sec = SCOREBOARD_MAINTENANCE_INTERVAL / 1000000; tv.tv_usec = SCOREBOARD_MAINTENANCE_INTERVAL % 1000000; ap_select(0, NULL, NULL, NULL, &tv); *** src/main/http_protocol.c.O Fri Jun 5 11:15:29 1998 --- src/main/http_protocol.c Fri Jun 5 11:16:12 1998 *************** *** 1721,1726 **** --- 1721,1735 ---- FD_ZERO(&fds); while (!r->connection->aborted) { + #ifdef NDELAYPIPERETURNSZERO + /* Contributed by [EMAIL PROTECTED] for UTS 2.1.2, where the fcntl */ + /* O_NDELAY flag causes read to return 0 when there's nothing */ + /* available when reading from a pipe. That makes it tricky */ + /* to detect end-of-file :-(. This stupid bug is even documented */ + /* in the read(2) man page where it says that everything but */ + /* pipes return -1 and EAGAIN. That makes it a feature, right? */ + int afterselect = 0; + #endif if ((length > 0) && (total_bytes_sent + IOBUFSIZE) > length) len = length - total_bytes_sent; else *************** *** 1728,1735 **** do { n = ap_bread(fb, buf, len); ! if (n >= 0 || r->connection->aborted) break; if (n < 0 && errno != EAGAIN) break; /* we need to block, so flush the output first */ --- 1737,1751 ---- do { n = ap_bread(fb, buf, len); ! #ifdef NDELAYPIPERETURNSZERO ! if ((n > 0) || (n == 0 && afterselect)) ! break; ! #else ! if (n >= 0) break; + #endif + if (r->connection->aborted) + break; if (n < 0 && errno != EAGAIN) break; /* we need to block, so flush the output first */ *************** *** 1742,1747 **** --- 1758,1766 ---- * around and try another read */ ap_select(fd + 1, &fds, NULL, NULL, NULL); + #ifdef NDELAYPIPERETURNSZERO + afterselect = 1; + #endif } while (!r->connection->aborted); if (n < 1 || r->connection->aborted) { *** src/main/util.c.O Fri Jun 5 11:18:09 1998 --- src/main/util.c Fri Jun 5 11:18:25 1998 *************** *** 1397,1403 **** } #endif ! #ifdef NEED_INITGROUPS int initgroups(const char *name, gid_t basegid) --- 1397,1431 ---- } #endif ! /* The following routine was donated for UTS21 by [EMAIL PROTECTED] */ ! #ifdef NEED_STRSTR ! char *strstr(char *s1, char *s2) ! { ! char *p1, *p2; ! if (*s2 == '\0') { ! /* an empty s2 */ ! return(s1); ! } ! while((s1 = strchr(s1, *s2)) != NULL) { ! /* found first character of s2, see if the rest matches */ ! p1 = s1; ! p2 = s2; ! while (*++p1 == *++p2) { ! if (*p1 == '\0') { ! /* both strings ended together */ ! return(s1); ! } ! } ! if (*p2 == '\0') { ! /* second string ended, a match */ ! break; ! } ! /* didn't find a match here, try starting at next character in s1 */ ! s1++; ! } ! return(s1); ! } ! #endif #ifdef NEED_INITGROUPS int initgroups(const char *name, gid_t basegid) *************** *** 1433,1439 **** #ifdef NEED_WAITPID /* From [EMAIL PROTECTED] * this is not ideal but it works for SVR3 variants ! * httpd does not use the options so this doesn't implement them */ int waitpid(pid_t pid, int *statusp, int options) { --- 1461,1468 ---- #ifdef NEED_WAITPID /* From [EMAIL PROTECTED] * this is not ideal but it works for SVR3 variants ! * Modified by [EMAIL PROTECTED] to call wait3 instead of wait because ! * apache started to use the WNOHANG option. */ int waitpid(pid_t pid, int *statusp, int options) { *************** *** 1442,1448 **** errno = ECHILD; return -1; } ! while (((tmp_pid = wait(statusp)) != pid) && (tmp_pid != -1)); return tmp_pid; } #endif --- 1471,1479 ---- errno = ECHILD; return -1; } ! while (((tmp_pid = wait3(statusp, options, 0)) != pid) && ! (tmp_pid != -1) && (tmp_pid != 0) && (pid != -1)) ! ; return tmp_pid; } #endif *** src/main/util_script.c.O Fri Jun 5 15:40:52 1998 --- src/main/util_script.c Fri Jun 5 15:41:15 1998 *************** *** 999,1014 **** } } else { ! if (shellcmd) ! execle(SHELL_PATH, SHELL_PATH, "-c", argv0, NULL, env); ! else if ((!r->args) || (!r->args[0]) || strchr(r->args, '=')) execle(r->filename, argv0, NULL, env); ! else execve(r->filename, ! create_argv(r->pool, NULL, NULL, NULL, argv0, r->args), ! env); } return (pid); #endif --- 999,1051 ---- } } else { ! #ifdef NEED_POUND_BANG ! /* This was donated for UTS21 by Dave Dykstra */ ! /* #! is not supported by the OS, so do it ourselves */ ! int fd, n; ! char bangbuf[256], *eol; ! ! if (!shellcmd) { ! if ((fd = open(r->filename, O_RDONLY)) > 0) { ! n = read(fd, bangbuf, sizeof(bangbuf)-1); ! close(fd); ! if ((n > 2) && (bangbuf[0] == '#') && (bangbuf[1] == '!')) { ! bangbuf[sizeof(bangbuf)-1] = '\0'; ! if ((eol = strchr(&bangbuf[2], '\n')) != NULL) { ! *eol = '\0'; ! } ! } ! else ! bangbuf[0] = '\0'; ! } ! } ! #endif ! if (shellcmd) ! execle(SHELL_PATH, SHELL_PATH, "-c", argv0, NULL, env); ! ! else if ((!r->args) || (!r->args[0]) || strchr(r->args, '=')) { ! #ifdef NEED_POUND_BANG ! if (bangbuf[0] != '\0') ! execle(&bangbuf[2], argv0, r->filename, NULL, env); ! else ! #endif execle(r->filename, argv0, NULL, env); ! } ! else { ! #ifdef NEED_POUND_BANG ! if (bangbuf[0] != '\0') ! execve(&bangbuf[2], ! create_argv(r->pool, argv0, NULL, NULL, ! r->filename, r->args), ! env); ! else ! #endif execve(r->filename, ! create_argv(r->pool, NULL, NULL, NULL, argv0, r->args), ! env); ! } } return (pid); #endif
