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