Time.pm revision 7c478bd95313f5f23a4c958a745db2134aa03244
199767f8919635c4928607450d9e0abb932109ceToomas Soome# Net::Time.pm
199767f8919635c4928607450d9e0abb932109ceToomas Soome#
199767f8919635c4928607450d9e0abb932109ceToomas Soome# Copyright (c) 1995-1998 Graham Barr <gbarr@pobox.com>. All rights reserved.
199767f8919635c4928607450d9e0abb932109ceToomas Soome# This program is free software; you can redistribute it and/or
199767f8919635c4928607450d9e0abb932109ceToomas Soome# modify it under the same terms as Perl itself.
199767f8919635c4928607450d9e0abb932109ceToomas Soome
199767f8919635c4928607450d9e0abb932109ceToomas Soomepackage Net::Time;
199767f8919635c4928607450d9e0abb932109ceToomas Soome
199767f8919635c4928607450d9e0abb932109ceToomas Soomeuse strict;
199767f8919635c4928607450d9e0abb932109ceToomas Soomeuse vars qw($VERSION @ISA @EXPORT_OK $TIMEOUT);
199767f8919635c4928607450d9e0abb932109ceToomas Soomeuse Carp;
199767f8919635c4928607450d9e0abb932109ceToomas Soomeuse IO::Socket;
199767f8919635c4928607450d9e0abb932109ceToomas Soomerequire Exporter;
199767f8919635c4928607450d9e0abb932109ceToomas Soomeuse Net::Config;
199767f8919635c4928607450d9e0abb932109ceToomas Soomeuse IO::Select;
199767f8919635c4928607450d9e0abb932109ceToomas Soome
199767f8919635c4928607450d9e0abb932109ceToomas Soome@ISA = qw(Exporter);
199767f8919635c4928607450d9e0abb932109ceToomas Soome@EXPORT_OK = qw(inet_time inet_daytime);
199767f8919635c4928607450d9e0abb932109ceToomas Soome
199767f8919635c4928607450d9e0abb932109ceToomas Soome$VERSION = "2.09"; # $Id: //depot/libnet/Net/Time.pm#9 $
199767f8919635c4928607450d9e0abb932109ceToomas Soome
199767f8919635c4928607450d9e0abb932109ceToomas Soome$TIMEOUT = 120;
199767f8919635c4928607450d9e0abb932109ceToomas Soome
199767f8919635c4928607450d9e0abb932109ceToomas Soomesub _socket
199767f8919635c4928607450d9e0abb932109ceToomas Soome{
199767f8919635c4928607450d9e0abb932109ceToomas Soome my($pname,$pnum,$host,$proto,$timeout) = @_;
199767f8919635c4928607450d9e0abb932109ceToomas Soome
199767f8919635c4928607450d9e0abb932109ceToomas Soome $proto ||= 'udp';
199767f8919635c4928607450d9e0abb932109ceToomas Soome
199767f8919635c4928607450d9e0abb932109ceToomas Soome my $port = (getservbyname($pname, $proto))[2] || $pnum;
199767f8919635c4928607450d9e0abb932109ceToomas Soome
199767f8919635c4928607450d9e0abb932109ceToomas Soome my $hosts = defined $host ? [ $host ] : $NetConfig{$pname . '_hosts'};
199767f8919635c4928607450d9e0abb932109ceToomas Soome
199767f8919635c4928607450d9e0abb932109ceToomas Soome my $me;
199767f8919635c4928607450d9e0abb932109ceToomas Soome
199767f8919635c4928607450d9e0abb932109ceToomas Soome foreach $host (@$hosts)
199767f8919635c4928607450d9e0abb932109ceToomas Soome {
199767f8919635c4928607450d9e0abb932109ceToomas Soome $me = IO::Socket::INET->new(PeerAddr => $host,
199767f8919635c4928607450d9e0abb932109ceToomas Soome PeerPort => $port,
199767f8919635c4928607450d9e0abb932109ceToomas Soome Proto => $proto
199767f8919635c4928607450d9e0abb932109ceToomas Soome ) and last;
199767f8919635c4928607450d9e0abb932109ceToomas Soome }
199767f8919635c4928607450d9e0abb932109ceToomas Soome
199767f8919635c4928607450d9e0abb932109ceToomas Soome return unless $me;
199767f8919635c4928607450d9e0abb932109ceToomas Soome
199767f8919635c4928607450d9e0abb932109ceToomas Soome $me->send("\n")
199767f8919635c4928607450d9e0abb932109ceToomas Soome if $proto eq 'udp';
199767f8919635c4928607450d9e0abb932109ceToomas Soome
199767f8919635c4928607450d9e0abb932109ceToomas Soome $timeout = $TIMEOUT
199767f8919635c4928607450d9e0abb932109ceToomas Soome unless defined $timeout;
199767f8919635c4928607450d9e0abb932109ceToomas Soome
199767f8919635c4928607450d9e0abb932109ceToomas Soome IO::Select->new($me)->can_read($timeout)
199767f8919635c4928607450d9e0abb932109ceToomas Soome ? $me
199767f8919635c4928607450d9e0abb932109ceToomas Soome : undef;
199767f8919635c4928607450d9e0abb932109ceToomas Soome}
199767f8919635c4928607450d9e0abb932109ceToomas Soome
199767f8919635c4928607450d9e0abb932109ceToomas Soomesub inet_time
199767f8919635c4928607450d9e0abb932109ceToomas Soome{
199767f8919635c4928607450d9e0abb932109ceToomas Soome my $s = _socket('time',37,@_) || return undef;
199767f8919635c4928607450d9e0abb932109ceToomas Soome my $buf = '';
199767f8919635c4928607450d9e0abb932109ceToomas Soome my $offset = 0 | 0;
199767f8919635c4928607450d9e0abb932109ceToomas Soome
199767f8919635c4928607450d9e0abb932109ceToomas Soome return undef
199767f8919635c4928607450d9e0abb932109ceToomas Soome unless $s->recv($buf, length(pack("N",0)));
199767f8919635c4928607450d9e0abb932109ceToomas Soome
199767f8919635c4928607450d9e0abb932109ceToomas Soome # unpack, we | 0 to ensure we have an unsigned
199767f8919635c4928607450d9e0abb932109ceToomas Soome my $time = (unpack("N",$buf))[0] | 0;
199767f8919635c4928607450d9e0abb932109ceToomas Soome
199767f8919635c4928607450d9e0abb932109ceToomas Soome # the time protocol return time in seconds since 1900, convert
199767f8919635c4928607450d9e0abb932109ceToomas Soome # it to a the required format
199767f8919635c4928607450d9e0abb932109ceToomas Soome
199767f8919635c4928607450d9e0abb932109ceToomas Soome if($^O eq "MacOS") {
199767f8919635c4928607450d9e0abb932109ceToomas Soome # MacOS return seconds since 1904, 1900 was not a leap year.
199767f8919635c4928607450d9e0abb932109ceToomas Soome $offset = (4 * 31536000) | 0;
199767f8919635c4928607450d9e0abb932109ceToomas Soome }
199767f8919635c4928607450d9e0abb932109ceToomas Soome else {
199767f8919635c4928607450d9e0abb932109ceToomas Soome # otherwise return seconds since 1972, there were 17 leap years between
199767f8919635c4928607450d9e0abb932109ceToomas Soome # 1900 and 1972
199767f8919635c4928607450d9e0abb932109ceToomas Soome $offset = (70 * 31536000 + 17 * 86400) | 0;
199767f8919635c4928607450d9e0abb932109ceToomas Soome }
199767f8919635c4928607450d9e0abb932109ceToomas Soome
199767f8919635c4928607450d9e0abb932109ceToomas Soome $time - $offset;
199767f8919635c4928607450d9e0abb932109ceToomas Soome}
199767f8919635c4928607450d9e0abb932109ceToomas Soome
199767f8919635c4928607450d9e0abb932109ceToomas Soomesub inet_daytime
199767f8919635c4928607450d9e0abb932109ceToomas Soome{
199767f8919635c4928607450d9e0abb932109ceToomas Soome my $s = _socket('daytime',13,@_) || return undef;
199767f8919635c4928607450d9e0abb932109ceToomas Soome my $buf = '';
199767f8919635c4928607450d9e0abb932109ceToomas Soome
199767f8919635c4928607450d9e0abb932109ceToomas Soome $s->recv($buf, 1024) ? $buf
199767f8919635c4928607450d9e0abb932109ceToomas Soome : undef;
199767f8919635c4928607450d9e0abb932109ceToomas Soome}
199767f8919635c4928607450d9e0abb932109ceToomas Soome
199767f8919635c4928607450d9e0abb932109ceToomas Soome1;
199767f8919635c4928607450d9e0abb932109ceToomas Soome
199767f8919635c4928607450d9e0abb932109ceToomas Soome__END__
199767f8919635c4928607450d9e0abb932109ceToomas Soome
199767f8919635c4928607450d9e0abb932109ceToomas Soome=head1 NAME
199767f8919635c4928607450d9e0abb932109ceToomas Soome
199767f8919635c4928607450d9e0abb932109ceToomas SoomeNet::Time - time and daytime network client interface
199767f8919635c4928607450d9e0abb932109ceToomas Soome
199767f8919635c4928607450d9e0abb932109ceToomas Soome=head1 SYNOPSIS
199767f8919635c4928607450d9e0abb932109ceToomas Soome
199767f8919635c4928607450d9e0abb932109ceToomas Soome use Net::Time qw(inet_time inet_daytime);
199767f8919635c4928607450d9e0abb932109ceToomas Soome
199767f8919635c4928607450d9e0abb932109ceToomas Soome print inet_time(); # use default host from Net::Config
199767f8919635c4928607450d9e0abb932109ceToomas Soome print inet_time('localhost');
199767f8919635c4928607450d9e0abb932109ceToomas Soome print inet_time('localhost', 'tcp');
199767f8919635c4928607450d9e0abb932109ceToomas Soome
199767f8919635c4928607450d9e0abb932109ceToomas Soome print inet_daytime(); # use default host from Net::Config
199767f8919635c4928607450d9e0abb932109ceToomas Soome print inet_daytime('localhost');
199767f8919635c4928607450d9e0abb932109ceToomas Soome print inet_daytime('localhost', 'tcp');
199767f8919635c4928607450d9e0abb932109ceToomas Soome
199767f8919635c4928607450d9e0abb932109ceToomas Soome=head1 DESCRIPTION
199767f8919635c4928607450d9e0abb932109ceToomas Soome
199767f8919635c4928607450d9e0abb932109ceToomas SoomeC<Net::Time> provides subroutines that obtain the time on a remote machine.
199767f8919635c4928607450d9e0abb932109ceToomas Soome
199767f8919635c4928607450d9e0abb932109ceToomas Soome=over 4
199767f8919635c4928607450d9e0abb932109ceToomas Soome
199767f8919635c4928607450d9e0abb932109ceToomas Soome=item inet_time ( [HOST [, PROTOCOL [, TIMEOUT]]])
199767f8919635c4928607450d9e0abb932109ceToomas Soome
199767f8919635c4928607450d9e0abb932109ceToomas SoomeObtain the time on C<HOST>, or some default host if C<HOST> is not given
199767f8919635c4928607450d9e0abb932109ceToomas Soomeor not defined, using the protocol as defined in RFC868. The optional
199767f8919635c4928607450d9e0abb932109ceToomas Soomeargument C<PROTOCOL> should define the protocol to use, either C<tcp> or
199767f8919635c4928607450d9e0abb932109ceToomas SoomeC<udp>. The result will be a time value in the same units as returned
199767f8919635c4928607450d9e0abb932109ceToomas Soomeby time() or I<undef> upon failure.
199767f8919635c4928607450d9e0abb932109ceToomas Soome
199767f8919635c4928607450d9e0abb932109ceToomas Soome=item inet_daytime ( [HOST [, PROTOCOL [, TIMEOUT]]])
199767f8919635c4928607450d9e0abb932109ceToomas Soome
199767f8919635c4928607450d9e0abb932109ceToomas SoomeObtain the time on C<HOST>, or some default host if C<HOST> is not given
199767f8919635c4928607450d9e0abb932109ceToomas Soomeor not defined, using the protocol as defined in RFC867. The optional
199767f8919635c4928607450d9e0abb932109ceToomas Soomeargument C<PROTOCOL> should define the protocol to use, either C<tcp> or
199767f8919635c4928607450d9e0abb932109ceToomas SoomeC<udp>. The result will be an ASCII string or I<undef> upon failure.
199767f8919635c4928607450d9e0abb932109ceToomas Soome
199767f8919635c4928607450d9e0abb932109ceToomas Soome=back
199767f8919635c4928607450d9e0abb932109ceToomas Soome
199767f8919635c4928607450d9e0abb932109ceToomas Soome=head1 AUTHOR
199767f8919635c4928607450d9e0abb932109ceToomas Soome
199767f8919635c4928607450d9e0abb932109ceToomas SoomeGraham Barr <gbarr@pobox.com>
199767f8919635c4928607450d9e0abb932109ceToomas Soome
199767f8919635c4928607450d9e0abb932109ceToomas Soome=head1 COPYRIGHT
199767f8919635c4928607450d9e0abb932109ceToomas Soome
199767f8919635c4928607450d9e0abb932109ceToomas SoomeCopyright (c) 1995-1998 Graham Barr. All rights reserved.
199767f8919635c4928607450d9e0abb932109ceToomas SoomeThis program is free software; you can redistribute it and/or modify
199767f8919635c4928607450d9e0abb932109ceToomas Soomeit under the same terms as Perl itself.
199767f8919635c4928607450d9e0abb932109ceToomas Soome
199767f8919635c4928607450d9e0abb932109ceToomas Soome=for html <hr>
199767f8919635c4928607450d9e0abb932109ceToomas Soome
199767f8919635c4928607450d9e0abb932109ceToomas SoomeI<$Id: //depot/libnet/Net/Time.pm#9 $>
199767f8919635c4928607450d9e0abb932109ceToomas Soome
199767f8919635c4928607450d9e0abb932109ceToomas Soome=cut
199767f8919635c4928607450d9e0abb932109ceToomas Soome