Man page - getservbyname_r(3)

Packages contains this manual

Available languages:

en fr ja ru ro

Manual

GETSERVENT_R

名 前
書 式
説 明
返 り 値
エ ラ ー
属 性
準 拠

プ ロ グ ラ ム の ソ ー ス
関 連 項 目
こ の 文 書 に つ い て

名 前

getservent_r, getservbyname_r, getservbyport_r - サ ー ビ ス エ ン ト リ ー を 取 得 す る (リ エ ン ト ラ ン ト 版 )

書 式

#include <netdb.h>

int getservent_r(struct servent * result_buf , char * buf ,
size_t
buflen , struct servent ** result );

int getservbyname_r(const char * name , const char * proto ,
struct servent *
result_buf , char * buf ,
size_t
buflen , struct servent ** result );

int getservbyport_r(int port , const char * proto ,
struct servent *
result_buf , char * buf ,
size_t
buflen , struct servent ** result );

glibc 向 け の 機 能 検 査 マ ク ロ の 要 件 ( feature_test_macros (7) 参 照 ):

getservent_r (), getservbyname_r (), getservbyport_r ():
Since glibc 2.19:
_DEFAULT_SOURCE
Glibc 2.19 and earlier:
_BSD_SOURCE || _SVID_SOURCE

説 明

関 数 getservent_r (), getservbyname_r (), getservbyport_r () は 、 そ れ ぞ れ getservent (3), getservbyname (3), getservbyport (3) の リ エ ン ト ラ ン ト 版 で あ る 。 servent 構 造 体 の 返 し 方 と 、 関 数 呼 び 出 し 時 の 引 数 と 返 り 値 が 異 な る 。 こ の マ ニ ュ ア ル ペ ー ジ で は 、 リ エ ン ト ラ ン ト で な い 関 数 と の 違 い だ け を 説 明 す る 。

こ れ ら の 関 数 は 、 関 数 の 結 果 と し て 静 的 に 割 り 当 て ら れ た servent 構 造 体 へ の ポ イ ン タ ー を 返 す の で は な く 、 servent 構 造 体 を result_buf が 指 す 場 所 に コ ピ ー す る 。

配 列 buf は 、 返 さ れ る servent 構 造 体 が 指 す 文 字 列 フ ィ ー ル ド を 格 納 す る の に 使 用 さ れ る (リ エ ン ト ラ ン ト で な い 関 数 の 場 合 は 、 こ れ ら の 文 字 列 は 静 的 な 領 域 に 格 納 さ れ る )。 こ の 配 列 の 大 き さ は buflen で 指 定 さ れ る 。 buf が 小 さ す ぎ る 場 合 、 関 数 呼 び 出 し は エ ラ ー ERANGE で 失 敗 し 、 呼 び 出 し 側 で は も っ と 大 き な バ ッ フ ァ ー で 再 度 呼 び 出 す 必 要 が あ る (ほ と ん ど の ア プ リ ケ ー シ ョ ン で は 、 長 さ 1024 バ イ ト の バ ッ フ ァ ー で 十 分 な は ず で あ る )。

関 数 呼 び 出 し で サ ー ビ ス レ コ ー ド の 取 得 に 成 功 す る と 、 *result result_buf を 指 す よ う に 設 定 さ れ る 。 そ れ 以 外 の 場 合 は *result に NULL が 設 定 さ れ る 。

返 り 値

成 功 す る と 、 こ れ ら の 関 数 は 0 を 返 す 。 エ ラ ー の 場 合 、 「 エ ラ ー 」 の 節 の リ ス ト に あ る 正 の エ ラ ー 番 号 の い ず れ か を 返 す 。

エ ラ ー の 場 合 、 レ コ ー ド が 見 つ か ら な か っ た 場 合 ( getservbyname_r (), getservbyaddr_r ()) や こ れ 以 上 レ コ ー ド が な い 場 合 ( getservent_r ())、 result に は NULL が 設 定 さ れ る 。

エ ラ ー

ENOENT

( getservent_r ()) デ ー タ ベ ー ス に こ れ 以 上 レ コ ー ド が な い 。

ERANGE

buf が 小 さ す ぎ る 。 も っ と 大 き な バ ッ フ ァ ー に し て (ま た は buflen を 増 や し て ) 再 度 呼 び 出 す こ と 。

属 性

