diff options
Diffstat (limited to 'src/lib9/tempdir_plan9.c')
| -rw-r--r-- | src/lib9/tempdir_plan9.c | 54 | 
1 files changed, 54 insertions, 0 deletions
| diff --git a/src/lib9/tempdir_plan9.c b/src/lib9/tempdir_plan9.c new file mode 100644 index 000000000..092d00d16 --- /dev/null +++ b/src/lib9/tempdir_plan9.c @@ -0,0 +1,54 @@ +// Copyright 2013 The Go Authors.  All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +#include <u.h> +#include <libc.h> + +char* +mktempdir(void) +{ +	char *p; +	int fd, i; +	 +	p = smprint("/tmp/go-link-XXXXXX"); +	for(i=0; i<1000; i++) { +		sprint(p, "/tmp/go-link-%06x", nrand((1<<24)-1)); +		fd = create(p, OREAD|OEXCL, 0700|DMDIR); +		if(fd >= 0) { +			close(fd); +			return p; +		} +	} +	free(p); +	return nil; +} + +void +removeall(char *p) +{ +	int fd, n, i; +	Dir *d; +	char *q; +	 +	if(remove(p) >= 0) +		return; +	if((d = dirstat(p)) == nil) +		return; +	if(!(d->mode & DMDIR)) { +		free(d); +		return; +	} +	free(d); +	 +	if((fd = open(p, OREAD)) < 0) +		return; +	n = dirreadall(fd, &d); +	close(fd); +	for(i=0; i<n; i++) { +		q = smprint("%s/%s", p, d[i].name); +		removeall(q); +		free(q); +	} +	free(d); +} | 
