home *** CD-ROM | disk | FTP | other *** search
/ InfoMagic Source Code 1993 July / THE_SOURCE_CODE_CD_ROM.iso / bsd_srcs / sys / hp300 / stand / installboot.c < prev    next >
Encoding:
C/C++ Source or Header  |  1991-05-05  |  3.8 KB  |  117 lines

  1. /*
  2.  * Copyright (c) 1980, 1986, 1990 The Regents of the University of California.
  3.  * All rights reserved.
  4.  *
  5.  * Redistribution and use in source and binary forms, with or without
  6.  * modification, are permitted provided that the following conditions
  7.  * are met:
  8.  * 1. Redistributions of source code must retain the above copyright
  9.  *    notice, this list of conditions and the following disclaimer.
  10.  * 2. Redistributions in binary form must reproduce the above copyright
  11.  *    notice, this list of conditions and the following disclaimer in the
  12.  *    documentation and/or other materials provided with the distribution.
  13.  * 3. All advertising materials mentioning features or use of this software
  14.  *    must display the following acknowledgement:
  15.  *    This product includes software developed by the University of
  16.  *    California, Berkeley and its contributors.
  17.  * 4. Neither the name of the University nor the names of its contributors
  18.  *    may be used to endorse or promote products derived from this software
  19.  *    without specific prior written permission.
  20.  *
  21.  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
  22.  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  23.  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  24.  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
  25.  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
  26.  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
  27.  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
  28.  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
  29.  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
  30.  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  31.  * SUCH DAMAGE.
  32.  *
  33.  *    @(#)installboot.c    7.2 (Berkeley) 12/16/90
  34.  */
  35.  
  36. #ifndef lint
  37. char copyright[] =
  38. "@(#) Copyright (c) 1980, 1986, 1990 The Regents of the University of California.\n\
  39.  All rights reserved.\n";
  40. #endif /* not lint */
  41.  
  42. #ifndef lint
  43. static char sccsid[] = "@(#)installboot.c    7.2 (Berkeley) 12/16/90";
  44. #endif /* not lint */
  45.  
  46. #include "sys/param.h"
  47. #include "ufs/fs.h"
  48.  
  49. char block[1024];
  50. int maxbootsize = 16 * 7 * 512;        /* XXX */
  51.  
  52. /*
  53.  * HPs are a kludge.
  54.  * The boot program won't fit in the boot area of a file system so we
  55.  * have to place it outside the file systems.  By convention, this means
  56.  * that if the 'a' partition is being used for '/', it is offset one
  57.  * cylinder into the disk and the boot program goes into that one cylinder.
  58.  * Also by convention, the 'c' partition is defined to be the entire disk
  59.  * including this boot cylinder.  If these conventions are not adhered to,
  60.  * the potential for disaster is enormous.
  61.  */
  62. main(argc, argv)
  63.     int argc;
  64.     char *argv[];
  65. {
  66.     int ifd, ofd, len;
  67.     char *dev, *standalonecode;
  68.     int bsize = 1024;
  69.  
  70.     if (argc != 3)
  71.         usage();
  72.     dev = argv[2];
  73.     len = strlen(dev);
  74.     if (dev[len-1] != 'c')
  75.         usage();
  76.     standalonecode = argv[1];
  77.     ifd = open(standalonecode, 0);
  78.     if (ifd < 0) {
  79.         perror(standalonecode);
  80.         exit(1);
  81.     }
  82.     ofd = open(dev, 1);
  83.     if (ofd < 0) {
  84.         perror(dev);
  85.         exit(1);
  86.     }
  87.     while ((len = read(ifd, block, bsize)) > 0) {
  88.         if ((maxbootsize -= bsize) < 0) {
  89.             printf("%s: too big\n", standalonecode);
  90.             exit(2);
  91.         }
  92.         if (len < bsize)
  93.             bzero(&block[len], bsize-len);
  94.         if (write(ofd, block, bsize) != bsize) {
  95.             perror(dev);
  96.             exit(2);
  97.         }
  98.     }
  99.     if (len < 0) {
  100.         perror(standalonecode);
  101.         exit(2);
  102.     }
  103.     exit(0);
  104. }
  105.  
  106. usage()
  107. {
  108.     printf("Usage: installboot bootprog device\n");
  109.     printf("where:\n");
  110.     printf("\t\"bootprog\" is a LIF format file < %d bytes long\n",
  111.            maxbootsize);
  112.     printf("\t\"device\" must be the 'c' partition of a bootable disk\n");
  113.     printf("WARNING!!  If the 'c' partition contains a file system, %s\n",
  114.            "DON'T RUN THIS!!");
  115.     exit(1);
  116. }
  117.