Date: Wed, 18 Jan 2012 18:55:32 +0400 From: Peter Andreev <andreev.peter@gmail.com> To: Martin McCormick <martin@dc.cis.okstate.edu> Cc: questions@freebsd.org Subject: Re: Sample getaddrinfo Code Compiles in Linux but not FreeBSD. Message-ID: <CAE_wXn0-7o-aYxbc8Q742KT%2BZLVbk700RizHOzjej0qb47UrYw@mail.gmail.com> In-Reply-To: <201201181301.q0ID1Mss037383@x.it.okstate.edu> References: <201201181301.q0ID1Mss037383@x.it.okstate.edu>
next in thread | previous in thread | raw e-mail | index | archive | help
2012/1/18 Martin McCormick <martin@dc.cis.okstate.edu> > Here is a sample program kindly provided in the > Beej's Guide to Network Programming > > Using Internet Sockets > > Brian "Beej Jorgensen" Hall > > The code is said to be in the public domain so it is > posted here as it compiles and runs perfectly under Linux but > fails in two places with the following errors: I named it nsl.c. > > nsl.c: In function 'main': > nsl.c:38: error: dereferencing pointer to incomplete type > nsl.c:42: error: dereferencing pointer to incomplete type > > You will see that in both places, the code was > performing the same operation of assigning a value to a pointer > so I am suspecting a prototyping issue but am not sure and hope > someone can help me cut through the forest a little more quickly. > He did provide suggestions for users of Sunos who have reported > errors, but for FreeBSD, the errors did not change. Here is the > sample code with the two error-generating lines marked. > > #include <stdio.h> > #include <string.h> > #include <sys/types.h> > #include <sys/socket.h> > #include <netdb.h> > #include <arpa/inet.h> > > int main(int argc, char *argv[]) > { > struct addrinfo hints, *res, *p; > int status; > char ipstr[INET6_ADDRSTRLEN]; > > if (argc != 2) { > fprintf(stderr,"usage: showip hostname\n"); > return 1; > } > > memset(&hints, 0, sizeof hints); > hints.ai_family = AF_UNSPEC; // AF_INET or AF_INET6 to force version > hints.ai_socktype = SOCK_STREAM; > > if ((status = getaddrinfo(argv[1], NULL, &hints, &res)) != 0) { > fprintf(stderr, "getaddrinfo: %s\n", gai_strerror(status)); > return 2; > } > > printf("IP addresses for %s:\n\n", argv[1]); > > for(p = res;p != NULL; p = p->ai_next) { > void *addr; > char *ipver; > > // get the pointer to the address itself, > // different fields in IPv4 and IPv6: > if (p->ai_family == AF_INET) { // IPv4 > struct sockaddr_in *ipv4 = (struct sockaddr_in *)p->ai_addr; > addr = &(ipv4->sin_addr);/*error*/ > ipver = "IPv4"; > } else { // IPv6 > struct sockaddr_in6 *ipv6 = (struct sockaddr_in6 *)p->ai_addr; > addr = &(ipv6->sin6_addr);/*error*/ > ipver = "IPv6"; > } > > // convert the IP to a string and print it: > inet_ntop(p->ai_family, addr, ipstr, sizeof ipstr); > printf(" %s: %s\n", ipver, ipstr); > } > > freeaddrinfo(res); // free the linked list > > return 0; > } > #include <netinet/in.h> > _______________________________________________ > freebsd-questions@freebsd.org mailing list > http://lists.freebsd.org/mailman/listinfo/freebsd-questions > To unsubscribe, send any mail to " > freebsd-questions-unsubscribe@freebsd.org" > -- -- AP
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?CAE_wXn0-7o-aYxbc8Q742KT%2BZLVbk700RizHOzjej0qb47UrYw>