connect_timeo.c 796 B

12345678910111213141516171819202122232425262728293031323334353637383940
  1. /* include connect_timeo */
  2. #include "unp.h"
  3. static void connect_alarm(int);
  4. int
  5. connect_timeo(int sockfd, const SA *saptr, socklen_t salen, int nsec)
  6. {
  7. Sigfunc *sigfunc;
  8. int n;
  9. sigfunc = Signal(SIGALRM, connect_alarm);
  10. if (alarm(nsec) != 0)
  11. err_msg("connect_timeo: alarm was already set");
  12. if ( (n = connect(sockfd, saptr, salen)) < 0) {
  13. close(sockfd);
  14. if (errno == EINTR)
  15. errno = ETIMEDOUT;
  16. }
  17. alarm(0); /* turn off the alarm */
  18. Signal(SIGALRM, sigfunc); /* restore previous signal handler */
  19. return(n);
  20. }
  21. static void
  22. connect_alarm(int signo)
  23. {
  24. return; /* just interrupt the connect() */
  25. }
  26. /* end connect_timeo */
  27. void
  28. Connect_timeo(int fd, const SA *sa, socklen_t salen, int sec)
  29. {
  30. if (connect_timeo(fd, sa, salen, sec) < 0)
  31. err_sys("connect_timeo error");
  32. }