Example #1
0
main(int argc, char **argv)
{
    int i;
    char name[1024];
    char rsrc[5]="NFNT";
    char s[5];
    char *p;
    unsigned short n;
    int rsrconly=0;
    FILE *in,*out;
    unsigned long dforklen,rforklen,pos;
    if(argc!=2 && argc!=3)
        err("getmacfont filename [RSRC]\n"
            "  This extracts all the bitmapped font (NFNT) resources\n"
            "  from the specified MacBinary encoded file.\n"
            "  You can also use it to extract any other type of resource\n"
            "  by supplying the resource type on the commandline,\n"
            "  for instance: getmacfont input.bin FOND.\n"
            "  Each resource found gets saved into a separate file with\n"
            "  filename ending in .data.\n");
    strcpy(name,argv[1]);
    if(strlen(argv[1])>5 && !strcmp(argv[1]+strlen(argv[1])-5,".rsrc")) rsrconly=1;
    if(argc==3)
    {
        if(strlen(argv[2])!=4) err("Resource name should be four characters.\n");
        strcpy(rsrc,argv[2]);
    }
    in=myfopen(name,"rb");
    strcpy(thename,name);
    if((p=strrchr(thename,'.'))!=NULL) *p=0;
    if(!rsrconly)
    {
        myseek(in,83);
        dforklen=getdword(in);
        rforklen=getdword(in);
        printf("Data fork length = %lu\n"
           "Resource fork length = %lu\n",
            dforklen,rforklen);
        myseek(in,rforkpos=128+dforklen);
    }
    else
    {
        rforkpos=0;
    }
    rdatapos=rforkpos+getdword(in);
    rmappos=rforkpos+getdword(in);
    rdatalen=getdword(in);
    rmaplen=getdword(in);
    myseek(in,rmappos+16+4+2+2);
 /*   printf("%lx\n",rmappos); */
    rtypepos=rmappos+getword(in);
 /*   printf("%lx\n",rtypepos); */
    rnamepos=rmappos+getword(in);
 /*   printf("%lx\n",rnamepos); */
    myseek(in,rtypepos);
    numtypes=getword(in)+1;
    for(i=0;i<numtypes;i++)
    {
        read4bytes(in,s);
        if(!strcmp(rsrc,s)) break;
        getword(in);
        getword(in);
    }
    if(i==numtypes) err("Cannot find resources of type %s.\n",rsrc);
    myresnum=1+getword(in);
    myreflistpos=rtypepos+getword(in);
    myseek(in,myreflistpos);
    for(i=0;i<(int)myresnum;i++)
    {
        getword(in); /* Resource ID */
        mynamepos=rnamepos+(n=getword(in));
        getbyte(in); /* Resource attributes */
        mydatapos=rdatapos+get3bytes(in);
        getdword(in);
        pos=ftell(in);
        process(in,n==65535?-1:mynamepos,mydatapos);
        myseek(in,pos);
    }
    fclose(in);
    return 0;
}
Example #2
0
/*
 * Handle [FORMAT] item.
 *
 */
