示例#1
0
文件: tk_error.c 项目: mambrus/tinker
void tk_trap(int ec)
{
	int i, m;

#if defined (TK_USE_EMRGCY_CONSOLE) && (TK_USE_EMRGCY_CONSOLE != __tk_no)

	static const char trp_txt[] = "tk: TRAP";
#define MAX_LEN 80

#if (TK_USE_EMRGCY_CONSOLE == __tk_yes)
	char astr[MAX_LEN];
	console_write(trp_txt, sizeof(trp_txt));
	console_write("\n\r", 2);
	if (ec == 0) {
		console_write(trapcode_srings[0], strlen(trapcode_srings[0]));
		console_write("\n\r", 2);
	} else if (!(ec & TC_ISA_ERR)) {
		console_write(trapcode_srings[16], strlen(trapcode_srings[16]));
		_ntos(astr, ec, MAX_LEN);
		console_write(astr, strlen(astr));
		console_write("\n\r", 2);
	} else {
		for (i = 0, m = 1; i < 15; i++, m = m << 1) {
			if (ec & m) {
				console_write("Bit #", 5);
				_ntos(astr, i, MAX_LEN);
				console_write(astr, strlen(astr));
				console_write(": ", 2);
				console_write(trapcode_srings[i + 1],
					      strlen(trapcode_srings[i + 1]));
				console_write("\n\r", 2);
			}
		}
	}
#else
	char astr[MAX_LEN];
	TK_USE_EMRGCY_CONSOLE(trp_txt, sizeof(trp_txt));
	TK_USE_EMRGCY_CONSOLE("\n\r", 2);
	if (ec == 0) {
		TK_USE_EMRGCY_CONSOLE(trapcode_srings[0],
				      strlen(trapcode_srings[0]));
		TK_USE_EMRGCY_CONSOLE("\n\r", 2);
	} else if (!(ec & TC_ISA_ERR)) {
		TK_USE_EMRGCY_CONSOLE(trapcode_srings[16],
				      strlen(trapcode_srings[16]));
		_ntos(astr, ec, MAX_LEN);
		TK_USE_EMRGCY_CONSOLE(astr, strlen(astr));
		TK_USE_EMRGCY_CONSOLE("\n\r", 2);
	} else {
		for (i = 0, m = 1; i < 15; i++, m = m << 1) {
			if (ec & m) {
				TK_USE_EMRGCY_CONSOLE("Bit #", 5);
				_ntos(astr, i, MAX_LEN);
				TK_USE_EMRGCY_CONSOLE(astr, strlen(astr));
				TK_USE_EMRGCY_CONSOLE(": ", 2);
				TK_USE_EMRGCY_CONSOLE(trapcode_srings[i + 1],
						      strlen(trapcode_srings
							     [i + 1]));
				TK_USE_EMRGCY_CONSOLE("\n\r", 2);
			}
		}
	}
#endif
#else
	printk(("tk: TRAP CODE [0x%04x]: \n", ec));
	if (ec == 0) {
		printk(("%s: \n", trapcode_srings[0]));
	} else if (!(ec & TC_ISA_ERR)) {
		printk(("%s: \n", trapcode_srings[16]));
		printk(("   => Application exist with exit-code: %d \n", ec));
	} else {
		for (i = 0, m = 1; i < 15; i++, m = m << 1) {
			if (ec & m) {
				printk((" - Bit #%d: %s\n", i + 1,
					trapcode_srings[i + 1]));
			}
		}
	}

#endif

#if defined(TK_COMP_FILESYS) && TK_COMP_FILESYS
	printk(("Trying to shut system down...\n"));
	fs_fini();
	fprintf(stderr, "System terminated!\n");
#endif

#if defined(__GNUC__) && TK_HOSTED
	exit(ec);
#else
	while (1) ;
#endif
}
示例#2
0
int main(int argc, char **argv) {
	struct goh_state st;
	int opt;
	struct fs_ctx s;
	enum action action = ACTION_CRACK;
	char *key = NULL;
	const char *filenamein = "-";
	const char *filenameout = "-";
	char *text = NULL;
	struct charset cs;
	struct crack_args cka;

	cs_init(&cs);
	memset(&cka, 0, sizeof(cka));

	/* Parse the options. */
	goh_init(&st, opt_desc, ARRAY_LENGTH(opt_desc), argc, argv, 1);
	st.usagehelp = "[options]\n";

	while ((opt = goh_nextoption(&st)) >= 0) {
		switch (opt) {
		case 'i':
			filenamein = st.argval;
			break;

		case 'o':
			filenameout = st.argval;
			break;

		case 'e':
			action = ACTION_ENCRYPT;
			break;

		case 'd':
			action = ACTION_DECRYPT;
			break;

		case 'k':
			key = st.argval;
			break;

		case 'l':
			cka.klen = atoi(st.argval);
			break;

		case OPT_KASISKI_MIN_LENGTH:
			cka.ka_minlen = atoi(st.argval);
			break;

		case OPT_SHOW_KASISKI_TABLE:
			cka.ka_show_table = 1;
			break;

		case OPT_SHOW_KASISKI_LENGTH:
			cka.ka_show_length = 1;
			break;

		case 'c':
			cs_add(&cs, st.argval);
			break;

		default:
			custom_error("Unrecognized option (shouldn't happen)");
			break;
		}
	}


	/* Common command line mistake. */
	if (st.argidx != argc)
		custom_error("Useless argument %s", argv[st.argidx]);

	goh_fini(&st);

	/* Check for some invalid options combinations. */
	if (action != ACTION_CRACK && key == NULL)
		custom_error("Encryption and decryption take a --key");

	if (action == ACTION_CRACK && key != NULL)
		custom_error("--key need either --encrypt or --decrypt");

	if (cka.klen > 0 && key != NULL)
		custom_warn("Unnecessary key length option with an actual key");

	if (cka.klen > 0 && key != NULL && cka.klen != strlen(key))
		custom_error("Key length option doesn't match "
		             "the length of the key");

	if (cka.ka_minlen > 0 && action != ACTION_CRACK)
		custom_error("--kasiski-min-length can only be used in "
		             "cracking mode");

	if (cka.ka_minlen > 0 && cka.klen > 0)
		custom_warn("Useless option --kasiski-min-length when the key "
		            "length is given");

	if (cka.ka_show_table != 0 && action != ACTION_CRACK)
		custom_error("--show-kasiski-table can only be used in "
		             "cracking mode");

	if (cka.ka_show_table != 0 && cka.klen > 0)
		custom_warn("Option --show-kasiski-table ignored when a key "
		            "length is given");

	if (cka.ka_show_length != 0 && action != ACTION_CRACK)
		custom_error("--show-kasiski-length can only be used in "
		             "cracking mode");

	if (cka.ka_show_length != 0 && cka.klen > 0)
		custom_warn("Option --show-kasiski-length ignored when a key "
		            "length is given");

	/* Default charset. */
	if (cs.chars_size == 0) {
		cs_add(&cs, CHARSET_UPPER);
		cs_add(&cs, CHARSET_LOWER);
	}


	/* Start to do the job. */
	text = read_file(filenamein);
	fs_init(&s, text, &cs);
	cka.str = &s;

	if (action == ACTION_CRACK)
		crack(&cka);
	else
		simple_action(&s, key, action);

	write_file(filenameout, text);

	fs_fini(&s);
	free(text);
	cs_fini(&cs);


	return EXIT_SUCCESS;
}