+/* 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[PATHNAME_BUFFER_SIZE];
+
+ while (1) {
+ /* 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)
+ return (-1);
+ } else
+ return (-1);
+ }
+#undef MKTEMP
+#undef PATHNAME_BUFFER_SIZE
+}
+
+\f