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, ¶m)) {
2901 goto exit;
2902 }
2903 return_value = os_sched_setscheduler_impl(module, pid, policy, ¶m);
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, ¶m)) {
2972 goto exit;
2973 }
2974 return_value = os_sched_setparam_impl(module, pid, ¶m);
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