/*
 * Copyright (c) 2000 Silicon Graphics, Inc.  All Rights Reserved.
 *
 * This program is free software; you can redistribute it and/or modify it
 * under the terms of version 2 of the GNU General Public License as
 * published by the Free Software Foundation.
 *
 * This program is distributed in the hope that it would be useful, but
 * WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 *
 * Further, this software is distributed without any warranty that it is
 * free of the rightful claim of any third person regarding infringement
 * or the like.  Any license provided herein, whether implied or
 * otherwise, applies only to this software file.  Patent licenses, if
 * any, provided herein do not apply to combinations of this program with
 * other software, or any other product whatsoever.
 *
 * You should have received a copy of the GNU General Public License along
 * with this program; if not, write the Free Software Foundation, Inc.,
 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
 *
 * Contact information: Silicon Graphics, Inc., 1600 Amphitheatre Pkwy,
 * Mountain View, CA  94043, or:
 *
 * http://www.sgi.com
 *
 * For further information regarding this notice, see:
 *
 * http://oss.sgi.com/projects/GenInfo/NoticeExplan/
 */
/*
 *
 * Lib i/o
 *
 * This file contains several functions to doing reads and writes.
 * It was written so that a single function could be called in a test
 * program and only a io type field value would have to change to
 * do different types of io.  There is even a couple of functions that
 * will allow you to parse a string to determine the iotype.
 *
 * This file contains functions for writing/reading to/from open files
 * Prototypes:
 *
 * Functions declared in this module - see individual function code for
 * usage comments:
 *
 *  int	 stride_bounds(int offset, int stride, int nstrides,
 *		      int bytes_per_stride, int *min, int *max);

 *  int  lio_write_buffer(int fd, int method, char *buffer, int size,
 *						char **errmsg, long wrd);
 *  int  lio_read_buffer(int fd, int method, char *buffer, int size,
 *						char **errmsg, long wrd);
 *
 *  #ifdef CRAY
 *  int  lio_wait4asyncio(int method, int fd, struct iosw **statptr)
 *  int  lio_check_asyncio(char *io_type, int size, struct iosw *status)
 *  #endif
 *  #ifdef sgi
 *  int  lio_wait4asyncio(int method, int fd, aiocb_t *aiocbp)
 *  int  lio_check_asyncio(char *io_type, int size, aiocb_t *aiocbp, int method)
 *  #endif
 *
 *  int  lio_parse_io_arg1(char *string)
 *  void lio_help1(char *prefix);
 *
 *  int  lio_parse_io_arg2(char *string, char **badtoken)
 *  void lio_help2(char *prefix);
 *
 *  int  lio_set_debug(int level);
 *
 *  char Lio_SysCall[];
 *  struct lio_info_type Lio_info1[];
 *  struct lio_info_type Lio_info2[];
 *
 *  Author : Richard Logan
 *
 */

#ifdef __linux__
#ifndef _GNU_SOURCE
#define _GNU_SOURCE
#endif
#define _LARGEFILE64_SOURCE
#endif
#include "config.h"
#include <stdio.h>
#include <ctype.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/time.h>
#include <sys/param.h>
#include <errno.h>
#include <sys/types.h>
#include <sys/file.h>
#include <signal.h>
#include <stdint.h>
#ifdef CRAY
#include <sys/secparm.h>
#include <sys/iosw.h>
#include <sys/listio.h>
#else
/* for linux or sgi */
#include <sys/uio.h>		/* readv(2)/writev(2) */
#include <string.h>		/* bzero */
#endif
#if defined(__linux__) || defined(__sun) || defined(__hpux) || defined(_AIX)
#if !defined(UCLINUX) && !defined(__UCLIBC__)
#include <aio.h>
#endif
#endif
#include <stdlib.h>		/* atoi, abs */

#include "tlibio.h"		/* defines LIO* marcos */
#include "random_range.h"

#ifndef PATH_MAX
#define PATH_MAX	MAXPATHLEN
#endif

#if 0				/* disabled until it's needed -- roehrich 6/11/97 */
#define BUG1_workaround	1	/* Work around a condition where aio_return gives
				 * a value of zero but there is no errno followup
				 * and the read/write operation actually did its
				 * job.   spr/pv 705244
				 */
#endif

static void lio_async_signal_handler();
#ifdef sgi
static void lio_async_callback_handler();
#endif

/*
 * Define the structure as used in lio_parse_arg1 and lio_help1
 */
struct lio_info_type Lio_info1[] = {
	{"s", LIO_IO_SYNC, "sync i/o"},
	{"p", LIO_IO_ASYNC | LIO_WAIT_SIGACTIVE,
	 "async i/o using a loop to wait for a signal"},
	{"b", LIO_IO_ASYNC | LIO_WAIT_SIGPAUSE, "async i/o using pause"},
	{"a", LIO_IO_ASYNC | LIO_WAIT_RECALL,
	 "async i/o using recall/aio_suspend"},
#if defined(sgi) || (defined(__linux__) && !defined(__UCLIBC__))
	{"r",
	 LIO_RANDOM | LIO_IO_TYPES | LIO_WAIT_TYPES,
	 "random sync i/o types and wait methods"},
	{"R",
	 LIO_RANDOM | LIO_IO_ATYPES | LIO_WAIT_ATYPES,
	 "random i/o types and wait methods"},
#else
	{"r",
	 LIO_RANDOM | LIO_IO_TYPES | LIO_WAIT_TYPES,
	 "random i/o types and wait methods"},
	{"R",
	 LIO_RANDOM | LIO_IO_TYPES | LIO_WAIT_TYPES,
	 "random i/o types and wait methods"},
#endif
	{"l", LIO_IO_SLISTIO | LIO_WAIT_RECALL, "single stride sync listio"},
	{"L", LIO_IO_ALISTIO | LIO_WAIT_RECALL,
	 "single stride async listio using recall"},
	{"X", LIO_IO_ALISTIO | LIO_WAIT_SIGPAUSE,
	 "single stride async listio using pause"},
	{"v", LIO_IO_SYNCV, "single buffer sync readv/writev"},
	{"P", LIO_IO_SYNCP, "sync pread/pwrite"},
};

/*
 * Define the structure used by lio_parse_arg2 and lio_help2
 */
struct lio_info_type Lio_info2[] = {
	{"sync", LIO_IO_SYNC, "sync i/o (read/write)"},
	{"async", LIO_IO_ASYNC, "async i/o (reada/writea/aio_read/aio_write)"},
	{"slistio", LIO_IO_SLISTIO, "single stride sync listio"},
	{"alistio", LIO_IO_ALISTIO, "single stride async listio"},
	{"syncv", LIO_IO_SYNCV, "single buffer sync readv/writev"},
	{"syncp", LIO_IO_SYNCP, "pread/pwrite"},
	{"active", LIO_WAIT_ACTIVE, "spin on status/control values"},
	{"recall", LIO_WAIT_RECALL,
	 "use recall(2)/aio_suspend(3) to wait for i/o to complete"},
	{"sigactive", LIO_WAIT_SIGACTIVE, "spin waiting for signal"},
	{"sigpause", LIO_WAIT_SIGPAUSE, "call pause(2) to wait for signal"},
/* nowait is a touchy thing, it's an accident that this implementation worked at all.  6/27/97 roehrich */
/*    { "nowait",    LIO_WAIT_NONE,	"do not wait for async io to complete" },*/
	{"random", LIO_RANDOM, "set random bit"},
	{"randomall",
	 LIO_RANDOM | LIO_IO_TYPES | LIO_WAIT_TYPES,
	 "all random i/o types and wait methods (except nowait)"},
};

char Lio_SysCall[PATH_MAX];	/* string containing last i/o system call */

static volatile int Received_signal = 0;	/* number of signals received */
static volatile int Rec_signal;
#if defined(sgi) || (defined(__linux__) && !defined(__UCLIBC__))
static volatile int Received_callback = 0;	/* number of callbacks received */
static volatile int Rec_callback;
#endif
static char Errormsg[500];
static int Debug_level = 0;

/***********************************************************************
 * stride_bounds()
 *
 * Determine the bounds of a strided request, normalized to offset.  Returns
 * the number of bytes needed to satisfy the request, and optionally sets
 * *min and *max to the mininum and maximum bytes referenced, normalized
 * around offset.
 *
 * Returns -1 on error - the only possible error conditions are illegal values
 * for nstrides and/or bytes_per_stride - both parameters must be >= 0.
 *
 * (maule, 11/16/95)
 ***********************************************************************/

int stride_bounds(offset, stride, nstrides, bytes_per_stride, min, max)
int offset;
int stride;
int nstrides;
int bytes_per_stride;
int *min;
int *max;
{
	int nbytes, min_byte, max_byte;

	/*
	 * sanity checks ...
	 */

	if (nstrides < 0 || bytes_per_stride < 0) {
		return -1;
	}

	if (stride == 0) {
		stride = bytes_per_stride;
	}

	/*
	 * Determine the # of bytes needed to satisfy the request.  This
	 * value, along with the offset argument, determines the min and max
	 * bytes referenced.
	 */

	nbytes = abs(stride) * (nstrides - 1) + bytes_per_stride;

	if (stride < 0) {
		max_byte = offset + bytes_per_stride - 1;
		min_byte = max_byte - nbytes + 1;
	} else {
		min_byte = offset;
		max_byte = min_byte + nbytes - 1;
	}

	if (min != NULL) {
		*min = min_byte;
	}

	if (max != NULL) {
		*max = max_byte;
	}

	return nbytes;
}

