Annotation of embedaddon/hping2/parseoptions.c, revision 1.1.1.1

1.1       misho       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.25 2003/08/08 14:39:00 antirez 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>