Annotation of embedaddon/hping2/parseoptions.c, revision 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>