Пример #1
0
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;
}
Пример #2
0
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);
}