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