Skip to content

Commit 1ad6d96

Browse files
committed
fix(py): audit funcs; ...
... fix(Lib/os): system,remove was func; fix(py): builtins.id now uses ptr value for pointer type
1 parent bad24cc commit 1ad6d96

26 files changed

+145
-38
lines changed

src/pylib/Lib/array.nim

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ import ../version
1111
import ../builtins/list
1212
import ../mutSeqSliceOp
1313
import ./collections/abc
14+
import ./sys_impl/auditImpl/macrohelper
1415

1516
template since_has_Py_UCS4(def) =
1617
pysince(3, 13): def
@@ -395,10 +396,12 @@ macro array*(typecode: static[char], initializer: typed): PyArray =
395396
let
396397
typ = initializer.getTypeInst
397398
# not use getType, which returns concrete impl
399+
result = newStmtWithAudit(
400+
"array.__new__", # sys.audit("array.__new__", typecode, initializer)
401+
typecode.newLit, initializer)
398402
if typ.typeKind == ntyArray:
399-
result = baseInitCall.add initializer.parseArrInitLit(typeStr)
403+
result.add baseInitCall.add initializer.parseArrInitLit(typeStr)
400404
return
401-
result = newStmtList()
402405
let res = genSym(nskVar, "arrayNewRes")
403406
result.add newVarStmt(
404407
res,

src/pylib/Lib/io.nim

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,7 @@ export DefErrors, LookupError
4545
import ../pystring/[strimpl, strbltins]
4646
import ../pybytes/[bytesimpl, bytesbltins]
4747
import ./warnings
48+
import ./sys_impl/auditImpl as sys
4849

4950
const
5051
SEEK_SET* = 0
@@ -675,6 +676,7 @@ template openImpl(result: untyped;
675676
encoding = encoding1, errors=errors1, newline=newline1, resMode=nmode)
676677
677678
var nfile: File
679+
sys.audit("open", file, smode) ## XXX: PY-DIFF: 3rd arg shall be flags
678680
when file is int:
679681
let succ = openNoNonInhertFlag(nfile, FileHandle file, mode=nmode)
680682
else:

src/pylib/Lib/n_tempfile.nim

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -40,15 +40,18 @@ iterator items(self: var RandomNameSequence, times: int): string =
4040

4141
const templ* = "tmp" # Py's `tempfile.template`
4242

43-
proc mktemp*(suffix="", prefix=templ, dir = "", checker=fileExists): string =
44-
## User-callable function to return a unique temporary file/dir name. The
45-
## file/dir is not created.
43+
proc mktempWithChecker(suffix="", prefix=templ, dir = "", checker: proc (s: string): bool=fileExists): string =
4644
for name in name_sequence.items(times=TMP_MAX):
4745
let file = dir / prefix & name & suffix
4846
if not checker file:
4947
return file
5048
raise newException(FileNotFoundError, "No usable temporary filename found")
5149

50+
proc mktemp*(suffix="", prefix=templ, dir = ""): string =
51+
## User-callable function to return a unique temporary file/dir name. The
52+
## file/dir is not created.
53+
mktempWithChecker(suffix, prefix, dir, fileExists)
54+
5255

5356
proc candidate_tempdir_list(): seq[string] =
5457
##[Generate a list of candidate temporary directories which
@@ -259,9 +262,14 @@ type TemporaryDirectoryWrapper* = object
259262
name*: string
260263
ignore_cleanup_errors, delete: bool
261264

265+
proc auditThenDirExists(s: string): bool =
266+
sys.audit("tempfile.mkdtemp", s)
267+
dirExists(s)
268+
262269
proc mkdtemp*(suffix=sNone, prefix=sNone, dir=sNone): string =
263270
let tup = sanitize_params(prefix=prefix, suffix=suffix, dir=dir)
264-
mktemp(dir=tup.dir, suffix=tup.suffix, prefix=tup.prefix, checker=dirExists)
271+
mktempWithChecker(dir=tup.dir, suffix=tup.suffix, prefix=tup.prefix,
272+
checker=auditThenDirExists)
265273

266274
proc TemporaryDirectory*(suffix=sNone, prefix=sNone, dir=sNone, ignore_cleanup_errors=False,
267275
delete=True): TemporaryDirectoryWrapper =

src/pylib/Lib/os_impl/common.nim

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11

22
import ./private/defined_macros
3+
import ../sys_impl/auditImpl as sys
34
export InJs
45
import ../../pyerrors/[oserr, simperr, rterr]
56
when defined(js):
@@ -14,7 +15,7 @@ import ../../pystring/[strimpl, strbltins]
1415
import ../../pybytes/[bytesimpl, bytesbltins]
1516
import ../../version
1617
export version
17-
18+
export sys
1819
export io_abc, oserr, simperr, rterr, strimpl, strbltins.repr, bytesimpl, bytesbltins.repr
1920
export noneType
2021

src/pylib/Lib/os_impl/listdirx.nim

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import ./common
44
import ./listcommon
55

66
proc listdir*[T](p: PathLike[T] = "."): PyList[T] =
7+
sys.audit("os.listdir", p)
78
result = newPyList[T]()
89
p.tryOsOp:
910
for i in walkDir($p, relative=true, checkDir=true):

src/pylib/Lib/os_impl/posix_like/chmods.nim

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,7 @@ proc chmod*(
8383
when not (HAVE_FCHMODAT or HAVE_FCHMOD or useMS_WINDOWSproc):
8484
if follow_symlinks_specified(follow_symlinks):
8585
return
86+
sys.audit("os.chmod", path, mode, dir_fd)
8687
when useMS_WINDOWSproc:
8788
var res = false
8889
if path is int:
@@ -184,6 +185,7 @@ proc chmod*(
184185

185186
when HAVE_FCHMOD or useMS_WINDOWSproc:
186187
proc fchmod*(fd: int, mode: int) =
188+
sys.audit("os.chmod", fd, mode, -1)
187189
when useMS_WINDOWSproc:
188190
if not win32_fchmod(fd, mode):
189191
raiseErrno()
@@ -194,6 +196,7 @@ when HAVE_FCHMOD or useMS_WINDOWSproc:
194196

195197
when HAVE_LCHMOD or useMS_WINDOWSproc:
196198
proc lchmod*(path: string, mode: int) =
199+
sys.audit("os.chmod", path, mode, -1)
197200
when useMS_WINDOWSproc:
198201
if not win32_lchmod(newWideCString(path), mode):
199202
raiseErrnoWithPath path

src/pylib/Lib/os_impl/posix_like/links.nim

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -11,15 +11,15 @@ when InJs:
1111
res = readlinkSync(cstring p)
1212
$res
1313
proc symlinkSync(target, path, `type`: cstring){.importNode(fs, symlinkSync).}
14-
proc symlink*[T](src, dst: PathLike[T], target_is_directory = false) =
14+
proc symlinkImpl[T](src, dst: PathLike[T], target_is_directory = false) =
1515
catchJsErrAndRaise:
1616
symlinkSync(
1717
cstring $dst, cstring $dst,
1818
if target_is_directory: "dir" else: "file"
1919
)
2020
2121
proc linkSync(target, path, `type`: cstring){.importNode(fs, linkSync).}
22-
proc link*[T](src, dst: PathLike[T]) =
22+
proc linkImpl[T](src, dst: PathLike[T]) =
2323
catchJsErrAndRaise:
2424
linkSync(
2525
cstring $dst, cstring $dst,
@@ -305,12 +305,20 @@ else:
305305
if c_symlinkat(src.cstring, dir_fd.cint, dst.cstring) != 0:
306306
raiseExcWithPath2(src, dst)
307307
308-
proc symlink*[T](src, dst: PathLike[T], target_is_directory = false) =
308+
proc symlinkImpl[T](src, dst: PathLike[T], target_is_directory = false) =
309309
# std/os createSymlink on Windows will raise OSError if
310310
# SYMBOLIC_LINK_FLAG_ALLOW_UNPRIVILEGED_CREATE is not supported yet
311311
if os_symlink_impl($src, $dst, target_is_directory):
312312
raiseExcWithPath2(src, dst)
313313
314-
proc link*[T](src, dst: PathLike[T]) =
314+
proc linkImpl[T](src, dst: PathLike[T]) =
315315
tryOsOp(src, dst):
316316
createHardlink($src, $dst)
317+
318+
proc symlink*[T](src, dst: PathLike[T], target_is_directory = false) =
319+
sys.audit("os.symlink", src, dst, -1)
320+
symlinkImpl(src, dst, target_is_directory)
321+
322+
proc link*[T](src, dst: PathLike[T]) =
323+
sys.audit("os.link", src, dst, -1, -1)
324+
linkImpl(src, dst)

src/pylib/Lib/os_impl/posix_like/mkrmdir.nim

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,12 @@ import ./mkrmdirImpl
66
proc mkdir*(p: PathLike, mode=0o777, dir_fd: int){.error: "not implement".}
77
proc rmdir*(p: PathLike, dir_fd: int){.error: "not implement".}
88

9-
proc rmdir*(path: PathLike) = rawRemoveDir(path)
10-
proc mkdir*(p: PathLike, mode=0o777) = rawCreateDir(p, mode)
9+
proc rmdir*(path: PathLike) =
10+
sys.audit("os.rmdir", path, -1)
11+
rawRemoveDir(path)
12+
proc mkdir*(p: PathLike, mode=0o777) =
13+
sys.audit("os.mkdir", p, mode, -1)
14+
rawCreateDir(p, mode)
1115

1216
#[ A version of `mkdir` that does not support `mode`
1317
proc mkdir*(p: PathLike, mode: int){.error: "not implement".}

src/pylib/Lib/os_impl/posix_like/open_close.nim

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,7 @@ else:
5757

5858
proc open*(path: PathLike, flags: int, mode=0o777, dir_fd = -1): int =
5959
## `dir_fd` is ignored under Windows
60+
sys.audit("open", path, mode, flags)
6061
when defined(js):
6162
var msg: string
6263
let

src/pylib/Lib/os_impl/posix_like/rename.nim

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ else:
1616
result = c_rename(cstring $src, cstring $dst) == 0.cint
1717
1818
proc rename*[T](src, dst: PathLike[T]) =
19+
sys.audit("os.rename", src, dst, -1, -1)
1920
if not internal_rename(src, dst, false):
2021
raiseExcWithPath2(src, dst)
2122

src/pylib/Lib/os_impl/posix_like/scandirImpl.nim

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -135,6 +135,7 @@ when defined(js):
135135
proc readSync(self: Dir): Dirent{.importcpp.}
136136
137137
template scandirImpl(path){.dirty.} =
138+
sys.audit("os.scandir", path)
138139
let spath = $path
139140
when defined(js):
140141
var dir: Dir

src/pylib/Lib/os_impl/posix_like/truncate.nim

Lines changed: 16 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -3,12 +3,12 @@ import ../common
33

44
when defined(js):
55
proc ftruncateSync(file: cint; len: cint){.importNode(fs, ftruncateSync).}
6-
proc ftruncate*(file: Positive; length: int64) =
6+
proc ftruncateImpl(file: Positive; length: Natural) =
77
catchJsErrAndRaise ftruncateSync(file.cint, length.cint)
88
proc truncateSync(file: cstring; len: cint){.importNode(fs, truncateSync).}
9-
proc truncate*(file: CanIOOpenT; length: int64) =
9+
proc truncateImpl(file: CanIOOpenT; length: Natural) =
1010
when file is int:
11-
ftruncate file, length
11+
ftruncateImpl file, length
1212
else:
1313
catchJsErrAndRaise truncateSync(file.cstring, length.cint)
1414

@@ -21,24 +21,32 @@ else:
2121
else:
2222
import std/posix
2323

24-
template ftruncateImpl(file: Positive, length: int64): cint =
24+
template ftruncateImplAux(file: Positive, length: int64): cint =
2525
when defined(windows):
2626
chsize_s(file.cint, length)
2727
else:
2828
posix.ftruncate(file.cint, length.Off)
2929

30-
proc ftruncate*(file: Positive, length: int64) =
31-
let err = ftruncateImpl(file, length)
30+
proc ftruncateImpl(file: Positive, length: int64) =
31+
let err = ftruncateImplAux(file, length)
3232
if err.int != 0:
3333
raiseErrno err
3434

35-
proc truncate*(file: CanIOOpenT, length: Natural) =
35+
proc truncateImpl(file: CanIOOpenT, length: Natural) =
3636
when file is int:
37-
ftruncate file, length
37+
ftruncateImpl file, length
3838
else:
3939
let fd = open(file, os.O_WDONLY)
4040
let err = ftruncateImpl(fd, length)
4141
if 0 != err:
4242
file.raiseErrnoWithPath err
4343
close(fd)
4444

45+
proc ftruncate*(file: Positive, length: Natural) =
46+
sys.audit("os.truncate", file, length)
47+
ftruncateImpl(file, length)
48+
49+
proc truncate*(file: CanIOOpenT, length: Natural) =
50+
sys.audit("os.truncate", file, length)
51+
truncateImpl(file, length)
52+

src/pylib/Lib/os_impl/posix_like/unlink.nim

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,10 @@
22
import ./unlinkImpl
33

44

5-
proc unlink*[T](p: PathLike[T]) = unlinkImpl p
5+
proc unlink*[T](p: PathLike[T]) =
6+
sys.audit("os.remove", p, -1)
7+
unlinkImpl p
68
7-
func remove*[T](p: PathLike[T]) =
9+
proc remove*[T](p: PathLike[T]) =
810
## This function is semantically identical to `unlink`_
9-
unlinkImpl(p)
11+
unlink(p)

src/pylib/Lib/os_impl/posix_like/utime.nim

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -109,8 +109,10 @@ else:
109109
raiseExcWithPath path
110110

111111
proc utime*[T; F: SomeFloat](path: PathLike[T], times: TimePair[F], follow_symlinks=true) =
112+
sys.audit("os.utime", path, times, None, -1)
112113
utimeImpl stoTime, path, times, follow_symlinks
113114
proc utime*[T](path: PathLike[T], ns: TimeNsPair, follow_symlinks=true) =
115+
sys.audit("os.utime", path, None, ns, -1)
114116
utimeImpl nstoTime, path, ns, follow_symlinks
115117
116118
template timeToNs(t: times.Time): NsUnit = nowTime.toUnix.NsUnit * `ns/s` + nowTime.nanosecond.NsUnit
@@ -120,4 +122,5 @@ proc utime*[T](path: PathLike[T], follow_symlinks=true) =
120122
nowTime = times.getTime()
121123
ns = timeToNs nowTime
122124
times_tup = (ns, ns)
125+
sys.audit("os.utime", path, None, times_tup, -1)
123126
utimeImpl nstoTime, path, times_tup, follow_symlinks

src/pylib/Lib/os_impl/subp.nim

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11

2-
2+
import ./common
33
when not defined(js):
44
proc c_system(cmd: cstring): cint{.importc: "system", header: "<stdlib.h>".}
55

6-
func system*(cmd: string): int{.discardable.} =
6+
proc system*(cmd: string): int{.discardable.} =
77
## os.system
88
runnableExamples:
99
const
@@ -12,6 +12,7 @@ func system*(cmd: string): int{.discardable.} =
1212
e2null = "echo 1 >" & mydevnull
1313
assert system(e2null) == 0
1414

15+
sys.audit("os.system", cmd)
1516
when defined(js):
1617
let jsStr = cmd.cstring
1718
var res: c_int

src/pylib/Lib/os_impl/utils.nim

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,12 +12,16 @@ when InJs:
1212
proc getcwd*(): PyStr = str cwd()
1313
proc getcwdb*(): PyBytes = bytes cwd()
1414
proc chdir(d: cstring){.importDenoOrProcess(chdir).}
15-
proc chdir*(s: PathLike) = chdir cstring $s
15+
proc chdirImpl(s: PathLike) = chdir cstring $s
1616

1717
else:
1818
proc getcwd*(): PyStr = str getCurrentDir()
1919
proc getcwdb*(): PyBytes = bytes getCurrentDir()
20-
proc chdir*(s: PathLike) = setCurrentDir $s
20+
proc chdirImpl(s: PathLike) = setCurrentDir $s
21+
22+
proc chdir*(s: PathLike) =
23+
sys.audit("os.chdir", s)
24+
chdirImpl(s)
2125

2226
proc makedirs*[T](d: PathLike[T], mode=0o777, exists_ok=false) =
2327
let dir = $d

src/pylib/Lib/os_impl/walkImpl.nim

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,7 @@ type ScanDir[T] = iterator (path: T): DirEntry[T]{.closure.}
6464
# translated from CPython-3.13-alpha/Lib/os.py L284
6565
iterator walk*[T](top: PathLike[T], topdown=True,
6666
onerror=shallIgnore, followlinks=False): WalkRes[T] =
67+
sys.audit("os.walk", top, topdown, onerror, followlinks)
6768
var stack = newUnionList[T, WalkRes[T]]()
6869
stack.append(fspath(top))
6970

src/pylib/Lib/resource_impl/funcs.nim

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
import ./types
33
import std/posix except EINVAL, EPERM
44
import ../n_errno
5+
import ../sys_impl/auditImpl as sys
56
import ../../pyerrors/oserr
67
from ./csyms import HAVE_PRLIMIT, HAVE_GETPAGESIZE, HAVE_SYSCONF_PAGE_SIZE
78

@@ -63,8 +64,9 @@ proc setrlimitWrap(resource: int, rl: var RLimit) =
6364
template setrlimit*[T: py_rlimit_abc|py_rlimit](resource: int, limits: T) =
6465
## this is defined as `template`.
6566
## Because if being `proc`, py_rlimit_abc match cannot work
66-
bind py2rlimit, setrlimitWrap
67+
bind py2rlimit, setrlimitWrap, audit
6768
mixin len, `[]`
69+
sys.audit("resource.setrlimit", resource, limits)
6870
var rl: RLimit
6971
py2rlimit(limits, rl)
7072
setrlimitWrap(resource, rl)
@@ -100,6 +102,7 @@ when HAVE_PRLIMIT:
100102
let
101103
tpid = Pid pid
102104
tresource = checked_resource(resource)
105+
sys.audit("resource.prlimit", pid, resource, limits)
103106
var new_limit: RLimit
104107
py2rlimit(limits, new_limit)
105108
prlimitWrap(tpid, tresource, new_limit)

src/pylib/Lib/shutil.nim

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ proc get_terminal_size*(fallback=(80, 24)): terminal_size =
2020
import std/os
2121
when defined(posix):
2222
import std/posix
23+
import ./sys_impl/auditImpl as sys
2324
import ../pyerrors/oserr
2425
import ../io_abc
2526

@@ -86,6 +87,7 @@ template copyFileImpl(src, dst: string; options: CopyFlag) =
8687

8788
template copyGen(pyname, impl) =
8889
proc pyname*[T](src, dst: PathLike[T], follow_symlinks=true) =
90+
sys.audit("shutil.copyfile", src, dst)
8991
let
9092
ssrc = $src
9193
sdst = $dst

src/pylib/Lib/signal_impl/unixs.nim

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import ./[
1010
sigset_to_set,
1111
siginfo_decl
1212
]
13+
import ../sys_impl/auditImpl as sys
1314
export Sigset
1415
export siginfo_decl except fill_siginfo
1516
import ../../Python/pytime/[deadline, pytimeFromSeconds, pytimeAsTimeval]
@@ -18,6 +19,7 @@ proc alarm*(seconds: int): int = int alarm seconds.cint
1819
proc pause*(): int = int posix.pause()
1920

2021
proc pthread_kill*(thread_id: uint, signalnum: int) =
22+
sys.audit("signal.pthread_kill", thread_id, signalnum)
2123
let err = pthread_kill(Pthread thread_id, cint signalnum)
2224
if err != 0:
2325
raiseErrno()

0 commit comments

Comments
 (0)