| /************************************************************************ |
| * 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 <windows.h> |
| #include <stdio.h> |
| #include <fcntl.h> |
| #include <limits.h> |
| #include "prototypes.h" |
| |
| char WindowsDirectory[256], SystemDirectory[256], TempDirectory[256]; |
| |
| |
| /*************************************************************************** |
| _lopen |
| |
| Emulate the _lopen windows call |
| ***************************************************************************/ |
| WORD KERNEL__lopen (LPSTR lpPathName, WORD iReadWrite) |
| { |
| int handle; |
| char *UnixFileName; |
| |
| #ifdef DEBUG_FILE |
| fprintf (stderr, "_lopen: open %s\n", lpPathName); |
| #endif |
| |
| if ((UnixFileName = GetUnixFileName(lpPathName)) == NULL) |
| return HFILE_ERROR; |
| |
| 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 KERNEL__lread (WORD hFile, LPSTR lpBuffer, WORD wBytes) |
| { |
| int result; |
| |
| #ifdef DEBUG_FILE |
| fprintf(stderr, "_lread: handle %d, buffer = %ld, length = %d\n", |
| hFile, lpBuffer, wBytes); |
| #endif |
| |
| result = read (hFile, lpBuffer, wBytes); |
| |
| if (result == -1) |
| return HFILE_ERROR; |
| else |
| return result; |
| } |
| |
| /**************************************************************************** |
| _lwrite |
| ****************************************************************************/ |
| WORD KERNEL__lwrite (WORD hFile, LPSTR lpBuffer, WORD wBytes) |
| { |
| int result; |
| |
| #ifdef DEBUG_FILE |
| fprintf(stderr, "_lwrite: handle %d, buffer = %ld, length = %d\n", |
| hFile, lpBuffer, wBytes); |
| #endif |
| result = write (hFile, lpBuffer, wBytes); |
| |
| if (result == -1) |
| return HFILE_ERROR; |
| else |
| return result; |
| } |
| |
| /*************************************************************************** |
| _lclose |
| ***************************************************************************/ |
| WORD KERNEL__lclose (WORD hFile) |
| { |
| #ifdef DEBUG_FILE |
| fprintf(stderr, "_lclose: handle %d\n", hFile); |
| #endif |
| |
| close (hFile); |
| } |
| |
| /************************************************************************** |
| OpenFile |
| |
| Warning: This is nearly totally untested. It compiles, that's it... |
| -SL 9/13/93 |
| **************************************************************************/ |
| WORD KERNEL_OpenFile (LPSTR lpFileName, LPOFSTRUCT ofs, WORD wStyle) |
| { |
| int base,flags; |
| |
| #ifdef DEBUG_FILE |
| fprintf(stderr,"Openfile(%s,<struct>,%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; } |
| |
| fprintf(stderr,"now %d,%d\n",base,flags); |
| |
| if(flags&(OF_DELETE|OF_EXIST)) |
| { |
| fprintf(stderr,"Unsupported OpenFile option\n"); |
| return -1; |
| } |
| else |
| { |
| return KERNEL__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 |
| **************************************************************************/ |
| |
| WORD SetHandleCount (WORD wNumber) |
| { |
| printf("SetHandleCount(%d)\n",wNumber); |
| return((wNumber<OPEN_MAX) ? wNumber : OPEN_MAX); |
| } |
| |
| /*************************************************************************** |
| _llseek |
| ***************************************************************************/ |
| LONG KERNEL__llseek (WORD hFile, LONG lOffset, int nOrigin) |
| { |
| int origin; |
| |
| #ifdef DEBUG_FILE |
| fprintf(stderr, "_llseek: handle %d, offset %ld, origin %d\n", hFile, lOffset, nOrigin); |
| #endif |
| |
| switch (nOrigin) { |
| case 1: origin = SEEK_CUR; |
| break; |
| case 2: origin = SEEK_END; |
| break; |
| default: origin = SEEK_SET; |
| break; |
| } |
| |
| return ( lseek(hFile, lOffset, origin) ); |
| } |
| |
| /*************************************************************************** |
| _lcreate |
| ***************************************************************************/ |
| LONG KERNEL__lcreate (LPSTR lpszFilename, int fnAttribute) |
| { |
| int handle; |
| char *UnixFileName; |
| |
| #ifdef DEBUG_FILE |
| fprintf(stderr, "_lcreate: filename %s, attributes %d\n",lpszFilename, |
| fnAttribute); |
| #endif |
| |
| if ((UnixFileName = GetUnixFileName(lpszFilename)) == NULL) |
| return HFILE_ERROR; |
| |
| handle = open (UnixFileName, O_CREAT | O_TRUNC | O_WRONLY ); |
| |
| if (handle == -1) |
| return HFILE_ERROR; |
| else |
| return handle; |
| } |
| |
| /*************************************************************************** |
| GetDriveType |
| ***************************************************************************/ |
| UINT GetDriveType(int drive) |
| { |
| |
| #ifdef DEBUG_FILE |
| fprintf(stderr,"GetDriveType %c:\n",'A'+drive); |
| #endif |
| |
| if (!DOS_ValidDrive(drive)) |
| return 0; |
| |
| if (drive == 0 || drive == 1) |
| return DRIVE_REMOVABLE; |
| |
| return DRIVE_REMOTE; |
| } |
| |
| /*************************************************************************** |
| GetTempDrive |
| ***************************************************************************/ |
| BYTE GetTempDrive(BYTE chDriveLetter) |
| { |
| #ifdef DEBUG_FILE |
| fprintf(stderr,"GetTempDrive (%d)\n",chDriveLetter); |
| #endif |
| return('C'); |
| } |
| |
| /*************************************************************************** |
| GetWindowsDirectory |
| ***************************************************************************/ |
| UINT GetWindowsDirectory(LPSTR lpszSysPath, UINT cbSysPath) |
| { |
| if (cbSysPath < strlen(WindowsDirectory)) |
| *lpszSysPath = 0; |
| else |
| strcpy(lpszSysPath, WindowsDirectory); |
| |
| #ifdef DEBUG_FILE |
| fprintf(stderr,"GetWindowsDirectory (%s)\n",lpszSysPath); |
| #endif |
| |
| return(strlen(lpszSysPath)); |
| } |
| /*************************************************************************** |
| GetSystemDirectory |
| ***************************************************************************/ |
| UINT GetSystemDirectory(LPSTR lpszSysPath, UINT cbSysPath) |
| { |
| if (cbSysPath < strlen(SystemDirectory)) |
| *lpszSysPath = 0; |
| else |
| strcpy(lpszSysPath, SystemDirectory); |
| |
| #ifdef DEBUG_FILE |
| fprintf(stderr,"GetSystemDirectory (%s)\n",lpszSysPath); |
| #endif |
| |
| return(strlen(lpszSysPath)); |
| } |
| /*************************************************************************** |
| GetTempFileName |
| ***************************************************************************/ |
| int GetTempFileName(BYTE bDriveLetter, LPCSTR lpszPrefixString, UINT uUnique, LPSTR lpszTempFileName) |
| { |
| int unique; |
| char tempname[256]; |
| |
| if (uUnique == 0) |
| unique = time(NULL)%99999L; |
| else |
| unique = uUnique%99999L; |
| |
| strcpy(tempname,lpszPrefixString); |
| tempname[3]='\0'; |
| |
| sprintf(lpszTempFileName,"%s\%s%d.tmp",WindowsDirectory, tempname, |
| unique); |
| |
| ToDos(lpszTempFileName); |
| |
| #ifdef DEBUG_FILE |
| fprintf(stderr,"GetTempFilename: %c %s %d => %s\n",bDriveLetter, |
| lpszPrefixString,uUnique,lpszTempFileName); |
| #endif |
| |
| return unique; |
| } |
| |
| /*************************************************************************** |
| SetErrorMode |
| ***************************************************************************/ |
| WORD SetErrorMode(WORD x) |
| { |
| fprintf(stderr,"wine: SetErrorMode %4x (ignored)\n",x); |
| } |