/************************************************************************ * FILE.C Copyright (C) 1993 John Burton * * File I/O routines for the Linux Wine Project. * * WARNING : Many options of OpenFile are not yet implemeted. * * NOV 93 Erik Bos (erik@(trashcan.)hacktic.nl * - removed ParseDosFileName, and DosDrive structures. * - structures dynamically configured at runtime. * - _lopen modified to use GetUnixFileName. * * DEC 93 Erik Bos (erik@(trashcan.)hacktic.nl) * - Existing functions modified to use dosfs functions. * - Added _llseek, _lcreate, GetDriveType, GetTempDrive, * GetWindowsDirectory, GetSystemDirectory, GetTempFileName. * ************************************************************************/ /* #define DEBUG_FILE */ #include #include #include #include #include #include #include "prototypes.h" #define DEBUG_FILE char WindowsDirectory[256], SystemDirectory[256], TempDirectory[256]; /*************************************************************************** _lopen Emulate the _lopen windows call ***************************************************************************/ INT _lopen (LPSTR lpPathName, INT iReadWrite) { int handle; char *UnixFileName; #ifdef DEBUG_FILE fprintf (stderr, "_lopen: open('%s', %X);\n", lpPathName, iReadWrite); #endif if ((UnixFileName = GetUnixFileName(lpPathName)) == NULL) return HFILE_ERROR; iReadWrite &= 0x000F; handle = open (UnixFileName, iReadWrite); #ifdef DEBUG_FILE fprintf (stderr, "_lopen: open: %s (handle %d)\n", UnixFileName, handle); #endif if (handle == -1) return HFILE_ERROR; else return handle; } /*************************************************************************** _lread ***************************************************************************/ WORD _lread (INT hFile, LPSTR lpBuffer, INT wBytes) { int result; #ifdef DEBUG_FILE fprintf(stderr, "_lread: handle %d, buffer = %ld, length = %d\n", hFile, (int) lpBuffer, wBytes); #endif result = read (hFile, lpBuffer, wBytes); if (result == -1) return HFILE_ERROR; else return result; } /**************************************************************************** _lwrite ****************************************************************************/ WORD _lwrite (INT hFile, LPSTR lpBuffer, INT wBytes) { int result; #ifdef DEBUG_FILE fprintf(stderr, "_lwrite: handle %d, buffer = %ld, length = %d\n", hFile, (int) lpBuffer, wBytes); #endif result = write (hFile, lpBuffer, wBytes); if (result == -1) return HFILE_ERROR; else return result; } /*************************************************************************** _lclose ***************************************************************************/ INT _lclose (INT hFile) { #ifdef DEBUG_FILE fprintf(stderr, "_lclose: handle %d\n", hFile); #endif if (close (hFile)) return HFILE_ERROR; else return 0; } /************************************************************************** OpenFile Warning: This is nearly totally untested. It compiles, that's it... -SL 9/13/93 **************************************************************************/ INT OpenFile (LPSTR lpFileName, LPOFSTRUCT ofs, WORD wStyle) { int base,flags; int handle; #ifdef DEBUG_FILE fprintf(stderr,"Openfile(%s,,%d) ",lpFileName,wStyle); #endif base=wStyle&0xF; flags=wStyle&0xFFF0; flags&=0xFF0F; /* strip SHARE bits for now */ flags&=0xD7FF; /* strip PROMPT & CANCEL bits for now */ flags&=0x7FFF; /* strip REOPEN bit for now */ flags&=0xFBFF; /* strib VERIFY bit for now */ if(flags&OF_CREATE) { base |=O_CREAT; flags &=0xEFFF; } #ifdef DEBUG_FILE fprintf(stderr,"now %d,%d\n",base,flags); #endif if (flags & OF_EXIST) { printf("OpenFile // OF_EXIST '%s' !\n", lpFileName); handle = _lopen (lpFileName, wStyle); close(handle); return handle; } if (flags & OF_DELETE) { printf("OpenFile // OF_DELETE '%s' !\n", lpFileName); return unlink(lpFileName); } else { return _lopen (lpFileName, wStyle); } } /************************************************************************** SetHandleCount Changes the number of file handles available to the application. Since Linux isn't limited to 20 files, this one's easy. - SL **************************************************************************/ #if !defined (OPEN_MAX) /* This one is for the Sun */ #define OPEN_MAX _POSIX_OPEN_MAX #endif WORD SetHandleCount (WORD wNumber) { printf("SetHandleCount(%d)\n",wNumber); return((wNumber %s\n",bDriveLetter, lpszPrefixString,uUnique,lpszTempFileName); #endif if ((handle = _lcreate (lpszTempFileName, 0x0000)) == -1) { fprintf(stderr,"GetTempFilename: can't create temp file '%s' !\n", lpszTempFileName); } else close(handle); return unique; } /*************************************************************************** SetErrorMode ***************************************************************************/ WORD SetErrorMode(WORD x) { fprintf(stderr,"wine: SetErrorMode %4x (ignored)\n",x); } /*************************************************************************** _hread ***************************************************************************/ long _hread(int hf, void FAR *hpvBuffer, long cbBuffer) { return read(hf, hpvBuffer, cbBuffer); } /*************************************************************************** _hwrite ***************************************************************************/ long _hwrite(int hf, const void FAR *hpvBuffer, long cbBuffer) { return write(hf, hpvBuffer, cbBuffer); }