print_addr.c

最終更新:2009/10/10

print_addr.c

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: }
Copyright (C) KAKU PROJECT (2009)KAKU PROJECT (2009)