Manually applying Gunnars patch because it's easier this way - and a good chance...
[reactos.git] / reactos / lib / kernel32 / file / lfile.c
index 9f61142..271ea60 100644 (file)
-/*
-* created:     Boudewijn Dekker
-* org. source: WINE
-* date:                june 1998
-* todo:                check the _lopen for correctness
-*/
-
+/* $Id: lfile.c,v 1.7 2002/11/07 02:52:37 robd Exp $
+ *
+ * COPYRIGHT:       See COPYING in the top level directory
+ * PROJECT:         ReactOS system libraries
+ * FILE:            lib/kernel32/file/lfile.c
+ * PURPOSE:         Find functions
+ * PROGRAMMER:      Ariadne ( ariadne@xs4all.nl)
+ * UPDATE HISTORY:
+ *                  Created 01/11/98
+ */
+
+#undef WIN32_LEAN_AND_MEAN
 #include <windows.h>
 #include <string.h>
-#include <wstring.h>
-
+#include <wchar.h>
 
 
-
-long _hread(
-    HFILE  hFile,      
-    LPVOID  lpBuffer,  
-    long  lBytes       
-   )
+long
+STDCALL
+_hread(
+       HFILE   hFile,
+       LPVOID  lpBuffer,
+       long    lBytes
+       )
 {
-       DWORD  NumberOfBytesRead;
-       if ( ReadFile((HANDLE)hFile,(LPCVOID)lpBuffer,(DWORD)lBytes,&NumberOfBytesRead, NULL) == FALSE )
+       DWORD   NumberOfBytesRead;
+       
+       if (ReadFile(
+               (HANDLE) hFile,
+               (LPVOID) lpBuffer,
+               (DWORD) lBytes,
+               & NumberOfBytesRead,
+               NULL
+               ) == FALSE)
+       {
                return -1;
-       else
-               return NumberOfBytesRead;
-
+       }
+       return NumberOfBytesRead;
 }
 
