Import host sockets.

The FileDescription implementation for hostfs sockets uses the standard Unix
socket implementation (unix.SocketVFS2), but is also tied to a hostfs dentry.

Updates #1672, #1476

PiperOrigin-RevId: 308716426
This commit is contained in:
Dean Deng
2020-04-27 16:02:18 -07:00
committed by gVisor bot
parent 8f42cbfd08
commit 1c2ecbb1a0
11 changed files with 707 additions and 64 deletions
+4 -16
View File
@@ -73,26 +73,14 @@ func (i *inode) Open(ctx context.Context, rp *vfs.ResolvingPath, vfsd *vfs.Dentr
return nil, syserror.ENXIO
}
// InitSocket initializes a socket FileDescription, with a corresponding
// Dentry in mnt.
//
// fd should be the FileDescription associated with socketImpl, i.e. its first
// field. mnt should be the global socket mount, Kernel.socketMount.
func InitSocket(socketImpl vfs.FileDescriptionImpl, fd *vfs.FileDescription, mnt *vfs.Mount, creds *auth.Credentials) error {
fsimpl := mnt.Filesystem().Impl()
fs := fsimpl.(*kernfs.Filesystem)
// NewDentry constructs and returns a sockfs dentry.
func NewDentry(creds *auth.Credentials, ino uint64) *vfs.Dentry {
// File mode matches net/socket.c:sock_alloc.
filemode := linux.FileMode(linux.S_IFSOCK | 0600)
i := &inode{}
i.Init(creds, fs.NextIno(), filemode)
i.Init(creds, ino, filemode)
d := &kernfs.Dentry{}
d.Init(i)
opts := &vfs.FileDescriptionOptions{UseDentryMetadata: true}
if err := fd.Init(socketImpl, linux.O_RDWR, mnt, d.VFSDentry(), opts); err != nil {
return err
}
return nil
return d.VFSDentry()
}