Ignore:
File:
1 edited

Legend:

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

    r959d2ec re948fde  
    4444static async_exch_t *dnsr_exchange_begin(void)
    4545{
    46         async_sess_t *sess;
    47         service_id_t dnsr_svc;
    48 
    4946        fibril_mutex_lock(&dnsr_sess_mutex);
    50 
     47       
    5148        if (dnsr_sess == NULL) {
     49                service_id_t dnsr_svc;
     50               
    5251                (void) loc_service_get_id(SERVICE_NAME_DNSR, &dnsr_svc,
    5352                    IPC_FLAG_BLOCKING);
    54 
     53               
    5554                dnsr_sess = loc_service_connect(EXCHANGE_SERIALIZE, dnsr_svc,
    5655                    IPC_FLAG_BLOCKING);
    5756        }
    58 
    59         sess = dnsr_sess;
     57       
     58        async_sess_t *sess = dnsr_sess;
    6059        fibril_mutex_unlock(&dnsr_sess_mutex);
    61 
     60       
    6261        return async_exchange_begin(sess);
    6362}
     
    6867}
    6968
    70 int dnsr_name2host(const char *name, dnsr_hostinfo_t **rinfo)
     69int dnsr_name2host(const char *name, dnsr_hostinfo_t **rinfo, ip_ver_t ver)
    7170{
    72         async_exch_t *exch = dnsr_exchange_begin();
    73         char cname_buf[DNSR_NAME_MAX_SIZE + 1];
    74         ipc_call_t cnreply;
    75         size_t act_size;
    76         dnsr_hostinfo_t *info;
    77 
    78         ipc_call_t answer;
    79         aid_t req = async_send_0(exch, DNSR_NAME2HOST, &answer);
    80         sysarg_t retval = async_data_write_start(exch, name, str_size(name));
    81         aid_t cnreq = async_data_read(exch, cname_buf, DNSR_NAME_MAX_SIZE,
    82             &cnreply);
    83 
    84         dnsr_exchange_end(exch);
    85 
    86         if (retval != EOK) {
    87                 async_forget(req);
    88                 async_forget(cnreq);
    89                 return retval;
    90         }
    91 
    92         async_wait_for(req, &retval);
    93         if (retval != EOK) {
    94                 async_forget(cnreq);
    95                 return EIO;
    96         }
    97 
    98         async_wait_for(cnreq, &retval);
    99         if (retval != EOK)
    100                 return EIO;
    101 
    102         info = calloc(1, sizeof(dnsr_hostinfo_t));
     71        dnsr_hostinfo_t *info = calloc(1, sizeof(dnsr_hostinfo_t));
    10372        if (info == NULL)
    10473                return ENOMEM;
    105 
    106         act_size = IPC_GET_ARG2(cnreply);
     74       
     75        async_exch_t *exch = dnsr_exchange_begin();
     76       
     77        ipc_call_t answer;
     78        aid_t req = async_send_1(exch, DNSR_NAME2HOST, (sysarg_t) ver,
     79            &answer);
     80       
     81        int rc = async_data_write_start(exch, name, str_size(name));
     82        if (rc != EOK) {
     83                async_exchange_end(exch);
     84                async_forget(req);
     85                return rc;
     86        }
     87       
     88        ipc_call_t answer_addr;
     89        aid_t req_addr = async_data_read(exch, &info->addr,
     90            sizeof(inet_addr_t), &answer_addr);
     91       
     92        sysarg_t retval_addr;
     93        async_wait_for(req_addr, &retval_addr);
     94       
     95        if (retval_addr != EOK) {
     96                async_exchange_end(exch);
     97                async_forget(req);
     98                return (int) retval_addr;
     99        }
     100       
     101        ipc_call_t answer_cname;
     102        char cname_buf[DNSR_NAME_MAX_SIZE + 1];
     103        aid_t req_cname = async_data_read(exch, cname_buf, DNSR_NAME_MAX_SIZE,
     104            &answer_cname);
     105       
     106        dnsr_exchange_end(exch);
     107       
     108        sysarg_t retval_cname;
     109        async_wait_for(req_cname, &retval_cname);
     110       
     111        if (retval_cname != EOK) {
     112                async_forget(req);
     113                return (int) retval_cname;
     114        }
     115       
     116        sysarg_t retval;
     117        async_wait_for(req, &retval);
     118       
     119        if (retval != EOK)
     120                return (int) retval;
     121       
     122        size_t act_size = IPC_GET_ARG2(answer_cname);
    107123        assert(act_size <= DNSR_NAME_MAX_SIZE);
     124       
    108125        cname_buf[act_size] = '\0';
    109 
     126       
    110127        info->cname = str_dup(cname_buf);
    111         info->addr.ipv4 = IPC_GET_ARG1(answer);
    112 
     128       
    113129        *rinfo = info;
    114130        return EOK;
     
    119135        if (info == NULL)
    120136                return;
    121 
     137       
    122138        free(info->cname);
    123139        free(info);
     
    126142int dnsr_get_srvaddr(inet_addr_t *srvaddr)
    127143{
    128         sysarg_t addr;
    129144        async_exch_t *exch = dnsr_exchange_begin();
    130 
    131         int rc = async_req_0_1(exch, DNSR_GET_SRVADDR, &addr);
    132         dnsr_exchange_end(exch);
    133 
    134         if (rc != EOK)
     145       
     146        ipc_call_t answer;
     147        aid_t req = async_send_0(exch, DNSR_GET_SRVADDR, &answer);
     148        int rc = async_data_read_start(exch, srvaddr, sizeof(inet_addr_t));
     149       
     150        loc_exchange_end(exch);
     151       
     152        if (rc != EOK) {
     153                async_forget(req);
    135154                return rc;
    136 
    137         srvaddr->ipv4 = addr;
    138         return EOK;
     155        }
     156       
     157        sysarg_t retval;
     158        async_wait_for(req, &retval);
     159       
     160        return (int) retval;
    139161}
    140162
     
    142164{
    143165        async_exch_t *exch = dnsr_exchange_begin();
    144 
    145         int rc = async_req_1_0(exch, DNSR_SET_SRVADDR, srvaddr->ipv4);
    146         dnsr_exchange_end(exch);
    147 
    148         if (rc != EOK)
     166       
     167        ipc_call_t answer;
     168        aid_t req = async_send_0(exch, DNSR_SET_SRVADDR, &answer);
     169        int rc = async_data_write_start(exch, srvaddr, sizeof(inet_addr_t));
     170       
     171        loc_exchange_end(exch);
     172       
     173        if (rc != EOK) {
     174                async_forget(req);
    149175                return rc;
    150 
    151         return EOK;
     176        }
     177       
     178        sysarg_t retval;
     179        async_wait_for(req, &retval);
     180       
     181        return (int) retval;
    152182}
    153183
Note: See TracChangeset for help on using the changeset viewer.