Actual source code: fpath.c
petsc-3.7.1 2016-05-15
Report Typos and Errors

      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

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

     15:    Not Collective

     17:    Input Parameters:
     18: +  path     - pathname to qualify
     19: .  fullpath - pointer to buffer to hold full pathname
     20: -  flen     - size of fullpath

     22:    Level: developer

     24:    Concepts: full path
     25:    Concepts: path^full

     27: .seealso: PetscGetRelativePath()
     28: @*/
     29: PetscErrorCode  PetscGetFullPath(const char path[],char fullpath[],size_t flen)
     30: {
     32:   size_t         ln;
     33:   PetscBool      flg;

     36:   if (path[0] == '/') {
     37:     PetscStrncmp("/tmp_mnt/",path,9,&flg);
     38:     if (flg) {PetscStrncpy(fullpath,path + 8,flen);}
     39:     else     {PetscStrncpy(fullpath,path,flen);}
     40:     fullpath[flen-1] = 0;
     41:     return(0);
     42:   }

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

     57:       /* Find username */
     58:       name = fullpath + 1;
     59:       p    = name;
     60:       while (*p && *p != '/') p++;
     61:       *p   = 0;
     62:       rest = p + 1;
     63:       pwde = getpwnam(name);
     64:       if (!pwde) return(0);

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

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