github.com/xushiwei/go@v0.0.0-20130601165731-2b9d83f45bc9/src/lib9/tempdir_plan9.c (about) 1 // Copyright 2013 The Go Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style 3 // license that can be found in the LICENSE file. 4 5 #include <u.h> 6 #include <libc.h> 7 8 char* 9 mktempdir(void) 10 { 11 char *p; 12 int fd, i; 13 14 p = smprint("/tmp/go-link-XXXXXX"); 15 for(i=0; i<1000; i++) { 16 sprint(p, "/tmp/go-link-%06x", nrand((1<<24)-1)); 17 fd = create(p, OREAD|OEXCL, 0700|DMDIR); 18 if(fd >= 0) { 19 close(fd); 20 return p; 21 } 22 } 23 free(p); 24 return nil; 25 } 26 27 void 28 removeall(char *p) 29 { 30 int fd, n, i; 31 Dir *d; 32 char *q; 33 34 if(remove(p) >= 0) 35 return; 36 if((d = dirstat(p)) == nil) 37 return; 38 if(!(d->mode & DMDIR)) { 39 free(d); 40 return; 41 } 42 free(d); 43 44 if((fd = open(p, OREAD)) < 0) 45 return; 46 n = dirreadall(fd, &d); 47 close(fd); 48 for(i=0; i<n; i++) { 49 q = smprint("%s/%s", p, d[i].name); 50 removeall(q); 51 free(q); 52 } 53 free(d); 54 }