martin      01/02/21 07:51:43

  Modified:    include  apr_general.h
               file_io/unix Makefile.in
               .        configure.in
  Added:       file_io/unix mktemp.c
  Log:
  Add mktemp() and mkstemp() emulation for systems which don't have it.
  Jean-Frederic writes:
   I have tested Apache2.0 with a ReliantUNIX machine. This machine has a
   SVR4 Unix implementation.
   To compile correctly the -DXTI_SUPPORT should be added to CFLAGS (I have
   done it when calling configure), and I have added a mkstemp() because it
   is not in the default runtime library.
   I have reused and enhanced an mkstemp() routine from FreeBSD. Find
   enclosed the needed patch to test for mkstemp() and to use ap_mkstemp()
   when needed.
  
  Submitted by: Jean-Frederic Clere <[EMAIL PROTECTED]>
  
  Revision  Changes    Path
  1.53      +6 -0      apr/include/apr_general.h
  
  Index: apr_general.h
  ===================================================================
  RCS file: /home/cvs/apr/include/apr_general.h,v
  retrieving revision 1.52
  retrieving revision 1.53
  diff -u -u -r1.52 -r1.53
  --- apr_general.h     2001/02/16 04:15:44     1.52
  +++ apr_general.h     2001/02/21 15:51:42     1.53
  @@ -143,6 +143,12 @@
   #define memmove(a,b,c) bcopy(b,a,c)
   #endif
   
  +#if (!HAVE_MKSTEMP)
  +#define mkstemp(a) ap_mkstemp(a)
  +#define mkstemps(a,b) ap_mkstemp(a,b)
  +#define mkdtemp(a) ap_mkdtemp(a)
  +#endif
  +
   /**
    * @package APR Random Functions
    */
  
  
  
  1.22      +2 -1      apr/file_io/unix/Makefile.in
  
  Index: Makefile.in
  ===================================================================
  RCS file: /home/cvs/apr/file_io/unix/Makefile.in,v
  retrieving revision 1.21
  retrieving revision 1.22
  diff -u -u -r1.21 -r1.22
  --- Makefile.in       2001/01/09 11:05:47     1.21
  +++ Makefile.in       2001/02/21 15:51:42     1.22
  @@ -9,7 +9,8 @@
        open.lo \
        pipe.lo \
        readwrite.lo \
  -     seek.lo
  +     seek.lo \
  +     mktemp.lo
   
   # bring in rules.mk for standard functionality
   @INCLUDE_RULES@
  
  
  
  1.1                  apr/file_io/unix/mktemp.c
  
  Index: mktemp.c
  ===================================================================
  /*
   * Copyright (c) 1987, 1993
   *    The Regents of the University of California.  All rights reserved.
   *
   * Redistribution and use in source and binary forms, with or without
   * modification, are permitted provided that the following conditions
   * are met:
   * 1. Redistributions of source code must retain the above copyright
   *    notice, this list of conditions and the following disclaimer.
   * 2. Redistributions in binary form must reproduce the above copyright
   *    notice, this list of conditions and the following disclaimer in the
   *    documentation and/or other materials provided with the distribution.
   * 3. All advertising materials mentioning features or use of this software
   *    must display the following acknowledgement:
   *    This product includes software developed by the University of
   *    California, Berkeley and its contributors.
   * 4. Neither the name of the University nor the names of its contributors
   *    may be used to endorse or promote products derived from this software
   *    without specific prior written permission.
   *
   * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
   * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
   * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
   * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
   * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
   * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
   * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
   * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
   * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
   * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
   * SUCH DAMAGE.
   */
  
  #ifndef __warn_references
  #define __warn_references(a,b) 
  #endif
  #ifdef  SVR4
  #include <inttypes.h>
  #define arc4random() rand()
  #define seedrandom(a) srand(a)
  #else
  #include <stdint.h>
  #define arc4random() random()
  #define seedrandom(a) srandom(a)
  #endif
  #define _open(a,b,c) open(a,b,c)
  #define mkdtemp ap_mkdtemp
  #define mkstemp ap_mkstemp
  #define mkstemps ap_mkstemps
  #define mktemp ap_mktemp
  
  #if defined(LIBC_SCCS) && !defined(lint)
  #if 0
  static char sccsid[] = "@(#)mktemp.c  8.1 (Berkeley) 6/4/93";
  #endif
  static const char rcsid[] =
    "$FreeBSD: src/lib/libc/stdio/mktemp.c,v 1.19.2.1 2001/01/20 09:35:24 kris 
