#include <unistd.h>
#include <errno.h>
#include <limits.h>
+#include <fcntl.h>
+
#ifndef LISP_FEATURE_WIN32
#include <pwd.h>
#include <sys/wait.h>
#if defined(LISP_FEATURE_WIN32)
#define WIN32_LEAN_AND_MEAN
-#include <fcntl.h>
#include <errno.h>
#endif
return ret;
}
\f
-/* A wrapper for mkstemp(3), which seems not to exist on Windows. */
-int sb_mkstemp (char *template) {
+/* A wrapper for mkstemp(3), for two reasons: (1) mkstemp does not
+ exist on Windows; (2) by passing down a mode_t, we don't need a
+ binding to chmod in SB-UNIX, and need not concern ourselves with
+ umask issues if we want to use mkstemp to make new files in
+ OPEN. */
+int sb_mkstemp (char *template, mode_t mode) {
#ifdef LISP_FEATURE_WIN32
+#define PATHNAME_BUFFER_SIZE MAX_PATH
+#define MKTEMP _mktemp
+#else
+#define PATHNAME_BUFFER_SIZE PATH_MAX
+#define MKTEMP mktemp
+#endif
int fd;
- char buf[MAX_PATH];
+ char buf[PATHNAME_BUFFER_SIZE];
while (1) {
- strcpy((char*)&buf, template);
- if (_mktemp((char*)&buf)) {
- if ((fd=open((char*)&buf, O_CREAT|O_EXCL|O_RDWR, S_IRUSR|S_IWUSR))!=-1) {
- strcpy(template, (char*)&buf);
+ /* Fruit fallen from the tree: for people who like
+ microoptimizations, we might not need to copy the whole
+ template on every loop, but only the last several characters.
+ But I didn't feel like testing the boundary cases in Windows's
+ _mktemp. */
+ strncpy(buf, template, PATHNAME_BUFFER_SIZE);
+ buf[PATHNAME_BUFFER_SIZE-1]=0; /* force NULL-termination */
+ if (MKTEMP(buf)) {
+ if ((fd=open(buf, O_CREAT|O_EXCL|O_RDWR, mode))!=-1) {
+ strcpy(template, buf);
return (fd);
} else
if (errno != EEXIST)
} else
return (-1);
}
-#else
- return(mkstemp(template));
-#endif
+#undef MKTEMP
+#undef PATHNAME_BUFFER_SIZE
}
\f
} else {
char *result = malloc(len + 2);
if (result) {
- int nchars = sprintf(result,"%s/",p->pw_dir);
+ unsigned int nchars = sprintf(result,"%s/",p->pw_dir);
if (nchars == len + 1) {
return result;
} else {