Ignore:
File:
1 edited

Legend:

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

    re948fde r959d2ec  
    4444static async_exch_t *dnsr_exchange_begin(void)
    4545{
     46        async_sess_t *sess;
     47        service_id_t dnsr_svc;
     48
    4649        fibril_mutex_lock(&dnsr_sess_mutex);
    47        
     50
    4851        if (dnsr_sess == NULL) {
    49                 service_id_t dnsr_svc;
    50                
    5152                (void) loc_service_get_id(SERVICE_NAME_DNSR, &dnsr_svc,
    5253                    IPC_FLAG_BLOCKING);
    53                
     54
    5455                dnsr_sess = loc_service_connect(EXCHANGE_SERIALIZE, dnsr_svc,
    5556                    IPC_FLAG_BLOCKING);
    5657        }
    57        
    58         async_sess_t *sess = dnsr_sess;
     58
     59        sess = dnsr_sess;
    5960        fibril_mutex_unlock(&dnsr_sess_mutex);
    60        
     61
    6162        return async_exchange_begin(sess);
    6263}
     
    6768}
    6869
    69 int dnsr_name2host(const char *name, dnsr_hostinfo_t **rinfo, ip_ver_t ver)
     70int dnsr_name2host(const char *name, dnsr_hostinfo_t **rinfo)
    7071{
    71         dnsr_hostinfo_t *info = calloc(1, sizeof(dnsr_hostinfo_t));
     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));
    72103        if (info == NULL)
    73104                return ENOMEM;
    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);
     105
     106        act_size = IPC_GET_ARG2(cnreply);
    123107        assert(act_size <= DNSR_NAME_MAX_SIZE);
    124        
    125108        cname_buf[act_size] = '\0';
    126        
     109
    127110        info->cname = str_dup(cname_buf);
    128        
     111        info->addr.ipv4 = IPC_GET_ARG1(answer);
     112
    129113        *rinfo = info;
    130114        return EOK;
     
    135119        if (info == NULL)
    136120                return;
    137        
     121
    138122        free(info->cname);
    139123        free(info);
     
    142126int dnsr_get_srvaddr(inet_addr_t *srvaddr)
    143127{
     128        sysarg_t addr;
    144129        async_exch_t *exch = dnsr_exchange_begin();
    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);
     130
     131        int rc = async_req_0_1(exch, DNSR_GET_SRVADDR, &addr);
     132        dnsr_exchange_end(exch);
     133
     134        if (rc != EOK)
    154135                return rc;
    155         }
    156        
    157         sysarg_t retval;
    158         async_wait_for(req, &retval);
    159        
    160         return (int) retval;
     136
     137        srvaddr->ipv4 = addr;
     138        return EOK;
    161139}
    162140
     
    164142{
    165143        async_exch_t *exch = dnsr_exchange_begin();
    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);
     144
     145        int rc = async_req_1_0(exch, DNSR_SET_SRVADDR, srvaddr->ipv4);
     146        dnsr_exchange_end(exch);
     147
     148        if (rc != EOK)
    175149                return rc;
    176         }
    177        
    178         sysarg_t retval;
    179         async_wait_for(req, &retval);
    180        
    181         return (int) retval;
     150
     151        return EOK;
    182152}
    183153
Note: See TracChangeset for help on using the changeset viewer.