Changes in uspace/app/ping/ping.c [07b7c48:a2e3ee6] in mainline


Ignore:
File:
1 edited

Legend:

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

    r07b7c48 ra2e3ee6  
    11/*
    2  * Copyright (c) 2012 Jiri Svoboda
     2 * Copyright (c) 2013 Jiri Svoboda
    33 * All rights reserved.
    44 *
     
    3737#include <errno.h>
    3838#include <fibril_synch.h>
     39#include <inet/dnsr.h>
     40#include <inet/addr.h>
    3941#include <inet/inetping.h>
    4042#include <io/console.h>
     
    6163};
    6264
    63 static inet_addr_t src_addr;
    64 static inet_addr_t dest_addr;
     65static uint32_t src;
     66static uint32_t dest;
    6567
    6668static bool ping_repeat = false;
     
    6870static void print_syntax(void)
    6971{
    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;
     72        printf("syntax: " NAME " [-r] <host>\n");
    11273}
    11374
     
    12283static int ping_ev_recv(inetping_sdu_t *sdu)
    12384{
    124         char *asrc, *adest;
    125         int rc;
    126 
    127         rc = addr_format(&sdu->src, &asrc);
     85        inet_addr_t src_addr;
     86        inet_addr_unpack(sdu->src, &src_addr);
     87       
     88        inet_addr_t dest_addr;
     89        inet_addr_unpack(sdu->dest, &dest_addr);
     90       
     91        char *asrc;
     92        int rc = inet_addr_format(&src_addr, &asrc);
    12893        if (rc != EOK)
    12994                return ENOMEM;
    130 
    131         rc = addr_format(&sdu->dest, &adest);
     95       
     96        char *adest;
     97        rc = inet_addr_format(&dest_addr, &adest);
    13298        if (rc != EOK) {
    13399                free(asrc);
    134100                return ENOMEM;
    135101        }
     102       
    136103        printf("Received ICMP echo reply: from %s to %s, seq. no %u, "
    137104            "payload size %zu\n", asrc, adest, sdu->seq_no, sdu->size);
    138 
    139         if (!ping_repeat) {
     105       
     106        if (!ping_repeat)
    140107                ping_signal_done();
    141         }
    142 
     108       
    143109        free(asrc);
    144110        free(adest);
     
    151117        int rc;
    152118
    153         sdu.src = src_addr;
    154         sdu.dest = dest_addr;
     119        sdu.src = src;
     120        sdu.dest = dest;
    155121        sdu.seq_no = seq_no;
    156122        sdu.data = (void *) "foo";
     
    213179int main(int argc, char *argv[])
    214180{
     181        dnsr_hostinfo_t *hinfo = NULL;
     182        char *asrc = NULL;
     183        char *adest = NULL;
     184        char *sdest = NULL;
    215185        int rc;
    216186        int argi;
     
    220190                printf(NAME ": Failed connecting to internet ping service "
    221191                    "(%d).\n", rc);
    222                 return 1;
     192                goto error;
    223193        }
    224194
     
    233203        if (argc - argi != 1) {
    234204                print_syntax();
    235                 return 1;
     205                goto error;
    236206        }
    237207
    238208        /* Parse destination address */
    239         rc = addr_parse(argv[argi], &dest_addr);
    240         if (rc != EOK) {
    241                 printf(NAME ": Invalid address format.\n");
    242                 print_syntax();
    243                 return 1;
    244         }
    245 
     209        inet_addr_t dest_addr;
     210        rc = inet_addr_parse(argv[argi], &dest_addr);
     211        if (rc != EOK) {
     212                /* Try interpreting as a host name */
     213                rc = dnsr_name2host(argv[argi], &hinfo);
     214                if (rc != EOK) {
     215                        printf(NAME ": Error resolving host '%s'.\n", argv[argi]);
     216                        goto error;
     217                }
     218               
     219                dest_addr = hinfo->addr;
     220        }
     221       
     222        rc = inet_addr_pack(&dest_addr, &dest);
     223        if (rc != EOK) {
     224                printf(NAME ": Destination '%s' is not an IPv4 address.\n",
     225                    argv[argi]);
     226                goto error;
     227        }
     228       
    246229        /* Determine source address */
    247         rc = inetping_get_srcaddr(&dest_addr, &src_addr);
     230        rc = inetping_get_srcaddr(dest, &src);
    248231        if (rc != EOK) {
    249232                printf(NAME ": Failed determining source address.\n");
    250                 return 1;
    251         }
     233                goto error;
     234        }
     235       
     236        inet_addr_t src_addr;
     237        inet_addr_unpack(src, &src_addr);
     238       
     239        rc = inet_addr_format(&src_addr, &asrc);
     240        if (rc != EOK) {
     241                printf(NAME ": Out of memory.\n");
     242                goto error;
     243        }
     244       
     245        rc = inet_addr_format(&dest_addr, &adest);
     246        if (rc != EOK) {
     247                printf(NAME ": Out of memory.\n");
     248                goto error;
     249        }
     250       
     251        if (hinfo != NULL) {
     252                rc = asprintf(&sdest, "%s (%s)", hinfo->cname, adest);
     253                if (rc < 0) {
     254                        printf(NAME ": Out of memory.\n");
     255                        goto error;
     256                }
     257        } else {
     258                sdest = adest;
     259                adest = NULL;
     260        }
     261
     262        printf("Sending ICMP echo request from %s to %s.\n",
     263            asrc, sdest);
    252264
    253265        fid_t fid;
     
    257269                if (fid == 0) {
    258270                        printf(NAME ": Failed creating transmit fibril.\n");
    259                         return 1;
     271                        goto error;
    260272                }
    261273
     
    265277                if (fid == 0) {
    266278                        printf(NAME ": Failed creating input fibril.\n");
    267                         return 1;
     279                        goto error;
    268280                }
    269281
     
    283295        if (rc == ETIMEOUT) {
    284296                printf(NAME ": Echo request timed out.\n");
    285                 return 1;
    286         }
    287 
     297                goto error;
     298        }
     299
     300        free(asrc);
     301        free(adest);
     302        free(sdest);
     303        dnsr_hostinfo_destroy(hinfo);
    288304        return 0;
     305       
     306error:
     307        free(asrc);
     308        free(adest);
     309        free(sdest);
     310        dnsr_hostinfo_destroy(hinfo);
     311        return 1;
    289312}
    290313
Note: See TracChangeset for help on using the changeset viewer.