Follow @Openwall on Twitter for new release announcements and other news
[<prev] [next>] [thread-next>] [day] [month] [year] [list]
Message-Id: <1359340564-2128-1-git-send-email-basile@opensource.dyc.edu>
Date: Sun, 27 Jan 2013 21:36:04 -0500
From: "Anthony G. Basile" <basile@...nsource.dyc.edu>
To: musl@...ts.openwall.com
Cc: "Anthony G. Basile" <basile@...nsource.dyc.edu>,
	"Anthony G. Basile" <blueness@...too.org>
Subject: [PATCH] Add support for mkostemp, mkstemps and mkostemps

From: "Anthony G. Basile" <basile@...nsource.dyc.edu>

Signed-off-by: Anthony G. Basile <blueness@...too.org>
---
 include/stdlib.h     |  6 ++++++
 src/temp/mkostemp.c  | 16 ++++++++++++++++
 src/temp/mkostemps.c | 16 ++++++++++++++++
 src/temp/mkstemp.c   | 15 ++-------------
 src/temp/mkstemps.c  | 16 ++++++++++++++++
 src/temp/tempname.c  | 42 ++++++++++++++++++++++++++++++++++++++++++
 6 files changed, 98 insertions(+), 13 deletions(-)
 create mode 100644 src/temp/mkostemp.c
 create mode 100644 src/temp/mkostemps.c
 create mode 100644 src/temp/mkstemps.c
 create mode 100644 src/temp/tempname.c

diff --git a/include/stdlib.h b/include/stdlib.h
index 671d188..4210f40 100644
--- a/include/stdlib.h
+++ b/include/stdlib.h
@@ -95,6 +95,9 @@ int posix_memalign (void **, size_t, size_t);
 int setenv (const char *, const char *, int);
 int unsetenv (const char *);
 int mkstemp (char *);
+int mkostemp (char *, int);
+int mkstemps (char *, int);
+int mkostemps (char *, int, int);
 char *mkdtemp (char *);
 int getsubopt (char **, char *const *, char **);
 int rand_r (unsigned *);
@@ -150,6 +153,9 @@ char *gcvt(double, int, char *);
 
 #if defined(_LARGEFILE64_SOURCE) || defined(_GNU_SOURCE)
 #define mkstemp64 mkstemp
+#define mkostemp64 mkostemp
+#define mkstemps64 mkstemps
+#define mkostemps64 mkostemps
 #endif
 
 #ifdef __cplusplus
diff --git a/src/temp/mkostemp.c b/src/temp/mkostemp.c
new file mode 100644
index 0000000..4fd374c
--- /dev/null
+++ b/src/temp/mkostemp.c
@@ -0,0 +1,16 @@
+#define _GNU_SOURCE
+#include <string.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <fcntl.h>
+#include <unistd.h>
+#include <limits.h>
+#include <errno.h>
+#include "libc.h"
+
+int __gen_tempname (char *, int, int);
+
+int mkostemp(char *template, int flags)
+{
+	return __gen_tempname (template, 0, flags);
+}
diff --git a/src/temp/mkostemps.c b/src/temp/mkostemps.c
new file mode 100644
index 0000000..9affae3
--- /dev/null
+++ b/src/temp/mkostemps.c
@@ -0,0 +1,16 @@
+#define _GNU_SOURCE
+#include <string.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <fcntl.h>
+#include <unistd.h>
+#include <limits.h>
+#include <errno.h>
+#include "libc.h"
+
+int __gen_tempname (char *, int, int);
+
+int mkostemps(char *template, int len, int flags)
+{
+	return __gen_tempname (template, len, flags);
+}
diff --git a/src/temp/mkstemp.c b/src/temp/mkstemp.c
index a390d42..08914d4 100644
--- a/src/temp/mkstemp.c
+++ b/src/temp/mkstemp.c
@@ -7,22 +7,11 @@
 #include <errno.h>
 #include "libc.h"
 
-char *__mktemp(char *);
+int __gen_tempname (char *, int, int);
 
 int mkstemp(char *template)
 {
-	int fd, retries = 100, t0 = *template;
-	while (retries--) {
-		if (!*__mktemp(template)) return -1;
-		if ((fd = open(template, O_RDWR | O_CREAT | O_EXCL, 0600))>=0)
-			return fd;
-		if (errno != EEXIST) return -1;
-		/* this is safe because mktemp verified
-		 * that we have a valid template string */
-		template[0] = t0;
-		strcpy(template+strlen(template)-6, "XXXXXX");
-	}
-	return -1;
+	return __gen_tempname (template, 0, O_RDWR);
 }
 
 LFS64(mkstemp);
diff --git a/src/temp/mkstemps.c b/src/temp/mkstemps.c
new file mode 100644
index 0000000..e194444
--- /dev/null
+++ b/src/temp/mkstemps.c
@@ -0,0 +1,16 @@
+#define _GNU_SOURCE
+#include <string.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <fcntl.h>
+#include <unistd.h>
+#include <limits.h>
+#include <errno.h>
+#include "libc.h"
+
+int __gen_tempname (char *, int, int);
+
+int mkstemps(char *template, int len)
+{
+	return __gen_tempname (template, len, O_RDWR);
+}
diff --git a/src/temp/tempname.c b/src/temp/tempname.c
new file mode 100644
index 0000000..1c198bf
--- /dev/null
+++ b/src/temp/tempname.c
@@ -0,0 +1,42 @@
+#include <string.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <fcntl.h>
+#include <unistd.h>
+#include <limits.h>
+#include <errno.h>
+#include "libc.h"
+
+char *__mktemp(char *);
+
+int __gen_tempname (char *template, int len, int flags)
+{
+	if (len < 0) return EINVAL;
+
+	int templen = strlen(template)-len;
+	if (templen<6) return EINVAL;
+
+	char *suffix = (char *)malloc((len+1)*sizeof(char));
+	/* Copy the last len chars plus the null termination */
+	int i;
+	for (i = 0; i <= len; i++)
+		suffix[i] = template[templen+i];
+	/* Null terminate the template before the suffice */
+	template[templen] = '\0';
+
+	int fd, retries = 100, t0 = *template;
+	while (retries--) {
+		if (!*__mktemp(template)) return -1;
+		/* Copy back the suffix */
+		for (i = 0; i <= len; i++)
+			template[templen+i] = suffix[i];
+		if ((fd = open(template, flags | O_CREAT | O_EXCL, 0600))>=0)
+			return fd;
+		if (errno != EEXIST) return -1;
+		/* this is safe because mktemp verified
+		 * that we have a valid template string */
+		template[0] = t0;
+		strcpy(template+templen-6, "XXXXXX");
+	}
+	return -1;
+}
-- 
1.7.12.4

Powered by blists - more mailing lists

Confused about mailing lists and their use? Read about mailing lists on Wikipedia and check out these guidelines on proper formatting of your messages.