/* * (C) 1984 UniSoft Corp. of Berkeley CA * * UniPlus Source Code. This program is proprietary * with Unisoft Corporation and is not to be reproduced * or used in any manner except as authorized in * writing by Unisoft. */ #include "sys/types.h" #include "sys/param.h" #include "sys/inode.h" #include "saio.h" #define MEMADDR ((char *)0x20000) char file[50]; char dffrom[] = "sn(0,0)"; /* * Copy the serialized boot program to a specified device. */ copysboot() { register fp; register char *cp, *p; register bn, i; register struct block0 *bp; from: do { printf("Enter device to copy from: "); gets(file); p = file; if (file[0] == 0) { printf("%s\n", dffrom); fp = open(dffrom, 2); p = dffrom; } else fp = open(file, 2); } while (fp < 0); cp = MEMADDR; for (bn=1; bn<=NBLKS; bn++) { /* read boot program from disk */ lseek(fp, (off_t)(bn*BSIZE), 0); if ((read(fp,cp,BSIZE)) != BSIZE) { printf("READ ERROR\n"); while (1); } cp += BSIZE; } close(fp); for (cp=p ; *p && *p != '('; p++) ; *p = '\0'; if (match(cp, "sn")) if (eject(0)) printf("copy: eject failed\n"); to: do { printf("Enter device to copy to: "); gets(file); if (file[0] == 0) goto to; for (p = file; *p && *p != '('; p++) ; if (*p == 0) goto to; *p = '\0'; if (match(p, "sn")) for (i=0; i<0xC0000; i++) ; *p = '('; for (p++; *p && *p != ','; p++) ; if (*p == 0) goto to; for (p++; *p && *p != ')'; p++) *p = '0'; /* force block offset to 0 */ if (*p == 0) goto to; fp = open(file, 2); } while (fp < 0); /* write special block 0 */ for (p = file; *p && *p != '('; p++) ; *p = '\0'; for (bp = block0; bp->dv_name; bp++) { if (match(file, bp->dv_name)) goto gotit; } printf("%s invalid\nValid devices to copy to are\n", file); for (bp = block0; bp->dv_name; bp++) printf(" %s\n", bp->dv_name); close(fp); goto to; gotit: p = (char *)(bp->bblk); if (match(bp->dv_name, "sn")) { /* flag to write boot header for bn 0 */ iob[fp-3].i_bblk = BOOTDISK; lseek(fp, (off_t)0, 0); if (write(fp,p,BSIZE) != BSIZE) { /* write sony twice */ printf("WRITE ERROR\n"); while (1); } } lseek(fp, (off_t)0, 0); if (write(fp,p,BSIZE) != BSIZE) { printf("WRITE ERROR\n"); while (1); } cp = MEMADDR; for (bn=1; bn<=NBLKS; bn++) { lseek(fp, (off_t)(bn*BSIZE), 0); if (write(fp,cp,BSIZE) != BSIZE) { printf("WRITE ERROR\n"); while (1); } cp += BSIZE; } iob[fp-3].i_bblk = 0; close(fp); } static match(s1,s2) register char *s1,*s2; { for (;;) { if (*s1 != *s2) return(0); if (*s1++ && *s2++) continue; else return(1); } }