Changeset 26de91a in mainline for uspace/lib


Ignore:
Timestamp:
2013-10-04T17:19:20Z (12 years ago)
Author:
Jiri Svoboda <jiri@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
9749e47
Parents:
e2839d7
Message:

IPv4 and v6 should not need separate handling by a simple client that is just connecting to a host/address. Add IPv6/DNS support in applications where missing.

Location:
uspace/lib
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • uspace/lib/c/generic/inet/addr.c

    re2839d7 r26de91a  
    636636}
    637637
     638int inet_addr_sockaddr(const inet_addr_t *addr, uint16_t port,
     639    sockaddr_t **nsockaddr, socklen_t *naddrlen)
     640{
     641        sockaddr_in_t *sa4;
     642        sockaddr_in6_t *sa6;
     643
     644        switch (addr->version) {
     645        case ip_v4:
     646                sa4 = calloc(1, sizeof(sockaddr_in_t));
     647                if (sa4 == NULL)
     648                        return ENOMEM;
     649
     650                sa4->sin_family = AF_INET;
     651                sa4->sin_port = host2uint16_t_be(port);
     652                sa4->sin_addr.s_addr = host2uint32_t_be(addr->addr);
     653                if (nsockaddr != NULL)
     654                        *nsockaddr = (sockaddr_t *)sa4;
     655                if (naddrlen != NULL)
     656                        *naddrlen = sizeof(*sa4);
     657                break;
     658        case ip_v6:
     659                sa6 = calloc(1, sizeof(sockaddr_in6_t));
     660                if (sa6 == NULL)
     661                        return ENOMEM;
     662
     663                sa6->sin6_family = AF_INET6;
     664                sa6->sin6_port = host2uint16_t_be(port);
     665                host2addr128_t_be(addr->addr6, sa6->sin6_addr.s6_addr);
     666                if (nsockaddr != NULL)
     667                        *nsockaddr = (sockaddr_t *)sa6;
     668                if (naddrlen != NULL)
     669                        *naddrlen = sizeof(*sa6);
     670                break;
     671        default:
     672                assert(false);
     673                break;
     674        }
     675
     676        return EOK;
     677}
     678
    638679/** @}
    639680 */
  • uspace/lib/c/include/inet/addr.h

    re2839d7 r26de91a  
    3939#include <net/in.h>
    4040#include <net/in6.h>
     41#include <net/socket.h>
    4142
    4243typedef uint32_t addr32_t;
     
    135136
    136137extern ip_ver_t ipver_from_af(int af);
     138extern int inet_addr_sockaddr(const inet_addr_t *, uint16_t, sockaddr_t **,
     139    socklen_t *);
    137140
    138141#endif
  • uspace/lib/http/http.c

    re2839d7 r26de91a  
    174174        }
    175175       
    176         struct sockaddr_in addr;
    177         struct sockaddr_in6 addr6;
    178         uint16_t af = inet_addr_sockaddr_in(&http->addr, &addr, &addr6);
    179        
    180         http->conn_sd = socket(PF_INET, SOCK_STREAM, 0);
     176        struct sockaddr *saddr;
     177        socklen_t saddrlen;
     178       
     179        rc = inet_addr_sockaddr(&http->addr, http->port, &saddr, &saddrlen);
     180        if (rc != EOK) {
     181                assert(rc == ENOMEM);
     182                return ENOMEM;
     183        }
     184       
     185        http->conn_sd = socket(saddr->sa_family, SOCK_STREAM, 0);
    181186        if (http->conn_sd < 0)
    182187                return http->conn_sd;
    183188       
    184         switch (af) {
    185         case AF_INET:
    186                 addr.sin_port = htons(http->port);
    187                 rc = connect(http->conn_sd, (struct sockaddr *) &addr, sizeof(addr));
    188                 break;
    189         case AF_INET6:
    190                 addr6.sin6_port = htons(http->port);
    191                 rc = connect(http->conn_sd, (struct sockaddr *) &addr6, sizeof(addr6));
    192                 break;
    193         default:
    194                 return ENOTSUP;
    195         }
     189        rc = connect(http->conn_sd, saddr, saddrlen);
     190        free(saddr);
    196191       
    197192        return rc;
Note: See TracChangeset for help on using the changeset viewer.