Changeset 02a09ed in mainline for uspace/lib/c/generic/dnsr.c
- Timestamp:
- 2013-06-28T20:20:03Z (11 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- 1d24ad3
- Parents:
- edf0d27
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/lib/c/generic/dnsr.c
redf0d27 r02a09ed 69 69 int dnsr_name2host(const char *name, dnsr_hostinfo_t **rinfo) 70 70 { 71 dnsr_hostinfo_t *info = calloc(1, sizeof(dnsr_hostinfo_t)); 72 if (info == NULL) 73 return ENOMEM; 74 71 75 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 77 77 ipc_call_t answer; 78 78 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 83 105 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) { 86 111 async_forget(req); 87 async_forget(cnreq); 88 return retval; 112 return (int) retval_cname; 89 113 } 90 114 115 sysarg_t retval; 91 116 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 98 118 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); 106 122 assert(act_size <= DNSR_NAME_MAX_SIZE); 123 107 124 cname_buf[act_size] = '\0'; 108 125 109 126 info->cname = str_dup(cname_buf); 110 inet_addr_unpack(IPC_GET_ARG1(answer), &info->addr); 111 127 112 128 *rinfo = info; 113 129 return EOK;
Note:
See TracChangeset
for help on using the changeset viewer.