/* $Id: unistd.h,v 1.3 2002/03/22 01:26:28 hyperion Exp $
 */
/*
 * unistd.h
 *
 * standard symbolic constants and types. Conforming to the Single UNIX(r)
 * Specification Version 2, System Interface & Headers Issue 5
 *
 * This file is part of the ReactOS Operating System.
 *
 * Contributors:
 *  Created by KJK::Hyperion <noog@libero.it>
 *
 *  THIS SOFTWARE IS NOT COPYRIGHTED
 *
 *  This source code is offered for use in the public domain. You may
 *  use, modify or distribute it freely.
 *
 *  This code is distributed in the hope that it will be useful but
 *  WITHOUT ANY WARRANTY. ALL WARRANTIES, EXPRESS OR IMPLIED ARE HEREBY
 *  DISCLAMED. This includes but is not limited to warranties of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 *
 */
#ifndef __UNISTD_H_INCLUDED__
#define __UNISTD_H_INCLUDED__

/* INCLUDES */
#include <sys/types.h>
#include <stdio.h>
#include <inttypes.h>

/* OBJECTS */
extern char   *optarg;
extern int    optind, opterr, optopt;

/* TYPES */

/* CONSTANTS */
/* FIXME: set these constants appropriately */
/* Integer value indicating version of the ISO POSIX-1 standard (C
   language binding). */
#define _POSIX_VERSION    (0)

/* Integer value indicating version of the ISO POSIX-2 standard
   (Commands). */
#define _POSIX2_VERSION   (0)

/* Integer value indicating version of the ISO POSIX-2 standard (C
   language binding). */
#define _POSIX2_C_VERSION (0)

/* Integer value indicating version of the X/Open Portability Guide to
   which the implementation conforms. */
#define _XOPEN_VERSION     (500)

/* The version of the XCU specification to which the implementation
   conforms */
/* TODO: set to an appropriate value when commands and utilities will
   be available */
#define _XOPEN_XCU_VERSION (-1)

#if _XOPEN_XCU_VERSION != -1
#error TODO: define these constants
#define _POSIX2_C_BIND
#define _POSIX2_C_VERSION
#define _POSIX2_CHAR_TERM
#define _POSIX2_LOCALEDEF
#define _POSIX2_UPE
#define _POSIX2_VERSION
#endif

#if 0
/* TODO: check for conformance to the following specs */
#define _XOPEN_XPG2
#define _XOPEN_XPG3
#define _XOPEN_XPG4
#define _XOPEN_UNIX
#endif

#if 0
/* TODO: don't forget these features */
/* The use of chown() is restricted to a process with appropriate
   privileges, and to changing the group ID of a file only to the
   effective group ID of the process or to one of its supplementary
   group IDs. */
#define _POSIX_CHOWN_RESTRICTED

/* Terminal special characters defined in <termios.h> can be disabled
   using this character value. */
#define _POSIX_VDISABLE

/* Each process has a saved set-user-ID and a saved set-group-ID. */
#define _POSIX_SAVED_IDS

/* Implementation supports job control. */
#define _POSIX_JOB_CONTROL

#endif

/* Pathname components longer than {NAME_MAX} generate an error. */
#define _POSIX_NO_TRUNC (1)

/* The implementation supports the threads option. */
#define _POSIX_THREADS               (1)

/* FIXME: none of the following is strictly true yet */
/* The implementation supports the thread stack address attribute
   option. */ /* FIXME: not currently implemented. Should be trivial */
#define _POSIX_THREAD_ATTR_STACKADDR (1)

/* The implementation supports the thread stack size attribute
   option. */ /* FIXME: not currently implemented. Should be trivial */
#define _POSIX_THREAD_ATTR_STACKSIZE (1)

/* The implementation supports the process-shared synchronisation
   option. */ /* FIXME? not sure */
#define _POSIX_THREAD_PROCESS_SHARED (1)

/* The implementation supports the thread-safe functions option. */
/* FIXME: fix errno (currently not thread-safe) */
#define _POSIX_THREAD_SAFE_FUNCTIONS (1)

/*
   Constants for Options and Feature Groups
 */

/* Implementation supports the C Language Binding option. This will
   always have a value other than -1. */
