#include <ncbi.h>
#include <gishlib.h>
#ifdef OS_UNIX
#include <sys/stat.h>
#endif

#ifndef S_ISREG
#define S_ISREG(f)	((f)&S_IFREG)
#endif

FILE *
openfile(fname, mode)
	char	*fname, *mode;
{
	FILE	*fp, *fdopen();
#ifdef S_ISREG
	struct stat	sbuf;
	int		rc;
#endif

	if (strcmp(fname, "-") == 0) {
		if (*mode == 'r')
			fp = fdopen(0, mode);
		else
			fp = fdopen(1, mode);
	}
	else {
#ifdef S_ISREG
		fp = NULL;
		if (*mode == 'r') {
			rc = stat(fname, &sbuf);
			if (rc == -1)
				return NULL;
			if (!S_ISREG(sbuf.st_mode) && !S_ISCHR(sbuf.st_mode))
				return NULL;
		}
		if (*mode == 'w' || *mode == 'a') {
			rc = stat(fname, &sbuf);
			if (rc != -1) {
				if (!S_ISREG(sbuf.st_mode) && !S_ISCHR(sbuf.st_mode))
					return NULL;
			}
		}
#endif
		fp = fopen(fname, mode);
	}
	if (fp == NULL) {
		perror(fname);
		exit(2);
		/*NOTREACHED*/
	}
	return fp;
}
