+ for (int count = 0; count < Config->ConfValueEnum(Config->config_data, "bind"); count++)
+ {
+ Config->ConfValue(Config->config_data, "bind", "port", count, configToken, MAXBUF);
+ Config->ConfValue(Config->config_data, "bind", "address", count, Addr, MAXBUF);
+ Config->ConfValue(Config->config_data, "bind", "type", count, Type, MAXBUF);
+
+ if ((!*Type) || (!strcmp(Type,"clients")))
+ {
+ // modules handle server bind types now
+ Config->ports[clientportcount] = atoi(configToken);
+
+ // If the client put bind "*", this is an unrealism.
+ // We don't actually support this as documented, but
+ // i got fed up of people trying it, so now it converts
+ // it to an empty string meaning the same 'bind to all'.
+ if (*Addr == '*')
+ *Addr = 0;
+
+ strlcpy(Config->addrs[clientportcount],Addr,256);
+ clientportcount++;
+ log(DEBUG,"Binding %s:%s [%s] from config",Addr,configToken, Type);
+ }
+ }
+
+ int PortCount = clientportcount;
+
+ for (int count = 0; count < PortCount; count++)
+ {
+ if ((Config->openSockfd[BoundPortCount] = OpenTCPSocket()) == ERROR)
+ {
+ log(DEBUG,"Bad fd %d binding port [%s:%d]",Config->openSockfd[BoundPortCount],Config->addrs[count],Config->ports[count]);
+ }
+ else
+ {
+ if (!BindSocket(Config->openSockfd[BoundPortCount],client,server,Config->ports[count],Config->addrs[count]))
+ {
+ log(DEFAULT,"Failed to bind port [%s:%d]: %s",Config->addrs[count],Config->ports[count],strerror(errno));
+ }
+ else
+ {
+ /* well we at least bound to one socket so we'll continue */
+ BoundPortCount++;
+ }
+ }
+ }
+ return BoundPortCount;