From 271a44b5f522dc816abcd7b2c4ac50f6219c4c4d Mon Sep 17 00:00:00 2001 From: Thadeu Lima de Souza Cascardo Date: Fri, 7 Jun 2013 18:55:18 -0300 Subject: [PATCH] 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. --- rnetclient.c | 49 +++++++++++++++++++++++++++++++++++++++++-------- 1 file changed, 41 insertions(+), 8 deletions(-) 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); -- 2.20.1