こ の 節 で 使 用 さ れ て い る 用 語 の 説 明 は attributes (7) を 参 照 の こ と 。

Image grohtml-16020-1.png

準 拠

こ れ ら の 関 数 は GNU に よ る 拡 張 で あ る 。 他 の シ ス テ ム に も 同 様 の 名 前 の 関 数 が 存 在 す る 場 合 が あ る が 、 通 常 は 関 数 の 引 数 が 異 な る 。

以 下 の プ ロ グ ラ ム は 、 getservbyport_r () を 使 っ て 、 コ マ ン ド ラ イ ン 引 数 で 指 定 さ れ た ポ ー ト 番 号 と プ ロ ト コ ル 名 を 持 つ サ ー ビ ス レ コ ー ド を 取 得 す る 。 三 番 目 の コ マ ン ド ラ イ ン 引 数 (整 数 値 ) が 指 定 さ れ た 場 合 は 、 そ の 値 が buflen の 初 期 値 と し て 使 用 さ れ る 。 getservbyport_r () が エ ラ ー ERANGE で 失 敗 す る と 、 プ ロ グ ラ ム は よ り 大 き な バ ッ フ ァ ー サ イ ズ で 再 度 getservbyport_r を 呼 び 出 す 。 下 記 の シ ェ ル の セ ッ シ ョ ン は 実 行 例 を 示 し て い る 。

$ ./a.out 7 tcp 1
ERANGE! Retrying with larger buffer
getservbyport_r() returned: 0 (success) (buflen=87)
s_name=echo; s_proto=tcp; s_port=7; aliases=
$ ./a.out 77777 tcp
getservbyport_r() returned: 0 (success) (buflen=1024)
Call failed/record not found

プ ロ グ ラ ム の ソ ー ス

#define _GNU_SOURCE
#include <ctype.h>
#include <netdb.h>
#include <stdlib.h>
#include <stdio.h>
#include <errno.h>
#include <string.h>

#define MAX_BUF 10000

int
main(int argc, char *argv[])
{
int buflen, erange_cnt, port, s;
struct servent result_buf;
struct servent *result;
char buf[MAX_BUF];
char *protop;

if (argc < 3) {
printf("Usage: %s port-num proto-name [buflen]\n", argv[0]);
exit(EXIT_FAILURE);
}

port = htons(atoi(argv[1]));
protop = (strcmp(argv[2], "null") == 0 ||
strcmp(argv[2], "NULL") == 0) ? NULL : argv[2];

buflen = 1024;
if (argc > 3)
buflen = atoi(argv[3]);

if (buflen > MAX_BUF) {
printf("Exceeded buffer limit (%d)\n", MAX_BUF);
exit(EXIT_FAILURE);
}

erange_cnt = 0;
do {
s = getservbyport_r(port, protop, &result_buf,
buf, buflen, &result);
if (s == ERANGE) {
if (erange_cnt == 0)
printf("ERANGE! Retrying with larger buffer\n");
erange_cnt++;

/* Increment a byte at a time so we can see exactly
what size buffer was required */

buflen++;

if (buflen > MAX_BUF) {
printf("Exceeded buffer limit (%d)\n", MAX_BUF);
exit(EXIT_FAILURE);
}
}
} while (s == ERANGE);

printf("getservbyport_r() returned: %s (buflen=%d)\n",
(s == 0) ? "0 (success)" : (s == ENOENT) ? "ENOENT" :
strerror(s), buflen);

if (s != 0 || result == NULL) {
printf("Call failed/record not found\n");
exit(EXIT_FAILURE);
}

printf("s_name=%s; s_proto=%s; s_port=%d; aliases=",
result_buf.s_name, result_buf.s_proto,
ntohs(result_buf.s_port));
for (char **p = result_buf.s_aliases; *p != NULL; p++)
printf("%s ", *p);
printf("\n");

exit(EXIT_SUCCESS);
}

関 連 項 目

getservent (3), services (5)

こ の 文 書 に つ い て

こ の man ペ ー ジ は Linux man-pages プ ロ ジ ェ ク ト の リ リ ー ス 5.10 の 一 部 で あ る 。 プ ロ ジ ェ ク ト の 説 明 と バ グ 報 告 に 関 す る 情 報 は https://www.kernel.org/doc/man-pages/ に 書 か れ て い る 。