apr-commits mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From mar...@apache.org
Subject cvs commit: apr configure.in
Date Wed, 21 Feb 2001 15:51:43 GMT
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 <jfrederic.clere@fujitsu-siemens.com>
  
  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)
  
  
  

Mime
View raw message