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 14 PetscErrorCode PetscPathJoin(const char dname[],const char fname[],size_t n,char fullname[]) 15 { 16 PetscErrorCode ierr; 17 size_t l1,l2; 18 PetscFunctionBegin; 19 ierr = PetscStrlen(dname,&l1);CHKERRQ(ierr); 20 ierr = PetscStrlen(fname,&l2);CHKERRQ(ierr); 21 if ((l1+l2+2)>n) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_SIZ,"Path length is greater than buffer size"); 22 ierr = PetscStrncpy(fullname,dname,n);CHKERRQ(ierr); 23 ierr = PetscStrlcat(fullname,"/",n);CHKERRQ(ierr); 24 ierr = PetscStrlcat(fullname,fname,n);CHKERRQ(ierr); 25 PetscFunctionReturn(0); 26 } 27 28 PetscErrorCode PetscMkdir(const char dir[]) 29 { 30 int err; 31 PetscErrorCode ierr; 32 PetscBool flg; 33 34 PetscFunctionBegin; 35 ierr = PetscTestDirectory(dir,'w',&flg);CHKERRQ(ierr); 36 if (flg) PetscFunctionReturn(0); 37 #if defined(PETSC_HAVE__MKDIR) && defined(PETSC_HAVE_DIRECT_H) 38 err = _mkdir(dir); 39 #else 40 err = mkdir(dir,S_IRWXU|S_IRGRP|S_IXGRP); 41 #endif 42 if(err) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_FILE_UNEXPECTED,"Could not create dir: %s",dir); 43 PetscFunctionReturn(0); 44 } 45 46 #if defined(PETSC_HAVE_DIRECT_H) 47 PetscErrorCode PetscRMTree(const char dir[]) 48 { 49 PetscErrorCode ierr; 50 struct _finddata_t data; 51 char loc[PETSC_MAX_PATH_LEN]; 52 PetscBool flg1, flg2; 53 #if defined (PETSC_HAVE_STDINT_H) 54 intptr_t handle; 55 #else 56 long handle; 57 #endif 58 59 PetscFunctionBegin; 60 ierr = PetscPathJoin(dir,"*",PETSC_MAX_PATH_LEN,loc);CHKERRQ(ierr); 61 handle = _findfirst(loc, &data); 62 if (handle == -1) { 63 PetscBool flg; 64 ierr = PetscTestDirectory(loc,'r',&flg);CHKERRQ(ierr); 65 if (flg) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_FILE_UNEXPECTED,"Cannot access directory to delete: %s",dir); 66 ierr = PetscTestFile(loc,'r',&flg);CHKERRQ(ierr); 67 if (flg) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_FILE_UNEXPECTED,"Specified path is a file - not a dir: %s",dir); 68 PetscFunctionReturn(0); /* perhaps the dir was not yet created */ 69 } 70 while (_findnext(handle, &data) != -1) { 71 ierr = PetscStrcmp(data.name, ".",&flg1);CHKERRQ(ierr); 72 ierr = PetscStrcmp(data.name, "..",&flg2);CHKERRQ(ierr); 73 if (flg1 || flg2) continue; 74 ierr = PetscPathJoin(dir,data.name,PETSC_MAX_PATH_LEN,loc);CHKERRQ(ierr); 75 if (data.attrib & _A_SUBDIR) { 76 ierr = PetscRMTree(loc);CHKERRQ(ierr); 77 } else{ 78 if (remove(loc)) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_FILE_UNEXPECTED,"Could not delete file: %s",loc); 79 } 80 } 81 _findclose(handle); 82 if (_rmdir(dir)) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_FILE_UNEXPECTED,"Could not delete dir: %s",dir); 83 PetscFunctionReturn(0); 84 } 85 #else 86 #include <dirent.h> 87 #include <unistd.h> 88 PetscErrorCode PetscRMTree(const char dir[]) 89 { 90 PetscErrorCode ierr; 91 struct dirent *data; 92 char loc[PETSC_MAX_PATH_LEN]; 93 PetscBool flg1, flg2; 94 DIR *dirp; 95 struct stat statbuf; 96 97 PetscFunctionBegin; 98 dirp = opendir(dir); 99 if(!dirp) { 100 PetscBool flg; 101 ierr = PetscTestDirectory(dir,'r',&flg);CHKERRQ(ierr); 102 if (flg) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_FILE_UNEXPECTED,"Cannot access directory to delete: %s",dir); 103 ierr = PetscTestFile(dir,'r',&flg);CHKERRQ(ierr); 104 if (flg) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_FILE_UNEXPECTED,"Specified path is a file - not a dir: %s",dir); 105 PetscFunctionReturn(0); /* perhaps the dir was not yet created */ 106 } 107 while((data = readdir(dirp))) { 108 ierr = PetscStrcmp(data->d_name, ".",&flg1);CHKERRQ(ierr); 109 ierr = PetscStrcmp(data->d_name, "..",&flg2);CHKERRQ(ierr); 110 if (flg1 || flg2) continue; 111 ierr = PetscPathJoin(dir,data->d_name,PETSC_MAX_PATH_LEN,loc);CHKERRQ(ierr); 112 if (lstat(loc,&statbuf) <0) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_FILE_UNEXPECTED,"cannot run lstat() on: %s",loc); 113 if (S_ISDIR(statbuf.st_mode)) { 114 ierr = PetscRMTree(loc);CHKERRQ(ierr); 115 } else { 116 if (unlink(loc)) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_FILE_UNEXPECTED,"Could not delete file: %s",loc); 117 } 118 } 119 closedir(dirp); 120 if (rmdir(dir)) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_FILE_UNEXPECTED,"Could not delete dir: %s",dir); 121 PetscFunctionReturn(0); 122 } 123 #endif 124