2 * $Id: timelord.c,v 1.8 2005-04-28 20:49:36 bfernhomberg Exp $
4 * Copyright (c) 1990,1992 Regents of The University of Michigan.
5 * All Rights Reserved. See COPYRIGHT.
7 * The "timelord protocol" was reverse engineered from Timelord,
8 * distributed with CAP, Copyright (c) 1990, The University of
9 * Melbourne. The following copyright, supplied by The University
10 * of Melbourne, may apply to this code:
12 * This version of timelord.c is based on code distributed
13 * by the University of Melbourne as part of the CAP package.
15 * The tardis/Timelord package for Macintosh/CAP is
16 * Copyright (c) 1990, The University of Melbourne.
21 #endif /* HAVE_CONFIG_H */
23 #include <sys/param.h>
24 #include <sys/types.h>
32 #include <netatalk/at.h>
33 #include <netatalk/endian.h>
34 #include <atalk/atp.h>
35 #include <atalk/nbp.h>
40 #endif /* HAVE_SGTTY_H */
43 #pragma warn "testing 123"
44 #include <atalk/logger.h>
49 #endif /* HAVE_NETDB_H */
53 #endif /* HAVE_FCNTL_H */
54 #ifdef HAVE_SYS_FCNTL_H
55 #include <sys/fcntl.h>
56 #endif /* HAVE_SYS_FCNTL_H */
60 #endif /* HAVE_TERMIOS_H */
61 #ifdef HAVE_SYS_TERMIOS_H
62 #include <sys/termios.h>
63 #endif /* HAVE_SYS_TERMIOS_H */
68 #define EPOCH 0x7C25B080 /* 00:00:00 GMT Jan 1, 1970 for Mac */
71 char *bad = "Bad request!";
79 if (( s = rindex( p, '/' )) == NULL ) {
84 fprintf( stderr, "Usage:\t%s -d -n nbpname\n", s );
89 * Unregister ourself on signal.
94 if ( nbp_unrgstr( server, "TimeLord", "*", NULL ) < 0 ) {
95 LOG(log_error, logtype_default, "Can't unregister %s", server );
98 LOG(log_info, logtype_default, "going down" );
102 int main( int ac, char **av )
105 struct sockaddr_at sat;
106 struct atp_block atpb;
111 char hostname[ MAXHOSTNAMELEN ];
114 long req, mtime, resp;
118 if ( gethostname( hostname, sizeof( hostname )) < 0 ) {
119 perror( "gethostname" );
122 if (( server = index( hostname, '.' )) != 0 ) {
127 while (( c = getopt( ac, av, "dn:" )) != EOF ) {
136 fprintf( stderr, "Unknown option -- '%c'\n", c );
142 * Disassociate from controlling tty.
149 dt = getdtablesize();
150 for ( i = 0; i < dt; i++ ) {
153 if (( i = open( "/dev/tty", O_RDWR )) >= 0 ) {
154 (void)ioctl( i, TIOCNOTTY, 0 );
155 setpgid( 0, getpid());
167 if (( p = rindex( *av, '/' )) == NULL ) {
174 openlog( p, LOG_PID );
177 syslog_setup(log_debug, logtype_default, logoption_ndelay|logoption_pid, logfacility_daemon );
180 /* allocate memory */
181 memset (&sat.sat_addr, 0, sizeof (sat.sat_addr));
183 if (( atp = atp_open( ATADDR_ANYPORT, &sat.sat_addr )) == NULL ) {
184 LOG(log_error, logtype_default, "main: atp_open: %s", strerror( errno ) );
188 if ( nbp_rgstr( atp_sockaddr( atp ), server, "TimeLord", "*" ) < 0 ) {
189 LOG(log_error, logtype_default, "Can't register %s", server );
192 LOG(log_info, logtype_default, "%s:TimeLord started", server );
194 signal(SIGHUP, goaway);
195 signal(SIGTERM, goaway);
199 * Something seriously wrong with atp, since these assigns must
202 atpb.atp_saddr = &sat;
203 atpb.atp_rreqdata = buf;
204 bzero( &sat, sizeof( struct sockaddr_at ));
205 atpb.atp_rreqdlen = sizeof( buf );
206 if ( atp_rreq( atp, &atpb ) < 0 ) {
207 LOG(log_error, logtype_default, "main: atp_rreq: %s", strerror( errno ) );
212 bcopy( p, &req, sizeof( long ));
218 if ( atpb.atp_rreqdlen > 5 ) {
219 bcopy( p + 1, &mtime, sizeof( long ));
220 mtime = ntohl( mtime );
221 LOG(log_info, logtype_default, "gettime from %s %s was %lu",
222 (*( p + 5 ) == '\0' ) ? "<unknown>" : p + 5,
223 ( *p == 0 ) ? "at boot" : "in chooser",
226 LOG(log_info, logtype_default, "gettime" );
229 if ( gettimeofday( &tv, &tz ) < 0 ) {
230 LOG(log_error, logtype_default, "main: gettimeofday: %s", strerror( errno ) );
233 if (( tm = gmtime( &tv.tv_sec )) == 0 ) {
234 perror( "localtime" );
238 mtime = tv.tv_sec + EPOCH;
239 mtime = htonl( mtime );
242 bcopy( &resp, buf, sizeof( long ));
243 bcopy( &mtime, buf + sizeof( long ), sizeof( long ));
244 iov.iov_len = sizeof( long ) + sizeof( long );
248 LOG(log_error, logtype_default, bad );
251 bcopy( &resp, buf, sizeof( long ));
252 *( buf + 4 ) = (unsigned char)strlen( bad );
253 strcpy( buf + 5, bad );
254 iov.iov_len = sizeof( long ) + 2 + strlen( bad );
259 atpb.atp_sresiov = &iov;
260 atpb.atp_sresiovcnt = 1;
261 if ( atp_sresp( atp, &atpb ) < 0 ) {
262 LOG(log_error, logtype_default, "main: atp_sresp: %s", strerror( errno ) );