Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files. =================================================================== RCS file: /ftp/cvs/cvsroot/src/lib/libc/gen/getcwd.c,v retrieving revision 1.13 retrieving revision 1.15 diff -u -p -r1.13 -r1.15 --- src/lib/libc/gen/getcwd.c 1998/08/10 02:43:09 1.13 +++ src/lib/libc/gen/getcwd.c 1998/11/06 19:43:23 1.15 @@ -1,4 +1,4 @@ -/* $NetBSD: getcwd.c,v 1.13 1998/08/10 02:43:09 perry Exp $ */ +/* $NetBSD: getcwd.c,v 1.15 1998/11/06 19:43:23 christos Exp $ */ /* * Copyright (c) 1989, 1991, 1993, 1995 @@ -41,7 +41,7 @@ #if 0 static char sccsid[] = "@(#)getcwd.c 8.5 (Berkeley) 2/7/95"; #else -__RCSID("$NetBSD: getcwd.c,v 1.13 1998/08/10 02:43:09 perry Exp $"); +__RCSID("$NetBSD: getcwd.c,v 1.15 1998/11/06 19:43:23 christos Exp $"); #endif #endif /* LIBC_SCCS and not lint */ @@ -67,6 +67,10 @@ __weak_alias(realpath,_realpath); (dp->d_name[1] == '.' && dp->d_name[2] == '\0'))) +#if defined(__SVR4) || defined(__svr4__) +#define d_fileno d_ino +#endif + /* * char *realpath(const char *path, char resolved_path[MAXPATHLEN]); * @@ -199,6 +203,7 @@ getcwd(pt, size) size_t ptsize, upsize; int save_errno; char *ept, *eup, *up; + size_t dlen; /* * If no buffer specified by the user, allocate one as necessary. @@ -257,7 +262,7 @@ getcwd(pt, size) * path to the beginning of the buffer, but it's always * been that way and stuff would probably break. */ - memcpy(pt, bpt, (size_t)(ept - bpt)); + memmove(pt, bpt, (size_t)(ept - bpt)); free(up); return (pt); } @@ -294,8 +299,14 @@ getcwd(pt, size) for (;;) { if (!(dp = readdir(dir))) goto notfound; - if (dp->d_fileno == ino) + if (dp->d_fileno == ino) { +#if defined(__SVR4) || defined(__svr4__) + dlen = strlen(dp->d_name); +#else + dlen = dp->d_namlen; +#endif break; + } } } else for (;;) { @@ -303,8 +314,12 @@ getcwd(pt, size) goto notfound; if (ISDOT(dp)) continue; - memcpy(bup, dp->d_name, - (size_t)(dp->d_namlen + 1)); +#if defined(__SVR4) || defined(__svr4__) + dlen = strlen(dp->d_name); +#else + dlen = dp->d_namlen; +#endif + memmove(bup, dp->d_name, dlen + 1); /* Save the first error for later. */ if (lstat(up, &s)) { @@ -321,7 +336,7 @@ getcwd(pt, size) * Check for length of the current name, preceding slash, * leading slash. */ - if (bpt - pt <= dp->d_namlen + (first ? 1 : 2)) { + if (bpt - pt <= dlen + (first ? 1 : 2)) { size_t len, off; if (!ptsize) { @@ -334,13 +349,13 @@ getcwd(pt, size) goto err; bpt = pt + off; ept = pt + ptsize; - memcpy(ept - len, bpt, len); + memmove(ept - len, bpt, len); bpt = ept - len; } if (!first) *--bpt = '/'; - bpt -= dp->d_namlen; - memcpy(bpt, dp->d_name, (size_t)dp->d_namlen); + bpt -= dlen; + memmove(bpt, dp->d_name, dlen); (void)closedir(dir); /* Truncate any file name. */