dgaudet     98/06/06 12:30:53

  Modified:    src      CHANGES Configure
               src/include conf.h
               src/main http_main.c http_protocol.c util.c
  Log:
  Updated support for UTS 2.1.2.
  
  PR:           2320
  Submitted by: Dave Dykstra <[EMAIL PROTECTED]>
  
  Revision  Changes    Path
  1.890     +3 -0      apache-1.3/src/CHANGES
  
  Index: CHANGES
  ===================================================================
  RCS file: /export/home/cvs/apache-1.3/src/CHANGES,v
  retrieving revision 1.889
  retrieving revision 1.890
  diff -u -r1.889 -r1.890
  --- CHANGES   1998/06/06 19:21:20     1.889
  +++ CHANGES   1998/06/06 19:30:38     1.890
  @@ -1,5 +1,8 @@
   Changes with Apache 1.3.1
   
  +  *) PORT: Updated support for UTS 2.1.2.
  +     [Dave Dykstra <[EMAIL PROTECTED]>] PR#2320
  +
     *) Fix symbol export list (src/support/httpd.exp) after recent
        API changes in the child spawning area.
        [Jens-Uwe Mager <[EMAIL PROTECTED]>]
  
  
  
  1.263     +2 -1      apache-1.3/src/Configure
  
  Index: Configure
  ===================================================================
  RCS file: /export/home/cvs/apache-1.3/src/Configure,v
  retrieving revision 1.262
  retrieving revision 1.263
  diff -u -r1.262 -r1.263
  --- Configure 1998/06/04 20:13:12     1.262
  +++ Configure 1998/06/06 19:30:39     1.263
  @@ -629,8 +629,9 @@
        ;;
       *-uts*)
        OS='Amdahl UTS'
  -     CFLAGS="$CFLAGS -Xa -eft -DUTS21"
  +     CFLAGS="$CFLAGS -Xa -eft -DUTS21 -DUSEBCOPY"
        LIBS="$LIBS -lsocket -lbsd -la"
  +     DEF_WANTHSREGEX=yes
        ;;
       *-ultrix)
        OS='ULTRIX'
  
  
  
  1.215     +12 -1     apache-1.3/src/include/conf.h
  
  Index: conf.h
  ===================================================================
  RCS file: /export/home/cvs/apache-1.3/src/include/conf.h,v
  retrieving revision 1.214
  retrieving revision 1.215
  diff -u -r1.214 -r1.215
  --- conf.h    1998/06/04 20:13:17     1.214
  +++ conf.h    1998/06/06 19:30:46     1.215
  @@ -573,13 +573,24 @@
   #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 USE_LONGJMP
  +#define JMP_BUF jmp_buf
  +#define NO_USE_SIGACTION
  +#define NEED_STRERROR
  +#define NEED_STRSTR
  +#define NEED_HASHBANG_EMUL
  +#define NDELAY_PIPE_RETURNS_ZERO
  +#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
  
  
  
  1.359     +17 -15    apache-1.3/src/main/http_main.c
  
  Index: http_main.c
  ===================================================================
  RCS file: /export/home/cvs/apache-1.3/src/main/http_main.c,v
  retrieving revision 1.358
  retrieving revision 1.359
  diff -u -r1.358 -r1.359
  --- http_main.c       1998/06/04 20:13:19     1.358
  +++ http_main.c       1998/06/06 19:30:47     1.359
  @@ -2129,29 +2129,26 @@
   }
   
   
  -#if defined(BROKEN_WAIT) || defined(NEED_WAITPID)
  +#if 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().
  +   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(void)
  +int reap_children(ap_wait_t *status)
   {
  -    int status, n;
  -    int ret = 0;
  +    int n, pid;
   
       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_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);
  -         ret = 1;
  +         /* just mark it as having a successful exit status */
  +         *status = 0; 
  +         return(pid);
        }
       }
  -    return ret;
  +    return 0;
   }
   #endif
   
  @@ -2214,6 +2211,11 @@
       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);
  
  
  
  1.218     +20 -1     apache-1.3/src/main/http_protocol.c
  
  Index: http_protocol.c
  ===================================================================
  RCS file: /export/home/cvs/apache-1.3/src/main/http_protocol.c,v
  retrieving revision 1.217
  retrieving revision 1.218
  diff -u -r1.217 -r1.218
  --- http_protocol.c   1998/05/27 22:55:59     1.217
  +++ http_protocol.c   1998/06/06 19:30:48     1.218
  @@ -1721,6 +1721,15 @@
   
       FD_ZERO(&fds);
       while (!r->connection->aborted) {
  +#ifdef NDELAY_PIPE_RETURNS_ZERO
  +     /* 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,8 +1737,15 @@
   
           do {
               n = ap_bread(fb, buf, len);
  -            if (n >= 0 || r->connection->aborted)
  +#ifdef NDELAY_PIPE_RETURNS_ZERO
  +         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,6 +1758,9 @@
                * around and try another read
                */
               ap_select(fd + 1, &fds, NULL, NULL, NULL);
  +#ifdef NDELAY_PIPE_RETURNS_ZERO
  +         afterselect = 1;
  +#endif
           } while (!r->connection->aborted);
   
           if (n < 1 || r->connection->aborted) {
  
  
  
  1.119     +34 -3     apache-1.3/src/main/util.c
  
  Index: util.c
  ===================================================================
  RCS file: /export/home/cvs/apache-1.3/src/main/util.c,v
  retrieving revision 1.118
  retrieving revision 1.119
  diff -u -r1.118 -r1.119
  --- util.c    1998/06/01 18:20:30     1.118
  +++ util.c    1998/06/06 19:30:48     1.119
  @@ -1397,7 +1397,35 @@
   }
   #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,7 +1461,8 @@
   #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
  + * 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,7 +1471,9 @@
        errno = ECHILD;
        return -1;
       }
  -    while (((tmp_pid = wait(statusp)) != pid) && (tmp_pid != -1));
  +    while (((tmp_pid = wait3(statusp, options, 0)) != pid) &&
  +             (tmp_pid != -1) && (tmp_pid != 0) && (pid != -1))
  +     ;
       return tmp_pid;
   }
   #endif
  
  
  

Reply via email to