/***********************************************************************
 * This function will allow someone to set the debug level.
 ***********************************************************************/
int lio_set_debug(level)
{
	int old;

	old = Debug_level;
	Debug_level = level;
	return old;
}

/***********************************************************************
 * This function will parse a string and return desired io-method.
 * Only the first character of the string is used.
 *
 * This function does not provide for meaningful option arguments,
 * but it supports current growfiles/btlk interface.
 *
 *  (rrl 04/96)
 ***********************************************************************/
int lio_parse_io_arg1(char *string)
{
	unsigned int ind;
	int found = 0;
	int mask = 0;

	/*
	 * Determine if token is a valid string.
	 */
	for (ind = 0; ind < sizeof(Lio_info1) / sizeof(struct lio_info_type);
	     ind++) {
		if (strcmp(string, Lio_info1[ind].token) == 0) {
			mask |= Lio_info1[ind].bits;
			found = 1;
			break;
		}
	}

	if (found == 0) {
		return -1;
	}

	return mask;

}

/***********************************************************************
 * This function will print a help message describing the characters
 * that can be parsed by lio_parse_io_arg1().
 * They will be printed one per line.
 *  (rrl 04/96)
 ***********************************************************************/
void lio_help1(char *prefix)
{
	unsigned int ind;

	for (ind = 0; ind < sizeof(Lio_info1) / sizeof(struct lio_info_type);
	     ind++) {
		printf("%s %s : %s\n", prefix, Lio_info1[ind].token,
		       Lio_info1[ind].desc);
	}

	return;
}

/***********************************************************************
 * This function will parse a string and return the desired io-method.
 * This function will take a comma separated list of io type and wait
 * method tokens as defined in Lio_info2[].  If a token does not match
 * any of the tokens in Lio_info2[], it will be coverted to a number.
 * If it was a number, those bits are also set.
 *
 *  (rrl 04/96)
 ***********************************************************************/
int lio_parse_io_arg2(char *string, char **badtoken)
{
	char *token = string;
	char *cc = token;
	char savecc;
	int found;
	int mask = 0;

	int tmp;
	unsigned int ind;
	char chr;

	if (token == NULL)
		return -1;

	for (;;) {
		for (; ((*cc != ',') && (*cc != '\0')); cc++) ;
		savecc = *cc;
		*cc = '\0';

		found = 0;

		/*
		 * Determine if token is a valid string or number and if
		 * so, add the bits to the mask.
		 */
		for (ind = 0;
		     ind < sizeof(Lio_info2) / sizeof(struct lio_info_type);
		     ind++) {
			if (strcmp(token, Lio_info2[ind].token) == 0) {
				mask |= Lio_info2[ind].bits;
				found = 1;
				break;
			}
		}

		/*
		 * If token does not match one of the defined tokens, determine
		 * if it is a number, if so, add the bits.
		 */
		if (!found) {
			if (sscanf(token, "%i%c", &tmp, &chr) == 1) {
				mask |= tmp;
				found = 1;
			}
		}

		*cc = savecc;

		if (!found) {	/* token is not valid */
			if (badtoken != NULL)
				*badtoken = token;
			return (-1);
		}

		if (savecc == '\0')
			break;

		token = ++cc;
	}

	return mask;
}

/***********************************************************************
 * This function will print a help message describing the tokens
 * that can be parsed by lio_parse_io_arg2().
 * It will print them one per line.
 *
 * (rrl 04/96)
 ***********************************************************************/
void lio_help2(char *prefix)
{
	unsigned int ind;

	for (ind = 0; ind < sizeof(Lio_info2) / sizeof(struct lio_info_type);
	     ind++) {
		printf("%s %s : %s\n", prefix, Lio_info2[ind].token,
		       Lio_info2[ind].desc);
	}
	return;
}

/***********************************************************************
 * This is an internal signal handler.
 * If the handler is called, it will increment the Received_signal
 * global variable.
 ***********************************************************************/
static void lio_async_signal_handler(int sig)
{
	if (Debug_level)
		printf
		    ("DEBUG %s/%d: received signal %d, a signal caught %d times\n",
		     __FILE__, __LINE__, sig, Received_signal + 1);

	Received_signal++;

	return;
}

#if defined(sgi) || (defined(__linux__) && !defined(__UCLIBC__))
/***********************************************************************
 * This is an internal callback handler.
 * If the handler is called, it will increment the Received_callback
 * global variable.
 ***********************************************************************/
static void lio_async_callback_handler(sigval_t sigval)
{
	if (Debug_level)
		printf
		    ("DEBUG %s/%d: received callback, nbytes=%ld, a callback called %d times\n",
		     __FILE__, __LINE__, (long)sigval.sival_int,
		     Received_callback + 1);

	Received_callback++;

	return;
}
#endif /* sgi */

/***********************************************************************
 * lio_random_methods
 * This function will randomly choose an io type and wait method
 * from set of io types and wait methods.  Since this information
 * is stored in a bitmask, it randomly chooses an io type from
 * the io type bits specified and does the same for wait methods.
 *
 * Return Value
 * This function will return a value with all non choosen io type
 * and wait method bits cleared.  The LIO_RANDOM bit is also
 * cleared.  All other bits are left unchanged.
 *
 * (rrl 04/96)
 ***********************************************************************/
int lio_random_methods(long curr_mask)
{
	int mask = 0;

	/* remove random select, io type, and wait method bits from curr_mask */
	mask = curr_mask & (~(LIO_IO_TYPES | LIO_WAIT_TYPES | LIO_RANDOM));

	/* randomly select io type from specified io types */
	mask = mask | random_bit(curr_mask & LIO_IO_TYPES);

	/* randomly select wait methods  from specified wait methods */
	mask = mask | random_bit(curr_mask & LIO_WAIT_TYPES);

	return mask;
}

static void wait4sync_io(int fd, int read)
{
	fd_set s;
	FD_ZERO(&s);
	FD_SET(fd, &s);

	select(fd + 1, read ? &s : NULL, read ? NULL : &s, NULL, NULL);
}

/***********************************************************************
 * Generic write function
 * This function can be used to do a write using write(2), writea(2),
 * aio_write(3), writev(2), pwrite(2),
 * or single stride listio(2)/lio_listio(3).
 * By setting the desired bits in the method
 * bitmask, the caller can control the type of write and the wait method
 * that will be used.  If no io type bits are set, write will be used.
 *
 * If async io was attempted and no wait method bits are set then the
 * wait method is: recall(2) for writea(2) and listio(2); aio_suspend(3) for
 * aio_write(3) and lio_listio(3).
 *
 * If multiple wait methods are specified,
 * only one wait method will be used. The order is predetermined.
 *
 * If the call specifies a signal and one of the two signal wait methods,
 * a signal handler for the signal is set.  This will reset an already
 * set handler for this signal.
 *
 * If the LIO_RANDOM method bit is set, this function will randomly
 * choose a io type and wait method from bits in the method argument.
 *
 * If an error is encountered, an error message will be generated
 * in a internal static buffer.  If errmsg is not NULL, it will
 * be updated to point to the static buffer, allowing the caller
 * to print the error message.
 *
 * Return Value
 *   If a system call fails, -errno is returned.
 *   If LIO_WAIT_NONE bit is set, the return value is the return value
 *   of the system call.
 *   If the io did not fail, the amount of data written is returned.
 *	If the size the system call say was written is different
 *	then what was asked to be written, errmsg is updated for
 *	this error condition.  The return value is still the amount
 *	the system call says was written.
 *
 * (rrl 04/96)
 ***********************************************************************/
