From: "Anthony G. Basile" <basile@opensource.dyc.edu>
To: musl@lists.openwall.com
Cc: "Anthony G. Basile" <basile@opensource.dyc.edu>,
"Anthony G. Basile" <blueness@gentoo.org>
Subject: [PATCH] Add support for mkostemp, mkstemps and mkostemps
Date: Sun, 27 Jan 2013 21:36:04 -0500 [thread overview]
Message-ID: <1359340564-2128-1-git-send-email-basile@opensource.dyc.edu> (raw)
From: "Anthony G. Basile" <basile@opensource.dyc.edu>
Signed-off-by: Anthony G. Basile <blueness@gentoo.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
next reply other threads:[~2013-01-28 2:36 UTC|newest]
Thread overview: 27+ messages / expand[flat|nested] mbox.gz Atom feed top
2013-01-28 2:36 Anthony G. Basile [this message]
2013-01-28 5:01 ` Anthony G. Basile
2013-01-28 5:06 Anthony G. Basile
2013-01-28 8:47 ` John Spencer
2013-01-28 9:37 ` Szabolcs Nagy
2013-01-28 17:33 ` Szabolcs Nagy
2013-01-29 23:16 ` Anthony G. Basile
2013-01-30 7:21 ` Rich Felker
2013-01-30 7:59 ` Hardy Falk
2013-01-30 13:45 ` Szabolcs Nagy
2013-01-30 16:51 ` Rich Felker
2013-01-30 19:12 ` Szabolcs Nagy
2013-01-30 19:22 ` Rich Felker
2013-01-31 0:28 ` Szabolcs Nagy
2013-01-28 16:33 ` Rich Felker
2013-02-02 3:48 ` Rich Felker
2013-02-02 18:46 ` Anthony G. Basile
2013-02-02 18:45 Anthony G. Basile
2013-02-02 19:51 ` John Spencer
2013-02-02 19:59 ` John Spencer
2013-02-02 22:11 ` Szabolcs Nagy
2013-02-02 20:14 ` Szabolcs Nagy
2013-02-02 20:38 ` Anthony G. Basile
2013-02-02 22:22 ` Szabolcs Nagy
2013-02-02 21:15 Anthony G. Basile
2013-02-02 21:17 ` Anthony G. Basile
2013-02-03 3:30 ` Rich Felker
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1359340564-2128-1-git-send-email-basile@opensource.dyc.edu \
--to=basile@opensource.dyc.edu \
--cc=blueness@gentoo.org \
--cc=musl@lists.openwall.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
Code repositories for project(s) associated with this public inbox
https://git.vuxu.org/mirror/musl/
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).