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