@@ -65,7 +65,7 @@ func open() (pty, tty *os.File, err error) {
65
65
}
66
66
67
67
func ptsname (f * os.File ) (string , error ) {
68
- dev , err := ptsdev (f . Fd () )
68
+ dev , err := ptsdev (f )
69
69
if err != nil {
70
70
return "" , err
71
71
}
@@ -84,27 +84,46 @@ func unlockpt(f *os.File) error {
84
84
icLen : 0 ,
85
85
icDP : nil ,
86
86
}
87
- return ioctl (f . Fd () , I_STR , uintptr (unsafe .Pointer (& istr )))
87
+ return ioctl (f , I_STR , uintptr (unsafe .Pointer (& istr )))
88
88
}
89
89
90
90
func minor (x uint64 ) uint64 { return x & 0377 }
91
91
92
- func ptsdev (fd uintptr ) (uint64 , error ) {
92
+ func ptsdev (f * os. File ) (uint64 , error ) {
93
93
istr := strioctl {
94
94
icCmd : ISPTM ,
95
95
icTimeout : 0 ,
96
96
icLen : 0 ,
97
97
icDP : nil ,
98
98
}
99
99
100
- if err := ioctl (fd , I_STR , uintptr (unsafe .Pointer (& istr ))); err != nil {
100
+ if err := ioctl (f , I_STR , uintptr (unsafe .Pointer (& istr ))); err != nil {
101
101
return 0 , err
102
102
}
103
- var status syscall.Stat_t
104
- if err := syscall .Fstat (int (fd ), & status ); err != nil {
103
+ var errors = make (chan error , 1 )
104
+ var results = make (chan uint64 , 1 )
105
+ defer close (errors )
106
+ defer close (results )
107
+
108
+ var err error
109
+ var sc syscall.RawConn
110
+ sc , err = f .SyscallConn ()
111
+ if err != nil {
112
+ return 0 , err
113
+ }
114
+ err = sc .Control (func (fd uintptr ) {
115
+ var status syscall.Stat_t
116
+ if err := syscall .Fstat (int (fd ), & status ); err != nil {
117
+ results <- 0
118
+ errors <- err
119
+ }
120
+ results <- uint64 (minor (status .Rdev ))
121
+ errors <- nil
122
+ })
123
+ if err != nil {
105
124
return 0 , err
106
125
}
107
- return uint64 ( minor ( status . Rdev )), nil
126
+ return <- results , <- errors
108
127
}
109
128
110
129
type ptOwn struct {
@@ -113,7 +132,7 @@ type ptOwn struct {
113
132
}
114
133
115
134
func grantpt (f * os.File ) error {
116
- if _ , err := ptsdev (f . Fd () ); err != nil {
135
+ if _ , err := ptsdev (f ); err != nil {
117
136
return err
118
137
}
119
138
pto := ptOwn {
@@ -127,7 +146,7 @@ func grantpt(f *os.File) error {
127
146
icLen : int32 (unsafe .Sizeof (strioctl {})),
128
147
icDP : unsafe .Pointer (& pto ),
129
148
}
130
- if err := ioctl (f . Fd () , I_STR , uintptr (unsafe .Pointer (& istr ))); err != nil {
149
+ if err := ioctl (f , I_STR , uintptr (unsafe .Pointer (& istr ))); err != nil {
131
150
return errors .New ("access denied" )
132
151
}
133
152
return nil
@@ -145,8 +164,8 @@ func streamsPush(f *os.File, mod string) error {
145
164
// but since we are not using libc or XPG4.2, we should not be
146
165
// double-pushing modules
147
166
148
- if err := ioctl (f . Fd () , I_FIND , uintptr (unsafe .Pointer (& buf [0 ]))); err != nil {
167
+ if err := ioctl (f , I_FIND , uintptr (unsafe .Pointer (& buf [0 ]))); err != nil {
149
168
return nil
150
169
}
151
- return ioctl (f . Fd () , I_PUSH , uintptr (unsafe .Pointer (& buf [0 ])))
170
+ return ioctl (f , I_PUSH , uintptr (unsafe .Pointer (& buf [0 ])))
152
171
}
0 commit comments