From mboxrd@z Thu Jan 1 00:00:00 1970 From: lhh@sourceware.org Date: 12 Jul 2006 15:01:11 -0000 Subject: [Cluster-devel] cluster/rgmanager/src/utils clufindhostname.c Message-ID: <20060712150111.6078.qmail@sourceware.org> List-Id: To: cluster-devel.redhat.com MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit 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 + * IPv6 support added 7/2006 */ #include #include @@ -28,54 +29,65 @@ #include #include -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); +}