#ifndef _UNISTD_H
#define _UNISTD_H

/* ok, this may be a joke, but I'm working on it */
/* ok, ҲǸЦִ */
// ųָIEEE ׼1003.1 ʵֵİ汾ţһֵ
#define _POSIX_VERSION 198808L

// chown()fchown()ʹڽ̵Ȩޡ/* ֻгûִchown..*/
#define _POSIX_CHOWN_RESTRICTED	/* only root can do a chown (I think..) */
// (NAME_MAX)·󣬶Զضϡ/* ·ضϣ뿴ں˴룩*/
#define _POSIX_NO_TRUNC		/* no pathname truncation (but see in kernel) */
// Žֵֵַֹն˶Ĵ/* ֹ^C ַ */
#define _POSIX_VDISABLE '\0'	/* character to disable things like ^C */
// ÿ̶һset-user-ID һset-group-ID /* ǽֶԴ˽д */
/*#define _POSIX_SAVED_IDS *//* we'll get to this yet */
// ϵͳʵ֧ҵơ /* ǻû֧׼ϣܿ */
/*#define _POSIX_JOB_CONTROL *//* we aren't there quite yet. Soon hopefully */

#define STDIN_FILENO 0		// ׼ļš
#define STDOUT_FILENO 1		// ׼ļš
#define STDERR_FILENO 2		// ׼ļš

#ifndef NULL
#define NULL ((void *)0)	// ָ롣
#endif

/* access *//* ļ */
// ¶ķųaccess()
#define F_OK 0			// ļǷڡ
#define X_OK 1			// ǷִУ
#define W_OK 2			// Ƿд
#define R_OK 4			// Ƿɶ

/* lseek *//* ļָضλ */
// ·ųlseek()fcntl()
#define SEEK_SET 0		// ļдָΪƫֵ
#define SEEK_CUR 1		// ļдָΪǰֵƫֵ
#define SEEK_END 2		// ļдָΪļȼƫֵ

/* _SC stands for System Configuration. We don't use them much */
/* _SC ʾϵͳáǺʹ */
// ķųsysconf()
#define _SC_ARG_MAX 1		// 
#define _SC_CHILD_MAX 2		// ӽ
#define _SC_CLOCKS_PER_SEC 3	// ÿδ
#define _SC_NGROUPS_MAX 4	// 
#define _SC_OPEN_MAX 5		// ļ
#define _SC_JOB_CONTROL 6	// ҵơ
#define _SC_SAVED_IDS 7		// ıʶ
#define _SC_VERSION 8		// 汾

/* more (possibly) configurable things - now pathnames */
/* ģܵģò - · */
// ķųpathconf()
#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_NO_TRUNC 7		// ļضϡ
#define _PC_VDISABLE 8		//
#define _PC_CHOWN_RESTRICTED 9	// ıޡ

#include <sys/stat.h>		// ļ״̬ͷļļļϵͳ״̬ṹstat{}ͳ
#include <sys/times.h>		// ˽ʱṹtms Լtimes()ԭ͡
#include <sys/utsname.h>	// ϵͳƽṹͷļ
#include <utime.h>		// ûʱͷļ˷ʺ޸ʱṹԼutime()ԭ͡

#ifdef __LIBRARY__

// ںʵֵϵͳ÷ųΪϵͳúеֵ( include/linux/sys.h )
#define __NR_setup 0		/* used only by init, to get system going */
/* __NR_setup ڳʼϵͳ */
#define __NR_exit 1
#define __NR_fork 2
#define __NR_read 3
#define __NR_write 4
#define __NR_open 5
#define __NR_close 6
#define __NR_waitpid 7
#define __NR_creat 8
#define __NR_link 9
#define __NR_unlink 10
#define __NR_execve 11
#define __NR_chdir 12
#define __NR_time 13
#define __NR_mknod 14
#define __NR_chmod 15
#define __NR_chown 16
#define __NR_break 17
#define __NR_stat 18
#define __NR_lseek 19
#define __NR_getpid 20
#define __NR_mount 21
#define __NR_umount 22
#define __NR_setuid 23
#define __NR_getuid 24
#define __NR_stime 25
#define __NR_ptrace 26
#define __NR_alarm 27
#define __NR_fstat 28
#define __NR_pause 29
#define __NR_utime 30
#define __NR_stty 31
#define __NR_gtty 32
#define __NR_access 33
#define __NR_nice 34
#define __NR_ftime 35
#define __NR_sync 36
#define __NR_kill 37
#define __NR_rename 38
#define __NR_mkdir 39
#define __NR_rmdir 40
#define __NR_dup 41
#define __NR_pipe 42
#define __NR_times 43
#define __NR_prof 44
#define __NR_brk 45
#define __NR_setgid 46
#define __NR_getgid 47
#define __NR_signal 48
#define __NR_geteuid 49
#define __NR_getegid 50
#define __NR_acct 51
#define __NR_phys 52
#define __NR_lock 53
#define __NR_ioctl 54
#define __NR_fcntl 55
#define __NR_mpx 56
#define __NR_setpgid 57
#define __NR_ulimit 58
#define __NR_uname 59
#define __NR_umask 60
#define __NR_chroot 61
#define __NR_ustat 62
#define __NR_dup2 63
#define __NR_getppid 64
#define __NR_getpgrp 65
#define __NR_setsid 66
#define __NR_sigaction 67
#define __NR_sgetmask 68
#define __NR_ssetmask 69
#define __NR_setreuid 70
#define __NR_setregid 71

