int display_status( FILE * out, struct CONN * conn, enum STATUS status ) /* display a "status banner" */ { char *client_name; char *server_name; char *s_time; char *status_string; if ( flags.notstatus ) { /* FIXME: sucks! and what if out will be a file? */ return 0; } client_name=(char *)lookup(conn->client.ip); s_time = (char *)S_calloc( 128, 1 ); if( time_ascii( s_time ) ) color( c_TIME, out,"%-16s ",s_time ); /* FIXME: check */ color( c_NUMBERING, out,"%-6d ",conn->num ); S_free ( s_time ); status_string = status2str( status ); color( _STATUS_COLOR(status), out,"%-14s",status_string ); S_free( status_string ); color( c_CLIENTNAME_STATUS, out, " %s:%s ", client_name, getportname(conn->client.port) ); color( _STATUS_COLOR(status), out,"> " ); server_name=(char *)lookup(conn->server.ip); color( c_SERVERNAME_STATUS, out,"%s", server_name ); fprintf( out,":" ); color( c_SERVICE, out,"%s", getportname(conn->server.port) ); fprintf( out, "\n" ); fflush( out ); }
int display_header( FILE * out ) /* displays a banner for the header of the packet sniffed */ { /* FIXME: sucks */ char * source = NULL; char * dest = NULL; char * s_time = (char *)S_calloc(128,1); source=(char *)lookup(ippacket->ip_src); debug("[display_header]: source(%x)",source); debug("[display_header]: source=%s",source); if( time_ascii(s_time) ) color ( c_TIME, out,"%-16s ",s_time ); color( c_CLIENTNAME_HEADER, out,"%s",source ); fprintf(out,":"); color( c_SERVICE_HEADER, out,"%s ",getportname(tcppacket->source) ); if(tcppacket->urg) color(c_FLAGS, out,"U"); if(tcppacket->ack) color(c_FLAGS, out,"A"); if(tcppacket->psh) color(c_FLAGS, out,"P"); if(tcppacket->rst) color(c_FLAGS, out,"R"); if(tcppacket->syn) color(c_FLAGS, out,"S"); if(tcppacket->fin) color(c_FLAGS, out,"F"); dest = (char *)lookup( ippacket->ip_dst ); color(c_DIRECTION, out," > "); color(c_SERVERNAME_HEADER, out,"%s",dest); fprintf(out,":"); color(c_SERVICE_HEADER, out,"%s",getportname(tcppacket->dest)); fprintf(out," (%i)\n",payload_len); fflush(out); }
int interpret_udp(int flags, struct udphdr *udp, int iplen, int fraglen) { char *data; int udplen; int sunrpc; char *pname; char buff [32]; if (fraglen < sizeof (struct udphdr)) return (fraglen); /* incomplete header */ data = (char *)udp + sizeof (struct udphdr); udplen = ntohs((ushort_t)udp->uh_ulen) - sizeof (struct udphdr); fraglen -= sizeof (struct udphdr); if (fraglen > udplen) fraglen = udplen; if (flags & F_SUM) { (void) sprintf(get_sum_line(), "UDP D=%d S=%d LEN=%d", ntohs(udp->uh_dport), ntohs(udp->uh_sport), ntohs((ushort_t)udp->uh_ulen)); } sunrpc = !reservedport(IPPROTO_UDP, ntohs(udp->uh_dport)) && !reservedport(IPPROTO_UDP, ntohs(udp->uh_sport)) && valid_rpc(data, udplen); if (flags & F_DTAIL) { show_header("UDP: ", "UDP Header", udplen); show_space(); (void) sprintf(get_line((char *)(uintptr_t)udp->uh_sport - dlc_header, 1), "Source port = %d", ntohs(udp->uh_sport)); if (sunrpc) { pname = "(Sun RPC)"; } else { pname = getportname(IPPROTO_UDP, ntohs(udp->uh_dport)); if (pname == NULL) { pname = ""; } else { (void) sprintf(buff, "(%s)", pname); pname = buff; } } (void) sprintf(get_line((char *)(uintptr_t)udp->uh_dport - dlc_header, 1), "Destination port = %d %s", ntohs(udp->uh_dport), pname); (void) sprintf(get_line((char *)(uintptr_t)udp->uh_ulen - dlc_header, 1), "Length = %d %s", ntohs((ushort_t)udp->uh_ulen), udplen > fraglen ? "(Not all data contained in this fragment)" : ""); (void) sprintf(get_line((char *)(uintptr_t)udp->uh_sum - dlc_header, 1), "Checksum = %04X %s", ntohs(udp->uh_sum), udp->uh_sum == 0 ? "(no checksum)" : ""); show_space(); } /* go to the next protocol layer */ if (!interpret_reserved(flags, IPPROTO_UDP, ntohs(udp->uh_sport), ntohs(udp->uh_dport), data, fraglen)) { if (fraglen > 0 && sunrpc) interpret_rpc(flags, data, fraglen, IPPROTO_UDP); } return (fraglen); }