xref: /petsc/src/sys/fileio/fpath.c (revision 7453f77509fc006cbcc7de2dd772f60dc49feac5)
1 
2 #include <petscsys.h>
3 #if defined(PETSC_HAVE_PWD_H)
4 #include <pwd.h>
5 #endif
6 
7 #undef __FUNCT__
8 #define __FUNCT__ "PetscGetFullPath"
9 /*@C
10    PetscGetFullPath - Given a filename, returns the fully qualified file name.
11 
12    Not Collective
13 
14    Input Parameters:
15 +  path     - pathname to qualify
16 .  fullpath - pointer to buffer to hold full pathname
17 -  flen     - size of fullpath
18 
19    Level: developer
20 
21    Concepts: full path
22    Concepts: path^full
23 
24 .seealso: PetscGetRelativePath()
25 @*/
26 PetscErrorCode  PetscGetFullPath(const char path[],char fullpath[],size_t flen)
27 {
28   PetscErrorCode ierr;
29   size_t         ln;
30   PetscBool      flg;
31 
32   PetscFunctionBegin;
33   if (path[0] == '/') {
34     ierr = PetscStrncmp("/tmp_mnt/",path,9,&flg);CHKERRQ(ierr);
35     if (flg) {ierr = PetscStrncpy(fullpath,path + 8,flen);CHKERRQ(ierr);}
36     else     {ierr = PetscStrncpy(fullpath,path,flen);CHKERRQ(ierr);}
37     fullpath[flen-1] = 0;
38     PetscFunctionReturn(0);
39   }
40 
41   ierr = PetscStrncpy(fullpath,path,flen);CHKERRQ(ierr);
42   fullpath[flen-1] = 0;
43   /* Remove the various "special" forms (~username/ and ~/) */
44   if (fullpath[0] == '~') {
45     char tmppath[PETSC_MAX_PATH_LEN],*rest;
46     if (fullpath[1] == '/') {
47       ierr = PetscGetHomeDirectory(tmppath,PETSC_MAX_PATH_LEN);CHKERRQ(ierr);
48       rest = fullpath + 2;
49     } else {
50 #if defined(PETSC_HAVE_PWD_H)
51       struct passwd  *pwde;
52       char *p,*name;
53 
54       /* Find username */
55       name = fullpath + 1;
56       p    = name;
57       while (*p && *p != '/') p++;
58       *p   = 0;
59       rest = p + 1;
60       pwde = getpwnam(name);
61       if (!pwde) PetscFunctionReturn(0);
62 
63       ierr = PetscStrcpy(tmppath,pwde->pw_dir);CHKERRQ(ierr);
64 #else
65       PetscFunctionReturn(0);
66 #endif
67     }
68     ierr = PetscStrlen(tmppath,&ln);CHKERRQ(ierr);
69     if (tmppath[ln-1] != '/') {ierr = PetscStrcat(tmppath+ln-1,"/");CHKERRQ(ierr);}
70     ierr = PetscStrcat(tmppath,rest);CHKERRQ(ierr);
71     ierr = PetscStrncpy(fullpath,tmppath,flen);CHKERRQ(ierr);
72     fullpath[flen-1] = 0;
73   } else {
74     ierr = PetscGetWorkingDirectory(fullpath,flen);CHKERRQ(ierr);
75     ierr = PetscStrlen(fullpath,&ln);CHKERRQ(ierr);
76     ierr = PetscStrncpy(fullpath+ln,"/",flen - ln);CHKERRQ(ierr);
77     fullpath[flen-1] = 0;
78     ierr = PetscStrlen(fullpath,&ln);CHKERRQ(ierr);
79     if (path[0] == '.' && path[1] == '/') {
80       ierr = PetscStrncat(fullpath,path+2,flen - ln - 1);CHKERRQ(ierr);
81     } else {
82       ierr = PetscStrncat(fullpath,path,flen - ln - 1);CHKERRQ(ierr);
83     }
84     fullpath[flen-1] = 0;
85   }
86 
87   /* Remove the automounter part of the path */
88   ierr = PetscStrncmp(fullpath,"/tmp_mnt/",9,&flg);CHKERRQ(ierr);
89   if (flg) {
90     char tmppath[PETSC_MAX_PATH_LEN];
91     ierr = PetscStrcpy(tmppath,fullpath + 8);CHKERRQ(ierr);
92     ierr = PetscStrcpy(fullpath,tmppath);CHKERRQ(ierr);
93   }
94   /* We could try to handle things like the removal of .. etc */
95   PetscFunctionReturn(0);
96 }
97