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); }