diff options
Diffstat (limited to 'usr/src/lib/libast/common/comp/readlink.c')
-rw-r--r-- | usr/src/lib/libast/common/comp/readlink.c | 61 |
1 files changed, 61 insertions, 0 deletions
diff --git a/usr/src/lib/libast/common/comp/readlink.c b/usr/src/lib/libast/common/comp/readlink.c new file mode 100644 index 0000000000..d2aad33df7 --- /dev/null +++ b/usr/src/lib/libast/common/comp/readlink.c @@ -0,0 +1,61 @@ +/*********************************************************************** +* * +* This software is part of the ast package * +* Copyright (c) 1985-2007 AT&T Knowledge Ventures * +* and is licensed under the * +* Common Public License, Version 1.0 * +* by AT&T Knowledge Ventures * +* * +* A copy of the License is available at * +* http://www.opensource.org/licenses/cpl1.0.txt * +* (with md5 checksum 059e8cd6165cb4c31e351f2b69388fd9) * +* * +* Information and Software Systems Research * +* AT&T Research * +* Florham Park NJ * +* * +* Glenn Fowler <gsf@research.att.com> * +* David Korn <dgk@research.att.com> * +* Phong Vo <kpv@research.att.com> * +* * +***********************************************************************/ +#pragma prototyped + +#include <ast.h> + +#if _lib_readlink + +NoN(readlink) + +#else + +#include "fakelink.h" + +#include <error.h> + +#ifndef ENOSYS +#define ENOSYS EINVAL +#endif + +int +readlink(const char* path, char* buf, int siz) +{ + int fd; + int n; + + if (siz > sizeof(FAKELINK_MAGIC)) + { + if ((fd = open(path, O_RDONLY)) < 0) + return -1; + if (read(fd, buf, sizeof(FAKELINK_MAGIC)) == sizeof(FAKELINK_MAGIC) && !strcmp(buf, FAKELINK_MAGIC) && (n = read(fd, buf, siz)) > 0 && !buf[n - 1]) + { + close(fd); + return n; + } + close(fd); + } + errno = ENOSYS; + return -1; +} + +#endif |