#define _POSIX2_C_BIND (1)

/* Implementation supports the C Language Development Utilities
   option. */ /* FIXME: please change this when C compiler and
   utilities are ported */
#define _POSIX2_C_DEV (-1)

/* Implementation supports at least one terminal type. */ /* FIXME:
   please change this when terminal emulation is complete */
#define _POSIX2_CHAR_TERM (-1)

/* Implementation supports the FORTRAN Development Utilities option. */
/* FIXME: please change this when Fortran compiler and utilities are
   ported */
#define _POSIX2_FORT_DEV (-1)

/* Implementation supports the FORTRAN Run-time Utilities option. */
/* FIXME: please change this when Fortran runtimes are ported */
#define _POSIX2_FORT_RUN (-1)

/* Implementation supports the creation of locales by the localedef
   utility. */ /* FIXME: please change this when locales are ready */
#define _POSIX2_LOCALEDEF (-1)

/* Implementation supports the Software Development Utilities option. */
/* FIXME? */
#define _POSIX2_SW_DEV (-1)

/* The implementation supports the User Portability Utilities option. */
/* FIXME? */
#define _POSIX2_UPE (-1)

/* The implementation supports the X/Open Encryption Feature Group. */
/* FIXME: please change this when encryption is ready */
#define _XOPEN_CRYPT (-1)

/* The implementation supports the Issue 4, Version 2 Enhanced
   Internationalisation Feature Group. This is always set to a value
   other than -1. */ /* TODO: high priority. Support for this feature is
   needed for a conforming implementation */
#define _XOPEN_ENH_I18N (-1)

/* The implementation supports the Legacy Feature Group. */
#define _XOPEN_LEGACY (1)

/* The implementation supports the X/Open Realtime Feature Group. */
/* FIXME? unlikely to be ever supported */
#define _XOPEN_REALTIME (-1)

/* The implementation supports the X/Open Realtime Threads Feature
   Group. */ /* FIXME? really unlikely to be ever supported */
#define _XOPEN_REALTIME_THREADS (-1)

/* The implementation supports the Issue 4, Version 2 Shared Memory
   Feature Group. This is always set to a value other than -1. */ /* TODO:
   high priority. Support for this feature is needed for a conforming
   implementation */
#define _XOPEN_SHM (-1)

/* Implementation provides a C-language compilation environment with
   32-bit int, long, pointer and off_t types. */
#define _XBS5_ILP32_OFF32 (1)

/* Implementation provides a C-language compilation environment with 
   32-bit int, long and pointer types and an off_t type using at
   least 64 bits. */ /* FIXME? check the off_t type */
#define _XBS5_ILP32_OFFBIG (1)

/* Implementation provides a C-language compilation environment with
   32-bit int and 64-bit long, pointer and off_t types. */ /* FIXME: on
   some architectures this may be true */
#define _XBS5_LP64_OFF64 (-1)

/* Implementation provides a C-language compilation environment with
   an int type using at least 32 bits and long, pointer and off_t
   types using at least 64 bits. */ /* FIXME: on some architectures
   this may be true */
#define _XBS5_LPBIG_OFFBIG (-1)

/* Implementation supports the File Synchronisation option. */
/* TODO: high priority. Implement this */
#define _POSIX_FSYNC

/* Implementation supports the Memory Mapped Files option. */
/* TODO: high priority. Implement this */
#define _POSIX_MAPPED_FILES

/* Implementation supports the Memory Protection option. */
/* TODO: high priority. Implement this */
#define _POSIX_MEMORY_PROTECTION

#if 0
/* Implementation supports the Prioritized Input and Output option. */
/* FIXME? unlikely to be ever supported */
#define _POSIX_PRIORITIZED_IO
#endif

/* FIXME: these should be implemented */
/* Asynchronous input or output operations may be performed for the
   associated file. */
#define _POSIX_ASYNC_IO (-1)

/* Prioritized input or output operations may be performed for the
   associated file. */
#define _POSIX_PRIO_IO (-1)

/* Synchronised input or output operations may be performed for the
   associated file. */
#define _POSIX_SYNC_IO (-1)

/*
   null pointer
 */
