12345678910111213141516171819202122232425262728293031323334353637383940414243444546 |
- - implement bind to device functionality
- --- trunk.orig/src/supl.c 2011-10-27 20:41:19.000000000 +0200
- +++ trunk/src/supl.c 2013-04-24 18:56:17.742529773 +0200
- @@ -41,7 +41,7 @@ static struct supl_debug_s {
- } debug;
- #endif
-
- -static int server_connect(char *server);
- +static int server_connect(char *server, char *iface);
- static int pdu_make_ulp_start(supl_ctx_t *ctx, supl_ulp_t *pdu);
- static int pdu_make_ulp_pos_init(supl_ctx_t *ctx, supl_ulp_t *pdu);
- static int pdu_make_ulp_rrlp_ack(supl_ctx_t *ctx, supl_ulp_t *pdu, PDU_t *rrlp);
- @@ -236,7 +236,7 @@ int EXPORT supl_server_connect(supl_ctx_
- if (!ctx->ssl) return E_SUPL_CONNECT;
-
- if (server) {
- - ctx->fd = server_connect(server);
- + ctx->fd = server_connect(server, ctx->iface);
- if (ctx->fd == -1) return E_SUPL_CONNECT;
- }
-
- @@ -266,7 +266,7 @@ void EXPORT supl_close(supl_ctx_t *ctx)
- }
-
-
- -static int server_connect(char *server) {
- +static int server_connect(char *server, char *iface) {
- int fd = -1;
- struct addrinfo *ailist, *aip;
- struct addrinfo hint;
- @@ -283,6 +283,15 @@ static int server_connect(char *server)
- if ((fd = socket(aip->ai_family, SOCK_STREAM, 0)) < 0) {
- err = errno;
- }
- +
- + if (strlen(iface)) {
- + struct ifreq ifr;
- + strncpy(ifr.ifr_name, iface, IFNAMSIZ);
- + ifr.ifr_name[IFNAMSIZ - 1] = 0;
- + if (setsockopt(fd, SOL_SOCKET, SO_BINDTODEVICE, &ifr, sizeof(ifr)))
- + fprintf(stderr, "Error: binding to device %s failed\n", iface);
- + }
- +
- if (connect(fd, aip->ai_addr, aip->ai_addrlen) != 0) {
- return -1;
- }
|