Skip to content

Commit a271332

Browse files
committed
stdlib/os: add close
Signed-off-by: Sebastien Binet <[email protected]>
1 parent 3e1daa8 commit a271332

File tree

2 files changed

+36
-0
lines changed

2 files changed

+36
-0
lines changed

stdlib/os/os.go

+30
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,7 @@ func init() {
4646

4747
methods := []*py.Method{
4848
py.MustNewMethod("_exit", _exit, 0, "Immediate program termination."),
49+
py.MustNewMethod("close", closefd, 0, closefd_doc),
4950
py.MustNewMethod("fdopen", fdopen, 0, fdopen_doc),
5051
py.MustNewMethod("getcwd", getCwd, 0, "Get the current working directory"),
5152
py.MustNewMethod("getcwdb", getCwdb, 0, "Get the current working directory in a byte slice"),
@@ -98,6 +99,35 @@ func getEnvVariables() py.StringDict {
9899
return dict
99100
}
100101

102+
const closefd_doc = `Close a file descriptor`
103+
104+
func closefd(self py.Object, args py.Tuple, kwargs py.StringDict) (py.Object, error) {
105+
var (
106+
pyfd py.Object
107+
)
108+
err := py.ParseTupleAndKeywords(args, kwargs, "i", []string{"fd"}, &pyfd)
109+
if err != nil {
110+
return nil, err
111+
}
112+
113+
var (
114+
fd = uintptr(pyfd.(py.Int))
115+
name = strconv.Itoa(int(fd))
116+
)
117+
118+
f := os.NewFile(fd, name)
119+
if f == nil {
120+
return nil, py.ExceptionNewf(py.OSError, "Bad file descriptor")
121+
}
122+
123+
err = f.Close()
124+
if err != nil {
125+
return nil, err
126+
}
127+
128+
return py.None, nil
129+
}
130+
101131
const fdopen_doc = `# Supply os.fdopen()`
102132

103133
func fdopen(self py.Object, args py.Tuple, kwargs py.StringDict) (py.Object, error) {

stdlib/os/testdata/test.py

+6
Original file line numberDiff line numberDiff line change
@@ -118,6 +118,12 @@
118118
else:
119119
print("os."+k+": [OK]")
120120

121+
## close
122+
import tempfile
123+
fd, tmp = tempfile.mkstemp()
124+
os.close(fd=fd)
125+
os.remove(tmp)
126+
121127
## fdopen
122128
import tempfile
123129
fd, tmp = tempfile.mkstemp()

0 commit comments

Comments
 (0)