Linux Install Memo

サーバー管理者によるLinux関連ソフトのインストールメモ

Home » □C言語ソースをPerlモジュールにする

□C言語ソースをPerlモジュールにする

参考URL:
http://www.rainylain.jp/vc/perl_module.htm

Perlは文字列操作にはとてもすばらしい機能を発揮しますが、どうしても
C言語で出来た外部関数とリンクしたい、という時になったときにCとPerl
とのやり取りをしてくれるPerlモジュールを作成すると結構楽です。

今回はdracdが動いているホストに指定したIPアドレスを登録する、という
モジュールをつくる。名づけて「drac4perl」かな?

もともとdracのソースには「testing.c」という、dracのデータベースに
指定したIPアドレスを入れてくれる簡単なクライアントソースがついている
ので、これをPerlモジュール化してしまうと楽ですね。(あー手抜きだ!)

testing.c をみてみると、ポイントとなるところは

>???????? host = argv[1];
>???????? ip = inet_addr(argv[2]);
>???????? rc = dracauth(host, ip, &err);

ここだけ。dracauthで、引数で渡されたdracdが動いているhostに対してip
を登録しているだけ。これを導入したPerlモジュールを作ればよい。

まずはモジュール名を決めましょう。参考URLのとおりに h2xs で骨組みを
つくります。

> # h2xs -A -n Drac4Perl
> Defaulting to backwards compatibility with perl 5.8.4
> If you intend this module to be compatible with earlier perl versions, please
> specify a minimum perl version with the -b option.
>
> Writing Drac4Perl/ppport.h
> Writing Drac4Perl/lib/Drac4Perl.pm
> Writing Drac4Perl/Drac4Perl.xs
> Writing Drac4Perl/Makefile.PL
> Writing Drac4Perl/README
> Writing Drac4Perl/t/Drac4Perl.t
> Writing Drac4Perl/Changes
> Writing Drac4Perl/MANIFEST

で、できた Drac4Perl.xsを下記のようにする。

> #include “EXTERN.h”
> #include “perl.h”
> #include “XSUB.h”
>
> #include “ppport.h”
>
> // ——————————–
> // C言語ソースコード(Perlに影響しない部分)
> #include <stdio.h>
> #include <sys/types.h>
> #include <netinet/in.h>
> #include <arpa/inet.h>
>
> drac_in(host, ipaddr)
>???????? char *host;???? // dracd が動いているホストのIPアドレス
>???????? char *ipaddr;?? // dracd に登録したいユーザーのIPアドレス
> {
>???????? int result;???????????? // 処理結果
>???????? unsigned long ip;?????? // IPアドレス(long int)
>???????? char *err;????????????? // エラー理由(今回は無視)
>
>???????? // IPアドレスを変換
>???????? ip = inet_addr(ipaddr);
>???????? // dracd に登録&結果を返す
>???????? return dracauth(host, ip, &err);
> }
>
>
> // ——————————–
> // Perlモジュール宣言
> MODULE = Drac4Perl????????????? PACKAGE = Drac4Perl
>
> int
> auth(server, client)
>???? char *server;
>???? char *client;
>
>???? CODE:
>???????? RETVAL = drac_in(server, client);
>
>???? OUTPUT:
>???????? RETVAL

で、Makefile.PL のライブラリを指定する部分に「-ldrac」を追加して

> use 5.008004;
> use ExtUtils::MakeMaker;
> # See lib/ExtUtils/MakeMaker.pm for details of how to influence
> # the contents of the Makefile that is written.
> WriteMakefile(
>???? NAME????????????? => ‘Drac4Perl’,
>???? VERSION_FROM????? => ‘lib/Drac4Perl.pm’, # finds $VERSION
>???? PREREQ_PM???????? => {}, # e.g., Module::Name => 1.1
>???? ($] >= 5.005 ????? ## Add these new keywords supported since 5.005
>?????? (ABSTRACT_FROM? => ‘lib/Drac4Perl.pm’, # retrieve abstract from module
>??????? AUTHOR???????? => ‘A. U. Thor <root@linet.gr.jp>’) : ()),
>???? LIBS????????????? => [‘-ldrac’], # e.g., ‘-lm’
>???? DEFINE??????????? => ”, # e.g., ‘-DHAVE_SOMETHING’
>???? INC?????????????? => ‘-I.’, # e.g., ‘-I. -I/usr/include/other’
>???????? # Un-comment this if you add C files to link with later:
>???? # OBJECT??????????? => ‘$(O_FILES)’, # link all the C files too
> );

perl Makefile.PL
make
make install

すればOK。

あとは下記のようなテストプログラム(dractest.pl)で試してみればよい。

> #!/usr/bin/perl
> #
> # Drac4Perlモジュールのテスト
> #
> use Drac4Perl;
>
> $RESULT =? Drac4Perl::auth(“localhost”, “192.168.100.3”);
>
> system(“/usr/bin/db_dump -p /etc/postfix/dracd.db”);
>
> exit 0;

として、これを実行すれば、drac がちゃんとインストールされていれば

> # ./dractest.pl
> VERSION=3
> format=print
> type=hash
> h_nelem=3
> db_pagesize=512
> HEADER=END
>? 192.168.100.3
>? 1143172343
> DATA=END

と、こんな風に登録されればOK!

Name of author

Name: admin

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です