2008年4月 2日

[pgsql-jp: 39336] Re: 端末の名称

早川と申します。

From: zen-pgsql@xxxxx
Subject: [pgsql-jp: 39334] Re: 端末の名称
Date: Wed, 02 Apr 2008 00:13:51 +0900 (JST)
Message-ID: <20080402.001351.98893685.inetd@xxxxx>

> 1. DHCPサーバ(もしくはクライアント)とDNSサーバを連携

> --> DNSのDynamic Update機能を利用してDNSサーバにDHCPクライアント
> を登録する

DHCP で配布する範囲のアドレスを、あらかじめ静的に DNS に登録していると
ころもあると思います。

生島さんの質問に戻りますが、逆引きで良いのでしたら、getnameinfo() あた
りを使うような PostgreSQL のユーザ定義関数を自作すれば良いと思います。

で、例として、私自身のユーザ定義関数の勉強も兼ねてちょっと作ってみまし
た。ただし、RHEL5 + PostgreSQL 8.1.4 でしか試してません。セキュリティ
的な対策もエラー処理も何も考えずに作っていますので、そのあたりご容赦く
ださい。
# メモリリークもあやしいかも…

引数は、ドット付 10 進表記の IP アドレス(TEXT 型)を一つ取るようにして
います。
# inet_client_addr() を使うのであれば
# split_part(inet_client_addr()::text, '/', 1) として取得できるもので
# す。

------------------------- きりとり -------------------------
#include <stdio.h>
#include <string.h>
#include <netdb.h>
#include <arpa/inet.h>
#include "postgres.h"
#include "fmgr.h"
#include "utils/builtins.h"

PG_FUNCTION_INFO_V1(get_host_name);

Datum get_host_name(PG_FUNCTION_ARGS){

text *text_ipaddr = PG_GETARG_TEXT_P(0);
char* ipaddr = NULL, buf[NI_MAXHOST] = "";
struct addrinfo *aires = NULL;

ipaddr = DatumGetCString(DirectFunctionCall1(textout,
PointerGetDatum(text_ipaddr)));

if(getaddrinfo(ipaddr, NULL, NULL, &aires) != 0){
if(aires) freeaddrinfo(aires);
if(ipaddr) pfree(ipaddr);
PG_RETURN_TEXT_P(text_ipaddr);
}

if(ipaddr) pfree(ipaddr);

if(getnameinfo((struct sockaddr*)aires->ai_addr, aires->ai_addrlen,
buf, sizeof(buf), NULL, 0, 0) != 0){
if(aires) freeaddrinfo(aires);
PG_RETURN_TEXT_P(text_ipaddr);
}

if(aires) freeaddrinfo(aires);
if(text_ipaddr) pfree(text_ipaddr);

PG_RETURN_TEXT_P(DirectFunctionCall1(textin, CStringGetDatum(buf)));

}
------------------------- きりとり -------------------------

これを共有ライブラリとしてコンパイルして create function で定義すれば
SQL の中で使えると思います。

私の環境だと以下でコンパイル出来ます。

gcc -I/usr/include/pgsql/server -shared get_host_name.c -o get_host_name.so

ご参考までに create function 文は以下です。

create or replace function get_host_name(TEXT)
returns TEXT
as '/path/to/get_host_name.so','get_host_name'
language 'C'

-- はやかわ

投稿者 xml-rpc : 2008年4月 2日 10:35
役に立ちました?:
過去のフィードバック 平均:(0) 総合:(0) 投票回数:(0)
本記事へのTrackback: http://hoop.euqset.org/blog/mt-tb2006.cgi/71690
トラックバック
コメント
コメントする




画像の中に見える文字を入力してください。