Changeset a35b458 in mainline for uspace/srv/net/dnsrsrv/query.c
- Timestamp:
- 2018-03-02T20:10:49Z (7 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)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
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.