File:  [ELWIX - Embedded LightWeight unIX -] / embedaddon / hping2 / parseoptions.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: /* parseoptions.c -- options handling
    2:  * Copyright(C) 1999-2001 Salvatore Sanfilippo
    3:  * Under GPL, see the COPYING file for more information about
    4:  * the license. */
    5: 
    6: /* $Id: parseoptions.c,v 1.1.1.1 2012/02/21 22:11:37 misho Exp $ */
    7: 
    8: #include <unistd.h>
    9: #include <stdio.h>
   10: #include <stdlib.h>
   11: #include <string.h>
   12: #include <sys/time.h>
   13: #include <ctype.h>
   14: #include <sys/socket.h>
   15: #include <netinet/in.h>
   16: #include <arpa/inet.h>
   17: #include "antigetopt.h"
   18: 
   19: #include "hping2.h"
   20: #include "globals.h"
   21: 
   22: enum {	OPT_COUNT, OPT_INTERVAL, OPT_NUMERIC, OPT_QUIET, OPT_INTERFACE,
   23: 	OPT_HELP, OPT_VERSION, OPT_DESTPORT, OPT_BASEPORT, OPT_TTL, OPT_ID,
   24: 	OPT_WIN, OPT_SPOOF, OPT_FIN, OPT_SYN, OPT_RST, OPT_PUSH, OPT_ACK,
   25: 	OPT_URG, OPT_XMAS, OPT_YMAS, OPT_FRAG, OPT_MOREFRAG, OPT_DONTFRAG,
   26: 	OPT_FRAGOFF, OPT_TCPOFF, OPT_REL, OPT_DATA, OPT_RAWIP, OPT_ICMP,
   27: 	OPT_UDP, OPT_BIND, OPT_UNBIND, OPT_DEBUG, OPT_VERBOSE, OPT_WINID,
   28: 	OPT_KEEP, OPT_FILE, OPT_DUMP, OPT_PRINT, OPT_SIGN, OPT_LISTEN,
   29: 	OPT_SAFE, OPT_TRACEROUTE, OPT_TOS, OPT_MTU, OPT_SEQNUM, OPT_BADCKSUM,
   30: 	OPT_SETSEQ, OPT_SETACK, OPT_ICMPTYPE, OPT_ICMPCODE, OPT_END,
   31: 	OPT_RROUTE, OPT_IPPROTO, OPT_ICMP_IPVER, OPT_ICMP_IPHLEN,
   32: 	OPT_ICMP_IPLEN, OPT_ICMP_IPID, OPT_ICMP_IPPROTO, OPT_ICMP_CKSUM,
   33: 	OPT_ICMP_TS, OPT_ICMP_ADDR, OPT_TCPEXITCODE, OPT_FAST, OPT_TR_KEEP_TTL,
   34: 	OPT_TCP_TIMESTAMP, OPT_TR_STOP, OPT_TR_NO_RTT, OPT_ICMP_HELP,
   35: 	OPT_RAND_DEST, OPT_RAND_SOURCE, OPT_LSRR, OPT_SSRR, OPT_ROUTE_HELP,
   36: 	OPT_ICMP_IPSRC, OPT_ICMP_IPDST, OPT_ICMP_SRCPORT, OPT_ICMP_DSTPORT,
   37: 	OPT_ICMP_GW, OPT_FORCE_ICMP, OPT_APD_SEND, OPT_SCAN, OPT_FASTER };
   38: 
   39: static struct ago_optlist hping_optlist[] = {
   40: 	{ 'c',	"count",	OPT_COUNT,		AGO_NEEDARG },
   41: 	{ 'i',	"interval",	OPT_INTERVAL,		AGO_NEEDARG|AGO_EXCEPT0 },
   42: 	{ 'n',	"numeric",	OPT_NUMERIC,		AGO_NOARG },
   43: 	{ 'q',	"quiet",	OPT_QUIET,		AGO_NOARG },
   44: 	{ 'I',	"interface",	OPT_INTERFACE,		AGO_NEEDARG },
   45: 	{ 'h',	"help",		OPT_HELP,		AGO_NOARG },
   46: 	{ 'v',	"version",	OPT_VERSION,		AGO_NOARG },
   47: 	{ 'p',	"destport",	OPT_DESTPORT,		AGO_NEEDARG|AGO_EXCEPT0 },
   48: 	{ 's',	"baseport",	OPT_BASEPORT,		AGO_NEEDARG|AGO_EXCEPT0 },
   49: 	{ 't',	"ttl",		OPT_TTL,		AGO_NEEDARG },
   50: 	{ 'N',	"id",		OPT_ID,			AGO_NEEDARG|AGO_EXCEPT0 },
   51: 	{ 'w',	"win",		OPT_WIN,		AGO_NEEDARG|AGO_EXCEPT0 },
   52: 	{ 'a',	"spoof",	OPT_SPOOF,		AGO_NEEDARG|AGO_EXCEPT0 },
   53: 	{ 'F',	"fin",		OPT_FIN,		AGO_NOARG|AGO_EXCEPT0 },
   54: 	{ 'S',	"syn",		OPT_SYN,		AGO_NOARG|AGO_EXCEPT0 },
   55: 	{ 'R',	"rst",		OPT_RST,		AGO_NOARG|AGO_EXCEPT0 },
   56: 	{ 'P',	"push",		OPT_PUSH,		AGO_NOARG|AGO_EXCEPT0 },
   57: 	{ 'A',	"ack",		OPT_ACK,		AGO_NOARG|AGO_EXCEPT0 },
   58: 	{ 'U',	"urg",		OPT_URG,		AGO_NOARG|AGO_EXCEPT0 },
   59: 	{ 'X',	"xmas",		OPT_XMAS,		AGO_NOARG|AGO_EXCEPT0 },
   60: 	{ 'Y',	"ymas",		OPT_YMAS,		AGO_NOARG|AGO_EXCEPT0 },
   61: 	{ 'f',	"frag",		OPT_FRAG,		AGO_NOARG|AGO_EXCEPT0 },
   62: 	{ 'x',	"morefrag",	OPT_MOREFRAG,		AGO_NOARG|AGO_EXCEPT0 },
   63: 	{ 'y',	"dontfrag",	OPT_DONTFRAG,		AGO_NOARG },
   64: 	{ 'g',	"fragoff",	OPT_FRAGOFF,		AGO_NEEDARG|AGO_EXCEPT0 },
   65: 	{ 'O',	"tcpoff",	OPT_TCPOFF,		AGO_NEEDARG|AGO_EXCEPT0 },
   66: 	{ 'r',	"rel",		OPT_REL,		AGO_NOARG },
   67: 	{ 'd',	"data",		OPT_DATA,		AGO_NEEDARG|AGO_EXCEPT0 },
   68: 	{ '0',	"rawip",	OPT_RAWIP,		AGO_NOARG|AGO_EXCEPT0 },
   69: 	{ '1',	"icmp",		OPT_ICMP,		AGO_NOARG },
   70: 	{ '2',	"udp",		OPT_UDP,		AGO_NOARG },
   71: 	{ '8',	"scan",		OPT_SCAN,		AGO_NEEDARG },
   72: 	{ 'z',	"bind",		OPT_BIND,		AGO_NOARG },
   73: 	{ 'Z',	"unbind",	OPT_UNBIND,		AGO_NOARG },
   74: 	{ 'D',	"debug",	OPT_DEBUG,		AGO_NOARG },
   75: 	{ 'V',	"verbose",	OPT_VERBOSE,		AGO_NOARG },
   76: 	{ 'W',	"winid",	OPT_WINID,		AGO_NOARG },
   77: 	{ 'k',	"keep",		OPT_KEEP,		AGO_NOARG },
   78: 	{ 'E',	"file",		OPT_FILE,		AGO_NEEDARG|AGO_EXCEPT0 },
   79: 	{ 'j',	"dump",		OPT_DUMP,		AGO_NOARG|AGO_EXCEPT0 },
   80: 	{ 'J',	"print",	OPT_PRINT,		AGO_NOARG|AGO_EXCEPT0 },
   81: 	{ 'e',	"sign",		OPT_SIGN,		AGO_NEEDARG|AGO_EXCEPT0 },
   82: 	{ '9',	"listen",	OPT_LISTEN,		AGO_NEEDARG|AGO_EXCEPT0 },
   83: 	{ 'B',	"safe",		OPT_SAFE,		AGO_NOARG|AGO_EXCEPT0 },
   84: 	{ 'T',	"traceroute",	OPT_TRACEROUTE,		AGO_NOARG },
   85: 	{ 'o',	"tos",		OPT_TOS,		AGO_NEEDARG },
   86: 	{ 'm',	"mtu",		OPT_MTU,		AGO_NEEDARG|AGO_EXCEPT0 },
   87: 	{ 'Q',	"seqnum",	OPT_SEQNUM,		AGO_NOARG|AGO_EXCEPT0 },
   88: 	{ 'b',	"badcksum",	OPT_BADCKSUM,		AGO_NOARG|AGO_EXCEPT0 },
   89: 	{ 'M',	"setseq",	OPT_SETSEQ,		AGO_NEEDARG|AGO_EXCEPT0 },
   90: 	{ 'L',	"setack",	OPT_SETACK,		AGO_NEEDARG|AGO_EXCEPT0 },
   91: 	{ 'C',	"icmptype",	OPT_ICMPTYPE,		AGO_NEEDARG|AGO_EXCEPT0 },
   92: 	{ 'K',	"icmpcode",	OPT_ICMPCODE,		AGO_NEEDARG|AGO_EXCEPT0 },
   93: 	{ 'u',	"end",		OPT_END,		AGO_NOARG|AGO_EXCEPT0 },
   94: 	{ 'G',	"rroute",	OPT_RROUTE,		AGO_NOARG },
   95: 	{ 'H',	"ipproto",	OPT_IPPROTO,		AGO_NEEDARG|AGO_EXCEPT0 },
   96: 	{ '\0',	"icmp-help",	OPT_ICMP_HELP,		AGO_NOARG },
   97: 	{ '\0',	"icmp-ipver",	OPT_ICMP_IPVER,		AGO_NEEDARG|AGO_EXCEPT0 },
   98: 	{ '\0',	"icmp-iphlen",	OPT_ICMP_IPHLEN, 	AGO_NEEDARG|AGO_EXCEPT0 },
   99: 	{ '\0', "icmp-iplen",	OPT_ICMP_IPLEN,	 	AGO_NEEDARG|AGO_EXCEPT0 },
  100: 	{ '\0',	"icmp-ipid",	OPT_ICMP_IPID,	 	AGO_NEEDARG|AGO_EXCEPT0 },
  101: 	{ '\0',	"icmp-ipproto",	OPT_ICMP_IPPROTO, 	AGO_NEEDARG|AGO_EXCEPT0 },
  102: 	{ '\0', "icmp-cksum",	OPT_ICMP_CKSUM,   	AGO_NEEDARG|AGO_EXCEPT0 },
  103: 	{ '\0',	"icmp-ts",	OPT_ICMP_TS,		AGO_NOARG },
  104: 	{ '\0', "icmp-addr",	OPT_ICMP_ADDR,		AGO_NOARG },
  105: 	{ '\0', "tcpexitcode",	OPT_TCPEXITCODE,	AGO_NOARG },
  106: 	{ '\0',	"fast",		OPT_FAST,		AGO_NOARG|AGO_EXCEPT0 },
  107: 	{ '\0',	"faster",	OPT_FASTER,		AGO_NOARG|AGO_EXCEPT0 },
  108: 	{ '\0',	"tr-keep-ttl",	OPT_TR_KEEP_TTL,	AGO_NOARG },
  109: 	{ '\0', "tcp-timestamp",OPT_TCP_TIMESTAMP,	AGO_NOARG },
  110: 	{ '\0', "tr-stop",	OPT_TR_STOP,		AGO_NOARG },
  111: 	{ '\0',	"tr-no-rtt",	OPT_TR_NO_RTT,		AGO_NOARG },
  112: 	{ '\0', "rand-dest",	OPT_RAND_DEST,		AGO_NOARG },
  113: 	{ '\0', "rand-source",	OPT_RAND_SOURCE,	AGO_NOARG },
  114: 	{ '\0', "lsrr",		OPT_LSRR, 		AGO_NEEDARG|AGO_EXCEPT0 },
  115: 	{ '\0', "ssrr",		OPT_SSRR, 		AGO_NEEDARG|AGO_EXCEPT0 },
  116: 	{ '\0', "route-help",   OPT_ROUTE_HELP,		AGO_NOARG },
  117: 	{ '\0', "apd-send",	OPT_APD_SEND,		AGO_NEEDARG },
  118: 	{ '\0', "icmp-ipsrc",	OPT_ICMP_IPSRC,		AGO_NEEDARG|AGO_EXCEPT0 },
  119: 	{ '\0', "icmp-ipdst",	OPT_ICMP_IPDST,		AGO_NEEDARG|AGO_EXCEPT0 },
  120: 	{ '\0', "icmp-gw",	OPT_ICMP_GW,		AGO_NEEDARG|AGO_EXCEPT0 },
  121: 	{ '\0', "icmp-srcport", OPT_ICMP_SRCPORT,	AGO_NEEDARG|AGO_EXCEPT0 },
  122: 	{ '\0', "icmp-dstport", OPT_ICMP_DSTPORT,	AGO_NEEDARG|AGO_EXCEPT0 },
  123: 	{ '\0', "force-icmp",	OPT_FORCE_ICMP,		AGO_NOARG },
  124: 	AGO_LIST_TERM
  125: };
  126: 
  127: /* The following var is turned to 1 if the -i option is used.
  128:  * This allows to assign a different delay default value if
  129:  * the scanning mode is selected. */
  130: static int delay_changed = 0;
  131: 
  132: static int suidtester(void)
  133: {
  134: 	return (getuid() != geteuid());
  135: }
  136: 
  137: void fail_parse_route(void)
  138: {
  139:     fprintf(stderr, "RECTUM\n");
  140:     exit(1);
  141: }
  142: 
  143: void parse_route(unsigned char *route, unsigned int *route_len, char *str)
  144: {
  145:     struct in_addr ip;
  146:     unsigned int i = 0;
  147:     unsigned int j;
  148:     unsigned int n = 0;
  149:     unsigned int route_ptr = 256;
  150:     char c;
  151: 
  152:     route += 3;
  153:     while (str[i] != '\0')
  154:     {
  155:         for (j = i; isalnum(str[j]) || str[j] == '.'; j++);
  156:         switch(c = str[j])
  157:         {
  158:             case '\0':
  159:             case '/':
  160:                 if (n >= 62)
  161:                 {
  162:                     fprintf(stderr, "too long route\n");
  163:                     fail_parse_route();
  164:                 }
  165:                 str[j] = '\0';
  166:                 if (inet_aton(str+i, &ip))
  167:                 {
  168:                     memcpy(route+4*n, &ip.s_addr, 4);
  169:                     n++;
  170:                     if (c == '/')
  171:                         str[j++] = '/';
  172:                     break;
  173:                 }
  174:                 fprintf(stderr, "invalid IP adress in route\n");
  175:                 fail_parse_route();
  176:             case ':':
  177:                 if ((!i) && j && j < 4)
  178:                 {
  179:                     sscanf(str, "%u:%n", &route_ptr, &i);
  180:                     if (i == ++j)
  181:                     {
  182:                         if (route_ptr < 256)
  183:                             break;
  184:                     }
  185:                 }
  186:             default:
  187:                 fail_parse_route();
  188:         }
  189:         i = j;
  190:     }
  191:     if (route_ptr == 256)
  192:         route[-1] = (unsigned char) ( n ? 8 : 4 );
  193:     else
  194:         route[-1] = (unsigned char) route_ptr;
  195:     *route_len = 4*n + 3;
  196:     route[-2] = (unsigned char) *route_len;
  197: }
  198: 
  199: int parse_options(int argc, char **argv)
  200: {
  201: 	int src_ttl_set = 0;
  202: 	int targethost_set = 0;
  203: 	int o;
  204: 
  205: 	if (argc < 2)
  206: 		return -1;
  207: 
  208: 	ago_set_exception(0, suidtester, "Option disabled when setuid");
  209: 
  210: 	while ((o = antigetopt(argc, argv, hping_optlist)) != AGO_EOF) {
  211: 		switch(o) {
  212: 		case AGO_UNKNOWN:
  213: 		case AGO_REQARG:
  214: 		case AGO_AMBIG:
  215: 			ago_gnu_error("hping", o);
  216: 			fprintf(stderr, "Try hping --help\n");
  217: 			exit(1);
  218: 		case AGO_ALONE:
  219: 			if (targethost_set == 1) {
  220: 				fprintf(stderr, "hping: you must specify only "
  221: 						"one target host at a time\n");
  222: 				exit(1);
  223: 			} else {
  224: 				strlcpy(targetname, ago_optarg, 1024);
  225: 				targethost_set = 1;
  226: 			}
  227: 			break;
  228: 		case OPT_COUNT:
  229: 			count = strtol(ago_optarg, NULL, 0);
  230: 			break;
  231: 		case OPT_INTERVAL:
  232: 			delay_changed = 1;
  233: 			if (*ago_optarg == 'u') {
  234: 				opt_waitinusec = TRUE;
  235: 				usec_delay.it_value.tv_sec =
  236: 				usec_delay.it_interval.tv_sec = 0;
  237: 				usec_delay.it_value.tv_usec = 
  238: 				usec_delay.it_interval.tv_usec =
  239: 					atol(ago_optarg+1);
  240: 			}
  241: 			else
  242: 				sending_wait = strtol(ago_optarg, NULL, 0);
  243: 			break;
  244: 		case OPT_NUMERIC:
  245: 			opt_numeric = TRUE;
  246: 			break;
  247: 		case OPT_QUIET:
  248: 			opt_quiet = TRUE;
  249: 			break;
  250: 		case OPT_INTERFACE:
  251: 			strlcpy (ifname, ago_optarg, 1024);
  252: 			break;
  253: 		case OPT_HELP:
  254: 			show_usage();
  255: 			break;
  256: 		case OPT_VERSION:
  257: 			show_version();
  258: 			break;
  259: 		case OPT_DESTPORT:
  260: 			if (*ago_optarg == '+')
  261: 			{
  262: 				opt_incdport = TRUE;
  263: 				ago_optarg++;
  264: 			}
  265: 			if (*ago_optarg == '+')
  266: 			{
  267: 				opt_force_incdport = TRUE;
  268: 				ago_optarg++;
  269: 			}
  270: 			base_dst_port = dst_port = strtol(ago_optarg, NULL, 0);
  271: 			break;
  272: 		case OPT_BASEPORT:
  273: 			initsport = strtol(ago_optarg, NULL, 0);
  274: 			break;
  275: 		case OPT_TTL:
  276: 			src_ttl = strtol(ago_optarg, NULL, 0);
  277: 			src_ttl_set = 1;
  278: 			break;
  279: 		case OPT_ID:
  280: 			src_id = strtol(ago_optarg, NULL, 0);
  281: 			break;
  282: 		case OPT_WIN:
  283: 			src_winsize = strtol(ago_optarg, NULL, 0);
  284: 			break;
  285: 		case OPT_SPOOF:
  286: 			strlcpy (spoofaddr, ago_optarg, 1024);
  287: 			break;
  288: 		case OPT_FIN:
  289: 			tcp_th_flags |= TH_FIN;
  290: 			break;
  291: 		case OPT_SYN:
  292: 			tcp_th_flags |= TH_SYN;
  293: 			break;
  294: 		case OPT_RST:
  295: 			tcp_th_flags |= TH_RST;
  296: 			break;
  297: 		case OPT_PUSH:
  298: 			tcp_th_flags |= TH_PUSH;
  299: 			break;
  300: 		case OPT_ACK:
  301: 			tcp_th_flags |= TH_ACK;
  302: 			break;
  303: 		case OPT_URG:
  304: 			tcp_th_flags |= TH_URG;
  305: 			break;
  306: 		case OPT_XMAS:
  307: 			tcp_th_flags |= TH_X;
  308: 			break;
  309: 		case OPT_YMAS:
  310: 			tcp_th_flags |= TH_Y;
  311: 			break;
  312: 		case OPT_FRAG:
  313: 			opt_fragment = TRUE;
  314: 			break;
  315: 		case OPT_MOREFRAG:
  316: 			opt_mf = TRUE;
  317: 			break;
  318: 		case OPT_DONTFRAG:
  319: 			opt_df = TRUE;
  320: 			break;
  321: 		case OPT_FRAGOFF:
  322: 			ip_frag_offset = strtol(ago_optarg, NULL, 0);
  323: 			break;
  324: 		case OPT_TCPOFF:
  325: 			src_thoff = strtol(ago_optarg, NULL, 0);
  326: 			break;
  327: 		case OPT_REL:
  328: 			opt_relid = TRUE;
  329: 			break;
  330: 		case OPT_DATA:
  331: 			data_size = strtol(ago_optarg, NULL, 0);
  332: 			break;
  333: 		case OPT_RAWIP:
  334: 			opt_rawipmode = TRUE;
  335: 			break;
  336: 		case OPT_ICMP:
  337: 			opt_icmpmode = TRUE;
  338: 			break;
  339: 		case OPT_ICMP_TS:
  340: 			opt_icmpmode = TRUE;
  341: 			opt_icmptype = 13;
  342: 			break;
  343: 		case OPT_ICMP_ADDR:
  344: 			opt_icmpmode = TRUE;
  345: 			opt_icmptype = 17;
  346: 			break;
  347: 		case OPT_UDP:
  348: 			opt_udpmode = TRUE;
  349: 			break;
  350: 		case OPT_SCAN:
  351: 			opt_scanmode = TRUE;
  352: 			opt_scanports = strdup(ago_optarg);
  353: 			break;
  354: 		case OPT_LISTEN:
  355: 			opt_listenmode = TRUE;
  356: 			strlcpy(sign, ago_optarg, 1024);
  357: 			signlen = strlen(ago_optarg);
  358: 			break;
  359: 		case OPT_IPPROTO:
  360: 			raw_ip_protocol = strtol(ago_optarg, NULL, 0);
  361: 			break;
  362: 		case OPT_ICMPTYPE:
  363: 			opt_icmpmode= TRUE;
  364: 			opt_icmptype = strtol(ago_optarg, NULL, 0);
  365: 			break;
  366: 		case OPT_ICMPCODE:
  367: 			opt_icmpmode= TRUE;
  368: 			opt_icmpcode = strtol(ago_optarg, NULL, 0);
  369: 			break;
  370: 		case OPT_BIND:
  371: 			ctrlzbind = BIND_TTL;
  372: 			break;
  373: 		case OPT_UNBIND:
  374: 			ctrlzbind = BIND_NONE;
  375: 			break;
  376: 		case OPT_DEBUG:
  377: 			opt_debug = TRUE;
  378: 			break;
  379: 		case OPT_VERBOSE:
  380: 			opt_verbose = TRUE;
  381: 			break;
  382: 		case OPT_WINID:
  383: 			opt_winid_order = TRUE;
  384: 			break;
  385: 		case OPT_KEEP:
  386: 			opt_keepstill = TRUE;
  387: 			break;
  388: 		case OPT_FILE:
  389: 			opt_datafromfile = TRUE;
  390: 			strlcpy(datafilename, ago_optarg, 1024);
  391: 			break;
  392: 		case OPT_DUMP:
  393: 			opt_hexdump = TRUE;
  394: 			break;
  395: 		case OPT_PRINT:
  396: 			opt_contdump = TRUE;
  397: 			break;
  398: 		case OPT_SIGN:
  399: 			opt_sign = TRUE;
  400: 			strlcpy(sign, ago_optarg, 1024);
  401: 			signlen = strlen(ago_optarg);
  402: 			break;
  403: 		case OPT_SAFE:
  404: 			opt_safe = TRUE;
  405: 			break;
  406: 		case OPT_END:
  407: 			opt_end = TRUE;
  408: 			break;
  409: 		case OPT_TRACEROUTE:
  410: 			opt_traceroute = TRUE;
  411: 			break;
  412: 		case OPT_TOS:
  413: 			if (!strcmp(ago_optarg, "help"))
  414: 				tos_help();
  415: 			else
  416: 			{
  417: 				static unsigned int tos_tmp = 0;
  418: 
  419: 				sscanf(ago_optarg, "%2x", &tos_tmp);
  420: 				ip_tos |= tos_tmp; /* OR tos */
  421: 			}
  422: 			break;
  423: 		case OPT_MTU:
  424: 			virtual_mtu = strtol(ago_optarg, NULL, 0);
  425: 			opt_fragment = TRUE;
  426: 			if(virtual_mtu > 65535) {
  427: 				virtual_mtu = 65535;
  428: 				printf("Specified MTU too high, "
  429: 					"fixed to 65535.\n");
  430: 			}
  431: 			break;
  432: 		case OPT_SEQNUM:
  433: 			opt_seqnum = TRUE;
  434: 			break;
  435: 		case OPT_BADCKSUM:
  436: 			opt_badcksum = TRUE;
  437: 			break;
  438: 		case OPT_SETSEQ:
  439: 			set_seqnum = TRUE;
  440: 			tcp_seqnum = strtoul(ago_optarg, NULL, 0);
  441: 			break;
  442: 		case OPT_SETACK:
  443: 			set_ack = TRUE;
  444: 			tcp_ack = strtoul(ago_optarg, NULL, 0);
  445: 			break;
  446: 		case OPT_RROUTE:
  447: 			opt_rroute = TRUE;
  448: 			break;
  449: 		case OPT_ICMP_HELP:
  450: 			icmp_help();	/* ICMP options help */
  451: 			break;
  452: 		case OPT_ICMP_IPVER:
  453: 			icmp_ip_version = strtol(ago_optarg, NULL, 0);
  454: 			break;
  455: 		case OPT_ICMP_IPHLEN:
  456: 			icmp_ip_ihl = strtol(ago_optarg, NULL, 0);
  457: 			break;
  458: 		case OPT_ICMP_IPLEN:
  459: 			icmp_ip_tot_len = strtol(ago_optarg, NULL, 0);
  460: 			break;
  461: 		case OPT_ICMP_IPID:
  462: 			icmp_ip_id = strtol(ago_optarg, NULL, 0);
  463: 			break;
  464: 		case OPT_ICMP_IPPROTO:
  465: 			icmp_ip_protocol = strtol(ago_optarg, NULL, 0);
  466: 			break;
  467: 		case OPT_ICMP_IPSRC:
  468: 			strlcpy (icmp_ip_srcip, ago_optarg, 1024);
  469: 			break;
  470: 		case OPT_ICMP_IPDST:
  471: 			strlcpy (icmp_ip_dstip, ago_optarg, 1024);
  472: 			break;
  473: 		case OPT_ICMP_GW:
  474: 			strlcpy (icmp_gwip, ago_optarg, 1024);
  475: 			break;
  476: 		case OPT_ICMP_SRCPORT:
  477: 			icmp_ip_srcport = strtol(ago_optarg, NULL, 0);
  478: 			break;
  479: 		case OPT_ICMP_DSTPORT:
  480: 			icmp_ip_dstport = strtol(ago_optarg, NULL, 0);
  481: 			break;
  482: 		case OPT_FORCE_ICMP:
  483: 			opt_force_icmp = TRUE;
  484: 			break;
  485: 		case OPT_ICMP_CKSUM:
  486: 			icmp_cksum = strtol(ago_optarg, NULL, 0);
  487: 			break;
  488: 		case OPT_TCPEXITCODE:
  489: 			opt_tcpexitcode = TRUE;
  490: 			break;
  491: 		case OPT_FAST:
  492: 			delay_changed = 1;
  493: 			opt_waitinusec = TRUE;
  494: 			usec_delay.it_value.tv_sec =
  495: 			usec_delay.it_interval.tv_sec = 0;
  496: 			usec_delay.it_value.tv_usec = 
  497: 			usec_delay.it_interval.tv_usec = 100000;
  498: 			break;
  499: 		case OPT_FASTER:
  500: 			delay_changed = 1;
  501: 			opt_waitinusec = TRUE;
  502: 			usec_delay.it_value.tv_sec =
  503: 			usec_delay.it_interval.tv_sec = 0;
  504: 			usec_delay.it_value.tv_usec = 
  505: 			usec_delay.it_interval.tv_usec = 1;
  506: 		case OPT_TR_KEEP_TTL:
  507: 			opt_tr_keep_ttl = TRUE;
  508: 			break;
  509: 		case OPT_TCP_TIMESTAMP:
  510: 			opt_tcp_timestamp = TRUE;
  511: 			break;
  512: 		case OPT_TR_STOP:
  513: 			opt_tr_stop = TRUE;
  514: 			break;
  515: 		case OPT_TR_NO_RTT:
  516: 			opt_tr_no_rtt = TRUE;
  517: 			break;
  518: 		case OPT_RAND_DEST:
  519: 			opt_rand_dest = TRUE;
  520: 			break;
  521: 		case OPT_RAND_SOURCE:
  522: 			opt_rand_source = TRUE;
  523: 			break;
  524: 		case OPT_LSRR:
  525: 			opt_lsrr = TRUE;
  526: 			parse_route(lsr, &lsr_length, ago_optarg);
  527: 			if (lsr[0])
  528: 				printf("Warning: erasing previously given "
  529: 						"loose source route");
  530: 			lsr[0] = 131;
  531: 			break;
  532: 		case OPT_SSRR:
  533: 			opt_ssrr = TRUE;
  534: 			parse_route(ssr, &ssr_length, ago_optarg);
  535: 			if (ssr[0])
  536: 				printf("Warning: erasing previously given "
  537: 						"strong source route");
  538: 			ssr[0] = 137;
  539: 			break;
  540: 		case OPT_ROUTE_HELP:
  541: 			route_help();
  542: 			break;
  543: 		case OPT_APD_SEND:
  544: 			hping_ars_send(ago_optarg);
  545: 			break;
  546: 		}
  547: 	}
  548: 
  549: 	/* missing target host? */
  550: 	if (targethost_set == 0 && opt_listenmode && opt_safe)
  551: 	{
  552: 		printf(
  553: 		"you must specify a target host if you require safe protocol\n"
  554: 		"because hping needs a target for HCMP packets\n");
  555: 		exit(1);
  556: 	}
  557: 
  558: 	if (targethost_set == 0 && !opt_listenmode) return -1;
  559: 
  560: 	if (opt_numeric == TRUE) opt_gethost = FALSE;
  561: 
  562: 	/* some error condition */
  563: 	if (data_size+IPHDR_SIZE+TCPHDR_SIZE > 65535) {
  564: 		printf("Option error: sorry, data size must be <= %lu\n",
  565: 			(unsigned long)(65535-IPHDR_SIZE+TCPHDR_SIZE));
  566: 		exit(1);
  567: 	}
  568: 	else if (count <= 0 && count != -1) {
  569: 		printf("Option error: count must > 0\n");
  570: 		exit(1);
  571: 	}
  572: 	else if (sending_wait < 0) {
  573: 		printf("Option error: bad timing interval\n");
  574: 		exit(1);
  575: 	}
  576: 	else if (opt_waitinusec == TRUE && usec_delay.it_value.tv_usec < 0)
  577: 	{
  578: 		printf("Option error: bad timing interval\n");
  579: 		exit(1);
  580: 	}
  581: 	else if (opt_datafromfile == TRUE && data_size == 0)
  582: 	{
  583: 		printf("Option error: -E option useless without -d\n");
  584: 		exit(1);
  585: 	}
  586: 	else if (opt_sign && data_size && signlen > data_size)
  587: 	{
  588: 		printf(
  589: 	"Option error: signature (%d bytes) is larger than data size\n"
  590: 	"check -d option, don't specify -d to let hping compute it\n", signlen);
  591: 		exit(1);
  592: 	}
  593: 	else if ((opt_sign || opt_listenmode) && signlen > 1024)
  594: 	{
  595: 		printf("Option error: signature too big\n");
  596: 		exit(1);
  597: 	}
  598: 	else if (opt_safe == TRUE && src_id != -1)
  599: 	{
  600: 		printf("Option error: sorry, you can't set id and "
  601: 				"use safe protocol at some time\n");
  602: 		exit(1);
  603: 	}
  604: 	else if (opt_safe == TRUE && opt_datafromfile == FALSE &&
  605: 			opt_listenmode == FALSE)
  606: 	{
  607: 		printf("Option error: sorry, safe protocol is useless "
  608: 				"without 'data from file' option\n");
  609: 		exit(1);
  610: 	}
  611: 	else if (opt_safe == TRUE && opt_sign == FALSE &&
  612: 			opt_listenmode == FALSE)
  613: 	{
  614: 		printf("Option error: sorry, safe protocol require you "
  615: 				"sign your packets, see --sign | -e option\n");
  616: 		exit(1);
  617: 	} else if (opt_rand_dest == TRUE && ifname[0] == '\0') {
  618: 		printf("Option error: you need to specify an interface "
  619: 			"when the --rand-dest option is enabled\n");
  620: 		exit(1);
  621: 	}
  622: 
  623: 	/* dependences */
  624: 	if (opt_safe == TRUE)
  625: 		src_id = 1;
  626: 
  627: 	if (opt_traceroute == TRUE && ctrlzbind == BIND_DPORT)
  628: 		ctrlzbind = BIND_TTL;
  629: 
  630: 	if (opt_traceroute == TRUE && src_ttl_set == 0)
  631: 		src_ttl = DEFAULT_TRACEROUTE_TTL;
  632: 
  633: 	/* set the data size to the signature len if the no data size
  634: 	 * was specified */
  635: 	if (opt_sign && !data_size)
  636: 		data_size = signlen;
  637: 
  638: 	/* If scan mode is on, and the -i option was not used,
  639: 	 * set the default delay to zero, that's send packets
  640: 	 * as fast as possible. */
  641: 	if (opt_scanmode && !delay_changed) {
  642: 		opt_waitinusec = TRUE;
  643: 		usec_delay.it_value.tv_sec =
  644: 		usec_delay.it_interval.tv_sec = 0;
  645: 		usec_delay.it_value.tv_usec = 
  646: 		usec_delay.it_interval.tv_usec = 0;
  647: 	}
  648: 
  649: 	return 1;
  650: }

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