2020-09-30 17:12:29 +02:00

492 lines
16 KiB
C

/*
$Log: S:\oiwh\filing\wgfsopen.c_v $
*
* Rev 1.15 05 Feb 1996 15:36:56 RWR
* Add check for EFORMAT_NOTSUPPORTED in wgfsopen() and wgfscrea()
*
* Rev 1.14 25 Sep 1995 13:25:18 RWR
* Delete AnExistingPathOrFile() routine, use IMGAnExistingPathOrFile() instead
* (Requires addition of new include file "engdisp.h" and OIFIL400.DEF support)
*
* Rev 1.13 08 Sep 1995 08:45:44 RWR
* Add support for new FIO_FILE_NOEXIST error & clean up related error handling
*
* Rev 1.12 06 Sep 1995 14:40:06 RWR
* Add check for EMSVIEWERERR for AWD calls (map to FIO_OBSOLETEAWD)
*
* Rev 1.11 06 Sep 1995 14:01:00 RWR
* Check for EOBSOLETEAWD error code (map to FIO_OBSOLETEAWD)
*
* Rev 1.10 17 Aug 1995 17:46:08 RWR
* Initialize "cid" variable (C/S only) in wgfsopen() for Optimized compile
*
* Rev 1.9 18 Jul 1995 16:22:54 HEIDI
*
* added debug stuff after ReleaseMutex
*
* Rev 1.8 26 Jun 1995 18:15:50 RWR
* Add <fcntl.h> #include for O_RDONLY constant & fix typos in previous update
*
* Rev 1.7 26 Jun 1995 17:57:04 RWR
* Set correct FIO_OPEN_READ/WRITE_ERROR code depending on Open mode flag
* (formerly was hardcoding FIO_OPEN_READ_ERROR)
*
* Rev 1.6 01 Jun 1995 14:41:56 HEIDI
*
* undefined MUTEXDEBUG
*
* Rev 1.5 01 Jun 1995 14:32:52 HEIDI
*
* added to MUTEXDEBUG
*
* Rev 1.4 01 Jun 1995 10:43:20 HEIDI
*
* cleaned up debug mutex stuff
*
* Rev 1.3 22 May 1995 17:05:40 HEIDI
*
* fixed mutex.
*
* Rev 1.2 19 May 1995 14:29:30 HEIDI
*
* put in mutex section for multientrant code
*
* Rev 1.1 12 Apr 1995 03:56:04 JAR
* massaged to get compilation under windows 95
*
* Rev 1.0 06 Apr 1995 13:55:24 JAR
* Initial entry
*/
//*******************************************************************
//
// wgfsopen.c
//
//*******************************************************************
#include "abridge.h"
#include <windows.h>
#include <fcntl.h>
#include "fiodata.h"
#include "wgfs.h"
#include "oierror.h"
#include "oifile.h"
#include "gfserrno.h"
#include "filing.h"
#ifdef MUTEXDEBUG
#include <stdio.h>
#endif
//define DEBUGIT 1
#ifdef DEBUGIT
#include "monit.h"
#endif
#ifdef TIMESTAMP
#include"timestmp.h"
#endif
extern HANDLE g_hFilingMutex1;
/******************** STRUCTURES *****************************************/
typedef struct fd {
int gfs_fildes; /* File descriptor returned by GFS */
int loc_rem; /* Identifies server location; local or remote */
char servername [60]; /* Server name */
int cid; /* Connection ID */
} FDTABLE, FAR *LPFDTABLE;
/****************************************************************************/
extern int MAXFILENUM;
extern HANDLE fdhnd; /* File descriptor handle returned by GlobalAlloc */
/* Use this to allocate an array of 100 pointers to
FDTABLEs */
//*******************************************************************
//
// wgfsopen
//
//*******************************************************************
int FAR PASCAL wgfsopen (hWnd, path, oflag, format, pgcnt,errcode)
HWND hWnd;
LPSTR path;
int oflag; /* O_RDONLY, O_WRONLY or O_RDWR */
LPINT format;
LPINT pgcnt;
LPINT errcode;
{
int localremote;
int status;
int cid=0; /* Connection ID returned, given the server name */
HANDLE svrhndl;
// long gfserror = 0; used for RPC only
int tmperror = 0;
// 9504.11 jar unused
//LPSTR svrname;
char lpname[MAXFILESPECLENGTH]; // Removed globalalloc now string is on stack..
//9504.10 jar added for windows 95
int nNull = 0;
int nGetError = GET_ERRNO;
#ifdef TIMESTAMP
timestmp((LPSTR)"Entry Point", (LPSTR)"wgfsopen",
(LPSTR)__FILE__, __LINE__, NULL, 0, NULL, 0);
#endif
//if (!LockData (0))
//{
// *errcode = FIO_LOCK_DATA_SEGMENT_ERROR;
// #ifdef TIMESTAMP
// timestmp((LPSTR)"Function Exit", (LPSTR)"wgfsopen",
// (LPSTR)__FILE__, __LINE__, (LPSTR)"Function Returns: ", 0xFFFF, (LPSTR)"errcode", (unsigned int)*errcode);
// #endif
// return (-1);
//}
if (!(svrhndl = GlobalAlloc (GMEM_ZEROINIT | GMEM_MOVEABLE | GMEM_NOT_BANKED, MAXSERVERLENGTH)))
{
*errcode = FIO_GLOBAL_ALLOC_FAILED;
//UnlockData (0);
#ifdef TIMESTAMP
timestmp((LPSTR)"Function Exit", (LPSTR)"wgfsopen",
(LPSTR)__FILE__, __LINE__, (LPSTR)"Function Returns: ", 0xFFFF, (LPSTR)"errcode", (unsigned int)*errcode);
#endif
return (-1);
}
lstrcpy(lpname, path);
#ifdef DEBUGIT
monit1("gfsopen file %s\n", (LPSTR)lpname);
#endif
*errcode = 0;
if ((*errcode = IMGFileParsePath (lpname, svrhndl, &localremote)) == SUCCESS)
{
if (localremote == LOCAL) /* IF LOCAL */
{
/* LOCAL GFS call */
// 9504.10 jar altered for windows 95
//if ((status = gfsopen (lpname, oflag, format, pgcnt)) < 0)
// gfsopts (status, NULL, GET_ERRNO, (LPSTR) &tmperror);
if ((status = gfsopen (lpname, oflag, format, pgcnt)) < 0)
gfsopts (status, nNull, nGetError, (LPSTR) &tmperror);
}
// 9504.10 jar for windows 95 norwegians, this is commented out!
// else
// {
// if (!(svrname = (LPSTR) GlobalLock (svrhndl))) {
// *errcode = FIO_GLOBAL_LOCK_FAILED;
// GlobalFree (svrhndl);
// //UnlockData (0);
// #ifdef TIMESTAMP
// timestmp((LPSTR)"Function Exit", (LPSTR)"wgfsopen",
// (LPSTR)__FILE__, __LINE__, (LPSTR)"Function Returns: ", 0xFFFF, (LPSTR)"errcode", (unsigned int)*errcode);
// #endif
// return (-1);
// }
// // Must do so for allocation space.
//
// // 9503.31 jar GlobalCompact removed
// // GlobalCompact(0L);
//
// if ((status = RPCgfsopen (hWnd, svrname, &cid, lpname, oflag,
// format, pgcnt, errcode)) < 0)
// RPCgfsopts (hWnd, cid, status, NULL, GET_ERRNO, (LPSTR) &gfserror, &tmperror);
// GlobalUnlock (svrhndl);
// }
// 9504.10 jar for windows 95 norwegians, this is commented out!
/* If valid file descriptor returned */
if (status > 0)
{
status = insert_file_id (status, svrhndl, (char) localremote, cid, errcode);
}
else
{
#ifdef DEBUGIT
monit1("**open error status = %d err = %x\n",status, tmperror);
#endif
// 9504.10 jar for windows 95 norwegians, this is commented out!
// if (localremote == REMOTE)
// {
// RPCgfsclose (hWnd, cid, status, &tmperror); /* Must close network file */
// if (!(*errcode))
// *errcode = FIO_OPEN_READ_ERROR;
// }
// else
// *errcode = FIO_OPEN_READ_ERROR;
// 9504.10 jar for windows 95 norwegians, this is commented out!
if (localremote != REMOTE)
{
if ( (tmperror == EOBSOLETEAWD)||(tmperror == EMSVIEWERERR) )
*errcode = FIO_OBSOLETEAWD;
else if (tmperror == EFORMAT_NOTSUPPORTED)
*errcode = FIO_UNSUPPORTED_FILE_TYPE;
else if (IMGAnExistingPathOrFile(lpname))
*errcode = ((oflag == O_RDONLY) ? FIO_OPEN_READ_ERROR : FIO_OPEN_WRITE_ERROR);
else
*errcode = FIO_FILE_NOEXIST;
}
}
}
else
{
*errcode = ((oflag == O_RDONLY) ? FIO_OPEN_READ_ERROR : FIO_OPEN_WRITE_ERROR);
status = -1;
}
GlobalFree (svrhndl);
//UnlockData (0);
if ((status < 0) && (*errcode < 16)) // make sure gfs error is remapped.
*errcode = ((oflag == O_RDONLY) ? FIO_OPEN_READ_ERROR : FIO_OPEN_WRITE_ERROR);
#ifdef TIMESTAMP
timestmp((LPSTR)"Function Exit", (LPSTR)"wgfsopen",
(LPSTR)__FILE__, __LINE__, (LPSTR)"status", status, (LPSTR)"errcode", (unsigned int)*errcode);
#endif
return (status);
}
/****************************************************************************/
/* Insert GFS file ID into array of file descriptors */
int insert_file_id (status, svrhndl, localremote, cid, errcode)
int status;
HANDLE svrhndl;
int localremote;
int cid; /* Connection ID returned, given the server name */
LPINT errcode;
{
HANDLE hfdtable;
HANDLE htmp;
LPFDTABLE lpfdtable;
int localfd; /* Assigned file descriptor */
LPHANDLE fdes;
// 9504.11 jar unused
//LPSTR svrname;
DWORD dwObjectWait;
#ifdef MUTEXDEBUG
DWORD ProcessId;
char szBuf1[100];
char szOutputBuf[200];
#endif
/* Lock array of pointers */
if (!(fdes = (LPHANDLE) LocalLock (fdhnd))) {
*errcode = FIO_LOCAL_LOCK_FAILED;
return (-1);
}
/* Search for first empty slot in array fdes */
localfd = 1;
/* BEGIN MUTEX SECTION Prevent interrupts while we're in here */
#ifdef MUTEXDEBUG
ProcessId = GetCurrentProcessId();
sprintf(szOutputBuf, "\t Before Wait - insert_file_id %lu\n", ProcessId);
sprintf(szBuf1, "\t Handle = %lu; \n", g_hFilingMutex1);
strcat(szOutputBuf, szBuf1);
sprintf(szBuf1, "\t File = %s; \n Line = %lu; \n", __FILE__,__LINE__);
strcat(szOutputBuf, szBuf1);
MessageBox(NULL, szOutputBuf, NULL, MB_OKCANCEL);
#endif
dwObjectWait = WaitForSingleObject(g_hFilingMutex1, INFINITE);
#ifdef MUTEXDEBUG
ProcessId = GetCurrentProcessId();
sprintf(szOutputBuf, "\t After Wait - insert_file_id %lu\n", ProcessId);
sprintf(szBuf1, "\t Handle = %lu; \n", g_hFilingMutex1);
strcat(szOutputBuf, szBuf1);
sprintf(szBuf1, "\t File = %s; \n Line = %lu; \n", __FILE__,__LINE__);
strcat(szOutputBuf, szBuf1);
MessageBox(NULL, szOutputBuf, NULL, MB_OKCANCEL);
#endif
while ((*(fdes + localfd) != NULL) && (localfd < MAXFILENUM))
++localfd;
if (localfd >= MAXFILENUM)
{
LocalUnlock (fdhnd);
MAXFILENUM++;
if (!(htmp = (HANDLE) LocalReAlloc (fdhnd, LMEM_ZEROINIT | LMEM_MOVEABLE,
(MAXFILENUM * sizeof(HANDLE))))) {
ReleaseMutex(g_hFilingMutex1);
#ifdef MUTEXDEBUG
ProcessId = GetCurrentProcessId();
sprintf(szOutputBuf, "\t After Release - insert_file_id %lu\n", ProcessId);
sprintf(szBuf1, "\t Handle = %lu; \n", g_hFilingMutex1);
strcat(szOutputBuf, szBuf1);
sprintf(szBuf1, "\t File = %s; \n Line = %lu; \n", __FILE__,__LINE__);
strcat(szOutputBuf, szBuf1);
MessageBox(NULL, szOutputBuf, NULL, MB_OKCANCEL);
#endif
*errcode = FIO_LOCAL_ALLOC_FAILED;
return (-1);
}
fdhnd = htmp;
if (!(fdes = (LPHANDLE) LocalLock (fdhnd))) {
ReleaseMutex(g_hFilingMutex1);
#ifdef MUTEXDEBUG
ProcessId = GetCurrentProcessId();
sprintf(szOutputBuf, "\t After Release - insert_file_id %lu\n", ProcessId);
sprintf(szBuf1, "\t Handle = %lu; \n", g_hFilingMutex1);
strcat(szOutputBuf, szBuf1);
sprintf(szBuf1, "\t File = %s; \n Line = %lu; \n", __FILE__,__LINE__);
strcat(szOutputBuf, szBuf1);
MessageBox(NULL, szOutputBuf, NULL, MB_OKCANCEL);
#endif
*errcode = FIO_LOCAL_LOCK_FAILED;
return (-1);
}
}
/* Allocate mem for FDTABLE data structure */
// 9503.31 jar LocalAlloc now takes a UINT for the size field
//if (!(hfdtable = LocalAlloc (GMEM_MOVEABLE | GMEM_ZEROINIT,
// (WORD) sizeof (FDTABLE)))) {
if (!(hfdtable = LocalAlloc (GMEM_MOVEABLE | GMEM_ZEROINIT,
(unsigned int)sizeof (FDTABLE)))) {
ReleaseMutex(g_hFilingMutex1);
#ifdef MUTEXDEBUG
ProcessId = GetCurrentProcessId();
sprintf(szOutputBuf, "\t After Release - insert_file_id %lu\n", ProcessId);
sprintf(szBuf1, "\t Handle = %lu; \n", g_hFilingMutex1);
strcat(szOutputBuf, szBuf1);
sprintf(szBuf1, "\t File = %s; \n Line = %lu; \n", __FILE__,__LINE__);
strcat(szOutputBuf, szBuf1);
MessageBox(NULL, szOutputBuf, NULL, MB_OKCANCEL);
#endif
*errcode = FIO_LOCAL_ALLOC_FAILED;
LocalUnlock (fdhnd);
return (-1);
}
/* Put handle value returned from Alloc in slot */
*(fdes + localfd) = hfdtable;
/* Increment array length parameter */
// 9504.11 jar have to cast because you cain't increment a void * and
// HANDLE is defined as void * baby!
//++(*(fdes + 0));
++((unsigned int)(*fdes));
ReleaseMutex(g_hFilingMutex1);
#ifdef MUTEXDEBUG
ProcessId = GetCurrentProcessId();
sprintf(szOutputBuf, "\t After Release - insert_file_id %lu\n", ProcessId);
sprintf(szBuf1, "\t Handle = %lu; \n", g_hFilingMutex1);
strcat(szOutputBuf, szBuf1);
sprintf(szBuf1, "\t File = %s; \n Line = %lu; \n", __FILE__,__LINE__);
strcat(szOutputBuf, szBuf1);
MessageBox(NULL, szOutputBuf, NULL, MB_OKCANCEL);
#endif
/* END MUTEX SECTION. */
/* Lock FDTABLE data structure */
if (!(lpfdtable = (LPFDTABLE) LocalLock (hfdtable))) {
*errcode = FIO_LOCAL_LOCK_FAILED;
LocalUnlock (fdhnd);
LocalFree (hfdtable);
return (-1);
}
lpfdtable -> gfs_fildes = status;
if (localremote == (int) LOCAL) /* IF LOCAL */
lpfdtable -> loc_rem = (int) LOCAL; /* LOCAL */
// 9504.10 jar for windows 95 norwegians, this is commented out!
// else {
// lpfdtable -> loc_rem = (int) REMOTE;
// svrname = GlobalLock (svrhndl);
// lstrcpy (lpfdtable -> servername, svrname);
// GlobalUnlock (svrhndl);
// lpfdtable -> cid = cid;
// }
// 9504.10 jar for windows 95 norwegians, this is commented out!
status = localfd;
LocalUnlock (hfdtable);
LocalUnlock (fdhnd);
return (status);
}
/**************************************************************************/
int get_file_id(int fildes, LPINT lpfile_id, LPINT lploc_rem, LPINT lpcid)
{
LPFDTABLE lpfdtable;
LPHANDLE fdes;
/* Lock array of pointers */
if (!(fdes = (LPHANDLE) LocalLock (fdhnd))) {
return (FIO_LOCAL_LOCK_FAILED);
}
if (!(*(fdes + fildes)))
{
LocalUnlock (fdhnd);
return (FIO_LOCAL_LOCK_FAILED);
}
/* Lock FDTABLE data structure */
if (!(lpfdtable = (LPFDTABLE) LocalLock (*(fdes + fildes)))) {
LocalUnlock (fdhnd);
return (FIO_LOCAL_LOCK_FAILED);
}
*lpfile_id = lpfdtable -> gfs_fildes;
*lploc_rem = lpfdtable -> loc_rem;
*lpcid = lpfdtable -> cid;
LocalUnlock (*(fdes + fildes));
LocalUnlock (fdhnd);
return(0);
}
/**************************************************************************/
int close_file_id(int fildes)
{
LPHANDLE fdes;
/* Lock array of pointers */
if (!(fdes = (LPHANDLE) LocalLock (fdhnd))) {
return (FIO_LOCAL_LOCK_FAILED);
}
/* Decrement array length parameter */
// 9504.11 jar have to cast because you cain't increment a void * and
// HANDLE is defined as void * baby!
//--(*(fdes + 0));
--((unsigned int)*(fdes));
/* Free previously allocated FDTABLE structure */
if (*(fdes + fildes))
LocalFree (*(fdes + fildes));
/* Zero handle value in slot specified */
*(fdes + fildes) = NULL;
LocalUnlock (fdhnd);
return (0);
}