|
DataMuseum.dkPresents historical artifacts from the history of: DKUUG/EUUG Conference tapes |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about DKUUG/EUUG Conference tapes Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - metrics - downloadIndex: T p
Length: 2592 (0xa20) Types: TextFile Names: »ping.c«
└─⟦87ddcff64⟧ Bits:30001253 CPHDIST85 Tape, 1985 Autumn Conference Copenhagen └─⟦this⟧ »cph85dist/rman/daemon/ping.c«
#ifndef lint static char RCSid[] = "$Header: ping.c,v 1.5 85/08/27 15:17:08 broome Exp $"; #endif /* * $Log: ping.c,v $ * Revision 1.5 85/08/27 15:17:08 broome * Last cleanup before release. * * Revision 1.4 85/08/04 16:36:11 broome * Added load cutoff, such that if 1 minute load is above this, we * won't respond to pings from clients. * * Revision 1.3 85/07/24 10:39:03 broome * * Revision 1.2 85/07/18 12:05:20 broome * * Revision 1.1 85/07/16 11:10:26 broome * Initial revision */ /* * Routines to handle `ping' calls on a dgram socket. */ #include <syslog.h> #include <nlist.h> #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> struct nlist nl[] = { { "_avenrun" }, { 0 }, }; int sock; /* the datagram socket descriptor */ int kmem; /* and memory file descriptor */ double cutoff = -1.0; /* don't respond if 1min load is above this */ /* * Initialize everything ... */ open_ping (port) int port; { struct sockaddr_in sin; if ((sock = socket (AF_INET, SOCK_DGRAM, 0)) < 0) { syslog (LOG_ERR, "cannot open ping (datagram) socket: %m"); return (-1); } bzero ((char *)&sin, sizeof (sin)); sin.sin_port = port; /* should probably do a `getservice' */ sin.sin_family = AF_INET; sin.sin_addr.s_addr = INADDR_ANY; if (bind (sock, (char *)&sin, sizeof (sin)) < 0) { syslog (LOG_ERR, "cannot bind ping socket: %m"); return (-1); } if ((kmem = open ("/dev/kmem", 0, 0)) < 0) { syslog (LOG_ERR, "No kmem: %m"); return (-1); } nlist ("/vmunix", nl); if (nl[0].n_type == 0) { syslog (LOG_ERR, "No namelist: %m"); return (-1); } return (sock); } /* * Routine to actually handle `ping' packets sent to the datagram socket. * Finds the load average and sends it back to the sending socket. */ ping () { struct sockaddr_in from; double avenrun[3]; char buf[20]; /* grab the load average */ lseek (kmem, (long) nl[0].n_value, 0); read (kmem, avenrun, sizeof (avenrun)); if (cutoff != -1.0 && avenrun[0] > cutoff) /* load's too high */ return; /* don't want to see what they sent, just need their address */ if (recvfrom (sock, buf, 20, 0, &from, sizeof (from)) < 1) return; sprintf (buf,"%.2f %.2f %.2f\n", avenrun[0], avenrun[1], avenrun[2]); /* and send it on over */ if (sendto (sock, buf, strlen (buf), 0, &from, sizeof (from)) < 0) perror ("sendto"); }