From owner-freebsd-questions@FreeBSD.ORG Wed Jan 18 13:31:22 2012 Return-Path: Delivered-To: questions@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id A60F8106564A for ; Wed, 18 Jan 2012 13:31:22 +0000 (UTC) (envelope-from martin@dc.cis.okstate.edu) Received: from x.it.okstate.edu (x.it.okstate.edu [139.78.2.13]) by mx1.freebsd.org (Postfix) with ESMTP id 6047F8FC12 for ; Wed, 18 Jan 2012 13:31:22 +0000 (UTC) Received: from dc.cis.okstate.edu (localhost [127.0.0.1]) by x.it.okstate.edu (8.14.4/8.14.4) with ESMTP id q0ID1Mss037383 for ; Wed, 18 Jan 2012 07:01:22 -0600 (CST) (envelope-from martin@dc.cis.okstate.edu) Message-Id: <201201181301.q0ID1Mss037383@x.it.okstate.edu> To: questions@freebsd.org Date: Wed, 18 Jan 2012 07:01:22 -0600 From: Martin McCormick Cc: Subject: Sample getaddrinfo Code Compiles in Linux but not FreeBSD. X-BeenThere: freebsd-questions@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: User questions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Wed, 18 Jan 2012 13:31:22 -0000 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 #include #include #include #include #include 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; }