#ifndef NULL
/* NULL seems to be defined pretty much everywhere - we prevent
   redefinition */
#define NULL ((void *)(0))
#endif

/*
   constants for the access() function
 */

#define R_OK (0x00000004) /* Test for read permission. */
#define W_OK (0x00000002) /*  Test for write permission. */
#define X_OK (0x00000001) /* Test for execute (search) permission. */
#define F_OK (0) /* Test for existence of file. */

/*
  constants for the confstr() function
 */
#define _CS_PATH                        (1)
#define _CS_XBS5_ILP32_OFF32_CFLAGS     (2)
#define _CS_XBS5_ILP32_OFF32_LDFLAGS    (3)
#define _CS_XBS5_ILP32_OFF32_LIBS       (4)
#define _CS_XBS5_ILP32_OFF32_LINTFLAGS  (5)
#define _CS_XBS5_ILP32_OFFBIG_CFLAGS    (6)
#define _CS_XBS5_ILP32_OFFBIG_LDFLAGS   (7)
#define _CS_XBS5_ILP32_OFFBIG_LIBS      (8)
#define _CS_XBS5_ILP32_OFFBIG_LINTFLAGS (9)
#define _CS_XBS5_LP64_OFF64_CFLAGS      (10)
#define _CS_XBS5_LP64_OFF64_LDFLAGS     (11)
#define _CS_XBS5_LP64_OFF64_LIBS        (12)
#define _CS_XBS5_LP64_OFF64_LINTFLAGS   (13)
#define _CS_XBS5_LPBIG_OFFBIG_CFLAGS    (14)
#define _CS_XBS5_LPBIG_OFFBIG_LDFLAGS   (15)
#define _CS_XBS5_LPBIG_OFFBIG_LIBS      (16)
#define _CS_XBS5_LPBIG_OFFBIG_LINTFLAGS (17)

/*
 constants for the lseek() and fcntl() functions
 */

#define SEEK_SET (0) /* Set file offset to offset. */
#define SEEK_CUR (1) /* Set file offset to current plus offset. */
#define SEEK_END (2) /* Set file offset to EOF plus offset. */

/*
  constants for pathconf()
 */
/* constants 1 to 9 are the same as in Microsoft POSIX */
#define _PC_LINK_MAX		         (  1)
#define _PC_MAX_CANON 		       (  2)
#define _PC_MAX_INPUT		        (  3)
#define _PC_NAME_MAX		         (  4)
#define _PC_PATH_MAX		         (  5)
#define _PC_PIPE_BUF		         (  6)
#define _PC_CHOWN_RESTRICTED 	 (  7)
#define _PC_NO_TRUNC		         (  8)
#define _PC_VDISABLE		         (  9)
/* from this point, constants are in no particular order */
#define _PC_ALLOC_SIZE_MIN     ( 10)
#define _PC_ASYNC_IO           ( 11)
#define _PC_FILESIZEBITS       ( 12)
#define _PC_PRIO_IO            ( 13)
#define _PC_REC_INCR_XFER_SIZE ( 14)
#define _PC_REC_MAX_XFER_SIZE  ( 15)
#define _PC_REC_MIN_XFER_SIZE  ( 16)
#define _PC_REC_XFER_ALIGN     ( 17)
#define _PC_SYNC_IO            ( 18)

/*
  constants for sysconf()
 */
