/*
 * 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,
	},
};
