home *** CD-ROM | disk | FTP | other *** search
- /* (C) Silvano Maffeis, maffeis@ifi.unizh.ch
- * University of Zurich, Switzerland 1992
- *
- * synservd.c: server daemon that listens on udp socket and quickly
- * returns the local time using gettimeofday().
- */
-
- #include <stdio.h>
- #include <sys/types.h>
- #include <sys/socket.h>
- #include <netinet/in.h>
- #include <arpa/inet.h>
- #include <netdb.h>
- #include <ctype.h>
- #include <errno.h>
- #include <signal.h>
- #include <sys/time.h>
-
- #define BUFFERSIZE sizeof(struct timeval)
-
- extern errno;
- extern char *sys_errlist[];
- struct sockaddr_in sin;
- int sock;
- char **Argv;
-
- int setup_connection(){
- int s;
- int length;
- struct hostent *gethostbyname();
- struct servent *servent;
-
- s = socket(AF_INET, SOCK_DGRAM, 0);
- if (s < 0) {
- fprintf(stderr, "%s: opening udp socket\n", Argv[0]);
- exit(1);
- }
-
- /* Connect socket using name specified by command line. */
- sin.sin_family = AF_INET;
- sin.sin_addr.s_addr = INADDR_ANY;
-
- #ifndef PORT
- servent = getservbyname("utime", "udp");
- if(servent == NULL){
- fprintf(stderr, "%s: getservbyname: %s\n", Argv[0], sys_errlist[errno]);
- exit(1);
- };
- sin.sin_port = htons(servent->s_port);
- #else
- sin.sin_port = htons(PORT);
- #endif PORT
-
- if(bind(s, (struct sockaddr *) &sin, sizeof(sin)) < 0){
- fprintf(stderr, "%s: cannot bind\n", Argv[0]);
- exit(1);
- }
-
- /* find socket# */
-
- length = sizeof(sin);
- if (getsockname(s, &sin, &length)) {
- fprintf(stderr, "%s: getsockname\n", Argv[0]);
- exit(1);
- }
- fprintf(stderr, "Socket has port #%d\n", ntohs(sin.sin_port));
-
- listen(s, 5);
- return(s);
- }
-
- #if defined(SYSV)
- void term_fcn(sig)
- #else
- term_fcn(sig)
- #endif SYSV
- int sig;
- {
- if(signal(sig, SIG_IGN) == SIG_ERR){
- fprintf(stderr, "%s: signal\n", Argv[0]);
- exit(1);
- }
-
- fprintf(stderr, "%s: Got a kill signal!\n\n", Argv[0]);
-
- shutdown(sock,2);
- close(sock);
- exit(1);
- }
-
- int handle_sigs(){
- if(signal(SIGHUP, SIG_IGN) == SIG_ERR)
- return(0);
-
- if(signal(SIGINT, SIG_IGN) == SIG_ERR)
- return(0);
-
- if(signal(SIGQUIT, SIG_IGN) == SIG_ERR)
- return(0);
-
- if(signal(SIGTERM, term_fcn) == SIG_ERR)
- return(0);
-
- return(1);
- }
-
-
- main(argc, argv)
- int argc;
- char *argv[];
- {
- char in[BUFFERSIZE], out[BUFFERSIZE];
- struct timeval tv;
- struct sockaddr sa;
- int size = sizeof(sa);
-
- Argv = argv;
-
- if(! handle_sigs()){
- fprintf(stderr, "%s: handle sigs\n", Argv[0]);
- exit(1);
- };
-
- sock=setup_connection();
-
- while(1){
-
- if (recvfrom(sock, in, BUFFERSIZE, 0, &sa, &size) < 0){
- fprintf(stderr, "%s: recvfrom udp socket\n", Argv[0]);
- exit(1);
- };
-
- if (gettimeofday(&tv, 0) < 0){
- fprintf(stderr, "%s: gettimeofday: %s\n", Argv[0], sys_errlist[errno]);
- exit(1);
- };
-
- memcpy(out, &tv.tv_sec, sizeof(long));
- memcpy(&out[sizeof(long)], &tv.tv_usec, sizeof(long));
-
- if(sendto(sock, out, BUFFERSIZE, 0, &sa, size) < 0){
- fprintf(stderr, "%s: sendto udp socket\n", Argv[0]);
- exit(1);
- };
- }
- }
-
-
-