-long 
-_lread(HFILE fd,LPVOID buffer,long count)
+
+/*
+//19990828.EA: aliased in DEF
+UINT
+STDCALL
+_lread (
+       HFILE   fd,
+       LPVOID  buffer,
+       UINT    count
+       )
 {
-    return _hread(fd,buffer, count);
+       return _hread(
+                fd,
+                buffer,
+                count
+                );
 }
+*/
 
 
-long _hwrite(
-    HFILE  hFile,      
-    LPCSTR  lpBuffer,  
-    long  lBytes       
-   )
+long
+STDCALL
+_hwrite (
+       HFILE   hFile,
+       LPCSTR  lpBuffer,
+       long    lBytes
+       )
 {
-
-       DWORD  NumberOfBytesWritten;
-       if ( lBytes == 0 ) {
+       DWORD   NumberOfBytesWritten;
+       
+       if (lBytes == 0)
+       {
                if ( SetEndOfFile((HANDLE) hFile ) == FALSE )
+               {
                        return -1;
-               else
-                       return 0;
+               }
+               return 0;
        }
-       if ( WriteFile((HANDLE)hFile,(LPCVOID)lpBuffer,(DWORD)lBytes, &NumberOfBytesWritten,NULL) == FALSE )
+       if ( WriteFile(
+               (HANDLE) hFile,
+               (LPVOID) lpBuffer,
+               (DWORD) lBytes,
+               & NumberOfBytesWritten,
+               NULL
+               ) == FALSE )
+       {
                return -1;
-       else
-               return NumberOfBytesWritten;
-
+       }
+       return NumberOfBytesWritten;
 }
 
 
-long _lwrite(
-    HFILE  hFile,      
-    LPCSTR  lpBuffer,  
-    long  lBytes       
-   )
+/*
+//19990828.EA: aliased in DEF
+
+UINT
+STDCALL
+_lwrite(
+       HFILE   hFile,
+       LPCSTR  lpBuffer,
+       UINT    uBytes
+       )
 {
-       return _hwrite(hFile,lpBuffer,lBytes);
+       return _hwrite(hFile,lpBuffer,uBytes);
 }
+*/
 
-#define OF_OPENMASK    (OF_READ|OF_READWRITE|OF_WRITE|OF_CREATE)
-#define OF_FILEMASK    (OF_DELETE|OF_PARSE)
-#define OF_MASK                (OF_OPENMASK|OF_FILEMASK)
 
-HFILE _open( LPCSTR  lpPathName, int  iReadWrite        )
+HFILE
+STDCALL
+_lopen (
+       LPCSTR  lpPathName,
+       int     iReadWrite
+       )
 {
-
-
-       
-       HFILE fd;
-       int nFunction;
+       DWORD dwAccessMask = 0;
+       DWORD dwShareMode = 0;
        
-
-
-       
-       /* Don't assume a 1:1 relationship between OF_* modes and O_* modes */
-       /* Here we translate the read/write permission bits (which had better */
-       /* be the low 2 bits.  If not, we're in trouble.  Other bits are  */
-       /* passed through unchanged */
-       
-       nFunction = wFunction & 3;
-       
-       switch (wFunction & 3) {
-               case OF_READ:
-                       nFunction |= O_RDONLY;
-                       break;
-               case OF_READWRITE:
-                       nFunction |= O_RDWR;
-                       break;
-               case OF_WRITE:
-                       nFunction |= O_WRONLY;
-                       break;
-               default:
-                       //ERRSTR((LF_ERROR, "_lopen: bad file open mode %x\n", wFunction));
-                       return HFILE_ERROR;
-       }
-       SetLastError(0);
-       fd = CreateFileA( filename,nFunction,OPEN_EXISTING,
-                       NULL,OPEN_EXISTING,NULL,NULL);  
-       if (fd == INVALID_HANDLE_VALUE )
-                return HFILE_ERROR;
-       return fd;
+       if ( (iReadWrite & OF_READWRITE ) == OF_READWRITE )
+               dwAccessMask = GENERIC_READ | GENERIC_WRITE;
+       else if ( (iReadWrite & OF_READ ) == OF_READ )
+               dwAccessMask = GENERIC_READ;
+       else if ( (iReadWrite & OF_WRITE ) == OF_WRITE )
+               dwAccessMask = GENERIC_WRITE;
+
+       if ((iReadWrite & OF_SHARE_COMPAT) == OF_SHARE_COMPAT )
+               dwShareMode = FILE_SHARE_WRITE | FILE_SHARE_READ | FILE_SHARE_DELETE;
+       else if ((iReadWrite & OF_SHARE_DENY_NONE) == OF_SHARE_DENY_NONE)
+               dwShareMode = FILE_SHARE_WRITE | FILE_SHARE_READ | FILE_SHARE_DELETE;
+       else if ((iReadWrite & OF_SHARE_DENY_READ) == OF_SHARE_DENY_READ)
+               dwShareMode = FILE_SHARE_WRITE | FILE_SHARE_DELETE;
+       else if ((iReadWrite & OF_SHARE_DENY_WRITE) == OF_SHARE_DENY_WRITE )
+               dwShareMode = FILE_SHARE_READ | FILE_SHARE_DELETE;
+       else if ((iReadWrite & OF_SHARE_EXCLUSIVE) == OF_SHARE_EXCLUSIVE)
+               dwShareMode = 0;
+
+       SetLastError (ERROR_SUCCESS);
+       return (HFILE) CreateFileA(
+                       lpPathName,
+                       dwAccessMask,
+                       dwShareMode,
+                       NULL,
+                       OPEN_EXISTING,
+                       FILE_ATTRIBUTE_NORMAL,
+                       NULL);
 }
 
-int _creat(const char *filename, int pmode)
+
+HFILE
+STDCALL
+_lcreat (
+       LPCSTR  lpPathName,
+       int     iAttribute
+       )
 {
-       SetLastError(0);
-       return CreateFileA( filename,GENERIC_READ & GENERIC_WRITE,FILE_SHARE_WRITE,
-                       NULL,CREATE_ALWAYS,pmode & 0x00003FB7,NULL);    
+
+       DWORD FileAttributes = 0;
+       
+       if (  iAttribute == 0 )
+               FileAttributes |= FILE_ATTRIBUTE_NORMAL;
+       else if (  iAttribute == 1 )
+               FileAttributes |= FILE_ATTRIBUTE_READONLY;
+       else if (  iAttribute == 2 )
+               FileAttributes |= FILE_ATTRIBUTE_HIDDEN;
+       else if (  iAttribute == 4 )
+               FileAttributes |= FILE_ATTRIBUTE_SYSTEM;
+
+       return (HFILE) CreateFileA(
+                       lpPathName,
+                       GENERIC_ALL,
+                       (FILE_SHARE_READ | FILE_SHARE_WRITE),
+                       NULL,
+                       CREATE_ALWAYS,
+                       iAttribute,
+                       NULL);
 }
 
 
-int _lclose(
-    HFILE  hFile       
-   )
+int
+STDCALL
+_lclose (
+       HFILE   hFile
+       )
 {
-       if ( CloseHandle((HANDLE)hFile) )
+       if (CloseHandle ((HANDLE)hFile))
+       {
                return 0;
-       else
-               rerturn -1; 
+       }
+       return -1;
 }
 
-LONG _llseek(
-    HFILE  hFile,
-    LONG  lOffset, 
-    int  iOrigin 
-   )
+
+LONG
+STDCALL
+_llseek(
+       HFILE   hFile,
+       LONG    lOffset,
+       int     iOrigin
+       )
 {
-       return  SetFilePointer((HANDLE)  hFile,  lOffset, NULL,(DWORD)iOrigin );
+       return SetFilePointer (
+                       (HANDLE) hFile,
+                       lOffset,
+                       NULL,
+                       (DWORD) iOrigin);
 }
 
-
+/* EOF */