Tizen_4.0 base
[platform/upstream/docker-engine.git] / vendor / github.com / kr / pty / pty_linux.go
1 package pty
2
3 import (
4         "os"
5         "strconv"
6         "syscall"
7         "unsafe"
8 )
9
10 func open() (pty, tty *os.File, err error) {
11         p, err := os.OpenFile("/dev/ptmx", os.O_RDWR, 0)
12         if err != nil {
13                 return nil, nil, err
14         }
15
16         sname, err := ptsname(p)
17         if err != nil {
18                 return nil, nil, err
19         }
20
21         err = unlockpt(p)
22         if err != nil {
23                 return nil, nil, err
24         }
25
26         t, err := os.OpenFile(sname, os.O_RDWR|syscall.O_NOCTTY, 0)
27         if err != nil {
28                 return nil, nil, err
29         }
30         return p, t, nil
31 }
32
33 func ptsname(f *os.File) (string, error) {
34         var n _C_uint
35         err := ioctl(f.Fd(), syscall.TIOCGPTN, uintptr(unsafe.Pointer(&n)))
36         if err != nil {
37                 return "", err
38         }
39         return "/dev/pts/" + strconv.Itoa(int(n)), nil
40 }
41
42 func unlockpt(f *os.File) error {
43         var u _C_int
44         // use TIOCSPTLCK with a zero valued arg to clear the slave pty lock
45         return ioctl(f.Fd(), syscall.TIOCSPTLCK, uintptr(unsafe.Pointer(&u)))
46 }