/* based upon Dale Schumacher's dLibs library */
/* extensively modified by ers */

#define __SRC__
#include <osbind.h>
#include <mintbind.h>
#include <limits.h>
#include <fcntl.h>
#include <ioctl.h>
#include <errno.h>
#include <unistd.h>
#include "lib.h"

static int __umask = -1;
extern int __mint;

/*
 * function to set the initial value of __umask
 */

static void
_get_umask()
{
	if (__mint < 9) {
		__umask = 0;
	} else {
		__umask = Pumask(0);
		(void) Pumask(__umask);
	}
}

int open(_filename, iomode, pmode)
	const char *_filename;
	int iomode;
	unsigned pmode;
{
	int rv;
	int modemask;			/* which bits get passed to the OS? */
	char filename[PATH_MAX];

	_unx2dos(_filename, filename);

/* use the umask() setting to get the right permissions */
	if (__umask == -1)
		_get_umask();
	pmode &= ~__umask;

/* set the file access modes correctly */
	iomode = iomode & ~O_SHMODE;

	if (__mint >= 9) {
		modemask = O_ACCMODE | O_SHMODE | O_SYNC | O_NDELAY;
		iomode |= (iomode & O_EXCL) ? O_DENYRW : O_DENYNONE;
	} else {
		modemask = O_ACCMODE;
	}

	if(Fattrib(filename, 0, 0) >= 0)		/* file exists */
	{
		if((iomode & (O_CREAT | O_EXCL)) == (O_CREAT | O_EXCL)) {
			errno = EEXIST;
			return -1;
		}
		if(iomode & O_TRUNC)
			rv = Fcreate(filename, 0x00);
		else
			rv = Fopen(filename,iomode & modemask);
	}
	else					/* file doesn't exist */
	{
		if(iomode & O_CREAT) {
			rv = Fcreate(filename, 0x00);
			if (rv >= 0 && __mint >= 9)
				(void)Fchmod(filename, pmode);
		}
		else
			rv = -ENOENT;
	}

	if((rv >= 0) && (iomode & O_APPEND))
		(void)lseek(rv, 0L, SEEK_END);

	if(rv < (__SMALLEST_VALID_HANDLE)) {
		errno = -rv;
		return __SMALLEST_VALID_HANDLE - 1;
	}

	(void)isatty(rv);	/* sets up tty flags under TOS */

	return(rv);
}

int
creat(name, mode)
	const char *name;
	unsigned   mode;
{
	return open(name, O_WRONLY|O_CREAT|O_TRUNC, mode);
}

/* umask -- change default file creation mask */

int umask(complmode)
       int complmode;
{
	int old_umask;

	if (__umask == -1)
		_get_umask();
	old_umask = __umask;
	__umask = complmode;
	if (__mint >= 9)
		return Pumask(complmode);
	return old_umask;
}
