diff options
Diffstat (limited to 'libglouglou/libglouglou.c')
-rw-r--r-- | libglouglou/libglouglou.c | 40 |
1 files changed, 38 insertions, 2 deletions
diff --git a/libglouglou/libglouglou.c b/libglouglou/libglouglou.c index f702d2a..9f41313 100644 --- a/libglouglou/libglouglou.c +++ b/libglouglou/libglouglou.c @@ -50,6 +50,8 @@ gg_packet_props_t gg_packet_props[] = { { (PACKET_HEADER_SIZE + sizeof((struct gg_packet *)0)->pdat.data) }, [PACKET_NAME] = \ { ((PACKET_HEADER_SIZE + sizeof((struct gg_packet *)0)->pdat.name) - GG_PKTARG_MAX) }, + [PACKET_TRACE] = \ + { ((PACKET_HEADER_SIZE + sizeof((struct gg_packet *)0)->pdat.trace) - (sizeof(struct gg_packet_tracehop) * GG_PKTARG_MAX)) }, [PACKET_FORK] = \ { (PACKET_HEADER_SIZE + sizeof((struct gg_packet *)0)->pdat.fork) }, [PACKET_EXEC] = \ @@ -514,8 +516,7 @@ pkt_decode(char **buf, int *buf_len) { static struct gg_packet newpkt; struct gg_packet *pkt; - int len; - int packet_len; + int i, len, packet_len; len = *buf_len; @@ -566,6 +567,22 @@ pkt_decode(char **buf, int *buf_len) strncpy((char *)newpkt.name_fqdn, (char *)pkt->name_fqdn, newpkt.name_len); break; + case PACKET_TRACE: + newpkt.trace_addr = ntohl(pkt->trace_addr); + newpkt.trace_hopcount = pkt->trace_hopcount; + if (newpkt.trace_hopcount > GG_PKTARG_MAX) + invalid("type trace hopcount"); + packet_len = packet_len \ + + newpkt.trace_hopcount * sizeof(struct gg_packet_tracehop); + if (len < packet_len) + goto incomplete; + for (i=0; i<newpkt.trace_hopcount; i++) { + newpkt.trace_hops[i].addr = ntohl(pkt->trace_hops[i].addr); + newpkt.trace_hops[i].delay = ntohs(pkt->trace_hops[i].delay); + newpkt.trace_hops[i].loss = pkt->trace_hops[i].loss; + newpkt.trace_hops[i].asn = pkt->trace_hops[i].asn; + } + break; case PACKET_FORK: newpkt.fork_pid = ntohl(pkt->fork_pid); newpkt.fork_ppid = ntohl(pkt->fork_ppid); @@ -615,6 +632,8 @@ invalid: int pkt_encode(struct gg_packet *pkt, struct gg_packet *newpkt) { + int i; + if (pkt->type < PACKET_TYPE_MIN || pkt->type > PACKET_TYPE_MAX) invalid("type"); @@ -643,6 +662,18 @@ pkt_encode(struct gg_packet *pkt, struct gg_packet *newpkt) strncpy((char *)newpkt->name_fqdn, (char *)pkt->name_fqdn, pkt->name_len); break; + case PACKET_TRACE: + if (pkt->trace_hopcount > GG_PKTARG_MAX) + goto invalid; + newpkt->trace_addr = htonl(pkt->trace_addr); + newpkt->trace_hopcount = pkt->trace_hopcount; + for (i=0; i<newpkt->trace_hopcount; i++) { + newpkt->trace_hops[i].addr = htonl(pkt->trace_hops[i].addr); + newpkt->trace_hops[i].delay = htons(pkt->trace_hops[i].delay); + newpkt->trace_hops[i].loss = pkt->trace_hops[i].loss; + newpkt->trace_hops[i].asn = pkt->trace_hops[i].asn; + } + break; case PACKET_FORK: newpkt->fork_pid = htonl(pkt->fork_pid); newpkt->fork_ppid = htonl(pkt->fork_ppid); @@ -691,6 +722,11 @@ pkt_getsize(struct gg_packet *pkt) goto invalid; packet_len = packet_len + pkt->name_len; break; + case PACKET_TRACE: + if (pkt->trace_hopcount > GG_PKTARG_MAX) + goto invalid; + packet_len = packet_len + pkt->trace_hopcount * sizeof(struct gg_packet_tracehop); + break; case PACKET_EXEC: if (pkt->exec_cmdlen > GG_PKTARG_MAX) goto invalid; |