home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 October / usenetsourcesnewsgroupsinfomagicoctober1994disk2.iso / misc / volume34 / synclockd / part01 / synservd.c < prev   
C/C++ Source or Header  |  1993-01-10  |  3KB  |  149 lines

  1. /* (C) Silvano Maffeis, maffeis@ifi.unizh.ch             
  2.  * University of Zurich, Switzerland 1992            
  3.  *
  4.  * synservd.c: server daemon that listens on udp socket and quickly
  5.  *             returns the local time using gettimeofday().
  6.  */
  7.  
  8. #include <stdio.h>
  9. #include <sys/types.h>
  10. #include <sys/socket.h>
  11. #include <netinet/in.h>
  12. #include <arpa/inet.h>
  13. #include <netdb.h>
  14. #include <ctype.h>
  15. #include <errno.h>
  16. #include <signal.h>
  17. #include <sys/time.h>
  18.  
  19. #define BUFFERSIZE sizeof(struct timeval)
  20.  
  21. extern errno;
  22. extern char *sys_errlist[];
  23. struct sockaddr_in sin;
  24. int sock;
  25. char  **Argv;
  26.  
  27. int setup_connection(){
  28.   int s;
  29.   int length;
  30.   struct hostent *gethostbyname();
  31.   struct servent *servent;
  32.   
  33.   s = socket(AF_INET, SOCK_DGRAM, 0);
  34.   if (s < 0) {
  35.     fprintf(stderr, "%s: opening udp socket\n", Argv[0]); 
  36.     exit(1);
  37.   }
  38.   
  39.   /* Connect socket using name specified by command line. */
  40.   sin.sin_family = AF_INET;
  41.   sin.sin_addr.s_addr = INADDR_ANY;
  42.   
  43. #ifndef PORT
  44.   servent = getservbyname("utime", "udp");
  45.   if(servent == NULL){
  46.     fprintf(stderr, "%s: getservbyname: %s\n", Argv[0], sys_errlist[errno]);
  47.     exit(1);
  48.   };
  49.   sin.sin_port = htons(servent->s_port);
  50. #else
  51.   sin.sin_port = htons(PORT);
  52. #endif PORT
  53.   
  54.   if(bind(s, (struct sockaddr *) &sin, sizeof(sin)) < 0){
  55.     fprintf(stderr, "%s: cannot bind\n", Argv[0]); 
  56.     exit(1);
  57.   }
  58.   
  59.   /* find socket# */
  60.   
  61.   length = sizeof(sin);
  62.   if (getsockname(s, &sin, &length)) {
  63.     fprintf(stderr, "%s: getsockname\n", Argv[0]); 
  64.     exit(1);
  65.   }
  66.   fprintf(stderr, "Socket has port #%d\n", ntohs(sin.sin_port));
  67.   
  68.   listen(s, 5);
  69.   return(s);
  70. }
  71.  
  72. #if defined(SYSV)
  73. void term_fcn(sig)
  74. #else
  75.      term_fcn(sig)   
  76. #endif SYSV
  77.      int sig;
  78. {
  79.   if(signal(sig, SIG_IGN) == SIG_ERR){
  80.     fprintf(stderr, "%s: signal\n", Argv[0]); 
  81.     exit(1);
  82.   }
  83.   
  84.   fprintf(stderr, "%s: Got a kill signal!\n\n", Argv[0]);
  85.   
  86.   shutdown(sock,2); 
  87.   close(sock);
  88.   exit(1);
  89. }
  90.  
  91. int handle_sigs(){
  92.   if(signal(SIGHUP, SIG_IGN) == SIG_ERR)
  93.     return(0);
  94.   
  95.   if(signal(SIGINT, SIG_IGN) == SIG_ERR)
  96.     return(0);
  97.   
  98.   if(signal(SIGQUIT, SIG_IGN) == SIG_ERR)
  99.     return(0);
  100.   
  101.   if(signal(SIGTERM, term_fcn) == SIG_ERR)
  102.     return(0);
  103.   
  104.   return(1);
  105. }
  106.  
  107.  
  108. main(argc, argv)
  109.      int argc;
  110.      char *argv[];
  111. {
  112.   char in[BUFFERSIZE], out[BUFFERSIZE];
  113.   struct timeval tv;
  114.   struct sockaddr sa;
  115.   int size = sizeof(sa);
  116.   
  117.   Argv = argv;
  118.   
  119.   if(! handle_sigs()){
  120.     fprintf(stderr, "%s: handle sigs\n", Argv[0]); 
  121.     exit(1);
  122.   };
  123.   
  124.   sock=setup_connection();
  125.   
  126.   while(1){
  127.     
  128.     if (recvfrom(sock, in, BUFFERSIZE, 0, &sa, &size) < 0){
  129.       fprintf(stderr, "%s: recvfrom udp socket\n", Argv[0]); 
  130.       exit(1);
  131.     };
  132.     
  133.     if (gettimeofday(&tv, 0) < 0){
  134.       fprintf(stderr, "%s: gettimeofday: %s\n", Argv[0], sys_errlist[errno]);
  135.       exit(1);
  136.     };
  137.     
  138.     memcpy(out, &tv.tv_sec, sizeof(long));
  139.     memcpy(&out[sizeof(long)], &tv.tv_usec, sizeof(long));
  140.     
  141.     if(sendto(sock, out, BUFFERSIZE, 0, &sa, size) < 0){
  142.       fprintf(stderr, "%s: sendto udp socket\n", Argv[0]); 
  143.       exit(1);
  144.     };
  145.   }
  146. }
  147.  
  148.  
  149.