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; }
int scamper_file_warts_dealias_read(scamper_file_t *sf, const warts_hdr_t *hdr, scamper_dealias_t **dealias_out) { static int (*const read[])(scamper_dealias_t *,warts_state_t *, warts_addrtable_t *,scamper_dealias_probedef_t **, uint8_t *, uint32_t *, uint32_t) = { warts_dealias_mercator_read, warts_dealias_ally_read, warts_dealias_radargun_read, warts_dealias_prefixscan_read, warts_dealias_bump_read, }; scamper_dealias_t *dealias = NULL; scamper_dealias_probedef_t *defs; scamper_dealias_probe_t *probe; warts_addrtable_t table; warts_state_t *state = scamper_file_getstate(sf); uint8_t *buf = NULL; uint32_t off = 0; uint32_t i; memset(&table, 0, sizeof(table)); if(warts_read(sf, &buf, hdr->len) != 0) { goto err; } if(buf == NULL) { *dealias_out = NULL; return 0; } if((dealias = scamper_dealias_alloc()) == NULL) { goto err; } if(warts_dealias_params_read(dealias, state, buf, &off, hdr->len) != 0) { goto err; } if(read[dealias->method-1](dealias,state,&table,&defs,buf,&off,hdr->len)!=0) goto err; if(dealias->probec == 0) goto done; if(scamper_dealias_probes_alloc(dealias, dealias->probec) != 0) { goto err; } for(i=0; i<dealias->probec; i++) { if((probe = scamper_dealias_probe_alloc()) == NULL) { goto err; } dealias->probes[i] = probe; if(warts_dealias_probe_read(probe, state, defs, &table, buf, &off, hdr->len) != 0) { goto err; } } done: assert(off == hdr->len); warts_addrtable_clean(&table); *dealias_out = dealias; free(buf); return 0; err: warts_addrtable_clean(&table); if(buf != NULL) free(buf); if(dealias != NULL) scamper_dealias_free(dealias); return -1; }
int main(int argc, char *argv[]) { uint16_t types[] = { SCAMPER_FILE_OBJ_CYCLE_START, SCAMPER_FILE_OBJ_CYCLE_STOP, SCAMPER_FILE_OBJ_PING, SCAMPER_FILE_OBJ_TRACE, SCAMPER_FILE_OBJ_DEALIAS, SCAMPER_FILE_OBJ_TBIT, }; scamper_file_t *in, *out; scamper_file_filter_t *filter; char **files = NULL; int filec; uint16_t type; void *data; int i; if((out = scamper_file_openfd(STDOUT_FILENO, NULL, 'w', "json")) == NULL) { fprintf(stderr, "could not associate stdout\n"); return -1; } filter = scamper_file_filter_alloc(types, sizeof(types)/sizeof(uint16_t)); if(filter == NULL) { fprintf(stderr, "could not allocate filter\n"); return -1; } filec = argc - 1; if(filec > 0) files = argv + 1; for(i=0; i<=filec; i++) { if(filec == 0) { if((in = scamper_file_openfd(STDIN_FILENO,"-",'r',"warts")) == NULL) { fprintf(stderr, "could not use stdin\n"); return -1; } } else if(i < filec) { if((in = scamper_file_open(files[i], 'r', NULL)) == NULL) { fprintf(stderr, "could not open %s: %s\n", files[i], strerror(errno)); return -1; } } else break; while(scamper_file_read(in, filter, &type, (void *)&data) == 0) { if(data == NULL) break; /* EOF */ if(scamper_file_write_obj(out, type, data) != 0) return -1; if(type == SCAMPER_FILE_OBJ_PING) scamper_ping_free(data); else if(type == SCAMPER_FILE_OBJ_TRACE) scamper_trace_free(data); else if(type == SCAMPER_FILE_OBJ_DEALIAS) scamper_dealias_free(data); else if(type == SCAMPER_FILE_OBJ_TBIT) scamper_tbit_free(data); } scamper_file_close(in); } scamper_file_filter_free(filter); scamper_file_close(out); return 0; }