/* do the actual work */ static int assemble (const char *str, unsigned char *_obuf) { int ifcount = 0, noifcount = 0; const char *ptr; char *bufptr; int r, s; /* registers */ obuflen = 0; obuf = _obuf; /* continue assembling until the last input file is done */ //for (file = 0; file < infilecount; ++file) do { int cmd, cont = 1; // XXX: must free z80buffer = strdup (str); if (!cont) break; /* break to next source file */ // if (havelist) // fprintf (listfile, "%04x", addr); for (bufptr = z80buffer; (bufptr = strchr (bufptr, '\n'));) *bufptr = ' '; for (bufptr = z80buffer; (bufptr = strchr (bufptr, '\r'));) *bufptr = ' '; ptr = z80buffer; //lastlabel = NULL; baseaddr = addr; ++stack[sp].line; ptr = delspc (ptr); if (!*ptr) continue; if (!noifcount && !define_macro) readlabel (&ptr, 1); else readlabel (&ptr, 0); ptr = delspc (ptr); if (!*ptr) continue; comma = 0; indexed = 0; indexjmp = 0; writebyte = 0; readbyte = 0; readword = 0; cmd = readcommand (&ptr) - 1; int i, have_quote; switch (cmd) { case Z80_ADC: if (!(r = rd_a_hl (&ptr))) break; if (r == HL) { if (!(r = rd_rr_ (&ptr))) break; wrtb (0xED); wrtb (0x4A + 0x10 * --r); break; } if (!(r = rd_r (&ptr))) break; wrtb (0x88 + --r); break; case Z80_ADD: if (!(r = rd_r_add (&ptr))) break; if (r == addHL) { if (!(r = rd_rrxx (&ptr))) break; wrtb (0x09 + 0x10 * --r); /* ADD HL/IX/IY, qq */ break; } if (has_argument (&ptr)) { if (r != A) { eprintf ("parse error before: %s\n", ptr); break; } if (!(r = rd_r (&ptr))) break; wrtb (0x80 + --r); /* ADD A,r */ break; } wrtb (0x80 + --r); /* ADD r */ break; case Z80_AND: if (!(r = rd_r (&ptr))) break; wrtb (0xA0 + --r); break; case Z80_BIT: if (!rd_0_7 (&ptr)) break; rd_comma (&ptr); if (!(r = rd_r_ (&ptr))) break; wrtb (0xCB); wrtb (0x40 + (r - 1)); break; case Z80_CALL: if ((r = rd_cc (&ptr))) { wrtb (0xC4 + 8 * --r); rd_comma (&ptr); } else wrtb (0xCD); break; case Z80_CCF: wrtb (0x3F); break; case Z80_CP: if (!(r = rd_r (&ptr))) break; wrtb (0xB8 + --r); break; case Z80_CPD: wrtb (0xED); wrtb (0xA9); break; case Z80_CPDR: wrtb (0xED); wrtb (0xB9); break; case Z80_CPI: wrtb (0xED); wrtb (0xA1); break; case Z80_CPIR: wrtb (0xED); wrtb (0xB1); break; case Z80_CPL: wrtb (0x2F); break; case Z80_DAA: wrtb (0x27); break; case Z80_DEC: if (!(r = rd_r_rr (&ptr))) break; if (r < 0) { wrtb (0x05 - 8 * ++r); break; } wrtb (0x0B + 0x10 * --r); break; case Z80_DI: wrtb (0xF3); break; case Z80_DJNZ: wrtb (0x10); //rd_wrt_jr (&ptr, '\0'); break; case Z80_EI: wrtb (0xFB); break; case Z80_EX: if (!(r = rd_ex1 (&ptr))) break; switch (r) { case DE: if (!rd_hl (&ptr)) break; wrtb (0xEB); break; case AF: if (!rd_af_ (&ptr)) break; wrtb (0x08); break; default: if (!rd_hlx (&ptr)) break; wrtb (0xE3); } break; case Z80_EXX: wrtb (0xD9); break; case Z80_HALT: wrtb (0x76); break; case Z80_IM: if (!(r = rd_0_2 (&ptr))) break; wrtb (0xED); wrtb (0x46 + 8 * --r); break; case Z80_IN: if (!(r = rd_in (&ptr))) break; if (r == A) { if (!(r = rd_nnc (&ptr))) break; if (r == C) { wrtb (0xED); wrtb (0x40 + 8 * (A - 1)); break; } wrtb (0xDB); break; } if (!rd_c (&ptr)) break; wrtb (0xED); wrtb (0x40 + 8 * --r); break; case Z80_INC: if (!(r = rd_r_rr (&ptr))) break; if (r < 0) { wrtb (0x04 - 8 * ++r); break; } wrtb (0x03 + 0x10 * --r); break; case Z80_IND: wrtb (0xED); wrtb (0xAA); break; case Z80_INDR: wrtb (0xED); wrtb (0xBA); break; case Z80_INI: wrtb (0xED); wrtb (0xA2); break; case Z80_INIR: wrtb (0xED); wrtb (0xB2); break; case Z80_JP: r = rd_jp (&ptr); if (r < 0) { wrtb (0xE9); break; } if (r) { wrtb (0xC2 + 8 * --r); rd_comma (&ptr); } else wrtb (0xC3); break; case Z80_JR: r = rd_jr (&ptr); if (r) rd_comma (&ptr); wrtb (0x18 + 8 * r); break; case Z80_LD: if (!(r = rd_ld (&ptr))) break; switch (r) { case ld_BC: case ld_DE: if (!rd_a (&ptr)) break; wrtb (0x02 + 0x10 * (r == ld_DE)); break; case ld_HL: r = rd_ld_hl (&ptr); wrtb (0x70 + --r); break; case ld_NN: if (!(r = rd_ld_nn (&ptr))) break; if (r == ld_nnA || r == ld_nnHL) { wrtb (0x22 + 0x10 * (r == ld_nnA)); break; } wrtb (0xED); wrtb (0x43 + 0x10 * --r); break; case ldA: if (!(r = rd_lda (&ptr))) break; if (r == A_NN) { wrtb (0x3A); break; } if (r == A_I || r == A_R) { wrtb (0xED); wrtb (0x57 + 8 * (r == A_R)); break; } if (r < 0) { wrtb (0x0A - 0x10 * ++r); break; } wrtb (0x78 + --r); break; case ldB: case ldC: case ldD: case ldE: case ldH: case ldL: if (!(s = rd_ldbcdehla (&ptr))) break; wrtb (0x40 + 0x08 * (r - 7) + (s - 1)); break; case ldBC: case ldDE: s = rd_nn_nn (&ptr); if (s == _NN) { wrtb (0xED); wrtb (0x4B + 0x10 * (r == ldDE)); break; } wrtb (0x01 + (r == ldDE) * 0x10); break; case ldHL: r = rd_nn_nn (&ptr); wrtb (0x21 + (r == _NN) * 9); break; case ldI: case ldR: if (!rd_a (&ptr)) break; wrtb (0xED); wrtb (0x47 + 0x08 * (r == ldR)); break; case ldSP: r = rd_sp (&ptr); if (r == SPHL) { wrtb (0xF9); break; } if (r == SPNN) { wrtb (0x31); break; } wrtb (0xED); wrtb (0x7B); break; } break; case Z80_LDD: wrtb (0xED); wrtb (0xA8); break; case Z80_LDDR: wrtb (0xED); wrtb (0xB8); break; case Z80_LDI: wrtb (0xED); wrtb (0xA0); break; case Z80_LDIR: wrtb (0xED); wrtb (0xB0); break; case Z80_NEG: wrtb (0xED); wrtb (0x44); break; case Z80_NOP: wrtb (0x00); break; case Z80_OR: if (!(r = rd_r (&ptr))) break; wrtb (0xB0 + --r); break; case Z80_OTDR: wrtb (0xED); wrtb (0xBB); break; case Z80_OTIR: wrtb (0xED); wrtb (0xB3); break; case Z80_OUT: if (!(r = rd_nnc (&ptr))) break; if (r == C) { if (!(r = rd_out (&ptr))) break; wrtb (0xED); wrtb (0x41 + 8 * --r); break; } if (!rd_a (&ptr)) break; wrtb (0xD3); break; case Z80_OUTD: wrtb (0xED); wrtb (0xAB); break; case Z80_OUTI: wrtb (0xED); wrtb (0xA3); break; case Z80_POP: if (!(r = rd_stack (&ptr))) break; wrtb (0xC1 + 0x10 * --r); break; case Z80_PUSH: if (!(r = rd_stack (&ptr))) break; wrtb (0xC5 + 0x10 * --r); break; case Z80_RES: if (!rd_0_7 (&ptr)) break; rd_comma (&ptr); if (!(r = rd_r_ (&ptr))) break; wrtb (0xCB); wrtb (0x80 + --r); break; case Z80_RET: if (!(r = rd_cc (&ptr))) { wrtb (0xC9); break; } wrtb (0xC0 + 8 * --r); break; case Z80_RETI: wrtb (0xED); wrtb (0x4D); break; case Z80_RETN: wrtb (0xED); wrtb (0x45); break; case Z80_RL: if (!(r = rd_r_ (&ptr))) break; wrtb (0xCB); wrtb (0x10 + --r); break; case Z80_RLA: wrtb (0x17); break; case Z80_RLC: if (!(r = rd_r_ (&ptr))) break; wrtb (0xCB); wrtb (0x00 + --r); break; case Z80_RLCA: wrtb (0x07); break; case Z80_RLD: wrtb (0xED); wrtb (0x6F); break; case Z80_RR: if (!(r = rd_r_ (&ptr))) break; wrtb (0xCB); wrtb (0x18 + --r); break; case Z80_RRA: wrtb (0x1F); break; case Z80_RRC: if (!(r = rd_r_ (&ptr))) break; wrtb (0xCB); wrtb (0x08 + --r); break; case Z80_RRCA: wrtb (0x0F); break; case Z80_RRD: wrtb (0xED); wrtb (0x67); break; case Z80_RST: ptr = ""; break; case Z80_SBC: if (!(r = rd_a_hl (&ptr))) break; if (r == HL) { if (!(r = rd_rr_ (&ptr))) break; wrtb (0xED); wrtb (0x42 + 0x10 * --r); break; } if (!(r = rd_r (&ptr))) break; wrtb (0x98 + --r); break; case Z80_SCF: wrtb (0x37); break; case Z80_SET: if (!rd_0_7 (&ptr)) break; rd_comma (&ptr); if (!(r = rd_r_ (&ptr))) break; wrtb (0xCB); wrtb (0xC0 + --r); break; case Z80_SLA: if (!(r = rd_r_ (&ptr))) break; wrtb (0xCB); wrtb (0x20 + --r); break; case Z80_SLI: if (!(r = rd_r_ (&ptr))) break; wrtb (0xCB); wrtb (0x30 + --r); break; case Z80_SRA: if (!(r = rd_r_ (&ptr))) break; wrtb (0xCB); wrtb (0x28 + --r); break; case Z80_SRL: if (!(r = rd_r_ (&ptr))) break; wrtb (0xCB); wrtb (0x38 + --r); break; case Z80_SUB: if (!(r = rd_r (&ptr))) break; if (has_argument (&ptr)) {/* SUB A,r ? */ if (r != A) { eprintf ("parse error before: %s\n", ptr); break; } if (!(r = rd_r (&ptr))) break; } wrtb (0x90 + --r); break; case Z80_XOR: if (!(r = rd_r (&ptr))) break; wrtb (0xA8 + --r); break; case Z80_DEFB: case Z80_DB: case Z80_DEFM: case Z80_DM: ptr = delspc (ptr); while (1) { have_quote = (*ptr == '"' || *ptr == '\''); if (have_quote) { /* Read string. */ int quote = *ptr; ++ptr; while (*ptr != quote) { write_one_byte (rd_character (&ptr, NULL, 1), 0); if (*ptr == 0) { eprintf ("end of line in quoted string\n"); break; } } ++ptr; } else { /* Read expression. */ skipword (&ptr, ','); } ptr = delspc (ptr); if (*ptr == ',') { ++ptr; continue; } if (*ptr != 0) eprintf ("junk in byte definition: %s\n", ptr); break; } break; case Z80_DEFW: case Z80_DW: if (!(r = rd_word (&ptr, ','))) { eprintf ("No data for word definition\n"); break; } while (1) { ptr = delspc (ptr); if (*ptr != ',') break; ++ptr; if (!(r = rd_word (&ptr, ','))) eprintf ("Missing expression in defw\n"); } break; case Z80_DEFS: case Z80_DS: r = rd_expr (&ptr, ',', NULL, sp, 1); if (r < 0) { eprintf ("ds should have its first argument >=0" " (not -0x%x)\n", -r); break; } ptr = delspc (ptr); if (*ptr) { rd_comma (&ptr); readbyte = 0; rd_byte (&ptr, '\0'); writebyte = 0; break; } for (i = 0; i < r; i++) { write_one_byte (0, 0); } break; case Z80_END: break; case Z80_ORG: addr = rd_expr (&ptr, '\0', NULL, sp, 1) & 0xffff; break; case Z80_IF: if (rd_expr (&ptr, '\0', NULL, sp, 1)) ifcount++; else noifcount++; break; case Z80_ELSE: if (ifcount == 0) { eprintf ("else without if\n"); break; } noifcount = 1; ifcount--; break; case Z80_ENDIF: if (noifcount == 0 && ifcount == 0) { eprintf ("endif without if\n"); break; } if (noifcount) noifcount--; else ifcount--; break; case Z80_ENDM: if (stack[sp].file) eprintf ("endm outside macro definition\n"); break; case Z80_SEEK: eprintf ("seek error\n"); break; default: //eprintf ("command or comment expected (was %s)\n", ptr); return 0; } } while (0); //free (infile); return obuflen; }
int jdns_packet_resource_read_name(const jdns_packet_resource_t *a, const jdns_packet_t *p, int *at, jdns_string_t **name) { return readlabel(a->rdata, a->rdlength, p->raw_data, p->raw_size, at, name); }
int main(int argc, char *argv[]) { struct disklabel32 *lp; FILE *t; int ch, f = 0, flag, error = 0; char *name = NULL; while ((ch = getopt(argc, argv, OPTIONS)) != -1) switch (ch) { #if NUMBOOT > 0 case 'B': ++installboot; break; case 'b': xxboot = optarg; break; case 'f': forceflag = 1; slice_start_lba = strtoul(optarg, NULL, 0); break; #if NUMBOOT > 1 case 's': bootxx = optarg; break; #endif #endif case 'N': if (op != UNSPEC) usage(); op = NOWRITE; break; case 'n': disable_write = 1; break; case 'R': if (op != UNSPEC) usage(); op = RESTORE; break; case 'W': if (op != UNSPEC) usage(); op = WRITEABLE; break; case 'e': if (op != UNSPEC) usage(); op = EDIT; break; case 'r': ++rflag; break; case 'w': if (op != UNSPEC) usage(); op = WRITE; break; #ifdef DEBUG case 'd': debug++; break; #endif case '?': default: usage(); } argc -= optind; argv += optind; #if NUMBOOT > 0 if (installboot) { rflag++; if (op == UNSPEC) op = WRITEBOOT; } else { if (op == UNSPEC) op = READ; xxboot = bootxx = NULL; } #else if (op == UNSPEC) op = READ; #endif if (argc < 1) usage(); dkname = getdevpath(argv[0], 0); specname = dkname; f = open(specname, op == READ ? O_RDONLY : O_RDWR); if (f < 0) err(4, "%s", specname); switch(op) { case UNSPEC: break; case EDIT: if (argc != 1) usage(); lp = readlabel(f); error = edit(lp, f); break; case NOWRITE: flag = 0; if (ioctl(f, DIOCWLABEL, (char *)&flag) < 0) err(4, "ioctl DIOCWLABEL"); break; case READ: if (argc != 1) usage(); lp = readlabel(f); display(stdout, lp); error = checklabel(lp); if (checkoldboot(f, NULL)) warnx("Warning, old bootblocks detected, install new bootblocks & reinstall the disklabel"); break; case RESTORE: #if NUMBOOT > 0 if (installboot && argc == 3) { makelabel(argv[2], 0, &lab); argc--; /* * We only called makelabel() for its side effect * of setting the bootstrap file names. Discard * all changes to `lab' so that all values in the * final label come from the ASCII label. */ bzero((char *)&lab, sizeof(lab)); } #endif if (argc != 2) usage(); if (!(t = fopen(argv[1], "r"))) err(4, "%s", argv[1]); if (!getasciilabel(t, &lab)) exit(1); lp = makebootarea(bootarea, &lab, f); *lp = lab; error = writelabel(f, bootarea, lp); break; case WRITE: if (argc == 3) { name = argv[2]; argc--; } if (argc != 2) usage(); makelabel(argv[1], name, &lab); lp = makebootarea(bootarea, &lab, f); *lp = lab; if (checklabel(lp) == 0) error = writelabel(f, bootarea, lp); break; case WRITEABLE: flag = 1; if (ioctl(f, DIOCWLABEL, (char *)&flag) < 0) err(4, "ioctl DIOCWLABEL"); break; #if NUMBOOT > 0 case WRITEBOOT: { struct disklabel32 tlab; lp = readlabel(f); tlab = *lp; if (argc == 2) makelabel(argv[1], 0, &lab); lp = makebootarea(bootarea, &lab, f); *lp = tlab; if (checklabel(lp) == 0) error = writelabel(f, bootarea, lp); break; } #endif } exit(error); }
int main(int argc, char *argv[]) { int ch, f, error = 0; FILE *t; char *autotable = NULL; getphysmem(); while ((ch = getopt(argc, argv, "AEf:F:hRcdenp:tT:vw")) != -1) switch (ch) { case 'A': aflag = 1; break; case 'R': if (op != UNSPEC) usage(); op = RESTORE; break; case 'c': cflag = 1; break; case 'd': dflag = 1; break; case 'e': if (op != UNSPEC) usage(); op = EDIT; break; case 'E': if (op != UNSPEC) usage(); op = EDITOR; break; case 'f': fstabfile = optarg; uidflag = 0; break; case 'F': fstabfile = optarg; uidflag = 1; break; case 'h': print_unit = '*'; break; case 't': tflag = 1; break; case 'T': autotable = optarg; break; case 'w': if (op != UNSPEC) usage(); op = WRITE; break; case 'p': if (strchr("bckmgtBCKMGT", optarg[0]) == NULL || optarg[1] != '\0') { fprintf(stderr, "Valid units are bckmgt\n"); return 1; } print_unit = tolower((unsigned char)optarg[0]); break; case 'n': donothing = 1; break; case 'v': verbose = 1; break; case '?': default: usage(); } argc -= optind; argv += optind; if (op == UNSPEC) op = READ; if (argc < 1 || (fstabfile && !(op == EDITOR || op == RESTORE || aflag))) usage(); if (argv[0] == NULL) usage(); dkname = argv[0]; f = opendev(dkname, (op == READ ? O_RDONLY : O_RDWR), OPENDEV_PART, &specname); if (f < 0) err(4, "%s", specname); if (op != WRITE || aflag || dflag) { readlabel(f); if (op == EDIT || op == EDITOR || aflag) { if (pledge("stdio rpath wpath cpath disklabel proc " "exec", NULL) == -1) err(1, "pledge"); } else if (fstabfile) { if (pledge("stdio rpath wpath cpath disklabel", NULL) == -1) err(1, "pledge"); } else { if (pledge("stdio rpath wpath disklabel", NULL) == -1) err(1, "pledge"); } if (autotable != NULL) parse_autotable(autotable); parselabel(); } else if (argc == 2 || argc == 3) { /* Ensure f is a disk device before pledging. */ if (ioctl(f, DIOCGDINFO, &lab) < 0) err(4, "ioctl DIOCGDINFO"); if (pledge("stdio rpath wpath disklabel", NULL) == -1) err(1, "pledge"); makelabel(argv[1], argc == 3 ? argv[2] : NULL, &lab); } else usage(); switch (op) { case EDIT: if (argc != 1) usage(); error = edit(&lab, f); break; case EDITOR: if (argc != 1) usage(); error = editor(f); break; case READ: if (argc != 1) usage(); if (pledge("stdio", NULL) == -1) err(1, "pledge"); if (tflag) makedisktab(stdout, &lab); else display(stdout, &lab, print_unit, 1); error = checklabel(&lab); break; case RESTORE: if (argc < 2 || argc > 3) usage(); if (!(t = fopen(argv[1], "r"))) err(4, "%s", argv[1]); error = getasciilabel(t, &lab); memset(&lab.d_uid, 0, sizeof(lab.d_uid)); if (error == 0) { error = writelabel(f, &lab); if (error == 0) { if (ioctl(f, DIOCGDINFO, &lab) < 0) err(4, "ioctl DIOCGDINFO"); mpsave(&lab); } } fclose(t); break; case WRITE: error = checklabel(&lab); if (error == 0) error = writelabel(f, &lab); break; default: break; } return error; }
static int process_rrsection(jdns_list_t *dest, int count, const unsigned char *data, int size, const unsigned char **bufp) { int n; int offset, at; jdns_string_t *name = 0; const unsigned char *buf; buf = *bufp; for(n = 0; n < count; ++n) { jdns_packet_resource_t *r; offset = buf - data; at = 0; if(!readlabel(data + offset, size - offset, data, size, &at, &name)) goto error; offset += at; // need 10 more bytes if(offset + 10 > size) goto error; buf = data + offset; r = jdns_packet_resource_new(); r->qname = name; name = 0; r->qtype = net2short(&buf); r->qclass = net2short(&buf); r->ttl = net2long(&buf); // per RFC 2181, ttl is supposed to be a 31 bit number. if // the top bit of the 32 bit field is 1, then entire ttl is // to be considered 0. if(r->ttl & 0x80000000) r->ttl = 0; r->rdlength = net2short(&buf); offset = buf - data; // make sure we have enough for the rdata if(size - offset < r->rdlength) { jdns_packet_resource_delete(r); goto error; } r->rdata = jdns_copy_array(buf, r->rdlength); buf += r->rdlength; jdns_list_insert_value(dest, r, -1); jdns_packet_resource_delete(r); } *bufp = buf; return 1; error: jdns_string_delete(name); return 0; }
int main(int argc, char *argv[]) { int ch, f, error = 0; struct disklabel *lp; FILE *t; while ((ch = getopt(argc, argv, "ABEf:F:hRb:cdenp:tvw")) != -1) switch (ch) { case 'A': ++aflag; break; #if NUMBOOT > 0 case 'B': ++installboot; break; case 'b': xxboot = optarg; break; #endif case 'R': if (op != UNSPEC) usage(); op = RESTORE; break; case 'c': ++cflag; break; case 'd': ++dflag; break; case 'e': if (op != UNSPEC) usage(); op = EDIT; break; case 'E': if (op != UNSPEC) usage(); op = EDITOR; break; case 'f': fstabfile = optarg; uidflag = 0; break; case 'F': fstabfile = optarg; ++uidflag; break; case 'h': print_unit = '*'; break; case 't': ++tflag; break; case 'w': if (op != UNSPEC) usage(); op = WRITE; break; case 'p': if (strchr("bckmgtBCKMGT", optarg[0]) == NULL || optarg[1] != '\0') { fprintf(stderr, "Valid units are bckmgt\n"); exit(1); } print_unit = tolower((unsigned char)optarg[0]); break; case 'n': donothing++; break; case 'v': verbose++; break; case '?': default: usage(); } argc -= optind; argv += optind; #if NUMBOOT > 0 if (installboot) { if (op == UNSPEC) op = WRITEBOOT; } else { if (op == UNSPEC) op = READ; } #else if (op == UNSPEC) op = READ; #endif if (argc < 1 || (fstabfile && !(op == EDITOR || aflag))) usage(); dkname = argv[0]; f = opendev(dkname, (op == READ ? O_RDONLY : O_RDWR), OPENDEV_PART, &specname); if (f < 0) err(4, "%s", specname); switch (op) { case EDIT: if (argc != 1) usage(); readlabel(f); error = edit(&lab, f); break; case EDITOR: if (argc != 1) usage(); readlabel(f); error = editor(f); break; case READ: if (argc != 1) usage(); readlabel(f); if (tflag) makedisktab(stdout, &lab); else display(stdout, &lab, print_unit, 1); error = checklabel(&lab); break; case RESTORE: if (argc < 2 || argc > 3) usage(); readlabel(f); #if NUMBOOT > 0 if (installboot && argc == 3) makelabel(argv[2], NULL, &lab); #endif lp = makebootarea(bootarea, &lab); *lp = lab; if (!(t = fopen(argv[1], "r"))) err(4, "%s", argv[1]); error = getasciilabel(t, lp); bzero(lp->d_uid, sizeof(lp->d_uid)); if (error == 0) error = writelabel(f, bootarea, lp); fclose(t); break; case WRITE: if (dflag || aflag) { readlabel(f); } else if (argc < 2 || argc > 3) usage(); else makelabel(argv[1], argc == 3 ? argv[2] : NULL, &lab); lp = makebootarea(bootarea, &lab); *lp = lab; error = checklabel(&lab); if (error == 0) error = writelabel(f, bootarea, lp); break; #if NUMBOOT > 0 case WRITEBOOT: { struct disklabel tlab; readlabel(f); tlab = lab; if (argc == 2) makelabel(argv[1], NULL, &lab); lp = makebootarea(bootarea, &lab); *lp = tlab; error = checklabel(&lab); if (error == 0) error = writelabel(f, bootarea, lp); break; } #endif default: break; } exit(error); }
int main(int argc, char *argv[]) { FILE *t; int ch, error, fd; const char *name; error = 0; name = NULL; while ((ch = getopt(argc, argv, "ABb:efm:nRrw")) != -1) switch (ch) { case 'A': allfields = 1; break; case 'B': ++installboot; break; case 'b': xxboot = optarg; break; case 'f': is_file=1; break; case 'm': if (!strcmp(optarg, "i386") || !strcmp(optarg, "amd64") || !strcmp(optarg, "pc98")) { labelsoffset = 1; labeloffset = 0; bbsize = 8192; } else { errx(1, "Unsupported architecture"); } break; case 'n': disable_write = 1; break; case 'R': if (op != UNSPEC) usage(); op = RESTORE; break; case 'e': if (op != UNSPEC) usage(); op = EDIT; break; case 'r': /* * We accept and ignore -r for compatibility with * historical disklabel usage. */ break; case 'w': if (op != UNSPEC) usage(); op = WRITE; break; case '?': default: usage(); } argc -= optind; argv += optind; if (argc < 1) usage(); if (labelsoffset < 0 || labeloffset < 0) errx(1, "a -m <architecture> option must be specified"); /* Figure out the names of the thing we're working on */ if (is_file) { specname = argv[0]; } else { specname = g_device_path(argv[0]); if (specname == NULL) { warn("unable to get correct path for %s", argv[0]); return(1); } fd = open(specname, O_RDONLY); if (fd < 0) { warn("error opening %s", specname); return(1); } pname = g_providername(fd); if (pname == NULL) { warn("error getting providername for %s", specname); close(fd); return(1); } close(fd); } if (installboot && op == UNSPEC) op = WRITEBOOT; else if (op == UNSPEC) op = READ; switch(op) { case UNSPEC: break; case EDIT: if (argc != 1) usage(); readlabel(1); fixlabel(&lab); error = edit(); break; case READ: if (argc != 1) usage(); readlabel(1); display(stdout, NULL); error = checklabel(NULL); break; case RESTORE: if (argc != 2) usage(); if (!(t = fopen(argv[1], "r"))) err(4, "fopen %s", argv[1]); readlabel(0); if (!getasciilabel(t, &lab)) exit(1); error = writelabel(); break; case WRITE: if (argc == 2) name = argv[1]; else if (argc == 1) name = "auto"; else usage(); readlabel(0); makelabel(name, &lab); fixlabel(&lab); if (checklabel(NULL) == 0) error = writelabel(); break; case WRITEBOOT: readlabel(1); fixlabel(&lab); if (argc == 2) makelabel(argv[1], &lab); if (checklabel(NULL) == 0) error = writelabel(); break; } exit(error); }