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