int lio_write_buffer(fd, method, buffer, size, sig, errmsg, wrd)
int fd;				/* open file descriptor */
int method;			/* contains io type and wait method bitmask */
char *buffer;			/* pointer to buffer */
int size;			/* the size of the io */
int sig;			/* signal to use if async io */
char **errmsg;			/* char pointer that will be updated to point to err message */
long wrd;			/* to allow future features, use zero for now */
{
	int ret = 0;		/* syscall return or used to get random method */
	char *io_type;		/* Holds string of type of io */
	int omethod = method;
	int listio_cmd;		/* Holds the listio/lio_listio cmd */
#ifdef  CRAY
	struct listreq request;	/* Used when a listio is wanted */
	struct iosw status, *statptr[1];
#else
	/* for linux or sgi */
	struct iovec iov;	/* iovec for writev(2) */
#endif
#if defined (sgi)
	aiocb_t aiocbp;		/* POSIX aio control block */
	aiocb_t *aiolist[1];	/* list of aio control blocks for lio_listio */
	off64_t poffset;	/* pwrite(2) offset */
#endif
#if defined(__linux__) && !defined(__UCLIBC__)
	struct aiocb aiocbp;	/* POSIX aio control block */
	struct aiocb *aiolist[1];	/* list of aio control blocks for lio_listio */
	off64_t poffset;	/* pwrite(2) offset */
#endif
	/*
	 * If LIO_RANDOM bit specified, get new method randomly.
	 */
	if (method & LIO_RANDOM) {
		if (Debug_level > 3)
			printf("DEBUG %s/%d: method mask to choose from: %#o\n",
			       __FILE__, __LINE__, method);
		method = lio_random_methods(method);
		if (Debug_level > 2)
			printf("DEBUG %s/%d: random chosen method %#o\n",
			       __FILE__, __LINE__, method);
	}

	if (errmsg != NULL)
		*errmsg = Errormsg;

	Rec_signal = Received_signal;	/* get the current number of signals received */
#if defined(sgi) || (defined(__linux__) && !defined(__UCLIBC__))
	Rec_callback = Received_callback;	/* get the current number of callbacks received */
#endif

#ifdef  CRAY
	memset(&status, 0x00, sizeof(struct iosw));
	memset(&request, 0x00, sizeof(struct listreq));
	statptr[0] = &status;
#else
	/* for linux or sgi */
	memset(&iov, 0x00, sizeof(struct iovec));
	iov.iov_base = buffer;
	iov.iov_len = size;
#endif
#if defined(sgi) || (defined(__linux__) && !defined(__UCLIBC__))
#if defined(sgi)
	memset(&aiocbp, 0x00, sizeof(aiocb_t));
#else
	memset(&aiocbp, 0x00, sizeof(struct aiocb));
#endif
	aiocbp.aio_fildes = fd;
	aiocbp.aio_nbytes = size;
	aiocbp.aio_buf = buffer;
/*    aiocbp.aio_offset = lseek( fd, 0, SEEK_CUR ); -- set below */
	aiocbp.aio_sigevent.sigev_notify = SIGEV_NONE;
	aiocbp.aio_sigevent.sigev_signo = 0;
#ifdef sgi
	aiocbp.aio_sigevent.sigev_func = NULL;
	aiocbp.aio_sigevent.sigev_value.sival_int = 0;
#elif defined(__linux__) && !defined(__UCLIBC__)
	aiocbp.aio_sigevent.sigev_notify_function = NULL;
	aiocbp.aio_sigevent.sigev_notify_attributes = 0;
#endif
	aiolist[0] = &aiocbp;

	if ((ret = lseek(fd, 0, SEEK_CUR)) == -1) {
		ret = 0;
		/* If there is an error and it is not ESPIPE then kick out the error.
		 * If the fd is a fifo then we have to make sure that
		 * lio_random_methods() didn't select pwrite/pread; if it did then
		 * switch to write/read.
		 */
		if (errno == ESPIPE) {
			if (method & LIO_IO_SYNCP) {
				if (omethod & LIO_RANDOM) {
					method &= ~LIO_IO_SYNCP;
					method |= LIO_IO_SYNC;
					if (Debug_level > 2)
						printf
						    ("DEBUG %s/%d: random chosen method switched to %#o for fifo\n",
						     __FILE__, __LINE__,
						     method);
				} else if (Debug_level) {
					printf
					    ("DEBUG %s/%d: pwrite will fail when it writes to a fifo\n",
					     __FILE__, __LINE__);
				}
			}
			/* else: let it ride */
		} else {
			sprintf(Errormsg,
				"%s/%d lseek(fd=%d,0,SEEK_CUR) failed, errno=%d  %s",
				__FILE__, __LINE__, fd, errno, strerror(errno));
			return -errno;
		}
	}
#if defined(sgi) || (defined(__linux__) && !defined(__UCLIBC__))
	poffset = (off64_t) ret;
#endif
	aiocbp.aio_offset = ret;

#endif

	/*
	 * If the LIO_USE_SIGNAL bit is not set, only use the signal
	 * if the LIO_WAIT_SIGPAUSE or the LIO_WAIT_SIGACTIVE bits are bit.
	 * Otherwise there is not necessary a signal handler to trap
	 * the signal.
	 */
	if (sig && !(method & LIO_USE_SIGNAL) && !(method & LIO_WAIT_SIGTYPES)) {

		sig = 0;	/* ignore signal parameter */
	}
#if defined(sgi) || (defined(__linux__) && !defined(__UCLIBC__))
	if (sig && (method & LIO_WAIT_CBTYPES))
		sig = 0;	/* ignore signal parameter */
#endif

	/*
	 * only setup signal hander if sig was specified and
	 * a sig wait method was specified.
	 * Doing this will change the handler for this signal.  The
	 * old signal handler will not be restored.
	 *** restoring the signal handler could be added ***
	 */

	if (sig && (method & LIO_WAIT_SIGTYPES)) {
#ifdef CRAY
		sigctl(SCTL_REG, sig, lio_async_signal_handler);
#endif
#if defined(sgi) || (defined(__linux__) && !defined(__UCLIBC__))
		aiocbp.aio_sigevent.sigev_notify = SIGEV_SIGNAL;
		aiocbp.aio_sigevent.sigev_signo = sig;
		sigset(sig, lio_async_signal_handler);
#endif /* sgi */
	}
#if defined(sgi)
	else if (method & LIO_WAIT_CBTYPES) {
		/* sival_int just has to be something that I can use
		 * to identify the callback, and "size" happens to be handy...
		 */
		aiocbp.aio_sigevent.sigev_notify = SIGEV_CALLBACK;
		aiocbp.aio_sigevent.sigev_func = lio_async_callback_handler;
		aiocbp.aio_sigevent.sigev_value.sival_int = size;
	}
#endif
#if defined(__linux__) && !defined(__UCLIBC__)
	else if (method & LIO_WAIT_CBTYPES) {
		/* sival_int just has to be something that I can use
		 * to identify the callback, and "size" happens to be handy...
		 */
		aiocbp.aio_sigevent.sigev_notify = SIGEV_THREAD;
		aiocbp.aio_sigevent.sigev_notify_function =
		    lio_async_callback_handler;
		aiocbp.aio_sigevent.sigev_notify_attributes =
		    (void *)(uintptr_t) size;
	}
#endif
	/*
	 * Determine the system call that will be called and produce
	 * the string of the system call and place it in Lio_SysCall.
	 * Also update the io_type char pointer to give brief description
	 * of system call.  Execute the system call and check for
	 * system call failure.  If sync i/o, return the number of
	 * bytes written/read.
	 */

	if ((method & LIO_IO_SYNC)
	    || (method & (LIO_IO_TYPES | LIO_IO_ATYPES)) == 0) {
		/*
		 * write(2) is used if LIO_IO_SYNC bit is set or not none
		 * of the LIO_IO_TYPES bits are set (default).
		 */

		sprintf(Lio_SysCall, "write(%d, buf, %d)", fd, size);
		io_type = "write";

		if (Debug_level) {
			printf("DEBUG %s/%d: %s\n", __FILE__, __LINE__,
			       Lio_SysCall);
		}
		while (1) {
			if (((ret = write(fd, buffer, size)) == -1)
			    && errno != EAGAIN && errno != EINTR) {
				sprintf(Errormsg,
					"%s/%d write(%d, buf, %d) ret:-1, errno=%d %s",
					__FILE__, __LINE__, fd, size, errno,
					strerror(errno));
				return -errno;
			}

			if (ret != -1) {
				if (ret != size) {
					sprintf(Errormsg,
						"%s/%d write(%d, buf, %d) returned=%d",
						__FILE__, __LINE__,
						fd, size, ret);
					size -= ret;
					buffer += ret;
				} else {
					if (Debug_level > 1)
						printf
						    ("DEBUG %s/%d: write completed without error (ret %d)\n",
						     __FILE__, __LINE__, ret);

					return ret;
				}
			}
			wait4sync_io(fd, 0);
		}

	}

	else if (method & LIO_IO_ASYNC) {
#ifdef CRAY
		sprintf(Lio_SysCall,
			"writea(%d, buf, %d, &status, %d)", fd, size, sig);
		io_type = "writea";

		if (Debug_level) {
			printf("DEBUG %s/%d: %s\n", __FILE__, __LINE__,
			       Lio_SysCall);
		}

		sigoff();
		if ((ret = writea(fd, buffer, size, &status, sig)) == -1) {
			sprintf(Errormsg,
				"%s/%d writea(%d, buf, %d, &stat, %d) ret:-1, errno=%d %s",
				__FILE__, __LINE__,
				fd, size, sig, errno, strerror(errno));
			sigon();
			return -errno;
		}
#endif
#if defined(sgi) || (defined(__linux__) && !defined(__UCLIBC__))
		sprintf(Lio_SysCall,
			"aio_write(fildes=%d, buf, nbytes=%d, signo=%d)", fd,
			size, sig);
		io_type = "aio_write";

		if (Debug_level) {
			printf("DEBUG %s/%d: %s\n", __FILE__, __LINE__,
			       Lio_SysCall);
		}

		if (sig)
			sighold(sig);
		if ((ret = aio_write(&aiocbp)) == -1) {
			sprintf(Errormsg,
				"%s/%d aio_write(fildes=%d, buf, nbytes=%d, signo=%d) ret:-1, errno=%d %s",
				__FILE__, __LINE__,
				fd, size, sig, errno, strerror(errno));
			if (sig)
				sigrelse(sig);
			return -errno;
		}
#endif
	}
	/* LIO_IO_ASYNC */
	else if (method & LIO_IO_SLISTIO) {
#ifdef CRAY
		request.li_opcode = LO_WRITE;
		request.li_fildes = fd;
		request.li_buf = buffer;
		request.li_nbyte = size;
		request.li_status = &status;
		request.li_signo = sig;
		request.li_nstride = 0;
		request.li_filstride = 0;
		request.li_memstride = 0;

		listio_cmd = LC_WAIT;
		io_type = "listio(2) sync write";

		sprintf(Lio_SysCall,
			"listio(LC_WAIT, &req, 1) LO_WRITE, fd:%d, nbyte:%d",
			fd, size);

		if (Debug_level) {
			printf("DEBUG %s/%d: %s\n", __FILE__, __LINE__,
			       Lio_SysCall);
		}

		sigoff();
		if (listio(listio_cmd, &request, 1) == -1) {
			sprintf(Errormsg,
				"%s/%d %s failed, fd:%d, nbyte:%d errno=%d %s",
				__FILE__, __LINE__, Lio_SysCall, fd, size,
				errno, strerror(errno));
			sigon();
			return -errno;
		}

		if (Debug_level > 1)
			printf("DEBUG %s/%d: %s did not return -1\n",
			       __FILE__, __LINE__, Lio_SysCall);

		ret = lio_check_asyncio(io_type, size, &status);
		return ret;

#endif
#if defined(sgi) || (defined(__linux__) && !defined(__UCLIBC__))

		aiocbp.aio_lio_opcode = LIO_WRITE;
		listio_cmd = LIO_WAIT;
		io_type = "lio_listio(3) sync write";

		sprintf(Lio_SysCall,
			"lio_listio(LIO_WAIT, aiolist, 1, NULL) LIO_WRITE, fd:%d, nbyte:%d, sig:%d",
			fd, size, sig);

		if (Debug_level) {
			printf("DEBUG %s/%d: %s\n", __FILE__, __LINE__,
			       Lio_SysCall);
		}

		if (sig)
			sighold(sig);
		if (lio_listio(listio_cmd, aiolist, 1, NULL) == -1) {
			sprintf(Errormsg,
				"%s/%d %s failed, fd:%d, nbyte:%d errno=%d %s",
				__FILE__, __LINE__, Lio_SysCall, fd, size,
				errno, strerror(errno));
			if (sig)
				sigrelse(sig);
			return -errno;
		}

		if (Debug_level > 1)
			printf("DEBUG %s/%d: %s did not return -1\n",
			       __FILE__, __LINE__, Lio_SysCall);

		ret = lio_check_asyncio(io_type, size, &aiocbp, method);
		return ret;
#endif
	}
	/* LIO_IO_SLISTIO */
	else if (method & LIO_IO_ALISTIO) {
#ifdef CRAY
		request.li_opcode = LO_WRITE;
		request.li_fildes = fd;
		request.li_buf = buffer;
		request.li_nbyte = size;
		request.li_status = &status;
		request.li_signo = sig;
		request.li_nstride = 0;
		request.li_filstride = 0;
		request.li_memstride = 0;

		listio_cmd = LC_START;
		io_type = "listio(2) async write";

		sprintf(Lio_SysCall,
			"listio(LC_START, &req, 1) LO_WRITE, fd:%d, nbyte:%d",
			fd, size);

		if (Debug_level) {
			printf("DEBUG %s/%d: %s\n", __FILE__, __LINE__,
			       Lio_SysCall);
		}

		sigoff();
		if (listio(listio_cmd, &request, 1) == -1) {
			sprintf(Errormsg,
				"%s/%d %s failed, fd:%d, nbyte:%d errno=%d %s",
				__FILE__, __LINE__, Lio_SysCall, fd, size,
				errno, strerror(errno));
			sigon();
			return -errno;
		}
#endif
#if defined (sgi) || (defined(__linux__) && !defined(__UCLIBC__))
		aiocbp.aio_lio_opcode = LIO_WRITE;
		listio_cmd = LIO_NOWAIT;
		io_type = "lio_listio(3) async write";

		sprintf(Lio_SysCall,
			"lio_listio(LIO_NOWAIT, aiolist, 1, NULL) LIO_WRITE, fd:%d, nbyte:%d",
			fd, size);

		if (Debug_level) {
			printf("DEBUG %s/%d: %s\n", __FILE__, __LINE__,
			       Lio_SysCall);
		}

		if (sig)
			sighold(sig);
		if (lio_listio(listio_cmd, aiolist, 1, NULL) == -1) {
			sprintf(Errormsg,
				"%s/%d %s failed, fd:%d, nbyte:%d errno=%d %s",
				__FILE__, __LINE__, Lio_SysCall, fd, size,
				errno, strerror(errno));
			if (sig)
				sigrelse(sig);
			return -errno;
		}
#endif
	}
	/* LIO_IO_ALISTIO */
#ifndef CRAY
	else if (method & LIO_IO_SYNCV) {
		io_type = "writev(2)";

		sprintf(Lio_SysCall, "writev(%d, &iov, 1) nbyte:%d", fd, size);

		if (Debug_level) {
			printf("DEBUG %s/%d: %s\n", __FILE__, __LINE__,
			       Lio_SysCall);
		}
		if ((ret = writev(fd, &iov, 1)) == -1) {
			sprintf(Errormsg,
				"%s/%d writev(%d, iov, 1) nbyte:%d ret:-1, errno=%d %s",
				__FILE__, __LINE__, fd, size, errno,
				strerror(errno));
			return -errno;
		}

		if (ret != size) {
			sprintf(Errormsg,
				"%s/%d writev(%d, iov, 1) nbyte:%d returned=%d",
				__FILE__, __LINE__, fd, size, ret);
		} else if (Debug_level > 1)
			printf
			    ("DEBUG %s/%d: writev completed without error (ret %d)\n",
			     __FILE__, __LINE__, ret);

		return ret;
	}			/* LIO_IO_SYNCV */
#endif

#if defined(sgi) || (defined(__linux__) && !defined(__UCLIBC__))
	else if (method & LIO_IO_SYNCP) {
		io_type = "pwrite(2)";

		sprintf(Lio_SysCall,
			"pwrite(%d, buf, %d, %lld)", fd, size,
			(long long)poffset);

		if (Debug_level) {
			printf("DEBUG %s/%d: %s\n", __FILE__, __LINE__,
			       Lio_SysCall);
		}
		if ((ret = pwrite(fd, buffer, size, poffset)) == -1) {
			sprintf(Errormsg,
				"%s/%d pwrite(%d, buf, %d, %lld) ret:-1, errno=%d %s",
				__FILE__, __LINE__, fd, size,
				(long long)poffset, errno, strerror(errno));
			return -errno;
		}

		if (ret != size) {
			sprintf(Errormsg,
				"%s/%d pwrite(%d, buf, %d, %lld) returned=%d",
				__FILE__, __LINE__,
				fd, size, (long long)poffset, ret);
		} else if (Debug_level > 1)
			printf
			    ("DEBUG %s/%d: pwrite completed without error (ret %d)\n",
			     __FILE__, __LINE__, ret);

		return ret;
	}			/* LIO_IO_SYNCP */
#endif

	else {
		printf("DEBUG %s/%d: No I/O method chosen\n", __FILE__,
		       __LINE__);
		return -1;
	}

	/*
	 * wait for async io to complete.
	 */
#ifdef CRAY
	ret = lio_wait4asyncio(method, fd, statptr);
#endif
#if defined(sgi) || (defined(__linux__) && !defined(__UCLIBC__))
	ret = lio_wait4asyncio(method, fd, &aiocbp);
#endif

	/*
	 * If there was an error waiting for async i/o to complete,
	 * return the error value (errno) to the caller.
	 * Note: Errormsg should already have been updated.
	 */
	if (ret < 0) {
		return ret;
	}

	/*
	 * If i/o was not waited for (may not have been completed at this time),
	 * return the size that was requested.
	 */
	if (ret == 1)
		return size;

	/*
	 * check that async io was successful.
	 * Note:  if the there was an system call failure, -errno
	 * was returned and Errormsg should already have been updated.
	 * If amount i/o was different than size, Errormsg should already
	 * have been updated but the actual i/o size if returned.
	 */

#ifdef CRAY
	ret = lio_check_asyncio(io_type, size, &status);
#endif
#if defined(sgi) || (defined(__linux__) && !defined(__UCLIBC__))
	ret = lio_check_asyncio(io_type, size, &aiocbp, method);
#endif

	return ret;
}				/* end of lio_write_buffer */

