xref: /petsc/src/sys/fileio/fpath.c (revision 9566063d113dddea24716c546802770db7481bc0)
17d0a6c19SBarry Smith 
2c6db04a5SJed Brown #include <petscsys.h>
3e5c89e4eSSatish Balay #if defined(PETSC_HAVE_PWD_H)
4e5c89e4eSSatish Balay #include <pwd.h>
5e5c89e4eSSatish Balay #endif
6e5c89e4eSSatish Balay 
7e5c89e4eSSatish Balay /*@C
8e5c89e4eSSatish Balay    PetscGetFullPath - Given a filename, returns the fully qualified file name.
9e5c89e4eSSatish Balay 
10e5c89e4eSSatish Balay    Not Collective
11e5c89e4eSSatish Balay 
12e5c89e4eSSatish Balay    Input Parameters:
13e5c89e4eSSatish Balay +  path     - pathname to qualify
14e5c89e4eSSatish Balay .  fullpath - pointer to buffer to hold full pathname
15e5c89e4eSSatish Balay -  flen     - size of fullpath
16e5c89e4eSSatish Balay 
17e5c89e4eSSatish Balay    Level: developer
18e5c89e4eSSatish Balay 
19e5c89e4eSSatish Balay .seealso: PetscGetRelativePath()
20e5c89e4eSSatish Balay @*/
217087cfbeSBarry Smith PetscErrorCode  PetscGetFullPath(const char path[],char fullpath[],size_t flen)
22e5c89e4eSSatish Balay {
23e5c89e4eSSatish Balay   size_t         ln;
24ace3abfcSBarry Smith   PetscBool      flg;
25e5c89e4eSSatish Balay 
26e5c89e4eSSatish Balay   PetscFunctionBegin;
27e5c89e4eSSatish Balay   if (path[0] == '/') {
28*9566063dSJacob Faibussowitsch     PetscCall(PetscStrncmp("/tmp_mnt/",path,9,&flg));
29*9566063dSJacob Faibussowitsch     if (flg) PetscCall(PetscStrncpy(fullpath,path + 8,flen));
30*9566063dSJacob Faibussowitsch     else     PetscCall(PetscStrncpy(fullpath,path,flen));
316c8deb01SJed Brown     fullpath[flen-1] = 0;
32e5c89e4eSSatish Balay     PetscFunctionReturn(0);
33e5c89e4eSSatish Balay   }
34e5c89e4eSSatish Balay 
35*9566063dSJacob Faibussowitsch   PetscCall(PetscStrncpy(fullpath,path,flen));
366c8deb01SJed Brown   fullpath[flen-1] = 0;
37e5c89e4eSSatish Balay   /* Remove the various "special" forms (~username/ and ~/) */
38e5c89e4eSSatish Balay   if (fullpath[0] == '~') {
3945082d64SJed Brown     char tmppath[PETSC_MAX_PATH_LEN],*rest;
40e5c89e4eSSatish Balay     if (fullpath[1] == '/') {
41*9566063dSJacob Faibussowitsch       PetscCall(PetscGetHomeDirectory(tmppath,PETSC_MAX_PATH_LEN));
4245082d64SJed Brown       rest = fullpath + 2;
43e5c89e4eSSatish Balay     } else {
4445082d64SJed Brown #if defined(PETSC_HAVE_PWD_H)
4545082d64SJed Brown       struct passwd  *pwde;
46e5c89e4eSSatish Balay       char *p,*name;
47e5c89e4eSSatish Balay 
48e5c89e4eSSatish Balay       /* Find username */
49e5c89e4eSSatish Balay       name = fullpath + 1;
50e5c89e4eSSatish Balay       p    = name;
51e5c89e4eSSatish Balay       while (*p && *p != '/') p++;
5245082d64SJed Brown       *p   = 0;
5345082d64SJed Brown       rest = p + 1;
54e5c89e4eSSatish Balay       pwde = getpwnam(name);
55e5c89e4eSSatish Balay       if (!pwde) PetscFunctionReturn(0);
56e5c89e4eSSatish Balay 
57*9566063dSJacob Faibussowitsch       PetscCall(PetscStrcpy(tmppath,pwde->pw_dir));
5845082d64SJed Brown #else
5945082d64SJed Brown       PetscFunctionReturn(0);
6045082d64SJed Brown #endif
6145082d64SJed Brown     }
62*9566063dSJacob Faibussowitsch     PetscCall(PetscStrlen(tmppath,&ln));
63*9566063dSJacob Faibussowitsch     if (tmppath[ln-1] != '/') PetscCall(PetscStrcat(tmppath+ln-1,"/"));
64*9566063dSJacob Faibussowitsch     PetscCall(PetscStrcat(tmppath,rest));
65*9566063dSJacob Faibussowitsch     PetscCall(PetscStrncpy(fullpath,tmppath,flen));
666c8deb01SJed Brown     fullpath[flen-1] = 0;
676c8deb01SJed Brown   } else {
68*9566063dSJacob Faibussowitsch     PetscCall(PetscGetWorkingDirectory(fullpath,flen));
69*9566063dSJacob Faibussowitsch     PetscCall(PetscStrlen(fullpath,&ln));
70*9566063dSJacob Faibussowitsch     PetscCall(PetscStrncpy(fullpath+ln,"/",flen - ln));
716c8deb01SJed Brown     fullpath[flen-1] = 0;
72*9566063dSJacob Faibussowitsch     PetscCall(PetscStrlen(fullpath,&ln));
736c8deb01SJed Brown     if (path[0] == '.' && path[1] == '/') {
74*9566063dSJacob Faibussowitsch       PetscCall(PetscStrlcat(fullpath,path+2,flen));
756c8deb01SJed Brown     } else {
76*9566063dSJacob Faibussowitsch       PetscCall(PetscStrlcat(fullpath,path,flen));
77e5c89e4eSSatish Balay     }
786c8deb01SJed Brown     fullpath[flen-1] = 0;
796c8deb01SJed Brown   }
806c8deb01SJed Brown 
81e5c89e4eSSatish Balay   /* Remove the automounter part of the path */
82*9566063dSJacob Faibussowitsch   PetscCall(PetscStrncmp(fullpath,"/tmp_mnt/",9,&flg));
83e5c89e4eSSatish Balay   if (flg) {
84e5c89e4eSSatish Balay     char tmppath[PETSC_MAX_PATH_LEN];
85*9566063dSJacob Faibussowitsch     PetscCall(PetscStrcpy(tmppath,fullpath + 8));
86*9566063dSJacob Faibussowitsch     PetscCall(PetscStrcpy(fullpath,tmppath));
87e5c89e4eSSatish Balay   }
88e5c89e4eSSatish Balay   /* We could try to handle things like the removal of .. etc */
89e5c89e4eSSatish Balay   PetscFunctionReturn(0);
90e5c89e4eSSatish Balay }
91