7

ANSI C(Linux)でプログラムによってホストのローカルドメインサフィックスを取得しようとしています。例:私のマシンはironside.0ffnet.netですが、「0ffnet.net」を取得したいと思います。

getnameinfo()とgetaddrinfo()を使用してこれに対処する投稿をいくつか見てきましたが、これらの関数は、マシンにローカルなインターフェイスアドレスの/ etc/hostsファイルから情報を取得しているようです。

マシンにDHCP経由でアドレス(および対応するドメインサフィックス)が割り当てられている場合、/ etc / hostsファイルは更新されず、代わりにこの情報が/etc/resolv.confに保存されます。例:

dfex@ironside:~/hush$cat /etc/resolv.conf 
domain 0ffnet.net
search 0ffnet.net
nameserver 139.130.4.4

その結果、getnameinfo()とgetaddrinfo()はどちらも、次のような/ etc / hosts情報を使用して、サフィックスなしでマシンのホスト名を返すだけです。

dfex@ironside:~/hush$ cat /etc/hosts
::1             ironside localhost6.localdomain6 localhost6
127.0.1.1       ironside
127.0.0.1       localhost
::1             localhost ip6-localhost ip6-loopback

system()呼び出しに頼らずにこの情報をプルする関数を知っている人はいますか?私はBeejのガイドをくまなく調べてきましたが、あまり成功していません。

4

3 に答える 3

2

この質問を分解して、別々に答える必要があります。最初にタイトルの質問。

DHCPドメイン

DHCPクライアントがDHCPサーバーから何を受信したかを実際に知る唯一の方法は、クライアントが残したファイルを読み取ることです/var/lib/dhcp。他の何かがを制御している場合、DHCPによって提案された検索ドメインはまったく使用されない可能性がありますresolv.conf

「ホストのローカルドメインサフィックス」

ホストは複数のドメインに属している場合と属していない場合があり、これを定義するのは難しい概念です。resolv.conf解決しようとしているホスト名を検索するドメインを指定します。自分のホスト名に適用したときに検索が成功するという基本的な保証はありません。

なんでもいい!リゾルバー検索リストは私が本当に欲しいものです。どうすれば入手できますか?

電話して、および/またはres_initを見てください。または自分自身を解析します。とてもシンプルで安定したフォーマットです。_res.dnsrch_res.defdnameresolv.conf

では、getdomainname()は何のためにあるのでしょうか?

それはおそらくあなたが望まないNIS(YP)のためのものです。

于 2012-09-01T22:29:26.883 に答える
1

あなたは使用を試みることができます:

int getdomainname(char *name, size_t len);

このプログラムを実行してみてください:

#include <unistd.h>
#include <stdio.h>

int main()
{
 char buf[255];
 getdomainname(buf, 255);
 printf("Domain: %s\n", buf);
 return 0; 
}

編集:

いいえ、何度も試した後、syscallと醜いCパーサーを使用する必要があると思います(内部でAWKを使用すると、popenこのコードが少し短くなります)。

このコードは私にとってはうまくいくようです:

#include <stdio.h>
#include <string.h>

int main()
{
 char buf[255];
 const char reqhostname[255] = "ENTER_YOUR_HOSTNAME_HERE";

 FILE *fd;
 char readbuf[255];
 char *pch;
 int token_counter = 0;

 memset(buf, 0, 255);
 strcat(buf, "host ");
 strcat(buf, reqhostname);
 fd = popen(buf, "r");
 fgets(readbuf, 255, fd);
 printf("Host returned: %s\n", readbuf);
 pclose(fd);

 pch = strtok(readbuf, " ");
 while (pch != NULL)
   {
        strcpy(buf, pch);
        break;
   }

 memset(buf2, 0, 255);
 pch = strtok(buf, ".");
 while (pch != NULL)
   {
        pch = strtok(NULL, ".");
        if (pch == NULL)
           {
                memset(buf, 0, 255);
                strncpy(buf, buf2, strlen(buf2) - 1);
                break;
           }
        token_counter++;
        strcat(buf2, pch);
        strcat(buf2, ".");
   }

 printf("Domain: %s\n", buf);

 return 0;
}
于 2012-09-01T11:54:10.823 に答える
1

間違いなく正しい方向を示してくれた@alan-curryに感謝します。これに苦労している他の人にとって、res_initは間違いなく行く方法です。ローカルドメインのサフィックスを取得する簡単な方法は次のとおりです。

#include <stdio.h>
#include <resolv.h>

int main (int argc, char *argv[]) {

res_init();

printf ("Default domain: %s\n", _res.defdname);
return 0;
}
于 2012-09-02T10:33:50.117 に答える