home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Usenet 1994 October
/
usenetsourcesnewsgroupsinfomagicoctober1994disk2.iso
/
misc
/
volume34
/
synclockd
/
part01
/
synservd.c
< prev
Wrap
C/C++ Source or Header
|
1993-01-10
|
3KB
|
149 lines
/* (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);
};
}
}