/***********************************************************************
 * Generic read function
 * This function can be used to do a read using read(2), reada(2),
 * aio_read(3), readv(2), pread(2),
 * or single stride listio(2)/lio_listio(3).
 * By setting the desired bits in the method
 * bitmask, the caller can control the type of read and the wait method
 * that will be used.  If no io type bits are set, read will be used.
 *
 * If async io was attempted and no wait method bits are set then the
 * wait method is: recall(2) for reada(2) and listio(2); aio_suspend(3) for
 * aio_read(3) and lio_listio(3).
 *
 * If multiple wait methods are specified,
 * only one wait method will be used. The order is predetermined.
 *
 * If the call specifies a signal and one of the two signal wait methods,
 * a signal handler for the signal is set.  This will reset an already
 * set handler for this signal.
 *
 * If the LIO_RANDOM method bit is set, this function will randomly
 * choose a io type and wait method from bits in the method argument.
 *
 * If an error is encountered, an error message will be generated
 * in a internal static buffer.  If errmsg is not NULL, it will
 * be updated to point to the static buffer, allowing the caller
 * to print the error message.
 *
 * Return Value
 *   If a system call fails, -errno is returned.
 *   If LIO_WAIT_NONE bit is set, the return value is the return value
 *   of the system call.
 *   If the io did not fail, the amount of data written is returned.
 *	If the size the system call say was written is different
 *	then what was asked to be written, errmsg is updated for
 *	this error condition.  The return value is still the amount
 *	the system call says was written.
 *
 * (rrl 04/96)
 ***********************************************************************/
