From: Thadeu Lima de Souza Cascardo Date: Fri, 7 Jun 2013 21:55:18 +0000 (-0300) Subject: Use getaddrinfo to obtain receitanet's addresses. X-Git-Tag: v0.1~40 X-Git-Url: http://git.cascardo.info/?p=cascardo%2Flibreceita.git;a=commitdiff_plain;h=271a44b5f522dc816abcd7b2c4ac50f6219c4c4d Use getaddrinfo to obtain receitanet's addresses. The name address for receitanet is receitanet.receita.fazenda.gov.br. Instead of using its IPv4 address directly, tries to resolve the name and use the given addresses. As a bonus, allows us to use /etc/hosts to debug with a test server. --- diff --git a/rnetclient.c b/rnetclient.c index 24d542e..e4c7638 100644 --- a/rnetclient.c +++ b/rnetclient.c @@ -24,6 +24,7 @@ #include #include #include +#include #include #include @@ -111,9 +112,45 @@ static int inflateRecord(char *buffer, size_t len, char **out, size_t *olen) return 0; } -int main(int argc, char **argv) +#define RNET_ADDRESS "receitanet.receita.fazenda.gov.br" + +static int connect_rnet(int *c) { + struct addrinfo *addresses; + struct addrinfo *addr; + struct addrinfo hint; struct sockaddr_in saddr; + int r; + int fd = *c = -1; + int i; + memset(&hint, 0, sizeof(hint)); + hint.ai_family = AF_UNSPEC; + hint.ai_socktype = SOCK_STREAM; + hint.ai_protocol = IPPROTO_TCP; + hint.ai_flags = AI_ADDRCONFIG; + r = getaddrinfo(RNET_ADDRESS, "3456", &hint, &addresses); + if (r) { + return r; + } + for (addr = addresses; addr != NULL; addr = addr->ai_next) { + fd = socket(addr->ai_family, addr->ai_socktype, + addr->ai_protocol); + if (fd >= 0) + if (!(r = connect(fd, addr->ai_addr, + addr->ai_addrlen))) + break; + close(fd); + fd = -1; + } + freeaddrinfo(addresses); + *c = fd; + if (fd == -1) + return EAI_SYSTEM; + return 0; +} + +int main(int argc, char **argv) +{ int c; int r; char buffer[2048]; @@ -122,14 +159,10 @@ int main(int argc, char **argv) gnutls_session_t session; gnutls_global_init(); session_new(&session); - c = socket(PF_INET, SOCK_STREAM, 0); - saddr.sin_family = AF_INET; - saddr.sin_port = htons(3456); - saddr.sin_addr.s_addr = inet_addr("161.148.185.11"); - r = connect(c, (struct sockaddr *) &saddr, sizeof(saddr)); - if (r < 0) { + r = connect_rnet(&c); + if (r) { fprintf(stderr, "error connecting to server: %s\n", - strerror(errno)); + r == EAI_SYSTEM ? strerror(errno) : gai_strerror(r)); exit(1); } gnutls_transport_set_ptr(session, (gnutls_transport_ptr_t) c);