* 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;
}
do {
clilen = sizeof(cli_addr);
+ errno = 0;
newsockfd = accept(sockfd, (struct sockaddr *)&cli_addr, &clilen);
- } while (newsockfd < 0 && errno == EINTR);
+ } while (newsockfd < 0 && (errno == EINTR || errno == EAGAIN));
if (newsockfd < 0) {
continue;
}
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));
}
return 0;
}
- Dmsg1(99, "%s", bs->msg);
+ Dmsg1(99, "sent challenge: %s", bs->msg);
if (bnet_wait_data(bs, 180) <= 0 || bnet_recv(bs) <= 0) {
bmicrosleep(5, 0);
return 0;
if (ok) {
bnet_fsend(bs, "1000 OK auth\n");
} else {
+ Dmsg1(100, "PW: %s\n", password);
bnet_fsend(bs, "1999 Authorization failed.\n");
bmicrosleep(5, 0);
}
if (sscanf(mp_chr(bs->msg), "auth cram-md5 %s ssl=%d\n", chal, &ssl_has) != 2) {
ssl_has = BNET_SSL_NONE;
if (sscanf(mp_chr(bs->msg), "auth cram-md5 %s\n", chal) != 1) {
+ Dmsg1(100, "Cannot scan challenge: %s\n", bs->msg);
bmicrosleep(5, 0);
return 0;
}
hmac_md5((uint8_t *)chal, strlen(chal), (uint8_t *)password, strlen(password), hmac);
bs->msglen = bin_to_base64(mp_chr(bs->msg), (char *)hmac, 16) + 1;
if (!bnet_send(bs)) {
+ Dmsg0(100, "Send response failed.\n");
return 0;
}
Dmsg1(99, "sending resp to challenge: %s\n", bs->msg);
if (strcmp(mp_chr(bs->msg), "1000 OK auth\n") == 0) {
return 1;
}
+ Dmsg1(100, "PW: %s\n", password);
bmicrosleep(5, 0);
return 0;
}