extending 1003.1 to include sym links
Moderator, John S. Quarterman
std-unix at longway.TIC.COM
Thu Mar 22 09:14:25 AEST 1990
From: Doug Gwyn <uunet!smoke.brl.mil!gwyn>
In article <580 at longway.TIC.COM> std-unix at uunet.uu.net writes:
>From: andrew at alice.uucp (Andrew Hume)
>the posix 1003.1 standard has cleverly evaded naming of bits
>in the mode field of the stat structure. it does this by
>defining tests (like S_ISDIR(mode) rather than (mode&S_IFMT)==S_IFDIR).
>the question is, how do people deal with sym links? I simply
>added a S_ISLNK macro but would prefer to go with the flow
>if there is one.
I think that would be the most obvious name for such a macro.
Unfortunately, so far as I can tell IEEE Std 1003.1-1988 fails
to stake out portions of macro name space for headers such as
<fcntl.h> (O_*) and <sys/stat.h> (S_*). (I had thought that it
had, but I can't seem to find such provisions now; 2.8.2's
definition of the action of _POSIX_SOURCE was supposed to
support this.)
>From the point of view of 1003.1, S_ISLNK() is not very useful,
because both stat() and fstat() treat symbolic links as
"transparent", and 1003.1 doesn't mention lstat() which is the
function for which S_ISLNK() has a real use.
Probably the best solution for implementors is along these lines:
/* <sys/stat.h> */
...
#define _S_IFMT 0170000 /* type of file: */
#define _S_IFDIR 0040000 /* directory */
#define _S_IFCHR 0020000 /* character special */
#define _S_IFBLK 0060000 /* block special */
#define _S_IFREG 0100000 /* regular */
#define _S_IFLNK 0120000 /* symbolic link */
#define _S_IFSOCK 0140000 /* socket */
#define _S_IFIFO 0010000 /* fifo */
#define S_ISBLK(mode) (((mode) & _S_IFMT) == _S_IFBLK)
#define S_ISCHR(mode) (((mode) & _S_IFMT) == _S_IFCHR)
#define S_ISDIR(mode) (((mode) & _S_IFMT) == _S_IFDIR)
#define S_ISFIFO(mode) (((mode) & _S_IFMT) == _S_IFIFO)
#define S_ISREG(mode) (((mode) & _S_IFMT) == _S_IFREG)
#ifndef _POSIX_SOURCE /* enable "common usage" extensions */
#define S_ISLNK(mode) (((mode) & _S_IFMT) == _S_IFLNK)
#define S_ISSOCK(mode) (((mode) & _S_IFMT) == _S_IFSOCK)
#define S_IFMT _S_IFMT
#define S_IFDIR _S_IFDIR
#define S_IFCHR _S_IFCHR
#define S_IFBLK _S_IFBLK
#define S_IFREG _S_IFREG
#define S_IFLNK _S_IFLNK
#define S_IFSOCK _S_IFSOCK
#define S_IFIFO _S_IFIFO
#endif /* !_POSIX_SOURCE */
...
Volume-Number: Volume 19, Number 18
More information about the Comp.std.unix
mailing list