Actual source code: fpath.c
petsc-3.4.2 2013-07-02
2: /*
3: Code for opening and closing files.
4: */
5: #include <petscsys.h>
6: #if defined(PETSC_HAVE_PWD_H)
7: #include <pwd.h>
8: #endif
9: #include <ctype.h>
10: #include <sys/stat.h>
11: #if defined(PETSC_HAVE_UNISTD_H)
12: #include <unistd.h>
13: #endif
14: #if defined(PETSC_HAVE_SYS_UTSNAME_H)
15: #include <sys/utsname.h>
16: #endif
17: #include <fcntl.h>
18: #if defined(PETSC_HAVE_SYS_SYSTEMINFO_H)
19: #include <sys/systeminfo.h>
20: #endif
22: #if defined(PETSC_HAVE_PWD_H)
26: /*@C
27: PetscGetFullPath - Given a filename, returns the fully qualified file name.
29: Not Collective
31: Input Parameters:
32: + path - pathname to qualify
33: . fullpath - pointer to buffer to hold full pathname
34: - flen - size of fullpath
36: Level: developer
38: Concepts: full path
39: Concepts: path^full
41: .seealso: PetscGetRelativePath()
42: @*/
43: PetscErrorCode PetscGetFullPath(const char path[],char fullpath[],size_t flen)
44: {
45: struct passwd *pwde;
47: size_t ln;
48: PetscBool flg;
51: if (path[0] == '/') {
52: PetscStrncmp("/tmp_mnt/",path,9,&flg);
53: if (flg) {PetscStrncpy(fullpath,path + 8,flen);}
54: else {PetscStrncpy(fullpath,path,flen);}
55: return(0);
56: }
57: PetscGetWorkingDirectory(fullpath,flen);
58: PetscStrlen(fullpath,&ln);
59: PetscStrncat(fullpath,"/",flen - ln);
60: if (path[0] == '.' && path[1] == '/') {
61: PetscStrlen(fullpath,&ln);
62: PetscStrncat(fullpath,path+2,flen - ln - 1);
63: } else {
64: PetscStrlen(fullpath,&ln);
65: PetscStrncat(fullpath,path,flen - ln - 1);
66: }
68: /* Remove the various "special" forms (~username/ and ~/) */
69: if (fullpath[0] == '~') {
70: char tmppath[PETSC_MAX_PATH_LEN];
71: if (fullpath[1] == '/') {
72: #if defined(PETSC_HAVE_GETPWUID)
73: pwde = getpwuid(geteuid());
74: if (!pwde) return(0);
75: PetscStrcpy(tmppath,pwde->pw_dir);
76: PetscStrlen(tmppath,&ln);
77: if (tmppath[ln-1] != '/') {PetscStrcat(tmppath+ln-1,"/");}
78: PetscStrcat(tmppath,fullpath + 2);
79: PetscStrncpy(fullpath,tmppath,flen);
80: #else
81: return(0);
82: #endif
83: } else {
84: char *p,*name;
86: /* Find username */
87: name = fullpath + 1;
88: p = name;
89: while (*p && *p != '/') p++;
90: *p = 0; p++;
91: pwde = getpwnam(name);
92: if (!pwde) return(0);
94: PetscStrcpy(tmppath,pwde->pw_dir);
95: PetscStrlen(tmppath,&ln);
96: if (tmppath[ln-1] != '/') {PetscStrcat(tmppath+ln-1,"/");}
97: PetscStrcat(tmppath,p);
98: PetscStrncpy(fullpath,tmppath,flen);
99: }
100: }
101: /* Remove the automounter part of the path */
102: PetscStrncmp(fullpath,"/tmp_mnt/",9,&flg);
103: if (flg) {
104: char tmppath[PETSC_MAX_PATH_LEN];
105: PetscStrcpy(tmppath,fullpath + 8);
106: PetscStrcpy(fullpath,tmppath);
107: }
108: /* We could try to handle things like the removal of .. etc */
109: return(0);
110: }
111: #elif defined(PETSC_HAVE__FULLPATH)
114: PetscErrorCode PetscGetFullPath(const char path[],char fullpath[],size_t flen)
115: {
117: _fullpath(fullpath,path,flen);
118: return(0);
119: }
120: #else
123: PetscErrorCode PetscGetFullPath(const char path[],char fullpath[],size_t flen)
124: {
128: PetscStrcpy(fullpath,path);
129: return(0);
130: }
131: #endif