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