/* print_addr.c * ホストネームのアドレスの表示 */ #include "apr_general.h" #include "apr_network_io.h" #include "mystab.h" #define K_BUF_SIZE 1024 int apr_my_main ( int ac, char **av, apr_file_t * astdin, apr_file_t * astdout, apr_file_t * astderr, apr_pool_t * pool ) { apr_status_t rv; apr_sockaddr_t *sa; char error_buf[256]; char *buf; char *hostname; if (ac < 2) { printf("Usage: %s hostname\n", av[0]); return 1; /* エラー終了 */ } hostname = av[1]; /* hostname の sockaddr のリストを取得。 * アドレスファミリは APR_UNSPEC にしておいて、IPv4 or IPv6 or IPv4+IPv6をプラットフォーム依存に。 */ if (APR_SUCCESS != (rv = apr_sockaddr_info_get(&sa, hostname, APR_UNSPEC, 0, 0, pool))) { apr_file_printf(astderr, "ERROR: apr_sockaddr_info_get: %s\n", apr_strerror(rv, error_buf, sizeof(error_buf))); return 1; /* エラー終了 */ } buf = apr_palloc(pool, K_BUF_SIZE); /* 取得した sockaddr のリストからそれぞれのIPアドレスを取得して表示 */ for (; sa!=NULL; sa=sa->next) { if (APR_SUCCESS != (rv = apr_sockaddr_ip_get (&buf, sa))) { apr_file_printf(astderr, "ERROR: apr_sockaddr_ip_getbuf: %s\n", apr_strerror(rv, error_buf, sizeof(error_buf))); return 1; /* エラー終了 */ } apr_file_printf(astdout, "[%s]\n", buf); } /* 正常終了 */ return 0; }