1 /***********************************************************************
3 * This software is part of the ast package *
4 * Copyright (c) 1985-2010 AT&T Intellectual Property *
5 * and is licensed under the *
6 * Common Public License, Version 1.0 *
7 * by AT&T Intellectual Property *
9 * A copy of the License is available at *
10 * http://www.opensource.org/licenses/cpl1.0.txt *
11 * (with md5 checksum 059e8cd6165cb4c31e351f2b69388fd9) *
13 * Information and Software Systems Research *
17 * Glenn Fowler <gsf@research.att.com> *
18 * David Korn <dgk@research.att.com> *
19 * Phong Vo <kpv@research.att.com> *
21 ***********************************************************************/
40 vchdir(const char* path
)
44 if (strlen(path
) >= PATH_MAX
)
53 #define chdir(p) vchdir(p)
58 * set the current directory to path
59 * if path is long and home!=0 then pathcd(home,0)
60 * is called on intermediate chdir errors
64 pathcd(const char* path
, const char* home
)
66 register char* p
= (char*)path
;
76 * this should work 99% of the time
86 if ((n
= strlen(p
)) < PATH_MAX
)
89 if (errno
!= ENAMETOOLONG
)
94 * path is too long -- copy so it can be modified in place
100 p
= stkptr(stkstd
, i
);
104 * get a short prefix component
108 while (--s
>= p
&& *s
!= '/');
113 * chdir to the prefix
124 if ((n
-= s
- p
) < PATH_MAX
)
134 * try to recover back to home
137 if (!(p
= (char*)home
))