Merge authors:
  Cameron Norman (cameronnemo)
  Kai Mast (kai-mast)
Related merge proposals:
  https://code.launchpad.net/~cameronnemo/upstart/ipv6/+merge/204599
  proposed by: Cameron Norman (cameronnemo)
  review: Needs Fixing - James Hunt (jamesodhunt)
------------------------------------------------------------
revno: 1594 [merge]
fixes bug: https://launchpad.net/bugs/942955
committer: James Hunt <[email protected]>
branch nick: upstart
timestamp: Wed 2014-02-19 09:07:56 +0000
message:
  * Merged lp:~cameronnemo/upstart/ipv6.
modified:
  ChangeLog
  extra/man/socket-event.7
  extra/upstart-socket-bridge.c


--
lp:upstart
https://code.launchpad.net/~upstart-devel/upstart/trunk

Your team Upstart Reviewers is subscribed to branch lp:upstart.
To unsubscribe from this branch go to 
https://code.launchpad.net/~upstart-devel/upstart/trunk/+edit-subscription
=== modified file 'ChangeLog'
--- ChangeLog	2014-02-04 11:32:56 +0000
+++ ChangeLog	2014-02-05 01:06:35 +0000
@@ -1,3 +1,10 @@
+2014-02-04   Cameron Norman  <[email protected]>
+
+	* extra/upstart-socket-bridge.c:
+	  - epoll_watcher(): Fix missing breaks in a switch, move buffer and
+	                     remove its nih_local usage.
+	  - job_add_socket(): added case for name_len being a AF_INET6 address.
+
 2014-02-04  James Hunt  <[email protected]>
 
 	* extra/man/socket-event.7: Environment variable is