int lio_read_buffer(fd, method, buffer, size, sig, errmsg, wrd)
int fd;				/* open file descriptor */
int method;			/* contains io type and wait method bitmask */
char *buffer;			/* pointer to buffer */
int size;			/* the size of the io */
int sig;			/* signal to use if async io */
char **errmsg;			/* char pointer that will be updated to point to err message */
long wrd;			/* to allow future features, use zero for now */
{
	int ret = 0;		/* syscall return or used to get random method */
	char *io_type;		/* Holds string of type of io */
	int listio_cmd;		/* Holds the listio/lio_listio cmd */
	int omethod = method;
#ifdef  CRAY
	struct listreq request;	/* Used when a listio is wanted */
	struct iosw status, *statptr[1];
#else
	/* for linux or sgi */
	struct iovec iov;	/* iovec for readv(2) */
#endif
#ifdef sgi
	aiocb_t aiocbp;		/* POSIX aio control block */
	aiocb_t *aiolist[1];	/* list of aio control blocks for lio_listio */
	off64_t poffset;	/* pread(2) offset */
#endif
#if defined (__linux__) && !defined(__UCLIBC__)
	struct aiocb aiocbp;	/* POSIX aio control block */
	struct aiocb *aiolist[1];	/* list of aio control blocks for lio_listio */
	off64_t poffset;	/* pread(2) offset */
#endif

	/*
	 * If LIO_RANDOM bit specified, get new method randomly.
	 */
	if (method & LIO_RANDOM) {
		if (Debug_level > 3)
			printf("DEBUG %s/%d: method mask to choose from: %#o\n",
			       __FILE__, __LINE__, method);
		method = lio_random_methods(method);
		if (Debug_level > 2)
			printf("DEBUG %s/%d: random chosen method %#o\n",
			       __FILE__, __LINE__, method);
	}

	if (errmsg != NULL)
		*errmsg = Errormsg;

	Rec_signal = Received_signal;	/* get the current number of signals received */
#if defined(sgi) || (defined(__linux__) && !defined(__UCLIBC__))
	Rec_callback = Received_callback;	/* get the current number of callbacks received */
#endif

#ifdef  CRAY
	memset(&status, 0x00, sizeof(struct iosw));
	memset(&request, 0x00, sizeof(struct listreq));
	statptr[0] = &status;
#else
	/* for linux or sgi */
	memset(&iov, 0x00, sizeof(struct iovec));
	iov.iov_base = buffer;
	iov.iov_len = size;
#endif
#if defined(sgi) || (defined(__linux__) && !defined(__UCLIBC__))
#if defined(sgi)
	memset(&aiocbp, 0x00, sizeof(aiocb_t));
#else
	memset(&aiocbp, 0x00, sizeof(struct aiocb));
#endif
	aiocbp.aio_fildes = fd;
	aiocbp.aio_nbytes = size;
	aiocbp.aio_buf = buffer;
/*    aiocbp.aio_offset = lseek( fd, 0, SEEK_CUR ); -- set below */
	aiocbp.aio_sigevent.sigev_notify = SIGEV_NONE;
	aiocbp.aio_sigevent.sigev_signo = 0;
#ifdef sgi
	aiocbp.aio_sigevent.sigev_func = NULL;
	aiocbp.aio_sigevent.sigev_value.sival_int = 0;
#elif defined(__linux__) && !defined(__UCLIBC__)
	aiocbp.aio_sigevent.sigev_notify_function = NULL;
	aiocbp.aio_sigevent.sigev_notify_attributes = 0;
#endif
	aiolist[0] = &aiocbp;

	if ((ret = lseek(fd, 0, SEEK_CUR)) == -1) {
		ret = 0;
		/* If there is an error and it is not ESPIPE then kick out the error.
		 * If the fd is a fifo then we have to make sure that
		 * lio_random_methods() didn't select pwrite/pread; if it did then
		 * switch to write/read.
		 */
		if (errno == ESPIPE) {
			if (method & LIO_IO_SYNCP) {
				if (omethod & LIO_RANDOM) {
					method &= ~LIO_IO_SYNCP;
					method |= LIO_IO_SYNC;
					if (Debug_level > 2)
						printf
						    ("DEBUG %s/%d: random chosen method switched to %#o for fifo\n",
						     __FILE__, __LINE__,
						     method);
				} else if (Debug_level) {
					printf
					    ("DEBUG %s/%d: pread will fail when it reads from a fifo\n",
					     __FILE__, __LINE__);
				}
			}
			/* else: let it ride */
		} else {
			sprintf(Errormsg,
				"%s/%d lseek(fd=%d,0,SEEK_CUR) failed, errno=%d  %s",
				__FILE__, __LINE__, fd, errno, strerror(errno));
			return -errno;
		}
	}
#if defined(sgi) || (defined(__linux__) && !defined(__UCLIBC__))
	poffset = (off64_t) ret;
#endif
	aiocbp.aio_offset = ret;

#endif

	/*
	 * If the LIO_USE_SIGNAL bit is not set, only use the signal
	 * if the LIO_WAIT_SIGPAUSE or the LIO_WAIT_SIGACTIVE bits are set.
	 * Otherwise there is not necessarily a signal handler to trap
	 * the signal.
	 */
	if (sig && !(method & LIO_USE_SIGNAL) && !(method & LIO_WAIT_SIGTYPES)) {

		sig = 0;	/* ignore signal parameter */
	}
#if defined(sgi) || (defined(__linux__)&& !defined(__UCLIBC__))
	if (sig && (method & LIO_WAIT_CBTYPES))
		sig = 0;	/* ignore signal parameter */
#endif

	/*
	 * only setup signal hander if sig was specified and
	 * a sig wait method was specified.
	 * Doing this will change the handler for this signal.  The
	 * old signal handler will not be restored.
	 *** restoring the signal handler could be added ***
	 */

	if (sig && (method & LIO_WAIT_SIGTYPES)) {
#ifdef CRAY
		sigctl(SCTL_REG, sig, lio_async_signal_handler);
#endif
#if defined(sgi) || (defined(__linux__) && !defined(__UCLIBC__))
		aiocbp.aio_sigevent.sigev_notify = SIGEV_SIGNAL;
		aiocbp.aio_sigevent.sigev_signo = sig;
		sigset(sig, lio_async_signal_handler);
#endif /* CRAY */
	}
#if defined(sgi)
	else if (method & LIO_WAIT_CBTYPES) {
		aiocbp.aio_sigevent.sigev_notify = SIGEV_CALLBACK;
		aiocbp.aio_sigevent.sigev_func = lio_async_callback_handler;
		/* sival_int just has to be something that I can use
		 * to identify the callback, and "size" happens to be handy...
		 */
		aiocbp.aio_sigevent.sigev_value.sival_int = size;
	}
#endif
#if defined(__linux__) && !defined(__UCLIBC__)
	else if (method & LIO_WAIT_CBTYPES) {
		aiocbp.aio_sigevent.sigev_notify = SIGEV_THREAD;
		aiocbp.aio_sigevent.sigev_notify_function =
		    lio_async_callback_handler;
		/* sival_int just has to be something that I can use
		 * to identify the callback, and "size" happens to be handy...
		 */
		aiocbp.aio_sigevent.sigev_notify_attributes =
		    (void *)(uintptr_t) size;
	}
#endif

	/*
	 * Determine the system call that will be called and produce
	 * the string of the system call and place it in Lio_SysCall.
	 * Also update the io_type char pointer to give brief description
	 * of system call.  Execute the system call and check for
	 * system call failure.  If sync i/o, return the number of
	 * bytes written/read.
	 */

	if ((method & LIO_IO_SYNC)
	    || (method & (LIO_IO_TYPES | LIO_IO_ATYPES)) == 0) {
		/*
		 * read(2) is used if LIO_IO_SYNC bit is set or not none
		 * of the LIO_IO_TYPES bits are set (default).
		 */

		sprintf(Lio_SysCall, "read(%d, buf, %d)", fd, size);
		io_type = "read";

		if (Debug_level) {
			printf("DEBUG %s/%d: %s\n", __FILE__, __LINE__,
			       Lio_SysCall);
		}

		while (1) {
			if (((ret = read(fd, buffer, size)) == -1)
			    && errno != EINTR && errno != EAGAIN) {
				sprintf(Errormsg,
					"%s/%d read(%d, buf, %d) ret:-1, errno=%d %s",
					__FILE__, __LINE__, fd, size, errno,
					strerror(errno));
				return -errno;
			}

			if (ret == 0)
				return 0;
			if (ret != -1) {
				if (ret != size) {
					sprintf(Errormsg,
						"%s/%d read(%d, buf, %d) returned=%d",
						__FILE__, __LINE__,
						fd, size, ret);
					size -= ret;
					buffer += ret;
				} else {
					if (Debug_level > 1)
						printf
						    ("DEBUG %s/%d: read completed without error (ret %d)\n",
						     __FILE__, __LINE__, ret);

					return ret;
				}
			}
			wait4sync_io(fd, 1);
		}

	}

	else if (method & LIO_IO_ASYNC) {
#ifdef CRAY
		sprintf(Lio_SysCall,
			"reada(%d, buf, %d, &status, %d)", fd, size, sig);
		io_type = "reada";

		if (Debug_level) {
			printf("DEBUG %s/%d: %s\n", __FILE__, __LINE__,
			       Lio_SysCall);
		}

		sigoff();
		if ((ret = reada(fd, buffer, size, &status, sig)) == -1) {
			sprintf(Errormsg,
				"%s/%d reada(%d, buf, %d, &stat, %d) ret:-1, errno=%d %s",
				__FILE__, __LINE__,
				fd, size, sig, errno, strerror(errno));
			sigon();
			return -errno;
		}
#endif
#if defined(sgi) || (defined(__linux__) && !defined(__UCLIBC__))
		sprintf(Lio_SysCall,
			"aio_read(fildes=%d, buf, nbytes=%d, signo=%d)", fd,
			size, sig);
		io_type = "aio_read";

		if (Debug_level) {
			printf("DEBUG %s/%d: %s\n", __FILE__, __LINE__,
			       Lio_SysCall);
		}

		if (sig)
			sighold(sig);
		if ((ret = aio_read(&aiocbp)) == -1) {
			sprintf(Errormsg,
				"%s/%d aio_read(fildes=%d, buf, nbytes=%d, signo=%d) ret:-1, errno=%d %s",
				__FILE__, __LINE__,
				fd, size, sig, errno, strerror(errno));
			if (sig)
				sigrelse(sig);
			return -errno;
		}
#endif
	}
	/* LIO_IO_ASYNC */
	else if (method & LIO_IO_SLISTIO) {
#ifdef CRAY
		request.li_opcode = LO_READ;
		request.li_fildes = fd;
		request.li_buf = buffer;
		request.li_nbyte = size;
		request.li_status = &status;
		request.li_signo = sig;
		request.li_nstride = 0;
		request.li_filstride = 0;
		request.li_memstride = 0;

		listio_cmd = LC_WAIT;
		io_type = "listio(2) sync read";

		sprintf(Lio_SysCall,
			"listio(LC_WAIT, &req, 1) LO_READ, fd:%d, nbyte:%d",
			fd, size);

		if (Debug_level) {
			printf("DEBUG %s/%d: %s\n", __FILE__, __LINE__,
			       Lio_SysCall);
		}

		sigoff();
		if (listio(listio_cmd, &request, 1) == -1) {
			sprintf(Errormsg,
				"%s/%d %s failed, fd:%d, nbyte:%d errno=%d %s",
				__FILE__, __LINE__, Lio_SysCall, fd, size,
				errno, strerror(errno));
			sigon();
			return -errno;
		}

		if (Debug_level > 1)
			printf("DEBUG %s/%d: %s did not return -1\n",
			       __FILE__, __LINE__, Lio_SysCall);

		ret = lio_check_asyncio(io_type, size, &status);
		return ret;
#endif
#if defined(sgi) || (defined(__linux__) && !defined(__UCLIBC__))
		aiocbp.aio_lio_opcode = LIO_READ;
		listio_cmd = LIO_WAIT;
		io_type = "lio_listio(3) sync read";

		sprintf(Lio_SysCall,
			"lio_listio(LIO_WAIT, aiolist, 1, NULL) LIO_READ, fd:%d, nbyte:%d",
			fd, size);

		if (Debug_level) {
			printf("DEBUG %s/%d: %s\n", __FILE__, __LINE__,
			       Lio_SysCall);
		}

		if (sig)
			sighold(sig);
		if (lio_listio(listio_cmd, aiolist, 1, NULL) == -1) {
			sprintf(Errormsg,
				"%s/%d %s failed, fd:%d, nbyte:%d errno=%d %s",
				__FILE__, __LINE__, Lio_SysCall, fd, size,
				errno, strerror(errno));
			if (sig)
				sigrelse(sig);
			return -errno;
		}

		if (Debug_level > 1)
			printf("DEBUG %s/%d: %s did not return -1\n",
			       __FILE__, __LINE__, Lio_SysCall);

		ret = lio_check_asyncio(io_type, size, &aiocbp, method);
		return ret;
#endif
	}
	/* LIO_IO_SLISTIO */
	else if (method & LIO_IO_ALISTIO) {
#ifdef CRAY
		request.li_opcode = LO_READ;
		request.li_fildes = fd;
		request.li_buf = buffer;
		request.li_nbyte = size;
		request.li_status = &status;
		request.li_signo = sig;
		request.li_nstride = 0;
		request.li_filstride = 0;
		request.li_memstride = 0;

		listio_cmd = LC_START;
		io_type = "listio(2) async read";

		sprintf(Lio_SysCall,
			"listio(LC_START, &req, 1) LO_READ, fd:%d, nbyte:%d",
			fd, size);

		if (Debug_level) {
			printf("DEBUG %s/%d: %s\n", __FILE__, __LINE__,
			       Lio_SysCall);
		}

		sigoff();
		if (listio(listio_cmd, &request, 1) == -1) {
			sprintf(Errormsg,
				"%s/%d %s failed, fd:%d, nbyte:%d errno=%d %s",
				__FILE__, __LINE__, Lio_SysCall, fd, size,
				errno, strerror(errno));
			sigon();
			return -errno;
		}
#endif
#if defined(sgi) || (defined(__linux__) && !defined(__UCLIBC__))
		aiocbp.aio_lio_opcode = LIO_READ;
		listio_cmd = LIO_NOWAIT;
		io_type = "lio_listio(3) async read";

		sprintf(Lio_SysCall,
			"lio_listio(LIO_NOWAIT, aiolist, 1, NULL) LIO_READ, fd:%d, nbyte:%d",
			fd, size);

		if (Debug_level) {
			printf("DEBUG %s/%d: %s\n", __FILE__, __LINE__,
			       Lio_SysCall);
		}

		if (sig)
			sighold(sig);
		if (lio_listio(listio_cmd, aiolist, 1, NULL) == -1) {
			sprintf(Errormsg,
				"%s/%d %s failed, fd:%d, nbyte:%d errno=%d %s",
				__FILE__, __LINE__, Lio_SysCall, fd, size,
				errno, strerror(errno));
			if (sig)
				sigrelse(sig);
			return -errno;
		}
#endif
	}
	/* LIO_IO_ALISTIO */
#ifndef CRAY
	else if (method & LIO_IO_SYNCV) {
		io_type = "readv(2)";

		sprintf(Lio_SysCall, "readv(%d, &iov, 1) nbyte:%d", fd, size);

		if (Debug_level) {
			printf("DEBUG %s/%d: %s\n", __FILE__, __LINE__,
			       Lio_SysCall);
		}
		if ((ret = readv(fd, &iov, 1)) == -1) {
			sprintf(Errormsg,
				"%s/%d readv(%d, iov, 1) nbyte:%d ret:-1, errno=%d %s",
				__FILE__, __LINE__, fd, size, errno,
				strerror(errno));
			return -errno;
		}

		if (ret != size) {
			sprintf(Errormsg,
				"%s/%d readv(%d, iov, 1) nbyte:%d returned=%d",
				__FILE__, __LINE__, fd, size, ret);
		} else if (Debug_level > 1)
			printf
			    ("DEBUG %s/%d: readv completed without error (ret %d)\n",
			     __FILE__, __LINE__, ret);

		return ret;
	}			/* LIO_IO_SYNCV */
#endif

#if defined(sgi) || (defined(__linux__) && !defined(__UCLIBC__))
	else if (method & LIO_IO_SYNCP) {
		io_type = "pread(2)";

		sprintf(Lio_SysCall,
			"pread(%d, buf, %d, %lld)", fd, size,
			(long long)poffset);

		if (Debug_level) {
			printf("DEBUG %s/%d: %s\n", __FILE__, __LINE__,
			       Lio_SysCall);
		}
		if ((ret = pread(fd, buffer, size, poffset)) == -1) {
			sprintf(Errormsg,
				"%s/%d pread(%d, buf, %d, %lld) ret:-1, errno=%d %s",
				__FILE__, __LINE__, fd, size,
				(long long)poffset, errno, strerror(errno));
			return -errno;
		}

		if (ret != size) {
			sprintf(Errormsg,
				"%s/%d pread(%d, buf, %d, %lld) returned=%d",
				__FILE__, __LINE__,
				fd, size, (long long)poffset, ret);
		} else if (Debug_level > 1)
			printf
			    ("DEBUG %s/%d: pread completed without error (ret %d)\n",
			     __FILE__, __LINE__, ret);

		return ret;
	}			/* LIO_IO_SYNCP */
#endif

	else {
		printf("DEBUG %s/%d: No I/O method chosen\n", __FILE__,
		       __LINE__);
		return -1;
	}

	/*
	 * wait for async io to complete.
	 * Note: Sync io should have returned prior to getting here.
	 */
#ifdef CRAY
	ret = lio_wait4asyncio(method, fd, statptr);
#endif
#if defined(sgi) || (defined(__linux__) && !defined(__UCLIBC__))
	ret = lio_wait4asyncio(method, fd, &aiocbp);
#endif

	/*
	 * If there was an error waiting for async i/o to complete,
	 * return the error value (errno) to the caller.
	 * Note: Errormsg should already have been updated.
	 */
	if (ret < 0) {
		return ret;
	}

	/*
	 * If i/o was not waited for (may not have been completed at this time),
	 * return the size that was requested.
	 */
	if (ret == 1)
		return size;

	/*
	 * check that async io was successful.
	 * Note:  if the there was an system call failure, -errno
	 * was returned and Errormsg should already have been updated.
	 * If amount i/o was different than size, Errormsg should already
	 * have been updated but the actual i/o size if returned.
	 */

#ifdef CRAY
	ret = lio_check_asyncio(io_type, size, &status);
#endif
#if defined(sgi) || (defined(__linux__) && !defined(__UCLIBC__))
	ret = lio_check_asyncio(io_type, size, &aiocbp, method);
#endif

	return ret;
}				/* end of lio_read_buffer */

