/* 
 * Mach Operating System
 * Copyright (c) 1992 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 "AS IS"
 * 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 Mellon 
 * 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/04/01  19:37:59  rpd
 * 	Created.
 * 	[92/03/09            rpd]
 * 
 */
/*
 *	File:	err_bootstrap.sub
 *	Author:	Richard Draves, Carnegie Mellon University
 *	Date:	March 9, 1992
 *
 *	Error string definitions for bootstrap
 */

static char * err_codes_bootstrap_fs[] = {
	/* 0 */	"(bootstrap/fs) not a directory",
	/* 1 */	"(bootstrap/fs) name not found",
	/* 2 */	"(bootstrap/fs) name too long",
	/* 3 */	"(bootstrap/fs) symbolic link loop",
	/* 4 */	"(bootstrap/fs) bad file system",
	/* 5 */	"(bootstrap/fs) offset not in file",
	/* 6 */	"(bootstrap/fs) invalid parameter",
};

/*	err_bootstrap subsystems      	*/
static struct error_subsystem err_bootstrap_sub[] = {
	/* bootstrap/0; */
	{
		"(bootstrap/fs)",
		errlib_count(err_codes_bootstrap_fs),
		err_codes_bootstrap_fs,
	},
};
