int uds_connectsock(char *sockpath)
{
struct sockaddr_un addr;
+ int fdflags;
int s;
memset(&addr, 0, sizeof(addr));
return(-1);
}
+ fdflags = fcntl(s, F_GETFL);
+ if (fdflags < 0) {
+ syslog(LOG_ERR,
+ "unable to get socket %d flags! %s \n",
+ s,
+ strerror(errno));
+ close(s);
+ return -1;
+ }
+ fdflags = fdflags | O_NONBLOCK;
+ if (fcntl(s, F_SETFL, fdflags) < 0) {
+ syslog(LOG_ERR,
+ "unable to set socket %d nonblocking flags! %s \n",
+ s,
+ strerror(errno));
+ close(s);
+ return -1;
+ }
+
return s;
}
}
rc = connect(s, ai->ai_addr, ai->ai_addrlen);
if (rc >= 0) {
+ int fdflags;
freeaddrinfo(res);
+
+ fdflags = fcntl(rc, F_GETFL);
+ if (fdflags < 0) {
+ syslog(LOG_ERR,
+ "unable to get socket %d flags! %s \n",
+ rc,
+ strerror(errno));
+ close(rc);
+ return -1;
+ }
+ fdflags = fdflags | O_NONBLOCK;
+ if (fcntl(rc, F_SETFL, fdflags) < 0) {
+ syslog(LOG_ERR,
+ "unable to set socket %d nonblocking flags! %s \n",
+ rc,
+ strerror(errno));
+ close(s);
+ return -1;
+ }
+
return(s);
}
else {
FlushStrBuf(WCC->MigrateReadLineBuf);
strbuf[len] = '\0';
#ifdef SERV_TRACE
- syslog(LOG_DEBUG, "%3d<<<%s\n", WC->serv_sock, strbuf);
+ syslog(LOG_DEBUG, "%3d<<<%s\n", WCC->serv_sock, strbuf);
#endif
return len;
}
* port_number port number to bind
* queue_len number of incoming connections to allow in the queue
*/
-int webcit_tcp_server(char *ip_addr, int port_number, int queue_len)
+int webcit_tcp_server(const char *ip_addr, int port_number, int queue_len)
{
+ const char *ipv4broadcast = "0.0.0.0";
+ int IsDefault = 0;
struct protoent *p;
struct sockaddr_in6 sin6;
struct sockaddr_in sin4;
int s, i, b;
int ip_version = 6;
+retry:
memset(&sin6, 0, sizeof(sin6));
memset(&sin4, 0, sizeof(sin4));
sin6.sin6_family = AF_INET6;
|| (IsEmptyStr(ip_addr))
|| (!strcmp(ip_addr, "*"))
) {
+ IsDefault = 1;
ip_version = 6;
sin6.sin6_addr = in6addr_any;
}
s = socket( ((ip_version == 6) ? PF_INET6 : PF_INET), SOCK_STREAM, (p->p_proto));
if (s < 0) {
+ if (IsDefault && (errno == EAFNOSUPPORT))
+ {
+ s = 0;
+ ip_addr = ipv4broadcast;
+ goto retry;
+ }
syslog(LOG_WARNING, "Can't create a listening socket: %s\n", strerror(errno));
return (-WC_EXIT_BIND);
}