Actual source code: fpath.c
petsc-3.10.5 2019-03-28
Report Typos and Errors

      2:  #include <petscsys.h>
      3: #if defined(PETSC_HAVE_PWD_H)
      4: #include <pwd.h>
      5: #endif

      7: /*@C
      8:    PetscGetFullPath - Given a filename, returns the fully qualified file name.

     10:    Not Collective

     12:    Input Parameters:
     13: +  path     - pathname to qualify
     14: .  fullpath - pointer to buffer to hold full pathname
     15: -  flen     - size of fullpath

     17:    Level: developer

     19:    Concepts: full path
     20:    Concepts: path^full

     22: .seealso: PetscGetRelativePath()
     23: @*/
     24: PetscErrorCode  PetscGetFullPath(const char path[],char fullpath[],size_t flen)
     25: {
     27:   size_t         ln;
     28:   PetscBool      flg;

     31:   if (path[0] == '/') {
     32:     PetscStrncmp("/tmp_mnt/",path,9,&flg);
     33:     if (flg) {PetscStrncpy(fullpath,path + 8,flen);}
     34:     else     {PetscStrncpy(fullpath,path,flen);}
     35:     fullpath[flen-1] = 0;
     36:     return(0);
     37:   }

     39:   PetscStrncpy(fullpath,path,flen);
     40:   fullpath[flen-1] = 0;
     41:   /* Remove the various "special" forms (~username/ and ~/) */
     42:   if (fullpath[0] == '~') {
     43:     char tmppath[PETSC_MAX_PATH_LEN],*rest;
     44:     if (fullpath[1] == '/') {
     45:       PetscGetHomeDirectory(tmppath,PETSC_MAX_PATH_LEN);
     46:       rest = fullpath + 2;
     47:     } else {
     48: #if defined(PETSC_HAVE_PWD_H)
     49:       struct passwd  *pwde;
     50:       char *p,*name;

     52:       /* Find username */
     53:       name = fullpath + 1;
     54:       p    = name;
     55:       while (*p && *p != '/') p++;
     56:       *p   = 0;
     57:       rest = p + 1;
     58:       pwde = getpwnam(name);
     59:       if (!pwde) return(0);

     61:       PetscStrcpy(tmppath,pwde->pw_dir);
     62: #else
     63:       return(0);
     64: #endif
     65:     }
     66:     PetscStrlen(tmppath,&ln);
     67:     if (tmppath[ln-1] != '/') {PetscStrcat(tmppath+ln-1,"/");}
     68:     PetscStrcat(tmppath,rest);
     69:     PetscStrncpy(fullpath,tmppath,flen);
     70:     fullpath[flen-1] = 0;
     71:   } else {
     72:     PetscGetWorkingDirectory(fullpath,flen);
     73:     PetscStrlen(fullpath,&ln);
     74:     PetscStrncpy(fullpath+ln,"/",flen - ln);
     75:     fullpath[flen-1] = 0;
     76:     PetscStrlen(fullpath,&ln);
     77:     if (path[0] == '.' && path[1] == '/') {
     78:       PetscStrlcat(fullpath,path+2,flen);
     79:     } else {
     80:       PetscStrlcat(fullpath,path,flen);
     81:     }
     82:     fullpath[flen-1] = 0;
     83:   }

     85:   /* Remove the automounter part of the path */
     86:   PetscStrncmp(fullpath,"/tmp_mnt/",9,&flg);
     87:   if (flg) {
     88:     char tmppath[PETSC_MAX_PATH_LEN];
     89:     PetscStrcpy(tmppath,fullpath + 8);
     90:     PetscStrcpy(fullpath,tmppath);
     91:   }
     92:   /* We could try to handle things like the removal of .. etc */
     93:   return(0);
     94: }