Actual source code: fdir.c
1: #define PETSC_DESIRE_FEATURE_TEST_MACROS /* for lstat() */
2: #include <petscsys.h>
3: #include <sys/stat.h>
4: #if defined(PETSC_HAVE_DIRECT_H)
5: #include <direct.h>
6: #endif
7: #if defined(PETSC_HAVE_IO_H)
8: #include <io.h>
9: #endif
10: #if defined(PETSC_HAVE_STDINT_H)
11: #include <stdint.h>
12: #endif
13: #if defined(PETSC_HAVE_UNISTD_H) /* for mkdtemp */
14: #include <unistd.h>
15: #endif
17: PetscErrorCode PetscPathJoin(const char dname[], const char fname[], size_t n, char fullname[])
18: {
19: size_t l1, l2;
20: PetscStrlen(dname, &l1);
21: PetscStrlen(fname, &l2);
23: PetscStrncpy(fullname, dname, n);
24: PetscStrlcat(fullname, "/", n);
25: PetscStrlcat(fullname, fname, n);
26: return 0;
27: }
29: PetscErrorCode PetscMkdir(const char dir[])
30: {
31: int err;
32: PetscBool flg;
34: PetscTestDirectory(dir, 'w', &flg);
35: if (flg) return 0;
36: #if defined(PETSC_HAVE__MKDIR) && defined(PETSC_HAVE_DIRECT_H)
37: err = _mkdir(dir);
38: #else
39: err = mkdir(dir, S_IRWXU | S_IRGRP | S_IXGRP);
40: #endif
42: return 0;
43: }
45: #if defined(PETSC_USING_DARWIN) && defined(PETSC_HAVE_FSTATAT)
46: /*
47: Apple's mkdtemp() crashes under Valgrind so this replaces it with a version that does not crash under valgrind
48: */
49: #include "apple_fdir.h"
50: #endif
52: /*@C
53: PetscMkdtemp - Create a folder with a unique name given a filename template.
55: Not Collective
57: Input Parameters:
58: . dir - file name template, the last six characters must be 'XXXXXX', and they will be modified upon return
60: Level: developer
62: .seealso: `PetscMkdir()`
63: @*/
64: PetscErrorCode PetscMkdtemp(char dir[])
65: {
66: #if defined(PETSC_HAVE_WINDOWS_H) && defined(PETSC_HAVE_IO_H) && defined(PETSC_HAVE__MKDIR) && defined(PETSC_HAVE_DIRECT_H)
67: {
68: int err = 1;
69: char name[PETSC_MAX_PATH_LEN];
70: PetscInt i = 0, max_retry = 26;
71: size_t len;
73: while (err && i < max_retry) {
74: PetscStrncpy(name, dir, sizeof(name));
75: PetscStrlen(name, &len);
76: err = _mktemp_s(name, len + 1);
78: err = _mkdir(name);
79: i++;
80: }
82: PetscStrncpy(dir, name, len + 1);
83: }
84: #else
85: dir = mkdtemp(dir);
87: #endif
88: return 0;
89: }
91: #if defined(PETSC_HAVE_DIRECT_H)
92: PetscErrorCode PetscRMTree(const char dir[])
93: {
94: struct _finddata_t data;
95: char loc[PETSC_MAX_PATH_LEN];
96: PetscBool flg1, flg2;
97: #if defined(PETSC_HAVE_STDINT_H)
98: intptr_t handle;
99: #else
100: long handle;
101: #endif
103: PetscPathJoin(dir, "*", PETSC_MAX_PATH_LEN, loc);
104: handle = _findfirst(loc, &data);
105: if (handle == -1) {
106: PetscBool flg;
107: PetscTestDirectory(loc, 'r', &flg);
109: PetscTestFile(loc, 'r', &flg);
111: return 0; /* perhaps the dir was not yet created */
112: }
113: while (_findnext(handle, &data) != -1) {
114: PetscStrcmp(data.name, ".", &flg1);
115: PetscStrcmp(data.name, "..", &flg2);
116: if (flg1 || flg2) continue;
117: PetscPathJoin(dir, data.name, PETSC_MAX_PATH_LEN, loc);
118: if (data.attrib & _A_SUBDIR) {
119: PetscRMTree(loc);
120: } else {
122: }
123: }
124: _findclose(handle);
126: return 0;
127: }
128: #else
129: #include <dirent.h>
130: #include <unistd.h>
131: PetscErrorCode PetscRMTree(const char dir[])
132: {
133: struct dirent *data;
134: char loc[PETSC_MAX_PATH_LEN];
135: PetscBool flg1, flg2;
136: DIR *dirp;
137: struct stat statbuf;
139: dirp = opendir(dir);
140: if (!dirp) {
141: PetscBool flg;
142: PetscTestDirectory(dir, 'r', &flg);
144: PetscTestFile(dir, 'r', &flg);
146: return 0; /* perhaps the dir was not yet created */
147: }
148: while ((data = readdir(dirp))) {
149: PetscStrcmp(data->d_name, ".", &flg1);
150: PetscStrcmp(data->d_name, "..", &flg2);
151: if (flg1 || flg2) continue;
152: PetscPathJoin(dir, data->d_name, PETSC_MAX_PATH_LEN, loc);
154: if (S_ISDIR(statbuf.st_mode)) {
155: PetscRMTree(loc);
156: } else {
158: }
159: }
160: closedir(dirp);
162: return 0;
163: }
164: #endif