[Cluster-devel] cluster/rgmanager/src/utils clufindhostname.c

lhh at sourceware.org lhh at sourceware.org
Wed Jul 12 15:01:11 UTC 2006


CVSROOT:	/cvs/cluster
Module name:	cluster
Changes by:	lhh at sourceware.org	2006-07-12 15:01:11

Modified files:
	rgmanager/src/utils: clufindhostname.c 

Log message:
	Fix #198406 - lack of ipv6 support in clufindhostname.c

Patches:
http://sourceware.org/cgi-bin/cvsweb.cgi/cluster/rgmanager/src/utils/clufindhostname.c.diff?cvsroot=cluster&r1=1.3&r2=1.4

--- cluster/rgmanager/src/utils/clufindhostname.c	2006/06/02 17:37:11	1.3
+++ cluster/rgmanager/src/utils/clufindhostname.c	2006/07/12 15:01:11	1.4
@@ -1,5 +1,5 @@
 /*
-  Copyright Red Hat, Inc. 2002
+  Copyright Red Hat, Inc. 2002, 2006
   Copyright Mission Critical Linux, 2000
 
   This program is free software; you can redistribute it and/or modify it
@@ -21,6 +21,7 @@
  * Utility/command to return name found by gethostbyname and gethostbyaddr.
  *
  * Author: Richard Rabbat <rabbat at missioncriticallinux.com>
+ * IPv6 support added 7/2006
  */
 #include <netdb.h>
 #include <stdio.h>
@@ -28,54 +29,65 @@
 #include <unistd.h>
 #include <arpa/inet.h>
 
-void usage(char* progname)
+void
+usage(char *progname)
 {
-    fprintf (stderr, "Usage: %s [-i ip_addr] [-n ip_name]\n", progname);
+	fprintf(stderr, "Usage: %s [-i ip_addr] [-n ip_name]\n", progname);
 }
 
-int main (int argc, char** argv) 
+int
+main(int argc, char **argv)
 {
-    struct hostent*   hp;
-    unsigned long int address;
-    int		      opt;
-
-    if (argc != 3)
-    {
-        usage(argv[0]);
-        exit(1);
-    }
-
-    while ((opt = getopt(argc, argv, "i:n:")) != EOF) {
-        switch (opt) {
-	case 'i':
-	    address = inet_addr (optarg);
-
-	    if ( !( hp = gethostbyaddr ((char*)&address, 4, AF_INET )))
-	    {
-	        exit (2);
-	    }
-	    else
-	    {
-	        fprintf (stdout, "%s\n", hp->h_name);
-	        exit (0);
-	    }
-	    break;
-	case 'n':
-	    if ( !( hp = gethostbyname (argv[2])))
-	    {
-	        exit (2);
-	    }
-	  else
-	    {
-	        fprintf (stdout, "%s\n", hp->h_name);
-	        exit (0);
-	    }
-	    break;
-	default:
-	    break;
+	struct hostent *hp;
+	void *ptr;
+	struct in_addr  addr4;
+	struct in6_addr addr6;
+	int opt, size, family;
+	char *sep;
+
+	if (argc != 3) {
+		usage(argv[0]);
+		exit(1);
 	}
-    }
-    exit (0);
-}
-
 
+	while ((opt = getopt(argc, argv, "i:n:")) != EOF) {
+		switch (opt) {
+		case 'i':
+			/* Check for IPv4 address */
+			sep = strchr(optarg, '.');
+			if (sep) {
+				family = AF_INET;
+				ptr = &addr4;
+				size = sizeof(addr4);
+			} else {
+				family = AF_INET6;
+				ptr = &addr6;
+				size = sizeof(addr6);
+			}
+
+			if (inet_pton(family, optarg, ptr) < 0) {
+				perror("inet_pton");
+				exit(2);
+			}
+
+			if (!(hp = gethostbyaddr(ptr, size, family))) {
+				exit(2);
+			} else {
+				fprintf(stdout, "%s\n", hp->h_name);
+				exit(0);
+			}
+			break;
+		case 'n':
+			if (!(hp = gethostbyname(argv[2]))) {
+				exit(2);
+			} else {
+				fprintf(stdout, "%s\n", hp->h_name);
+				exit(0);
+			}
+			break;
+		default:
+			break;
+		}
+	}
+	exit(0);
+}




More information about the Cluster-devel mailing list