// ¶ϵͳǶʽ꺯
// ϵͳú꺯type name(void)
// %0 - eax(__res)%1 - eax(__NR_##name)name ϵͳõƣ __NR_ γ
// ϵͳ÷ųӶϵͳñкָѰַ
// أֵڵ0򷵻ظֵóerrno-1
#define _syscall0(type,name) \
type name(void) \
{ \
long __res; \
__asm__ volatile ( "int $0x80" \	// ϵͳж0x80
:"=a" (__res) \		// ֵ??eax(__res)
:"" (__NR_
##name)); \			// Ϊϵͳжϵú__NR_name
      if (__res >= 0) \		// ֵ>=0ֱӷظֵ
      return (type) __res; errno = -__res; \	// óţ-1
      return -1;}

// 1 ϵͳú꺯type name(atype a)
// %0 - eax(__res)%1 - eax(__NR_name)%2 - ebx(a)
#define _syscall1(type,name,atype,a) \
type name(atype a) \
{ \
long __res; \
__asm__ volatile ( "int $0x80" \
: "=a" (__res) \
: "" (__NR_##name), "b" ((long)(a))); \
if (__res >= 0) \
return (type) __res; \
errno = -__res; \
return -1; \
}

// 2 ϵͳú꺯type name(atype a, btype b)
// %0 - eax(__res)%1 - eax(__NR_name)%2 - ebx(a)%3 - ecx(b)
#define _syscall2(type,name,atype,a,btype,b) \
type name(atype a,btype b) \
{ \
long __res; \
__asm__ volatile ( "int $0x80" \
: "=a" (__res) \
: "" (__NR_##name), "b" ((long)(a)), "c" ((long)(b))); \
if (__res >= 0) \
return (type) __res; \
errno = -__res; \
return -1; \
}

// 3 ϵͳú꺯type name(atype a, btype b, ctype c)
// %0 - eax(__res)%1 - eax(__NR_name)%2 - ebx(a)%3 - ecx(b)%4 - edx(c)
#define _syscall3(type,name,atype,a,btype,b,ctype,c) \
type name(atype a,btype b,ctype c) \
{ \
long __res; \
__asm__ volatile ( "int $0x80" \
: "=a" (__res) \
: "" (__NR_##name), "b" ((long)(a)), "c" ((long)(b)), "d" ((long)(c))); \
if (__res>=0) \
return (type) __res; \
errno=-__res; \
return -1; \
}

#endif /* __LIBRARY__ */

      extern int errno;		// ţȫֱ
// ӦϵͳõĺԭͶ塣
      int access (const char *filename, mode_t mode);
      int acct (const char *filename);
      int alarm (int sec);
      int brk (void *end_data_segment);
      void *sbrk (ptrdiff_t increment);
      int chdir (const char *filename);
      int chmod (const char *filename, mode_t mode);
      int chown (const char *filename, uid_t owner, gid_t group);
      int chroot (const char *filename);
      int close (int fildes);
      int creat (const char *filename, mode_t mode);
      int dup (int fildes);
      int execve (const char *filename, char **argv, char **envp);
      int execv (const char *pathname, char **argv);
      int execvp (const char *file, char **argv);
      int execl (const char *pathname, char *arg0, ...);
      int execlp (const char *file, char *arg0, ...);
      int execle (const char *pathname, char *arg0, ...);
      volatile void exit (int status);
      volatile void _exit (int status);
      int fcntl (int fildes, int cmd, ...);
      int fork (void);
      int getpid (void);
      int getuid (void);
      int geteuid (void);
      int getgid (void);
      int getegid (void);
      int ioctl (int fildes, int cmd, ...);
      int kill (pid_t pid, int signal);
      int link (const char *filename1, const char *filename2);
      int lseek (int fildes, off_t offset, int origin);
      int mknod (const char *filename, mode_t mode, dev_t dev);
      int mount (const char *specialfile, const char *dir, int rwflag);
      int nice (int val);
      int open (const char *filename, int flag, ...);
      int pause (void);
      int pipe (int *fildes);
      int read (int fildes, char *buf, off_t count);
      int setpgrp (void);
      int setpgid (pid_t pid, pid_t pgid);
      int setuid (uid_t uid);
      int setgid (gid_t gid);
      void (*signal (int sig, void (*fn) (int))) (int);
      int stat (const char *filename, struct stat *stat_buf);
      int fstat (int fildes, struct stat *stat_buf);
      int stime (time_t * tptr);
      int sync (void);
      time_t time (time_t * tloc);
      time_t times (struct tms *tbuf);
      int ulimit (int cmd, long limit);
      mode_t umask (mode_t mask);
      int umount (const char *specialfile);
      int uname (struct utsname *name);
      int unlink (const char *filename);
      int ustat (dev_t dev, struct ustat *ubuf);
      int utime (const char *filename, struct utimbuf *times);
      pid_t waitpid (pid_t pid, int *wait_stat, int options);
      pid_t wait (int *wait_stat);
      int write (int fildes, const char *buf, off_t count);
      int dup2 (int oldfd, int newfd);
      int getppid (void); pid_t getpgrp (void); pid_t setsid (void);
#endif
