Changeset 02a09ed in mainline for uspace/lib/c/generic/dnsr.c


Ignore:
Timestamp:
2013-06-28T20:20:03Z (11 years ago)
Author:
Martin Decky <martin@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
1d24ad3
Parents:
edf0d27
Message:

add basic infrastructure for IPv6 (inactive)
make inet_addr_t a universal address type

File:
1 edited

Legend:

Unmodified
Added
Removed
  • uspace/lib/c/generic/dnsr.c

    redf0d27 r02a09ed  
    6969int dnsr_name2host(const char *name, dnsr_hostinfo_t **rinfo)
    7070{
     71        dnsr_hostinfo_t *info = calloc(1, sizeof(dnsr_hostinfo_t));
     72        if (info == NULL)
     73                return ENOMEM;
     74       
    7175        async_exch_t *exch = dnsr_exchange_begin();
    72         char cname_buf[DNSR_NAME_MAX_SIZE + 1];
    73         ipc_call_t cnreply;
    74         size_t act_size;
    75         dnsr_hostinfo_t *info;
    76 
     76       
    7777        ipc_call_t answer;
    7878        aid_t req = async_send_0(exch, DNSR_NAME2HOST, &answer);
    79         sysarg_t retval = async_data_write_start(exch, name, str_size(name));
    80         aid_t cnreq = async_data_read(exch, cname_buf, DNSR_NAME_MAX_SIZE,
    81             &cnreply);
    82 
     79       
     80        int rc = async_data_write_start(exch, name, str_size(name));
     81        if (rc != EOK) {
     82                async_exchange_end(exch);
     83                async_forget(req);
     84                return rc;
     85        }
     86       
     87        ipc_call_t answer_addr;
     88        aid_t req_addr = async_data_read(exch, &info->addr,
     89            sizeof(inet_addr_t), &answer_addr);
     90       
     91        sysarg_t retval_addr;
     92        async_wait_for(req_addr, &retval_addr);
     93       
     94        if (retval_addr != EOK) {
     95                async_exchange_end(exch);
     96                async_forget(req);
     97                return (int) retval_addr;
     98        }
     99       
     100        ipc_call_t answer_cname;
     101        char cname_buf[DNSR_NAME_MAX_SIZE + 1];
     102        aid_t req_cname = async_data_read(exch, cname_buf, DNSR_NAME_MAX_SIZE,
     103            &answer_cname);
     104       
    83105        dnsr_exchange_end(exch);
    84 
    85         if (retval != EOK) {
     106       
     107        sysarg_t retval_cname;
     108        async_wait_for(req_cname, &retval_cname);
     109       
     110        if (retval_cname != EOK) {
    86111                async_forget(req);
    87                 async_forget(cnreq);
    88                 return retval;
     112                return (int) retval_cname;
    89113        }
    90 
     114       
     115        sysarg_t retval;
    91116        async_wait_for(req, &retval);
    92         if (retval != EOK) {
    93                 async_forget(cnreq);
    94                 return EIO;
    95         }
    96 
    97         async_wait_for(cnreq, &retval);
     117       
    98118        if (retval != EOK)
    99                 return EIO;
    100 
    101         info = calloc(1, sizeof(dnsr_hostinfo_t));
    102         if (info == NULL)
    103                 return ENOMEM;
    104 
    105         act_size = IPC_GET_ARG2(cnreply);
     119                return (int) retval;
     120       
     121        size_t act_size = IPC_GET_ARG2(answer_cname);
    106122        assert(act_size <= DNSR_NAME_MAX_SIZE);
     123       
    107124        cname_buf[act_size] = '\0';
    108 
     125       
    109126        info->cname = str_dup(cname_buf);
    110         inet_addr_unpack(IPC_GET_ARG1(answer), &info->addr);
    111 
     127       
    112128        *rinfo = info;
    113129        return EOK;
Note: See TracChangeset for help on using the changeset viewer.