/************************************************************************
 * 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@xs4all.nl)
 *		- removed ParseDosFileName, and DosDrive structures.
 *		- structures dynamically configured at runtime.
 *		- _lopen modified to use DOS_GetUnixFileName.
 *		- Existing functions modified to use dosfs functions.
 *		- Added _llseek, _lcreat, GetDriveType, GetTempDrive, 
 *		  GetWindowsDirectory, GetSystemDirectory, GetTempFileName.
 *
 ************************************************************************/

#include <stdio.h>
#include <fcntl.h>
#include <limits.h>
#include <unistd.h>
#include <time.h>
#include <sys/stat.h>
#include <string.h>
#include "dos_fs.h"
#include "windows.h"
#include "msdos.h"
#include "options.h"
#include "stddebug.h"
#include "debug.h"

#define MAX_PATH 255

char WindowsDirectory[256], SystemDirectory[256], TempDirectory[256];

/***************************************************************************
 _lopen 

 Emulate the _lopen windows call
 ***************************************************************************/
INT _lopen (LPSTR lpPathName, INT iReadWrite)
{
  int  handle;
  char *UnixFileName;
  int mode = 0;

  dprintf_file(stddeb, "_lopen: open('%s', %X);\n", lpPathName, iReadWrite);
  if ((UnixFileName = DOS_GetUnixFileName(lpPathName)) == NULL)
  	return HFILE_ERROR;
  switch(iReadWrite & 3)
  {
  case OF_READ:      mode = O_RDONLY; break;
  case OF_WRITE:     mode = O_WRONLY | O_TRUNC; break;
  case OF_READWRITE: mode = O_RDWR; break;
  }
  handle = open( UnixFileName, mode );
  if (( handle == -1 ) && Options.allowReadOnly)
    handle = open( UnixFileName, O_RDONLY );

  dprintf_file(stddeb, "_lopen: open: %s (handle %d)\n", UnixFileName, handle);

  if (handle == -1)
  	return HFILE_ERROR;
  else
  	return handle;
}

/***************************************************************************
 _lread
 ***************************************************************************/
INT _lread (INT hFile, LPSTR lpBuffer, WORD wBytes)
{
  int result;

  dprintf_file(stddeb, "_lread: handle %d, buffer = %p, length = %d\n",
	  		hFile, lpBuffer, wBytes);
  
  result = (wBytes == 0) ? 0 : read (hFile, lpBuffer, wBytes);

  if (result == -1)
  	return HFILE_ERROR;
  else
  	return result;
}

/****************************************************************************
 _lwrite
****************************************************************************/
INT _lwrite (INT hFile, LPCSTR lpBuffer, WORD wBytes)
{
    int result;

    dprintf_file(stddeb, "_lwrite: handle %d, buffer = %p, length = %d\n",
		 hFile, lpBuffer, wBytes);

    if(wBytes == 0) {  /* Expand the file size if necessary */
	char toWrite = 0;
	off_t prev, end;
	
	prev = lseek(hFile, 0, SEEK_CUR);
	if(prev == -1) return HFILE_ERROR;
	end = lseek(hFile, 0, SEEK_END);
	if(end == -1) return HFILE_ERROR;
	if(prev > end) {
	    lseek(hFile, prev-1, SEEK_SET);
	    result = write(hFile, &toWrite, 1) - 1;
	    if(result == -2) ++result;
	}
	else {
	    lseek(hFile, prev, SEEK_SET);
	    result = 0;
	}
    }
    else result = write (hFile, lpBuffer, wBytes);

    if (result == -1)
        return HFILE_ERROR;
    else
        return result;
}

/***************************************************************************
 _lclose
 ***************************************************************************/
INT _lclose (INT hFile)
{
    dprintf_file(stddeb, "_lclose: handle %d\n", hFile);
    
    if (hFile == 0 || hFile == 1 || hFile == 2) {
	fprintf( stderr, "Program attempted to close stdin, stdout or stderr!\n" );
	return 0;
    }
    if (close (hFile))
        return HFILE_ERROR;
    else
        return 0;
}

/**************************************************************************
 OpenFile
 **************************************************************************/
