Changes in uspace/app/ping/ping.c [3495654:fff7ef4] in mainline


Ignore:
File:
1 edited

Legend:

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

    r3495654 rfff7ef4  
    3737#include <errno.h>
    3838#include <fibril_synch.h>
    39 #include <inet/addr.h>
     39#include <inet/dnsr.h>
    4040#include <inet/inetping.h>
    4141#include <io/console.h>
     
    6969static void print_syntax(void)
    7070{
    71         printf("syntax: " NAME " [-r] <addr>\n");
     71        printf("syntax: " NAME " [-r] <host>\n");
     72}
     73
     74static int addr_parse(const char *text, inet_addr_t *addr)
     75{
     76        unsigned long a[4];
     77        char *cp = (char *)text;
     78        int i;
     79
     80        for (i = 0; i < 3; i++) {
     81                a[i] = strtoul(cp, &cp, 10);
     82                if (*cp != '.')
     83                        return EINVAL;
     84                ++cp;
     85        }
     86
     87        a[3] = strtoul(cp, &cp, 10);
     88        if (*cp != '\0')
     89                return EINVAL;
     90
     91        addr->ipv4 = 0;
     92        for (i = 0; i < 4; i++) {
     93                if (a[i] > 255)
     94                        return EINVAL;
     95                addr->ipv4 = (addr->ipv4 << 8) | a[i];
     96        }
     97
     98        return EOK;
     99}
     100
     101static int addr_format(inet_addr_t *addr, char **bufp)
     102{
     103        int rc;
     104
     105        rc = asprintf(bufp, "%d.%d.%d.%d", addr->ipv4 >> 24,
     106            (addr->ipv4 >> 16) & 0xff, (addr->ipv4 >> 8) & 0xff,
     107            addr->ipv4 & 0xff);
     108
     109        if (rc < 0)
     110                return ENOMEM;
     111
     112        return EOK;
    72113}
    73114
     
    85126        int rc;
    86127
    87         rc = inet_addr_format(&sdu->src, &asrc);
     128        rc = addr_format(&sdu->src, &asrc);
    88129        if (rc != EOK)
    89130                return ENOMEM;
    90131
    91         rc = inet_addr_format(&sdu->dest, &adest);
     132        rc = addr_format(&sdu->dest, &adest);
    92133        if (rc != EOK) {
    93134                free(asrc);
     
    173214int main(int argc, char *argv[])
    174215{
     216        dnsr_hostinfo_t *hinfo = NULL;
     217        char *asrc = NULL;
     218        char *adest = NULL;
     219        char *sdest = NULL;
    175220        int rc;
    176221        int argi;
     
    180225                printf(NAME ": Failed connecting to internet ping service "
    181226                    "(%d).\n", rc);
    182                 return 1;
     227                goto error;
    183228        }
    184229
     
    193238        if (argc - argi != 1) {
    194239                print_syntax();
    195                 return 1;
     240                goto error;
    196241        }
    197242
    198243        /* Parse destination address */
    199         rc = inet_addr_parse(argv[argi], &dest_addr);
    200         if (rc != EOK) {
    201                 printf(NAME ": Invalid address format.\n");
    202                 print_syntax();
    203                 return 1;
     244        rc = addr_parse(argv[argi], &dest_addr);
     245        if (rc != EOK) {
     246                /* Try interpreting as a host name */
     247                rc = dnsr_name2host(argv[argi], &hinfo);
     248                if (rc != EOK) {
     249                        printf(NAME ": Error resolving host '%s'.\n", argv[argi]);
     250                        goto error;
     251                }
     252
     253                dest_addr = hinfo->addr;
    204254        }
    205255
     
    208258        if (rc != EOK) {
    209259                printf(NAME ": Failed determining source address.\n");
    210                 return 1;
    211         }
     260                goto error;
     261        }
     262
     263        rc = addr_format(&src_addr, &asrc);
     264        if (rc != EOK) {
     265                printf(NAME ": Out of memory.\n");
     266                goto error;
     267        }
     268
     269        rc = addr_format(&dest_addr, &adest);
     270        if (rc != EOK) {
     271                printf(NAME ": Out of memory.\n");
     272                goto error;
     273        }
     274
     275        if (hinfo != NULL) {
     276                rc = asprintf(&sdest, "%s (%s)", hinfo->name, adest);
     277                if (rc < 0) {
     278                        printf(NAME ": Out of memory.\n");
     279                        goto error;
     280                }
     281        } else {
     282                sdest = adest;
     283                adest = NULL;
     284        }
     285
     286        printf("Sending ICMP echo request from %s to %s.\n",
     287            asrc, sdest);
    212288
    213289        fid_t fid;
     
    217293                if (fid == 0) {
    218294                        printf(NAME ": Failed creating transmit fibril.\n");
    219                         return 1;
     295                        goto error;
    220296                }
    221297
     
    225301                if (fid == 0) {
    226302                        printf(NAME ": Failed creating input fibril.\n");
    227                         return 1;
     303                        goto error;
    228304                }
    229305
     
    243319        if (rc == ETIMEOUT) {
    244320                printf(NAME ": Echo request timed out.\n");
    245                 return 1;
    246         }
    247 
     321                goto error;
     322        }
     323
     324        free(asrc);
     325        free(adest);
     326        free(sdest);
     327        dnsr_hostinfo_destroy(hinfo);
    248328        return 0;
     329error:
     330        free(asrc);
     331        free(adest);
     332        free(sdest);
     333        dnsr_hostinfo_destroy(hinfo);
     334        return 1;
    249335}
    250336
Note: See TracChangeset for help on using the changeset viewer.