extern ServerConfig *Config;
extern InspIRCd* ServerInstance;
-extern int openSockfd[MAXSOCKS];
+extern int openSockfd[MAX_DESCRIPTORS];
extern time_t TIME;
extern int MODCOUNT;
log(DEFAULT,"WARNING: <server:name> '%s' is not a fully-qualified domain name. Changed to '%s%c'",x,x,'.');
charlcat(x,'.',MAXBUF);
}
- strlower(x);
+ //strlower(x);
return true;
}
*/
if (!bail)
{
+ ServerInstance->stats->BoundPortCount = BindPorts(false);
+
if (!removed_modules.empty())
for (std::vector<std::string>::iterator removing = removed_modules.begin(); removing != removed_modules.end(); removing++)
{
}
}
-void Exit (int status)
+void Exit(int status)
{
if (Config->log_file)
fclose(Config->log_file);
-void Start (void)
+void Start()
{
printf("\033[1;32mInspire Internet Relay Chat Server, compiled %s at %s\n",__DATE__,__TIME__);
printf("(C) ChatSpike Development team.\033[0m\n\n");
printf("Name concept:\t\t\033[1;32mLord_Zathras\033[0m\n\n");
}
-void WritePID(std::string filename)
+void WritePID(const std::string &filename)
{
ofstream outfile(filename.c_str());
if (outfile.is_open())
}
-int DaemonSeed (void)
+bool DaemonSeed()
{
int childpid;
if ((childpid = fork ()) < 0)
if (getrlimit(RLIMIT_CORE, &rl) == -1)
{
log(DEFAULT,"Failed to getrlimit()!");
- return(FALSE);
+ return false;
}
else
{
}
}
- return (TRUE);
+ return true;
}
return atoi(result);
}
-// This will bind a socket to a port. It works for UDP/TCP
-int BindSocket (int sockfd, struct sockaddr_in client, struct sockaddr_in server, int port, char* addr)
+/** This will bind a socket to a port. It works for UDP/TCP.
+ * If a hostname is given to bind to, the function will first
+ * attempt to resolve the hostname, then bind to the IP the
+ * hostname resolves to. This is a blocking lookup blocking for
+ * a maximum of one second before it times out, using the DNS
+ * server specified in the configuration file.
+ */
+bool BindSocket (int sockfd, struct sockaddr_in client, struct sockaddr_in server, int port, char* addr)
{
memset((char *)&server,0,sizeof(server));
struct in_addr addy;
else
{
log(DEFAULT,"WARNING: Could not resolve '%s' to an IP for binding to on port %d",addr,port);
- return(FALSE);
+ return false;
}
}
server.sin_family = AF_INET;
server.sin_port = htons(port);
if (bind(sockfd,(struct sockaddr*)&server,sizeof(server)) < 0)
{
- return(ERROR);
+ return false;
}
else
{
if (listen(sockfd, Config->MaxConn) == -1)
{
log(DEFAULT,"ERROR in listen(): %s",strerror(errno));
- return(FALSE);
+ return false;
}
else
{
- return(TRUE);
+ return true;
}
}
}
// Open a TCP Socket
-int OpenTCPSocket (void)
+int OpenTCPSocket()
{
int sockfd;
int on = 1;
struct linger linger = { 0 };
if ((sockfd = socket (AF_INET, SOCK_STREAM, 0)) < 0)
+ {
+ log(DEFAULT,"Error creating TCP socket: %s",strerror(errno));
return (ERROR);
+ }
else
{
setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, (const char*)&on, sizeof(on));
}
}
-int BindPorts()
+bool HasPort(int port, char* addr)
+{
+ for (int count = 0; count < ServerInstance->stats->BoundPortCount; count++)
+ {
+ if ((port == Config->ports[count]) && (!strcasecmp(Config->addrs[count],addr)))
+ {
+ return true;
+ }
+ }
+ return false;
+}
+
+int BindPorts(bool bail)
{
char configToken[MAXBUF], Addr[MAXBUF], Type[MAXBUF];
sockaddr_in client,server;
int clientportcount = 0;
int BoundPortCount = 0;
+ if (!bail)
+ {
+ int InitialPortCount = ServerInstance->stats->BoundPortCount;
+ log(DEBUG,"Initial port count: %d",InitialPortCount);
+
+ for (int count = 0; count < Config->ConfValueEnum("bind",&Config->config_f); count++)
+ {
+ Config->ConfValue("bind","port",count,configToken,&Config->config_f);
+ Config->ConfValue("bind","address",count,Addr,&Config->config_f);
+ Config->ConfValue("bind","type",count,Type,&Config->config_f);
+ if (((!*Type) || (!strcmp(Type,"clients"))) && (!HasPort(atoi(configToken),Addr)))
+ {
+ // modules handle server bind types now
+ Config->ports[clientportcount+InitialPortCount] = atoi(configToken);
+ if (*Addr == '*')
+ *Addr = 0;
+
+ strlcpy(Config->addrs[clientportcount+InitialPortCount],Addr,256);
+ clientportcount++;
+ log(DEBUG,"NEW binding %s:%s [%s] from config",Addr,configToken, Type);
+ }
+ }
+ int PortCount = clientportcount;
+ if (PortCount)
+ {
+ for (int count = InitialPortCount; count < InitialPortCount + PortCount; count++)
+ {
+ if ((openSockfd[count] = OpenTCPSocket()) == ERROR)
+ {
+ log(DEBUG,"Bad fd %d binding port [%s:%d]",openSockfd[count],Config->addrs[count],Config->ports[count]);
+ return ERROR;
+ }
+ if (!BindSocket(openSockfd[count],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
+ {
+ /* Associate the new open port with a slot in the socket engine */
+ ServerInstance->SE->AddFd(openSockfd[count],true,X_LISTEN);
+ BoundPortCount++;
+ }
+ }
+ return InitialPortCount + BoundPortCount;
+ }
+ else
+ {
+ log(DEBUG,"There is nothing new to bind!");
+ }
+ return InitialPortCount;
+ }
+
for (int count = 0; count < Config->ConfValueEnum("bind",&Config->config_f); count++)
{
Config->ConfValue("bind","port",count,configToken,&Config->config_f);
strlcpy(Config->addrs[clientportcount],Addr,256);
clientportcount++;
- log(DEBUG,"InspIRCd: startup: read binding %s:%s [%s] from config",Addr,configToken, Type);
+ log(DEBUG,"Binding %s:%s [%s] from config",Addr,configToken, Type);
}
}
{
if ((openSockfd[BoundPortCount] = OpenTCPSocket()) == ERROR)
{
- log(DEBUG,"InspIRCd: startup: bad fd %lu binding port [%s:%d]",(unsigned long)openSockfd[BoundPortCount],Config->addrs[count],(unsigned long)Config->ports[count]);
- return(ERROR);
+ log(DEBUG,"Bad fd %d binding port [%s:%d]",openSockfd[BoundPortCount],Config->addrs[count],Config->ports[count]);
+ return ERROR;
}
- if (BindSocket(openSockfd[BoundPortCount],client,server,Config->ports[count],Config->addrs[count]) == ERROR)
+ if (!BindSocket(openSockfd[BoundPortCount],client,server,Config->ports[count],Config->addrs[count]))
{
- log(DEFAULT,"InspIRCd: startup: failed to bind port [%s:%lu]: %s",Config->addrs[count],(unsigned long)Config->ports[count],strerror(errno));
+ log(DEFAULT,"Failed to bind port [%s:%d]: %s",Config->addrs[count],Config->ports[count],strerror(errno));
}
else
{
/* if we didn't bind to anything then abort */
if (!BoundPortCount)
{
- log(DEFAULT,"InspIRCd: startup: no ports bound, bailing!");
- printf("\nERROR: Was not able to bind any of %lu ports! Please check your configuration.\n\n", (unsigned long)PortCount);
- return (ERROR);
+ log(DEFAULT,"No ports bound, bailing!");
+ printf("\nERROR: Could not bind any of %d ports! Please check your configuration.\n\n", PortCount);
+ return ERROR;
}
return BoundPortCount;