heartbeatserv.c 1.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051
  1. #include "unp.h"
  2. static int servfd;
  3. static int nsec; /* #seconds between each alarm */
  4. static int maxnalarms; /* #alarms w/no client probe before quit */
  5. static int nprobes; /* #alarms since last client probe */
  6. static void sig_urg(int), sig_alrm(int);
  7. void
  8. heartbeat_serv(int servfd_arg, int nsec_arg, int maxnalarms_arg)
  9. {
  10. servfd = servfd_arg; /* set globals for signal handlers */
  11. if ( (nsec = nsec_arg) < 1)
  12. nsec = 1;
  13. if ( (maxnalarms = maxnalarms_arg) < nsec)
  14. maxnalarms = nsec;
  15. Signal(SIGURG, sig_urg);
  16. Fcntl(servfd, F_SETOWN, getpid());
  17. Signal(SIGALRM, sig_alrm);
  18. alarm(nsec);
  19. }
  20. static void
  21. sig_urg(int signo)
  22. {
  23. int n;
  24. char c;
  25. if ( (n = recv(servfd, &c, 1, MSG_OOB)) < 0) {
  26. if (errno != EWOULDBLOCK)
  27. err_sys("recv error");
  28. }
  29. Send(servfd, &c, 1, MSG_OOB); /* echo back out-of-band byte */
  30. nprobes = 0; /* reset counter */
  31. return; /* may interrupt server code */
  32. }
  33. static void
  34. sig_alrm(int signo)
  35. {
  36. if (++nprobes > maxnalarms) {
  37. printf("no probes from client\n");
  38. exit(0);
  39. }
  40. alarm(nsec);
  41. return; /* may interrupt server code */
  42. }