summaryrefslogtreecommitdiff
path: root/src/lib9/tempdir_unix.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/lib9/tempdir_unix.c')
-rw-r--r--src/lib9/tempdir_unix.c52
1 files changed, 52 insertions, 0 deletions
diff --git a/src/lib9/tempdir_unix.c b/src/lib9/tempdir_unix.c
new file mode 100644
index 000000000..99a7092b6
--- /dev/null
+++ b/src/lib9/tempdir_unix.c
@@ -0,0 +1,52 @@
+// 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.
+
+// +build darwin freebsd linux netbsd openbsd
+
+#include <u.h>
+#include <dirent.h>
+#include <sys/stat.h>
+#define NOPLAN9DEFINES
+#include <libc.h>
+
+char*
+mktempdir(void)
+{
+ char *tmp, *p;
+
+ tmp = getenv("TMPDIR");
+ if(tmp == nil || strlen(tmp) == 0)
+ tmp = "/var/tmp";
+ p = smprint("%s/go-link-XXXXXX", tmp);
+ if(mkdtemp(p) == nil)
+ return nil;
+ return p;
+}
+
+void
+removeall(char *p)
+{
+ DIR *d;
+ struct dirent *dp;
+ char *q;
+ struct stat st;
+
+ if(stat(p, &st) < 0)
+ return;
+ if(!S_ISDIR(st.st_mode)) {
+ unlink(p);
+ return;
+ }
+
+ d = opendir(p);
+ while((dp = readdir(d)) != nil) {
+ if(strcmp(dp->d_name, ".") == 0 || strcmp(dp->d_name, "..") == 0)
+ continue;
+ q = smprint("%s/%s", p, dp->d_name);
+ removeall(q);
+ free(q);
+ }
+ closedir(d);
+ rmdir(p);
+}