Exemple #1
0
/* 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;
}
Exemple #2
0
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);
}
Exemple #3
0
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);
}
Exemple #4
0
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;
}
Exemple #5
0
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;
}
Exemple #6
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);
}
Exemple #7
0
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);
}