/* type */ static PyObject * BGPElem_get_type(BGPElemObject *self, void *closure) { char buf[128] = ""; if(bgpstream_elem_type_snprintf(buf, 128, self->elem->type) >= 128) return NULL; return PyString_FromString(buf); }
char *bgpstream_record_elem_snprintf(char *buf, size_t len, const bgpstream_record_t *bs_record, const bgpstream_elem_t *elem) { assert(bs_record); assert(elem); size_t written = 0; /* < how many bytes we wanted to write */ ssize_t c = 0; /* < how many chars were written */ char *buf_p = buf; /* Record type */ if ((c = bgpstream_record_dump_type_snprintf( buf_p, B_REMAIN, bs_record->attributes.dump_type)) < 0) { return NULL; } written += c; buf_p += c; ADD_PIPE; /* Elem type */ if ((c = bgpstream_elem_type_snprintf(buf_p, B_REMAIN, elem->type)) < 0) { return NULL; } written += c; buf_p += c; ADD_PIPE; /* Record timestamp, project, collector */ c = snprintf(buf_p, B_REMAIN, "%ld|%s|%s", bs_record->attributes.record_time, bs_record->attributes.dump_project, bs_record->attributes.dump_collector); written += c; buf_p += c; ADD_PIPE; if (B_FULL) return NULL; if (bgpstream_elem_custom_snprintf(buf_p, B_REMAIN, elem, 0) == NULL) { return NULL; } written += c; buf_p += c; if (B_FULL) return NULL; return buf; }
char *bgpstream_elem_custom_snprintf(char *buf, size_t len, bgpstream_elem_t const *elem, int print_type) { assert(elem); size_t written = 0; /* < how many bytes we wanted to write */ size_t c = 0; /* < how many chars were written */ char *buf_p = buf; bgpstream_as_path_seg_t *seg; /* common fields */ /* [message_type|]peer_asn|peer_ip| */ if(print_type) { /* MESSAGE TYPE */ c = bgpstream_elem_type_snprintf(buf_p, B_REMAIN, elem->type); written += c; buf_p += c; if(B_FULL) return NULL; ADD_PIPE; } /* PEER ASN */ c = snprintf(buf_p, B_REMAIN, "%"PRIu32, elem->peer_asnumber); written += c; buf_p += c; ADD_PIPE; /* PEER IP */ if(bgpstream_addr_ntop(buf_p, B_REMAIN, &elem->peer_address) == NULL) return NULL; SEEK_STR_END; ADD_PIPE; if(B_FULL) return NULL; /* conditional fields */ switch(elem->type) { case BGPSTREAM_ELEM_TYPE_RIB: case BGPSTREAM_ELEM_TYPE_ANNOUNCEMENT: /* PREFIX */ if(bgpstream_pfx_snprintf(buf_p, B_REMAIN, (bgpstream_pfx_t*)&(elem->prefix)) == NULL) { return NULL; } SEEK_STR_END; ADD_PIPE; /* NEXT HOP */ if(bgpstream_addr_ntop(buf_p, B_REMAIN, &elem->nexthop) == NULL) { return NULL; } SEEK_STR_END; ADD_PIPE; /* AS PATH */ c = bgpstream_as_path_snprintf(buf_p, B_REMAIN, elem->aspath); written += c; buf_p += c; if(B_FULL) return NULL; ADD_PIPE; /* ORIGIN AS */ if((seg = bgpstream_as_path_get_origin_seg(elem->aspath)) != NULL) { c = bgpstream_as_path_seg_snprintf(buf_p, B_REMAIN, seg); written += c; buf_p += c; } ADD_PIPE; /* COMMUNITIES */ c = bgpstream_community_set_snprintf(buf_p, B_REMAIN, elem->communities); written += c; buf_p += c; if(B_FULL) return NULL; ADD_PIPE; /* OLD STATE (empty) */ ADD_PIPE; /* NEW STATE (empty) */ if(B_FULL) return NULL; /* END OF LINE */ break; case BGPSTREAM_ELEM_TYPE_WITHDRAWAL: /* PREFIX */ if(bgpstream_pfx_snprintf(buf_p, B_REMAIN, (bgpstream_pfx_t*)&(elem->prefix)) == NULL) { return NULL; } SEEK_STR_END; ADD_PIPE; /* NEXT HOP (empty) */ ADD_PIPE; /* AS PATH (empty) */ ADD_PIPE; /* ORIGIN AS (empty) */ ADD_PIPE; /* COMMUNITIES (empty) */ ADD_PIPE; /* OLD STATE (empty) */ ADD_PIPE; /* NEW STATE (empty) */ if(B_FULL) return NULL; /* END OF LINE */ break; case BGPSTREAM_ELEM_TYPE_PEERSTATE: /* PREFIX (empty) */ ADD_PIPE; /* NEXT HOP (empty) */ ADD_PIPE; /* AS PATH (empty) */ ADD_PIPE; /* ORIGIN AS (empty) */ ADD_PIPE; /* COMMUNITIES (empty) */ ADD_PIPE; /* OLD STATE */ c = bgpstream_elem_peerstate_snprintf(buf_p, B_REMAIN, elem->old_state); written += c; buf_p += c; if(B_FULL) return NULL; ADD_PIPE; /* NEW STATE (empty) */ c = bgpstream_elem_peerstate_snprintf(buf_p, B_REMAIN, elem->new_state); written += c; buf_p += c; if(B_FULL) return NULL; /* END OF LINE */ break; default: fprintf(stderr, "Error during elem processing\n"); return NULL; } return buf; }