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