Merge pull request #863 from tanjianfeng:fix-862
PiperOrigin-RevId: 271168948
This commit is contained in:
commit
99c86b8dbd
|
@ -43,12 +43,15 @@ type TTYFileOperations struct {
|
||||||
// fgProcessGroup is the foreground process group that is currently
|
// fgProcessGroup is the foreground process group that is currently
|
||||||
// connected to this TTY.
|
// connected to this TTY.
|
||||||
fgProcessGroup *kernel.ProcessGroup
|
fgProcessGroup *kernel.ProcessGroup
|
||||||
|
|
||||||
|
termios linux.KernelTermios
|
||||||
}
|
}
|
||||||
|
|
||||||
// newTTYFile returns a new fs.File that wraps a TTY FD.
|
// newTTYFile returns a new fs.File that wraps a TTY FD.
|
||||||
func newTTYFile(ctx context.Context, dirent *fs.Dirent, flags fs.FileFlags, iops *inodeOperations) *fs.File {
|
func newTTYFile(ctx context.Context, dirent *fs.Dirent, flags fs.FileFlags, iops *inodeOperations) *fs.File {
|
||||||
return fs.NewFile(ctx, dirent, flags, &TTYFileOperations{
|
return fs.NewFile(ctx, dirent, flags, &TTYFileOperations{
|
||||||
fileOperations: fileOperations{iops: iops},
|
fileOperations: fileOperations{iops: iops},
|
||||||
|
termios: linux.DefaultSlaveTermios,
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -97,9 +100,12 @@ func (t *TTYFileOperations) Write(ctx context.Context, file *fs.File, src userme
|
||||||
t.mu.Lock()
|
t.mu.Lock()
|
||||||
defer t.mu.Unlock()
|
defer t.mu.Unlock()
|
||||||
|
|
||||||
// Are we allowed to do the write?
|
// Check whether TOSTOP is enabled. This corresponds to the check in
|
||||||
if err := t.checkChange(ctx, linux.SIGTTOU); err != nil {
|
// drivers/tty/n_tty.c:n_tty_write().
|
||||||
return 0, err
|
if t.termios.LEnabled(linux.TOSTOP) {
|
||||||
|
if err := t.checkChange(ctx, linux.SIGTTOU); err != nil {
|
||||||
|
return 0, err
|
||||||
|
}
|
||||||
}
|
}
|
||||||
return t.fileOperations.Write(ctx, file, src, offset)
|
return t.fileOperations.Write(ctx, file, src, offset)
|
||||||
}
|
}
|
||||||
|
@ -144,6 +150,9 @@ func (t *TTYFileOperations) Ioctl(ctx context.Context, _ *fs.File, io usermem.IO
|
||||||
return 0, err
|
return 0, err
|
||||||
}
|
}
|
||||||
err := ioctlSetTermios(fd, ioctl, &termios)
|
err := ioctlSetTermios(fd, ioctl, &termios)
|
||||||
|
if err == nil {
|
||||||
|
t.termios.FromTermios(termios)
|
||||||
|
}
|
||||||
return 0, err
|
return 0, err
|
||||||
|
|
||||||
case linux.TIOCGPGRP:
|
case linux.TIOCGPGRP:
|
||||||
|
|
Loading…
Reference in New Issue