Exp $";
  #endif /* LIBC_SCCS and not lint */
  
  #include <sys/types.h>
  #include <sys/stat.h>
  #include <fcntl.h>
  #include <errno.h>
  #include <stdio.h>
  #include <stdlib.h>
  #include <string.h>
  #include <ctype.h>
  #include <unistd.h>
  
  #ifdef  SVR4
  /* arrange to compile it on my machine */
  char *_mktemp(char *);
  #else
  char *_mktemp __P((char *));
  static int _gettemp (char *, int *, int, int);
  #endif
  
  
  static const unsigned char padchar[] =
  "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
  static uint32_t randseed=0;
  
  int
  mkstemps(path, slen)
        char *path;
        int slen;
  {
        int fd;
  
        return (_gettemp(path, &fd, 0, slen) ? fd : -1);
  }
  
  int
  mkstemp(path)
        char *path;
  {
        int fd;
  
        return (_gettemp(path, &fd, 0, 0) ? fd : -1);
  }
  
  char *
  mkdtemp(path)
        char *path;
  {
        return(_gettemp(path, (int *)NULL, 1, 0) ? path : (char *)NULL);
  }
  
  char *
  _mktemp(path)
        char *path;
  {
        return(_gettemp(path, (int *)NULL, 0, 0) ? path : (char *)NULL);
  }
  
  __warn_references(mktemp,
      "warning: mktemp() possibly used unsafely; consider using mkstemp()");
  
  char *
  mktemp(path)
        char *path;
  {
        return(_mktemp(path));
  }
  
  static int
  _gettemp(path, doopen, domkdir, slen)
        char *path;
        register int *doopen;
        int domkdir;
        int slen;
  {
        register char *start, *trv, *suffp;
        char *pad;
        struct stat sbuf;
        int rval;
        uint32_t randnum;
  
        if (doopen && domkdir) {
                errno = EINVAL;
                return(0);
        }
        if (randseed==0) {
                randseed = time(NULL);
                seedrandom(randseed);
        }
  
        for (trv = path; *trv; ++trv)
                ;
        trv -= slen;
        suffp = trv;
        --trv;
        if (trv < path) {
                errno = EINVAL;
                return (0);
        }
  
        /* Fill space with random characters */
        while (*trv == 'X') {
                randnum = arc4random() % (sizeof(padchar) - 1);
                *trv-- = padchar[randnum];
        }
        start = trv + 1;
  
        /*
         * check the target directory.
         */
        if (doopen || domkdir) {
                for (;; --trv) {
                        if (trv <= path)
                                break;
                        if (*trv == '/') {
                                *trv = '\0';
                                rval = stat(path, &sbuf);
                                *trv = '/';
                                if (rval != 0)
                                        return(0);
                                if (!S_ISDIR(sbuf.st_mode)) {
                                        errno = ENOTDIR;
                                        return(0);
                                }
                                break;
                        }
                }
        }
  
        for (;;) {
                errno = 0;
                if (doopen) {
                        if ((*doopen =
                            _open(path, O_CREAT|O_EXCL|O_RDWR, 0600)) >= 0)
                                return(1);
                        if (errno != EEXIST)
                                return(0);
                } else if (domkdir) {
                        if (mkdir(path, 0700) == 0)
                                return(1);
                        if (errno != EEXIST)
                                return(0);
                } else if (lstat(path, &sbuf))
                        return(errno == ENOENT ? 1 : 0);
  
                /* If we have a collision, cycle through the space of filenames 
*/
                for (trv = start;;) {
                        if (*trv == '\0' || trv == suffp)
                                return(0);
                        pad = strchr((char *)padchar, *trv);
                        if (pad == NULL || !*++pad)
                                *trv++ = padchar[0];
                        else {
                                *trv++ = *pad;
                                break;
                        }
                }
        }
        /*NOTREACHED*/
  }
  
  
  
  1.234     +1 -0      apr/configure.in
  
  Index: configure.in
  ===================================================================
  RCS file: /home/cvs/apr/configure.in,v
  retrieving revision 1.233
  retrieving revision 1.234
  diff -u -u -r1.233 -r1.234
  --- configure.in      2001/02/21 14:35:01     1.233
  +++ configure.in      2001/02/21 15:51:43     1.234
  @@ -273,6 +273,7 @@
   fi
   AC_CHECK_FUNCS(hstrerror)
   AC_CHECK_FUNCS(memmove, [ have_memmove="1" ], [have_memmove="0" ])
  +AC_CHECK_FUNCS(have_mkstemp, [ have_mkstemp="1" ], [have_mkstemp="0" ])
   
   AC_SUBST(fork)
   AC_SUBST(have_inet_addr)
  
  
  

Reply via email to