83 строки
1.8 KiB
C
83 строки
1.8 KiB
C
/*
|
|
* 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"
|
|
|
|
/* Modified from create_mem_file and start_debugger */
|
|
static 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) && (*dir != '\0'))
|
|
break;
|
|
}
|
|
if((dir == NULL) || (*dir == '\0'))
|
|
dir = "/tmp";
|
|
|
|
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);
|
|
fd = mkstemp(tempname);
|
|
if(fd < 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){
|
|
*out_tempname = strdup(tempname);
|
|
if(*out_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:
|
|
*/
|