print_addr.c
最終更新:2009/10/10
001: /* print_addr.c 002: * ホストネームのアドレスの表示 003: */ 004: 005: #include "apr_general.h" 006: #include "apr_network_io.h" 007: 008: #include "mystab.h" 009: 010: #define K_BUF_SIZE 1024 011: 012: int apr_my_main ( 013: int ac, 014: char **av, 015: apr_file_t * astdin, 016: apr_file_t * astdout, 017: apr_file_t * astderr, 018: apr_pool_t * pool 019: ) { 020: apr_status_t rv; 021: apr_sockaddr_t *sa; 022: 023: char error_buf[256]; 024: char *buf; 025: char *hostname; 026: 027: if (ac < 2) { 028: printf("Usage: %s hostname\n", av[0]); 029: return 1; /* エラー終了 */ 030: } 031: hostname = av[1]; 032: 033: /* hostname の sockaddr のリストを取得。 034: * アドレスファミリは APR_UNSPEC にしておいて、IPv4 or IPv6 or IPv4+IPv6をプラットフォーム依存に。 035: */ 036: if (APR_SUCCESS != (rv = apr_sockaddr_info_get(&sa, hostname, APR_UNSPEC, 0, 0, pool))) { 037: apr_file_printf(astderr, 038: "ERROR: apr_sockaddr_info_get: %s\n", apr_strerror(rv, error_buf, sizeof(error_buf))); 039: return 1; /* エラー終了 */ 040: } 041: 042: buf = apr_palloc(pool, K_BUF_SIZE); 043: 044: /* 取得した sockaddr のリストからそれぞれのIPアドレスを取得して表示 */ 045: for (; sa!=NULL; sa=sa->next) { 046: 047: if (APR_SUCCESS != (rv = apr_sockaddr_ip_get (&buf, sa))) { 048: apr_file_printf(astderr, 049: "ERROR: apr_sockaddr_ip_getbuf: %s\n", apr_strerror(rv, error_buf, sizeof(error_buf))); 050: return 1; /* エラー終了 */ 051: } 052: 053: apr_file_printf(astdout, "[%s]\n", buf); 054: } 055: 056: /* 正常終了 */ 057: 058: return 0; 059: 060: }
KAKU PROJECT (2009) |