void* binalloc(Bin **bin, ulong size, int zero) { Bin *b; uintptr p; if(size == 0) size = 1; b = *bin; if(b == nil){ b = mkbin(nil, size); if(b == nil) return nil; *bin = b; } p = b->pos; p = (p + (StructAlign - 1)) & ~(StructAlign - 1); if(p + size > b->end){ b = mkbin(b, size); if(b == nil) return nil; *bin = b; p = b->pos; } b->pos = p + size; b->v = p; if(zero) memset((void*)p, 0, size); return (void*)p; }
int main(int argc, char *argv[]) { int i; char *file_name; if (argc < 2) { print_usage(argv[0]); exit(1); } while ((i = getopt (argc, argv, "Dludbv")) != EOF) { switch (i){ case 'l': optflag |= LIST; break; case 'd': optflag |= DIAG; break; case 'v': optflag |= VIEW; break; case 'b': optflag |= BIN; break; case 'u': optflag |= VIEWUDP; break; case 'D': optflag |= VERBOSE; break; default: print_usage(argv[0]); exit(0); } } /* * snoop ファイルを open 必須 */ if(argc == 3) file_name = argv[2]; else file_name = argv[1]; if( sn_open(file_name) < 0){ perror("sn_open()"); exit(0); } /* * packet 数(count)を得る 必須 */ if (sn_count() < 0){ perror("sn_count()"); exit(0); } /* * packet のリスト(plist_head)を得る 必須 */ if ( get_plist() < 0){ perror("get_plist()"); exit(0); } /* * packet を読む 必須 */ if ( read_packet() < 0){ perror("read_packet()"); exit(0); } /* * connection list * と udp port pair list を見る オプション */ if(optflag & LIST){ if ( read_conn_list() <0 ) { perror("read_conn_list()"); exit(0); } if ( read_pair_list() <0 ) { perror("read_pair_list()"); exit(0); } } /* * 各 connection の packet の流れを表示 オプション * 追加オプションによって、packet の ack を確認等を行う */ if(optflag & (VIEW|DIAG)){ if ( view_conn() < 0 ) { perror("view_conn()"); exit(0); } } /* * 各 UDP port pair の packet の流れを表示 オプション * 追加オプションはまだ未実装 */ if(optflag & (VIEWUDP)){ if ( view_pair(optflag) < 0 ) { perror("view_pair()"); exit(0); } } /* * 各 connection の 各方向毎の TCP の data 部をファイルとして保存。 * file 名 は <src IP>.<src port>-<dest IP>.<dest port> */ if(optflag & BIN){ if ( mkbin() <0 ) { perror("mkbin()"); exit(0); } } return (0); }