* Wait for a connection from a client process.
*/
ready = sockset;
- if ((stat = select(sockfd+1, &ready, NULL, NULL, NULL)) < 0) {
- if (errno == EINTR || errno == EAGAIN) {
- errno = 0;
- continue;
- }
+ do {
+ errno = 0;
+ stat = select(sockfd+1, &ready, NULL, NULL, NULL);
+ } while(stat == -1 && (errno == EINTR || errno == EAGAIN));
+ if (stat < 0) {
close(sockfd);
Emsg1(M_FATAL, 0, _("Error in select: %s\n"), strerror(errno));
break;
}
- clilen = sizeof(cli_addr);
- newsockfd = accept(sockfd, (struct sockaddr *)&cli_addr, &clilen);
+ do {
+ clilen = sizeof(cli_addr);
+ errno = 0;
+ newsockfd = accept(sockfd, (struct sockaddr *)&cli_addr, &clilen);
+ } while (newsockfd < 0 && (errno == EINTR || errno == EAGAIN));
+ if (newsockfd < 0) {
+ continue;
+ }
#ifdef HAVE_LIBWRAP
P(mutex); /* hosts_access is not thread safe */
caller = "unknown client";
}
+ BSOCK *bs = init_bsock(NULL, newsockfd, "client", caller, port);
+ if (bs == NULL) {
+ Jmsg0(NULL, M_ABORT, 0, _("Could not create client BSOCK.\n"));
+ }
+
/* Queue client to be served */
- if ((stat = workq_add(client_wq,
- (void *)init_bsock(NULL, newsockfd, "client", caller, port), NULL, 0)) != 0) {
+ if ((stat = workq_add(client_wq, (void *)bs, NULL, 0)) != 0) {
V(mutex);
Jmsg1(NULL, M_ABORT, 0, _("Could not add job to client queue: ERR=%s\n"), strerror(stat));
}
* Open a TCP socket
*/
for (tlog=0; (sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0; tlog -= 10 ) {
+ if (errno == EINTR) {
+ continue;
+ }
if (tlog <= 0) {
tlog = 2*60;
Emsg1(M_ERROR, 0, _("Cannot open stream socket: %s\n"), strerror(errno));
serv_addr.sin_port = htons(port);
for (tlog=0; bind(sockfd, (struct sockaddr *) &serv_addr, sizeof(serv_addr)) < 0; tlog -= 5 ) {
+ if (errno == EINTR) {
+ continue;
+ }
if (tlog <= 0) {
tlog = 2*60;
Emsg2(M_WARNING, 0, _("Cannot bind port %d: %s: retrying ...\n"), port, strerror(errno));
newsockfd = -1;
break;
}
- clilen = sizeof(cli_addr);
- newsockfd = accept(bsock->fd, (struct sockaddr *)&cli_addr, &clilen);
- break;
+ do {
+ clilen = sizeof(cli_addr);
+ newsockfd = accept(bsock->fd, (struct sockaddr *)&cli_addr, &clilen);
+ } while (newsockfd < 0 && errno == EINTR);
+ if (newsockfd >= 0) {
+ break;
+ }
}
#ifdef HAVE_LIBWRAP