1*7d0a6c19SBarry Smith 2e5c89e4eSSatish Balay /* 3e5c89e4eSSatish Balay Code for opening and closing files. 4e5c89e4eSSatish Balay */ 5d382aafbSBarry Smith #include "petscsys.h" 6e5c89e4eSSatish Balay #if defined(PETSC_HAVE_PWD_H) 7e5c89e4eSSatish Balay #include <pwd.h> 8e5c89e4eSSatish Balay #endif 9e5c89e4eSSatish Balay #include <ctype.h> 10e5c89e4eSSatish Balay #include <sys/types.h> 11e5c89e4eSSatish Balay #include <sys/stat.h> 12e5c89e4eSSatish Balay #if defined(PETSC_HAVE_UNISTD_H) 13e5c89e4eSSatish Balay #include <unistd.h> 14e5c89e4eSSatish Balay #endif 15e5c89e4eSSatish Balay #if defined(PETSC_HAVE_STDLIB_H) 16e5c89e4eSSatish Balay #include <stdlib.h> 17e5c89e4eSSatish Balay #endif 18e5c89e4eSSatish Balay #if defined(PETSC_HAVE_SYS_UTSNAME_H) 19e5c89e4eSSatish Balay #include <sys/utsname.h> 20e5c89e4eSSatish Balay #endif 21e5c89e4eSSatish Balay #include <fcntl.h> 22e5c89e4eSSatish Balay #if defined(PETSC_HAVE_SYS_SYSTEMINFO_H) 23e5c89e4eSSatish Balay #include <sys/systeminfo.h> 24e5c89e4eSSatish Balay #endif 25e5c89e4eSSatish Balay 26e5c89e4eSSatish Balay #if defined(PETSC_HAVE_PWD_H) 27e5c89e4eSSatish Balay 28e5c89e4eSSatish Balay #undef __FUNCT__ 29e5c89e4eSSatish Balay #define __FUNCT__ "PetscGetFullPath" 30e5c89e4eSSatish Balay /*@C 31e5c89e4eSSatish Balay PetscGetFullPath - Given a filename, returns the fully qualified file name. 32e5c89e4eSSatish Balay 33e5c89e4eSSatish Balay Not Collective 34e5c89e4eSSatish Balay 35e5c89e4eSSatish Balay Input Parameters: 36e5c89e4eSSatish Balay + path - pathname to qualify 37e5c89e4eSSatish Balay . fullpath - pointer to buffer to hold full pathname 38e5c89e4eSSatish Balay - flen - size of fullpath 39e5c89e4eSSatish Balay 40e5c89e4eSSatish Balay Level: developer 41e5c89e4eSSatish Balay 42e5c89e4eSSatish Balay Concepts: full path 43e5c89e4eSSatish Balay Concepts: path^full 44e5c89e4eSSatish Balay 45e5c89e4eSSatish Balay .seealso: PetscGetRelativePath() 46e5c89e4eSSatish Balay @*/ 477087cfbeSBarry Smith PetscErrorCode PetscGetFullPath(const char path[],char fullpath[],size_t flen) 48e5c89e4eSSatish Balay { 49e5c89e4eSSatish Balay struct passwd *pwde; 50e5c89e4eSSatish Balay PetscErrorCode ierr; 51e5c89e4eSSatish Balay size_t ln; 52ace3abfcSBarry Smith PetscBool flg; 53e5c89e4eSSatish Balay 54e5c89e4eSSatish Balay PetscFunctionBegin; 55e5c89e4eSSatish Balay if (path[0] == '/') { 56e5c89e4eSSatish Balay ierr = PetscStrncmp("/tmp_mnt/",path,9,&flg);CHKERRQ(ierr); 57e5c89e4eSSatish Balay if (flg) {ierr = PetscStrncpy(fullpath,path + 8,flen);CHKERRQ(ierr);} 58e5c89e4eSSatish Balay else {ierr = PetscStrncpy(fullpath,path,flen);CHKERRQ(ierr);} 59e5c89e4eSSatish Balay PetscFunctionReturn(0); 60e5c89e4eSSatish Balay } 61e5c89e4eSSatish Balay ierr = PetscGetWorkingDirectory(fullpath,flen);CHKERRQ(ierr); 62e5c89e4eSSatish Balay ierr = PetscStrlen(fullpath,&ln);CHKERRQ(ierr); 63e5c89e4eSSatish Balay ierr = PetscStrncat(fullpath,"/",flen - ln);CHKERRQ(ierr); 64e5c89e4eSSatish Balay if (path[0] == '.' && path[1] == '/') { 65e5c89e4eSSatish Balay ierr = PetscStrlen(fullpath,&ln);CHKERRQ(ierr); 66e5c89e4eSSatish Balay ierr = PetscStrncat(fullpath,path+2,flen - ln - 1);CHKERRQ(ierr); 67e5c89e4eSSatish Balay } else { 68e5c89e4eSSatish Balay ierr = PetscStrlen(fullpath,&ln);CHKERRQ(ierr); 69e5c89e4eSSatish Balay ierr = PetscStrncat(fullpath,path,flen - ln - 1);CHKERRQ(ierr); 70e5c89e4eSSatish Balay } 71e5c89e4eSSatish Balay 72e5c89e4eSSatish Balay /* Remove the various "special" forms (~username/ and ~/) */ 73e5c89e4eSSatish Balay if (fullpath[0] == '~') { 74e5c89e4eSSatish Balay char tmppath[PETSC_MAX_PATH_LEN]; 75e5c89e4eSSatish Balay if (fullpath[1] == '/') { 76e5c89e4eSSatish Balay #if defined(PETSC_HAVE_GETPWUID) 77e5c89e4eSSatish Balay pwde = getpwuid(geteuid()); 78e5c89e4eSSatish Balay if (!pwde) PetscFunctionReturn(0); 79e5c89e4eSSatish Balay ierr = PetscStrcpy(tmppath,pwde->pw_dir);CHKERRQ(ierr); 80e5c89e4eSSatish Balay ierr = PetscStrlen(tmppath,&ln);CHKERRQ(ierr); 81e5c89e4eSSatish Balay if (tmppath[ln-1] != '/') {ierr = PetscStrcat(tmppath+ln-1,"/");CHKERRQ(ierr);} 82e5c89e4eSSatish Balay ierr = PetscStrcat(tmppath,fullpath + 2);CHKERRQ(ierr); 83e5c89e4eSSatish Balay ierr = PetscStrncpy(fullpath,tmppath,flen);CHKERRQ(ierr); 84e5c89e4eSSatish Balay #else 85e5c89e4eSSatish Balay PetscFunctionReturn(0); 86e5c89e4eSSatish Balay #endif 87e5c89e4eSSatish Balay } else { 88e5c89e4eSSatish Balay char *p,*name; 89e5c89e4eSSatish Balay 90e5c89e4eSSatish Balay /* Find username */ 91e5c89e4eSSatish Balay name = fullpath + 1; 92e5c89e4eSSatish Balay p = name; 93e5c89e4eSSatish Balay while (*p && *p != '/') p++; 94e5c89e4eSSatish Balay *p = 0; p++; 95e5c89e4eSSatish Balay pwde = getpwnam(name); 96e5c89e4eSSatish Balay if (!pwde) PetscFunctionReturn(0); 97e5c89e4eSSatish Balay 98e5c89e4eSSatish Balay ierr = PetscStrcpy(tmppath,pwde->pw_dir);CHKERRQ(ierr); 99e5c89e4eSSatish Balay ierr = PetscStrlen(tmppath,&ln);CHKERRQ(ierr); 100e5c89e4eSSatish Balay if (tmppath[ln-1] != '/') {ierr = PetscStrcat(tmppath+ln-1,"/");CHKERRQ(ierr);} 101e5c89e4eSSatish Balay ierr = PetscStrcat(tmppath,p);CHKERRQ(ierr); 102e5c89e4eSSatish Balay ierr = PetscStrncpy(fullpath,tmppath,flen);CHKERRQ(ierr); 103e5c89e4eSSatish Balay } 104e5c89e4eSSatish Balay } 105e5c89e4eSSatish Balay /* Remove the automounter part of the path */ 106e5c89e4eSSatish Balay ierr = PetscStrncmp(fullpath,"/tmp_mnt/",9,&flg);CHKERRQ(ierr); 107e5c89e4eSSatish Balay if (flg) { 108e5c89e4eSSatish Balay char tmppath[PETSC_MAX_PATH_LEN]; 109e5c89e4eSSatish Balay ierr = PetscStrcpy(tmppath,fullpath + 8);CHKERRQ(ierr); 110e5c89e4eSSatish Balay ierr = PetscStrcpy(fullpath,tmppath);CHKERRQ(ierr); 111e5c89e4eSSatish Balay } 112e5c89e4eSSatish Balay /* We could try to handle things like the removal of .. etc */ 113e5c89e4eSSatish Balay PetscFunctionReturn(0); 114e5c89e4eSSatish Balay } 115e5c89e4eSSatish Balay #elif defined(PETSC_HAVE__FULLPATH) 116e5c89e4eSSatish Balay #undef __FUNCT__ 117e5c89e4eSSatish Balay #define __FUNCT__ "PetscGetFullPath" 1187087cfbeSBarry Smith PetscErrorCode PetscGetFullPath(const char path[],char fullpath[],size_t flen) 119e5c89e4eSSatish Balay { 120e5c89e4eSSatish Balay PetscFunctionBegin; 121e5c89e4eSSatish Balay _fullpath(fullpath,path,flen); 122e5c89e4eSSatish Balay PetscFunctionReturn(0); 123e5c89e4eSSatish Balay } 124e5c89e4eSSatish Balay #else 125e5c89e4eSSatish Balay #undef __FUNCT__ 126e5c89e4eSSatish Balay #define __FUNCT__ "PetscGetFullPath" 1277087cfbeSBarry Smith PetscErrorCode PetscGetFullPath(const char path[],char fullpath[],size_t flen) 128e5c89e4eSSatish Balay { 129e5c89e4eSSatish Balay PetscErrorCode ierr; 130e5c89e4eSSatish Balay 131e5c89e4eSSatish Balay PetscFunctionBegin; 132e5c89e4eSSatish Balay ierr = PetscStrcpy(fullpath,path);CHKERRQ(ierr); 133e5c89e4eSSatish Balay PetscFunctionReturn(0); 134e5c89e4eSSatish Balay } 135e5c89e4eSSatish Balay #endif 136