udpcksum.c 828 B

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950
  1. /* include sig_alrm */
  2. #include "udpcksum.h"
  3. #include <setjmp.h>
  4. static sigjmp_buf jmpbuf;
  5. static int canjump;
  6. void
  7. sig_alrm(int signo)
  8. {
  9. if (canjump == 0)
  10. return;
  11. siglongjmp(jmpbuf, 1);
  12. }
  13. /* end sig_alrm */
  14. /* include test_udp */
  15. void
  16. test_udp(void)
  17. {
  18. volatile int nsent = 0, timeout = 3;
  19. struct udpiphdr *ui;
  20. Signal(SIGALRM, sig_alrm);
  21. if (sigsetjmp(jmpbuf, 1)) {
  22. if (nsent >= 3)
  23. err_quit("no response");
  24. printf("timeout\n");
  25. timeout *= 2; /* exponential backoff: 3, 6, 12 */
  26. }
  27. canjump = 1; /* siglongjmp is now OK */
  28. send_dns_query();
  29. nsent++;
  30. alarm(timeout);
  31. ui = udp_read();
  32. canjump = 0;
  33. alarm(0);
  34. if (ui->ui_sum == 0)
  35. printf("UDP checksums off\n");
  36. else
  37. printf("UDP checksums on\n");
  38. if (verbose)
  39. printf("received UDP checksum = %x\n", ntohs(ui->ui_sum));
  40. }
  41. /* end test_udp */