#if !defined(__sun) && !defined(__hpux) && !defined(_AIX)
/***********************************************************************
 * This function will check that async io was successful.
 * It can also be used to check sync listio since it uses the
 * same method.
 *
 * Return Values
 *  If status.sw_error is set, -status.sw_error is returned.
 *  Otherwise sw_count's field value is returned.
 *
 * (rrl 04/96)
 ***********************************************************************/
#ifdef CRAY
int lio_check_asyncio(char *io_type, int size, struct iosw *status)
#elif defined(sgi)
int lio_check_asyncio(char *io_type, int size, aiocb_t * aiocbp, int method)
#elif defined(__linux__) && !defined(__UCLIBC__)
int lio_check_asyncio(char *io_type, int size, struct aiocb *aiocbp, int method)
{
	int ret;

#ifdef CRAY
	if (status->sw_error) {
		sprintf(Errormsg,
			"%s/%d %s, sw_error set = %d %s, sw_count = %d",
			__FILE__, __LINE__, io_type,
			status->sw_error, strerror(status->sw_error),
			status->sw_count);
		return -status->sw_error;
	} else if (status->sw_count != size) {
		sprintf(Errormsg,
			"%s/%d %s, sw_count not as expected(%d), but actual:%d",
			__FILE__, __LINE__, io_type, size, status->sw_count);
	} else if (Debug_level > 1) {
		printf
		    ("DEBUG %s/%d: %s completed without error (sw_error == 0, sw_count == %d)\n",
		     __FILE__, __LINE__, io_type, status->sw_count);
	}

	return status->sw_count;

#else

	int cnt = 1;

	/* The I/O may have been synchronous with signal completion.  It doesn't
	 * make sense, but the combination could be generated.  Release the
	 * completion signal here otherwise it'll hang around and bite us
	 * later.
	 */
	if (aiocbp->aio_sigevent.sigev_notify == SIGEV_SIGNAL)
		sigrelse(aiocbp->aio_sigevent.sigev_signo);

	ret = aio_error(aiocbp);

	while (ret == EINPROGRESS) {
		ret = aio_error(aiocbp);
		++cnt;
	}
	if (cnt > 1) {
		sprintf(Errormsg,
			"%s/%d %s, aio_error had to loop on EINPROGRESS, cnt=%d; random method %#o; sigev_notify=%s",
			__FILE__, __LINE__, io_type, cnt, method,
			(aiocbp->aio_sigevent.sigev_notify ==
			 SIGEV_SIGNAL ? "signal" : aiocbp->aio_sigevent.
			 sigev_notify == SIGEV_NONE ? "none" :
#ifdef SIGEV_CALLBACK
			 aiocbp->aio_sigevent.sigev_notify ==
			 SIGEV_CALLBACK ? "callback" :
#endif
			 aiocbp->aio_sigevent.sigev_notify ==
			 SIGEV_THREAD ? "thread" : "unknown"));
		return -ret;
	}

	if (ret != 0) {
		sprintf(Errormsg,
			"%s/%d %s, aio_error = %d %s; random method %#o",
			__FILE__, __LINE__, io_type,
			ret, strerror(ret), method);
		return -ret;
	}
	ret = aio_return(aiocbp);
	if (ret != size) {
		sprintf(Errormsg,
			"%s/%d %s, aio_return not as expected(%d), but actual:%d",
			__FILE__, __LINE__, io_type, size, ret);

#ifdef BUG1_workaround
		if (ret == 0) {
			ret = size;
			if (Debug_level > 1) {
				printf
				    ("WARN %s/%d: %s completed with bug1_workaround (aio_error == 0, aio_return now == %d)\n",
				     __FILE__, __LINE__, io_type, ret);
			}
		}
#endif /* BUG1_workaround */

	} else if (Debug_level > 1) {
		printf
		    ("DEBUG %s/%d: %s completed without error (aio_error == 0, aio_return == %d)\n",
		     __FILE__, __LINE__, io_type, ret);
	}

	return ret;

#endif
}				/* end of lio_check_asyncio */
#endif

