/* global.c - The external variables needed for "original" interface and
   error messages. */

/*  This file is part of GDBM, the GNU data base manager, by Philip A. Nelson.
    Copyright (C) 1990, 1991, 1993  Free Software Foundation, Inc.

    GDBM is free software; you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation; either version 2, or (at your option)
    any later version.

    GDBM is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.

    You should have received a copy of the GNU General Public License
    along with GDBM; see the file COPYING.  If not, write to
    the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.

    You may contact the author by:
       e-mail:  phil@cs.wwu.edu
      us-mail:  Philip A. Nelson
                Computer Science Department
                Western Washington University
                Bellingham, WA 98226
       
*************************************************************************/


/* include system configuration before all else. */
#include "autoconf.h"

#include "gdbmdefs.h"
#include "gdbmerrno.h"


/* The global variables used for the "original" interface. */
gdbm_file_info  *_gdbm_file = NULL;

/* Memory for return data for the "original" interface. */
datum _gdbm_memory = {NULL, 0};	/* Used by firstkey and nextkey. */
char *_gdbm_fetch_val = NULL;	/* Used by fetch. */

/* The dbm error number is placed in the variable GDBM_ERRNO. */
gdbm_error gdbm_errno = GDBM_NO_ERROR;

#ifdef MSDOS

#include <io.h>
#include <windows.h>

/* a simple locking function for windows that uses file descriptors */
int my_locking(int fh, int lmode, long lockoffset, long nbytes) {
	int result = -1;
	int trys = 10;

	lseek (fh, lockoffset, L_SET);

	while (trys > 0 && result != 0) {
		if (lmode == MY_UNLOCK) {
			if (UnlockFile((HANDLE)_get_osfhandle(fh),lockoffset,0,nbytes,0))
				result = 0;

		} else if (lmode == MY_READLOCK) {
/*			if (LockFileEx((HANDLE)_get_osfhandle(fh),0,0,nbytes,0,0))*/
			if (LockFile((HANDLE)_get_osfhandle(fh),lockoffset,0,nbytes,0))
				result = 0;

		} else if (lmode == MY_WRITELOCK) {
			if (LockFile((HANDLE)_get_osfhandle(fh),lockoffset,0,nbytes,0))
				result = 0;
		}

		Sleep(100L);
		trys--;
	}

	return result;
}

#endif
