17d0a6c19SBarry Smith 2c6db04a5SJed Brown #include <petscsys.h> 3e5c89e4eSSatish Balay #if defined(PETSC_HAVE_PWD_H) 4e5c89e4eSSatish Balay #include <pwd.h> 5e5c89e4eSSatish Balay #endif 6e5c89e4eSSatish Balay 7e5c89e4eSSatish Balay /*@C 8e5c89e4eSSatish Balay PetscGetFullPath - Given a filename, returns the fully qualified file name. 9e5c89e4eSSatish Balay 10e5c89e4eSSatish Balay Not Collective 11e5c89e4eSSatish Balay 12e5c89e4eSSatish Balay Input Parameters: 13e5c89e4eSSatish Balay + path - pathname to qualify 14e5c89e4eSSatish Balay . fullpath - pointer to buffer to hold full pathname 15e5c89e4eSSatish Balay - flen - size of fullpath 16e5c89e4eSSatish Balay 17e5c89e4eSSatish Balay Level: developer 18e5c89e4eSSatish Balay 19e5c89e4eSSatish Balay .seealso: PetscGetRelativePath() 20e5c89e4eSSatish Balay @*/ 217087cfbeSBarry Smith PetscErrorCode PetscGetFullPath(const char path[],char fullpath[],size_t flen) 22e5c89e4eSSatish Balay { 23e5c89e4eSSatish Balay size_t ln; 24ace3abfcSBarry Smith PetscBool flg; 25e5c89e4eSSatish Balay 26e5c89e4eSSatish Balay PetscFunctionBegin; 27e5c89e4eSSatish Balay if (path[0] == '/') { 28*9566063dSJacob Faibussowitsch PetscCall(PetscStrncmp("/tmp_mnt/",path,9,&flg)); 29*9566063dSJacob Faibussowitsch if (flg) PetscCall(PetscStrncpy(fullpath,path + 8,flen)); 30*9566063dSJacob Faibussowitsch else PetscCall(PetscStrncpy(fullpath,path,flen)); 316c8deb01SJed Brown fullpath[flen-1] = 0; 32e5c89e4eSSatish Balay PetscFunctionReturn(0); 33e5c89e4eSSatish Balay } 34e5c89e4eSSatish Balay 35*9566063dSJacob Faibussowitsch PetscCall(PetscStrncpy(fullpath,path,flen)); 366c8deb01SJed Brown fullpath[flen-1] = 0; 37e5c89e4eSSatish Balay /* Remove the various "special" forms (~username/ and ~/) */ 38e5c89e4eSSatish Balay if (fullpath[0] == '~') { 3945082d64SJed Brown char tmppath[PETSC_MAX_PATH_LEN],*rest; 40e5c89e4eSSatish Balay if (fullpath[1] == '/') { 41*9566063dSJacob Faibussowitsch PetscCall(PetscGetHomeDirectory(tmppath,PETSC_MAX_PATH_LEN)); 4245082d64SJed Brown rest = fullpath + 2; 43e5c89e4eSSatish Balay } else { 4445082d64SJed Brown #if defined(PETSC_HAVE_PWD_H) 4545082d64SJed Brown struct passwd *pwde; 46e5c89e4eSSatish Balay char *p,*name; 47e5c89e4eSSatish Balay 48e5c89e4eSSatish Balay /* Find username */ 49e5c89e4eSSatish Balay name = fullpath + 1; 50e5c89e4eSSatish Balay p = name; 51e5c89e4eSSatish Balay while (*p && *p != '/') p++; 5245082d64SJed Brown *p = 0; 5345082d64SJed Brown rest = p + 1; 54e5c89e4eSSatish Balay pwde = getpwnam(name); 55e5c89e4eSSatish Balay if (!pwde) PetscFunctionReturn(0); 56e5c89e4eSSatish Balay 57*9566063dSJacob Faibussowitsch PetscCall(PetscStrcpy(tmppath,pwde->pw_dir)); 5845082d64SJed Brown #else 5945082d64SJed Brown PetscFunctionReturn(0); 6045082d64SJed Brown #endif 6145082d64SJed Brown } 62*9566063dSJacob Faibussowitsch PetscCall(PetscStrlen(tmppath,&ln)); 63*9566063dSJacob Faibussowitsch if (tmppath[ln-1] != '/') PetscCall(PetscStrcat(tmppath+ln-1,"/")); 64*9566063dSJacob Faibussowitsch PetscCall(PetscStrcat(tmppath,rest)); 65*9566063dSJacob Faibussowitsch PetscCall(PetscStrncpy(fullpath,tmppath,flen)); 666c8deb01SJed Brown fullpath[flen-1] = 0; 676c8deb01SJed Brown } else { 68*9566063dSJacob Faibussowitsch PetscCall(PetscGetWorkingDirectory(fullpath,flen)); 69*9566063dSJacob Faibussowitsch PetscCall(PetscStrlen(fullpath,&ln)); 70*9566063dSJacob Faibussowitsch PetscCall(PetscStrncpy(fullpath+ln,"/",flen - ln)); 716c8deb01SJed Brown fullpath[flen-1] = 0; 72*9566063dSJacob Faibussowitsch PetscCall(PetscStrlen(fullpath,&ln)); 736c8deb01SJed Brown if (path[0] == '.' && path[1] == '/') { 74*9566063dSJacob Faibussowitsch PetscCall(PetscStrlcat(fullpath,path+2,flen)); 756c8deb01SJed Brown } else { 76*9566063dSJacob Faibussowitsch PetscCall(PetscStrlcat(fullpath,path,flen)); 77e5c89e4eSSatish Balay } 786c8deb01SJed Brown fullpath[flen-1] = 0; 796c8deb01SJed Brown } 806c8deb01SJed Brown 81e5c89e4eSSatish Balay /* Remove the automounter part of the path */ 82*9566063dSJacob Faibussowitsch PetscCall(PetscStrncmp(fullpath,"/tmp_mnt/",9,&flg)); 83e5c89e4eSSatish Balay if (flg) { 84e5c89e4eSSatish Balay char tmppath[PETSC_MAX_PATH_LEN]; 85*9566063dSJacob Faibussowitsch PetscCall(PetscStrcpy(tmppath,fullpath + 8)); 86*9566063dSJacob Faibussowitsch PetscCall(PetscStrcpy(fullpath,tmppath)); 87e5c89e4eSSatish Balay } 88e5c89e4eSSatish Balay /* We could try to handle things like the removal of .. etc */ 89e5c89e4eSSatish Balay PetscFunctionReturn(0); 90e5c89e4eSSatish Balay } 91