revert of mass delete of the posix subsystem. perhaps there is hope for it yet.
authorRex Jolliff <rex@lvcablemodem.com>
Tue, 29 Oct 2002 04:45:58 +0000 (04:45 +0000)
committerRex Jolliff <rex@lvcablemodem.com>
Tue, 29 Oct 2002 04:45:58 +0000 (04:45 +0000)
svn path=/trunk/; revision=3674

166 files changed:
posix/Makefile [new file with mode: 0644]
posix/apps/baresh/Makefile [new file with mode: 0644]
posix/apps/baresh/sh.c [new file with mode: 0644]
posix/apps/baresh/sh.rc [new file with mode: 0644]
posix/apps/posixw32/00readme.txt [new file with mode: 0644]
posix/apps/posixw32/Makefile [new file with mode: 0644]
posix/apps/posixw32/console.c [new file with mode: 0644]
posix/apps/posixw32/posixw32.c [new file with mode: 0644]
posix/apps/posixw32/posixw32.h [new file with mode: 0644]
posix/apps/posixw32/posixw32.rc [new file with mode: 0644]
posix/apps/posixw32/readme.txt [new file with mode: 0644]
posix/apps/posixw32/vt100.c [new file with mode: 0644]
posix/apps/posixw32/vt100.h [new file with mode: 0644]
posix/include/aio.h [new file with mode: 0644]
posix/include/arpa/inet.h [new file with mode: 0644]
posix/include/assert.h [new file with mode: 0644]
posix/include/cpio.h [new file with mode: 0644]
posix/include/ctype.h [new file with mode: 0644]
posix/include/dirent.h [new file with mode: 0644]
posix/include/dlfcn.h [new file with mode: 0644]
posix/include/errno.h [new file with mode: 0644]
posix/include/fcntl.h [new file with mode: 0644]
posix/include/fmtmsg.h [new file with mode: 0644]
posix/include/fnmatch.h [new file with mode: 0644]
posix/include/ftw.h [new file with mode: 0644]
posix/include/glob.h [new file with mode: 0644]
posix/include/grp.h [new file with mode: 0644]
posix/include/iconv.h [new file with mode: 0644]
posix/include/inttypes.h [new file with mode: 0644]
posix/include/iso646.h [new file with mode: 0644]
posix/include/libgen.h [new file with mode: 0644]
posix/include/limits.h [new file with mode: 0644]
posix/include/math.h [new file with mode: 0644]
posix/include/netinet/in.h [new file with mode: 0644]
posix/include/psx/debug.h [new file with mode: 0644]
posix/include/psx/dirent.h [new file with mode: 0644]
posix/include/psx/dlfcn.h [new file with mode: 0644]
posix/include/psx/errno.h [new file with mode: 0644]
posix/include/psx/fdtable.h [new file with mode: 0644]
posix/include/psx/interlock.h [new file with mode: 0644]
posix/include/psx/lpcproto.h [new file with mode: 0644]
posix/include/psx/path.h [new file with mode: 0644]
posix/include/psx/pdata.h [new file with mode: 0644]
posix/include/psx/pthread.h [new file with mode: 0644]
posix/include/psx/safeobj.h [new file with mode: 0644]
posix/include/psx/spawn.h [new file with mode: 0644]
posix/include/psx/stdlib.h [new file with mode: 0644]
posix/include/psx/template.h [new file with mode: 0644]
posix/include/psx/tls.h [new file with mode: 0644]
posix/include/pthread.h [new file with mode: 0644]
posix/include/pwd.h [new file with mode: 0644]
posix/include/sched.h [new file with mode: 0644]
posix/include/signal.h [new file with mode: 0644]
posix/include/stdarg.h [new file with mode: 0644]
posix/include/stddef.h [new file with mode: 0644]
posix/include/stdio.h [new file with mode: 0644]
posix/include/stdlib.h [new file with mode: 0644]
posix/include/string.h [new file with mode: 0644]
posix/include/sys/errno.h [new file with mode: 0644]
posix/include/sys/ipc.h [new file with mode: 0644]
posix/include/sys/mman.h [new file with mode: 0644]
posix/include/sys/msg.h [new file with mode: 0644]
posix/include/sys/resource.h [new file with mode: 0644]
posix/include/sys/sem.h [new file with mode: 0644]
posix/include/sys/shm.h [new file with mode: 0644]
posix/include/sys/socket.h [new file with mode: 0644]
posix/include/sys/stat.h [new file with mode: 0644]
posix/include/sys/statvfs.h [new file with mode: 0644]
posix/include/sys/time.h [new file with mode: 0644]
posix/include/sys/timeb.h [new file with mode: 0644]
posix/include/sys/times.h [new file with mode: 0644]
posix/include/sys/types.h [new file with mode: 0644]
posix/include/sys/uio.h [new file with mode: 0644]
posix/include/sys/un.h [new file with mode: 0644]
posix/include/sys/utsname.h [new file with mode: 0644]
posix/include/sys/wait.h [new file with mode: 0644]
posix/include/time.h [new file with mode: 0644]
posix/include/types.h [new file with mode: 0644]
posix/include/ucontext.h [new file with mode: 0644]
posix/include/unistd.h [new file with mode: 0644]
posix/include/utime.h [new file with mode: 0644]
posix/include/wchar.h [new file with mode: 0644]
posix/lib/Makefile [new file with mode: 0644]
posix/lib/crt0w32.c [new file with mode: 0644]
posix/lib/psxdll/Makefile [new file with mode: 0644]
posix/lib/psxdll/csrapi.def [new file with mode: 0644]
posix/lib/psxdll/dirent/closedir.c [new file with mode: 0644]
posix/lib/psxdll/dirent/opendir.c [new file with mode: 0644]
posix/lib/psxdll/dirent/readdir.c [new file with mode: 0644]
posix/lib/psxdll/dlfcn/dlclose.c [new file with mode: 0644]
posix/lib/psxdll/dlfcn/dlerror.c [new file with mode: 0644]
posix/lib/psxdll/dlfcn/dlopen.c [new file with mode: 0644]
posix/lib/psxdll/dlfcn/dlsym.c [new file with mode: 0644]
posix/lib/psxdll/errno/errno.c [new file with mode: 0644]
posix/lib/psxdll/fcntl/fcntl.c [new file with mode: 0644]
posix/lib/psxdll/fcntl/open.c [new file with mode: 0644]
posix/lib/psxdll/libgen/basename.c [new file with mode: 0644]
posix/lib/psxdll/misc/fdtable.c [new file with mode: 0644]
posix/lib/psxdll/misc/heap.c [new file with mode: 0644]
posix/lib/psxdll/misc/init.c [new file with mode: 0644]
posix/lib/psxdll/misc/interlock.c [new file with mode: 0644]
posix/lib/psxdll/misc/main.c [new file with mode: 0644]
posix/lib/psxdll/misc/path.c [new file with mode: 0644]
posix/lib/psxdll/misc/pdata.c [new file with mode: 0644]
posix/lib/psxdll/misc/safeobj.c [new file with mode: 0644]
posix/lib/psxdll/misc/spawn.c [new file with mode: 0644]
posix/lib/psxdll/misc/template.c [new file with mode: 0644]
posix/lib/psxdll/misc/tls.c [new file with mode: 0644]
posix/lib/psxdll/psxdll.def [new file with mode: 0644]
posix/lib/psxdll/psxdll.edf [new file with mode: 0644]
posix/lib/psxdll/psxdll.rc [new file with mode: 0644]
posix/lib/psxdll/pthread/create.c [new file with mode: 0644]
posix/lib/psxdll/pthread/exit.c [new file with mode: 0644]
posix/lib/psxdll/pthread/join.c [new file with mode: 0644]
posix/lib/psxdll/pthread/kill.c [new file with mode: 0644]
posix/lib/psxdll/pthread/mutex.c [new file with mode: 0644]
posix/lib/psxdll/pthread/self.c [new file with mode: 0644]
posix/lib/psxdll/sched/yield.c [new file with mode: 0644]
posix/lib/psxdll/signal/raise.c [new file with mode: 0644]
posix/lib/psxdll/stdlib/abort.c [new file with mode: 0644]
posix/lib/psxdll/stdlib/exit.c [new file with mode: 0644]
posix/lib/psxdll/stdlib/malloc.c [new file with mode: 0644]
posix/lib/psxdll/string/strcoll.c [new file with mode: 0644]
posix/lib/psxdll/string/strdup.c [new file with mode: 0644]
posix/lib/psxdll/string/strerror.c [new file with mode: 0644]
posix/lib/psxdll/sys/stat/chmod.c [new file with mode: 0644]
posix/lib/psxdll/sys/stat/mkdir.c [new file with mode: 0644]
posix/lib/psxdll/sys/stat/mkfifo.c [new file with mode: 0644]
posix/lib/psxdll/sys/stat/mknod.c [new file with mode: 0644]
posix/lib/psxdll/sys/stat/stat.c [new file with mode: 0644]
posix/lib/psxdll/sys/stat/umask.c [new file with mode: 0644]
posix/lib/psxdll/sys/utsname/uname.c [new file with mode: 0644]
posix/lib/psxdll/unistd/access.c [new file with mode: 0644]
posix/lib/psxdll/unistd/close.c [new file with mode: 0644]
posix/lib/psxdll/unistd/dup.c [new file with mode: 0644]
posix/lib/psxdll/unistd/fork.c [new file with mode: 0644]
posix/lib/psxdll/unistd/getcwd.c [new file with mode: 0644]
posix/lib/psxdll/unistd/getpid.c [new file with mode: 0644]
posix/lib/psxdll/unistd/getppid.c [new file with mode: 0644]
posix/lib/psxdll/unistd/read.c [new file with mode: 0644]
posix/lib/psxdll/unistd/sleep.c [new file with mode: 0644]
posix/lib/psxdll/unistd/write.c [new file with mode: 0644]
posix/lib/psxx/misc/main.c [new file with mode: 0644]
posix/lib/psxx/misc/psxx.def [new file with mode: 0644]
posix/lib/psxx/misc/psxx.edf [new file with mode: 0644]
posix/lib/psxx/misc/psxx.rc [new file with mode: 0644]
posix/lib/psxx/misc/stubs.c [new file with mode: 0644]
posix/server/Makefile [new file with mode: 0644]
posix/server/call/_exit.c [new file with mode: 0644]
posix/server/call/null.c [new file with mode: 0644]
posix/server/include/psxss.h [new file with mode: 0644]
posix/server/misc/init.c [new file with mode: 0644]
posix/server/misc/main.c [new file with mode: 0644]
posix/server/misc/print.c [new file with mode: 0644]
posix/server/misc/psxss.rc [new file with mode: 0644]
posix/server/ob/process.c [new file with mode: 0644]
posix/server/ob/session.c [new file with mode: 0644]
posix/server/ob/terminal.c [new file with mode: 0644]
posix/server/port/api.c [new file with mode: 0644]
posix/server/port/sbapi.c [new file with mode: 0644]
posix/server/port/session.c [new file with mode: 0644]
posix/server/port/utils.c [new file with mode: 0644]
posix/server/port/utils.h [new file with mode: 0644]
posix/tools/Makefile [new file with mode: 0644]
posix/tools/mksystab.c [new file with mode: 0644]
posix/tools/syscall.db [new file with mode: 0644]

