* cygwin.din: Export mkdtemp.
* mktemp.cc: New file. * Makefile.in (DLL_OFILES): Add mktemp.o
This commit is contained in:
		| @@ -1,3 +1,9 @@ | |||||||
|  | 2005-05-24  Christopher Faylor  <cgf@timesys.com> | ||||||
|  |  | ||||||
|  | 	* cygwin.din: Export mkdtemp. | ||||||
|  | 	* mktemp.cc: New file. | ||||||
|  | 	* Makefile.in (DLL_OFILES): Add mktemp.o | ||||||
|  |  | ||||||
| 2005-05-23  Eric Blake  <ebb9@byu.net> | 2005-05-23  Eric Blake  <ebb9@byu.net> | ||||||
|  |  | ||||||
| 	* include/stdint.h (INTMAX_C, UINTMAX_C): Fix definition. | 	* include/stdint.h (INTMAX_C, UINTMAX_C): Fix definition. | ||||||
|   | |||||||
| @@ -130,8 +130,8 @@ DLL_OFILES:=assert.o autoload.o bsdlib.o ctype.o cxx.o cygheap.o cygthread.o \ | |||||||
| 	fhandler_tty.o fhandler_virtual.o fhandler_windows.o fhandler_zero.o \ | 	fhandler_tty.o fhandler_virtual.o fhandler_windows.o fhandler_zero.o \ | ||||||
| 	flock.o fnmatch.o fork.o getopt.o glob.o grp.o heap.o hookapi.o \ | 	flock.o fnmatch.o fork.o getopt.o glob.o grp.o heap.o hookapi.o \ | ||||||
| 	init.o ioctl.o ipc.o iruserok.o localtime.o lsearch.o malloc_wrapper.o \ | 	init.o ioctl.o ipc.o iruserok.o localtime.o lsearch.o malloc_wrapper.o \ | ||||||
| 	miscfuncs.o mmap.o msg.o net.o netdb.o ntea.o passwd.o path.o pinfo.o pipe.o \ | 	miscfuncs.o mktemp.o mmap.o msg.o net.o netdb.o ntea.o passwd.o path.o \ | ||||||
| 	poll.o pthread.o regcomp.o regerror.o regexec.o regfree.o \ | 	pinfo.o pipe.o poll.o pthread.o regcomp.o regerror.o regexec.o regfree.o \ | ||||||
| 	registry.o resource.o scandir.o sched.o sec_acl.o sec_helper.o security.o \ | 	registry.o resource.o scandir.o sched.o sec_acl.o sec_helper.o security.o \ | ||||||
| 	select.o sem.o shared.o shm.o sigfe.o signal.o sigproc.o smallprint.o \ | 	select.o sem.o shared.o shm.o sigfe.o signal.o sigproc.o smallprint.o \ | ||||||
| 	spawn.o strace.o strsep.o strsig.o sync.o syscalls.o sysconf.o \ | 	spawn.o strace.o strsep.o strsig.o sync.o syscalls.o sysconf.o \ | ||||||
|   | |||||||
| @@ -649,6 +649,7 @@ getmode SIGFE | |||||||
| _getmode = getmode SIGFE | _getmode = getmode SIGFE | ||||||
| getopt SIGFE | getopt SIGFE | ||||||
| getopt_long SIGFE | getopt_long SIGFE | ||||||
|  | getopt_long_only SIGFE | ||||||
| getpagesize SIGFE | getpagesize SIGFE | ||||||
| _getpagesize = getpagesize SIGFE | _getpagesize = getpagesize SIGFE | ||||||
| getpass SIGFE | getpass SIGFE | ||||||
| @@ -910,6 +911,7 @@ memset NOSIGFE | |||||||
| _memset = memset NOSIGFE | _memset = memset NOSIGFE | ||||||
| mkdir SIGFE | mkdir SIGFE | ||||||
| _mkdir = mkdir SIGFE | _mkdir = mkdir SIGFE | ||||||
|  | mkdtemp SIGFE | ||||||
| mkfifo SIGFE | mkfifo SIGFE | ||||||
| mknod SIGFE | mknod SIGFE | ||||||
| _mknod = mknod SIGFE | _mknod = mknod SIGFE | ||||||
|   | |||||||
							
								
								
									
										180
									
								
								winsup/cygwin/mktemp.cc
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										180
									
								
								winsup/cygwin/mktemp.cc
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,180 @@ | |||||||
|  | #include "winsup.h" | ||||||
|  | #include "cygerrno.h" | ||||||
|  | #include <sys/cdefs.h> | ||||||
|  | #include <sys/types.h> | ||||||
|  | #include <sys/stat.h> | ||||||
|  | #include <fcntl.h> | ||||||
|  | #include <stdio.h> | ||||||
|  | #include <stdlib.h> | ||||||
|  | #include <string.h> | ||||||
|  | #include <ctype.h> | ||||||
|  | #include <unistd.h> | ||||||
|  |  | ||||||
|  | #define link_warning(symbol, msg) \ | ||||||
|  |   asm (".stabs \"" msg "\",30,0,0,0\n\t" \ | ||||||
|  |   ".stabs \"_" #symbol "\",1,0,0,0\n"); | ||||||
|  |  | ||||||
|  |  | ||||||
|  | static int _gettemp(char *, int *, int); | ||||||
|  | static uint32_t arc4random (); | ||||||
|  |  | ||||||
|  | static const char padchar[] = | ||||||
|  | "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"; | ||||||
|  |  | ||||||
|  | extern "C" int | ||||||
|  | mkstemp(char *path) | ||||||
|  | { | ||||||
|  |   int fd; | ||||||
|  |   return _gettemp(path, &fd, 0) ? fd : -1; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | extern "C" char * | ||||||
|  | mkdtemp(char *path) | ||||||
|  | { | ||||||
|  |   return _gettemp(path, NULL, 1) ? path : NULL; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | link_warning (mktemp, "the use of `mktemp' is dangerous, better use `mkstemp'") | ||||||
|  | link_warning (_imp__mktemp, "the use of `mktemp' is dangerous, better use `mkstemp'") | ||||||
|  |  | ||||||
|  | extern "C" char * | ||||||
|  | mktemp(char *path) | ||||||
|  | { | ||||||
|  |   return _gettemp(path, NULL, 0) ? path : (char *) NULL; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | static int | ||||||
|  | _gettemp(char *path, int *doopen, int domkdir) | ||||||
|  | { | ||||||
|  |   char *start, *trv, *suffp; | ||||||
|  |   char *pad; | ||||||
|  |  | ||||||
|  |   if (doopen && domkdir) | ||||||
|  |     { | ||||||
|  |       set_errno (EINVAL); | ||||||
|  |       return 0; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |   suffp = trv = strchr (path, '\0'); | ||||||
|  |   if (--trv < path) | ||||||
|  |     { | ||||||
|  |       set_errno (EINVAL); | ||||||
|  |       return 0; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |   /* Fill space with random characters */ | ||||||
|  |   while (trv >= path && *trv == 'X') | ||||||
|  |     { | ||||||
|  |       uint32_t rand = arc4random () % (sizeof (padchar) - 1); | ||||||
|  |       *trv-- = padchar[rand]; | ||||||
|  |     } | ||||||
|  |   start = trv + 1; | ||||||
|  |  | ||||||
|  |   /* | ||||||
|  |    * check the target directory. | ||||||
|  |    */ | ||||||
|  |   struct __stat64 sbuf; | ||||||
|  |   if (doopen != NULL || domkdir) | ||||||
|  |     { | ||||||
|  |       for (; trv > path; trv--) | ||||||
|  | 	{ | ||||||
|  | 	  if (*trv == '/') | ||||||
|  | 	    { | ||||||
|  | 	      *trv = '\0'; | ||||||
|  | 	      int rval = stat64 (path, &sbuf); | ||||||
|  | 	      *trv = '/'; | ||||||
|  | 	      if (rval != 0) | ||||||
|  | 		return 0; | ||||||
|  | 	      if (!S_ISDIR (sbuf.st_mode)) | ||||||
|  | 		{ | ||||||
|  | 		  set_errno (ENOTDIR); | ||||||
|  | 		  return 0; | ||||||
|  | 		} | ||||||
|  | 	      break; | ||||||
|  | 	    } | ||||||
|  | 	} | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |   for (;;) | ||||||
|  |     { | ||||||
|  |       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 (lstat64 (path, &sbuf)) | ||||||
|  | 	return errno == ENOENT; | ||||||
|  |  | ||||||
|  |       /* If we have a collision, cycle through the space of filenames */ | ||||||
|  |       for (trv = start;;) | ||||||
|  | 	{ | ||||||
|  | 	  if (*trv == '\0' || trv == suffp) | ||||||
|  | 	    return 0; | ||||||
|  | 	  pad = strchr (padchar, *trv); | ||||||
|  | 	  if (pad == NULL || *++pad == '\0') | ||||||
|  | 	    *trv++ = padchar[0]; | ||||||
|  | 	  else | ||||||
|  | 	    { | ||||||
|  | 	      *trv++ = *pad; | ||||||
|  | 	      break; | ||||||
|  | 	    } | ||||||
|  | 	} | ||||||
|  |     } | ||||||
|  |   /*NOTREACHED*/ | ||||||
|  | } | ||||||
|  |  | ||||||
|  | static uint32_t | ||||||
|  | arc4random () | ||||||
|  | { | ||||||
|  |   union | ||||||
|  |   { | ||||||
|  |     uint32_t rand; | ||||||
|  |     char buf[sizeof (int) / 8]; | ||||||
|  |   } r; | ||||||
|  |   int fd = open ("/dev/urandom", O_RDONLY); | ||||||
|  |   read (fd, r.buf, 4); | ||||||
|  |   close (fd); | ||||||
|  |   return r.rand; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | /* | ||||||
|  | * 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. | ||||||
|  | */ | ||||||
		Reference in New Issue
	
	Block a user