-static int\r
-accept_precallback(rb_fde_t *F, struct sockaddr *addr, rb_socklen_t addrlen, void *data)\r
-{\r
- struct Listener *listener = (struct Listener *)data;\r
- char buf[BUFSIZE];\r
- struct ConfItem *aconf;\r
-\r
- if((maxconnections - 10) < rb_get_fd(F)) /* XXX this is kinda bogus */\r
- {\r
- ++ServerStats->is_ref;\r
- /*\r
- * slow down the whining to opers bit\r
- */\r
- if((last_oper_notice + 20) <= rb_current_time())\r
- {\r
- sendto_realops_flags(SNO_GENERAL, L_ALL,\r
- "All connections in use. (%s)",\r
- get_listener_name(listener));\r
- last_oper_notice = rb_current_time();\r
- }\r
- \r
- rb_write(F, "ERROR :All connections in use\r\n", 32);\r
- rb_close(F);\r
- /* Re-register a new IO request for the next accept .. */\r
- return 0;\r
- }\r
-\r
- aconf = find_dline(addr);\r
- if(aconf != NULL && (aconf->status & CONF_EXEMPTDLINE))\r
- return 1;\r
- \r
- /* Do an initial check we aren't connecting too fast or with too many\r
- * from this IP... */\r
- if(aconf != NULL)\r
- {\r
- ServerStats->is_ref++;\r
- \r
- if(ConfigFileEntry.dline_with_reason)\r
- {\r
- if (rb_snprintf(buf, sizeof(buf), "ERROR :*** Banned: %s\r\n", aconf->passwd) >= (int)(sizeof(buf)-1))\r
- {\r
- buf[sizeof(buf) - 3] = '\r';\r
- buf[sizeof(buf) - 2] = '\n';\r
- buf[sizeof(buf) - 1] = '\0';\r
- }\r
- }\r
- else\r
- strcpy(buf, "ERROR :You have been D-lined.\r\n");\r
- \r
- rb_write(F, buf, strlen(buf));\r
- rb_close(F);\r
- return 0;\r
- }\r
-\r
- return 1;\r
-}\r
-\r
-static void\r
-accept_callback(rb_fde_t *F, int status, struct sockaddr *addr, rb_socklen_t addrlen, void *data)\r
-{\r
- struct Listener *listener = data;\r
- struct rb_sockaddr_storage lip;\r
- unsigned int locallen = sizeof(struct rb_sockaddr_storage);\r
- \r
- ServerStats->is_ac++;\r
-\r
- if(getsockname(rb_get_fd(F), (struct sockaddr *) &lip, &locallen) < 0)\r
- {\r
- /* this shouldn't fail so... */\r
- /* XXX add logging of this */\r
- rb_close(F);\r
- }\r
- \r
- add_connection(listener, F, addr, (struct sockaddr *)&lip, NULL);\r
+static void
+accept_ssld(rb_fde_t *F, struct sockaddr *addr, struct sockaddr *laddr, struct Listener *listener)
+{
+ ssl_ctl_t *ctl;
+ rb_fde_t *xF[2];
+ rb_socketpair(AF_UNIX, SOCK_STREAM, 0, &xF[0], &xF[1], "Incoming ssld Connection");
+ ctl = start_ssld_accept(F, xF[1], rb_get_fd(xF[0])); /* this will close F for us */
+ add_connection(listener, xF[0], addr, laddr, ctl);
+}
+
+static void
+accept_callback(rb_fde_t *F, int status, struct sockaddr *addr, rb_socklen_t addrlen, void *data)
+{
+ struct Listener *listener = data;
+ struct rb_sockaddr_storage lip;
+ unsigned int locallen = sizeof(struct rb_sockaddr_storage);
+
+ ServerStats.is_ac++;
+
+ if(getsockname(rb_get_fd(F), (struct sockaddr *) &lip, &locallen) < 0)
+ {
+ /* this can fail if the connection disappeared in the meantime */
+ rb_close(F);
+ return;
+ }
+
+ if(listener->ssl)
+ accept_ssld(F, addr, (struct sockaddr *)&lip, listener);
+ else
+ add_connection(listener, F, addr, (struct sockaddr *)&lip, NULL);