Line 92:
Line 92:
Unix sockets can be bound to a file. The problem is that an address and a file are not connected between each other in term of unix sockets. For example, if you move a socket file, ss shows the origin address and you can’t find a file where the socket is bound. Another example is that an address may contain a relative path (../socket_name).
Unix sockets can be bound to a file. The problem is that an address and a file are not connected between each other in term of unix sockets. For example, if you move a socket file, ss shows the origin address and you can’t find a file where the socket is bound. Another example is that an address may contain a relative path (../socket_name).
−
Currently socket_diag shows a device and an inode number for a socket file, but it says nothing about a path to this file and about its mount point. We can introduce a new ioctl, which will return a file descriptor to a socket file.
+
Currently socket_diag shows a device and an inode number for a socket file, but it says nothing about a path to this file and about its mount point. We introduced the SIOCUNIXFILE ioctl, which returns a file descriptor to a socket file.
In this case to restore a unix socket we have to:
In this case to restore a unix socket we have to:
−
create a temporary directory and mount tmpfs into it before restoring sockets
+
* create a temporary directory and mount tmpfs into it before restoring sockets
−
Restore sockets
+
* Restore sockets
−
create a socket address directory where is the last part is a symlink to a proper directory on a required mount point
+
* create a socket address directory where is the last part is a symlink to a proper directory on a required mount point
−
call chroot() to the temporary directory
+
* call chroot() to the temporary directory
−
bind the socket to a specified address
+
* bind the socket to a specified address
if we restored a server socket, we can get a file descriptor for its file and use it to restore client sockets by calling connect() for /proc/self/fd/[SK_FILE_FD]
if we restored a server socket, we can get a file descriptor for its file and use it to restore client sockets by calling connect() for /proc/self/fd/[SK_FILE_FD]
umount tmpfs from the temporary directory and remove the directory after restoring all sockets
umount tmpfs from the temporary directory and remove the directory after restoring all sockets