/* constants 1 to 10 are the same as in Microsoft POSIX */
#define _SC_ARG_MAX                      (  1)
#define _SC_CHILD_MAX                    (  2)
#define _SC_CLK_TCK                      (  3)
#define _SC_NGROUPS_MAX                  (  4)
#define _SC_OPEN_MAX                     (  5)
#define _SC_JOB_CONTROL                  (  6)
#define _SC_SAVED_IDS                    (  7)
#define _SC_STREAM_MAX                   (  8)
#define _SC_TZNAME_MAX                   (  9)
#define _SC_VERSION                      ( 10)
/* from this point, constants are in no particular order */
#define _SC_2_C_BIND                     ( 11)
#define _SC_2_C_DEV                      ( 12)
#define _SC_2_C_VERSION                  ( 13)
#define _SC_2_FORT_DEV                   ( 14)
#define _SC_2_FORT_RUN                   ( 15)
#define _SC_2_LOCALEDEF                  ( 16)
#define _SC_2_SW_DEV                     ( 17)
#define _SC_2_UPE                        ( 18)
#define _SC_2_VERSION                    ( 19)
#define _SC_AIO_LISTIO_MAX               ( 20)
#define _SC_AIO_MAX                      ( 21)
#define _SC_AIO_PRIO_DELTA_MAX           ( 22)
#define _SC_ASYNCHRONOUS_IO              ( 23)
#define _SC_ATEXIT_MAX                   ( 24)
#define _SC_BC_BASE_MAX                  ( 25)
#define _SC_BC_DIM_MAX                   ( 26)
#define _SC_BC_SCALE_MAX                 ( 27)
#define _SC_BC_STRING_MAX                ( 28)
#define _SC_COLL_WEIGHTS_MAX             ( 29)
#define _SC_DELAYTIMER_MAX               ( 30)
#define _SC_EXPR_NEST_MAX                ( 31)
#define _SC_FSYNC                        ( 32)
#define _SC_GETGR_R_SIZE_MAX             ( 33)
#define _SC_GETPW_R_SIZE_MAX             ( 34)
#define _SC_IOV_MAX                      ( 35)
#define _SC_LINE_MAX                     ( 36)
#define _SC_LOGIN_NAME_MAX               ( 37)
#define _SC_MAPPED_FILES                 ( 38)
#define _SC_MEMLOCK                      ( 39)
#define _SC_MEMLOCK_RANGE                ( 40)
#define _SC_MEMORY_PROTECTION            ( 41)
#define _SC_MESSAGE_PASSING              ( 42)
#define _SC_MQ_OPEN_MAX                  ( 43)
#define _SC_MQ_PRIO_MAX                  ( 44)
#define _SC_PAGE_SIZE                    ( 45)
#define _SC_PASS_MAX                     ( 46) /* LEGACY */
#define _SC_PRIORITIZED_IO               ( 47)
#define _SC_PRIORITY_SCHEDULING          ( 48)
#define _SC_RE_DUP_MAX                   ( 49)
#define _SC_REALTIME_SIGNALS             ( 50)
#define _SC_RTSIG_MAX                    ( 51)
#define _SC_SEMAPHORES                   ( 52)
#define _SC_SEM_NSEMS_MAX                ( 53)
#define _SC_SEM_VALUE_MAX                ( 54)
#define _SC_SHARED_MEMORY_OBJECTS        ( 55)
#define _SC_SIGQUEUE_MAX                 ( 56)
#define _SC_SYNCHRONIZED_IO              ( 57)
#define _SC_THREADS                      ( 58)
#define _SC_THREAD_ATTR_STACKADDR        ( 59)
#define _SC_THREAD_ATTR_STACKSIZE        ( 60)
#define _SC_THREAD_DESTRUCTOR_ITERATIONS ( 61)
#define _SC_THREAD_KEYS_MAX              ( 62)
#define _SC_THREAD_PRIORITY_SCHEDULING   ( 63)
#define _SC_THREAD_PRIO_INHERIT          ( 64)
#define _SC_THREAD_PRIO_PROTECT          ( 65)
#define _SC_THREAD_PROCESS_SHARED        ( 66)
#define _SC_THREAD_SAFE_FUNCTIONS        ( 67)
#define _SC_THREAD_STACK_MIN             ( 68)
#define _SC_THREAD_THREADS_MAX           ( 69)
#define _SC_TIMERS                       ( 70)
#define _SC_TIMER_MAX                    ( 71)
#define _SC_TTY_NAME_MAX                 ( 72)
#define _SC_XOPEN_VERSION                ( 73)
#define _SC_XOPEN_CRYPT                  ( 74)
#define _SC_XOPEN_ENH_I18N               ( 75)
#define _SC_XOPEN_SHM                    ( 76)
#define _SC_XOPEN_UNIX                   ( 77)
#define _SC_XOPEN_XCU_VERSION            ( 78)
#define _SC_XOPEN_LEGACY                 ( 79)
#define _SC_XOPEN_REALTIME               ( 80)
#define _SC_XOPEN_REALTIME_THREADS       ( 81)
#define _SC_XBS5_ILP32_OFF32             ( 82)
#define _SC_XBS5_ILP32_OFFBIG            ( 83)
#define _SC_XBS5_LP64_OFF64              ( 84)
#define _SC_XBS5_LPBIG_OFFBIG            ( 85)


