blob: 2a1388a8365b40b5b7a4d0c505898aa4aeb49f1f [file] [log] [blame]
/************************************************************************
* FILE.C Copyright (C) 1993 John Burton
*
* File I/O routines for the Linux Wine Project.
*
* There are two main parts to this module - first there are the
* actual emulation functions, and secondly a routine for translating
* DOS filenames into UNIX style filenames.
*
* For each DOS drive letter, we need to store the location in the unix
* file system to map that drive to, and the current directory for that
* drive.
*
* Finally we need to store the current drive letter in this module.
*
* WARNING : Many options of OpenFile are not yet implemeted.
*
*
************************************************************************/
#include <windows.h>
#include <assert.h>
#include <stdio.h>
#include <fcntl.h>
#include <string.h>
#include <limits.h>
/***************************************************************************
This structure stores the infomation needed for a single DOS drive
***************************************************************************/
struct DosDriveStruct
{
char RootDirectory [256]; /* Unix base for this drive letter */
char CurrentDirectory [256]; /* Current directory for this drive */
};
/***************************************************************************
Table for DOS drives
***************************************************************************/
struct DosDriveStruct DosDrives[] =
{
{"/mnt/floppy1" , ""},
{"/mnt/floppy2" , ""},
{"/mnt/HardDisk", "/wine"},
{"" , "/wine/Wine"}
};
#define NUM_DRIVES (sizeof (DosDrives) / sizeof (struct DosDriveStruct))
/**************************************************************************
Global variable to store current drive letter (0 = A, 1 = B etc)
**************************************************************************/
int CurrentDrive = 2;
/**************************************************************************
ParseDOSFileName
Return a fully specified DOS filename with the disk letter separated from
the path information.
**************************************************************************/
void ParseDOSFileName (char *UnixFileName, char *DosFileName, int *Drive)
{
int character;
for (character = 0; character < strlen(DosFileName); character++)
{
if (DosFileName[character] == '\\')
DosFileName[character] = '/';
}
if (DosFileName[1] == ':')
{
*Drive = DosFileName[0] - 'A';
if (*Drive > 26)
*Drive = *Drive - 'a' + 'A';
DosFileName = DosFileName + 2;
}
else
*Drive = CurrentDrive;
if (DosFileName[0] == '/')
{
strcpy (UnixFileName, DosDrives[*Drive].RootDirectory);
strcat (UnixFileName, DosFileName);
return;
}
strcpy (UnixFileName, DosDrives[*Drive].RootDirectory);
strcat (UnixFileName, DosDrives[*Drive].CurrentDirectory);
strcat (UnixFileName, "/");
strcat (UnixFileName, DosFileName);
return;
}
/***************************************************************************
_lopen
Emulate the _lopen windows call
***************************************************************************/
WORD KERNEL__lopen (LPSTR lpPathName, WORD iReadWrite)
{
char UnixFileName[256];
int Drive;
int handle;
ParseDOSFileName (UnixFileName, lpPathName, &Drive);
handle = open (UnixFileName, iReadWrite);
#ifdef DEBUG_FILE
fprintf (stderr, "_lopen: %s (Handle = %d)\n", UnixFileName, handle);
#endif
return handle;
}
/***************************************************************************
_lread
***************************************************************************/
WORD KERNEL__lread (WORD hFile, LPSTR lpBuffer, WORD wBytes)
{
int result;
result = read (hFile, lpBuffer, wBytes);
#ifdef DEBUG_FILE
fprintf(stderr, "_lread: hFile = %d, lpBuffer = %s, wBytes = %d\n",
hFile, lpBuffer, wBytes);
#endif
return result;
}
/****************************************************************************
_lwrite
****************************************************************************/
WORD KERNEL__lwrite (WORD hFile, LPSTR lpBuffer, WORD wBytes)
{
#ifdef DEBUG_FILE
fprintf(stderr, "_lwrite: hFile = %d, lpBuffer = %s, wBytes = %d\n",
hFile, lpBuffer, wBytes);
#endif
return write (hFile, lpBuffer, wBytes);
}
/***************************************************************************
_lclose
***************************************************************************/
WORD KERNEL__lclose (WORD hFile)
{
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;
fprintf(stderr,"Openfile(%s,<struct>,%d) ",lpFileName,wStyle);
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);
}