110 lines
2.4 KiB
C
110 lines
2.4 KiB
C
|
/* rdate 1.0 - Set time&date from remote host Author: Kees J. Bot
|
||
|
* 12 Oct 1995
|
||
|
*/
|
||
|
#define nil 0
|
||
|
#include <sys/types.h>
|
||
|
#include <stdio.h>
|
||
|
#include <time.h>
|
||
|
#include <string.h>
|
||
|
#include <fcntl.h>
|
||
|
#include <errno.h>
|
||
|
#include <stdlib.h>
|
||
|
#include <unistd.h>
|
||
|
#include <sys/ioctl.h>
|
||
|
#include <net/hton.h>
|
||
|
#include <net/netlib.h>
|
||
|
#include <net/gen/in.h>
|
||
|
#include <net/gen/netdb.h>
|
||
|
#include <net/gen/tcp.h>
|
||
|
#include <net/gen/tcp_io.h>
|
||
|
|
||
|
void report(const char *label)
|
||
|
{
|
||
|
fprintf(stderr, "rdate: %s: %s\n", label, strerror(errno));
|
||
|
}
|
||
|
|
||
|
void fatal(const char *label)
|
||
|
{
|
||
|
report(label);
|
||
|
exit(1);
|
||
|
}
|
||
|
|
||
|
int main(int argc, char **argv)
|
||
|
{
|
||
|
char *tcp_device;
|
||
|
int fd;
|
||
|
int i;
|
||
|
struct servent *servent;
|
||
|
struct hostent *hostent;
|
||
|
u16_t time_port;
|
||
|
nwio_tcpconf_t tcpconf;
|
||
|
nwio_tcpcl_t tcpcl;
|
||
|
u32_t net_time;
|
||
|
time_t unix_time;
|
||
|
|
||
|
if (argc <= 1) {
|
||
|
fprintf(stderr, "Usage: rdate host ...\n");
|
||
|
exit(1);
|
||
|
}
|
||
|
|
||
|
/* Look up the port number of the TCP service "time". */
|
||
|
if ((servent= getservbyname("time", "tcp")) == nil) {
|
||
|
fprintf(stderr, "rdate: \"time\": unknown service\n");
|
||
|
exit(1);
|
||
|
}
|
||
|
time_port= servent->s_port;
|
||
|
|
||
|
if ((tcp_device= getenv("TCP_DEVICE")) == nil) tcp_device= TCP_DEVICE;
|
||
|
|
||
|
if ((fd= open(tcp_device, O_RDWR)) < 0) fatal(tcp_device);
|
||
|
|
||
|
/* Try each host on the command line. */
|
||
|
for (i= 1; i < argc; i++) {
|
||
|
if ((hostent= gethostbyname(argv[i])) == nil) {
|
||
|
fprintf(stderr, "rdate: %s: unknown host\n", argv[i]);
|
||
|
continue;
|
||
|
}
|
||
|
|
||
|
/* Configure a TCP channel and connect to the remote host. */
|
||
|
|
||
|
tcpconf.nwtc_flags= NWTC_LP_SEL | NWTC_SET_RA | NWTC_SET_RP;
|
||
|
memcpy(&tcpconf.nwtc_remaddr, hostent->h_addr, 4);
|
||
|
tcpconf.nwtc_remport= time_port;
|
||
|
if (ioctl(fd, NWIOSTCPCONF, &tcpconf) == -1) fatal(tcp_device);
|
||
|
|
||
|
tcpcl.nwtcl_flags= 0;
|
||
|
if (ioctl(fd, NWIOTCPCONN, &tcpcl) < 0) {
|
||
|
report(argv[i]);
|
||
|
continue;
|
||
|
}
|
||
|
|
||
|
/* Read four bytes to obtain the time. */
|
||
|
switch (read(fd, &net_time, sizeof(net_time))) {
|
||
|
case -1:
|
||
|
report(argv[i]);
|
||
|
continue;
|
||
|
default:
|
||
|
fprintf(stderr, "rdate: %s: short read\n", argv[i]);
|
||
|
continue;
|
||
|
case sizeof(net_time):
|
||
|
break;
|
||
|
}
|
||
|
break;
|
||
|
}
|
||
|
if (i == argc) exit(1);
|
||
|
|
||
|
/* Internet time is in seconds since 1900, UNIX time is in seconds
|
||
|
* since 1970.
|
||
|
*/
|
||
|
unix_time= ntohl(net_time) - 2208988800;
|
||
|
|
||
|
/* Try to set the time and tell us about it. */
|
||
|
if (stime(&unix_time) < 0) {
|
||
|
printf("time on ");
|
||
|
} else {
|
||
|
printf("time set to ");
|
||
|
}
|
||
|
printf("%s: %s", argv[i], ctime(&unix_time));
|
||
|
exit(0);
|
||
|
}
|