Commit 36f911a446e15efa3889a580bf0c85e951d7b921

Keep the socket in the req structure.
main.c
(1 / 1)
  
4545
4646 req = mk_req(argv[1], argv[2]);
4747
48 while((status=attemptConnection(req)) != RV_SUCCESS) {
48 while((status=attemptConnection(&req)) != RV_SUCCESS) {
4949 t=time(NULL);
5050 char *err="unknown";
5151 switch(status) {
sockets.c
(13 / 13)
  
2929 rv.host=host;
3030 rv.svc=svc;
3131 rv.success=0;
32 rv.socket=-1;
3233
3334 return rv;
3435}
7676}
7777
7878enum returnvalues
79attemptConnection(requested_socket req)
79attemptConnection(requested_socket *req)
8080{
8181 struct addrinfo hints, *res, *res0;
8282 enum returnvalues rv=ERR_ERRNO;
83 register int s = -1;
8483 struct linger l;
8584 int fflags =0;
8685 char *cause=NULL;
8786 int err=0;
8887
89 if (req.host == NULL || req.svc == NULL) {
88 if (req->host == NULL || req->svc == NULL) {
9089 return (0);
9190 }
9291
9392 memset(&hints, 0, sizeof(hints));
9493 hints.ai_family = PF_UNSPEC;
9594 hints.ai_socktype = SOCK_STREAM;
96 err=getaddrinfo(req.host, req.svc, &hints, &res0);
95 err=getaddrinfo(req->host, req->svc, &hints, &res0);
9796 if(err != 0) {
9897 fprintf(stderr, "Error looking up %s:%s: %s\n",
99 req.host, req.svc, gai_strerror(err));
98 req->host, req->svc, gai_strerror(err));
10099 return(ERR_DNS);
101100 }
102101
103102 cause="no addresses";
104103 for (res = res0; res; res = res->ai_next) {
105104
106 if ((s = socket(res->ai_family, res->ai_socktype,
105 if ((req->socket = socket(res->ai_family, res->ai_socktype,
107106 res->ai_protocol)) < 0) {
108107
109108 cause="socket";
111111
112112 l.l_onoff = 1;
113113 l.l_linger = 60;
114 setsockopt(s, SOL_SOCKET, SO_LINGER, (char *) &l, sizeof(l));
114 setsockopt(req->socket, SOL_SOCKET, SO_LINGER, (char *) &l, sizeof(l));
115115
116116 /* Configure non-blocking IO */
117 fflags = fcntl(s, F_GETFL);
118 if(fcntl(s, F_SETFL, fflags | O_NONBLOCK) < 0) {
117 fflags = fcntl(req->socket, F_GETFL);
118 if(fcntl(req->socket, F_SETFL, fflags | O_NONBLOCK) < 0) {
119119 perror("fcntl");
120120 }
121121
122 if (connect(s, res->ai_addr, res->ai_addrlen) < 0) {
122 if (connect(req->socket, res->ai_addr, res->ai_addrlen) < 0) {
123123 if(errno==EINPROGRESS) {
124124 rv = RV_SUCCESS;
125125 break;
135135
136136 /* If we got this far, wait for data */
137137 if(rv == RV_SUCCESS) {
138 rv=waitForConnect(s);
138 rv=waitForConnect(req->socket);
139139 } else {
140140 perror(cause);
141141 }
142142
143 if(s>=0) {
144 close(s);
143 if(req->socket>=0) {
144 close(req->socket);
145145 }
146146
147147 return rv;
  
55typedef struct {
66 char *host;
77 char *svc;
8 int socket;
89 int success;
910} requested_socket;
1011
1112enum returnvalues { ERR_DNS=-3, ERR_TIMEOUT=-2, ERR_ERRNO=-1, RV_SUCCESS=0 };
1213
13enum returnvalues attemptConnection(requested_socket);
14enum returnvalues attemptConnection(requested_socket*);
1415
1516requested_socket mk_req(char *host, char *svc);