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


Ignore:
File:
1 edited

Legend:

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

    ra2e3ee6 r07b7c48  
    11/*
    2  * Copyright (c) 2013 Jiri Svoboda
     2 * Copyright (c) 2012 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>
    4139#include <inet/inetping.h>
    4240#include <io/console.h>
     
    6361};
    6462
    65 static uint32_t src;
    66 static uint32_t dest;
     63static inet_addr_t src_addr;
     64static inet_addr_t dest_addr;
    6765
    6866static bool ping_repeat = false;
     
    7068static void print_syntax(void)
    7169{
    72         printf("syntax: " NAME " [-r] <host>\n");
     70        printf("syntax: " NAME " [-r] <addr>\n");
     71}
     72
     73static 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
     100static 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;
    73112}
    74113
     
    83122static int ping_ev_recv(inetping_sdu_t *sdu)
    84123{
    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);
     124        char *asrc, *adest;
     125        int rc;
     126
     127        rc = addr_format(&sdu->src, &asrc);
    93128        if (rc != EOK)
    94129                return ENOMEM;
    95        
    96         char *adest;
    97         rc = inet_addr_format(&dest_addr, &adest);
     130
     131        rc = addr_format(&sdu->dest, &adest);
    98132        if (rc != EOK) {
    99133                free(asrc);
    100134                return ENOMEM;
    101135        }
    102        
    103136        printf("Received ICMP echo reply: from %s to %s, seq. no %u, "
    104137            "payload size %zu\n", asrc, adest, sdu->seq_no, sdu->size);
    105        
    106         if (!ping_repeat)
     138
     139        if (!ping_repeat) {
    107140                ping_signal_done();
    108        
     141        }
     142
    109143        free(asrc);
    110144        free(adest);
     
    117151        int rc;
    118152
    119         sdu.src = src;
    120         sdu.dest = dest;
     153        sdu.src = src_addr;
     154        sdu.dest = dest_addr;
    121155        sdu.seq_no = seq_no;
    122156        sdu.data = (void *) "foo";
     
    179213int main(int argc, char *argv[])
    180214{
    181         dnsr_hostinfo_t *hinfo = NULL;
    182         char *asrc = NULL;
    183         char *adest = NULL;
    184         char *sdest = NULL;
    185215        int rc;
    186216        int argi;
     
    190220                printf(NAME ": Failed connecting to internet ping service "
    191221                    "(%d).\n", rc);
    192                 goto error;
     222                return 1;
    193223        }
    194224
     
    203233        if (argc - argi != 1) {
    204234                print_syntax();
    205                 goto error;
     235                return 1;
    206236        }
    207237
    208238        /* Parse destination address */
    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        
     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
    229246        /* Determine source address */
    230         rc = inetping_get_srcaddr(dest, &src);
     247        rc = inetping_get_srcaddr(&dest_addr, &src_addr);
    231248        if (rc != EOK) {
    232249                printf(NAME ": Failed determining source address.\n");
    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);
     250                return 1;
     251        }
    264252
    265253        fid_t fid;
     
    269257                if (fid == 0) {
    270258                        printf(NAME ": Failed creating transmit fibril.\n");
    271                         goto error;
     259                        return 1;
    272260                }
    273261
     
    277265                if (fid == 0) {
    278266                        printf(NAME ": Failed creating input fibril.\n");
    279                         goto error;
     267                        return 1;
    280268                }
    281269
     
    295283        if (rc == ETIMEOUT) {
    296284                printf(NAME ": Echo request timed out.\n");
    297                 goto error;
    298         }
    299 
    300         free(asrc);
    301         free(adest);
    302         free(sdest);
    303         dnsr_hostinfo_destroy(hinfo);
     285                return 1;
     286        }
     287
    304288        return 0;
    305        
    306 error:
    307         free(asrc);
    308         free(adest);
    309         free(sdest);
    310         dnsr_hostinfo_destroy(hinfo);
    311         return 1;
    312289}
    313290
Note: See TracChangeset for help on using the changeset viewer.