/***********************************************************************
 *
 * This function will wait for async io to complete.
 * If multiple wait methods are specified, the order is predetermined
 * to LIO_WAIT_RECALL,
 * LIO_WAIT_ACTIVE, LIO_WAIT_SIGPAUSE, LIO_WAIT_SIGACTIVE,
 * then LIO_WAIT_NONE.
 *
 * If no wait method was specified the default wait method is: recall(2)
 * or aio_suspend(3), as appropriate.
 *
 * Return Values
 *	<0: errno of failed recall
 *	0 : async io was completed
 *	1 : async was not waited for, io may not have completed.
 *
 * (rrl 04/96)
 ***********************************************************************/
#ifdef CRAY
int lio_wait4asyncio(int method, int fd, struct iosw **statptr)
#elif defined(sgi)
int lio_wait4asyncio(int method, int fd, aiocb_t * aiocbp)
#elif defined(__linux__) && !defined(__UCLIBC__)
int lio_wait4asyncio(int method, int fd, struct aiocb *aiocbp)
{
	int cnt;
#ifdef sgi
	int ret;
	const aiocb_t *aioary[1];
#endif
#if defined(__linux__)&& !defined(__UCLIBC__)
	int ret;
	const struct aiocb *aioary[1];
#endif

	if ((method & LIO_WAIT_RECALL)
#if defined(sgi) || (defined(__linux__)&& !defined(__UCLIBC__))
	    || (method & LIO_WAIT_CBSUSPEND)
	    || (method & LIO_WAIT_SIGSUSPEND)
#endif
	    || ((method & LIO_WAIT_TYPES) == 0)) {
		/*
		 * If method has LIO_WAIT_RECALL bit set or method does
		 * not have any wait method bits set (default), use recall/aio_suspend.
		 */
#ifdef CRAY
		if (Debug_level > 2)
			printf("DEBUG %s/%d: wait method : recall\n", __FILE__,
			       __LINE__);
		sigon();
		if (recall(fd, 1, statptr)) {
			sprintf(Errormsg,
				"%s/%d recall(%d, 1, stat) failed, errno:%d %s",
				__FILE__, __LINE__, fd, errno, strerror(errno));
			return -errno;
		}
#else
		if (Debug_level > 2)
			printf
			    ("DEBUG %s/%d: wait method : aio_suspend, sigev_notify=%s\n",
			     __FILE__, __LINE__,
			     (aiocbp->aio_sigevent.sigev_notify ==
			      SIGEV_SIGNAL ? "signal" : aiocbp->aio_sigevent.
			      sigev_notify == SIGEV_NONE ? "none" :
#ifdef SIGEV_CALLBACK
			      aiocbp->aio_sigevent.sigev_notify ==
			      SIGEV_CALLBACK ? "callback" :
#endif
			      aiocbp->aio_sigevent.sigev_notify ==
			      SIGEV_THREAD ? "thread" : "unknown"));

		aioary[0] = aiocbp;
		ret = aio_suspend(aioary, 1, NULL);
		if ((ret == -1) && (errno == EINTR)) {
			if (aiocbp->aio_sigevent.sigev_notify == SIGEV_SIGNAL) {
				if (Debug_level > 2) {
					printf
					    ("DEBUG %s/%d: aio_suspend received EINTR, sigev_notify=SIGEV_SIGNAL -- ok\n",
					     __FILE__, __LINE__);
				}
			} else {
				sprintf(Errormsg,
					"%s/%d aio_suspend received EINTR, sigev_notify=%s, not ok\n",
					__FILE__, __LINE__,
					(aiocbp->aio_sigevent.sigev_notify ==
					 SIGEV_SIGNAL ? "signal" : aiocbp->
					 aio_sigevent.sigev_notify ==
					 SIGEV_NONE ? "none" :
#ifdef SIGEV_CALLBACK
					 aiocbp->aio_sigevent.sigev_notify ==
					 SIGEV_CALLBACK ? "callback" :
#endif
					 aiocbp->aio_sigevent.sigev_notify ==
					 SIGEV_THREAD ? "thread" : "unknown"));
				return -errno;
			}
		} else if (ret) {
			sprintf(Errormsg,
				"%s/%d aio_suspend(fildes=%d, aioary, 1, NULL) failed, errno:%d %s",
				__FILE__, __LINE__, fd, errno, strerror(errno));
			return -errno;
		}
#endif

	} else if (method & LIO_WAIT_ACTIVE) {
		if (Debug_level > 2)
			printf("DEBUG %s/%d: wait method : active\n", __FILE__,
			       __LINE__);
#ifdef CRAY
		sigon();
		/*
		 * loop until sw_flag, sw_count or sw_error field elements
		 * change to non-zero.
		 */
		cnt = 0;
		while ((*statptr)->sw_flag == 0 &&
		       (*statptr)->sw_count == 0 && (*statptr)->sw_error == 0) {
			cnt++;
		}
#else
		/* loop while aio_error() returns EINPROGRESS */
		cnt = 0;
		while (1) {
			ret = aio_error(aiocbp);
			if ((ret == 0) || (ret != EINPROGRESS)) {
				break;
			}
			++cnt;
		}

#endif
		if (Debug_level > 5 && cnt && (cnt % 50) == 0)
			printf("DEBUG %s/%d: wait active cnt = %d\n",
			       __FILE__, __LINE__, cnt);

	} else if (method & LIO_WAIT_SIGPAUSE) {
		if (Debug_level > 2)
			printf("DEBUG %s/%d: wait method : sigpause\n",
			       __FILE__, __LINE__);
#ifdef sgi
		/* note: don't do the sigon() for CRAY in this case.  why? -- roehrich 6/11/97 */
		if (aiocbp->aio_sigevent.sigev_notify == SIGEV_SIGNAL)
			sigrelse(aiocbp->aio_sigevent.sigev_signo);
		else {
			printf("DEBUG %s/%d: sigev_notify != SIGEV_SIGNAL\n",
			       __FILE__, __LINE__);
			return -1;
		}
#endif
		pause();

	} else if (method & LIO_WAIT_SIGACTIVE) {
		if (Debug_level > 2)
			printf("DEBUG %s/%d: wait method : sigactive\n",
			       __FILE__, __LINE__);
#ifdef CRAY
		sigon();
#else
		if (aiocbp->aio_sigevent.sigev_notify == SIGEV_SIGNAL)
			sigrelse(aiocbp->aio_sigevent.sigev_signo);
		else {
			printf("DEBUG %s/%d: sigev_notify != SIGEV_SIGNAL\n",
			       __FILE__, __LINE__);
			return -1;
		}
#endif
		/* loop waiting for signal */
		while (Received_signal == Rec_signal) {
#ifdef CRAY
			sigon();
#else
			sigrelse(aiocbp->aio_sigevent.sigev_signo);
#endif
		}

	} else if (method & LIO_WAIT_NONE) {
		if (Debug_level > 2)
			printf("DEBUG %s/%d: wait method : none\n", __FILE__,
			       __LINE__);
		/* It's broken because the aiocb/iosw is an automatic variable in
		 * lio_{read,write}_buffer, so when the function returns and the
		 * I/O completes there will be nowhere to write the I/O status.
		 * It doesn't cause a problem on unicos--probably because of some
		 * compiler quirk, or an accident.  It causes POSIX async I/O
		 * to core dump some threads.   spr/pv 705909.  6/27/97 roehrich
		 */
		sprintf(Errormsg,
			"%s/%d LIO_WAIT_NONE was selected (this is broken)\n",
			__FILE__, __LINE__);
#ifdef CRAY
		sigon();
#endif
/*        return 1;*/
		return -1;
	} else {
		if (Debug_level > 2)
			printf("DEBUG %s/%d: no wait method was chosen\n",
			       __FILE__, __LINE__);
		return -1;
	}

	return 0;

}				/* end of lio_wait4asyncio */