#define _SC_PAGESIZE _SC_PAGE_SIZE

/* possible values for the function argument to the lockf() function */
#define F_LOCK  (1) /* Lock a section for exclusive use. */
#define F_ULOCK (2) /* Unlock locked sections. */
#define F_TEST  (3) /* Test section for locks by other processes. */
#define F_TLOCK (4) /* Test and lock a section for exclusive use. */

#define STDIN_FILENO  (0) /* File number of stdin. */
#define STDOUT_FILENO (1) /* File number of stdout. */
#define STDERR_FILENO (2) /* File number of stderr. */

/* PROTOTYPES */
int          access(const char *, int);
unsigned int alarm(unsigned int);
int          brk(void *);
int          chdir(const char *);
int          chroot(const char *); /* LEGACY */
int          chown(const char *, uid_t, gid_t);
int          close(int);
size_t       confstr(int, char *, size_t);
char        *crypt(const char *, const char *);
char        *ctermid(char *);
char        *cuserid(char *s); /* LEGACY */
int          dup(int);
int          dup2(int, int);
void         encrypt(char[64], int);
int          execl(const char *, const char *, ...);
int          execle(const char *, const char *, ...);
int          execlp(const char *, const char *, ...);
int          execv(const char *, char *const []);
int          execve(const char *, char *const [], char *const []);
int          execvp(const char *, char *const []);
void        _exit(int);
int          fchown(int, uid_t, gid_t);
int          fchdir(int);
int          fdatasync(int);
pid_t        fork(void);
long int     fpathconf(int, int);
int          fsync(int);
int          ftruncate(int, off_t);
char        *getcwd(char *, size_t);
int          getdtablesize(void); /* LEGACY */
gid_t        getegid(void);
uid_t        geteuid(void);
gid_t        getgid(void);
int          getgroups(int, gid_t []);
long         gethostid(void);
char        *getlogin(void);
int          getlogin_r(char *, size_t);
int          getopt(int, char * const [], const char *);
int          getpagesize(void); /* LEGACY */
char        *getpass(const char *); /* LEGACY */
pid_t        getpgid(pid_t);
pid_t        getpgrp(void);
pid_t        getpid(void);
pid_t        getppid(void);
pid_t        getsid(pid_t);
uid_t        getuid(void);
char        *getwd(char *);
int          isatty(int);
int          lchown(const char *, uid_t, gid_t);
int          link(const char *, const char *);
int          lockf(int, int, off_t);
off_t        lseek(int, off_t, int);
int          nice(int);
long int     pathconf(const char *, int);
int          pause(void);
int          pipe(int [2]);
ssize_t      pread(int, void *, size_t, off_t);
int          pthread_atfork(void (*)(void), void (*)(void),
                 void(*)(void));
ssize_t      pwrite(int, const void *, size_t, off_t);
ssize_t      read(int, void *, size_t);
int          readlink(const char *, char *, size_t);
int          rmdir(const char *);
void        *sbrk(intptr_t);
int          setgid(gid_t);
int          setpgid(pid_t, pid_t);
pid_t        setpgrp(void);
int          setregid(gid_t, gid_t);
int          setreuid(uid_t, uid_t);
pid_t        setsid(void);
int          setuid(uid_t);
unsigned int sleep(unsigned int);
void         swab(const void *, void *, ssize_t);
int          symlink(const char *, const char *);
void         sync(void);
long int     sysconf(int);
pid_t        tcgetpgrp(int);
int          tcsetpgrp(int, pid_t);
int          truncate(const char *, off_t);
char        *ttyname(int);
int          ttyname_r(int, char *, size_t);
useconds_t   ualarm(useconds_t, useconds_t);
int          unlink(const char *);
int          usleep(useconds_t);
pid_t        vfork(void);
ssize_t      write(int, const void *, size_t);

/* MACROS */

#endif /* __UNISTD_H_INCLUDED__ */

/* EOF */

