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