#endif /* ifndef linux */
#endif

#if UNIT_TEST
/***********************************************************************
 * The following code is provided as unit test.
 * Just define add "-DUNIT_TEST=1" to the cc line.
 *
 * (rrl 04/96)
 ***********************************************************************/
struct unit_info_t {
	int method;
	int sig;
	char *str;
} Unit_info[] = {
	{
	LIO_IO_SYNC, 0, "sync io"}, {
	LIO_IO_SYNCV, 0, "sync readv/writev"}, {
	LIO_IO_SYNCP, 0, "sync pread/pwrite"}, {
	LIO_IO_ASYNC, 0, "async io, def wait"}, {
	LIO_IO_SLISTIO, 0, "sync listio"}, {
	LIO_IO_ALISTIO, 0, "async listio, def wait"}, {
	LIO_IO_ASYNC | LIO_WAIT_ACTIVE, 0, "async active"}, {
	LIO_IO_ASYNC | LIO_WAIT_RECALL, 0, "async recall/suspend"}, {
	LIO_IO_ASYNC | LIO_WAIT_SIGPAUSE, SIGUSR1, "async sigpause"}, {
	LIO_IO_ASYNC | LIO_WAIT_SIGACTIVE, SIGUSR1, "async sigactive"}, {
	LIO_IO_ALISTIO | LIO_WAIT_ACTIVE, 0, "async listio active"}, {
	LIO_IO_ALISTIO | LIO_WAIT_RECALL, 0, "async listio recall"}, {
	LIO_IO_ALISTIO | LIO_WAIT_SIGACTIVE, SIGUSR1, "async listio sigactive"},
	{
	LIO_IO_ALISTIO | LIO_WAIT_SIGPAUSE, SIGUSR1, "async listio sigpause"},
	{
	LIO_IO_ASYNC, SIGUSR2, "async io, def wait, sigusr2"}, {
LIO_IO_ALISTIO, SIGUSR2, "async listio, def wait, sigusr2"},};

int main(argc, argv)
int argc;
char **argv;
{
	extern char *optarg;
	extern int optind;

	int fd;
	char *err;
	char buffer[4096];
	int size = 4096;
	int ret;
	int ind;
	int iter = 3;
	int method;
	int exit_status = 0;
	int c;
	int i;
	char *symbols = NULL;
	int die_on_err = 0;

	while ((c = getopt(argc, argv, "s:di:")) != -1) {
		switch (c) {
		case 's':
			symbols = optarg;
			break;
		case 'd':
			++die_on_err;
			break;
		case 'i':
			iter = atoi(optarg);
			break;
		}
	}

	if ((fd =
	     open("unit_test_file", O_CREAT | O_RDWR | O_TRUNC, 0777)) == -1) {
		perror
		    ("open(unit_test_file, O_CREAT|O_RDWR|O_TRUNC, 0777) failed");
		exit(1);
	}

	Debug_level = 9;

	if (symbols != NULL) {
		if ((method = lio_parse_io_arg2(symbols, &err)) == -1) {
			printf
			    ("lio_parse_io_arg2(%s, &err) failed, bad token starting at %s\n",
			     symbols, err);
			if (die_on_err)
				exit(1);
		} else
			printf("lio_parse_io_arg2(%s, &err) returned %#o\n",
			       symbols, method);

		exit_status = 0;
		for (ind = 0; ind < iter; ind++) {
			memset(buffer, 'A', 4096);
			if (lseek(fd, 0, 0) == -1) {
				printf("lseek(fd,0,0), %d, failed, errno %d\n",
				       __LINE__, errno);
				++exit_status;
			}
			if ((ret = lio_write_buffer(fd, method, buffer,
						    size, SIGUSR1, &err,
						    0)) != size) {
				printf
				    ("lio_write_buffer returned -1, err = %s\n",
				     err);
			} else
				printf("lio_write_buffer returned %d\n", ret);

			memset(buffer, 'B', 4096);
			if (lseek(fd, 0, 0) == -1) {
				printf("lseek(fd,0,0), %d, failed, errno %d\n",
				       __LINE__, errno);
				++exit_status;
			}
			if ((ret = lio_read_buffer(fd, method, buffer,
						   size, SIGUSR2, &err,
						   0)) != size) {
				printf
				    ("lio_read_buffer returned -1, err = %s\n",
				     err);
			} else
				printf("lio_read_buffer returned %d\n", ret);

			for (i = 0; i < 4096; ++i) {
				if (buffer[i] != 'A') {
					printf("  buffer[%d] = %d\n", i,
					       buffer[i]);
					++exit_status;
					break;
				}
			}

			if (exit_status)
				exit(exit_status);

		}

		unlink("unit_test_file");
		exit(0);
	}

	for (ind = 0; ind < sizeof(Unit_info) / sizeof(struct unit_info_t);
	     ind++) {

		printf("\n********* write %s ***************\n",
		       Unit_info[ind].str);
		if (lseek(fd, 0, 0) == -1) {
			printf("lseek(fd,0,0), %d, failed, errno %d\n",
			       __LINE__, errno);
			++exit_status;
		}

		memset(buffer, 'A', 4096);
		if ((ret = lio_write_buffer(fd, Unit_info[ind].method, buffer,
					    size, Unit_info[ind].sig, &err,
					    0)) != size) {
			printf
			    (">>>>> lio_write_buffer(fd,0%x,buffer,%d,%d,err,0) returned -1,\n   err = %s\n",
			     Unit_info[ind].method, size, Unit_info[ind].sig,
			     err);
			++exit_status;
			if (die_on_err)
				exit(exit_status);
		} else {
			printf("lio_write_buffer returned %d\n", ret);
		}

		printf("\n********* read %s ***************\n",
		       Unit_info[ind].str);
		if (lseek(fd, 0, 0) == -1) {
			printf("lseek(fd,0,0), %d, failed, errno %d\n",
			       __LINE__, errno);
			++exit_status;
		}
		memset(buffer, 'B', 4096);
		if ((ret = lio_read_buffer(fd, Unit_info[ind].method, buffer,
					   size, Unit_info[ind].sig, &err,
					   0)) != size) {
			printf
			    (">>>>> lio_read_buffer(fd,0%x,buffer,%d,%d,err,0) returned -1,\n   err = %s\n",
			     Unit_info[ind].method, size, Unit_info[ind].sig,
			     err);
			++exit_status;
			if (die_on_err)
				exit(exit_status);
		} else {
			printf("lio_read_buffer returned %d\n", ret);
		}

		for (i = 0; i < 4096; ++i) {
			if (buffer[i] != 'A') {
				printf("  buffer[%d] = %d\n", i, buffer[i]);
				++exit_status;
				if (die_on_err)
					exit(exit_status);
				break;
			}
		}

		fflush(stdout);
		fflush(stderr);
		sleep(1);

	}

	unlink("unit_test_file");

	exit(exit_status);
}
#endif
