diff --git a/winsup/cygwin/ChangeLog b/winsup/cygwin/ChangeLog index ca9a326c0..c9bd3fc1f 100644 --- a/winsup/cygwin/ChangeLog +++ b/winsup/cygwin/ChangeLog @@ -1,3 +1,11 @@ +2010-07-19 Eric Blake + + * mktemp.cc (_gettemp): Add flags argument. All callers updated. + (mkostemp, mkostemps): New functions. + * cygwin.din (mkostemp, mkostemps): Export. + * posix.sgml: Document them. + * include/cygwin/version.h: Bump version. + 2010-07-18 Christopher Faylor * autoload.cc (noload): Use "pushl" rather than "push". diff --git a/winsup/cygwin/cygwin.din b/winsup/cygwin/cygwin.din index fa5c77dd7..9253d2cbe 100644 --- a/winsup/cygwin/cygwin.din +++ b/winsup/cygwin/cygwin.din @@ -995,6 +995,8 @@ mknod SIGFE _mknod = mknod SIGFE _mknod32 = mknod32 SIGFE mknodat SIGFE +mkostemp SIGFE +mkostemps SIGFE mkstemp SIGFE _mkstemp = mkstemp SIGFE mkstemps SIGFE diff --git a/winsup/cygwin/include/cygwin/version.h b/winsup/cygwin/include/cygwin/version.h index 3a95e51e5..9924e4212 100644 --- a/winsup/cygwin/include/cygwin/version.h +++ b/winsup/cygwin/include/cygwin/version.h @@ -388,12 +388,13 @@ details. */ 226: Export __locale_mb_cur_max. 227: Add pseudo_reloc_start, pseudo_reloc_end, image_base to per_process. 228: CW_STRERROR added. + 229: Add mkostemp, mkostemps. */ /* Note that we forgot to bump the api for ualarm, strtoll, strtoull */ #define CYGWIN_VERSION_API_MAJOR 0 -#define CYGWIN_VERSION_API_MINOR 228 +#define CYGWIN_VERSION_API_MINOR 229 /* There is also a compatibity version number associated with the shared memory regions. It is incremented when incompatible diff --git a/winsup/cygwin/mktemp.cc b/winsup/cygwin/mktemp.cc index b8a1381c4..7770c3bff 100644 --- a/winsup/cygwin/mktemp.cc +++ b/winsup/cygwin/mktemp.cc @@ -10,7 +10,7 @@ See the copyright at the bottom of this file. */ #include #include -static int _gettemp(char *, int *, int, size_t); +static int _gettemp(char *, int *, int, size_t, int); static uint32_t arc4random (); static const char padchar[] = @@ -20,30 +20,44 @@ extern "C" int mkstemp(char *path) { int fd; - return _gettemp(path, &fd, 0, 0) ? fd : -1; + return _gettemp(path, &fd, 0, 0, O_BINARY) ? fd : -1; } extern "C" char * mkdtemp(char *path) { - return _gettemp(path, NULL, 1, 0) ? path : NULL; + return _gettemp(path, NULL, 1, 0, 0) ? path : NULL; } extern "C" int mkstemps(char *path, int len) { int fd; - return _gettemp(path, &fd, 0, len) ? fd : -1; + return _gettemp(path, &fd, 0, len, O_BINARY) ? fd : -1; +} + +extern "C" int +mkostemp(char *path, int flags) +{ + int fd; + return _gettemp(path, &fd, 0, 0, flags & ~O_ACCMODE) ? fd : -1; +} + +extern "C" int +mkostemps(char *path, int len, int flags) +{ + int fd; + return _gettemp(path, &fd, 0, len, flags & ~O_ACCMODE) ? fd : -1; } extern "C" char * mktemp(char *path) { - return _gettemp(path, NULL, 0, 0) ? path : (char *) NULL; + return _gettemp(path, NULL, 0, 0, 0) ? path : (char *) NULL; } static int -_gettemp(char *path, int *doopen, int domkdir, size_t suffixlen) +_gettemp(char *path, int *doopen, int domkdir, size_t suffixlen, int flags) { char *start, *trv, *suffp; char *pad; @@ -105,7 +119,7 @@ _gettemp(char *path, int *doopen, int domkdir, size_t suffixlen) { if (doopen) { - if ((*doopen = open (path, O_CREAT | O_EXCL | O_RDWR | O_BINARY, + if ((*doopen = open (path, O_CREAT | O_EXCL | O_RDWR | flags, S_IRUSR | S_IWUSR)) >= 0) return 1; if (errno != EEXIST) diff --git a/winsup/cygwin/posix.sgml b/winsup/cygwin/posix.sgml index 6a3bc2298..fdd7589c1 100644 --- a/winsup/cygwin/posix.sgml +++ b/winsup/cygwin/posix.sgml @@ -1043,6 +1043,8 @@ also IEEE Std 1003.1-2008 (POSIX.1-2008). lsetxattr memmem mempcpy + mkostemp + mkostemps pipe2 pow10 pow10f