diff --git a/posix/Makefile b/posix/Makefile
new file mode 100644 (file)
index 0000000..5cd0450
--- /dev/null
@@ -0,0 +1,33 @@
+# $Id: Makefile,v 1.6 2002/10/29 04:44:58 rex Exp $
+#
+# ReactOS POSIX+ Personality
+#
+PATH_TO_TOP=../reactos
+
+CFLAGS=-Iinclude
+
+all: lib/crt0w32.o
+       make -C tools
+       make -C lib
+       make -C server
+       make -C lib/psxdll
+       make -C lib/psxx
+       make -C apps/baresh
+       make -C apps/posixw32
+
+lib/crt0w32.o: lib/crt0w32.c
+
+clean:
+       make -C lib clean
+       make -C tools clean
+       make -C server clean
+       make -C lib/psxdll clean
+       make -C lib/psxx clean
+       make -C apps/baresh clean
+       make -C apps/posixw32 clean
+       - $(RM) lib/crt0w32.o
+
+
+include $(PATH_TO_TOP)/rules.mak
+
+# EOF
diff --git a/posix/apps/baresh/Makefile b/posix/apps/baresh/Makefile
new file mode 100644 (file)
index 0000000..96007da
--- /dev/null
@@ -0,0 +1,47 @@
+# $Id: Makefile,v 1.7 2002/10/29 04:44:59 rex Exp $
+#
+# Tu run it in Win32 console mode, undefine __SUBSYSTEM_WINDOWS__
+# and pass "console" in the ld's --subsystem option.
+# 
+#
+PATH_TO_TOP=../../../reactos
+
+PATH_TO_PSX_TOP=../..
+
+TARGET_NAME=sh
+
+CFLAGS=-D__SUBSYSTEM_WINDOWS__
+
+OBJECTS=$(TARGET_NAME).o $(TARGET_NAME).coff
+
+LIBRARIES=\
+       $(PATH_TO_PSX_TOP)/lib/crt0w32.o \
+       $(PATH_TO_PSX_TOP)/lib/psxdll/psxdll.a
+
+$(TARGET_NAME): $(OBJECTS) $(LIBRARIES)
+       $(CC) \
+               $(CFLAGS) \
+               $(OBJECTS) \
+               $(LIBRARIES)\
+               -o $@ \
+               -Wl,--subsystem,windows\
+               -nostartfiles \
+               -nostdlib
+
+$(TARGET_NAME).coff: $(TARGET_NAME).rc
+       $(RC) \
+               --include-dir $(PATH_TO_TOP)/include \
+               --output-format coff \
+               $< $@ 
+
+clean:
+       - $(RM) *.o
+       - $(RM) *.exe
+       - $(RM) *.coff
+       - $(RM) *.sym
+
+
+
+include $(PATH_TO_TOP)/rules.mak
+
+# EOF
diff --git a/posix/apps/baresh/sh.c b/posix/apps/baresh/sh.c
new file mode 100644 (file)
index 0000000..394b644
--- /dev/null
@@ -0,0 +1,60 @@
+/* $Id: sh.c,v 1.3 2002/10/29 04:44:59 rex Exp $
+ *
+ * baresh - Bare Shell for the PSX subsystem.
+ * Copyright (c) 2002 Emanuele Aliberti
+ * License: GNU GPL v2
+ */
+#include <stdio.h>
+#include <sys/types.h>
+#include <dirent.h>
+
+#define INPUT_BUFFER_SIZE 128
+
+int run=1;
+
+void cmd_exit(char*buf)
+{
+  run=0;
+}
+
+void cmd_pwd(char * buf)
+{
+  char pwd[1024];
+
+  getcwd(pwd,sizeof pwd);
+  printf("%s\n",pwd);
+}
+
+void cmd_ls(char*buf)
+{
+  char pwd[1024];
+  DIR * dir;
+  struct dirent * entry;
+
+  getcwd(pwd,sizeof pwd);
+  dir=opendir(pwd);
+  while (NULL!=(entry=readdir(dir)))
+  {
+    printf("%s\n",entry->d_name);
+  }
+  closedir(dir);
+}
+
+int main(int argc,char*argv[])
+{
+  char buf[INPUT_BUFFER_SIZE];
+
+  while (run)
+  {
+    printf("# ");
+    if (gets(buf))
+    {
+      if (!strcmp("exit",buf))    cmd_exit(buf);
+      else if (!strcmp("pwd",buf)) cmd_pwd(buf);
+      else if (!strcmp("ls",buf)) cmd_ls(buf);
+      else printf("%s: unknown command\n",argv[0]);
+    }
+  }
+  return 0;
+}
+/* EOF */
diff --git a/posix/apps/baresh/sh.rc b/posix/apps/baresh/sh.rc
new file mode 100644 (file)
index 0000000..efc286d
--- /dev/null
@@ -0,0 +1,38 @@
+#include <defines.h>
+#include <reactos/resource.h>
+
+LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US
+
+VS_VERSION_INFO VERSIONINFO
+       FILEVERSION     RES_UINT_FV_MAJOR,RES_UINT_FV_MINOR,RES_UINT_FV_REVISION,RES_UINT_FV_BUILD
+       PRODUCTVERSION  RES_UINT_PV_MAJOR,RES_UINT_PV_MINOR,RES_UINT_PV_REVISION,RES_UINT_PV_BUILD      
+       FILEFLAGSMASK   0x3fL
+#ifdef _DEBUG
+       FILEFLAGS       0x1L
+#else
+       FILEFLAGS       0x0L
+#endif
+       FILEOS          0x40004L
+       FILETYPE        0x2L
+       FILESUBTYPE     0x0L
+BEGIN
+    BLOCK "StringFileInfo"
+    BEGIN
+        BLOCK "040904b0"
+        BEGIN
+            VALUE "CompanyName",       RES_STR_COMPANY_NAME
+            VALUE "FileDescription",   "Bare sh for POSIX+\0"
+            VALUE "FileVersion",       RES_STR_FILE_VERSION
+            VALUE "InternalName",      "sh\0"
+            VALUE "LegalCopyright",    RES_STR_LEGAL_COPYRIGHT
+            VALUE "OriginalFilename",  "sh\0"
+            VALUE "ProductName",       RES_STR_PRODUCT_NAME
+            VALUE "ProductVersion",    RES_STR_PRODUCT_VERSION
+        END
+    END
+    BLOCK "VarFileInfo"
+    BEGIN
+        VALUE "Translation", 0x409, 1200
+    END
+END
+
diff --git a/posix/apps/posixw32/00readme.txt b/posix/apps/posixw32/00readme.txt
new file mode 100644 (file)
index 0000000..4172f56
--- /dev/null
@@ -0,0 +1,90 @@
+08/08/96 - John L. Miller, johnmil@cs.cmu.edu, johnmil@jprc.com
+
+FILES INCLUDED:
+        00readme.txt - this file
+        VT100.H      - Definitions for VT-100 emulator.
+        VT100.C      - Front end parsing code for VT-100 emulator
+        CONSOLE.C    - Back-end code to allow VT-100 in WinNt/Win95 console
+
+Many UNIX users take terminals for granted, as something you get for free
+with the operating system. Unfortunately, this isn't the case for many
+non-unix operating systems, especially PC-based ones. After a number of
+projects, I decided it would be nice if there was source publicly available
+for doing VT-100 emulation.
+
+The files included with this distribution are not a complete implementation
+of VT-100 terminal emulation, but do provide complete enough coverage to
+use many vt-100 functions over the network. For instance, its enough to
+use EMACS to edit, or to connect up to your favorite mud with ANSI color
+and graphics characters.
+
+The VT-100 emulator is broken into two parts. The first is the front end,
+vt100.c and vt100.h. These files were written to be fairly device-independant,
+though admittedly if you're running under a 16-bit operating system instead
+of a 32-bit, you might need to change some of the 'int' values to 'long.'
+Otherwise, it should work 'as-is'.
+
+The second part is a back-end. The back-end is responsible for doing the
+workhorse activities. The front-end parses a character stream, and decides
+whether to clear a part of the screen, or move the cursor, or switch fonts.
+Then it calls routines in the back-end to perform these activities.
+
+The back-end functions are, for the most part, very straight forward, and
+quite easy to implement compared to writing a vt-100 emulator from scratch.
+CONSOLE.C is a back-end for use in console (command, dos) windows under
+Windows 95 and Windows NT. This console vt-100 emulator is also being used
+in my TINTIN-III port and kerberized encrypted telnet port.
+
+
+TO USE THIS VT-100 EMULATOR:
+
+First, it's intended to be linked directly into source code. You'll need
+to change printf's and puts' in your source code to call vtprintf() and
+vtputs() instead. You can add additional functions to vt100.c as you see
+fit to handle other output functions like putchar() and write(). Another
+routine you may want to use is vtProcessedTextOut(), which accepts a
+buffer to output, and a count of characters in that buffer.
+
+Second, you need to make sure that your source code calls vtInitVT100()
+before it does ANYTHING else. This initializes the vt-100 emulator.
+
+Third, if you want to use this VT-100 emulator with anything besides
+Windows NT and Windows 95 consoles, you'll need to implement your own
+back end. The list of functions you will need to supply, as well as what
+they need to do is contained in vt100.h. The list (minus descriptions)
+is as follows:
+
+    int beInitVT100Terminal();
+    int beAbsoluteCursor(int row, int col);
+    int beOffsetCursor(int row, int column);
+    int beRestoreCursor(void);
+    int beSaveCursor(void);
+    int beSetTextAttributes(int fore, int back);
+    int beRawTextOut(char *text, int len);
+    int beEraseText(int rowFrom, int colFrom, int rowTo, int colTo);
+    int beDeleteText(int rowFrom, int colFrom, int rowTo, int colTo);
+    int beInsertRow(int row);
+    int beTransmitText(char *text, int len);
+    int beAdvanceToTab(void);
+    int beClearTab(int col);
+    int beSetScrollingRows(int fromRow, int toRow);
+    int beRingBell(void);
+    int beGetTermMode();
+    int beSetTermMode(int newMode);
+
+For details on what each of these does, read the descriptions of each
+function included in vt100.h, and read over CONSOLE.C for examples. I've
+included copious comments in all of these files to try to make them as
+easy to use as possible.
+
+In any case, it should be easier than writing a VT-100 emulator from
+scratch.
+
+KNOWN BUGS -
+
+o Many features of VT-100 emulation aren't implemented. This includes
+  support for graphics character set 0 and many of the
+  answerback functions.
+
+Well, good luck!
+
diff --git a/posix/apps/posixw32/Makefile b/posix/apps/posixw32/Makefile
new file mode 100644 (file)
index 0000000..cc9059b
--- /dev/null
@@ -0,0 +1,23 @@
+# $Id: Makefile,v 1.3 2002/10/29 04:44:59 rex Exp $
+#
+# Win32 Terminal Emulator for the POSIX+ subsystem.
+#
+PATH_TO_TOP=../../../reactos
+PATH_TO_TOP_PSX=../..
+
+TARGET_NAME=posixw32
+TARGET_TYPE=program
+TARGET_APPTYPE=console
+TARGET_CFLAGS =-I$(PATH_TO_TOP_PSX)/include
+TARGET_SDKLIBS=ntdll.a kernel32.a
+TARGET_OBJECTS=\
+       $(TARGET_NAME).o \
+       console.o \
+       vt100.o \
+       $(TARGET_NAME).coff
+
+include $(PATH_TO_TOP)/rules.mak
+
+include $(TOOLS_PATH)/helper.mk
+
+# EOF
diff --git a/posix/apps/posixw32/console.c b/posix/apps/posixw32/console.c
new file mode 100644 (file)
index 0000000..66702c4
--- /dev/null
@@ -0,0 +1,1243 @@
+/* console.c
+ *
+ * AUTHOR:  John L. Miller, johnmil@cs.cmu.edu / johnmil@jprc.com
+ * DATE:    8/4/96
+ *
+ * Copyright (c) 1996 John L. Miller
+ *
+ * Full permission is granted to use, modify and distribute
+ * this code, provided:
+ * 1) This comment field is included in its entirity
+ * 2) No money is charged for any work including or based on
+ *    portions of this code.
+ *
+ * If you're a nice person and find this useful, I'd appreciate a
+ * note letting me know about it. e-mail is usually what spurs me
+ * on to improve and support software I've written.
+ *
+ * This file contains functions intended to provide the back
+ * end to a console window for my semi-vt100 emulator.
+ */
+
+/* Note - one HUGE difference between console windows and terminal
+ * windows. Console windows displays start at (0,0). Terminal displays
+ * start at (1,1). YUCK!
+ */
+
+#include <windows.h>
+#include "vt100.h"
+
+int topScrollRow=TOP_EDGE;
+int bottomScrollRow=BOTTOM_EDGE;
+
+/* This variable will contain terminal configuration flags, such as 
+ * reverse/standard video, whether wrapping is enabled, and so on.
+ */
+int conTermMode;
+
+/* Variable to hold the cursor position for save/restore cursor calls */
+COORD cursorPosSave={1,1};
+
+/* Handles to the current console for input and output */
+HANDLE hConIn, hConOut;
+
+/* Array of all the tabs which are currently set. Ironically, I think the
+ * primary emulator can CLEAR tags, but not set them.
+ */
+int tabSet[132]={0};
+int numTabs = 0;
+
+
+/* This section contains console-specific color information. NT consoles can
+ * have Red, blue, green, and intensity flags set. Hence, 4 con_colors.
+ */
+#define NUM_CON_COLORS 4
+
+/* Foreground and background colors are separated out */
+int conForeColors, conBackColors;
+
+/* mapping between foreground and background console colors: needed
+ * when reverse video is being used 
+ */
+int conColorMapping[NUM_CON_COLORS][2] = 
+{
+    {FOREGROUND_RED, BACKGROUND_RED},
+    {FOREGROUND_BLUE, BACKGROUND_BLUE},
+    {FOREGROUND_GREEN, BACKGROUND_GREEN},
+    {FOREGROUND_INTENSITY, BACKGROUND_INTENSITY}
+};
+
+
+/* Device-independant foreground and background flags stored here.
+ * probably a bad division of labor, but hey, since we don't use
+ * all of their flags in our console stuff (and hence can't retrieve
+ * them), the information has to live SOMEWHERE.
+ */
+
+int scForeFlags, scBackFlags;
+
+/* Defines for array indexing for translation of flags */
+#define SC_FLAG      0
+#define CONSOLE_FLAG 1
+
+/* Color mapping between SC (the vt-100 emulator device independant
+ * flags) and NT console character specific flags. Flags which have no analog
+ * are set to 0. Note that all global character attributes (character set
+ * underline, bold, reverse) are all stored in foreground only 
+ */
+const int scForeMapping[NUM_SC_ATTRIBUTES][2] =
+{
+    {SC_RED,FOREGROUND_RED},
+    {SC_GREEN,FOREGROUND_GREEN},
+    {SC_BLUE,FOREGROUND_BLUE},
+    {SC_BOLD,FOREGROUND_INTENSITY},
+    {SC_UL,0},
+    {SC_BL,0},
+    {SC_RV,0},
+    {SC_ASCII,0},
+    {SC_G0,0},
+    {SC_G1,0},
+    {SC_GRAPHICS,0}
+};
+
+/* Background color mapping between SC and console */
+const int scBackMapping[NUM_SC_ATTRIBUTES][2] =
+{
+    {SC_RED,BACKGROUND_RED},
+    {SC_GREEN,BACKGROUND_GREEN},
+    {SC_BLUE,BACKGROUND_BLUE},
+    {SC_BOLD,BACKGROUND_INTENSITY},
+    {SC_UL,0},
+    {SC_BL,0},
+    {SC_RV,0},
+    {SC_ASCII,0},
+    {SC_G0,0},
+    {SC_G1,0},
+    {SC_GRAPHICS,0}
+};
+
+/* These arrays map character vals 0-255 to new values.
+ * Since the G0 and G1 character sets don't have a direct analog in
+ * NT, I'm settling for replacing the ones I know what to set them
+ * to.
+ */
+char G0Chars[256];
+char G1Chars[256];
+
+/* These four sets of variables are just precomputed combinations of
+ * all the possible flags to save time for masking.
+ */
+int allFore[2], allBack[2];
+int bothFore[2], bothBack[2];
+
+
+/* FORWARD DECLARATIONS */
+int
+RawPrintLine(
+    char *text,
+    int len,
+    int scrollAtEnd
+    );
+
+int
+Scroll(
+    int row
+    );
+/* END FORWARD DECLARATIONS */
+
+
+
+/* beInitVT100Terminal() - 
+ *
+ * This function is called by the VT100 emulator as soon as the 
+ * front-end terminal is initialized. It's responsible for setting
+ * initial state of the terminal, and initing our many wacky variables.
+ */
+
+int
+beInitVT100Terminal()
+{
+    int i;
+    CONSOLE_SCREEN_BUFFER_INFO csbi;
+
+    /* Set tabs to every 8 spaces initially */
+    numTabs = 0;
+    for (numTabs=0; numTabs < 132/8; numTabs++)
+        tabSet[numTabs] = (numTabs+1)*8;
+
+    /* Init the cursor save position to HOME */
+    cursorPosSave.X = 1;
+    cursorPosSave.Y = 1;
+
+    /* Disable scrolling window limits */
+    topScrollRow=TOP_EDGE;
+    bottomScrollRow=BOTTOM_EDGE;
+
+    conTermMode = ANSI_MODE|WRAP_MODE|REPEAT_MODE;
+
+    hConIn  = GetStdHandle(STD_INPUT_HANDLE);
+    hConOut = GetStdHandle(STD_OUTPUT_HANDLE);
+
+    /* Init our time-saving mask variables */
+    allFore[SC_FLAG]       = allBack[SC_FLAG]       = 0;
+    allFore[CONSOLE_FLAG]  = allBack[CONSOLE_FLAG]  = 0;
+    bothFore[SC_FLAG]      = bothBack[SC_FLAG]      = 0;
+    bothFore[CONSOLE_FLAG] = bothBack[CONSOLE_FLAG] = 0;
+
+    for (i=0; i<NUM_SC_ATTRIBUTES; i++)
+    {
+        allFore[SC_FLAG]      |= scForeMapping[i][SC_FLAG];
+        allFore[CONSOLE_FLAG] |= scForeMapping[i][CONSOLE_FLAG];
+        allBack[SC_FLAG]      |= scBackMapping[i][SC_FLAG];
+        allBack[CONSOLE_FLAG] |= scBackMapping[i][CONSOLE_FLAG];
+
+        if (scForeMapping[i][SC_FLAG] && scForeMapping[i][CONSOLE_FLAG])
+        {
+            bothFore[SC_FLAG]      |= scForeMapping[i][SC_FLAG];
+            bothFore[CONSOLE_FLAG] |= scForeMapping[i][CONSOLE_FLAG];
+        }
+
+        if (scBackMapping[i][SC_FLAG] && scBackMapping[i][CONSOLE_FLAG])
+        {
+            bothBack[SC_FLAG]      |= scBackMapping[i][SC_FLAG];
+            bothBack[CONSOLE_FLAG] |= scBackMapping[i][CONSOLE_FLAG];
+        }
+    }
+
+    conForeColors = conBackColors = 0;
+
+    for (i=0; i<NUM_CON_COLORS; i++)
+    {
+        conForeColors |= conColorMapping[i][0];
+        conBackColors |= conColorMapping[i][1];
+    }
+
+
+    /* Do initial settings for device-independant flags */
+    scForeFlags = SC_ASCII;
+    scBackFlags = 0;
+
+    GetConsoleScreenBufferInfo(hConOut, &csbi);
+
+    for (i=0; i<NUM_SC_ATTRIBUTES; i++)
+    {
+        if (csbi.wAttributes & scForeMapping[i][CONSOLE_FLAG])
+            scForeFlags |= scForeMapping[i][SC_FLAG];
+
+        if (csbi.wAttributes & scBackMapping[i][CONSOLE_FLAG])
+            scBackFlags |= scBackMapping[i][SC_FLAG];
+    }
+
+
+    /* Since the G0/G1 character sets don't really map to
+     * USASCII, So come as close as we can. By default, it'll
+     * just print the ascii character. For the graphics characters
+     * I was able to identify, change that mapping.
+     */
+
+    for (i=0; i<256; i++)
+    {
+        G0Chars[i] = i;
+        G1Chars[i] = i;
+    }
+
+    G1Chars['a']=(char)177;
+    G1Chars['f']=(char)248;
+    G1Chars['g']=(char)241;
+    G1Chars['j']=(char)217;
+    G1Chars['k']=(char)191;
+    G1Chars['l']=(char)218;
+    G1Chars['m']=(char)192;
+    G1Chars['n']=(char)197;
+    G1Chars['o']=(char)196;
+    G1Chars['p']=(char)196;
+    G1Chars['q']=(char)196;
+    G1Chars['r']=(char)196;
+    G1Chars['s']=(char)196;
+    G1Chars['t']=(char)195;
+    G1Chars['u']=(char)180;
+    G1Chars['v']=(char)193;
+    G1Chars['w']=(char)194;
+    G1Chars['x']=(char)179;
+    G1Chars['y']=(char)243;
+    G1Chars['z']=(char)242;
+
+    return(0);
+}
+
+
+
+/* beAbsoluteCursor -
+ *
+ * Given an input row and column, move the cursor to the 
+ * absolute screen coordinates requested. Note that if the
+ * display window has scrollbars, the column is adjusted
+ * to take that into account, but the row is not. This allows
+ * for large scrollback in terminal windows.
+ *
+ * ROW must be able to accept CUR_ROW, TOP_EDGE, BOTTOM_EDGE,
+ * or a row number.
+ *
+ * COLUMN must be able to accept CUR_COL, LEFT_EDGE, RIGHT_EDGE,
+ * or a column number.
+ */
+
+int
+beAbsoluteCursor(
+    int row,
+    int col
+    )
+{
+    CONSOLE_SCREEN_BUFFER_INFO csbi;
+    COORD cursorPos;
+
+    GetConsoleScreenBufferInfo(hConOut, &csbi);
+
+    if (row == CUR_ROW)
+        row = csbi.dwCursorPosition.Y;
+    else if (row == TOP_EDGE)
+        row = csbi.srWindow.Top;
+    else if (row == BOTTOM_EDGE)
+        row = csbi.srWindow.Bottom;
+    else
+        row += csbi.srWindow.Top - 1;
+
+    if (col == CUR_COL)
+        col = csbi.dwCursorPosition.X;
+    else if (col == LEFT_EDGE)
+        col = 0;
+    else if (col == RIGHT_EDGE)
+        col = csbi.dwSize.X-1;
+    else
+        col -= 1;
+
+    cursorPos.X = col;
+    cursorPos.Y = row;
+
+    SetConsoleCursorPosition(hConOut, cursorPos);
+
+    return(0);
+}
+
+
+/* beOffsetCursor -
+ * 
+ * Given an input row and column offset, move the cursor by that
+ * many positions. For instance, row=0 and column=-1 would move
+ * the cursor left a single column.
+ *
+ * If the cursor can't move the requested amount, results are 
+ * unpredictable.
+ */
+
+int
+beOffsetCursor(
+    int row,
+    int column
+    )
+{
+    CONSOLE_SCREEN_BUFFER_INFO csbi;
+    COORD cursorPos;
+
+    GetConsoleScreenBufferInfo(hConOut, &csbi);
+
+    cursorPos = csbi.dwCursorPosition;
+    cursorPos.X += column;
+    cursorPos.Y += row;
+
+    if (cursorPos.X < 0)
+        cursorPos.X = 0;
+
+    if (cursorPos.X >= csbi.dwSize.X)
+    {
+        cursorPos.X -= csbi.dwSize.X;
+        cursorPos.Y += 1;
+    }
+
+    if (cursorPos.Y < 0)
+        cursorPos.Y = 0;
+
+    SetConsoleCursorPosition(hConOut, cursorPos);
+
+    return(0);
+}
+
+
+/* beRestoreCursor -
+ * 
+ * Saved cursor position should be stored in a static 
+ * variable in the back end. This function restores the 
+ * cursor to the position stored in that variable.
+ */
+
+int
+beRestoreCursor(void)
+{
+    CONSOLE_SCREEN_BUFFER_INFO csbi;
+    COORD cursorPos;
+
+    GetConsoleScreenBufferInfo(hConOut, &csbi);
+
+    cursorPos = csbi.dwCursorPosition;
+
+    cursorPos.Y += cursorPosSave.Y;
+
+    SetConsoleCursorPosition(hConOut, cursorPos);
+
+    return(0);
+}
+
+/* beSaveCursor -
+ *
+ * The back-end should maintain a static variable with the
+ * last STORED cursor position in it. This function replaces
+ * the contents of that variable with the current cursor position.
+ * The cursor may be restored to this position by using the
+ * beRestoreCursor function.
+ */
+
+int
+beSaveCursor(void)
+{
+    CONSOLE_SCREEN_BUFFER_INFO csbi;
+
+    GetConsoleScreenBufferInfo(hConOut, &csbi);
+    cursorPosSave = csbi.dwCursorPosition;
+
+    cursorPosSave.Y -= csbi.srWindow.Top;
+
+    return(0);
+}
+
+
+/* beGetTextAttributes -
+ *
+ * given a pointer to 'fore'ground and 'back'ground ints,
+ * fill them with a device-independant description of the
+ * current foreground and background colors, as well as any
+ * font information in the foreground variable.
+ */
+
+int
+beGetTextAttributes(
+    int *fore,
+    int *back
+    )
+{
+    CONSOLE_SCREEN_BUFFER_INFO csbi;
+    int i;
+
+    /* Since it's entirely possible that the text attributes were
+     * changed without our terminal being notified, we might as well
+     * make sure they're accurate.
+     */
+
+    /* First, strip out everything in the screen buffer variables
+     * that we can detect
+     */
+
+    scForeFlags &= ~bothFore[SC_FLAG];
+    scBackFlags &= ~bothBack[SC_FLAG];
+
+    /* Now, find out what the real settings are, and set the
+     * flag values accordingly.
+     */
+
+    GetConsoleScreenBufferInfo(hConOut, &csbi);
+
+
+    /* If reverse video is set, we need to reverse our color mappings
+     * before any calculations get made.
+     */
+
+    if (scForeFlags & SC_RV)
+    {
+        int tmpFore, tmpBack;
+
+        tmpFore = csbi.wAttributes & conForeColors;
+        tmpBack = csbi.wAttributes & conBackColors;
+
+        csbi.wAttributes &= ~(conForeColors | conBackColors);
+
+        for (i=0; i<NUM_CON_COLORS; i++)
+        {
+            if (tmpFore & conColorMapping[i][0])
+                csbi.wAttributes |= conColorMapping[i][1];
+
+            if (tmpBack & conColorMapping[i][1])
+                csbi.wAttributes |= conColorMapping[i][0];
+        }
+    }
+
+    /* Now, do the actual translation between our detectable
+     * console text attributes and the corresponding device-independant 
+     * attributes.
+     */
+
+    for (i=0; i<NUM_SC_ATTRIBUTES; i++)
+    {
+        if (csbi.wAttributes & scForeMapping[i][CONSOLE_FLAG])
+            scForeFlags |= scForeMapping[i][SC_FLAG];
+
+        if (csbi.wAttributes & scBackMapping[i][CONSOLE_FLAG])
+            scBackFlags |= scBackMapping[i][SC_FLAG];
+    }
+
+    /* Finally, copy our updated sc flags into the variables
+     * passed in
+     */
+
+    if (fore != NULL)
+        *fore = scForeFlags;
+
+    if (back != NULL)
+        *back = scBackFlags;
+
+    return(0);
+}
+
+
+/* beSetTextAttributes -
+ *
+ * Given a foreground and a background device independant (SC) color and font
+ * specification, apply these to the display, and save the state in the 
+ * static screen variables.
+ *
+ * Note that many font-specific constants (bold/underline/reverse, G0/G1/ASCII)
+ * are stored ONLY in the foreground specification.
+ */
+
+int
+beSetTextAttributes(
+    int fore,
+    int back
+    )
+{
+    CONSOLE_SCREEN_BUFFER_INFO csbi;
+    int i;
+    WORD wAttributes;
+
+    /* First off, let's assign these settings into our
+     * device-independant holder.
+     */
+
+    scForeFlags = fore;
+    scBackFlags = back;
+
+    /* Next, determine the console's actual current settings */
+
+    GetConsoleScreenBufferInfo(hConOut, &csbi);
+
+    /* Mask out any of the attributes which can be set via
+     * our device-independant options. Since the console settings
+     * have additional options, we need to retain those so we don't
+     * do something unpleasant to our I/O abilities, for instance.
+     */
+
+    wAttributes = csbi.wAttributes;
+
+    wAttributes &= ~(bothFore[CONSOLE_FLAG] | bothBack[CONSOLE_FLAG]);
+
+    /* Now, loop through the device-independant possibilities for
+     * flags, and modify our console flags as appropriate.
+     */
+
+    for (i=0; i<NUM_SC_ATTRIBUTES; i++)
+    {
+        if (scForeFlags & scForeMapping[i][SC_FLAG])
+            wAttributes |= scForeMapping[i][CONSOLE_FLAG];
+
+        if (scBackFlags & scBackMapping[i][SC_FLAG])
+            wAttributes |= scBackMapping[i][CONSOLE_FLAG];
+    }
+
+    /* One last unpleasantry: if reverse video is set, then we should
+     * reverse the foreground and background colors 
+     */
+
+    if (scForeFlags & SC_RV)
+    {
+        int tmpFore, tmpBack;
+
+        tmpFore = wAttributes & conForeColors;
+        tmpBack = wAttributes & conBackColors;
+
+        wAttributes &= ~(conForeColors | conBackColors);
+
+        for (i=0; i<NUM_CON_COLORS; i++)
+        {
+            if (tmpFore & conColorMapping[i][0])
+                wAttributes |= conColorMapping[i][1];
+
+            if (tmpBack & conColorMapping[i][1])
+                wAttributes |= conColorMapping[i][0];
+        }
+    }
+
+    /* The appropriate colors, etc. should be set in
+     * the wAttributes variable now. Apply them to the
+     * current console.
+     */
+
+    SetConsoleTextAttribute(hConOut, wAttributes);
+
+    return(0);
+}
+
+
+/* beRawTextOut-
+ *
+ * The name of this function is misleading. Given a pointer to
+ * ascii text and a count of bytes to print, print them to the
+ * display device. If wrapping is enabled, wrap text. If there is a
+ * scrolling region set and the cursor is in it,
+ * scroll only within that region. 'beRawTextOut' means that it's guaranteed
+ * not to have control sequences within the text. 
+ */
+
+int
+beRawTextOut(
+    char *text,
+    int len
+    )
+{
+    int i,j;
+
+    /* If there's no work to do, return immediately. */
+    if ((text == NULL)||(len == 0))
+        return(0);
+
+    i=0;
+
+    /* Otherwise, loop through the text until all of it has been output */
+    while (i < len)
+    {
+        /* This inner loop serves to divide the raw text to output into
+         * explicit lines. While the 'RawPrintLine' may still have to
+         * break lines to do text wrapping, explicit line breaks are
+         * handled right here. 
+         */
+        j=i;
+        while ((text[j] != '\n')&&(j<len))
+        {
+            j++;
+        }
+
+        RawPrintLine(text+i, j-i, (text[j] == '\n'));
+
+        i = j+1;
+    }
+
+    return(0);
+}
+
+
+/* RawPrintLine -
+ *
+ * This routine is a helper for beRawTextOut. It is given a
+ * line of text which is guaranteed not to have any newlines
+ * or control characters (which need to be interpreted) in it.
+ * It prints out the text, wrapping if necessary, and handles
+ * scrolling or truncation.
+ *
+ * If scrollAtEnd is true, an extra carriage return (scroll) is
+ * performed after the text has been printed out.
+ */
+
+int
+RawPrintLine(
+    char *text,
+    int len,
+    int scrollAtEnd
+    )
+{
+    int i, end;
+    CONSOLE_SCREEN_BUFFER_INFO csbi;
+    DWORD dwWritten;
+
+    if ((scrollAtEnd == FALSE) && ((text == NULL)||(len == 0)))
+        return(0);
+
+    GetConsoleScreenBufferInfo(hConOut, &csbi);
+
+    /* find out how far to the first tab or end of text */
+
+    if (text != NULL)
+    {
+        for (end=0; end<len; end++)
+        {
+            if (text[end] == '\t')
+                break;
+        }
+
+        if (end > (csbi.dwSize.X - csbi.dwCursorPosition.X))
+            end = (csbi.dwSize.X - csbi.dwCursorPosition.X);
+
+        /* If we're in non-ascii mode, we need to do a little
+         * magic to get the right characters out.
+         */
+
+        if (scForeFlags & SC_G1)
+        {
+            for (i=0; i<end; i++)
+            {
+                text[i] = G1Chars[text[i]];
+            }
+        }
+
+        /* actually print out the text. */
+
+        WriteConsole(hConOut,text,(DWORD)end,&dwWritten,NULL);
+
+        if (end == (csbi.dwSize.X - csbi.dwCursorPosition.X))
+            Scroll(CUR_ROW);
+
+        if (   (!(conTermMode & WRAP_MODE))
+            && (end == (csbi.dwSize.X - csbi.dwCursorPosition.X))
+           )
+            end = len;
+
+        if (end != len)
+        {
+            if (text[end] == '\t')
+            {
+                beAdvanceToTab();
+                RawPrintLine(text+end+1,len - (end+1), FALSE);
+            }
+            else
+            {
+                RawPrintLine(text+end, len-end, FALSE);
+                beAbsoluteCursor(CUR_ROW,1);
+                beOffsetCursor(1,0);
+            }
+        }
+    }
+
+    /* Now that we've printed this line, scroll if we need to.
+     * Note that a scroll implies a newline.
+     */
+
+    if (scrollAtEnd)
+    {
+        Scroll(CUR_ROW);
+        beAbsoluteCursor(CUR_ROW,1);
+        beOffsetCursor(1,0);
+    }
+
+    return(0);
+}
+
+
+/* Scroll -
+ *
+ * Given a row specification, calculate a scroll executed in that
+ * row. It could be within a scroll range, or outside of it.
+ *
+ * For some ungodly reason, I made this routine handle the TOP_EDGE,
+ * BOTTOM_EDGE, and CUR_ROW specifiers as well as a real row.
+ */
+
+int
+Scroll(
+    int row
+    )
+{
+    CONSOLE_SCREEN_BUFFER_INFO csbi;
+    SMALL_RECT scrollRect;
+    COORD dest;
+    CHAR_INFO fillChar;
+
+    GetConsoleScreenBufferInfo(hConOut, &csbi);
+
+    if (row == TOP_EDGE)
+        row = csbi.srWindow.Top;
+    else if (row == BOTTOM_EDGE)
+        row = csbi.srWindow.Bottom;
+    else if (row == CUR_ROW)
+        row = csbi.dwCursorPosition.Y;
+    else
+        row += csbi.srWindow.Top;
+
+    /* Escape out if we don't really need to scroll */
+
+    if ( (row < (csbi.dwSize.Y-1))
+        && ((row-csbi.srWindow.Top + 1) < bottomScrollRow)
+        )
+        return(0);
+
+    /* NT console requires a fill character for scrolling. */
+
+    fillChar.Char.AsciiChar=' ';
+    fillChar.Attributes = csbi.wAttributes;
+
+    /* Determine the rectangle of text to scroll. Under NT this
+     * is actually an overlap-safe block-copy.
+     */
+    scrollRect.Left = 0;
+    scrollRect.Top = 1;
+    scrollRect.Right = csbi.dwSize.X;
+    scrollRect.Bottom = row;
+
+    if (topScrollRow != TOP_EDGE)
+    {
+        scrollRect.Top = csbi.srWindow.Top + topScrollRow + 1;
+    }
+
+    if (   (bottomScrollRow != BOTTOM_EDGE)
+        && ((csbi.srWindow.Top+bottomScrollRow) < scrollRect.Bottom)
+       )
+    {
+        scrollRect.Bottom = csbi.srWindow.Top + bottomScrollRow;
+    }
+
+    dest.X = 0;
+    dest.Y = scrollRect.Top - 1;
+
+    ScrollConsoleScreenBuffer(hConOut,&scrollRect,NULL,
+                              dest, &fillChar);
+
+    return(0);
+}
+
+
+/* beEraseText -
+ *
+ * Given a 'from' and a 'to' position in display coordinates,
+ * this function will fill in all characters between the two
+ * (inclusive) with spaces. Note that the coordinates do NOT
+ * specify a rectangle. erasing from (1,1) to (2,2) erases 
+ * all of the first row, and the first two characters of the
+ * second.
+ *
+ * Note that this routine must be able to handle TOP_EDGE, 
+ * BOTTOM_EDGE, LEFT_EDGE, RIGHT_EDGE, CUR_ROW, and CUR_COL
+ * in the appropriate parameters.
+ */
+
+int
+beEraseText(
+    int rowFrom,
+    int colFrom,
+    int rowTo,
+    int colTo
+    )
+{
+    CONSOLE_SCREEN_BUFFER_INFO csbi;
+    COORD dest, saveCursor;
+    DWORD nLength, dwWritten;
+
+    GetConsoleScreenBufferInfo(hConOut, &csbi);
+
+    saveCursor = csbi.dwCursorPosition;
+
+    /* Convert the row and column specifications into
+     * buffer coordinates
+     */
+    if (rowFrom == CUR_ROW)
+        rowFrom = csbi.dwCursorPosition.Y;
+    else if (rowFrom == TOP_EDGE)
+        rowFrom = csbi.srWindow.Top;
+    else 
+        rowFrom += csbi.srWindow.Top -1;
+
+    if (colFrom == CUR_COL)
+        colFrom = csbi.dwCursorPosition.X;
+    else if (colFrom == LEFT_EDGE)
+        colFrom = 0;
+    else
+        colFrom -= 1;
+
+    if (rowTo == CUR_ROW)
+        rowTo = csbi.dwCursorPosition.Y;
+    else if (rowTo == BOTTOM_EDGE)
+        rowTo = csbi.srWindow.Bottom;
+    else
+        rowTo += csbi.srWindow.Top-1;
+
+    if (colTo == CUR_COL)
+        colTo = csbi.dwCursorPosition.X;
+    else if (colTo == RIGHT_EDGE)
+        colTo = csbi.dwSize.X;
+    else
+        colTo -= 1;
+
+    /* We're going to erase by filling a continuous range of
+     * character cells with spaces. Note that this has displeasing
+     * asthetics under NT, as highlighting appears to be immune.
+     */
+    nLength = (rowTo - rowFrom)*csbi.dwSize.X;
+    nLength += colTo - colFrom;
+
+    dest.X = colFrom;
+    dest.Y = rowFrom;
+
+    FillConsoleOutputCharacter(hConOut, ' ', nLength, dest, &dwWritten);
+    FillConsoleOutputAttribute(hConOut, csbi.wAttributes, nLength, dest, &dwWritten);
+
+    SetConsoleCursorPosition(hConOut, saveCursor);
+
+    return(0);
+}
+
+
+/* beDeleteText -
+ *
+ * Given a screen cursor 'from' and 'to' position, this function
+ * will delete all text between the two. Text will be scrolled
+ * up as appropriate to fill the deleted space. Note that, as in
+ * beEraseText, the two coordinates don't specify a rectangle, but
+ * rather a starting position and ending position. In other words,
+ * deleting from (1,1) to (2,2) should move the text from (2,3) to the
+ * end of the second row to (1,1), move line 3 up to line 2, and so on.
+ *
+ * This function must be able to process TOP_EDGE, BOTTOM_EDGE, LEFT_EDGE,
+ * RIGHT_EDGE, CUR_ROW, and CUR_COL specifications in the appropriate 
+ * variables as well as regular row and column specifications.
+ */
+
+int
+beDeleteText(
+    int rowFrom,
+    int colFrom,
+    int rowTo,
+    int colTo
+    )
+{
+    CONSOLE_SCREEN_BUFFER_INFO csbi;
+    COORD dest, saveCursor;
+    CHAR_INFO fillChar;
+
+    GetConsoleScreenBufferInfo(hConOut, &csbi);
+
+    saveCursor = csbi.dwCursorPosition;
+
+    if (rowFrom == CUR_ROW)
+        rowFrom = csbi.dwCursorPosition.Y;
+    else if (rowFrom == TOP_EDGE)
+        rowFrom = csbi.srWindow.Top;
+    else 
+        rowFrom += csbi.srWindow.Top -1;
+
+    if (colFrom == CUR_COL)
+        colFrom = csbi.dwCursorPosition.X;
+    else if (colFrom == LEFT_EDGE)
+        colFrom = 0;
+    else
+        colFrom -= 1;
+
+    if (rowTo == CUR_ROW)
+        rowTo = csbi.dwCursorPosition.Y;
+    else if (rowTo == BOTTOM_EDGE)
+        rowTo = csbi.srWindow.Bottom;
+    else
+        rowTo += csbi.srWindow.Top-1;
+
+    if (colTo == CUR_COL)
+        colTo = csbi.dwCursorPosition.X;
+    else if (colTo == RIGHT_EDGE)
+        colTo = csbi.dwSize.X;
+    else
+        colTo -= 1;
+
+    fillChar.Char.AsciiChar=' ';
+    fillChar.Attributes = csbi.wAttributes;
+
+    /* Now that we've got the from and to positions
+     * set correctly, we need to delete appropriate
+     * rows and columns.
+     */
+
+    dest.X = colFrom;
+    dest.Y = rowFrom;
+
+    /* BUGBUG - need to implement this. What can I say, I'm lazy :) */
+
+    return(0);
+}
+
+
+/* beInsertRow -
+ *
+ * Given a row number or CUR_ROW, TOP_EDGE or BOTTOM_EDGE as an input, 
+ * this function will scroll all text from the current row down down by one,
+ * and create a blank row under the cursor.
+ */
+
+int
+beInsertRow(
+    int row
+    )
+{
+    CONSOLE_SCREEN_BUFFER_INFO csbi;
+    COORD dest;
+    CHAR_INFO fillChar;
+    SMALL_RECT scrollRect;
+
+    GetConsoleScreenBufferInfo(hConOut, &csbi);
+
+    fillChar.Char.AsciiChar=' ';
+    fillChar.Attributes = csbi.wAttributes;
+
+    if (row == CUR_ROW)
+        row = csbi.dwCursorPosition.Y;
+    else if (row == TOP_EDGE)
+        row = csbi.srWindow.Top;
+    else if (row == BOTTOM_EDGE)
+        row = csbi.srWindow.Bottom;
+    else
+        row += csbi.srWindow.Top-1;
+
+    dest.X = 0;
+    dest.Y = row+1;
+
+    scrollRect.Top = row;
+    scrollRect.Left = 0;
+    scrollRect.Right = csbi.dwSize.X;
+    scrollRect.Bottom = csbi.srWindow.Bottom;
+
+    ScrollConsoleScreenBuffer(hConOut, &scrollRect, NULL, dest, &fillChar);
+
+    return(0);
+}
+
+
+/* beTransmitText -
+ *
+ * Given a pointer to text and byte count, this routine should transmit data 
+ * to whatever host made the request it's responding to. Typically this routin
+ * should transmit data as though the user had typed it in.
+ */
+
+int
+beTransmitText(
+    char *text,
+    int len
+    )
+{
+    if ((text == NULL) || (len < 1))
+        return(0);
+
+    /* BUGBUG - need to implement this. */
+
+    return(0);
+}
+
+
+/* beAdvanceToTab -
+ *
+ * This routine will destructively advance the cursor to the
+ * next set tab, or to the end of the line if there are no
+ * more tabs to the right of the cursor.
+ */
+
+int
+beAdvanceToTab(void)
+{
+    CONSOLE_SCREEN_BUFFER_INFO csbi;
+    int i, col, tocol;
+    COORD dest;
+    DWORD dwWritten;
+
+    GetConsoleScreenBufferInfo(hConOut,&csbi);
+
+    col = csbi.dwCursorPosition.X+1;
+
+    dest = csbi.dwCursorPosition;
+
+    for(i=0; i<numTabs; i++)
+    {
+        if (col < tabSet[i])
+        {
+            tocol = tabSet[i];
+            break;
+        }
+    }
+
+    if (i == numTabs)
+    {
+        tocol = csbi.dwSize.X;
+    }
+
+    FillConsoleOutputCharacter(hConOut, ' ', tocol-col,
+                               dest, &dwWritten);
+    
+    beOffsetCursor(0,tocol-col);
+
+    return(0);
+}
+
+
+/* beClearTab -
+ *
+ * This function accepts a constant, and will try to clear tabs
+ * appropriately. Its argument is either
+ * ALL_TABS, meaning all tabs should be removed
+ * CUR_COL, meaning the tab in the current column should be wiped, or 
+ * a column value, meaning if there's a tab there it should be wiped.
+ *
+ */
+
+int
+beClearTab(
+    int col
+    )
+{
+    int i, j;
+    CONSOLE_SCREEN_BUFFER_INFO csbi;
+
+    if (col == ALL_TABS)
+    {
+        tabSet[0] = 0;
+        numTabs = 0;
+        return(0);
+    }
+
+    if (col == CUR_COL)
+    {
+        GetConsoleScreenBufferInfo(hConOut,&csbi);
+        col = csbi.dwCursorPosition.X+1;
+    }
+
+    for (i=0; i<numTabs; i++)
+    {
+        if (tabSet[i] == col)
+        {
+            numTabs -= 1;
+
+            for (j=i; j<numTabs; j++)
+                tabSet[j]=tabSet[j+1];
+
+            break;
+        }
+    }
+
+    return(0);
+}
+
+/* beSetScrollingRows -
+ *
+ * Given a pair of row numbers, this routine will set the scrolling
+ * rows to those values. Note that this routine will accept
+ * TOP_ROW and BOTTOM_ROW as values, meaning that scrolling should
+ * be enabled for the entire display, regardless of resizing.
+ */
+
+int
+beSetScrollingRows(
+    int fromRow,
+    int toRow
+    )
+{
+    if (fromRow > toRow)
+        return(-1);
+
+    topScrollRow = fromRow;
+    bottomScrollRow = toRow;
+
+    return(0);
+}
+
+
+/* beRingBell -
+ *
+ *  Ring the system bell once.
+ */
+
+int
+beRingBell(void)
+{
+    MessageBeep((UINT)-1);
+    return(0);
+}
+
+
+/* beGetTermMode -
+ * 
+ * Return the value of conTermMode, which is the terminal settings which
+ * can be queried/set by <esc>[?#h/l.
+ */
+
+int
+beGetTermMode()
+{
+    return(conTermMode);
+}
+
+
+/* beSetTermMode -
+ * 
+ * Set the terminal as requested, assuming we can. Right now we only handle a 
+ * couple of the possible flags, but we store many of the others. 
+ */
+
+int beSetTermMode(
+    int newMode
+    )
+{
+    int i, changes;
+    CONSOLE_SCREEN_BUFFER_INFO csbi;
+    COORD newSize;
+    SMALL_RECT newWindowRect;
+    DWORD dwConMode;
+
+    changes = conTermMode ^ newMode;
+
+    /* For each bit set in 'changes', determine the
+     * appropriate course of action.
+     */
+
+    for (i=0; i < NUM_TERM_ATTR_MODES; i++)
+    {
+        if (termAttrMode[i] & changes)
+        {
+            switch(termAttrMode[i])
+            {
+            case COL132_MODE:
+                GetConsoleScreenBufferInfo(hConOut, &csbi);
+                newSize.Y = csbi.dwSize.Y;
+                newSize.X = (newMode & COL132_MODE) ? 132 : 80;
+                if (newSize.X != csbi.dwSize.X)
+                {
+                    newWindowRect.Top = csbi.srWindow.Top;
+                    newWindowRect.Bottom = csbi.srWindow.Bottom;
+                    newWindowRect.Left = 0;
+                    newWindowRect.Right = csbi.dwSize.X - 1;
+                    SetConsoleScreenBufferSize(hConOut, newSize);
+                    SetConsoleWindowInfo(hConOut, TRUE, &newWindowRect);
+                }
+                break;
+
+            case WRAP_MODE:
+                GetConsoleMode(hConOut,&dwConMode);
+                if (   (newMode & WRAP_MODE) 
+                    && (! (dwConMode & ENABLE_WRAP_AT_EOL_OUTPUT))
+                   )
+                {
+                    dwConMode |= ENABLE_WRAP_AT_EOL_OUTPUT;
+                    SetConsoleMode(hConOut, dwConMode);
+                }
+                if (   (!(newMode & WRAP_MODE))
+                    && (dwConMode & ENABLE_WRAP_AT_EOL_OUTPUT)
+                   )
+                {
+                    dwConMode &= ~ENABLE_WRAP_AT_EOL_OUTPUT;
+                    SetConsoleMode(hConOut, dwConMode);
+                }
+                break;
+
+            case CURSORAPPL_MODE:
+            case ANSI_MODE:
+            case SMOOTHSCROLL_MODE:
+            case REVSCREEN_MODE:
+            case ORIGINREL_MODE:
+            case REPEAT_MODE:
+                /* bugbug - we don't handle any of these. */
+                break;
+            }
+        }
+    }
+
+    conTermMode = newMode;
+
+    return(0);
+}
diff --git a/posix/apps/posixw32/posixw32.c b/posix/apps/posixw32/posixw32.c
new file mode 100644 (file)
index 0000000..bd14e63
--- /dev/null
@@ -0,0 +1,610 @@
+/* $Id: posixw32.c,v 1.3 2002/10/29 04:44:59 rex Exp $
+ *
+ * PROJECT    : ReactOS Operating System / POSIX+ Environment Subsystem
+ * DESCRIPTION: POSIXW32 - A DEC VT-100 terminal emulator for the PSX subsystem
+ * DESCRIPTION: that runs in the Win32 subsystem.
+ * COPYRIGHT  :        Copyright (c) 2001-2002 Emanuele Aliberti
+ * LICENSE    : GNU GPL v2
+ * DATE       : 2001-05-05
+ * AUTHOR     : Emanuele Aliberti <ea@iol.it>
+ * NOTE       : This IS a Win32 program, but will fail if the PSX subsystem
+ * NOTE       : is not installed. The PSX subsystem consists of two more
+ * NOTE       : files: PSXSS.EXE, PSXDLL.DLL.
+ * WARNING    : If you use this program under a real NT descendant, be
+ * WARNING    : sure to have disabled the PSX subsystem.
+ * --------------------------------------------------------------------
+ *
+ * This software is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of the
+ * License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this software; see the file COPYING. If not, write
+ * to the Free Software Foundation, Inc., 675 Mass Ave, Cambridge,
+ * MA 02139, USA.  
+ *
+ * --------------------------------------------------------------------
+ * 2002-03-16 EA  Today it actually compiled.
+ * 2002-06-08 EA  Renamed (old name was CSRTERM)
+ */
+#include <windows.h>
+#include <stdio.h>
+#include <stdlib.h>
+
+#define NTOS_MODE_USER
+#include <ntos.h>
+#include <psx/lpcproto.h>
+
+#include "vt100.h"
+#include "posixw32.h"
+
+/*** OPTIONS *********************************************************/
+
+#define PRIVATE static
+
+#define INPUT_QUEUE_SIZE 32
+
+#ifdef NDEBUG
+#define TRACE
+#else
+#define TRACE OutputDebugString(__FUNCTION__)
+#endif
+
+/*** GLOBALS *********************************************************/
+
+PRIVATE LPCSTR MyName = "POSIXW32";
+PRIVATE CSRTERM_SESSION  Session =
+{
+    0, //Identifier
+    {  //ServerPort
+        {0,0,NULL},
+        L"\\"PSX_NS_SUBSYSTEM_DIRECTORY_NAME"\\"PSX_NS_SESSIONAPI_PORT_NAME,
+        INVALID_HANDLE_VALUE
+    }
+};
+
+/*** PRIVATE FUNCTIONS ***********************************************/
+VOID STDCALL Debug_Print (LPCSTR Format, ...)
+{
+    CHAR    Buffer [512];
+    va_list ArgumentPointer;
+   
+    va_start(ArgumentPointer, Format);
+    vsprintf(Buffer, Format, ArgumentPointer);
+    va_end(ArgumentPointer);
+    OutputDebugStringA (Buffer);
+}
+/**********************************************************************
+ *     OutPort/2                                               PRIVATE
+ *
+ * DESCRIPTION
+ *     Notify to PSXSS that input data is ready by sending a
+ *     software interrupt on the \POSIX+\SessionPort port.
+ */
+PRIVATE DWORD STDCALL OutPort (PCHAR Buffer, ULONG Size)
+{
+    NTSTATUS           Status;
+    PSX_TERMINAL_READ  TerminalRead;
+TRACE;
+    if (Size > 0)
+    {
+        /* LPC */
+       TerminalRead.Header.MessageType = LPC_NEW_MESSAGE;
+       TerminalRead.PsxHeader.Context = PSX_CONNECTION_TYPE_TERMINAL;
+       TerminalRead.PsxHeader.Procedure = PSX_TERMINAL_INTERRUPT;
+       /* Terminal I/O */
+        TerminalRead.Size = Size;
+#if 0
+        RtlCopyMemory (TerminalRead.Buffer, Buffer, Size);
+        Status = NtRequestWaitReplyPort (
+                       Session.ServerPort.Handle,
+                       & TerminalRead
+                       /* FIXME */
+                       );
+#endif
+        if (!NT_SUCCESS(Status))
+        {
+                vtprintf ("%s: %s: NtRequestWaitReplyPort failed with %08x\n",
+                    MyName, __FUNCTION__, Status);
+                return 0;
+       }
+    }
+    return Size;
+}
+/**********************************************************************
+ *     ProcessConnectionRequest/1                              PRIVATE
+ *
+ * DESCRIPTION
+ *     Initialize our data for managing the control connection
+ *     initiated by the PSXSS.EXE process.
+ */
+PRIVATE NTSTATUS STDCALL ProcessConnectionRequest (PLPC_MAX_MESSAGE Request)
+{
+    PPSX_CONNECT_PORT_DATA ConnectData = (PPSX_CONNECT_PORT_DATA) & Request->Data;
+
+TRACE;
+    if (PSX_CONNECTION_TYPE_SERVER != ConnectData->ConnectionType)
+    {
+        
+        return STATUS_UNSUCCESSFUL;
+    }
+    if (PSX_LPC_PROTOCOL_VERSION != ConnectData->Version)
+    {
+        
+        return STATUS_UNSUCCESSFUL;
+    }
+    Session.SsLinkIsActive = TRUE;
+    return STATUS_SUCCESS;
+}
+/**********************************************************************
+ *     ProcessRequest/1                                        PRIVATE
+ *
+ * DESCRIPTION
+ *
+ */
+PRIVATE NTSTATUS STDCALL ProcessRequest (PPSX_MAX_MESSAGE Request)
+{
+TRACE;
+    /* TODO */
+    vtprintf("TEST VT-100\n");
+
+    return STATUS_SUCCESS;
+}
+/**********************************************************************
+ *     PsxSessionPortListener/1                                PRIVATE
+ *
+ * DESCRIPTION
+ *     Manage messages from the PSXSS, that is LPC messages we get 
+ *     from the PSXSS process to our \POSIX+\Sessions\P<pid> port.
+ *
+ * NOTE
+ *     This function is the thread 's entry point created in
+ *     CreateSessionObiects().
+ */
+PRIVATE DWORD STDCALL PsxSessionPortListener (LPVOID Arg)
+{
+    NTSTATUS         Status;
+    LPC_TYPE         RequestType;
+    PSX_MAX_MESSAGE  Request;
+    PPSX_MAX_MESSAGE Reply = NULL;
+    BOOL             NullReply = FALSE;
+
+TRACE;
+
+    while (TRUE)
+    {
+        Reply = NULL;
+        NullReply = FALSE;
+        while (!NullReply)
+        {
+            Status = NtReplyWaitReceivePort (
+                        Session.Port.Handle,
+                        0,
+                        (PLPC_MESSAGE) Reply,
+                        (PLPC_MESSAGE) & Request
+                        );
+            if (!NT_SUCCESS(Status))
+            {
+                break;
+            }
+            RequestType = PORT_MESSAGE_TYPE(Request);
+            switch (RequestType)
+            {
+            case LPC_CONNECTION_REQUEST:
+                ProcessConnectionRequest ((PLPC_MAX_MESSAGE) & Request);
+                NullReply = TRUE;
+                continue;
+            case LPC_CLIENT_DIED:
+            case LPC_PORT_CLOSED:
+            case LPC_DEBUG_EVENT:
+            case LPC_ERROR_EVENT:
+            case LPC_EXCEPTION:
+                NullReply = TRUE;
+                continue;
+            default:
+                if (RequestType != LPC_REQUEST)
+                {
+                    NullReply = TRUE;
+                    continue;
+                }
+            }
+            Reply = & Request;
+            Reply->PsxHeader.Status = ProcessRequest (& Request);
+            NullReply = FALSE;
+        }
+        if ((STATUS_INVALID_HANDLE == Status) ||
+            (STATUS_OBJECT_TYPE_MISMATCH == Status))
+        {
+            break;
+        }
+    }
+    Session.SsLinkIsActive = FALSE;
+    TerminateThread (GetCurrentThread(), Status);
+}
+/**********************************************************************
+ *     CreateSessionObiects/1                                  PRIVATE
+ *
+ * DESCRIPTION
+ *     Create the session objects which are mananged by our side:
+ *
+ *     \POSIX+\Sessions\P<pid>
+ *     \POSIX+\Sessions\D<pid>
+ */
+PRIVATE NTSTATUS STDCALL CreateSessionObjects (DWORD Pid)
+{
+    NTSTATUS          Status;
+    ULONG             Id = 0;
+    OBJECT_ATTRIBUTES Oa;
+    LARGE_INTEGER     SectionSize =  {PSX_TERMINAL_SECTION_SIZE,0};
+
+TRACE;
+
+
+    /* Critical section */
+    Status = RtlInitializeCriticalSection (& Session.Lock);
+    if (!NT_SUCCESS(Status))
+    {
+        vtprintf (
+            "%s: %s: RtlInitializeCriticalSection failed with %08x\n",
+            MyName, __FUNCTION__, Status);
+        return Status;
+    }
+    /* Port and port management thread */
+    swprintf (
+        Session.Port.NameBuffer,
+        PSX_NS_SESSION_PORT_TEMPLATE,
+        PSX_NS_SUBSYSTEM_DIRECTORY_NAME,
+        PSX_NS_SESSION_DIRECTORY_NAME,
+        Pid
+        );
+    OutputDebugStringW(Session.Port.NameBuffer);
+    RtlInitUnicodeString (& Session.Port.Name, Session.Port.NameBuffer);
+    InitializeObjectAttributes (& Oa, & Session.Port.Name, 0, NULL, NULL);
+    Status = NtCreatePort (& Session.Port.Handle, & Oa, 0, 0, 0x10000);
+    if (!NT_SUCCESS(Status))
+    {
+        RtlDeleteCriticalSection (& Session.Lock);
+        vtprintf ("%s: %s: NtCreatePort failed with %08x\n",
+            MyName, __FUNCTION__, Status);
+        return Status;
+    }
+    Session.Port.Thread.Handle =
+        CreateThread (
+            NULL,
+            0,
+            PsxSessionPortListener,
+            0,
+            CREATE_SUSPENDED,
+            & Session.Port.Thread.Id
+            );
+    if ((HANDLE) NULL == Session.Port.Thread.Handle)
+    {
+        Status = (NTSTATUS) GetLastError();
+        NtClose (Session.Port.Handle);
+        RtlDeleteCriticalSection (& Session.Lock);
+        vtprintf ("%s: %s: CreateThread failed with %d\n",
+            MyName, __FUNCTION__, Status);
+        return Status;
+    }
+    /* Section */
+    swprintf (
+        Session.Section.NameBuffer,
+        PSX_NS_SESSION_DATA_TEMPLATE,
+        PSX_NS_SUBSYSTEM_DIRECTORY_NAME,
+        PSX_NS_SESSION_DIRECTORY_NAME,
+        Pid
+    );
+    OutputDebugStringW(Session.Section.NameBuffer);
+    RtlInitUnicodeString (& Session.Section.Name, Session.Section.NameBuffer); 
+    InitializeObjectAttributes (& Oa, & Session.Section.Name, 0, 0, 0);
+    Status = NtCreateSection (
+                & Session.Section.Handle,
+                SECTION_ALL_ACCESS, /* DesiredAccess */
+                & Oa,
+                & SectionSize,
+                PAGE_READWRITE, /* Protect 4 */
+                SEC_COMMIT, /* Attributes */
+                0 /* FileHandle: 0=pagefile.sys */
+                );
+    if (!NT_SUCCESS(Status))
+    {
+        NtClose (Session.Port.Handle);
+        NtTerminateThread (Session.Port.Thread.Handle, Status);
+        RtlDeleteCriticalSection (& Session.Lock);
+        vtprintf ("%s: %s: NtCreateSection failed with %08x\n",
+            MyName, __FUNCTION__, Status);
+        return Status;
+    }
+    Session.Section.BaseAddress = NULL;
+    Session.Section.ViewSize = SectionSize.u.LowPart;
+    Status = NtMapViewOfSection (
+                Session.Section.Handle,
+                NtCurrentProcess(),
+                & Session.Section.BaseAddress,
+                0, /* ZeroBits */
+                0, /* Commitsize */
+                0, /* SectionOffset */
+                & Session.Section.ViewSize,
+                ViewUnmap,
+                0, /* AllocationType */
+                PAGE_READWRITE /* Protect 4 */
+                );
+    if (!NT_SUCCESS(Status))
+    {
+        NtClose (Session.Port.Handle);
+        NtTerminateThread (Session.Port.Thread.Handle, Status);
+        NtClose (Session.Section.Handle);
+        RtlDeleteCriticalSection (& Session.Lock);
+        vtprintf ("%s: %s: NtMapViewOfSection failed with %08x\n",
+        MyName, __FUNCTION__, Status);
+        return Status;
+    }
+    return Status;
+}
+
+/**********************************************************************
+ *     CreateTerminalToPsxChannel/0                            PRIVATE
+ *
+ * DESCRIPTION
+ *
+ */
+PRIVATE NTSTATUS STDCALL CreateTerminalToPsxChannel (VOID)
+{
+    PSX_CONNECT_PORT_DATA        ConnectData;
+    ULONG                        ConnectDataLength = sizeof ConnectData;
+    SECURITY_QUALITY_OF_SERVICE  Sqos;
+    NTSTATUS                     Status;
+
+TRACE;
+
+
+    /*
+     * Initialize the connection data object before
+     * calling PSXSS.
+     */
+    ConnectData.ConnectionType = PSX_CONNECTION_TYPE_TERMINAL;
+    ConnectData.Version = PSX_LPC_PROTOCOL_VERSION;
+    /*
+     * Try connecting to \POSIX+\SessionPort.
+     */
+    RtlInitUnicodeString (& Session.ServerPort.Name, Session.ServerPort.NameBuffer);
+    OutputDebugStringW(Session.ServerPort.Name.Buffer);
+    Status = NtConnectPort (
+                & Session.ServerPort.Handle,
+                & Session.ServerPort.Name,
+                & Sqos,
+                NULL,
+                NULL,
+                0,
+                & ConnectData,
+                & ConnectDataLength
+                );
+    if (STATUS_SUCCESS != Status)
+    {
+        vtprintf ("%s: %s: NtConnectPort failed with %08x\n",
+            MyName, __FUNCTION__, Status);
+        return Status;
+    }
+    Session.Identifier = ConnectData.PortIdentifier;
+    return STATUS_SUCCESS;
+}
+
+/**********************************************************************
+ *     InitializeSsIoChannel                                   PRIVATE
+ *
+ * DESCRIPTION
+ *     Create our objects in the system name space
+ *     (CreateSessionObjects) and then connect to the session port
+ *     (CreateControChannel).
+ */
+PRIVATE NTSTATUS STDCALL InitializeSsIoChannel (VOID)
+{
+       NTSTATUS  Status = STATUS_SUCCESS;
+       DWORD     Pid = GetCurrentProcessId();
+
+TRACE;
+
+
+       Status = CreateSessionObjects (Pid);
+       if (STATUS_SUCCESS != Status)
+       {
+               vtprintf ("%s: %s: CreateSessionObjects failed with %08x\n",
+                    MyName, __FUNCTION__, Status);
+               return Status;
+       }
+       Status = CreateTerminalToPsxChannel ();
+       if (STATUS_SUCCESS != Status)
+       {
+               vtprintf ("%s: %s: CreateTerminalToPsxChannel failed with %08x\n",
+                   MyName, __FUNCTION__, Status);
+               return Status;
+       }
+       return STATUS_SUCCESS;
+}
+/**********************************************************************
+ *     PsxCreateLeaderProcess/1                                PRIVATE
+ *
+ * DESCRIPTION
+ *     Create a new PSXSS process.
+ */
+PRIVATE NTSTATUS STDCALL PsxCreateLeaderProcess (char * Command)
+{
+        NTSTATUS Status;
+TRACE;
+
+       if (NULL == Command)
+       {
+               Command = "sh";
+       }
+       /* TODO: request PSXSS to init the process slot */
+       vtprintf ("%s: %s: calling CSRSS not implemented!", MyName, __FUNCTION__);
+       return STATUS_SUCCESS;
+}
+/**********************************************************************
+ *     PrintInformationProcess/0
+ *
+ * DESCRIPTION
+ */
+PRIVATE VOID STDCALL PrintInformationProcess (VOID)
+{
+
+TRACE;
+
+       vtputs ("Leader:");
+       vtprintf ("  UniqueProcess %08x\n", Session.Client.UniqueProcess);
+       vtprintf ("   UniqueThread %08x\n", Session.Client.UniqueThread);
+}
+/**********************************************************************
+ *     PostMortem/0
+ *
+ * DESCRIPTION
+ */
+PRIVATE INT STDCALL PostMortem (VOID)
+{
+       DWORD ExitCode;
+
+TRACE;
+
+
+       PrintInformationProcess ();
+       if (TRUE == GetExitCodeProcess (Session.Client.UniqueProcess, & ExitCode))
+       {
+               vtprintf ("       ExitCode %d\n", ExitCode);
+       }
+       return 0;
+}
+/**********************************************************************
+ *     InputTerminalEmulator/0
+ *
+ * DESCRIPTION
+ *     Process user terminal input.
+ *
+ * NOTE
+ *     This code is run in the main thread.
+ */
+PRIVATE BOOL STDCALL InputTerminalEmulator (VOID)
+{
+    HANDLE        StandardInput;
+    INPUT_RECORD  InputRecord [INPUT_QUEUE_SIZE];
+    DWORD         NumberOfEventsRead = 0;
+    INT           CurrentEvent;
+
+
+TRACE;
+
+    StandardInput = GetStdHandle (STD_INPUT_HANDLE);
+    if (INVALID_HANDLE_VALUE == StandardInput)
+    {
+        return FALSE;
+    }
+    while ((TRUE == Session.SsLinkIsActive) && 
+           ReadConsoleInput (
+            StandardInput,
+            InputRecord,
+           (sizeof InputRecord) / sizeof (INPUT_RECORD),
+           & NumberOfEventsRead
+           ))
+    {
+        for (  CurrentEvent = 0;
+              (CurrentEvent < NumberOfEventsRead);
+              CurrentEvent ++
+              )
+        {
+            switch (InputRecord [CurrentEvent].EventType)
+            {
+            case KEY_EVENT:
+                OutPort (& InputRecord [CurrentEvent].Event.KeyEvent.uChar.AsciiChar, 1);
+               break;
+            case MOUSE_EVENT:
+               /* TODO: send a sequence of move cursor codes */
+                /* InputRecord [CurrentEvent].Event.MouseEvent; */
+               break;
+            case WINDOW_BUFFER_SIZE_EVENT:
+                /* TODO: send a SIGWINCH signal to the leader process. */
+               /* InputRecord [CurrentEvent].Event.WindowBufferSizeEvent.dwSize; */
+               break;
+            /* Next events should be ignored. */
+            case MENU_EVENT:
+               vtprintf ("%s: %s: MENU_EVENT received from CSRSS\n", MyName, __FUNCTION__);
+            case FOCUS_EVENT:
+               vtprintf ("%s: %s: FOCUS_EVENT received from CSRSS\n", MyName, __FUNCTION__);
+               break;
+           }
+        }
+       NumberOfEventsRead = 0;
+    }
+    return TRUE;
+}
+/**********************************************************************
+ *     Startup/1
+ *
+ * DESCRIPTION
+ *     Initialize the program.
+ */
+PRIVATE VOID STDCALL Startup (LPSTR Command)
+{
+       NTSTATUS Status;
+       DWORD    ThreadId;
+
+
+TRACE;
+
+       /* PSX process info */
+       Session.Client.UniqueProcess = INVALID_HANDLE_VALUE;
+       Session.Client.UniqueThread  = INVALID_HANDLE_VALUE;
+       /* Initialize the VT-100 emulator */
+       vtInitVT100 (); 
+       /* Connect to PSXSS */
+       Status = InitializeSsIoChannel ();
+       if (!NT_SUCCESS(Status))
+       {
+               vtprintf ("%s: failed to connect to PSXSS (Status=%08x)!\n",
+                       MyName, Status);
+               exit (EXIT_FAILURE);
+       }
+       /* Create the leading process for this session */
+       Status = PsxCreateLeaderProcess (Command);
+       if (!NT_SUCCESS(Status))
+       {
+               vtprintf ("%s: failed to create the PSX process (Status=%08x)!\n",
+                       MyName, Status);
+               exit (EXIT_FAILURE);
+       }
+}
+/**********************************************************************
+ *     Shutdown/0                                      PRIVATE
+ *
+ * DESCRIPTION
+ *     Shutdown the program.
+ */
+PRIVATE INT STDCALL Shutdown (VOID)
+{
+
+TRACE;
+
+    /* TODO: try exiting cleanly: close any open resource */
+    /* TODO: notify PSXSS the session is terminating */
+    RtlDeleteCriticalSection (& Session.Lock);
+    return PostMortem ();
+}
+/**********************************************************************
+ *
+ *     ENTRY POINT                                     PUBLIC
+ *
+ *********************************************************************/
+int main (int argc, char * argv [])
+{
+
+TRACE;
+
+    Startup (argv[1]); /* Initialization */
+    InputTerminalEmulator (); /* Process user input */
+    return Shutdown ();
+}
+/* EOF */
diff --git a/posix/apps/posixw32/posixw32.h b/posix/apps/posixw32/posixw32.h
new file mode 100644 (file)
index 0000000..d3e1626
--- /dev/null
@@ -0,0 +1,53 @@
+#ifndef _CSRTERM_H
+#define _CSRTERM_H
+
+/* PSX session: CSR terminal emulator side */
+
+#define NAME_BUFFER_SIZE 64
+
+typedef struct _PSXSS_PORT
+{
+    UNICODE_STRING    Name;
+    WCHAR             NameBuffer [NAME_BUFFER_SIZE];
+    HANDLE            Handle;
+
+} PSXSS_PORT, * PPSXSS_PORT;
+
+typedef struct _CSRTERM_SESSION_PORT
+{
+    UNICODE_STRING  Name;
+    WCHAR           NameBuffer [NAME_BUFFER_SIZE];
+    HANDLE          Handle;
+    struct {
+        HANDLE  Handle;
+        DWORD   Id;
+    } Thread;
+
+} CSRTERM_SESSION_PORT;
+
+typedef struct _CSRTERM_SESSION_SECTION
+{
+    UNICODE_STRING  Name;
+    WCHAR           NameBuffer [NAME_BUFFER_SIZE];
+    HANDLE          Handle;
+    ULONG           Size;
+    PVOID           BaseAddress;
+    ULONG           ViewSize;
+
+} CSRTERM_SESSION_SECTION;
+
+typedef struct _CSRTERM_SESSION
+{
+    ULONG                    Identifier; /* PortID for ServerPort in PSXSS */
+    PSXSS_PORT               ServerPort; /* \POSIX+\SessionPort */
+    CSRTERM_SESSION_PORT     Port;       /* \POSIX+\Sessions\P<pid> */
+    CSRTERM_SESSION_SECTION  Section;    /* \POSIX+\Sessions\D<pid> */
+    CLIENT_ID                Client;
+    CRITICAL_SECTION         Lock;
+    BOOL                     SsLinkIsActive;
+
+} CSRTERM_SESSION, * PCSRTERM_SESSION;
+
+#define   LOCK_SESSION RtlEnterCriticalSection(& Session.Lock)
+#define UNLOCK_SESSION RtlLeaveCriticalSection(& Session.Lock)
+#endif /* ndef _CSRTERM_H */
diff --git a/posix/apps/posixw32/posixw32.rc b/posix/apps/posixw32/posixw32.rc
new file mode 100644 (file)
index 0000000..0458d6c
--- /dev/null
@@ -0,0 +1,38 @@
+#include <defines.h>
+#include <reactos/resource.h>
+
+LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US
+
+VS_VERSION_INFO VERSIONINFO
+       FILEVERSION     RES_UINT_FV_MAJOR,RES_UINT_FV_MINOR,RES_UINT_FV_REVISION,RES_UINT_FV_BUILD
+       PRODUCTVERSION  RES_UINT_PV_MAJOR,RES_UINT_PV_MINOR,RES_UINT_PV_REVISION,RES_UINT_PV_BUILD      
+       FILEFLAGSMASK   0x3fL
+#ifdef _DEBUG
+       FILEFLAGS       0x1L
+#else
+       FILEFLAGS       0x0L
+#endif
+       FILEOS          0x40004L
+       FILETYPE        0x2L
+       FILESUBTYPE     0x0L
+BEGIN
+    BLOCK "StringFileInfo"
+    BEGIN
+        BLOCK "040904b0"
+        BEGIN
+            VALUE "CompanyName",       RES_STR_COMPANY_NAME
+            VALUE "FileDescription",   "CSR Terminal Emulator for POSIX+\0"
+            VALUE "FileVersion",       RES_STR_FILE_VERSION
+            VALUE "InternalName",      "csrterm\0"
+            VALUE "LegalCopyright",    RES_STR_LEGAL_COPYRIGHT
+            VALUE "OriginalFilename",  "csrterm.exe\0"
+            VALUE "ProductName",       RES_STR_PRODUCT_NAME
+            VALUE "ProductVersion",    RES_STR_PRODUCT_VERSION
+        END
+    END
+    BLOCK "VarFileInfo"
+    BEGIN
+        VALUE "Translation", 0x409, 1200
+    END
+END
+
diff --git a/posix/apps/posixw32/readme.txt b/posix/apps/posixw32/readme.txt
new file mode 100644 (file)
index 0000000..4a81a20
--- /dev/null
@@ -0,0 +1,80 @@
+$Id: readme.txt,v 1.3 2002/10/29 04:45:05 rex Exp $
+
+posixw32 - a Win32 client terminal emulator for the POSIX+ subsystem
+
+SYNOPSYS
+
+    posixw32 [program]
+
+    program  program to be run in the terminal; if none is given,
+             the shell for the current user (W32 session's) is
+             used.
+
+DESCRIPTION
+
+    posixw32 emulates a DEC VT-100 terminal (on top of the CSRSS
+    subsystem, hence the name) which is the controlling terminal
+    for a process [program] running in the context of the PSX
+    subsystem. posixw32 is a Win32 console application, not a PSX
+    application. The process created by the PSX subsystem on behalf
+    of posixw32 is not the child of the posixw32 instance that
+    requested it. posixw32 simply performs terminal I/O in the CSRSS
+    world (the W32 world!) for [program].
+
+NOTES
+
+    The role of posixw32 is creating a session in the PSX subsystem
+    managing any I/O for it. This is how it works:
+
+    1. posixw32 creates two well known named objects in the system
+       name space that will allow the PSX subsystem server to build
+       the I/O channel for the session. To let the PSX subsystem
+       process recognize the objects, they contain a numeric suffix
+       which is the process identifier (n) the system gives to each
+       instance of posixw32:
+
+           \POSIX+\Session\Pn      LPC port (IPC rendez-vous object)
+           \POSIX+\Session\Dn      section (shared memory object)
+
+       posixw32 also creates a new thread to manage the calls though
+       the LPC port. Port Pn is used by the subsystem to control the
+       terminal which posixw32 emulates.
+
+    2. posixw32 connects to the PSX subsystem session port
+
+           \POSIX+\SessionPort
+
+       and asks the subsystem to create a new session.
+
+    3. The PSX subsystem, if it decides to accept the request, creates
+       a new session for that calling instance of posixw32 (n), and in
+       turn connects back to the terminal control port
+
+           \POSIX+\Session\Pn
+
+    4. When posixw32 makes the PSX subsystem create the new session, it
+       also tells the subsystem what program should be the session
+       leader process. The PSX subsystem creates that process (the
+       image file to start must be marked IMAGE_SUBSYSTEM_POSIX_GUI or
+       IMAGE_SUBSYSTEM_POSIX_CUI).
+
+    5. The requested process [program] runs in the context of the
+       PSX subsystem and performs any terminal I/O via the channel
+       posixw32 and the PSX susbstem created.
+
+REVISIONS
+    2001-05-05 created
+    2002-03-03 simplified
+    2002-06-08 renamed to avoid future name clash
+
+AUTHOR
+
+    Emanuele Aliberti <ea@iol.it>
+
+CREDITS
+
+    John L. Miller (johnmil@cs.cmu.edu, johnmil@jprc.com) code for
+    a basic VT-100 emulator for Win32 consoles is used to process
+    tc* calls output.
+
+EOF
diff --git a/posix/apps/posixw32/vt100.c b/posix/apps/posixw32/vt100.c
new file mode 100644 (file)
index 0000000..5d7f52d
--- /dev/null
@@ -0,0 +1,1124 @@
+/* vt100.c
+ *
+ * AUTHOR:  John L. Miller, johnmil@cs.cmu.edu / johnmil@jprc.com
+ * DATE:    8/4/96
+ *
+ * Copyright (c) 1996 John L. Miller
+ *
+ * Full permission is granted to use, modify and distribute
+ * this code, provided:
+ * 1) This comment field is included in its entirity
+ * 2) No money is charged for any work including or based on 
+ *    portions of this code.
+ *
+ * If you're a nice person and find this useful, I'd appreciate a
+ * note letting me know about it. e-mail is usually what spurs me
+ * on to improve and support software I've written.
+ *
+ */
+
+/* This is the main code body for my generic vt-100 emulator. This code
+ * body provides parsing for most of the vt-100 escape sequences, but it
+ * doesn't actually do anything with some of them. The idea behind this 
+ * parser is to provide a generic front-end that you can initialize, then
+ * send all of your output to. The output is parsed by the routines in this
+ * program, then spit out to a back-end.
+ *
+ * What back-end you say? Well, the one you have to supply yourself. There's a
+ * dozen or so routines you have to provide for character-based I/O, cursor 
+ * movement, erasing and deleting text, and setting text and terminal attributes.
+ *
+ * For a list of the routines your back end must supply, read vt100.h closely.
+ *
+ * In case it's not obvious, these routines were written for a system running win32.
+ * for vt100.c and vt100.h, most of the code should be easily portable to other
+ * operating systems. Yeah, like they NEED a vt-100 emulator :p
+ */
+
+#include <windows.h>
+#include <stdio.h>
+#include <stdarg.h>
+#include "vt100.h"
+  
+/*  NOTE - many of the functions look like they should
+ * take X-Y pairs. Bear in mind this is a text display,
+ * so for this we're talking ROWS and COLUMNS. So parm
+ * lists go (row, column), which is the opposite of (x, y).
+ */
+
+char    cBuffer[MAXVTBUFLEN+1]; /* terminal output buffer for unprocessed characters */
+int     BufLen;                 /* Number of characters in cBuffer waiting for output */
+
+/* List of all device-independant colors. These colors will be transmitted to a
+ * back-end routine responsible for setting the foreground and background text
+ * colors appropriately. Note that the color combinations are ordered to correspond
+ * with combinations of red (0x1), green (0x2) and blue (0x4) bit flags.
+ */
+
+int ScColorTrans[8]= { 0,
+                    SC_RED,
+                    SC_GREEN,
+                    SC_RED|SC_GREEN,
+                    SC_BLUE,
+                    SC_RED|SC_BLUE,
+                    SC_RED|SC_GREEN,
+                    SC_RED|SC_GREEN|SC_BLUE
+                    };
+
+
+/* List of terminal attributes which we track (used by <esc>[?#h and <esc>[?#l) */
+
+int termAttrMode[NUM_TERM_ATTR_MODES] = { 0,
+                    CURSORAPPL_MODE,
+                    ANSI_MODE,
+                    COL132_MODE,
+                    SMOOTHSCROLL_MODE,
+                    REVSCREEN_MODE,
+                    ORIGINREL_MODE,
+                    WRAP_MODE,
+                    REPEAT_MODE,
+                    };
+
+/* FORWARD FUNCTION DECLARATIONS -
+ * these functions are intended for use only in this module */
+
+static int ProcessBracket(int Start);
+static int ProcessEscape(int Start);
+static int ProcessControl(int Start);
+static int ProcessBuffer(void);
+
+/* END FORWARD FUNCTION DECLARATIONS */
+
+
+
+/* vtputs() - 
+ * 
+ * front-end 'puts()' substitute. Call this routine instead 
+ * of 'puts()', and it'll pass the output through the vt100 emulator.
+ */
+
+vtputs(char *f)
+{
+    char cbuf[1024];
+
+    strcpy(cbuf,f);
+    strcat(cbuf,"\n");
+    vtProcessedTextOut(cbuf, strlen(cbuf));
+
+    return(0);
+}
+
+
+/* vtprintf -
+ * 
+ * This routine is a substitute for printf(). Call this routine with the 
+ * same parameters you would use for printf, and output will be channelled
+ * through the vt-100 emulator.
+ */
+
+vtprintf(char *format, ...)
+{
+    char cbuf[1024];
+    va_list va;
+
+    va_start(va, format);
+    vsprintf(cbuf,format, va);
+    va_end(va);
+
+    vtProcessedTextOut(cbuf, strlen(cbuf));
+
+    return(0);
+}
+
+/* vtInitVT100 -
+ *
+ * Set the initial state of the VT-100 emulator, and call the initialization
+ * routine for the back end. This routine MUST be invoked before any other, or 
+ * the VT-100 emulator will most likely roll over and die.
+ */
+
+vtInitVT100(void)
+{
+    int i=0;
+
+    cBuffer[0]='\0';
+    BufLen=0;
+
+    beInitVT100Terminal(); /* call the back-end initialization. */
+
+    return(0);
+}
+
+
+/* ProcessBracket -
+ * 
+ * Helper routine for processing escape sequences. By the time this
+ * routine is invoked, '<esc>[' has already been read in the input
+ * stream. 'Start' is an index in cBuffer to the '<esc>'.
+ *
+ * If an escape sequence is successfully parsed, return the index of the
+ * first character AFTER the escape sequence. Otherwise, return 'Start'.
+ *
+ */
+
+static int ProcessBracket(int Start)
+{
+    int End;                 /* Current character being examined in cBuffer */
+    int args[10], numargs=0; /* numerical args after <esc>[ */
+    int iMode;               
+    int i;
+    int itmp=0;
+    int left;
+    int iForeground, iBackground;
+
+    /* If there's no valid escape sequence, return as we were called. */
+
+    if ((cBuffer[Start+1] != '[')||(Start+2 >= BufLen))
+        return(Start);
+
+    End = Start + 2;
+
+    /* Loop through the buffer, hacking out all numeric
+     * arguments (consecutive string of digits and
+     * semicolons
+     */
+
+    do {
+        itmp = 0; /* itmp will hold the current arguments integer value */
+
+                  /* the semicolon is a delimiter */
+        if (cBuffer[End] == ';')
+        {
+            End++;
+
+            if (End >= BufLen)
+                return(Start);
+        }
+
+        /*  Parse this argument into a number. */
+
+        while (isdigit(cBuffer[End]))
+        {
+            itmp = itmp*10 + (cBuffer[End]-'0');
+            End++;
+            if (End >= BufLen)
+                return(Start);
+        }
+
+        /* Save the numeric argument if we actually
+         * parsed a number.
+         */
+
+        if (End != Start + 2)
+            args[numargs++] = itmp;
+
+    } while (cBuffer[End] == ';');
+
+    /* At this point, we've come across a character that isn't a number
+     * and isn't a semicolon. This means it is the command specifier.
+     */
+
+    /* Number of characters left in the input stream. I don't use 
+     * this as rigorously as I should here.
+     */
+
+    left =  BufLen - End;
+
+    /* Return if there's definitely not enough characters for a
+     * full escape sequence.
+     */
+
+    if (left <= 0)
+        return(Start);
+
+    /* Giant switch statement, parsing the command specifier that followed
+     * up <esc>[arg;arg;...arg
+     */
+
+    switch (cBuffer[End])
+    {
+    /*         Cursor Up:      Esc [ Pn A */
+    case 'A':
+        beOffsetCursor(numargs ? -args[0] : -1, 0);
+        End += 1;
+        break;
+
+    /*         Cursor Down:    Esc [ Pn B */
+    case 'B':
+        beOffsetCursor(numargs ? args[0] : 1, 0);
+        End += 1;
+        break;
+
+    /*         Cursor Right:    Esc [ Pn C */
+    case 'C':
+        beOffsetCursor(0, numargs ? args[0] : 1);
+        End += 1;
+        break;
+
+    /*          Cursor Left:   Esc [ Pn D */
+    case 'D':
+        beOffsetCursor(0, numargs ? -args[0] : -1);
+        End += 1;
+        break;
+
+    /*          Direct Addressing :  Esc [ Pn(row);Pn(col)H or
+     *                               Esc [ Pn(row);Pn(col)f
+     */
+    case 'H':
+    case 'f':
+        if (numargs == 0)
+            beAbsoluteCursor(1,1);
+        else if (numargs == 1)
+            beAbsoluteCursor(args[0] > 0 ? args[0] : 1,1);
+        else if (numargs == 2)
+            beAbsoluteCursor(args[0] > 0 ? args[0] : 1, args[1] > 0 ? args[1] : 1);
+
+        End += 1;
+        break;
+
+    /*         Erase from Cursor to end of screen         Esc [ J
+     *         Erase from Beginning of screen to cursor   Esc [ 1 J
+     *         Erase Entire screen                        Esc [ 2 J
+     */
+    case 'J':
+        if (numargs == 0)
+            beEraseText(CUR_ROW, CUR_COL, BOTTOM_EDGE, RIGHT_EDGE);
+        else if (args[0] == 1)
+            beEraseText(TOP_EDGE, LEFT_EDGE, CUR_ROW, CUR_COL);
+        else
+            beEraseText(TOP_EDGE, LEFT_EDGE, BOTTOM_EDGE, RIGHT_EDGE);
+
+        End += 1;
+        break;
+
+    /*         Erase from Cursor to end of line           Esc [ K
+     *         Erase from Beginning of line to cursor     Esc [ 1 K
+     *         Erase Entire line                          Esc [ 2 K
+     */
+    case 'K':
+        if (numargs == 0)
+            beEraseText(CUR_ROW, CUR_COL, CUR_ROW, RIGHT_EDGE);
+        else if (args[0] == 1)
+            beEraseText(CUR_ROW, LEFT_EDGE, CUR_ROW, CUR_COL);
+        else
+            beEraseText(CUR_ROW, LEFT_EDGE, CUR_ROW, RIGHT_EDGE);
+
+        End += 1;
+        break;
+
+
+    /*  Set Graphics Rendition:
+     *          ESC[#;#;....;#m
+     *  The graphics rendition is basically foreground and background
+     *  color and intensity.
+     */
+    case 'm':
+        beGetTextAttributes(&iForeground, &iBackground);
+
+        if (numargs < 1)
+        {
+            /* If we just get ESC[m, treat it as though
+             * we should shut off all extra text
+             * attributes
+             */
+
+            iForeground &= ~(SC_BOLD|SC_UL|SC_BL|SC_RV|SC_GRAPHICS|SC_G0|SC_G1);
+            iForeground |= SC_ASCII;
+
+            beSetTextAttributes(iForeground, iBackground);
+            End += 1;
+            break;
+        }
+
+        /* Loop through all the color specs we got, and combine them
+         * together. Note that things like 'reverse video', 'bold',
+         * and 'blink' are only applied to the foreground. The back end
+         * is responsible for applying these properties to all text.
+         */
+        for (i=0; i < numargs; i++)
+        {
+            switch(args[i])
+            {
+            /* 0 for normal display */
+            case 0:
+                iForeground &= ~SC_BOLD;
+                break;
+
+            /* 1 for bold on */
+            case 1:
+                iForeground |= SC_BOLD;
+                break;
+
+            /* 4 underline (mono only) */
+            case 4:
+                iForeground |= SC_UL;
+                break;
+
+            /* 5 blink on */
+            case 5:
+                iForeground |= SC_BL;
+                break;
+
+            /* 7 reverse video on */
+            case 7:
+                iForeground |= SC_RV;
+                break;
+
+            /* 8 nondisplayed (invisible)  BUGBUG - not doing this. */
+
+
+            /* 30-37 is bit combination of 30+ red(1) green(2) blue(4)
+             * 30 black foreground
+             */
+            case 30:
+            case 31:
+            case 32:
+            case 33:
+            case 34:
+            case 35:
+            case 36:
+            case 37:
+                iForeground &= ~(SC_RED|SC_GREEN|SC_BLUE);
+                iForeground |= ScColorTrans[args[i]-30];
+                break;
+
+            /* 40-47 is bit combo similar to 30-37, but for background. */
+            case 40:
+            case 41:
+            case 42:
+            case 43:
+            case 44:
+            case 45:
+            case 46:
+            case 47:
+                iBackground &= ~(SC_RED|SC_GREEN|SC_BLUE);
+                iBackground |= ScColorTrans[args[i]-30];
+                break;
+            }
+        }
+
+        beSetTextAttributes(iForeground, iBackground);
+
+        End += 1;
+        break;
+
+
+    /*
+     *         Set with        Esc [ Ps h
+     *         Reset with      Esc [ Ps l
+     * Mode name               Ps      Set             Reset
+     * -------------------------------------------------------------------
+     * Keyboard action         2       Locked          Unlocked
+     * Insertion               4       Insert          Overwrite
+     * Send - Receive          12      Full            Echo
+     * Line feed/New line      20      New line        Line feed
+     */
+    case 'h':
+    case 'l':
+    /* BUGBUG - many of the terminal modes are set with '?' as the
+     * first character rather than a number sign. These are dealt with
+     * later in this switch statement because they must be. Most other
+     * settings are just ignored, however.
+     */
+        End += 1;
+        break;
+
+    /*         Insert line             Esc [ Pn L */
+    case 'L':
+        beInsertRow(CUR_ROW);
+        End += 1;
+        break;
+
+    /*         Delete line             Esc [ Pn M */
+    case 'M':
+        do {
+            beDeleteText(CUR_ROW,LEFT_EDGE, CUR_ROW, RIGHT_EDGE);
+        } while (--args[0] > 0);
+
+        End += 1;
+        break;
+
+    /*         Delete character        Esc [ Pn P */
+    case 'P':
+        do {
+            beDeleteText(CUR_ROW, CUR_COL, CUR_ROW, CUR_COL);
+        } while (--args[0] > 0);
+        End += 1;
+        break;
+
+    /*         Set the Scrolling region        Esc [ Pn(top);Pn(bot) r */
+    case 'r':
+        if (numargs == 0)
+            beSetScrollingRows(TOP_EDGE,BOTTOM_EDGE);
+        else if (numargs == 2)
+            beSetScrollingRows(args[0],args[1]);
+        End += 1;
+        break;
+
+    /*         Print screen or region  Esc [ i
+     *         Print cursor line       Esc [ ? 1 i
+     *         Enter auto print        Esc [ ? 5 i
+     *         Exit auto print         Esc [ ? 4 i
+     *         Enter print controller  Esc [ 5 i
+     *         Exit print controller   Esc [ 4 i
+     */
+    case 'i':
+        /* BUGBUG - print commands are not acted upon. */
+        End += 1;
+        break;
+
+
+    /*         Clear tab at current column     Esc [ g
+     *         Clear all tabs                  Esc [ 3 g
+     */
+    case 'g':
+        if (numargs == 0)
+            beClearTab(CUR_COL);
+        else
+            if ((numargs == 1) && (args[0] == 3))
+                beClearTab(ALL_TABS);
+
+        End += 1;
+        break;
+
+    /* BUGBUG - queries which require responses are ignored. */
+
+    /*         Esc [ c         DA:Device Attributes
+     *                         or
+     *
+     *         Esc [ <sol> x   DECREQTPARM: Request Terminal Parameters
+     *                         * <sol> values other than 1 are ignored.  Upon
+     *                           receipt of a <sol> value of 1, the following
+     *                           response is sent:
+     *                                 Esc[3;<par>;<nbits>;<xspeed>;<rspeed>;1;0x
+     *
+     *                                 * Where <par>, <nbits>, <xspeed>, and <rspeed>
+     *                                   are as for VT100s with the following
+     *                                   exceptions:
+     *                                   <nbits>       Values of 5 and 6 bits per
+     *                                                 character are sent as 7 bits.
+     *                                   <xspeed>,<rspeed>
+     *                                                 These two numbers will always
+     *                                                 be the same.  9600 baud is
+     *                                                 sent for 7200 baud.
+     *
+     *         Esc [ Ps n      DSR: Device Status Report
+     *                         * Parameter values other than 5, 6, are ignored.
+     *                           If the parameter value is 5, the sequence
+     *                           Esc [ O n is returned.  If the parameter value is
+     *                           6, the CPR: Cursor Position Report sequence
+     *                           Esc [ Pn ; Pn R is returned with the Pn set to
+     *                           cursor row and column numbers.
+     *
+     * Cursor Controls:
+     *          ESC[#;#R                       Reports current cursor line & column
+     */
+
+    /*                         spec    <esc>[<spec>h   <esc>[<spec>l
+     * Cursor key              ?1      Application     Cursor
+     * ANSI/VT52               ?2      ANSI            VT52
+     * Column                  ?3      132             80
+     * Scrolling               ?4      Smooth          Jump
+     * Screen                  ?5      Reverse         Normal
+     * Origin                  ?6      Relative        Absolute
+     * Wraparound              ?7      Wrap            Truncate
+     * Auto key repeat         ?8      Repeating       No repeat
+     */
+    case '?':
+        /* We didn't catch the numeric argument because the '?' stopped
+         * it before. Parse it now. 
+         */
+        args[0]=0;
+        while (isdigit(cBuffer[++End]))
+        {
+            if (End >= BufLen)
+                return(Start);
+            args[0] = 10*args[0] + (cBuffer[End]-'0');
+        }
+
+        /* If we don't handle this particular '?' command (and
+         * there are plenty we don't) then just ignore it. 
+         */
+        if (  (args[0] > 8) 
+            ||( (cBuffer[End] != 'l') && (cBuffer[End] != 'h'))
+           )
+        {
+            End++;
+            if (End >= BufLen)
+                return(Start);
+            break;
+        }
+
+        /* This command sets terminal status. Get the current status,
+         * determine what needs to be changed, and send it back.
+         */
+
+        iMode = beGetTermMode();
+
+        /* If we need a given mode and it's not already set, set it. */
+
+        if ((cBuffer[End] == 'h') && (!(iMode & termAttrMode[args[0]])))
+        {
+            beSetTermMode(iMode | termAttrMode[args[0]]);
+        }
+
+        /* likewise, clear it as appropriate */
+        if ((cBuffer[End] == 'l') && (iMode & termAttrMode[args[0]]))
+        {
+            beSetTermMode(iMode & ~termAttrMode[args[0]]);
+        }
+
+        End++;
+        break;
+
+    /* If it's an escape sequence we don't treat, pretend as though we never saw
+     * it.
+     */
+    default:
+        End += 1;
+        break;
+    }
+
+    return(End);
+
+}
+
+
+/* ProcessEscape - 
+ * 
+ * At this point, <esc> has been seen. Start points to the escape
+ * itself, and then this routine is responsible for parsing the
+ * rest of the escape sequence, and either pawning off further parsing,
+ * or acting upon it as appropriate.
+ *
+ * Note that the escape sequences being parsed are still contained in cBuffer.
+ */
+
+static int ProcessEscape(int Start)
+{
+    int End;
+    int left;
+    int fore, back;
+    int i;
+
+    /* if it's definitely not a full escape sequence, return that we haven't
+     * seen it.
+     */
+    if ((cBuffer[Start] != 27)||(Start+1 >= BufLen))
+        return(Start);
+
+    End = Start + 1;
+    
+    /* At this point, if the sequence is <esc> x, 'End' points at
+     * x
+     */
+
+    /* left = number of characters left unparsed in the buffer. */
+    left =  BufLen - End -1;
+
+    /* Main switch statement - parse the escape sequence according to the
+     * next character we see.
+     */
+
+    switch (cBuffer[End])
+    {
+    /*         Hard Reset                      Esc c    BUGBUG - not imp'd. */
+    case 'c':
+        End += 1;
+        break;
+
+    /*         Cursor up               Esc A */
+    case 'A':
+        beOffsetCursor(-1,0);
+        End += 1;
+        break;
+
+    /*         Cursor down             Esc B */
+    case 'B':
+        beOffsetCursor(1,0);
+        End += 1;
+        break;
+
+    /*         Cursor right            Esc C */
+    case 'C':
+        beOffsetCursor(0,1);
+        End += 1;
+        break;
+
+    /*         Cursor left             Esc D */
+    case 'D':
+        beOffsetCursor(0,-1);
+        End += 1;
+        break;
+
+    /*         Newline command:       Esc E */
+    case 'E':
+        beRawTextOut("\n",strlen("\n"));
+        End += 1;
+        break;
+
+    /*          Invoke the Graphics character set  Esc F */
+    case 'F':
+        beGetTextAttributes(&fore, &back);
+        if (! (fore & SC_GRAPHICS))
+        {
+            fore &= ~(SC_ASCII|SC_G0|SC_G1);
+            fore |= SC_GRAPHICS;
+            beSetTextAttributes(fore, back);
+        }
+        End += 1;
+        break;
+
+    /*         Invoke the ASCII character set     Esc G */
+    case 'G':
+        beGetTextAttributes(&fore, &back);
+        if (! (fore & SC_ASCII))
+        {
+            fore &= ~(SC_G0|SC_G1|SC_GRAPHICS);
+            fore |= SC_ASCII;
+            beSetTextAttributes(fore, back);
+        }
+        End += 1;
+        break;
+
+    /*          Move the cursor to (1,1): Home cursor             Esc H */
+    case 'H':
+        beAbsoluteCursor(TOP_EDGE,LEFT_EDGE);
+        End += 1;
+        break;
+
+    /*         Reverse line feed       Esc I */
+    case 'I':
+        beOffsetCursor(-1,0);
+        End += 1;
+        break;
+
+    /*         Erase to end of screen  Esc J   */
+    case 'J':
+        beEraseText(CUR_ROW, CUR_COL, BOTTOM_EDGE, RIGHT_EDGE);
+        End += 1;
+        break;
+
+    /*         Erase to end of line    Esc K */
+    case 'K':
+        beEraseText(CUR_ROW, CUR_COL, CUR_ROW, RIGHT_EDGE);
+        End += 1;
+        break;
+
+    /*         Reverse Line:   Esc M */
+    case 'M':
+        beAbsoluteCursor(CUR_ROW, LEFT_EDGE);
+        beOffsetCursor(-1,0);
+        End += 1;
+        break;
+
+    /* Switch to G1 graphics character set.         Esc N */
+    case 'N':
+        beGetTextAttributes(&fore, &back);
+        if (! (fore & SC_G1))
+        {
+            fore &= ~(SC_G0|SC_ASCII|SC_GRAPHICS);
+            fore |= SC_G1;
+            beSetTextAttributes(fore, back);
+        }
+        End += 1;
+        break;
+
+    /* Switch to G0 graphics character set        Esc O */
+    case 'O':
+        beGetTextAttributes(&fore, &back);
+        if (! (fore & SC_G0))
+        {
+            fore &= ~(SC_G1|SC_ASCII|SC_GRAPHICS);
+            fore |= SC_G0;
+            beSetTextAttributes(fore, back);
+        }
+        End += 1;
+        break;
+
+    /*         Print cursor line       Esc V   BUGBUG - unimp'd */
+    case 'V':
+        End += 1;
+        break;
+
+    /*          Enter print controller  Esc W  BUGBUG - unimp'd */
+    case 'W':
+        End += 1;
+        break;
+
+    /*         Exit print controller   Esc X    BUGBUG - unimp'd */
+    case 'X':
+        End += 1;
+        break;
+
+    /*         Cursor address          Esc Y row col BUGBUG - unimp'd and needed */
+    case 'Y':
+        End += 1;
+        break;
+
+    /*         Identify terminal type     Esc Z    */
+    case 'Z':
+        beTransmitText(ANSWERBACK_MESSAGE,strlen(ANSWERBACK_MESSAGE));
+        End += 1;
+        break;
+
+    /* One of dozens of escape sequences starting <esc>[. Parse further */
+    case '[':
+        /* pass in the escape as the starting point */
+        End = ProcessBracket(End-1);
+        break;
+
+    /*        Print screen            Esc ]     BUGBUG - unimp'd */
+    case ']':
+        End += 1;
+        break;
+
+    /*         Enter auto print        Esc ^    BUGBUG - unimpd' */
+    case '^':
+        End += 1;
+        break;
+
+    /*         Exit auto print         Esc -    BUGBUG - unimpd' */
+    case '-':
+        End += 1;
+        break;
+
+    /*         Alternate keypad        Esc =    BUGBUG - unimpd' */
+    case '=':
+        End += 1;
+        break;
+
+    /*         Numeric keypad          Esc >    BUGBUG - unimpd' */
+    case '>':
+        End += 1;
+        break;
+
+    /*         Enter ANSI mode         Esc <    BUGBUG - unimpd' */
+    case '<':
+        End += 1;
+        break;
+
+    /*         Save cursor position & Attributes:     Esc 7 */
+    case '7':
+        beSaveCursor();
+        End += 1;
+        break;
+
+    /*         Restore cursor position & attributes:  Esc 8 */
+    case '8':
+        beRestoreCursor();
+        End += 1;
+        break;
+
+    /*  Set character size - BUGBUG - unimp'd.
+     * # 1             Double ht, single width top half chars
+     * # 2             Double ht, single width lower half chars
+     * # 3             Double ht, double width top half chars
+     * # 4             Double ht, double width lower half chars
+     * # 5             Single ht, single width chars
+     * # 6             Single ht, double width chars    
+     */
+    case '#':
+        End += 1;
+        break;
+
+    /* Select character set
+     * ESC ( A             British 
+     * ESC ( C             Finnish
+     * ESC ( E             Danish or Norwegian
+     * ESC ( H             Swedish
+     * ESC ( K             German
+     * ESC ( Q             French Canadian
+     * ESC ( R             Flemish or French/Belgian
+     * ESC ( Y             Italian
+     * ESC ( Z             Spanish
+     * ESC ( 1             Alternative Character
+     * ESC ( 4             Dutch
+     * ESC ( 5             Finnish
+     * ESC ( 6             Danish or Norwegian
+     * ESC ( 7             Swedish
+     * ESC ( =             Swiss (French or German)
+     */
+    case '(':
+    case ')':
+        /* BUGBUG - most character sets aren't implemented. */
+        beGetTextAttributes(&fore, &back);
+        switch (cBuffer[++End])
+        {
+        case 'B':    /* ESC ( B             North American ASCII set */
+            i=SC_ASCII;
+            break;
+
+        case '0':    /* ESC ( 0             Line Drawing */
+            i=SC_G1;
+            break;
+
+        case '2':    /* ESC ( 2             Alternative Line drawing */
+            i=SC_G0;
+            break;
+
+        default:
+            /* Make sure the screen mode isn't set. */
+            i = 0xFFFFFFFF;
+            break;
+        }
+
+        if (! (fore & i))
+        {
+            fore &= ~(SC_ASCII|SC_G0|SC_G1|SC_GRAPHICS);
+            fore |= i;
+            beSetTextAttributes(fore, back);
+        }
+
+        End += 1;
+        break;
+
+    /* Unknown escape sequence */
+    default:
+        {
+            char cbuf[80];
+            sprintf(cbuf,"<esc>%c", cBuffer[End]);
+            beRawTextOut(cbuf+Start,6);
+            End += 1;
+        }
+    }
+
+    return(End);
+}
+
+
+/* ProcessControl -
+ *
+ * Process a probable escape or control sequence
+ * starting at the supplied index. Return the index
+ * of the first character *after* the escape sequence we
+ * process.
+ * In the case of an incomplete sequence, ie one
+ * that isn't completed by the end of the buffer, return
+ * 'Start'.
+ * In the case of an invalid sequence,
+ * note the invalid escape sequence, and return Start+1
+ */
+
+static int ProcessControl(int Start)
+{
+    int fore, back;
+    int End = Start;
+
+    /* Check to make sure we at least have enough characters
+     * for a control character
+     */
+
+    if (Start >= BufLen)
+        return(Start);
+
+    switch (cBuffer[Start])
+    {
+    /*  NUL     0       Fill character; ignored on input.
+     *  DEL     127     Fill character; ignored on input.
+     */
+    case 0:
+    case 127:
+        End += 1;
+        break;
+
+    /* ENQ     5       Transmit answerback message. */
+    case 5:
+        beTransmitText(ANSWERBACK_MESSAGE,strlen(ANSWERBACK_MESSAGE));
+        End += 1;
+        break;
+
+    /* BEL     7       Ring the bell. */
+    case 7:
+        beRingBell();
+        End += 1;
+        break;
+
+    /* BS      8       Move cursor left. */
+    case 8:
+        beOffsetCursor(0,-1);
+        End += 1;
+        break;
+
+    /* HT      9       Move cursor to next tab stop. */
+    case 9:
+        beAdvanceToTab();
+        End += 1;
+        break;
+
+    /* LF      10      Line feed; causes print if in autoprint. */
+    case 10:
+        beOffsetCursor(1,0);
+        End += 1;
+        break;
+
+    /* VT      11      Same as LF. 
+     * FF      12      Same as LF.
+     */
+    case 11:
+    case 12:
+        beOffsetCursor(1,0);
+        End += 1;
+        break;
+
+    /* CR      13      Move cursor to left margin or newline. */
+    case 13:
+        beOffsetCursor(1,0);
+        beAbsoluteCursor(CUR_ROW,LEFT_EDGE);
+        End += 1;
+        break;
+
+    /* SO      14      Invoke G1 character set. */
+    case 14:
+        beGetTextAttributes(&fore, &back);
+        if (! (fore & SC_G1))
+        {
+            fore &= ~(SC_ASCII|SC_G0|SC_G1|SC_GRAPHICS);
+            fore |= SC_G1;
+            beSetTextAttributes(fore, back);
+        }
+        End += 1;
+        break;
+
+    /* SI      15      Invoke G0 character set. */
+    case 15:
+        beGetTextAttributes(&fore, &back);
+        if (! (fore & SC_G0))
+        {
+            fore &= ~(SC_ASCII|SC_G0|SC_G1|SC_GRAPHICS);
+            fore |= SC_G0;
+            beSetTextAttributes(fore, back);
+        }
+        End += 1;
+        break;
+
+    /* CAN     24      Cancel escape sequence and display checkerboard. BUGBUG - not imp'd.
+     * SUB     26      Same as CAN.
+     */
+    case 24:
+        End += 1;
+        break;
+
+    /* ESC     27      Introduce a control sequence. */
+    case 27:
+        End = ProcessEscape(Start);
+        break;
+
+    /* Print any other control character received. */
+    default:
+        {
+            char buf[4];
+            sprintf(buf,"^%c",'A' + cBuffer[Start] - 1);
+            beRawTextOut(buf, 2);
+            End += 1;
+        }
+        break;
+    }
+
+    return(End);
+}
+
+
+/* ProcessBuffer -
+ * 
+ * Process the current contents of the terminal character buffer.
+ */
+static int ProcessBuffer(void)
+{
+    int Start=0,End=0;
+
+    /* Null-terminate the buffer. Why? Heck, why not? */
+
+    cBuffer[BufLen] = '\0'; 
+
+    /* Loop through the entire buffer. Start will be incremented
+     * to point at the start of unprocessed text in the buffer as
+     * we go.
+     */
+    while (Start < BufLen)
+    {
+        End = Start;
+
+        /* Since we null-terminated, null < 27 and we have a termination condition */
+        while ((cBuffer[End] > 27)||(cBuffer[End] == 10)||(cBuffer[End] == 13))
+            End++;
+
+        /* At this point, if Start < End, we have a string of characters which
+         * doesn't have any control sequences, and should be printed raw.
+         */
+
+        if (End > Start)
+            beRawTextOut(cBuffer+Start, End-Start);
+
+        if (End >= BufLen)
+        {
+            break;
+        }
+
+        /* At this point, 'End' points to the beginning of an escape
+         * sequence. We'll reset 'start' to be AFTER parsing the
+         * escape sequence. Note that if the escape sequence
+         * is incomplete, ProcessControl should return the
+         * same value passed in. Otherwise, it'll return the
+         * index of the first character after the valid
+         * escape sequence.
+         */
+
+        Start = ProcessControl(End);
+
+        if (Start == End)
+        {
+            /* The escape sequence was incomplete.
+             * Move the unprocessed portion of the input buffer
+             * to start at the beginning of the buffer, then 
+             * return.
+             */
+
+            while (End < BufLen)
+            {
+                cBuffer[End-Start] = cBuffer[End];
+                End += 1;
+            }
+
+            BufLen = End-Start;
+            return(0);
+        }
+    }
+
+    /* If we made it this far, Start == Buflen, and so we've finished
+     * processing the buffer completely.
+     */
+    BufLen = 0;
+    cBuffer[BufLen] = '\0';
+         
+    return(0);
+}
+
+
+/* vtProcessedTextOut -
+ *
+ * Output characters to terminal, passing them through the vt100 emulator.
+ * Return -1 on error 
+ */
+int 
+vtProcessedTextOut(char *cbuf, int count)
+{
+    /* If we have a buffer overflow, error out if we haven't already crashed. */
+
+    if ((count + BufLen) > MAXVTBUFLEN)
+    {
+        beRawTextOut("ERROR: VT-100 internal buffer overflow!",39);
+        return(-1);
+    }
+
+    /* Otherwise, add our requested information to the
+     * output buffer, and attempt to parse it.
+     */
+
+    memcpy(cBuffer + BufLen, cbuf, count);
+    BufLen += count;
+
+    return(ProcessBuffer());
+}
+
diff --git a/posix/apps/posixw32/vt100.h b/posix/apps/posixw32/vt100.h
new file mode 100644 (file)
index 0000000..808bf76
--- /dev/null
@@ -0,0 +1,320 @@
+/* vt100.h
+ *
+ * AUTHOR:  John L. Miller, johnmil@cs.cmu.edu / johnmil@jprc.com
+ * DATE:    8/4/96
+ *
+ * Copyright (c) 1996 John L. Miller
+ *
+ * Full permission is granted to use, modify and distribute
+ * this code, provided:
+ * 1) This comment field is included in its entirity
+ * 2) No money is charged for any work including or based on 
+ *    portions of this code.
+ *
+ * If you're a nice person and find this useful, I'd appreciate a
+ * note letting me know about it. e-mail is usually what spurs me
+ * on to improve and support software I've written.
+ *
+ */
+
+
+/* This identifier should be spit back to the computer when a terminal
+ * id is requested. 
+ */
+#define ANSWERBACK_MESSAGE "vt100"
+
+/* Various terminal-related modes Entries are as follows:
+ *         Identification       esc. ID    If set,         if clear 
+ */
+
+        /* Keyboard action         2       Locked          Unlocked */
+#define CAPS_MODE         0x00000001
+        /* Insertion               4       Insert          Overwrite  */
+#define INSERT_MODE       0x00000002
+        /* Send - Receive          12      Full            Echo */
+#define FULLDUPLEX_MODE   0x00000004
+        /* Line feed/New line      20      New line        Line feed */
+#define NEWLINE_MODE      0x00000008
+
+
+#define NUM_TERM_ATTR_MODES 9   /* We only track eight '?' escape sequences */
+
+        /* Cursor key              ?1      Application     Cursor */
+#define CURSORAPPL_MODE   0x00000010
+        /* ANSI/VT52               ?2      ANSI            VT52 */
+#define ANSI_MODE         0x00000020
+        /* Column                  ?3      132             80 */
+#define COL132_MODE       0x00000040
+        /* Scrolling               ?4      Smooth          Jump  */
+#define SMOOTHSCROLL_MODE 0x00000080
+        /* Screen                  ?5      Reverse         Normal */
+#define REVSCREEN_MODE    0x00000100
+        /* Origin                  ?6      Relative        Absolute */
+#define ORIGINREL_MODE    0x00000200
+        /* Wraparound              ?7      Wrap            Truncate */
+#define WRAP_MODE         0x00000400
+        /* Auto key repeat         ?8      Repeating       No repeat */
+#define REPEAT_MODE       0x00000800
+
+
+        /* Print form feed         ?18     Yes             No */
+#define PRINTFF_MODE      0x00001000
+        /* Print extent            ?19     Full screen     Scrolling region */
+#define PRINTFULLSCR_MODE 0x00002000
+        /* Keypad application 'Esc ='    numeric 'Esc >' */
+#define KEYPADNUMERIC_MODE 0x00004000
+        /* default mode that we start the emulator with */
+#define DEFAULT_MODE      (NEWLINE_MODE|ANSI_MODE|REPEAT_MODE)
+
+        /* This constant is VERY important - the size of the buffer for
+         * unprocessed vt-100 prints!
+         */
+#define MAXVTBUFLEN       4096
+
+        /* Constants used in place of actual row and column numbers
+         * for the cursor movement and text erasing and deleting functions.
+         */
+#define CUR_ROW   -999
+#define CUR_COL   -999
+#define ALL_TABS  -1999
+
+#define LEFT_EDGE 0
+#define RIGHT_EDGE 12000
+#define TOP_EDGE 0
+#define BOTTOM_EDGE 12000
+
+    /* Text attribute definitions; color, font, bold. */
+#define NUM_SC_ATTRIBUTES   11 
+
+#define SC_RED   0x0001
+#define SC_GREEN 0x0002
+#define SC_BLUE  0x0004
+#define SC_BOLD  0x0010
+#define SC_UL    0x0020 /* Underlined */
+#define SC_BL    0x0040 /* Blinking */
+#define SC_RV    0x0080 /* Reverse video */
+#define SC_ASCII    0x0100 /* Normal ASCII (USASCII) */
+#define SC_G0       0x0200 /* graphics set G0 */
+#define SC_G1       0x0400 /* Graphics set G1 */
+#define SC_GRAPHICS 0x0800 /* Good question */
+
+
+/* forward variable declarations */
+
+extern int termAttrMode[NUM_TERM_ATTR_MODES];
+extern int alltermAttrModes;
+
+
+/* prototypes from vt100.c */
+
+/* functions meant for use outside of the emulator */
+
+int vtputs(char *f);
+int vtprintf(char *format, ...);
+int vtInitVT100(void);
+int vtProcessedTextOut(char *cbuf, int count);
+
+
+/* Prototype for functions which MUST BE SUPPLIED BY THE BACK END!!! */
+
+/* Back-end specific initialization is performed in this function.
+ * this is gauranteed to be called before any other requests are made
+ * of the back end.
+ */
+
+/* beInitVT100Terminal() - 
+ *
+ * This function is called by the VT100 emulator as soon as the 
+ * front-end terminal is initialized. It's responsible for setting
+ * initial state of the terminal, and initing our many wacky variables.
+ */
+int beInitVT100Terminal();
+
+
+/* beAbsoluteCursor -
+ *
+ * Given an input row and column, move the cursor to the 
+ * absolute screen coordinates requested. Note that if the
+ * display window has scrollbars, the column is adjusted
+ * to take that into account, but the row is not. This allows
+ * for large scrollback in terminal windows.
+ *
+ * ROW must be able to accept CUR_ROW, TOP_EDGE, BOTTOM_EDGE,
+ * or a row number.
+ *
+ * COLUMN must be able to accept CUR_COL, LEFT_EDGE, RIGHT_EDGE,
+ * or a column number.
+ */
+int beAbsoluteCursor(int row, int col);
+
+
+/* beOffsetCursor -
+ * 
+ * Given an input row and column offset, move the cursor by that
+ * many positions. For instance, row=0 and column=-1 would move
+ * the cursor left a single column.
+ *
+ * If the cursor can't move the requested amount, results are 
+ * unpredictable.
+ */
+int beOffsetCursor(int row, int column);
+
+
+/* beRestoreCursor -
+ * 
+ * Saved cursor position should be stored in a static 
+ * variable in the back end. This function restores the 
+ * cursor to the position stored in that variable.
+ */
+int beRestoreCursor(void);
+
+
+/* beSaveCursor -
+ *
+ * The back-end should maintain a static variable with the
+ * last STORED cursor position in it. This function replaces
+ * the contents of that variable with the current cursor position.
+ * The cursor may be restored to this position by using the
+ * beRestoreCursor function.
+ */
+int beSaveCursor(void);
+
+
+/* beGetTextAttributes -
+ *
+ * given a pointer to 'fore'ground and 'back'ground ints,
+ * fill them with a device-independant description of the
+ * current foreground and background colors, as well as any
+ * font information in the foreground variable.
+ */
+int beGetTextAttributes(int *fore, int *back);
+
+
+/* beSetTextAttributes -
+ *
+ * Given a foreground and a background device independant (SC) color and font
+ * specification, apply these to the display, and save the state in the 
+ * static screen variables.
+ *
+ * Note that many font-specific constants (bold/underline/reverse, G0/G1/ASCII)
+ * are stored ONLY in the foreground specification.
+ */
+int beSetTextAttributes(int fore, int back);
+
+
+/* beRawTextOut-
+ *
+ * The name of this function is misleading. Given a pointer to
+ * ascii text and a count of bytes to print, print them to the
+ * display device. If wrapping is enabled, wrap text. If there is a
+ * scrolling region set and the cursor is in it,
+ * scroll only within that region. 'beRawTextOut' means that it's guaranteed
+ * not to have control sequences within the text. 
+ */
+int beRawTextOut(char *text, int len);
+
+
+/* beEraseText -
+ *
+ * Given a 'from' and a 'to' position in display coordinates,
+ * this function will fill in all characters between the two
+ * (inclusive) with spaces. Note that the coordinates do NOT
+ * specify a rectangle. erasing from (1,1) to (2,2) erases 
+ * all of the first row, and the first two characters of the
+ * second.
+ *
+ * Note that this routine must be able to handle TOP_EDGE, 
+ * BOTTOM_EDGE, LEFT_EDGE, RIGHT_EDGE, CUR_ROW, and CUR_COL
+ * in the appropriate parameters.
+ */
+int beEraseText(int rowFrom, int colFrom, int rowTo, int colTo);
+
+
+/* beDeleteText -
+ *
+ * Given a screen cursor 'from' and 'to' position, this function
+ * will delete all text between the two. Text will be scrolled
+ * up as appropriate to fill the deleted space. Note that, as in
+ * beEraseText, the two coordinates don't specify a rectangle, but
+ * rather a starting position and ending position. In other words,
+ * deleting from (1,1) to (2,2) should move the text from (2,3) to the
+ * end of the second row to (1,1), move line 3 up to line 2, and so on.
+ *
+ * This function must be able to process TOP_EDGE, BOTTOM_EDGE, LEFT_EDGE,
+ * RIGHT_EDGE, CUR_ROW, and CUR_COL specifications in the appropriate 
+ * variables as well as regular row and column specifications.
+ */
+int beDeleteText(int rowFrom, int colFrom, int rowTo, int colTo);
+
+
+/* beInsertRow -
+ *
+ * Given a row number or CUR_ROW, TOP_EDGE or BOTTOM_EDGE as an input, 
+ * this function will scroll all text from the current row down down by one,
+ * and create a blank row under the cursor.
+ */
+int beInsertRow(int row);
+
+
+/* beTransmitText -
+ *
+ * Given a pointer to text and byte count, this routine should transmit data 
+ * to whatever host made the request it's responding to. Typically this routin
+ * should transmit data as though the user had typed it in.
+ */
+int beTransmitText(char *text, int len);
+
+
+/* beAdvanceToTab -
+ *
+ * This routine will destructively advance the cursor to the
+ * next set tab, or to the end of the line if there are no
+ * more tabs to the right of the cursor.
+ */
+
+int beAdvanceToTab(void);
+
+
+/* beClearTab -
+ *
+ * This function accepts a constant, and will try to clear tabs
+ * appropriately. Its argument is either
+ * ALL_TABS, meaning all tabs should be removed
+ * CUR_COL, meaning the tab in the current column should be wiped, or 
+ * a column value, meaning if there's a tab there it should be wiped.
+ *
+ */
+int beClearTab(int col);
+
+
+/* beSetScrollingRows -
+ *
+ * Given a pair of row numbers, this routine will set the scrolling
+ * rows to those values. Note that this routine will accept
+ * TOP_ROW and BOTTOM_ROW as values, meaning that scrolling should
+ * be enabled for the entire display, regardless of resizing.
+ */
+int beSetScrollingRows(int fromRow, int toRow);
+
+
+/* beRingBell -
+ *
+ *  Ring the system bell once.
+ */
+int beRingBell(void);
+
+
+/* beGetTermMode -
+ * 
+ * Return the value of conTermMode, which is the terminal settings which
+ * can be queried/set by <esc>[?#h/l.
+ */
+int beGetTermMode();
+
+
+/* beSetTermMode -
+ * 
+ * Set the terminal as requested, assuming we can. Right now we only handle a 
+ * couple of the possible flags, but we store many of the others. 
+ */
+int beSetTermMode(int newMode);
diff --git a/posix/include/aio.h b/posix/include/aio.h
new file mode 100644 (file)
index 0000000..d1de333
--- /dev/null
@@ -0,0 +1,74 @@
+/* $Id: aio.h,v 1.4 2002/10/29 04:45:06 rex Exp $
+ */
+/*
+ * aio.h
+ *
+ * asynchronous input and output (REALTIME). 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 __AIO_H_INCLUDED__
+#define __AIO_H_INCLUDED__
+
+/* INCLUDES */
+#include <fcntl.h>
+#include <signal.h>
+#include <sys/types.h>
+#include <time.h>
+
+/* OBJECTS */
+
+/* TYPES */
+typedef struct _tag_aiocb
+{
+ int             aio_fildes;     /* file descriptor */
+ off_t           aio_offset;     /* file offset */
+ volatile void*  aio_buf;        /* location of buffer */
+ size_t          aio_nbytes;     /* length of transfer */
+ int             aio_reqprio;    /* request priority offset */
+ struct sigevent aio_sigevent;   /* signal number and value */
+ int             aio_lio_opcode; /* operation to be performed */
+} aiocb;
+
+/* CONSTANTS */
+#define AIO_CANCELED    0
+#define AIO_NOTCANCELED 1
+#define AIO_ALLDONE     2
+
+#define LIO_WAIT        0
+#define LIO_NOWAIT      1
+#define LIO_READ        2
+#define LIO_WRITE       3
+#define LIO_NOP         4
+
+/* PROTOTYPES */
+int      aio_cancel(int, struct aiocb *);
+int      aio_error(const struct aiocb *);
+int      aio_fsync(int, struct aiocb *);
+int      aio_read(struct aiocb *);
+ssize_t  aio_return(struct aiocb *);
+int      aio_suspend(const struct aiocb *const[], int, const struct timespec *);
+int      aio_write(struct aiocb *);
+int      lio_listio(int, struct aiocb *const[], int, struct sigevent *);
+
+/* MACROS */
+
+#endif /* __AIO_H_INCLUDED__ */
+
+/* EOF */
+
diff --git a/posix/include/arpa/inet.h b/posix/include/arpa/inet.h
new file mode 100644 (file)
index 0000000..3e74ad5
--- /dev/null
@@ -0,0 +1,56 @@
+/* $Id: inet.h,v 1.4 2002/10/29 04:45:06 rex Exp $
+ */
+/*
+ * arpa/inet.h
+ *
+ * definitions for internet operations. 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 __ARPA_INET_H_INCLUDED__
+#define __ARPA_INET_H_INCLUDED__
+
+/* INCLUDES */
+#include <netinet/in.h>
+#include <inttypes.h>
+
+/* OBJECTS */
+
+/* TYPES */
+
+/* CONSTANTS */
+
+/* PROTOTYPES */
+uint32_t htonl(uint32_t hostlong);
+uint16_t htons(uint16_t hostshort);
+uint32_t ntohl(uint32_t netlong);
+uint16_t ntohs(uint16_t netshort);
+
+in_addr_t      inet_addr(const char *cp);
+in_addr_t      inet_lnaof(struct in_addr in);
+struct in_addr inet_makeaddr(in_addr_t net, in_addr_t lna);
+in_addr_t      inet_netof(struct in_addr in);
+in_addr_t      inet_network(const char *cp);
+char          *inet_ntoa(struct in_addr in);
+
+/* MACROS */
+
+#endif /* __ARPA_INET_H_INCLUDED__ */
+
+/* EOF */
+
diff --git a/posix/include/assert.h b/posix/include/assert.h
new file mode 100644 (file)
index 0000000..05e5b57
--- /dev/null
@@ -0,0 +1,58 @@
+/* $Id: assert.h,v 1.5 2002/10/29 04:45:08 rex Exp $
+ */
+/*
+ * assert.h
+ *
+ * verify program assertion. 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 __ASSERT_H_INCLUDED__
+#define __ASSERT_H_INCLUDED__
+
+/* INCLUDES */
+
+/* OBJECTS */
+
+/* TYPES */
+
+/* CONSTANTS */
+
+/* PROTOTYPES */
+
+/* MACROS */
+#ifdef NDEBUG
+#define assert(IGNORE) ((void) 0)
+#else /* !NDEBUG */
+
+#include <stdio.h>
+#include <stdlib.h>
+
+#define assert(EXPRESSION) \
+ if(!(EXPRESSION)) \
+ { \
+  fputs("__FILE__, line __LINE__: assertion \"EXPRESSION\" failed\n", stderr); \
+  abort(); \
+ }
+
+#endif /* NDEBUG */
+
+#endif /* __ASSERT_H_INCLUDED__ */
+
+/* EOF */
+
diff --git a/posix/include/cpio.h b/posix/include/cpio.h
new file mode 100644 (file)
index 0000000..37534de
--- /dev/null
@@ -0,0 +1,63 @@
+/* $Id: cpio.h,v 1.4 2002/10/29 04:45:08 rex Exp $
+ */
+/*
+ * cpio.h
+ *
+ * cpio archive values. 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 __CPIO_H_INCLUDED__
+#define __CPIO_H_INCLUDED__
+
+/* INCLUDES */
+
+/* TYPES */
+
+/* CONSTANTS */
+#define C_IRUSR  (0000400) /* read by owner */
+#define C_IWUSR  (0000200) /* write by owner */
+#define C_IXUSR  (0000100) /* execute by owner */
+#define C_IRGRP  (0000040) /* read by group */
+#define C_IWGRP  (0000020) /* write by group */
+#define C_IXGRP  (0000010) /* execute by group */
+#define C_IROTH  (0000004) /* read by others */
+#define C_IWOTH  (0000002) /* write by others */
+#define C_IXOTH  (0000001) /* execute by others */
+#define C_ISUID  (0004000) /* set user ID */
+#define C_ISGID  (0002000) /* set group ID */
+#define C_ISVTX  (0001000) /* on directories, restricted deletion flag */
+#define C_ISDIR  (0040000) /* directory */
+#define C_ISFIFO (0010000) /* FIFO */
+#define C_ISREG  (0100000) /* regular file */
+#define C_ISBLK  (0060000) /* block special */
+#define C_ISCHR  (0020000) /* character special */
+#define C_ISCTG  (0110000) /* reserved */
+#define C_ISLNK  (0120000) /* symbolic link */
+#define C_ISSOCK (0140000) /* socket */
+
+#define MAGIC    "070707"
+
+/* PROTOTYPES */
+
+/* MACROS */
+
+#endif /* __CPIO_H_INCLUDED__ */
+
+/* EOF */
+
diff --git a/posix/include/ctype.h b/posix/include/ctype.h
new file mode 100644 (file)
index 0000000..0a5f85c
--- /dev/null
@@ -0,0 +1,61 @@
+/* $Id: ctype.h,v 1.4 2002/10/29 04:45:08 rex Exp $
+ */
+/*
+ * ctype.h
+ *
+ * character 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 __CTYPE_H_INCLUDED__
+#define __CTYPE_H_INCLUDED__
+
+/* INCLUDES */
+
+/* OBJECTS */
+
+/* TYPES */
+
+/* CONSTANTS */
+
+/* PROTOTYPES */
+int   isalnum(int);
+int   isalpha(int);
+int   isascii(int);
+int   iscntrl(int);
+int   isdigit(int);
+int   isgraph(int);
+int   islower(int);
+int   isprint(int);
+int   ispunct(int);
+int   isspace(int);
+int   isupper(int);
+int   isxdigit(int);
+int   toascii(int);
+int   tolower(int);
+int   toupper(int);
+
+/* MACROS */
+/* FIXME: the standard isn't clear about these */
+#define _toupper(c) (toupper(c))
+#define _tolower(c) (tolower(c))
+
+#endif /* __CTYPE_H_INCLUDED__ */
+
+/* EOF */
+
diff --git a/posix/include/dirent.h b/posix/include/dirent.h
new file mode 100644 (file)
index 0000000..b6f7131
--- /dev/null
@@ -0,0 +1,73 @@
+/* $Id: dirent.h,v 1.6 2002/10/29 04:45:08 rex Exp $
+ */
+/*
+ * dirent.h
+ *
+ * format of directory entries. 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 __DIRENT_H_INCLUDED__
+#define __DIRENT_H_INCLUDED__
+
+/* INCLUDES */
+#include <sys/types.h>
+#include <stddef.h>
+#include <limits.h>
+
+/* TYPES */
+typedef void DIR;
+
+#define NAME_MAX (255)
+
+struct dirent
+{
+ ino_t d_ino;               /* file serial number */
+ char * d_name /* [NAME_MAX + 1] */; /* name of entry */
+};
+
+/* for Unicode filenames */
+struct _Wdirent
+{
+ ino_t    d_ino;               /* file serial number */
+ wchar_t * d_name/* [NAME_MAX + 1] */; /* name of entry */
+};
+
+/* CONSTANTS */
+
+/* PROTOTYPES */
+int            closedir(DIR *);
+DIR           *opendir(const char *);
+struct dirent *readdir(DIR *);
+int            readdir_r(DIR *, struct dirent *, struct dirent **);
+void           rewinddir(DIR *);
+void           seekdir(DIR *, long int);
+long int       telldir(DIR *);
+
+/* for Unicode filenames */
+DIR             *_Wopendir(const wchar_t *);
+struct _Wdirent *_Wreaddir(DIR *);
+int              _Wreaddir_r(DIR *, struct _Wdirent *, struct _Wdirent **);
+
+
+/* MACROS */
+
+#endif /* __DIRENT_H_INCLUDED__ */
+
+/* EOF */
+
diff --git a/posix/include/dlfcn.h b/posix/include/dlfcn.h
new file mode 100644 (file)
index 0000000..9296966
--- /dev/null
@@ -0,0 +1,58 @@
+/* $Id: dlfcn.h,v 1.4 2002/10/29 04:45:08 rex Exp $
+ */
+/*
+ * dlfcn.h
+ *
+ * dynamic linking. 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 __DLFCN_H_INCLUDED__
+#define __DLFCN_H_INCLUDED__
+
+/* INCLUDES */
+
+/* TYPES */
+
+/* CONSTANTS */
+#define RTLD_LAZY   (0x00000000) /* Relocations are performed at an \
+                                    implementation-dependent time. */
+#define RTLD_NOW    (0x00000001) /* Relocations are performed when \
+                                    the object is loaded. */
+
+#define RTLD_GLOBAL (0x00000010) /* All symbols are available for \
+                                    relocation processing of other \
+                                    modules. */
+#define RTLD_LOCAL  (0x00000020) /* All symbols are not made available \
+                                    for relocation processing by other \
+                                    modules. */
+
+#define RTLD_NEXT ((void *)(-1))
+
+/* PROTOTYPES */
+void  *dlopen(const char *, int);
+void  *dlsym(void *, const char *);
+int    dlclose(void *);
+char  *dlerror(void);
+
+/* MACROS */
+
+#endif /* __DLFCN_H_INCLUDED__ */
+
+/* EOF */
+
diff --git a/posix/include/errno.h b/posix/include/errno.h
new file mode 100644 (file)
index 0000000..8e210fe
--- /dev/null
@@ -0,0 +1,131 @@
+/* $Id: errno.h,v 1.5 2002/10/29 04:45:08 rex Exp $
+ */
+/*
+ * errno.h
+ *
+ * system error numbers. 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 __ERRNO_H_INCLUDED__
+#define __ERRNO_H_INCLUDED__
+
+/* INCLUDES */
+
+/* OBJECTS */
+
+/* TYPES */
+
+/* CONSTANTS */
+/* errors from 0 to 42 are the same as in Microsoft POSIX */
+#define EZERO           (  0) /* No error. */
+#define EPERM           (  1) /* Operation not permitted. */
+#define ENOENT          (  2) /* No such file or directory. */
+#define ESRCH           (  3) /* No such process. */
+#define EINTR           (  4) /* Interrupted function. */
+#define EIO             (  5) /* I/O error. */
+#define ENXIO           (  6) /* No such device or address. */
+#define E2BIG           (  7) /* Argument list too long. */
+#define ENOEXEC         (  8) /* Executable file format error. */
+#define EBADF           (  9) /* Bad file descriptor. */
+#define ECHILD          ( 10) /* No child processes. */
+#define EAGAIN          ( 11) /* Resource unavailable, try again */
+#define ENOMEM          ( 12) /* Not enough space. */
+#define EACCES          ( 13) /* Permission denied. */
+#define EFAULT          ( 14) /* Bad address. */
+#define ENOTBLK         ( 15) /* Reserved.     */
+#define EBUSY           ( 16) /* Device or resource busy. */
+#define EEXIST          ( 17) /* File exists. */
+#define EXDEV           ( 18) /* Cross-device link. */
+#define ENODEV          ( 19) /* No such device. */
+#define ENOTDIR         ( 20) /* Not a directory. */
+#define EISDIR          ( 21) /* Is a directory. */
+#define EINVAL          ( 22) /* Invalid argument. */
+#define ENFILE          ( 23) /* Too many files open in system. */
+#define EMFILE          ( 24) /* Too many open files. */
+#define ENOTTY          ( 25) /* Inappropriate I/O control operation. */
+#define ETXTBSY         ( 26) /* Text file busy. */
+#define EFBIG           ( 27) /* File too large. */
+#define ENOSPC          ( 28) /* No space left on device. */
+#define ESPIPE          ( 29) /* Invalid seek. */
+#define EROFS           ( 30) /* Read-only file system. */
+#define EMLINK          ( 31) /* Too many links. */
+#define EPIPE           ( 32) /* Broken pipe. */
+#define EDOM            ( 33) /* Mathematics argument out of domain of function. */
+#define ERANGE          ( 34) /* Result too large. */
+#define EUCLEAN                ( 35) /* Reserved. */
+#define EDEADLK         ( 36) /* Resource deadlock would occur. */
+#define UNKNOWN         ( 37) /* Reserved. */
+#define ENAMETOOLONG    ( 38) /* Filename too long. */
+#define ENOLCK          ( 39) /* No locks available. */
+#define ENOSYS          ( 40) /* Function not supported. */
+#define ENOTEMPTY       ( 41) /* Directory not empty. */
+#define EILSEQ          ( 42) /* Illegal byte sequence. */
+/* from this point, constants are in no particular order */
+#define ENODATA         ( 44) /* No message is available on the STREAM head read queue. */
+#define ENOSR           ( 45) /* No STREAM resources. */
+#define ENOSTR          ( 46) /* Not a STREAM. */
+#define ECANCELED       ( 47) /* Operation canceled. */
+#define ENOBUFS         ( 48) /* No buffer space available. */
+#define EOVERFLOW       ( 49) /* Value too large to be stored in data type. */
+#define ENOTSUP         ( 50) /* Not supported. */
+#define EADDRINUSE      ( 51) /* Address in use. */
+#define EADDRNOTAVAIL   ( 52) /* Address not available. */
+#define EAFNOSUPPORT    ( 53) /* Address family not supported. */
+#define ECONNABORTED    ( 54) /* Connection aborted. */
+#define ECONNREFUSED    ( 55) /* Connection refused. */
+#define ECONNRESET      ( 56) /* Connection reset. */
+#define EALREADY        ( 57) /* Connection already in progress. */
+#define EDESTADDRREQ    ( 58) /* Destination address required. */
+#define EHOSTUNREACH    ( 59) /* Host is unreachable. */
+#define EISCONN         ( 60) /* Socket is connected. */
+#define ENETDOWN        ( 61) /* Network is down. */
+#define ENETUNREACH     ( 62) /* Network unreachable. */
+#define ENOPROTOOPT     ( 63) /* Protocol not available. */
+#define ENOTCONN        ( 64) /* The socket is not connected. */
+#define ENOTSOCK        ( 65) /* Not a socket. */
+#define EPROTO          ( 66) /* Protocol error. */
+#define EPROTONOSUPPORT ( 67) /* Protocol not supported. */
+#define EPROTOTYPE      ( 68) /* Socket type not supported. */
+#define EOPNOTSUPP      ( 69) /* Operation not supported on socket. */
+#define ETIMEDOUT       ( 70) /* Connection timed out. */
+#define EINPROGRESS     ( 71) /* Operation in progress. */
+#define EBADMSG         ( 72) /* Bad message. */
+#define EMSGSIZE        ( 73) /* Message too large. */
+#define ENOMSG          ( 74) /* No message of the desired type. */
+#define EDQUOT          ( 75) /* Reserved. */
+#define EIDRM           ( 76) /* Identifier removed. */
+#define ELOOP           ( 77) /* Too many levels of symbolic links. */
+#define EMULTIHOP       ( 78) /* Reserved. */
+#define ENOLINK         ( 79) /* Reserved. */
+#define ESTALE          ( 80) /* Reserved. */
+#define ETIME           ( 81) /* Streamioctl() timeout. */
+#define EWOULDBLOCK     ( 82) /* Operation would block */
+
+#define EDEADLOCK      EDEADLK /* Resource deadlock avoided            */
+
+/* PROTOTYPES */
+int * __PdxGetThreadErrNum(void); /* returns a pointer to the current thread's errno */
+
+/* MACROS */
+#define errno (*__PdxGetThreadErrNum())
+
+#endif /* __ERRNO_H_INCLUDED__ */
+
+/* EOF */
+
diff --git a/posix/include/fcntl.h b/posix/include/fcntl.h
new file mode 100644 (file)
index 0000000..650d9e3
--- /dev/null
@@ -0,0 +1,149 @@
+/* $Id: fcntl.h,v 1.6 2002/10/29 04:45:08 rex Exp $
+ */
+/*
+ * fcntl.h
+ *
+ * file control options. 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 __FCNTL_H_INCLUDED__
+#define __FCNTL_H_INCLUDED__
+
+/* INCLUDES */
+#include <sys/stat.h>
+#include <sys/types.h>
+#include <unistd.h>
+
+/* OBJECTS */
+
+/* TYPES */
+/* 
+  the structure flock describes a file lock
+ */
+struct flock
+{
+ short l_type;   /* type of lock; F_RDLCK, F_WRLCK, F_UNLCK */
+ short l_whence; /* flag for starting offset */
+ off_t l_start;  /* relative offset in bytes */
+ off_t l_len;    /* size; if 0 then until EOF */
+ pid_t l_pid;    /* process ID of the process holding the lock;
+                   returned with F_GETLK */
+};
+
+/* CONSTANTS */
+/*
+  values for cmd used by fcntl()
+ */
+enum __fcntl_cmd
+{
+ F_DUPFD,  /* duplicate file descriptor */
+ F_GETFD,  /* get file descriptor flags */
+ F_GETLK,  /* get record locking information */
+ F_SETFD,  /* set file descriptor flags */
+ F_GETFL,  /* get file status flags and file access modes */
+ F_SETFL,  /* set file status flags */
+ F_SETLK,  /* set record locking information */
+ F_SETLKW, /* set record locking information; wait if blocked */
+/* ReactOS-specific */
+ F_NEWFD,  /* create new file descriptor */
+ F_DELFD,  /* delete file descriptor */
+ F_GETALL, /* get a copy of the internal descriptor object */
+ F_SETALL, /* initialize internal descriptor object */
+ F_GETXP,  /* get file descriptor extra data pointer */
+ F_SETXP,  /* set file descriptor extra data pointer */
+ F_GETXS,  /* get file descriptor extra data size */
+ F_SETXS,  /* set file descriptor extra data size */
+ F_GETFH,  /* get file handle */
+ F_SETFH   /* set file handle */
+};
+
+/* 
+  file descriptor flags used for fcntl()
+ */
+/* Close the file descriptor upon execution of an exec family function. */
+#define FD_CLOEXEC (0x00000001) 
+
+/*
+  values for l_type used for record locking with fcntl()
+ */
+/* Shared or read lock. */
+#define F_RDLCK (1)
+/* Unlock. */
+#define F_UNLCK (2)
+/* Exclusive or write lock. */
+#define F_WRLCK (3)
+
+/*
+  file flags used for open()
+ */
+/* Create file if it does not exist. */
+#define O_CREAT  (0x00000100)
+/* Truncate flag. */
+#define O_TRUNC  (0x00000200)
+/* Exclusive use flag. */
+#define O_EXCL   (0x00000400)
+/* Do not assign controlling terminal. */
+#define O_NOCTTY (0x00000800)
+/* ReactOS-specific */
+/* File must be a directory */
+#define _O_DIRFILE (0x00100000)
+
+/*
+  file status flags used for open() and fcntl()
+ */
+/* Set append mode. */
+#define O_APPEND   (0x00000008)
+/* Non-blocking mode. */
+#define O_NONBLOCK (0x00001000)
+/* Write according to synchronised I/O data integrity completion. */
+#define O_DSYNC    (0x00002000)
+/* Synchronised read I/O operations. */
+#define O_RSYNC    (0x00004000)
+/* Write according to synchronised I/O file integrity completion. */
+#define O_SYNC     (0x00008000)
+
+/* 
+  file access modes used for open() and fcntl()
+ */
+/* Open for reading only. */
+#define O_RDONLY (0x00000000)
+/* Open for writing only. */
+#define O_WRONLY (0x00000001)
+/* Open for reading and writing. */
+#define O_RDWR   (0x00000002)
+
+/* 
+  mask for use with file access modes
+ */
+#define O_ACCMODE (0x00000007)
+
+/* PROTOTYPES */
+int  creat(const char *, mode_t);
+int  fcntl(int, int, ...);
+int  open(const char *, int, ...);
+
+int _Wcreat(const wchar_t *, mode_t);
+int _Wopen(const wchar_t *, int, ...);
+
+/* MACROS */
+
+#endif /* __FCNTL_H_INCLUDED__ */
+
+/* EOF */
+
diff --git a/posix/include/fmtmsg.h b/posix/include/fmtmsg.h
new file mode 100644 (file)
index 0000000..4775793
--- /dev/null
@@ -0,0 +1,93 @@
+/* $Id: fmtmsg.h,v 1.4 2002/10/29 04:45:08 rex Exp $
+ */
+/*
+ * fmtmsg.h
+ *
+ * message display structures. 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 __FMTMSG_H_INCLUDED__
+#define __FMTMSG_H_INCLUDED__
+
+/* INCLUDES */
+
+/* OBJECTS */
+
+/* TYPES */
+
+/* CONSTANTS */
+/* Major Classifications */
+/* NOTE: these are unique values, not flags. Their bits can overlap, but
+   cannot overlap with those of other categories */
+#define MM_HARD (0x00000001) /* Source of the condition is hardware. */
+#define MM_SOFT (0x00000002) /* Source of the condition is software. */
+#define MM_FIRM (0x00000003) /* Source of the condition is firmware. */
+
+/* Message Source Subclassifications */
+/* NOTE: these are unique values, not flags. Their bits can overlap, but
+   cannot overlap with those of other categories */
+#define MM_APPL  (0x00000010) /* Condition detected by application. */
+#define MM_UTIL  (0x00000020) /* Condition detected by utility. */
+#define MM_OPSYS (0x00000030) /* Condition detected by operating system. */
+
+/* Status Subclassifications */
+/* NOTE: these are unique values, not flags. Their bits can overlap, but
+   cannot overlap with those of other categories */
+#define MM_RECOVER (0x00000100) /* Recoverable error. */
+#define MM_NRECOV  (0x00000200) /* Non-recoverable error. */
+
+/* Display Subclassifications */
+/* NOTE: these, unlike other classification constants, are flags. Their
+   bits must be distinct */
+#define MM_PRINT   (0x00001000) /* Display message on standard error. */
+#define MM_CONSOLE (0x00002000) /* Display message on system console. */
+
+/* Identifiers for the levels of severity */
+#define MM_NOSEV   (0) /* No severity level provided for the message. */
+#define MM_INFO    (1) /* Informative message. */
+#define MM_WARNING (2) /* Application has detected unusual non-error \
+                          condition. */
+#define MM_ERROR   (3) /* Application has encountered a non-fatal fault. */
+#define MM_HALT    (4) /* Error causing application to halt. */
+
+/* Null values and identifiers */
+#define MM_NULLLBL ((char *)0) /* Null label */
+#define MM_NULLSEV (0)         /* Null severity */
+#define MM_NULLMC  (0L)        /* Null class */
+#define MM_NULLTXT ((char *)0) /* Null text */
+#define MM_NULLACT ((char *)0) /* Null action */
+#define MM_NULLTAG ((char *)0) /* Null tag */
+
+/* Return values */
+#define MM_OK    ( 0) /* The function succeeded. */
+#define MM_NOTOK (-1) /* The function failed completely. */
+#define MM_NOMSG (-2) /* The function was unable to generate a message on \
+                         standard error, but otherwise succeeded. */
+#define MM_NOCON (-3) /* The function was unable to generate a console \
+                         message, but otherwise succeeded. */
+
+/* PROTOTYPES */
+int fmtmsg(long, const char*, int, const char*, const char*, const char*);
+
+/* MACROS */
+
+#endif /* __FMTMSG_H_INCLUDED__ */
+
+/* EOF */
+
diff --git a/posix/include/fnmatch.h b/posix/include/fnmatch.h
new file mode 100644 (file)
index 0000000..10f4f22
--- /dev/null
@@ -0,0 +1,66 @@
+/* $Id: fnmatch.h,v 1.4 2002/10/29 04:45:08 rex Exp $
+ */
+/*
+ * fnmatch.h
+ *
+ * filename-matching 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 __FNMATCH_H_INCLUDED__
+#define __FNMATCH_H_INCLUDED__
+
+/* INCLUDES */
+#ifdef __PSXDLL__
+
+/* headers for internal usage by psxdll.dll and ReactOS */
+
+#else /* ! __PSXDLL__ */
+
+/* standard POSIX headers */
+
+#endif
+
+/* OBJECTS */
+
+/* TYPES */
+
+/* CONSTANTS */
+/* Flags */
+#define FNM_PATHNAME (0x00000001) /* Slash in string only matches slash \
+                                     in pattern. */
+#define FNM_PERIOD   (0x00000002) /* Leading period in string must be \
+                                     exactly matched by period in \
+                                     pattern. */
+#define FNM_NOESCAPE (0x00000004) /* Disable backslash escaping. */
+
+/* Return values */
+#define FNM_NOMATCH (1) /* The string does not match the specified \
+                           pattern. */
+#define FNM_NOSYS   (2) /* The implementation does not support this \
+                           function. */
+
+/* PROTOTYPES */
+int fnmatch(const char *, const char *, int);
+
+/* MACROS */
+
+#endif /* __FNMATCH_H_INCLUDED__ */
+
+/* EOF */
+
diff --git a/posix/include/ftw.h b/posix/include/ftw.h
new file mode 100644 (file)
index 0000000..60cb869
--- /dev/null
@@ -0,0 +1,73 @@
+/* $Id: ftw.h,v 1.4 2002/10/29 04:45:08 rex Exp $
+ */
+/*
+ * ftw.h
+ *
+ * file tree traversal. 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 __FTW_H_INCLUDED__
+#define __FTW_H_INCLUDED__
+
+/* INCLUDES */
+
+/* OBJECTS */
+
+/* TYPES */
+struct FTW
+{
+ int  base;
+ int  level;
+};
+
+/* CONSTANTS */
+/* Values of the third argument to the application-supplied function
+   that is passed as the second argument to ftw() and nftw() */
+#define FTW_F   (1) /* File. */
+#define FTW_D   (2) /* Directory. */
+#define FTW_DNR (3) /* Directory without read permission. */
+#define FTW_DP  (4) /* Directory with subdirectories visited. */
+#define FTW_NS  (5) /* Unknown type, stat() failed. */
+#define FTW_SL  (6) /* Symbolic link. */
+#define FTW_SLN (7) /* Symbolic link that names a non-existent file. */
+
+/* Values of the fourth argument to nftw() */
+#define FTW_PHYS  (0x00000001) /* Physical walk, does not follow symbolic \
+                                  links. Otherwise, nftw() will follow \
+                                  links but will not walk down any path \
+                                  that crosses itself. */
+#define FTW_MOUNT (0x00000002) /* The walk will not cross a mount point. */
+#define FTW_DEPTH (0x00000004) /* All subdirectories will be visited before \
+                                  the directory itself. */
+#define FTW_CHDIR (0x00000008) /* The walk will change to each directory \
+                                  before reading it. */
+
+/* PROTOTYPES */
+int ftw(const char *,
+    int (*)(const char *, const struct stat *, int), int);
+int nftw(const char *, int (*)
+    (const char *, const struct stat *, int, struct FTW*),
+    int, int);
+
+/* MACROS */
+
+#endif /* __FTW_H_INCLUDED__ */
+
+/* EOF */
+
diff --git a/posix/include/glob.h b/posix/include/glob.h
new file mode 100644 (file)
index 0000000..ff36fce
--- /dev/null
@@ -0,0 +1,73 @@
+/* $Id: glob.h,v 1.4 2002/10/29 04:45:10 rex Exp $
+ */
+/*
+ * glob.h
+ *
+ * pathname pattern-matching 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 __GLOB_H_INCLUDED__
+#define __GLOB_H_INCLUDED__
+
+/* INCLUDES */
+
+/* OBJECTS */
+
+/* TYPES */
+typedef struct __tagglob_t
+{
+ size_t   gl_pathc; /* count of paths matched by pattern */
+ char   **gl_pathv; /* pointer to a list of matched pathnames */
+ size_t   gl_offs;  /* slots to reserve at the beginning of gl_pathv */
+} glob_t;
+
+/* CONSTANTS */
+/* Values for the flags argument */
+#define GLOB_APPEND   (0x00000001) /* Append generated pathnames to \
+                                      those previously obtained. */
+#define GLOB_DOOFFS   (0x00000002) /* Specify how many null pointers to \
+                                      add to the beginning of */
+#define GLOB_ERR      (0x00000004) /* Cause glob() to return on error. */
+#define GLOB_MARK     (0x00000008) /* Each pathname that is a directory \
+                                      that matches pattern has a slash \
+                                      appended. */
+#define GLOB_NOCHECK  (0x00000010) /* If pattern does not match any pathname, \
+                                      then return a list consisting of only \
+                                      pattern. */
+#define GLOB_NOESCAPE (0x00000020) /* Disable backslash escaping. */
+#define GLOB_NOSORT   (0x00000040) /* Do not sort the pathnames returned. */
+
+/* Error return values */
+#define GLOB_ABORTED (-1) /* The scan was stopped because GLOB_ERR was set \
+                             or errfunc returned non-zero. */
+#define GLOB_NOMATCH (-2) /* The pattern does not match any existing pathname, \
+                             and GLOB_NOCHECK was not set in flags. */
+#define GLOB_NOSPACE (-3) /* An attempt to allocate memory failed. */
+#define GLOB_NOSYS   (-4) /* The implementation does not support this function. */
+
+/* PROTOTYPES */
+int glob(const char *, int, int (*)(const char *, int), glob_t *);
+void globfree (glob_t *);
+
+/* MACROS */
+
+#endif /* __GLOB_H_INCLUDED__ */
+
+/* EOF */
+
diff --git a/posix/include/grp.h b/posix/include/grp.h
new file mode 100644 (file)
index 0000000..e24576b
--- /dev/null
@@ -0,0 +1,59 @@
+/* $Id: grp.h,v 1.4 2002/10/29 04:45:10 rex Exp $
+ */
+/*
+ * grp.h
+ *
+ * group structure. 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 __GRP_H_INCLUDED__
+#define __GRP_H_INCLUDED__
+
+/* INCLUDES */
+
+/* OBJECTS */
+
+/* TYPES */
+struct group
+{
+ char   *gr_name; /* the name of the group */
+ gid_t   gr_gid;  /* numerical group ID */
+ char  **gr_mem;  /* pointer to a null-terminated array of character
+                     pointers to member names */
+};
+
+/* CONSTANTS */
+
+/* PROTOTYPES */
+struct group  *getgrgid(gid_t);
+struct group  *getgrnam(const char *);
+int            getgrgid_r(gid_t, struct group *, char *,
+                   size_t, struct group **);
+int            getgrnam_r(const char *, struct group *, char *,
+                   size_t , struct group **);
+struct group  *getgrent(void);
+void           endgrent(void);
+void           setgrent(void);
+
+/* MACROS */
+
+#endif /* __GRP_H_INCLUDED__ */
+
+/* EOF */
+
diff --git a/posix/include/iconv.h b/posix/include/iconv.h
new file mode 100644 (file)
index 0000000..15af2d2
--- /dev/null
@@ -0,0 +1,47 @@
+/* $Id: iconv.h,v 1.4 2002/10/29 04:45:10 rex Exp $
+ */
+/*
+ * iconv.h
+ *
+ * codeset conversion facility. 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 __ICONV_H_INCLUDED__
+#define __ICONV_H_INCLUDED__
+
+/* INCLUDES */
+
+/* OBJECTS */
+
+/* TYPES */
+typedef (void *) iconv_t;
+
+/* CONSTANTS */
+
+/* PROTOTYPES */
+iconv_t iconv_open(const char *, const char *);
+size_t  iconv(iconv_t, char **, size_t *, char **, size_t *);
+int     iconv_close(iconv_t);
+
+/* MACROS */
+
+#endif /* __ICONV_H_INCLUDED__ */
+
+/* EOF */
+
diff --git a/posix/include/inttypes.h b/posix/include/inttypes.h
new file mode 100644 (file)
index 0000000..f15668a
--- /dev/null
@@ -0,0 +1,60 @@
+/* $Id: inttypes.h,v 1.4 2002/10/29 04:45:10 rex Exp $
+ */
+/*
+ * inttypes.h
+ *
+ * fixed size integral 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 __INTTYPES_H_INCLUDED__
+#define __INTTYPES_H_INCLUDED__
+
+/* INCLUDES */
+
+/* OBJECTS */
+
+/* TYPES */
+/* signed */
+typedef signed char        int8_t;  /*  8-bit signed integral type. */
+typedef signed short int   int16_t; /* 16-bit signed integral type. */
+typedef signed long int    int32_t; /* 32-bit signed integral type. */
+typedef signed long long   int64_t; /* 64-bit signed integral type. */
+
+/* unsigned */
+typedef unsigned char      uint8_t;  /*  8-bit unsigned integral type. */
+typedef unsigned short int uint16_t; /* 16-bit unsigned integral type. */
+typedef unsigned long int  uint32_t; /* 32-bit unsigned integral type. */
+typedef unsigned long long uint64_t; /* 64-bit unsigned integral type. */
+
+/* pointer-sized */
+typedef signed long int    intptr_t; /* Signed integral type large enough
+                                          to hold any pointer. */
+typedef unsigned long int  uintptr_t; /* Unsigned integral type large
+                                           enough to hold any pointer. */
+
+/* CONSTANTS */
+
+/* PROTOTYPES */
+
+/* MACROS */
+
+#endif /* __INTTYPES_H_INCLUDED__ */
+
+/* EOF */
+
diff --git a/posix/include/iso646.h b/posix/include/iso646.h
new file mode 100644 (file)
index 0000000..12e9c84
--- /dev/null
@@ -0,0 +1,54 @@
+/* $Id: iso646.h,v 1.4 2002/10/29 04:45:10 rex Exp $
+ */
+/*
+ * iso646.h
+ *
+ * alternative spellings. 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 __ISO646_H_INCLUDED__
+#define __ISO646_H_INCLUDED__
+
+/* INCLUDES */
+
+/* OBJECTS */
+
+/* TYPES */
+
+/* CONSTANTS */
+
+/* PROTOTYPES */
+
+/* MACROS */
+#define and    &&
+#define and_eq &=
+#define bitand &
+#define bitor  |
+#define compl  ~
+#define not    !
+#define not_eq !=
+#define or     ||
+#define or_eq  |=
+#define xor    ^
+#define xor_eq ^=
+
+#endif /* __ISO646_H_INCLUDED__ */
+
+/* EOF */
+
diff --git a/posix/include/libgen.h b/posix/include/libgen.h
new file mode 100644 (file)
index 0000000..e98d23a
--- /dev/null
@@ -0,0 +1,52 @@
+/* $Id: libgen.h,v 1.4 2002/10/29 04:45:10 rex Exp $
+ */
+/*
+ * libgen.h
+ *
+ * definitions for pattern matching functions. 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 __LIBGEN_H_INCLUDED__
+#define __LIBGEN_H_INCLUDED__
+
+/* INCLUDES */
+#include <stddef.h>
+
+/* OBJECTS */
+extern char *__loc1; /* LEGACY */
+
+/* TYPES */
+
+/* CONSTANTS */
+
+/* PROTOTYPES */
+char  *basename(char *);
+char  *dirname(char *);
+char  *regcmp(const char *, ...); /* LEGACY */
+char  *regex(const char *, const char *, ...); /* LEGACY */
+
+wchar_t *_Wbasename(wchar_t *);
+wchar_t *_Wdirname(wchar_t *);
+
+/* MACROS */
+
+#endif /* __LIBGEN_H_INCLUDED__ */
+
+/* EOF */
+
diff --git a/posix/include/limits.h b/posix/include/limits.h
new file mode 100644 (file)
index 0000000..c5a2a52
--- /dev/null
@@ -0,0 +1,48 @@
+/* $Id: limits.h,v 1.5 2002/10/29 04:45:10 rex Exp $
+ */
+/*
+ * limits.h
+ *
+ * implementation-dependent constants. 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 __LIMITS_H_INCLUDED__
+#define __LIMITS_H_INCLUDED__
+
+/* INCLUDES */
+
+/* OBJECTS */
+
+/* TYPES */
+
+/* CONSTANTS */
+/* TODO */
+#define OPEN_MAX (256)
+#define NAME_MAX (255)
+#define ARG_MAX  (255)
+#define PATH_MAX (32768)
+
+/* PROTOTYPES */
+
+/* MACROS */
+
+#endif /* __LIMITS_H_INCLUDED__ */
+
+/* EOF */
+
diff --git a/posix/include/math.h b/posix/include/math.h
new file mode 100644 (file)
index 0000000..9bc6719
--- /dev/null
@@ -0,0 +1,65 @@
+/* $Id: math.h,v 1.4 2002/10/29 04:45:10 rex Exp $
+ */
+/*
+ * math.h
+ *
+ * mathematical declarations. 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 __MATH_H_INCLUDED__
+#define __MATH_H_INCLUDED__
+
+/* INCLUDES */
+#ifdef __PSXDLL__
+
+/* headers for internal usage by psxdll.dll and ReactOS */
+
+#else /* ! __PSXDLL__ */
+
+/* standard POSIX headers */
+
+#endif
+
+/* OBJECTS */
+
+/* TYPES */
+
+/* CONSTANTS */
+#define M_E        ((double) 2.7182818285) /* Value of e */
+#define M_LOG2E    ((double) 1.4426950419) /* Value of log2(e) */
+#define M_LOG10E   ((double) 0.4342944819) /* Value of log10(e) */
+#define M_LN2      ((double)-0.6931471806) /* Value of loge2 */
+#define M_LN10     ((double) 2.3025850929) /* Value of loge10 */
+#define M_PI       ((double) 3.1415926536) /* Value of Pi */
+#define M_PI_2     ((double) 1.5707963268) /* Value of Pi/2 */
+#define M_PI_4     ((double) 0.7853981634) /* Value of Pi/4 */
+#define M_1_PI     ((double) 0.3183098862) /* Value of 1/Pi */
+#define M_2_PI     ((double) 0.6366197724) /* Value of 2/Pi */
+#define M_2_SQRTPI ((double) 1.1283791671) /* Value of 2/Sqrt(Pi) */
+#define M_SQRT2    ((double) 1.4142135624) /* Value of Sqrt(2) */
+#define M_SQRT1_2  ((double) 0.7071067812) /* Value of Sqrt(1/2) */
+
+/* PROTOTYPES */
+
+/* MACROS */
+
+#endif /* __MATH_H_INCLUDED__ */
+
+/* EOF */
+
diff --git a/posix/include/netinet/in.h b/posix/include/netinet/in.h
new file mode 100644 (file)
index 0000000..e9e8ac8
--- /dev/null
@@ -0,0 +1,43 @@
+/* $Id: in.h,v 1.4 2002/10/29 04:45:10 rex Exp $
+ */
+/*
+ * netinet/in.h
+ *
+ * Internet Protocol family. 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 __NETINET_IN_H_INCLUDED__
+#define __NETINET_IN_H_INCLUDED__
+
+/* INCLUDES */
+
+/* OBJECTS */
+
+/* TYPES */
+
+/* CONSTANTS */
+
+/* PROTOTYPES */
+
+/* MACROS */
+
+#endif /* __NETINET_IN_H_INCLUDED__ */
+
+/* EOF */
+
diff --git a/posix/include/psx/debug.h b/posix/include/psx/debug.h
new file mode 100644 (file)
index 0000000..faa8977
--- /dev/null
@@ -0,0 +1,146 @@
+/* $Id: debug.h,v 1.4 2002/10/29 04:45:11 rex Exp $
+ */
+/*
+ * psx/debug.h
+ *
+ * debugging utilities
+ *
+ * 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 __PSX_DEBUG_H_INCLUDED__
+#define __PSX_DEBUG_H_INCLUDED__
+
+/* INCLUDES */
+#ifdef __PSX_DEBUG_TO_STDERR__
+#include <stdio.h>
+#else /* !defined(__PSX_DEBUG_TO_STDERR__) */
+#include <ddk/ntddk.h>
+#endif /* defined(__PSX_DEBUG_TO_STDERR__) */
+
+/* OBJECTS */
+
+/* TYPES */
+
+/* CONSTANTS */
+
+/* PROTOTYPES */
+
+/* MACROS */
+
+#define __PSX_MODULE__ "psxdll.dll"
+
+#ifndef NDEBUG
+
+#ifdef __PSX_DEBUG_TO_STDERR__
+
+#if 0
+#define DEBUGOUT(MODULE,TYPE,ARGS...) \
+do{ \
+ fprintf(stderr,"%s:%s:%s:%d:%s():\n\t",(MODULE),(TYPE),__FILE__,__LINE__,__FUNCTION__); \
+ fprintf(stderr,ARGS); \
+ fprintf("\n"); \
+} \
+while(0)
+#endif
+
+#define DEBUGOUT(MODULE,TYPE,ARGS...) \
+do{ \
+ printf("%s:%s:%s:%d:%s():\n\t",(MODULE),(TYPE),__FILE__,__LINE__,__FUNCTION__); \
+ printf(ARGS); \
+ printf("\n"); \
+} \
+while(0)
+
+
+#else /* !defined(__PSX_DEBUG_TO_STDERR__) */
+
+#define DEBUGOUT(MODULE,TYPE,ARGS...) \
+do{ \
+ DbgPrint("%s:%s:%s:%d:%s():\n\t",(MODULE),(TYPE),__FILE__,__LINE__,__FUNCTION__); \
+ DbgPrint(ARGS); \
+ DbgPrint("\n"); \
+} \
+while(0)
+
+#endif /* defined(__PSX_DEBUG_TO_STDERR__) */
+
+#define DEBUGOUTIF(CONDITION,MODULE,TYPE,ARGS...) \
+if((CONDITION)) \
+{ \
+ DEBUGOUT((MODULE),(TYPE),ARGS); \
+}
+
+#else /* defined(NDEBUG) */
+
+#define DEBUGOUTIF(c,m,t,args...)
+#define DEBUGOUT(m,t,args...)
+
+#endif /* !defined(NDEBUG) */
+
+#if defined(__PSX_DEBUG_WANT_ALL__) || defined(__PSX_DEBUG_WANT_HINTS__)
+#define HINT(args...)  DEBUGOUT(__PSX_MODULE__,"HINT",args)
+#define HINTIF(c,args...)  DEBUGOUTIF((c),__PSX_MODULE__,"HINT",args)
+#else
+#define HINT(args...)
+#define HINTIF(c,args...)
+#endif
+
+#if defined(__PSX_DEBUG_WANT_ALL__) || defined(__PSX_DEBUG_WANT_INFOS__)
+#define INFO(args...)  DEBUGOUT(__PSX_MODULE__,"INFO",args)
+#define INFOIF(c,args...)  DEBUGOUTIF((c),__PSX_MODULE__,"INFO",args)
+#else
+#define INFO(args...)
+#define INFOIF(c,args...)
+#endif
+
+#if defined(__PSX_DEBUG_WANT_ALL__) || defined(__PSX_DEBUG_WANT_WARNS__)
+#define WARN(args...)  DEBUGOUT(__PSX_MODULE__,"WARN",args)
+#define WARNIF(c,args...)  DEBUGOUTIF((c),__PSX_MODULE__,"WARN",args)
+#else
+#define WARN(args...)
+#define WARNIF(c,args...)
+#endif
+
+#if defined(__PSX_DEBUG_WANT_ALL__) || defined(__PSX_DEBUG_WANT_ERRS__)
+#define ERR(args...)   DEBUGOUT(__PSX_MODULE__,"ERR",args)
+#define ERRIF(c,args...)   DEBUGOUTIF((c),__PSX_MODULE__,"ERR",args)
+#else
+#define ERR(args...)
+#define ERRIF(c,args...)
+#endif
+
+#if defined(__PSX_DEBUG_WANT_ALL__) || defined(__PSX_DEBUG_WANT_TODOS__)
+#define TODO(args...)  DEBUGOUT(__PSX_MODULE__,"TODO",args)
+#define TODOIF(c,args...)  DEBUGOUTIF((c),__PSX_MODULE__,"TODO",args)
+#else
+#define TODO(args...)
+#define TODOIF(c,args...)
+#endif
+
+#if defined(__PSX_DEBUG_WANT_ALL__) || defined(__PSX_DEBUG_WANT_FIXMES__)
+#define FIXME(args...) DEBUGOUT(__PSX_MODULE__,"FIXME",args)
+#define FIXMEIF(c,args...) DEBUGOUTIF((c),__PSX_MODULE__,"FIXME",args)
+#else
+#define FIXME(args...)
+#define FIXMEIF(c,args...)
+#endif
+
+
+#endif /* __PSX_DEBUG_H_INCLUDED__ */
+
+/* EOF */
+
diff --git a/posix/include/psx/dirent.h b/posix/include/psx/dirent.h
new file mode 100644 (file)
index 0000000..396fe17
--- /dev/null
@@ -0,0 +1,57 @@
+/* $Id: dirent.h,v 1.4 2002/10/29 04:45:13 rex Exp $
+ */
+/*
+ * psx/dirent.h
+ *
+ * internal dirent.h
+ *
+ * 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 __PSX_DIRENT_H_INCLUDED__
+#define __PSX_DIRENT_H_INCLUDED__
+
+/* INCLUDES */
+#include <ddk/ntddk.h>
+#include <dirent.h>
+#include <psx/safeobj.h>
+
+/* OBJECTS */
+
+/* TYPES */
+struct __internal_DIR
+{
+ __magic_t                  signature;      /* signature to verify object's validity across calls */
+ union __any_dirent{
+  struct dirent   de_ansi;
+  struct _Wdirent de_unicode;
+ }                          ent;            /* storage for return buffer of readdir() */
+ int                        fildes;         /* file descriptor of the directory */
+ FILE_DIRECTORY_INFORMATION info;           /* directory entry information */
+ WCHAR                      name[MAX_PATH]; /* filename buffer */
+};
+
+/* CONSTANTS */
+#define __IDIR_MAGIC MAGIC('I', 'D', 'I', 'R')
+
+/* PROTOTYPES */
+
+/* MACROS */
+
+#endif /* __PSX_DIRENT_H_INCLUDED__ */
+
+/* EOF */
+
diff --git a/posix/include/psx/dlfcn.h b/posix/include/psx/dlfcn.h
new file mode 100644 (file)
index 0000000..ae5d154
--- /dev/null
@@ -0,0 +1,53 @@
+/* $Id: dlfcn.h,v 1.4 2002/10/29 04:45:13 rex Exp $
+ */
+/*
+ * psx/dlfcn.h
+ *
+ * internal dlfcn.h
+ *
+ * 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 __PSX_DLFCN_H_INCLUDED__
+#define __PSX_DLFCN_H_INCLUDED__
+
+/* INCLUDES */
+#include <psx/errno.h>
+
+/* OBJECTS */
+
+/* TYPES */
+/* internal representation for loaded DLLs */
+/* TODO: get rid of this. The handle should be enough, with a proper PE loader */
+struct __dlobj
+{
+ int   global; /* if non-zero, all the other fields have no meaning */
+ void *handle; /* pointer to the module mapping */
+};
+
+/* CONSTANTS */
+
+/* PROTOTYPES */
+void __dl_set_last_error(int);
+
+/* MACROS */
+#define __dl_get_reloc_flag(m) ((m) & (RTLD_LAZY | RTLD_NOW))
+#define __dl_get_scope_flag(m) ((m) & (RTLD_GLOBAL | RTLD_LOCAL))
+
+#endif /* __PSX_DLFCN_H_INCLUDED__ */
+
+/* EOF */
+
diff --git a/posix/include/psx/errno.h b/posix/include/psx/errno.h
new file mode 100644 (file)
index 0000000..6ea07f8
--- /dev/null
@@ -0,0 +1,45 @@
+/* $Id: errno.h,v 1.4 2002/10/29 04:45:13 rex Exp $
+ */
+/*
+ * psx/errno.h
+ *
+ * internal errno.h
+ *
+ * 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 __PSX_ERRNO_H_INCLUDED__
+#define __PSX_ERRNO_H_INCLUDED__
+
+/* INCLUDES */
+#include <errno.h>
+
+/* OBJECTS */
+
+/* TYPES */
+
+/* CONSTANTS */
+
+/* PROTOTYPES */
+
+/* MACROS */
+#define __status_to_errno(s) (s)
+#define __set_errno_from_status(s) (errno = __status_to_errno((s)))
+
+#endif /* __PSX_ERRNO_H_INCLUDED__ */
+
+/* EOF */
+
diff --git a/posix/include/psx/fdtable.h b/posix/include/psx/fdtable.h
new file mode 100644 (file)
index 0000000..edc8831
--- /dev/null
@@ -0,0 +1,73 @@
+/* $Id: fdtable.h,v 1.5 2002/10/29 04:45:13 rex Exp $
+ */
+/*
+ * psx/fdtable.h
+ *
+ * POSIX+ subsystem file descriptor table data structure
+ *
+ * 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 __PSX_FDTABLE_H_INCLUDED__
+#define __PSX_FDTABLE_H_INCLUDED__
+
+/* INCLUDES */
+#include <limits.h>
+#include <inttypes.h>
+#include <stddef.h>
+#include <psx/safeobj.h>
+
+/* OBJECTS */
+
+/* TYPES */
+typedef struct __tagfildes_t
+{
+ void  *FileHandle;
+ int    OpenFlags;
+ int    FdFlags;
+ size_t ExtraDataSize;
+ void  *ExtraData;
+} __fildes_t;
+
+typedef struct __tagfdtable_t
+{
+ __magic_t   Signature;
+ int32_t     LowestUnusedFileNo;
+ int32_t     UsedDescriptors;
+ int32_t     AllocatedDescriptors;
+ uint32_t    DescriptorsBitmap[OPEN_MAX / 32];
+ __fildes_t *Descriptors;
+} __fdtable_t;
+
+/* CONSTANTS */
+
+/* PROTOTYPES */
+int __fdtable_init(__fdtable_t *);
+int __fdtable_free(__fdtable_t *);
+
+int         __fdtable_entry_isavail(__fdtable_t *, int);
+int         __fdtable_entry_nextavail(__fdtable_t *, int);
+int         __fdtable_entry_add(__fdtable_t *, int, __fildes_t *, __fildes_t **);
+int         __fdtable_entry_remove(__fdtable_t *, int);
+__fildes_t *__fdtable_entry_get(__fdtable_t *, int);
+
+/* MACROS */
+#define __FDTABLE_MAGIC MAGIC('F', 'D', 'T', 'B')
+
+#endif /* __PSX_FDTABLE_H_INCLUDED__ */
+
+/* EOF */
+
diff --git a/posix/include/psx/interlock.h b/posix/include/psx/interlock.h
new file mode 100644 (file)
index 0000000..7858637
--- /dev/null
@@ -0,0 +1,45 @@
+/* $Id: interlock.h,v 1.4 2002/10/29 04:45:13 rex Exp $
+ */
+/*
+ * psx/interlock.h
+ *
+ * inter-locked increment/decrement
+ *
+ * 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 __PSX_INTERLOCK_H_INCLUDED__
+#define __PSX_INTERLOCK_H_INCLUDED__
+
+/* INCLUDES */
+
+/* OBJECTS */
+
+/* TYPES */
+
+/* CONSTANTS */
+
+/* PROTOTYPES */
+int __interlock_inc(int *);
+int __interlock_dec(int *);
+int __interlock_add(int *, int);
+
+/* MACROS */
+
+#endif /* __PSX_INTERLOCK_H_INCLUDED__ */
+
+/* EOF */
+
diff --git a/posix/include/psx/lpcproto.h b/posix/include/psx/lpcproto.h
new file mode 100644 (file)
index 0000000..ed77701
--- /dev/null
@@ -0,0 +1,88 @@
+/* $Id: lpcproto.h,v 1.5 2002/10/29 04:45:13 rex Exp $
+ *
+ * ReactOS POSIX+ Environment Subsystem
+ * LPC protocol spoken by PSXSS.EXE, PSXDLL.DLL, CSRTERM.EXE.
+ */
+#ifndef _PSX_LPCPROTO_H
+#define _PSX_LPCPROTO_H
+
+#include <napi/lpc.h>
+
+#ifndef PRIVATE
+#define PRIVATE static
+#endif
+
+/* Protocol version */
+#define PSX_LPC_PROTOCOL_VERSION 1
+
+/* POSIX+ system name space */
+#define PSX_NS_SUBSYSTEM_DIRECTORY_NAME L"POSIX+"
+#define PSX_NS_SESSION_DIRECTORY_NAME   L"Sessions"
+#define PSX_NS_SYSTEM_DIRECTORY_NAME    L"System"
+#define PSX_NS_API_PORT_NAME            L"ApiPort"
+#define PSX_NS_SBAPI_PORT_NAME          L"SbApiPort"
+#define PSX_NS_SESSIONAPI_PORT_NAME     L"SessionPort"
+#define PSX_NS_API_PORT_TEMPLATE        L"\\%s\\%s"
+#define PSX_NS_SESSION_PORT_TEMPLATE    L"\\%s\\%s\\P%d"
+#define PSX_NS_SESSION_DATA_TEMPLATE    L"\\%s\\%s\\D%d"
+
+/* ConnectData protocol */
+
+typedef enum {
+       PSX_CONNECTION_TYPE_PROCESS,
+       PSX_CONNECTION_TYPE_TERMINAL,
+       PSX_CONNECTION_TYPE_SERVER
+} PSX_CONNECTION_TYPE;
+
+typedef struct _PSX_CONNECT_PORT_DATA
+{
+       PSX_CONNECTION_TYPE     ConnectionType; /* IN OUT */
+       ULONG                   Version;        /* IN OUT */
+       ULONG                   PortIdentifier; /* OUT */
+} PSX_CONNECT_PORT_DATA, * PPSX_CONNECT_PORT_DATA;
+
+/* LPC message subsystem-specific header */
+
+typedef struct _PSX_MESSAGE_HEADER
+{
+       WORD                    Context;
+       WORD                    Procedure;
+       NTSTATUS                Status;
+} PSX_MESSAGE_HEADER, * PPSX_MESSAGE_HEADER;
+
+typedef PSX_MESSAGE_HEADER PSX_MESSAGE, * PPSX_MESSAGE;
+
+#define PSX_MAX_LPC_DATA_SIZE 128 /* compute it*/
+
+typedef struct _PSX_MAX_MESSAGE
+{
+    LPC_MESSAGE_HEADER Header;
+    PSX_MESSAGE_HEADER PsxHeader;
+    BYTE               Data [PSX_MAX_LPC_DATA_SIZE];
+} PSX_MAX_MESSAGE, * PPSX_MAX_MESSAGE;
+
+/* Terminal I/O */
+
+/* \POSIX+\SessionPort API */
+
+#define PSX_TERMINAL_SECTION_SIZE   65536L
+#define PSX_TERMINAL_SECTION_OFFSET 8192L
+
+typedef enum {
+       PSX_TERMINAL_INTERRUPT,
+       PSX_TERMINAL_SESSION_STATUS_REQUEST
+} PSX_TERMINAL_API;
+
+typedef struct _PSX_TERMINAL_IO
+{
+    LPC_MESSAGE_HEADER Header;
+    PSX_MESSAGE_HEADER PsxHeader;
+    ULONG              Size;
+    ULONG              Offset;
+} PSX_TERMINAL_READ, * PPSX_TERMINAL_READ;
+
+/* System I/O (system calls) */
+
+#include <psx/syscall.h>
+
+#endif /* ndef _PSX_LPCPROTO_H */
diff --git a/posix/include/psx/path.h b/posix/include/psx/path.h
new file mode 100644 (file)
index 0000000..eb96621
--- /dev/null
@@ -0,0 +1,112 @@
+/* $Id: path.h,v 1.4 2002/10/29 04:45:13 rex Exp $
+ */
+/*
+ * psx/path.h
+ *
+ * POSIX+ subsystem path functions
+ *
+ * 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 __PSX_PATH_H_INCLUDED__
+#define __PSX_PATH_H_INCLUDED__
+
+/* INCLUDES */
+#include <ddk/ntddk.h>
+
+/* OBJECTS */
+
+/* TYPES */
+
+/* CONSTANTS */
+
+/* PROTOTYPES */
+BOOLEAN
+__PdxPosixPathGetNextComponent_U
+(
+ IN UNICODE_STRING PathName,
+ IN OUT PUNICODE_STRING PathComponent,
+ OUT PBOOLEAN TrailingDelimiter OPTIONAL
+);
+
+BOOLEAN
+__PdxPosixPathResolve_U
+(
+ IN UNICODE_STRING PathName,
+ OUT PUNICODE_STRING ResolvedPathName,
+ IN WCHAR PathDelimiter OPTIONAL
+);
+
+BOOLEAN
+__PdxPosixPathGetNextComponent_A
+(
+ IN ANSI_STRING PathName,
+ IN OUT PANSI_STRING PathComponent,
+ OUT PBOOLEAN TrailingDelimiter OPTIONAL
+);
+
+BOOLEAN
+__PdxPosixPathResolve_A
+(
+ IN ANSI_STRING PathName,
+ OUT PANSI_STRING ResolvedPathName,
+ IN CHAR PathDelimiter OPTIONAL
+);
+
+BOOLEAN
+__PdxPosixPathNameToNtPathName
+(
+ IN PWCHAR PosixPath,
+       OUT PUNICODE_STRING NativePath,
+       IN PUNICODE_STRING CurDir OPTIONAL,
+ IN PUNICODE_STRING RootDir OPTIONAL
+);
+
+/* MACROS */
+/* returns non-zero if the argument is a path delimiter */
+#define IS_CHAR_DELIMITER_U(WCH) (((WCH) == L'/') || ((WCH) == L'\\'))
+#define IS_CHAR_DELIMITER_A(CH)  (((CH) == '/') || ((CH) == '\\'))
+
+/* returns non-zero if the argument is an empty path component */
+#define IS_COMPONENT_EMPTY_U(WCOMPONENT) (WCOMPONENT.Length == 0)
+#define IS_COMPONENT_EMPTY_A(COMPONENT)  (COMPONENT.Length == 0)
+
+/* returns non-zero if the argument is "." */
+#define IS_COMPONENT_DOT_U(WCOMPONENT) \
+((WCOMPONENT.Length == sizeof(WCHAR)) && (WCOMPONENT.Buffer[0] == L'.'))
+
+#define IS_COMPONENT_DOT_A(COMPONENT) \
+((COMPONENT.Length == 1) && (COMPONENT.Buffer[0] == '.'))
+
+/* returns non-zero if the argument is ".." */
+#define IS_COMPONENT_DOTDOT_U(WCOMPONENT) \
+( \
+ (WCOMPONENT.Length == (sizeof(WCHAR) * 2)) && \
+ (WCOMPONENT.Buffer[0] == L'.') && \
+ (WCOMPONENT.Buffer[1] == L'.') \
+)
+
+#define IS_COMPONENT_DOTDOT_A(COMPONENT) \
+( \
+ (COMPONENT.Length == 2) && \
+ (COMPONENT.Buffer[0] == '.') && \
+ (COMPONENT.Buffer[1] == '.') \
+)
+
+#endif /* __PSX_PATH_H_INCLUDED__ */
+
+/* EOF */
+
diff --git a/posix/include/psx/pdata.h b/posix/include/psx/pdata.h
new file mode 100644 (file)
index 0000000..30c69fe
--- /dev/null
@@ -0,0 +1,135 @@
+/* $Id: pdata.h,v 1.8 2002/10/29 04:45:13 rex Exp $
+ */
+/*
+ * psx/pdata.h
+ *
+ * POSIX+ subsystem process environment data structure
+ *
+ * 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 __PSX_PDATA_H_INCLUDED__
+#define __PSX_PDATA_H_INCLUDED__
+
+/* INCLUDES */
+#include <ddk/ntddk.h>
+#include <ntdll/rtl.h>
+#include <limits.h>
+#include <psx/fdtable.h>
+
+/* OBJECTS */
+
+/* TYPES */
+typedef struct __tagPDX_PDATA
+{
+ BOOL            Spawned;          /* TRUE if process has been created through __PdxSpawnPosixProcess() */
+ int             ArgCount;         /* count of arguments passed to exec() */
+ char          **ArgVect;          /* array of arguments passed to exec() */
+ char         ***Environment;      /* pointer to user-provided environ variable */
+ UNICODE_STRING  NativePathBuffer; /* static buffer used by low-level calls for pathname conversions */
+ UNICODE_STRING  CurDir;           /* current working directory */
+ UNICODE_STRING  RootPath;         /* NT path to the process's root directory */
+ HANDLE          RootHandle;       /* handle to the process's root directory */
+ __fdtable_t     FdTable;          /* file descriptors table */
+ /* WARNING: PRELIMINARY CODE FOR DEBUGGING PURPOSES ONLY - DO NOT CHANGE */
+ CRITICAL_SECTION Lock;
+ LONG             TlsIndex;
+} __PDX_PDATA, * __PPDX_PDATA;
+
+/* serialized process data block, used by __PdxSpawnPosixProcess() and __PdxExecThunk().
+   The layout of buffers inside the Buffer byte array is as following:
+
+   ArgVect[0] + null byte
+   ArgVect[1] + null byte
+   ...
+   ArgVect[ArgCount - 1] + null byte
+   Environment[0] + null byte
+   Environment[1] + null byte
+   ...
+   Environment[n - 1] + null byte (NOTE: the value of n is stored in ProcessData.Environment)
+   CurDir.Buffer
+   RootPath.Buffer
+   FdTable.Descriptors[0]
+   FdTable.Descriptors[1]
+   ...
+   FdTable.Descriptors[FdTable.AllocatedDescriptors - 1]
+   FdTable.Descriptors[x].ExtraData
+   FdTable.Descriptors[y].ExtraData
+   ...
+   padding for page boundary alignment
+ */
+typedef struct __tagPDX_SERIALIZED_PDATA
+{
+ __PDX_PDATA ProcessData;
+ ULONG       AllocSize;
+ BYTE        Buffer[1];
+} __PDX_SERIALIZED_PDATA, *__PPDX_SERIALIZED_PDATA;
+
+typedef struct __tagPDX_TDATA
+{
+ __PPDX_PDATA ProcessData;
+ int          ErrNum;
+} __PDX_TDATA, * __PPDX_TDATA;
+
+/* CONSTANTS */
+
+/* PROTOTYPES */
+NTSTATUS STDCALL __PdxSerializeProcessData(IN __PPDX_PDATA, OUT __PPDX_SERIALIZED_PDATA *);
+NTSTATUS STDCALL __PdxUnserializeProcessData(IN OUT __PPDX_SERIALIZED_PDATA *, OUT __PPDX_PDATA * OPTIONAL);
+
+NTSTATUS
+STDCALL
+__PdxProcessDataToProcessParameters
+(
+ OUT PRTL_USER_PROCESS_PARAMETERS *ProcessParameters,
+ IN __PPDX_PDATA ProcessData,
+ IN PUNICODE_STRING ImageFile
+);
+
+/* MACROS */
+/* WARNING: PRELIMINARY CODE FOR DEBUGGING PURPOSES ONLY - DO NOT CHANGE */
+VOID __PdxSetProcessData(__PPDX_PDATA);
+__PPDX_PDATA __PdxGetProcessData(VOID);
+
+#include <ddk/ntddk.h>
+
+#define __PdxAcquirePdataLock() (RtlEnterCriticalSection(&__PdxGetProcessData()->Lock))
+#define __PdxReleasePdataLock() (RtlLeaveCriticalSection(&__PdxGetProcessData()->Lock))
+
+#if 0
+#define __PdxAcquirePdataLock() (RtlAcquirePebLock())
+#define __PdxReleasePdataLock() (RtlReleasePebLock())
+
+#define __PdxSetProcessData(PPDATA) ((void)((NtCurrentPeb()->SubSystemData) = (PPDATA)))
+#define __PdxGetProcessData()       ((__PPDX_PDATA)(&(NtCurrentPeb()->SubSystemData)))
+#endif
+
+#define __PdxGetNativePathBuffer() ((PUNICODE_STRING)(&(__PdxGetProcessData()->NativePathBuffer)))
+#define __PdxGetCurDir()           ((PUNICODE_STRING)(&(__PdxGetProcessData()->CurDir)))
+#define __PdxGetRootPath()         ((PUNICODE_STRING)(&(__PdxGetProcessData()->RootPath)))
+#define __PdxGetRootHandle()       ((HANDLE)(__PdxGetProcessData()->RootHandle))
+#define __PdxGetFdTable()          ((__fdtable_t *)(__PdxGetProcessData()->FdTable))
+
+#define __PdxSetNativePathBuffer(BUF)  ((void)((__PdxGetProcessData()->NativePathBuffer) = (BUF)))
+#define __PdxSetCurDir(CURDIR)         ((void)((__PdxGetProcessData()->CurDir) = (CURDIR)))
+#define __PdxSetRootPath(ROOTPATH)     ((void)((__PdxGetProcessData()->RootPath) = (ROOTPATH)))
+#define __PdxSetRootHandle(ROOTHANDLE) ((void)((__PdxGetProcessData()->RootHandle) = (ROOTHANDLE)))
+#define __PdxSetFdTable(FDTABLE)       ((void)((__PdxGetProcessData()->FdTable) = (FDTABLE)))
+
+#endif /* __PSX_PDATA_H_INCLUDED__ */
+
+/* EOF */
+
diff --git a/posix/include/psx/pthread.h b/posix/include/psx/pthread.h
new file mode 100644 (file)
index 0000000..88dd80a
--- /dev/null
@@ -0,0 +1,61 @@
+/* $Id: pthread.h,v 1.4 2002/10/29 04:45:15 rex Exp $
+ */
+/*
+ * psx/pthread.h
+ *
+ * internal pthread.h
+ *
+ * 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 __PSX_PTHREAD_H_INCLUDED__
+#define __PSX_PTHREAD_H_INCLUDED__
+
+/* INCLUDES */
+#include <psx/safeobj.h>
+
+/* OBJECTS */
+
+/* TYPES */
+
+struct __mutexattr
+{
+ __magic_t signature;
+ int       pshared;
+ int       protocol;
+ int       type;
+};
+
+struct __mutex
+{
+ __magic_t signature;
+ void *    handle;
+ int       protocol;
+ int       type;       
+};
+
+/* CONSTANTS */
+#define __PTHREAD_MUTEX_MAGIC      (MAGIC('P', 'T', 'M', 'X'))
+#define __PTHREAD_MUTEX_ATTR_MAGIC (MAGIC('P', 'T', 'M', 'A'))
+
+/* PROTOTYPES */
+
+/* MACROS */
+
+#endif /* __PSX_PTHREAD_H_INCLUDED__ */
+
+/* EOF */
+
diff --git a/posix/include/psx/safeobj.h b/posix/include/psx/safeobj.h
new file mode 100644 (file)
index 0000000..34b72e8
--- /dev/null
@@ -0,0 +1,59 @@
+/* $Id: safeobj.h,v 1.4 2002/10/29 04:45:15 rex Exp $
+ */
+/*
+ * psx/safeobj.h
+ *
+ * types and definitions for safe checking of user-provided objects
+ *
+ * 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 __PSX_SAFEOBJ_H_INCLUDED__
+#define __PSX_SAFEOBJ_H_INCLUDED__
+
+/* INCLUDES */
+#include <inttypes.h>
+
+/* OBJECTS */
+
+/* TYPES */
+typedef uint32_t __magic_t;
+
+/* CONSTANTS */
+
+/* PROTOTYPES */
+int __safeobj_validate(void *, __magic_t);
+
+/* MACROS */
+/* builds a magic number from 4 characters */
+#define MAGIC(a,b,c,d) ( \
+ (((uint32_t)(uint8_t)(a)) << 24) | \
+ (((uint32_t)(uint8_t)(b)) << 16) | \
+ (((uint32_t)(uint8_t)(c)) <<  8) | \
+ (((uint32_t)(uint8_t)(d)) <<  0) \
+)
+
+/* retrieves a comma-separated list of the 4 characters in a magic number */
+#define MAGIC_DECOMPOSE(m) \
+ ((uint8_t)(m >> 24)), \
+ ((uint8_t)(m >> 16)), \
+ ((uint8_t)(m >>  8)), \
+ ((uint8_t)(m >>  0))
+
+#endif /* __PSX_SAFEOBJ_H_INCLUDED__ */
+
+/* EOF */
+
diff --git a/posix/include/psx/spawn.h b/posix/include/psx/spawn.h
new file mode 100644 (file)
index 0000000..41b5aa8
--- /dev/null
@@ -0,0 +1,54 @@
+/* $Id: spawn.h,v 1.3 2002/10/29 04:45:15 rex Exp $
+ */
+/*
+ * psx/spawn.h
+ *
+ * spawn POSIX+ processes
+ *
+ * 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 __PSX_SPAWN_H_INCLUDED__
+#define __PSX_SPAWN_H_INCLUDED__
+
+/* INCLUDES */
+#include <ddk/ntddk.h>
+#include <psx/pdata.h>
+
+/* OBJECTS */
+
+/* TYPES */
+
+/* CONSTANTS */
+
+/* PROTOTYPES */
+NTSTATUS STDCALL __PdxSpawnPosixProcess
+(
+ OUT PHANDLE ProcessHandle,
+ OUT PHANDLE ThreadHandle,
+ IN POBJECT_ATTRIBUTES FileObjectAttributes,
+ IN POBJECT_ATTRIBUTES ProcessObjectAttributes,
+ IN HANDLE InheritFromProcessHandle,
+ IN __PPDX_PDATA ProcessData
+);
+
+/* MACROS */
+
+#endif /* __PSX_SPAWN_H_INCLUDED__ */
+
+/* EOF */
+
diff --git a/posix/include/psx/stdlib.h b/posix/include/psx/stdlib.h
new file mode 100644 (file)
index 0000000..2f71d7c
--- /dev/null
@@ -0,0 +1,51 @@
+/* $Id: stdlib.h,v 1.4 2002/10/29 04:45:15 rex Exp $
+ */
+/*
+ * psx/stdlib.h
+ *
+ * internal stdlib.h
+ *
+ * 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 __PSX_STDLIB_H_INCLUDED__
+#define __PSX_STDLIB_H_INCLUDED__
+
+/* INCLUDES */
+#include <ddk/ntddk.h>
+#include <ntos/heap.h>
+#include <stdlib.h>
+
+/* OBJECTS */
+
+/* TYPES */
+
+/* CONSTANTS */
+
+/* PROTOTYPES */
+
+/* MACROS */
+/* FIXME? Windows NT's ntdll doesn't export RtlGetProcessHeap() */
+#define RtlGetProcessHeap() ((HANDLE)NtCurrentPeb()->ProcessHeap)
+
+#define __malloc(SIZE)      (RtlAllocateHeap(RtlGetProcessHeap(), 0, (SIZE)))
+#define __realloc(PTR,SIZE) (RtlReAllocateHeap(RtlGetProcessHeap(), 0, (PTR), (SIZE)))
+#define __free(PTR)         (RtlFreeHeap(RtlGetProcessHeap(), 0, (PTR)))
+
+#endif /* __PSX_STDLIB_H_INCLUDED__ */
+
+/* EOF */
+
diff --git a/posix/include/psx/template.h b/posix/include/psx/template.h
new file mode 100644 (file)
index 0000000..7998718
--- /dev/null
@@ -0,0 +1,83 @@
+/* $Id: template.h,v 1.6 2002/10/29 04:45:15 rex Exp $
+ How to create a new header file from this template:
+  - copy the template in the new file (never edit this file directly, unless
+    that's what you want)
+  - search for the string "EDITME" in the file, and follow the instructions
+  - remove this comment block, all blocks containing REMOVEME, and all EDITME
+    instructions
+  - save your file, and Have Fun! (TM)
+ */
+/* $*Id*$ (EDITME: remove asterisks from "$*Id*$")
+ */
+/*
+ * psx/template.h (EDITME: replace with the real name of the header)
+ *
+ * template for POSIX headers (EDITME: replace this line with the real file
+ * description)
+ *
+ * This file is part of the ReactOS Operating System.
+ *
+ * Contributors:
+ *  Created by John Doe <john.doe@mail.com> (EDITME: your name and e-mail go
+ *  here)
+ *
+ *  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.
+ *
+ */
+
+/*
+ Tags are used to prevent double inclusion of C header files. This
+ technique should be documented in all good C manuals
+
+ How to generate an unique tag for your header:
+  - uppercase the name of the header, where "name" is the filename and
+    the optional relative path (e.g. "stdio.h", "sys/types.h")
+  - replace all non-alphanumeric characters in the obtained name with an
+    underscore character ("_")
+  - prepend a double underscore ("__"), and append the string "_INCLUDED__"
+  - replace all occurrences of "__PSX_TEMPLATE_H_INCLUDED__" in this file
+    with your tag
+
+ Example tags:
+  sys/types.h -> SYS/TYPES.H -> SYS_TYPES_H -> __SYS_TYPES_H_INCLUDED__
+  iso646.h -> ISO646.H -> ISO646_H -> __ISO646_H_INCLUDED__
+
+ (REMOVEME)
+ */
+#ifndef __PSX_TEMPLATE_H_INCLUDED__ /* EDITME: replace macro with unique tag */
+#define __PSX_TEMPLATE_H_INCLUDED__ /* EDITME: replace macro with unique tag */
+/*
+ Explanation of the sections:
+  INCLUDES   #include directives should be grouped here
+  OBJECTS    declare global variables here
+  TYPES      types, structures and unions here
+  CONSTANTS  symbolic constants (simple #define's), enums, constants
+  PROTOTYPES ANSI C function prototypes
+  MACROS     parametrized macros
+
+ (REMOVEME)
+ */
+/* INCLUDES */
+
+/* OBJECTS */
+
+/* TYPES */
+
+/* CONSTANTS */
+
+/* PROTOTYPES */
+
+/* MACROS */
+
+#endif /* __PSX_TEMPLATE_H_INCLUDED__ */ /* EDITME: replace macro with unique tag */
+
+/* EOF */
+
diff --git a/posix/include/psx/tls.h b/posix/include/psx/tls.h
new file mode 100644 (file)
index 0000000..69e741e
--- /dev/null
@@ -0,0 +1,48 @@
+/* $Id: tls.h,v 1.3 2002/10/29 04:45:15 rex Exp $
+ */
+/*
+ * psx/tls.h
+ *
+ * types and calls for TLS management
+ *
+ * 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 __PSX_TLS_H_INCLUDED__
+#define __PSX_TLS_H_INCLUDED__
+
+/* INCLUDES */
+
+/* OBJECTS */
+
+/* TYPES */
+typedef unsigned int __tls_index_t;
+
+/* CONSTANTS */
+
+/* PROTOTYPES */
+__tls_index_t __tls_alloc();
+int           __tls_free(__tls_index_t index);
+void *        __tls_get_val(__tls_index_t index);
+int           __tls_put_val(__tls_index_t index, void * data);
+
+/* MACROS */
+
+#endif /* __PSX_TLS_H_INCLUDED__ */
+
+/* EOF */
+
diff --git a/posix/include/pthread.h b/posix/include/pthread.h
new file mode 100644 (file)
index 0000000..23317c2
--- /dev/null
@@ -0,0 +1,141 @@
+/* $Id: pthread.h,v 1.4 2002/10/29 04:45:16 rex Exp $
+ */
+/*
+ * pthread.h
+ *
+ * threads. 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 __PTHREAD_H_INCLUDED__
+#define __PTHREAD_H_INCLUDED__
+
+/* INCLUDES */
+#include <sched.h>
+#include <time.h>
+
+/* OBJECTS */
+
+/* TYPES */
+
+/* CONSTANTS */
+#define PTHREAD_MUTEX_NORMAL     (1)
+#define PTHREAD_MUTEX_ERRORCHECK (2)
+#define PTHREAD_MUTEX_RECURSIVE  (3)
+
+#define PTHREAD_MUTEX_DEFAULT (PTHREAD_MUTEX_NORMAL)
+
+#define PTHREAD_PROCESS_PRIVATE (1)
+#define PTHREAD_PROCESS_SHARED  (2)
+
+#define PTHREAD_PRIO_NONE (1)
+
+/* PROTOTYPES */
+int   pthread_attr_destroy(pthread_attr_t *);
+int   pthread_attr_getdetachstate(const pthread_attr_t *, int *);
+int   pthread_attr_getguardsize(const pthread_attr_t *, size_t *);
+int   pthread_attr_getinheritsched(const pthread_attr_t *, int *);
+int   pthread_attr_getschedparam(const pthread_attr_t *,
+          struct sched_param *);
+int   pthread_attr_getschedpolicy(const pthread_attr_t *, int *);
+int   pthread_attr_getscope(const pthread_attr_t *, int *);
+int   pthread_attr_getstackaddr(const pthread_attr_t *, void **);
+int   pthread_attr_getstacksize(const pthread_attr_t *, size_t *);
+int   pthread_attr_init(pthread_attr_t *);
+int   pthread_attr_setdetachstate(pthread_attr_t *, int);
+int   pthread_attr_setguardsize(pthread_attr_t *, size_t);
+int   pthread_attr_setinheritsched(pthread_attr_t *, int);
+int   pthread_attr_setschedparam(pthread_attr_t *,
+          const struct sched_param *);
+int   pthread_attr_setschedpolicy(pthread_attr_t *, int);
+int   pthread_attr_setscope(pthread_attr_t *, int);
+int   pthread_attr_setstackaddr(pthread_attr_t *, void *);
+int   pthread_attr_setstacksize(pthread_attr_t *, size_t);
+int   pthread_cancel(pthread_t);
+void  pthread_cleanup_push(void (*)(void *), void *);
+void  pthread_cleanup_pop(int);
+int   pthread_cond_broadcast(pthread_cond_t *);
+int   pthread_cond_destroy(pthread_cond_t *);
+int   pthread_cond_init(pthread_cond_t *, const pthread_condattr_t *);
+int   pthread_cond_signal(pthread_cond_t *);
+int   pthread_cond_timedwait(pthread_cond_t *,
+          pthread_mutex_t *, const struct timespec *);
+int   pthread_cond_wait(pthread_cond_t *, pthread_mutex_t *);
+int   pthread_condattr_destroy(pthread_condattr_t *);
+int   pthread_condattr_getpshared(const pthread_condattr_t *, int *);
+int   pthread_condattr_init(pthread_condattr_t *);
+int   pthread_condattr_setpshared(pthread_condattr_t *, int);
+int   pthread_create(pthread_t *, const pthread_attr_t *,
+          void *(*)(void *), void *);
+int   pthread_detach(pthread_t);
+int   pthread_equal(pthread_t, pthread_t);
+void  pthread_exit(void *);
+int   pthread_getconcurrency(void);
+int   pthread_getschedparam(pthread_t, int *, struct sched_param *);
+void *pthread_getspecific(pthread_key_t);
+int   pthread_join(pthread_t, void **);
+int   pthread_key_create(pthread_key_t *, void (*)(void *));
+int   pthread_key_delete(pthread_key_t);
+int   pthread_mutex_destroy(pthread_mutex_t *);
+int   pthread_mutex_getprioceiling(const pthread_mutex_t *, int *);
+int   pthread_mutex_init(pthread_mutex_t *, const pthread_mutexattr_t *);
+int   pthread_mutex_lock(pthread_mutex_t *);
+int   pthread_mutex_setprioceiling(pthread_mutex_t *, int, int *);
+int   pthread_mutex_trylock(pthread_mutex_t *);
+int   pthread_mutex_unlock(pthread_mutex_t *);
+int   pthread_mutexattr_destroy(pthread_mutexattr_t *);
+int   pthread_mutexattr_getprioceiling(const pthread_mutexattr_t *,
+          int *);
+int   pthread_mutexattr_getprotocol(const pthread_mutexattr_t *, int *);
+int   pthread_mutexattr_getpshared(const pthread_mutexattr_t *, int *);
+int   pthread_mutexattr_gettype(const pthread_mutexattr_t *, int *);
+int   pthread_mutexattr_init(pthread_mutexattr_t *);
+int   pthread_mutexattr_setprioceiling(pthread_mutexattr_t *, int);
+int   pthread_mutexattr_setprotocol(pthread_mutexattr_t *, int);
+int   pthread_mutexattr_setpshared(pthread_mutexattr_t *, int);
+int   pthread_mutexattr_settype(pthread_mutexattr_t *, int);
+int   pthread_once(pthread_once_t *, void (*)(void));
+int   pthread_rwlock_destroy(pthread_rwlock_t *);
+int   pthread_rwlock_init(pthread_rwlock_t *,
+          const pthread_rwlockattr_t *);
+int   pthread_rwlock_rdlock(pthread_rwlock_t *);
+int   pthread_rwlock_tryrdlock(pthread_rwlock_t *);
+int   pthread_rwlock_trywrlock(pthread_rwlock_t *);
+int   pthread_rwlock_unlock(pthread_rwlock_t *);
+int   pthread_rwlock_wrlock(pthread_rwlock_t *);
+int   pthread_rwlockattr_destroy(pthread_rwlockattr_t *);
+int   pthread_rwlockattr_getpshared(const pthread_rwlockattr_t *,
+          int *);
+int   pthread_rwlockattr_init(pthread_rwlockattr_t *);
+int   pthread_rwlockattr_setpshared(pthread_rwlockattr_t *, int);
+pthread_t
+      pthread_self(void);
+int   pthread_setcancelstate(int, int *);
+int   pthread_setcanceltype(int, int *);
+int   pthread_setconcurrency(int);
+int   pthread_setschedparam(pthread_t, int ,
+          const struct sched_param *);
+int   pthread_setspecific(pthread_key_t, const void *);
+void  pthread_testcancel(void);
+
+/* MACROS */
+
+#endif /* __PTHREAD_H_INCLUDED__ */
+
+/* EOF */
+
diff --git a/posix/include/pwd.h b/posix/include/pwd.h
new file mode 100644 (file)
index 0000000..0c8639b
--- /dev/null
@@ -0,0 +1,60 @@
+/* $Id: pwd.h,v 1.4 2002/10/29 04:45:16 rex Exp $
+ */
+/*
+ * pwd.h
+ *
+ * password structure. 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 __PWD_H_INCLUDED__
+#define __PWD_H_INCLUDED__
+
+/* INCLUDES */
+
+/* OBJECTS */
+
+/* TYPES */
+struct passwd
+{
+ char  *pw_name;  /* user's login name */
+ uid_t pw_uid;   /* numerical user ID */
+ gid_t pw_gid;   /* numerical group ID */
+ char  *pw_dir;   /* initial working directory */
+ char  *pw_shell; /* program to use as shell */
+};
+
+/* CONSTANTS */
+
+/* PROTOTYPES */
+struct passwd *getpwnam(const char *);
+struct passwd *getpwuid(uid_t);
+int            getpwnam_r(const char *, struct passwd *, char *,
+                   size_t, struct passwd **);
+int            getpwuid_r(uid_t, struct passwd *, char *,
+                   size_t, struct passwd **);
+void           endpwent(void);
+struct passwd *getpwent(void);
+void           setpwent(void);
+
+/* MACROS */
+
+#endif /* __PWD_H_INCLUDED__ */
+
+/* EOF */
+
diff --git a/posix/include/sched.h b/posix/include/sched.h
new file mode 100644 (file)
index 0000000..d18b2cf
--- /dev/null
@@ -0,0 +1,62 @@
+/* $Id: sched.h,v 1.4 2002/10/29 04:45:18 rex Exp $
+ */
+/*
+ * sched.h
+ *
+ * execution scheduling (REALTIME). 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 __SCHED_H_INCLUDED__
+#define __SCHED_H_INCLUDED__
+
+/* INCLUDES */
+#include <time.h>
+
+/* OBJECTS */
+
+/* TYPES */
+struct sched_param
+{
+ int sched_priority; /* process execution scheduling priority */
+};
+
+/* CONSTANTS */
+/* First in-first out (FIFO) scheduling policy */
+#define SCHED_FIFO  (1)
+/* Round robin scheduling policy */
+#define SCHED_RR    (2)
+/* Another scheduling policy */
+#define SCHED_OTHER (3)
+
+/* PROTOTYPES */
+int    sched_get_priority_max(int);
+int    sched_get_priority_min(int);
+int    sched_getparam(pid_t, struct sched_param *);
+int    sched_getscheduler(pid_t);
+int    sched_rr_get_interval(pid_t, struct timespec *);
+int    sched_setparam(pid_t, const struct sched_param *);
+int    sched_setscheduler(pid_t, int, const struct sched_param *);
+int    sched_yield(void);
+
+/* MACROS */
+
+#endif /* __SCHED_H_INCLUDED__ */
+
+/* EOF */
+
diff --git a/posix/include/signal.h b/posix/include/signal.h
new file mode 100644 (file)
index 0000000..5f11c57
--- /dev/null
@@ -0,0 +1,322 @@
+/* $Id: signal.h,v 1.5 2002/10/29 04:45:18 rex Exp $
+ */
+/*
+ * signal.h
+ *
+ * signals. 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 __SIGNAL_H_INCLUDED__
+#define __SIGNAL_H_INCLUDED__
+
+/* INCLUDES */
+#include <time.h>
+#include <sys/types.h>
+
+/* OBJECTS */
+
+/* TYPES */
+/* pre-declaration of time.h types to suppress warnings caused by circular
+   dependencies */
+struct timespec;
+
+typedef int sig_atomic_t; /* Integral type of an object that can be
+                                            accessed as an atomic entity, even in the
+                              presence of asynchronous interrupts */
+
+typedef unsigned long int sigset_t; /* Integral or structure type of an object
+                                          used to represent sets of signals. */
+
+union sigval
+{
+ int    sival_int;    /* integer signal value */
+ void*  sival_ptr;    /* pointer signal value */
+};
+
+struct sigevent
+{
+ int                   sigev_notify;           /* notification type */
+ int                   sigev_signo;            /* signal number */
+ union sigval          sigev_value;            /* signal value */
+ void (* sigev_notify_function)(union sigval); /* notification function */
+ pthread_attr_t *     sigev_notify_attributes; /* notification attributes */
+};
+
+
+typedef struct __tagsiginfo_t
+{
+ int           si_signo;  /* signal number */
+ int           si_errno;  /* if non-zero, an errno value associated with
+                             this signal, as defined in <errno.h> */
+ int           si_code;   /* signal code */
+ pid_t         si_pid;    /* sending process ID */
+ uid_t         si_uid;    /* real user ID of sending process */
+ void         *si_addr;   /* address of faulting instruction */
+ int           si_status; /* exit value or signal */
+ long          si_band;   /* band event for SIGPOLL */
+ union sigval  si_value;  /* signal value */
+} siginfo_t;
+
+struct sigaction
+{
+ void     (* sa_handler)(int); /* what to do on receipt of signal */
+ sigset_t   sa_mask;           /* set of signals to be blocked during
+                                  execution of the signal handling function */
+ int        sa_flags;          /* special flags */
+ void (* sa_sigaction)(int, siginfo_t *, void *);
+                               /* pointer to signal handler function
+                                  or one of the macros SIG_IGN or SIG_DFL */
+};
+
+typedef struct __tagstack_t
+{
+ void   *ss_sp;   /* stack base or pointer */
+ size_t ss_size;  /* stack size */
+ int    ss_flags; /* flags */
+} stack_t;
+
+struct sigstack
+{
+ int  ss_onstack; /* non-zero when signal stack is in use */
+ void *ss_sp;     /* signal stack pointer */
+};
+
+/* CONSTANTS */
+#define SIG_DFL  ((void (*)(int))(0xFFFFFFFF)) /* Request for default signal handling. */
+#define SIG_ERR  ((void (*)(int))(0x00000000)) /* Return value from signal() in case of error. */
+#define SIG_IGN  ((void (*)(int))(0x00000001)) /* Request that signal be ignored. */
+#define SIG_HOLD ((void (*)(int))(0x00000002)) /* Request that signal be held. */
+
+#define SIGEV_NONE   (0) /* No asynchronous notification will be delivered \
+                            when the event of interest occurs. */
+#define SIGEV_SIGNAL (1) /* A queued signal, with an application-defined \
+                            value, will be generated when the event of \
+                            interest occurs. */
+#define SIGEV_THREAD (2) /* A notification function will be called to perform \
+                            notification. */
+
+/* TODO: realtime features not supported yet */
+#define SIGRTMIN (-1)
+#define SIGRTMAX (-1)
+
+#define SIGABRT   ( 1) /* Process abort signal. */
+#define SIGALRM   ( 2) /* Alarm clock. */
+#define SIGFPE    ( 3) /* Erroneous arithmetic operation. */
+#define SIGHUP    ( 4) /* Hangup. */
+#define SIGILL    ( 5) /* Illegal instruction. */
+#define SIGINT    ( 6) /* Terminal interrupt signal. */
+#define SIGKILL   ( 7) /* Kill (cannot be caught or ignored). */
+#define SIGPIPE   ( 8) /* Write on a pipe with no one to read it. */
+#define SIGQUIT   ( 9) /* Terminal quit signal. */
+#define SIGSEGV   (10) /* Invalid memory reference. */
+#define SIGTERM   (11) /* Termination signal. */
+#define SIGUSR1   (12) /* User-defined signal 1. */
+#define SIGUSR2   (13) /* User-defined signal 2. */
+#define SIGCHLD   (14) /* Child process terminated or stopped. */
+#define SIGCONT   (15) /* Continue executing, if stopped. */
+#define SIGSTOP   (16) /* Stop executing (cannot be caught or ignored). */
+#define SIGTSTP   (17) /* Terminal stop signal. */
+#define SIGTTIN   (18) /* Background process attempting read. */
+#define SIGTTOU   (19) /* Background process attempting write. */
+#define SIGBUS    (20) /* Access to an undefined portion of a memory object. */
+#define SIGPOLL   (21) /* Pollable event. */
+#define SIGPROF   (22) /* Profiling timer expired. */
+#define SIGSYS    (23) /* Bad system call. */
+#define SIGTRAP   (24) /* Trace/breakpoint trap. */
+#define SIGURG    (25) /* High bandwidth data is available at a socket. */
+#define SIGVTALRM (26) /* Virtual timer expired. */
+#define SIGXCPU   (27) /* CPU time limit exceeded. */
+#define SIGXFSZ   (28) /* File size limit exceeded. */
+
+/* FIXME: the following constants need to be reviewed */
+/* Do not generate SIGCHLD when children stop. */
+#define SA_NOCLDSTOP (0x00000001)
+/* The resulting set is the union of the current set and the signal set
+   pointed to by the argument set. */
+#define SA_ONSTACK   (0x00000002)
+/* Causes signal dispositions to be set to SIG_DFL on entry to signal
+   handlers. */
+#define SA_RESETHAND (0x00000004)
+/* Causes certain functions to become restartable. */
+#define SA_RESTART   (0x00000008)
+/* Causes extra information to be passed to signal handlers at the time
+   of receipt of a signal. */
+#define SA_SIGINFO   (0x00000010)
+/* Causes implementations not to create zombie processes on child death. */
+#define SA_NOCLDWAIT (0x00000020)
+/* Causes signal not to be automatically blocked on entry to signal
+   handler. */
+#define SA_NODEFER   (0x00000040)
+
+/* FIXME: the following constants need to be reviewed */
+/* The resulting set is the intersection of the current set and the
+   complement of the signal set pointed to by the argument set. */
+#define SIG_BLOCK   (1)
+/* The resulting set is the signal set pointed to by the argument
+   set. */
+#define SIG_UNBLOCK (2)
+/* Causes signal delivery to occur on an alternate stack. */
+#define SIG_SETMASK (3)
+
+/* FIXME: the following constants need to be reviewed */
+/* Process is executing on an alternate signal stack. */
+#define SS_ONSTACK (1)
+/* Alternate signal stack is disabled. */
+#define SS_DISABLE (2)
+
+/* Minimum stack size for a signal handler. */ /* FIXME */
+#define MINSIGSTKSZ (0)
+/* Default size in bytes for the alternate signal stack. */ /* FIXME */
+#define SIGSTKSZ    (0)
+
+/*
+ signal-specific reasons why the signal was generated
+ */
+/* SIGILL */
+/* illegal opcode */
+#define ILL_ILLOPC (1)
+/* illegal operand */
+#define ILL_ILLOPN (2)
+/* illegal addressing mode */
+#define ILL_ILLADR (3)
+/* illegal trap */
+#define ILL_ILLTRP (4)
+/* privileged opcode */
+#define ILL_PRVOPC (5)
+/* privileged register */
+#define ILL_PRVREG (6)
+/* coprocessor error */
+#define ILL_COPROC (7)
+/* internal stack error */
+#define ILL_BADSTK (8)
+
+/* SIGFPE */
+/* integer divide by zero */
+#define FPE_INTDIV
+/* integer overflow */
+#define FPE_INTOVF
+/* floating point divide by zero */
+#define FPE_FLTDIV
+/* floating point overflow */
+#define FPE_FLTOVF
+/* floating point underflow */
+#define FPE_FLTUND
+/* floating point inexact result */
+#define FPE_FLTRES
+/* invalid floating point operation */
+#define FPE_FLTINV
+/* subscript out of range */
+#define FPE_FLTSUB
+
+/* SIGSEGV */
+/* address not mapped to object */
+#define SEGV_MAPERR
+/* invalid permissions for mapped object */
+#define SEGV_ACCERR
+
+/* SIGBUS */
+/* invalid address alignment */
+#define BUS_ADRALN
+/* non-existent physical address */
+#define BUS_ADRERR
+/* object specific hardware error */
+#define BUS_OBJERR
+
+/* SIGTRAP */
+/* process breakpoint */
+#define TRAP_BRKPT
+/* process trace trap */
+#define TRAP_TRACE
+
+/* SIGCHLD */
+/* child has exited */
+#define CLD_EXITED
+/* child has terminated abnormally and did not create a core file */
+#define CLD_KILLED
+/* child has terminated abnormally and created a core file */
+#define CLD_DUMPED
+/* traced child has trapped */
+#define CLD_TRAPPED
+/* child has stopped */
+#define CLD_STOPPED
+/* stopped child has continued */
+#define CLD_CONTINUED
+
+/* SIGPOLL */
+/* data input available */
+#define POLL_IN
+/* output buffers available */
+#define POLL_OUT
+/* input message available */
+#define POLL_MSG
+/* I/O error */
+#define POLL_ERR
+/* high priority input available */
+#define POLL_PRI
+/* device disconnected */
+#define POLL_HUP
+/* signal sent by kill() */
+#define SI_USER
+/* signal sent by the sigqueue() */
+#define SI_QUEUE
+/* signal generated by expiration of a timer set by timer_settime() */
+#define SI_TIMER
+/* signal generated by completion of an asynchronous I/O request */
+#define SI_ASYNCIO
+/* signal generated by arrival of a message on an empty message queue */
+#define SI_MESGQ
+
+/* PROTOTYPES */
+void (*bsd_signal(int, void (*)(int)))(int);
+int    kill(pid_t, int);
+int    killpg(pid_t, int);
+int    pthread_kill(pthread_t, int);
+int    pthread_sigmask(int, const sigset_t *, sigset_t *);
+int    raise(int);
+int    sigaction(int, const struct sigaction *, struct sigaction *);
+int    sigaddset(sigset_t *, int);
+int    sigaltstack(const stack_t *, stack_t *);
+int    sigdelset(sigset_t *, int);
+int    sigemptyset(sigset_t *);
+int    sigfillset(sigset_t *);
+int    sighold(int);
+int    sigignore(int);
+int    siginterrupt(int, int);
+int    sigismember(const sigset_t *, int);
+void (*signal(int, void (*)(int)))(int);
+int    sigpause(int);
+int    sigpending(sigset_t *);
+int    sigprocmask(int, const sigset_t *, sigset_t *);
+int    sigqueue(pid_t, int, const union sigval);
+int    sigrelse(int);
+void (*sigset(int, void (*)(int)))(int);
+int    sigstack(struct sigstack *ss,
+           struct sigstack *oss); /* LEGACY */
+int    sigsuspend(const sigset_t *);
+int    sigtimedwait(const sigset_t *, siginfo_t *,
+           const struct timespec *);
+int    sigwait(const sigset_t *set, int *sig);
+int    sigwaitinfo(const sigset_t *, siginfo_t *);
+
+/* MACROS */
+
+#endif /* __SIGNAL_H_INCLUDED__ */
+
+/* EOF */
+
diff --git a/posix/include/stdarg.h b/posix/include/stdarg.h
new file mode 100644 (file)
index 0000000..e9b4889
--- /dev/null
@@ -0,0 +1,57 @@
+/* $Id: stdarg.h,v 1.4 2002/10/29 04:45:18 rex Exp $
+ */
+/*
+ * stdarg.h
+ *
+ * handle variable argument list. 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 __STDARG_H_INCLUDED__
+#define __STDARG_H_INCLUDED__
+
+/* OBJECTS */
+
+/* TYPES */
+typedef char* va_list;
+
+/* CONSTANTS */
+
+/* PROTOTYPES */
+
+/* MACROS */
+/* taken from mingw's stdarg.h */
+
+/* Amount of space required in an argument list (ie. the stack) for an
+   argument of type t. */
+#define __va_argsiz(t) \
+ (((sizeof(t) + sizeof(int) - 1) / sizeof(int)) * sizeof(int))
+
+#define va_start(ap, pN) \
+ ((ap) = ((va_list) (&pN) + __va_argsiz(pN)))
+
+#define va_end(ap) ((void)0)
+
+#define va_arg(ap, t) \
+ (((ap) = (ap) + __va_argsiz(t)), \
+ *((t*) (void*) ((ap) - __va_argsiz(t))))
+
+#endif /* __STDARG_H_INCLUDED__ */
+
+/* EOF */
+
diff --git a/posix/include/stddef.h b/posix/include/stddef.h
new file mode 100644 (file)
index 0000000..5ef67fa
--- /dev/null
@@ -0,0 +1,50 @@
+/* $Id: stddef.h,v 1.4 2002/10/29 04:45:19 rex Exp $
+ */
+/*
+ * stddef.h
+ *
+ * standard type definitions. 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 __STDDEF_H_INCLUDED__
+#define __STDDEF_H_INCLUDED__
+
+/* INCLUDES */
+#include <sys/types.h>
+
+/* OBJECTS */
+
+/* TYPES */
+typedef signed long int ptrdiff_t;
+typedef unsigned short int wchar_t;
+
+/* CONSTANTS */
+#ifndef NULL
+#define NULL ((void *)(0)) /* Null pointer constant. */
+#endif
+
+/* PROTOTYPES */
+
+/* MACROS */
+#define offsetof(t,m) ((size_t) &((t *)0)->m)
+
+#endif /* __STDDEF_H_INCLUDED__ */
+
+/* EOF */
+
diff --git a/posix/include/stdio.h b/posix/include/stdio.h
new file mode 100644 (file)
index 0000000..1ed4a09
--- /dev/null
@@ -0,0 +1,165 @@
+/* $Id: stdio.h,v 1.4 2002/10/29 04:45:19 rex Exp $
+ */
+/*
+ * stdio.h
+ *
+ * standard buffered input/output. 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 __STDIO_H_INCLUDED__
+#define __STDIO_H_INCLUDED__
+
+/* INCLUDES */
+#include <stddef.h>
+#include <stdarg.h>
+#include <unistd.h>
+#include <sys/types.h>
+
+/* OBJECTS */
+extern char  *optarg;
+extern int    opterr;
+extern int    optind; /* LEGACY */
+extern int    optopt;
+
+/* TYPES */
+typedef struct __tagFILE
+{
+ int _dummy;
+} FILE;
+
+typedef struct __tagfpos_t
+{
+ int _dummy;
+} fpos_t;
+
+
+/* CONSTANTS */
+/* Size of <stdio.h> buffers. */
+#define BUFSIZ (0x10000)
+
+/* Maximum size in bytes of the longest filename string that the implementation
+   guarantees can be opened. */
+#define FILENAME_MAX (255)                           
+
+/* Number of streams which the implementation guarantees can be open
+   simultaneously. The value will be at least eight. */
+#define FOPEN_MAX (8)
+
+/* Input/output fully buffered. */
+#define _IOFBF (1)
+/* Input/output line buffered. */
+#define _IOLBF (2)
+/* Input/output unbuffered. */
+#define _IONBF (3)
+
+/* Maximum size of character array to hold ctermid() output. */
+#define L_ctermid (255)
+/* Maximum size of character array to hold cuserid() output. (LEGACY) */
+#define L_cuserid (255)
+/* Maximum size of character array to hold tmpnam() output. */
+#define L_tmpnam  (255)
+
+/* Minimum number of unique filenames generated by tmpnam(). Maximum number
+   of times an application can call tmpnam() reliably. The value of TMP_MAX
+   will be at least 10,000. */
+#define TMP_MAX (0xFFFF)
+
+/* End-of-file return value. */
+#define EOF (-1)
+
+/* default directory prefix for tempnam() */
+#define P_tmpdir "/tmp/"
+
+/* Standard error output stream. */
+#define stderr ((FILE *)STDERR_FILENO)
+/* Standard input stream. */
+#define stdin  ((FILE *)STDIN_FILENO)
+/* Standard output stream. */
+#define stdout ((FILE *)STDOUT_FILENO)
+
+/* PROTOTYPES */
+void     clearerr(FILE *);
+char    *ctermid(char *);
+char    *cuserid(char *); /* LEGACY */
+int      fclose(FILE *);
+FILE    *fdopen(int, const char *);
+int      feof(FILE *);
+int      ferror(FILE *);
+int      fflush(FILE *);
+int      fgetc(FILE *);
+int      fgetpos(FILE *, fpos_t *);
+char    *fgets(char *, int, FILE *);
+int      fileno(FILE *);
+void     flockfile(FILE *);
+FILE    *fopen(const char *, const char *);
+int      fprintf(FILE *, const char *, ...);
+int      fputc(int, FILE *);
+int      fputs(const char *, FILE *);
+size_t   fread(void *, size_t, size_t, FILE *);
+FILE    *freopen(const char *, const char *, FILE *);
+int      fscanf(FILE *, const char *, ...);
+int      fseek(FILE *, long int, int);
+int      fseeko(FILE *, off_t, int);
+int      fsetpos(FILE *, const fpos_t *);
+long int ftell(FILE *);
+off_t    ftello(FILE *);
+int      ftrylockfile(FILE *);
+void     funlockfile(FILE *);
+size_t   fwrite(const void *, size_t, size_t, FILE *);
+int      getc(FILE *);
+int      getchar(void);
+int      getc_unlocked(FILE *);
+int      getchar_unlocked(void);
+int      getopt(int, char * const[], const char *); /* LEGACY */
+char    *gets(char *);
+int      getw(FILE *);
+int      pclose(FILE *);
+void     perror(const char *);
+FILE    *popen(const char *, const char *);
+int      printf(const char *, ...);
+int      putc(int, FILE *);
+int      putchar(int);
+int      putc_unlocked(int, FILE *);
+int      putchar_unlocked(int);
+int      puts(const char *);
+int      putw(int, FILE *);
+int      remove(const char *);
+int      rename(const char *, const char *);
+void     rewind(FILE *);
+int      scanf(const char *, ...);
+void     setbuf(FILE *, char *);
+int      setvbuf(FILE *, char *, int, size_t);
+int      snprintf(char *, size_t, const char *, ...);
+int      sprintf(char *, const char *, ...);
+int      sscanf(const char *, const char *, int, ...);
+char    *tempnam(const char *, const char *);
+FILE    *tmpfile(void);
+char    *tmpnam(char *);
+int      ungetc(int, FILE *);
+int      vfprintf(FILE *, const char *, va_list);
+int      vprintf(const char *, va_list);
+int      vsnprintf(char *, size_t, const char *, va_list);
+int      vsprintf(char *, const char *, va_list);
+
+/* MACROS */
+
+#endif /* __STDIO_H_INCLUDED__ */
+
+/* EOF */
+
diff --git a/posix/include/stdlib.h b/posix/include/stdlib.h
new file mode 100644 (file)
index 0000000..a69282c
--- /dev/null
@@ -0,0 +1,130 @@
+/* $Id: stdlib.h,v 1.4 2002/10/29 04:45:19 rex Exp $
+ */
+/*
+ * stdlib.h
+ *
+ * standard library definitions. 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 __STDLIB_H_INCLUDED__
+#define __STDLIB_H_INCLUDED__
+
+/* INCLUDES */
+#include <stddef.h>
+#include <limits.h>
+#include <math.h>
+#include <sys/wait.h>
+
+/* OBJECTS */
+
+/* TYPES */
+typedef struct __tagdiv_t
+{
+ int quot; /* quotient */
+ int rem; /* remainder */
+} div_t;
+
+typedef struct __tagldiv_t
+{
+ long int quot; /* quotient */
+ long int rem; /* remainder */
+} ldiv_t;
+
+/* CONSTANTS */
+#define EXIT_FAILURE (-1) /* Unsuccessful termination for exit(), evaluates \
+                             to a non-zero value. */
+#define EXIT_SUCCESS (0) /* Successful termination for exit(), evaluates to 0. */
+
+/* FIXME */
+#define RAND_MAX (32767) /* Maximum value returned by rand(), at least 32,767. */
+
+/* FIXME */
+#define MB_CUR_MAX (1) /* Integer expression whose value is the maximum number \
+                          of bytes in a character specified by the current \
+                          locale. */
+
+/* PROTOTYPES */
+long      a64l(const char *);
+void      abort(void);
+int       abs(int);
+int       atexit(void (*)(void));
+double    atof(const char *);
+int       atoi(const char *);
+long int  atol(const char *);
+void     *bsearch(const void *, const void *, size_t, size_t,
+              int (*)(const void *, const void *));
+void     *calloc(size_t, size_t);
+div_t     div(int, int);
+double    drand48(void);
+char     *ecvt(double, int, int *, int *);
+double    erand48(unsigned short int[3]);
+void      exit(int);
+char     *fcvt (double, int, int *, int *);
+void      free(void *);
+char     *gcvt(double, int, char *);
+char     *getenv(const char *);
+int       getsubopt(char **, char *const *, char **);
+int       grantpt(int);
+char     *initstate(unsigned int, char *, size_t);
+long int  jrand48(unsigned short int[3]);
+char     *l64a(long);
+long int  labs(long int);
+void      lcong48(unsigned short int[7]);
+ldiv_t    ldiv(long int, long int);
+long int  lrand48(void);
+void     *malloc(size_t);
+int       mblen(const char *, size_t);
+size_t    mbstowcs(wchar_t *, const char *, size_t);
+int       mbtowc(wchar_t *, const char *, size_t);
+char     *mktemp(char *);
+int       mkstemp(char *);
+long int  mrand48(void);
+long int  nrand48(unsigned short int [3]);
+char     *ptsname(int);
+int       putenv(char *);
+void      qsort(void *, size_t, size_t, int (*)(const void *,
+              const void *));
+int       rand(void);
+int       rand_r(unsigned int *);
+long      random(void);
+void     *realloc(void *, size_t);
+char     *realpath(const char *, char *);
+unsigned  short int    seed48(unsigned short int[3]);
+void      setkey(const char *);
+char     *setstate(const char *);
+void      srand(unsigned int);
+void      srand48(long int);
+void      srandom(unsigned);
+double    strtod(const char *, char **);
+long int  strtol(const char *, char **, int);
+unsigned long int
+          strtoul(const char *, char **, int);
+int       system(const char *);
+int       ttyslot(void); /* LEGACY */
+int       unlockpt(int);
+void     *valloc(size_t); /* LEGACY */
+size_t    wcstombs(char *, const wchar_t *, size_t);
+int       wctomb(char *, wchar_t);
+
+/* MACROS */
+
+#endif /* __STDLIB_H_INCLUDED__ */
+
+/* EOF */
+
diff --git a/posix/include/string.h b/posix/include/string.h
new file mode 100644 (file)
index 0000000..f673ca0
--- /dev/null
@@ -0,0 +1,69 @@
+/* $Id: string.h,v 1.4 2002/10/29 04:45:19 rex Exp $
+ */
+/*
+ * string.h
+ *
+ * string operations. 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 __STRING_H_INCLUDED__ /* replace with the appropriate tag */
+#define __STRING_H_INCLUDED__ /* replace with the appropriate tag */
+
+/* INCLUDES */
+#include <stddef.h>
+
+/* OBJECTS */
+
+/* TYPES */
+
+/* CONSTANTS */
+
+/* PROTOTYPES */
+void    *memccpy(void *, const void *, int, size_t);
+void    *memchr(const void *, int, size_t);
+int      memcmp(const void *, const void *, size_t);
+void    *memcpy(void *, const void *, size_t);
+void    *memmove(void *, const void *, size_t);
+void    *memset(void *, int, size_t);
+char    *strcat(char *, const char *);
+char    *strchr(const char *, int);
+int      strcmp(const char *, const char *);
+int      strcoll(const char *, const char *);
+char    *strcpy(char *, const char *);
+size_t   strcspn(const char *, const char *);
+char    *strdup(const char *);
+char    *strerror(int);
+size_t   strlen(const char *);
+char    *strncat(char *, const char *, size_t);
+int      strncmp(const char *, const char *, size_t);
+char    *strncpy(char *, const char *, size_t);
+char    *strpbrk(const char *, const char *);
+char    *strrchr(const char *, int);
+size_t   strspn(const char *, const char *);
+char    *strstr(const char *, const char *);
+char    *strtok(char *, const char *);
+char    *strtok_r(char *, const char *, char **);
+size_t   strxfrm(char *, const char *, size_t);
+
+/* MACROS */
+
+#endif /* __STRING_H_INCLUDED__ */ /* replace with the appropriate tag */
+
+/* EOF */
+
diff --git a/posix/include/sys/errno.h b/posix/include/sys/errno.h
new file mode 100644 (file)
index 0000000..933f925
--- /dev/null
@@ -0,0 +1,44 @@
+/* $Id: errno.h,v 1.3 2002/10/29 04:45:19 rex Exp $
+ */
+/*
+ * sys/errno.h
+ *
+ * dummy include file for Microsoft POSIX and Interix compatibility
+ *
+ * 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 __SYS_ERRNO_H_INCLUDED__
+#define __SYS_ERRNO_H_INCLUDED__
+
+/* INCLUDES */
+#include <errno.h>
+
+/* OBJECTS */
+
+/* TYPES */
+
+/* CONSTANTS */
+
+/* PROTOTYPES */
+
+/* MACROS */
+
+#endif /* __SYS_ERRNO_H_INCLUDED__ */
+
+/* EOF */
+
diff --git a/posix/include/sys/ipc.h b/posix/include/sys/ipc.h
new file mode 100644 (file)
index 0000000..7d53fcf
--- /dev/null
@@ -0,0 +1,64 @@
+/* $Id: ipc.h,v 1.5 2002/10/29 04:45:19 rex Exp $
+ */
+/*
+ * sys/ipc.h
+ *
+ * interprocess communication access structure. 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 __SYS_IPC_H_INCLUDED__
+#define __SYS_IPC_H_INCLUDED__
+
+/* INCLUDES */
+
+/* OBJECTS */
+
+/* TYPES */
+struct ipc_perm
+{
+ uid_t  uid;  /* owner's user ID */
+ gid_t  gid;  /* owner's group ID */
+ uid_t  cuid; /* creator's user ID */
+ gid_t  cgid; /* creator's group ID */
+ mode_t mode; /* read/write permission */
+};
+
+/* CONSTANTS */
+/* Mode bits */
+#define IPC_CREAT  (0x00000200) /* Create entry if key does not exist */
+#define IPC_EXCL   (0x00000400) /* Fail if key exists */
+#define IPC_NOWAIT (0x00000800) /* Error if request must wait */
+
+/* Keys */
+#define IPC_PRIVATE (0xFFFFFFFF) /* Private key */
+
+/* Control commands */
+#define IPC_RMID (1) /* Remove identifier */
+#define IPC_SET  (2) /* Set options */
+#define IPC_STAT (3) /* Get options */
+
+/* PROTOTYPES */
+key_t  ftok(const char *, int);
+
+/* MACROS */
+
+#endif /* __SYS_IPC_H_INCLUDED__ */
+
+/* EOF */
+
diff --git a/posix/include/sys/mman.h b/posix/include/sys/mman.h
new file mode 100644 (file)
index 0000000..8008e0b
--- /dev/null
@@ -0,0 +1,43 @@
+/* $Id: mman.h,v 1.4 2002/10/29 04:45:20 rex Exp $
+ */
+/*
+ * sys/mman.h
+ *
+ * memory management declarations. 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 __SYS_SOCKET_H_INCLUDED__
+#define __SYS_SOCKET_H_INCLUDED__
+
+/* INCLUDES */
+
+/* OBJECTS */
+
+/* TYPES */
+
+/* CONSTANTS */
+
+/* PROTOTYPES */
+
+/* MACROS */
+
+#endif /* __SYS_SOCKET_H_INCLUDED__ */
+
+/* EOF */
+
diff --git a/posix/include/sys/msg.h b/posix/include/sys/msg.h
new file mode 100644 (file)
index 0000000..1bc5a28
--- /dev/null
@@ -0,0 +1,64 @@
+/* $Id: msg.h,v 1.5 2002/10/29 04:45:21 rex Exp $
+ */
+/*
+ * sys/msg.h
+ *
+ * message queue structures. 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 __SYS_SOCKET_H_INCLUDED__
+#define __SYS_SOCKET_H_INCLUDED__
+
+/* INCLUDES */
+#include <sys/ipc.h>
+
+/* OBJECTS */
+
+/* TYPES */
+typedef unsigned int msgqnum_t; /* Used for the number of messages in the message queue */
+typedef unsigned int msglen_t;  /* Used for the number of bytes allowed in a message queue */
+
+struct msqid_ds
+{
+ struct ipc_perm msg_perm;   /* operation permission structure */
+ msgqnum_t       msg_qnum;   /* number of messages currently on queue */
+ msglen_t        msg_qbytes; /* maximum number of bytes allowed on queue */
+ pid_t           msg_lspid;  /* process ID of last msgsnd() */
+ pid_t           msg_lrpid;  /* process ID of last msgrcv() */
+ time_t          msg_stime;  /* time of last msgsnd() */
+ time_t          msg_rtime;  /* time of last msgrcv() */
+ time_t          msg_ctime;  /* time of last change */
+};
+
+/* CONSTANTS */
+/* Message operation flag */
+#define MSG_NOERROR (0x00001000) /* No error if big message */
+
+/* PROTOTYPES */
+int       msgctl(int, int, struct msqid_ds *);
+int       msgget(key_t, int);
+ssize_t   msgrcv(int, void *, size_t, long int, int);
+int       msgsnd(int, const void *, size_t, int);
+
+/* MACROS */
+
+#endif /* __SYS_SOCKET_H_INCLUDED__ */
+
+/* EOF */
+
diff --git a/posix/include/sys/resource.h b/posix/include/sys/resource.h
new file mode 100644 (file)
index 0000000..43c7c97
--- /dev/null
@@ -0,0 +1,49 @@
+/* $Id: resource.h,v 1.5 2002/10/29 04:45:21 rex Exp $
+ */
+/*
+ * sys/resource.h
+ *
+ * definitions for XSI resource operations. 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 __SYS_RESOURCE_H_INCLUDED__
+#define __SYS_RESOURCE_H_INCLUDED__
+
+/* INCLUDES */
+#include <sys/time.h>
+
+/* OBJECTS */
+
+/* TYPES */
+struct rusage
+{
+ struct timeval ru_utime; /* user time used */
+ struct timeval ru_stime; /* system time used */
+};
+
+/* CONSTANTS */
+
+/* PROTOTYPES */
+
+/* MACROS */
+
+#endif /* __SYS_RESOURCE_H_INCLUDED__ */
+
+/* EOF */
+
diff --git a/posix/include/sys/sem.h b/posix/include/sys/sem.h
new file mode 100644 (file)
index 0000000..e7dbcf0
--- /dev/null
@@ -0,0 +1,72 @@
+/* $Id: sem.h,v 1.5 2002/10/29 04:45:21 rex Exp $
+ */
+/*
+ * sys/sem.h
+ *
+ * semaphore facility. 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 __SYS_SEM_H_INCLUDED__
+#define __SYS_SEM_H_INCLUDED__
+
+/* INCLUDES */
+#include <sys/ipc.h>
+
+/* OBJECTS */
+
+/* TYPES */
+struct semid_ds
+{
+ struct ipc_perm    sem_perm;  /* operation permission structure */
+ unsigned short int sem_nsems; /* number of semaphores in set */
+ time_t             sem_otime; /* last semop time */
+ time_t             sem_ctime; /* last time changed by semctl() */
+};
+
+struct sembuf
+{
+ unsigned short int sem_num; /* semaphore number */
+ short int          sem_op;  /* semaphore operation */
+ short int          sem_flg; /* operation flags */
+};
+
+/* CONSTANTS */
+/* Semaphore operation flags */
+#define SEM_UNDO (0x00001000) /* Set up adjust on exit entry */
+
+/* Command definitions for the function semctl() */
+#define GETNCNT (1) /* Get semncnt */
+#define GETPID  (2) /* Get sempid */
+#define GETVAL  (3) /* Get semval */
+#define GETALL  (4) /* Get all cases of semval */
+#define GETZCNT (5) /* Get semzcnt */
+#define SETVAL  (6) /* Set semval */
+#define SETALL  (7) /* Set all cases of semval */
+
+/* PROTOTYPES */
+int   semctl(int, int, int, ...);
+int   semget(key_t, int, int);
+int   semop(int, struct sembuf *, size_t);
+
+/* MACROS */
+
+#endif /* __SYS_SEM_H_INCLUDED__ */
+
+/* EOF */
+
diff --git a/posix/include/sys/shm.h b/posix/include/sys/shm.h
new file mode 100644 (file)
index 0000000..90f9755
--- /dev/null
@@ -0,0 +1,64 @@
+/* $Id: shm.h,v 1.5 2002/10/29 04:45:21 rex Exp $
+ */
+/*
+ * sys/shm.h
+ *
+ * shared memory facility. 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 __SYS_SHM_H_INCLUDED__
+#define __SYS_SHM_H_INCLUDED__
+
+/* INCLUDES */
+
+/* OBJECTS */
+
+/* TYPES */
+typedef unsigned short shmatt_t;
+
+struct shmid_ds
+{
+ struct ipc_perm shm_perm;  /* operation permission structure */
+ size_t          shm_segsz;  /* size of segment in bytes */
+ pid_t           shm_lpid;   /* process ID of last shared memory operation */
+ pid_t           shm_cpid;   /* process ID of creator */
+ shmatt_t        shm_nattch; /* number of current attaches */
+ time_t          shm_atime;  /* time of last shmat() */
+ time_t          shm_dtime;  /* time of last shmdt() */
+ time_t          shm_ctime;  /* time of last change by shmctl() */
+};
+
+/* CONSTANTS */
+#define SHM_RDONLY (0x00000200) /* Attach read-only (else read-write). */
+#define SHM_RND    (0x00000400) /* Round attach address to SHMLBA. */
+
+#define SHMLBA     (4096) /* Segment low boundary address multiple. */
+
+/* PROTOTYPES */
+void *shmat(int, const void *, int);
+int   shmctl(int, int, struct shmid_ds *);
+int   shmdt(const void *);
+int   shmget(key_t, size_t, int);
+
+/* MACROS */
+
+#endif /* __SYS_SHM_H_INCLUDED__ */
+
+/* EOF */
+
diff --git a/posix/include/sys/socket.h b/posix/include/sys/socket.h
new file mode 100644 (file)
index 0000000..193a76a
--- /dev/null
@@ -0,0 +1,43 @@
+/* $Id: socket.h,v 1.4 2002/10/29 04:45:21 rex Exp $
+ */
+/*
+ * sys/socket.h
+ *
+ * Internet Protocol family. 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 __SYS_SOCKET_H_INCLUDED__
+#define __SYS_SOCKET_H_INCLUDED__
+
+/* INCLUDES */
+
+/* OBJECTS */
+
+/* TYPES */
+
+/* CONSTANTS */
+
+/* PROTOTYPES */
+
+/* MACROS */
+
+#endif /* __SYS_SOCKET_H_INCLUDED__ */
+
+/* EOF */
+
diff --git a/posix/include/sys/stat.h b/posix/include/sys/stat.h
new file mode 100644 (file)
index 0000000..a033f6d
--- /dev/null
@@ -0,0 +1,124 @@
+/* $Id: stat.h,v 1.5 2002/10/29 04:45:21 rex Exp $
+ */
+/*
+ * sys/stat.h
+ *
+ * data returned by the stat() function. 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 __SYS_STAT_H_INCLUDED__
+#define __SYS_STAT_H_INCLUDED__
+
+/* INCLUDES */
+#include <sys/types.h>
+
+/* OBJECTS */
+
+/* TYPES */
+struct stat
+{
+ mode_t    st_mode;    /* mode of file (see below) */
+ ino_t     st_ino;     /* file serial number */
+ dev_t     st_dev;     /* ID of device containing file */
+ nlink_t   st_nlink;   /* number of links to the file */
+ uid_t     st_uid;     /* user ID of file */
+ gid_t     st_gid;     /* group ID of file */
+ off_t     st_size;    /* file size in bytes (if file is a regular file) */
+ time_t    st_atime;   /* time of last access */
+ time_t    st_mtime;   /* time of last data modification */
+ time_t    st_ctime;   /* time of last status change */
+ dev_t     st_rdev;    /* device ID (if file is character or block special) */
+ blksize_t st_blksize; /* a filesystem-specific preferred I/O block size for
+                          this object.  In some filesystem types, this may
+                                 vary from file to file */
+ blkcnt_t  st_blocks;  /* number of blocks allocated for this object */
+};
+
+/* CONSTANTS */
+/*
+  file type
+ */
+#define S_IFIFO  (000010000) /* FIFO special */
+#define S_IFCHR  (000020000) /* character special */
+#define S_IFDIR  (000040000) /* directory */
+#define S_IFBLK  (000060000) /* block special */
+#define S_IFREG  (000100000) /* regular */
+#define S_IFLNK  (000200000) /* symbolic link */
+#define        S_IFSOCK (000400000) /* socket */
+
+/* type of file */
+#define S_IFMT   (000770000)
+
+/*
+  file mode bits
+ */
+#define S_IRUSR (000000400)                    /* read permission, owner */
+#define S_IWUSR (000000200)                    /* write permission, owner */
+#define S_IXUSR (000000100)                    /* execute/search permission, owner */
+#define S_IRWXU (S_IRUSR | S_IWUSR | S_IXUSR) /* read, write, execute/search by owner */
+
+#define S_IRGRP (000000040)                    /* read permission, group */
+#define S_IWGRP (000000020)                    /* write permission, group */
+#define S_IXGRP (000000010)                    /* execute/search permission, group */
+#define S_IRWXG (S_IRGRP | S_IWGRP | S_IXGRP) /* read, write, execute/search by group */
+
+#define S_IROTH (000000004)                    /* read permission, others */
+#define S_IWOTH (000000002)                    /* write permission, others */
+#define S_IXOTH (000000001)                    /* execute/search permission, others */
+#define S_IRWXO (S_IROTH | S_IWOTH | S_IXOTH) /* read, write, execute/search by others */
+
+#define S_ISUID (000004000)                  /* set-user-ID on execution */
+#define S_ISGID (000002000)                  /* set-group-ID on execution */
+
+#define S_ISVTX (000010000)                  /* on directories, restricted deletion flag */
+
+/*
+  the following macros will test whether a file is of the specified type
+ */
+#define        S_ISFIFO(m) (((m) & S_IFMT) == S_IFIFO)
+#define        S_ISCHR(m)  (((m) & S_IFMT) == S_IFCHR)
+#define        S_ISDIR(m)  (((m) & S_IFMT) == S_IFDIR)
+#define        S_ISBLK(m)  (((m) & S_IFMT) == S_IFBLK)
+#define        S_ISREG(m)  (((m) & S_IFMT) == S_IFREG)
+#define        S_ISLNK(m)  (((m) & S_IFMT) == S_IFLNK)
+#define        S_ISSOCK(m) (((m) & S_IFMT) == S_IFSOCK)
+
+/* shared memory, semaphores and message queues are unlikely to be ever
+   implemented as files */
+#define S_TYPEISMQ(buf)  (0) /* Test for a message queue */
+#define S_TYPEISSEM(buf) (0) /* Test for a semaphore */
+#define S_TYPEISSHM(buf) (0) /* Test for a shared memory object */
+
+/* PROTOTYPES */
+int    chmod(const char *, mode_t);
+int    fchmod(int, mode_t);
+int    fstat(int, struct stat *);
+int    lstat(const char *, struct stat *);
+int    mkdir(const char *, mode_t);
+int    mkfifo(const char *, mode_t);
+int    mknod(const char *, mode_t, dev_t);
+int    stat(const char *, struct stat *);
+mode_t umask(mode_t);
+
+/* MACROS */
+
+#endif /* __SYS_STAT_H_INCLUDED__ */
+
+/* EOF */
+
diff --git a/posix/include/sys/statvfs.h b/posix/include/sys/statvfs.h
new file mode 100644 (file)
index 0000000..7811325
--- /dev/null
@@ -0,0 +1,43 @@
+/* $Id: statvfs.h,v 1.4 2002/10/29 04:45:21 rex Exp $
+ */
+/*
+ * sys/statvfs.h
+ *
+ * VFS Filesystem information structure. 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 __SYS_STATVFS_H_INCLUDED__
+#define __SYS_STATVFS_H_INCLUDED__
+
+/* INCLUDES */
+
+/* OBJECTS */
+
+/* TYPES */
+
+/* CONSTANTS */
+
+/* PROTOTYPES */
+
+/* MACROS */
+
+#endif /* __SYS_STATVFS_H_INCLUDED__ */
+
+/* EOF */
+
diff --git a/posix/include/sys/time.h b/posix/include/sys/time.h
new file mode 100644 (file)
index 0000000..6949c26
--- /dev/null
@@ -0,0 +1,48 @@
+/* $Id: time.h,v 1.5 2002/10/29 04:45:22 rex Exp $
+ */
+/*
+ * sys/time.h
+ *
+ * time 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 __SYS_TIME_H_INCLUDED__
+#define __SYS_TIME_H_INCLUDED__
+
+/* INCLUDES */
+
+/* OBJECTS */
+
+/* TYPES */
+struct timeval
+{
+ time_t      tv_sec;  /* seconds */
+ suseconds_t tv_usec; /* microseconds */
+};
+
+/* CONSTANTS */
+
+/* PROTOTYPES */
+
+/* MACROS */
+
+#endif /* __SYS_TIME_H_INCLUDED__ */
+
+/* EOF */
+
diff --git a/posix/include/sys/timeb.h b/posix/include/sys/timeb.h
new file mode 100644 (file)
index 0000000..4f1a4a5
--- /dev/null
@@ -0,0 +1,43 @@
+/* $Id: timeb.h,v 1.4 2002/10/29 04:45:22 rex Exp $
+ */
+/*
+ * sys/timeb.h
+ *
+ * additional definitions for date and time. 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 __SYS_TIMEB_H_INCLUDED__
+#define __SYS_TIMEB_H_INCLUDED__
+
+/* INCLUDES */
+
+/* OBJECTS */
+
+/* TYPES */
+
+/* CONSTANTS */
+
+/* PROTOTYPES */
+
+/* MACROS */
+
+#endif /* __SYS_TIMEB_H_INCLUDED__ */
+
+/* EOF */
+
diff --git a/posix/include/sys/times.h b/posix/include/sys/times.h
new file mode 100644 (file)
index 0000000..cffb8ce
--- /dev/null
@@ -0,0 +1,43 @@
+/* $Id: times.h,v 1.4 2002/10/29 04:45:22 rex Exp $
+ */
+/*
+ * sys/times.h
+ *
+ * file access and modification times structure. 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 __SYS_TIMES_H_INCLUDED__
+#define __SYS_TIMES_H_INCLUDED__
+
+/* INCLUDES */
+
+/* OBJECTS */
+
+/* TYPES */
+
+/* CONSTANTS */
+
+/* PROTOTYPES */
+
+/* MACROS */
+
+#endif /* __SYS_TIMES_H_INCLUDED__ */
+
+/* EOF */
+
diff --git a/posix/include/sys/types.h b/posix/include/sys/types.h
new file mode 100644 (file)
index 0000000..10bd5d3
--- /dev/null
@@ -0,0 +1,100 @@
+/* $Id: types.h,v 1.6 2002/10/29 04:45:22 rex Exp $
+ */
+/*
+ * sys/types.h
+ *
+ * data 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 __SYS_TYPES_H_INCLUDED__
+#define __SYS_TYPES_H_INCLUDED__
+
+/* INCLUDES */
+
+/* OBJECTS */
+
+/* TYPES */
+/* FIXME: all these types need to be checked */
+typedef unsigned long int blkcnt_t; /* Used for file block counts */
+typedef unsigned long int blksize_t; /* Used for block sizes */
+typedef long long clock_t; /* Used for system times in clock ticks or CLOCKS_PER_SEC */
+typedef int clockid_t; /* Used for clock ID type in the clock and timer functions. */
+typedef unsigned long int dev_t; /* Used for device IDs. */
+typedef unsigned long int fsblkcnt_t; /* Used for file system block counts */
+typedef unsigned long int fsfilcnt_t; /* Used for file system file counts */
+typedef unsigned long int gid_t; /* Used for group IDs. */
+typedef int id_t; /* Used as a general identifier; can be used to contain at least a
+                        pid_t, uid_t or a gid_t. */
+typedef unsigned long int ino_t; /* Used for file serial numbers. */
+typedef int key_t; /* Used for interprocess communication. */
+typedef unsigned long int mode_t; /* Used for some file attributes. */
+typedef unsigned long int nlink_t; /* Used for link counts. */
+typedef long off_t; /* Used for file sizes. */
+typedef long int pid_t; /* Used for process IDs and process group IDs. */
+
+/* pthread types */
+typedef void * pthread_cond_t; /* Used for condition variables. */
+typedef void * pthread_condattr_t; /* Used to identify a condition attribute object. */
+typedef void * pthread_key_t; /* Used for thread-specific data keys. */
+typedef void * pthread_attr_t; /* Used to identify a thread attribute object. */
+
+typedef void * pthread_mutex_t;
+typedef void * pthread_mutexattr_t;
+
+typedef void * pthread_once_t; /* Used for dynamic package initialisation. */
+typedef void * pthread_rwlock_t; /* Used for read-write locks. */
+typedef void * pthread_rwlockattr_t; /* Used for read-write lock attributes. */
+typedef unsigned long int pthread_t; /* Used to identify a thread. */
+
+typedef unsigned int size_t; /* Used for sizes of objects. */
+typedef signed int ssize_t; /* Used for a count of bytes or an error indication. */
+typedef long long suseconds_t; /* Used for time in microseconds */
+typedef long int time_t; /* Used for time in seconds. */
+typedef void * timer_t; /* Used for timer ID returned by timer_create(). */
+typedef int uid_t; /* Used for user IDs. */
+typedef unsigned long long useconds_t; /* Used for time in microseconds. */
+
+/*
+  additional types for sockets and streams - for compatibility with Microsoft POSIX
+ */
+typedef unsigned char  u_char;
+typedef unsigned short int     u_short;
+typedef unsigned short int ushort;
+typedef unsigned int   u_int;
+typedef unsigned long  int u_long;
+
+typedef unsigned int uint;
+typedef unsigned long ulong;
+typedef unsigned char unchar;
+
+typedef char *caddr_t;
+
+/* CONSTANTS */
+
+/* PROTOTYPES */
+
+/* MACROS */
+/* for compatibility with Microsoft POSIX */
+#define _CRTAPI1 __cdecl
+#define _CRTAPI2 __cdecl
+
+#endif /* __SYS_TYPES_H_INCLUDED__ */
+
+/* EOF */
+
diff --git a/posix/include/sys/uio.h b/posix/include/sys/uio.h
new file mode 100644 (file)
index 0000000..672e60b
--- /dev/null
@@ -0,0 +1,43 @@
+/* $Id: uio.h,v 1.4 2002/10/29 04:45:23 rex Exp $
+ */
+/*
+ * sys/uio.h
+ *
+ * definitions for vector I/O operations. 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 __SYS_UIO_H_INCLUDED__
+#define __SYS_UIO_H_INCLUDED__
+
+/* INCLUDES */
+
+/* OBJECTS */
+
+/* TYPES */
+
+/* CONSTANTS */
+
+/* PROTOTYPES */
+
+/* MACROS */
+
+#endif /* __SYS_UIO_H_INCLUDED__ */
+
+/* EOF */
+
diff --git a/posix/include/sys/un.h b/posix/include/sys/un.h
new file mode 100644 (file)
index 0000000..776a619
--- /dev/null
@@ -0,0 +1,43 @@
+/* $Id: un.h,v 1.4 2002/10/29 04:45:23 rex Exp $
+ */
+/*
+ * sys/un.h
+ *
+ * declarations for definitions for UNIX-domain sockets. 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 __SYS_UN_H_INCLUDED__
+#define __SYS_UN_H_INCLUDED__
+
+/* INCLUDES */
+
+/* OBJECTS */
+
+/* TYPES */
+
+/* CONSTANTS */
+
+/* PROTOTYPES */
+
+/* MACROS */
+
+#endif /* __SYS_UN_H_INCLUDED__ */
+
+/* EOF */
+
diff --git a/posix/include/sys/utsname.h b/posix/include/sys/utsname.h
new file mode 100644 (file)
index 0000000..67413d0
--- /dev/null
@@ -0,0 +1,54 @@
+/* $Id: utsname.h,v 1.4 2002/10/29 04:45:23 rex Exp $
+ */
+/*
+ * sys/utsname.h
+ *
+ * system name structure. 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 __SYS_UTSNAME_H_INCLUDED__
+#define __SYS_UTSNAME_H_INCLUDED__
+
+/* INCLUDES */
+
+/* OBJECTS */
+
+/* TYPES */
+struct utsname
+{
+ char sysname[255];  /* name of this implementation of the operating system */
+ char nodename[255]; /* name of this node within an implementation-dependent
+                        communications network */
+ char release[255];  /* current release level of this implementation */
+ char version[255];  /* current version level of this release */
+ char machine[255];  /* name of the hardware type on which the system is
+                        running */
+};
+
+/* CONSTANTS */
+
+/* PROTOTYPES */
+int uname(struct utsname *);
+
+/* MACROS */
+
+#endif /* __SYS_UTSNAME_H_INCLUDED__ */
+
+/* EOF */
+
diff --git a/posix/include/sys/wait.h b/posix/include/sys/wait.h
new file mode 100644 (file)
index 0000000..3e1750c
--- /dev/null
@@ -0,0 +1,71 @@
+/* $Id: wait.h,v 1.5 2002/10/29 04:45:23 rex Exp $
+ */
+/*
+ * sys/wait.h
+ *
+ * declarations for waiting. 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 __SYS_WAIT_H_INCLUDED__
+#define __SYS_WAIT_H_INCLUDED__
+
+/* INCLUDES */
+#include <signal.h>
+#include <sys/resource.h>
+
+/* OBJECTS */
+
+/* TYPES */
+typedef enum __tagidtype_t
+{
+ P_ALL,
+ P_PID,
+ P_PGID
+} idtype_t;
+
+/* CONSTANTS */
+/* Possible values for the options argument to waitid() */
+#define WEXITED    (0x00000001) /* Wait for processes that have exited */
+#define WSTOPPED   (0x00000002) /* Status will be returned for any child that has stopped upon receipt of a signal */
+#define WNOWAIT    (0x00000004) /* Keep the process whose status is returned in infop in a waitable state */
+
+#define WCONTINUED (0x00000008) /* Status will be returned for any child that was stopped and has been continued */
+#define WNOHANG    (0x00000010) /* Return immediately if there are no children to wait for */
+#define WUNTRACED  (0x00000020) /* Report status of stopped child process */
+
+/* PROTOTYPES */
+pid_t  wait(int *);
+pid_t  wait3(int *, int, struct rusage *);
+int    waitid(idtype_t, id_t, siginfo_t *, int);
+pid_t  waitpid(pid_t, int *, int);
+
+/* MACROS */
+/* Macros for analysis of process status values */
+#define WEXITSTATUS(__STATUS__)  (1) /* Return exit status */
+#define WIFCONTINUED(__STATUS__) (1) /* True if child has been continued */
+#define WIFEXITED(__STATUS__)    (1) /* True if child exited normally */
+#define WIFSIGNALED(__STATUS__)  (1) /* True if child exited due to uncaught signal */
+#define WIFSTOPPED(__STATUS__)   (1) /* True if child is currently stopped */
+#define WSTOPSIG(__STATUS__)     (1) /* Return signal number that caused process to stop */
+#define WTERMSIG(__STATUS__)     (1) /* Return signal number that caused process to terminate */
+
+#endif /* __SYS_WAIT_H_INCLUDED__ */
+
+/* EOF */
+
diff --git a/posix/include/time.h b/posix/include/time.h
new file mode 100644 (file)
index 0000000..e428378
--- /dev/null
@@ -0,0 +1,114 @@
+/* $Id: time.h,v 1.5 2002/10/29 04:45:25 rex Exp $
+ */
+/*
+ * time.h
+ *
+ * time 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 __TIME_H_INCLUDED__
+#define __TIME_H_INCLUDED__
+
+/* INCLUDES */
+#include <signal.h>
+#include <sys/types.h>
+
+/* OBJECTS */
+/* extern static int getdate_err; */ /* FIXME */
+extern int       daylight;
+extern long int  timezone;
+extern char     *tzname[];
+
+/* TYPES */
+/* pre-declaration of signal.h types to suppress warnings caused by circular
+   dependencies */
+struct sigevent;
+
+struct tm
+{
+ int    tm_sec;   /* seconds [0,61] */
+ int    tm_min;   /* minutes [0,59] */
+ int    tm_hour;  /* hour [0,23] */
+ int    tm_mday;  /* day of month [1,31] */
+ int    tm_mon;   /* month of year [0,11] */
+ int    tm_year;  /* years since 1900 */
+ int    tm_wday;  /* day of week [0,6] (Sunday = 0) */
+ int    tm_yday;  /* day of year [0,365] */
+ int    tm_isdst; /* daylight savings flag */
+};
+
+struct timespec
+{
+ time_t  tv_sec;    /* seconds */
+ long    tv_nsec;   /* nanoseconds */
+};
+
+struct itimerspec
+{
+ struct timespec  it_interval;  /* timer period */
+ struct timespec  it_value;     /* timer expiration */
+};
+
+/* CONSTANTS */
+/* FIXME: all the constants are wrong */
+/* Number of clock ticks per second returned by the times() function (LEGACY). */
+#define CLK_TCK (1)
+/* A number used to convert the value returned by the clock() function into
+   seconds. */
+#define CLOCKS_PER_SEC (1)
+/* The identifier of the systemwide realtime clock. */
+#define CLOCK_REALTIME (0)
+/* Flag indicating time is absolute with respect to the clock associated with a
+   timer. */
+#define TIMER_ABSTIME (1)
+
+/* PROTOTYPES */
+char      *asctime(const struct tm *);
+char      *asctime_r(const struct tm *, char *);
+clock_t    clock(void);
+int        clock_getres(clockid_t, struct timespec *);
+int        clock_gettime(clockid_t, struct timespec *);
+int        clock_settime(clockid_t, const struct timespec *);
+char      *ctime(const time_t *);
+char      *ctime_r(const time_t *, char *);
+double     difftime(time_t, time_t);
+struct tm *getdate(const char *);
+struct tm *gmtime(const time_t *);
+struct tm *gmtime_r(const time_t *, struct tm *);
+struct tm *localtime(const time_t *);
+struct tm *localtime_r(const time_t *, struct tm *);
+time_t     mktime(struct tm *);
+int        nanosleep(const struct timespec *, struct timespec *);
+size_t     strftime(char *, size_t, const char *, const struct tm *);
+char      *strptime(const char *, const char *, struct tm *);
+time_t     time(time_t *);
+int        timer_create(clockid_t, struct sigevent *, timer_t *);
+int        timer_delete(timer_t);
+int        timer_gettime(timer_t, struct itimerspec *);
+int        timer_getoverrun(timer_t);
+int        timer_settime(timer_t, int, const struct itimerspec *,
+               struct itimerspec *);
+void       tzset(void);
+
+/* MACROS */
+
+#endif /* __TIME_H_INCLUDED__ */ /* replace with the appropriate tag */
+
+/* EOF */
+
diff --git a/posix/include/types.h b/posix/include/types.h
new file mode 100644 (file)
index 0000000..4379f3b
--- /dev/null
@@ -0,0 +1,44 @@
+/* $Id: types.h,v 1.3 2002/10/29 04:45:25 rex Exp $
+ */
+/*
+ * types.h
+ *
+ * dummy include file for Microsoft POSIX and Interix compatibility
+ *
+ * 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 __TYPES_H_INCLUDED__
+#define __TYPES_H_INCLUDED__
+
+/* INCLUDES */
+#include <sys/types.h>
+
+/* OBJECTS */
+
+/* TYPES */
+
+/* CONSTANTS */
+
+/* PROTOTYPES */
+
+/* MACROS */
+
+#endif /* __TYPES_H_INCLUDED__ */
+
+/* EOF */
+
diff --git a/posix/include/ucontext.h b/posix/include/ucontext.h
new file mode 100644 (file)
index 0000000..18340f8
--- /dev/null
@@ -0,0 +1,62 @@
+/* $Id: ucontext.h,v 1.4 2002/10/29 04:45:25 rex Exp $
+ */
+/*
+ * ucontext.h
+ *
+ * user context. 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 __UCONTEXT_H_INCLUDED__
+#define __UCONTEXT_H_INCLUDED__
+
+/* INCLUDES */
+#include <signal.h>
+
+/* OBJECTS */
+
+/* TYPES */
+typedef void * mcontext_t;
+
+typedef struct __tagucontext_t ucontext_t;
+
+struct __tagucontext_t
+{
+ ucontext_t *uc_link;     /* pointer to the context that will be resumed
+                             when this context returns */
+ sigset_t    uc_sigmask;  /* the set of signals that are blocked when this
+                             context is active */
+ stack_t     uc_stack;    /* the stack used by this context */
+ mcontext_t  uc_mcontext; /* a machine-specific representation of the saved
+                             context */
+};
+
+/* CONSTANTS */
+
+/* PROTOTYPES */
+int  getcontext(ucontext_t *);
+int  setcontext(const ucontext_t *);
+void makecontext(ucontext_t *, (void *)(), int, ...);
+int  swapcontext(ucontext_t *, const ucontext_t *);
+
+/* MACROS */
+
+#endif /* __UCONTEXT_H_INCLUDED__ */
+
+/* EOF */
+
diff --git a/posix/include/unistd.h b/posix/include/unistd.h
new file mode 100644 (file)
index 0000000..6b8b786
--- /dev/null
@@ -0,0 +1,508 @@
+/* $Id: unistd.h,v 1.5 2002/10/29 04:45:25 rex 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 */
+
diff --git a/posix/include/utime.h b/posix/include/utime.h
new file mode 100644 (file)
index 0000000..c78ab03
--- /dev/null
@@ -0,0 +1,50 @@
+/* $Id: utime.h,v 1.4 2002/10/29 04:45:26 rex Exp $
+ */
+/*
+ * utime.h
+ *
+ * access and modification times structure. 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 __UTIME_H_INCLUDED__
+#define __UTIME_H_INCLUDED__
+
+/* INCLUDES */
+#include <sys/types.h>
+
+/* OBJECTS */
+
+/* TYPES */
+struct utimbuf
+{
+ time_t actime;  /* access time */
+ time_t modtime; /* modification time */
+};
+
+/* CONSTANTS */
+
+/* PROTOTYPES */
+int utime(const char *, const struct utimbuf *);
+
+/* MACROS */
+
+#endif /* __UTIME_H_INCLUDED__ */
+
+/* EOF */
+
diff --git a/posix/include/wchar.h b/posix/include/wchar.h
new file mode 100644 (file)
index 0000000..42269ad
--- /dev/null
@@ -0,0 +1,139 @@
+/* $Id: wchar.h,v 1.4 2002/10/29 04:45:26 rex Exp $
+ */
+/*
+ * wchar.h
+ *
+ * wide-character 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 __WCHAR_H_INCLUDED__
+#define __WCHAR_H_INCLUDED__
+
+/* INCLUDES */
+#include <stdio.h>
+#include <stdarg.h>
+#include <stdlib.h>
+#include <string.h>
+#include <stddef.h>
+#include <time.h>
+
+/* OBJECTS */
+
+/* TYPES */
+typedef wchar_t wint_t; /* An integral type capable of storing any valid
+                           value of wchar_t, or WEOF */
+typedef long int wctype_t; /* A scalar type of a data object that can hold
+                              values which represent locale-specific
+                              character classification. */
+typedef void * mbstate_t; /* An object type other than an array type that
+                             can hold the conversion state information
+                             necessary to convert between sequences of
+                             (possibly multibyte) characters and
+                             wide-characters */
+
+/* CONSTANTS */
+
+/* PROTOTYPES */
+wint_t            btowc(int);
+int               fwprintf(FILE *, const wchar_t *, ...);
+int               fwscanf(FILE *, const wchar_t *, ...);
+int               iswalnum(wint_t);
+int               iswalpha(wint_t);
+int               iswcntrl(wint_t);
+int               iswdigit(wint_t);
+int               iswgraph(wint_t);
+int               iswlower(wint_t);
+int               iswprint(wint_t);
+int               iswpunct(wint_t);
+int               iswspace(wint_t);
+int               iswupper(wint_t);
+int               iswxdigit(wint_t);
+int               iswctype(wint_t, wctype_t);
+wint_t            fgetwc(FILE *);
+wchar_t          *fgetws(wchar_t *, int, FILE *);
+wint_t            fputwc(wchar_t, FILE *);
+int               fputws(const wchar_t *, FILE *);
+int               fwide(FILE *, int);
+wint_t            getwc(FILE *);
+wint_t            getwchar(void);
+int               mbsinit(const mbstate_t *);
+size_t            mbrlen(const char *, size_t, mbstate_t *);
+size_t            mbrtowc(wchar_t *, const char *, size_t,
+                      mbstate_t *);
+size_t            mbsrtowcs(wchar_t *, const char **, size_t,
+                      mbstate_t *);
+wint_t            putwc(wchar_t, FILE *);
+wint_t            putwchar(wchar_t);
+int               swprintf(wchar_t *, size_t, const wchar_t *, ...);
+int               swscanf(const wchar_t *, const wchar_t *, ...);
+wint_t            towlower(wint_t);
+wint_t            towupper(wint_t);
+wint_t            ungetwc(wint_t, FILE *);
+int               vfwprintf(FILE *, const wchar_t *, va_list);
+int               vwprintf(const wchar_t *, va_list);
+int               vswprintf(wchar_t *, size_t, const wchar_t *,
+                      va_list);
+size_t            wcrtomb(char *, wchar_t, mbstate_t *);
+wchar_t          *wcscat(wchar_t *, const wchar_t *);
+wchar_t          *wcschr(const wchar_t *, wchar_t);
+int               wcscmp(const wchar_t *, const wchar_t *);
+int               wcscoll(const wchar_t *, const wchar_t *);
+wchar_t          *wcscpy(wchar_t *, const wchar_t *);
+size_t            wcscspn(const wchar_t *, const wchar_t *);
+size_t            wcsftime(wchar_t *, size_t, const wchar_t *,
+                      const struct tm *);
+size_t            wcslen(const wchar_t *);
+wchar_t          *wcsncat(wchar_t *, const wchar_t *, size_t);
+int               wcsncmp(const wchar_t *, const wchar_t *, size_t);
+wchar_t          *wcsncpy(wchar_t *, const wchar_t *, size_t);
+wchar_t          *wcspbrk(const wchar_t *, const wchar_t *);
+wchar_t          *wcsrchr(const wchar_t *, wchar_t);
+size_t            wcsrtombs(char *, const wchar_t **, size_t,
+                      mbstate_t *);
+size_t            wcsspn(const wchar_t *, const wchar_t *);
+wchar_t          *wcsstr(const wchar_t *, const wchar_t *);
+double            wcstod(const wchar_t *, wchar_t **);
+wchar_t          *wcstok(wchar_t *, const wchar_t *, wchar_t **);
+long int          wcstol(const wchar_t *, wchar_t **, int);
+unsigned long int wcstoul(const wchar_t *, wchar_t **, int);
+wchar_t          *wcswcs(const wchar_t *, const wchar_t *);
+int               wcswidth(const wchar_t *, size_t);
+size_t            wcsxfrm(wchar_t *, const wchar_t *, size_t);
+int               wctob(wint_t);
+wctype_t          wctype(const char *);
+int               wcwidth(wchar_t);
+wchar_t          *wmemchr(const wchar_t *, wchar_t, size_t);
+int               wmemcmp(const wchar_t *, const wchar_t *, size_t);
+wchar_t          *wmemcpy(wchar_t *, const wchar_t *, size_t);
+wchar_t          *wmemmove(wchar_t *, const wchar_t *, size_t);
+wchar_t          *wmemset(wchar_t *, wchar_t, size_t);
+int               wprintf(const wchar_t *, ...);
+int               wscanf(const wchar_t *, ...);
+
+/* MACROS */
+#define WCHAR_MAX (0xFFFF)
+#define WCHAR_MIN (0x0000)
+
+/* FIXME? */
+#define WEOF      (0xFFFF)
+
+#endif /* __WCHAR_H_INCLUDED__ */
+
+/* EOF */
+
diff --git a/posix/lib/Makefile b/posix/lib/Makefile
new file mode 100644 (file)
index 0000000..6223df6
--- /dev/null
@@ -0,0 +1,17 @@
+# $Id: Makefile,v 1.3 2002/10/29 04:45:26 rex Exp $
+# posix/lib/Makefile
+#
+PATH_TO_TOP=../../reactos
+
+PATH_TO_PSX_TOP = ../..
+
+all:
+       make -C psxdll psxdll.a
+       make -C psxx   psxx.a
+
+clean:
+       - $(RM) *.a
+
+include $(PATH_TO_TOP)/rules.mak
+
+# EOF
diff --git a/posix/lib/crt0w32.c b/posix/lib/crt0w32.c
new file mode 100644 (file)
index 0000000..ffd3eb7
--- /dev/null
@@ -0,0 +1,46 @@
+/* $Id: crt0w32.c,v 1.4 2002/10/29 04:45:26 rex Exp $
+ * 
+ * PROJECT    : ReactOS / POSIX+ personality
+ * FILE       : subsys/psx/lib/crt0w32.c
+ * DESCRIPTION: startup code for POSIX+ applications.
+ * DATE       : 2002-01-18
+ * AUTHOR     : Emanuele Aliberti <eal@users.sf.net>
+ */
+
+extern void __stdcall __PdxInitializeData(int*,char***);
+extern int main (int,char**,char**);
+extern void exit(int);
+
+/* ANSI ENVIRONMENT */
+
+char **_environ  = (char**) 0;
+
+int errno = 0;
+
+#ifdef __SUBSYSTEM_WINDOWS__
+void WinMainCRTStartup (void)
+#else
+void mainCRTStartup (void)
+#endif
+{
+  char * argv[2] = {"none", 0};
+
+  /* TODO: parse the command line */
+  exit(main(1,argv,0));
+}
+
+void __main ()
+{
+  /*
+   * Store in PSXDLL.DLL two well known global symbols
+   * references.
+   */
+  __PdxInitializeData (& errno, & _environ);  /* PSXDLL.__PdxInitializeData */
+  /* CRT initialization. */
+#ifdef __SUBSYSTEM_WINDOWS__
+  WinMainCRTStartup ();
+#else
+  mainCRTStartup (); 
+#endif
+}
+/* EOF */
diff --git a/posix/lib/psxdll/Makefile b/posix/lib/psxdll/Makefile
new file mode 100644 (file)
index 0000000..1ac62fb</