Changes in uspace/app/ping/ping.c [3b3c689:02a09ed] in mainline


Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • uspace/app/ping/ping.c

    r3b3c689 r02a09ed  
    11/*
    2  * Copyright (c) 2012 Jiri Svoboda
     2 * Copyright (c) 2013 Jiri Svoboda
    33 * All rights reserved.
    44 *
     
    3434
    3535#include <async.h>
    36 #include <bool.h>
     36#include <stdbool.h>
    3737#include <errno.h>
    3838#include <fibril_synch.h>
     39#include <net/socket_codes.h>
     40#include <inet/dnsr.h>
     41#include <inet/addr.h>
    3942#include <inet/inetping.h>
    4043#include <io/console.h>
     
    6164};
    6265
    63 static inet_addr_t src_addr;
    64 static inet_addr_t dest_addr;
     66static addr32_t src;
     67static addr32_t dest;
    6568
    6669static bool ping_repeat = false;
     
    6871static void print_syntax(void)
    6972{
    70         printf("syntax: " NAME " [-r] <addr>\n");
    71 }
    72 
    73 static int addr_parse(const char *text, inet_addr_t *addr)
    74 {
    75         unsigned long a[4];
    76         char *cp = (char *)text;
    77         int i;
    78 
    79         for (i = 0; i < 3; i++) {
    80                 a[i] = strtoul(cp, &cp, 10);
    81                 if (*cp != '.')
    82                         return EINVAL;
    83                 ++cp;
    84         }
    85 
    86         a[3] = strtoul(cp, &cp, 10);
    87         if (*cp != '\0')
    88                 return EINVAL;
    89 
    90         addr->ipv4 = 0;
    91         for (i = 0; i < 4; i++) {
    92                 if (a[i] > 255)
    93                         return EINVAL;
    94                 addr->ipv4 = (addr->ipv4 << 8) | a[i];
    95         }
    96 
    97         return EOK;
    98 }
    99 
    100 static int addr_format(inet_addr_t *addr, char **bufp)
    101 {
    102         int rc;
    103 
    104         rc = asprintf(bufp, "%d.%d.%d.%d", addr->ipv4 >> 24,
    105             (addr->ipv4 >> 16) & 0xff, (addr->ipv4 >> 8) & 0xff,
    106             addr->ipv4 & 0xff);
    107 
    108         if (rc < 0)
    109                 return ENOMEM;
    110 
    111         return EOK;
     73        printf("syntax: " NAME " [-r] <host>\n");
    11274}
    11375
     
    12284static int ping_ev_recv(inetping_sdu_t *sdu)
    12385{
    124         char *asrc, *adest;
    125         int rc;
    126 
    127         rc = addr_format(&sdu->src, &asrc);
     86        inet_addr_t src_addr;
     87        inet_addr_set(sdu->src, &src_addr);
     88       
     89        inet_addr_t dest_addr;
     90        inet_addr_set(sdu->dest, &dest_addr);
     91       
     92        char *asrc;
     93        int rc = inet_addr_format(&src_addr, &asrc);
    12894        if (rc != EOK)
    12995                return ENOMEM;
    130 
    131         rc = addr_format(&sdu->dest, &adest);
     96       
     97        char *adest;
     98        rc = inet_addr_format(&dest_addr, &adest);
    13299        if (rc != EOK) {
    133100                free(asrc);
    134101                return ENOMEM;
    135102        }
     103       
    136104        printf("Received ICMP echo reply: from %s to %s, seq. no %u, "
    137105            "payload size %zu\n", asrc, adest, sdu->seq_no, sdu->size);
    138 
    139         if (!ping_repeat) {
     106       
     107        if (!ping_repeat)
    140108                ping_signal_done();
    141         }
    142 
     109       
    143110        free(asrc);
    144111        free(adest);
     
    151118        int rc;
    152119
    153         sdu.src = src_addr;
    154         sdu.dest = dest_addr;
     120        sdu.src = src;
     121        sdu.dest = dest;
    155122        sdu.seq_no = seq_no;
    156123        sdu.data = (void *) "foo";
     
    188155{
    189156        console_ctrl_t *con;
    190         kbd_event_t ev;
     157        cons_event_t ev;
    191158
    192159        con = console_init(stdin, stdout);
     
    194161
    195162        while (true) {
    196                 if (!console_get_kbd_event(con, &ev))
     163                if (!console_get_event(con, &ev))
    197164                        break;
    198165
    199                 if (ev.type == KEY_PRESS && (ev.mods & (KM_ALT | KM_SHIFT)) ==
    200                     0 && (ev.mods & KM_CTRL) != 0) {
     166                if (ev.type == CEV_KEY && ev.ev.key.type == KEY_PRESS &&
     167                    (ev.ev.key.mods & (KM_ALT | KM_SHIFT)) ==
     168                    0 && (ev.ev.key.mods & KM_CTRL) != 0) {
    201169                        /* Ctrl+key */
    202                         if (ev.key == KC_Q) {
     170                        if (ev.ev.key.key == KC_Q) {
    203171                                ping_signal_done();
    204172                                return 0;
     
    212180int main(int argc, char *argv[])
    213181{
     182        dnsr_hostinfo_t *hinfo = NULL;
     183        char *asrc = NULL;
     184        char *adest = NULL;
     185        char *sdest = NULL;
    214186        int rc;
    215187        int argi;
     
    219191                printf(NAME ": Failed connecting to internet ping service "
    220192                    "(%d).\n", rc);
    221                 return 1;
     193                goto error;
    222194        }
    223195
     
    232204        if (argc - argi != 1) {
    233205                print_syntax();
    234                 return 1;
     206                goto error;
    235207        }
    236208
    237209        /* Parse destination address */
    238         rc = addr_parse(argv[argi], &dest_addr);
    239         if (rc != EOK) {
    240                 printf(NAME ": Invalid address format.\n");
    241                 print_syntax();
    242                 return 1;
    243         }
    244 
     210        inet_addr_t dest_addr;
     211        rc = inet_addr_parse(argv[argi], &dest_addr);
     212        if (rc != EOK) {
     213                /* Try interpreting as a host name */
     214                rc = dnsr_name2host(argv[argi], &hinfo);
     215                if (rc != EOK) {
     216                        printf(NAME ": Error resolving host '%s'.\n", argv[argi]);
     217                        goto error;
     218                }
     219               
     220                dest_addr = hinfo->addr;
     221        }
     222       
     223        uint16_t af = inet_addr_get(&dest_addr, &dest, NULL);
     224        if (af != AF_INET) {
     225                printf(NAME ": Destination '%s' is not an IPv4 address.\n",
     226                    argv[argi]);
     227                goto error;
     228        }
     229       
    245230        /* Determine source address */
    246         rc = inetping_get_srcaddr(&dest_addr, &src_addr);
     231        rc = inetping_get_srcaddr(dest, &src);
    247232        if (rc != EOK) {
    248233                printf(NAME ": Failed determining source address.\n");
    249                 return 1;
    250         }
     234                goto error;
     235        }
     236       
     237        inet_addr_t src_addr;
     238        inet_addr_set(src, &src_addr);
     239       
     240        rc = inet_addr_format(&src_addr, &asrc);
     241        if (rc != EOK) {
     242                printf(NAME ": Out of memory.\n");
     243                goto error;
     244        }
     245       
     246        rc = inet_addr_format(&dest_addr, &adest);
     247        if (rc != EOK) {
     248                printf(NAME ": Out of memory.\n");
     249                goto error;
     250        }
     251       
     252        if (hinfo != NULL) {
     253                rc = asprintf(&sdest, "%s (%s)", hinfo->cname, adest);
     254                if (rc < 0) {
     255                        printf(NAME ": Out of memory.\n");
     256                        goto error;
     257                }
     258        } else {
     259                sdest = adest;
     260                adest = NULL;
     261        }
     262
     263        printf("Sending ICMP echo request from %s to %s.\n",
     264            asrc, sdest);
    251265
    252266        fid_t fid;
     
    256270                if (fid == 0) {
    257271                        printf(NAME ": Failed creating transmit fibril.\n");
    258                         return 1;
     272                        goto error;
    259273                }
    260274
     
    264278                if (fid == 0) {
    265279                        printf(NAME ": Failed creating input fibril.\n");
    266                         return 1;
     280                        goto error;
    267281                }
    268282
     
    282296        if (rc == ETIMEOUT) {
    283297                printf(NAME ": Echo request timed out.\n");
    284                 return 1;
    285         }
    286 
     298                goto error;
     299        }
     300
     301        free(asrc);
     302        free(adest);
     303        free(sdest);
     304        dnsr_hostinfo_destroy(hinfo);
    287305        return 0;
     306       
     307error:
     308        free(asrc);
     309        free(adest);
     310        free(sdest);
     311        dnsr_hostinfo_destroy(hinfo);
     312        return 1;
    288313}
    289314
Note: See TracChangeset for help on using the changeset viewer.