1 /*[clinic input]
2 preserve
3 [clinic start generated code]*/
4
5 PyDoc_STRVAR(os_stat__doc__,
6 "stat($module, /, path, *, dir_fd=None, follow_symlinks=True)\n"
7 "--\n"
8 "\n"
9 "Perform a stat system call on the given path.\n"
10 "\n"
11 " path\n"
12 " Path to be examined; can be string, bytes, a path-like object or\n"
13 " open-file-descriptor int.\n"
14 " dir_fd\n"
15 " If not None, it should be a file descriptor open to a directory,\n"
16 " and path should be a relative string; path will then be relative to\n"
17 " that directory.\n"
18 " follow_symlinks\n"
19 " If False, and the last element of the path is a symbolic link,\n"
20 " stat will examine the symbolic link itself instead of the file\n"
21 " the link points to.\n"
22 "\n"
23 "dir_fd and follow_symlinks may not be implemented\n"
24 " on your platform. If they are unavailable, using them will raise a\n"
25 " NotImplementedError.\n"
26 "\n"
27 "It\'s an error to use dir_fd or follow_symlinks when specifying path as\n"
28 " an open file descriptor.");
29
30 #define OS_STAT_METHODDEF \
31 {"stat", _PyCFunction_CAST(os_stat), METH_FASTCALL|METH_KEYWORDS, os_stat__doc__},
32
33 static PyObject *
34 os_stat_impl(PyObject *module, path_t *path, int dir_fd, int follow_symlinks);
35
36 static PyObject *
os_stat(PyObject * module,PyObject * const * args,Py_ssize_t nargs,PyObject * kwnames)37 os_stat(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames)
38 {
39 PyObject *return_value = NULL;
40 static const char * const _keywords[] = {"path", "dir_fd", "follow_symlinks", NULL};
41 static _PyArg_Parser _parser = {NULL, _keywords, "stat", 0};
42 PyObject *argsbuf[3];
43 Py_ssize_t noptargs = nargs + (kwnames ? PyTuple_GET_SIZE(kwnames) : 0) - 1;
44 path_t path = PATH_T_INITIALIZE("stat", "path", 0, 1);
45 int dir_fd = DEFAULT_DIR_FD;
46 int follow_symlinks = 1;
47
48 args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 1, 1, 0, argsbuf);
49 if (!args) {
50 goto exit;
51 }
52 if (!path_converter(args[0], &path)) {
53 goto exit;
54 }
55 if (!noptargs) {
56 goto skip_optional_kwonly;
57 }
58 if (args[1]) {
59 if (!FSTATAT_DIR_FD_CONVERTER(args[1], &dir_fd)) {
60 goto exit;
61 }
62 if (!--noptargs) {
63 goto skip_optional_kwonly;
64 }
65 }
66 follow_symlinks = PyObject_IsTrue(args[2]);
67 if (follow_symlinks < 0) {
68 goto exit;
69 }
70 skip_optional_kwonly:
71 return_value = os_stat_impl(module, &path, dir_fd, follow_symlinks);
72
73 exit:
74 /* Cleanup for path */
75 path_cleanup(&path);
76
77 return return_value;
78 }
79
80 PyDoc_STRVAR(os_lstat__doc__,
81 "lstat($module, /, path, *, dir_fd=None)\n"
82 "--\n"
83 "\n"
84 "Perform a stat system call on the given path, without following symbolic links.\n"
85 "\n"
86 "Like stat(), but do not follow symbolic links.\n"
87 "Equivalent to stat(path, follow_symlinks=False).");
88
89 #define OS_LSTAT_METHODDEF \
90 {"lstat", _PyCFunction_CAST(os_lstat), METH_FASTCALL|METH_KEYWORDS, os_lstat__doc__},
91
92 static PyObject *
93 os_lstat_impl(PyObject *module, path_t *path, int dir_fd);
94
95 static PyObject *
os_lstat(PyObject * module,PyObject * const * args,Py_ssize_t nargs,PyObject * kwnames)96 os_lstat(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames)
97 {
98 PyObject *return_value = NULL;
99 static const char * const _keywords[] = {"path", "dir_fd", NULL};
100 static _PyArg_Parser _parser = {NULL, _keywords, "lstat", 0};
101 PyObject *argsbuf[2];
102 Py_ssize_t noptargs = nargs + (kwnames ? PyTuple_GET_SIZE(kwnames) : 0) - 1;
103 path_t path = PATH_T_INITIALIZE("lstat", "path", 0, 0);
104 int dir_fd = DEFAULT_DIR_FD;
105
106 args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 1, 1, 0, argsbuf);
107 if (!args) {
108 goto exit;
109 }
110 if (!path_converter(args[0], &path)) {
111 goto exit;
112 }
113 if (!noptargs) {
114 goto skip_optional_kwonly;
115 }
116 if (!FSTATAT_DIR_FD_CONVERTER(args[1], &dir_fd)) {
117 goto exit;
118 }
119 skip_optional_kwonly:
120 return_value = os_lstat_impl(module, &path, dir_fd);
121
122 exit:
123 /* Cleanup for path */
124 path_cleanup(&path);
125
126 return return_value;
127 }
128
129 PyDoc_STRVAR(os_access__doc__,
130 "access($module, /, path, mode, *, dir_fd=None, effective_ids=False,\n"
131 " follow_symlinks=True)\n"
132 "--\n"
133 "\n"
134 "Use the real uid/gid to test for access to a path.\n"
135 "\n"
136 " path\n"
137 " Path to be tested; can be string, bytes, or a path-like object.\n"
138 " mode\n"
139 " Operating-system mode bitfield. Can be F_OK to test existence,\n"
140 " or the inclusive-OR of R_OK, W_OK, and X_OK.\n"
141 " dir_fd\n"
142 " If not None, it should be a file descriptor open to a directory,\n"
143 " and path should be relative; path will then be relative to that\n"
144 " directory.\n"
145 " effective_ids\n"
146 " If True, access will use the effective uid/gid instead of\n"
147 " the real uid/gid.\n"
148 " follow_symlinks\n"
149 " If False, and the last element of the path is a symbolic link,\n"
150 " access will examine the symbolic link itself instead of the file\n"
151 " the link points to.\n"
152 "\n"
153 "dir_fd, effective_ids, and follow_symlinks may not be implemented\n"
154 " on your platform. If they are unavailable, using them will raise a\n"
155 " NotImplementedError.\n"
156 "\n"
157 "Note that most operations will use the effective uid/gid, therefore this\n"
158 " routine can be used in a suid/sgid environment to test if the invoking user\n"
159 " has the specified access to the path.");
160
161 #define OS_ACCESS_METHODDEF \
162 {"access", _PyCFunction_CAST(os_access), METH_FASTCALL|METH_KEYWORDS, os_access__doc__},
163
164 static int
165 os_access_impl(PyObject *module, path_t *path, int mode, int dir_fd,
166 int effective_ids, int follow_symlinks);
167
168 static PyObject *
os_access(PyObject * module,PyObject * const * args,Py_ssize_t nargs,PyObject * kwnames)169 os_access(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames)
170 {
171 PyObject *return_value = NULL;
172 static const char * const _keywords[] = {"path", "mode", "dir_fd", "effective_ids", "follow_symlinks", NULL};
173 static _PyArg_Parser _parser = {NULL, _keywords, "access", 0};
174 PyObject *argsbuf[5];
175 Py_ssize_t noptargs = nargs + (kwnames ? PyTuple_GET_SIZE(kwnames) : 0) - 2;
176 path_t path = PATH_T_INITIALIZE("access", "path", 0, 0);
177 int mode;
178 int dir_fd = DEFAULT_DIR_FD;
179 int effective_ids = 0;
180 int follow_symlinks = 1;
181 int _return_value;
182
183 args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 2, 2, 0, argsbuf);
184 if (!args) {
185 goto exit;
186 }
187 if (!path_converter(args[0], &path)) {
188 goto exit;
189 }
190 mode = _PyLong_AsInt(args[1]);
191 if (mode == -1 && PyErr_Occurred()) {
192 goto exit;
193 }
194 if (!noptargs) {
195 goto skip_optional_kwonly;
196 }
197 if (args[2]) {
198 if (!FACCESSAT_DIR_FD_CONVERTER(args[2], &dir_fd)) {
199 goto exit;
200 }
201 if (!--noptargs) {
202 goto skip_optional_kwonly;
203 }
204 }
205 if (args[3]) {
206 effective_ids = PyObject_IsTrue(args[3]);
207 if (effective_ids < 0) {
208 goto exit;
209 }
210 if (!--noptargs) {
211 goto skip_optional_kwonly;
212 }
213 }
214 follow_symlinks = PyObject_IsTrue(args[4]);
215 if (follow_symlinks < 0) {
216 goto exit;
217 }
218 skip_optional_kwonly:
219 _return_value = os_access_impl(module, &path, mode, dir_fd, effective_ids, follow_symlinks);
220 if ((_return_value == -1) && PyErr_Occurred()) {
221 goto exit;
222 }
223 return_value = PyBool_FromLong((long)_return_value);
224
225 exit:
226 /* Cleanup for path */
227 path_cleanup(&path);
228
229 return return_value;
230 }
231
232 #if defined(HAVE_TTYNAME)
233
234 PyDoc_STRVAR(os_ttyname__doc__,
235 "ttyname($module, fd, /)\n"
236 "--\n"
237 "\n"
238 "Return the name of the terminal device connected to \'fd\'.\n"
239 "\n"
240 " fd\n"
241 " Integer file descriptor handle.");
242
243 #define OS_TTYNAME_METHODDEF \
244 {"ttyname", (PyCFunction)os_ttyname, METH_O, os_ttyname__doc__},
245
246 static PyObject *
247 os_ttyname_impl(PyObject *module, int fd);
248
249 static PyObject *
os_ttyname(PyObject * module,PyObject * arg)250 os_ttyname(PyObject *module, PyObject *arg)
251 {
252 PyObject *return_value = NULL;
253 int fd;
254
255 fd = _PyLong_AsInt(arg);
256 if (fd == -1 && PyErr_Occurred()) {
257 goto exit;
258 }
259 return_value = os_ttyname_impl(module, fd);
260
261 exit:
262 return return_value;
263 }
264
265 #endif /* defined(HAVE_TTYNAME) */
266
267 #if defined(HAVE_CTERMID)
268
269 PyDoc_STRVAR(os_ctermid__doc__,
270 "ctermid($module, /)\n"
271 "--\n"
272 "\n"
273 "Return the name of the controlling terminal for this process.");
274
275 #define OS_CTERMID_METHODDEF \
276 {"ctermid", (PyCFunction)os_ctermid, METH_NOARGS, os_ctermid__doc__},
277
278 static PyObject *
279 os_ctermid_impl(PyObject *module);
280
281 static PyObject *
os_ctermid(PyObject * module,PyObject * Py_UNUSED (ignored))282 os_ctermid(PyObject *module, PyObject *Py_UNUSED(ignored))
283 {
284 return os_ctermid_impl(module);
285 }
286
287 #endif /* defined(HAVE_CTERMID) */
288
289 PyDoc_STRVAR(os_chdir__doc__,
290 "chdir($module, /, path)\n"
291 "--\n"
292 "\n"
293 "Change the current working directory to the specified path.\n"
294 "\n"
295 "path may always be specified as a string.\n"
296 "On some platforms, path may also be specified as an open file descriptor.\n"
297 " If this functionality is unavailable, using it raises an exception.");
298
299 #define OS_CHDIR_METHODDEF \
300 {"chdir", _PyCFunction_CAST(os_chdir), METH_FASTCALL|METH_KEYWORDS, os_chdir__doc__},
301
302 static PyObject *
303 os_chdir_impl(PyObject *module, path_t *path);
304
305 static PyObject *
os_chdir(PyObject * module,PyObject * const * args,Py_ssize_t nargs,PyObject * kwnames)306 os_chdir(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames)
307 {
308 PyObject *return_value = NULL;
309 static const char * const _keywords[] = {"path", NULL};
310 static _PyArg_Parser _parser = {NULL, _keywords, "chdir", 0};
311 PyObject *argsbuf[1];
312 path_t path = PATH_T_INITIALIZE("chdir", "path", 0, PATH_HAVE_FCHDIR);
313
314 args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 1, 1, 0, argsbuf);
315 if (!args) {
316 goto exit;
317 }
318 if (!path_converter(args[0], &path)) {
319 goto exit;
320 }
321 return_value = os_chdir_impl(module, &path);
322
323 exit:
324 /* Cleanup for path */
325 path_cleanup(&path);
326
327 return return_value;
328 }
329
330 #if defined(HAVE_FCHDIR)
331
332 PyDoc_STRVAR(os_fchdir__doc__,
333 "fchdir($module, /, fd)\n"
334 "--\n"
335 "\n"
336 "Change to the directory of the given file descriptor.\n"
337 "\n"
338 "fd must be opened on a directory, not a file.\n"
339 "Equivalent to os.chdir(fd).");
340
341 #define OS_FCHDIR_METHODDEF \
342 {"fchdir", _PyCFunction_CAST(os_fchdir), METH_FASTCALL|METH_KEYWORDS, os_fchdir__doc__},
343
344 static PyObject *
345 os_fchdir_impl(PyObject *module, int fd);
346
347 static PyObject *
os_fchdir(PyObject * module,PyObject * const * args,Py_ssize_t nargs,PyObject * kwnames)348 os_fchdir(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames)
349 {
350 PyObject *return_value = NULL;
351 static const char * const _keywords[] = {"fd", NULL};
352 static _PyArg_Parser _parser = {NULL, _keywords, "fchdir", 0};
353 PyObject *argsbuf[1];
354 int fd;
355
356 args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 1, 1, 0, argsbuf);
357 if (!args) {
358 goto exit;
359 }
360 if (!_PyLong_FileDescriptor_Converter(args[0], &fd)) {
361 goto exit;
362 }
363 return_value = os_fchdir_impl(module, fd);
364
365 exit:
366 return return_value;
367 }
368
369 #endif /* defined(HAVE_FCHDIR) */
370
371 PyDoc_STRVAR(os_chmod__doc__,
372 "chmod($module, /, path, mode, *, dir_fd=None, follow_symlinks=True)\n"
373 "--\n"
374 "\n"
375 "Change the access permissions of a file.\n"
376 "\n"
377 " path\n"
378 " Path to be modified. May always be specified as a str, bytes, or a path-like object.\n"
379 " On some platforms, path may also be specified as an open file descriptor.\n"
380 " If this functionality is unavailable, using it raises an exception.\n"
381 " mode\n"
382 " Operating-system mode bitfield.\n"
383 " dir_fd\n"
384 " If not None, it should be a file descriptor open to a directory,\n"
385 " and path should be relative; path will then be relative to that\n"
386 " directory.\n"
387 " follow_symlinks\n"
388 " If False, and the last element of the path is a symbolic link,\n"
389 " chmod will modify the symbolic link itself instead of the file\n"
390 " the link points to.\n"
391 "\n"
392 "It is an error to use dir_fd or follow_symlinks when specifying path as\n"
393 " an open file descriptor.\n"
394 "dir_fd and follow_symlinks may not be implemented on your platform.\n"
395 " If they are unavailable, using them will raise a NotImplementedError.");
396
397 #define OS_CHMOD_METHODDEF \
398 {"chmod", _PyCFunction_CAST(os_chmod), METH_FASTCALL|METH_KEYWORDS, os_chmod__doc__},
399
400 static PyObject *
401 os_chmod_impl(PyObject *module, path_t *path, int mode, int dir_fd,
402 int follow_symlinks);
403
404 static PyObject *
os_chmod(PyObject * module,PyObject * const * args,Py_ssize_t nargs,PyObject * kwnames)405 os_chmod(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames)
406 {
407 PyObject *return_value = NULL;
408 static const char * const _keywords[] = {"path", "mode", "dir_fd", "follow_symlinks", NULL};
409 static _PyArg_Parser _parser = {NULL, _keywords, "chmod", 0};
410 PyObject *argsbuf[4];
411 Py_ssize_t noptargs = nargs + (kwnames ? PyTuple_GET_SIZE(kwnames) : 0) - 2;
412 path_t path = PATH_T_INITIALIZE("chmod", "path", 0, PATH_HAVE_FCHMOD);
413 int mode;
414 int dir_fd = DEFAULT_DIR_FD;
415 int follow_symlinks = 1;
416
417 args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 2, 2, 0, argsbuf);
418 if (!args) {
419 goto exit;
420 }
421 if (!path_converter(args[0], &path)) {
422 goto exit;
423 }
424 mode = _PyLong_AsInt(args[1]);
425 if (mode == -1 && PyErr_Occurred()) {
426 goto exit;
427 }
428 if (!noptargs) {
429 goto skip_optional_kwonly;
430 }
431 if (args[2]) {
432 if (!FCHMODAT_DIR_FD_CONVERTER(args[2], &dir_fd)) {
433 goto exit;
434 }
435 if (!--noptargs) {
436 goto skip_optional_kwonly;
437 }
438 }
439 follow_symlinks = PyObject_IsTrue(args[3]);
440 if (follow_symlinks < 0) {
441 goto exit;
442 }
443 skip_optional_kwonly:
444 return_value = os_chmod_impl(module, &path, mode, dir_fd, follow_symlinks);
445
446 exit:
447 /* Cleanup for path */
448 path_cleanup(&path);
449
450 return return_value;
451 }
452
453 #if defined(HAVE_FCHMOD)
454
455 PyDoc_STRVAR(os_fchmod__doc__,
456 "fchmod($module, /, fd, mode)\n"
457 "--\n"
458 "\n"
459 "Change the access permissions of the file given by file descriptor fd.\n"
460 "\n"
461 "Equivalent to os.chmod(fd, mode).");
462
463 #define OS_FCHMOD_METHODDEF \
464 {"fchmod", _PyCFunction_CAST(os_fchmod), METH_FASTCALL|METH_KEYWORDS, os_fchmod__doc__},
465
466 static PyObject *
467 os_fchmod_impl(PyObject *module, int fd, int mode);
468
469 static PyObject *
os_fchmod(PyObject * module,PyObject * const * args,Py_ssize_t nargs,PyObject * kwnames)470 os_fchmod(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames)
471 {
472 PyObject *return_value = NULL;
473 static const char * const _keywords[] = {"fd", "mode", NULL};
474 static _PyArg_Parser _parser = {NULL, _keywords, "fchmod", 0};
475 PyObject *argsbuf[2];
476 int fd;
477 int mode;
478
479 args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 2, 2, 0, argsbuf);
480 if (!args) {
481 goto exit;
482 }
483 fd = _PyLong_AsInt(args[0]);
484 if (fd == -1 && PyErr_Occurred()) {
485 goto exit;
486 }
487 mode = _PyLong_AsInt(args[1]);
488 if (mode == -1 && PyErr_Occurred()) {
489 goto exit;
490 }
491 return_value = os_fchmod_impl(module, fd, mode);
492
493 exit:
494 return return_value;
495 }
496
497 #endif /* defined(HAVE_FCHMOD) */
498
499 #if defined(HAVE_LCHMOD)
500
501 PyDoc_STRVAR(os_lchmod__doc__,
502 "lchmod($module, /, path, mode)\n"
503 "--\n"
504 "\n"
505 "Change the access permissions of a file, without following symbolic links.\n"
506 "\n"
507 "If path is a symlink, this affects the link itself rather than the target.\n"
508 "Equivalent to chmod(path, mode, follow_symlinks=False).\"");
509
510 #define OS_LCHMOD_METHODDEF \
511 {"lchmod", _PyCFunction_CAST(os_lchmod), METH_FASTCALL|METH_KEYWORDS, os_lchmod__doc__},
512
513 static PyObject *
514 os_lchmod_impl(PyObject *module, path_t *path, int mode);
515
516 static PyObject *
os_lchmod(PyObject * module,PyObject * const * args,Py_ssize_t nargs,PyObject * kwnames)517 os_lchmod(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames)
518 {
519 PyObject *return_value = NULL;
520 static const char * const _keywords[] = {"path", "mode", NULL};
521 static _PyArg_Parser _parser = {NULL, _keywords, "lchmod", 0};
522 PyObject *argsbuf[2];
523 path_t path = PATH_T_INITIALIZE("lchmod", "path", 0, 0);
524 int mode;
525
526 args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 2, 2, 0, argsbuf);
527 if (!args) {
528 goto exit;
529 }
530 if (!path_converter(args[0], &path)) {
531 goto exit;
532 }
533 mode = _PyLong_AsInt(args[1]);
534 if (mode == -1 && PyErr_Occurred()) {
535 goto exit;
536 }
537 return_value = os_lchmod_impl(module, &path, mode);
538
539 exit:
540 /* Cleanup for path */
541 path_cleanup(&path);
542
543 return return_value;
544 }
545
546 #endif /* defined(HAVE_LCHMOD) */
547
548 #if defined(HAVE_CHFLAGS)
549
550 PyDoc_STRVAR(os_chflags__doc__,
551 "chflags($module, /, path, flags, follow_symlinks=True)\n"
552 "--\n"
553 "\n"
554 "Set file flags.\n"
555 "\n"
556 "If follow_symlinks is False, and the last element of the path is a symbolic\n"
557 " link, chflags will change flags on the symbolic link itself instead of the\n"
558 " file the link points to.\n"
559 "follow_symlinks may not be implemented on your platform. If it is\n"
560 "unavailable, using it will raise a NotImplementedError.");
561
562 #define OS_CHFLAGS_METHODDEF \
563 {"chflags", _PyCFunction_CAST(os_chflags), METH_FASTCALL|METH_KEYWORDS, os_chflags__doc__},
564
565 static PyObject *
566 os_chflags_impl(PyObject *module, path_t *path, unsigned long flags,
567 int follow_symlinks);
568
569 static PyObject *
os_chflags(PyObject * module,PyObject * const * args,Py_ssize_t nargs,PyObject * kwnames)570 os_chflags(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames)
571 {
572 PyObject *return_value = NULL;
573 static const char * const _keywords[] = {"path", "flags", "follow_symlinks", NULL};
574 static _PyArg_Parser _parser = {NULL, _keywords, "chflags", 0};
575 PyObject *argsbuf[3];
576 Py_ssize_t noptargs = nargs + (kwnames ? PyTuple_GET_SIZE(kwnames) : 0) - 2;
577 path_t path = PATH_T_INITIALIZE("chflags", "path", 0, 0);
578 unsigned long flags;
579 int follow_symlinks = 1;
580
581 args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 2, 3, 0, argsbuf);
582 if (!args) {
583 goto exit;
584 }
585 if (!path_converter(args[0], &path)) {
586 goto exit;
587 }
588 if (!PyLong_Check(args[1])) {
589 _PyArg_BadArgument("chflags", "argument 'flags'", "int", args[1]);
590 goto exit;
591 }
592 flags = PyLong_AsUnsignedLongMask(args[1]);
593 if (!noptargs) {
594 goto skip_optional_pos;
595 }
596 follow_symlinks = PyObject_IsTrue(args[2]);
597 if (follow_symlinks < 0) {
598 goto exit;
599 }
600 skip_optional_pos:
601 return_value = os_chflags_impl(module, &path, flags, follow_symlinks);
602
603 exit:
604 /* Cleanup for path */
605 path_cleanup(&path);
606
607 return return_value;
608 }
609
610 #endif /* defined(HAVE_CHFLAGS) */
611
612 #if defined(HAVE_LCHFLAGS)
613
614 PyDoc_STRVAR(os_lchflags__doc__,
615 "lchflags($module, /, path, flags)\n"
616 "--\n"
617 "\n"
618 "Set file flags.\n"
619 "\n"
620 "This function will not follow symbolic links.\n"
621 "Equivalent to chflags(path, flags, follow_symlinks=False).");
622
623 #define OS_LCHFLAGS_METHODDEF \
624 {"lchflags", _PyCFunction_CAST(os_lchflags), METH_FASTCALL|METH_KEYWORDS, os_lchflags__doc__},
625
626 static PyObject *
627 os_lchflags_impl(PyObject *module, path_t *path, unsigned long flags);
628
629 static PyObject *
os_lchflags(PyObject * module,PyObject * const * args,Py_ssize_t nargs,PyObject * kwnames)630 os_lchflags(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames)
631 {
632 PyObject *return_value = NULL;
633 static const char * const _keywords[] = {"path", "flags", NULL};
634 static _PyArg_Parser _parser = {NULL, _keywords, "lchflags", 0};
635 PyObject *argsbuf[2];
636 path_t path = PATH_T_INITIALIZE("lchflags", "path", 0, 0);
637 unsigned long flags;
638
639 args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 2, 2, 0, argsbuf);
640 if (!args) {
641 goto exit;
642 }
643 if (!path_converter(args[0], &path)) {
644 goto exit;
645 }
646 if (!PyLong_Check(args[1])) {
647 _PyArg_BadArgument("lchflags", "argument 'flags'", "int", args[1]);
648 goto exit;
649 }
650 flags = PyLong_AsUnsignedLongMask(args[1]);
651 return_value = os_lchflags_impl(module, &path, flags);
652
653 exit:
654 /* Cleanup for path */
655 path_cleanup(&path);
656
657 return return_value;
658 }
659
660 #endif /* defined(HAVE_LCHFLAGS) */
661
662 #if defined(HAVE_CHROOT)
663
664 PyDoc_STRVAR(os_chroot__doc__,
665 "chroot($module, /, path)\n"
666 "--\n"
667 "\n"
668 "Change root directory to path.");
669
670 #define OS_CHROOT_METHODDEF \
671 {"chroot", _PyCFunction_CAST(os_chroot), METH_FASTCALL|METH_KEYWORDS, os_chroot__doc__},
672
673 static PyObject *
674 os_chroot_impl(PyObject *module, path_t *path);
675
676 static PyObject *
os_chroot(PyObject * module,PyObject * const * args,Py_ssize_t nargs,PyObject * kwnames)677 os_chroot(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames)
678 {
679 PyObject *return_value = NULL;
680 static const char * const _keywords[] = {"path", NULL};
681 static _PyArg_Parser _parser = {NULL, _keywords, "chroot", 0};
682 PyObject *argsbuf[1];
683 path_t path = PATH_T_INITIALIZE("chroot", "path", 0, 0);
684
685 args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 1, 1, 0, argsbuf);
686 if (!args) {
687 goto exit;
688 }
689 if (!path_converter(args[0], &path)) {
690 goto exit;
691 }
692 return_value = os_chroot_impl(module, &path);
693
694 exit:
695 /* Cleanup for path */
696 path_cleanup(&path);
697
698 return return_value;
699 }
700
701 #endif /* defined(HAVE_CHROOT) */
702
703 #if defined(HAVE_FSYNC)
704
705 PyDoc_STRVAR(os_fsync__doc__,
706 "fsync($module, /, fd)\n"
707 "--\n"
708 "\n"
709 "Force write of fd to disk.");
710
711 #define OS_FSYNC_METHODDEF \
712 {"fsync", _PyCFunction_CAST(os_fsync), METH_FASTCALL|METH_KEYWORDS, os_fsync__doc__},
713
714 static PyObject *
715 os_fsync_impl(PyObject *module, int fd);
716
717 static PyObject *
os_fsync(PyObject * module,PyObject * const * args,Py_ssize_t nargs,PyObject * kwnames)718 os_fsync(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames)
719 {
720 PyObject *return_value = NULL;
721 static const char * const _keywords[] = {"fd", NULL};
722 static _PyArg_Parser _parser = {NULL, _keywords, "fsync", 0};
723 PyObject *argsbuf[1];
724 int fd;
725
726 args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 1, 1, 0, argsbuf);
727 if (!args) {
728 goto exit;
729 }
730 if (!_PyLong_FileDescriptor_Converter(args[0], &fd)) {
731 goto exit;
732 }
733 return_value = os_fsync_impl(module, fd);
734
735 exit:
736 return return_value;
737 }
738
739 #endif /* defined(HAVE_FSYNC) */
740
741 #if defined(HAVE_SYNC)
742
743 PyDoc_STRVAR(os_sync__doc__,
744 "sync($module, /)\n"
745 "--\n"
746 "\n"
747 "Force write of everything to disk.");
748
749 #define OS_SYNC_METHODDEF \
750 {"sync", (PyCFunction)os_sync, METH_NOARGS, os_sync__doc__},
751
752 static PyObject *
753 os_sync_impl(PyObject *module);
754
755 static PyObject *
os_sync(PyObject * module,PyObject * Py_UNUSED (ignored))756 os_sync(PyObject *module, PyObject *Py_UNUSED(ignored))
757 {
758 return os_sync_impl(module);
759 }
760
761 #endif /* defined(HAVE_SYNC) */
762
763 #if defined(HAVE_FDATASYNC)
764
765 PyDoc_STRVAR(os_fdatasync__doc__,
766 "fdatasync($module, /, fd)\n"
767 "--\n"
768 "\n"
769 "Force write of fd to disk without forcing update of metadata.");
770
771 #define OS_FDATASYNC_METHODDEF \
772 {"fdatasync", _PyCFunction_CAST(os_fdatasync), METH_FASTCALL|METH_KEYWORDS, os_fdatasync__doc__},
773
774 static PyObject *
775 os_fdatasync_impl(PyObject *module, int fd);
776
777 static PyObject *
os_fdatasync(PyObject * module,PyObject * const * args,Py_ssize_t nargs,PyObject * kwnames)778 os_fdatasync(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames)
779 {
780 PyObject *return_value = NULL;
781 static const char * const _keywords[] = {"fd", NULL};
782 static _PyArg_Parser _parser = {NULL, _keywords, "fdatasync", 0};
783 PyObject *argsbuf[1];
784 int fd;
785
786 args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 1, 1, 0, argsbuf);
787 if (!args) {
788 goto exit;
789 }
790 if (!_PyLong_FileDescriptor_Converter(args[0], &fd)) {
791 goto exit;
792 }
793 return_value = os_fdatasync_impl(module, fd);
794
795 exit:
796 return return_value;
797 }
798
799 #endif /* defined(HAVE_FDATASYNC) */
800
801 #if defined(HAVE_CHOWN)
802
803 PyDoc_STRVAR(os_chown__doc__,
804 "chown($module, /, path, uid, gid, *, dir_fd=None, follow_symlinks=True)\n"
805 "--\n"
806 "\n"
807 "Change the owner and group id of path to the numeric uid and gid.\\\n"
808 "\n"
809 " path\n"
810 " Path to be examined; can be string, bytes, a path-like object, or open-file-descriptor int.\n"
811 " dir_fd\n"
812 " If not None, it should be a file descriptor open to a directory,\n"
813 " and path should be relative; path will then be relative to that\n"
814 " directory.\n"
815 " follow_symlinks\n"
816 " If False, and the last element of the path is a symbolic link,\n"
817 " stat will examine the symbolic link itself instead of the file\n"
818 " the link points to.\n"
819 "\n"
820 "path may always be specified as a string.\n"
821 "On some platforms, path may also be specified as an open file descriptor.\n"
822 " If this functionality is unavailable, using it raises an exception.\n"
823 "If dir_fd is not None, it should be a file descriptor open to a directory,\n"
824 " and path should be relative; path will then be relative to that directory.\n"
825 "If follow_symlinks is False, and the last element of the path is a symbolic\n"
826 " link, chown will modify the symbolic link itself instead of the file the\n"
827 " link points to.\n"
828 "It is an error to use dir_fd or follow_symlinks when specifying path as\n"
829 " an open file descriptor.\n"
830 "dir_fd and follow_symlinks may not be implemented on your platform.\n"
831 " If they are unavailable, using them will raise a NotImplementedError.");
832
833 #define OS_CHOWN_METHODDEF \
834 {"chown", _PyCFunction_CAST(os_chown), METH_FASTCALL|METH_KEYWORDS, os_chown__doc__},
835
836 static PyObject *
837 os_chown_impl(PyObject *module, path_t *path, uid_t uid, gid_t gid,
838 int dir_fd, int follow_symlinks);
839
840 static PyObject *
os_chown(PyObject * module,PyObject * const * args,Py_ssize_t nargs,PyObject * kwnames)841 os_chown(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames)
842 {
843 PyObject *return_value = NULL;
844 static const char * const _keywords[] = {"path", "uid", "gid", "dir_fd", "follow_symlinks", NULL};
845 static _PyArg_Parser _parser = {NULL, _keywords, "chown", 0};
846 PyObject *argsbuf[5];
847 Py_ssize_t noptargs = nargs + (kwnames ? PyTuple_GET_SIZE(kwnames) : 0) - 3;
848 path_t path = PATH_T_INITIALIZE("chown", "path", 0, PATH_HAVE_FCHOWN);
849 uid_t uid;
850 gid_t gid;
851 int dir_fd = DEFAULT_DIR_FD;
852 int follow_symlinks = 1;
853
854 args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 3, 3, 0, argsbuf);
855 if (!args) {
856 goto exit;
857 }
858 if (!path_converter(args[0], &path)) {
859 goto exit;
860 }
861 if (!_Py_Uid_Converter(args[1], &uid)) {
862 goto exit;
863 }
864 if (!_Py_Gid_Converter(args[2], &gid)) {
865 goto exit;
866 }
867 if (!noptargs) {
868 goto skip_optional_kwonly;
869 }
870 if (args[3]) {
871 if (!FCHOWNAT_DIR_FD_CONVERTER(args[3], &dir_fd)) {
872 goto exit;
873 }
874 if (!--noptargs) {
875 goto skip_optional_kwonly;
876 }
877 }
878 follow_symlinks = PyObject_IsTrue(args[4]);
879 if (follow_symlinks < 0) {
880 goto exit;
881 }
882 skip_optional_kwonly:
883 return_value = os_chown_impl(module, &path, uid, gid, dir_fd, follow_symlinks);
884
885 exit:
886 /* Cleanup for path */
887 path_cleanup(&path);
888
889 return return_value;
890 }
891
892 #endif /* defined(HAVE_CHOWN) */
893
894 #if defined(HAVE_FCHOWN)
895
896 PyDoc_STRVAR(os_fchown__doc__,
897 "fchown($module, /, fd, uid, gid)\n"
898 "--\n"
899 "\n"
900 "Change the owner and group id of the file specified by file descriptor.\n"
901 "\n"
902 "Equivalent to os.chown(fd, uid, gid).");
903
904 #define OS_FCHOWN_METHODDEF \
905 {"fchown", _PyCFunction_CAST(os_fchown), METH_FASTCALL|METH_KEYWORDS, os_fchown__doc__},
906
907 static PyObject *
908 os_fchown_impl(PyObject *module, int fd, uid_t uid, gid_t gid);
909
910 static PyObject *
os_fchown(PyObject * module,PyObject * const * args,Py_ssize_t nargs,PyObject * kwnames)911 os_fchown(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames)
912 {
913 PyObject *return_value = NULL;
914 static const char * const _keywords[] = {"fd", "uid", "gid", NULL};
915 static _PyArg_Parser _parser = {NULL, _keywords, "fchown", 0};
916 PyObject *argsbuf[3];
917 int fd;
918 uid_t uid;
919 gid_t gid;
920
921 args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 3, 3, 0, argsbuf);
922 if (!args) {
923 goto exit;
924 }
925 fd = _PyLong_AsInt(args[0]);
926 if (fd == -1 && PyErr_Occurred()) {
927 goto exit;
928 }
929 if (!_Py_Uid_Converter(args[1], &uid)) {
930 goto exit;
931 }
932 if (!_Py_Gid_Converter(args[2], &gid)) {
933 goto exit;
934 }
935 return_value = os_fchown_impl(module, fd, uid, gid);
936
937 exit:
938 return return_value;
939 }
940
941 #endif /* defined(HAVE_FCHOWN) */
942
943 #if defined(HAVE_LCHOWN)
944
945 PyDoc_STRVAR(os_lchown__doc__,
946 "lchown($module, /, path, uid, gid)\n"
947 "--\n"
948 "\n"
949 "Change the owner and group id of path to the numeric uid and gid.\n"
950 "\n"
951 "This function will not follow symbolic links.\n"
952 "Equivalent to os.chown(path, uid, gid, follow_symlinks=False).");
953
954 #define OS_LCHOWN_METHODDEF \
955 {"lchown", _PyCFunction_CAST(os_lchown), METH_FASTCALL|METH_KEYWORDS, os_lchown__doc__},
956
957 static PyObject *
958 os_lchown_impl(PyObject *module, path_t *path, uid_t uid, gid_t gid);
959
960 static PyObject *
os_lchown(PyObject * module,PyObject * const * args,Py_ssize_t nargs,PyObject * kwnames)961 os_lchown(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames)
962 {
963 PyObject *return_value = NULL;
964 static const char * const _keywords[] = {"path", "uid", "gid", NULL};
965 static _PyArg_Parser _parser = {NULL, _keywords, "lchown", 0};
966 PyObject *argsbuf[3];
967 path_t path = PATH_T_INITIALIZE("lchown", "path", 0, 0);
968 uid_t uid;
969 gid_t gid;
970
971 args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 3, 3, 0, argsbuf);
972 if (!args) {
973 goto exit;
974 }
975 if (!path_converter(args[0], &path)) {
976 goto exit;
977 }
978 if (!_Py_Uid_Converter(args[1], &uid)) {
979 goto exit;
980 }
981 if (!_Py_Gid_Converter(args[2], &gid)) {
982 goto exit;
983 }
984 return_value = os_lchown_impl(module, &path, uid, gid);
985
986 exit:
987 /* Cleanup for path */
988 path_cleanup(&path);
989
990 return return_value;
991 }
992
993 #endif /* defined(HAVE_LCHOWN) */
994
995 PyDoc_STRVAR(os_getcwd__doc__,
996 "getcwd($module, /)\n"
997 "--\n"
998 "\n"
999 "Return a unicode string representing the current working directory.");
1000
1001 #define OS_GETCWD_METHODDEF \
1002 {"getcwd", (PyCFunction)os_getcwd, METH_NOARGS, os_getcwd__doc__},
1003
1004 static PyObject *
1005 os_getcwd_impl(PyObject *module);
1006
1007 static PyObject *
os_getcwd(PyObject * module,PyObject * Py_UNUSED (ignored))1008 os_getcwd(PyObject *module, PyObject *Py_UNUSED(ignored))
1009 {
1010 return os_getcwd_impl(module);
1011 }
1012
1013 PyDoc_STRVAR(os_getcwdb__doc__,
1014 "getcwdb($module, /)\n"
1015 "--\n"
1016 "\n"
1017 "Return a bytes string representing the current working directory.");
1018
1019 #define OS_GETCWDB_METHODDEF \
1020 {"getcwdb", (PyCFunction)os_getcwdb, METH_NOARGS, os_getcwdb__doc__},
1021
1022 static PyObject *
1023 os_getcwdb_impl(PyObject *module);
1024
1025 static PyObject *
os_getcwdb(PyObject * module,PyObject * Py_UNUSED (ignored))1026 os_getcwdb(PyObject *module, PyObject *Py_UNUSED(ignored))
1027 {
1028 return os_getcwdb_impl(module);
1029 }
1030
1031 #if defined(HAVE_LINK)
1032
1033 PyDoc_STRVAR(os_link__doc__,
1034 "link($module, /, src, dst, *, src_dir_fd=None, dst_dir_fd=None,\n"
1035 " follow_symlinks=True)\n"
1036 "--\n"
1037 "\n"
1038 "Create a hard link to a file.\n"
1039 "\n"
1040 "If either src_dir_fd or dst_dir_fd is not None, it should be a file\n"
1041 " descriptor open to a directory, and the respective path string (src or dst)\n"
1042 " should be relative; the path will then be relative to that directory.\n"
1043 "If follow_symlinks is False, and the last element of src is a symbolic\n"
1044 " link, link will create a link to the symbolic link itself instead of the\n"
1045 " file the link points to.\n"
1046 "src_dir_fd, dst_dir_fd, and follow_symlinks may not be implemented on your\n"
1047 " platform. If they are unavailable, using them will raise a\n"
1048 " NotImplementedError.");
1049
1050 #define OS_LINK_METHODDEF \
1051 {"link", _PyCFunction_CAST(os_link), METH_FASTCALL|METH_KEYWORDS, os_link__doc__},
1052
1053 static PyObject *
1054 os_link_impl(PyObject *module, path_t *src, path_t *dst, int src_dir_fd,
1055 int dst_dir_fd, int follow_symlinks);
1056
1057 static PyObject *
os_link(PyObject * module,PyObject * const * args,Py_ssize_t nargs,PyObject * kwnames)1058 os_link(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames)
1059 {
1060 PyObject *return_value = NULL;
1061 static const char * const _keywords[] = {"src", "dst", "src_dir_fd", "dst_dir_fd", "follow_symlinks", NULL};
1062 static _PyArg_Parser _parser = {NULL, _keywords, "link", 0};
1063 PyObject *argsbuf[5];
1064 Py_ssize_t noptargs = nargs + (kwnames ? PyTuple_GET_SIZE(kwnames) : 0) - 2;
1065 path_t src = PATH_T_INITIALIZE("link", "src", 0, 0);
1066 path_t dst = PATH_T_INITIALIZE("link", "dst", 0, 0);
1067 int src_dir_fd = DEFAULT_DIR_FD;
1068 int dst_dir_fd = DEFAULT_DIR_FD;
1069 int follow_symlinks = 1;
1070
1071 args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 2, 2, 0, argsbuf);
1072 if (!args) {
1073 goto exit;
1074 }
1075 if (!path_converter(args[0], &src)) {
1076 goto exit;
1077 }
1078 if (!path_converter(args[1], &dst)) {
1079 goto exit;
1080 }
1081 if (!noptargs) {
1082 goto skip_optional_kwonly;
1083 }
1084 if (args[2]) {
1085 if (!dir_fd_converter(args[2], &src_dir_fd)) {
1086 goto exit;
1087 }
1088 if (!--noptargs) {
1089 goto skip_optional_kwonly;
1090 }
1091 }
1092 if (args[3]) {
1093 if (!dir_fd_converter(args[3], &dst_dir_fd)) {
1094 goto exit;
1095 }
1096 if (!--noptargs) {
1097 goto skip_optional_kwonly;
1098 }
1099 }
1100 follow_symlinks = PyObject_IsTrue(args[4]);
1101 if (follow_symlinks < 0) {
1102 goto exit;
1103 }
1104 skip_optional_kwonly:
1105 return_value = os_link_impl(module, &src, &dst, src_dir_fd, dst_dir_fd, follow_symlinks);
1106
1107 exit:
1108 /* Cleanup for src */
1109 path_cleanup(&src);
1110 /* Cleanup for dst */
1111 path_cleanup(&dst);
1112
1113 return return_value;
1114 }
1115
1116 #endif /* defined(HAVE_LINK) */
1117
1118 PyDoc_STRVAR(os_listdir__doc__,
1119 "listdir($module, /, path=None)\n"
1120 "--\n"
1121 "\n"
1122 "Return a list containing the names of the files in the directory.\n"
1123 "\n"
1124 "path can be specified as either str, bytes, or a path-like object. If path is bytes,\n"
1125 " the filenames returned will also be bytes; in all other circumstances\n"
1126 " the filenames returned will be str.\n"
1127 "If path is None, uses the path=\'.\'.\n"
1128 "On some platforms, path may also be specified as an open file descriptor;\\\n"
1129 " the file descriptor must refer to a directory.\n"
1130 " If this functionality is unavailable, using it raises NotImplementedError.\n"
1131 "\n"
1132 "The list is in arbitrary order. It does not include the special\n"
1133 "entries \'.\' and \'..\' even if they are present in the directory.");
1134
1135 #define OS_LISTDIR_METHODDEF \
1136 {"listdir", _PyCFunction_CAST(os_listdir), METH_FASTCALL|METH_KEYWORDS, os_listdir__doc__},
1137
1138 static PyObject *
1139 os_listdir_impl(PyObject *module, path_t *path);
1140
1141 static PyObject *
os_listdir(PyObject * module,PyObject * const * args,Py_ssize_t nargs,PyObject * kwnames)1142 os_listdir(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames)
1143 {
1144 PyObject *return_value = NULL;
1145 static const char * const _keywords[] = {"path", NULL};
1146 static _PyArg_Parser _parser = {NULL, _keywords, "listdir", 0};
1147 PyObject *argsbuf[1];
1148 Py_ssize_t noptargs = nargs + (kwnames ? PyTuple_GET_SIZE(kwnames) : 0) - 0;
1149 path_t path = PATH_T_INITIALIZE("listdir", "path", 1, PATH_HAVE_FDOPENDIR);
1150
1151 args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 0, 1, 0, argsbuf);
1152 if (!args) {
1153 goto exit;
1154 }
1155 if (!noptargs) {
1156 goto skip_optional_pos;
1157 }
1158 if (!path_converter(args[0], &path)) {
1159 goto exit;
1160 }
1161 skip_optional_pos:
1162 return_value = os_listdir_impl(module, &path);
1163
1164 exit:
1165 /* Cleanup for path */
1166 path_cleanup(&path);
1167
1168 return return_value;
1169 }
1170
1171 #if defined(MS_WINDOWS)
1172
1173 PyDoc_STRVAR(os__getfullpathname__doc__,
1174 "_getfullpathname($module, path, /)\n"
1175 "--\n"
1176 "\n");
1177
1178 #define OS__GETFULLPATHNAME_METHODDEF \
1179 {"_getfullpathname", (PyCFunction)os__getfullpathname, METH_O, os__getfullpathname__doc__},
1180
1181 static PyObject *
1182 os__getfullpathname_impl(PyObject *module, path_t *path);
1183
1184 static PyObject *
os__getfullpathname(PyObject * module,PyObject * arg)1185 os__getfullpathname(PyObject *module, PyObject *arg)
1186 {
1187 PyObject *return_value = NULL;
1188 path_t path = PATH_T_INITIALIZE("_getfullpathname", "path", 0, 0);
1189
1190 if (!path_converter(arg, &path)) {
1191 goto exit;
1192 }
1193 return_value = os__getfullpathname_impl(module, &path);
1194
1195 exit:
1196 /* Cleanup for path */
1197 path_cleanup(&path);
1198
1199 return return_value;
1200 }
1201
1202 #endif /* defined(MS_WINDOWS) */
1203
1204 #if defined(MS_WINDOWS)
1205
1206 PyDoc_STRVAR(os__getfinalpathname__doc__,
1207 "_getfinalpathname($module, path, /)\n"
1208 "--\n"
1209 "\n"
1210 "A helper function for samepath on windows.");
1211
1212 #define OS__GETFINALPATHNAME_METHODDEF \
1213 {"_getfinalpathname", (PyCFunction)os__getfinalpathname, METH_O, os__getfinalpathname__doc__},
1214
1215 static PyObject *
1216 os__getfinalpathname_impl(PyObject *module, path_t *path);
1217
1218 static PyObject *
os__getfinalpathname(PyObject * module,PyObject * arg)1219 os__getfinalpathname(PyObject *module, PyObject *arg)
1220 {
1221 PyObject *return_value = NULL;
1222 path_t path = PATH_T_INITIALIZE("_getfinalpathname", "path", 0, 0);
1223
1224 if (!path_converter(arg, &path)) {
1225 goto exit;
1226 }
1227 return_value = os__getfinalpathname_impl(module, &path);
1228
1229 exit:
1230 /* Cleanup for path */
1231 path_cleanup(&path);
1232
1233 return return_value;
1234 }
1235
1236 #endif /* defined(MS_WINDOWS) */
1237
1238 #if defined(MS_WINDOWS)
1239
1240 PyDoc_STRVAR(os__getvolumepathname__doc__,
1241 "_getvolumepathname($module, /, path)\n"
1242 "--\n"
1243 "\n"
1244 "A helper function for ismount on Win32.");
1245
1246 #define OS__GETVOLUMEPATHNAME_METHODDEF \
1247 {"_getvolumepathname", _PyCFunction_CAST(os__getvolumepathname), METH_FASTCALL|METH_KEYWORDS, os__getvolumepathname__doc__},
1248
1249 static PyObject *
1250 os__getvolumepathname_impl(PyObject *module, path_t *path);
1251
1252 static PyObject *
os__getvolumepathname(PyObject * module,PyObject * const * args,Py_ssize_t nargs,PyObject * kwnames)1253 os__getvolumepathname(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames)
1254 {
1255 PyObject *return_value = NULL;
1256 static const char * const _keywords[] = {"path", NULL};
1257 static _PyArg_Parser _parser = {NULL, _keywords, "_getvolumepathname", 0};
1258 PyObject *argsbuf[1];
1259 path_t path = PATH_T_INITIALIZE("_getvolumepathname", "path", 0, 0);
1260
1261 args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 1, 1, 0, argsbuf);
1262 if (!args) {
1263 goto exit;
1264 }
1265 if (!path_converter(args[0], &path)) {
1266 goto exit;
1267 }
1268 return_value = os__getvolumepathname_impl(module, &path);
1269
1270 exit:
1271 /* Cleanup for path */
1272 path_cleanup(&path);
1273
1274 return return_value;
1275 }
1276
1277 #endif /* defined(MS_WINDOWS) */
1278
1279 #if defined(MS_WINDOWS)
1280
1281 PyDoc_STRVAR(os__path_splitroot__doc__,
1282 "_path_splitroot($module, /, path)\n"
1283 "--\n"
1284 "\n"
1285 "Removes everything after the root on Win32.");
1286
1287 #define OS__PATH_SPLITROOT_METHODDEF \
1288 {"_path_splitroot", _PyCFunction_CAST(os__path_splitroot), METH_FASTCALL|METH_KEYWORDS, os__path_splitroot__doc__},
1289
1290 static PyObject *
1291 os__path_splitroot_impl(PyObject *module, path_t *path);
1292
1293 static PyObject *
os__path_splitroot(PyObject * module,PyObject * const * args,Py_ssize_t nargs,PyObject * kwnames)1294 os__path_splitroot(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames)
1295 {
1296 PyObject *return_value = NULL;
1297 static const char * const _keywords[] = {"path", NULL};
1298 static _PyArg_Parser _parser = {NULL, _keywords, "_path_splitroot", 0};
1299 PyObject *argsbuf[1];
1300 path_t path = PATH_T_INITIALIZE("_path_splitroot", "path", 0, 0);
1301
1302 args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 1, 1, 0, argsbuf);
1303 if (!args) {
1304 goto exit;
1305 }
1306 if (!path_converter(args[0], &path)) {
1307 goto exit;
1308 }
1309 return_value = os__path_splitroot_impl(module, &path);
1310
1311 exit:
1312 /* Cleanup for path */
1313 path_cleanup(&path);
1314
1315 return return_value;
1316 }
1317
1318 #endif /* defined(MS_WINDOWS) */
1319
1320 PyDoc_STRVAR(os__path_normpath__doc__,
1321 "_path_normpath($module, /, path)\n"
1322 "--\n"
1323 "\n"
1324 "Basic path normalization.");
1325
1326 #define OS__PATH_NORMPATH_METHODDEF \
1327 {"_path_normpath", _PyCFunction_CAST(os__path_normpath), METH_FASTCALL|METH_KEYWORDS, os__path_normpath__doc__},
1328
1329 static PyObject *
1330 os__path_normpath_impl(PyObject *module, PyObject *path);
1331
1332 static PyObject *
os__path_normpath(PyObject * module,PyObject * const * args,Py_ssize_t nargs,PyObject * kwnames)1333 os__path_normpath(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames)
1334 {
1335 PyObject *return_value = NULL;
1336 static const char * const _keywords[] = {"path", NULL};
1337 static _PyArg_Parser _parser = {NULL, _keywords, "_path_normpath", 0};
1338 PyObject *argsbuf[1];
1339 PyObject *path;
1340
1341 args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 1, 1, 0, argsbuf);
1342 if (!args) {
1343 goto exit;
1344 }
1345 path = args[0];
1346 return_value = os__path_normpath_impl(module, path);
1347
1348 exit:
1349 return return_value;
1350 }
1351
1352 PyDoc_STRVAR(os_mkdir__doc__,
1353 "mkdir($module, /, path, mode=511, *, dir_fd=None)\n"
1354 "--\n"
1355 "\n"
1356 "Create a directory.\n"
1357 "\n"
1358 "If dir_fd is not None, it should be a file descriptor open to a directory,\n"
1359 " and path should be relative; path will then be relative to that directory.\n"
1360 "dir_fd may not be implemented on your platform.\n"
1361 " If it is unavailable, using it will raise a NotImplementedError.\n"
1362 "\n"
1363 "The mode argument is ignored on Windows. Where it is used, the current umask\n"
1364 "value is first masked out.");
1365
1366 #define OS_MKDIR_METHODDEF \
1367 {"mkdir", _PyCFunction_CAST(os_mkdir), METH_FASTCALL|METH_KEYWORDS, os_mkdir__doc__},
1368
1369 static PyObject *
1370 os_mkdir_impl(PyObject *module, path_t *path, int mode, int dir_fd);
1371
1372 static PyObject *
os_mkdir(PyObject * module,PyObject * const * args,Py_ssize_t nargs,PyObject * kwnames)1373 os_mkdir(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames)
1374 {
1375 PyObject *return_value = NULL;
1376 static const char * const _keywords[] = {"path", "mode", "dir_fd", NULL};
1377 static _PyArg_Parser _parser = {NULL, _keywords, "mkdir", 0};
1378 PyObject *argsbuf[3];
1379 Py_ssize_t noptargs = nargs + (kwnames ? PyTuple_GET_SIZE(kwnames) : 0) - 1;
1380 path_t path = PATH_T_INITIALIZE("mkdir", "path", 0, 0);
1381 int mode = 511;
1382 int dir_fd = DEFAULT_DIR_FD;
1383
1384 args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 1, 2, 0, argsbuf);
1385 if (!args) {
1386 goto exit;
1387 }
1388 if (!path_converter(args[0], &path)) {
1389 goto exit;
1390 }
1391 if (!noptargs) {
1392 goto skip_optional_pos;
1393 }
1394 if (args[1]) {
1395 mode = _PyLong_AsInt(args[1]);
1396 if (mode == -1 && PyErr_Occurred()) {
1397 goto exit;
1398 }
1399 if (!--noptargs) {
1400 goto skip_optional_pos;
1401 }
1402 }
1403 skip_optional_pos:
1404 if (!noptargs) {
1405 goto skip_optional_kwonly;
1406 }
1407 if (!MKDIRAT_DIR_FD_CONVERTER(args[2], &dir_fd)) {
1408 goto exit;
1409 }
1410 skip_optional_kwonly:
1411 return_value = os_mkdir_impl(module, &path, mode, dir_fd);
1412
1413 exit:
1414 /* Cleanup for path */
1415 path_cleanup(&path);
1416
1417 return return_value;
1418 }
1419
1420 #if defined(HAVE_NICE)
1421
1422 PyDoc_STRVAR(os_nice__doc__,
1423 "nice($module, increment, /)\n"
1424 "--\n"
1425 "\n"
1426 "Add increment to the priority of process and return the new priority.");
1427
1428 #define OS_NICE_METHODDEF \
1429 {"nice", (PyCFunction)os_nice, METH_O, os_nice__doc__},
1430
1431 static PyObject *
1432 os_nice_impl(PyObject *module, int increment);
1433
1434 static PyObject *
os_nice(PyObject * module,PyObject * arg)1435 os_nice(PyObject *module, PyObject *arg)
1436 {
1437 PyObject *return_value = NULL;
1438 int increment;
1439
1440 increment = _PyLong_AsInt(arg);
1441 if (increment == -1 && PyErr_Occurred()) {
1442 goto exit;
1443 }
1444 return_value = os_nice_impl(module, increment);
1445
1446 exit:
1447 return return_value;
1448 }
1449
1450 #endif /* defined(HAVE_NICE) */
1451
1452 #if defined(HAVE_GETPRIORITY)
1453
1454 PyDoc_STRVAR(os_getpriority__doc__,
1455 "getpriority($module, /, which, who)\n"
1456 "--\n"
1457 "\n"
1458 "Return program scheduling priority.");
1459
1460 #define OS_GETPRIORITY_METHODDEF \
1461 {"getpriority", _PyCFunction_CAST(os_getpriority), METH_FASTCALL|METH_KEYWORDS, os_getpriority__doc__},
1462
1463 static PyObject *
1464 os_getpriority_impl(PyObject *module, int which, int who);
1465
1466 static PyObject *
os_getpriority(PyObject * module,PyObject * const * args,Py_ssize_t nargs,PyObject * kwnames)1467 os_getpriority(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames)
1468 {
1469 PyObject *return_value = NULL;
1470 static const char * const _keywords[] = {"which", "who", NULL};
1471 static _PyArg_Parser _parser = {NULL, _keywords, "getpriority", 0};
1472 PyObject *argsbuf[2];
1473 int which;
1474 int who;
1475
1476 args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 2, 2, 0, argsbuf);
1477 if (!args) {
1478 goto exit;
1479 }
1480 which = _PyLong_AsInt(args[0]);
1481 if (which == -1 && PyErr_Occurred()) {
1482 goto exit;
1483 }
1484 who = _PyLong_AsInt(args[1]);
1485 if (who == -1 && PyErr_Occurred()) {
1486 goto exit;
1487 }
1488 return_value = os_getpriority_impl(module, which, who);
1489
1490 exit:
1491 return return_value;
1492 }
1493
1494 #endif /* defined(HAVE_GETPRIORITY) */
1495
1496 #if defined(HAVE_SETPRIORITY)
1497
1498 PyDoc_STRVAR(os_setpriority__doc__,
1499 "setpriority($module, /, which, who, priority)\n"
1500 "--\n"
1501 "\n"
1502 "Set program scheduling priority.");
1503
1504 #define OS_SETPRIORITY_METHODDEF \
1505 {"setpriority", _PyCFunction_CAST(os_setpriority), METH_FASTCALL|METH_KEYWORDS, os_setpriority__doc__},
1506
1507 static PyObject *
1508 os_setpriority_impl(PyObject *module, int which, int who, int priority);
1509
1510 static PyObject *
os_setpriority(PyObject * module,PyObject * const * args,Py_ssize_t nargs,PyObject * kwnames)1511 os_setpriority(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames)
1512 {
1513 PyObject *return_value = NULL;
1514 static const char * const _keywords[] = {"which", "who", "priority", NULL};
1515 static _PyArg_Parser _parser = {NULL, _keywords, "setpriority", 0};
1516 PyObject *argsbuf[3];
1517 int which;
1518 int who;
1519 int priority;
1520
1521 args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 3, 3, 0, argsbuf);
1522 if (!args) {
1523 goto exit;
1524 }
1525 which = _PyLong_AsInt(args[0]);
1526 if (which == -1 && PyErr_Occurred()) {
1527 goto exit;
1528 }
1529 who = _PyLong_AsInt(args[1]);
1530 if (who == -1 && PyErr_Occurred()) {
1531 goto exit;
1532 }
1533 priority = _PyLong_AsInt(args[2]);
1534 if (priority == -1 && PyErr_Occurred()) {
1535 goto exit;
1536 }
1537 return_value = os_setpriority_impl(module, which, who, priority);
1538
1539 exit:
1540 return return_value;
1541 }
1542
1543 #endif /* defined(HAVE_SETPRIORITY) */
1544
1545 PyDoc_STRVAR(os_rename__doc__,
1546 "rename($module, /, src, dst, *, src_dir_fd=None, dst_dir_fd=None)\n"
1547 "--\n"
1548 "\n"
1549 "Rename a file or directory.\n"
1550 "\n"
1551 "If either src_dir_fd or dst_dir_fd is not None, it should be a file\n"
1552 " descriptor open to a directory, and the respective path string (src or dst)\n"
1553 " should be relative; the path will then be relative to that directory.\n"
1554 "src_dir_fd and dst_dir_fd, may not be implemented on your platform.\n"
1555 " If they are unavailable, using them will raise a NotImplementedError.");
1556
1557 #define OS_RENAME_METHODDEF \
1558 {"rename", _PyCFunction_CAST(os_rename), METH_FASTCALL|METH_KEYWORDS, os_rename__doc__},
1559
1560 static PyObject *
1561 os_rename_impl(PyObject *module, path_t *src, path_t *dst, int src_dir_fd,
1562 int dst_dir_fd);
1563
1564 static PyObject *
os_rename(PyObject * module,PyObject * const * args,Py_ssize_t nargs,PyObject * kwnames)1565 os_rename(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames)
1566 {
1567 PyObject *return_value = NULL;
1568 static const char * const _keywords[] = {"src", "dst", "src_dir_fd", "dst_dir_fd", NULL};
1569 static _PyArg_Parser _parser = {NULL, _keywords, "rename", 0};
1570 PyObject *argsbuf[4];
1571 Py_ssize_t noptargs = nargs + (kwnames ? PyTuple_GET_SIZE(kwnames) : 0) - 2;
1572 path_t src = PATH_T_INITIALIZE("rename", "src", 0, 0);
1573 path_t dst = PATH_T_INITIALIZE("rename", "dst", 0, 0);
1574 int src_dir_fd = DEFAULT_DIR_FD;
1575 int dst_dir_fd = DEFAULT_DIR_FD;
1576
1577 args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 2, 2, 0, argsbuf);
1578 if (!args) {
1579 goto exit;
1580 }
1581 if (!path_converter(args[0], &src)) {
1582 goto exit;
1583 }
1584 if (!path_converter(args[1], &dst)) {
1585 goto exit;
1586 }
1587 if (!noptargs) {
1588 goto skip_optional_kwonly;
1589 }
1590 if (args[2]) {
1591 if (!dir_fd_converter(args[2], &src_dir_fd)) {
1592 goto exit;
1593 }
1594 if (!--noptargs) {
1595 goto skip_optional_kwonly;
1596 }
1597 }
1598 if (!dir_fd_converter(args[3], &dst_dir_fd)) {
1599 goto exit;
1600 }
1601 skip_optional_kwonly:
1602 return_value = os_rename_impl(module, &src, &dst, src_dir_fd, dst_dir_fd);
1603
1604 exit:
1605 /* Cleanup for src */
1606 path_cleanup(&src);
1607 /* Cleanup for dst */
1608 path_cleanup(&dst);
1609
1610 return return_value;
1611 }
1612
1613 PyDoc_STRVAR(os_replace__doc__,
1614 "replace($module, /, src, dst, *, src_dir_fd=None, dst_dir_fd=None)\n"
1615 "--\n"
1616 "\n"
1617 "Rename a file or directory, overwriting the destination.\n"
1618 "\n"
1619 "If either src_dir_fd or dst_dir_fd is not None, it should be a file\n"
1620 " descriptor open to a directory, and the respective path string (src or dst)\n"
1621 " should be relative; the path will then be relative to that directory.\n"
1622 "src_dir_fd and dst_dir_fd, may not be implemented on your platform.\n"
1623 " If they are unavailable, using them will raise a NotImplementedError.");
1624
1625 #define OS_REPLACE_METHODDEF \
1626 {"replace", _PyCFunction_CAST(os_replace), METH_FASTCALL|METH_KEYWORDS, os_replace__doc__},
1627
1628 static PyObject *
1629 os_replace_impl(PyObject *module, path_t *src, path_t *dst, int src_dir_fd,
1630 int dst_dir_fd);
1631
1632 static PyObject *
os_replace(PyObject * module,PyObject * const * args,Py_ssize_t nargs,PyObject * kwnames)1633 os_replace(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames)
1634 {
1635 PyObject *return_value = NULL;
1636 static const char * const _keywords[] = {"src", "dst", "src_dir_fd", "dst_dir_fd", NULL};
1637 static _PyArg_Parser _parser = {NULL, _keywords, "replace", 0};
1638 PyObject *argsbuf[4];
1639 Py_ssize_t noptargs = nargs + (kwnames ? PyTuple_GET_SIZE(kwnames) : 0) - 2;
1640 path_t src = PATH_T_INITIALIZE("replace", "src", 0, 0);
1641 path_t dst = PATH_T_INITIALIZE("replace", "dst", 0, 0);
1642 int src_dir_fd = DEFAULT_DIR_FD;
1643 int dst_dir_fd = DEFAULT_DIR_FD;
1644
1645 args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 2, 2, 0, argsbuf);
1646 if (!args) {
1647 goto exit;
1648 }
1649 if (!path_converter(args[0], &src)) {
1650 goto exit;
1651 }
1652 if (!path_converter(args[1], &dst)) {
1653 goto exit;
1654 }
1655 if (!noptargs) {
1656 goto skip_optional_kwonly;
1657 }
1658 if (args[2]) {
1659 if (!dir_fd_converter(args[2], &src_dir_fd)) {
1660 goto exit;
1661 }
1662 if (!--noptargs) {
1663 goto skip_optional_kwonly;
1664 }
1665 }
1666 if (!dir_fd_converter(args[3], &dst_dir_fd)) {
1667 goto exit;
1668 }
1669 skip_optional_kwonly:
1670 return_value = os_replace_impl(module, &src, &dst, src_dir_fd, dst_dir_fd);
1671
1672 exit:
1673 /* Cleanup for src */
1674 path_cleanup(&src);
1675 /* Cleanup for dst */
1676 path_cleanup(&dst);
1677
1678 return return_value;
1679 }
1680
1681 PyDoc_STRVAR(os_rmdir__doc__,
1682 "rmdir($module, /, path, *, dir_fd=None)\n"
1683 "--\n"
1684 "\n"
1685 "Remove a directory.\n"
1686 "\n"
1687 "If dir_fd is not None, it should be a file descriptor open to a directory,\n"
1688 " and path should be relative; path will then be relative to that directory.\n"
1689 "dir_fd may not be implemented on your platform.\n"
1690 " If it is unavailable, using it will raise a NotImplementedError.");
1691
1692 #define OS_RMDIR_METHODDEF \
1693 {"rmdir", _PyCFunction_CAST(os_rmdir), METH_FASTCALL|METH_KEYWORDS, os_rmdir__doc__},
1694
1695 static PyObject *
1696 os_rmdir_impl(PyObject *module, path_t *path, int dir_fd);
1697
1698 static PyObject *
os_rmdir(PyObject * module,PyObject * const * args,Py_ssize_t nargs,PyObject * kwnames)1699 os_rmdir(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames)
1700 {
1701 PyObject *return_value = NULL;
1702 static const char * const _keywords[] = {"path", "dir_fd", NULL};
1703 static _PyArg_Parser _parser = {NULL, _keywords, "rmdir", 0};
1704 PyObject *argsbuf[2];
1705 Py_ssize_t noptargs = nargs + (kwnames ? PyTuple_GET_SIZE(kwnames) : 0) - 1;
1706 path_t path = PATH_T_INITIALIZE("rmdir", "path", 0, 0);
1707 int dir_fd = DEFAULT_DIR_FD;
1708
1709 args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 1, 1, 0, argsbuf);
1710 if (!args) {
1711 goto exit;
1712 }
1713 if (!path_converter(args[0], &path)) {
1714 goto exit;
1715 }
1716 if (!noptargs) {
1717 goto skip_optional_kwonly;
1718 }
1719 if (!UNLINKAT_DIR_FD_CONVERTER(args[1], &dir_fd)) {
1720 goto exit;
1721 }
1722 skip_optional_kwonly:
1723 return_value = os_rmdir_impl(module, &path, dir_fd);
1724
1725 exit:
1726 /* Cleanup for path */
1727 path_cleanup(&path);
1728
1729 return return_value;
1730 }
1731
1732 #if defined(HAVE_SYSTEM) && defined(MS_WINDOWS)
1733
1734 PyDoc_STRVAR(os_system__doc__,
1735 "system($module, /, command)\n"
1736 "--\n"
1737 "\n"
1738 "Execute the command in a subshell.");
1739
1740 #define OS_SYSTEM_METHODDEF \
1741 {"system", _PyCFunction_CAST(os_system), METH_FASTCALL|METH_KEYWORDS, os_system__doc__},
1742
1743 static long
1744 os_system_impl(PyObject *module, const Py_UNICODE *command);
1745
1746 static PyObject *
os_system(PyObject * module,PyObject * const * args,Py_ssize_t nargs,PyObject * kwnames)1747 os_system(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames)
1748 {
1749 PyObject *return_value = NULL;
1750 static const char * const _keywords[] = {"command", NULL};
1751 static _PyArg_Parser _parser = {NULL, _keywords, "system", 0};
1752 PyObject *argsbuf[1];
1753 const Py_UNICODE *command = NULL;
1754 long _return_value;
1755
1756 args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 1, 1, 0, argsbuf);
1757 if (!args) {
1758 goto exit;
1759 }
1760 if (!PyUnicode_Check(args[0])) {
1761 _PyArg_BadArgument("system", "argument 'command'", "str", args[0]);
1762 goto exit;
1763 }
1764 #if USE_UNICODE_WCHAR_CACHE
1765 command = _PyUnicode_AsUnicode(args[0]);
1766 #else /* USE_UNICODE_WCHAR_CACHE */
1767 command = PyUnicode_AsWideCharString(args[0], NULL);
1768 #endif /* USE_UNICODE_WCHAR_CACHE */
1769 if (command == NULL) {
1770 goto exit;
1771 }
1772 _return_value = os_system_impl(module, command);
1773 if ((_return_value == -1) && PyErr_Occurred()) {
1774 goto exit;
1775 }
1776 return_value = PyLong_FromLong(_return_value);
1777
1778 exit:
1779 /* Cleanup for command */
1780 #if !USE_UNICODE_WCHAR_CACHE
1781 PyMem_Free((void *)command);
1782 #endif /* USE_UNICODE_WCHAR_CACHE */
1783
1784 return return_value;
1785 }
1786
1787 #endif /* defined(HAVE_SYSTEM) && defined(MS_WINDOWS) */
1788
1789 #if defined(HAVE_SYSTEM) && !defined(MS_WINDOWS)
1790
1791 PyDoc_STRVAR(os_system__doc__,
1792 "system($module, /, command)\n"
1793 "--\n"
1794 "\n"
1795 "Execute the command in a subshell.");
1796
1797 #define OS_SYSTEM_METHODDEF \
1798 {"system", _PyCFunction_CAST(os_system), METH_FASTCALL|METH_KEYWORDS, os_system__doc__},
1799
1800 static long
1801 os_system_impl(PyObject *module, PyObject *command);
1802
1803 static PyObject *
os_system(PyObject * module,PyObject * const * args,Py_ssize_t nargs,PyObject * kwnames)1804 os_system(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames)
1805 {
1806 PyObject *return_value = NULL;
1807 static const char * const _keywords[] = {"command", NULL};
1808 static _PyArg_Parser _parser = {NULL, _keywords, "system", 0};
1809 PyObject *argsbuf[1];
1810 PyObject *command = NULL;
1811 long _return_value;
1812
1813 args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 1, 1, 0, argsbuf);
1814 if (!args) {
1815 goto exit;
1816 }
1817 if (!PyUnicode_FSConverter(args[0], &command)) {
1818 goto exit;
1819 }
1820 _return_value = os_system_impl(module, command);
1821 if ((_return_value == -1) && PyErr_Occurred()) {
1822 goto exit;
1823 }
1824 return_value = PyLong_FromLong(_return_value);
1825
1826 exit:
1827 /* Cleanup for command */
1828 Py_XDECREF(command);
1829
1830 return return_value;
1831 }
1832
1833 #endif /* defined(HAVE_SYSTEM) && !defined(MS_WINDOWS) */
1834
1835 #if defined(HAVE_UMASK)
1836
1837 PyDoc_STRVAR(os_umask__doc__,
1838 "umask($module, mask, /)\n"
1839 "--\n"
1840 "\n"
1841 "Set the current numeric umask and return the previous umask.");
1842
1843 #define OS_UMASK_METHODDEF \
1844 {"umask", (PyCFunction)os_umask, METH_O, os_umask__doc__},
1845
1846 static PyObject *
1847 os_umask_impl(PyObject *module, int mask);
1848
1849 static PyObject *
os_umask(PyObject * module,PyObject * arg)1850 os_umask(PyObject *module, PyObject *arg)
1851 {
1852 PyObject *return_value = NULL;
1853 int mask;
1854
1855 mask = _PyLong_AsInt(arg);
1856 if (mask == -1 && PyErr_Occurred()) {
1857 goto exit;
1858 }
1859 return_value = os_umask_impl(module, mask);
1860
1861 exit:
1862 return return_value;
1863 }
1864
1865 #endif /* defined(HAVE_UMASK) */
1866
1867 PyDoc_STRVAR(os_unlink__doc__,
1868 "unlink($module, /, path, *, dir_fd=None)\n"
1869 "--\n"
1870 "\n"
1871 "Remove a file (same as remove()).\n"
1872 "\n"
1873 "If dir_fd is not None, it should be a file descriptor open to a directory,\n"
1874 " and path should be relative; path will then be relative to that directory.\n"
1875 "dir_fd may not be implemented on your platform.\n"
1876 " If it is unavailable, using it will raise a NotImplementedError.");
1877
1878 #define OS_UNLINK_METHODDEF \
1879 {"unlink", _PyCFunction_CAST(os_unlink), METH_FASTCALL|METH_KEYWORDS, os_unlink__doc__},
1880
1881 static PyObject *
1882 os_unlink_impl(PyObject *module, path_t *path, int dir_fd);
1883
1884 static PyObject *
os_unlink(PyObject * module,PyObject * const * args,Py_ssize_t nargs,PyObject * kwnames)1885 os_unlink(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames)
1886 {
1887 PyObject *return_value = NULL;
1888 static const char * const _keywords[] = {"path", "dir_fd", NULL};
1889 static _PyArg_Parser _parser = {NULL, _keywords, "unlink", 0};
1890 PyObject *argsbuf[2];
1891 Py_ssize_t noptargs = nargs + (kwnames ? PyTuple_GET_SIZE(kwnames) : 0) - 1;
1892 path_t path = PATH_T_INITIALIZE("unlink", "path", 0, 0);
1893 int dir_fd = DEFAULT_DIR_FD;
1894
1895 args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 1, 1, 0, argsbuf);
1896 if (!args) {
1897 goto exit;
1898 }
1899 if (!path_converter(args[0], &path)) {
1900 goto exit;
1901 }
1902 if (!noptargs) {
1903 goto skip_optional_kwonly;
1904 }
1905 if (!UNLINKAT_DIR_FD_CONVERTER(args[1], &dir_fd)) {
1906 goto exit;
1907 }
1908 skip_optional_kwonly:
1909 return_value = os_unlink_impl(module, &path, dir_fd);
1910
1911 exit:
1912 /* Cleanup for path */
1913 path_cleanup(&path);
1914
1915 return return_value;
1916 }
1917
1918 PyDoc_STRVAR(os_remove__doc__,
1919 "remove($module, /, path, *, dir_fd=None)\n"
1920 "--\n"
1921 "\n"
1922 "Remove a file (same as unlink()).\n"
1923 "\n"
1924 "If dir_fd is not None, it should be a file descriptor open to a directory,\n"
1925 " and path should be relative; path will then be relative to that directory.\n"
1926 "dir_fd may not be implemented on your platform.\n"
1927 " If it is unavailable, using it will raise a NotImplementedError.");
1928
1929 #define OS_REMOVE_METHODDEF \
1930 {"remove", _PyCFunction_CAST(os_remove), METH_FASTCALL|METH_KEYWORDS, os_remove__doc__},
1931
1932 static PyObject *
1933 os_remove_impl(PyObject *module, path_t *path, int dir_fd);
1934
1935 static PyObject *
os_remove(PyObject * module,PyObject * const * args,Py_ssize_t nargs,PyObject * kwnames)1936 os_remove(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames)
1937 {
1938 PyObject *return_value = NULL;
1939 static const char * const _keywords[] = {"path", "dir_fd", NULL};
1940 static _PyArg_Parser _parser = {NULL, _keywords, "remove", 0};
1941 PyObject *argsbuf[2];
1942 Py_ssize_t noptargs = nargs + (kwnames ? PyTuple_GET_SIZE(kwnames) : 0) - 1;
1943 path_t path = PATH_T_INITIALIZE("remove", "path", 0, 0);
1944 int dir_fd = DEFAULT_DIR_FD;
1945
1946 args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 1, 1, 0, argsbuf);
1947 if (!args) {
1948 goto exit;
1949 }
1950 if (!path_converter(args[0], &path)) {
1951 goto exit;
1952 }
1953 if (!noptargs) {
1954 goto skip_optional_kwonly;
1955 }
1956 if (!UNLINKAT_DIR_FD_CONVERTER(args[1], &dir_fd)) {
1957 goto exit;
1958 }
1959 skip_optional_kwonly:
1960 return_value = os_remove_impl(module, &path, dir_fd);
1961
1962 exit:
1963 /* Cleanup for path */
1964 path_cleanup(&path);
1965
1966 return return_value;
1967 }
1968
1969 #if defined(HAVE_UNAME)
1970
1971 PyDoc_STRVAR(os_uname__doc__,
1972 "uname($module, /)\n"
1973 "--\n"
1974 "\n"
1975 "Return an object identifying the current operating system.\n"
1976 "\n"
1977 "The object behaves like a named tuple with the following fields:\n"
1978 " (sysname, nodename, release, version, machine)");
1979
1980 #define OS_UNAME_METHODDEF \
1981 {"uname", (PyCFunction)os_uname, METH_NOARGS, os_uname__doc__},
1982
1983 static PyObject *
1984 os_uname_impl(PyObject *module);
1985
1986 static PyObject *
os_uname(PyObject * module,PyObject * Py_UNUSED (ignored))1987 os_uname(PyObject *module, PyObject *Py_UNUSED(ignored))
1988 {
1989 return os_uname_impl(module);
1990 }
1991
1992 #endif /* defined(HAVE_UNAME) */
1993
1994 PyDoc_STRVAR(os_utime__doc__,
1995 "utime($module, /, path, times=None, *, ns=<unrepresentable>,\n"
1996 " dir_fd=None, follow_symlinks=True)\n"
1997 "--\n"
1998 "\n"
1999 "Set the access and modified time of path.\n"
2000 "\n"
2001 "path may always be specified as a string.\n"
2002 "On some platforms, path may also be specified as an open file descriptor.\n"
2003 " If this functionality is unavailable, using it raises an exception.\n"
2004 "\n"
2005 "If times is not None, it must be a tuple (atime, mtime);\n"
2006 " atime and mtime should be expressed as float seconds since the epoch.\n"
2007 "If ns is specified, it must be a tuple (atime_ns, mtime_ns);\n"
2008 " atime_ns and mtime_ns should be expressed as integer nanoseconds\n"
2009 " since the epoch.\n"
2010 "If times is None and ns is unspecified, utime uses the current time.\n"
2011 "Specifying tuples for both times and ns is an error.\n"
2012 "\n"
2013 "If dir_fd is not None, it should be a file descriptor open to a directory,\n"
2014 " and path should be relative; path will then be relative to that directory.\n"
2015 "If follow_symlinks is False, and the last element of the path is a symbolic\n"
2016 " link, utime will modify the symbolic link itself instead of the file the\n"
2017 " link points to.\n"
2018 "It is an error to use dir_fd or follow_symlinks when specifying path\n"
2019 " as an open file descriptor.\n"
2020 "dir_fd and follow_symlinks may not be available on your platform.\n"
2021 " If they are unavailable, using them will raise a NotImplementedError.");
2022
2023 #define OS_UTIME_METHODDEF \
2024 {"utime", _PyCFunction_CAST(os_utime), METH_FASTCALL|METH_KEYWORDS, os_utime__doc__},
2025
2026 static PyObject *
2027 os_utime_impl(PyObject *module, path_t *path, PyObject *times, PyObject *ns,
2028 int dir_fd, int follow_symlinks);
2029
2030 static PyObject *
os_utime(PyObject * module,PyObject * const * args,Py_ssize_t nargs,PyObject * kwnames)2031 os_utime(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames)
2032 {
2033 PyObject *return_value = NULL;
2034 static const char * const _keywords[] = {"path", "times", "ns", "dir_fd", "follow_symlinks", NULL};
2035 static _PyArg_Parser _parser = {NULL, _keywords, "utime", 0};
2036 PyObject *argsbuf[5];
2037 Py_ssize_t noptargs = nargs + (kwnames ? PyTuple_GET_SIZE(kwnames) : 0) - 1;
2038 path_t path = PATH_T_INITIALIZE("utime", "path", 0, PATH_UTIME_HAVE_FD);
2039 PyObject *times = Py_None;
2040 PyObject *ns = NULL;
2041 int dir_fd = DEFAULT_DIR_FD;
2042 int follow_symlinks = 1;
2043
2044 args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 1, 2, 0, argsbuf);
2045 if (!args) {
2046 goto exit;
2047 }
2048 if (!path_converter(args[0], &path)) {
2049 goto exit;
2050 }
2051 if (!noptargs) {
2052 goto skip_optional_pos;
2053 }
2054 if (args[1]) {
2055 times = args[1];
2056 if (!--noptargs) {
2057 goto skip_optional_pos;
2058 }
2059 }
2060 skip_optional_pos:
2061 if (!noptargs) {
2062 goto skip_optional_kwonly;
2063 }
2064 if (args[2]) {
2065 ns = args[2];
2066 if (!--noptargs) {
2067 goto skip_optional_kwonly;
2068 }
2069 }
2070 if (args[3]) {
2071 if (!FUTIMENSAT_DIR_FD_CONVERTER(args[3], &dir_fd)) {
2072 goto exit;
2073 }
2074 if (!--noptargs) {
2075 goto skip_optional_kwonly;
2076 }
2077 }
2078 follow_symlinks = PyObject_IsTrue(args[4]);
2079 if (follow_symlinks < 0) {
2080 goto exit;
2081 }
2082 skip_optional_kwonly:
2083 return_value = os_utime_impl(module, &path, times, ns, dir_fd, follow_symlinks);
2084
2085 exit:
2086 /* Cleanup for path */
2087 path_cleanup(&path);
2088
2089 return return_value;
2090 }
2091
2092 PyDoc_STRVAR(os__exit__doc__,
2093 "_exit($module, /, status)\n"
2094 "--\n"
2095 "\n"
2096 "Exit to the system with specified status, without normal exit processing.");
2097
2098 #define OS__EXIT_METHODDEF \
2099 {"_exit", _PyCFunction_CAST(os__exit), METH_FASTCALL|METH_KEYWORDS, os__exit__doc__},
2100
2101 static PyObject *
2102 os__exit_impl(PyObject *module, int status);
2103
2104 static PyObject *
os__exit(PyObject * module,PyObject * const * args,Py_ssize_t nargs,PyObject * kwnames)2105 os__exit(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames)
2106 {
2107 PyObject *return_value = NULL;
2108 static const char * const _keywords[] = {"status", NULL};
2109 static _PyArg_Parser _parser = {NULL, _keywords, "_exit", 0};
2110 PyObject *argsbuf[1];
2111 int status;
2112
2113 args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 1, 1, 0, argsbuf);
2114 if (!args) {
2115 goto exit;
2116 }
2117 status = _PyLong_AsInt(args[0]);
2118 if (status == -1 && PyErr_Occurred()) {
2119 goto exit;
2120 }
2121 return_value = os__exit_impl(module, status);
2122
2123 exit:
2124 return return_value;
2125 }
2126
2127 #if defined(HAVE_EXECV)
2128
2129 PyDoc_STRVAR(os_execv__doc__,
2130 "execv($module, path, argv, /)\n"
2131 "--\n"
2132 "\n"
2133 "Execute an executable path with arguments, replacing current process.\n"
2134 "\n"
2135 " path\n"
2136 " Path of executable file.\n"
2137 " argv\n"
2138 " Tuple or list of strings.");
2139
2140 #define OS_EXECV_METHODDEF \
2141 {"execv", _PyCFunction_CAST(os_execv), METH_FASTCALL, os_execv__doc__},
2142
2143 static PyObject *
2144 os_execv_impl(PyObject *module, path_t *path, PyObject *argv);
2145
2146 static PyObject *
os_execv(PyObject * module,PyObject * const * args,Py_ssize_t nargs)2147 os_execv(PyObject *module, PyObject *const *args, Py_ssize_t nargs)
2148 {
2149 PyObject *return_value = NULL;
2150 path_t path = PATH_T_INITIALIZE("execv", "path", 0, 0);
2151 PyObject *argv;
2152
2153 if (!_PyArg_CheckPositional("execv", nargs, 2, 2)) {
2154 goto exit;
2155 }
2156 if (!path_converter(args[0], &path)) {
2157 goto exit;
2158 }
2159 argv = args[1];
2160 return_value = os_execv_impl(module, &path, argv);
2161
2162 exit:
2163 /* Cleanup for path */
2164 path_cleanup(&path);
2165
2166 return return_value;
2167 }
2168
2169 #endif /* defined(HAVE_EXECV) */
2170
2171 #if defined(HAVE_EXECV)
2172
2173 PyDoc_STRVAR(os_execve__doc__,
2174 "execve($module, /, path, argv, env)\n"
2175 "--\n"
2176 "\n"
2177 "Execute an executable path with arguments, replacing current process.\n"
2178 "\n"
2179 " path\n"
2180 " Path of executable file.\n"
2181 " argv\n"
2182 " Tuple or list of strings.\n"
2183 " env\n"
2184 " Dictionary of strings mapping to strings.");
2185
2186 #define OS_EXECVE_METHODDEF \
2187 {"execve", _PyCFunction_CAST(os_execve), METH_FASTCALL|METH_KEYWORDS, os_execve__doc__},
2188
2189 static PyObject *
2190 os_execve_impl(PyObject *module, path_t *path, PyObject *argv, PyObject *env);
2191
2192 static PyObject *
os_execve(PyObject * module,PyObject * const * args,Py_ssize_t nargs,PyObject * kwnames)2193 os_execve(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames)
2194 {
2195 PyObject *return_value = NULL;
2196 static const char * const _keywords[] = {"path", "argv", "env", NULL};
2197 static _PyArg_Parser _parser = {NULL, _keywords, "execve", 0};
2198 PyObject *argsbuf[3];
2199 path_t path = PATH_T_INITIALIZE("execve", "path", 0, PATH_HAVE_FEXECVE);
2200 PyObject *argv;
2201 PyObject *env;
2202
2203 args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 3, 3, 0, argsbuf);
2204 if (!args) {
2205 goto exit;
2206 }
2207 if (!path_converter(args[0], &path)) {
2208 goto exit;
2209 }
2210 argv = args[1];
2211 env = args[2];
2212 return_value = os_execve_impl(module, &path, argv, env);
2213
2214 exit:
2215 /* Cleanup for path */
2216 path_cleanup(&path);
2217
2218 return return_value;
2219 }
2220
2221 #endif /* defined(HAVE_EXECV) */
2222
2223 #if defined(HAVE_POSIX_SPAWN)
2224
2225 PyDoc_STRVAR(os_posix_spawn__doc__,
2226 "posix_spawn($module, path, argv, env, /, *, file_actions=(),\n"
2227 " setpgroup=<unrepresentable>, resetids=False, setsid=False,\n"
2228 " setsigmask=(), setsigdef=(), scheduler=<unrepresentable>)\n"
2229 "--\n"
2230 "\n"
2231 "Execute the program specified by path in a new process.\n"
2232 "\n"
2233 " path\n"
2234 " Path of executable file.\n"
2235 " argv\n"
2236 " Tuple or list of strings.\n"
2237 " env\n"
2238 " Dictionary of strings mapping to strings.\n"
2239 " file_actions\n"
2240 " A sequence of file action tuples.\n"
2241 " setpgroup\n"
2242 " The pgroup to use with the POSIX_SPAWN_SETPGROUP flag.\n"
2243 " resetids\n"
2244 " If the value is `true` the POSIX_SPAWN_RESETIDS will be activated.\n"
2245 " setsid\n"
2246 " If the value is `true` the POSIX_SPAWN_SETSID or POSIX_SPAWN_SETSID_NP will be activated.\n"
2247 " setsigmask\n"
2248 " The sigmask to use with the POSIX_SPAWN_SETSIGMASK flag.\n"
2249 " setsigdef\n"
2250 " The sigmask to use with the POSIX_SPAWN_SETSIGDEF flag.\n"
2251 " scheduler\n"
2252 " A tuple with the scheduler policy (optional) and parameters.");
2253
2254 #define OS_POSIX_SPAWN_METHODDEF \
2255 {"posix_spawn", _PyCFunction_CAST(os_posix_spawn), METH_FASTCALL|METH_KEYWORDS, os_posix_spawn__doc__},
2256
2257 static PyObject *
2258 os_posix_spawn_impl(PyObject *module, path_t *path, PyObject *argv,
2259 PyObject *env, PyObject *file_actions,
2260 PyObject *setpgroup, int resetids, int setsid,
2261 PyObject *setsigmask, PyObject *setsigdef,
2262 PyObject *scheduler);
2263
2264 static PyObject *
os_posix_spawn(PyObject * module,PyObject * const * args,Py_ssize_t nargs,PyObject * kwnames)2265 os_posix_spawn(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames)
2266 {
2267 PyObject *return_value = NULL;
2268 static const char * const _keywords[] = {"", "", "", "file_actions", "setpgroup", "resetids", "setsid", "setsigmask", "setsigdef", "scheduler", NULL};
2269 static _PyArg_Parser _parser = {NULL, _keywords, "posix_spawn", 0};
2270 PyObject *argsbuf[10];
2271 Py_ssize_t noptargs = nargs + (kwnames ? PyTuple_GET_SIZE(kwnames) : 0) - 3;
2272 path_t path = PATH_T_INITIALIZE("posix_spawn", "path", 0, 0);
2273 PyObject *argv;
2274 PyObject *env;
2275 PyObject *file_actions = NULL;
2276 PyObject *setpgroup = NULL;
2277 int resetids = 0;
2278 int setsid = 0;
2279 PyObject *setsigmask = NULL;
2280 PyObject *setsigdef = NULL;
2281 PyObject *scheduler = NULL;
2282
2283 args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 3, 3, 0, argsbuf);
2284 if (!args) {
2285 goto exit;
2286 }
2287 if (!path_converter(args[0], &path)) {
2288 goto exit;
2289 }
2290 argv = args[1];
2291 env = args[2];
2292 if (!noptargs) {
2293 goto skip_optional_kwonly;
2294 }
2295 if (args[3]) {
2296 file_actions = args[3];
2297 if (!--noptargs) {
2298 goto skip_optional_kwonly;
2299 }
2300 }
2301 if (args[4]) {
2302 setpgroup = args[4];
2303 if (!--noptargs) {
2304 goto skip_optional_kwonly;
2305 }
2306 }
2307 if (args[5]) {
2308 resetids = _PyLong_AsInt(args[5]);
2309 if (resetids == -1 && PyErr_Occurred()) {
2310 goto exit;
2311 }
2312 if (!--noptargs) {
2313 goto skip_optional_kwonly;
2314 }
2315 }
2316 if (args[6]) {
2317 setsid = _PyLong_AsInt(args[6]);
2318 if (setsid == -1 && PyErr_Occurred()) {
2319 goto exit;
2320 }
2321 if (!--noptargs) {
2322 goto skip_optional_kwonly;
2323 }
2324 }
2325 if (args[7]) {
2326 setsigmask = args[7];
2327 if (!--noptargs) {
2328 goto skip_optional_kwonly;
2329 }
2330 }
2331 if (args[8]) {
2332 setsigdef = args[8];
2333 if (!--noptargs) {
2334 goto skip_optional_kwonly;
2335 }
2336 }
2337 scheduler = args[9];
2338 skip_optional_kwonly:
2339 return_value = os_posix_spawn_impl(module, &path, argv, env, file_actions, setpgroup, resetids, setsid, setsigmask, setsigdef, scheduler);
2340
2341 exit:
2342 /* Cleanup for path */
2343 path_cleanup(&path);
2344
2345 return return_value;
2346 }
2347
2348 #endif /* defined(HAVE_POSIX_SPAWN) */
2349
2350 #if defined(HAVE_POSIX_SPAWNP)
2351
2352 PyDoc_STRVAR(os_posix_spawnp__doc__,
2353 "posix_spawnp($module, path, argv, env, /, *, file_actions=(),\n"
2354 " setpgroup=<unrepresentable>, resetids=False, setsid=False,\n"
2355 " setsigmask=(), setsigdef=(), scheduler=<unrepresentable>)\n"
2356 "--\n"
2357 "\n"
2358 "Execute the program specified by path in a new process.\n"
2359 "\n"
2360 " path\n"
2361 " Path of executable file.\n"
2362 " argv\n"
2363 " Tuple or list of strings.\n"
2364 " env\n"
2365 " Dictionary of strings mapping to strings.\n"
2366 " file_actions\n"
2367 " A sequence of file action tuples.\n"
2368 " setpgroup\n"
2369 " The pgroup to use with the POSIX_SPAWN_SETPGROUP flag.\n"
2370 " resetids\n"
2371 " If the value is `True` the POSIX_SPAWN_RESETIDS will be activated.\n"
2372 " setsid\n"
2373 " If the value is `True` the POSIX_SPAWN_SETSID or POSIX_SPAWN_SETSID_NP will be activated.\n"
2374 " setsigmask\n"
2375 " The sigmask to use with the POSIX_SPAWN_SETSIGMASK flag.\n"
2376 " setsigdef\n"
2377 " The sigmask to use with the POSIX_SPAWN_SETSIGDEF flag.\n"
2378 " scheduler\n"
2379 " A tuple with the scheduler policy (optional) and parameters.");
2380
2381 #define OS_POSIX_SPAWNP_METHODDEF \
2382 {"posix_spawnp", _PyCFunction_CAST(os_posix_spawnp), METH_FASTCALL|METH_KEYWORDS, os_posix_spawnp__doc__},
2383
2384 static PyObject *
2385 os_posix_spawnp_impl(PyObject *module, path_t *path, PyObject *argv,
2386 PyObject *env, PyObject *file_actions,
2387 PyObject *setpgroup, int resetids, int setsid,
2388 PyObject *setsigmask, PyObject *setsigdef,
2389 PyObject *scheduler);
2390
2391 static PyObject *
os_posix_spawnp(PyObject * module,PyObject * const * args,Py_ssize_t nargs,PyObject * kwnames)2392 os_posix_spawnp(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames)
2393 {
2394 PyObject *return_value = NULL;
2395 static const char * const _keywords[] = {"", "", "", "file_actions", "setpgroup", "resetids", "setsid", "setsigmask", "setsigdef", "scheduler", NULL};
2396 static _PyArg_Parser _parser = {NULL, _keywords, "posix_spawnp", 0};
2397 PyObject *argsbuf[10];
2398 Py_ssize_t noptargs = nargs + (kwnames ? PyTuple_GET_SIZE(kwnames) : 0) - 3;
2399 path_t path = PATH_T_INITIALIZE("posix_spawnp", "path", 0, 0);
2400 PyObject *argv;
2401 PyObject *env;
2402 PyObject *file_actions = NULL;
2403 PyObject *setpgroup = NULL;
2404 int resetids = 0;
2405 int setsid = 0;
2406 PyObject *setsigmask = NULL;
2407 PyObject *setsigdef = NULL;
2408 PyObject *scheduler = NULL;
2409
2410 args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 3, 3, 0, argsbuf);
2411 if (!args) {
2412 goto exit;
2413 }
2414 if (!path_converter(args[0], &path)) {
2415 goto exit;
2416 }
2417 argv = args[1];
2418 env = args[2];
2419 if (!noptargs) {
2420 goto skip_optional_kwonly;
2421 }
2422 if (args[3]) {
2423 file_actions = args[3];
2424 if (!--noptargs) {
2425 goto skip_optional_kwonly;
2426 }
2427 }
2428 if (args[4]) {
2429 setpgroup = args[4];
2430 if (!--noptargs) {
2431 goto skip_optional_kwonly;
2432 }
2433 }
2434 if (args[5]) {
2435 resetids = _PyLong_AsInt(args[5]);
2436 if (resetids == -1 && PyErr_Occurred()) {
2437 goto exit;
2438 }
2439 if (!--noptargs) {
2440 goto skip_optional_kwonly;
2441 }
2442 }
2443 if (args[6]) {
2444 setsid = _PyLong_AsInt(args[6]);
2445 if (setsid == -1 && PyErr_Occurred()) {
2446 goto exit;
2447 }
2448 if (!--noptargs) {
2449 goto skip_optional_kwonly;
2450 }
2451 }
2452 if (args[7]) {
2453 setsigmask = args[7];
2454 if (!--noptargs) {
2455 goto skip_optional_kwonly;
2456 }
2457 }
2458 if (args[8]) {
2459 setsigdef = args[8];
2460 if (!--noptargs) {
2461 goto skip_optional_kwonly;
2462 }
2463 }
2464 scheduler = args[9];
2465 skip_optional_kwonly:
2466 return_value = os_posix_spawnp_impl(module, &path, argv, env, file_actions, setpgroup, resetids, setsid, setsigmask, setsigdef, scheduler);
2467
2468 exit:
2469 /* Cleanup for path */
2470 path_cleanup(&path);
2471
2472 return return_value;
2473 }
2474
2475 #endif /* defined(HAVE_POSIX_SPAWNP) */
2476
2477 #if (defined(HAVE_SPAWNV) || defined(HAVE_WSPAWNV) || defined(HAVE_RTPSPAWN))
2478
2479 PyDoc_STRVAR(os_spawnv__doc__,
2480 "spawnv($module, mode, path, argv, /)\n"
2481 "--\n"
2482 "\n"
2483 "Execute the program specified by path in a new process.\n"
2484 "\n"
2485 " mode\n"
2486 " Mode of process creation.\n"
2487 " path\n"
2488 " Path of executable file.\n"
2489 " argv\n"
2490 " Tuple or list of strings.");
2491
2492 #define OS_SPAWNV_METHODDEF \
2493 {"spawnv", _PyCFunction_CAST(os_spawnv), METH_FASTCALL, os_spawnv__doc__},
2494
2495 static PyObject *
2496 os_spawnv_impl(PyObject *module, int mode, path_t *path, PyObject *argv);
2497
2498 static PyObject *
os_spawnv(PyObject * module,PyObject * const * args,Py_ssize_t nargs)2499 os_spawnv(PyObject *module, PyObject *const *args, Py_ssize_t nargs)
2500 {
2501 PyObject *return_value = NULL;
2502 int mode;
2503 path_t path = PATH_T_INITIALIZE("spawnv", "path", 0, 0);
2504 PyObject *argv;
2505
2506 if (!_PyArg_CheckPositional("spawnv", nargs, 3, 3)) {
2507 goto exit;
2508 }
2509 mode = _PyLong_AsInt(args[0]);
2510 if (mode == -1 && PyErr_Occurred()) {
2511 goto exit;
2512 }
2513 if (!path_converter(args[1], &path)) {
2514 goto exit;
2515 }
2516 argv = args[2];
2517 return_value = os_spawnv_impl(module, mode, &path, argv);
2518
2519 exit:
2520 /* Cleanup for path */
2521 path_cleanup(&path);
2522
2523 return return_value;
2524 }
2525
2526 #endif /* (defined(HAVE_SPAWNV) || defined(HAVE_WSPAWNV) || defined(HAVE_RTPSPAWN)) */
2527
2528 #if (defined(HAVE_SPAWNV) || defined(HAVE_WSPAWNV) || defined(HAVE_RTPSPAWN))
2529
2530 PyDoc_STRVAR(os_spawnve__doc__,
2531 "spawnve($module, mode, path, argv, env, /)\n"
2532 "--\n"
2533 "\n"
2534 "Execute the program specified by path in a new process.\n"
2535 "\n"
2536 " mode\n"
2537 " Mode of process creation.\n"
2538 " path\n"
2539 " Path of executable file.\n"
2540 " argv\n"
2541 " Tuple or list of strings.\n"
2542 " env\n"
2543 " Dictionary of strings mapping to strings.");
2544
2545 #define OS_SPAWNVE_METHODDEF \
2546 {"spawnve", _PyCFunction_CAST(os_spawnve), METH_FASTCALL, os_spawnve__doc__},
2547
2548 static PyObject *
2549 os_spawnve_impl(PyObject *module, int mode, path_t *path, PyObject *argv,
2550 PyObject *env);
2551
2552 static PyObject *
os_spawnve(PyObject * module,PyObject * const * args,Py_ssize_t nargs)2553 os_spawnve(PyObject *module, PyObject *const *args, Py_ssize_t nargs)
2554 {
2555 PyObject *return_value = NULL;
2556 int mode;
2557 path_t path = PATH_T_INITIALIZE("spawnve", "path", 0, 0);
2558 PyObject *argv;
2559 PyObject *env;
2560
2561 if (!_PyArg_CheckPositional("spawnve", nargs, 4, 4)) {
2562 goto exit;
2563 }
2564 mode = _PyLong_AsInt(args[0]);
2565 if (mode == -1 && PyErr_Occurred()) {
2566 goto exit;
2567 }
2568 if (!path_converter(args[1], &path)) {
2569 goto exit;
2570 }
2571 argv = args[2];
2572 env = args[3];
2573 return_value = os_spawnve_impl(module, mode, &path, argv, env);
2574
2575 exit:
2576 /* Cleanup for path */
2577 path_cleanup(&path);
2578
2579 return return_value;
2580 }
2581
2582 #endif /* (defined(HAVE_SPAWNV) || defined(HAVE_WSPAWNV) || defined(HAVE_RTPSPAWN)) */
2583
2584 #if defined(HAVE_FORK)
2585
2586 PyDoc_STRVAR(os_register_at_fork__doc__,
2587 "register_at_fork($module, /, *, before=<unrepresentable>,\n"
2588 " after_in_child=<unrepresentable>,\n"
2589 " after_in_parent=<unrepresentable>)\n"
2590 "--\n"
2591 "\n"
2592 "Register callables to be called when forking a new process.\n"
2593 "\n"
2594 " before\n"
2595 " A callable to be called in the parent before the fork() syscall.\n"
2596 " after_in_child\n"
2597 " A callable to be called in the child after fork().\n"
2598 " after_in_parent\n"
2599 " A callable to be called in the parent after fork().\n"
2600 "\n"
2601 "\'before\' callbacks are called in reverse order.\n"
2602 "\'after_in_child\' and \'after_in_parent\' callbacks are called in order.");
2603
2604 #define OS_REGISTER_AT_FORK_METHODDEF \
2605 {"register_at_fork", _PyCFunction_CAST(os_register_at_fork), METH_FASTCALL|METH_KEYWORDS, os_register_at_fork__doc__},
2606
2607 static PyObject *
2608 os_register_at_fork_impl(PyObject *module, PyObject *before,
2609 PyObject *after_in_child, PyObject *after_in_parent);
2610
2611 static PyObject *
os_register_at_fork(PyObject * module,PyObject * const * args,Py_ssize_t nargs,PyObject * kwnames)2612 os_register_at_fork(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames)
2613 {
2614 PyObject *return_value = NULL;
2615 static const char * const _keywords[] = {"before", "after_in_child", "after_in_parent", NULL};
2616 static _PyArg_Parser _parser = {NULL, _keywords, "register_at_fork", 0};
2617 PyObject *argsbuf[3];
2618 Py_ssize_t noptargs = nargs + (kwnames ? PyTuple_GET_SIZE(kwnames) : 0) - 0;
2619 PyObject *before = NULL;
2620 PyObject *after_in_child = NULL;
2621 PyObject *after_in_parent = NULL;
2622
2623 args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 0, 0, 0, argsbuf);
2624 if (!args) {
2625 goto exit;
2626 }
2627 if (!noptargs) {
2628 goto skip_optional_kwonly;
2629 }
2630 if (args[0]) {
2631 before = args[0];
2632 if (!--noptargs) {
2633 goto skip_optional_kwonly;
2634 }
2635 }
2636 if (args[1]) {
2637 after_in_child = args[1];
2638 if (!--noptargs) {
2639 goto skip_optional_kwonly;
2640 }
2641 }
2642 after_in_parent = args[2];
2643 skip_optional_kwonly:
2644 return_value = os_register_at_fork_impl(module, before, after_in_child, after_in_parent);
2645
2646 exit:
2647 return return_value;
2648 }
2649
2650 #endif /* defined(HAVE_FORK) */
2651
2652 #if defined(HAVE_FORK1)
2653
2654 PyDoc_STRVAR(os_fork1__doc__,
2655 "fork1($module, /)\n"
2656 "--\n"
2657 "\n"
2658 "Fork a child process with a single multiplexed (i.e., not bound) thread.\n"
2659 "\n"
2660 "Return 0 to child process and PID of child to parent process.");
2661
2662 #define OS_FORK1_METHODDEF \
2663 {"fork1", (PyCFunction)os_fork1, METH_NOARGS, os_fork1__doc__},
2664
2665 static PyObject *
2666 os_fork1_impl(PyObject *module);
2667
2668 static PyObject *
os_fork1(PyObject * module,PyObject * Py_UNUSED (ignored))2669 os_fork1(PyObject *module, PyObject *Py_UNUSED(ignored))
2670 {
2671 return os_fork1_impl(module);
2672 }
2673
2674 #endif /* defined(HAVE_FORK1) */
2675
2676 #if defined(HAVE_FORK)
2677
2678 PyDoc_STRVAR(os_fork__doc__,
2679 "fork($module, /)\n"
2680 "--\n"
2681 "\n"
2682 "Fork a child process.\n"
2683 "\n"
2684 "Return 0 to child process and PID of child to parent process.");
2685
2686 #define OS_FORK_METHODDEF \
2687 {"fork", (PyCFunction)os_fork, METH_NOARGS, os_fork__doc__},
2688
2689 static PyObject *
2690 os_fork_impl(PyObject *module);
2691
2692 static PyObject *
os_fork(PyObject * module,PyObject * Py_UNUSED (ignored))2693 os_fork(PyObject *module, PyObject *Py_UNUSED(ignored))
2694 {
2695 return os_fork_impl(module);
2696 }
2697
2698 #endif /* defined(HAVE_FORK) */
2699
2700 #if defined(HAVE_SCHED_H) && defined(HAVE_SCHED_GET_PRIORITY_MAX)
2701
2702 PyDoc_STRVAR(os_sched_get_priority_max__doc__,
2703 "sched_get_priority_max($module, /, policy)\n"
2704 "--\n"
2705 "\n"
2706 "Get the maximum scheduling priority for policy.");
2707
2708 #define OS_SCHED_GET_PRIORITY_MAX_METHODDEF \
2709 {"sched_get_priority_max", _PyCFunction_CAST(os_sched_get_priority_max), METH_FASTCALL|METH_KEYWORDS, os_sched_get_priority_max__doc__},
2710
2711 static PyObject *
2712 os_sched_get_priority_max_impl(PyObject *module, int policy);
2713
2714 static PyObject *
os_sched_get_priority_max(PyObject * module,PyObject * const * args,Py_ssize_t nargs,PyObject * kwnames)2715 os_sched_get_priority_max(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames)
2716 {
2717 PyObject *return_value = NULL;
2718 static const char * const _keywords[] = {"policy", NULL};
2719 static _PyArg_Parser _parser = {NULL, _keywords, "sched_get_priority_max", 0};
2720 PyObject *argsbuf[1];
2721 int policy;
2722
2723 args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 1, 1, 0, argsbuf);
2724 if (!args) {
2725 goto exit;
2726 }
2727 policy = _PyLong_AsInt(args[0]);
2728 if (policy == -1 && PyErr_Occurred()) {
2729 goto exit;
2730 }
2731 return_value = os_sched_get_priority_max_impl(module, policy);
2732
2733 exit:
2734 return return_value;
2735 }
2736
2737 #endif /* defined(HAVE_SCHED_H) && defined(HAVE_SCHED_GET_PRIORITY_MAX) */
2738
2739 #if defined(HAVE_SCHED_H) && defined(HAVE_SCHED_GET_PRIORITY_MAX)
2740
2741 PyDoc_STRVAR(os_sched_get_priority_min__doc__,
2742 "sched_get_priority_min($module, /, policy)\n"
2743 "--\n"
2744 "\n"
2745 "Get the minimum scheduling priority for policy.");
2746
2747 #define OS_SCHED_GET_PRIORITY_MIN_METHODDEF \
2748 {"sched_get_priority_min", _PyCFunction_CAST(os_sched_get_priority_min), METH_FASTCALL|METH_KEYWORDS, os_sched_get_priority_min__doc__},
2749
2750 static PyObject *
2751 os_sched_get_priority_min_impl(PyObject *module, int policy);
2752
2753 static PyObject *
os_sched_get_priority_min(PyObject * module,PyObject * const * args,Py_ssize_t nargs,PyObject * kwnames)2754 os_sched_get_priority_min(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames)
2755 {
2756 PyObject *return_value = NULL;
2757 static const char * const _keywords[] = {"policy", NULL};
2758 static _PyArg_Parser _parser = {NULL, _keywords, "sched_get_priority_min", 0};
2759 PyObject *argsbuf[1];
2760 int policy;
2761
2762 args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 1, 1, 0, argsbuf);
2763 if (!args) {
2764 goto exit;
2765 }
2766 policy = _PyLong_AsInt(args[0]);
2767 if (policy == -1 && PyErr_Occurred()) {
2768 goto exit;
2769 }
2770 return_value = os_sched_get_priority_min_impl(module, policy);
2771
2772 exit:
2773 return return_value;
2774 }
2775
2776 #endif /* defined(HAVE_SCHED_H) && defined(HAVE_SCHED_GET_PRIORITY_MAX) */
2777
2778 #if defined(HAVE_SCHED_H) && defined(HAVE_SCHED_SETSCHEDULER)
2779
2780 PyDoc_STRVAR(os_sched_getscheduler__doc__,
2781 "sched_getscheduler($module, pid, /)\n"
2782 "--\n"
2783 "\n"
2784 "Get the scheduling policy for the process identified by pid.\n"
2785 "\n"
2786 "Passing 0 for pid returns the scheduling policy for the calling process.");
2787
2788 #define OS_SCHED_GETSCHEDULER_METHODDEF \
2789 {"sched_getscheduler", (PyCFunction)os_sched_getscheduler, METH_O, os_sched_getscheduler__doc__},
2790
2791 static PyObject *
2792 os_sched_getscheduler_impl(PyObject *module, pid_t pid);
2793
2794 static PyObject *
os_sched_getscheduler(PyObject * module,PyObject * arg)2795 os_sched_getscheduler(PyObject *module, PyObject *arg)
2796 {
2797 PyObject *return_value = NULL;
2798 pid_t pid;
2799
2800 if (!PyArg_Parse(arg, "" _Py_PARSE_PID ":sched_getscheduler", &pid)) {
2801 goto exit;
2802 }
2803 return_value = os_sched_getscheduler_impl(module, pid);
2804
2805 exit:
2806 return return_value;
2807 }
2808
2809 #endif /* defined(HAVE_SCHED_H) && defined(HAVE_SCHED_SETSCHEDULER) */
2810
2811 #if defined(HAVE_SCHED_H) && (defined(HAVE_SCHED_SETPARAM) || defined(HAVE_SCHED_SETSCHEDULER) || defined(POSIX_SPAWN_SETSCHEDULER) || defined(POSIX_SPAWN_SETSCHEDPARAM))
2812
2813 PyDoc_STRVAR(os_sched_param__doc__,
2814 "sched_param(sched_priority)\n"
2815 "--\n"
2816 "\n"
2817 "Currently has only one field: sched_priority\n"
2818 "\n"
2819 " sched_priority\n"
2820 " A scheduling parameter.");
2821
2822 static PyObject *
2823 os_sched_param_impl(PyTypeObject *type, PyObject *sched_priority);
2824
2825 static PyObject *
os_sched_param(PyTypeObject * type,PyObject * args,PyObject * kwargs)2826 os_sched_param(PyTypeObject *type, PyObject *args, PyObject *kwargs)
2827 {
2828 PyObject *return_value = NULL;
2829 static const char * const _keywords[] = {"sched_priority", NULL};
2830 static _PyArg_Parser _parser = {NULL, _keywords, "sched_param", 0};
2831 PyObject *argsbuf[1];
2832 PyObject * const *fastargs;
2833 Py_ssize_t nargs = PyTuple_GET_SIZE(args);
2834 PyObject *sched_priority;
2835
2836 fastargs = _PyArg_UnpackKeywords(_PyTuple_CAST(args)->ob_item, nargs, kwargs, NULL, &_parser, 1, 1, 0, argsbuf);
2837 if (!fastargs) {
2838 goto exit;
2839 }
2840 sched_priority = fastargs[0];
2841 return_value = os_sched_param_impl(type, sched_priority);
2842
2843 exit:
2844 return return_value;
2845 }
2846
2847 #endif /* defined(HAVE_SCHED_H) && (defined(HAVE_SCHED_SETPARAM) || defined(HAVE_SCHED_SETSCHEDULER) || defined(POSIX_SPAWN_SETSCHEDULER) || defined(POSIX_SPAWN_SETSCHEDPARAM)) */
2848
2849 #if defined(HAVE_SCHED_H) && defined(HAVE_SCHED_SETSCHEDULER)
2850
2851 PyDoc_STRVAR(os_sched_setscheduler__doc__,
2852 "sched_setscheduler($module, pid, policy, param, /)\n"
2853 "--\n"
2854 "\n"
2855 "Set the scheduling policy for the process identified by pid.\n"
2856 "\n"
2857 "If pid is 0, the calling process is changed.\n"
2858 "param is an instance of sched_param.");
2859
2860 #define OS_SCHED_SETSCHEDULER_METHODDEF \
2861 {"sched_setscheduler", _PyCFunction_CAST(os_sched_setscheduler), METH_FASTCALL, os_sched_setscheduler__doc__},
2862
2863 static PyObject *
2864 os_sched_setscheduler_impl(PyObject *module, pid_t pid, int policy,
2865 PyObject *param_obj);
2866
2867 static PyObject *
os_sched_setscheduler(PyObject * module,PyObject * const * args,Py_ssize_t nargs)2868 os_sched_setscheduler(PyObject *module, PyObject *const *args, Py_ssize_t nargs)
2869 {
2870 PyObject *return_value = NULL;
2871 pid_t pid;
2872 int policy;
2873 PyObject *param_obj;
2874
2875 if (!_PyArg_ParseStack(args, nargs, "" _Py_PARSE_PID "iO:sched_setscheduler",
2876 &pid, &policy, ¶m_obj)) {
2877 goto exit;
2878 }
2879 return_value = os_sched_setscheduler_impl(module, pid, policy, param_obj);
2880
2881 exit:
2882 return return_value;
2883 }
2884
2885 #endif /* defined(HAVE_SCHED_H) && defined(HAVE_SCHED_SETSCHEDULER) */
2886
2887 #if defined(HAVE_SCHED_H) && defined(HAVE_SCHED_SETPARAM)
2888
2889 PyDoc_STRVAR(os_sched_getparam__doc__,
2890 "sched_getparam($module, pid, /)\n"
2891 "--\n"
2892 "\n"
2893 "Returns scheduling parameters for the process identified by pid.\n"
2894 "\n"
2895 "If pid is 0, returns parameters for the calling process.\n"
2896 "Return value is an instance of sched_param.");
2897
2898 #define OS_SCHED_GETPARAM_METHODDEF \
2899 {"sched_getparam", (PyCFunction)os_sched_getparam, METH_O, os_sched_getparam__doc__},
2900
2901 static PyObject *
2902 os_sched_getparam_impl(PyObject *module, pid_t pid);
2903
2904 static PyObject *
os_sched_getparam(PyObject * module,PyObject * arg)2905 os_sched_getparam(PyObject *module, PyObject *arg)
2906 {
2907 PyObject *return_value = NULL;
2908 pid_t pid;
2909
2910 if (!PyArg_Parse(arg, "" _Py_PARSE_PID ":sched_getparam", &pid)) {
2911 goto exit;
2912 }
2913 return_value = os_sched_getparam_impl(module, pid);
2914
2915 exit:
2916 return return_value;
2917 }
2918
2919 #endif /* defined(HAVE_SCHED_H) && defined(HAVE_SCHED_SETPARAM) */
2920
2921 #if defined(HAVE_SCHED_H) && defined(HAVE_SCHED_SETPARAM)
2922
2923 PyDoc_STRVAR(os_sched_setparam__doc__,
2924 "sched_setparam($module, pid, param, /)\n"
2925 "--\n"
2926 "\n"
2927 "Set scheduling parameters for the process identified by pid.\n"
2928 "\n"
2929 "If pid is 0, sets parameters for the calling process.\n"
2930 "param should be an instance of sched_param.");
2931
2932 #define OS_SCHED_SETPARAM_METHODDEF \
2933 {"sched_setparam", _PyCFunction_CAST(os_sched_setparam), METH_FASTCALL, os_sched_setparam__doc__},
2934
2935 static PyObject *
2936 os_sched_setparam_impl(PyObject *module, pid_t pid, PyObject *param_obj);
2937
2938 static PyObject *
os_sched_setparam(PyObject * module,PyObject * const * args,Py_ssize_t nargs)2939 os_sched_setparam(PyObject *module, PyObject *const *args, Py_ssize_t nargs)
2940 {
2941 PyObject *return_value = NULL;
2942 pid_t pid;
2943 PyObject *param_obj;
2944
2945 if (!_PyArg_ParseStack(args, nargs, "" _Py_PARSE_PID "O:sched_setparam",
2946 &pid, ¶m_obj)) {
2947 goto exit;
2948 }
2949 return_value = os_sched_setparam_impl(module, pid, param_obj);
2950
2951 exit:
2952 return return_value;
2953 }
2954
2955 #endif /* defined(HAVE_SCHED_H) && defined(HAVE_SCHED_SETPARAM) */
2956
2957 #if defined(HAVE_SCHED_H) && defined(HAVE_SCHED_RR_GET_INTERVAL)
2958
2959 PyDoc_STRVAR(os_sched_rr_get_interval__doc__,
2960 "sched_rr_get_interval($module, pid, /)\n"
2961 "--\n"
2962 "\n"
2963 "Return the round-robin quantum for the process identified by pid, in seconds.\n"
2964 "\n"
2965 "Value returned is a float.");
2966
2967 #define OS_SCHED_RR_GET_INTERVAL_METHODDEF \
2968 {"sched_rr_get_interval", (PyCFunction)os_sched_rr_get_interval, METH_O, os_sched_rr_get_interval__doc__},
2969
2970 static double
2971 os_sched_rr_get_interval_impl(PyObject *module, pid_t pid);
2972
2973 static PyObject *
os_sched_rr_get_interval(PyObject * module,PyObject * arg)2974 os_sched_rr_get_interval(PyObject *module, PyObject *arg)
2975 {
2976 PyObject *return_value = NULL;
2977 pid_t pid;
2978 double _return_value;
2979
2980 if (!PyArg_Parse(arg, "" _Py_PARSE_PID ":sched_rr_get_interval", &pid)) {
2981 goto exit;
2982 }
2983 _return_value = os_sched_rr_get_interval_impl(module, pid);
2984 if ((_return_value == -1.0) && PyErr_Occurred()) {
2985 goto exit;
2986 }
2987 return_value = PyFloat_FromDouble(_return_value);
2988
2989 exit:
2990 return return_value;
2991 }
2992
2993 #endif /* defined(HAVE_SCHED_H) && defined(HAVE_SCHED_RR_GET_INTERVAL) */
2994
2995 #if defined(HAVE_SCHED_H)
2996
2997 PyDoc_STRVAR(os_sched_yield__doc__,
2998 "sched_yield($module, /)\n"
2999 "--\n"
3000 "\n"
3001 "Voluntarily relinquish the CPU.");
3002
3003 #define OS_SCHED_YIELD_METHODDEF \
3004 {"sched_yield", (PyCFunction)os_sched_yield, METH_NOARGS, os_sched_yield__doc__},
3005
3006 static PyObject *
3007 os_sched_yield_impl(PyObject *module);
3008
3009 static PyObject *
os_sched_yield(PyObject * module,PyObject * Py_UNUSED (ignored))3010 os_sched_yield(PyObject *module, PyObject *Py_UNUSED(ignored))
3011 {
3012 return os_sched_yield_impl(module);
3013 }
3014
3015 #endif /* defined(HAVE_SCHED_H) */
3016
3017 #if defined(HAVE_SCHED_H) && defined(HAVE_SCHED_SETAFFINITY)
3018
3019 PyDoc_STRVAR(os_sched_setaffinity__doc__,
3020 "sched_setaffinity($module, pid, mask, /)\n"
3021 "--\n"
3022 "\n"
3023 "Set the CPU affinity of the process identified by pid to mask.\n"
3024 "\n"
3025 "mask should be an iterable of integers identifying CPUs.");
3026
3027 #define OS_SCHED_SETAFFINITY_METHODDEF \
3028 {"sched_setaffinity", _PyCFunction_CAST(os_sched_setaffinity), METH_FASTCALL, os_sched_setaffinity__doc__},
3029
3030 static PyObject *
3031 os_sched_setaffinity_impl(PyObject *module, pid_t pid, PyObject *mask);
3032
3033 static PyObject *
os_sched_setaffinity(PyObject * module,PyObject * const * args,Py_ssize_t nargs)3034 os_sched_setaffinity(PyObject *module, PyObject *const *args, Py_ssize_t nargs)
3035 {
3036 PyObject *return_value = NULL;
3037 pid_t pid;
3038 PyObject *mask;
3039
3040 if (!_PyArg_ParseStack(args, nargs, "" _Py_PARSE_PID "O:sched_setaffinity",
3041 &pid, &mask)) {
3042 goto exit;
3043 }
3044 return_value = os_sched_setaffinity_impl(module, pid, mask);
3045
3046 exit:
3047 return return_value;
3048 }
3049
3050 #endif /* defined(HAVE_SCHED_H) && defined(HAVE_SCHED_SETAFFINITY) */
3051
3052 #if defined(HAVE_SCHED_H) && defined(HAVE_SCHED_SETAFFINITY)
3053
3054 PyDoc_STRVAR(os_sched_getaffinity__doc__,
3055 "sched_getaffinity($module, pid, /)\n"
3056 "--\n"
3057 "\n"
3058 "Return the affinity of the process identified by pid (or the current process if zero).\n"
3059 "\n"
3060 "The affinity is returned as a set of CPU identifiers.");
3061
3062 #define OS_SCHED_GETAFFINITY_METHODDEF \
3063 {"sched_getaffinity", (PyCFunction)os_sched_getaffinity, METH_O, os_sched_getaffinity__doc__},
3064
3065 static PyObject *
3066 os_sched_getaffinity_impl(PyObject *module, pid_t pid);
3067
3068 static PyObject *
os_sched_getaffinity(PyObject * module,PyObject * arg)3069 os_sched_getaffinity(PyObject *module, PyObject *arg)
3070 {
3071 PyObject *return_value = NULL;
3072 pid_t pid;
3073
3074 if (!PyArg_Parse(arg, "" _Py_PARSE_PID ":sched_getaffinity", &pid)) {
3075 goto exit;
3076 }
3077 return_value = os_sched_getaffinity_impl(module, pid);
3078
3079 exit:
3080 return return_value;
3081 }
3082
3083 #endif /* defined(HAVE_SCHED_H) && defined(HAVE_SCHED_SETAFFINITY) */
3084
3085 #if (defined(HAVE_OPENPTY) || defined(HAVE__GETPTY) || defined(HAVE_DEV_PTMX))
3086
3087 PyDoc_STRVAR(os_openpty__doc__,
3088 "openpty($module, /)\n"
3089 "--\n"
3090 "\n"
3091 "Open a pseudo-terminal.\n"
3092 "\n"
3093 "Return a tuple of (master_fd, slave_fd) containing open file descriptors\n"
3094 "for both the master and slave ends.");
3095
3096 #define OS_OPENPTY_METHODDEF \
3097 {"openpty", (PyCFunction)os_openpty, METH_NOARGS, os_openpty__doc__},
3098
3099 static PyObject *
3100 os_openpty_impl(PyObject *module);
3101
3102 static PyObject *
os_openpty(PyObject * module,PyObject * Py_UNUSED (ignored))3103 os_openpty(PyObject *module, PyObject *Py_UNUSED(ignored))
3104 {
3105 return os_openpty_impl(module);
3106 }
3107
3108 #endif /* (defined(HAVE_OPENPTY) || defined(HAVE__GETPTY) || defined(HAVE_DEV_PTMX)) */
3109
3110 #if (defined(HAVE_LOGIN_TTY) || defined(HAVE_FALLBACK_LOGIN_TTY))
3111
3112 PyDoc_STRVAR(os_login_tty__doc__,
3113 "login_tty($module, fd, /)\n"
3114 "--\n"
3115 "\n"
3116 "Prepare the tty of which fd is a file descriptor for a new login session.\n"
3117 "\n"
3118 "Make the calling process a session leader; make the tty the\n"
3119 "controlling tty, the stdin, the stdout, and the stderr of the\n"
3120 "calling process; close fd.");
3121
3122 #define OS_LOGIN_TTY_METHODDEF \
3123 {"login_tty", (PyCFunction)os_login_tty, METH_O, os_login_tty__doc__},
3124
3125 static PyObject *
3126 os_login_tty_impl(PyObject *module, int fd);
3127
3128 static PyObject *
os_login_tty(PyObject * module,PyObject * arg)3129 os_login_tty(PyObject *module, PyObject *arg)
3130 {
3131 PyObject *return_value = NULL;
3132 int fd;
3133
3134 if (!_PyLong_FileDescriptor_Converter(arg, &fd)) {
3135 goto exit;
3136 }
3137 return_value = os_login_tty_impl(module, fd);
3138
3139 exit:
3140 return return_value;
3141 }
3142
3143 #endif /* (defined(HAVE_LOGIN_TTY) || defined(HAVE_FALLBACK_LOGIN_TTY)) */
3144
3145 #if defined(HAVE_FORKPTY)
3146
3147 PyDoc_STRVAR(os_forkpty__doc__,
3148 "forkpty($module, /)\n"
3149 "--\n"
3150 "\n"
3151 "Fork a new process with a new pseudo-terminal as controlling tty.\n"
3152 "\n"
3153 "Returns a tuple of (pid, master_fd).\n"
3154 "Like fork(), return pid of 0 to the child process,\n"
3155 "and pid of child to the parent process.\n"
3156 "To both, return fd of newly opened pseudo-terminal.");
3157
3158 #define OS_FORKPTY_METHODDEF \
3159 {"forkpty", (PyCFunction)os_forkpty, METH_NOARGS, os_forkpty__doc__},
3160
3161 static PyObject *
3162 os_forkpty_impl(PyObject *module);
3163
3164 static PyObject *
os_forkpty(PyObject * module,PyObject * Py_UNUSED (ignored))3165 os_forkpty(PyObject *module, PyObject *Py_UNUSED(ignored))
3166 {
3167 return os_forkpty_impl(module);
3168 }
3169
3170 #endif /* defined(HAVE_FORKPTY) */
3171
3172 #if defined(HAVE_GETEGID)
3173
3174 PyDoc_STRVAR(os_getegid__doc__,
3175 "getegid($module, /)\n"
3176 "--\n"
3177 "\n"
3178 "Return the current process\'s effective group id.");
3179
3180 #define OS_GETEGID_METHODDEF \
3181 {"getegid", (PyCFunction)os_getegid, METH_NOARGS, os_getegid__doc__},
3182
3183 static PyObject *
3184 os_getegid_impl(PyObject *module);
3185
3186 static PyObject *
os_getegid(PyObject * module,PyObject * Py_UNUSED (ignored))3187 os_getegid(PyObject *module, PyObject *Py_UNUSED(ignored))
3188 {
3189 return os_getegid_impl(module);
3190 }
3191
3192 #endif /* defined(HAVE_GETEGID) */
3193
3194 #if defined(HAVE_GETEUID)
3195
3196 PyDoc_STRVAR(os_geteuid__doc__,
3197 "geteuid($module, /)\n"
3198 "--\n"
3199 "\n"
3200 "Return the current process\'s effective user id.");
3201
3202 #define OS_GETEUID_METHODDEF \
3203 {"geteuid", (PyCFunction)os_geteuid, METH_NOARGS, os_geteuid__doc__},
3204
3205 static PyObject *
3206 os_geteuid_impl(PyObject *module);
3207
3208 static PyObject *
os_geteuid(PyObject * module,PyObject * Py_UNUSED (ignored))3209 os_geteuid(PyObject *module, PyObject *Py_UNUSED(ignored))
3210 {
3211 return os_geteuid_impl(module);
3212 }
3213
3214 #endif /* defined(HAVE_GETEUID) */
3215
3216 #if defined(HAVE_GETGID)
3217
3218 PyDoc_STRVAR(os_getgid__doc__,
3219 "getgid($module, /)\n"
3220 "--\n"
3221 "\n"
3222 "Return the current process\'s group id.");
3223
3224 #define OS_GETGID_METHODDEF \
3225 {"getgid", (PyCFunction)os_getgid, METH_NOARGS, os_getgid__doc__},
3226
3227 static PyObject *
3228 os_getgid_impl(PyObject *module);
3229
3230 static PyObject *
os_getgid(PyObject * module,PyObject * Py_UNUSED (ignored))3231 os_getgid(PyObject *module, PyObject *Py_UNUSED(ignored))
3232 {
3233 return os_getgid_impl(module);
3234 }
3235
3236 #endif /* defined(HAVE_GETGID) */
3237
3238 #if defined(HAVE_GETPID)
3239
3240 PyDoc_STRVAR(os_getpid__doc__,
3241 "getpid($module, /)\n"
3242 "--\n"
3243 "\n"
3244 "Return the current process id.");
3245
3246 #define OS_GETPID_METHODDEF \
3247 {"getpid", (PyCFunction)os_getpid, METH_NOARGS, os_getpid__doc__},
3248
3249 static PyObject *
3250 os_getpid_impl(PyObject *module);
3251
3252 static PyObject *
os_getpid(PyObject * module,PyObject * Py_UNUSED (ignored))3253 os_getpid(PyObject *module, PyObject *Py_UNUSED(ignored))
3254 {
3255 return os_getpid_impl(module);
3256 }
3257
3258 #endif /* defined(HAVE_GETPID) */
3259
3260 #if defined(HAVE_GETGROUPLIST) && defined(__APPLE__)
3261
3262 PyDoc_STRVAR(os_getgrouplist__doc__,
3263 "getgrouplist($module, user, group, /)\n"
3264 "--\n"
3265 "\n"
3266 "Returns a list of groups to which a user belongs.\n"
3267 "\n"
3268 " user\n"
3269 " username to lookup\n"
3270 " group\n"
3271 " base group id of the user");
3272
3273 #define OS_GETGROUPLIST_METHODDEF \
3274 {"getgrouplist", _PyCFunction_CAST(os_getgrouplist), METH_FASTCALL, os_getgrouplist__doc__},
3275
3276 static PyObject *
3277 os_getgrouplist_impl(PyObject *module, const char *user, int basegid);
3278
3279 static PyObject *
os_getgrouplist(PyObject * module,PyObject * const * args,Py_ssize_t nargs)3280 os_getgrouplist(PyObject *module, PyObject *const *args, Py_ssize_t nargs)
3281 {
3282 PyObject *return_value = NULL;
3283 const char *user;
3284 int basegid;
3285
3286 if (!_PyArg_CheckPositional("getgrouplist", nargs, 2, 2)) {
3287 goto exit;
3288 }
3289 if (!PyUnicode_Check(args[0])) {
3290 _PyArg_BadArgument("getgrouplist", "argument 1", "str", args[0]);
3291 goto exit;
3292 }
3293 Py_ssize_t user_length;
3294 user = PyUnicode_AsUTF8AndSize(args[0], &user_length);
3295 if (user == NULL) {
3296 goto exit;
3297 }
3298 if (strlen(user) != (size_t)user_length) {
3299 PyErr_SetString(PyExc_ValueError, "embedded null character");
3300 goto exit;
3301 }
3302 basegid = _PyLong_AsInt(args[1]);
3303 if (basegid == -1 && PyErr_Occurred()) {
3304 goto exit;
3305 }
3306 return_value = os_getgrouplist_impl(module, user, basegid);
3307
3308 exit:
3309 return return_value;
3310 }
3311
3312 #endif /* defined(HAVE_GETGROUPLIST) && defined(__APPLE__) */
3313
3314 #if defined(HAVE_GETGROUPLIST) && !defined(__APPLE__)
3315
3316 PyDoc_STRVAR(os_getgrouplist__doc__,
3317 "getgrouplist($module, user, group, /)\n"
3318 "--\n"
3319 "\n"
3320 "Returns a list of groups to which a user belongs.\n"
3321 "\n"
3322 " user\n"
3323 " username to lookup\n"
3324 " group\n"
3325 " base group id of the user");
3326
3327 #define OS_GETGROUPLIST_METHODDEF \
3328 {"getgrouplist", _PyCFunction_CAST(os_getgrouplist), METH_FASTCALL, os_getgrouplist__doc__},
3329
3330 static PyObject *
3331 os_getgrouplist_impl(PyObject *module, const char *user, gid_t basegid);
3332
3333 static PyObject *
os_getgrouplist(PyObject * module,PyObject * const * args,Py_ssize_t nargs)3334 os_getgrouplist(PyObject *module, PyObject *const *args, Py_ssize_t nargs)
3335 {
3336 PyObject *return_value = NULL;
3337 const char *user;
3338 gid_t basegid;
3339
3340 if (!_PyArg_CheckPositional("getgrouplist", nargs, 2, 2)) {
3341 goto exit;
3342 }
3343 if (!PyUnicode_Check(args[0])) {
3344 _PyArg_BadArgument("getgrouplist", "argument 1", "str", args[0]);
3345 goto exit;
3346 }
3347 Py_ssize_t user_length;
3348 user = PyUnicode_AsUTF8AndSize(args[0], &user_length);
3349 if (user == NULL) {
3350 goto exit;
3351 }
3352 if (strlen(user) != (size_t)user_length) {
3353 PyErr_SetString(PyExc_ValueError, "embedded null character");
3354 goto exit;
3355 }
3356 if (!_Py_Gid_Converter(args[1], &basegid)) {
3357 goto exit;
3358 }
3359 return_value = os_getgrouplist_impl(module, user, basegid);
3360
3361 exit:
3362 return return_value;
3363 }
3364
3365 #endif /* defined(HAVE_GETGROUPLIST) && !defined(__APPLE__) */
3366
3367 #if defined(HAVE_GETGROUPS)
3368
3369 PyDoc_STRVAR(os_getgroups__doc__,
3370 "getgroups($module, /)\n"
3371 "--\n"
3372 "\n"
3373 "Return list of supplemental group IDs for the process.");
3374
3375 #define OS_GETGROUPS_METHODDEF \
3376 {"getgroups", (PyCFunction)os_getgroups, METH_NOARGS, os_getgroups__doc__},
3377
3378 static PyObject *
3379 os_getgroups_impl(PyObject *module);
3380
3381 static PyObject *
os_getgroups(PyObject * module,PyObject * Py_UNUSED (ignored))3382 os_getgroups(PyObject *module, PyObject *Py_UNUSED(ignored))
3383 {
3384 return os_getgroups_impl(module);
3385 }
3386
3387 #endif /* defined(HAVE_GETGROUPS) */
3388
3389 #if defined(HAVE_INITGROUPS) && defined(__APPLE__)
3390
3391 PyDoc_STRVAR(os_initgroups__doc__,
3392 "initgroups($module, username, gid, /)\n"
3393 "--\n"
3394 "\n"
3395 "Initialize the group access list.\n"
3396 "\n"
3397 "Call the system initgroups() to initialize the group access list with all of\n"
3398 "the groups of which the specified username is a member, plus the specified\n"
3399 "group id.");
3400
3401 #define OS_INITGROUPS_METHODDEF \
3402 {"initgroups", _PyCFunction_CAST(os_initgroups), METH_FASTCALL, os_initgroups__doc__},
3403
3404 static PyObject *
3405 os_initgroups_impl(PyObject *module, PyObject *oname, int gid);
3406
3407 static PyObject *
os_initgroups(PyObject * module,PyObject * const * args,Py_ssize_t nargs)3408 os_initgroups(PyObject *module, PyObject *const *args, Py_ssize_t nargs)
3409 {
3410 PyObject *return_value = NULL;
3411 PyObject *oname = NULL;
3412 int gid;
3413
3414 if (!_PyArg_CheckPositional("initgroups", nargs, 2, 2)) {
3415 goto exit;
3416 }
3417 if (!PyUnicode_FSConverter(args[0], &oname)) {
3418 goto exit;
3419 }
3420 gid = _PyLong_AsInt(args[1]);
3421 if (gid == -1 && PyErr_Occurred()) {
3422 goto exit;
3423 }
3424 return_value = os_initgroups_impl(module, oname, gid);
3425
3426 exit:
3427 /* Cleanup for oname */
3428 Py_XDECREF(oname);
3429
3430 return return_value;
3431 }
3432
3433 #endif /* defined(HAVE_INITGROUPS) && defined(__APPLE__) */
3434
3435 #if defined(HAVE_INITGROUPS) && !defined(__APPLE__)
3436
3437 PyDoc_STRVAR(os_initgroups__doc__,
3438 "initgroups($module, username, gid, /)\n"
3439 "--\n"
3440 "\n"
3441 "Initialize the group access list.\n"
3442 "\n"
3443 "Call the system initgroups() to initialize the group access list with all of\n"
3444 "the groups of which the specified username is a member, plus the specified\n"
3445 "group id.");
3446
3447 #define OS_INITGROUPS_METHODDEF \
3448 {"initgroups", _PyCFunction_CAST(os_initgroups), METH_FASTCALL, os_initgroups__doc__},
3449
3450 static PyObject *
3451 os_initgroups_impl(PyObject *module, PyObject *oname, gid_t gid);
3452
3453 static PyObject *
os_initgroups(PyObject * module,PyObject * const * args,Py_ssize_t nargs)3454 os_initgroups(PyObject *module, PyObject *const *args, Py_ssize_t nargs)
3455 {
3456 PyObject *return_value = NULL;
3457 PyObject *oname = NULL;
3458 gid_t gid;
3459
3460 if (!_PyArg_CheckPositional("initgroups", nargs, 2, 2)) {
3461 goto exit;
3462 }
3463 if (!PyUnicode_FSConverter(args[0], &oname)) {
3464 goto exit;
3465 }
3466 if (!_Py_Gid_Converter(args[1], &gid)) {
3467 goto exit;
3468 }
3469 return_value = os_initgroups_impl(module, oname, gid);
3470
3471 exit:
3472 /* Cleanup for oname */
3473 Py_XDECREF(oname);
3474
3475 return return_value;
3476 }
3477
3478 #endif /* defined(HAVE_INITGROUPS) && !defined(__APPLE__) */
3479
3480 #if defined(HAVE_GETPGID)
3481
3482 PyDoc_STRVAR(os_getpgid__doc__,
3483 "getpgid($module, /, pid)\n"
3484 "--\n"
3485 "\n"
3486 "Call the system call getpgid(), and return the result.");
3487
3488 #define OS_GETPGID_METHODDEF \
3489 {"getpgid", _PyCFunction_CAST(os_getpgid), METH_FASTCALL|METH_KEYWORDS, os_getpgid__doc__},
3490
3491 static PyObject *
3492 os_getpgid_impl(PyObject *module, pid_t pid);
3493
3494 static PyObject *
os_getpgid(PyObject * module,PyObject * const * args,Py_ssize_t nargs,PyObject * kwnames)3495 os_getpgid(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames)
3496 {
3497 PyObject *return_value = NULL;
3498 static const char * const _keywords[] = {"pid", NULL};
3499 static _PyArg_Parser _parser = {"" _Py_PARSE_PID ":getpgid", _keywords, 0};
3500 pid_t pid;
3501
3502 if (!_PyArg_ParseStackAndKeywords(args, nargs, kwnames, &_parser,
3503 &pid)) {
3504 goto exit;
3505 }
3506 return_value = os_getpgid_impl(module, pid);
3507
3508 exit:
3509 return return_value;
3510 }
3511
3512 #endif /* defined(HAVE_GETPGID) */
3513
3514 #if defined(HAVE_GETPGRP)
3515
3516 PyDoc_STRVAR(os_getpgrp__doc__,
3517 "getpgrp($module, /)\n"
3518 "--\n"
3519 "\n"
3520 "Return the current process group id.");
3521
3522 #define OS_GETPGRP_METHODDEF \
3523 {"getpgrp", (PyCFunction)os_getpgrp, METH_NOARGS, os_getpgrp__doc__},
3524
3525 static PyObject *
3526 os_getpgrp_impl(PyObject *module);
3527
3528 static PyObject *
os_getpgrp(PyObject * module,PyObject * Py_UNUSED (ignored))3529 os_getpgrp(PyObject *module, PyObject *Py_UNUSED(ignored))
3530 {
3531 return os_getpgrp_impl(module);
3532 }
3533
3534 #endif /* defined(HAVE_GETPGRP) */
3535
3536 #if defined(HAVE_SETPGRP)
3537
3538 PyDoc_STRVAR(os_setpgrp__doc__,
3539 "setpgrp($module, /)\n"
3540 "--\n"
3541 "\n"
3542 "Make the current process the leader of its process group.");
3543
3544 #define OS_SETPGRP_METHODDEF \
3545 {"setpgrp", (PyCFunction)os_setpgrp, METH_NOARGS, os_setpgrp__doc__},
3546
3547 static PyObject *
3548 os_setpgrp_impl(PyObject *module);
3549
3550 static PyObject *
os_setpgrp(PyObject * module,PyObject * Py_UNUSED (ignored))3551 os_setpgrp(PyObject *module, PyObject *Py_UNUSED(ignored))
3552 {
3553 return os_setpgrp_impl(module);
3554 }
3555
3556 #endif /* defined(HAVE_SETPGRP) */
3557
3558 #if defined(HAVE_GETPPID)
3559
3560 PyDoc_STRVAR(os_getppid__doc__,
3561 "getppid($module, /)\n"
3562 "--\n"
3563 "\n"
3564 "Return the parent\'s process id.\n"
3565 "\n"
3566 "If the parent process has already exited, Windows machines will still\n"
3567 "return its id; others systems will return the id of the \'init\' process (1).");
3568
3569 #define OS_GETPPID_METHODDEF \
3570 {"getppid", (PyCFunction)os_getppid, METH_NOARGS, os_getppid__doc__},
3571
3572 static PyObject *
3573 os_getppid_impl(PyObject *module);
3574
3575 static PyObject *
os_getppid(PyObject * module,PyObject * Py_UNUSED (ignored))3576 os_getppid(PyObject *module, PyObject *Py_UNUSED(ignored))
3577 {
3578 return os_getppid_impl(module);
3579 }
3580
3581 #endif /* defined(HAVE_GETPPID) */
3582
3583 #if defined(HAVE_GETLOGIN)
3584
3585 PyDoc_STRVAR(os_getlogin__doc__,
3586 "getlogin($module, /)\n"
3587 "--\n"
3588 "\n"
3589 "Return the actual login name.");
3590
3591 #define OS_GETLOGIN_METHODDEF \
3592 {"getlogin", (PyCFunction)os_getlogin, METH_NOARGS, os_getlogin__doc__},
3593
3594 static PyObject *
3595 os_getlogin_impl(PyObject *module);
3596
3597 static PyObject *
os_getlogin(PyObject * module,PyObject * Py_UNUSED (ignored))3598 os_getlogin(PyObject *module, PyObject *Py_UNUSED(ignored))
3599 {
3600 return os_getlogin_impl(module);
3601 }
3602
3603 #endif /* defined(HAVE_GETLOGIN) */
3604
3605 #if defined(HAVE_GETUID)
3606
3607 PyDoc_STRVAR(os_getuid__doc__,
3608 "getuid($module, /)\n"
3609 "--\n"
3610 "\n"
3611 "Return the current process\'s user id.");
3612
3613 #define OS_GETUID_METHODDEF \
3614 {"getuid", (PyCFunction)os_getuid, METH_NOARGS, os_getuid__doc__},
3615
3616 static PyObject *
3617 os_getuid_impl(PyObject *module);
3618
3619 static PyObject *
os_getuid(PyObject * module,PyObject * Py_UNUSED (ignored))3620 os_getuid(PyObject *module, PyObject *Py_UNUSED(ignored))
3621 {
3622 return os_getuid_impl(module);
3623 }
3624
3625 #endif /* defined(HAVE_GETUID) */
3626
3627 #if defined(HAVE_KILL)
3628
3629 PyDoc_STRVAR(os_kill__doc__,
3630 "kill($module, pid, signal, /)\n"
3631 "--\n"
3632 "\n"
3633 "Kill a process with a signal.");
3634
3635 #define OS_KILL_METHODDEF \
3636 {"kill", _PyCFunction_CAST(os_kill), METH_FASTCALL, os_kill__doc__},
3637
3638 static PyObject *
3639 os_kill_impl(PyObject *module, pid_t pid, Py_ssize_t signal);
3640
3641 static PyObject *
os_kill(PyObject * module,PyObject * const * args,Py_ssize_t nargs)3642 os_kill(PyObject *module, PyObject *const *args, Py_ssize_t nargs)
3643 {
3644 PyObject *return_value = NULL;
3645 pid_t pid;
3646 Py_ssize_t signal;
3647
3648 if (!_PyArg_ParseStack(args, nargs, "" _Py_PARSE_PID "n:kill",
3649 &pid, &signal)) {
3650 goto exit;
3651 }
3652 return_value = os_kill_impl(module, pid, signal);
3653
3654 exit:
3655 return return_value;
3656 }
3657
3658 #endif /* defined(HAVE_KILL) */
3659
3660 #if defined(HAVE_KILLPG)
3661
3662 PyDoc_STRVAR(os_killpg__doc__,
3663 "killpg($module, pgid, signal, /)\n"
3664 "--\n"
3665 "\n"
3666 "Kill a process group with a signal.");
3667
3668 #define OS_KILLPG_METHODDEF \
3669 {"killpg", _PyCFunction_CAST(os_killpg), METH_FASTCALL, os_killpg__doc__},
3670
3671 static PyObject *
3672 os_killpg_impl(PyObject *module, pid_t pgid, int signal);
3673
3674 static PyObject *
os_killpg(PyObject * module,PyObject * const * args,Py_ssize_t nargs)3675 os_killpg(PyObject *module, PyObject *const *args, Py_ssize_t nargs)
3676 {
3677 PyObject *return_value = NULL;
3678 pid_t pgid;
3679 int signal;
3680
3681 if (!_PyArg_ParseStack(args, nargs, "" _Py_PARSE_PID "i:killpg",
3682 &pgid, &signal)) {
3683 goto exit;
3684 }
3685 return_value = os_killpg_impl(module, pgid, signal);
3686
3687 exit:
3688 return return_value;
3689 }
3690
3691 #endif /* defined(HAVE_KILLPG) */
3692
3693 #if defined(HAVE_PLOCK)
3694
3695 PyDoc_STRVAR(os_plock__doc__,
3696 "plock($module, op, /)\n"
3697 "--\n"
3698 "\n"
3699 "Lock program segments into memory.\");");
3700
3701 #define OS_PLOCK_METHODDEF \
3702 {"plock", (PyCFunction)os_plock, METH_O, os_plock__doc__},
3703
3704 static PyObject *
3705 os_plock_impl(PyObject *module, int op);
3706
3707 static PyObject *
os_plock(PyObject * module,PyObject * arg)3708 os_plock(PyObject *module, PyObject *arg)
3709 {
3710 PyObject *return_value = NULL;
3711 int op;
3712
3713 op = _PyLong_AsInt(arg);
3714 if (op == -1 && PyErr_Occurred()) {
3715 goto exit;
3716 }
3717 return_value = os_plock_impl(module, op);
3718
3719 exit:
3720 return return_value;
3721 }
3722
3723 #endif /* defined(HAVE_PLOCK) */
3724
3725 #if defined(HAVE_SETUID)
3726
3727 PyDoc_STRVAR(os_setuid__doc__,
3728 "setuid($module, uid, /)\n"
3729 "--\n"
3730 "\n"
3731 "Set the current process\'s user id.");
3732
3733 #define OS_SETUID_METHODDEF \
3734 {"setuid", (PyCFunction)os_setuid, METH_O, os_setuid__doc__},
3735
3736 static PyObject *
3737 os_setuid_impl(PyObject *module, uid_t uid);
3738
3739 static PyObject *
os_setuid(PyObject * module,PyObject * arg)3740 os_setuid(PyObject *module, PyObject *arg)
3741 {
3742 PyObject *return_value = NULL;
3743 uid_t uid;
3744
3745 if (!_Py_Uid_Converter(arg, &uid)) {
3746 goto exit;
3747 }
3748 return_value = os_setuid_impl(module, uid);
3749
3750 exit:
3751 return return_value;
3752 }
3753
3754 #endif /* defined(HAVE_SETUID) */
3755
3756 #if defined(HAVE_SETEUID)
3757
3758 PyDoc_STRVAR(os_seteuid__doc__,
3759 "seteuid($module, euid, /)\n"
3760 "--\n"
3761 "\n"
3762 "Set the current process\'s effective user id.");
3763
3764 #define OS_SETEUID_METHODDEF \
3765 {"seteuid", (PyCFunction)os_seteuid, METH_O, os_seteuid__doc__},
3766
3767 static PyObject *
3768 os_seteuid_impl(PyObject *module, uid_t euid);
3769
3770 static PyObject *
os_seteuid(PyObject * module,PyObject * arg)3771 os_seteuid(PyObject *module, PyObject *arg)
3772 {
3773 PyObject *return_value = NULL;
3774 uid_t euid;
3775
3776 if (!_Py_Uid_Converter(arg, &euid)) {
3777 goto exit;
3778 }
3779 return_value = os_seteuid_impl(module, euid);
3780
3781 exit:
3782 return return_value;
3783 }
3784
3785 #endif /* defined(HAVE_SETEUID) */
3786
3787 #if defined(HAVE_SETEGID)
3788
3789 PyDoc_STRVAR(os_setegid__doc__,
3790 "setegid($module, egid, /)\n"
3791 "--\n"
3792 "\n"
3793 "Set the current process\'s effective group id.");
3794
3795 #define OS_SETEGID_METHODDEF \
3796 {"setegid", (PyCFunction)os_setegid, METH_O, os_setegid__doc__},
3797
3798 static PyObject *
3799 os_setegid_impl(PyObject *module, gid_t egid);
3800
3801 static PyObject *
os_setegid(PyObject * module,PyObject * arg)3802 os_setegid(PyObject *module, PyObject *arg)
3803 {
3804 PyObject *return_value = NULL;
3805 gid_t egid;
3806
3807 if (!_Py_Gid_Converter(arg, &egid)) {
3808 goto exit;
3809 }
3810 return_value = os_setegid_impl(module, egid);
3811
3812 exit:
3813 return return_value;
3814 }
3815
3816 #endif /* defined(HAVE_SETEGID) */
3817
3818 #if defined(HAVE_SETREUID)
3819
3820 PyDoc_STRVAR(os_setreuid__doc__,
3821 "setreuid($module, ruid, euid, /)\n"
3822 "--\n"
3823 "\n"
3824 "Set the current process\'s real and effective user ids.");
3825
3826 #define OS_SETREUID_METHODDEF \
3827 {"setreuid", _PyCFunction_CAST(os_setreuid), METH_FASTCALL, os_setreuid__doc__},
3828
3829 static PyObject *
3830 os_setreuid_impl(PyObject *module, uid_t ruid, uid_t euid);
3831
3832 static PyObject *
os_setreuid(PyObject * module,PyObject * const * args,Py_ssize_t nargs)3833 os_setreuid(PyObject *module, PyObject *const *args, Py_ssize_t nargs)
3834 {
3835 PyObject *return_value = NULL;
3836 uid_t ruid;
3837 uid_t euid;
3838
3839 if (!_PyArg_CheckPositional("setreuid", nargs, 2, 2)) {
3840 goto exit;
3841 }
3842 if (!_Py_Uid_Converter(args[0], &ruid)) {
3843 goto exit;
3844 }
3845 if (!_Py_Uid_Converter(args[1], &euid)) {
3846 goto exit;
3847 }
3848 return_value = os_setreuid_impl(module, ruid, euid);
3849
3850 exit:
3851 return return_value;
3852 }
3853
3854 #endif /* defined(HAVE_SETREUID) */
3855
3856 #if defined(HAVE_SETREGID)
3857
3858 PyDoc_STRVAR(os_setregid__doc__,
3859 "setregid($module, rgid, egid, /)\n"
3860 "--\n"
3861 "\n"
3862 "Set the current process\'s real and effective group ids.");
3863
3864 #define OS_SETREGID_METHODDEF \
3865 {"setregid", _PyCFunction_CAST(os_setregid), METH_FASTCALL, os_setregid__doc__},
3866
3867 static PyObject *
3868 os_setregid_impl(PyObject *module, gid_t rgid, gid_t egid);
3869
3870 static PyObject *
os_setregid(PyObject * module,PyObject * const * args,Py_ssize_t nargs)3871 os_setregid(PyObject *module, PyObject *const *args, Py_ssize_t nargs)
3872 {
3873 PyObject *return_value = NULL;
3874 gid_t rgid;
3875 gid_t egid;
3876
3877 if (!_PyArg_CheckPositional("setregid", nargs, 2, 2)) {
3878 goto exit;
3879 }
3880 if (!_Py_Gid_Converter(args[0], &rgid)) {
3881 goto exit;
3882 }
3883 if (!_Py_Gid_Converter(args[1], &egid)) {
3884 goto exit;
3885 }
3886 return_value = os_setregid_impl(module, rgid, egid);
3887
3888 exit:
3889 return return_value;
3890 }
3891
3892 #endif /* defined(HAVE_SETREGID) */
3893
3894 #if defined(HAVE_SETGID)
3895
3896 PyDoc_STRVAR(os_setgid__doc__,
3897 "setgid($module, gid, /)\n"
3898 "--\n"
3899 "\n"
3900 "Set the current process\'s group id.");
3901
3902 #define OS_SETGID_METHODDEF \
3903 {"setgid", (PyCFunction)os_setgid, METH_O, os_setgid__doc__},
3904
3905 static PyObject *
3906 os_setgid_impl(PyObject *module, gid_t gid);
3907
3908 static PyObject *
os_setgid(PyObject * module,PyObject * arg)3909 os_setgid(PyObject *module, PyObject *arg)
3910 {
3911 PyObject *return_value = NULL;
3912 gid_t gid;
3913
3914 if (!_Py_Gid_Converter(arg, &gid)) {
3915 goto exit;
3916 }
3917 return_value = os_setgid_impl(module, gid);
3918
3919 exit:
3920 return return_value;
3921 }
3922
3923 #endif /* defined(HAVE_SETGID) */
3924
3925 #if defined(HAVE_SETGROUPS)
3926
3927 PyDoc_STRVAR(os_setgroups__doc__,
3928 "setgroups($module, groups, /)\n"
3929 "--\n"
3930 "\n"
3931 "Set the groups of the current process to list.");
3932
3933 #define OS_SETGROUPS_METHODDEF \
3934 {"setgroups", (PyCFunction)os_setgroups, METH_O, os_setgroups__doc__},
3935
3936 #endif /* defined(HAVE_SETGROUPS) */
3937
3938 #if defined(HAVE_WAIT3)
3939
3940 PyDoc_STRVAR(os_wait3__doc__,
3941 "wait3($module, /, options)\n"
3942 "--\n"
3943 "\n"
3944 "Wait for completion of a child process.\n"
3945 "\n"
3946 "Returns a tuple of information about the child process:\n"
3947 " (pid, status, rusage)");
3948
3949 #define OS_WAIT3_METHODDEF \
3950 {"wait3", _PyCFunction_CAST(os_wait3), METH_FASTCALL|METH_KEYWORDS, os_wait3__doc__},
3951
3952 static PyObject *
3953 os_wait3_impl(PyObject *module, int options);
3954
3955 static PyObject *
os_wait3(PyObject * module,PyObject * const * args,Py_ssize_t nargs,PyObject * kwnames)3956 os_wait3(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames)
3957 {
3958 PyObject *return_value = NULL;
3959 static const char * const _keywords[] = {"options", NULL};
3960 static _PyArg_Parser _parser = {NULL, _keywords, "wait3", 0};
3961 PyObject *argsbuf[1];
3962 int options;
3963
3964 args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 1, 1, 0, argsbuf);
3965 if (!args) {
3966 goto exit;
3967 }
3968 options = _PyLong_AsInt(args[0]);
3969 if (options == -1 && PyErr_Occurred()) {
3970 goto exit;
3971 }
3972 return_value = os_wait3_impl(module, options);
3973
3974 exit:
3975 return return_value;
3976 }
3977
3978 #endif /* defined(HAVE_WAIT3) */
3979
3980 #if defined(HAVE_WAIT4)
3981
3982 PyDoc_STRVAR(os_wait4__doc__,
3983 "wait4($module, /, pid, options)\n"
3984 "--\n"
3985 "\n"
3986 "Wait for completion of a specific child process.\n"
3987 "\n"
3988 "Returns a tuple of information about the child process:\n"
3989 " (pid, status, rusage)");
3990
3991 #define OS_WAIT4_METHODDEF \
3992 {"wait4", _PyCFunction_CAST(os_wait4), METH_FASTCALL|METH_KEYWORDS, os_wait4__doc__},
3993
3994 static PyObject *
3995 os_wait4_impl(PyObject *module, pid_t pid, int options);
3996
3997 static PyObject *
os_wait4(PyObject * module,PyObject * const * args,Py_ssize_t nargs,PyObject * kwnames)3998 os_wait4(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames)
3999 {
4000 PyObject *return_value = NULL;
4001 static const char * const _keywords[] = {"pid", "options", NULL};
4002 static _PyArg_Parser _parser = {"" _Py_PARSE_PID "i:wait4", _keywords, 0};
4003 pid_t pid;
4004 int options;
4005
4006 if (!_PyArg_ParseStackAndKeywords(args, nargs, kwnames, &_parser,
4007 &pid, &options)) {
4008 goto exit;
4009 }
4010 return_value = os_wait4_impl(module, pid, options);
4011
4012 exit:
4013 return return_value;
4014 }
4015
4016 #endif /* defined(HAVE_WAIT4) */
4017
4018 #if (defined(HAVE_WAITID) && !defined(__APPLE__))
4019
4020 PyDoc_STRVAR(os_waitid__doc__,
4021 "waitid($module, idtype, id, options, /)\n"
4022 "--\n"
4023 "\n"
4024 "Returns the result of waiting for a process or processes.\n"
4025 "\n"
4026 " idtype\n"
4027 " Must be one of be P_PID, P_PGID or P_ALL.\n"
4028 " id\n"
4029 " The id to wait on.\n"
4030 " options\n"
4031 " Constructed from the ORing of one or more of WEXITED, WSTOPPED\n"
4032 " or WCONTINUED and additionally may be ORed with WNOHANG or WNOWAIT.\n"
4033 "\n"
4034 "Returns either waitid_result or None if WNOHANG is specified and there are\n"
4035 "no children in a waitable state.");
4036
4037 #define OS_WAITID_METHODDEF \
4038 {"waitid", _PyCFunction_CAST(os_waitid), METH_FASTCALL, os_waitid__doc__},
4039
4040 static PyObject *
4041 os_waitid_impl(PyObject *module, idtype_t idtype, id_t id, int options);
4042
4043 static PyObject *
os_waitid(PyObject * module,PyObject * const * args,Py_ssize_t nargs)4044 os_waitid(PyObject *module, PyObject *const *args, Py_ssize_t nargs)
4045 {
4046 PyObject *return_value = NULL;
4047 idtype_t idtype;
4048 id_t id;
4049 int options;
4050
4051 if (!_PyArg_ParseStack(args, nargs, "i" _Py_PARSE_PID "i:waitid",
4052 &idtype, &id, &options)) {
4053 goto exit;
4054 }
4055 return_value = os_waitid_impl(module, idtype, id, options);
4056
4057 exit:
4058 return return_value;
4059 }
4060
4061 #endif /* (defined(HAVE_WAITID) && !defined(__APPLE__)) */
4062
4063 #if defined(HAVE_WAITPID)
4064
4065 PyDoc_STRVAR(os_waitpid__doc__,
4066 "waitpid($module, pid, options, /)\n"
4067 "--\n"
4068 "\n"
4069 "Wait for completion of a given child process.\n"
4070 "\n"
4071 "Returns a tuple of information regarding the child process:\n"
4072 " (pid, status)\n"
4073 "\n"
4074 "The options argument is ignored on Windows.");
4075
4076 #define OS_WAITPID_METHODDEF \
4077 {"waitpid", _PyCFunction_CAST(os_waitpid), METH_FASTCALL, os_waitpid__doc__},
4078
4079 static PyObject *
4080 os_waitpid_impl(PyObject *module, pid_t pid, int options);
4081
4082 static PyObject *
os_waitpid(PyObject * module,PyObject * const * args,Py_ssize_t nargs)4083 os_waitpid(PyObject *module, PyObject *const *args, Py_ssize_t nargs)
4084 {
4085 PyObject *return_value = NULL;
4086 pid_t pid;
4087 int options;
4088
4089 if (!_PyArg_ParseStack(args, nargs, "" _Py_PARSE_PID "i:waitpid",
4090 &pid, &options)) {
4091 goto exit;
4092 }
4093 return_value = os_waitpid_impl(module, pid, options);
4094
4095 exit:
4096 return return_value;
4097 }
4098
4099 #endif /* defined(HAVE_WAITPID) */
4100
4101 #if !defined(HAVE_WAITPID) && defined(HAVE_CWAIT)
4102
4103 PyDoc_STRVAR(os_waitpid__doc__,
4104 "waitpid($module, pid, options, /)\n"
4105 "--\n"
4106 "\n"
4107 "Wait for completion of a given process.\n"
4108 "\n"
4109 "Returns a tuple of information regarding the process:\n"
4110 " (pid, status << 8)\n"
4111 "\n"
4112 "The options argument is ignored on Windows.");
4113
4114 #define OS_WAITPID_METHODDEF \
4115 {"waitpid", _PyCFunction_CAST(os_waitpid), METH_FASTCALL, os_waitpid__doc__},
4116
4117 static PyObject *
4118 os_waitpid_impl(PyObject *module, intptr_t pid, int options);
4119
4120 static PyObject *
os_waitpid(PyObject * module,PyObject * const * args,Py_ssize_t nargs)4121 os_waitpid(PyObject *module, PyObject *const *args, Py_ssize_t nargs)
4122 {
4123 PyObject *return_value = NULL;
4124 intptr_t pid;
4125 int options;
4126
4127 if (!_PyArg_ParseStack(args, nargs, "" _Py_PARSE_INTPTR "i:waitpid",
4128 &pid, &options)) {
4129 goto exit;
4130 }
4131 return_value = os_waitpid_impl(module, pid, options);
4132
4133 exit:
4134 return return_value;
4135 }
4136
4137 #endif /* !defined(HAVE_WAITPID) && defined(HAVE_CWAIT) */
4138
4139 #if defined(HAVE_WAIT)
4140
4141 PyDoc_STRVAR(os_wait__doc__,
4142 "wait($module, /)\n"
4143 "--\n"
4144 "\n"
4145 "Wait for completion of a child process.\n"
4146 "\n"
4147 "Returns a tuple of information about the child process:\n"
4148 " (pid, status)");
4149
4150 #define OS_WAIT_METHODDEF \
4151 {"wait", (PyCFunction)os_wait, METH_NOARGS, os_wait__doc__},
4152
4153 static PyObject *
4154 os_wait_impl(PyObject *module);
4155
4156 static PyObject *
os_wait(PyObject * module,PyObject * Py_UNUSED (ignored))4157 os_wait(PyObject *module, PyObject *Py_UNUSED(ignored))
4158 {
4159 return os_wait_impl(module);
4160 }
4161
4162 #endif /* defined(HAVE_WAIT) */
4163
4164 #if (defined(__linux__) && defined(__NR_pidfd_open))
4165
4166 PyDoc_STRVAR(os_pidfd_open__doc__,
4167 "pidfd_open($module, /, pid, flags=0)\n"
4168 "--\n"
4169 "\n"
4170 "Return a file descriptor referring to the process *pid*.\n"
4171 "\n"
4172 "The descriptor can be used to perform process management without races and\n"
4173 "signals.");
4174
4175 #define OS_PIDFD_OPEN_METHODDEF \
4176 {"pidfd_open", _PyCFunction_CAST(os_pidfd_open), METH_FASTCALL|METH_KEYWORDS, os_pidfd_open__doc__},
4177
4178 static PyObject *
4179 os_pidfd_open_impl(PyObject *module, pid_t pid, unsigned int flags);
4180
4181 static PyObject *
os_pidfd_open(PyObject * module,PyObject * const * args,Py_ssize_t nargs,PyObject * kwnames)4182 os_pidfd_open(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames)
4183 {
4184 PyObject *return_value = NULL;
4185 static const char * const _keywords[] = {"pid", "flags", NULL};
4186 static _PyArg_Parser _parser = {"" _Py_PARSE_PID "|O&:pidfd_open", _keywords, 0};
4187 pid_t pid;
4188 unsigned int flags = 0;
4189
4190 if (!_PyArg_ParseStackAndKeywords(args, nargs, kwnames, &_parser,
4191 &pid, _PyLong_UnsignedInt_Converter, &flags)) {
4192 goto exit;
4193 }
4194 return_value = os_pidfd_open_impl(module, pid, flags);
4195
4196 exit:
4197 return return_value;
4198 }
4199
4200 #endif /* (defined(__linux__) && defined(__NR_pidfd_open)) */
4201
4202 #if (defined(HAVE_READLINK) || defined(MS_WINDOWS))
4203
4204 PyDoc_STRVAR(os_readlink__doc__,
4205 "readlink($module, /, path, *, dir_fd=None)\n"
4206 "--\n"
4207 "\n"
4208 "Return a string representing the path to which the symbolic link points.\n"
4209 "\n"
4210 "If dir_fd is not None, it should be a file descriptor open to a directory,\n"
4211 "and path should be relative; path will then be relative to that directory.\n"
4212 "\n"
4213 "dir_fd may not be implemented on your platform. If it is unavailable,\n"
4214 "using it will raise a NotImplementedError.");
4215
4216 #define OS_READLINK_METHODDEF \
4217 {"readlink", _PyCFunction_CAST(os_readlink), METH_FASTCALL|METH_KEYWORDS, os_readlink__doc__},
4218
4219 static PyObject *
4220 os_readlink_impl(PyObject *module, path_t *path, int dir_fd);
4221
4222 static PyObject *
os_readlink(PyObject * module,PyObject * const * args,Py_ssize_t nargs,PyObject * kwnames)4223 os_readlink(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames)
4224 {
4225 PyObject *return_value = NULL;
4226 static const char * const _keywords[] = {"path", "dir_fd", NULL};
4227 static _PyArg_Parser _parser = {NULL, _keywords, "readlink", 0};
4228 PyObject *argsbuf[2];
4229 Py_ssize_t noptargs = nargs + (kwnames ? PyTuple_GET_SIZE(kwnames) : 0) - 1;
4230 path_t path = PATH_T_INITIALIZE("readlink", "path", 0, 0);
4231 int dir_fd = DEFAULT_DIR_FD;
4232
4233 args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 1, 1, 0, argsbuf);
4234 if (!args) {
4235 goto exit;
4236 }
4237 if (!path_converter(args[0], &path)) {
4238 goto exit;
4239 }
4240 if (!noptargs) {
4241 goto skip_optional_kwonly;
4242 }
4243 if (!READLINKAT_DIR_FD_CONVERTER(args[1], &dir_fd)) {
4244 goto exit;
4245 }
4246 skip_optional_kwonly:
4247 return_value = os_readlink_impl(module, &path, dir_fd);
4248
4249 exit:
4250 /* Cleanup for path */
4251 path_cleanup(&path);
4252
4253 return return_value;
4254 }
4255
4256 #endif /* (defined(HAVE_READLINK) || defined(MS_WINDOWS)) */
4257
4258 #if defined(HAVE_SYMLINK)
4259
4260 PyDoc_STRVAR(os_symlink__doc__,
4261 "symlink($module, /, src, dst, target_is_directory=False, *, dir_fd=None)\n"
4262 "--\n"
4263 "\n"
4264 "Create a symbolic link pointing to src named dst.\n"
4265 "\n"
4266 "target_is_directory is required on Windows if the target is to be\n"
4267 " interpreted as a directory. (On Windows, symlink requires\n"
4268 " Windows 6.0 or greater, and raises a NotImplementedError otherwise.)\n"
4269 " target_is_directory is ignored on non-Windows platforms.\n"
4270 "\n"
4271 "If dir_fd is not None, it should be a file descriptor open to a directory,\n"
4272 " and path should be relative; path will then be relative to that directory.\n"
4273 "dir_fd may not be implemented on your platform.\n"
4274 " If it is unavailable, using it will raise a NotImplementedError.");
4275
4276 #define OS_SYMLINK_METHODDEF \
4277 {"symlink", _PyCFunction_CAST(os_symlink), METH_FASTCALL|METH_KEYWORDS, os_symlink__doc__},
4278
4279 static PyObject *
4280 os_symlink_impl(PyObject *module, path_t *src, path_t *dst,
4281 int target_is_directory, int dir_fd);
4282
4283 static PyObject *
os_symlink(PyObject * module,PyObject * const * args,Py_ssize_t nargs,PyObject * kwnames)4284 os_symlink(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames)
4285 {
4286 PyObject *return_value = NULL;
4287 static const char * const _keywords[] = {"src", "dst", "target_is_directory", "dir_fd", NULL};
4288 static _PyArg_Parser _parser = {NULL, _keywords, "symlink", 0};
4289 PyObject *argsbuf[4];
4290 Py_ssize_t noptargs = nargs + (kwnames ? PyTuple_GET_SIZE(kwnames) : 0) - 2;
4291 path_t src = PATH_T_INITIALIZE("symlink", "src", 0, 0);
4292 path_t dst = PATH_T_INITIALIZE("symlink", "dst", 0, 0);
4293 int target_is_directory = 0;
4294 int dir_fd = DEFAULT_DIR_FD;
4295
4296 args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 2, 3, 0, argsbuf);
4297 if (!args) {
4298 goto exit;
4299 }
4300 if (!path_converter(args[0], &src)) {
4301 goto exit;
4302 }
4303 if (!path_converter(args[1], &dst)) {
4304 goto exit;
4305 }
4306 if (!noptargs) {
4307 goto skip_optional_pos;
4308 }
4309 if (args[2]) {
4310 target_is_directory = PyObject_IsTrue(args[2]);
4311 if (target_is_directory < 0) {
4312 goto exit;
4313 }
4314 if (!--noptargs) {
4315 goto skip_optional_pos;
4316 }
4317 }
4318 skip_optional_pos:
4319 if (!noptargs) {
4320 goto skip_optional_kwonly;
4321 }
4322 if (!SYMLINKAT_DIR_FD_CONVERTER(args[3], &dir_fd)) {
4323 goto exit;
4324 }
4325 skip_optional_kwonly:
4326 return_value = os_symlink_impl(module, &src, &dst, target_is_directory, dir_fd);
4327
4328 exit:
4329 /* Cleanup for src */
4330 path_cleanup(&src);
4331 /* Cleanup for dst */
4332 path_cleanup(&dst);
4333
4334 return return_value;
4335 }
4336
4337 #endif /* defined(HAVE_SYMLINK) */
4338
4339 #if defined(HAVE_TIMES)
4340
4341 PyDoc_STRVAR(os_times__doc__,
4342 "times($module, /)\n"
4343 "--\n"
4344 "\n"
4345 "Return a collection containing process timing information.\n"
4346 "\n"
4347 "The object returned behaves like a named tuple with these fields:\n"
4348 " (utime, stime, cutime, cstime, elapsed_time)\n"
4349 "All fields are floating point numbers.");
4350
4351 #define OS_TIMES_METHODDEF \
4352 {"times", (PyCFunction)os_times, METH_NOARGS, os_times__doc__},
4353
4354 static PyObject *
4355 os_times_impl(PyObject *module);
4356
4357 static PyObject *
os_times(PyObject * module,PyObject * Py_UNUSED (ignored))4358 os_times(PyObject *module, PyObject *Py_UNUSED(ignored))
4359 {
4360 return os_times_impl(module);
4361 }
4362
4363 #endif /* defined(HAVE_TIMES) */
4364
4365 #if defined(HAVE_GETSID)
4366
4367 PyDoc_STRVAR(os_getsid__doc__,
4368 "getsid($module, pid, /)\n"
4369 "--\n"
4370 "\n"
4371 "Call the system call getsid(pid) and return the result.");
4372
4373 #define OS_GETSID_METHODDEF \
4374 {"getsid", (PyCFunction)os_getsid, METH_O, os_getsid__doc__},
4375
4376 static PyObject *
4377 os_getsid_impl(PyObject *module, pid_t pid);
4378
4379 static PyObject *
os_getsid(PyObject * module,PyObject * arg)4380 os_getsid(PyObject *module, PyObject *arg)
4381 {
4382 PyObject *return_value = NULL;
4383 pid_t pid;
4384
4385 if (!PyArg_Parse(arg, "" _Py_PARSE_PID ":getsid", &pid)) {
4386 goto exit;
4387 }
4388 return_value = os_getsid_impl(module, pid);
4389
4390 exit:
4391 return return_value;
4392 }
4393
4394 #endif /* defined(HAVE_GETSID) */
4395
4396 #if defined(HAVE_SETSID)
4397
4398 PyDoc_STRVAR(os_setsid__doc__,
4399 "setsid($module, /)\n"
4400 "--\n"
4401 "\n"
4402 "Call the system call setsid().");
4403
4404 #define OS_SETSID_METHODDEF \
4405 {"setsid", (PyCFunction)os_setsid, METH_NOARGS, os_setsid__doc__},
4406
4407 static PyObject *
4408 os_setsid_impl(PyObject *module);
4409
4410 static PyObject *
os_setsid(PyObject * module,PyObject * Py_UNUSED (ignored))4411 os_setsid(PyObject *module, PyObject *Py_UNUSED(ignored))
4412 {
4413 return os_setsid_impl(module);
4414 }
4415
4416 #endif /* defined(HAVE_SETSID) */
4417
4418 #if defined(HAVE_SETPGID)
4419
4420 PyDoc_STRVAR(os_setpgid__doc__,
4421 "setpgid($module, pid, pgrp, /)\n"
4422 "--\n"
4423 "\n"
4424 "Call the system call setpgid(pid, pgrp).");
4425
4426 #define OS_SETPGID_METHODDEF \
4427 {"setpgid", _PyCFunction_CAST(os_setpgid), METH_FASTCALL, os_setpgid__doc__},
4428
4429 static PyObject *
4430 os_setpgid_impl(PyObject *module, pid_t pid, pid_t pgrp);
4431
4432 static PyObject *
os_setpgid(PyObject * module,PyObject * const * args,Py_ssize_t nargs)4433 os_setpgid(PyObject *module, PyObject *const *args, Py_ssize_t nargs)
4434 {
4435 PyObject *return_value = NULL;
4436 pid_t pid;
4437 pid_t pgrp;
4438
4439 if (!_PyArg_ParseStack(args, nargs, "" _Py_PARSE_PID "" _Py_PARSE_PID ":setpgid",
4440 &pid, &pgrp)) {
4441 goto exit;
4442 }
4443 return_value = os_setpgid_impl(module, pid, pgrp);
4444
4445 exit:
4446 return return_value;
4447 }
4448
4449 #endif /* defined(HAVE_SETPGID) */
4450
4451 #if defined(HAVE_TCGETPGRP)
4452
4453 PyDoc_STRVAR(os_tcgetpgrp__doc__,
4454 "tcgetpgrp($module, fd, /)\n"
4455 "--\n"
4456 "\n"
4457 "Return the process group associated with the terminal specified by fd.");
4458
4459 #define OS_TCGETPGRP_METHODDEF \
4460 {"tcgetpgrp", (PyCFunction)os_tcgetpgrp, METH_O, os_tcgetpgrp__doc__},
4461
4462 static PyObject *
4463 os_tcgetpgrp_impl(PyObject *module, int fd);
4464
4465 static PyObject *
os_tcgetpgrp(PyObject * module,PyObject * arg)4466 os_tcgetpgrp(PyObject *module, PyObject *arg)
4467 {
4468 PyObject *return_value = NULL;
4469 int fd;
4470
4471 fd = _PyLong_AsInt(arg);
4472 if (fd == -1 && PyErr_Occurred()) {
4473 goto exit;
4474 }
4475 return_value = os_tcgetpgrp_impl(module, fd);
4476
4477 exit:
4478 return return_value;
4479 }
4480
4481 #endif /* defined(HAVE_TCGETPGRP) */
4482
4483 #if defined(HAVE_TCSETPGRP)
4484
4485 PyDoc_STRVAR(os_tcsetpgrp__doc__,
4486 "tcsetpgrp($module, fd, pgid, /)\n"
4487 "--\n"
4488 "\n"
4489 "Set the process group associated with the terminal specified by fd.");
4490
4491 #define OS_TCSETPGRP_METHODDEF \
4492 {"tcsetpgrp", _PyCFunction_CAST(os_tcsetpgrp), METH_FASTCALL, os_tcsetpgrp__doc__},
4493
4494 static PyObject *
4495 os_tcsetpgrp_impl(PyObject *module, int fd, pid_t pgid);
4496
4497 static PyObject *
os_tcsetpgrp(PyObject * module,PyObject * const * args,Py_ssize_t nargs)4498 os_tcsetpgrp(PyObject *module, PyObject *const *args, Py_ssize_t nargs)
4499 {
4500 PyObject *return_value = NULL;
4501 int fd;
4502 pid_t pgid;
4503
4504 if (!_PyArg_ParseStack(args, nargs, "i" _Py_PARSE_PID ":tcsetpgrp",
4505 &fd, &pgid)) {
4506 goto exit;
4507 }
4508 return_value = os_tcsetpgrp_impl(module, fd, pgid);
4509
4510 exit:
4511 return return_value;
4512 }
4513
4514 #endif /* defined(HAVE_TCSETPGRP) */
4515
4516 PyDoc_STRVAR(os_open__doc__,
4517 "open($module, /, path, flags, mode=511, *, dir_fd=None)\n"
4518 "--\n"
4519 "\n"
4520 "Open a file for low level IO. Returns a file descriptor (integer).\n"
4521 "\n"
4522 "If dir_fd is not None, it should be a file descriptor open to a directory,\n"
4523 " and path should be relative; path will then be relative to that directory.\n"
4524 "dir_fd may not be implemented on your platform.\n"
4525 " If it is unavailable, using it will raise a NotImplementedError.");
4526
4527 #define OS_OPEN_METHODDEF \
4528 {"open", _PyCFunction_CAST(os_open), METH_FASTCALL|METH_KEYWORDS, os_open__doc__},
4529
4530 static int
4531 os_open_impl(PyObject *module, path_t *path, int flags, int mode, int dir_fd);
4532
4533 static PyObject *
os_open(PyObject * module,PyObject * const * args,Py_ssize_t nargs,PyObject * kwnames)4534 os_open(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames)
4535 {
4536 PyObject *return_value = NULL;
4537 static const char * const _keywords[] = {"path", "flags", "mode", "dir_fd", NULL};
4538 static _PyArg_Parser _parser = {NULL, _keywords, "open", 0};
4539 PyObject *argsbuf[4];
4540 Py_ssize_t noptargs = nargs + (kwnames ? PyTuple_GET_SIZE(kwnames) : 0) - 2;
4541 path_t path = PATH_T_INITIALIZE("open", "path", 0, 0);
4542 int flags;
4543 int mode = 511;
4544 int dir_fd = DEFAULT_DIR_FD;
4545 int _return_value;
4546
4547 args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 2, 3, 0, argsbuf);
4548 if (!args) {
4549 goto exit;
4550 }
4551 if (!path_converter(args[0], &path)) {
4552 goto exit;
4553 }
4554 flags = _PyLong_AsInt(args[1]);
4555 if (flags == -1 && PyErr_Occurred()) {
4556 goto exit;
4557 }
4558 if (!noptargs) {
4559 goto skip_optional_pos;
4560 }
4561 if (args[2]) {
4562 mode = _PyLong_AsInt(args[2]);
4563 if (mode == -1 && PyErr_Occurred()) {
4564 goto exit;
4565 }
4566 if (!--noptargs) {
4567 goto skip_optional_pos;
4568 }
4569 }
4570 skip_optional_pos:
4571 if (!noptargs) {
4572 goto skip_optional_kwonly;
4573 }
4574 if (!OPENAT_DIR_FD_CONVERTER(args[3], &dir_fd)) {
4575 goto exit;
4576 }
4577 skip_optional_kwonly:
4578 _return_value = os_open_impl(module, &path, flags, mode, dir_fd);
4579 if ((_return_value == -1) && PyErr_Occurred()) {
4580 goto exit;
4581 }
4582 return_value = PyLong_FromLong((long)_return_value);
4583
4584 exit:
4585 /* Cleanup for path */
4586 path_cleanup(&path);
4587
4588 return return_value;
4589 }
4590
4591 PyDoc_STRVAR(os_close__doc__,
4592 "close($module, /, fd)\n"
4593 "--\n"
4594 "\n"
4595 "Close a file descriptor.");
4596
4597 #define OS_CLOSE_METHODDEF \
4598 {"close", _PyCFunction_CAST(os_close), METH_FASTCALL|METH_KEYWORDS, os_close__doc__},
4599
4600 static PyObject *
4601 os_close_impl(PyObject *module, int fd);
4602
4603 static PyObject *
os_close(PyObject * module,PyObject * const * args,Py_ssize_t nargs,PyObject * kwnames)4604 os_close(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames)
4605 {
4606 PyObject *return_value = NULL;
4607 static const char * const _keywords[] = {"fd", NULL};
4608 static _PyArg_Parser _parser = {NULL, _keywords, "close", 0};
4609 PyObject *argsbuf[1];
4610 int fd;
4611
4612 args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 1, 1, 0, argsbuf);
4613 if (!args) {
4614 goto exit;
4615 }
4616 fd = _PyLong_AsInt(args[0]);
4617 if (fd == -1 && PyErr_Occurred()) {
4618 goto exit;
4619 }
4620 return_value = os_close_impl(module, fd);
4621
4622 exit:
4623 return return_value;
4624 }
4625
4626 PyDoc_STRVAR(os_closerange__doc__,
4627 "closerange($module, fd_low, fd_high, /)\n"
4628 "--\n"
4629 "\n"
4630 "Closes all file descriptors in [fd_low, fd_high), ignoring errors.");
4631
4632 #define OS_CLOSERANGE_METHODDEF \
4633 {"closerange", _PyCFunction_CAST(os_closerange), METH_FASTCALL, os_closerange__doc__},
4634
4635 static PyObject *
4636 os_closerange_impl(PyObject *module, int fd_low, int fd_high);
4637
4638 static PyObject *
os_closerange(PyObject * module,PyObject * const * args,Py_ssize_t nargs)4639 os_closerange(PyObject *module, PyObject *const *args, Py_ssize_t nargs)
4640 {
4641 PyObject *return_value = NULL;
4642 int fd_low;
4643 int fd_high;
4644
4645 if (!_PyArg_CheckPositional("closerange", nargs, 2, 2)) {
4646 goto exit;
4647 }
4648 fd_low = _PyLong_AsInt(args[0]);
4649 if (fd_low == -1 && PyErr_Occurred()) {
4650 goto exit;
4651 }
4652 fd_high = _PyLong_AsInt(args[1]);
4653 if (fd_high == -1 && PyErr_Occurred()) {
4654 goto exit;
4655 }
4656 return_value = os_closerange_impl(module, fd_low, fd_high);
4657
4658 exit:
4659 return return_value;
4660 }
4661
4662 PyDoc_STRVAR(os_dup__doc__,
4663 "dup($module, fd, /)\n"
4664 "--\n"
4665 "\n"
4666 "Return a duplicate of a file descriptor.");
4667
4668 #define OS_DUP_METHODDEF \
4669 {"dup", (PyCFunction)os_dup, METH_O, os_dup__doc__},
4670
4671 static int
4672 os_dup_impl(PyObject *module, int fd);
4673
4674 static PyObject *
os_dup(PyObject * module,PyObject * arg)4675 os_dup(PyObject *module, PyObject *arg)
4676 {
4677 PyObject *return_value = NULL;
4678 int fd;
4679 int _return_value;
4680
4681 fd = _PyLong_AsInt(arg);
4682 if (fd == -1 && PyErr_Occurred()) {
4683 goto exit;
4684 }
4685 _return_value = os_dup_impl(module, fd);
4686 if ((_return_value == -1) && PyErr_Occurred()) {
4687 goto exit;
4688 }
4689 return_value = PyLong_FromLong((long)_return_value);
4690
4691 exit:
4692 return return_value;
4693 }
4694
4695 #if ((defined(HAVE_DUP3) || defined(F_DUPFD) || defined(MS_WINDOWS)))
4696
4697 PyDoc_STRVAR(os_dup2__doc__,
4698 "dup2($module, /, fd, fd2, inheritable=True)\n"
4699 "--\n"
4700 "\n"
4701 "Duplicate file descriptor.");
4702
4703 #define OS_DUP2_METHODDEF \
4704 {"dup2", _PyCFunction_CAST(os_dup2), METH_FASTCALL|METH_KEYWORDS, os_dup2__doc__},
4705
4706 static int
4707 os_dup2_impl(PyObject *module, int fd, int fd2, int inheritable);
4708
4709 static PyObject *
os_dup2(PyObject * module,PyObject * const * args,Py_ssize_t nargs,PyObject * kwnames)4710 os_dup2(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames)
4711 {
4712 PyObject *return_value = NULL;
4713 static const char * const _keywords[] = {"fd", "fd2", "inheritable", NULL};
4714 static _PyArg_Parser _parser = {NULL, _keywords, "dup2", 0};
4715 PyObject *argsbuf[3];
4716 Py_ssize_t noptargs = nargs + (kwnames ? PyTuple_GET_SIZE(kwnames) : 0) - 2;
4717 int fd;
4718 int fd2;
4719 int inheritable = 1;
4720 int _return_value;
4721
4722 args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 2, 3, 0, argsbuf);
4723 if (!args) {
4724 goto exit;
4725 }
4726 fd = _PyLong_AsInt(args[0]);
4727 if (fd == -1 && PyErr_Occurred()) {
4728 goto exit;
4729 }
4730 fd2 = _PyLong_AsInt(args[1]);
4731 if (fd2 == -1 && PyErr_Occurred()) {
4732 goto exit;
4733 }
4734 if (!noptargs) {
4735 goto skip_optional_pos;
4736 }
4737 inheritable = PyObject_IsTrue(args[2]);
4738 if (inheritable < 0) {
4739 goto exit;
4740 }
4741 skip_optional_pos:
4742 _return_value = os_dup2_impl(module, fd, fd2, inheritable);
4743 if ((_return_value == -1) && PyErr_Occurred()) {
4744 goto exit;
4745 }
4746 return_value = PyLong_FromLong((long)_return_value);
4747
4748 exit:
4749 return return_value;
4750 }
4751
4752 #endif /* ((defined(HAVE_DUP3) || defined(F_DUPFD) || defined(MS_WINDOWS))) */
4753
4754 #if defined(HAVE_LOCKF)
4755
4756 PyDoc_STRVAR(os_lockf__doc__,
4757 "lockf($module, fd, command, length, /)\n"
4758 "--\n"
4759 "\n"
4760 "Apply, test or remove a POSIX lock on an open file descriptor.\n"
4761 "\n"
4762 " fd\n"
4763 " An open file descriptor.\n"
4764 " command\n"
4765 " One of F_LOCK, F_TLOCK, F_ULOCK or F_TEST.\n"
4766 " length\n"
4767 " The number of bytes to lock, starting at the current position.");
4768
4769 #define OS_LOCKF_METHODDEF \
4770 {"lockf", _PyCFunction_CAST(os_lockf), METH_FASTCALL, os_lockf__doc__},
4771
4772 static PyObject *
4773 os_lockf_impl(PyObject *module, int fd, int command, Py_off_t length);
4774
4775 static PyObject *
os_lockf(PyObject * module,PyObject * const * args,Py_ssize_t nargs)4776 os_lockf(PyObject *module, PyObject *const *args, Py_ssize_t nargs)
4777 {
4778 PyObject *return_value = NULL;
4779 int fd;
4780 int command;
4781 Py_off_t length;
4782
4783 if (!_PyArg_CheckPositional("lockf", nargs, 3, 3)) {
4784 goto exit;
4785 }
4786 fd = _PyLong_AsInt(args[0]);
4787 if (fd == -1 && PyErr_Occurred()) {
4788 goto exit;
4789 }
4790 command = _PyLong_AsInt(args[1]);
4791 if (command == -1 && PyErr_Occurred()) {
4792 goto exit;
4793 }
4794 if (!Py_off_t_converter(args[2], &length)) {
4795 goto exit;
4796 }
4797 return_value = os_lockf_impl(module, fd, command, length);
4798
4799 exit:
4800 return return_value;
4801 }
4802
4803 #endif /* defined(HAVE_LOCKF) */
4804
4805 PyDoc_STRVAR(os_lseek__doc__,
4806 "lseek($module, fd, position, how, /)\n"
4807 "--\n"
4808 "\n"
4809 "Set the position of a file descriptor. Return the new position.\n"
4810 "\n"
4811 "Return the new cursor position in number of bytes\n"
4812 "relative to the beginning of the file.");
4813
4814 #define OS_LSEEK_METHODDEF \
4815 {"lseek", _PyCFunction_CAST(os_lseek), METH_FASTCALL, os_lseek__doc__},
4816
4817 static Py_off_t
4818 os_lseek_impl(PyObject *module, int fd, Py_off_t position, int how);
4819
4820 static PyObject *
os_lseek(PyObject * module,PyObject * const * args,Py_ssize_t nargs)4821 os_lseek(PyObject *module, PyObject *const *args, Py_ssize_t nargs)
4822 {
4823 PyObject *return_value = NULL;
4824 int fd;
4825 Py_off_t position;
4826 int how;
4827 Py_off_t _return_value;
4828
4829 if (!_PyArg_CheckPositional("lseek", nargs, 3, 3)) {
4830 goto exit;
4831 }
4832 fd = _PyLong_AsInt(args[0]);
4833 if (fd == -1 && PyErr_Occurred()) {
4834 goto exit;
4835 }
4836 if (!Py_off_t_converter(args[1], &position)) {
4837 goto exit;
4838 }
4839 how = _PyLong_AsInt(args[2]);
4840 if (how == -1 && PyErr_Occurred()) {
4841 goto exit;
4842 }
4843 _return_value = os_lseek_impl(module, fd, position, how);
4844 if ((_return_value == -1) && PyErr_Occurred()) {
4845 goto exit;
4846 }
4847 return_value = PyLong_FromPy_off_t(_return_value);
4848
4849 exit:
4850 return return_value;
4851 }
4852
4853 PyDoc_STRVAR(os_read__doc__,
4854 "read($module, fd, length, /)\n"
4855 "--\n"
4856 "\n"
4857 "Read from a file descriptor. Returns a bytes object.");
4858
4859 #define OS_READ_METHODDEF \
4860 {"read", _PyCFunction_CAST(os_read), METH_FASTCALL, os_read__doc__},
4861
4862 static PyObject *
4863 os_read_impl(PyObject *module, int fd, Py_ssize_t length);
4864
4865 static PyObject *
os_read(PyObject * module,PyObject * const * args,Py_ssize_t nargs)4866 os_read(PyObject *module, PyObject *const *args, Py_ssize_t nargs)
4867 {
4868 PyObject *return_value = NULL;
4869 int fd;
4870 Py_ssize_t length;
4871
4872 if (!_PyArg_CheckPositional("read", nargs, 2, 2)) {
4873 goto exit;
4874 }
4875 fd = _PyLong_AsInt(args[0]);
4876 if (fd == -1 && PyErr_Occurred()) {
4877 goto exit;
4878 }
4879 {
4880 Py_ssize_t ival = -1;
4881 PyObject *iobj = _PyNumber_Index(args[1]);
4882 if (iobj != NULL) {
4883 ival = PyLong_AsSsize_t(iobj);
4884 Py_DECREF(iobj);
4885 }
4886 if (ival == -1 && PyErr_Occurred()) {
4887 goto exit;
4888 }
4889 length = ival;
4890 }
4891 return_value = os_read_impl(module, fd, length);
4892
4893 exit:
4894 return return_value;
4895 }
4896
4897 #if defined(HAVE_READV)
4898
4899 PyDoc_STRVAR(os_readv__doc__,
4900 "readv($module, fd, buffers, /)\n"
4901 "--\n"
4902 "\n"
4903 "Read from a file descriptor fd into an iterable of buffers.\n"
4904 "\n"
4905 "The buffers should be mutable buffers accepting bytes.\n"
4906 "readv will transfer data into each buffer until it is full\n"
4907 "and then move on to the next buffer in the sequence to hold\n"
4908 "the rest of the data.\n"
4909 "\n"
4910 "readv returns the total number of bytes read,\n"
4911 "which may be less than the total capacity of all the buffers.");
4912
4913 #define OS_READV_METHODDEF \
4914 {"readv", _PyCFunction_CAST(os_readv), METH_FASTCALL, os_readv__doc__},
4915
4916 static Py_ssize_t
4917 os_readv_impl(PyObject *module, int fd, PyObject *buffers);
4918
4919 static PyObject *
os_readv(PyObject * module,PyObject * const * args,Py_ssize_t nargs)4920 os_readv(PyObject *module, PyObject *const *args, Py_ssize_t nargs)
4921 {
4922 PyObject *return_value = NULL;
4923 int fd;
4924 PyObject *buffers;
4925 Py_ssize_t _return_value;
4926
4927 if (!_PyArg_CheckPositional("readv", nargs, 2, 2)) {
4928 goto exit;
4929 }
4930 fd = _PyLong_AsInt(args[0]);
4931 if (fd == -1 && PyErr_Occurred()) {
4932 goto exit;
4933 }
4934 buffers = args[1];
4935 _return_value = os_readv_impl(module, fd, buffers);
4936 if ((_return_value == -1) && PyErr_Occurred()) {
4937 goto exit;
4938 }
4939 return_value = PyLong_FromSsize_t(_return_value);
4940
4941 exit:
4942 return return_value;
4943 }
4944
4945 #endif /* defined(HAVE_READV) */
4946
4947 #if defined(HAVE_PREAD)
4948
4949 PyDoc_STRVAR(os_pread__doc__,
4950 "pread($module, fd, length, offset, /)\n"
4951 "--\n"
4952 "\n"
4953 "Read a number of bytes from a file descriptor starting at a particular offset.\n"
4954 "\n"
4955 "Read length bytes from file descriptor fd, starting at offset bytes from\n"
4956 "the beginning of the file. The file offset remains unchanged.");
4957
4958 #define OS_PREAD_METHODDEF \
4959 {"pread", _PyCFunction_CAST(os_pread), METH_FASTCALL, os_pread__doc__},
4960
4961 static PyObject *
4962 os_pread_impl(PyObject *module, int fd, Py_ssize_t length, Py_off_t offset);
4963
4964 static PyObject *
os_pread(PyObject * module,PyObject * const * args,Py_ssize_t nargs)4965 os_pread(PyObject *module, PyObject *const *args, Py_ssize_t nargs)
4966 {
4967 PyObject *return_value = NULL;
4968 int fd;
4969 Py_ssize_t length;
4970 Py_off_t offset;
4971
4972 if (!_PyArg_CheckPositional("pread", nargs, 3, 3)) {
4973 goto exit;
4974 }
4975 fd = _PyLong_AsInt(args[0]);
4976 if (fd == -1 && PyErr_Occurred()) {
4977 goto exit;
4978 }
4979 {
4980 Py_ssize_t ival = -1;
4981 PyObject *iobj = _PyNumber_Index(args[1]);
4982 if (iobj != NULL) {
4983 ival = PyLong_AsSsize_t(iobj);
4984 Py_DECREF(iobj);
4985 }
4986 if (ival == -1 && PyErr_Occurred()) {
4987 goto exit;
4988 }
4989 length = ival;
4990 }
4991 if (!Py_off_t_converter(args[2], &offset)) {
4992 goto exit;
4993 }
4994 return_value = os_pread_impl(module, fd, length, offset);
4995
4996 exit:
4997 return return_value;
4998 }
4999
5000 #endif /* defined(HAVE_PREAD) */
5001
5002 #if (defined(HAVE_PREADV) || defined (HAVE_PREADV2))
5003
5004 PyDoc_STRVAR(os_preadv__doc__,
5005 "preadv($module, fd, buffers, offset, flags=0, /)\n"
5006 "--\n"
5007 "\n"
5008 "Reads from a file descriptor into a number of mutable bytes-like objects.\n"
5009 "\n"
5010 "Combines the functionality of readv() and pread(). As readv(), it will\n"
5011 "transfer data into each buffer until it is full and then move on to the next\n"
5012 "buffer in the sequence to hold the rest of the data. Its fourth argument,\n"
5013 "specifies the file offset at which the input operation is to be performed. It\n"
5014 "will return the total number of bytes read (which can be less than the total\n"
5015 "capacity of all the objects).\n"
5016 "\n"
5017 "The flags argument contains a bitwise OR of zero or more of the following flags:\n"
5018 "\n"
5019 "- RWF_HIPRI\n"
5020 "- RWF_NOWAIT\n"
5021 "\n"
5022 "Using non-zero flags requires Linux 4.6 or newer.");
5023
5024 #define OS_PREADV_METHODDEF \
5025 {"preadv", _PyCFunction_CAST(os_preadv), METH_FASTCALL, os_preadv__doc__},
5026
5027 static Py_ssize_t
5028 os_preadv_impl(PyObject *module, int fd, PyObject *buffers, Py_off_t offset,
5029 int flags);
5030
5031 static PyObject *
os_preadv(PyObject * module,PyObject * const * args,Py_ssize_t nargs)5032 os_preadv(PyObject *module, PyObject *const *args, Py_ssize_t nargs)
5033 {
5034 PyObject *return_value = NULL;
5035 int fd;
5036 PyObject *buffers;
5037 Py_off_t offset;
5038 int flags = 0;
5039 Py_ssize_t _return_value;
5040
5041 if (!_PyArg_CheckPositional("preadv", nargs, 3, 4)) {
5042 goto exit;
5043 }
5044 fd = _PyLong_AsInt(args[0]);
5045 if (fd == -1 && PyErr_Occurred()) {
5046 goto exit;
5047 }
5048 buffers = args[1];
5049 if (!Py_off_t_converter(args[2], &offset)) {
5050 goto exit;
5051 }
5052 if (nargs < 4) {
5053 goto skip_optional;
5054 }
5055 flags = _PyLong_AsInt(args[3]);
5056 if (flags == -1 && PyErr_Occurred()) {
5057 goto exit;
5058 }
5059 skip_optional:
5060 _return_value = os_preadv_impl(module, fd, buffers, offset, flags);
5061 if ((_return_value == -1) && PyErr_Occurred()) {
5062 goto exit;
5063 }
5064 return_value = PyLong_FromSsize_t(_return_value);
5065
5066 exit:
5067 return return_value;
5068 }
5069
5070 #endif /* (defined(HAVE_PREADV) || defined (HAVE_PREADV2)) */
5071
5072 PyDoc_STRVAR(os_write__doc__,
5073 "write($module, fd, data, /)\n"
5074 "--\n"
5075 "\n"
5076 "Write a bytes object to a file descriptor.");
5077
5078 #define OS_WRITE_METHODDEF \
5079 {"write", _PyCFunction_CAST(os_write), METH_FASTCALL, os_write__doc__},
5080
5081 static Py_ssize_t
5082 os_write_impl(PyObject *module, int fd, Py_buffer *data);
5083
5084 static PyObject *
os_write(PyObject * module,PyObject * const * args,Py_ssize_t nargs)5085 os_write(PyObject *module, PyObject *const *args, Py_ssize_t nargs)
5086 {
5087 PyObject *return_value = NULL;
5088 int fd;
5089 Py_buffer data = {NULL, NULL};
5090 Py_ssize_t _return_value;
5091
5092 if (!_PyArg_CheckPositional("write", nargs, 2, 2)) {
5093 goto exit;
5094 }
5095 fd = _PyLong_AsInt(args[0]);
5096 if (fd == -1 && PyErr_Occurred()) {
5097 goto exit;
5098 }
5099 if (PyObject_GetBuffer(args[1], &data, PyBUF_SIMPLE) != 0) {
5100 goto exit;
5101 }
5102 if (!PyBuffer_IsContiguous(&data, 'C')) {
5103 _PyArg_BadArgument("write", "argument 2", "contiguous buffer", args[1]);
5104 goto exit;
5105 }
5106 _return_value = os_write_impl(module, fd, &data);
5107 if ((_return_value == -1) && PyErr_Occurred()) {
5108 goto exit;
5109 }
5110 return_value = PyLong_FromSsize_t(_return_value);
5111
5112 exit:
5113 /* Cleanup for data */
5114 if (data.obj) {
5115 PyBuffer_Release(&data);
5116 }
5117
5118 return return_value;
5119 }
5120
5121 #if defined(HAVE_SENDFILE) && defined(__APPLE__)
5122
5123 PyDoc_STRVAR(os_sendfile__doc__,
5124 "sendfile($module, /, out_fd, in_fd, offset, count, headers=(),\n"
5125 " trailers=(), flags=0)\n"
5126 "--\n"
5127 "\n"
5128 "Copy count bytes from file descriptor in_fd to file descriptor out_fd.");
5129
5130 #define OS_SENDFILE_METHODDEF \
5131 {"sendfile", _PyCFunction_CAST(os_sendfile), METH_FASTCALL|METH_KEYWORDS, os_sendfile__doc__},
5132
5133 static PyObject *
5134 os_sendfile_impl(PyObject *module, int out_fd, int in_fd, Py_off_t offset,
5135 Py_off_t sbytes, PyObject *headers, PyObject *trailers,
5136 int flags);
5137
5138 static PyObject *
os_sendfile(PyObject * module,PyObject * const * args,Py_ssize_t nargs,PyObject * kwnames)5139 os_sendfile(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames)
5140 {
5141 PyObject *return_value = NULL;
5142 static const char * const _keywords[] = {"out_fd", "in_fd", "offset", "count", "headers", "trailers", "flags", NULL};
5143 static _PyArg_Parser _parser = {NULL, _keywords, "sendfile", 0};
5144 PyObject *argsbuf[7];
5145 Py_ssize_t noptargs = nargs + (kwnames ? PyTuple_GET_SIZE(kwnames) : 0) - 4;
5146 int out_fd;
5147 int in_fd;
5148 Py_off_t offset;
5149 Py_off_t sbytes;
5150 PyObject *headers = NULL;
5151 PyObject *trailers = NULL;
5152 int flags = 0;
5153
5154 args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 4, 7, 0, argsbuf);
5155 if (!args) {
5156 goto exit;
5157 }
5158 out_fd = _PyLong_AsInt(args[0]);
5159 if (out_fd == -1 && PyErr_Occurred()) {
5160 goto exit;
5161 }
5162 in_fd = _PyLong_AsInt(args[1]);
5163 if (in_fd == -1 && PyErr_Occurred()) {
5164 goto exit;
5165 }
5166 if (!Py_off_t_converter(args[2], &offset)) {
5167 goto exit;
5168 }
5169 if (!Py_off_t_converter(args[3], &sbytes)) {
5170 goto exit;
5171 }
5172 if (!noptargs) {
5173 goto skip_optional_pos;
5174 }
5175 if (args[4]) {
5176 headers = args[4];
5177 if (!--noptargs) {
5178 goto skip_optional_pos;
5179 }
5180 }
5181 if (args[5]) {
5182 trailers = args[5];
5183 if (!--noptargs) {
5184 goto skip_optional_pos;
5185 }
5186 }
5187 flags = _PyLong_AsInt(args[6]);
5188 if (flags == -1 && PyErr_Occurred()) {
5189 goto exit;
5190 }
5191 skip_optional_pos:
5192 return_value = os_sendfile_impl(module, out_fd, in_fd, offset, sbytes, headers, trailers, flags);
5193
5194 exit:
5195 return return_value;
5196 }
5197
5198 #endif /* defined(HAVE_SENDFILE) && defined(__APPLE__) */
5199
5200 #if defined(HAVE_SENDFILE) && !defined(__APPLE__) && (defined(__FreeBSD__) || defined(__DragonFly__))
5201
5202 PyDoc_STRVAR(os_sendfile__doc__,
5203 "sendfile($module, /, out_fd, in_fd, offset, count, headers=(),\n"
5204 " trailers=(), flags=0)\n"
5205 "--\n"
5206 "\n"
5207 "Copy count bytes from file descriptor in_fd to file descriptor out_fd.");
5208
5209 #define OS_SENDFILE_METHODDEF \
5210 {"sendfile", _PyCFunction_CAST(os_sendfile), METH_FASTCALL|METH_KEYWORDS, os_sendfile__doc__},
5211
5212 static PyObject *
5213 os_sendfile_impl(PyObject *module, int out_fd, int in_fd, Py_off_t offset,
5214 Py_ssize_t count, PyObject *headers, PyObject *trailers,
5215 int flags);
5216
5217 static PyObject *
os_sendfile(PyObject * module,PyObject * const * args,Py_ssize_t nargs,PyObject * kwnames)5218 os_sendfile(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames)
5219 {
5220 PyObject *return_value = NULL;
5221 static const char * const _keywords[] = {"out_fd", "in_fd", "offset", "count", "headers", "trailers", "flags", NULL};
5222 static _PyArg_Parser _parser = {NULL, _keywords, "sendfile", 0};
5223 PyObject *argsbuf[7];
5224 Py_ssize_t noptargs = nargs + (kwnames ? PyTuple_GET_SIZE(kwnames) : 0) - 4;
5225 int out_fd;
5226 int in_fd;
5227 Py_off_t offset;
5228 Py_ssize_t count;
5229 PyObject *headers = NULL;
5230 PyObject *trailers = NULL;
5231 int flags = 0;
5232
5233 args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 4, 7, 0, argsbuf);
5234 if (!args) {
5235 goto exit;
5236 }
5237 out_fd = _PyLong_AsInt(args[0]);
5238 if (out_fd == -1 && PyErr_Occurred()) {
5239 goto exit;
5240 }
5241 in_fd = _PyLong_AsInt(args[1]);
5242 if (in_fd == -1 && PyErr_Occurred()) {
5243 goto exit;
5244 }
5245 if (!Py_off_t_converter(args[2], &offset)) {
5246 goto exit;
5247 }
5248 {
5249 Py_ssize_t ival = -1;
5250 PyObject *iobj = _PyNumber_Index(args[3]);
5251 if (iobj != NULL) {
5252 ival = PyLong_AsSsize_t(iobj);
5253 Py_DECREF(iobj);
5254 }
5255 if (ival == -1 && PyErr_Occurred()) {
5256 goto exit;
5257 }
5258 count = ival;
5259 }
5260 if (!noptargs) {
5261 goto skip_optional_pos;
5262 }
5263 if (args[4]) {
5264 headers = args[4];
5265 if (!--noptargs) {
5266 goto skip_optional_pos;
5267 }
5268 }
5269 if (args[5]) {
5270 trailers = args[5];
5271 if (!--noptargs) {
5272 goto skip_optional_pos;
5273 }
5274 }
5275 flags = _PyLong_AsInt(args[6]);
5276 if (flags == -1 && PyErr_Occurred()) {
5277 goto exit;
5278 }
5279 skip_optional_pos:
5280 return_value = os_sendfile_impl(module, out_fd, in_fd, offset, count, headers, trailers, flags);
5281
5282 exit:
5283 return return_value;
5284 }
5285
5286 #endif /* defined(HAVE_SENDFILE) && !defined(__APPLE__) && (defined(__FreeBSD__) || defined(__DragonFly__)) */
5287
5288 #if defined(HAVE_SENDFILE) && !defined(__APPLE__) && !(defined(__FreeBSD__) || defined(__DragonFly__))
5289
5290 PyDoc_STRVAR(os_sendfile__doc__,
5291 "sendfile($module, /, out_fd, in_fd, offset, count)\n"
5292 "--\n"
5293 "\n"
5294 "Copy count bytes from file descriptor in_fd to file descriptor out_fd.");
5295
5296 #define OS_SENDFILE_METHODDEF \
5297 {"sendfile", _PyCFunction_CAST(os_sendfile), METH_FASTCALL|METH_KEYWORDS, os_sendfile__doc__},
5298
5299 static PyObject *
5300 os_sendfile_impl(PyObject *module, int out_fd, int in_fd, PyObject *offobj,
5301 Py_ssize_t count);
5302
5303 static PyObject *
os_sendfile(PyObject * module,PyObject * const * args,Py_ssize_t nargs,PyObject * kwnames)5304 os_sendfile(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames)
5305 {
5306 PyObject *return_value = NULL;
5307 static const char * const _keywords[] = {"out_fd", "in_fd", "offset", "count", NULL};
5308 static _PyArg_Parser _parser = {NULL, _keywords, "sendfile", 0};
5309 PyObject *argsbuf[4];
5310 int out_fd;
5311 int in_fd;
5312 PyObject *offobj;
5313 Py_ssize_t count;
5314
5315 args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 4, 4, 0, argsbuf);
5316 if (!args) {
5317 goto exit;
5318 }
5319 out_fd = _PyLong_AsInt(args[0]);
5320 if (out_fd == -1 && PyErr_Occurred()) {
5321 goto exit;
5322 }
5323 in_fd = _PyLong_AsInt(args[1]);
5324 if (in_fd == -1 && PyErr_Occurred()) {
5325 goto exit;
5326 }
5327 offobj = args[2];
5328 {
5329 Py_ssize_t ival = -1;
5330 PyObject *iobj = _PyNumber_Index(args[3]);
5331 if (iobj != NULL) {
5332 ival = PyLong_AsSsize_t(iobj);
5333 Py_DECREF(iobj);
5334 }
5335 if (ival == -1 && PyErr_Occurred()) {
5336 goto exit;
5337 }
5338 count = ival;
5339 }
5340 return_value = os_sendfile_impl(module, out_fd, in_fd, offobj, count);
5341
5342 exit:
5343 return return_value;
5344 }
5345
5346 #endif /* defined(HAVE_SENDFILE) && !defined(__APPLE__) && !(defined(__FreeBSD__) || defined(__DragonFly__)) */
5347
5348 #if defined(__APPLE__)
5349
5350 PyDoc_STRVAR(os__fcopyfile__doc__,
5351 "_fcopyfile($module, in_fd, out_fd, flags, /)\n"
5352 "--\n"
5353 "\n"
5354 "Efficiently copy content or metadata of 2 regular file descriptors (macOS).");
5355
5356 #define OS__FCOPYFILE_METHODDEF \
5357 {"_fcopyfile", _PyCFunction_CAST(os__fcopyfile), METH_FASTCALL, os__fcopyfile__doc__},
5358
5359 static PyObject *
5360 os__fcopyfile_impl(PyObject *module, int in_fd, int out_fd, int flags);
5361
5362 static PyObject *
os__fcopyfile(PyObject * module,PyObject * const * args,Py_ssize_t nargs)5363 os__fcopyfile(PyObject *module, PyObject *const *args, Py_ssize_t nargs)
5364 {
5365 PyObject *return_value = NULL;
5366 int in_fd;
5367 int out_fd;
5368 int flags;
5369
5370 if (!_PyArg_CheckPositional("_fcopyfile", nargs, 3, 3)) {
5371 goto exit;
5372 }
5373 in_fd = _PyLong_AsInt(args[0]);
5374 if (in_fd == -1 && PyErr_Occurred()) {
5375 goto exit;
5376 }
5377 out_fd = _PyLong_AsInt(args[1]);
5378 if (out_fd == -1 && PyErr_Occurred()) {
5379 goto exit;
5380 }
5381 flags = _PyLong_AsInt(args[2]);
5382 if (flags == -1 && PyErr_Occurred()) {
5383 goto exit;
5384 }
5385 return_value = os__fcopyfile_impl(module, in_fd, out_fd, flags);
5386
5387 exit:
5388 return return_value;
5389 }
5390
5391 #endif /* defined(__APPLE__) */
5392
5393 PyDoc_STRVAR(os_fstat__doc__,
5394 "fstat($module, /, fd)\n"
5395 "--\n"
5396 "\n"
5397 "Perform a stat system call on the given file descriptor.\n"
5398 "\n"
5399 "Like stat(), but for an open file descriptor.\n"
5400 "Equivalent to os.stat(fd).");
5401
5402 #define OS_FSTAT_METHODDEF \
5403 {"fstat", _PyCFunction_CAST(os_fstat), METH_FASTCALL|METH_KEYWORDS, os_fstat__doc__},
5404
5405 static PyObject *
5406 os_fstat_impl(PyObject *module, int fd);
5407
5408 static PyObject *
os_fstat(PyObject * module,PyObject * const * args,Py_ssize_t nargs,PyObject * kwnames)5409 os_fstat(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames)
5410 {
5411 PyObject *return_value = NULL;
5412 static const char * const _keywords[] = {"fd", NULL};
5413 static _PyArg_Parser _parser = {NULL, _keywords, "fstat", 0};
5414 PyObject *argsbuf[1];
5415 int fd;
5416
5417 args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 1, 1, 0, argsbuf);
5418 if (!args) {
5419 goto exit;
5420 }
5421 fd = _PyLong_AsInt(args[0]);
5422 if (fd == -1 && PyErr_Occurred()) {
5423 goto exit;
5424 }
5425 return_value = os_fstat_impl(module, fd);
5426
5427 exit:
5428 return return_value;
5429 }
5430
5431 PyDoc_STRVAR(os_isatty__doc__,
5432 "isatty($module, fd, /)\n"
5433 "--\n"
5434 "\n"
5435 "Return True if the fd is connected to a terminal.\n"
5436 "\n"
5437 "Return True if the file descriptor is an open file descriptor\n"
5438 "connected to the slave end of a terminal.");
5439
5440 #define OS_ISATTY_METHODDEF \
5441 {"isatty", (PyCFunction)os_isatty, METH_O, os_isatty__doc__},
5442
5443 static int
5444 os_isatty_impl(PyObject *module, int fd);
5445
5446 static PyObject *
os_isatty(PyObject * module,PyObject * arg)5447 os_isatty(PyObject *module, PyObject *arg)
5448 {
5449 PyObject *return_value = NULL;
5450 int fd;
5451 int _return_value;
5452
5453 fd = _PyLong_AsInt(arg);
5454 if (fd == -1 && PyErr_Occurred()) {
5455 goto exit;
5456 }
5457 _return_value = os_isatty_impl(module, fd);
5458 if ((_return_value == -1) && PyErr_Occurred()) {
5459 goto exit;
5460 }
5461 return_value = PyBool_FromLong((long)_return_value);
5462
5463 exit:
5464 return return_value;
5465 }
5466
5467 #if defined(HAVE_PIPE)
5468
5469 PyDoc_STRVAR(os_pipe__doc__,
5470 "pipe($module, /)\n"
5471 "--\n"
5472 "\n"
5473 "Create a pipe.\n"
5474 "\n"
5475 "Returns a tuple of two file descriptors:\n"
5476 " (read_fd, write_fd)");
5477
5478 #define OS_PIPE_METHODDEF \
5479 {"pipe", (PyCFunction)os_pipe, METH_NOARGS, os_pipe__doc__},
5480
5481 static PyObject *
5482 os_pipe_impl(PyObject *module);
5483
5484 static PyObject *
os_pipe(PyObject * module,PyObject * Py_UNUSED (ignored))5485 os_pipe(PyObject *module, PyObject *Py_UNUSED(ignored))
5486 {
5487 return os_pipe_impl(module);
5488 }
5489
5490 #endif /* defined(HAVE_PIPE) */
5491
5492 #if defined(HAVE_PIPE2)
5493
5494 PyDoc_STRVAR(os_pipe2__doc__,
5495 "pipe2($module, flags, /)\n"
5496 "--\n"
5497 "\n"
5498 "Create a pipe with flags set atomically.\n"
5499 "\n"
5500 "Returns a tuple of two file descriptors:\n"
5501 " (read_fd, write_fd)\n"
5502 "\n"
5503 "flags can be constructed by ORing together one or more of these values:\n"
5504 "O_NONBLOCK, O_CLOEXEC.");
5505
5506 #define OS_PIPE2_METHODDEF \
5507 {"pipe2", (PyCFunction)os_pipe2, METH_O, os_pipe2__doc__},
5508
5509 static PyObject *
5510 os_pipe2_impl(PyObject *module, int flags);
5511
5512 static PyObject *
os_pipe2(PyObject * module,PyObject * arg)5513 os_pipe2(PyObject *module, PyObject *arg)
5514 {
5515 PyObject *return_value = NULL;
5516 int flags;
5517
5518 flags = _PyLong_AsInt(arg);
5519 if (flags == -1 && PyErr_Occurred()) {
5520 goto exit;
5521 }
5522 return_value = os_pipe2_impl(module, flags);
5523
5524 exit:
5525 return return_value;
5526 }
5527
5528 #endif /* defined(HAVE_PIPE2) */
5529
5530 #if defined(HAVE_WRITEV)
5531
5532 PyDoc_STRVAR(os_writev__doc__,
5533 "writev($module, fd, buffers, /)\n"
5534 "--\n"
5535 "\n"
5536 "Iterate over buffers, and write the contents of each to a file descriptor.\n"
5537 "\n"
5538 "Returns the total number of bytes written.\n"
5539 "buffers must be a sequence of bytes-like objects.");
5540
5541 #define OS_WRITEV_METHODDEF \
5542 {"writev", _PyCFunction_CAST(os_writev), METH_FASTCALL, os_writev__doc__},
5543
5544 static Py_ssize_t
5545 os_writev_impl(PyObject *module, int fd, PyObject *buffers);
5546
5547 static PyObject *
os_writev(PyObject * module,PyObject * const * args,Py_ssize_t nargs)5548 os_writev(PyObject *module, PyObject *const *args, Py_ssize_t nargs)
5549 {
5550 PyObject *return_value = NULL;
5551 int fd;
5552 PyObject *buffers;
5553 Py_ssize_t _return_value;
5554
5555 if (!_PyArg_CheckPositional("writev", nargs, 2, 2)) {
5556 goto exit;
5557 }
5558 fd = _PyLong_AsInt(args[0]);
5559 if (fd == -1 && PyErr_Occurred()) {
5560 goto exit;
5561 }
5562 buffers = args[1];
5563 _return_value = os_writev_impl(module, fd, buffers);
5564 if ((_return_value == -1) && PyErr_Occurred()) {
5565 goto exit;
5566 }
5567 return_value = PyLong_FromSsize_t(_return_value);
5568
5569 exit:
5570 return return_value;
5571 }
5572
5573 #endif /* defined(HAVE_WRITEV) */
5574
5575 #if defined(HAVE_PWRITE)
5576
5577 PyDoc_STRVAR(os_pwrite__doc__,
5578 "pwrite($module, fd, buffer, offset, /)\n"
5579 "--\n"
5580 "\n"
5581 "Write bytes to a file descriptor starting at a particular offset.\n"
5582 "\n"
5583 "Write buffer to fd, starting at offset bytes from the beginning of\n"
5584 "the file. Returns the number of bytes writte. Does not change the\n"
5585 "current file offset.");
5586
5587 #define OS_PWRITE_METHODDEF \
5588 {"pwrite", _PyCFunction_CAST(os_pwrite), METH_FASTCALL, os_pwrite__doc__},
5589
5590 static Py_ssize_t
5591 os_pwrite_impl(PyObject *module, int fd, Py_buffer *buffer, Py_off_t offset);
5592
5593 static PyObject *
os_pwrite(PyObject * module,PyObject * const * args,Py_ssize_t nargs)5594 os_pwrite(PyObject *module, PyObject *const *args, Py_ssize_t nargs)
5595 {
5596 PyObject *return_value = NULL;
5597 int fd;
5598 Py_buffer buffer = {NULL, NULL};
5599 Py_off_t offset;
5600 Py_ssize_t _return_value;
5601
5602 if (!_PyArg_CheckPositional("pwrite", nargs, 3, 3)) {
5603 goto exit;
5604 }
5605 fd = _PyLong_AsInt(args[0]);
5606 if (fd == -1 && PyErr_Occurred()) {
5607 goto exit;
5608 }
5609 if (PyObject_GetBuffer(args[1], &buffer, PyBUF_SIMPLE) != 0) {
5610 goto exit;
5611 }
5612 if (!PyBuffer_IsContiguous(&buffer, 'C')) {
5613 _PyArg_BadArgument("pwrite", "argument 2", "contiguous buffer", args[1]);
5614 goto exit;
5615 }
5616 if (!Py_off_t_converter(args[2], &offset)) {
5617 goto exit;
5618 }
5619 _return_value = os_pwrite_impl(module, fd, &buffer, offset);
5620 if ((_return_value == -1) && PyErr_Occurred()) {
5621 goto exit;
5622 }
5623 return_value = PyLong_FromSsize_t(_return_value);
5624
5625 exit:
5626 /* Cleanup for buffer */
5627 if (buffer.obj) {
5628 PyBuffer_Release(&buffer);
5629 }
5630
5631 return return_value;
5632 }
5633
5634 #endif /* defined(HAVE_PWRITE) */
5635
5636 #if (defined(HAVE_PWRITEV) || defined (HAVE_PWRITEV2))
5637
5638 PyDoc_STRVAR(os_pwritev__doc__,
5639 "pwritev($module, fd, buffers, offset, flags=0, /)\n"
5640 "--\n"
5641 "\n"
5642 "Writes the contents of bytes-like objects to a file descriptor at a given offset.\n"
5643 "\n"
5644 "Combines the functionality of writev() and pwrite(). All buffers must be a sequence\n"
5645 "of bytes-like objects. Buffers are processed in array order. Entire contents of first\n"
5646 "buffer is written before proceeding to second, and so on. The operating system may\n"
5647 "set a limit (sysconf() value SC_IOV_MAX) on the number of buffers that can be used.\n"
5648 "This function writes the contents of each object to the file descriptor and returns\n"
5649 "the total number of bytes written.\n"
5650 "\n"
5651 "The flags argument contains a bitwise OR of zero or more of the following flags:\n"
5652 "\n"
5653 "- RWF_DSYNC\n"
5654 "- RWF_SYNC\n"
5655 "- RWF_APPEND\n"
5656 "\n"
5657 "Using non-zero flags requires Linux 4.7 or newer.");
5658
5659 #define OS_PWRITEV_METHODDEF \
5660 {"pwritev", _PyCFunction_CAST(os_pwritev), METH_FASTCALL, os_pwritev__doc__},
5661
5662 static Py_ssize_t
5663 os_pwritev_impl(PyObject *module, int fd, PyObject *buffers, Py_off_t offset,
5664 int flags);
5665
5666 static PyObject *
os_pwritev(PyObject * module,PyObject * const * args,Py_ssize_t nargs)5667 os_pwritev(PyObject *module, PyObject *const *args, Py_ssize_t nargs)
5668 {
5669 PyObject *return_value = NULL;
5670 int fd;
5671 PyObject *buffers;
5672 Py_off_t offset;
5673 int flags = 0;
5674 Py_ssize_t _return_value;
5675
5676 if (!_PyArg_CheckPositional("pwritev", nargs, 3, 4)) {
5677 goto exit;
5678 }
5679 fd = _PyLong_AsInt(args[0]);
5680 if (fd == -1 && PyErr_Occurred()) {
5681 goto exit;
5682 }
5683 buffers = args[1];
5684 if (!Py_off_t_converter(args[2], &offset)) {
5685 goto exit;
5686 }
5687 if (nargs < 4) {
5688 goto skip_optional;
5689 }
5690 flags = _PyLong_AsInt(args[3]);
5691 if (flags == -1 && PyErr_Occurred()) {
5692 goto exit;
5693 }
5694 skip_optional:
5695 _return_value = os_pwritev_impl(module, fd, buffers, offset, flags);
5696 if ((_return_value == -1) && PyErr_Occurred()) {
5697 goto exit;
5698 }
5699 return_value = PyLong_FromSsize_t(_return_value);
5700
5701 exit:
5702 return return_value;
5703 }
5704
5705 #endif /* (defined(HAVE_PWRITEV) || defined (HAVE_PWRITEV2)) */
5706
5707 #if defined(HAVE_COPY_FILE_RANGE)
5708
5709 PyDoc_STRVAR(os_copy_file_range__doc__,
5710 "copy_file_range($module, /, src, dst, count, offset_src=None,\n"
5711 " offset_dst=None)\n"
5712 "--\n"
5713 "\n"
5714 "Copy count bytes from one file descriptor to another.\n"
5715 "\n"
5716 " src\n"
5717 " Source file descriptor.\n"
5718 " dst\n"
5719 " Destination file descriptor.\n"
5720 " count\n"
5721 " Number of bytes to copy.\n"
5722 " offset_src\n"
5723 " Starting offset in src.\n"
5724 " offset_dst\n"
5725 " Starting offset in dst.\n"
5726 "\n"
5727 "If offset_src is None, then src is read from the current position;\n"
5728 "respectively for offset_dst.");
5729
5730 #define OS_COPY_FILE_RANGE_METHODDEF \
5731 {"copy_file_range", _PyCFunction_CAST(os_copy_file_range), METH_FASTCALL|METH_KEYWORDS, os_copy_file_range__doc__},
5732
5733 static PyObject *
5734 os_copy_file_range_impl(PyObject *module, int src, int dst, Py_ssize_t count,
5735 PyObject *offset_src, PyObject *offset_dst);
5736
5737 static PyObject *
os_copy_file_range(PyObject * module,PyObject * const * args,Py_ssize_t nargs,PyObject * kwnames)5738 os_copy_file_range(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames)
5739 {
5740 PyObject *return_value = NULL;
5741 static const char * const _keywords[] = {"src", "dst", "count", "offset_src", "offset_dst", NULL};
5742 static _PyArg_Parser _parser = {NULL, _keywords, "copy_file_range", 0};
5743 PyObject *argsbuf[5];
5744 Py_ssize_t noptargs = nargs + (kwnames ? PyTuple_GET_SIZE(kwnames) : 0) - 3;
5745 int src;
5746 int dst;
5747 Py_ssize_t count;
5748 PyObject *offset_src = Py_None;
5749 PyObject *offset_dst = Py_None;
5750
5751 args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 3, 5, 0, argsbuf);
5752 if (!args) {
5753 goto exit;
5754 }
5755 src = _PyLong_AsInt(args[0]);
5756 if (src == -1 && PyErr_Occurred()) {
5757 goto exit;
5758 }
5759 dst = _PyLong_AsInt(args[1]);
5760 if (dst == -1 && PyErr_Occurred()) {
5761 goto exit;
5762 }
5763 {
5764 Py_ssize_t ival = -1;
5765 PyObject *iobj = _PyNumber_Index(args[2]);
5766 if (iobj != NULL) {
5767 ival = PyLong_AsSsize_t(iobj);
5768 Py_DECREF(iobj);
5769 }
5770 if (ival == -1 && PyErr_Occurred()) {
5771 goto exit;
5772 }
5773 count = ival;
5774 }
5775 if (!noptargs) {
5776 goto skip_optional_pos;
5777 }
5778 if (args[3]) {
5779 offset_src = args[3];
5780 if (!--noptargs) {
5781 goto skip_optional_pos;
5782 }
5783 }
5784 offset_dst = args[4];
5785 skip_optional_pos:
5786 return_value = os_copy_file_range_impl(module, src, dst, count, offset_src, offset_dst);
5787
5788 exit:
5789 return return_value;
5790 }
5791
5792 #endif /* defined(HAVE_COPY_FILE_RANGE) */
5793
5794 #if ((defined(HAVE_SPLICE) && !defined(_AIX)))
5795
5796 PyDoc_STRVAR(os_splice__doc__,
5797 "splice($module, /, src, dst, count, offset_src=None, offset_dst=None,\n"
5798 " flags=0)\n"
5799 "--\n"
5800 "\n"
5801 "Transfer count bytes from one pipe to a descriptor or vice versa.\n"
5802 "\n"
5803 " src\n"
5804 " Source file descriptor.\n"
5805 " dst\n"
5806 " Destination file descriptor.\n"
5807 " count\n"
5808 " Number of bytes to copy.\n"
5809 " offset_src\n"
5810 " Starting offset in src.\n"
5811 " offset_dst\n"
5812 " Starting offset in dst.\n"
5813 " flags\n"
5814 " Flags to modify the semantics of the call.\n"
5815 "\n"
5816 "If offset_src is None, then src is read from the current position;\n"
5817 "respectively for offset_dst. The offset associated to the file\n"
5818 "descriptor that refers to a pipe must be None.");
5819
5820 #define OS_SPLICE_METHODDEF \
5821 {"splice", _PyCFunction_CAST(os_splice), METH_FASTCALL|METH_KEYWORDS, os_splice__doc__},
5822
5823 static PyObject *
5824 os_splice_impl(PyObject *module, int src, int dst, Py_ssize_t count,
5825 PyObject *offset_src, PyObject *offset_dst,
5826 unsigned int flags);
5827
5828 static PyObject *
os_splice(PyObject * module,PyObject * const * args,Py_ssize_t nargs,PyObject * kwnames)5829 os_splice(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames)
5830 {
5831 PyObject *return_value = NULL;
5832 static const char * const _keywords[] = {"src", "dst", "count", "offset_src", "offset_dst", "flags", NULL};
5833 static _PyArg_Parser _parser = {NULL, _keywords, "splice", 0};
5834 PyObject *argsbuf[6];
5835 Py_ssize_t noptargs = nargs + (kwnames ? PyTuple_GET_SIZE(kwnames) : 0) - 3;
5836 int src;
5837 int dst;
5838 Py_ssize_t count;
5839 PyObject *offset_src = Py_None;
5840 PyObject *offset_dst = Py_None;
5841 unsigned int flags = 0;
5842
5843 args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 3, 6, 0, argsbuf);
5844 if (!args) {
5845 goto exit;
5846 }
5847 src = _PyLong_AsInt(args[0]);
5848 if (src == -1 && PyErr_Occurred()) {
5849 goto exit;
5850 }
5851 dst = _PyLong_AsInt(args[1]);
5852 if (dst == -1 && PyErr_Occurred()) {
5853 goto exit;
5854 }
5855 {
5856 Py_ssize_t ival = -1;
5857 PyObject *iobj = _PyNumber_Index(args[2]);
5858 if (iobj != NULL) {
5859 ival = PyLong_AsSsize_t(iobj);
5860 Py_DECREF(iobj);
5861 }
5862 if (ival == -1 && PyErr_Occurred()) {
5863 goto exit;
5864 }
5865 count = ival;
5866 }
5867 if (!noptargs) {
5868 goto skip_optional_pos;
5869 }
5870 if (args[3]) {
5871 offset_src = args[3];
5872 if (!--noptargs) {
5873 goto skip_optional_pos;
5874 }
5875 }
5876 if (args[4]) {
5877 offset_dst = args[4];
5878 if (!--noptargs) {
5879 goto skip_optional_pos;
5880 }
5881 }
5882 if (!_PyLong_UnsignedInt_Converter(args[5], &flags)) {
5883 goto exit;
5884 }
5885 skip_optional_pos:
5886 return_value = os_splice_impl(module, src, dst, count, offset_src, offset_dst, flags);
5887
5888 exit:
5889 return return_value;
5890 }
5891
5892 #endif /* ((defined(HAVE_SPLICE) && !defined(_AIX))) */
5893
5894 #if defined(HAVE_MKFIFO)
5895
5896 PyDoc_STRVAR(os_mkfifo__doc__,
5897 "mkfifo($module, /, path, mode=438, *, dir_fd=None)\n"
5898 "--\n"
5899 "\n"
5900 "Create a \"fifo\" (a POSIX named pipe).\n"
5901 "\n"
5902 "If dir_fd is not None, it should be a file descriptor open to a directory,\n"
5903 " and path should be relative; path will then be relative to that directory.\n"
5904 "dir_fd may not be implemented on your platform.\n"
5905 " If it is unavailable, using it will raise a NotImplementedError.");
5906
5907 #define OS_MKFIFO_METHODDEF \
5908 {"mkfifo", _PyCFunction_CAST(os_mkfifo), METH_FASTCALL|METH_KEYWORDS, os_mkfifo__doc__},
5909
5910 static PyObject *
5911 os_mkfifo_impl(PyObject *module, path_t *path, int mode, int dir_fd);
5912
5913 static PyObject *
os_mkfifo(PyObject * module,PyObject * const * args,Py_ssize_t nargs,PyObject * kwnames)5914 os_mkfifo(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames)
5915 {
5916 PyObject *return_value = NULL;
5917 static const char * const _keywords[] = {"path", "mode", "dir_fd", NULL};
5918 static _PyArg_Parser _parser = {NULL, _keywords, "mkfifo", 0};
5919 PyObject *argsbuf[3];
5920 Py_ssize_t noptargs = nargs + (kwnames ? PyTuple_GET_SIZE(kwnames) : 0) - 1;
5921 path_t path = PATH_T_INITIALIZE("mkfifo", "path", 0, 0);
5922 int mode = 438;
5923 int dir_fd = DEFAULT_DIR_FD;
5924
5925 args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 1, 2, 0, argsbuf);
5926 if (!args) {
5927 goto exit;
5928 }
5929 if (!path_converter(args[0], &path)) {
5930 goto exit;
5931 }
5932 if (!noptargs) {
5933 goto skip_optional_pos;
5934 }
5935 if (args[1]) {
5936 mode = _PyLong_AsInt(args[1]);
5937 if (mode == -1 && PyErr_Occurred()) {
5938 goto exit;
5939 }
5940 if (!--noptargs) {
5941 goto skip_optional_pos;
5942 }
5943 }
5944 skip_optional_pos:
5945 if (!noptargs) {
5946 goto skip_optional_kwonly;
5947 }
5948 if (!MKFIFOAT_DIR_FD_CONVERTER(args[2], &dir_fd)) {
5949 goto exit;
5950 }
5951 skip_optional_kwonly:
5952 return_value = os_mkfifo_impl(module, &path, mode, dir_fd);
5953
5954 exit:
5955 /* Cleanup for path */
5956 path_cleanup(&path);
5957
5958 return return_value;
5959 }
5960
5961 #endif /* defined(HAVE_MKFIFO) */
5962
5963 #if (defined(HAVE_MKNOD) && defined(HAVE_MAKEDEV))
5964
5965 PyDoc_STRVAR(os_mknod__doc__,
5966 "mknod($module, /, path, mode=384, device=0, *, dir_fd=None)\n"
5967 "--\n"
5968 "\n"
5969 "Create a node in the file system.\n"
5970 "\n"
5971 "Create a node in the file system (file, device special file or named pipe)\n"
5972 "at path. mode specifies both the permissions to use and the\n"
5973 "type of node to be created, being combined (bitwise OR) with one of\n"
5974 "S_IFREG, S_IFCHR, S_IFBLK, and S_IFIFO. If S_IFCHR or S_IFBLK is set on mode,\n"
5975 "device defines the newly created device special file (probably using\n"
5976 "os.makedev()). Otherwise device is ignored.\n"
5977 "\n"
5978 "If dir_fd is not None, it should be a file descriptor open to a directory,\n"
5979 " and path should be relative; path will then be relative to that directory.\n"
5980 "dir_fd may not be implemented on your platform.\n"
5981 " If it is unavailable, using it will raise a NotImplementedError.");
5982
5983 #define OS_MKNOD_METHODDEF \
5984 {"mknod", _PyCFunction_CAST(os_mknod), METH_FASTCALL|METH_KEYWORDS, os_mknod__doc__},
5985
5986 static PyObject *
5987 os_mknod_impl(PyObject *module, path_t *path, int mode, dev_t device,
5988 int dir_fd);
5989
5990 static PyObject *
os_mknod(PyObject * module,PyObject * const * args,Py_ssize_t nargs,PyObject * kwnames)5991 os_mknod(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames)
5992 {
5993 PyObject *return_value = NULL;
5994 static const char * const _keywords[] = {"path", "mode", "device", "dir_fd", NULL};
5995 static _PyArg_Parser _parser = {NULL, _keywords, "mknod", 0};
5996 PyObject *argsbuf[4];
5997 Py_ssize_t noptargs = nargs + (kwnames ? PyTuple_GET_SIZE(kwnames) : 0) - 1;
5998 path_t path = PATH_T_INITIALIZE("mknod", "path", 0, 0);
5999 int mode = 384;
6000 dev_t device = 0;
6001 int dir_fd = DEFAULT_DIR_FD;
6002
6003 args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 1, 3, 0, argsbuf);
6004 if (!args) {
6005 goto exit;
6006 }
6007 if (!path_converter(args[0], &path)) {
6008 goto exit;
6009 }
6010 if (!noptargs) {
6011 goto skip_optional_pos;
6012 }
6013 if (args[1]) {
6014 mode = _PyLong_AsInt(args[1]);
6015 if (mode == -1 && PyErr_Occurred()) {
6016 goto exit;
6017 }
6018 if (!--noptargs) {
6019 goto skip_optional_pos;
6020 }
6021 }
6022 if (args[2]) {
6023 if (!_Py_Dev_Converter(args[2], &device)) {
6024 goto exit;
6025 }
6026 if (!--noptargs) {
6027 goto skip_optional_pos;
6028 }
6029 }
6030 skip_optional_pos:
6031 if (!noptargs) {
6032 goto skip_optional_kwonly;
6033 }
6034 if (!MKNODAT_DIR_FD_CONVERTER(args[3], &dir_fd)) {
6035 goto exit;
6036 }
6037 skip_optional_kwonly:
6038 return_value = os_mknod_impl(module, &path, mode, device, dir_fd);
6039
6040 exit:
6041 /* Cleanup for path */
6042 path_cleanup(&path);
6043
6044 return return_value;
6045 }
6046
6047 #endif /* (defined(HAVE_MKNOD) && defined(HAVE_MAKEDEV)) */
6048
6049 #if defined(HAVE_DEVICE_MACROS)
6050
6051 PyDoc_STRVAR(os_major__doc__,
6052 "major($module, device, /)\n"
6053 "--\n"
6054 "\n"
6055 "Extracts a device major number from a raw device number.");
6056
6057 #define OS_MAJOR_METHODDEF \
6058 {"major", (PyCFunction)os_major, METH_O, os_major__doc__},
6059
6060 static unsigned int
6061 os_major_impl(PyObject *module, dev_t device);
6062
6063 static PyObject *
os_major(PyObject * module,PyObject * arg)6064 os_major(PyObject *module, PyObject *arg)
6065 {
6066 PyObject *return_value = NULL;
6067 dev_t device;
6068 unsigned int _return_value;
6069
6070 if (!_Py_Dev_Converter(arg, &device)) {
6071 goto exit;
6072 }
6073 _return_value = os_major_impl(module, device);
6074 if ((_return_value == (unsigned int)-1) && PyErr_Occurred()) {
6075 goto exit;
6076 }
6077 return_value = PyLong_FromUnsignedLong((unsigned long)_return_value);
6078
6079 exit:
6080 return return_value;
6081 }
6082
6083 #endif /* defined(HAVE_DEVICE_MACROS) */
6084
6085 #if defined(HAVE_DEVICE_MACROS)
6086
6087 PyDoc_STRVAR(os_minor__doc__,
6088 "minor($module, device, /)\n"
6089 "--\n"
6090 "\n"
6091 "Extracts a device minor number from a raw device number.");
6092
6093 #define OS_MINOR_METHODDEF \
6094 {"minor", (PyCFunction)os_minor, METH_O, os_minor__doc__},
6095
6096 static unsigned int
6097 os_minor_impl(PyObject *module, dev_t device);
6098
6099 static PyObject *
os_minor(PyObject * module,PyObject * arg)6100 os_minor(PyObject *module, PyObject *arg)
6101 {
6102 PyObject *return_value = NULL;
6103 dev_t device;
6104 unsigned int _return_value;
6105
6106 if (!_Py_Dev_Converter(arg, &device)) {
6107 goto exit;
6108 }
6109 _return_value = os_minor_impl(module, device);
6110 if ((_return_value == (unsigned int)-1) && PyErr_Occurred()) {
6111 goto exit;
6112 }
6113 return_value = PyLong_FromUnsignedLong((unsigned long)_return_value);
6114
6115 exit:
6116 return return_value;
6117 }
6118
6119 #endif /* defined(HAVE_DEVICE_MACROS) */
6120
6121 #if defined(HAVE_DEVICE_MACROS)
6122
6123 PyDoc_STRVAR(os_makedev__doc__,
6124 "makedev($module, major, minor, /)\n"
6125 "--\n"
6126 "\n"
6127 "Composes a raw device number from the major and minor device numbers.");
6128
6129 #define OS_MAKEDEV_METHODDEF \
6130 {"makedev", _PyCFunction_CAST(os_makedev), METH_FASTCALL, os_makedev__doc__},
6131
6132 static dev_t
6133 os_makedev_impl(PyObject *module, int major, int minor);
6134
6135 static PyObject *
os_makedev(PyObject * module,PyObject * const * args,Py_ssize_t nargs)6136 os_makedev(PyObject *module, PyObject *const *args, Py_ssize_t nargs)
6137 {
6138 PyObject *return_value = NULL;
6139 int major;
6140 int minor;
6141 dev_t _return_value;
6142
6143 if (!_PyArg_CheckPositional("makedev", nargs, 2, 2)) {
6144 goto exit;
6145 }
6146 major = _PyLong_AsInt(args[0]);
6147 if (major == -1 && PyErr_Occurred()) {
6148 goto exit;
6149 }
6150 minor = _PyLong_AsInt(args[1]);
6151 if (minor == -1 && PyErr_Occurred()) {
6152 goto exit;
6153 }
6154 _return_value = os_makedev_impl(module, major, minor);
6155 if ((_return_value == (dev_t)-1) && PyErr_Occurred()) {
6156 goto exit;
6157 }
6158 return_value = _PyLong_FromDev(_return_value);
6159
6160 exit:
6161 return return_value;
6162 }
6163
6164 #endif /* defined(HAVE_DEVICE_MACROS) */
6165
6166 #if (defined HAVE_FTRUNCATE || defined MS_WINDOWS)
6167
6168 PyDoc_STRVAR(os_ftruncate__doc__,
6169 "ftruncate($module, fd, length, /)\n"
6170 "--\n"
6171 "\n"
6172 "Truncate a file, specified by file descriptor, to a specific length.");
6173
6174 #define OS_FTRUNCATE_METHODDEF \
6175 {"ftruncate", _PyCFunction_CAST(os_ftruncate), METH_FASTCALL, os_ftruncate__doc__},
6176
6177 static PyObject *
6178 os_ftruncate_impl(PyObject *module, int fd, Py_off_t length);
6179
6180 static PyObject *
os_ftruncate(PyObject * module,PyObject * const * args,Py_ssize_t nargs)6181 os_ftruncate(PyObject *module, PyObject *const *args, Py_ssize_t nargs)
6182 {
6183 PyObject *return_value = NULL;
6184 int fd;
6185 Py_off_t length;
6186
6187 if (!_PyArg_CheckPositional("ftruncate", nargs, 2, 2)) {
6188 goto exit;
6189 }
6190 fd = _PyLong_AsInt(args[0]);
6191 if (fd == -1 && PyErr_Occurred()) {
6192 goto exit;
6193 }
6194 if (!Py_off_t_converter(args[1], &length)) {
6195 goto exit;
6196 }
6197 return_value = os_ftruncate_impl(module, fd, length);
6198
6199 exit:
6200 return return_value;
6201 }
6202
6203 #endif /* (defined HAVE_FTRUNCATE || defined MS_WINDOWS) */
6204
6205 #if (defined HAVE_TRUNCATE || defined MS_WINDOWS)
6206
6207 PyDoc_STRVAR(os_truncate__doc__,
6208 "truncate($module, /, path, length)\n"
6209 "--\n"
6210 "\n"
6211 "Truncate a file, specified by path, to a specific length.\n"
6212 "\n"
6213 "On some platforms, path may also be specified as an open file descriptor.\n"
6214 " If this functionality is unavailable, using it raises an exception.");
6215
6216 #define OS_TRUNCATE_METHODDEF \
6217 {"truncate", _PyCFunction_CAST(os_truncate), METH_FASTCALL|METH_KEYWORDS, os_truncate__doc__},
6218
6219 static PyObject *
6220 os_truncate_impl(PyObject *module, path_t *path, Py_off_t length);
6221
6222 static PyObject *
os_truncate(PyObject * module,PyObject * const * args,Py_ssize_t nargs,PyObject * kwnames)6223 os_truncate(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames)
6224 {
6225 PyObject *return_value = NULL;
6226 static const char * const _keywords[] = {"path", "length", NULL};
6227 static _PyArg_Parser _parser = {NULL, _keywords, "truncate", 0};
6228 PyObject *argsbuf[2];
6229 path_t path = PATH_T_INITIALIZE("truncate", "path", 0, PATH_HAVE_FTRUNCATE);
6230 Py_off_t length;
6231
6232 args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 2, 2, 0, argsbuf);
6233 if (!args) {
6234 goto exit;
6235 }
6236 if (!path_converter(args[0], &path)) {
6237 goto exit;
6238 }
6239 if (!Py_off_t_converter(args[1], &length)) {
6240 goto exit;
6241 }
6242 return_value = os_truncate_impl(module, &path, length);
6243
6244 exit:
6245 /* Cleanup for path */
6246 path_cleanup(&path);
6247
6248 return return_value;
6249 }
6250
6251 #endif /* (defined HAVE_TRUNCATE || defined MS_WINDOWS) */
6252
6253 #if (defined(HAVE_POSIX_FALLOCATE) && !defined(POSIX_FADVISE_AIX_BUG))
6254
6255 PyDoc_STRVAR(os_posix_fallocate__doc__,
6256 "posix_fallocate($module, fd, offset, length, /)\n"
6257 "--\n"
6258 "\n"
6259 "Ensure a file has allocated at least a particular number of bytes on disk.\n"
6260 "\n"
6261 "Ensure that the file specified by fd encompasses a range of bytes\n"
6262 "starting at offset bytes from the beginning and continuing for length bytes.");
6263
6264 #define OS_POSIX_FALLOCATE_METHODDEF \
6265 {"posix_fallocate", _PyCFunction_CAST(os_posix_fallocate), METH_FASTCALL, os_posix_fallocate__doc__},
6266
6267 static PyObject *
6268 os_posix_fallocate_impl(PyObject *module, int fd, Py_off_t offset,
6269 Py_off_t length);
6270
6271 static PyObject *
os_posix_fallocate(PyObject * module,PyObject * const * args,Py_ssize_t nargs)6272 os_posix_fallocate(PyObject *module, PyObject *const *args, Py_ssize_t nargs)
6273 {
6274 PyObject *return_value = NULL;
6275 int fd;
6276 Py_off_t offset;
6277 Py_off_t length;
6278
6279 if (!_PyArg_CheckPositional("posix_fallocate", nargs, 3, 3)) {
6280 goto exit;
6281 }
6282 fd = _PyLong_AsInt(args[0]);
6283 if (fd == -1 && PyErr_Occurred()) {
6284 goto exit;
6285 }
6286 if (!Py_off_t_converter(args[1], &offset)) {
6287 goto exit;
6288 }
6289 if (!Py_off_t_converter(args[2], &length)) {
6290 goto exit;
6291 }
6292 return_value = os_posix_fallocate_impl(module, fd, offset, length);
6293
6294 exit:
6295 return return_value;
6296 }
6297
6298 #endif /* (defined(HAVE_POSIX_FALLOCATE) && !defined(POSIX_FADVISE_AIX_BUG)) */
6299
6300 #if (defined(HAVE_POSIX_FADVISE) && !defined(POSIX_FADVISE_AIX_BUG))
6301
6302 PyDoc_STRVAR(os_posix_fadvise__doc__,
6303 "posix_fadvise($module, fd, offset, length, advice, /)\n"
6304 "--\n"
6305 "\n"
6306 "Announce an intention to access data in a specific pattern.\n"
6307 "\n"
6308 "Announce an intention to access data in a specific pattern, thus allowing\n"
6309 "the kernel to make optimizations.\n"
6310 "The advice applies to the region of the file specified by fd starting at\n"
6311 "offset and continuing for length bytes.\n"
6312 "advice is one of POSIX_FADV_NORMAL, POSIX_FADV_SEQUENTIAL,\n"
6313 "POSIX_FADV_RANDOM, POSIX_FADV_NOREUSE, POSIX_FADV_WILLNEED, or\n"
6314 "POSIX_FADV_DONTNEED.");
6315
6316 #define OS_POSIX_FADVISE_METHODDEF \
6317 {"posix_fadvise", _PyCFunction_CAST(os_posix_fadvise), METH_FASTCALL, os_posix_fadvise__doc__},
6318
6319 static PyObject *
6320 os_posix_fadvise_impl(PyObject *module, int fd, Py_off_t offset,
6321 Py_off_t length, int advice);
6322
6323 static PyObject *
os_posix_fadvise(PyObject * module,PyObject * const * args,Py_ssize_t nargs)6324 os_posix_fadvise(PyObject *module, PyObject *const *args, Py_ssize_t nargs)
6325 {
6326 PyObject *return_value = NULL;
6327 int fd;
6328 Py_off_t offset;
6329 Py_off_t length;
6330 int advice;
6331
6332 if (!_PyArg_CheckPositional("posix_fadvise", nargs, 4, 4)) {
6333 goto exit;
6334 }
6335 fd = _PyLong_AsInt(args[0]);
6336 if (fd == -1 && PyErr_Occurred()) {
6337 goto exit;
6338 }
6339 if (!Py_off_t_converter(args[1], &offset)) {
6340 goto exit;
6341 }
6342 if (!Py_off_t_converter(args[2], &length)) {
6343 goto exit;
6344 }
6345 advice = _PyLong_AsInt(args[3]);
6346 if (advice == -1 && PyErr_Occurred()) {
6347 goto exit;
6348 }
6349 return_value = os_posix_fadvise_impl(module, fd, offset, length, advice);
6350
6351 exit:
6352 return return_value;
6353 }
6354
6355 #endif /* (defined(HAVE_POSIX_FADVISE) && !defined(POSIX_FADVISE_AIX_BUG)) */
6356
6357 #if defined(MS_WINDOWS)
6358
6359 PyDoc_STRVAR(os_putenv__doc__,
6360 "putenv($module, name, value, /)\n"
6361 "--\n"
6362 "\n"
6363 "Change or add an environment variable.");
6364
6365 #define OS_PUTENV_METHODDEF \
6366 {"putenv", _PyCFunction_CAST(os_putenv), METH_FASTCALL, os_putenv__doc__},
6367
6368 static PyObject *
6369 os_putenv_impl(PyObject *module, PyObject *name, PyObject *value);
6370
6371 static PyObject *
os_putenv(PyObject * module,PyObject * const * args,Py_ssize_t nargs)6372 os_putenv(PyObject *module, PyObject *const *args, Py_ssize_t nargs)
6373 {
6374 PyObject *return_value = NULL;
6375 PyObject *name;
6376 PyObject *value;
6377
6378 if (!_PyArg_CheckPositional("putenv", nargs, 2, 2)) {
6379 goto exit;
6380 }
6381 if (!PyUnicode_Check(args[0])) {
6382 _PyArg_BadArgument("putenv", "argument 1", "str", args[0]);
6383 goto exit;
6384 }
6385 if (PyUnicode_READY(args[0]) == -1) {
6386 goto exit;
6387 }
6388 name = args[0];
6389 if (!PyUnicode_Check(args[1])) {
6390 _PyArg_BadArgument("putenv", "argument 2", "str", args[1]);
6391 goto exit;
6392 }
6393 if (PyUnicode_READY(args[1]) == -1) {
6394 goto exit;
6395 }
6396 value = args[1];
6397 return_value = os_putenv_impl(module, name, value);
6398
6399 exit:
6400 return return_value;
6401 }
6402
6403 #endif /* defined(MS_WINDOWS) */
6404
6405 #if !defined(MS_WINDOWS)
6406
6407 PyDoc_STRVAR(os_putenv__doc__,
6408 "putenv($module, name, value, /)\n"
6409 "--\n"
6410 "\n"
6411 "Change or add an environment variable.");
6412
6413 #define OS_PUTENV_METHODDEF \
6414 {"putenv", _PyCFunction_CAST(os_putenv), METH_FASTCALL, os_putenv__doc__},
6415
6416 static PyObject *
6417 os_putenv_impl(PyObject *module, PyObject *name, PyObject *value);
6418
6419 static PyObject *
os_putenv(PyObject * module,PyObject * const * args,Py_ssize_t nargs)6420 os_putenv(PyObject *module, PyObject *const *args, Py_ssize_t nargs)
6421 {
6422 PyObject *return_value = NULL;
6423 PyObject *name = NULL;
6424 PyObject *value = NULL;
6425
6426 if (!_PyArg_CheckPositional("putenv", nargs, 2, 2)) {
6427 goto exit;
6428 }
6429 if (!PyUnicode_FSConverter(args[0], &name)) {
6430 goto exit;
6431 }
6432 if (!PyUnicode_FSConverter(args[1], &value)) {
6433 goto exit;
6434 }
6435 return_value = os_putenv_impl(module, name, value);
6436
6437 exit:
6438 /* Cleanup for name */
6439 Py_XDECREF(name);
6440 /* Cleanup for value */
6441 Py_XDECREF(value);
6442
6443 return return_value;
6444 }
6445
6446 #endif /* !defined(MS_WINDOWS) */
6447
6448 #if defined(MS_WINDOWS)
6449
6450 PyDoc_STRVAR(os_unsetenv__doc__,
6451 "unsetenv($module, name, /)\n"
6452 "--\n"
6453 "\n"
6454 "Delete an environment variable.");
6455
6456 #define OS_UNSETENV_METHODDEF \
6457 {"unsetenv", (PyCFunction)os_unsetenv, METH_O, os_unsetenv__doc__},
6458
6459 static PyObject *
6460 os_unsetenv_impl(PyObject *module, PyObject *name);
6461
6462 static PyObject *
os_unsetenv(PyObject * module,PyObject * arg)6463 os_unsetenv(PyObject *module, PyObject *arg)
6464 {
6465 PyObject *return_value = NULL;
6466 PyObject *name;
6467
6468 if (!PyUnicode_Check(arg)) {
6469 _PyArg_BadArgument("unsetenv", "argument", "str", arg);
6470 goto exit;
6471 }
6472 if (PyUnicode_READY(arg) == -1) {
6473 goto exit;
6474 }
6475 name = arg;
6476 return_value = os_unsetenv_impl(module, name);
6477
6478 exit:
6479 return return_value;
6480 }
6481
6482 #endif /* defined(MS_WINDOWS) */
6483
6484 #if !defined(MS_WINDOWS)
6485
6486 PyDoc_STRVAR(os_unsetenv__doc__,
6487 "unsetenv($module, name, /)\n"
6488 "--\n"
6489 "\n"
6490 "Delete an environment variable.");
6491
6492 #define OS_UNSETENV_METHODDEF \
6493 {"unsetenv", (PyCFunction)os_unsetenv, METH_O, os_unsetenv__doc__},
6494
6495 static PyObject *
6496 os_unsetenv_impl(PyObject *module, PyObject *name);
6497
6498 static PyObject *
os_unsetenv(PyObject * module,PyObject * arg)6499 os_unsetenv(PyObject *module, PyObject *arg)
6500 {
6501 PyObject *return_value = NULL;
6502 PyObject *name = NULL;
6503
6504 if (!PyUnicode_FSConverter(arg, &name)) {
6505 goto exit;
6506 }
6507 return_value = os_unsetenv_impl(module, name);
6508
6509 exit:
6510 /* Cleanup for name */
6511 Py_XDECREF(name);
6512
6513 return return_value;
6514 }
6515
6516 #endif /* !defined(MS_WINDOWS) */
6517
6518 PyDoc_STRVAR(os_strerror__doc__,
6519 "strerror($module, code, /)\n"
6520 "--\n"
6521 "\n"
6522 "Translate an error code to a message string.");
6523
6524 #define OS_STRERROR_METHODDEF \
6525 {"strerror", (PyCFunction)os_strerror, METH_O, os_strerror__doc__},
6526
6527 static PyObject *
6528 os_strerror_impl(PyObject *module, int code);
6529
6530 static PyObject *
os_strerror(PyObject * module,PyObject * arg)6531 os_strerror(PyObject *module, PyObject *arg)
6532 {
6533 PyObject *return_value = NULL;
6534 int code;
6535
6536 code = _PyLong_AsInt(arg);
6537 if (code == -1 && PyErr_Occurred()) {
6538 goto exit;
6539 }
6540 return_value = os_strerror_impl(module, code);
6541
6542 exit:
6543 return return_value;
6544 }
6545
6546 #if defined(HAVE_SYS_WAIT_H) && defined(WCOREDUMP)
6547
6548 PyDoc_STRVAR(os_WCOREDUMP__doc__,
6549 "WCOREDUMP($module, status, /)\n"
6550 "--\n"
6551 "\n"
6552 "Return True if the process returning status was dumped to a core file.");
6553
6554 #define OS_WCOREDUMP_METHODDEF \
6555 {"WCOREDUMP", (PyCFunction)os_WCOREDUMP, METH_O, os_WCOREDUMP__doc__},
6556
6557 static int
6558 os_WCOREDUMP_impl(PyObject *module, int status);
6559
6560 static PyObject *
os_WCOREDUMP(PyObject * module,PyObject * arg)6561 os_WCOREDUMP(PyObject *module, PyObject *arg)
6562 {
6563 PyObject *return_value = NULL;
6564 int status;
6565 int _return_value;
6566
6567 status = _PyLong_AsInt(arg);
6568 if (status == -1 && PyErr_Occurred()) {
6569 goto exit;
6570 }
6571 _return_value = os_WCOREDUMP_impl(module, status);
6572 if ((_return_value == -1) && PyErr_Occurred()) {
6573 goto exit;
6574 }
6575 return_value = PyBool_FromLong((long)_return_value);
6576
6577 exit:
6578 return return_value;
6579 }
6580
6581 #endif /* defined(HAVE_SYS_WAIT_H) && defined(WCOREDUMP) */
6582
6583 #if defined(HAVE_SYS_WAIT_H) && defined(WIFCONTINUED)
6584
6585 PyDoc_STRVAR(os_WIFCONTINUED__doc__,
6586 "WIFCONTINUED($module, /, status)\n"
6587 "--\n"
6588 "\n"
6589 "Return True if a particular process was continued from a job control stop.\n"
6590 "\n"
6591 "Return True if the process returning status was continued from a\n"
6592 "job control stop.");
6593
6594 #define OS_WIFCONTINUED_METHODDEF \
6595 {"WIFCONTINUED", _PyCFunction_CAST(os_WIFCONTINUED), METH_FASTCALL|METH_KEYWORDS, os_WIFCONTINUED__doc__},
6596
6597 static int
6598 os_WIFCONTINUED_impl(PyObject *module, int status);
6599
6600 static PyObject *
os_WIFCONTINUED(PyObject * module,PyObject * const * args,Py_ssize_t nargs,PyObject * kwnames)6601 os_WIFCONTINUED(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames)
6602 {
6603 PyObject *return_value = NULL;
6604 static const char * const _keywords[] = {"status", NULL};
6605 static _PyArg_Parser _parser = {NULL, _keywords, "WIFCONTINUED", 0};
6606 PyObject *argsbuf[1];
6607 int status;
6608 int _return_value;
6609
6610 args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 1, 1, 0, argsbuf);
6611 if (!args) {
6612 goto exit;
6613 }
6614 status = _PyLong_AsInt(args[0]);
6615 if (status == -1 && PyErr_Occurred()) {
6616 goto exit;
6617 }
6618 _return_value = os_WIFCONTINUED_impl(module, status);
6619 if ((_return_value == -1) && PyErr_Occurred()) {
6620 goto exit;
6621 }
6622 return_value = PyBool_FromLong((long)_return_value);
6623
6624 exit:
6625 return return_value;
6626 }
6627
6628 #endif /* defined(HAVE_SYS_WAIT_H) && defined(WIFCONTINUED) */
6629
6630 #if defined(HAVE_SYS_WAIT_H) && defined(WIFSTOPPED)
6631
6632 PyDoc_STRVAR(os_WIFSTOPPED__doc__,
6633 "WIFSTOPPED($module, /, status)\n"
6634 "--\n"
6635 "\n"
6636 "Return True if the process returning status was stopped.");
6637
6638 #define OS_WIFSTOPPED_METHODDEF \
6639 {"WIFSTOPPED", _PyCFunction_CAST(os_WIFSTOPPED), METH_FASTCALL|METH_KEYWORDS, os_WIFSTOPPED__doc__},
6640
6641 static int
6642 os_WIFSTOPPED_impl(PyObject *module, int status);
6643
6644 static PyObject *
os_WIFSTOPPED(PyObject * module,PyObject * const * args,Py_ssize_t nargs,PyObject * kwnames)6645 os_WIFSTOPPED(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames)
6646 {
6647 PyObject *return_value = NULL;
6648 static const char * const _keywords[] = {"status", NULL};
6649 static _PyArg_Parser _parser = {NULL, _keywords, "WIFSTOPPED", 0};
6650 PyObject *argsbuf[1];
6651 int status;
6652 int _return_value;
6653
6654 args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 1, 1, 0, argsbuf);
6655 if (!args) {
6656 goto exit;
6657 }
6658 status = _PyLong_AsInt(args[0]);
6659 if (status == -1 && PyErr_Occurred()) {
6660 goto exit;
6661 }
6662 _return_value = os_WIFSTOPPED_impl(module, status);
6663 if ((_return_value == -1) && PyErr_Occurred()) {
6664 goto exit;
6665 }
6666 return_value = PyBool_FromLong((long)_return_value);
6667
6668 exit:
6669 return return_value;
6670 }
6671
6672 #endif /* defined(HAVE_SYS_WAIT_H) && defined(WIFSTOPPED) */
6673
6674 #if defined(HAVE_SYS_WAIT_H) && defined(WIFSIGNALED)
6675
6676 PyDoc_STRVAR(os_WIFSIGNALED__doc__,
6677 "WIFSIGNALED($module, /, status)\n"
6678 "--\n"
6679 "\n"
6680 "Return True if the process returning status was terminated by a signal.");
6681
6682 #define OS_WIFSIGNALED_METHODDEF \
6683 {"WIFSIGNALED", _PyCFunction_CAST(os_WIFSIGNALED), METH_FASTCALL|METH_KEYWORDS, os_WIFSIGNALED__doc__},
6684
6685 static int
6686 os_WIFSIGNALED_impl(PyObject *module, int status);
6687
6688 static PyObject *
os_WIFSIGNALED(PyObject * module,PyObject * const * args,Py_ssize_t nargs,PyObject * kwnames)6689 os_WIFSIGNALED(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames)
6690 {
6691 PyObject *return_value = NULL;
6692 static const char * const _keywords[] = {"status", NULL};
6693 static _PyArg_Parser _parser = {NULL, _keywords, "WIFSIGNALED", 0};
6694 PyObject *argsbuf[1];
6695 int status;
6696 int _return_value;
6697
6698 args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 1, 1, 0, argsbuf);
6699 if (!args) {
6700 goto exit;
6701 }
6702 status = _PyLong_AsInt(args[0]);
6703 if (status == -1 && PyErr_Occurred()) {
6704 goto exit;
6705 }
6706 _return_value = os_WIFSIGNALED_impl(module, status);
6707 if ((_return_value == -1) && PyErr_Occurred()) {
6708 goto exit;
6709 }
6710 return_value = PyBool_FromLong((long)_return_value);
6711
6712 exit:
6713 return return_value;
6714 }
6715
6716 #endif /* defined(HAVE_SYS_WAIT_H) && defined(WIFSIGNALED) */
6717
6718 #if defined(HAVE_SYS_WAIT_H) && defined(WIFEXITED)
6719
6720 PyDoc_STRVAR(os_WIFEXITED__doc__,
6721 "WIFEXITED($module, /, status)\n"
6722 "--\n"
6723 "\n"
6724 "Return True if the process returning status exited via the exit() system call.");
6725
6726 #define OS_WIFEXITED_METHODDEF \
6727 {"WIFEXITED", _PyCFunction_CAST(os_WIFEXITED), METH_FASTCALL|METH_KEYWORDS, os_WIFEXITED__doc__},
6728
6729 static int
6730 os_WIFEXITED_impl(PyObject *module, int status);
6731
6732 static PyObject *
os_WIFEXITED(PyObject * module,PyObject * const * args,Py_ssize_t nargs,PyObject * kwnames)6733 os_WIFEXITED(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames)
6734 {
6735 PyObject *return_value = NULL;
6736 static const char * const _keywords[] = {"status", NULL};
6737 static _PyArg_Parser _parser = {NULL, _keywords, "WIFEXITED", 0};
6738 PyObject *argsbuf[1];
6739 int status;
6740 int _return_value;
6741
6742 args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 1, 1, 0, argsbuf);
6743 if (!args) {
6744 goto exit;
6745 }
6746 status = _PyLong_AsInt(args[0]);
6747 if (status == -1 && PyErr_Occurred()) {
6748 goto exit;
6749 }
6750 _return_value = os_WIFEXITED_impl(module, status);
6751 if ((_return_value == -1) && PyErr_Occurred()) {
6752 goto exit;
6753 }
6754 return_value = PyBool_FromLong((long)_return_value);
6755
6756 exit:
6757 return return_value;
6758 }
6759
6760 #endif /* defined(HAVE_SYS_WAIT_H) && defined(WIFEXITED) */
6761
6762 #if defined(HAVE_SYS_WAIT_H) && defined(WEXITSTATUS)
6763
6764 PyDoc_STRVAR(os_WEXITSTATUS__doc__,
6765 "WEXITSTATUS($module, /, status)\n"
6766 "--\n"
6767 "\n"
6768 "Return the process return code from status.");
6769
6770 #define OS_WEXITSTATUS_METHODDEF \
6771 {"WEXITSTATUS", _PyCFunction_CAST(os_WEXITSTATUS), METH_FASTCALL|METH_KEYWORDS, os_WEXITSTATUS__doc__},
6772
6773 static int
6774 os_WEXITSTATUS_impl(PyObject *module, int status);
6775
6776 static PyObject *
os_WEXITSTATUS(PyObject * module,PyObject * const * args,Py_ssize_t nargs,PyObject * kwnames)6777 os_WEXITSTATUS(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames)
6778 {
6779 PyObject *return_value = NULL;
6780 static const char * const _keywords[] = {"status", NULL};
6781 static _PyArg_Parser _parser = {NULL, _keywords, "WEXITSTATUS", 0};
6782 PyObject *argsbuf[1];
6783 int status;
6784 int _return_value;
6785
6786 args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 1, 1, 0, argsbuf);
6787 if (!args) {
6788 goto exit;
6789 }
6790 status = _PyLong_AsInt(args[0]);
6791 if (status == -1 && PyErr_Occurred()) {
6792 goto exit;
6793 }
6794 _return_value = os_WEXITSTATUS_impl(module, status);
6795 if ((_return_value == -1) && PyErr_Occurred()) {
6796 goto exit;
6797 }
6798 return_value = PyLong_FromLong((long)_return_value);
6799
6800 exit:
6801 return return_value;
6802 }
6803
6804 #endif /* defined(HAVE_SYS_WAIT_H) && defined(WEXITSTATUS) */
6805
6806 #if defined(HAVE_SYS_WAIT_H) && defined(WTERMSIG)
6807
6808 PyDoc_STRVAR(os_WTERMSIG__doc__,
6809 "WTERMSIG($module, /, status)\n"
6810 "--\n"
6811 "\n"
6812 "Return the signal that terminated the process that provided the status value.");
6813
6814 #define OS_WTERMSIG_METHODDEF \
6815 {"WTERMSIG", _PyCFunction_CAST(os_WTERMSIG), METH_FASTCALL|METH_KEYWORDS, os_WTERMSIG__doc__},
6816
6817 static int
6818 os_WTERMSIG_impl(PyObject *module, int status);
6819
6820 static PyObject *
os_WTERMSIG(PyObject * module,PyObject * const * args,Py_ssize_t nargs,PyObject * kwnames)6821 os_WTERMSIG(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames)
6822 {
6823 PyObject *return_value = NULL;
6824 static const char * const _keywords[] = {"status", NULL};
6825 static _PyArg_Parser _parser = {NULL, _keywords, "WTERMSIG", 0};
6826 PyObject *argsbuf[1];
6827 int status;
6828 int _return_value;
6829
6830 args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 1, 1, 0, argsbuf);
6831 if (!args) {
6832 goto exit;
6833 }
6834 status = _PyLong_AsInt(args[0]);
6835 if (status == -1 && PyErr_Occurred()) {
6836 goto exit;
6837 }
6838 _return_value = os_WTERMSIG_impl(module, status);
6839 if ((_return_value == -1) && PyErr_Occurred()) {
6840 goto exit;
6841 }
6842 return_value = PyLong_FromLong((long)_return_value);
6843
6844 exit:
6845 return return_value;
6846 }
6847
6848 #endif /* defined(HAVE_SYS_WAIT_H) && defined(WTERMSIG) */
6849
6850 #if defined(HAVE_SYS_WAIT_H) && defined(WSTOPSIG)
6851
6852 PyDoc_STRVAR(os_WSTOPSIG__doc__,
6853 "WSTOPSIG($module, /, status)\n"
6854 "--\n"
6855 "\n"
6856 "Return the signal that stopped the process that provided the status value.");
6857
6858 #define OS_WSTOPSIG_METHODDEF \
6859 {"WSTOPSIG", _PyCFunction_CAST(os_WSTOPSIG), METH_FASTCALL|METH_KEYWORDS, os_WSTOPSIG__doc__},
6860
6861 static int
6862 os_WSTOPSIG_impl(PyObject *module, int status);
6863
6864 static PyObject *
os_WSTOPSIG(PyObject * module,PyObject * const * args,Py_ssize_t nargs,PyObject * kwnames)6865 os_WSTOPSIG(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames)
6866 {
6867 PyObject *return_value = NULL;
6868 static const char * const _keywords[] = {"status", NULL};
6869 static _PyArg_Parser _parser = {NULL, _keywords, "WSTOPSIG", 0};
6870 PyObject *argsbuf[1];
6871 int status;
6872 int _return_value;
6873
6874 args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 1, 1, 0, argsbuf);
6875 if (!args) {
6876 goto exit;
6877 }
6878 status = _PyLong_AsInt(args[0]);
6879 if (status == -1 && PyErr_Occurred()) {
6880 goto exit;
6881 }
6882 _return_value = os_WSTOPSIG_impl(module, status);
6883 if ((_return_value == -1) && PyErr_Occurred()) {
6884 goto exit;
6885 }
6886 return_value = PyLong_FromLong((long)_return_value);
6887
6888 exit:
6889 return return_value;
6890 }
6891
6892 #endif /* defined(HAVE_SYS_WAIT_H) && defined(WSTOPSIG) */
6893
6894 #if (defined(HAVE_FSTATVFS) && defined(HAVE_SYS_STATVFS_H))
6895
6896 PyDoc_STRVAR(os_fstatvfs__doc__,
6897 "fstatvfs($module, fd, /)\n"
6898 "--\n"
6899 "\n"
6900 "Perform an fstatvfs system call on the given fd.\n"
6901 "\n"
6902 "Equivalent to statvfs(fd).");
6903
6904 #define OS_FSTATVFS_METHODDEF \
6905 {"fstatvfs", (PyCFunction)os_fstatvfs, METH_O, os_fstatvfs__doc__},
6906
6907 static PyObject *
6908 os_fstatvfs_impl(PyObject *module, int fd);
6909
6910 static PyObject *
os_fstatvfs(PyObject * module,PyObject * arg)6911 os_fstatvfs(PyObject *module, PyObject *arg)
6912 {
6913 PyObject *return_value = NULL;
6914 int fd;
6915
6916 fd = _PyLong_AsInt(arg);
6917 if (fd == -1 && PyErr_Occurred()) {
6918 goto exit;
6919 }
6920 return_value = os_fstatvfs_impl(module, fd);
6921
6922 exit:
6923 return return_value;
6924 }
6925
6926 #endif /* (defined(HAVE_FSTATVFS) && defined(HAVE_SYS_STATVFS_H)) */
6927
6928 #if (defined(HAVE_STATVFS) && defined(HAVE_SYS_STATVFS_H))
6929
6930 PyDoc_STRVAR(os_statvfs__doc__,
6931 "statvfs($module, /, path)\n"
6932 "--\n"
6933 "\n"
6934 "Perform a statvfs system call on the given path.\n"
6935 "\n"
6936 "path may always be specified as a string.\n"
6937 "On some platforms, path may also be specified as an open file descriptor.\n"
6938 " If this functionality is unavailable, using it raises an exception.");
6939
6940 #define OS_STATVFS_METHODDEF \
6941 {"statvfs", _PyCFunction_CAST(os_statvfs), METH_FASTCALL|METH_KEYWORDS, os_statvfs__doc__},
6942
6943 static PyObject *
6944 os_statvfs_impl(PyObject *module, path_t *path);
6945
6946 static PyObject *
os_statvfs(PyObject * module,PyObject * const * args,Py_ssize_t nargs,PyObject * kwnames)6947 os_statvfs(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames)
6948 {
6949 PyObject *return_value = NULL;
6950 static const char * const _keywords[] = {"path", NULL};
6951 static _PyArg_Parser _parser = {NULL, _keywords, "statvfs", 0};
6952 PyObject *argsbuf[1];
6953 path_t path = PATH_T_INITIALIZE("statvfs", "path", 0, PATH_HAVE_FSTATVFS);
6954
6955 args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 1, 1, 0, argsbuf);
6956 if (!args) {
6957 goto exit;
6958 }
6959 if (!path_converter(args[0], &path)) {
6960 goto exit;
6961 }
6962 return_value = os_statvfs_impl(module, &path);
6963
6964 exit:
6965 /* Cleanup for path */
6966 path_cleanup(&path);
6967
6968 return return_value;
6969 }
6970
6971 #endif /* (defined(HAVE_STATVFS) && defined(HAVE_SYS_STATVFS_H)) */
6972
6973 #if defined(MS_WINDOWS)
6974
6975 PyDoc_STRVAR(os__getdiskusage__doc__,
6976 "_getdiskusage($module, /, path)\n"
6977 "--\n"
6978 "\n"
6979 "Return disk usage statistics about the given path as a (total, free) tuple.");
6980
6981 #define OS__GETDISKUSAGE_METHODDEF \
6982 {"_getdiskusage", _PyCFunction_CAST(os__getdiskusage), METH_FASTCALL|METH_KEYWORDS, os__getdiskusage__doc__},
6983
6984 static PyObject *
6985 os__getdiskusage_impl(PyObject *module, path_t *path);
6986
6987 static PyObject *
os__getdiskusage(PyObject * module,PyObject * const * args,Py_ssize_t nargs,PyObject * kwnames)6988 os__getdiskusage(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames)
6989 {
6990 PyObject *return_value = NULL;
6991 static const char * const _keywords[] = {"path", NULL};
6992 static _PyArg_Parser _parser = {NULL, _keywords, "_getdiskusage", 0};
6993 PyObject *argsbuf[1];
6994 path_t path = PATH_T_INITIALIZE("_getdiskusage", "path", 0, 0);
6995
6996 args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 1, 1, 0, argsbuf);
6997 if (!args) {
6998 goto exit;
6999 }
7000 if (!path_converter(args[0], &path)) {
7001 goto exit;
7002 }
7003 return_value = os__getdiskusage_impl(module, &path);
7004
7005 exit:
7006 /* Cleanup for path */
7007 path_cleanup(&path);
7008
7009 return return_value;
7010 }
7011
7012 #endif /* defined(MS_WINDOWS) */
7013
7014 #if defined(HAVE_FPATHCONF)
7015
7016 PyDoc_STRVAR(os_fpathconf__doc__,
7017 "fpathconf($module, fd, name, /)\n"
7018 "--\n"
7019 "\n"
7020 "Return the configuration limit name for the file descriptor fd.\n"
7021 "\n"
7022 "If there is no limit, return -1.");
7023
7024 #define OS_FPATHCONF_METHODDEF \
7025 {"fpathconf", _PyCFunction_CAST(os_fpathconf), METH_FASTCALL, os_fpathconf__doc__},
7026
7027 static long
7028 os_fpathconf_impl(PyObject *module, int fd, int name);
7029
7030 static PyObject *
os_fpathconf(PyObject * module,PyObject * const * args,Py_ssize_t nargs)7031 os_fpathconf(PyObject *module, PyObject *const *args, Py_ssize_t nargs)
7032 {
7033 PyObject *return_value = NULL;
7034 int fd;
7035 int name;
7036 long _return_value;
7037
7038 if (!_PyArg_CheckPositional("fpathconf", nargs, 2, 2)) {
7039 goto exit;
7040 }
7041 if (!_PyLong_FileDescriptor_Converter(args[0], &fd)) {
7042 goto exit;
7043 }
7044 if (!conv_path_confname(args[1], &name)) {
7045 goto exit;
7046 }
7047 _return_value = os_fpathconf_impl(module, fd, name);
7048 if ((_return_value == -1) && PyErr_Occurred()) {
7049 goto exit;
7050 }
7051 return_value = PyLong_FromLong(_return_value);
7052
7053 exit:
7054 return return_value;
7055 }
7056
7057 #endif /* defined(HAVE_FPATHCONF) */
7058
7059 #if defined(HAVE_PATHCONF)
7060
7061 PyDoc_STRVAR(os_pathconf__doc__,
7062 "pathconf($module, /, path, name)\n"
7063 "--\n"
7064 "\n"
7065 "Return the configuration limit name for the file or directory path.\n"
7066 "\n"
7067 "If there is no limit, return -1.\n"
7068 "On some platforms, path may also be specified as an open file descriptor.\n"
7069 " If this functionality is unavailable, using it raises an exception.");
7070
7071 #define OS_PATHCONF_METHODDEF \
7072 {"pathconf", _PyCFunction_CAST(os_pathconf), METH_FASTCALL|METH_KEYWORDS, os_pathconf__doc__},
7073
7074 static long
7075 os_pathconf_impl(PyObject *module, path_t *path, int name);
7076
7077 static PyObject *
os_pathconf(PyObject * module,PyObject * const * args,Py_ssize_t nargs,PyObject * kwnames)7078 os_pathconf(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames)
7079 {
7080 PyObject *return_value = NULL;
7081 static const char * const _keywords[] = {"path", "name", NULL};
7082 static _PyArg_Parser _parser = {NULL, _keywords, "pathconf", 0};
7083 PyObject *argsbuf[2];
7084 path_t path = PATH_T_INITIALIZE("pathconf", "path", 0, PATH_HAVE_FPATHCONF);
7085 int name;
7086 long _return_value;
7087
7088 args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 2, 2, 0, argsbuf);
7089 if (!args) {
7090 goto exit;
7091 }
7092 if (!path_converter(args[0], &path)) {
7093 goto exit;
7094 }
7095 if (!conv_path_confname(args[1], &name)) {
7096 goto exit;
7097 }
7098 _return_value = os_pathconf_impl(module, &path, name);
7099 if ((_return_value == -1) && PyErr_Occurred()) {
7100 goto exit;
7101 }
7102 return_value = PyLong_FromLong(_return_value);
7103
7104 exit:
7105 /* Cleanup for path */
7106 path_cleanup(&path);
7107
7108 return return_value;
7109 }
7110
7111 #endif /* defined(HAVE_PATHCONF) */
7112
7113 #if defined(HAVE_CONFSTR)
7114
7115 PyDoc_STRVAR(os_confstr__doc__,
7116 "confstr($module, name, /)\n"
7117 "--\n"
7118 "\n"
7119 "Return a string-valued system configuration variable.");
7120
7121 #define OS_CONFSTR_METHODDEF \
7122 {"confstr", (PyCFunction)os_confstr, METH_O, os_confstr__doc__},
7123
7124 static PyObject *
7125 os_confstr_impl(PyObject *module, int name);
7126
7127 static PyObject *
os_confstr(PyObject * module,PyObject * arg)7128 os_confstr(PyObject *module, PyObject *arg)
7129 {
7130 PyObject *return_value = NULL;
7131 int name;
7132
7133 if (!conv_confstr_confname(arg, &name)) {
7134 goto exit;
7135 }
7136 return_value = os_confstr_impl(module, name);
7137
7138 exit:
7139 return return_value;
7140 }
7141
7142 #endif /* defined(HAVE_CONFSTR) */
7143
7144 #if defined(HAVE_SYSCONF)
7145
7146 PyDoc_STRVAR(os_sysconf__doc__,
7147 "sysconf($module, name, /)\n"
7148 "--\n"
7149 "\n"
7150 "Return an integer-valued system configuration variable.");
7151
7152 #define OS_SYSCONF_METHODDEF \
7153 {"sysconf", (PyCFunction)os_sysconf, METH_O, os_sysconf__doc__},
7154
7155 static long
7156 os_sysconf_impl(PyObject *module, int name);
7157
7158 static PyObject *
os_sysconf(PyObject * module,PyObject * arg)7159 os_sysconf(PyObject *module, PyObject *arg)
7160 {
7161 PyObject *return_value = NULL;
7162 int name;
7163 long _return_value;
7164
7165 if (!conv_sysconf_confname(arg, &name)) {
7166 goto exit;
7167 }
7168 _return_value = os_sysconf_impl(module, name);
7169 if ((_return_value == -1) && PyErr_Occurred()) {
7170 goto exit;
7171 }
7172 return_value = PyLong_FromLong(_return_value);
7173
7174 exit:
7175 return return_value;
7176 }
7177
7178 #endif /* defined(HAVE_SYSCONF) */
7179
7180 PyDoc_STRVAR(os_abort__doc__,
7181 "abort($module, /)\n"
7182 "--\n"
7183 "\n"
7184 "Abort the interpreter immediately.\n"
7185 "\n"
7186 "This function \'dumps core\' or otherwise fails in the hardest way possible\n"
7187 "on the hosting operating system. This function never returns.");
7188
7189 #define OS_ABORT_METHODDEF \
7190 {"abort", (PyCFunction)os_abort, METH_NOARGS, os_abort__doc__},
7191
7192 static PyObject *
7193 os_abort_impl(PyObject *module);
7194
7195 static PyObject *
os_abort(PyObject * module,PyObject * Py_UNUSED (ignored))7196 os_abort(PyObject *module, PyObject *Py_UNUSED(ignored))
7197 {
7198 return os_abort_impl(module);
7199 }
7200
7201 #if defined(MS_WINDOWS)
7202
7203 PyDoc_STRVAR(os_startfile__doc__,
7204 "startfile($module, /, filepath, operation=<unrepresentable>,\n"
7205 " arguments=<unrepresentable>, cwd=None, show_cmd=1)\n"
7206 "--\n"
7207 "\n"
7208 "Start a file with its associated application.\n"
7209 "\n"
7210 "When \"operation\" is not specified or \"open\", this acts like\n"
7211 "double-clicking the file in Explorer, or giving the file name as an\n"
7212 "argument to the DOS \"start\" command: the file is opened with whatever\n"
7213 "application (if any) its extension is associated.\n"
7214 "When another \"operation\" is given, it specifies what should be done with\n"
7215 "the file. A typical operation is \"print\".\n"
7216 "\n"
7217 "\"arguments\" is passed to the application, but should be omitted if the\n"
7218 "file is a document.\n"
7219 "\n"
7220 "\"cwd\" is the working directory for the operation. If \"filepath\" is\n"
7221 "relative, it will be resolved against this directory. This argument\n"
7222 "should usually be an absolute path.\n"
7223 "\n"
7224 "\"show_cmd\" can be used to override the recommended visibility option.\n"
7225 "See the Windows ShellExecute documentation for values.\n"
7226 "\n"
7227 "startfile returns as soon as the associated application is launched.\n"
7228 "There is no option to wait for the application to close, and no way\n"
7229 "to retrieve the application\'s exit status.\n"
7230 "\n"
7231 "The filepath is relative to the current directory. If you want to use\n"
7232 "an absolute path, make sure the first character is not a slash (\"/\");\n"
7233 "the underlying Win32 ShellExecute function doesn\'t work if it is.");
7234
7235 #define OS_STARTFILE_METHODDEF \
7236 {"startfile", _PyCFunction_CAST(os_startfile), METH_FASTCALL|METH_KEYWORDS, os_startfile__doc__},
7237
7238 static PyObject *
7239 os_startfile_impl(PyObject *module, path_t *filepath,
7240 const Py_UNICODE *operation, const Py_UNICODE *arguments,
7241 path_t *cwd, int show_cmd);
7242
7243 static PyObject *
os_startfile(PyObject * module,PyObject * const * args,Py_ssize_t nargs,PyObject * kwnames)7244 os_startfile(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames)
7245 {
7246 PyObject *return_value = NULL;
7247 static const char * const _keywords[] = {"filepath", "operation", "arguments", "cwd", "show_cmd", NULL};
7248 static _PyArg_Parser _parser = {NULL, _keywords, "startfile", 0};
7249 PyObject *argsbuf[5];
7250 Py_ssize_t noptargs = nargs + (kwnames ? PyTuple_GET_SIZE(kwnames) : 0) - 1;
7251 path_t filepath = PATH_T_INITIALIZE("startfile", "filepath", 0, 0);
7252 const Py_UNICODE *operation = NULL;
7253 const Py_UNICODE *arguments = NULL;
7254 path_t cwd = PATH_T_INITIALIZE("startfile", "cwd", 1, 0);
7255 int show_cmd = 1;
7256
7257 args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 1, 5, 0, argsbuf);
7258 if (!args) {
7259 goto exit;
7260 }
7261 if (!path_converter(args[0], &filepath)) {
7262 goto exit;
7263 }
7264 if (!noptargs) {
7265 goto skip_optional_pos;
7266 }
7267 if (args[1]) {
7268 if (!PyUnicode_Check(args[1])) {
7269 _PyArg_BadArgument("startfile", "argument 'operation'", "str", args[1]);
7270 goto exit;
7271 }
7272 #if USE_UNICODE_WCHAR_CACHE
7273 operation = _PyUnicode_AsUnicode(args[1]);
7274 #else /* USE_UNICODE_WCHAR_CACHE */
7275 operation = PyUnicode_AsWideCharString(args[1], NULL);
7276 #endif /* USE_UNICODE_WCHAR_CACHE */
7277 if (operation == NULL) {
7278 goto exit;
7279 }
7280 if (!--noptargs) {
7281 goto skip_optional_pos;
7282 }
7283 }
7284 if (args[2]) {
7285 if (!PyUnicode_Check(args[2])) {
7286 _PyArg_BadArgument("startfile", "argument 'arguments'", "str", args[2]);
7287 goto exit;
7288 }
7289 #if USE_UNICODE_WCHAR_CACHE
7290 arguments = _PyUnicode_AsUnicode(args[2]);
7291 #else /* USE_UNICODE_WCHAR_CACHE */
7292 arguments = PyUnicode_AsWideCharString(args[2], NULL);
7293 #endif /* USE_UNICODE_WCHAR_CACHE */
7294 if (arguments == NULL) {
7295 goto exit;
7296 }
7297 if (!--noptargs) {
7298 goto skip_optional_pos;
7299 }
7300 }
7301 if (args[3]) {
7302 if (!path_converter(args[3], &cwd)) {
7303 goto exit;
7304 }
7305 if (!--noptargs) {
7306 goto skip_optional_pos;
7307 }
7308 }
7309 show_cmd = _PyLong_AsInt(args[4]);
7310 if (show_cmd == -1 && PyErr_Occurred()) {
7311 goto exit;
7312 }
7313 skip_optional_pos:
7314 return_value = os_startfile_impl(module, &filepath, operation, arguments, &cwd, show_cmd);
7315
7316 exit:
7317 /* Cleanup for filepath */
7318 path_cleanup(&filepath);
7319 /* Cleanup for operation */
7320 #if !USE_UNICODE_WCHAR_CACHE
7321 PyMem_Free((void *)operation);
7322 #endif /* USE_UNICODE_WCHAR_CACHE */
7323 /* Cleanup for arguments */
7324 #if !USE_UNICODE_WCHAR_CACHE
7325 PyMem_Free((void *)arguments);
7326 #endif /* USE_UNICODE_WCHAR_CACHE */
7327 /* Cleanup for cwd */
7328 path_cleanup(&cwd);
7329
7330 return return_value;
7331 }
7332
7333 #endif /* defined(MS_WINDOWS) */
7334
7335 #if defined(HAVE_GETLOADAVG)
7336
7337 PyDoc_STRVAR(os_getloadavg__doc__,
7338 "getloadavg($module, /)\n"
7339 "--\n"
7340 "\n"
7341 "Return average recent system load information.\n"
7342 "\n"
7343 "Return the number of processes in the system run queue averaged over\n"
7344 "the last 1, 5, and 15 minutes as a tuple of three floats.\n"
7345 "Raises OSError if the load average was unobtainable.");
7346
7347 #define OS_GETLOADAVG_METHODDEF \
7348 {"getloadavg", (PyCFunction)os_getloadavg, METH_NOARGS, os_getloadavg__doc__},
7349
7350 static PyObject *
7351 os_getloadavg_impl(PyObject *module);
7352
7353 static PyObject *
os_getloadavg(PyObject * module,PyObject * Py_UNUSED (ignored))7354 os_getloadavg(PyObject *module, PyObject *Py_UNUSED(ignored))
7355 {
7356 return os_getloadavg_impl(module);
7357 }
7358
7359 #endif /* defined(HAVE_GETLOADAVG) */
7360
7361 PyDoc_STRVAR(os_device_encoding__doc__,
7362 "device_encoding($module, /, fd)\n"
7363 "--\n"
7364 "\n"
7365 "Return a string describing the encoding of a terminal\'s file descriptor.\n"
7366 "\n"
7367 "The file descriptor must be attached to a terminal.\n"
7368 "If the device is not a terminal, return None.");
7369
7370 #define OS_DEVICE_ENCODING_METHODDEF \
7371 {"device_encoding", _PyCFunction_CAST(os_device_encoding), METH_FASTCALL|METH_KEYWORDS, os_device_encoding__doc__},
7372
7373 static PyObject *
7374 os_device_encoding_impl(PyObject *module, int fd);
7375
7376 static PyObject *
os_device_encoding(PyObject * module,PyObject * const * args,Py_ssize_t nargs,PyObject * kwnames)7377 os_device_encoding(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames)
7378 {
7379 PyObject *return_value = NULL;
7380 static const char * const _keywords[] = {"fd", NULL};
7381 static _PyArg_Parser _parser = {NULL, _keywords, "device_encoding", 0};
7382 PyObject *argsbuf[1];
7383 int fd;
7384
7385 args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 1, 1, 0, argsbuf);
7386 if (!args) {
7387 goto exit;
7388 }
7389 fd = _PyLong_AsInt(args[0]);
7390 if (fd == -1 && PyErr_Occurred()) {
7391 goto exit;
7392 }
7393 return_value = os_device_encoding_impl(module, fd);
7394
7395 exit:
7396 return return_value;
7397 }
7398
7399 #if defined(HAVE_SETRESUID)
7400
7401 PyDoc_STRVAR(os_setresuid__doc__,
7402 "setresuid($module, ruid, euid, suid, /)\n"
7403 "--\n"
7404 "\n"
7405 "Set the current process\'s real, effective, and saved user ids.");
7406
7407 #define OS_SETRESUID_METHODDEF \
7408 {"setresuid", _PyCFunction_CAST(os_setresuid), METH_FASTCALL, os_setresuid__doc__},
7409
7410 static PyObject *
7411 os_setresuid_impl(PyObject *module, uid_t ruid, uid_t euid, uid_t suid);
7412
7413 static PyObject *
os_setresuid(PyObject * module,PyObject * const * args,Py_ssize_t nargs)7414 os_setresuid(PyObject *module, PyObject *const *args, Py_ssize_t nargs)
7415 {
7416 PyObject *return_value = NULL;
7417 uid_t ruid;
7418 uid_t euid;
7419 uid_t suid;
7420
7421 if (!_PyArg_CheckPositional("setresuid", nargs, 3, 3)) {
7422 goto exit;
7423 }
7424 if (!_Py_Uid_Converter(args[0], &ruid)) {
7425 goto exit;
7426 }
7427 if (!_Py_Uid_Converter(args[1], &euid)) {
7428 goto exit;
7429 }
7430 if (!_Py_Uid_Converter(args[2], &suid)) {
7431 goto exit;
7432 }
7433 return_value = os_setresuid_impl(module, ruid, euid, suid);
7434
7435 exit:
7436 return return_value;
7437 }
7438
7439 #endif /* defined(HAVE_SETRESUID) */
7440
7441 #if defined(HAVE_SETRESGID)
7442
7443 PyDoc_STRVAR(os_setresgid__doc__,
7444 "setresgid($module, rgid, egid, sgid, /)\n"
7445 "--\n"
7446 "\n"
7447 "Set the current process\'s real, effective, and saved group ids.");
7448
7449 #define OS_SETRESGID_METHODDEF \
7450 {"setresgid", _PyCFunction_CAST(os_setresgid), METH_FASTCALL, os_setresgid__doc__},
7451
7452 static PyObject *
7453 os_setresgid_impl(PyObject *module, gid_t rgid, gid_t egid, gid_t sgid);
7454
7455 static PyObject *
os_setresgid(PyObject * module,PyObject * const * args,Py_ssize_t nargs)7456 os_setresgid(PyObject *module, PyObject *const *args, Py_ssize_t nargs)
7457 {
7458 PyObject *return_value = NULL;
7459 gid_t rgid;
7460 gid_t egid;
7461 gid_t sgid;
7462
7463 if (!_PyArg_CheckPositional("setresgid", nargs, 3, 3)) {
7464 goto exit;
7465 }
7466 if (!_Py_Gid_Converter(args[0], &rgid)) {
7467 goto exit;
7468 }
7469 if (!_Py_Gid_Converter(args[1], &egid)) {
7470 goto exit;
7471 }
7472 if (!_Py_Gid_Converter(args[2], &sgid)) {
7473 goto exit;
7474 }
7475 return_value = os_setresgid_impl(module, rgid, egid, sgid);
7476
7477 exit:
7478 return return_value;
7479 }
7480
7481 #endif /* defined(HAVE_SETRESGID) */
7482
7483 #if defined(HAVE_GETRESUID)
7484
7485 PyDoc_STRVAR(os_getresuid__doc__,
7486 "getresuid($module, /)\n"
7487 "--\n"
7488 "\n"
7489 "Return a tuple of the current process\'s real, effective, and saved user ids.");
7490
7491 #define OS_GETRESUID_METHODDEF \
7492 {"getresuid", (PyCFunction)os_getresuid, METH_NOARGS, os_getresuid__doc__},
7493
7494 static PyObject *
7495 os_getresuid_impl(PyObject *module);
7496
7497 static PyObject *
os_getresuid(PyObject * module,PyObject * Py_UNUSED (ignored))7498 os_getresuid(PyObject *module, PyObject *Py_UNUSED(ignored))
7499 {
7500 return os_getresuid_impl(module);
7501 }
7502
7503 #endif /* defined(HAVE_GETRESUID) */
7504
7505 #if defined(HAVE_GETRESGID)
7506
7507 PyDoc_STRVAR(os_getresgid__doc__,
7508 "getresgid($module, /)\n"
7509 "--\n"
7510 "\n"
7511 "Return a tuple of the current process\'s real, effective, and saved group ids.");
7512
7513 #define OS_GETRESGID_METHODDEF \
7514 {"getresgid", (PyCFunction)os_getresgid, METH_NOARGS, os_getresgid__doc__},
7515
7516 static PyObject *
7517 os_getresgid_impl(PyObject *module);
7518
7519 static PyObject *
os_getresgid(PyObject * module,PyObject * Py_UNUSED (ignored))7520 os_getresgid(PyObject *module, PyObject *Py_UNUSED(ignored))
7521 {
7522 return os_getresgid_impl(module);
7523 }
7524
7525 #endif /* defined(HAVE_GETRESGID) */
7526
7527 #if defined(USE_XATTRS)
7528
7529 PyDoc_STRVAR(os_getxattr__doc__,
7530 "getxattr($module, /, path, attribute, *, follow_symlinks=True)\n"
7531 "--\n"
7532 "\n"
7533 "Return the value of extended attribute attribute on path.\n"
7534 "\n"
7535 "path may be either a string, a path-like object, or an open file descriptor.\n"
7536 "If follow_symlinks is False, and the last element of the path is a symbolic\n"
7537 " link, getxattr will examine the symbolic link itself instead of the file\n"
7538 " the link points to.");
7539
7540 #define OS_GETXATTR_METHODDEF \
7541 {"getxattr", _PyCFunction_CAST(os_getxattr), METH_FASTCALL|METH_KEYWORDS, os_getxattr__doc__},
7542
7543 static PyObject *
7544 os_getxattr_impl(PyObject *module, path_t *path, path_t *attribute,
7545 int follow_symlinks);
7546
7547 static PyObject *
os_getxattr(PyObject * module,PyObject * const * args,Py_ssize_t nargs,PyObject * kwnames)7548 os_getxattr(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames)
7549 {
7550 PyObject *return_value = NULL;
7551 static const char * const _keywords[] = {"path", "attribute", "follow_symlinks", NULL};
7552 static _PyArg_Parser _parser = {NULL, _keywords, "getxattr", 0};
7553 PyObject *argsbuf[3];
7554 Py_ssize_t noptargs = nargs + (kwnames ? PyTuple_GET_SIZE(kwnames) : 0) - 2;
7555 path_t path = PATH_T_INITIALIZE("getxattr", "path", 0, 1);
7556 path_t attribute = PATH_T_INITIALIZE("getxattr", "attribute", 0, 0);
7557 int follow_symlinks = 1;
7558
7559 args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 2, 2, 0, argsbuf);
7560 if (!args) {
7561 goto exit;
7562 }
7563 if (!path_converter(args[0], &path)) {
7564 goto exit;
7565 }
7566 if (!path_converter(args[1], &attribute)) {
7567 goto exit;
7568 }
7569 if (!noptargs) {
7570 goto skip_optional_kwonly;
7571 }
7572 follow_symlinks = PyObject_IsTrue(args[2]);
7573 if (follow_symlinks < 0) {
7574 goto exit;
7575 }
7576 skip_optional_kwonly:
7577 return_value = os_getxattr_impl(module, &path, &attribute, follow_symlinks);
7578
7579 exit:
7580 /* Cleanup for path */
7581 path_cleanup(&path);
7582 /* Cleanup for attribute */
7583 path_cleanup(&attribute);
7584
7585 return return_value;
7586 }
7587
7588 #endif /* defined(USE_XATTRS) */
7589
7590 #if defined(USE_XATTRS)
7591
7592 PyDoc_STRVAR(os_setxattr__doc__,
7593 "setxattr($module, /, path, attribute, value, flags=0, *,\n"
7594 " follow_symlinks=True)\n"
7595 "--\n"
7596 "\n"
7597 "Set extended attribute attribute on path to value.\n"
7598 "\n"
7599 "path may be either a string, a path-like object, or an open file descriptor.\n"
7600 "If follow_symlinks is False, and the last element of the path is a symbolic\n"
7601 " link, setxattr will modify the symbolic link itself instead of the file\n"
7602 " the link points to.");
7603
7604 #define OS_SETXATTR_METHODDEF \
7605 {"setxattr", _PyCFunction_CAST(os_setxattr), METH_FASTCALL|METH_KEYWORDS, os_setxattr__doc__},
7606
7607 static PyObject *
7608 os_setxattr_impl(PyObject *module, path_t *path, path_t *attribute,
7609 Py_buffer *value, int flags, int follow_symlinks);
7610
7611 static PyObject *
os_setxattr(PyObject * module,PyObject * const * args,Py_ssize_t nargs,PyObject * kwnames)7612 os_setxattr(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames)
7613 {
7614 PyObject *return_value = NULL;
7615 static const char * const _keywords[] = {"path", "attribute", "value", "flags", "follow_symlinks", NULL};
7616 static _PyArg_Parser _parser = {NULL, _keywords, "setxattr", 0};
7617 PyObject *argsbuf[5];
7618 Py_ssize_t noptargs = nargs + (kwnames ? PyTuple_GET_SIZE(kwnames) : 0) - 3;
7619 path_t path = PATH_T_INITIALIZE("setxattr", "path", 0, 1);
7620 path_t attribute = PATH_T_INITIALIZE("setxattr", "attribute", 0, 0);
7621 Py_buffer value = {NULL, NULL};
7622 int flags = 0;
7623 int follow_symlinks = 1;
7624
7625 args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 3, 4, 0, argsbuf);
7626 if (!args) {
7627 goto exit;
7628 }
7629 if (!path_converter(args[0], &path)) {
7630 goto exit;
7631 }
7632 if (!path_converter(args[1], &attribute)) {
7633 goto exit;
7634 }
7635 if (PyObject_GetBuffer(args[2], &value, PyBUF_SIMPLE) != 0) {
7636 goto exit;
7637 }
7638 if (!PyBuffer_IsContiguous(&value, 'C')) {
7639 _PyArg_BadArgument("setxattr", "argument 'value'", "contiguous buffer", args[2]);
7640 goto exit;
7641 }
7642 if (!noptargs) {
7643 goto skip_optional_pos;
7644 }
7645 if (args[3]) {
7646 flags = _PyLong_AsInt(args[3]);
7647 if (flags == -1 && PyErr_Occurred()) {
7648 goto exit;
7649 }
7650 if (!--noptargs) {
7651 goto skip_optional_pos;
7652 }
7653 }
7654 skip_optional_pos:
7655 if (!noptargs) {
7656 goto skip_optional_kwonly;
7657 }
7658 follow_symlinks = PyObject_IsTrue(args[4]);
7659 if (follow_symlinks < 0) {
7660 goto exit;
7661 }
7662 skip_optional_kwonly:
7663 return_value = os_setxattr_impl(module, &path, &attribute, &value, flags, follow_symlinks);
7664
7665 exit:
7666 /* Cleanup for path */
7667 path_cleanup(&path);
7668 /* Cleanup for attribute */
7669 path_cleanup(&attribute);
7670 /* Cleanup for value */
7671 if (value.obj) {
7672 PyBuffer_Release(&value);
7673 }
7674
7675 return return_value;
7676 }
7677
7678 #endif /* defined(USE_XATTRS) */
7679
7680 #if defined(USE_XATTRS)
7681
7682 PyDoc_STRVAR(os_removexattr__doc__,
7683 "removexattr($module, /, path, attribute, *, follow_symlinks=True)\n"
7684 "--\n"
7685 "\n"
7686 "Remove extended attribute attribute on path.\n"
7687 "\n"
7688 "path may be either a string, a path-like object, or an open file descriptor.\n"
7689 "If follow_symlinks is False, and the last element of the path is a symbolic\n"
7690 " link, removexattr will modify the symbolic link itself instead of the file\n"
7691 " the link points to.");
7692
7693 #define OS_REMOVEXATTR_METHODDEF \
7694 {"removexattr", _PyCFunction_CAST(os_removexattr), METH_FASTCALL|METH_KEYWORDS, os_removexattr__doc__},
7695
7696 static PyObject *
7697 os_removexattr_impl(PyObject *module, path_t *path, path_t *attribute,
7698 int follow_symlinks);
7699
7700 static PyObject *
os_removexattr(PyObject * module,PyObject * const * args,Py_ssize_t nargs,PyObject * kwnames)7701 os_removexattr(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames)
7702 {
7703 PyObject *return_value = NULL;
7704 static const char * const _keywords[] = {"path", "attribute", "follow_symlinks", NULL};
7705 static _PyArg_Parser _parser = {NULL, _keywords, "removexattr", 0};
7706 PyObject *argsbuf[3];
7707 Py_ssize_t noptargs = nargs + (kwnames ? PyTuple_GET_SIZE(kwnames) : 0) - 2;
7708 path_t path = PATH_T_INITIALIZE("removexattr", "path", 0, 1);
7709 path_t attribute = PATH_T_INITIALIZE("removexattr", "attribute", 0, 0);
7710 int follow_symlinks = 1;
7711
7712 args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 2, 2, 0, argsbuf);
7713 if (!args) {
7714 goto exit;
7715 }
7716 if (!path_converter(args[0], &path)) {
7717 goto exit;
7718 }
7719 if (!path_converter(args[1], &attribute)) {
7720 goto exit;
7721 }
7722 if (!noptargs) {
7723 goto skip_optional_kwonly;
7724 }
7725 follow_symlinks = PyObject_IsTrue(args[2]);
7726 if (follow_symlinks < 0) {
7727 goto exit;
7728 }
7729 skip_optional_kwonly:
7730 return_value = os_removexattr_impl(module, &path, &attribute, follow_symlinks);
7731
7732 exit:
7733 /* Cleanup for path */
7734 path_cleanup(&path);
7735 /* Cleanup for attribute */
7736 path_cleanup(&attribute);
7737
7738 return return_value;
7739 }
7740
7741 #endif /* defined(USE_XATTRS) */
7742
7743 #if defined(USE_XATTRS)
7744
7745 PyDoc_STRVAR(os_listxattr__doc__,
7746 "listxattr($module, /, path=None, *, follow_symlinks=True)\n"
7747 "--\n"
7748 "\n"
7749 "Return a list of extended attributes on path.\n"
7750 "\n"
7751 "path may be either None, a string, a path-like object, or an open file descriptor.\n"
7752 "if path is None, listxattr will examine the current directory.\n"
7753 "If follow_symlinks is False, and the last element of the path is a symbolic\n"
7754 " link, listxattr will examine the symbolic link itself instead of the file\n"
7755 " the link points to.");
7756
7757 #define OS_LISTXATTR_METHODDEF \
7758 {"listxattr", _PyCFunction_CAST(os_listxattr), METH_FASTCALL|METH_KEYWORDS, os_listxattr__doc__},
7759
7760 static PyObject *
7761 os_listxattr_impl(PyObject *module, path_t *path, int follow_symlinks);
7762
7763 static PyObject *
os_listxattr(PyObject * module,PyObject * const * args,Py_ssize_t nargs,PyObject * kwnames)7764 os_listxattr(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames)
7765 {
7766 PyObject *return_value = NULL;
7767 static const char * const _keywords[] = {"path", "follow_symlinks", NULL};
7768 static _PyArg_Parser _parser = {NULL, _keywords, "listxattr", 0};
7769 PyObject *argsbuf[2];
7770 Py_ssize_t noptargs = nargs + (kwnames ? PyTuple_GET_SIZE(kwnames) : 0) - 0;
7771 path_t path = PATH_T_INITIALIZE("listxattr", "path", 1, 1);
7772 int follow_symlinks = 1;
7773
7774 args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 0, 1, 0, argsbuf);
7775 if (!args) {
7776 goto exit;
7777 }
7778 if (!noptargs) {
7779 goto skip_optional_pos;
7780 }
7781 if (args[0]) {
7782 if (!path_converter(args[0], &path)) {
7783 goto exit;
7784 }
7785 if (!--noptargs) {
7786 goto skip_optional_pos;
7787 }
7788 }
7789 skip_optional_pos:
7790 if (!noptargs) {
7791 goto skip_optional_kwonly;
7792 }
7793 follow_symlinks = PyObject_IsTrue(args[1]);
7794 if (follow_symlinks < 0) {
7795 goto exit;
7796 }
7797 skip_optional_kwonly:
7798 return_value = os_listxattr_impl(module, &path, follow_symlinks);
7799
7800 exit:
7801 /* Cleanup for path */
7802 path_cleanup(&path);
7803
7804 return return_value;
7805 }
7806
7807 #endif /* defined(USE_XATTRS) */
7808
7809 PyDoc_STRVAR(os_urandom__doc__,
7810 "urandom($module, size, /)\n"
7811 "--\n"
7812 "\n"
7813 "Return a bytes object containing random bytes suitable for cryptographic use.");
7814
7815 #define OS_URANDOM_METHODDEF \
7816 {"urandom", (PyCFunction)os_urandom, METH_O, os_urandom__doc__},
7817
7818 static PyObject *
7819 os_urandom_impl(PyObject *module, Py_ssize_t size);
7820
7821 static PyObject *
os_urandom(PyObject * module,PyObject * arg)7822 os_urandom(PyObject *module, PyObject *arg)
7823 {
7824 PyObject *return_value = NULL;
7825 Py_ssize_t size;
7826
7827 {
7828 Py_ssize_t ival = -1;
7829 PyObject *iobj = _PyNumber_Index(arg);
7830 if (iobj != NULL) {
7831 ival = PyLong_AsSsize_t(iobj);
7832 Py_DECREF(iobj);
7833 }
7834 if (ival == -1 && PyErr_Occurred()) {
7835 goto exit;
7836 }
7837 size = ival;
7838 }
7839 return_value = os_urandom_impl(module, size);
7840
7841 exit:
7842 return return_value;
7843 }
7844
7845 #if defined(HAVE_MEMFD_CREATE)
7846
7847 PyDoc_STRVAR(os_memfd_create__doc__,
7848 "memfd_create($module, /, name, flags=MFD_CLOEXEC)\n"
7849 "--\n"
7850 "\n");
7851
7852 #define OS_MEMFD_CREATE_METHODDEF \
7853 {"memfd_create", _PyCFunction_CAST(os_memfd_create), METH_FASTCALL|METH_KEYWORDS, os_memfd_create__doc__},
7854
7855 static PyObject *
7856 os_memfd_create_impl(PyObject *module, PyObject *name, unsigned int flags);
7857
7858 static PyObject *
os_memfd_create(PyObject * module,PyObject * const * args,Py_ssize_t nargs,PyObject * kwnames)7859 os_memfd_create(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames)
7860 {
7861 PyObject *return_value = NULL;
7862 static const char * const _keywords[] = {"name", "flags", NULL};
7863 static _PyArg_Parser _parser = {NULL, _keywords, "memfd_create", 0};
7864 PyObject *argsbuf[2];
7865 Py_ssize_t noptargs = nargs + (kwnames ? PyTuple_GET_SIZE(kwnames) : 0) - 1;
7866 PyObject *name = NULL;
7867 unsigned int flags = MFD_CLOEXEC;
7868
7869 args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 1, 2, 0, argsbuf);
7870 if (!args) {
7871 goto exit;
7872 }
7873 if (!PyUnicode_FSConverter(args[0], &name)) {
7874 goto exit;
7875 }
7876 if (!noptargs) {
7877 goto skip_optional_pos;
7878 }
7879 flags = (unsigned int)PyLong_AsUnsignedLongMask(args[1]);
7880 if (flags == (unsigned int)-1 && PyErr_Occurred()) {
7881 goto exit;
7882 }
7883 skip_optional_pos:
7884 return_value = os_memfd_create_impl(module, name, flags);
7885
7886 exit:
7887 /* Cleanup for name */
7888 Py_XDECREF(name);
7889
7890 return return_value;
7891 }
7892
7893 #endif /* defined(HAVE_MEMFD_CREATE) */
7894
7895 #if (defined(HAVE_EVENTFD) && defined(EFD_CLOEXEC))
7896
7897 PyDoc_STRVAR(os_eventfd__doc__,
7898 "eventfd($module, /, initval, flags=EFD_CLOEXEC)\n"
7899 "--\n"
7900 "\n"
7901 "Creates and returns an event notification file descriptor.");
7902
7903 #define OS_EVENTFD_METHODDEF \
7904 {"eventfd", _PyCFunction_CAST(os_eventfd), METH_FASTCALL|METH_KEYWORDS, os_eventfd__doc__},
7905
7906 static PyObject *
7907 os_eventfd_impl(PyObject *module, unsigned int initval, int flags);
7908
7909 static PyObject *
os_eventfd(PyObject * module,PyObject * const * args,Py_ssize_t nargs,PyObject * kwnames)7910 os_eventfd(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames)
7911 {
7912 PyObject *return_value = NULL;
7913 static const char * const _keywords[] = {"initval", "flags", NULL};
7914 static _PyArg_Parser _parser = {NULL, _keywords, "eventfd", 0};
7915 PyObject *argsbuf[2];
7916 Py_ssize_t noptargs = nargs + (kwnames ? PyTuple_GET_SIZE(kwnames) : 0) - 1;
7917 unsigned int initval;
7918 int flags = EFD_CLOEXEC;
7919
7920 args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 1, 2, 0, argsbuf);
7921 if (!args) {
7922 goto exit;
7923 }
7924 if (!_PyLong_UnsignedInt_Converter(args[0], &initval)) {
7925 goto exit;
7926 }
7927 if (!noptargs) {
7928 goto skip_optional_pos;
7929 }
7930 flags = _PyLong_AsInt(args[1]);
7931 if (flags == -1 && PyErr_Occurred()) {
7932 goto exit;
7933 }
7934 skip_optional_pos:
7935 return_value = os_eventfd_impl(module, initval, flags);
7936
7937 exit:
7938 return return_value;
7939 }
7940
7941 #endif /* (defined(HAVE_EVENTFD) && defined(EFD_CLOEXEC)) */
7942
7943 #if (defined(HAVE_EVENTFD) && defined(EFD_CLOEXEC))
7944
7945 PyDoc_STRVAR(os_eventfd_read__doc__,
7946 "eventfd_read($module, /, fd)\n"
7947 "--\n"
7948 "\n"
7949 "Read eventfd value");
7950
7951 #define OS_EVENTFD_READ_METHODDEF \
7952 {"eventfd_read", _PyCFunction_CAST(os_eventfd_read), METH_FASTCALL|METH_KEYWORDS, os_eventfd_read__doc__},
7953
7954 static PyObject *
7955 os_eventfd_read_impl(PyObject *module, int fd);
7956
7957 static PyObject *
os_eventfd_read(PyObject * module,PyObject * const * args,Py_ssize_t nargs,PyObject * kwnames)7958 os_eventfd_read(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames)
7959 {
7960 PyObject *return_value = NULL;
7961 static const char * const _keywords[] = {"fd", NULL};
7962 static _PyArg_Parser _parser = {NULL, _keywords, "eventfd_read", 0};
7963 PyObject *argsbuf[1];
7964 int fd;
7965
7966 args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 1, 1, 0, argsbuf);
7967 if (!args) {
7968 goto exit;
7969 }
7970 if (!_PyLong_FileDescriptor_Converter(args[0], &fd)) {
7971 goto exit;
7972 }
7973 return_value = os_eventfd_read_impl(module, fd);
7974
7975 exit:
7976 return return_value;
7977 }
7978
7979 #endif /* (defined(HAVE_EVENTFD) && defined(EFD_CLOEXEC)) */
7980
7981 #if (defined(HAVE_EVENTFD) && defined(EFD_CLOEXEC))
7982
7983 PyDoc_STRVAR(os_eventfd_write__doc__,
7984 "eventfd_write($module, /, fd, value)\n"
7985 "--\n"
7986 "\n"
7987 "Write eventfd value.");
7988
7989 #define OS_EVENTFD_WRITE_METHODDEF \
7990 {"eventfd_write", _PyCFunction_CAST(os_eventfd_write), METH_FASTCALL|METH_KEYWORDS, os_eventfd_write__doc__},
7991
7992 static PyObject *
7993 os_eventfd_write_impl(PyObject *module, int fd, unsigned long long value);
7994
7995 static PyObject *
os_eventfd_write(PyObject * module,PyObject * const * args,Py_ssize_t nargs,PyObject * kwnames)7996 os_eventfd_write(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames)
7997 {
7998 PyObject *return_value = NULL;
7999 static const char * const _keywords[] = {"fd", "value", NULL};
8000 static _PyArg_Parser _parser = {NULL, _keywords, "eventfd_write", 0};
8001 PyObject *argsbuf[2];
8002 int fd;
8003 unsigned long long value;
8004
8005 args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 2, 2, 0, argsbuf);
8006 if (!args) {
8007 goto exit;
8008 }
8009 if (!_PyLong_FileDescriptor_Converter(args[0], &fd)) {
8010 goto exit;
8011 }
8012 if (!_PyLong_UnsignedLongLong_Converter(args[1], &value)) {
8013 goto exit;
8014 }
8015 return_value = os_eventfd_write_impl(module, fd, value);
8016
8017 exit:
8018 return return_value;
8019 }
8020
8021 #endif /* (defined(HAVE_EVENTFD) && defined(EFD_CLOEXEC)) */
8022
8023 #if (defined(TERMSIZE_USE_CONIO) || defined(TERMSIZE_USE_IOCTL))
8024
8025 PyDoc_STRVAR(os_get_terminal_size__doc__,
8026 "get_terminal_size($module, fd=<unrepresentable>, /)\n"
8027 "--\n"
8028 "\n"
8029 "Return the size of the terminal window as (columns, lines).\n"
8030 "\n"
8031 "The optional argument fd (default standard output) specifies\n"
8032 "which file descriptor should be queried.\n"
8033 "\n"
8034 "If the file descriptor is not connected to a terminal, an OSError\n"
8035 "is thrown.\n"
8036 "\n"
8037 "This function will only be defined if an implementation is\n"
8038 "available for this system.\n"
8039 "\n"
8040 "shutil.get_terminal_size is the high-level function which should\n"
8041 "normally be used, os.get_terminal_size is the low-level implementation.");
8042
8043 #define OS_GET_TERMINAL_SIZE_METHODDEF \
8044 {"get_terminal_size", _PyCFunction_CAST(os_get_terminal_size), METH_FASTCALL, os_get_terminal_size__doc__},
8045
8046 static PyObject *
8047 os_get_terminal_size_impl(PyObject *module, int fd);
8048
8049 static PyObject *
os_get_terminal_size(PyObject * module,PyObject * const * args,Py_ssize_t nargs)8050 os_get_terminal_size(PyObject *module, PyObject *const *args, Py_ssize_t nargs)
8051 {
8052 PyObject *return_value = NULL;
8053 int fd = fileno(stdout);
8054
8055 if (!_PyArg_CheckPositional("get_terminal_size", nargs, 0, 1)) {
8056 goto exit;
8057 }
8058 if (nargs < 1) {
8059 goto skip_optional;
8060 }
8061 fd = _PyLong_AsInt(args[0]);
8062 if (fd == -1 && PyErr_Occurred()) {
8063 goto exit;
8064 }
8065 skip_optional:
8066 return_value = os_get_terminal_size_impl(module, fd);
8067
8068 exit:
8069 return return_value;
8070 }
8071
8072 #endif /* (defined(TERMSIZE_USE_CONIO) || defined(TERMSIZE_USE_IOCTL)) */
8073
8074 PyDoc_STRVAR(os_cpu_count__doc__,
8075 "cpu_count($module, /)\n"
8076 "--\n"
8077 "\n"
8078 "Return the number of CPUs in the system; return None if indeterminable.\n"
8079 "\n"
8080 "This number is not equivalent to the number of CPUs the current process can\n"
8081 "use. The number of usable CPUs can be obtained with\n"
8082 "``len(os.sched_getaffinity(0))``");
8083
8084 #define OS_CPU_COUNT_METHODDEF \
8085 {"cpu_count", (PyCFunction)os_cpu_count, METH_NOARGS, os_cpu_count__doc__},
8086
8087 static PyObject *
8088 os_cpu_count_impl(PyObject *module);
8089
8090 static PyObject *
os_cpu_count(PyObject * module,PyObject * Py_UNUSED (ignored))8091 os_cpu_count(PyObject *module, PyObject *Py_UNUSED(ignored))
8092 {
8093 return os_cpu_count_impl(module);
8094 }
8095
8096 PyDoc_STRVAR(os_get_inheritable__doc__,
8097 "get_inheritable($module, fd, /)\n"
8098 "--\n"
8099 "\n"
8100 "Get the close-on-exe flag of the specified file descriptor.");
8101
8102 #define OS_GET_INHERITABLE_METHODDEF \
8103 {"get_inheritable", (PyCFunction)os_get_inheritable, METH_O, os_get_inheritable__doc__},
8104
8105 static int
8106 os_get_inheritable_impl(PyObject *module, int fd);
8107
8108 static PyObject *
os_get_inheritable(PyObject * module,PyObject * arg)8109 os_get_inheritable(PyObject *module, PyObject *arg)
8110 {
8111 PyObject *return_value = NULL;
8112 int fd;
8113 int _return_value;
8114
8115 fd = _PyLong_AsInt(arg);
8116 if (fd == -1 && PyErr_Occurred()) {
8117 goto exit;
8118 }
8119 _return_value = os_get_inheritable_impl(module, fd);
8120 if ((_return_value == -1) && PyErr_Occurred()) {
8121 goto exit;
8122 }
8123 return_value = PyBool_FromLong((long)_return_value);
8124
8125 exit:
8126 return return_value;
8127 }
8128
8129 PyDoc_STRVAR(os_set_inheritable__doc__,
8130 "set_inheritable($module, fd, inheritable, /)\n"
8131 "--\n"
8132 "\n"
8133 "Set the inheritable flag of the specified file descriptor.");
8134
8135 #define OS_SET_INHERITABLE_METHODDEF \
8136 {"set_inheritable", _PyCFunction_CAST(os_set_inheritable), METH_FASTCALL, os_set_inheritable__doc__},
8137
8138 static PyObject *
8139 os_set_inheritable_impl(PyObject *module, int fd, int inheritable);
8140
8141 static PyObject *
os_set_inheritable(PyObject * module,PyObject * const * args,Py_ssize_t nargs)8142 os_set_inheritable(PyObject *module, PyObject *const *args, Py_ssize_t nargs)
8143 {
8144 PyObject *return_value = NULL;
8145 int fd;
8146 int inheritable;
8147
8148 if (!_PyArg_CheckPositional("set_inheritable", nargs, 2, 2)) {
8149 goto exit;
8150 }
8151 fd = _PyLong_AsInt(args[0]);
8152 if (fd == -1 && PyErr_Occurred()) {
8153 goto exit;
8154 }
8155 inheritable = _PyLong_AsInt(args[1]);
8156 if (inheritable == -1 && PyErr_Occurred()) {
8157 goto exit;
8158 }
8159 return_value = os_set_inheritable_impl(module, fd, inheritable);
8160
8161 exit:
8162 return return_value;
8163 }
8164
8165 #if defined(MS_WINDOWS)
8166
8167 PyDoc_STRVAR(os_get_handle_inheritable__doc__,
8168 "get_handle_inheritable($module, handle, /)\n"
8169 "--\n"
8170 "\n"
8171 "Get the close-on-exe flag of the specified file descriptor.");
8172
8173 #define OS_GET_HANDLE_INHERITABLE_METHODDEF \
8174 {"get_handle_inheritable", (PyCFunction)os_get_handle_inheritable, METH_O, os_get_handle_inheritable__doc__},
8175
8176 static int
8177 os_get_handle_inheritable_impl(PyObject *module, intptr_t handle);
8178
8179 static PyObject *
os_get_handle_inheritable(PyObject * module,PyObject * arg)8180 os_get_handle_inheritable(PyObject *module, PyObject *arg)
8181 {
8182 PyObject *return_value = NULL;
8183 intptr_t handle;
8184 int _return_value;
8185
8186 if (!PyArg_Parse(arg, "" _Py_PARSE_INTPTR ":get_handle_inheritable", &handle)) {
8187 goto exit;
8188 }
8189 _return_value = os_get_handle_inheritable_impl(module, handle);
8190 if ((_return_value == -1) && PyErr_Occurred()) {
8191 goto exit;
8192 }
8193 return_value = PyBool_FromLong((long)_return_value);
8194
8195 exit:
8196 return return_value;
8197 }
8198
8199 #endif /* defined(MS_WINDOWS) */
8200
8201 #if defined(MS_WINDOWS)
8202
8203 PyDoc_STRVAR(os_set_handle_inheritable__doc__,
8204 "set_handle_inheritable($module, handle, inheritable, /)\n"
8205 "--\n"
8206 "\n"
8207 "Set the inheritable flag of the specified handle.");
8208
8209 #define OS_SET_HANDLE_INHERITABLE_METHODDEF \
8210 {"set_handle_inheritable", _PyCFunction_CAST(os_set_handle_inheritable), METH_FASTCALL, os_set_handle_inheritable__doc__},
8211
8212 static PyObject *
8213 os_set_handle_inheritable_impl(PyObject *module, intptr_t handle,
8214 int inheritable);
8215
8216 static PyObject *
os_set_handle_inheritable(PyObject * module,PyObject * const * args,Py_ssize_t nargs)8217 os_set_handle_inheritable(PyObject *module, PyObject *const *args, Py_ssize_t nargs)
8218 {
8219 PyObject *return_value = NULL;
8220 intptr_t handle;
8221 int inheritable;
8222
8223 if (!_PyArg_ParseStack(args, nargs, "" _Py_PARSE_INTPTR "p:set_handle_inheritable",
8224 &handle, &inheritable)) {
8225 goto exit;
8226 }
8227 return_value = os_set_handle_inheritable_impl(module, handle, inheritable);
8228
8229 exit:
8230 return return_value;
8231 }
8232
8233 #endif /* defined(MS_WINDOWS) */
8234
8235 #if !defined(MS_WINDOWS)
8236
8237 PyDoc_STRVAR(os_get_blocking__doc__,
8238 "get_blocking($module, fd, /)\n"
8239 "--\n"
8240 "\n"
8241 "Get the blocking mode of the file descriptor.\n"
8242 "\n"
8243 "Return False if the O_NONBLOCK flag is set, True if the flag is cleared.");
8244
8245 #define OS_GET_BLOCKING_METHODDEF \
8246 {"get_blocking", (PyCFunction)os_get_blocking, METH_O, os_get_blocking__doc__},
8247
8248 static int
8249 os_get_blocking_impl(PyObject *module, int fd);
8250
8251 static PyObject *
os_get_blocking(PyObject * module,PyObject * arg)8252 os_get_blocking(PyObject *module, PyObject *arg)
8253 {
8254 PyObject *return_value = NULL;
8255 int fd;
8256 int _return_value;
8257
8258 fd = _PyLong_AsInt(arg);
8259 if (fd == -1 && PyErr_Occurred()) {
8260 goto exit;
8261 }
8262 _return_value = os_get_blocking_impl(module, fd);
8263 if ((_return_value == -1) && PyErr_Occurred()) {
8264 goto exit;
8265 }
8266 return_value = PyBool_FromLong((long)_return_value);
8267
8268 exit:
8269 return return_value;
8270 }
8271
8272 #endif /* !defined(MS_WINDOWS) */
8273
8274 #if !defined(MS_WINDOWS)
8275
8276 PyDoc_STRVAR(os_set_blocking__doc__,
8277 "set_blocking($module, fd, blocking, /)\n"
8278 "--\n"
8279 "\n"
8280 "Set the blocking mode of the specified file descriptor.\n"
8281 "\n"
8282 "Set the O_NONBLOCK flag if blocking is False,\n"
8283 "clear the O_NONBLOCK flag otherwise.");
8284
8285 #define OS_SET_BLOCKING_METHODDEF \
8286 {"set_blocking", _PyCFunction_CAST(os_set_blocking), METH_FASTCALL, os_set_blocking__doc__},
8287
8288 static PyObject *
8289 os_set_blocking_impl(PyObject *module, int fd, int blocking);
8290
8291 static PyObject *
os_set_blocking(PyObject * module,PyObject * const * args,Py_ssize_t nargs)8292 os_set_blocking(PyObject *module, PyObject *const *args, Py_ssize_t nargs)
8293 {
8294 PyObject *return_value = NULL;
8295 int fd;
8296 int blocking;
8297
8298 if (!_PyArg_CheckPositional("set_blocking", nargs, 2, 2)) {
8299 goto exit;
8300 }
8301 fd = _PyLong_AsInt(args[0]);
8302 if (fd == -1 && PyErr_Occurred()) {
8303 goto exit;
8304 }
8305 blocking = _PyLong_AsInt(args[1]);
8306 if (blocking == -1 && PyErr_Occurred()) {
8307 goto exit;
8308 }
8309 return_value = os_set_blocking_impl(module, fd, blocking);
8310
8311 exit:
8312 return return_value;
8313 }
8314
8315 #endif /* !defined(MS_WINDOWS) */
8316
8317 PyDoc_STRVAR(os_DirEntry_is_symlink__doc__,
8318 "is_symlink($self, /)\n"
8319 "--\n"
8320 "\n"
8321 "Return True if the entry is a symbolic link; cached per entry.");
8322
8323 #define OS_DIRENTRY_IS_SYMLINK_METHODDEF \
8324 {"is_symlink", _PyCFunction_CAST(os_DirEntry_is_symlink), METH_METHOD|METH_FASTCALL|METH_KEYWORDS, os_DirEntry_is_symlink__doc__},
8325
8326 static int
8327 os_DirEntry_is_symlink_impl(DirEntry *self, PyTypeObject *defining_class);
8328
8329 static PyObject *
os_DirEntry_is_symlink(DirEntry * self,PyTypeObject * defining_class,PyObject * const * args,Py_ssize_t nargs,PyObject * kwnames)8330 os_DirEntry_is_symlink(DirEntry *self, PyTypeObject *defining_class, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames)
8331 {
8332 PyObject *return_value = NULL;
8333 int _return_value;
8334
8335 if (nargs) {
8336 PyErr_SetString(PyExc_TypeError, "is_symlink() takes no arguments");
8337 goto exit;
8338 }
8339 _return_value = os_DirEntry_is_symlink_impl(self, defining_class);
8340 if ((_return_value == -1) && PyErr_Occurred()) {
8341 goto exit;
8342 }
8343 return_value = PyBool_FromLong((long)_return_value);
8344
8345 exit:
8346 return return_value;
8347 }
8348
8349 PyDoc_STRVAR(os_DirEntry_stat__doc__,
8350 "stat($self, /, *, follow_symlinks=True)\n"
8351 "--\n"
8352 "\n"
8353 "Return stat_result object for the entry; cached per entry.");
8354
8355 #define OS_DIRENTRY_STAT_METHODDEF \
8356 {"stat", _PyCFunction_CAST(os_DirEntry_stat), METH_METHOD|METH_FASTCALL|METH_KEYWORDS, os_DirEntry_stat__doc__},
8357
8358 static PyObject *
8359 os_DirEntry_stat_impl(DirEntry *self, PyTypeObject *defining_class,
8360 int follow_symlinks);
8361
8362 static PyObject *
os_DirEntry_stat(DirEntry * self,PyTypeObject * defining_class,PyObject * const * args,Py_ssize_t nargs,PyObject * kwnames)8363 os_DirEntry_stat(DirEntry *self, PyTypeObject *defining_class, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames)
8364 {
8365 PyObject *return_value = NULL;
8366 static const char * const _keywords[] = {"follow_symlinks", NULL};
8367 static _PyArg_Parser _parser = {NULL, _keywords, "stat", 0};
8368 PyObject *argsbuf[1];
8369 Py_ssize_t noptargs = nargs + (kwnames ? PyTuple_GET_SIZE(kwnames) : 0) - 0;
8370 int follow_symlinks = 1;
8371
8372 args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 0, 0, 0, argsbuf);
8373 if (!args) {
8374 goto exit;
8375 }
8376 if (!noptargs) {
8377 goto skip_optional_kwonly;
8378 }
8379 follow_symlinks = PyObject_IsTrue(args[0]);
8380 if (follow_symlinks < 0) {
8381 goto exit;
8382 }
8383 skip_optional_kwonly:
8384 return_value = os_DirEntry_stat_impl(self, defining_class, follow_symlinks);
8385
8386 exit:
8387 return return_value;
8388 }
8389
8390 PyDoc_STRVAR(os_DirEntry_is_dir__doc__,
8391 "is_dir($self, /, *, follow_symlinks=True)\n"
8392 "--\n"
8393 "\n"
8394 "Return True if the entry is a directory; cached per entry.");
8395
8396 #define OS_DIRENTRY_IS_DIR_METHODDEF \
8397 {"is_dir", _PyCFunction_CAST(os_DirEntry_is_dir), METH_METHOD|METH_FASTCALL|METH_KEYWORDS, os_DirEntry_is_dir__doc__},
8398
8399 static int
8400 os_DirEntry_is_dir_impl(DirEntry *self, PyTypeObject *defining_class,
8401 int follow_symlinks);
8402
8403 static PyObject *
os_DirEntry_is_dir(DirEntry * self,PyTypeObject * defining_class,PyObject * const * args,Py_ssize_t nargs,PyObject * kwnames)8404 os_DirEntry_is_dir(DirEntry *self, PyTypeObject *defining_class, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames)
8405 {
8406 PyObject *return_value = NULL;
8407 static const char * const _keywords[] = {"follow_symlinks", NULL};
8408 static _PyArg_Parser _parser = {NULL, _keywords, "is_dir", 0};
8409 PyObject *argsbuf[1];
8410 Py_ssize_t noptargs = nargs + (kwnames ? PyTuple_GET_SIZE(kwnames) : 0) - 0;
8411 int follow_symlinks = 1;
8412 int _return_value;
8413
8414 args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 0, 0, 0, argsbuf);
8415 if (!args) {
8416 goto exit;
8417 }
8418 if (!noptargs) {
8419 goto skip_optional_kwonly;
8420 }
8421 follow_symlinks = PyObject_IsTrue(args[0]);
8422 if (follow_symlinks < 0) {
8423 goto exit;
8424 }
8425 skip_optional_kwonly:
8426 _return_value = os_DirEntry_is_dir_impl(self, defining_class, follow_symlinks);
8427 if ((_return_value == -1) && PyErr_Occurred()) {
8428 goto exit;
8429 }
8430 return_value = PyBool_FromLong((long)_return_value);
8431
8432 exit:
8433 return return_value;
8434 }
8435
8436 PyDoc_STRVAR(os_DirEntry_is_file__doc__,
8437 "is_file($self, /, *, follow_symlinks=True)\n"
8438 "--\n"
8439 "\n"
8440 "Return True if the entry is a file; cached per entry.");
8441
8442 #define OS_DIRENTRY_IS_FILE_METHODDEF \
8443 {"is_file", _PyCFunction_CAST(os_DirEntry_is_file), METH_METHOD|METH_FASTCALL|METH_KEYWORDS, os_DirEntry_is_file__doc__},
8444
8445 static int
8446 os_DirEntry_is_file_impl(DirEntry *self, PyTypeObject *defining_class,
8447 int follow_symlinks);
8448
8449 static PyObject *
os_DirEntry_is_file(DirEntry * self,PyTypeObject * defining_class,PyObject * const * args,Py_ssize_t nargs,PyObject * kwnames)8450 os_DirEntry_is_file(DirEntry *self, PyTypeObject *defining_class, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames)
8451 {
8452 PyObject *return_value = NULL;
8453 static const char * const _keywords[] = {"follow_symlinks", NULL};
8454 static _PyArg_Parser _parser = {NULL, _keywords, "is_file", 0};
8455 PyObject *argsbuf[1];
8456 Py_ssize_t noptargs = nargs + (kwnames ? PyTuple_GET_SIZE(kwnames) : 0) - 0;
8457 int follow_symlinks = 1;
8458 int _return_value;
8459
8460 args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 0, 0, 0, argsbuf);
8461 if (!args) {
8462 goto exit;
8463 }
8464 if (!noptargs) {
8465 goto skip_optional_kwonly;
8466 }
8467 follow_symlinks = PyObject_IsTrue(args[0]);
8468 if (follow_symlinks < 0) {
8469 goto exit;
8470 }
8471 skip_optional_kwonly:
8472 _return_value = os_DirEntry_is_file_impl(self, defining_class, follow_symlinks);
8473 if ((_return_value == -1) && PyErr_Occurred()) {
8474 goto exit;
8475 }
8476 return_value = PyBool_FromLong((long)_return_value);
8477
8478 exit:
8479 return return_value;
8480 }
8481
8482 PyDoc_STRVAR(os_DirEntry_inode__doc__,
8483 "inode($self, /)\n"
8484 "--\n"
8485 "\n"
8486 "Return inode of the entry; cached per entry.");
8487
8488 #define OS_DIRENTRY_INODE_METHODDEF \
8489 {"inode", (PyCFunction)os_DirEntry_inode, METH_NOARGS, os_DirEntry_inode__doc__},
8490
8491 static PyObject *
8492 os_DirEntry_inode_impl(DirEntry *self);
8493
8494 static PyObject *
os_DirEntry_inode(DirEntry * self,PyObject * Py_UNUSED (ignored))8495 os_DirEntry_inode(DirEntry *self, PyObject *Py_UNUSED(ignored))
8496 {
8497 return os_DirEntry_inode_impl(self);
8498 }
8499
8500 PyDoc_STRVAR(os_DirEntry___fspath____doc__,
8501 "__fspath__($self, /)\n"
8502 "--\n"
8503 "\n"
8504 "Returns the path for the entry.");
8505
8506 #define OS_DIRENTRY___FSPATH___METHODDEF \
8507 {"__fspath__", (PyCFunction)os_DirEntry___fspath__, METH_NOARGS, os_DirEntry___fspath____doc__},
8508
8509 static PyObject *
8510 os_DirEntry___fspath___impl(DirEntry *self);
8511
8512 static PyObject *
os_DirEntry___fspath__(DirEntry * self,PyObject * Py_UNUSED (ignored))8513 os_DirEntry___fspath__(DirEntry *self, PyObject *Py_UNUSED(ignored))
8514 {
8515 return os_DirEntry___fspath___impl(self);
8516 }
8517
8518 PyDoc_STRVAR(os_scandir__doc__,
8519 "scandir($module, /, path=None)\n"
8520 "--\n"
8521 "\n"
8522 "Return an iterator of DirEntry objects for given path.\n"
8523 "\n"
8524 "path can be specified as either str, bytes, or a path-like object. If path\n"
8525 "is bytes, the names of yielded DirEntry objects will also be bytes; in\n"
8526 "all other circumstances they will be str.\n"
8527 "\n"
8528 "If path is None, uses the path=\'.\'.");
8529
8530 #define OS_SCANDIR_METHODDEF \
8531 {"scandir", _PyCFunction_CAST(os_scandir), METH_FASTCALL|METH_KEYWORDS, os_scandir__doc__},
8532
8533 static PyObject *
8534 os_scandir_impl(PyObject *module, path_t *path);
8535
8536 static PyObject *
os_scandir(PyObject * module,PyObject * const * args,Py_ssize_t nargs,PyObject * kwnames)8537 os_scandir(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames)
8538 {
8539 PyObject *return_value = NULL;
8540 static const char * const _keywords[] = {"path", NULL};
8541 static _PyArg_Parser _parser = {NULL, _keywords, "scandir", 0};
8542 PyObject *argsbuf[1];
8543 Py_ssize_t noptargs = nargs + (kwnames ? PyTuple_GET_SIZE(kwnames) : 0) - 0;
8544 path_t path = PATH_T_INITIALIZE("scandir", "path", 1, PATH_HAVE_FDOPENDIR);
8545
8546 args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 0, 1, 0, argsbuf);
8547 if (!args) {
8548 goto exit;
8549 }
8550 if (!noptargs) {
8551 goto skip_optional_pos;
8552 }
8553 if (!path_converter(args[0], &path)) {
8554 goto exit;
8555 }
8556 skip_optional_pos:
8557 return_value = os_scandir_impl(module, &path);
8558
8559 exit:
8560 /* Cleanup for path */
8561 path_cleanup(&path);
8562
8563 return return_value;
8564 }
8565
8566 PyDoc_STRVAR(os_fspath__doc__,
8567 "fspath($module, /, path)\n"
8568 "--\n"
8569 "\n"
8570 "Return the file system path representation of the object.\n"
8571 "\n"
8572 "If the object is str or bytes, then allow it to pass through as-is. If the\n"
8573 "object defines __fspath__(), then return the result of that method. All other\n"
8574 "types raise a TypeError.");
8575
8576 #define OS_FSPATH_METHODDEF \
8577 {"fspath", _PyCFunction_CAST(os_fspath), METH_FASTCALL|METH_KEYWORDS, os_fspath__doc__},
8578
8579 static PyObject *
8580 os_fspath_impl(PyObject *module, PyObject *path);
8581
8582 static PyObject *
os_fspath(PyObject * module,PyObject * const * args,Py_ssize_t nargs,PyObject * kwnames)8583 os_fspath(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames)
8584 {
8585 PyObject *return_value = NULL;
8586 static const char * const _keywords[] = {"path", NULL};
8587 static _PyArg_Parser _parser = {NULL, _keywords, "fspath", 0};
8588 PyObject *argsbuf[1];
8589 PyObject *path;
8590
8591 args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 1, 1, 0, argsbuf);
8592 if (!args) {
8593 goto exit;
8594 }
8595 path = args[0];
8596 return_value = os_fspath_impl(module, path);
8597
8598 exit:
8599 return return_value;
8600 }
8601
8602 #if defined(HAVE_GETRANDOM_SYSCALL)
8603
8604 PyDoc_STRVAR(os_getrandom__doc__,
8605 "getrandom($module, /, size, flags=0)\n"
8606 "--\n"
8607 "\n"
8608 "Obtain a series of random bytes.");
8609
8610 #define OS_GETRANDOM_METHODDEF \
8611 {"getrandom", _PyCFunction_CAST(os_getrandom), METH_FASTCALL|METH_KEYWORDS, os_getrandom__doc__},
8612
8613 static PyObject *
8614 os_getrandom_impl(PyObject *module, Py_ssize_t size, int flags);
8615
8616 static PyObject *
os_getrandom(PyObject * module,PyObject * const * args,Py_ssize_t nargs,PyObject * kwnames)8617 os_getrandom(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames)
8618 {
8619 PyObject *return_value = NULL;
8620 static const char * const _keywords[] = {"size", "flags", NULL};
8621 static _PyArg_Parser _parser = {NULL, _keywords, "getrandom", 0};
8622 PyObject *argsbuf[2];
8623 Py_ssize_t noptargs = nargs + (kwnames ? PyTuple_GET_SIZE(kwnames) : 0) - 1;
8624 Py_ssize_t size;
8625 int flags = 0;
8626
8627 args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 1, 2, 0, argsbuf);
8628 if (!args) {
8629 goto exit;
8630 }
8631 {
8632 Py_ssize_t ival = -1;
8633 PyObject *iobj = _PyNumber_Index(args[0]);
8634 if (iobj != NULL) {
8635 ival = PyLong_AsSsize_t(iobj);
8636 Py_DECREF(iobj);
8637 }
8638 if (ival == -1 && PyErr_Occurred()) {
8639 goto exit;
8640 }
8641 size = ival;
8642 }
8643 if (!noptargs) {
8644 goto skip_optional_pos;
8645 }
8646 flags = _PyLong_AsInt(args[1]);
8647 if (flags == -1 && PyErr_Occurred()) {
8648 goto exit;
8649 }
8650 skip_optional_pos:
8651 return_value = os_getrandom_impl(module, size, flags);
8652
8653 exit:
8654 return return_value;
8655 }
8656
8657 #endif /* defined(HAVE_GETRANDOM_SYSCALL) */
8658
8659 #if defined(MS_WINDOWS)
8660
8661 PyDoc_STRVAR(os__add_dll_directory__doc__,
8662 "_add_dll_directory($module, /, path)\n"
8663 "--\n"
8664 "\n"
8665 "Add a path to the DLL search path.\n"
8666 "\n"
8667 "This search path is used when resolving dependencies for imported\n"
8668 "extension modules (the module itself is resolved through sys.path),\n"
8669 "and also by ctypes.\n"
8670 "\n"
8671 "Returns an opaque value that may be passed to os.remove_dll_directory\n"
8672 "to remove this directory from the search path.");
8673
8674 #define OS__ADD_DLL_DIRECTORY_METHODDEF \
8675 {"_add_dll_directory", _PyCFunction_CAST(os__add_dll_directory), METH_FASTCALL|METH_KEYWORDS, os__add_dll_directory__doc__},
8676
8677 static PyObject *
8678 os__add_dll_directory_impl(PyObject *module, path_t *path);
8679
8680 static PyObject *
os__add_dll_directory(PyObject * module,PyObject * const * args,Py_ssize_t nargs,PyObject * kwnames)8681 os__add_dll_directory(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames)
8682 {
8683 PyObject *return_value = NULL;
8684 static const char * const _keywords[] = {"path", NULL};
8685 static _PyArg_Parser _parser = {NULL, _keywords, "_add_dll_directory", 0};
8686 PyObject *argsbuf[1];
8687 path_t path = PATH_T_INITIALIZE("_add_dll_directory", "path", 0, 0);
8688
8689 args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 1, 1, 0, argsbuf);
8690 if (!args) {
8691 goto exit;
8692 }
8693 if (!path_converter(args[0], &path)) {
8694 goto exit;
8695 }
8696 return_value = os__add_dll_directory_impl(module, &path);
8697
8698 exit:
8699 /* Cleanup for path */
8700 path_cleanup(&path);
8701
8702 return return_value;
8703 }
8704
8705 #endif /* defined(MS_WINDOWS) */
8706
8707 #if defined(MS_WINDOWS)
8708
8709 PyDoc_STRVAR(os__remove_dll_directory__doc__,
8710 "_remove_dll_directory($module, /, cookie)\n"
8711 "--\n"
8712 "\n"
8713 "Removes a path from the DLL search path.\n"
8714 "\n"
8715 "The parameter is an opaque value that was returned from\n"
8716 "os.add_dll_directory. You can only remove directories that you added\n"
8717 "yourself.");
8718
8719 #define OS__REMOVE_DLL_DIRECTORY_METHODDEF \
8720 {"_remove_dll_directory", _PyCFunction_CAST(os__remove_dll_directory), METH_FASTCALL|METH_KEYWORDS, os__remove_dll_directory__doc__},
8721
8722 static PyObject *
8723 os__remove_dll_directory_impl(PyObject *module, PyObject *cookie);
8724
8725 static PyObject *
os__remove_dll_directory(PyObject * module,PyObject * const * args,Py_ssize_t nargs,PyObject * kwnames)8726 os__remove_dll_directory(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames)
8727 {
8728 PyObject *return_value = NULL;
8729 static const char * const _keywords[] = {"cookie", NULL};
8730 static _PyArg_Parser _parser = {NULL, _keywords, "_remove_dll_directory", 0};
8731 PyObject *argsbuf[1];
8732 PyObject *cookie;
8733
8734 args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 1, 1, 0, argsbuf);
8735 if (!args) {
8736 goto exit;
8737 }
8738 cookie = args[0];
8739 return_value = os__remove_dll_directory_impl(module, cookie);
8740
8741 exit:
8742 return return_value;
8743 }
8744
8745 #endif /* defined(MS_WINDOWS) */
8746
8747 #if (defined(WIFEXITED) || defined(MS_WINDOWS))
8748
8749 PyDoc_STRVAR(os_waitstatus_to_exitcode__doc__,
8750 "waitstatus_to_exitcode($module, /, status)\n"
8751 "--\n"
8752 "\n"
8753 "Convert a wait status to an exit code.\n"
8754 "\n"
8755 "On Unix:\n"
8756 "\n"
8757 "* If WIFEXITED(status) is true, return WEXITSTATUS(status).\n"
8758 "* If WIFSIGNALED(status) is true, return -WTERMSIG(status).\n"
8759 "* Otherwise, raise a ValueError.\n"
8760 "\n"
8761 "On Windows, return status shifted right by 8 bits.\n"
8762 "\n"
8763 "On Unix, if the process is being traced or if waitpid() was called with\n"
8764 "WUNTRACED option, the caller must first check if WIFSTOPPED(status) is true.\n"
8765 "This function must not be called if WIFSTOPPED(status) is true.");
8766
8767 #define OS_WAITSTATUS_TO_EXITCODE_METHODDEF \
8768 {"waitstatus_to_exitcode", _PyCFunction_CAST(os_waitstatus_to_exitcode), METH_FASTCALL|METH_KEYWORDS, os_waitstatus_to_exitcode__doc__},
8769
8770 static PyObject *
8771 os_waitstatus_to_exitcode_impl(PyObject *module, PyObject *status_obj);
8772
8773 static PyObject *
os_waitstatus_to_exitcode(PyObject * module,PyObject * const * args,Py_ssize_t nargs,PyObject * kwnames)8774 os_waitstatus_to_exitcode(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames)
8775 {
8776 PyObject *return_value = NULL;
8777 static const char * const _keywords[] = {"status", NULL};
8778 static _PyArg_Parser _parser = {NULL, _keywords, "waitstatus_to_exitcode", 0};
8779 PyObject *argsbuf[1];
8780 PyObject *status_obj;
8781
8782 args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 1, 1, 0, argsbuf);
8783 if (!args) {
8784 goto exit;
8785 }
8786 status_obj = args[0];
8787 return_value = os_waitstatus_to_exitcode_impl(module, status_obj);
8788
8789 exit:
8790 return return_value;
8791 }
8792
8793 #endif /* (defined(WIFEXITED) || defined(MS_WINDOWS)) */
8794
8795 #ifndef OS_TTYNAME_METHODDEF
8796 #define OS_TTYNAME_METHODDEF
8797 #endif /* !defined(OS_TTYNAME_METHODDEF) */
8798
8799 #ifndef OS_CTERMID_METHODDEF
8800 #define OS_CTERMID_METHODDEF
8801 #endif /* !defined(OS_CTERMID_METHODDEF) */
8802
8803 #ifndef OS_FCHDIR_METHODDEF
8804 #define OS_FCHDIR_METHODDEF
8805 #endif /* !defined(OS_FCHDIR_METHODDEF) */
8806
8807 #ifndef OS_FCHMOD_METHODDEF
8808 #define OS_FCHMOD_METHODDEF
8809 #endif /* !defined(OS_FCHMOD_METHODDEF) */
8810
8811 #ifndef OS_LCHMOD_METHODDEF
8812 #define OS_LCHMOD_METHODDEF
8813 #endif /* !defined(OS_LCHMOD_METHODDEF) */
8814
8815 #ifndef OS_CHFLAGS_METHODDEF
8816 #define OS_CHFLAGS_METHODDEF
8817 #endif /* !defined(OS_CHFLAGS_METHODDEF) */
8818
8819 #ifndef OS_LCHFLAGS_METHODDEF
8820 #define OS_LCHFLAGS_METHODDEF
8821 #endif /* !defined(OS_LCHFLAGS_METHODDEF) */
8822
8823 #ifndef OS_CHROOT_METHODDEF
8824 #define OS_CHROOT_METHODDEF
8825 #endif /* !defined(OS_CHROOT_METHODDEF) */
8826
8827 #ifndef OS_FSYNC_METHODDEF
8828 #define OS_FSYNC_METHODDEF
8829 #endif /* !defined(OS_FSYNC_METHODDEF) */
8830
8831 #ifndef OS_SYNC_METHODDEF
8832 #define OS_SYNC_METHODDEF
8833 #endif /* !defined(OS_SYNC_METHODDEF) */
8834
8835 #ifndef OS_FDATASYNC_METHODDEF
8836 #define OS_FDATASYNC_METHODDEF
8837 #endif /* !defined(OS_FDATASYNC_METHODDEF) */
8838
8839 #ifndef OS_CHOWN_METHODDEF
8840 #define OS_CHOWN_METHODDEF
8841 #endif /* !defined(OS_CHOWN_METHODDEF) */
8842
8843 #ifndef OS_FCHOWN_METHODDEF
8844 #define OS_FCHOWN_METHODDEF
8845 #endif /* !defined(OS_FCHOWN_METHODDEF) */
8846
8847 #ifndef OS_LCHOWN_METHODDEF
8848 #define OS_LCHOWN_METHODDEF
8849 #endif /* !defined(OS_LCHOWN_METHODDEF) */
8850
8851 #ifndef OS_LINK_METHODDEF
8852 #define OS_LINK_METHODDEF
8853 #endif /* !defined(OS_LINK_METHODDEF) */
8854
8855 #ifndef OS__GETFULLPATHNAME_METHODDEF
8856 #define OS__GETFULLPATHNAME_METHODDEF
8857 #endif /* !defined(OS__GETFULLPATHNAME_METHODDEF) */
8858
8859 #ifndef OS__GETFINALPATHNAME_METHODDEF
8860 #define OS__GETFINALPATHNAME_METHODDEF
8861 #endif /* !defined(OS__GETFINALPATHNAME_METHODDEF) */
8862
8863 #ifndef OS__GETVOLUMEPATHNAME_METHODDEF
8864 #define OS__GETVOLUMEPATHNAME_METHODDEF
8865 #endif /* !defined(OS__GETVOLUMEPATHNAME_METHODDEF) */
8866
8867 #ifndef OS__PATH_SPLITROOT_METHODDEF
8868 #define OS__PATH_SPLITROOT_METHODDEF
8869 #endif /* !defined(OS__PATH_SPLITROOT_METHODDEF) */
8870
8871 #ifndef OS_NICE_METHODDEF
8872 #define OS_NICE_METHODDEF
8873 #endif /* !defined(OS_NICE_METHODDEF) */
8874
8875 #ifndef OS_GETPRIORITY_METHODDEF
8876 #define OS_GETPRIORITY_METHODDEF
8877 #endif /* !defined(OS_GETPRIORITY_METHODDEF) */
8878
8879 #ifndef OS_SETPRIORITY_METHODDEF
8880 #define OS_SETPRIORITY_METHODDEF
8881 #endif /* !defined(OS_SETPRIORITY_METHODDEF) */
8882
8883 #ifndef OS_SYSTEM_METHODDEF
8884 #define OS_SYSTEM_METHODDEF
8885 #endif /* !defined(OS_SYSTEM_METHODDEF) */
8886
8887 #ifndef OS_UMASK_METHODDEF
8888 #define OS_UMASK_METHODDEF
8889 #endif /* !defined(OS_UMASK_METHODDEF) */
8890
8891 #ifndef OS_UNAME_METHODDEF
8892 #define OS_UNAME_METHODDEF
8893 #endif /* !defined(OS_UNAME_METHODDEF) */
8894
8895 #ifndef OS_EXECV_METHODDEF
8896 #define OS_EXECV_METHODDEF
8897 #endif /* !defined(OS_EXECV_METHODDEF) */
8898
8899 #ifndef OS_EXECVE_METHODDEF
8900 #define OS_EXECVE_METHODDEF
8901 #endif /* !defined(OS_EXECVE_METHODDEF) */
8902
8903 #ifndef OS_POSIX_SPAWN_METHODDEF
8904 #define OS_POSIX_SPAWN_METHODDEF
8905 #endif /* !defined(OS_POSIX_SPAWN_METHODDEF) */
8906
8907 #ifndef OS_POSIX_SPAWNP_METHODDEF
8908 #define OS_POSIX_SPAWNP_METHODDEF
8909 #endif /* !defined(OS_POSIX_SPAWNP_METHODDEF) */
8910
8911 #ifndef OS_SPAWNV_METHODDEF
8912 #define OS_SPAWNV_METHODDEF
8913 #endif /* !defined(OS_SPAWNV_METHODDEF) */
8914
8915 #ifndef OS_SPAWNVE_METHODDEF
8916 #define OS_SPAWNVE_METHODDEF
8917 #endif /* !defined(OS_SPAWNVE_METHODDEF) */
8918
8919 #ifndef OS_REGISTER_AT_FORK_METHODDEF
8920 #define OS_REGISTER_AT_FORK_METHODDEF
8921 #endif /* !defined(OS_REGISTER_AT_FORK_METHODDEF) */
8922
8923 #ifndef OS_FORK1_METHODDEF
8924 #define OS_FORK1_METHODDEF
8925 #endif /* !defined(OS_FORK1_METHODDEF) */
8926
8927 #ifndef OS_FORK_METHODDEF
8928 #define OS_FORK_METHODDEF
8929 #endif /* !defined(OS_FORK_METHODDEF) */
8930
8931 #ifndef OS_SCHED_GET_PRIORITY_MAX_METHODDEF
8932 #define OS_SCHED_GET_PRIORITY_MAX_METHODDEF
8933 #endif /* !defined(OS_SCHED_GET_PRIORITY_MAX_METHODDEF) */
8934
8935 #ifndef OS_SCHED_GET_PRIORITY_MIN_METHODDEF
8936 #define OS_SCHED_GET_PRIORITY_MIN_METHODDEF
8937 #endif /* !defined(OS_SCHED_GET_PRIORITY_MIN_METHODDEF) */
8938
8939 #ifndef OS_SCHED_GETSCHEDULER_METHODDEF
8940 #define OS_SCHED_GETSCHEDULER_METHODDEF
8941 #endif /* !defined(OS_SCHED_GETSCHEDULER_METHODDEF) */
8942
8943 #ifndef OS_SCHED_SETSCHEDULER_METHODDEF
8944 #define OS_SCHED_SETSCHEDULER_METHODDEF
8945 #endif /* !defined(OS_SCHED_SETSCHEDULER_METHODDEF) */
8946
8947 #ifndef OS_SCHED_GETPARAM_METHODDEF
8948 #define OS_SCHED_GETPARAM_METHODDEF
8949 #endif /* !defined(OS_SCHED_GETPARAM_METHODDEF) */
8950
8951 #ifndef OS_SCHED_SETPARAM_METHODDEF
8952 #define OS_SCHED_SETPARAM_METHODDEF
8953 #endif /* !defined(OS_SCHED_SETPARAM_METHODDEF) */
8954
8955 #ifndef OS_SCHED_RR_GET_INTERVAL_METHODDEF
8956 #define OS_SCHED_RR_GET_INTERVAL_METHODDEF
8957 #endif /* !defined(OS_SCHED_RR_GET_INTERVAL_METHODDEF) */
8958
8959 #ifndef OS_SCHED_YIELD_METHODDEF
8960 #define OS_SCHED_YIELD_METHODDEF
8961 #endif /* !defined(OS_SCHED_YIELD_METHODDEF) */
8962
8963 #ifndef OS_SCHED_SETAFFINITY_METHODDEF
8964 #define OS_SCHED_SETAFFINITY_METHODDEF
8965 #endif /* !defined(OS_SCHED_SETAFFINITY_METHODDEF) */
8966
8967 #ifndef OS_SCHED_GETAFFINITY_METHODDEF
8968 #define OS_SCHED_GETAFFINITY_METHODDEF
8969 #endif /* !defined(OS_SCHED_GETAFFINITY_METHODDEF) */
8970
8971 #ifndef OS_OPENPTY_METHODDEF
8972 #define OS_OPENPTY_METHODDEF
8973 #endif /* !defined(OS_OPENPTY_METHODDEF) */
8974
8975 #ifndef OS_LOGIN_TTY_METHODDEF
8976 #define OS_LOGIN_TTY_METHODDEF
8977 #endif /* !defined(OS_LOGIN_TTY_METHODDEF) */
8978
8979 #ifndef OS_FORKPTY_METHODDEF
8980 #define OS_FORKPTY_METHODDEF
8981 #endif /* !defined(OS_FORKPTY_METHODDEF) */
8982
8983 #ifndef OS_GETEGID_METHODDEF
8984 #define OS_GETEGID_METHODDEF
8985 #endif /* !defined(OS_GETEGID_METHODDEF) */
8986
8987 #ifndef OS_GETEUID_METHODDEF
8988 #define OS_GETEUID_METHODDEF
8989 #endif /* !defined(OS_GETEUID_METHODDEF) */
8990
8991 #ifndef OS_GETGID_METHODDEF
8992 #define OS_GETGID_METHODDEF
8993 #endif /* !defined(OS_GETGID_METHODDEF) */
8994
8995 #ifndef OS_GETPID_METHODDEF
8996 #define OS_GETPID_METHODDEF
8997 #endif /* !defined(OS_GETPID_METHODDEF) */
8998
8999 #ifndef OS_GETGROUPLIST_METHODDEF
9000 #define OS_GETGROUPLIST_METHODDEF
9001 #endif /* !defined(OS_GETGROUPLIST_METHODDEF) */
9002
9003 #ifndef OS_GETGROUPS_METHODDEF
9004 #define OS_GETGROUPS_METHODDEF
9005 #endif /* !defined(OS_GETGROUPS_METHODDEF) */
9006
9007 #ifndef OS_INITGROUPS_METHODDEF
9008 #define OS_INITGROUPS_METHODDEF
9009 #endif /* !defined(OS_INITGROUPS_METHODDEF) */
9010
9011 #ifndef OS_GETPGID_METHODDEF
9012 #define OS_GETPGID_METHODDEF
9013 #endif /* !defined(OS_GETPGID_METHODDEF) */
9014
9015 #ifndef OS_GETPGRP_METHODDEF
9016 #define OS_GETPGRP_METHODDEF
9017 #endif /* !defined(OS_GETPGRP_METHODDEF) */
9018
9019 #ifndef OS_SETPGRP_METHODDEF
9020 #define OS_SETPGRP_METHODDEF
9021 #endif /* !defined(OS_SETPGRP_METHODDEF) */
9022
9023 #ifndef OS_GETPPID_METHODDEF
9024 #define OS_GETPPID_METHODDEF
9025 #endif /* !defined(OS_GETPPID_METHODDEF) */
9026
9027 #ifndef OS_GETLOGIN_METHODDEF
9028 #define OS_GETLOGIN_METHODDEF
9029 #endif /* !defined(OS_GETLOGIN_METHODDEF) */
9030
9031 #ifndef OS_GETUID_METHODDEF
9032 #define OS_GETUID_METHODDEF
9033 #endif /* !defined(OS_GETUID_METHODDEF) */
9034
9035 #ifndef OS_KILL_METHODDEF
9036 #define OS_KILL_METHODDEF
9037 #endif /* !defined(OS_KILL_METHODDEF) */
9038
9039 #ifndef OS_KILLPG_METHODDEF
9040 #define OS_KILLPG_METHODDEF
9041 #endif /* !defined(OS_KILLPG_METHODDEF) */
9042
9043 #ifndef OS_PLOCK_METHODDEF
9044 #define OS_PLOCK_METHODDEF
9045 #endif /* !defined(OS_PLOCK_METHODDEF) */
9046
9047 #ifndef OS_SETUID_METHODDEF
9048 #define OS_SETUID_METHODDEF
9049 #endif /* !defined(OS_SETUID_METHODDEF) */
9050
9051 #ifndef OS_SETEUID_METHODDEF
9052 #define OS_SETEUID_METHODDEF
9053 #endif /* !defined(OS_SETEUID_METHODDEF) */
9054
9055 #ifndef OS_SETEGID_METHODDEF
9056 #define OS_SETEGID_METHODDEF
9057 #endif /* !defined(OS_SETEGID_METHODDEF) */
9058
9059 #ifndef OS_SETREUID_METHODDEF
9060 #define OS_SETREUID_METHODDEF
9061 #endif /* !defined(OS_SETREUID_METHODDEF) */
9062
9063 #ifndef OS_SETREGID_METHODDEF
9064 #define OS_SETREGID_METHODDEF
9065 #endif /* !defined(OS_SETREGID_METHODDEF) */
9066
9067 #ifndef OS_SETGID_METHODDEF
9068 #define OS_SETGID_METHODDEF
9069 #endif /* !defined(OS_SETGID_METHODDEF) */
9070
9071 #ifndef OS_SETGROUPS_METHODDEF
9072 #define OS_SETGROUPS_METHODDEF
9073 #endif /* !defined(OS_SETGROUPS_METHODDEF) */
9074
9075 #ifndef OS_WAIT3_METHODDEF
9076 #define OS_WAIT3_METHODDEF
9077 #endif /* !defined(OS_WAIT3_METHODDEF) */
9078
9079 #ifndef OS_WAIT4_METHODDEF
9080 #define OS_WAIT4_METHODDEF
9081 #endif /* !defined(OS_WAIT4_METHODDEF) */
9082
9083 #ifndef OS_WAITID_METHODDEF
9084 #define OS_WAITID_METHODDEF
9085 #endif /* !defined(OS_WAITID_METHODDEF) */
9086
9087 #ifndef OS_WAITPID_METHODDEF
9088 #define OS_WAITPID_METHODDEF
9089 #endif /* !defined(OS_WAITPID_METHODDEF) */
9090
9091 #ifndef OS_WAIT_METHODDEF
9092 #define OS_WAIT_METHODDEF
9093 #endif /* !defined(OS_WAIT_METHODDEF) */
9094
9095 #ifndef OS_PIDFD_OPEN_METHODDEF
9096 #define OS_PIDFD_OPEN_METHODDEF
9097 #endif /* !defined(OS_PIDFD_OPEN_METHODDEF) */
9098
9099 #ifndef OS_READLINK_METHODDEF
9100 #define OS_READLINK_METHODDEF
9101 #endif /* !defined(OS_READLINK_METHODDEF) */
9102
9103 #ifndef OS_SYMLINK_METHODDEF
9104 #define OS_SYMLINK_METHODDEF
9105 #endif /* !defined(OS_SYMLINK_METHODDEF) */
9106
9107 #ifndef OS_TIMES_METHODDEF
9108 #define OS_TIMES_METHODDEF
9109 #endif /* !defined(OS_TIMES_METHODDEF) */
9110
9111 #ifndef OS_GETSID_METHODDEF
9112 #define OS_GETSID_METHODDEF
9113 #endif /* !defined(OS_GETSID_METHODDEF) */
9114
9115 #ifndef OS_SETSID_METHODDEF
9116 #define OS_SETSID_METHODDEF
9117 #endif /* !defined(OS_SETSID_METHODDEF) */
9118
9119 #ifndef OS_SETPGID_METHODDEF
9120 #define OS_SETPGID_METHODDEF
9121 #endif /* !defined(OS_SETPGID_METHODDEF) */
9122
9123 #ifndef OS_TCGETPGRP_METHODDEF
9124 #define OS_TCGETPGRP_METHODDEF
9125 #endif /* !defined(OS_TCGETPGRP_METHODDEF) */
9126
9127 #ifndef OS_TCSETPGRP_METHODDEF
9128 #define OS_TCSETPGRP_METHODDEF
9129 #endif /* !defined(OS_TCSETPGRP_METHODDEF) */
9130
9131 #ifndef OS_DUP2_METHODDEF
9132 #define OS_DUP2_METHODDEF
9133 #endif /* !defined(OS_DUP2_METHODDEF) */
9134
9135 #ifndef OS_LOCKF_METHODDEF
9136 #define OS_LOCKF_METHODDEF
9137 #endif /* !defined(OS_LOCKF_METHODDEF) */
9138
9139 #ifndef OS_READV_METHODDEF
9140 #define OS_READV_METHODDEF
9141 #endif /* !defined(OS_READV_METHODDEF) */
9142
9143 #ifndef OS_PREAD_METHODDEF
9144 #define OS_PREAD_METHODDEF
9145 #endif /* !defined(OS_PREAD_METHODDEF) */
9146
9147 #ifndef OS_PREADV_METHODDEF
9148 #define OS_PREADV_METHODDEF
9149 #endif /* !defined(OS_PREADV_METHODDEF) */
9150
9151 #ifndef OS_SENDFILE_METHODDEF
9152 #define OS_SENDFILE_METHODDEF
9153 #endif /* !defined(OS_SENDFILE_METHODDEF) */
9154
9155 #ifndef OS__FCOPYFILE_METHODDEF
9156 #define OS__FCOPYFILE_METHODDEF
9157 #endif /* !defined(OS__FCOPYFILE_METHODDEF) */
9158
9159 #ifndef OS_PIPE_METHODDEF
9160 #define OS_PIPE_METHODDEF
9161 #endif /* !defined(OS_PIPE_METHODDEF) */
9162
9163 #ifndef OS_PIPE2_METHODDEF
9164 #define OS_PIPE2_METHODDEF
9165 #endif /* !defined(OS_PIPE2_METHODDEF) */
9166
9167 #ifndef OS_WRITEV_METHODDEF
9168 #define OS_WRITEV_METHODDEF
9169 #endif /* !defined(OS_WRITEV_METHODDEF) */
9170
9171 #ifndef OS_PWRITE_METHODDEF
9172 #define OS_PWRITE_METHODDEF
9173 #endif /* !defined(OS_PWRITE_METHODDEF) */
9174
9175 #ifndef OS_PWRITEV_METHODDEF
9176 #define OS_PWRITEV_METHODDEF
9177 #endif /* !defined(OS_PWRITEV_METHODDEF) */
9178
9179 #ifndef OS_COPY_FILE_RANGE_METHODDEF
9180 #define OS_COPY_FILE_RANGE_METHODDEF
9181 #endif /* !defined(OS_COPY_FILE_RANGE_METHODDEF) */
9182
9183 #ifndef OS_SPLICE_METHODDEF
9184 #define OS_SPLICE_METHODDEF
9185 #endif /* !defined(OS_SPLICE_METHODDEF) */
9186
9187 #ifndef OS_MKFIFO_METHODDEF
9188 #define OS_MKFIFO_METHODDEF
9189 #endif /* !defined(OS_MKFIFO_METHODDEF) */
9190
9191 #ifndef OS_MKNOD_METHODDEF
9192 #define OS_MKNOD_METHODDEF
9193 #endif /* !defined(OS_MKNOD_METHODDEF) */
9194
9195 #ifndef OS_MAJOR_METHODDEF
9196 #define OS_MAJOR_METHODDEF
9197 #endif /* !defined(OS_MAJOR_METHODDEF) */
9198
9199 #ifndef OS_MINOR_METHODDEF
9200 #define OS_MINOR_METHODDEF
9201 #endif /* !defined(OS_MINOR_METHODDEF) */
9202
9203 #ifndef OS_MAKEDEV_METHODDEF
9204 #define OS_MAKEDEV_METHODDEF
9205 #endif /* !defined(OS_MAKEDEV_METHODDEF) */
9206
9207 #ifndef OS_FTRUNCATE_METHODDEF
9208 #define OS_FTRUNCATE_METHODDEF
9209 #endif /* !defined(OS_FTRUNCATE_METHODDEF) */
9210
9211 #ifndef OS_TRUNCATE_METHODDEF
9212 #define OS_TRUNCATE_METHODDEF
9213 #endif /* !defined(OS_TRUNCATE_METHODDEF) */
9214
9215 #ifndef OS_POSIX_FALLOCATE_METHODDEF
9216 #define OS_POSIX_FALLOCATE_METHODDEF
9217 #endif /* !defined(OS_POSIX_FALLOCATE_METHODDEF) */
9218
9219 #ifndef OS_POSIX_FADVISE_METHODDEF
9220 #define OS_POSIX_FADVISE_METHODDEF
9221 #endif /* !defined(OS_POSIX_FADVISE_METHODDEF) */
9222
9223 #ifndef OS_PUTENV_METHODDEF
9224 #define OS_PUTENV_METHODDEF
9225 #endif /* !defined(OS_PUTENV_METHODDEF) */
9226
9227 #ifndef OS_UNSETENV_METHODDEF
9228 #define OS_UNSETENV_METHODDEF
9229 #endif /* !defined(OS_UNSETENV_METHODDEF) */
9230
9231 #ifndef OS_WCOREDUMP_METHODDEF
9232 #define OS_WCOREDUMP_METHODDEF
9233 #endif /* !defined(OS_WCOREDUMP_METHODDEF) */
9234
9235 #ifndef OS_WIFCONTINUED_METHODDEF
9236 #define OS_WIFCONTINUED_METHODDEF
9237 #endif /* !defined(OS_WIFCONTINUED_METHODDEF) */
9238
9239 #ifndef OS_WIFSTOPPED_METHODDEF
9240 #define OS_WIFSTOPPED_METHODDEF
9241 #endif /* !defined(OS_WIFSTOPPED_METHODDEF) */
9242
9243 #ifndef OS_WIFSIGNALED_METHODDEF
9244 #define OS_WIFSIGNALED_METHODDEF
9245 #endif /* !defined(OS_WIFSIGNALED_METHODDEF) */
9246
9247 #ifndef OS_WIFEXITED_METHODDEF
9248 #define OS_WIFEXITED_METHODDEF
9249 #endif /* !defined(OS_WIFEXITED_METHODDEF) */
9250
9251 #ifndef OS_WEXITSTATUS_METHODDEF
9252 #define OS_WEXITSTATUS_METHODDEF
9253 #endif /* !defined(OS_WEXITSTATUS_METHODDEF) */
9254
9255 #ifndef OS_WTERMSIG_METHODDEF
9256 #define OS_WTERMSIG_METHODDEF
9257 #endif /* !defined(OS_WTERMSIG_METHODDEF) */
9258
9259 #ifndef OS_WSTOPSIG_METHODDEF
9260 #define OS_WSTOPSIG_METHODDEF
9261 #endif /* !defined(OS_WSTOPSIG_METHODDEF) */
9262
9263 #ifndef OS_FSTATVFS_METHODDEF
9264 #define OS_FSTATVFS_METHODDEF
9265 #endif /* !defined(OS_FSTATVFS_METHODDEF) */
9266
9267 #ifndef OS_STATVFS_METHODDEF
9268 #define OS_STATVFS_METHODDEF
9269 #endif /* !defined(OS_STATVFS_METHODDEF) */
9270
9271 #ifndef OS__GETDISKUSAGE_METHODDEF
9272 #define OS__GETDISKUSAGE_METHODDEF
9273 #endif /* !defined(OS__GETDISKUSAGE_METHODDEF) */
9274
9275 #ifndef OS_FPATHCONF_METHODDEF
9276 #define OS_FPATHCONF_METHODDEF
9277 #endif /* !defined(OS_FPATHCONF_METHODDEF) */
9278
9279 #ifndef OS_PATHCONF_METHODDEF
9280 #define OS_PATHCONF_METHODDEF
9281 #endif /* !defined(OS_PATHCONF_METHODDEF) */
9282
9283 #ifndef OS_CONFSTR_METHODDEF
9284 #define OS_CONFSTR_METHODDEF
9285 #endif /* !defined(OS_CONFSTR_METHODDEF) */
9286
9287 #ifndef OS_SYSCONF_METHODDEF
9288 #define OS_SYSCONF_METHODDEF
9289 #endif /* !defined(OS_SYSCONF_METHODDEF) */
9290
9291 #ifndef OS_STARTFILE_METHODDEF
9292 #define OS_STARTFILE_METHODDEF
9293 #endif /* !defined(OS_STARTFILE_METHODDEF) */
9294
9295 #ifndef OS_GETLOADAVG_METHODDEF
9296 #define OS_GETLOADAVG_METHODDEF
9297 #endif /* !defined(OS_GETLOADAVG_METHODDEF) */
9298
9299 #ifndef OS_SETRESUID_METHODDEF
9300 #define OS_SETRESUID_METHODDEF
9301 #endif /* !defined(OS_SETRESUID_METHODDEF) */
9302
9303 #ifndef OS_SETRESGID_METHODDEF
9304 #define OS_SETRESGID_METHODDEF
9305 #endif /* !defined(OS_SETRESGID_METHODDEF) */
9306
9307 #ifndef OS_GETRESUID_METHODDEF
9308 #define OS_GETRESUID_METHODDEF
9309 #endif /* !defined(OS_GETRESUID_METHODDEF) */
9310
9311 #ifndef OS_GETRESGID_METHODDEF
9312 #define OS_GETRESGID_METHODDEF
9313 #endif /* !defined(OS_GETRESGID_METHODDEF) */
9314
9315 #ifndef OS_GETXATTR_METHODDEF
9316 #define OS_GETXATTR_METHODDEF
9317 #endif /* !defined(OS_GETXATTR_METHODDEF) */
9318
9319 #ifndef OS_SETXATTR_METHODDEF
9320 #define OS_SETXATTR_METHODDEF
9321 #endif /* !defined(OS_SETXATTR_METHODDEF) */
9322
9323 #ifndef OS_REMOVEXATTR_METHODDEF
9324 #define OS_REMOVEXATTR_METHODDEF
9325 #endif /* !defined(OS_REMOVEXATTR_METHODDEF) */
9326
9327 #ifndef OS_LISTXATTR_METHODDEF
9328 #define OS_LISTXATTR_METHODDEF
9329 #endif /* !defined(OS_LISTXATTR_METHODDEF) */
9330
9331 #ifndef OS_MEMFD_CREATE_METHODDEF
9332 #define OS_MEMFD_CREATE_METHODDEF
9333 #endif /* !defined(OS_MEMFD_CREATE_METHODDEF) */
9334
9335 #ifndef OS_EVENTFD_METHODDEF
9336 #define OS_EVENTFD_METHODDEF
9337 #endif /* !defined(OS_EVENTFD_METHODDEF) */
9338
9339 #ifndef OS_EVENTFD_READ_METHODDEF
9340 #define OS_EVENTFD_READ_METHODDEF
9341 #endif /* !defined(OS_EVENTFD_READ_METHODDEF) */
9342
9343 #ifndef OS_EVENTFD_WRITE_METHODDEF
9344 #define OS_EVENTFD_WRITE_METHODDEF
9345 #endif /* !defined(OS_EVENTFD_WRITE_METHODDEF) */
9346
9347 #ifndef OS_GET_TERMINAL_SIZE_METHODDEF
9348 #define OS_GET_TERMINAL_SIZE_METHODDEF
9349 #endif /* !defined(OS_GET_TERMINAL_SIZE_METHODDEF) */
9350
9351 #ifndef OS_GET_HANDLE_INHERITABLE_METHODDEF
9352 #define OS_GET_HANDLE_INHERITABLE_METHODDEF
9353 #endif /* !defined(OS_GET_HANDLE_INHERITABLE_METHODDEF) */
9354
9355 #ifndef OS_SET_HANDLE_INHERITABLE_METHODDEF
9356 #define OS_SET_HANDLE_INHERITABLE_METHODDEF
9357 #endif /* !defined(OS_SET_HANDLE_INHERITABLE_METHODDEF) */
9358
9359 #ifndef OS_GET_BLOCKING_METHODDEF
9360 #define OS_GET_BLOCKING_METHODDEF
9361 #endif /* !defined(OS_GET_BLOCKING_METHODDEF) */
9362
9363 #ifndef OS_SET_BLOCKING_METHODDEF
9364 #define OS_SET_BLOCKING_METHODDEF
9365 #endif /* !defined(OS_SET_BLOCKING_METHODDEF) */
9366
9367 #ifndef OS_GETRANDOM_METHODDEF
9368 #define OS_GETRANDOM_METHODDEF
9369 #endif /* !defined(OS_GETRANDOM_METHODDEF) */
9370
9371 #ifndef OS__ADD_DLL_DIRECTORY_METHODDEF
9372 #define OS__ADD_DLL_DIRECTORY_METHODDEF
9373 #endif /* !defined(OS__ADD_DLL_DIRECTORY_METHODDEF) */
9374
9375 #ifndef OS__REMOVE_DLL_DIRECTORY_METHODDEF
9376 #define OS__REMOVE_DLL_DIRECTORY_METHODDEF
9377 #endif /* !defined(OS__REMOVE_DLL_DIRECTORY_METHODDEF) */
9378
9379 #ifndef OS_WAITSTATUS_TO_EXITCODE_METHODDEF
9380 #define OS_WAITSTATUS_TO_EXITCODE_METHODDEF
9381 #endif /* !defined(OS_WAITSTATUS_TO_EXITCODE_METHODDEF) */
9382 /*[clinic end generated code: output=8dd784bf1e41b881 input=a9049054013a1b77]*/
9383