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
