ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/cvsroot/staticperl/perl/lib/Net/Time.pm
Revision: 1.1
Committed: Thu Jun 30 14:27:14 2005 UTC (21 years, 3 months ago) by root
Branch: MAIN
CVS Tags: PERL-5-8-7, HEAD
Branch point for: PERL
Log Message:
*** empty log message ***

File Contents

# User Rev Content
1 root 1.1 # Net::Time.pm
2     #
3     # Copyright (c) 1995-2004 Graham Barr <gbarr@pobox.com>. All rights reserved.
4     # This program is free software; you can redistribute it and/or
5     # modify it under the same terms as Perl itself.
6    
7     package Net::Time;
8    
9     use strict;
10     use vars qw($VERSION @ISA @EXPORT_OK $TIMEOUT);
11     use Carp;
12     use IO::Socket;
13     require Exporter;
14     use Net::Config;
15     use IO::Select;
16    
17     @ISA = qw(Exporter);
18     @EXPORT_OK = qw(inet_time inet_daytime);
19    
20     $VERSION = "2.10";
21    
22     $TIMEOUT = 120;
23    
24     sub _socket
25     {
26     my($pname,$pnum,$host,$proto,$timeout) = @_;
27    
28     $proto ||= 'udp';
29    
30     my $port = (getservbyname($pname, $proto))[2] || $pnum;
31    
32     my $hosts = defined $host ? [ $host ] : $NetConfig{$pname . '_hosts'};
33    
34     my $me;
35    
36     foreach $host (@$hosts)
37     {
38     $me = IO::Socket::INET->new(PeerAddr => $host,
39     PeerPort => $port,
40     Proto => $proto
41     ) and last;
42     }
43    
44     return unless $me;
45    
46     $me->send("\n")
47     if $proto eq 'udp';
48    
49     $timeout = $TIMEOUT
50     unless defined $timeout;
51    
52     IO::Select->new($me)->can_read($timeout)
53     ? $me
54     : undef;
55     }
56    
57     sub inet_time
58     {
59     my $s = _socket('time',37,@_) || return undef;
60     my $buf = '';
61     my $offset = 0 | 0;
62    
63     return undef
64     unless defined $s->recv($buf, length(pack("N",0)));
65    
66     # unpack, we | 0 to ensure we have an unsigned
67     my $time = (unpack("N",$buf))[0] | 0;
68    
69     # the time protocol return time in seconds since 1900, convert
70     # it to a the required format
71    
72     if($^O eq "MacOS") {
73     # MacOS return seconds since 1904, 1900 was not a leap year.
74     $offset = (4 * 31536000) | 0;
75     }
76     else {
77     # otherwise return seconds since 1972, there were 17 leap years between
78     # 1900 and 1972
79     $offset = (70 * 31536000 + 17 * 86400) | 0;
80     }
81    
82     $time - $offset;
83     }
84    
85     sub inet_daytime
86     {
87     my $s = _socket('daytime',13,@_) || return undef;
88     my $buf = '';
89    
90     defined($s->recv($buf, 1024)) ? $buf
91     : undef;
92     }
93    
94     1;
95    
96     __END__
97    
98     =head1 NAME
99    
100     Net::Time - time and daytime network client interface
101    
102     =head1 SYNOPSIS
103    
104     use Net::Time qw(inet_time inet_daytime);
105    
106     print inet_time(); # use default host from Net::Config
107     print inet_time('localhost');
108     print inet_time('localhost', 'tcp');
109    
110     print inet_daytime(); # use default host from Net::Config
111     print inet_daytime('localhost');
112     print inet_daytime('localhost', 'tcp');
113    
114     =head1 DESCRIPTION
115    
116     C<Net::Time> provides subroutines that obtain the time on a remote machine.
117    
118     =over 4
119    
120     =item inet_time ( [HOST [, PROTOCOL [, TIMEOUT]]])
121    
122     Obtain the time on C<HOST>, or some default host if C<HOST> is not given
123     or not defined, using the protocol as defined in RFC868. The optional
124     argument C<PROTOCOL> should define the protocol to use, either C<tcp> or
125     C<udp>. The result will be a time value in the same units as returned
126     by time() or I<undef> upon failure.
127    
128     =item inet_daytime ( [HOST [, PROTOCOL [, TIMEOUT]]])
129    
130     Obtain the time on C<HOST>, or some default host if C<HOST> is not given
131     or not defined, using the protocol as defined in RFC867. The optional
132     argument C<PROTOCOL> should define the protocol to use, either C<tcp> or
133     C<udp>. The result will be an ASCII string or I<undef> upon failure.
134    
135     =back
136    
137     =head1 AUTHOR
138    
139     Graham Barr <gbarr@pobox.com>
140    
141     =head1 COPYRIGHT
142    
143     Copyright (c) 1995-2004 Graham Barr. All rights reserved.
144     This program is free software; you can redistribute it and/or modify
145     it under the same terms as Perl itself.
146    
147     =cut