INT OpenFile (LPCSTR lpFileName, LPOFSTRUCT ofs, UINT wStyle)
{
    char         filename[MAX_PATH+1];
    int          action;
    struct stat  s;
    struct tm   *now;
    int          res, handle;
    int          verify_time = 0;
  
    dprintf_file(stddeb,"Openfile(%s,<struct>,%X)\n",lpFileName,wStyle);
 
    action = wStyle & 0xff00;
  
    /* OF_CREATE is completly different from all other options, so
       handle it first */

    if (action & OF_CREATE)
    {
        char *unixfilename;

        if (!(action & OF_REOPEN)) strcpy(ofs->szPathName, lpFileName);
        ofs->cBytes = sizeof(OFSTRUCT);
        ofs->fFixedDisk = FALSE;
        ofs->nErrCode = 0;
        *((int*)ofs->reserved) = 0;

        if ((unixfilename = DOS_GetUnixFileName (ofs->szPathName)) == NULL)
        {
            errno_to_doserr();
            ofs->nErrCode = ExtendedError;
            return -1;
        }
	/* Apparently, at least the OF_READ parameter is ignored when
	 * a file is created. Using O_RDWR makes the most sense.
	 */
        handle = open (unixfilename, O_TRUNC | O_RDWR | O_CREAT, 0666);
        if (handle == -1)
        {
            errno_to_doserr();
            ofs->nErrCode = ExtendedError;
        }   
        return handle;
    }


    /* If path isn't given, try to find the file. */

    if (!(action & OF_REOPEN))
    {
	char temp[MAX_PATH + 1];
	
	if(index(lpFileName,'\\') || index(lpFileName,'/') || 
	   index(lpFileName,':')) 
	{
	    strcpy (filename,lpFileName);
	    goto found;
	}
	/* Try current directory */
	if (DOS_FindFile(temp, MAX_PATH, lpFileName, NULL, ".")) {
	    strcpy(filename, DOS_GetDosFileName(temp));
	    goto found;
	}

	/* Try Windows directory */
	GetWindowsDirectory(filename, MAX_PATH);
	if (DOS_FindFile(temp, MAX_PATH, lpFileName, NULL, filename)) {
	    strcpy(filename, DOS_GetDosFileName(temp));
	    goto found;
	}
	
	/* Try Windows system directory */
	GetSystemDirectory(filename, MAX_PATH);
	if (DOS_FindFile(temp, MAX_PATH, lpFileName, NULL, filename)) {
	    strcpy(filename, DOS_GetDosFileName(temp));
	    goto found;
	}

	/* Try the path of the current executable */
	if (GetCurrentTask())
	{
	    char *p;
	    GetModuleFileName( GetCurrentTask(), filename, MAX_PATH );
	    if ((p = strrchr( filename, '\\' )))
	    {
		p[1] = '\0';
		if (DOS_FindFile(temp, MAX_PATH, lpFileName, NULL, filename)) {
		    strcpy(filename, DOS_GetDosFileName(temp));
		    goto found;
		}
	    }
	}

	/* Try all directories in path */

	if (DOS_FindFile(temp,MAX_PATH,lpFileName,NULL,WindowsPath))
	{
	    strcpy(filename, DOS_GetDosFileName(temp));
	    goto found;
	}
	/* ??? shouldn't we give an error here? */
	strcpy (filename, lpFileName);
	
	found:
	
	ofs->cBytes = sizeof(OFSTRUCT);
	ofs->fFixedDisk = FALSE;
	strcpy(ofs->szPathName, filename);
	ofs->nErrCode = 0;
        if (!(action & OF_VERIFY))
          *((int*)ofs->reserved) = 0;
    }
    

    if (action & OF_PARSE)
        return 0;

    if (action & OF_DELETE)
      return unlink(DOS_GetUnixFileName(ofs->szPathName));
    /* FIXME: I suppose we should check return codes here like stat below */

    /* Now on to getting some information about that file */

    if ((res = stat(DOS_GetUnixFileName(ofs->szPathName), &s)))
      {
      errno_to_doserr();
      ofs->nErrCode = ExtendedError;
      return -1;
    }
    
    now = localtime (&s.st_mtime);

    if (action & OF_VERIFY)
      verify_time = *((int*)ofs->reserved);
    
    *((WORD*)(&ofs->reserved[2]))=
         ((now->tm_hour * 0x2000) + (now->tm_min * 0x20) + (now->tm_sec / 2));
    *((WORD*)(&ofs->reserved[0]))=
         ((now->tm_year * 0x200) + (now->tm_mon * 0x20) + now->tm_mday);

    if (action & OF_VERIFY)
      return (verify_time != *((int*)ofs->reserved));

    if ((handle = _lopen( ofs->szPathName, wStyle )) == -1)
    {
        ofs->nErrCode = 2;  /* not found */
        return -1;
    }
    if (action & OF_EXIST) close(handle);
    return handle;
}


/**************************************************************************
 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)
{
  dprintf_file(stddeb,"SetHandleCount(%d)\n",wNumber);
  return((wNumber<OPEN_MAX) ? wNumber : OPEN_MAX);
}

/***************************************************************************
 _llseek
 ***************************************************************************/
