Page Menu
Home
FreeBSD
Search
Configure Global Search
Log In
Files
F109343889
D48596.diff
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Flag For Later
Award Token
Size
6 KB
Referenced Files
None
Subscribers
None
D48596.diff
View Options
diff --git a/usr.sbin/ctld/ctld.c b/usr.sbin/ctld/ctld.c
--- a/usr.sbin/ctld/ctld.c
+++ b/usr.sbin/ctld/ctld.c
@@ -1806,6 +1806,98 @@
return (0);
}
+static bool
+portal_init_socket(struct portal *p)
+{
+ struct portal_group *pg = p->p_portal_group;
+ int error, sockbuf;
+ int one = 1;
+
+ log_debugx("listening on %s, portal-group \"%s\"",
+ p->p_listen, pg->pg_name);
+ p->p_socket = socket(p->p_ai->ai_family, p->p_ai->ai_socktype,
+ p->p_ai->ai_protocol);
+ if (p->p_socket < 0) {
+ log_warn("socket(2) failed for %s",
+ p->p_listen);
+ return (false);
+ }
+
+ sockbuf = SOCKBUF_SIZE;
+ if (setsockopt(p->p_socket, SOL_SOCKET, SO_RCVBUF, &sockbuf,
+ sizeof(sockbuf)) == -1)
+ log_warn("setsockopt(SO_RCVBUF) failed for %s",
+ p->p_listen);
+ sockbuf = SOCKBUF_SIZE;
+ if (setsockopt(p->p_socket, SOL_SOCKET, SO_SNDBUF, &sockbuf,
+ sizeof(sockbuf)) == -1)
+ log_warn("setsockopt(SO_SNDBUF) failed for %s", p->p_listen);
+ if (setsockopt(p->p_socket, SOL_SOCKET, SO_NO_DDP, &one,
+ sizeof(one)) == -1)
+ log_warn("setsockopt(SO_NO_DDP) failed for %s", p->p_listen);
+ error = setsockopt(p->p_socket, SOL_SOCKET, SO_REUSEADDR, &one,
+ sizeof(one));
+ if (error != 0) {
+ log_warn("setsockopt(SO_REUSEADDR) failed for %s", p->p_listen);
+ close(p->p_socket);
+ p->p_socket = 0;
+ return (false);
+ }
+
+ if (pg->pg_dscp != -1) {
+ /* Only allow the 6-bit DSCP field to be modified */
+ int tos = pg->pg_dscp << 2;
+ switch (p->p_ai->ai_family) {
+ case AF_INET:
+ if (setsockopt(p->p_socket, IPPROTO_IP, IP_TOS,
+ &tos, sizeof(tos)) == -1)
+ log_warn("setsockopt(IP_TOS) failed for %s",
+ p->p_listen);
+ break;
+ case AF_INET6:
+ if (setsockopt(p->p_socket, IPPROTO_IPV6, IPV6_TCLASS,
+ &tos, sizeof(tos)) == -1)
+ log_warn("setsockopt(IPV6_TCLASS) failed for %s",
+ p->p_listen);
+ break;
+ }
+ }
+ if (pg->pg_pcp != -1) {
+ int pcp = pg->pg_pcp;
+ switch (p->p_ai->ai_family) {
+ case AF_INET:
+ if (setsockopt(p->p_socket, IPPROTO_IP, IP_VLAN_PCP,
+ &pcp, sizeof(pcp)) == -1)
+ log_warn("setsockopt(IP_VLAN_PCP) failed for %s",
+ p->p_listen);
+ break;
+ case AF_INET6:
+ if (setsockopt(p->p_socket, IPPROTO_IPV6, IPV6_VLAN_PCP,
+ &pcp, sizeof(pcp)) == -1)
+ log_warn("setsockopt(IPV6_VLAN_PCP) failed for %s",
+ p->p_listen);
+ break;
+ }
+ }
+
+ error = bind(p->p_socket, p->p_ai->ai_addr,
+ p->p_ai->ai_addrlen);
+ if (error != 0) {
+ log_warn("bind(2) failed for %s", p->p_listen);
+ close(p->p_socket);
+ p->p_socket = 0;
+ return (false);
+ }
+ error = listen(p->p_socket, -1);
+ if (error != 0) {
+ log_warn("listen(2) failed for %s", p->p_listen);
+ close(p->p_socket);
+ p->p_socket = 0;
+ return (false);
+ }
+ return (true);
+}
+
static int
conf_apply(struct conf *oldconf, struct conf *newconf)
{
@@ -1814,8 +1906,7 @@
struct portal *oldp, *newp;
struct port *oldport, *newport, *tmpport;
struct isns *oldns, *newns;
- int changed, cumulated_error = 0, error, sockbuf;
- int one = 1;
+ int changed, cumulated_error = 0, error;
if (oldconf->conf_debug != newconf->conf_debug) {
log_debugx("changing debug level to %d", newconf->conf_debug);
@@ -2082,109 +2173,7 @@
assert(proxy_mode == false);
assert(newp->p_iser == false);
- log_debugx("listening on %s, portal-group \"%s\"",
- newp->p_listen, newpg->pg_name);
- newp->p_socket = socket(newp->p_ai->ai_family,
- newp->p_ai->ai_socktype,
- newp->p_ai->ai_protocol);
- if (newp->p_socket < 0) {
- log_warn("socket(2) failed for %s",
- newp->p_listen);
- cumulated_error++;
- continue;
- }
- sockbuf = SOCKBUF_SIZE;
- if (setsockopt(newp->p_socket, SOL_SOCKET, SO_RCVBUF,
- &sockbuf, sizeof(sockbuf)) == -1)
- log_warn("setsockopt(SO_RCVBUF) failed "
- "for %s", newp->p_listen);
- sockbuf = SOCKBUF_SIZE;
- if (setsockopt(newp->p_socket, SOL_SOCKET, SO_SNDBUF,
- &sockbuf, sizeof(sockbuf)) == -1)
- log_warn("setsockopt(SO_SNDBUF) failed "
- "for %s", newp->p_listen);
- if (setsockopt(newp->p_socket, SOL_SOCKET, SO_NO_DDP,
- &one, sizeof(one)) == -1)
- log_warn("setsockopt(SO_NO_DDP) failed "
- "for %s", newp->p_listen);
- error = setsockopt(newp->p_socket, SOL_SOCKET,
- SO_REUSEADDR, &one, sizeof(one));
- if (error != 0) {
- log_warn("setsockopt(SO_REUSEADDR) failed "
- "for %s", newp->p_listen);
- close(newp->p_socket);
- newp->p_socket = 0;
- cumulated_error++;
- continue;
- }
- if (newpg->pg_dscp != -1) {
- struct sockaddr sa;
- int len = sizeof(sa);
- getsockname(newp->p_socket, &sa, &len);
- /*
- * Only allow the 6-bit DSCP
- * field to be modified
- */
- int tos = newpg->pg_dscp << 2;
- if (sa.sa_family == AF_INET) {
- if (setsockopt(newp->p_socket,
- IPPROTO_IP, IP_TOS,
- &tos, sizeof(tos)) == -1)
- log_warn("setsockopt(IP_TOS) "
- "failed for %s",
- newp->p_listen);
- } else
- if (sa.sa_family == AF_INET6) {
- if (setsockopt(newp->p_socket,
- IPPROTO_IPV6, IPV6_TCLASS,
- &tos, sizeof(tos)) == -1)
- log_warn("setsockopt(IPV6_TCLASS) "
- "failed for %s",
- newp->p_listen);
- }
- }
- if (newpg->pg_pcp != -1) {
- struct sockaddr sa;
- int len = sizeof(sa);
- getsockname(newp->p_socket, &sa, &len);
- /*
- * Only allow the 6-bit DSCP
- * field to be modified
- */
- int pcp = newpg->pg_pcp;
- if (sa.sa_family == AF_INET) {
- if (setsockopt(newp->p_socket,
- IPPROTO_IP, IP_VLAN_PCP,
- &pcp, sizeof(pcp)) == -1)
- log_warn("setsockopt(IP_VLAN_PCP) "
- "failed for %s",
- newp->p_listen);
- } else
- if (sa.sa_family == AF_INET6) {
- if (setsockopt(newp->p_socket,
- IPPROTO_IPV6, IPV6_VLAN_PCP,
- &pcp, sizeof(pcp)) == -1)
- log_warn("setsockopt(IPV6_VLAN_PCP) "
- "failed for %s",
- newp->p_listen);
- }
- }
- error = bind(newp->p_socket, newp->p_ai->ai_addr,
- newp->p_ai->ai_addrlen);
- if (error != 0) {
- log_warn("bind(2) failed for %s",
- newp->p_listen);
- close(newp->p_socket);
- newp->p_socket = 0;
- cumulated_error++;
- continue;
- }
- error = listen(newp->p_socket, -1);
- if (error != 0) {
- log_warn("listen(2) failed for %s",
- newp->p_listen);
- close(newp->p_socket);
- newp->p_socket = 0;
+ if (!portal_init_socket(newp)) {
cumulated_error++;
continue;
}
File Metadata
Details
Attached
Mime Type
text/plain
Expires
Tue, Feb 4, 8:19 PM (14 h, 18 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
16148730
Default Alt Text
D48596.diff (6 KB)
Attached To
Mode
D48596: ctld: Factor our code to setup a listening socket into a separate function
Attached
Detach File
Event Timeline
Log In to Comment