ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/radiance/ray/src/common/getpath.c
(Generate patch)

Comparing ray/src/common/getpath.c (file contents):
Revision 2.19 by schorsch, Sun Mar 6 01:13:17 2016 UTC vs.
Revision 2.20 by greg, Sun Jul 21 16:48:34 2019 UTC

# Line 39 | Line 39 | getpath        /* expand fname, return full path */
39          pname[0] = '\0';                /* check for full specification */
40  
41          if (ISABS(fname)) { /* absolute path */
42 <                strncpy(pname, fname, sizeof(pname)-1);
42 >                strlcpy(pname, fname, sizeof(pname));
43          } else {
44                  switch (*fname) {
45 <                        case '.':                               /* relative to cwd */
46 <                                strncpy(pname, fname, sizeof(pname)-1);
45 >                        case '.':               /* relative to cwd */
46 >                                strlcpy(pname, fname, sizeof(pname));
47                                  break;
48 <                        case '~':                               /* relative to home directory */
48 >                        case '~':               /* relative to home directory */
49                                  fname++;
50                                  cp = uname;
51 <                                for (i=0;i<sizeof(uname)&&*fname!='\0'&&!ISDIRSEP(*fname);i++)
51 >                                for (i = 0; i < sizeof(uname) && *fname
52 >                                                && !ISDIRSEP(*fname); i++)
53                                          *cp++ = *fname++;
54                                  *cp = '\0';
55                                  cp = gethomedir(uname, pname, sizeof(pname));
56                                  if(cp == NULL) return NULL;
57 <                                strncat(pname, fname, sizeof(pname)-strlen(pname)-1);
57 >                                strlcat(pname, fname, sizeof(pname));
58                                  break;
59                  }
60          }
61          if (pname[0])           /* got it, check access if search requested */
62 <                return(searchpath==NULL||access(pname,mode)==0 ? pname : NULL);
62 >                return(!searchpath || access(pname,mode)==0 ? pname : NULL);
63  
64 <        if (searchpath == NULL) {                       /* don't search */
65 <                strncpy(pname, fname, sizeof(pname)-1);
64 >        if (!searchpath) {                      /* no search */
65 >                strlcpy(pname, fname, sizeof(pname));
66                  return(pname);
67          }
68          /* check search path */
69          do {
70                  cp = pname;
71 <                while (*searchpath && (*cp = *searchpath++) != PATHSEP) {
72 <                        cp++;
73 <                }
73 <                if (cp > pname && !ISDIRSEP(cp[-1])) {
71 >                while (*searchpath && (*cp = *searchpath++) != PATHSEP)
72 >                        cp += (cp-pname < sizeof(pname)-2);
73 >                if (cp > pname && !ISDIRSEP(cp[-1]))
74                          *cp++ = DIRSEP;
75 <                }
76 <                strncpy(cp, fname, sizeof(pname)-strlen(pname)-1);
75 >                *cp = '\0';
76 >                strlcat(pname, fname, sizeof(pname));
77                  if (access(pname, mode) == 0)           /* file accessable? */
78                          return(pname);
79          } while (*searchpath);

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines