/* 
 * Mach Operating System
 * Copyright (c) 1991,1990,1989,1988,1987 Carnegie Mellon University
 * All Rights Reserved.
 * 
 * Permission to use, copy, modify and distribute this software and its
 * documentation is hereby granted, provided that both the copyright
 * notice and this permission notice appear in all copies of the
 * software, derivative works or modified versions, and any portions
 * thereof, and that both notices appear in supporting documentation.
 * 
 * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS 
 * CONDITION.  CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND FOR
 * ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE.
 * 
 * Carnegie Mellon requests users of this software to return to
 * 
 *  Software Distribution Coordinator  or  Software.Distribution@CS.CMU.EDU
 *  School of Computer Science
 *  Carnegie Mellon University
 *  Pittsburgh PA 15213-3890
 * 
 * any improvements or extensions that they make and grant Carnegie the
 * rights to redistribute these changes.
 */
/*
 * HISTORY
 * $Log$
 * Revision 1.1  1992/10/06 18:29:52  roland
 * entered into RCS
 *
 * Revision 2.2  92/01/16  00:08:40  rpd
 * 	Moved from user collection to mk collection.
 * 
 * Revision 2.2  91/03/27  16:05:16  mrt
 * 	First checkin
 * 
 * 
 */
/*
 *	File:	err_ipc.sub
 *	Author:	Douglas Orr, Carnegie Mellon University
 *	Date:	Mar, 1988
 *
 *	Definitions of error strings for original IPC
 */

static char * err_codes_send[] = {
	"(ipc/send) unknown error",		/* -100 */
	"(ipc/send) invalid memory",		/* -101 */
	"(ipc/send) invalid port",		/* -102 */
	"(ipc/send) timed out",			/* -103 */
	"(ipc/send) unused error",		/* -104 */
	"(ipc/send) will notify",		/* -105 */
	"(ipc/send) notify in progress",	/* -106 */	
	"(ipc/send) kernel refused message",	/* -107 */
	"(ipc/send) send interrupted",		/* -108 */
	"(ipc/send) send message too large",	/* -109 */
	"(ipc/send) send message too small",	/* -110 */
	"(ipc/send) message size changed while being copied",	/* -111 */
};

static char * err_codes_rcv[] = {
	"(ipc/rcv) unknown error",			/* -200 */
	"(ipc/rcv) invalid memory",			/* -201 */
	"(ipc/rcv) invalid port",			/* -202 */
	"(ipc/rcv) receive timed out",			/* -203 */
	"(ipc/rcv) message too large",			/* -204 */
	"(ipc/rcv) no space for message data",		/* -205 */
	"(ipc/rcv) only sender remaining",		/* -206 */
	"(ipc/rcv) receive interrupted",		/* -207 */
	"(ipc/rcv) port receiver changed or port became enabled", /* -208 */
};

static char 	* err_codes_mig[] = {
	"(ipc/mig) type check failure in message interface",	/* 0 (-300) */
	"(ipc/mig) wrong return message ID",			/* 1 */
	"(ipc/mig) server detected error",			/* 2 */
	"(ipc/mig) bad message ID",				/* 3 */
	"(ipc/mig) server found wrong arguments",		/* 4 */
	"(ipc/mig) no reply should be sent",			/* 5 */
	"(ipc/mig) server raised exception",			/* 6 */
	"(ipc/mig) user specified array not large enough for return info",	/* 7 */
};

/*	err_ipc subsystems      	*/
static struct error_subsystem err_ipc_sub[] = {
	/* ipc/0; */
	{
		"(ipc/send)",
		errlib_count(err_codes_send),
		err_codes_send,
	},
	/* ipc/1; */
	{
		"(ipc/rcv)",
		errlib_count(err_codes_rcv),
		err_codes_rcv,

	},
	/* ipc/2 */
	{
		"(ipc/mig)",
		errlib_count(err_codes_mig),
		err_codes_mig,
	},

};

