#include #include #include #include extern const char *__progname; #include "ip.h" #include "rpc.h" #include "main.h" #include "util.h" #include "vars.h" #include "ether.h" #include "format.h" unsigned char *pkt; int pktleft; static int hbytes = 0; static int iplevel = 0; static int rpclevel = 0; extern int tcpconns; static int format = -1; extern FORMAT format_raw; extern FORMAT format_tcpdump; extern FORMAT format_etherfind; static FORMAT *formats[] = { &format_raw, &format_tcpdump, &format_etherfind, 0 }; static void *format_priv; static jmp_buf abortdump; static void set_format(const char *name) { int i; if (!strcmp(name,"list")) { for (i=0;formats[i];i++) printf("%s\n",formats[i]->name); exit(0); } for (i=0;formats[i];i++) { if (!strcmp(formats[i]->name,name)) { format = i; return; } } fprintf(stderr,"%s: unrecognized format name `%s' (request format `list' for list)\n",__progname,name); exit(1); } static void handleargs(int ac, char **av) { int skip; int errs; char *oa; errs = 0; skip = 0; #define WANTARG() do { if (++skip >= ac) goto needarg; } while (0) for (ac--,av++;ac;ac--,av++) { if (skip > 0) { skip --; continue; } oa = *av; if (!strcmp(*av,"-h")) { WANTARG(); hbytes = atoi(av[skip]); continue; } if (!strcmp(*av,"-ip")) { iplevel = 1; continue; } if (!strcmp(*av,"-rpc")) { rpclevel = 1; continue; } if (!strcmp(*av,"-conn")) { tcpconns = 1; continue; } if (!strcmp(*av,"-format")) { WANTARG(); set_format(av[skip]); continue; } fprintf(stderr,"%s: unrecognized argument %s\n",__progname,*av); errs ++; } if (0) { needarg:; fprintf(stderr,"%s: %s needs another argument\n",__progname,oa); errs ++; } #undef WANTARG if (errs) exit(1); } void dumpabort(void) { longjmp(abortdump,1); } void dump_data(void) { if (pktleft > 0) { printxu(pkt,pktleft); printf("data\n"); } } void dumpit(unsigned char *pktbuf, unsigned int pktlen) { pkt = pktbuf; pktleft = pktlen; if (setjmp(abortdump)) return; if (hbytes) { need(hbytes,"specified header"); printx(pkt,hbytes); printf("specified header\n"); consume(hbytes); } if (rpclevel) { dump_rpc_pkt(); } else if (iplevel) { dump_ip(); } else { dump_ether(); } dump_data(); ip_flush_reass(); } static void do_a_line(void) { char line[10240]; int i; if (fgets(&line[0],sizeof(line),stdin) != &line[0]) { if (format >= 0) (*formats[format]->line)(0,format_priv); exit(0); } i = strlen(&line[0]); if ((i > 0) && (line[i-1] == '\n')) line[i-1] = '\0'; if (format < 0) { for (i=0;formats[i];i++) { if ((*formats[i]->hdrtest)(&line[0],&format_priv)) { format = i; printf("[Assuming %s formatting]\n",formats[i]->name); break; } } if (format < 0) { printf("%s\n",&line[0]); return; } } (*formats[format]->line)(&line[0],format_priv); } int main(int, char **); int main(int ac, char **av) { handleargs(ac,av); if (format >= 0) (*formats[format]->force)(&format_priv); while (1) do_a_line(); }