@@ -9,6 +16,15 @@
 	  stealing the console in an container: fopen(3) may not specify
 	  O_NOCTTY and Upstart should not own the console (LP: #1263738).
 
+2014-01-20  Cameron Norman  <[email protected]>
+
+	* extra/upstart-socket-bridge.c: Fixed indentation, used nih_local.
+	* extra/man/socket-event.7: Added inet6 example.
+
+2014-01-19  Kai Mast <[email protected]>
+
+	* extra/upstart-socket-bridge.c: Added IPv6 support (LP: #942955).
+
 2014-01-17  James Hunt  <[email protected]>
 
 	* init/conf.c:

=== modified file 'extra/man/socket-event.7'
--- extra/man/socket-event.7	2014-02-04 11:32:56 +0000
+++ extra/man/socket-event.7	2014-02-05 01:06:35 +0000
@@ -39,7 +39,7 @@
 .\"
 .SH EXAMPLES
 .\"
-.SS Internet socket
+.SS Internet (IPv4) socket
 Start web server when first client connects from localhost:
 .RS
 .nf
@@ -48,6 +48,15 @@
 .fi
 .RE
 .\"
+.SS Internet (IPv6) socket
+Start job when a client connects from localhost:
+.RS
+.nf
+
+start on socket PROTO=inet6 PORT=80 ADDR=::1
+.fi
+.RE
+.\"
 .SS Local socket
 .P
 .RS

=== modified file 'extra/upstart-socket-bridge.c'
--- extra/upstart-socket-bridge.c	2013-10-23 16:33:09 +0000
+++ extra/upstart-socket-bridge.c	2014-02-11 02:33:51 +0000
@@ -67,9 +67,10 @@
 	NihList entry;
 
 	union {
-		struct sockaddr        addr;
-		struct sockaddr_in sin_addr;
-		struct sockaddr_un sun_addr;
+		struct sockaddr         addr;
+		struct sockaddr_in  sin_addr;
+		struct sockaddr_in6 sin6_addr;
+		struct sockaddr_un  sun_addr;
 	};
 	socklen_t addrlen;
 
@@ -295,6 +296,7 @@
 		size_t env_len = 0;
 		char *var;
 		DBusPendingCall *pending_call;
+		char buffer[INET6_ADDRSTRLEN];
 
 		if (event[i].events & EPOLLIN)
 			nih_debug ("%p EPOLLIN", sock);
@@ -308,18 +310,35 @@
 		switch (sock->addr.sa_family) {
 		case AF_INET:
 			NIH_MUST (nih_str_array_add (&env, NULL, &env_len,
-						     "PROTO=inet"));
-
-			var = NIH_MUST (nih_sprintf (NULL, "PORT=%d",
-						     ntohs (sock->sin_addr.sin_port)));
-			NIH_MUST (nih_str_array_addp (&env, NULL, &env_len,
-						      var));
-			nih_discard (var);
-
-			var = NIH_MUST (nih_sprintf (NULL, "ADDR=%s",
-						     inet_ntoa (sock->sin_addr.sin_addr)));
-			NIH_MUST (nih_str_array_addp (&env, NULL, &env_len,
-						      var));
+							"PROTO=inet"));
+
+			var = NIH_MUST (nih_sprintf (NULL, "PORT=%d",
+							ntohs (sock->sin_addr.sin_port)));
+			NIH_MUST (nih_str_array_addp (&env, NULL, &env_len,
+							var));
+			nih_discard (var);
+
+			var = NIH_MUST (nih_sprintf (NULL, "ADDR=%s",
+							inet_ntoa (sock->sin_addr.sin_addr)));
+			NIH_MUST (nih_str_array_addp (&env, NULL, &env_len,
+							var));
+			nih_discard (var);
+			break;
+ 		case AF_INET6:
+			NIH_MUST (nih_str_array_add (&env, NULL, &env_len,
+							"PROTO=inet6"));
+
+			var = NIH_MUST (nih_sprintf (NULL, "PORT=%d",
+							ntohs (sock->sin6_addr.sin6_port)));
+			NIH_MUST (nih_str_array_addp (&env, NULL, &env_len,
+							var));
+			nih_discard (var);
+
+			var = NIH_MUST (nih_sprintf (NULL, "ADDR=%s",
+							inet_ntop(AF_INET6, &sock->sin6_addr.sin6_addr, buffer, INET6_ADDRSTRLEN)));
+
+			NIH_MUST (nih_str_array_addp (&env, NULL, &env_len,
+							var));
 			nih_discard (var);
 			break;
 		case AF_UNIX:
@@ -504,6 +523,11 @@
 				sock->sin_addr.sin_family = AF_INET;
 				sock->sin_addr.sin_addr.s_addr = INADDR_ANY;
 				components = 1;
+			} else if (! strcmp (val, "inet6")) {
+				sock->addrlen = sizeof sock->sin6_addr;
+				sock->sin6_addr.sin6_family = AF_INET6;
+				sock->sin6_addr.sin6_addr = in6addr_any;
+				components = 1;
 			} else if (! strcmp (val, "unix")) {
 				sock->addrlen = sizeof sock->sun_addr;
 				sock->sun_addr.sun_family = AF_UNIX;
@@ -515,22 +539,31 @@
 			}
 
 		} else if (! strncmp (*env, "PORT", name_len)
-			   && (sock->sin_addr.sin_family == AF_INET)) {
+		           && (sock->sin_addr.sin_family == AF_INET)) {
 			sock->sin_addr.sin_port = htons (atoi (val));
 			components--;
-
+		} else if (! strncmp (*env, "PORT", name_len)
+		           && (sock->sin6_addr.sin6_family == AF_INET6)) {
+			sock->sin6_addr.sin6_port = htons (atoi (val));
+			components--;
 		} else if (! strncmp (*env, "ADDR", name_len)
-			   && (sock->sin_addr.sin_family == AF_INET)) {
+		           && (sock->sin_addr.sin_family == AF_INET)) {
 			if (inet_aton (val, &(sock->sin_addr.sin_addr)) == 0) {
 				nih_warn ("Ignored socket event with invalid ADDR=%s in %s",
-					  val, job->path);
-				goto error;
-			}
-
+				          val, job->path);
+				goto error;
+			}
+		} else if (! strncmp (*env, "ADDR", name_len)
+		           && (sock->sin6_addr.sin6_family == AF_INET6)) {
+			if (inet_pton (AF_INET6, val, &(sock->sin6_addr.sin6_addr)) != 1) {
+				nih_warn ("Ignored socket event with invalid ADDR=%s in %s",
+				          val, job->path);
+				goto error;
+			}
 		} else if (! strncmp (*env, "PATH", name_len)
-			   && (sock->sun_addr.sun_family == AF_UNIX)) {
+		           && (sock->sun_addr.sun_family == AF_UNIX)) {
 			strncpy (sock->sun_addr.sun_path, val,
-				 sizeof sock->sun_addr.sun_path);
+			         sizeof sock->sun_addr.sun_path);
 
 			if (sock->sun_addr.sun_path[0] == '@')
 				sock->sun_addr.sun_path[0] = '\0';
@@ -567,6 +600,15 @@
 		goto error;
 	}
 
+	/* If socket is ipv6, need to set IPV6_V6ONLY option */
+	if (sock->sin6_addr.sin6_family == AF_INET6 && 
+	    setsockopt (sock->sock, SOL_IPV6, IPV6_V6ONLY,
+	                &opt, sizeof opt) < 0) {
+		nih_warn ("Failed to set IPV6 only option in %s: %s",
+		          job->path, strerror (errno));
+		goto error;
+	}
+
 	if (bind (sock->sock, &sock->addr, sock->addrlen) < 0) {
 		nih_warn ("Failed to bind socket in %s: %s",
 			  job->path, strerror (errno));

-- 
upstart-devel mailing list
[email protected]
Modify settings or unsubscribe at: 
https://lists.ubuntu.com/mailman/listinfo/upstart-devel

Reply via email to