Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • uspace/srv/net/dnsrsrv/transport.c

    r26de91a r06fe3b6  
    5252
    5353/** Request timeout (microseconds) */
    54 #define REQ_TIMEOUT (5 * 1000 * 1000)
     54#define REQ_TIMEOUT (5*1000*1000)
    5555
    5656/** Maximum number of retries */
    5757#define REQ_RETRY_MAX 3
    58 
    59 inet_addr_t dns_server_addr;
    6058
    6159typedef struct {
     
    7472static fid_t recv_fid;
    7573static int transport_fd = -1;
     74inet_addr_t dns_server_addr;
    7675
    7776/** Outstanding requests */
     
    158157        assert(fibril_mutex_is_locked(&treq_lock));
    159158
    160         list_foreach(treq_list, lreq, trans_req_t, treq) {
     159        list_foreach(treq_list, link) {
     160                trans_req_t *treq = list_get_instance(link, trans_req_t, lreq);
     161
    161162                if (treq->req->id == resp->id) {
    162163                        /* Match */
     
    181182int dns_request(dns_message_t *req, dns_message_t **rresp)
    182183{
    183         trans_req_t *treq = NULL;
    184         struct sockaddr *saddr = NULL;
    185         socklen_t saddrlen;
    186        
     184        int rc;
    187185        void *req_data;
    188186        size_t req_size;
    189         int rc = dns_message_encode(req, &req_data, &req_size);
     187        struct sockaddr_in addr;
     188        trans_req_t *treq;
     189        int ntry;
     190
     191        req_data = NULL;
     192        treq = NULL;
     193
     194        addr.sin_family = AF_INET;
     195        addr.sin_port = htons(DNS_SERVER_PORT);
     196        addr.sin_addr.s_addr = host2uint32_t_be(dns_server_addr.ipv4);
     197
     198        rc = dns_message_encode(req, &req_data, &req_size);
    190199        if (rc != EOK)
    191200                goto error;
    192        
    193         rc = inet_addr_sockaddr(&dns_server_addr, DNS_SERVER_PORT,
    194             &saddr, &saddrlen);
    195         if (rc != EOK) {
    196                 assert(rc == ENOMEM);
    197                 goto error;
    198         }
    199        
    200         size_t ntry = 0;
    201        
     201
     202        ntry = 0;
     203
    202204        while (ntry < REQ_RETRY_MAX) {
    203205                rc = sendto(transport_fd, req_data, req_size, 0,
    204                     saddr, saddrlen);
     206                    (struct sockaddr *)&addr, sizeof(addr));
    205207                if (rc != EOK)
    206208                        goto error;
    207                
     209
    208210                treq = treq_create(req);
    209211                if (treq == NULL) {
     
    211213                        goto error;
    212214                }
    213                
     215
     216
    214217                fibril_mutex_lock(&treq->done_lock);
    215218                while (treq->done != true) {
     
    221224                        }
    222225                }
    223                
     226
    224227                fibril_mutex_unlock(&treq->done_lock);
    225                
     228
    226229                if (rc != ETIMEOUT)
    227230                        break;
    228231        }
    229        
     232
    230233        if (ntry >= REQ_RETRY_MAX) {
    231234                rc = EIO;
    232235                goto error;
    233236        }
    234        
     237
    235238        if (treq->status != EOK) {
    236239                rc = treq->status;
    237240                goto error;
    238241        }
    239        
     242
    240243        *rresp = treq->resp;
    241244        treq_destroy(treq);
    242245        free(req_data);
    243         free(saddr);
    244246        return EOK;
    245        
    246247error:
    247248        if (treq != NULL)
    248249                treq_destroy(treq);
    249        
    250250        free(req_data);
    251         free(saddr);
    252251        return rc;
    253252}
Note: See TracChangeset for help on using the changeset viewer.