char _Version_[] = "(C) Copyright 1984 UniSoft Corp., Version V.1.0";
char _Origin_[] = "UniSoft Systems of Berkeley";

/*
 * reboot rootdev
 *	Change rootdev, pipedev, dumpdev, swapdev and nswap
 *	in the incore copy of unix and then restart unix.
 *	This is used during installation after a minimal
 *	filesystem has been set up on the hard disk.  It
 *	results in the first boot of unix from the hard disk.
 */

#include "stdio.h"
#include "nmaddrs.h"
#include "sys/types.h"
#include "sys/config.h"
#include "sys/sysmacros.h"
#include "sys/swapsz.h"
#include "sys/reboot.h"

#define USAGE "usage: reboot rootdev"

main(argc, argv)
char **argv;
{
	register fp, cfp;
	short rootdev;
	long nswap;
	int i;

	if (argc != 2)
		perr(USAGE);
	rootdev = (short)strtol(*(argv+1), (char **)NULL, 16);
	if ((fp = open("/dev/mem", 2)) < 0)
		perr("cannot open /dev/mem");

	if (lseek(fp, ROOTDEV, 0) < 0)
		perr("lseek to rootdev %x failed", ROOTDEV);
	if (write(fp, &rootdev, 2) != 2)
		perr("write of rootdev 0x%x at %x failed", rootdev, ROOTDEV);
	printf("rootdev = 0x%x\n", rootdev);

	if (lseek(fp, PIPEDEV, 0) < 0)
		perr("lseek to pipedev %x failed", PIPEDEV);
	if (write(fp, &rootdev, 2) != 2)
		perr("write of pipedev 0x%x at %x failed", rootdev, PIPEDEV);
	printf("pipedev = 0x%x\n", rootdev);

	if (lseek(fp, DUMPDEV, 0) < 0)
		perr("lseek to dumpdev %x failed", DUMPDEV);
	if (write(fp, &rootdev, 2) != 2)
		perr("write of dumpdev 0x%x at %x failed", rootdev, DUMPDEV);
	printf("dumpdev = 0x%x\n", rootdev);

	rootdev++;	/* now it's swapdev */
	if (lseek(fp, SWAPDEV, 0) < 0)
		perr("lseek to swapdev %x failed", SWAPDEV);
	if (write(fp, &rootdev, 2) != 2)
		perr("write of swapdev 0x%x at %x failed", rootdev, SWAPDEV);
	printf("swapdev = 0x%x\n", rootdev);

	if (lseek(fp, NSWAP, 0) < 0)
		perr("lseek to nswap %x failed", NSWAP);
	if (major(rootdev) == PR0)
		nswap = PRNSWAP;
	else if (major(rootdev) == CV2)
		nswap = CVNSWAP;
	else if (major(rootdev) == PM3)
		nswap = PMNSWAP;
	else
		perr("cannot determine size of swapdev");
	if (write(fp, &nswap, 4) != 4)
		perr("write of nswap %d at %x failed", nswap, NSWAP);
	printf("nswap = %d\n", nswap);
	for (i=0; i<200000; i++) ;

	if ((cfp = open("/dev/console", 2)) < 0)
		perr("cannot open /dev/console");
	ioctl(cfp, RESTART, (caddr_t)0);	/* jump to start of unix */
	perr("restart failed");
}

perr(mes, par)
char *mes, *par;
{
	fprintf(stderr, mes, par);
	fprintf(stderr, "\n");
	perror("reboot");
	exit(1);
}
