You are viewing a plain text version of this content. The canonical link for it is here.
Posted to cvs@httpd.apache.org by fi...@hyperreal.org on 1998/09/15 21:47:47 UTC

cvs commit: apache-1.3/src/regex regcomp.c regex2.h regexec.c regfree.c

fielding    98/09/15 12:47:46

  Modified:    src      CHANGES Configure
               src/helpers GuessOS
               src/include ap_config.h hsregex.h
               src/main http_main.c
               src/os/unix os.c
               src/regex regcomp.c regex2.h regexec.c regfree.c
  Log:
  Added RHAPSODY (Mac OS X Server) support. MAP_TMPFILE defined
  as an alternate mechanism for mmap'd shared memory for RHAPSODY.
  ap_private_extern defined to hide symbols that conflict with loaded
  dynamic libraries on the NEXT and RHAPSODY platforms.
  
  Submitted code was modified by Roy to use ap_private_extern instead of
  directly using __private_extern__, and MAP_TMPFILE instead of TMP_MAP_ANON,
  as suggested by Dean.
  
  Submitted by:	Wilfredo Sanchez <ws...@apple.com>
  Reviewed by:	Roy Fielding, Dean Gaudet
  
  Revision  Changes    Path
  1.1059    +6 -0      apache-1.3/src/CHANGES
  
  Index: CHANGES
  ===================================================================
  RCS file: /home/cvs/apache-1.3/src/CHANGES,v
  retrieving revision 1.1058
  retrieving revision 1.1059
  diff -u -r1.1058 -r1.1059
  --- CHANGES	1998/09/15 00:15:16	1.1058
  +++ CHANGES	1998/09/15 19:47:36	1.1059
  @@ -1,5 +1,11 @@
   Changes with Apache 1.3.2
   
  +  *) PORT: Added RHAPSODY (Mac OS X Server) support. MAP_TMPFILE defined
  +     as an alternate mechanism for mmap'd shared memory for RHAPSODY.
  +     ap_private_extern defined to hide symbols that conflict with loaded
  +     dynamic libraries on the NEXT and RHAPSODY platforms.
  +     [Wilfredo Sanchez <ws...@apple.com>]
  +
     *) Delete PID file on clean shutdowns.
        [Charles Randall <cr...@matchlogic.com>] PR#2947
   
  
  
  
  1.288     +15 -2     apache-1.3/src/Configure
  
  Index: Configure
  ===================================================================
  RCS file: /home/cvs/apache-1.3/src/Configure,v
  retrieving revision 1.287
  retrieving revision 1.288
  diff -u -r1.287 -r1.288
  --- Configure	1998/09/10 08:58:42	1.287
  +++ Configure	1998/09/15 19:47:36	1.288
  @@ -483,13 +483,13 @@
   	DBM_LIB=""
   	;;
       *-next-nextstep*)
  -	OS='NeXT'
  +	OS='NeXTStep'
   	OPTIM='-O'
   	CFLAGS="$CFLAGS -DNEXT"
   	DEF_WANTHSREGEX=yes
   	;;
       *-next-openstep*)
  -	OS='Openstep for Mach'
  +	OS='OpenStep/Mach'
   	CC='cc'
   	OPTIM='-O'
   	CFLAGS="$CFLAGS -DNEXT"
  @@ -498,6 +498,11 @@
   	LDFLAGS_SHLIB='-dynamiclib -undefined warning'
   	DEF_WANTHSREGEX=yes
   	;;
  +    *-apple-rhapsody*)
  +	OS='Mac OS X Server'
  +	CFLAGS="$CFLAGS -DRHAPSODY"
  +	DEF_WANTHSREGEX=yes
  +	;;
       *-dec-osf*)
   	OS='DEC OSF/1'
   	CFLAGS="$CFLAGS -DOSF1"
  @@ -853,6 +858,14 @@
               LDFLAGS_SHLIB_EXPORT=""
               SHLIB_SUFFIX_DEPTH=2
               ;;
  +	*-apple-rhapsody*)
  +	    LD_SHLIB="cc"
  +            CFLAGS_SHLIB=""
  +            LDFLAGS_SHLIB="-bundle -undefined suppress"
  +            LDFLAGS_SHLIB_EXPORT=""
  +            SHLIB_SUFFIX_DEPTH=0
  +	    #DEF_SHARED_CORE=yes
  +	    ;;
           *-solaris2*)
               case $CC in
                   */gcc|gcc ) CFLAGS_SHLIB="-fpic" ;;
  
  
  
  1.45      +7 -0      apache-1.3/src/helpers/GuessOS
  
  Index: GuessOS
  ===================================================================
  RCS file: /home/cvs/apache-1.3/src/helpers/GuessOS,v
  retrieving revision 1.44
  retrieving revision 1.45
  diff -u -r1.44 -r1.45
  --- GuessOS	1998/07/28 17:07:13	1.44
  +++ GuessOS	1998/09/15 19:47:39	1.45
  @@ -229,6 +229,13 @@
   	echo "${MACHINE}-tandem-sysv4"; exit 0;
   	;;
   
  +    Rhapsody:*:*:*)
  +	case "${MACHINE}" in
  +	    Power*) MACHINE=powerpc ;;
  +	esac
  +	echo "${MACHINE}-apple-rhapsody${RELEASE}"; exit 0
  +	;;
  +
       "RISC iX":*)
   	echo "arm-whatever-riscix"; exit 0;
   	;;
  
  
  
  1.232     +48 -0     apache-1.3/src/include/ap_config.h
  
  Index: ap_config.h
  ===================================================================
  RCS file: /home/cvs/apache-1.3/src/include/ap_config.h,v
  retrieving revision 1.231
  retrieving revision 1.232
  diff -u -r1.231 -r1.232
  --- ap_config.h	1998/08/13 02:59:32	1.231
  +++ ap_config.h	1998/09/15 19:47:40	1.232
  @@ -360,6 +360,43 @@
   #define NO_USE_SIGACTION
   #define HAVE_SYSLOG 1
   
  +#elif defined(RHAPSODY) /* Mac OS X Server */
  +#define HAVE_GMTOFF
  +#define HAVE_MMAP
  +#define USE_MMAP_FILES
  +#define USE_MMAP_SCOREBOARD
  +#define MAP_TMPFILE
  +#define HAVE_RESOURCE
  +#define HAVE_SYS_RESOURCE_H /* apaci should catch this but doesn't */
  +#define HAVE_SNPRINTF
  +#define JMP_BUF jmp_buf
  +#define USE_LONGJMP
  +#define USE_FLOCK_SERIALIZED_ACCEPT
  +#define SINGLE_LISTEN_UNSERIALIZED_ACCEPT
  +/*
  + * If you are using APACI, (you should be on Rhapsody) these
  + * values are set at configure time. These are here as reference;
  + * the apache that is built into Rhapsody is configured with
  + * these values.
  + */
  +#if 0
  +#define HTTPD_ROOT              "/Local/Library/WebServer"
  +#define DOCUMENT_LOCATION       HTTPD_ROOT "/Documents"
  +#define DEFAULT_XFERLOG         "Logs/Access"
  +#define DEFAULT_ERRORLOG        "Logs/Errors"
  +#define DEFAULT_PIDLOG          "Logs/Process"
  +#define DEFAULT_SCOREBOARD      "Logs/Status"
  +#define DEFAULT_LOCKFILE        "Logs/Lock"
  +#define SERVER_CONFIG_FILE      "Configuration/Server"
  +#define RESOURCE_CONFIG_FILE    "Configuration/Resources"
  +#define TYPES_CONFIG_FILE       "Configuration/MIME"
  +#define ACCESS_CONFIG_FILE      "Configuration/Access"
  +#define DEFAULT_USER_DIR        "Library/Web Documents"
  +#define DEFAULT_USER            "nobody"
  +#define DEFAULT_GROUP           "nogroup"
  +#define DEFAULT_PATH            "/bin:/usr/bin:/usr/local/bin"
  +#endif
  +
   #elif defined(LINUX)
   
   #if LINUX > 1
  @@ -803,6 +840,17 @@
   #endif
   #ifndef CORE_EXPORT_NONSTD
   #define CORE_EXPORT_NONSTD	API_EXPORT_NONSTD
  +#endif
  +
  +/* On OpenStep and Rhapsody, symbols that conflict with loaded dylibs
  + * (eg. System framework) need to be declared as private symbols with
  + * __private_extern__.
  + * For other systems, make that a no-op.
  + */
  +#if defined(RHAPSODY) || defined(NEXT)
  +#define ap_private_extern __private_extern__
  +#else
  +#define ap_private_extern
   #endif
   
   /* So that we can use inline on some critical functions, and use
  
  
  
  1.11      +6 -0      apache-1.3/src/include/hsregex.h
  
  Index: hsregex.h
  ===================================================================
  RCS file: /home/cvs/apache-1.3/src/include/hsregex.h,v
  retrieving revision 1.10
  retrieving revision 1.11
  diff -u -r1.10 -r1.11
  --- hsregex.h	1998/07/09 00:04:57	1.10
  +++ hsregex.h	1998/09/15 19:47:40	1.11
  @@ -16,6 +16,12 @@
   #endif
   #endif
   
  +#if defined(RHAPSODY) || defined(NEXT)
  +#define ap_private_extern __private_extern__
  +#else
  +#define ap_private_extern
  +#endif
  +
   typedef off_t regoff_t;
   typedef struct {
   	int re_magic;
  
  
  
  1.392     +23 -2     apache-1.3/src/main/http_main.c
  
  Index: http_main.c
  ===================================================================
  RCS file: /home/cvs/apache-1.3/src/main/http_main.c,v
  retrieving revision 1.391
  retrieving revision 1.392
  diff -u -r1.391 -r1.392
  --- http_main.c	1998/09/15 01:19:32	1.391
  +++ http_main.c	1998/09/15 19:47:41	1.392
  @@ -451,7 +451,8 @@
   #endif
   
   /* a clean exit from a child with proper cleanup */
  -static void __attribute__((noreturn)) clean_child_exit(int code)
  +static void clean_child_exit(int code) __attribute__ ((noreturn));
  +static void clean_child_exit(int code)
   {
       if (pchild) {
   	ap_child_exit_modules(pchild, server_conf);
  @@ -1725,6 +1726,25 @@
   	m = mmap((caddr_t) 0xC0000000, &len,
   		 PROT_READ | PROT_WRITE, MAP_ANON | MAP_SHARED, NOFD, 0);
       }
  +#elif defined(MAP_TMPFILE)
  +    {
  +	char mfile[] = "/tmp/apache_shmem_XXXX";
  +	int fd = mkstemp(mfile);
  +	if (fd == -1) {
  +	    perror("open");
  +	    fprintf(stderr, "httpd: Could not open %s\n", mfile);
  +	    exit(APEXIT_INIT);
  +	}
  +	m = mmap((caddr_t) 0, SCOREBOARD_SIZE,
  +		PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
  +	if (m == (caddr_t) - 1) {
  +	    perror("mmap");
  +	    fprintf(stderr, "httpd: Could not mmap %s\n", mfile);
  +	    exit(APEXIT_INIT);
  +	}
  +	close(fd);
  +	unlink(mfile);
  +    }
   #else
       m = mmap((caddr_t) 0, SCOREBOARD_SIZE,
   	     PROT_READ | PROT_WRITE, MAP_ANON | MAP_SHARED, -1, 0);
  @@ -1976,7 +1996,8 @@
   }
   
   /* a clean exit from the parent with proper cleanup */
  -static void __attribute__((noreturn)) clean_parent_exit(int code)
  +static void clean_parent_exit(int code) __attribute__((noreturn));
  +static void clean_parent_exit(int code)
   {
       /* Clear the pool - including any registered cleanups */
       ap_destroy_pool(pconf);
  
  
  
  1.14      +96 -10    apache-1.3/src/os/unix/os.c
  
  Index: os.c
  ===================================================================
  RCS file: /home/cvs/apache-1.3/src/os/unix/os.c,v
  retrieving revision 1.13
  retrieving revision 1.14
  diff -u -r1.13 -r1.14
  --- os.c	1998/07/13 11:32:49	1.13
  +++ os.c	1998/09/15 19:47:44	1.14
  @@ -26,29 +26,103 @@
    *  dynamic shared object (DSO) mechanism
    */
   
  +#ifdef RHAPSODY
  +#include <mach-o/dyld.h>
  +#include "httpd.h"
  +#include "http_log.h"
  +
  +ap_private_extern
  +void undefined_symbol_handler(const char *symbolName)
  +{
  +    ap_log_error(APLOG_MARK, APLOG_NOERRNO|APLOG_EMERG, NULL,
  +                 "dyld found undefined symbol: %s\n"
  +                 "Aborting.\n",
  +                 symbolName);
  +    abort();
  +}
  +
  +ap_private_extern
  +NSModule multiple_symbol_handler (NSSymbol s, NSModule old, NSModule new)
  +{
  +    /*
  +     * Since we can't unload symbols, we're going to run into this
  +     * every time we reload a module. Workaround here is to just
  +     * rebind to the new symbol, and forget about the old one.
  +     * This is crummy, because it's basically a memory leak.
  +     * (See Radar 2262020 against dyld).
  +     */
  +
  +#ifdef DEBUG
  +    ap_log_error(APLOG_MARK, APLOG_NOERRNO|APLOG_DEBUG, NULL,
  +                 "dyld found a multiply defined symbol %s in modules:\n"
  +                 "%s\n%s\n",
  +                 NSNameOfSymbol(s),
  +                 NSNameOfModule(old), NSNameOfModule(new));
  +#endif
  +
  +    return(new);
  +}
  +
  +ap_private_extern
  +void linkEdit_symbol_handler (NSLinkEditErrors c, int errorNumber,
  +                              const char *fileName, const char *errorString)
  +{
  +    ap_log_error(APLOG_MARK, APLOG_NOERRNO|APLOG_EMERG, NULL,
  +                 "dyld errors during link edit for file %s\n%s\n",
  +                 fileName, errorString);
  +    abort();
  +}
  +
  +#endif
  +
  +void ap_os_dso_init()
  +{
  +#if defined(RHAPSODY)
  +    NSLinkEditErrorHandlers handlers;
  +
  +    handlers.undefined = undefined_symbol_handler;
  +    handlers.multiple  = multiple_symbol_handler;
  +    handlers.linkEdit  = linkEdit_symbol_handler;
  +
  +    NSInstallLinkEditErrorHandlers(&handlers);
  +#endif
  +}
  +
   void *ap_os_dso_load(const char *path)
   {
   #if defined(HPUX) || defined(HPUX10)
       shl_t handle;
       handle = shl_load(path, BIND_IMMEDIATE|BIND_VERBOSE|BIND_NOSTART, 0L);
       return (void *)handle;
  -#else
  -#if defined(OSF1) ||\
  +
  +#elif defined(RHAPSODY)
  +    NSObjectFileImage image;
  +    if (NSCreateObjectFileImageFromFile(path, &image) !=
  +        NSObjectFileImageSuccess)
  +        return NULL;
  +    return NSLinkModule(image, path, TRUE);
  +
  +#elif defined(OSF1) ||\
       (defined(__FreeBSD_version) && (__FreeBSD_version >= 220000))
       return dlopen((char *)path, RTLD_NOW | RTLD_GLOBAL);
  +
   #else
       return dlopen(path, RTLD_NOW | RTLD_GLOBAL);
   #endif
  -#endif
   }
   
  -void ap_os_dso_unload(void *handle) 
  +void ap_os_dso_unload(void *handle)
   {
   #if defined(HPUX) || defined(HPUX10)
       shl_unload((shl_t)handle);
  +
  +#elif defined(RHAPSODY)
  +    NSUnLinkModule(handle,FALSE);
  +
   #else
       dlclose(handle);
   #endif
  +
       return;
   }
   
  @@ -63,23 +137,35 @@
       if (status == -1 && errno == 0) /* try TYPE_DATA instead */
           status = shl_findsym((shl_t *)&handle, symname, TYPE_DATA, &symaddr);
       return (status == -1 ? NULL : symaddr);
  -#else /* ndef HPUX */
  -#ifdef DLSYM_NEEDS_UNDERSCORE
  -    char symbol[256];
  +
  +#elif defined(RHAPSODY)
  +    NSSymbol symbol;
  +    char *symname2 = (char*)malloc(sizeof(char)*(strlen(symname)+2));
  +    sprintf(symname2, "_%s", symname);
  +    symbol = NSLookupAndBindSymbol(symname2);
  +    free(symname2);
  +    return NSAddressOfSymbol(symbol);
  +
  +#elif DLSYM_NEEDS_UNDERSCORE
  +    char *symbol = (char*)malloc(sizeof(char)*(strlen(symname)+2));
  +    void *retval;
       sprintf(symbol, "_%s", symname);
  -    return dlsym(handle, symbol);
  +    retval = dlsym(handle, symbol);
  +    free(symbol);
  +    return retval;
  +
   #else
       return dlsym(handle, symname);
   #endif
  -#endif /* ndef HPUX */
   }
   
   const char *ap_os_dso_error(void)
   {
   #if defined(HPUX) || defined(HPUX10)
       return strerror(errno);
  +#elif defined(RHAPSODY)
  +    return NULL;
   #else
       return dlerror();
   #endif
   }
  -
  
  
  
  1.9       +1 -0      apache-1.3/src/regex/regcomp.c
  
  Index: regcomp.c
  ===================================================================
  RCS file: /home/cvs/apache-1.3/src/regex/regcomp.c,v
  retrieving revision 1.8
  retrieving revision 1.9
  diff -u -r1.8 -r1.9
  --- regcomp.c	1998/07/13 11:32:52	1.8
  +++ regcomp.c	1998/09/15 19:47:45	1.9
  @@ -83,6 +83,7 @@
    = #define	REG_PEND	0040
    = #define	REG_DUMP	0200
    */
  +ap_private_extern
   API_EXPORT(int)			/* 0 success, otherwise REG_something */
   regcomp(preg, pattern, cflags)
   regex_t *preg;
  
  
  
  1.7       +6 -0      apache-1.3/src/regex/regex2.h
  
  Index: regex2.h
  ===================================================================
  RCS file: /home/cvs/apache-1.3/src/regex/regex2.h,v
  retrieving revision 1.6
  retrieving revision 1.7
  diff -u -r1.6 -r1.7
  --- regex2.h	1998/07/09 00:04:56	1.6
  +++ regex2.h	1998/09/15 19:47:45	1.7
  @@ -8,6 +8,12 @@
    = #endif
    = #endif
    =
  + = #if defined(RHAPSODY) || defined(NEXT)
  + = #define ap_private_extern __private_extern__
  + = #else
  + = #define ap_private_extern
  + = #endif
  + =
    = typedef off_t regoff_t;
    = typedef struct {
    = 	int re_magic;
  
  
  
  1.6       +1 -0      apache-1.3/src/regex/regexec.c
  
  Index: regexec.c
  ===================================================================
  RCS file: /home/cvs/apache-1.3/src/regex/regexec.c,v
  retrieving revision 1.5
  retrieving revision 1.6
  diff -u -r1.5 -r1.6
  --- regexec.c	1998/02/04 18:18:55	1.5
  +++ regexec.c	1998/09/15 19:47:45	1.6
  @@ -111,6 +111,7 @@
    * when choosing which matcher to call.  Also, by this point the matchers
    * have been prototyped.
    */
  +ap_private_extern
   API_EXPORT(int)				/* 0 success, REG_NOMATCH failure */
   regexec(preg, string, nmatch, pmatch, eflags)
   const regex_t *preg;
  
  
  
  1.4       +1 -0      apache-1.3/src/regex/regfree.c
  
  Index: regfree.c
  ===================================================================
  RCS file: /home/cvs/apache-1.3/src/regex/regfree.c,v
  retrieving revision 1.3
  retrieving revision 1.4
  diff -u -r1.3 -r1.4
  --- regfree.c	1998/02/04 18:18:55	1.3
  +++ regfree.c	1998/09/15 19:47:45	1.4
  @@ -10,6 +10,7 @@
    - regfree - free everything
    = API_EXPORT(void) regfree(regex_t *);
    */
  +ap_private_extern
   API_EXPORT(void)
   regfree(preg)
   regex_t *preg;