LONG _llseek (INT hFile, LONG lOffset, INT nOrigin)
{
	int origin;
	
  	dprintf_file(stddeb, "_llseek: handle %d, offset %ld, origin %d\n", 
		hFile, lOffset, nOrigin);

	switch (nOrigin) {
		case 1: origin = SEEK_CUR;
			break;
		case 2: origin = SEEK_END;
			break;
		default: origin = SEEK_SET;
			break;
	}

	return lseek(hFile, lOffset, origin);
}

/***************************************************************************
 _lcreat
 ***************************************************************************/
INT _lcreat (LPSTR lpszFilename, INT fnAttribute)
{
	int handle;
	char *UnixFileName;

    	dprintf_file(stddeb, "_lcreat: filename %s, attributes %d\n",
		lpszFilename, fnAttribute);
	if ((UnixFileName = DOS_GetUnixFileName(lpszFilename)) == NULL)
  		return HFILE_ERROR;
	handle =  open (UnixFileName, O_CREAT | O_TRUNC | O_RDWR, 0666);

	if (handle == -1)
		return HFILE_ERROR;
	else
		return handle;
}

/***************************************************************************
 GetDriveType
 ***************************************************************************/
WORD GetDriveType(INT drive)
{

    	dprintf_file(stddeb,"GetDriveType %c:\n",'A'+drive);
 
        /* File Damager thinks that only return code 0 is bad enough 
	 * -Al K
	 */

	if (!DOS_ValidDrive(drive))
		return DRIVE_CANNOTDETERMINE;

	if (drive == 0 || drive == 1)
		return DRIVE_REMOVABLE;
		 
	return DRIVE_FIXED;
}

/***************************************************************************
 GetTempDrive
 ***************************************************************************/
BYTE GetTempDrive(BYTE chDriveLetter)
{
    dprintf_file(stddeb,"GetTempDrive (%d)\n",chDriveLetter);
    if (TempDirectory[1] == ':') return TempDirectory[0];
    else return 'C';
}

/***************************************************************************
 GetWindowsDirectory
 ***************************************************************************/
UINT GetWindowsDirectory(LPSTR lpszSysPath, UINT cbSysPath)
{
	if (cbSysPath < strlen(WindowsDirectory)) 
		*lpszSysPath = 0;
	else
		strcpy(lpszSysPath, WindowsDirectory);
	
    	dprintf_file(stddeb,"GetWindowsDirectory (%s)\n",lpszSysPath);

	return strlen(lpszSysPath);
}
/***************************************************************************
 GetSystemDirectory
 ***************************************************************************/
UINT GetSystemDirectory(LPSTR lpszSysPath, UINT cbSysPath)
{
	if (cbSysPath < strlen(SystemDirectory))
		*lpszSysPath = 0;
	else
		strcpy(lpszSysPath, SystemDirectory);

    	dprintf_file(stddeb,"GetSystemDirectory (%s)\n",lpszSysPath);

	return strlen(lpszSysPath);
}
/***************************************************************************
 GetTempFileName
 ***************************************************************************/
INT GetTempFileName(BYTE bDriveLetter, LPCSTR lpszPrefixString, UINT uUnique, LPSTR lpszTempFileName)
{
	int unique;
	int handle;
	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", TempDirectory, tempname, 
		unique);

	ToDos(lpszTempFileName);

    	dprintf_file(stddeb,"GetTempFilename: %c %s %d => %s\n",bDriveLetter,
		lpszPrefixString,uUnique,lpszTempFileName);
	if ((handle = _lcreat (lpszTempFileName, 0x0000)) == -1) {
		fprintf(stderr,"GetTempFilename: can't create temp file '%s' !\n", lpszTempFileName);
	}
	else
		close(handle);

	return unique;
}

/***************************************************************************
 SetErrorMode
 ***************************************************************************/
WORD SetErrorMode(WORD x)
{
    dprintf_file(stdnimp,"wine: SetErrorMode %4x (ignored)\n",x);

    return 1;
}

/***************************************************************************
 _hread
 ***************************************************************************/
LONG _hread(INT hf, LPSTR hpvBuffer, LONG cbBuffer)
{
    return (cbBuffer == 0) ? 0 : read(hf, hpvBuffer, cbBuffer);
}
/***************************************************************************
 _hwrite
 ***************************************************************************/
LONG _hwrite(INT hf, LPCSTR hpvBuffer, LONG cbBuffer)
{
    return (cbBuffer == 0) ? 0 : write(hf, hpvBuffer, cbBuffer);
}
