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