Linux-2.6.12-rc2
[linux-flexiantxendom0-natty.git] / arch / um / kernel / tempfile.c
1 /*
2  * Copyright (C) 2002 Jeff Dike (jdike@karaya.com)
3  * Licensed under the GPL
4  */
5
6 #include <stdio.h>
7 #include <stdlib.h>
8 #include <unistd.h>
9 #include <string.h>
10 #include <errno.h>
11 #include <sys/param.h>
12 #include "init.h"
13
14 /* Modified from create_mem_file and start_debugger */
15 static char *tempdir = NULL;
16
17 static void __init find_tempdir(void)
18 {
19         char *dirs[] = { "TMP", "TEMP", "TMPDIR", NULL };
20         int i;
21         char *dir = NULL;
22
23         if(tempdir != NULL) return;     /* We've already been called */
24         for(i = 0; dirs[i]; i++){
25                 dir = getenv(dirs[i]);
26                 if((dir != NULL) && (*dir != '\0'))
27                         break;
28         }
29         if((dir == NULL) || (*dir == '\0')) 
30                 dir = "/tmp";
31
32         tempdir = malloc(strlen(dir) + 2);
33         if(tempdir == NULL){
34                 fprintf(stderr, "Failed to malloc tempdir, "
35                         "errno = %d\n", errno);
36                 return;
37         }
38         strcpy(tempdir, dir);
39         strcat(tempdir, "/");
40 }
41
42 int make_tempfile(const char *template, char **out_tempname, int do_unlink)
43 {
44         char tempname[MAXPATHLEN];
45         int fd;
46
47         find_tempdir();
48         if (*template != '/')
49                 strcpy(tempname, tempdir);
50         else
51                 *tempname = 0;
52         strcat(tempname, template);
53         fd = mkstemp(tempname);
54         if(fd < 0){
55                 fprintf(stderr, "open - cannot create %s: %s\n", tempname, 
56                         strerror(errno));
57                 return -1;
58         }
59         if(do_unlink && (unlink(tempname) < 0)){
60                 perror("unlink");
61                 return -1;
62         }
63         if(out_tempname){
64                 *out_tempname = strdup(tempname);
65                 if(*out_tempname == NULL){
66                         perror("strdup");
67                         return -1;
68                 }
69         }
70         return(fd);
71 }
72
73 /*
74  * Overrides for Emacs so that we follow Linus's tabbing style.
75  * Emacs will notice this stuff at the end of the file and automatically
76  * adjust the settings for this buffer only.  This must remain at the end
77  * of the file.
78  * ---------------------------------------------------------------------------
79  * Local variables:
80  * c-file-style: "linux"
81  * End:
82  */