Hi,
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.
Please check it and commit it.
Cheers
Jean-frederic
diff -N file_io/unix/mktemp.c
--- /dev/null Mon Feb 19 16:57:48 2001
+++ file_io/unix/mktemp.c Mon Feb 19 15:41:55 2001
@@ -0,0 +1,217 @@
+/*
+ * 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*/
+}
Index: configure.in
===================================================================
RCS file: /home/cvs/apache/apr/configure.in,v
retrieving revision 1.228
diff -u -r1.228 configure.in
--- configure.in 2001/02/18 15:52:12 1.228
+++ configure.in 2001/02/19 16:24:18
@@ -257,6 +257,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)
Index: file_io/unix/Makefile.in
===================================================================
RCS file: /home/cvs/apache/apr/file_io/unix/Makefile.in,v
retrieving revision 1.21
diff -u -r1.21 Makefile.in
--- file_io/unix/Makefile.in 2001/01/09 11:05:47 1.21
+++ file_io/unix/Makefile.in 2001/02/19 16:24:18
@@ -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@
Index: include/apr_general.h
===================================================================
RCS file: /home/cvs/apache/apr/include/apr_general.h,v
retrieving revision 1.52
diff -u -r1.52 apr_general.h
--- include/apr_general.h 2001/02/16 04:15:44 1.52
+++ include/apr_general.h 2001/02/19 16:24:19
@@ -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
*/