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