Changes in uspace/lib/c/generic/dnsr.c [959d2ec:e948fde] in mainline
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/lib/c/generic/dnsr.c
r959d2ec re948fde 44 44 static async_exch_t *dnsr_exchange_begin(void) 45 45 { 46 async_sess_t *sess;47 service_id_t dnsr_svc;48 49 46 fibril_mutex_lock(&dnsr_sess_mutex); 50 47 51 48 if (dnsr_sess == NULL) { 49 service_id_t dnsr_svc; 50 52 51 (void) loc_service_get_id(SERVICE_NAME_DNSR, &dnsr_svc, 53 52 IPC_FLAG_BLOCKING); 54 53 55 54 dnsr_sess = loc_service_connect(EXCHANGE_SERIALIZE, dnsr_svc, 56 55 IPC_FLAG_BLOCKING); 57 56 } 58 59 sess = dnsr_sess;57 58 async_sess_t *sess = dnsr_sess; 60 59 fibril_mutex_unlock(&dnsr_sess_mutex); 61 60 62 61 return async_exchange_begin(sess); 63 62 } … … 68 67 } 69 68 70 int dnsr_name2host(const char *name, dnsr_hostinfo_t **rinfo )69 int dnsr_name2host(const char *name, dnsr_hostinfo_t **rinfo, ip_ver_t ver) 71 70 { 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)); 103 72 if (info == NULL) 104 73 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); 107 123 assert(act_size <= DNSR_NAME_MAX_SIZE); 124 108 125 cname_buf[act_size] = '\0'; 109 126 110 127 info->cname = str_dup(cname_buf); 111 info->addr.ipv4 = IPC_GET_ARG1(answer); 112 128 113 129 *rinfo = info; 114 130 return EOK; … … 119 135 if (info == NULL) 120 136 return; 121 137 122 138 free(info->cname); 123 139 free(info); … … 126 142 int dnsr_get_srvaddr(inet_addr_t *srvaddr) 127 143 { 128 sysarg_t addr;129 144 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); 135 154 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; 139 161 } 140 162 … … 142 164 { 143 165 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); 149 175 return rc; 150 151 return EOK; 176 } 177 178 sysarg_t retval; 179 async_wait_for(req, &retval); 180 181 return (int) retval; 152 182 } 153 183
Note:
See TracChangeset
for help on using the changeset viewer.