<html>
    <head>
      <base href="https://bugs.freedesktop.org/" />
    </head>
    <body><span class="vcard"><a class="email" href="mailto:lennart@poettering.net" title="Lennart Poettering <lennart@poettering.net>"> <span class="fn">Lennart Poettering</span></a>
</span> changed
              <a class="bz_bug_link 
          bz_status_NEW "
   title="NEW - RFE: core: we should have a way to make failed listening on specific ports in .socket non-fatal, via a syntax of ListenStream=-[::]:4711"
   href="https://bugs.freedesktop.org/show_bug.cgi?id=84604">bug 84604</a>
          <br>
             <table border="1" cellspacing="0" cellpadding="8">
          <tr>
            <th>What</th>
            <th>Removed</th>
            <th>Added</th>
          </tr>

         <tr>
           <td style="text-align:right;">Summary</td>
           <td>systemd.socket unit bind with AF_INET6 on IPv4 ports (cups)
           </td>
           <td>RFE: core: we should have a way to make failed listening on specific ports in .socket non-fatal, via a syntax of ListenStream=-[::]:4711
           </td>
         </tr></table>
      <p>
        <div>
            <b><a class="bz_bug_link 
          bz_status_NEW "
   title="NEW - RFE: core: we should have a way to make failed listening on specific ports in .socket non-fatal, via a syntax of ListenStream=-[::]:4711"
   href="https://bugs.freedesktop.org/show_bug.cgi?id=84604#c5">Comment # 5</a>
              on <a class="bz_bug_link 
          bz_status_NEW "
   title="NEW - RFE: core: we should have a way to make failed listening on specific ports in .socket non-fatal, via a syntax of ListenStream=-[::]:4711"
   href="https://bugs.freedesktop.org/show_bug.cgi?id=84604">bug 84604</a>
              from <span class="vcard"><a class="email" href="mailto:lennart@poettering.net" title="Lennart Poettering <lennart@poettering.net>"> <span class="fn">Lennart Poettering</span></a>
</span></b>
        <pre>So, systemd currently doesn't support this scheme nicely. We should however. 

The ipv6only compat stuff is you really should set to "on" for cups. CUPS
appears to require that, and that's probably a really good idea for it.

Now, to achieve what you want, you should use:

ListenStream=0.0.0.0:631
ListenStream=[::]:631

both lines listed in the same .socket file. The first line will listen on the
IPv4 port 631 on all interfaces, the second line on the IPv6 port 631. Now,
there's one problem with this: the latter line will cause the .socket unit to
fail on kernels where ipv6 is not compiled in. The question now is what to do
about this.

We have two options:

1) introduce a syntax "ListenStream=-[::]:631" (i.e. note the "-"), which would
tell systemd that failure to listen on that port shall not be considered fatal.
This would then be similar to our "ExectStart=-/bin/false" syntax, where the
dash encodes that the exit cause for the process shall be ignored. 

2) change the logic of .socket units to succeed if we managed to listen on at
least *one* of all of its specified ports. Currently we fail if at least one
listening fails, and we'd turn this around so that we'd succeed if at least one
listening succeeds.

I think option #1 is preferable here though, simply because we normally should
guarantee stability of the order of fds we pass to the processes we invoke. By
specifying the dash, the user tells us that it is OK if an fd might be missing
when passed to the process. But just doing that by default sounds really ill
advised.

Does that make sense?

Renaming the bug accordingly.</pre>
        </div>
      </p>
      <hr>
      <span>You are receiving this mail because:</span>
      
      <ul>
          <li>You are the QA Contact for the bug.</li>
          <li>You are the assignee for the bug.</li>
      </ul>
    </body>
</html>