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 .seealso: PetscGetRelativePath() 20 @*/ 21 PetscErrorCode PetscGetFullPath(const char path[],char fullpath[],size_t flen) 22 { 23 PetscErrorCode ierr; 24 size_t ln; 25 PetscBool flg; 26 27 PetscFunctionBegin; 28 if (path[0] == '/') { 29 ierr = PetscStrncmp("/tmp_mnt/",path,9,&flg);CHKERRQ(ierr); 30 if (flg) {ierr = PetscStrncpy(fullpath,path + 8,flen);CHKERRQ(ierr);} 31 else {ierr = PetscStrncpy(fullpath,path,flen);CHKERRQ(ierr);} 32 fullpath[flen-1] = 0; 33 PetscFunctionReturn(0); 34 } 35 36 ierr = PetscStrncpy(fullpath,path,flen);CHKERRQ(ierr); 37 fullpath[flen-1] = 0; 38 /* Remove the various "special" forms (~username/ and ~/) */ 39 if (fullpath[0] == '~') { 40 char tmppath[PETSC_MAX_PATH_LEN],*rest; 41 if (fullpath[1] == '/') { 42 ierr = PetscGetHomeDirectory(tmppath,PETSC_MAX_PATH_LEN);CHKERRQ(ierr); 43 rest = fullpath + 2; 44 } else { 45 #if defined(PETSC_HAVE_PWD_H) 46 struct passwd *pwde; 47 char *p,*name; 48 49 /* Find username */ 50 name = fullpath + 1; 51 p = name; 52 while (*p && *p != '/') p++; 53 *p = 0; 54 rest = p + 1; 55 pwde = getpwnam(name); 56 if (!pwde) PetscFunctionReturn(0); 57 58 ierr = PetscStrcpy(tmppath,pwde->pw_dir);CHKERRQ(ierr); 59 #else 60 PetscFunctionReturn(0); 61 #endif 62 } 63 ierr = PetscStrlen(tmppath,&ln);CHKERRQ(ierr); 64 if (tmppath[ln-1] != '/') {ierr = PetscStrcat(tmppath+ln-1,"/");CHKERRQ(ierr);} 65 ierr = PetscStrcat(tmppath,rest);CHKERRQ(ierr); 66 ierr = PetscStrncpy(fullpath,tmppath,flen);CHKERRQ(ierr); 67 fullpath[flen-1] = 0; 68 } else { 69 ierr = PetscGetWorkingDirectory(fullpath,flen);CHKERRQ(ierr); 70 ierr = PetscStrlen(fullpath,&ln);CHKERRQ(ierr); 71 ierr = PetscStrncpy(fullpath+ln,"/",flen - ln);CHKERRQ(ierr); 72 fullpath[flen-1] = 0; 73 ierr = PetscStrlen(fullpath,&ln);CHKERRQ(ierr); 74 if (path[0] == '.' && path[1] == '/') { 75 ierr = PetscStrlcat(fullpath,path+2,flen);CHKERRQ(ierr); 76 } else { 77 ierr = PetscStrlcat(fullpath,path,flen);CHKERRQ(ierr); 78 } 79 fullpath[flen-1] = 0; 80 } 81 82 /* Remove the automounter part of the path */ 83 ierr = PetscStrncmp(fullpath,"/tmp_mnt/",9,&flg);CHKERRQ(ierr); 84 if (flg) { 85 char tmppath[PETSC_MAX_PATH_LEN]; 86 ierr = PetscStrcpy(tmppath,fullpath + 8);CHKERRQ(ierr); 87 ierr = PetscStrcpy(fullpath,tmppath);CHKERRQ(ierr); 88 } 89 /* We could try to handle things like the removal of .. etc */ 90 PetscFunctionReturn(0); 91 } 92