static int write_obj(uint16_t type, void *data) { /* write the object out */ switch(type) { case SCAMPER_FILE_OBJ_TRACELB: if(scamper_file_write_tracelb(outfile, data) != 0) return -1; scamper_tracelb_free(data); break; case SCAMPER_FILE_OBJ_TRACE: if(scamper_file_write_trace(outfile, data) != 0) return -1; scamper_trace_free(data); break; case SCAMPER_FILE_OBJ_PING: if(scamper_file_write_ping(outfile, data) != 0) return -1; scamper_ping_free(data); break; case SCAMPER_FILE_OBJ_DEALIAS: if(scamper_file_write_dealias(outfile, data) != 0) return -1; scamper_dealias_free(data); break; case SCAMPER_FILE_OBJ_CYCLE_START: if(scamper_file_write_cycle_start(outfile, data) != 0) return -1; scamper_cycle_free(data); break; case SCAMPER_FILE_OBJ_CYCLE_STOP: if(scamper_file_write_cycle_stop(outfile, data) != 0) return -1; scamper_cycle_free(data); break; default: fprintf(stderr, "unhandled data object 0x%04x\n", type); break; } return 0; }
/* * warts_tracelb_read * */ int scamper_file_warts_tracelb_read(scamper_file_t *sf, const warts_hdr_t *hdr, scamper_tracelb_t **trace_out) { warts_state_t *state = scamper_file_getstate(sf); scamper_tracelb_t *trace = NULL; uint8_t *buf = NULL; uint32_t i, off = 0; uint16_t *nlc = NULL, j; scamper_tracelb_node_t *node; warts_addrtable_t table; memset(&table, 0, sizeof(table)); if(warts_read(sf, &buf, hdr->len) != 0) { goto err; } if(buf == NULL) { *trace_out = NULL; return 0; } if((trace = scamper_tracelb_alloc()) == NULL) { goto err; } /* read the trace's parameters */ if(warts_tracelb_params_read(trace, state, &table, buf, &off, hdr->len) != 0) { goto err; } /* read the nodes */ if(trace->nodec > 0) { if(scamper_tracelb_nodes_alloc(trace, trace->nodec) != 0) { goto err; } for(i=0; i<trace->nodec; i++) { if((trace->nodes[i] = scamper_tracelb_node_alloc(NULL)) == NULL) goto err; if(warts_tracelb_node_read(trace->nodes[i], state, &table, buf, &off, hdr->len) != 0) goto err; } } /* read the links */ if(trace->linkc > 0) { if(scamper_tracelb_links_alloc(trace, trace->linkc) != 0) { goto err; } for(i=0; i<trace->linkc; i++) { if((trace->links[i] = scamper_tracelb_link_alloc()) == NULL) goto err; if(warts_tracelb_link_read(trace, trace->links[i], state, &table, buf, &off, hdr->len) != 0) goto err; } } /* don't need the buf any more */ free(buf); buf = NULL; /* * add the links to their respective nodes. */ if(trace->nodec > 0) { if((nlc = malloc_zero(sizeof(uint16_t) * trace->nodec)) == NULL) { goto err; } for(i=0; i<trace->linkc; i++) { for(j=0; j<trace->nodec; j++) { if(trace->links[i]->from == trace->nodes[j]) break; } if(j == trace->nodec) goto err; node = trace->nodes[j]; if(node->links == NULL && scamper_tracelb_node_links_alloc(node, node->linkc) != 0) goto err; if(nlc[j] == node->linkc) goto err; node->links[nlc[j]++] = trace->links[i]; } for(i=0; i<trace->nodec; i++) { if(nlc[i] != trace->nodes[i]->linkc) goto err; } free(nlc); nlc = NULL; } warts_addrtable_clean(&table); *trace_out = trace; return 0; err: warts_addrtable_clean(&table); if(buf != NULL) free(buf); if(nlc != NULL) free(nlc); if(trace != NULL) scamper_tracelb_free(trace); return -1; }