File:  [ELWIX - Embedded LightWeight unIX -] / embedaddon / hping2 / listen.c
Revision 1.1.1.1 (vendor branch): download - view: text, annotated - select for diffs - revision graph
Tue Feb 21 22:11:37 2012 UTC (12 years, 4 months ago) by misho
Branches: hping2, MAIN
CVS tags: v2_0_0rc3p7, v2_0_0rc3p5, v2_0_0rc3p4, v2_0_0rc3p0, v2_0_0rc3, HEAD
hping2

    1: /* 
    2:  * $smu-mark$ 
    3:  * $name: listen.c$ 
    4:  * $author: Salvatore Sanfilippo <antirez@invece.org>$ 
    5:  * $copyright: Copyright (C) 1999 by Salvatore Sanfilippo$ 
    6:  * $license: This software is under GPL version 2 of license$ 
    7:  * $date: Fri Nov  5 11:55:48 MET 1999$ 
    8:  * $rev: 8$ 
    9:  */ 
   10: 
   11: #include <stdlib.h>
   12: #include <stdio.h>
   13: #include <string.h>
   14: #include <unistd.h>
   15: #include <sys/types.h>
   16: #include <sys/socket.h>
   17: #include <netinet/in.h>
   18: 
   19: #include "hping2.h" /* hping2.h includes hcmp.h */
   20: #include "globals.h"
   21: 
   22: void listenmain(void)
   23: {
   24: 	int size, ip_size;
   25: 	int stdoutFD = fileno(stdout);
   26: 	char packet[IP_MAX_SIZE+linkhdr_size];
   27: 	char *p, *ip_packet;
   28: 	struct myiphdr ip;
   29: 	__u16 id;
   30: 	static __u16 exp_id; /* expected id */
   31: 
   32: 	exp_id = 1;
   33: 
   34: 	while(1) {
   35: 		size = read_packet(packet, IP_MAX_SIZE+linkhdr_size);
   36: 		switch(size) {
   37: 		case 0:
   38: 			continue;
   39: 		case -1:
   40: 			exit(1);
   41: 		}
   42: 	
   43: 		/* Skip truncated packets */
   44: 		if (size < linkhdr_size+IPHDR_SIZE)
   45: 			continue;
   46: 		ip_packet = packet + linkhdr_size;
   47: 
   48: 		/* copy the ip header so it will be aligned */
   49: 		memcpy(&ip, ip_packet, sizeof(ip));
   50: 		id = ntohs(ip.id);
   51: 		ip_size = ntohs(ip.tot_len);
   52: 		if (size-linkhdr_size > ip_size)
   53: 			size = ip_size;
   54: 		else
   55: 			size -= linkhdr_size;
   56: 
   57: 		if ((p = memstr(ip_packet, sign, size))) {
   58: 			if (opt_verbose)
   59: 				fprintf(stderr, "packet %d received\n", id);
   60: 
   61: 			if (opt_safe) {
   62: 				if (id == exp_id)
   63: 					exp_id++;
   64: 				else {
   65: 					if (opt_verbose)
   66: 						fprintf(stderr, "packet not in sequence (id %d) received\n", id);
   67: 					send_hcmp(HCMP_RESTART, exp_id);
   68: 					if (opt_verbose)
   69: 						fprintf(stderr, "HCMP restart from %d sent\n", exp_id);
   70: 					continue; /* discard this packet */
   71: 				}
   72: 			}
   73: 
   74: 			p+=strlen(sign);
   75: 			write(stdoutFD, p, size-(p-ip_packet));
   76: 		}
   77: 	}
   78: }

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>