#ifndef SYS_STAT_H
#define SYS_STAT_H

/*
**       $VER: sys/stat.h 1.7 (30.12.00)
**            Includes Release 45.00
**                StormC Version
**
**    Copyright © 1996/2001 by CyberdyneSystems
**
**            written by Matthias Henze
**               All Rights Reserved
*/

#ifndef STORMAMIGA_H
  #include <stormamiga.h>
#endif
#ifndef SYS_TYPES_H
  #include <sys/types.h>
#endif
#ifndef SYS_TIME_H
  #include <sys/time.h>
#endif

#ifdef __cplusplus
  extern "C" {
#endif

#ifdef STORMAMIGA_SASC
  struct stat
  {
    ushort  st_mode;         /* file mode */
    ino_t   st_ino;          /* inode number */
    dev_t   st_dev;          /* file system identifier */
    char    *st_rdev;        /* device identifier (volume name) */
    short   st_nlink;        /* number of links */
    ushort  st_uid;          /* file owner user-id */
    ushort  st_gid;          /* file group user-id */
    off_t   st_size;         /* file size in bytes */
    time_t  st_atime;        /* time last accessed */
    time_t  st_mtime;        /* time last modified */
    time_t  st_ctime;        /* time last status change */
    short   st_type;         /* Amiga file type */
    char    *st_comment;     /* Amiga file comment */
  };
#else
  struct stat
  {
    dev_t   st_dev;           /* inode's device */
    ino_t   st_ino;           /* inode's number */
    ushort  st_mode;          /* inode protection mode */
    short   st_nlink;         /* number of hard links */
    uid_t   st_uid;           /* user ID of the file's owner */
    gid_t   st_gid;           /* group ID of the file's group */
    dev_t   st_rdev;          /* device type */
    off_t   st_size;          /* file size, in bytes */
    time_t  st_atime;         /* time of last access */
    int     st_spare1;
    time_t  st_mtime;         /* time of last data modification */
    int     st_spare2;
    time_t  st_ctime;         /* time of last file status change */
    int     st_spare3;
    long    st_blksize;       /* optimal blocksize for I/O */
    long    st_blocks;        /* blocks allocated for file */
    long    st_spare4[2];
  };
#endif

#define st_handler st_spare3
#define st_amode   st_spare2

#define S_ISUID 0004000     /* set user id on execution */
#define S_ISGID 0002000     /* set group id on execution */

#ifndef _POSIX_SOURCE
  #define S_ISTXT 0001000   /* sticky bit */
#endif

#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 */

#ifndef _POSIX_SOURCE
  #define S_IREAD   S_IRUSR
  #define S_IWRITE  S_IWUSR
  #define S_IEXEC   S_IXUSR
#endif

#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 */

#ifndef _POSIX_SOURCE
  #define S_IFMT   0170000  /* type of file */
  #define S_IFIFO  0010000  /* named pipe (fifo) */
  #define S_IFCHR  0020000  /* character special */
  #define S_IFDIR  0040000  /* directory */
  #define S_IFBLK  0060000  /* block special */
  #define S_IFREG  0100000  /* regular */
  #define S_IFLNK  0120000  /* symbolic link */
  #define S_IFSOCK 0140000  /* socket */
  #define S_ISVTX  0001000  /* save swapped text even after use */

  #define ACCESSPERMS   (S_IRWXU|S_IRWXG|S_IRWXO)                         /* 0777 */
  #define ALLPERMS      (S_ISUID|S_ISGID|S_ISTXT|S_IRWXU|S_IRWXG|S_IRWXO) /* 7777 */
  #define DEFFILEMODE   (S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP|S_IROTH|S_IWOTH) /* 0666 */
  #define S_BLKSIZE 512     /* block size used in the stat struct */
#endif

#define S_ISDIR(m)      ((m & 0170000) == 0040000)  /* directory */
#define S_ISCHR(m)      ((m & 0170000) == 0020000)  /* char special */
#define S_ISBLK(m)      ((m & 0170000) == 0060000)  /* block special */
#define S_ISREG(m)      ((m & 0170000) == 0100000)  /* regular file */
#define S_ISLNK(m)      ((m & 0170000) == 0120000)  /* symbolic link */
#define S_ISFIFO(m)     ((m & 0170000) == 0010000)  /* fifo */
#ifndef _POSIX_SOURCE
  #define S_ISSOCK(m)   ((m & 0170000) == 0140000)  /* socket */
#endif


int     chmod (cchar *, mode_t);
int     fstat(int, struct stat *);
int     mkdir (cchar *, mode_t);
int     stat  (cchar *, struct stat *);
#ifndef _POSIX_SOURCE
  int   lstat (cchar *, struct stat *);
#endif

#ifdef __cplusplus
  }
#endif

#ifdef STORMAMIGA_UNIXPATH
  extern "C" {char *UnixToAmigaPath (cchar *);}

  __inline int chmod_u  (cchar *path, mode_t mode)
  { return chmod (UnixToAmigaPath (path), mode); }

  __inline int lstat_u  (cchar *path, struct stat *sb)
  { return lstat (UnixToAmigaPath (path), sb); }

  __inline int mkdir_u  (cchar *path, mode_t mode)
  { return mkdir (UnixToAmigaPath (path), mode); }

  __inline int stat_u   (cchar *path, struct stat *sb)
  { return stat (UnixToAmigaPath (path), sb); }

  #define chmod chmod_u
  #define lstat lstat_u
  #define mkdir mkdir_u
  #define stat stat_u
#endif

#endif /* SYS_STAT_H */

