revert of mass delete of the posix subsystem. perhaps there is hope for it yet.
[reactos.git] / posix / lib / psxdll / unistd / read.c
diff --git a/posix/lib/psxdll/unistd/read.c b/posix/lib/psxdll/unistd/read.c
new file mode 100644 (file)
index 0000000..929d705
--- /dev/null
@@ -0,0 +1,117 @@
+/* $Id: read.c,v 1.4 2002/10/29 04:45:48 rex Exp $
+ */
+/*
+ * COPYRIGHT:   See COPYING in the top level directory
+ * PROJECT:     ReactOS POSIX+ Subsystem
+ * FILE:        subsys/psx/lib/psxdll/unistd/read.c
+ * PURPOSE:     Read from a file
+ * PROGRAMMER:  KJK::Hyperion <noog@libero.it>
+ * UPDATE HISTORY:
+ *              15/02/2002: Created
+ */
+
+#include <ddk/ntddk.h>
+#include <fcntl.h>
+#include <unistd.h>
+#include <sys/types.h>
+#include <psx/debug.h>
+#include <psx/errno.h>
+
+ssize_t __read(int fildes, void *buf, size_t nbyte, off_t *offset)
+{
+ HANDLE          hFile;
+ NTSTATUS        nErrCode;
+ IO_STATUS_BLOCK isbStatus;
+
+ /* get the file handle for the specified file descriptor */
+ if(fcntl(fildes, F_GETFH, &hFile) == -1)
+  return (-1);
+
+ if(offset != NULL)
+ {
+  /* NT always moves the file pointer, while Unix pread() must not: we have to
+     duplicate the handle and work on the duplicate */ /* FIXME? better save
+     the file position and restore it later? */
+  HANDLE hDupFile;
+
+  /* duplicate the handle */
+  nErrCode = NtDuplicateObject
+  (
+   NtCurrentProcess(),
+   hFile,
+   NtCurrentProcess(),
+   &hDupFile,
+   0,
+   0,
+   DUPLICATE_SAME_ACCESS
+  );
+
+  /* failure */
+  if(!NT_SUCCESS(nErrCode))
+  {
+   errno = __status_to_errno(nErrCode);
+   return (0);
+  }
+
+  /* read data from file at the specified offset */
+  nErrCode = NtReadFile
+  (
+   hDupFile,
+   NULL,
+   NULL,
+   NULL,
+   &isbStatus,
+   buf,
+   nbyte,
+   (PLARGE_INTEGER)offset,
+   NULL
+  );
+
+  NtClose(hDupFile);
+
+  /* failure */
+  if(!NT_SUCCESS(nErrCode))
+  {
+   errno = __status_to_errno(nErrCode);
+   return (0);
+  }
+ }
+ else
+ {
+  /* read data from file at the current offset */
+  nErrCode = NtReadFile
+  (
+   hFile,
+   NULL,
+   NULL,
+   NULL,
+   &isbStatus,
+   buf,
+   nbyte,
+   NULL,
+   NULL
+  );
+
+  /* failure */
+  if(!NT_SUCCESS(nErrCode))
+  {
+   errno = __status_to_errno(nErrCode);
+   return (0);
+  }
+ }
+
+ return ((ssize_t)isbStatus.Information);
+}
+
+ssize_t read(int fildes, void *buf, size_t nbyte)
+{
+ return (__read(fildes, buf, nbyte, NULL));
+}
+
+ssize_t pread(int fildes, void *buf, size_t nbyte, off_t offset)
+{
+ return (__read(fildes, buf, nbyte, &offset));
+}
+
+/* EOF */
+