
/* stat.h */

#include <sys/types.h>
#include <time.h>

#define S_IFMT   0170000	/* Mask for file type */

#define	S_IRWXU  0000700	/* RWX mask for owner */
#define	S_IRUSR  0000400	/* R for owner */
#define	S_IWUSR  0000200	/* W for owner */
#define	S_IXUSR  0000100	/* X for owner */

#define	S_IREAD	 S_IRUSR
#define	S_IWRITE S_IWUSR
#define	S_IEXEC	 S_IXUSR

#define	S_IRWXG  0000070	/* RWX mask for group */
#define	S_IRGRP  0000040	/* R for group */
#define	S_IWGRP  0000020	/* W for group */
#define	S_IXGRP  0000010	/* X for group */

#define	S_IRWXO	 0000007	/* RWX mask for other */
#define	S_IROTH	 0000004	/* R for other */
#define	S_IWOTH	 0000002	/* W for other */
#define	S_IXOTH	 0000001	/* X for other */

#define S_ISVTX  0001000	/* Save swapped text after use */
#define S_ISGID  0002000	/* Set group id on execution */
#define S_ISUID  0004000	/* Set user id on execution */

#define S_IFIFO  0010000	/* A fifo */
#define S_IFCHR  0020000	/* A character special file */
#define S_IFDIR  0040000	/* A directory file */
#define S_IFBLK  0060000	/* A block special file */
#define S_IFREG  0100000	/* A a regular file */
#define S_IFLNK  0120000	/* A symbolic link (BSD) */
#define S_IFSOCK 0140000	/* A socket */	

#define	S_ISDIR(m)	((m & S_IFMT) == S_IFDIR)	/* directory */
#define	S_ISCHR(m)	((m & S_IFMT) == S_IFCHR)	/* char special */
#define	S_ISBLK(m)	((m & S_IFMT) == S_IFBLK)	/* block special */
#define	S_ISREG(m)	((m & S_IFMT) == S_IFREG)	/* regular file */
#define	S_ISFIFO(m)	((m & S_IFMT) == S_IFIFO)	/* fifo */
#define	S_ISLNK(m)	((m & S_IFMT) == S_IFLNK)	/* symbolic link */
#define	S_ISSOCK(m)	((m & S_IFMT) == S_IFSOCK)	/* socket */

#define S_BLKSIZE	512	/* block size used in the stat struct */

struct stat
  {
    dev_t   st_dev;	/* Major device number of device containing file */
    ino_t   st_ino;	/* Inode number */
    mode_t  st_mode;	/* File mode as used by mknod */
    nlink_t st_nlink;	/* Number of links */
    uid_t   st_uid;	/* File owner's user ID number */
    gid_t   st_gid;	/* File owner's group ID number */
    dev_t   st_rdev;	/* Minor device number of device containing file */
    off_t   st_size;	/* File size in bytes */
    time_t  st_atime;	/* Timestamp of last access to file's contents */
    time_t  st_mtime;	/* Timestamp of last modification of file */
    time_t  st_ctime;	/* Timestamp of file creation */
    long    st_blksize;	/* Size of blocks for device */
    long    st_blocks;	/* Number of blocks used by file */
    u_long  st_flags;   /* User defined flags for file */
    u_long  st_gen;	/* File generation number */
  };

mode_t umask(mode_t);
int mkdir(const char *, mode_t);
int stat(const char *, struct stat *);
int fstat(int, struct stat *);
int chmod(const char *, mode_t);
