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