Exemplo n.º 1
0
int compare_packet(int fd, const char *inbuffer, const char *mask, const int inbuflen, int curpos) {
	char buffer[8192];
	ssize_t cnt = 0;
	int err = 0;

	cnt = read_packet(fd, buffer, sizeof(buffer));


	if (cnt < 0) {
		log_errno("Error reading from socket at line %d\n", curpos);
		err = 2;
	} else {
		if (inbuflen > 0) {
			// only check data when we actually expect something
			if (cnt == inbuflen) {
				// expected length
				if (mask == NULL) {
					if (memcmp(inbuffer, buffer, inbuflen)) {
						log_error("Detected mismatch at line %d\n", curpos);
						err = 1;
					}
				} else {
					for (int i = 0; i < inbuflen; i++) {
						if ((inbuffer[i] ^ buffer[i]) & mask[i]) {
							log_error("Detected mismatch at line %d\n", curpos);
							err = 1;
						}
					}
				}
			} else {
				// length mismatch
				log_error("Detected mismatch at line %d\n", curpos);
				err = 1;
			}
		}
		// print data lines
		if (trace || err) {
			log_hexdump2(buffer, cnt, 0, "Rxd   : ");
		}
		if (err) {
			log_hexdump2(inbuffer, inbuflen, 0, "Expect: ");
		}
	}
	return err;
}
Exemplo n.º 2
0
Arquivo: log.c Projeto: fachat/XD2031
void log_hexdump(const char *p, int len, int petscii) {
	log_hexdump2(p, len, petscii, "");
}
Exemplo n.º 3
0
/**
 * returns the status of the execution
 *  0 = normal end
 *  1 = expect mismatch
 */
int execute_script(int sockfd, registry_t *script) {

	// current "pc" pointer to script line
	int curpos = 0;	
	line_t *line = NULL;
	int lineno = 0;

	int err = 0;
	ssize_t size = 0;
	line_t *errmsg = NULL;
	scriptlet_t *scr = NULL;

	while ( (err == 0) && (line = reg_get(script, curpos)) != NULL) {

		lineno = line->num;

		switch (line->cmd) {
		case CMD_COMMENT:
			if (!trace) {
				break;
			}
			// fall-through
		case CMD_MESSAGE:
			log_info("> %s\n", line->buffer);
			break;
		case CMD_ERRMSG:
			errmsg = line;
			break;
		case CMD_SEND:
			for (int i = 0; (scr = reg_get(&line->scriptlets, i)) != NULL; i++) {
				if (scr->exec != NULL) {
					scr->exec(line, scr);
				}
			}
			if (trace) {
				log_hexdump2(line->buffer, line->length, 0, "Send  : ");
			}

			size = write(sockfd, line->buffer, line->length);
			if (size < 0) {
				log_errno("Error writing to socket at line %d\n", lineno);
				err = -1;
			}
			break;
		case CMD_EXPECT:
			line->mask = mem_alloc_c(line->length, "line_mask");
			memset(line->mask, 0xff, line->length);
			for (int i = 0; (scr = reg_get(&line->scriptlets, i)) != NULL; i++) {
				if (scr->exec != NULL) {
					scr->exec(line, scr);
				}
			}
			err = compare_packet(sockfd, line->buffer, line->mask, line->length, lineno);
			mem_free(line->mask);
			line->mask = NULL;

			if (err != 0) {
				if (errmsg != NULL) {
					log_error("> %d: %s -> %d\n", lineno, errmsg->buffer, err);
				}
				return err;
			}
			break;
		case CMD_INIT:
			send_sync(sockfd);
			err = compare_packet(sockfd, line->buffer, NULL, line->length, lineno);
			if (err != 0) {
				if (errmsg != NULL) {
					log_error("> %d: %s -> %d\n", lineno, errmsg->buffer, err);
				}
				return err;
			}
			break;
		}
		curpos++;
	}

	return 0;
}
Exemplo n.º 4
0
/**
 * returns the status of the execution
 *  0 = normal end
 *  1 = expect mismatch
 */
int execute_script(int sockfd, int toolsfd, registry_t *script) {

	// current "pc" pointer to script line
	int curpos = 0;	
	line_t *line = NULL;
	int lineno = 0;

	int err = 0;
	ssize_t size = 0;
	line_t *errmsg = NULL;
	scriptlet_t *scr = NULL;

	// guaranteed to be valid; toolsfd may be not set (<0)
	int curfd = sockfd;

	while ( (err == 0) && (line = reg_get(script, curpos)) != NULL) {

		lineno = line->num;

		switch (line->cmd) {
		case CMD_COMMENT:
			if (!trace) {
				break;
			}
			// fall-through
		case CMD_MESSAGE:
			log_info("> %s\n", line->buffer);
			break;
		case CMD_ERRMSG:
			errmsg = line;
			break;
		case CMD_SEND:
			for (int i = 0; (scr = reg_get(&line->scriptlets, i)) != NULL; i++) {
				if (scr->exec != NULL) {
					scr->exec(line, scr);
				}
			}
			if (trace) {
				log_hexdump2(line->buffer, line->length, 0, "Send  : ");
			}

			size = write(curfd, line->buffer, line->length);
			if (size < 0) {
				log_errno("Error writing to socket at line %d\n", lineno);
				err = -1;
			}
			break;
		case CMD_EXPECT:
			line->mask = mem_alloc_c(line->length, "line_mask");
			memset(line->mask, 0xff, line->length);
			for (int i = 0; (scr = reg_get(&line->scriptlets, i)) != NULL; i++) {
				if (scr->exec != NULL) {
					scr->exec(line, scr);
				}
			}
			err = compare_packet(curfd, line->buffer, line->mask, line->length, lineno);
			mem_free(line->mask);
			line->mask = NULL;

			if (err != 0) {
				if (errmsg != NULL) {
					log_error("> %d: %s -> %d\n", lineno, errmsg->buffer, err);
				}
				return 1;
			}
			break;
		case CMD_INIT:
			send_sync(curfd);
			err = compare_packet(curfd, line->buffer, NULL, line->length, lineno);
			if (err != 0) {
				if (errmsg != NULL) {
					log_error("> %d: %s -> %d\n", lineno, errmsg->buffer, err);
				}
				return 1;
			}
			break;
		case CMD_CHANNEL:
			if ((!strcmp("tools", line->buffer)) && toolsfd >= 0) {
				curfd = toolsfd;
			} else
			if ((!strcmp("device", line->buffer)) && sockfd >= 0) {
				curfd = sockfd;
			} else {
				log_error("> %d: -> unknown channel name %s\n", lineno, line->buffer);
				return 1;
			}
			break;
		}
		curpos++;
	}

	return 0;
}