/*
 * Copyright (c) 2000-2001 Silicon Graphics, Inc.; provided copyright in
 * certain portions may be held by third parties as indicated herein.
 * All Rights Reserved.
 *
 * The code in this source file represents an aggregation of work from
 * Georgia Tech, Fred Fish, Jeff Lee, Arnold Robbins and other Silicon
 * Graphics engineers over the period 1985-2000.
 *
 * This program 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.
 *
 * 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.  See the
 * GNU General Public License for more details.
 *
 * 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 St, Fifth Floor, Boston, MA  02110-1301  USA
 */

/*
 *	This file is only included by the library routines.  It is not
 *	required for user code.
 *
 */


#include <xfs/xfs.h>

/*
 *	Note that local vs remote file descriptors are distinquished
 *	by adding a bias to the remote descriptors.  This is a quick
 *	and dirty trick that may not be portable to some systems.
 *  It should be greater than the largest open filedescriptor
 *  than can be returned by the OS, and should be a power of 2.
 */

#define REM_BIAS 8192


/*
 *	BUFMAGIC --- Magic buffer size
 *	MAXUNIT --- Maximum number of remote tape file units
 */

#define BUFMAGIC	64
#define MAXUNIT		4

/*
 *	Useful macros.
 *
 *	READ --- Return the number of the read side file descriptor
 *	WRITE --- Return the number of the write side file descriptor
 *	RMTHOST --- Return an id which says host type from uname    
 */

/* rmt msg types */
#define RMTWARN 1
#define RMTDBG 	2 /* includes warning */

#define READ(fd)	(_rmt_Ctp[fd][0])
#define WRITE(fd)	(_rmt_Ptc[fd][1])
#define RMTHOST(fd)	(_rmt_host[fd])

#define RSH_PATH        "/usr/bin/rsh"
#define RMT_PATH        "/etc/rmt"

#define UNAME_UNDEFINED	-1
#define UNAME_LINUX	0
#define UNAME_IRIX	1
#define UNAME_UNKNOWN	2

extern int _rmt_Ctp[MAXUNIT][2];
extern int _rmt_Ptc[MAXUNIT][2];
extern int _rmt_host[MAXUNIT];

#define setoserror(err) (errno = err) /* TODO: multithread check */

/* prototypes */
int isrmt (int);
void _rmt_abort(int);
int _rmt_command(int, char *);
int _rmt_dev (char *);
int _rmt_status(int);
int _rmt_msgson(void);
void _rmt_msg(int level, const char *msg, ...);
void _rmt_turnonmsgsbyenv(void);
void rmt_turnonmsgs(int code);
