Manpages

名 前

rtime − リ モ ー ト マ シ ン か ら 時 刻 を 取 得 す る

書 式

#include <rpc/auth_des.h>

int rtime(struct sockaddr_in *addrp, struct rpc_timeval *timep,
struct rpc_timeval *
timeout);

説 明

こ の 関 数 は RFC 868 に 記 述 さ れ て い る タ イ ム サ ー バ プ ロ ト コ ル を 使 用 し 、 リ モ ー ト マ シ ン か ら 時 刻 を 取 得 す る 。 タ イ ム サ ー バ プ ロ ト コ ル は 00:00:00 UTC, 1 Jan 1900 か ら 秒 数 を 提 供 す る の で 、 こ の 関 数 は 適 切 な 定 数 値 を 引 く こ と に よ り 、 提 供 さ れ た 値 を Unix に お け る 時 刻 紀 元 (1970−01−01 00:00:00 +0000 (UTC)) か ら 秒 数 に 変 換 す る 。

timeout が NULL で な い 場 合 、 udp/time ソ ケ ッ ト (ポ ー ト 37) が 使 用 さ れ る 。 そ れ 以 外 の 場 合 、 tcp/time ソ ケ ッ ト (ポ ー ト 37) が 使 用 さ れ る 。

返 り 値

成 功 し た 場 合 は 、 0 が 返 さ れ て 、 得 ら れ た 32 ビ ッ ト の 時 刻 値 は timep−>tv_sec に 格 納 さ れ る 。 エ ラ ー の 場 合 は 、 −1 が 返 さ れ て 、 errno が 適 切 に 設 定 さ れ る 。

エ ラ ー

内 部 で 使 用 し て い る 関 数 (sendto(2), poll(2), recvfrom(2), connect(2), read(2)) の 全 て の エ ラ ー が 起 こ る 可 能 性 が あ る 。 更 に 次 の エ ラ ー が 起 こ る 可 能 性 が あ る :

EIO 返 さ れ た バ イ ト 数 が

4 バ イ ト で な い 。

ETIMEDOUT

timeout で 定 義 さ れ た 待 ち 時 間 の 期 限 が 切 れ た 。

属 性

マ ル チ ス レ ッ デ ィ ン グ (pthreads(7) 参 照 )

rtime() 関 数 は ス レ ッ ド セ ー フ で あ る 。

注 意

IPv4 の み が サ ポ ー ト さ れ て い る 。

in.timed の バ ー ジ ョ ン に よ っ て は TCP し か サ ポ ー ト し て い な い も の も あ る 。 use_tcp を 1 に 設 定 し て 、 例 に あ る プ ロ グ ラ ム を 試 す こ と 。

libc5 は プ ロ ト タ イ プ

int rtime(struct sockaddr_in *, struct timeval *, struct timeval *); を 使 い 、 <rpc/auth_des.h> の 代 わ り に <sys/time.h> を 必 要 と す る 。

バ グ

glibc 2.2.5 以 前 の rtime() は 、 64 ビ ッ ト マ シ ン で 正 確 に 動 作 し な い 。

こ の 例 で は ポ ー ト 37 が ア ッ プ さ れ て オ ー プ ン さ れ て い る 必 要 が あ る 。 /etc/inetd.conf の time エ ン ト リ ー が コ メ ン ト ア ウ ト さ れ て い な い こ と を 確 認 し て ほ し い 。 こ の プ ロ グ ラ ム は "linux" と い う コ ン ピ ュ ー タ に 接 続 す る 。 "localhost" を 使 っ た 場 合 は 動 作 し な い 。 結 果 は コ ン ピ ュ ー タ "linux" の ロ ー カ ル 時 刻 で あ る 。

#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>
#include <time.h>
#include <rpc/auth_des.h>
#include <netdb.h>

static int use_tcp = 0;
static char *servername = "linux";

int
main(void)
{
struct sockaddr_in name;
struct rpc_timeval time1 = {0,0};
struct rpc_timeval timeout = {1,0};
struct hostent *hent;
int ret;

memset(&name, 0, sizeof(name));
sethostent(1);
hent = gethostbyname(servername);
memcpy(&name.sin_addr, hent−>h_addr, hent−>h_length);

ret = rtime(&name, &time1, use_tcp ? NULL : &timeout);
if (ret < 0)
perror("rtime error");
else {
time_t t = time1.tv_sec;
printf("%s\n", ctime(&t)); }

exit(EXIT_SUCCESS); }

関 連 項 目

ntpdate(1), inetd(8)

こ の 文 書 に つ い て

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