Changeset a35b458 in mainline for uspace/srv/net/dnsrsrv
- Timestamp:
- 2018-03-02T20:10:49Z (8 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- f1380b7
- Parents:
- 3061bc1
- git-author:
- Jiří Zárevúcky <zarevucky.jiri@…> (2018-02-28 17:38:31)
- git-committer:
- Jiří Zárevúcky <zarevucky.jiri@…> (2018-03-02 20:10:49)
- Location:
- uspace/srv/net/dnsrsrv
- Files:
-
- 3 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/srv/net/dnsrsrv/dns_msg.c
r3061bc1 ra35b458 298 298 { 299 299 assert(buf_size >= 4); 300 300 301 301 uint32_t w = ((uint32_t) buf[0] << 24) + 302 302 ((uint32_t) buf[1] << 16) + 303 303 ((uint32_t) buf[2] << 8) + 304 304 buf[3]; 305 305 306 306 return w; 307 307 } … … 311 311 { 312 312 assert(buf_size >= 16); 313 313 314 314 addr128_t_be2host(buf, addr); 315 315 } -
uspace/srv/net/dnsrsrv/dnsrsrv.c
r3061bc1 ra35b458 90 90 { 91 91 log_msg(LOG_DEFAULT, LVL_DEBUG, "inet_get_srvaddr_srv()"); 92 92 93 93 ip_ver_t ver = IPC_GET_ARG1(*icall); 94 94 95 95 char *name; 96 96 errno_t rc = async_data_write_accept((void **) &name, true, 0, … … 100 100 return; 101 101 } 102 102 103 103 dns_host_info_t *hinfo; 104 104 rc = dns_name2host(name, &hinfo, ver); … … 107 107 return; 108 108 } 109 109 110 110 ipc_callid_t callid; 111 111 size_t size; … … 115 115 return; 116 116 } 117 117 118 118 if (size != sizeof(inet_addr_t)) { 119 119 async_answer_0(callid, EINVAL); … … 121 121 return; 122 122 } 123 123 124 124 rc = async_data_read_finalize(callid, &hinfo->addr, size); 125 125 if (rc != EOK) { … … 128 128 return; 129 129 } 130 130 131 131 if (!async_data_read_receive(&callid, &size)) { 132 132 async_answer_0(callid, EREFUSED); … … 134 134 return; 135 135 } 136 136 137 137 size_t act_size = str_size(hinfo->cname); 138 138 if (act_size > size) { … … 141 141 return; 142 142 } 143 143 144 144 rc = async_data_read_finalize(callid, hinfo->cname, act_size); 145 145 if (rc != EOK) 146 146 async_answer_0(callid, rc); 147 147 148 148 async_answer_0(iid, rc); 149 149 150 150 dns_hostinfo_destroy(hinfo); 151 151 } … … 155 155 { 156 156 log_msg(LOG_DEFAULT, LVL_DEBUG, "inet_get_srvaddr_srv()"); 157 157 158 158 ipc_callid_t callid; 159 159 size_t size; … … 163 163 return; 164 164 } 165 165 166 166 if (size != sizeof(inet_addr_t)) { 167 167 async_answer_0(callid, EINVAL); … … 169 169 return; 170 170 } 171 171 172 172 // FIXME locking 173 173 174 174 errno_t rc = async_data_read_finalize(callid, &dns_server_addr, size); 175 175 if (rc != EOK) 176 176 async_answer_0(callid, rc); 177 177 178 178 async_answer_0(iid, rc); 179 179 } … … 183 183 { 184 184 log_msg(LOG_DEFAULT, LVL_DEBUG, "dnsr_set_srvaddr_srv()"); 185 185 186 186 ipc_callid_t callid; 187 187 size_t size; … … 191 191 return; 192 192 } 193 193 194 194 if (size != sizeof(inet_addr_t)) { 195 195 async_answer_0(callid, EINVAL); … … 197 197 return; 198 198 } 199 199 200 200 // FIXME locking 201 201 202 202 errno_t rc = async_data_write_finalize(callid, &dns_server_addr, size); 203 203 if (rc != EOK) { … … 205 205 async_answer_0(iid, rc); 206 206 } 207 207 208 208 async_answer_0(iid, rc); 209 209 } -
uspace/srv/net/dnsrsrv/query.c
r3061bc1 ra35b458 54 54 if (sname == NULL) 55 55 return ENOMEM; 56 56 57 57 char *qname = str_dup(name); 58 58 if (qname == NULL) { … … 60 60 return ENOMEM; 61 61 } 62 62 63 63 dns_question_t *question = calloc(1, sizeof(dns_question_t)); 64 64 if (question == NULL) { … … 67 67 return ENOMEM; 68 68 } 69 69 70 70 question->qname = qname; 71 71 question->qtype = qtype; 72 72 question->qclass = DC_IN; 73 73 74 74 dns_message_t *msg = dns_message_new(); 75 75 if (msg == NULL) { … … 79 79 return ENOMEM; 80 80 } 81 81 82 82 msg->id = msg_id++; 83 83 msg->qr = QR_QUERY; … … 87 87 msg->rd = true; 88 88 msg->ra = false; 89 89 90 90 list_append(&question->msg, &msg->question); 91 91 92 92 log_msg(LOG_DEFAULT, LVL_DEBUG, "dns_name_query: send DNS request"); 93 93 dns_message_t *amsg; … … 98 98 return rc; 99 99 } 100 100 101 101 list_foreach(amsg->answer, msg, dns_rr_t, rr) { 102 102 log_msg(LOG_DEFAULT, LVL_DEBUG, " - '%s' %u/%u, dsize %zu", 103 103 rr->name, rr->rtype, rr->rclass, rr->rdata_size); 104 104 105 105 if ((rr->rtype == DTYPE_CNAME) && (rr->rclass == DC_IN) && 106 106 (str_cmp(rr->name, sname) == 0)) { 107 107 108 108 log_msg(LOG_DEFAULT, LVL_DEBUG, "decode cname (%p, %zu, %zu)", 109 109 amsg->pdu.data, amsg->pdu.size, rr->roff); 110 110 111 111 char *cname; 112 112 size_t eoff; … … 114 114 if (rc != EOK) { 115 115 assert((rc == EINVAL) || (rc == ENOMEM)); 116 116 117 117 log_msg(LOG_DEFAULT, LVL_DEBUG, "error decoding cname"); 118 118 119 119 dns_message_destroy(msg); 120 120 dns_message_destroy(amsg); 121 121 free(sname); 122 122 123 123 return rc; 124 124 } 125 125 126 126 log_msg(LOG_DEFAULT, LVL_DEBUG, "name = '%s' " 127 127 "cname = '%s'", sname, cname); 128 128 129 129 /* Continue looking for the more canonical name */ 130 130 free(sname); 131 131 sname = cname; 132 132 } 133 133 134 134 if ((qtype == DTYPE_A) && (rr->rtype == DTYPE_A) && 135 135 (rr->rclass == DC_IN) && (rr->rdata_size == sizeof(addr32_t)) && 136 136 (str_cmp(rr->name, sname) == 0)) { 137 137 138 138 info->cname = str_dup(rr->name); 139 139 if (info->cname == NULL) { … … 141 141 dns_message_destroy(amsg); 142 142 free(sname); 143 143 144 144 return ENOMEM; 145 145 } 146 146 147 147 inet_addr_set(dns_uint32_t_decode(rr->rdata, rr->rdata_size), 148 148 &info->addr); 149 149 150 150 dns_message_destroy(msg); 151 151 dns_message_destroy(amsg); 152 152 free(sname); 153 153 154 154 return EOK; 155 155 } 156 156 157 157 if ((qtype == DTYPE_AAAA) && (rr->rtype == DTYPE_AAAA) && 158 158 (rr->rclass == DC_IN) && (rr->rdata_size == sizeof(addr128_t)) && 159 159 (str_cmp(rr->name, sname) == 0)) { 160 160 161 161 info->cname = str_dup(rr->name); 162 162 if (info->cname == NULL) { … … 164 164 dns_message_destroy(amsg); 165 165 free(sname); 166 166 167 167 return ENOMEM; 168 168 } 169 169 170 170 addr128_t addr; 171 171 dns_addr128_t_decode(rr->rdata, rr->rdata_size, addr); 172 172 173 173 inet_addr_set6(addr, &info->addr); 174 174 175 175 dns_message_destroy(msg); 176 176 dns_message_destroy(amsg); 177 177 free(sname); 178 178 179 179 return EOK; 180 180 } 181 181 } 182 182 183 183 log_msg(LOG_DEFAULT, LVL_DEBUG, "'%s' not resolved, fail", sname); 184 184 185 185 dns_message_destroy(msg); 186 186 dns_message_destroy(amsg); 187 187 free(sname); 188 188 189 189 return EIO; 190 190 } … … 195 195 if (info == NULL) 196 196 return ENOMEM; 197 197 198 198 errno_t rc; 199 199 200 200 switch (ver) { 201 201 case ip_any: 202 202 rc = dns_name_query(name, DTYPE_AAAA, info); 203 203 204 204 if (rc != EOK) 205 205 rc = dns_name_query(name, DTYPE_A, info); 206 206 207 207 break; 208 208 case ip_v4: … … 215 215 rc = EINVAL; 216 216 } 217 217 218 218 if (rc == EOK) 219 219 *rinfo = info; 220 220 else 221 221 free(info); 222 222 223 223 return rc; 224 224 }
Note:
See TracChangeset
for help on using the changeset viewer.