plan9port

fork of plan9port with libvec, libstr and libsdb
Log | Files | Refs | README | LICENSE

tempnam.c (973B)


      1 #include <stdio.h>
      2 #include <stdlib.h>
      3 #include <string.h>
      4 #include <unistd.h>
      5 
      6 #define nil ((void*)0)
      7 
      8 char*
      9 mkfname(char *tmpdir, char *prefix)
     10 {
     11 	int n;
     12 	char *p, *fname;
     13 
     14 	if((p = getenv("TMPDIR")) != nil)
     15 		goto Mktemp;
     16 	if((p = tmpdir) != nil)
     17 		goto Mktemp;
     18 	p = "/tmp";
     19 
     20  Mktemp:
     21 	n = strlen(p)+1+strlen(prefix)+1+8+1;
     22 	if((fname = malloc(n)) == nil)
     23 		return nil;
     24 	memset(fname, 0, n);
     25 	strcat(fname, p);
     26 	if((n = strlen(p)) > 0 && p[n-1] != '/')
     27 		strcat(fname, "/");
     28 	strcat(fname, prefix);
     29 	strcat(fname, ".XXXXXXXX");
     30 
     31 	return fname;
     32 }
     33 
     34 extern	int	mkstemp(char*);
     35 
     36 char*
     37 safe_tempnam(char *tmpdir, char *prefix)
     38 {
     39 	int fd;
     40 	char *fname;
     41 
     42 	if((fname = mkfname(tmpdir, prefix)) == nil)
     43 		return nil;
     44 
     45 	if((fd = mkstemp(fname)) < 0){		/* XXX: leak fd, fname */
     46 		free(fname);
     47 		return nil;
     48 	}
     49 	return fname;
     50 }
     51 
     52 int
     53 safe_tmpnam(char *fname)
     54 {
     55 	char *p;
     56 
     57 	if((p = mkfname(nil, "tmpfile")) == nil)
     58 		return -1;
     59 	strcpy(fname, p);
     60 	free(p);
     61 	return mkstemp(fname);
     62 }