ttempnam.c - plan9port - [fork] Plan 9 from user space
 (HTM) git clone git://src.adamsgaard.dk/plan9port
 (DIR) Log
 (DIR) Files
 (DIR) Refs
 (DIR) README
 (DIR) LICENSE
       ---
       ttempnam.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 }