xref: /petsc/src/sys/fileio/fpath.c (revision 2fa5cd679192b9b390e47ae2d0650965e6b1d9fa)
1 
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/types.h>
11 #include <sys/stat.h>
12 #if defined(PETSC_HAVE_UNISTD_H)
13 #include <unistd.h>
14 #endif
15 #if defined(PETSC_HAVE_STDLIB_H)
16 #include <stdlib.h>
17 #endif
18 #if defined(PETSC_HAVE_SYS_UTSNAME_H)
19 #include <sys/utsname.h>
20 #endif
21 #include <fcntl.h>
22 #if defined(PETSC_HAVE_SYS_SYSTEMINFO_H)
23 #include <sys/systeminfo.h>
24 #endif
25 
26 #if defined(PETSC_HAVE_PWD_H)
27 
28 #undef __FUNCT__
29 #define __FUNCT__ "PetscGetFullPath"
30 /*@C
31    PetscGetFullPath - Given a filename, returns the fully qualified file name.
32 
33    Not Collective
34 
35    Input Parameters:
36 +  path     - pathname to qualify
37 .  fullpath - pointer to buffer to hold full pathname
38 -  flen     - size of fullpath
39 
40    Level: developer
41 
42    Concepts: full path
43    Concepts: path^full
44 
45 .seealso: PetscGetRelativePath()
46 @*/
47 PetscErrorCode  PetscGetFullPath(const char path[],char fullpath[],size_t flen)
48 {
49   struct passwd  *pwde;
50   PetscErrorCode ierr;
51   size_t         ln;
52   PetscBool      flg;
53 
54   PetscFunctionBegin;
55   if (path[0] == '/') {
56     ierr = PetscStrncmp("/tmp_mnt/",path,9,&flg);CHKERRQ(ierr);
57     if (flg) {ierr = PetscStrncpy(fullpath,path + 8,flen);CHKERRQ(ierr);}
58     else     {ierr = PetscStrncpy(fullpath,path,flen);CHKERRQ(ierr);}
59     PetscFunctionReturn(0);
60   }
61   ierr = PetscGetWorkingDirectory(fullpath,flen);CHKERRQ(ierr);
62   ierr = PetscStrlen(fullpath,&ln);CHKERRQ(ierr);
63   ierr = PetscStrncat(fullpath,"/",flen - ln);CHKERRQ(ierr);
64   if (path[0] == '.' && path[1] == '/') {
65     ierr = PetscStrlen(fullpath,&ln);CHKERRQ(ierr);
66     ierr = PetscStrncat(fullpath,path+2,flen - ln - 1);CHKERRQ(ierr);
67   } else {
68     ierr = PetscStrlen(fullpath,&ln);CHKERRQ(ierr);
69     ierr = PetscStrncat(fullpath,path,flen - ln - 1);CHKERRQ(ierr);
70   }
71 
72   /* Remove the various "special" forms (~username/ and ~/) */
73   if (fullpath[0] == '~') {
74     char tmppath[PETSC_MAX_PATH_LEN];
75     if (fullpath[1] == '/') {
76 #if defined(PETSC_HAVE_GETPWUID)
77       pwde = getpwuid(geteuid());
78       if (!pwde) PetscFunctionReturn(0);
79       ierr = PetscStrcpy(tmppath,pwde->pw_dir);CHKERRQ(ierr);
80       ierr = PetscStrlen(tmppath,&ln);CHKERRQ(ierr);
81       if (tmppath[ln-1] != '/') {ierr = PetscStrcat(tmppath+ln-1,"/");CHKERRQ(ierr);}
82       ierr = PetscStrcat(tmppath,fullpath + 2);CHKERRQ(ierr);
83       ierr = PetscStrncpy(fullpath,tmppath,flen);CHKERRQ(ierr);
84 #else
85       PetscFunctionReturn(0);
86 #endif
87     } else {
88       char *p,*name;
89 
90       /* Find username */
91       name = fullpath + 1;
92       p    = name;
93       while (*p && *p != '/') p++;
94       *p   = 0; p++;
95       pwde = getpwnam(name);
96       if (!pwde) PetscFunctionReturn(0);
97 
98       ierr = PetscStrcpy(tmppath,pwde->pw_dir);CHKERRQ(ierr);
99       ierr = PetscStrlen(tmppath,&ln);CHKERRQ(ierr);
100       if (tmppath[ln-1] != '/') {ierr = PetscStrcat(tmppath+ln-1,"/");CHKERRQ(ierr);}
101       ierr = PetscStrcat(tmppath,p);CHKERRQ(ierr);
102       ierr = PetscStrncpy(fullpath,tmppath,flen);CHKERRQ(ierr);
103     }
104   }
105   /* Remove the automounter part of the path */
106   ierr = PetscStrncmp(fullpath,"/tmp_mnt/",9,&flg);CHKERRQ(ierr);
107   if (flg) {
108     char tmppath[PETSC_MAX_PATH_LEN];
109     ierr = PetscStrcpy(tmppath,fullpath + 8);CHKERRQ(ierr);
110     ierr = PetscStrcpy(fullpath,tmppath);CHKERRQ(ierr);
111   }
112   /* We could try to handle things like the removal of .. etc */
113   PetscFunctionReturn(0);
114 }
115 #elif defined(PETSC_HAVE__FULLPATH)
116 #undef __FUNCT__
117 #define __FUNCT__ "PetscGetFullPath"
118 PetscErrorCode  PetscGetFullPath(const char path[],char fullpath[],size_t flen)
119 {
120   PetscFunctionBegin;
121   _fullpath(fullpath,path,flen);
122   PetscFunctionReturn(0);
123 }
124 #else
125 #undef __FUNCT__
126 #define __FUNCT__ "PetscGetFullPath"
127 PetscErrorCode  PetscGetFullPath(const char path[],char fullpath[],size_t flen)
128 {
129   PetscErrorCode ierr;
130 
131   PetscFunctionBegin;
132   ierr = PetscStrcpy(fullpath,path);CHKERRQ(ierr);
133   PetscFunctionReturn(0);
134 }
135 #endif
136