/*
 * Mach Operating System
 * Copyright (c) 1991,1990,1989 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.3  92/04/01  19:38:05  rpd
 * 	Added MIG_DESTROY_REQUEST.
 * 	[92/03/09            rpd]
 *
 * Revision 2.2  92/01/16  00:09:05  rpd
 * 	Moved from user collection to mk collection.
 *
 * Revision 2.3  91/08/29  15:51:30  rpd
 * 	Added MIG_SERVER_DIED.
 * 	[91/08/21            rpd]
 *
 * Revision 2.2  91/03/27  16:05:37  mrt
 * 	First checkin
 *
 * Revision 2.2  91/03/18  17:39:03  rpd
 * 	Created.
 * 	[91/03/18            rpd]
 *
 */
/*
 *	File:	err_mach_ipc.sub
 *	Author:	Richard Draves, Carnegie Mellon University
 *	Date:	Jan, 1990
 *
 *	Error string definitions for the new Mach IPC
 */

static char * err_codes_mach_send[] = {
	/* 0 */	"(ipc/send) no error",
	/* 1 */	"(ipc/send) send in progress",
	/* 2 */	"(ipc/send) invalid data",
	/* 3 */	"(ipc/send) invalid destination port",
	/* 4 */	"(ipc/send) timed out",
	/* 5 */	"(ipc/send) will notify",
	/* 6 */	"(ipc/send) notify in progress",
	/* 7 */	"(ipc/send) interrupted",
	/* 8 */	"(ipc/send) msg too small",
	/* 9 */	"(ipc/send) invalid reply port",
       /* 10 */	"(ipc/send) invalid port right",
       /* 11 */	"(ipc/send) invalid notify port",
       /* 12 */	"(ipc/send) invalid memory",
       /* 13 */	"(ipc/send) no msg buffer",
       /* 14 */	"(ipc/send) no notify possible",
       /* 15 */	"(ipc/send) invalid msg-type",
       /* 16 */	"(ipc/send) invalid msg-header",
};

static char * err_codes_mach_rcv[] = {
	/* 0 */	"(ipc/rcv) no error",
	/* 1 */	"(ipc/rcv) receive in progress",
	/* 2 */	"(ipc/rcv) invalid name",
	/* 3 */	"(ipc/rcv) timed out",
	/* 4 */	"(ipc/rcv) msg too large",
	/* 5 */	"(ipc/rcv) interrupted",
	/* 6 */	"(ipc/rcv) port changed",
	/* 7 */	"(ipc/rcv) invalid notify port",
	/* 8 */	"(ipc/rcv) invalid data",
	/* 9 */	"(ipc/rcv) port died",
       /* 10 */	"(ipc/rcv) port in set",
       /* 11 */	"(ipc/rcv) header error",
       /* 12 */	"(ipc/rcv) body error",
};

static char 	* err_codes_mach_mig[] = {
	/* 0 */	"(ipc/mig) client type check failure",
	/* 1 */	"(ipc/mig) wrong reply message ID",
	/* 2 */	"(ipc/mig) server detected error",
	/* 3 */	"(ipc/mig) bad request message ID",
	/* 4 */	"(ipc/mig) server type check failure",
	/* 5 */	"(ipc/mig) no reply should be sent",
	/* 6 */	"(ipc/mig) server raised exception",
	/* 7 */	"(ipc/mig) array not large enough",
	/* 8 */	"(ipc/mig) server died",
	/* 9 */ "(ipc/mig) destroy request with no reply",
};

/*	err_mach_ipc subsystems      	*/
static struct error_subsystem err_mach_ipc_sub[] = {
	/* ipc/0; */
	{
		"(ipc/send)",
		errlib_count(err_codes_mach_send),
		err_codes_mach_send,
	},
	/* ipc/1; */
	{
		"(ipc/rcv)",
		errlib_count(err_codes_mach_rcv),
		err_codes_mach_rcv,

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

};