dodiform()
{
  extern char bootstop;
  extern char bootend;
  int dev, v, w, i, br;
  int modesel;			/* flag for mode select */
  long cnt, hdsiz;
  char *s, *d, *wgetstr();
  char buf[10], bs[512], sendata[32];
  char pnam[128];
  char *seldev = "X", *id = "XXXXX";
  HINFO hinfo;
  char devnames[NAMSIZ];	/* device type name buffer */
  long nbad;
  extern long gbslsiz(), nument(), dsmarkbad();
  long pattern, temp;
  long longrandom();
  char pr_id[10];	/* partition scheme id */
  int mask = 0x0001;
  int set, scsidrv, bsiz, other = 0;
  
  /*
   * Throw up generic formatting/partition warning,
   * then get physical dev they want to clobber.
   */
  yesscan = 0;
  noinfo = 0;
  for (i = 0; i < NAMSIZ; i++)
  	devnames[i] = "\0";
  fwarning[FWARNCN].ob_state = NORMAL;
  fwarning[FWARNOK].ob_state = NORMAL;
  if (execform(fwarning) != FWARNOK) return BAILOUT;

  if ((dev = gphysdev()) < 0) {
      return BAILOUT;
  }
  strcpy(id, "mn");
  br = 0;

  /* display doing SCSI massage */

  if (dev > 7)  {	/* do the SCSI drive */
  	noinfo = 1;
  	goto stfm;
  }
  
  inqfmt:
  /* Get all available disk types from wincap 'mn' entries */  
  wallents(devnames, id);
  if (!*devnames) 	{
  	noinfo = 1;
  	goto stfm;
  }
  
  /* Shove format name text into buttons */
  for (i = 0, s = devnames; i < 14 && *s; ++i) {
      dsknames[pfmt[i]].ob_type = G_BUTTON;	/* button */
      dsknames[pfmt[i]].ob_spec = (long)s;
      dsknames[pfmt[i]].ob_state = NORMAL;
      dsknames[pfmt[i]].ob_flags = SELECTABLE | RBUTTON;
      while (*s++)
	;
  }
  other = i;							/* the other button */
  dsknames[pfmt[i]].ob_type = G_BUTTON;	/* button */
  dsknames[pfmt[i]].ob_spec = "OTHER";
  dsknames[pfmt[i]].ob_state = NORMAL;
  dsknames[pfmt[i]].ob_flags = SELECTABLE | RBUTTON;
  i++;

  /* rest of buttons are invisible and untouchable */
  for (; i < 16; ++i) {
      dsknames[pfmt[i]].ob_type = G_IBOX;	/* invisible box */
      dsknames[pfmt[i]].ob_spec = 0;		/* no thickness */
      dsknames[pfmt[i]].ob_state = DISABLED;	/* nobody home */
      dsknames[pfmt[i]].ob_flags = NONE;		/* disabled */
  }
  
  /* clean up rest of the form and throw it up */
  dsknames[PFOK].ob_state = NORMAL;
  dsknames[PFCN].ob_state = NORMAL;
  if (execform(dsknames) != PFOK)
    return BAILOUT;
  
  /* search for format they picked */
  for (i = 0; i < 16; ++i)
    if (dsknames[pfmt[i]].ob_state & SELECTED)
      break;
  if (i >= 16) {		/* nothing picked */
      return BAILOUT;
  } else if (other == i)	{  /* the OTHER button was selected */
  	  noinfo = 1;
	  goto stfm;
  }
  
	if ((!br) && (dev < 8))		{
	  	if (wgetent(dsknames[pfmt[i]].ob_spec, "mn") == ERROR)	{
			nofmt[NOSCHFMT].ob_spec = dsknames[pfmt[i]].ob_spec;
			nofmt[NOSCHFMT].ob_state = NORMAL;
			execform(nofmt, 0);
			return ERROR;
		}
		if ((s = wgetstr("br")) != NULL)	{
			strcpy(id, s);
			br = 1;			/* processing the branch */
			goto inqfmt;	/* start over */
		}
	}

stfm:
	modesel = 1;
  if (gfparm(dev, noinfo, &modesel, &hinfo, dsknames[pfmt[i]].ob_spec,id)!= 0) {
      return ERROR;
  }
  
  /* get data pattern to test the disk */
  if (wgetnum("dp", &pattern) != OK) {
      pattern = longrandom();  /* can't find pattern from wincap, make one */
  } else {
      temp = pattern;
      pattern <<= 16;	/* shift pattern to hi word */
      pattern |= temp;
  }


  br = (dev > 7) ? (dev-8) : (dev);	/* minus 8 for the scsi drive number */
  /*
   * One last chance to bail out.
   */
  *seldev = br + '0';
  (fmtfnl[FUNIT].ob_spec)->te_ptext = seldev;
  fmtfnl[FMTYES].ob_state = NORMAL;
  fmtfnl[FMTNO].ob_state = NORMAL;
  if (execform(fmtfnl) != FMTYES) return BAILOUT;

  /* For REAL !! */  
  dsplymsg(fmtmsg);

  bsl = 0L;
  
  /* Get size of Bad Sector List */
  if ((bslsiz = gbslsiz(dev)) > 0L) {
      /* Allocate memory for existing BSL */
      if ((bsl = (BYTE *)mymalloc((int)bslsiz*512)) <= 0) {
          ret = err(nomemory);
          goto formend;
      }
      
      /* Read in BSL */
      if ((ret = rdbsl(dev)) != OK) {
          /* Create a new BSL if current one is unusable */
	  	if (creabsl(dev, NEW, 0L) != OK) {
	  	    ret = ERROR;
	  	    goto formend;
	  	}
      } else {
      	  /* Remove USER BSL */
      	  if (creabsl(dev, EXPAND, nument(VENDOR)) != OK) {
      	      ret = ERROR;
      	      goto formend;
      	  }
      }
  } else if (bslsiz == 0L || bslsiz == ERROR) {	/* no bsl or read error */
      if (creabsl(dev, NEW, 0L) != OK) {
          ret = ERROR;
          goto formend;
      }
  } else {	/* bslsiz == MDMERR; medium changed error */
      ret = ERROR;
      goto formend;
  }
  
  /*
   * In supervisor mode
   * set disk format parameters
   * and format the disk.
   */
  ostack = Super(NULL);
  v = OK;				    /* assume everything is OK */
  w = -1;
  if (modesel)	{			/* normal mode select ? */
      v = ms(dev, &hinfo);	/* Yes, do noprmal mode set */
	  if (v == OK) w = OK;
  	  /* Find formatted capacity of drive */
      hdsiz = (long)hinfo.hi_cc * (long)hinfo.hi_dhc * (long)hinfo.hi_spt;
  }	else {					/* No, do special mode set */
  	set = typedev & (mask << dev);
	scsidrv = typedrv & (mask << dev);
	bsiz = ((set) || (scsidrv)) ? (16) : (22);
	for (i = 0; i < 32; i++)
		sendata[i] = 0;
	if ((set) || (scsidrv))	{
  		v = mdsense(dev, 4, 0, 32, sendata);
  		for (i = 0; i < 32; i++) /* the lenght of sendata */
  			if (sendata[i])
				break;
  		if (i == 32)	{ /* no infomations returned */
			ret = 111;		
			delay();
			goto jjj;
  		}
		hdsiz = get3bytes(sendata+5);
  		delay();				    /* kludge delay */
		v = sqms(dev, sendata);
		delay();
		goto kkk;
	}
jjj:
  	if ((v = mdsense(dev, 0, 0, bsiz, sendata)) == OK)		{
  		for (i = 0; i < bsiz; i++)
  			if (sendata[i])
				break;
  		if (i == bsiz)	{ /* no infomations returned */
			ret = 111;		
			delay();
  			Super(ostack);
			goto formend;
  		}
		hdsiz = get3bytes(sendata+5);
  		delay();				    /* kludge delay */
		v = sqms(dev, sendata);
	} else {
  		for (i = 0; i < bsiz; i++)
  			if (sendata[i])
				break;
  		if (i == bsiz)	{ /* no infomations returned */
			ret = 111;		
			delay();
  			Super(ostack);
			goto formend;
  		}
	}

kkk:
 	delay();				    /* kludge delay */
	w = OK;
	if (dev > 7)				/* the drive is scsi */
		if ((w = readcap(dev, 0, (long)0, buf)) == OK)
			hdsiz = get4bytes(buf) + 1;
  }
  disksiz = hdsiz;
  delay();				    /* kludge delay */
  if ((v == OK) || (w == OK))
  	v = format(dev, (UWORD)hinfo.hi_in);  /* format */
  delay();				    /* kludge delay */
  Super(ostack);
  
  if ((v != 0) || (w != 0)) {
      ret = errcode(dev);
      if (tsterr(ret) != OK)
          formaterr(dev);
      ret = ERROR;
      goto formend;
  }
  
  ret = OK;
  rebootp = 1;
formend:
  erasemsg();	/* Erase formatting box */
  if (ret == 111)		/* HDX may not support this drive */
  		ret = err(needinfo);
  if (ret < 0) {
      if (bsl > 0) free(bsl);
      return ERROR;
  }
  
  /*------------------------------------------*
   * Markbad the device destructively.	      *
   * Bad Sectors found are added to the BSL.  *
   * Write BSL to device.		      *
   *------------------------------------------*/
  if ((nbad = dsmarkbad(dev, hdsiz, 1, pattern)) < 0) {
      free(bsl);
      return ERROR;
  }
  if (wrbsl(dev) != OK) {
      free(bsl);
      return ERROR;
  }
  free(bsl);

    
  /*
   * Install boot-stopper in sector image;
   * write root sector to device.
   * 6-13-88  Setting of soft format parameters in root sector sets
   *		the hard disk size only.
   */
  fillbuf(bs, 512L, 0L);	/* create new root sector */
  sbslparm(bs);			/* set BSL parameters */
  if (modesel)	{
  	sfmtparm(bs, &hinfo);
  } else {
  	sdisksiz(bs, disksiz);
  }
  for (d = bs, s = &bootstop, cnt = (long)(&bootend - &bootstop); --cnt;)
    *d++ = *s++;
  Protobt(bs, -1L, -1, 1);	/* make root sector executable */
  
  if ((ret = putroot(dev, bs, (SECTOR)0)) != OK) {
      if (tsterr(ret) != OK)
	  	err(rootwrit);
      return ERROR;
  }

  /*
   * Make a copy of the default partition name.
   * Figure out the partition scheme id.
   */
  if (!noinfo)	{
  	s = wgetstr("pt");
  	strcpy(pnam, s);
  }
  /* ??
  figprid(disksiz, pr_id);
  */
  dodipart(dev, pnam, disksiz);
  return OK;
}
Example #3
0
int
convert_S_records(
    FILE *ifp,
    char *inm,
    FILE *ofp,
    char *onm)
{
    char buff[512];
    char *p;
    u8 cksum;
    int incksum;
    int c;
    int len;                        /* data length of current line */
    int rectype;                    /* record type */
    u32 addr;
    bool endrecord = FALSE;
    buffer_rec tb;

    while ( ! endrecord && (fgets(buff, sizeof(buff), ifp)))
    {
        p = &buff[0];

        if (p[strlen(p)-1] == '\n')                 /* get rid of newline */
            p[strlen(p)-1] = '\0';

        if (p[strlen(p)-1] == '\r')                 /* get rid of any CR */
            p[strlen(p)-1] = '\0';

        tb.dl_count = 0;

        if (*p != 'S')
            badformat(p, inm, BADFMT);
        p++;

        if ((rectype = getnibble(&p)) == -1)        /* record type */
            badformat(buff, inm, BADTYPE);

        if ((len = getbyte(&p)) == -1)              /* record len */
            badformat(buff, inm, BADLEN);
        cksum = len;

        switch (rectype)
        {
            case 0x00:                  /* comment field, ignored */
                goto write_it;

            case 0x01:                          /* data record, 16 bit addr */
                if ((addr = get2bytes(&p)) == -1L)
                    badformat(buff, inm, BADADDR);
                len -= 3;
                goto doit;

            case 0x02:                          /* ... 24 bit addr */
                if ((addr = get3bytes(&p)) == -1L)
                    badformat(buff, inm, BADADDR);
                len -= 4;
                goto doit;

            case 0x03:                          /* ... 32 bit addr */
                if ((addr = get4bytes(&p)) == -1L)
                    badformat(buff, inm, BADADDR);
                len -= 5;
    doit:
                cksum += B0(addr) + B1(addr) + B2(addr) + B3(addr);

                tb.dl_destaddr = addr;
                while (len--)
                {
                    if ((c = getbyte(&p)) == -1)
                        badformat(buff, inm, BADDATA);
                    cksum += c;
                    filesum += c;
                    tb.dl_buf[tb.dl_count++] = c;
                }
                break;

            case 0x07:                  /* 32 bit end record */
                if ((addr = get4bytes(&p)) == -1L)
                    badformat(buff, inm, BADADDR);
                goto end_rec;

            case 0x08:                  /* 24 bit end record */
                if ((addr = get3bytes(&p)) == -1L)
                    badformat(buff, inm, BADADDR);
                goto end_rec;

            case 0x09:                  /* 16 bit end record */
                if ((addr = get2bytes(&p)) == -1L)
                    badformat(buff, inm, BADADDR);

end_rec:
                cksum += B0(addr) + B1(addr) + B2(addr) + B3(addr);
                tb.dl_jumpaddr = addr;
                break;

            default:
                error(0, "unknown Motorola-S record type: 0x%02x", rectype);
                badformat(buff, inm, BADTYPE);
                break;
        }

        /*
         * Verify checksums are correct in file.
         */

        cksum = (~cksum) & 0xff;
        if ((incksum = getbyte(&p)) == -1)
            badformat(buff, inm, BADCSUM);
        if (((u8) incksum) != cksum)
            badformat(buff, inm, MISCSUM);

write_it:
        if (tb.dl_count)
            write_record(&tb, ofp);
    }
    return 0;
}