Unix sockets initial support
Currently it can only work with stream sockets, which have no skbs in queues (listening or established -- both work OK).
The cpt part uses the sock_diag engine that was merged to Dave recently to collect sockets. Then it dumps sockets by checking the filesystem ID of a failed-to-open through /proc/pid/fd descriptors (sockets do not allow for such tricks with opens through proc) against SOCKFS_TYPE.
The rst part is more tricky. Listen sockets are just restored, this is simple. Connected sockets are restored like this:
- One end establishes a listening anon socket at the desired descriptor;
- The other end just creates a socket at the desired descriptor;
- All sockets, that are to be connect()-ed call connect. Unix sockets do not block connect() till the accept() time and thus we continue with...
- ... all listening sockets call accept() and ... dup2 the new fd into the accepting end.
There's a problem with this approach -- socket names are not preserved, but looking into our OpenVZ implementation I think this is OK for existing apps.
What should be done next
- Need to merge the file IDs patches in our tree and make Andrey to support files sharing. This will solve the
sk = socket(); fork();
case. Currently it simply doesn't work :(
- Need to add support for DGRAM sockets -- I wrote comment how to do it in the can_dump_unix_sk()
- Need to add support for in-flight connections
- Implement support for UDP sockets (quite simple)
- Implement support for listening TCP sockets (also not very complex)
- Implement support for connected TCP scokets (hard one, Tejun's patches are not very good for this from my POV)