1 #include	"unp.h"
2 #include	<setjmp.h>
3 
4 static void			recvfrom_alarm(int);
5 static sigjmp_buf	jmpbuf;
6 
7 void
dg_cli(FILE * fp,int sockfd,const SA * pservaddr,socklen_t servlen)8 dg_cli(FILE *fp, int sockfd, const SA *pservaddr, socklen_t servlen)
9 {
10 	int				n;
11 	char			sendline[MAXLINE], recvline[MAXLINE + 1];
12 	socklen_t		len;
13 	struct sockaddr	*preply_addr;
14 
15 	preply_addr = Malloc(servlen);
16 
17 	Signal(SIGALRM, recvfrom_alarm);
18 
19 	while (Fgets(sendline, MAXLINE, fp) != NULL) {
20 
21 		Sendto(sockfd, sendline, strlen(sendline), 0, pservaddr, servlen);
22 
23 		alarm(5);
24 		for ( ; ; ) {
25 			if (sigsetjmp(jmpbuf, 1) != 0)
26 				break;
27 			len = servlen;
28 			n = Recvfrom(sockfd, recvline, MAXLINE, 0, preply_addr, &len);
29 			recvline[n] = 0;	/* null terminate */
30 			printf("from %s: %s",
31 					Sock_ntop_host(preply_addr, servlen), recvline);
32 		}
33 	}
34 }
35 
36 static void
recvfrom_alarm(int signo)37 recvfrom_alarm(int signo)
38 {
39 	siglongjmp(jmpbuf, 1);
40 }
41