/***************************************************************/ /* rdate for Motorola System V/68 */ /* Targeted and tested on Motorola System V/68 R3V8 */ /* man rdate from Motorola Unix System V/88 R4V4 */ /**************************************************************** rdate(1M) ADMINISTRATOR COMMANDS rdate(1M) NAME rdate - set system date from a remote host SYNOPSIS rdate hostname DESCRIPTION rdate sets the local date and time from the hostname given as an argument. You must be super-user on the local system. Typically rdate can be inserted as part of a startup script. EXAMPLE # /usr/local/bin/rdate timeserver timeserver Sun Oct 25 11:12:48 2015 TCP/IP 1 ****************************************************************/ #include #include #include #include #include main(argc,argv) int argc; char *argv[]; { struct sockaddr_in socketaddr; struct servent *service; struct hostent *host; int socket_h; /* socket handle */ u_long networktime; /* network time */ long longtime; /* Unix time */ if (argc != 2) { printf("usage: rdate host\n"); exit(1); } if ((host = gethostbyname(argv[1])) == NULL) { fprintf(stderr, "rdate: unknown host %s\n", argv[1]); fprintf(stderr, "rdate: %s must be speficied in /etc/hosts\n", argv[1]); exit(1); } if ((service = getservbyname("time","tcp")) == NULL) { fprintf(stderr, "rdate: time or tcp: service not available\n"); exit(1); } if ((socket_h = socket(AF_INET, SOCK_STREAM, 0)) < 0) { fprintf(stderr, "rdate: socket: socket open error\n"); exit(1); } memcpy(&socketaddr.sin_addr, host->h_addr, host->h_length); socketaddr.sin_family = host->h_addrtype; socketaddr.sin_port = service->s_port; if (connect(socket_h, &socketaddr, sizeof(socketaddr)) < 0) { close(socket_h); fprintf(stderr, "rdate: socket: socket connect error\n"); exit(1); } if (read(socket_h, &networktime, 4) != 4) { close(socket_h); fprintf(stderr, "rdate: socket: socket read error\n"); exit(1); } close(socket_h); /* Seconds at 1.1.1970 according to RFC868 is 220898800L */ longtime = ntohl(networktime) - 2208988800L; if (stime(&longtime) != 0) { fprintf(stderr, "rdate: stime failed\n"); exit(1); } printf("%s %s", host->h_name, ctime(&longtime)); exit(0); }