OSDN Git Service

* cygwin.din (fpurge, mkstemps): New exports.
authorcorinna <corinna>
Fri, 3 Jul 2009 13:01:15 +0000 (13:01 +0000)
committercorinna <corinna>
Fri, 3 Jul 2009 13:01:15 +0000 (13:01 +0000)
* include/cygwin/version.h (CYGWIN_VERSION_API_MINOR): Bump.
* mktemp.cc (_gettemp): Add parameter.
(mkstemps): New function.
(mkstemp, mkdtemp, mktemp): Adjust clients.

winsup/cygwin/ChangeLog
winsup/cygwin/cygwin.din
winsup/cygwin/include/cygwin/version.h
winsup/cygwin/mktemp.cc

index 646c7a5..358a65c 100644 (file)
@@ -1,3 +1,19 @@
+2009-07-03  Eric Blake  <ebb9@byu.net>
+
+       * cygwin.din (fpurge, mkstemps): New exports.
+       * include/cygwin/version.h (CYGWIN_VERSION_API_MINOR): Bump.
+       * mktemp.cc (_gettemp): Add parameter.
+       (mkstemps): New function.
+       (mkstemp, mkdtemp, mktemp): Adjust clients.
+
+2009-07-03  Corinna Vinschen  <corinna@vinschen.de>
+
+       * autoload.cc: Fix typo in comment.
+       (ShowWindowAsync): Define.
+       (AttachConsole): Define.
+       * fhandler_console.cc (fhandler_console::need_invisible): Add band-aid
+       for Windows 7 AllocConsole bug.
+
 2009-07-01  Corinna Vinschen  <corinna@vinschen.de>
 
        * net.cc (get_xp_ifs): Fix typo in comment.
index 83b9d0f..7018ecd 100644 (file)
@@ -505,6 +505,7 @@ __fpclassifyd NOSIGFE
 __fpclassifyf NOSIGFE
 fprintf SIGFE
 _fprintf = fprintf SIGFE
+fpurge SIGFE
 fputc SIGFE
 _fputc = fputc SIGFE
 fputs SIGFE
@@ -984,6 +985,7 @@ _mknod32 = mknod32 SIGFE
 mknodat SIGFE
 mkstemp SIGFE
 _mkstemp = mkstemp SIGFE
+mkstemps SIGFE
 mktemp SIGFE
 _mktemp = mktemp SIGFE
 mktime SIGFE
index 82a6181..32326ed 100644 (file)
@@ -364,12 +364,13 @@ details. */
       208: Export log2, log2f.
       209: Export wordexp, wordfree.
       210: New ctype layout using variable ctype pointer.  Export __ctype_ptr__.
+      211: Export fpurge, mkstemps.
      */
 
      /* Note that we forgot to bump the api for ualarm, strtoll, strtoull */
 
 #define CYGWIN_VERSION_API_MAJOR 0
-#define CYGWIN_VERSION_API_MINOR 210
+#define CYGWIN_VERSION_API_MINOR 211
 
      /* There is also a compatibity version number associated with the
        shared memory regions.  It is incremented when incompatible
index c39fe49..b8a1381 100644 (file)
@@ -1,15 +1,16 @@
 /* mktemp.cc: mktemp functions
 
-This file is adapted for Cygwin from FreeBSD.
+This file is adapted for Cygwin from FreeBSD and newlib.
 
 See the copyright at the bottom of this file. */
 
 #include "winsup.h"
 #include "cygerrno.h"
 #include <fcntl.h>
+#include <sys/stat.h>
 #include <unistd.h>
 
-static int _gettemp(char *, int *, int);
+static int _gettemp(char *, int *, int, size_t);
 static uint32_t arc4random ();
 
 static const char padchar[] =
@@ -19,23 +20,30 @@ extern "C" int
 mkstemp(char *path)
 {
   int fd;
-  return _gettemp(path, &fd, 0) ? fd : -1;
+  return _gettemp(path, &fd, 0, 0) ? fd : -1;
 }
 
 extern "C" char *
 mkdtemp(char *path)
 {
-  return _gettemp(path, NULL, 1) ? path : NULL;
+  return _gettemp(path, NULL, 1, 0) ? path : NULL;
+}
+
+extern "C" int
+mkstemps(char *path, int len)
+{
+  int fd;
+  return _gettemp(path, &fd, 0, len) ? fd : -1;
 }
 
 extern "C" char *
 mktemp(char *path)
 {
-  return _gettemp(path, NULL, 0) ? path : (char *) NULL;
+  return _gettemp(path, NULL, 0, 0) ? path : (char *) NULL;
 }
 
 static int
-_gettemp(char *path, int *doopen, int domkdir)
+_gettemp(char *path, int *doopen, int domkdir, size_t suffixlen)
 {
   char *start, *trv, *suffp;
   char *pad;
@@ -46,12 +54,14 @@ _gettemp(char *path, int *doopen, int domkdir)
       return 0;
     }
 
-  suffp = trv = strchr (path, '\0');
-  if (--trv < path)
+  trv = strchr (path, '\0');
+  if ((size_t) (trv - path) < suffixlen)
     {
       set_errno (EINVAL);
       return 0;
     }
+  trv -= suffixlen;
+  suffp = trv--;
 
   /* Fill space with random characters */
   while (trv >= path && *trv == 'X')
@@ -59,6 +69,11 @@ _gettemp(char *path, int *doopen, int domkdir)
       uint32_t rand = arc4random () % (sizeof (padchar) - 1);
       *trv-- = padchar[rand];
     }
+  if (suffp - trv < 6)
+    {
+      set_errno (EINVAL);
+      return 0;
+    }
   start = trv + 1;
 
   /*