/* Simple single-transacion error. */ void complain_bad_tx(struct state *state, struct block *block, enum protocol_ecode err, const struct protocol_proof *proof, const union protocol_tx *tx, const struct protocol_input_ref *refs) { struct protocol_pkt_complain_tx_invalid *pkt; switch (err) { case PROTOCOL_ECODE_TX_HIGH_VERSION: case PROTOCOL_ECODE_TX_LOW_VERSION: case PROTOCOL_ECODE_TX_TYPE_UNKNOWN: case PROTOCOL_ECODE_TX_TOO_LARGE: case PROTOCOL_ECODE_TX_BAD_SIG: break; case PROTOCOL_ECODE_TX_BAD_GATEWAY: case PROTOCOL_ECODE_TX_CROSS_SHARDS: assert(tx_type(tx) == TX_FROM_GATEWAY); break; case PROTOCOL_ECODE_TX_TOO_MANY_INPUTS: switch (tx_type(tx)) { case TX_NORMAL: case TX_TO_GATEWAY: break; case TX_FROM_GATEWAY: case TX_CLAIM: abort(); } break; default: log_broken(state->log, "Unknown complain_bad_tx error "); log_add_enum(state->log, enum protocol_ecode, err); abort(); } log_unusual(state->log, "Block %u ", le32_to_cpu(block->hdr->depth)); log_add_struct(state->log, struct protocol_double_sha, &block->sha); log_add(state->log, " invalid due to tx %u of shard %u ", proof->pos.txoff, le16_to_cpu(proof->pos.shard)); log_add(state->log, " error "); log_add_enum(state->log, enum protocol_ecode, err); /* FIXME: Would be nice to log something about invalid tx! */ pkt = tal_packet(block, struct protocol_pkt_complain_tx_invalid, PROTOCOL_PKT_COMPLAIN_TX_INVALID); pkt->error = cpu_to_le32(err); tal_packet_append_proven_tx(&pkt, proof, tx, refs); publish_complaint(state, block, pkt, NULL); }
int main(void) { struct protocol_double_sha dsha; struct protocol_net_address netaddr; int fds[2]; char *p, *mem1, *mem2, *mem3; int status; size_t maxmem = sizeof(struct log_entry) * 4 + 25 + 25 + 28 + 161; void *ctx = tal(NULL, char); struct log *log = new_log(ctx, NULL, "PREFIX", LOG_BROKEN+1, maxmem); assert(tal_parent(log) == ctx); my_time.ts.tv_sec = 1384064855; my_time.ts.tv_nsec = 500; log_debug(log, "This is a debug %s!", "message"); my_time.ts.tv_nsec++; log_info(log, "This is an info %s!", "message"); my_time.ts.tv_nsec++; log_unusual(log, "This is an unusual %s!", "message"); my_time.ts.tv_nsec++; log_broken(log, "This is a broken %s!", "message"); my_time.ts.tv_nsec++; log_add(log, "the sha is "); memset(&dsha, 0xFF, sizeof(dsha)); log_add_struct(log, struct protocol_double_sha, &dsha); log_add(log, " and the address is: "); memset(netaddr.addr, 0, 10); memset(netaddr.addr + 10, 0xFF, 2); netaddr.addr[12] = 127; netaddr.addr[13] = 0; netaddr.addr[14] = 0; netaddr.addr[15] = 1; netaddr.port = cpu_to_le16(65000); netaddr.time = time_now().ts.tv_sec - 10; log_add_struct(log, struct protocol_net_address, &netaddr); /* Make child write log, be sure it's correct. */ pipe(fds); switch (fork()) { case -1: err(1, "forking"); case 0: close(fds[0]); setenv("TZ", "UTC", 1); log_to_file(fds[1], log); tal_free(ctx); exit(0); } close(fds[1]); p = read_from(ctx, fds[0]); /* Shouldn't contain any NUL chars */ assert(strlen(p) + 1 == tal_count(p)); assert(tal_strreg(p, p, "PREFIX ([0-9])* bytes, Sun Nov 10 06:27:35 2013\n" "\\+0\\.000000500 DEBUG: This is a debug message!\n" "\\+0\\.000000501 INFO: This is an info message!\n" "\\+0\\.000000502 UNUSUAL: This is an unusual message!\n" "\\+0\\.000000503 BROKEN: This is a broken message!the sha is ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff and the address is: ::ffff:127\\.0\\.0\\.1:65000 \\(10 seconds old\\)\n\n", &mem1)); assert(atoi(mem1) < maxmem); tal_free(p); wait(&status); assert(WIFEXITED(status) && WEXITSTATUS(status) == 0); /* This cleans us out! */ log_debug(log, "Overflow!"); /* Make child write log, be sure it's correct. */ pipe(fds); switch (fork()) { case -1: err(1, "forking"); case 0: close(fds[0]); setenv("TZ", "UTC", 1); log_to_file(fds[1], log); tal_free(ctx); exit(0); } close(fds[1]); p = read_from(ctx, fds[0]); /* Shouldn't contain any NUL chars */ assert(strlen(p) + 1 == tal_count(p)); assert(tal_strreg(p, p, "PREFIX ([0-9]*) bytes, Sun Nov 10 06:27:35 2013\n" "\\.\\.\\. 4 skipped\\.\\.\\.\n" "\\+0.000000504 DEBUG: Overflow!\n" "\\+0.000000504 DEBUG: Log pruned 4 entries \\(mem ([0-9]*) -> ([0-9]*)\\)\n\n", &mem1, &mem2, &mem3)); assert(atoi(mem1) < maxmem); assert(atoi(mem2) >= maxmem); assert(atoi(mem3) < maxmem); tal_free(ctx); wait(&status); assert(WIFEXITED(status) && WEXITSTATUS(status) == 0); return 0; }