1 2 #include <petscsys.h> 3 #if defined(PETSC_HAVE_PWD_H) 4 #include <pwd.h> 5 #endif 6 7 /*@C 8 PetscGetFullPath - Given a filename, returns the fully qualified file name. 9 10 Not Collective 11 12 Input Parameters: 13 + path - pathname to qualify 14 . fullpath - pointer to buffer to hold full pathname 15 - flen - size of fullpath 16 17 Level: developer 18 19 20 .seealso: PetscGetRelativePath() 21 @*/ 22 PetscErrorCode PetscGetFullPath(const char path[],char fullpath[],size_t flen) 23 { 24 PetscErrorCode ierr; 25 size_t ln; 26 PetscBool flg; 27 28 PetscFunctionBegin; 29 if (path[0] == '/') { 30 ierr = PetscStrncmp("/tmp_mnt/",path,9,&flg);CHKERRQ(ierr); 31 if (flg) {ierr = PetscStrncpy(fullpath,path + 8,flen);CHKERRQ(ierr);} 32 else {ierr = PetscStrncpy(fullpath,path,flen);CHKERRQ(ierr);} 33 fullpath[flen-1] = 0; 34 PetscFunctionReturn(0); 35 } 36 37 ierr = PetscStrncpy(fullpath,path,flen);CHKERRQ(ierr); 38 fullpath[flen-1] = 0; 39 /* Remove the various "special" forms (~username/ and ~/) */ 40 if (fullpath[0] == '~') { 41 char tmppath[PETSC_MAX_PATH_LEN],*rest; 42 if (fullpath[1] == '/') { 43 ierr = PetscGetHomeDirectory(tmppath,PETSC_MAX_PATH_LEN);CHKERRQ(ierr); 44 rest = fullpath + 2; 45 } else { 46 #if defined(PETSC_HAVE_PWD_H) 47 struct passwd *pwde; 48 char *p,*name; 49 50 /* Find username */ 51 name = fullpath + 1; 52 p = name; 53 while (*p && *p != '/') p++; 54 *p = 0; 55 rest = p + 1; 56 pwde = getpwnam(name); 57 if (!pwde) PetscFunctionReturn(0); 58 59 ierr = PetscStrcpy(tmppath,pwde->pw_dir);CHKERRQ(ierr); 60 #else 61 PetscFunctionReturn(0); 62 #endif 63 } 64 ierr = PetscStrlen(tmppath,&ln);CHKERRQ(ierr); 65 if (tmppath[ln-1] != '/') {ierr = PetscStrcat(tmppath+ln-1,"/");CHKERRQ(ierr);} 66 ierr = PetscStrcat(tmppath,rest);CHKERRQ(ierr); 67 ierr = PetscStrncpy(fullpath,tmppath,flen);CHKERRQ(ierr); 68 fullpath[flen-1] = 0; 69 } else { 70 ierr = PetscGetWorkingDirectory(fullpath,flen);CHKERRQ(ierr); 71 ierr = PetscStrlen(fullpath,&ln);CHKERRQ(ierr); 72 ierr = PetscStrncpy(fullpath+ln,"/",flen - ln);CHKERRQ(ierr); 73 fullpath[flen-1] = 0; 74 ierr = PetscStrlen(fullpath,&ln);CHKERRQ(ierr); 75 if (path[0] == '.' && path[1] == '/') { 76 ierr = PetscStrlcat(fullpath,path+2,flen);CHKERRQ(ierr); 77 } else { 78 ierr = PetscStrlcat(fullpath,path,flen);CHKERRQ(ierr); 79 } 80 fullpath[flen-1] = 0; 81 } 82 83 /* Remove the automounter part of the path */ 84 ierr = PetscStrncmp(fullpath,"/tmp_mnt/",9,&flg);CHKERRQ(ierr); 85 if (flg) { 86 char tmppath[PETSC_MAX_PATH_LEN]; 87 ierr = PetscStrcpy(tmppath,fullpath + 8);CHKERRQ(ierr); 88 ierr = PetscStrcpy(fullpath,tmppath);CHKERRQ(ierr); 89 } 90 /* We could try to handle things like the removal of .. etc */ 91 PetscFunctionReturn(0); 92 } 93