]> git.neil.brown.name Git - history.git/commitdiff
Added some code to arch/um/kernel/tempfile.c.
authorJeff Dike <jdike@uml.karaya.com>
Mon, 14 Oct 2002 07:33:59 +0000 (03:33 -0400)
committerJeff Dike <jdike@uml.karaya.com>
Mon, 14 Oct 2002 07:33:59 +0000 (03:33 -0400)
arch/um/kernel/tempfile.c

index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..0869e1a85ec93f79530d4797f1d71130434a4265 100644 (file)
@@ -0,0 +1,79 @@
+/*
+ * Copyright (C) 2002 Jeff Dike (jdike@karaya.com)
+ * Licensed under the GPL
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <string.h>
+#include <errno.h>
+#include <sys/param.h>
+#include "init.h"
+
+char *tempdir = NULL;
+
+static void __init find_tempdir(void)
+{
+       char *dirs[] = { "TMP", "TEMP", "TMPDIR", NULL };
+       int i;
+       char *dir = NULL;
+
+       if(tempdir != NULL) return;     /* We've already been called */
+       for(i = 0; dirs[i]; i++){
+               dir = getenv(dirs[i]);
+               if(dir != NULL) break;
+       }
+       if(dir == NULL) dir = "/tmp";
+       else if(*dir == '\0') dir = NULL;
+       if(dir != NULL) {
+               tempdir = malloc(strlen(dir) + 2);
+               if(tempdir == NULL){
+                       fprintf(stderr, "Failed to malloc tempdir, "
+                               "errno = %d\n", errno);
+                       return;
+               }
+               strcpy(tempdir, dir);
+               strcat(tempdir, "/");
+       }
+}
+
+int make_tempfile(const char *template, char **out_tempname, int do_unlink)
+{
+       char tempname[MAXPATHLEN];
+       int fd;
+
+       find_tempdir();
+       if (*template != '/')
+               strcpy(tempname, tempdir);
+       else
+               *tempname = 0;
+       strcat(tempname, template);
+       if((fd = mkstemp(tempname)) < 0){
+               fprintf(stderr, "open - cannot create %s: %s\n", tempname, 
+                       strerror(errno));
+               return -1;
+       }
+       if(do_unlink && (unlink(tempname) < 0)){
+               perror("unlink");
+               return -1;
+       }
+       if(out_tempname){
+               if((*out_tempname = strdup(tempname)) == NULL){
+                       perror("strdup");
+                       return -1;
+               }
+       }
+       return(fd);
+}
+
+/*
+ * Overrides for Emacs so that we follow Linus's tabbing style.
+ * Emacs will notice this stuff at the end of the file and automatically
+ * adjust the settings for this buffer only.  This must remain at the end
+ * of the file.
+ * ---------------------------------------------------------------------------
+ * Local variables:
+ * c-file-style: "linux"
+ * End:
+ */