blob: b21d17477ee64263b47646b7b2ee7ff208af86d9 [file] [log] [blame]
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03001/*[clinic input]
2preserve
3[clinic start generated code]*/
4
5PyDoc_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"
BNMetricsb9427072018-11-02 15:20:19 +000012" Path to be examined; can be string, bytes, a path-like object or\n"
Xiang Zhang4459e002017-01-22 13:04:17 +080013" open-file-descriptor int.\n"
Serhiy Storchaka1009bf12015-04-03 23:53:51 +030014" 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 \
Serhiy Storchaka4a934d42018-11-27 11:27:36 +020031 {"stat", (PyCFunction)(void(*)(void))os_stat, METH_FASTCALL|METH_KEYWORDS, os_stat__doc__},
Serhiy Storchaka1009bf12015-04-03 23:53:51 +030032
33static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +030034os_stat_impl(PyObject *module, path_t *path, int dir_fd, int follow_symlinks);
Serhiy Storchaka1009bf12015-04-03 23:53:51 +030035
36static PyObject *
Serhiy Storchakaa5552f02017-12-15 13:11:11 +020037os_stat(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames)
Serhiy Storchaka1009bf12015-04-03 23:53:51 +030038{
39 PyObject *return_value = NULL;
Serhiy Storchaka9171a8b2016-08-14 10:52:18 +030040 static const char * const _keywords[] = {"path", "dir_fd", "follow_symlinks", NULL};
Serhiy Storchaka31913912019-03-14 10:32:22 +020041 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;
Serhiy Storchaka1009bf12015-04-03 23:53:51 +030044 path_t path = PATH_T_INITIALIZE("stat", "path", 0, 1);
45 int dir_fd = DEFAULT_DIR_FD;
46 int follow_symlinks = 1;
47
Serhiy Storchaka31913912019-03-14 10:32:22 +020048 args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 1, 1, 0, argsbuf);
49 if (!args) {
Serhiy Storchaka1009bf12015-04-03 23:53:51 +030050 goto exit;
Serhiy Storchaka5dee6552016-06-09 16:16:06 +030051 }
Serhiy Storchaka31913912019-03-14 10:32:22 +020052 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 }
70skip_optional_kwonly:
Serhiy Storchaka1009bf12015-04-03 23:53:51 +030071 return_value = os_stat_impl(module, &path, dir_fd, follow_symlinks);
72
73exit:
74 /* Cleanup for path */
75 path_cleanup(&path);
76
77 return return_value;
78}
79
80PyDoc_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 \
Serhiy Storchaka4a934d42018-11-27 11:27:36 +020090 {"lstat", (PyCFunction)(void(*)(void))os_lstat, METH_FASTCALL|METH_KEYWORDS, os_lstat__doc__},
Serhiy Storchaka1009bf12015-04-03 23:53:51 +030091
92static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +030093os_lstat_impl(PyObject *module, path_t *path, int dir_fd);
Serhiy Storchaka1009bf12015-04-03 23:53:51 +030094
95static PyObject *
Serhiy Storchakaa5552f02017-12-15 13:11:11 +020096os_lstat(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames)
Serhiy Storchaka1009bf12015-04-03 23:53:51 +030097{
98 PyObject *return_value = NULL;
Serhiy Storchaka9171a8b2016-08-14 10:52:18 +030099 static const char * const _keywords[] = {"path", "dir_fd", NULL};
Serhiy Storchaka31913912019-03-14 10:32:22 +0200100 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;
Serhiy Storchaka1009bf12015-04-03 23:53:51 +0300103 path_t path = PATH_T_INITIALIZE("lstat", "path", 0, 0);
104 int dir_fd = DEFAULT_DIR_FD;
105
Serhiy Storchaka31913912019-03-14 10:32:22 +0200106 args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 1, 1, 0, argsbuf);
107 if (!args) {
Serhiy Storchaka1009bf12015-04-03 23:53:51 +0300108 goto exit;
Serhiy Storchaka5dee6552016-06-09 16:16:06 +0300109 }
Serhiy Storchaka31913912019-03-14 10:32:22 +0200110 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 }
119skip_optional_kwonly:
Serhiy Storchaka1009bf12015-04-03 23:53:51 +0300120 return_value = os_lstat_impl(module, &path, dir_fd);
121
122exit:
123 /* Cleanup for path */
124 path_cleanup(&path);
125
126 return return_value;
127}
128
129PyDoc_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"
BNMetricsb9427072018-11-02 15:20:19 +0000137" Path to be tested; can be string, bytes, or a path-like object.\n"
Serhiy Storchaka1009bf12015-04-03 23:53:51 +0300138" 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 \
Serhiy Storchaka4a934d42018-11-27 11:27:36 +0200162 {"access", (PyCFunction)(void(*)(void))os_access, METH_FASTCALL|METH_KEYWORDS, os_access__doc__},
Serhiy Storchaka1009bf12015-04-03 23:53:51 +0300163
164static int
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300165os_access_impl(PyObject *module, path_t *path, int mode, int dir_fd,
Larry Hastings89964c42015-04-14 18:07:59 -0400166 int effective_ids, int follow_symlinks);
Serhiy Storchaka1009bf12015-04-03 23:53:51 +0300167
168static PyObject *
Serhiy Storchakaa5552f02017-12-15 13:11:11 +0200169os_access(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames)
Serhiy Storchaka1009bf12015-04-03 23:53:51 +0300170{
171 PyObject *return_value = NULL;
Serhiy Storchaka9171a8b2016-08-14 10:52:18 +0300172 static const char * const _keywords[] = {"path", "mode", "dir_fd", "effective_ids", "follow_symlinks", NULL};
Serhiy Storchaka31913912019-03-14 10:32:22 +0200173 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;
Benjamin Peterson768f3b42016-09-05 15:29:33 -0700176 path_t path = PATH_T_INITIALIZE("access", "path", 0, 0);
Serhiy Storchaka1009bf12015-04-03 23:53:51 +0300177 int mode;
178 int dir_fd = DEFAULT_DIR_FD;
179 int effective_ids = 0;
180 int follow_symlinks = 1;
181 int _return_value;
182
Serhiy Storchaka31913912019-03-14 10:32:22 +0200183 args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 2, 2, 0, argsbuf);
184 if (!args) {
Serhiy Storchaka1009bf12015-04-03 23:53:51 +0300185 goto exit;
Serhiy Storchaka5dee6552016-06-09 16:16:06 +0300186 }
Serhiy Storchaka31913912019-03-14 10:32:22 +0200187 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 }
223skip_optional_kwonly:
Serhiy Storchaka1009bf12015-04-03 23:53:51 +0300224 _return_value = os_access_impl(module, &path, mode, dir_fd, effective_ids, follow_symlinks);
Serhiy Storchaka5dee6552016-06-09 16:16:06 +0300225 if ((_return_value == -1) && PyErr_Occurred()) {
Serhiy Storchaka1009bf12015-04-03 23:53:51 +0300226 goto exit;
Serhiy Storchaka5dee6552016-06-09 16:16:06 +0300227 }
Serhiy Storchaka1009bf12015-04-03 23:53:51 +0300228 return_value = PyBool_FromLong((long)_return_value);
229
230exit:
231 /* Cleanup for path */
232 path_cleanup(&path);
233
234 return return_value;
235}
236
237#if defined(HAVE_TTYNAME)
238
239PyDoc_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 \
Serhiy Storchaka92e8af62015-04-04 00:12:11 +0300249 {"ttyname", (PyCFunction)os_ttyname, METH_O, os_ttyname__doc__},
Serhiy Storchaka1009bf12015-04-03 23:53:51 +0300250
Serhiy Storchaka4db62e12018-12-17 16:47:45 +0200251static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300252os_ttyname_impl(PyObject *module, int fd);
Serhiy Storchaka1009bf12015-04-03 23:53:51 +0300253
254static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300255os_ttyname(PyObject *module, PyObject *arg)
Serhiy Storchaka1009bf12015-04-03 23:53:51 +0300256{
257 PyObject *return_value = NULL;
258 int fd;
Serhiy Storchaka1009bf12015-04-03 23:53:51 +0300259
Serhiy Storchaka32d96a22018-12-25 13:23:47 +0200260 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()) {
Serhiy Storchaka1009bf12015-04-03 23:53:51 +0300267 goto exit;
Serhiy Storchaka5dee6552016-06-09 16:16:06 +0300268 }
Serhiy Storchaka4db62e12018-12-17 16:47:45 +0200269 return_value = os_ttyname_impl(module, fd);
Serhiy Storchaka1009bf12015-04-03 23:53:51 +0300270
271exit:
272 return return_value;
273}
274
275#endif /* defined(HAVE_TTYNAME) */
276
277#if defined(HAVE_CTERMID)
278
279PyDoc_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
288static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300289os_ctermid_impl(PyObject *module);
Serhiy Storchaka1009bf12015-04-03 23:53:51 +0300290
291static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300292os_ctermid(PyObject *module, PyObject *Py_UNUSED(ignored))
Serhiy Storchaka1009bf12015-04-03 23:53:51 +0300293{
294 return os_ctermid_impl(module);
295}
296
297#endif /* defined(HAVE_CTERMID) */
298
299PyDoc_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 \
Serhiy Storchaka4a934d42018-11-27 11:27:36 +0200310 {"chdir", (PyCFunction)(void(*)(void))os_chdir, METH_FASTCALL|METH_KEYWORDS, os_chdir__doc__},
Serhiy Storchaka1009bf12015-04-03 23:53:51 +0300311
312static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300313os_chdir_impl(PyObject *module, path_t *path);
Serhiy Storchaka1009bf12015-04-03 23:53:51 +0300314
315static PyObject *
Serhiy Storchakaa5552f02017-12-15 13:11:11 +0200316os_chdir(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames)
Serhiy Storchaka1009bf12015-04-03 23:53:51 +0300317{
318 PyObject *return_value = NULL;
Serhiy Storchaka9171a8b2016-08-14 10:52:18 +0300319 static const char * const _keywords[] = {"path", NULL};
Serhiy Storchaka31913912019-03-14 10:32:22 +0200320 static _PyArg_Parser _parser = {NULL, _keywords, "chdir", 0};
321 PyObject *argsbuf[1];
Serhiy Storchaka1009bf12015-04-03 23:53:51 +0300322 path_t path = PATH_T_INITIALIZE("chdir", "path", 0, PATH_HAVE_FCHDIR);
323
Serhiy Storchaka31913912019-03-14 10:32:22 +0200324 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)) {
Serhiy Storchaka1009bf12015-04-03 23:53:51 +0300329 goto exit;
Serhiy Storchaka5dee6552016-06-09 16:16:06 +0300330 }
Serhiy Storchaka1009bf12015-04-03 23:53:51 +0300331 return_value = os_chdir_impl(module, &path);
332
333exit:
334 /* Cleanup for path */
335 path_cleanup(&path);
336
337 return return_value;
338}
339
340#if defined(HAVE_FCHDIR)
341
342PyDoc_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 \
Serhiy Storchaka4a934d42018-11-27 11:27:36 +0200352 {"fchdir", (PyCFunction)(void(*)(void))os_fchdir, METH_FASTCALL|METH_KEYWORDS, os_fchdir__doc__},
Serhiy Storchaka1009bf12015-04-03 23:53:51 +0300353
354static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300355os_fchdir_impl(PyObject *module, int fd);
Serhiy Storchaka1009bf12015-04-03 23:53:51 +0300356
357static PyObject *
Serhiy Storchakaa5552f02017-12-15 13:11:11 +0200358os_fchdir(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames)
Serhiy Storchaka1009bf12015-04-03 23:53:51 +0300359{
360 PyObject *return_value = NULL;
Serhiy Storchaka9171a8b2016-08-14 10:52:18 +0300361 static const char * const _keywords[] = {"fd", NULL};
Serhiy Storchaka31913912019-03-14 10:32:22 +0200362 static _PyArg_Parser _parser = {NULL, _keywords, "fchdir", 0};
363 PyObject *argsbuf[1];
Serhiy Storchaka1009bf12015-04-03 23:53:51 +0300364 int fd;
365
Serhiy Storchaka31913912019-03-14 10:32:22 +0200366 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)) {
Serhiy Storchaka1009bf12015-04-03 23:53:51 +0300371 goto exit;
Serhiy Storchaka5dee6552016-06-09 16:16:06 +0300372 }
Serhiy Storchaka1009bf12015-04-03 23:53:51 +0300373 return_value = os_fchdir_impl(module, fd);
374
375exit:
376 return return_value;
377}
378
379#endif /* defined(HAVE_FCHDIR) */
380
381PyDoc_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"
BNMetricsb9427072018-11-02 15:20:19 +0000388" Path to be modified. May always be specified as a str, bytes, or a path-like object.\n"
Serhiy Storchaka1009bf12015-04-03 23:53:51 +0300389" 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 \
Serhiy Storchaka4a934d42018-11-27 11:27:36 +0200408 {"chmod", (PyCFunction)(void(*)(void))os_chmod, METH_FASTCALL|METH_KEYWORDS, os_chmod__doc__},
Serhiy Storchaka1009bf12015-04-03 23:53:51 +0300409
410static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300411os_chmod_impl(PyObject *module, path_t *path, int mode, int dir_fd,
Larry Hastings89964c42015-04-14 18:07:59 -0400412 int follow_symlinks);
Serhiy Storchaka1009bf12015-04-03 23:53:51 +0300413
414static PyObject *
Serhiy Storchakaa5552f02017-12-15 13:11:11 +0200415os_chmod(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames)
Serhiy Storchaka1009bf12015-04-03 23:53:51 +0300416{
417 PyObject *return_value = NULL;
Serhiy Storchaka9171a8b2016-08-14 10:52:18 +0300418 static const char * const _keywords[] = {"path", "mode", "dir_fd", "follow_symlinks", NULL};
Serhiy Storchaka31913912019-03-14 10:32:22 +0200419 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;
Serhiy Storchaka1009bf12015-04-03 23:53:51 +0300422 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
Serhiy Storchaka31913912019-03-14 10:32:22 +0200427 args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 2, 2, 0, argsbuf);
428 if (!args) {
Serhiy Storchaka1009bf12015-04-03 23:53:51 +0300429 goto exit;
Serhiy Storchaka5dee6552016-06-09 16:16:06 +0300430 }
Serhiy Storchaka31913912019-03-14 10:32:22 +0200431 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 }
458skip_optional_kwonly:
Serhiy Storchaka1009bf12015-04-03 23:53:51 +0300459 return_value = os_chmod_impl(module, &path, mode, dir_fd, follow_symlinks);
460
461exit:
462 /* Cleanup for path */
463 path_cleanup(&path);
464
465 return return_value;
466}
467
468#if defined(HAVE_FCHMOD)
469
470PyDoc_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 \
Serhiy Storchaka4a934d42018-11-27 11:27:36 +0200479 {"fchmod", (PyCFunction)(void(*)(void))os_fchmod, METH_FASTCALL|METH_KEYWORDS, os_fchmod__doc__},
Serhiy Storchaka1009bf12015-04-03 23:53:51 +0300480
481static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300482os_fchmod_impl(PyObject *module, int fd, int mode);
Serhiy Storchaka1009bf12015-04-03 23:53:51 +0300483
484static PyObject *
Serhiy Storchakaa5552f02017-12-15 13:11:11 +0200485os_fchmod(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames)
Serhiy Storchaka1009bf12015-04-03 23:53:51 +0300486{
487 PyObject *return_value = NULL;
Serhiy Storchaka9171a8b2016-08-14 10:52:18 +0300488 static const char * const _keywords[] = {"fd", "mode", NULL};
Serhiy Storchaka31913912019-03-14 10:32:22 +0200489 static _PyArg_Parser _parser = {NULL, _keywords, "fchmod", 0};
490 PyObject *argsbuf[2];
Serhiy Storchaka1009bf12015-04-03 23:53:51 +0300491 int fd;
492 int mode;
493
Serhiy Storchaka31913912019-03-14 10:32:22 +0200494 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()) {
Serhiy Storchaka1009bf12015-04-03 23:53:51 +0300514 goto exit;
Serhiy Storchaka5dee6552016-06-09 16:16:06 +0300515 }
Serhiy Storchaka1009bf12015-04-03 23:53:51 +0300516 return_value = os_fchmod_impl(module, fd, mode);
517
518exit:
519 return return_value;
520}
521
522#endif /* defined(HAVE_FCHMOD) */
523
524#if defined(HAVE_LCHMOD)
525
526PyDoc_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 \
Serhiy Storchaka4a934d42018-11-27 11:27:36 +0200536 {"lchmod", (PyCFunction)(void(*)(void))os_lchmod, METH_FASTCALL|METH_KEYWORDS, os_lchmod__doc__},
Serhiy Storchaka1009bf12015-04-03 23:53:51 +0300537
538static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300539os_lchmod_impl(PyObject *module, path_t *path, int mode);
Serhiy Storchaka1009bf12015-04-03 23:53:51 +0300540
541static PyObject *
Serhiy Storchakaa5552f02017-12-15 13:11:11 +0200542os_lchmod(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames)
Serhiy Storchaka1009bf12015-04-03 23:53:51 +0300543{
544 PyObject *return_value = NULL;
Serhiy Storchaka9171a8b2016-08-14 10:52:18 +0300545 static const char * const _keywords[] = {"path", "mode", NULL};
Serhiy Storchaka31913912019-03-14 10:32:22 +0200546 static _PyArg_Parser _parser = {NULL, _keywords, "lchmod", 0};
547 PyObject *argsbuf[2];
Serhiy Storchaka1009bf12015-04-03 23:53:51 +0300548 path_t path = PATH_T_INITIALIZE("lchmod", "path", 0, 0);
549 int mode;
550
Serhiy Storchaka31913912019-03-14 10:32:22 +0200551 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()) {
Serhiy Storchaka1009bf12015-04-03 23:53:51 +0300565 goto exit;
Serhiy Storchaka5dee6552016-06-09 16:16:06 +0300566 }
Serhiy Storchaka1009bf12015-04-03 23:53:51 +0300567 return_value = os_lchmod_impl(module, &path, mode);
568
569exit:
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
580PyDoc_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 \
Serhiy Storchaka4a934d42018-11-27 11:27:36 +0200593 {"chflags", (PyCFunction)(void(*)(void))os_chflags, METH_FASTCALL|METH_KEYWORDS, os_chflags__doc__},
Serhiy Storchaka1009bf12015-04-03 23:53:51 +0300594
595static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300596os_chflags_impl(PyObject *module, path_t *path, unsigned long flags,
Larry Hastings89964c42015-04-14 18:07:59 -0400597 int follow_symlinks);
Serhiy Storchaka1009bf12015-04-03 23:53:51 +0300598
599static PyObject *
Serhiy Storchakaa5552f02017-12-15 13:11:11 +0200600os_chflags(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames)
Serhiy Storchaka1009bf12015-04-03 23:53:51 +0300601{
602 PyObject *return_value = NULL;
Serhiy Storchaka9171a8b2016-08-14 10:52:18 +0300603 static const char * const _keywords[] = {"path", "flags", "follow_symlinks", NULL};
Serhiy Storchaka31913912019-03-14 10:32:22 +0200604 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;
Serhiy Storchaka1009bf12015-04-03 23:53:51 +0300607 path_t path = PATH_T_INITIALIZE("chflags", "path", 0, 0);
608 unsigned long flags;
609 int follow_symlinks = 1;
610
Serhiy Storchaka31913912019-03-14 10:32:22 +0200611 args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 2, 3, 0, argsbuf);
612 if (!args) {
Serhiy Storchaka1009bf12015-04-03 23:53:51 +0300613 goto exit;
Serhiy Storchaka5dee6552016-06-09 16:16:06 +0300614 }
Serhiy Storchaka31913912019-03-14 10:32:22 +0200615 if (!path_converter(args[0], &path)) {
616 goto exit;
617 }
618 if (!PyLong_Check(args[1])) {
Rémi Lapeyre4901fe22019-08-29 16:49:08 +0200619 _PyArg_BadArgument("chflags", "argument 'flags'", "int", args[1]);
Serhiy Storchaka31913912019-03-14 10:32:22 +0200620 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 }
630skip_optional_pos:
Serhiy Storchaka1009bf12015-04-03 23:53:51 +0300631 return_value = os_chflags_impl(module, &path, flags, follow_symlinks);
632
633exit:
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
644PyDoc_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 \
Serhiy Storchaka4a934d42018-11-27 11:27:36 +0200654 {"lchflags", (PyCFunction)(void(*)(void))os_lchflags, METH_FASTCALL|METH_KEYWORDS, os_lchflags__doc__},
Serhiy Storchaka1009bf12015-04-03 23:53:51 +0300655
656static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300657os_lchflags_impl(PyObject *module, path_t *path, unsigned long flags);
Serhiy Storchaka1009bf12015-04-03 23:53:51 +0300658
659static PyObject *
Serhiy Storchakaa5552f02017-12-15 13:11:11 +0200660os_lchflags(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames)
Serhiy Storchaka1009bf12015-04-03 23:53:51 +0300661{
662 PyObject *return_value = NULL;
Serhiy Storchaka9171a8b2016-08-14 10:52:18 +0300663 static const char * const _keywords[] = {"path", "flags", NULL};
Serhiy Storchaka31913912019-03-14 10:32:22 +0200664 static _PyArg_Parser _parser = {NULL, _keywords, "lchflags", 0};
665 PyObject *argsbuf[2];
Serhiy Storchaka1009bf12015-04-03 23:53:51 +0300666 path_t path = PATH_T_INITIALIZE("lchflags", "path", 0, 0);
667 unsigned long flags;
668
Serhiy Storchaka31913912019-03-14 10:32:22 +0200669 args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 2, 2, 0, argsbuf);
670 if (!args) {
Serhiy Storchaka1009bf12015-04-03 23:53:51 +0300671 goto exit;
Serhiy Storchaka5dee6552016-06-09 16:16:06 +0300672 }
Serhiy Storchaka31913912019-03-14 10:32:22 +0200673 if (!path_converter(args[0], &path)) {
674 goto exit;
675 }
676 if (!PyLong_Check(args[1])) {
Rémi Lapeyre4901fe22019-08-29 16:49:08 +0200677 _PyArg_BadArgument("lchflags", "argument 'flags'", "int", args[1]);
Serhiy Storchaka31913912019-03-14 10:32:22 +0200678 goto exit;
679 }
680 flags = PyLong_AsUnsignedLongMask(args[1]);
Serhiy Storchaka1009bf12015-04-03 23:53:51 +0300681 return_value = os_lchflags_impl(module, &path, flags);
682
683exit:
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
694PyDoc_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 \
Serhiy Storchaka4a934d42018-11-27 11:27:36 +0200701 {"chroot", (PyCFunction)(void(*)(void))os_chroot, METH_FASTCALL|METH_KEYWORDS, os_chroot__doc__},
Serhiy Storchaka1009bf12015-04-03 23:53:51 +0300702
703static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300704os_chroot_impl(PyObject *module, path_t *path);
Serhiy Storchaka1009bf12015-04-03 23:53:51 +0300705
706static PyObject *
Serhiy Storchakaa5552f02017-12-15 13:11:11 +0200707os_chroot(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames)
Serhiy Storchaka1009bf12015-04-03 23:53:51 +0300708{
709 PyObject *return_value = NULL;
Serhiy Storchaka9171a8b2016-08-14 10:52:18 +0300710 static const char * const _keywords[] = {"path", NULL};
Serhiy Storchaka31913912019-03-14 10:32:22 +0200711 static _PyArg_Parser _parser = {NULL, _keywords, "chroot", 0};
712 PyObject *argsbuf[1];
Serhiy Storchaka1009bf12015-04-03 23:53:51 +0300713 path_t path = PATH_T_INITIALIZE("chroot", "path", 0, 0);
714
Serhiy Storchaka31913912019-03-14 10:32:22 +0200715 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)) {
Serhiy Storchaka1009bf12015-04-03 23:53:51 +0300720 goto exit;
Serhiy Storchaka5dee6552016-06-09 16:16:06 +0300721 }
Serhiy Storchaka1009bf12015-04-03 23:53:51 +0300722 return_value = os_chroot_impl(module, &path);
723
724exit:
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
735PyDoc_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 \
Serhiy Storchaka4a934d42018-11-27 11:27:36 +0200742 {"fsync", (PyCFunction)(void(*)(void))os_fsync, METH_FASTCALL|METH_KEYWORDS, os_fsync__doc__},
Serhiy Storchaka1009bf12015-04-03 23:53:51 +0300743
744static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300745os_fsync_impl(PyObject *module, int fd);
Serhiy Storchaka1009bf12015-04-03 23:53:51 +0300746
747static PyObject *
Serhiy Storchakaa5552f02017-12-15 13:11:11 +0200748os_fsync(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames)
Serhiy Storchaka1009bf12015-04-03 23:53:51 +0300749{
750 PyObject *return_value = NULL;
Serhiy Storchaka9171a8b2016-08-14 10:52:18 +0300751 static const char * const _keywords[] = {"fd", NULL};
Serhiy Storchaka31913912019-03-14 10:32:22 +0200752 static _PyArg_Parser _parser = {NULL, _keywords, "fsync", 0};
753 PyObject *argsbuf[1];
Serhiy Storchaka1009bf12015-04-03 23:53:51 +0300754 int fd;
755
Serhiy Storchaka31913912019-03-14 10:32:22 +0200756 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)) {
Serhiy Storchaka1009bf12015-04-03 23:53:51 +0300761 goto exit;
Serhiy Storchaka5dee6552016-06-09 16:16:06 +0300762 }
Serhiy Storchaka1009bf12015-04-03 23:53:51 +0300763 return_value = os_fsync_impl(module, fd);
764
765exit:
766 return return_value;
767}
768
769#endif /* defined(HAVE_FSYNC) */
770
771#if defined(HAVE_SYNC)
772
773PyDoc_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
782static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300783os_sync_impl(PyObject *module);
Serhiy Storchaka1009bf12015-04-03 23:53:51 +0300784
785static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300786os_sync(PyObject *module, PyObject *Py_UNUSED(ignored))
Serhiy Storchaka1009bf12015-04-03 23:53:51 +0300787{
788 return os_sync_impl(module);
789}
790
791#endif /* defined(HAVE_SYNC) */
792
793#if defined(HAVE_FDATASYNC)
794
795PyDoc_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 \
Serhiy Storchaka4a934d42018-11-27 11:27:36 +0200802 {"fdatasync", (PyCFunction)(void(*)(void))os_fdatasync, METH_FASTCALL|METH_KEYWORDS, os_fdatasync__doc__},
Serhiy Storchaka1009bf12015-04-03 23:53:51 +0300803
804static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300805os_fdatasync_impl(PyObject *module, int fd);
Serhiy Storchaka1009bf12015-04-03 23:53:51 +0300806
807static PyObject *
Serhiy Storchakaa5552f02017-12-15 13:11:11 +0200808os_fdatasync(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames)
Serhiy Storchaka1009bf12015-04-03 23:53:51 +0300809{
810 PyObject *return_value = NULL;
Serhiy Storchaka9171a8b2016-08-14 10:52:18 +0300811 static const char * const _keywords[] = {"fd", NULL};
Serhiy Storchaka31913912019-03-14 10:32:22 +0200812 static _PyArg_Parser _parser = {NULL, _keywords, "fdatasync", 0};
813 PyObject *argsbuf[1];
Serhiy Storchaka1009bf12015-04-03 23:53:51 +0300814 int fd;
815
Serhiy Storchaka31913912019-03-14 10:32:22 +0200816 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)) {
Serhiy Storchaka1009bf12015-04-03 23:53:51 +0300821 goto exit;
Serhiy Storchaka5dee6552016-06-09 16:16:06 +0300822 }
Serhiy Storchaka1009bf12015-04-03 23:53:51 +0300823 return_value = os_fdatasync_impl(module, fd);
824
825exit:
826 return return_value;
827}
828
829#endif /* defined(HAVE_FDATASYNC) */
830
831#if defined(HAVE_CHOWN)
832
833PyDoc_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"
BNMetricsb9427072018-11-02 15:20:19 +0000840" Path to be examined; can be string, bytes, a path-like object, or open-file-descriptor int.\n"
Serhiy Storchaka1009bf12015-04-03 23:53:51 +0300841" 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 \
Serhiy Storchaka4a934d42018-11-27 11:27:36 +0200864 {"chown", (PyCFunction)(void(*)(void))os_chown, METH_FASTCALL|METH_KEYWORDS, os_chown__doc__},
Serhiy Storchaka1009bf12015-04-03 23:53:51 +0300865
866static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300867os_chown_impl(PyObject *module, path_t *path, uid_t uid, gid_t gid,
Larry Hastings89964c42015-04-14 18:07:59 -0400868 int dir_fd, int follow_symlinks);
Serhiy Storchaka1009bf12015-04-03 23:53:51 +0300869
870static PyObject *
Serhiy Storchakaa5552f02017-12-15 13:11:11 +0200871os_chown(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames)
Serhiy Storchaka1009bf12015-04-03 23:53:51 +0300872{
873 PyObject *return_value = NULL;
Serhiy Storchaka9171a8b2016-08-14 10:52:18 +0300874 static const char * const _keywords[] = {"path", "uid", "gid", "dir_fd", "follow_symlinks", NULL};
Serhiy Storchaka31913912019-03-14 10:32:22 +0200875 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;
Serhiy Storchaka1009bf12015-04-03 23:53:51 +0300878 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
Serhiy Storchaka31913912019-03-14 10:32:22 +0200884 args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 3, 3, 0, argsbuf);
885 if (!args) {
Serhiy Storchaka1009bf12015-04-03 23:53:51 +0300886 goto exit;
Serhiy Storchaka5dee6552016-06-09 16:16:06 +0300887 }
Serhiy Storchaka31913912019-03-14 10:32:22 +0200888 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 }
912skip_optional_kwonly:
Serhiy Storchaka1009bf12015-04-03 23:53:51 +0300913 return_value = os_chown_impl(module, &path, uid, gid, dir_fd, follow_symlinks);
914
915exit:
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
926PyDoc_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 \
Serhiy Storchaka4a934d42018-11-27 11:27:36 +0200935 {"fchown", (PyCFunction)(void(*)(void))os_fchown, METH_FASTCALL|METH_KEYWORDS, os_fchown__doc__},
Serhiy Storchaka1009bf12015-04-03 23:53:51 +0300936
937static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300938os_fchown_impl(PyObject *module, int fd, uid_t uid, gid_t gid);
Serhiy Storchaka1009bf12015-04-03 23:53:51 +0300939
940static PyObject *
Serhiy Storchakaa5552f02017-12-15 13:11:11 +0200941os_fchown(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames)
Serhiy Storchaka1009bf12015-04-03 23:53:51 +0300942{
943 PyObject *return_value = NULL;
Serhiy Storchaka9171a8b2016-08-14 10:52:18 +0300944 static const char * const _keywords[] = {"fd", "uid", "gid", NULL};
Serhiy Storchaka31913912019-03-14 10:32:22 +0200945 static _PyArg_Parser _parser = {NULL, _keywords, "fchown", 0};
946 PyObject *argsbuf[3];
Serhiy Storchaka1009bf12015-04-03 23:53:51 +0300947 int fd;
948 uid_t uid;
949 gid_t gid;
950
Serhiy Storchaka31913912019-03-14 10:32:22 +0200951 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)) {
Serhiy Storchaka1009bf12015-04-03 23:53:51 +0300968 goto exit;
Serhiy Storchaka5dee6552016-06-09 16:16:06 +0300969 }
Serhiy Storchaka1009bf12015-04-03 23:53:51 +0300970 return_value = os_fchown_impl(module, fd, uid, gid);
971
972exit:
973 return return_value;
974}
975
976#endif /* defined(HAVE_FCHOWN) */
977
978#if defined(HAVE_LCHOWN)
979
980PyDoc_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 \
Serhiy Storchaka4a934d42018-11-27 11:27:36 +0200990 {"lchown", (PyCFunction)(void(*)(void))os_lchown, METH_FASTCALL|METH_KEYWORDS, os_lchown__doc__},
Serhiy Storchaka1009bf12015-04-03 23:53:51 +0300991
992static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300993os_lchown_impl(PyObject *module, path_t *path, uid_t uid, gid_t gid);
Serhiy Storchaka1009bf12015-04-03 23:53:51 +0300994
995static PyObject *
Serhiy Storchakaa5552f02017-12-15 13:11:11 +0200996os_lchown(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames)
Serhiy Storchaka1009bf12015-04-03 23:53:51 +0300997{
998 PyObject *return_value = NULL;
Serhiy Storchaka9171a8b2016-08-14 10:52:18 +0300999 static const char * const _keywords[] = {"path", "uid", "gid", NULL};
Serhiy Storchaka31913912019-03-14 10:32:22 +02001000 static _PyArg_Parser _parser = {NULL, _keywords, "lchown", 0};
1001 PyObject *argsbuf[3];
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03001002 path_t path = PATH_T_INITIALIZE("lchown", "path", 0, 0);
1003 uid_t uid;
1004 gid_t gid;
1005
Serhiy Storchaka31913912019-03-14 10:32:22 +02001006 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)) {
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03001017 goto exit;
Serhiy Storchaka5dee6552016-06-09 16:16:06 +03001018 }
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03001019 return_value = os_lchown_impl(module, &path, uid, gid);
1020
1021exit:
1022 /* Cleanup for path */
1023 path_cleanup(&path);
1024
1025 return return_value;
1026}
1027
1028#endif /* defined(HAVE_LCHOWN) */
1029
1030PyDoc_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
1039static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03001040os_getcwd_impl(PyObject *module);
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03001041
1042static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03001043os_getcwd(PyObject *module, PyObject *Py_UNUSED(ignored))
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03001044{
1045 return os_getcwd_impl(module);
1046}
1047
1048PyDoc_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
1057static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03001058os_getcwdb_impl(PyObject *module);
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03001059
1060static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03001061os_getcwdb(PyObject *module, PyObject *Py_UNUSED(ignored))
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03001062{
1063 return os_getcwdb_impl(module);
1064}
1065
1066#if defined(HAVE_LINK)
1067
1068PyDoc_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 \
Serhiy Storchaka4a934d42018-11-27 11:27:36 +02001086 {"link", (PyCFunction)(void(*)(void))os_link, METH_FASTCALL|METH_KEYWORDS, os_link__doc__},
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03001087
1088static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03001089os_link_impl(PyObject *module, path_t *src, path_t *dst, int src_dir_fd,
Larry Hastings89964c42015-04-14 18:07:59 -04001090 int dst_dir_fd, int follow_symlinks);
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03001091
1092static PyObject *
Serhiy Storchakaa5552f02017-12-15 13:11:11 +02001093os_link(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames)
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03001094{
1095 PyObject *return_value = NULL;
Serhiy Storchaka9171a8b2016-08-14 10:52:18 +03001096 static const char * const _keywords[] = {"src", "dst", "src_dir_fd", "dst_dir_fd", "follow_symlinks", NULL};
Serhiy Storchaka31913912019-03-14 10:32:22 +02001097 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;
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03001100 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
Serhiy Storchaka31913912019-03-14 10:32:22 +02001106 args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 2, 2, 0, argsbuf);
1107 if (!args) {
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03001108 goto exit;
Serhiy Storchaka5dee6552016-06-09 16:16:06 +03001109 }
Serhiy Storchaka31913912019-03-14 10:32:22 +02001110 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 }
1139skip_optional_kwonly:
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03001140 return_value = os_link_impl(module, &src, &dst, src_dir_fd, dst_dir_fd, follow_symlinks);
1141
1142exit:
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
1153PyDoc_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"
BNMetricsb9427072018-11-02 15:20:19 +00001159"path can be specified as either str, bytes, or a path-like object. If path is bytes,\n"
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03001160" 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 \
Serhiy Storchaka4a934d42018-11-27 11:27:36 +02001171 {"listdir", (PyCFunction)(void(*)(void))os_listdir, METH_FASTCALL|METH_KEYWORDS, os_listdir__doc__},
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03001172
1173static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03001174os_listdir_impl(PyObject *module, path_t *path);
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03001175
1176static PyObject *
Serhiy Storchakaa5552f02017-12-15 13:11:11 +02001177os_listdir(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames)
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03001178{
1179 PyObject *return_value = NULL;
Serhiy Storchaka9171a8b2016-08-14 10:52:18 +03001180 static const char * const _keywords[] = {"path", NULL};
Serhiy Storchaka31913912019-03-14 10:32:22 +02001181 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;
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03001184 path_t path = PATH_T_INITIALIZE("listdir", "path", 1, PATH_HAVE_FDOPENDIR);
1185
Serhiy Storchaka31913912019-03-14 10:32:22 +02001186 args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 0, 1, 0, argsbuf);
1187 if (!args) {
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03001188 goto exit;
Serhiy Storchaka5dee6552016-06-09 16:16:06 +03001189 }
Serhiy Storchaka31913912019-03-14 10:32:22 +02001190 if (!noptargs) {
1191 goto skip_optional_pos;
1192 }
1193 if (!path_converter(args[0], &path)) {
1194 goto exit;
1195 }
1196skip_optional_pos:
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03001197 return_value = os_listdir_impl(module, &path);
1198
1199exit:
1200 /* Cleanup for path */
1201 path_cleanup(&path);
1202
1203 return return_value;
1204}
1205
1206#if defined(MS_WINDOWS)
1207
Serhiy Storchakaf0b50152015-05-13 00:52:39 +03001208PyDoc_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
1216static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03001217os__getfullpathname_impl(PyObject *module, path_t *path);
Serhiy Storchakaf0b50152015-05-13 00:52:39 +03001218
1219static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03001220os__getfullpathname(PyObject *module, PyObject *arg)
Serhiy Storchakaf0b50152015-05-13 00:52:39 +03001221{
1222 PyObject *return_value = NULL;
1223 path_t path = PATH_T_INITIALIZE("_getfullpathname", "path", 0, 0);
1224
Serhiy Storchaka32d96a22018-12-25 13:23:47 +02001225 if (!path_converter(arg, &path)) {
Serhiy Storchakaf0b50152015-05-13 00:52:39 +03001226 goto exit;
Serhiy Storchaka5dee6552016-06-09 16:16:06 +03001227 }
Serhiy Storchakaf0b50152015-05-13 00:52:39 +03001228 return_value = os__getfullpathname_impl(module, &path);
1229
1230exit:
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
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03001241PyDoc_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 \
Serhiy Storchaka92e8af62015-04-04 00:12:11 +03001248 {"_getfinalpathname", (PyCFunction)os__getfinalpathname, METH_O, os__getfinalpathname__doc__},
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03001249
1250static PyObject *
Steve Dower23ad6d02018-02-22 10:39:10 -08001251os__getfinalpathname_impl(PyObject *module, path_t *path);
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03001252
1253static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03001254os__getfinalpathname(PyObject *module, PyObject *arg)
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03001255{
1256 PyObject *return_value = NULL;
Steve Dower23ad6d02018-02-22 10:39:10 -08001257 path_t path = PATH_T_INITIALIZE("_getfinalpathname", "path", 0, 0);
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03001258
Serhiy Storchaka32d96a22018-12-25 13:23:47 +02001259 if (!path_converter(arg, &path)) {
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03001260 goto exit;
Serhiy Storchaka5dee6552016-06-09 16:16:06 +03001261 }
Steve Dower23ad6d02018-02-22 10:39:10 -08001262 return_value = os__getfinalpathname_impl(module, &path);
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03001263
1264exit:
Steve Dower23ad6d02018-02-22 10:39:10 -08001265 /* Cleanup for path */
1266 path_cleanup(&path);
1267
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03001268 return return_value;
1269}
1270
1271#endif /* defined(MS_WINDOWS) */
1272
1273#if defined(MS_WINDOWS)
1274
1275PyDoc_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 \
Serhiy Storchaka4a934d42018-11-27 11:27:36 +02001282 {"_getvolumepathname", (PyCFunction)(void(*)(void))os__getvolumepathname, METH_FASTCALL|METH_KEYWORDS, os__getvolumepathname__doc__},
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03001283
1284static PyObject *
Steve Dower23ad6d02018-02-22 10:39:10 -08001285os__getvolumepathname_impl(PyObject *module, path_t *path);
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03001286
1287static PyObject *
Serhiy Storchakaa5552f02017-12-15 13:11:11 +02001288os__getvolumepathname(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames)
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03001289{
1290 PyObject *return_value = NULL;
Serhiy Storchaka9171a8b2016-08-14 10:52:18 +03001291 static const char * const _keywords[] = {"path", NULL};
Serhiy Storchaka31913912019-03-14 10:32:22 +02001292 static _PyArg_Parser _parser = {NULL, _keywords, "_getvolumepathname", 0};
1293 PyObject *argsbuf[1];
Steve Dower23ad6d02018-02-22 10:39:10 -08001294 path_t path = PATH_T_INITIALIZE("_getvolumepathname", "path", 0, 0);
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03001295
Serhiy Storchaka31913912019-03-14 10:32:22 +02001296 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)) {
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03001301 goto exit;
Serhiy Storchaka5dee6552016-06-09 16:16:06 +03001302 }
Steve Dower23ad6d02018-02-22 10:39:10 -08001303 return_value = os__getvolumepathname_impl(module, &path);
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03001304
1305exit:
Steve Dower23ad6d02018-02-22 10:39:10 -08001306 /* Cleanup for path */
1307 path_cleanup(&path);
1308
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03001309 return return_value;
1310}
1311
1312#endif /* defined(MS_WINDOWS) */
1313
1314PyDoc_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 \
Serhiy Storchaka4a934d42018-11-27 11:27:36 +02001328 {"mkdir", (PyCFunction)(void(*)(void))os_mkdir, METH_FASTCALL|METH_KEYWORDS, os_mkdir__doc__},
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03001329
1330static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03001331os_mkdir_impl(PyObject *module, path_t *path, int mode, int dir_fd);
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03001332
1333static PyObject *
Serhiy Storchakaa5552f02017-12-15 13:11:11 +02001334os_mkdir(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames)
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03001335{
1336 PyObject *return_value = NULL;
Serhiy Storchaka9171a8b2016-08-14 10:52:18 +03001337 static const char * const _keywords[] = {"path", "mode", "dir_fd", NULL};
Serhiy Storchaka31913912019-03-14 10:32:22 +02001338 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;
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03001341 path_t path = PATH_T_INITIALIZE("mkdir", "path", 0, 0);
1342 int mode = 511;
1343 int dir_fd = DEFAULT_DIR_FD;
1344
Serhiy Storchaka31913912019-03-14 10:32:22 +02001345 args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 1, 2, 0, argsbuf);
1346 if (!args) {
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03001347 goto exit;
Serhiy Storchaka5dee6552016-06-09 16:16:06 +03001348 }
Serhiy Storchaka31913912019-03-14 10:32:22 +02001349 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 }
1369skip_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 }
1376skip_optional_kwonly:
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03001377 return_value = os_mkdir_impl(module, &path, mode, dir_fd);
1378
1379exit:
1380 /* Cleanup for path */
1381 path_cleanup(&path);
1382
1383 return return_value;
1384}
1385
1386#if defined(HAVE_NICE)
1387
1388PyDoc_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 \
Serhiy Storchaka92e8af62015-04-04 00:12:11 +03001395 {"nice", (PyCFunction)os_nice, METH_O, os_nice__doc__},
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03001396
1397static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03001398os_nice_impl(PyObject *module, int increment);
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03001399
1400static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03001401os_nice(PyObject *module, PyObject *arg)
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03001402{
1403 PyObject *return_value = NULL;
1404 int increment;
1405
Serhiy Storchaka32d96a22018-12-25 13:23:47 +02001406 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()) {
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03001413 goto exit;
Serhiy Storchaka5dee6552016-06-09 16:16:06 +03001414 }
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03001415 return_value = os_nice_impl(module, increment);
1416
1417exit:
1418 return return_value;
1419}
1420
1421#endif /* defined(HAVE_NICE) */
1422
1423#if defined(HAVE_GETPRIORITY)
1424
1425PyDoc_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 \
Serhiy Storchaka4a934d42018-11-27 11:27:36 +02001432 {"getpriority", (PyCFunction)(void(*)(void))os_getpriority, METH_FASTCALL|METH_KEYWORDS, os_getpriority__doc__},
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03001433
1434static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03001435os_getpriority_impl(PyObject *module, int which, int who);
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03001436
1437static PyObject *
Serhiy Storchakaa5552f02017-12-15 13:11:11 +02001438os_getpriority(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames)
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03001439{
1440 PyObject *return_value = NULL;
Serhiy Storchaka9171a8b2016-08-14 10:52:18 +03001441 static const char * const _keywords[] = {"which", "who", NULL};
Serhiy Storchaka31913912019-03-14 10:32:22 +02001442 static _PyArg_Parser _parser = {NULL, _keywords, "getpriority", 0};
1443 PyObject *argsbuf[2];
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03001444 int which;
1445 int who;
1446
Serhiy Storchaka31913912019-03-14 10:32:22 +02001447 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()) {
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03001467 goto exit;
Serhiy Storchaka5dee6552016-06-09 16:16:06 +03001468 }
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03001469 return_value = os_getpriority_impl(module, which, who);
1470
1471exit:
1472 return return_value;
1473}
1474
1475#endif /* defined(HAVE_GETPRIORITY) */
1476
1477#if defined(HAVE_SETPRIORITY)
1478
1479PyDoc_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 \
Serhiy Storchaka4a934d42018-11-27 11:27:36 +02001486 {"setpriority", (PyCFunction)(void(*)(void))os_setpriority, METH_FASTCALL|METH_KEYWORDS, os_setpriority__doc__},
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03001487
1488static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03001489os_setpriority_impl(PyObject *module, int which, int who, int priority);
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03001490
1491static PyObject *
Serhiy Storchakaa5552f02017-12-15 13:11:11 +02001492os_setpriority(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames)
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03001493{
1494 PyObject *return_value = NULL;
Serhiy Storchaka9171a8b2016-08-14 10:52:18 +03001495 static const char * const _keywords[] = {"which", "who", "priority", NULL};
Serhiy Storchaka31913912019-03-14 10:32:22 +02001496 static _PyArg_Parser _parser = {NULL, _keywords, "setpriority", 0};
1497 PyObject *argsbuf[3];
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03001498 int which;
1499 int who;
1500 int priority;
1501
Serhiy Storchaka31913912019-03-14 10:32:22 +02001502 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()) {
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03001531 goto exit;
Serhiy Storchaka5dee6552016-06-09 16:16:06 +03001532 }
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03001533 return_value = os_setpriority_impl(module, which, who, priority);
1534
1535exit:
1536 return return_value;
1537}
1538
1539#endif /* defined(HAVE_SETPRIORITY) */
1540
1541PyDoc_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 \
Serhiy Storchaka4a934d42018-11-27 11:27:36 +02001554 {"rename", (PyCFunction)(void(*)(void))os_rename, METH_FASTCALL|METH_KEYWORDS, os_rename__doc__},
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03001555
1556static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03001557os_rename_impl(PyObject *module, path_t *src, path_t *dst, int src_dir_fd,
Larry Hastings89964c42015-04-14 18:07:59 -04001558 int dst_dir_fd);
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03001559
1560static PyObject *
Serhiy Storchakaa5552f02017-12-15 13:11:11 +02001561os_rename(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames)
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03001562{
1563 PyObject *return_value = NULL;
Serhiy Storchaka9171a8b2016-08-14 10:52:18 +03001564 static const char * const _keywords[] = {"src", "dst", "src_dir_fd", "dst_dir_fd", NULL};
Serhiy Storchaka31913912019-03-14 10:32:22 +02001565 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;
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03001568 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
Serhiy Storchaka31913912019-03-14 10:32:22 +02001573 args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 2, 2, 0, argsbuf);
1574 if (!args) {
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03001575 goto exit;
Serhiy Storchaka5dee6552016-06-09 16:16:06 +03001576 }
Serhiy Storchaka31913912019-03-14 10:32:22 +02001577 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 }
1597skip_optional_kwonly:
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03001598 return_value = os_rename_impl(module, &src, &dst, src_dir_fd, dst_dir_fd);
1599
1600exit:
1601 /* Cleanup for src */
1602 path_cleanup(&src);
1603 /* Cleanup for dst */
1604 path_cleanup(&dst);
1605
1606 return return_value;
1607}
1608
1609PyDoc_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"
Anthony Sottile73d60022019-02-12 23:15:54 -05001619" If they are unavailable, using them will raise a NotImplementedError.");
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03001620
1621#define OS_REPLACE_METHODDEF \
Serhiy Storchaka4a934d42018-11-27 11:27:36 +02001622 {"replace", (PyCFunction)(void(*)(void))os_replace, METH_FASTCALL|METH_KEYWORDS, os_replace__doc__},
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03001623
1624static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03001625os_replace_impl(PyObject *module, path_t *src, path_t *dst, int src_dir_fd,
1626 int dst_dir_fd);
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03001627
1628static PyObject *
Serhiy Storchakaa5552f02017-12-15 13:11:11 +02001629os_replace(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames)
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03001630{
1631 PyObject *return_value = NULL;
Serhiy Storchaka9171a8b2016-08-14 10:52:18 +03001632 static const char * const _keywords[] = {"src", "dst", "src_dir_fd", "dst_dir_fd", NULL};
Serhiy Storchaka31913912019-03-14 10:32:22 +02001633 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;
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03001636 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
Serhiy Storchaka31913912019-03-14 10:32:22 +02001641 args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 2, 2, 0, argsbuf);
1642 if (!args) {
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03001643 goto exit;
Serhiy Storchaka5dee6552016-06-09 16:16:06 +03001644 }
Serhiy Storchaka31913912019-03-14 10:32:22 +02001645 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 }
1665skip_optional_kwonly:
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03001666 return_value = os_replace_impl(module, &src, &dst, src_dir_fd, dst_dir_fd);
1667
1668exit:
1669 /* Cleanup for src */
1670 path_cleanup(&src);
1671 /* Cleanup for dst */
1672 path_cleanup(&dst);
1673
1674 return return_value;
1675}
1676
1677PyDoc_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 \
Serhiy Storchaka4a934d42018-11-27 11:27:36 +02001689 {"rmdir", (PyCFunction)(void(*)(void))os_rmdir, METH_FASTCALL|METH_KEYWORDS, os_rmdir__doc__},
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03001690
1691static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03001692os_rmdir_impl(PyObject *module, path_t *path, int dir_fd);
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03001693
1694static PyObject *
Serhiy Storchakaa5552f02017-12-15 13:11:11 +02001695os_rmdir(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames)
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03001696{
1697 PyObject *return_value = NULL;
Serhiy Storchaka9171a8b2016-08-14 10:52:18 +03001698 static const char * const _keywords[] = {"path", "dir_fd", NULL};
Serhiy Storchaka31913912019-03-14 10:32:22 +02001699 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;
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03001702 path_t path = PATH_T_INITIALIZE("rmdir", "path", 0, 0);
1703 int dir_fd = DEFAULT_DIR_FD;
1704
Serhiy Storchaka31913912019-03-14 10:32:22 +02001705 args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 1, 1, 0, argsbuf);
1706 if (!args) {
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03001707 goto exit;
Serhiy Storchaka5dee6552016-06-09 16:16:06 +03001708 }
Serhiy Storchaka31913912019-03-14 10:32:22 +02001709 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 }
1718skip_optional_kwonly:
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03001719 return_value = os_rmdir_impl(module, &path, dir_fd);
1720
1721exit:
1722 /* Cleanup for path */
1723 path_cleanup(&path);
1724
1725 return return_value;
1726}
1727
1728#if defined(HAVE_SYSTEM) && defined(MS_WINDOWS)
1729
1730PyDoc_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 \
Serhiy Storchaka4a934d42018-11-27 11:27:36 +02001737 {"system", (PyCFunction)(void(*)(void))os_system, METH_FASTCALL|METH_KEYWORDS, os_system__doc__},
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03001738
1739static long
Serhiy Storchakaafb3e712018-12-14 11:19:51 +02001740os_system_impl(PyObject *module, const Py_UNICODE *command);
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03001741
1742static PyObject *
Serhiy Storchakaa5552f02017-12-15 13:11:11 +02001743os_system(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames)
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03001744{
1745 PyObject *return_value = NULL;
Serhiy Storchaka9171a8b2016-08-14 10:52:18 +03001746 static const char * const _keywords[] = {"command", NULL};
1747 static _PyArg_Parser _parser = {"u:system", _keywords, 0};
Serhiy Storchakaafb3e712018-12-14 11:19:51 +02001748 const Py_UNICODE *command;
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03001749 long _return_value;
1750
Victor Stinner3e1fad62017-01-17 01:29:01 +01001751 if (!_PyArg_ParseStackAndKeywords(args, nargs, kwnames, &_parser,
Serhiy Storchaka5dee6552016-06-09 16:16:06 +03001752 &command)) {
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03001753 goto exit;
Serhiy Storchaka5dee6552016-06-09 16:16:06 +03001754 }
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03001755 _return_value = os_system_impl(module, command);
Serhiy Storchaka5dee6552016-06-09 16:16:06 +03001756 if ((_return_value == -1) && PyErr_Occurred()) {
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03001757 goto exit;
Serhiy Storchaka5dee6552016-06-09 16:16:06 +03001758 }
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03001759 return_value = PyLong_FromLong(_return_value);
1760
1761exit:
1762 return return_value;
1763}
1764
1765#endif /* defined(HAVE_SYSTEM) && defined(MS_WINDOWS) */
1766
1767#if defined(HAVE_SYSTEM) && !defined(MS_WINDOWS)
1768
1769PyDoc_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 \
Serhiy Storchaka4a934d42018-11-27 11:27:36 +02001776 {"system", (PyCFunction)(void(*)(void))os_system, METH_FASTCALL|METH_KEYWORDS, os_system__doc__},
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03001777
1778static long
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03001779os_system_impl(PyObject *module, PyObject *command);
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03001780
1781static PyObject *
Serhiy Storchakaa5552f02017-12-15 13:11:11 +02001782os_system(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames)
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03001783{
1784 PyObject *return_value = NULL;
Serhiy Storchaka9171a8b2016-08-14 10:52:18 +03001785 static const char * const _keywords[] = {"command", NULL};
Serhiy Storchaka31913912019-03-14 10:32:22 +02001786 static _PyArg_Parser _parser = {NULL, _keywords, "system", 0};
1787 PyObject *argsbuf[1];
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03001788 PyObject *command = NULL;
1789 long _return_value;
1790
Serhiy Storchaka31913912019-03-14 10:32:22 +02001791 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)) {
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03001796 goto exit;
Serhiy Storchaka5dee6552016-06-09 16:16:06 +03001797 }
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03001798 _return_value = os_system_impl(module, command);
Serhiy Storchaka5dee6552016-06-09 16:16:06 +03001799 if ((_return_value == -1) && PyErr_Occurred()) {
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03001800 goto exit;
Serhiy Storchaka5dee6552016-06-09 16:16:06 +03001801 }
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03001802 return_value = PyLong_FromLong(_return_value);
1803
1804exit:
1805 /* Cleanup for command */
1806 Py_XDECREF(command);
1807
1808 return return_value;
1809}
1810
1811#endif /* defined(HAVE_SYSTEM) && !defined(MS_WINDOWS) */
1812
1813PyDoc_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 \
Serhiy Storchaka92e8af62015-04-04 00:12:11 +03001820 {"umask", (PyCFunction)os_umask, METH_O, os_umask__doc__},
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03001821
1822static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03001823os_umask_impl(PyObject *module, int mask);
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03001824
1825static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03001826os_umask(PyObject *module, PyObject *arg)
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03001827{
1828 PyObject *return_value = NULL;
1829 int mask;
1830
Serhiy Storchaka32d96a22018-12-25 13:23:47 +02001831 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()) {
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03001838 goto exit;
Serhiy Storchaka5dee6552016-06-09 16:16:06 +03001839 }
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03001840 return_value = os_umask_impl(module, mask);
1841
1842exit:
1843 return return_value;
1844}
1845
1846PyDoc_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 \
Serhiy Storchaka4a934d42018-11-27 11:27:36 +02001858 {"unlink", (PyCFunction)(void(*)(void))os_unlink, METH_FASTCALL|METH_KEYWORDS, os_unlink__doc__},
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03001859
1860static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03001861os_unlink_impl(PyObject *module, path_t *path, int dir_fd);
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03001862
1863static PyObject *
Serhiy Storchakaa5552f02017-12-15 13:11:11 +02001864os_unlink(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames)
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03001865{
1866 PyObject *return_value = NULL;
Serhiy Storchaka9171a8b2016-08-14 10:52:18 +03001867 static const char * const _keywords[] = {"path", "dir_fd", NULL};
Serhiy Storchaka31913912019-03-14 10:32:22 +02001868 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;
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03001871 path_t path = PATH_T_INITIALIZE("unlink", "path", 0, 0);
1872 int dir_fd = DEFAULT_DIR_FD;
1873
Serhiy Storchaka31913912019-03-14 10:32:22 +02001874 args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 1, 1, 0, argsbuf);
1875 if (!args) {
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03001876 goto exit;
Serhiy Storchaka5dee6552016-06-09 16:16:06 +03001877 }
Serhiy Storchaka31913912019-03-14 10:32:22 +02001878 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 }
1887skip_optional_kwonly:
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03001888 return_value = os_unlink_impl(module, &path, dir_fd);
1889
1890exit:
1891 /* Cleanup for path */
1892 path_cleanup(&path);
1893
1894 return return_value;
1895}
1896
1897PyDoc_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 \
Serhiy Storchaka4a934d42018-11-27 11:27:36 +02001909 {"remove", (PyCFunction)(void(*)(void))os_remove, METH_FASTCALL|METH_KEYWORDS, os_remove__doc__},
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03001910
1911static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03001912os_remove_impl(PyObject *module, path_t *path, int dir_fd);
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03001913
1914static PyObject *
Serhiy Storchakaa5552f02017-12-15 13:11:11 +02001915os_remove(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames)
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03001916{
1917 PyObject *return_value = NULL;
Serhiy Storchaka9171a8b2016-08-14 10:52:18 +03001918 static const char * const _keywords[] = {"path", "dir_fd", NULL};
Serhiy Storchaka31913912019-03-14 10:32:22 +02001919 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;
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03001922 path_t path = PATH_T_INITIALIZE("remove", "path", 0, 0);
1923 int dir_fd = DEFAULT_DIR_FD;
1924
Serhiy Storchaka31913912019-03-14 10:32:22 +02001925 args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 1, 1, 0, argsbuf);
1926 if (!args) {
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03001927 goto exit;
Serhiy Storchaka5dee6552016-06-09 16:16:06 +03001928 }
Serhiy Storchaka31913912019-03-14 10:32:22 +02001929 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 }
1938skip_optional_kwonly:
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03001939 return_value = os_remove_impl(module, &path, dir_fd);
1940
1941exit:
1942 /* Cleanup for path */
1943 path_cleanup(&path);
1944
1945 return return_value;
1946}
1947
1948#if defined(HAVE_UNAME)
1949
1950PyDoc_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
1962static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03001963os_uname_impl(PyObject *module);
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03001964
1965static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03001966os_uname(PyObject *module, PyObject *Py_UNUSED(ignored))
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03001967{
1968 return os_uname_impl(module);
1969}
1970
1971#endif /* defined(HAVE_UNAME) */
1972
1973PyDoc_STRVAR(os_utime__doc__,
Serhiy Storchaka279f4462019-09-14 12:24:05 +03001974"utime($module, /, path, times=None, *, ns=<unrepresentable>,\n"
1975" dir_fd=None, follow_symlinks=True)\n"
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03001976"--\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"
Martin Panter0ff89092015-09-09 01:56:53 +00001986"If ns is specified, it must be a tuple (atime_ns, mtime_ns);\n"
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03001987" atime_ns and mtime_ns should be expressed as integer nanoseconds\n"
1988" since the epoch.\n"
Martin Panter0ff89092015-09-09 01:56:53 +00001989"If times is None and ns is unspecified, utime uses the current time.\n"
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03001990"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 \
Serhiy Storchaka4a934d42018-11-27 11:27:36 +02002003 {"utime", (PyCFunction)(void(*)(void))os_utime, METH_FASTCALL|METH_KEYWORDS, os_utime__doc__},
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03002004
2005static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03002006os_utime_impl(PyObject *module, path_t *path, PyObject *times, PyObject *ns,
2007 int dir_fd, int follow_symlinks);
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03002008
2009static PyObject *
Serhiy Storchakaa5552f02017-12-15 13:11:11 +02002010os_utime(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames)
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03002011{
2012 PyObject *return_value = NULL;
Serhiy Storchaka9171a8b2016-08-14 10:52:18 +03002013 static const char * const _keywords[] = {"path", "times", "ns", "dir_fd", "follow_symlinks", NULL};
Serhiy Storchaka31913912019-03-14 10:32:22 +02002014 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;
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03002017 path_t path = PATH_T_INITIALIZE("utime", "path", 0, PATH_UTIME_HAVE_FD);
Serhiy Storchaka279f4462019-09-14 12:24:05 +03002018 PyObject *times = Py_None;
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03002019 PyObject *ns = NULL;
2020 int dir_fd = DEFAULT_DIR_FD;
2021 int follow_symlinks = 1;
2022
Serhiy Storchaka31913912019-03-14 10:32:22 +02002023 args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 1, 2, 0, argsbuf);
2024 if (!args) {
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03002025 goto exit;
Serhiy Storchaka5dee6552016-06-09 16:16:06 +03002026 }
Serhiy Storchaka31913912019-03-14 10:32:22 +02002027 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 }
2039skip_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 }
2061skip_optional_kwonly:
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03002062 return_value = os_utime_impl(module, &path, times, ns, dir_fd, follow_symlinks);
2063
2064exit:
2065 /* Cleanup for path */
2066 path_cleanup(&path);
2067
2068 return return_value;
2069}
2070
2071PyDoc_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 \
Serhiy Storchaka4a934d42018-11-27 11:27:36 +02002078 {"_exit", (PyCFunction)(void(*)(void))os__exit, METH_FASTCALL|METH_KEYWORDS, os__exit__doc__},
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03002079
2080static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03002081os__exit_impl(PyObject *module, int status);
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03002082
2083static PyObject *
Serhiy Storchakaa5552f02017-12-15 13:11:11 +02002084os__exit(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames)
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03002085{
2086 PyObject *return_value = NULL;
Serhiy Storchaka9171a8b2016-08-14 10:52:18 +03002087 static const char * const _keywords[] = {"status", NULL};
Serhiy Storchaka31913912019-03-14 10:32:22 +02002088 static _PyArg_Parser _parser = {NULL, _keywords, "_exit", 0};
2089 PyObject *argsbuf[1];
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03002090 int status;
2091
Serhiy Storchaka31913912019-03-14 10:32:22 +02002092 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()) {
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03002103 goto exit;
Serhiy Storchaka5dee6552016-06-09 16:16:06 +03002104 }
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03002105 return_value = os__exit_impl(module, status);
2106
2107exit:
2108 return return_value;
2109}
2110
2111#if defined(HAVE_EXECV)
2112
2113PyDoc_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 \
Serhiy Storchaka4a934d42018-11-27 11:27:36 +02002125 {"execv", (PyCFunction)(void(*)(void))os_execv, METH_FASTCALL, os_execv__doc__},
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03002126
2127static PyObject *
Steve Dowercc16be82016-09-08 10:35:16 -07002128os_execv_impl(PyObject *module, path_t *path, PyObject *argv);
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03002129
2130static PyObject *
Serhiy Storchakaa5552f02017-12-15 13:11:11 +02002131os_execv(PyObject *module, PyObject *const *args, Py_ssize_t nargs)
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03002132{
2133 PyObject *return_value = NULL;
Steve Dowercc16be82016-09-08 10:35:16 -07002134 path_t path = PATH_T_INITIALIZE("execv", "path", 0, 0);
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03002135 PyObject *argv;
2136
Serhiy Storchaka4fa95912019-01-11 16:01:14 +02002137 if (!_PyArg_CheckPositional("execv", nargs, 2, 2)) {
Victor Stinner259f0e42017-01-17 01:35:17 +01002138 goto exit;
2139 }
Serhiy Storchaka4fa95912019-01-11 16:01:14 +02002140 if (!path_converter(args[0], &path)) {
2141 goto exit;
2142 }
2143 argv = args[1];
Steve Dowercc16be82016-09-08 10:35:16 -07002144 return_value = os_execv_impl(module, &path, argv);
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03002145
2146exit:
2147 /* Cleanup for path */
Steve Dowercc16be82016-09-08 10:35:16 -07002148 path_cleanup(&path);
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03002149
2150 return return_value;
2151}
2152
2153#endif /* defined(HAVE_EXECV) */
2154
2155#if defined(HAVE_EXECV)
2156
2157PyDoc_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 \
Serhiy Storchaka4a934d42018-11-27 11:27:36 +02002171 {"execve", (PyCFunction)(void(*)(void))os_execve, METH_FASTCALL|METH_KEYWORDS, os_execve__doc__},
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03002172
2173static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03002174os_execve_impl(PyObject *module, path_t *path, PyObject *argv, PyObject *env);
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03002175
2176static PyObject *
Serhiy Storchakaa5552f02017-12-15 13:11:11 +02002177os_execve(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames)
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03002178{
2179 PyObject *return_value = NULL;
Serhiy Storchaka9171a8b2016-08-14 10:52:18 +03002180 static const char * const _keywords[] = {"path", "argv", "env", NULL};
Serhiy Storchaka31913912019-03-14 10:32:22 +02002181 static _PyArg_Parser _parser = {NULL, _keywords, "execve", 0};
2182 PyObject *argsbuf[3];
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03002183 path_t path = PATH_T_INITIALIZE("execve", "path", 0, PATH_HAVE_FEXECVE);
2184 PyObject *argv;
2185 PyObject *env;
2186
Serhiy Storchaka31913912019-03-14 10:32:22 +02002187 args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 3, 3, 0, argsbuf);
2188 if (!args) {
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03002189 goto exit;
Serhiy Storchaka5dee6552016-06-09 16:16:06 +03002190 }
Serhiy Storchaka31913912019-03-14 10:32:22 +02002191 if (!path_converter(args[0], &path)) {
2192 goto exit;
2193 }
2194 argv = args[1];
2195 env = args[2];
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03002196 return_value = os_execve_impl(module, &path, argv, env);
2197
2198exit:
2199 /* Cleanup for path */
2200 path_cleanup(&path);
2201
2202 return return_value;
2203}
2204
2205#endif /* defined(HAVE_EXECV) */
2206
Pablo Galindo6c6ddf92018-01-29 01:56:10 +00002207#if defined(HAVE_POSIX_SPAWN)
2208
2209PyDoc_STRVAR(os_posix_spawn__doc__,
Serhiy Storchakad700f972018-09-08 14:48:18 +03002210"posix_spawn($module, path, argv, env, /, *, file_actions=(),\n"
Serhiy Storchaka279f4462019-09-14 12:24:05 +03002211" setpgroup=<unrepresentable>, resetids=False, setsid=False,\n"
2212" setsigmask=(), setsigdef=(), scheduler=<unrepresentable>)\n"
Pablo Galindo6c6ddf92018-01-29 01:56:10 +00002213"--\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"
Pablo Galindo254a4662018-09-07 16:44:24 +01002224" 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"
Joannah Nanjekye80c5dfe2019-02-01 13:05:22 +03002228" 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"
Pablo Galindo254a4662018-09-07 16:44:24 +01002231" 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.");
Pablo Galindo6c6ddf92018-01-29 01:56:10 +00002237
2238#define OS_POSIX_SPAWN_METHODDEF \
Serhiy Storchaka4a934d42018-11-27 11:27:36 +02002239 {"posix_spawn", (PyCFunction)(void(*)(void))os_posix_spawn, METH_FASTCALL|METH_KEYWORDS, os_posix_spawn__doc__},
Pablo Galindo6c6ddf92018-01-29 01:56:10 +00002240
2241static PyObject *
2242os_posix_spawn_impl(PyObject *module, path_t *path, PyObject *argv,
Pablo Galindo254a4662018-09-07 16:44:24 +01002243 PyObject *env, PyObject *file_actions,
Joannah Nanjekye80c5dfe2019-02-01 13:05:22 +03002244 PyObject *setpgroup, int resetids, int setsid,
2245 PyObject *setsigmask, PyObject *setsigdef,
2246 PyObject *scheduler);
Pablo Galindo6c6ddf92018-01-29 01:56:10 +00002247
2248static PyObject *
Pablo Galindo254a4662018-09-07 16:44:24 +01002249os_posix_spawn(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames)
Pablo Galindo6c6ddf92018-01-29 01:56:10 +00002250{
2251 PyObject *return_value = NULL;
Joannah Nanjekye80c5dfe2019-02-01 13:05:22 +03002252 static const char * const _keywords[] = {"", "", "", "file_actions", "setpgroup", "resetids", "setsid", "setsigmask", "setsigdef", "scheduler", NULL};
Serhiy Storchaka31913912019-03-14 10:32:22 +02002253 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;
Pablo Galindo6c6ddf92018-01-29 01:56:10 +00002256 path_t path = PATH_T_INITIALIZE("posix_spawn", "path", 0, 0);
2257 PyObject *argv;
2258 PyObject *env;
Serhiy Storchakad700f972018-09-08 14:48:18 +03002259 PyObject *file_actions = NULL;
Pablo Galindo254a4662018-09-07 16:44:24 +01002260 PyObject *setpgroup = NULL;
2261 int resetids = 0;
Joannah Nanjekye80c5dfe2019-02-01 13:05:22 +03002262 int setsid = 0;
Pablo Galindo254a4662018-09-07 16:44:24 +01002263 PyObject *setsigmask = NULL;
2264 PyObject *setsigdef = NULL;
2265 PyObject *scheduler = NULL;
Pablo Galindo6c6ddf92018-01-29 01:56:10 +00002266
Serhiy Storchaka31913912019-03-14 10:32:22 +02002267 args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 3, 3, 0, argsbuf);
2268 if (!args) {
Pablo Galindo6c6ddf92018-01-29 01:56:10 +00002269 goto exit;
2270 }
Serhiy Storchaka31913912019-03-14 10:32:22 +02002271 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];
2332skip_optional_kwonly:
Joannah Nanjekye80c5dfe2019-02-01 13:05:22 +03002333 return_value = os_posix_spawn_impl(module, &path, argv, env, file_actions, setpgroup, resetids, setsid, setsigmask, setsigdef, scheduler);
Pablo Galindo6c6ddf92018-01-29 01:56:10 +00002334
2335exit:
2336 /* Cleanup for path */
2337 path_cleanup(&path);
2338
2339 return return_value;
2340}
2341
2342#endif /* defined(HAVE_POSIX_SPAWN) */
2343
Joannah Nanjekye92b83222019-01-16 16:29:26 +03002344#if defined(HAVE_POSIX_SPAWNP)
2345
2346PyDoc_STRVAR(os_posix_spawnp__doc__,
2347"posix_spawnp($module, path, argv, env, /, *, file_actions=(),\n"
Serhiy Storchaka279f4462019-09-14 12:24:05 +03002348" setpgroup=<unrepresentable>, resetids=False, setsid=False,\n"
2349" setsigmask=(), setsigdef=(), scheduler=<unrepresentable>)\n"
Joannah Nanjekye92b83222019-01-16 16:29:26 +03002350"--\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"
Joannah Nanjekye80c5dfe2019-02-01 13:05:22 +03002366" setsid\n"
2367" If the value is `True` the POSIX_SPAWN_SETSID or POSIX_SPAWN_SETSID_NP will be activated.\n"
Joannah Nanjekye92b83222019-01-16 16:29:26 +03002368" 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
2378static PyObject *
2379os_posix_spawnp_impl(PyObject *module, path_t *path, PyObject *argv,
2380 PyObject *env, PyObject *file_actions,
Joannah Nanjekye80c5dfe2019-02-01 13:05:22 +03002381 PyObject *setpgroup, int resetids, int setsid,
2382 PyObject *setsigmask, PyObject *setsigdef,
2383 PyObject *scheduler);
Joannah Nanjekye92b83222019-01-16 16:29:26 +03002384
2385static PyObject *
2386os_posix_spawnp(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames)
2387{
2388 PyObject *return_value = NULL;
Joannah Nanjekye80c5dfe2019-02-01 13:05:22 +03002389 static const char * const _keywords[] = {"", "", "", "file_actions", "setpgroup", "resetids", "setsid", "setsigmask", "setsigdef", "scheduler", NULL};
Serhiy Storchaka31913912019-03-14 10:32:22 +02002390 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;
Joannah Nanjekye92b83222019-01-16 16:29:26 +03002393 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;
Joannah Nanjekye80c5dfe2019-02-01 13:05:22 +03002399 int setsid = 0;
Joannah Nanjekye92b83222019-01-16 16:29:26 +03002400 PyObject *setsigmask = NULL;
2401 PyObject *setsigdef = NULL;
2402 PyObject *scheduler = NULL;
2403
Serhiy Storchaka31913912019-03-14 10:32:22 +02002404 args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 3, 3, 0, argsbuf);
2405 if (!args) {
Joannah Nanjekye92b83222019-01-16 16:29:26 +03002406 goto exit;
2407 }
Serhiy Storchaka31913912019-03-14 10:32:22 +02002408 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];
2469skip_optional_kwonly:
Joannah Nanjekye80c5dfe2019-02-01 13:05:22 +03002470 return_value = os_posix_spawnp_impl(module, &path, argv, env, file_actions, setpgroup, resetids, setsid, setsigmask, setsigdef, scheduler);
Joannah Nanjekye92b83222019-01-16 16:29:26 +03002471
2472exit:
2473 /* Cleanup for path */
2474 path_cleanup(&path);
2475
2476 return return_value;
2477}
2478
2479#endif /* defined(HAVE_POSIX_SPAWNP) */
2480
pxinwrf2d7ac72019-05-21 18:46:37 +08002481#if (defined(HAVE_SPAWNV) || defined(HAVE_WSPAWNV) || defined(HAVE_RTPSPAWN))
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03002482
2483PyDoc_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 \
Serhiy Storchaka4a934d42018-11-27 11:27:36 +02002497 {"spawnv", (PyCFunction)(void(*)(void))os_spawnv, METH_FASTCALL, os_spawnv__doc__},
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03002498
2499static PyObject *
Steve Dowercc16be82016-09-08 10:35:16 -07002500os_spawnv_impl(PyObject *module, int mode, path_t *path, PyObject *argv);
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03002501
2502static PyObject *
Serhiy Storchakaa5552f02017-12-15 13:11:11 +02002503os_spawnv(PyObject *module, PyObject *const *args, Py_ssize_t nargs)
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03002504{
2505 PyObject *return_value = NULL;
2506 int mode;
Steve Dowercc16be82016-09-08 10:35:16 -07002507 path_t path = PATH_T_INITIALIZE("spawnv", "path", 0, 0);
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03002508 PyObject *argv;
2509
Serhiy Storchaka4fa95912019-01-11 16:01:14 +02002510 if (!_PyArg_CheckPositional("spawnv", nargs, 3, 3)) {
Victor Stinner259f0e42017-01-17 01:35:17 +01002511 goto exit;
2512 }
Serhiy Storchaka4fa95912019-01-11 16:01:14 +02002513 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];
Steve Dowercc16be82016-09-08 10:35:16 -07002526 return_value = os_spawnv_impl(module, mode, &path, argv);
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03002527
2528exit:
2529 /* Cleanup for path */
Steve Dowercc16be82016-09-08 10:35:16 -07002530 path_cleanup(&path);
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03002531
2532 return return_value;
2533}
2534
pxinwrf2d7ac72019-05-21 18:46:37 +08002535#endif /* (defined(HAVE_SPAWNV) || defined(HAVE_WSPAWNV) || defined(HAVE_RTPSPAWN)) */
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03002536
pxinwrf2d7ac72019-05-21 18:46:37 +08002537#if (defined(HAVE_SPAWNV) || defined(HAVE_WSPAWNV) || defined(HAVE_RTPSPAWN))
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03002538
2539PyDoc_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 \
Serhiy Storchaka4a934d42018-11-27 11:27:36 +02002555 {"spawnve", (PyCFunction)(void(*)(void))os_spawnve, METH_FASTCALL, os_spawnve__doc__},
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03002556
2557static PyObject *
Steve Dowercc16be82016-09-08 10:35:16 -07002558os_spawnve_impl(PyObject *module, int mode, path_t *path, PyObject *argv,
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03002559 PyObject *env);
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03002560
2561static PyObject *
Serhiy Storchakaa5552f02017-12-15 13:11:11 +02002562os_spawnve(PyObject *module, PyObject *const *args, Py_ssize_t nargs)
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03002563{
2564 PyObject *return_value = NULL;
2565 int mode;
Steve Dowercc16be82016-09-08 10:35:16 -07002566 path_t path = PATH_T_INITIALIZE("spawnve", "path", 0, 0);
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03002567 PyObject *argv;
2568 PyObject *env;
2569
Serhiy Storchaka4fa95912019-01-11 16:01:14 +02002570 if (!_PyArg_CheckPositional("spawnve", nargs, 4, 4)) {
Victor Stinner259f0e42017-01-17 01:35:17 +01002571 goto exit;
2572 }
Serhiy Storchaka4fa95912019-01-11 16:01:14 +02002573 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];
Steve Dowercc16be82016-09-08 10:35:16 -07002587 return_value = os_spawnve_impl(module, mode, &path, argv, env);
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03002588
2589exit:
2590 /* Cleanup for path */
Steve Dowercc16be82016-09-08 10:35:16 -07002591 path_cleanup(&path);
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03002592
2593 return return_value;
2594}
2595
pxinwrf2d7ac72019-05-21 18:46:37 +08002596#endif /* (defined(HAVE_SPAWNV) || defined(HAVE_WSPAWNV) || defined(HAVE_RTPSPAWN)) */
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03002597
Antoine Pitrou346cbd32017-05-27 17:50:54 +02002598#if defined(HAVE_FORK)
2599
2600PyDoc_STRVAR(os_register_at_fork__doc__,
Serhiy Storchaka279f4462019-09-14 12:24:05 +03002601"register_at_fork($module, /, *, before=<unrepresentable>,\n"
2602" after_in_child=<unrepresentable>,\n"
2603" after_in_parent=<unrepresentable>)\n"
Antoine Pitrou346cbd32017-05-27 17:50:54 +02002604"--\n"
2605"\n"
Gregory P. Smith163468a2017-05-29 10:03:41 -07002606"Register callables to be called when forking a new process.\n"
Antoine Pitrou346cbd32017-05-27 17:50:54 +02002607"\n"
Gregory P. Smith163468a2017-05-29 10:03:41 -07002608" 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"
Antoine Pitrou346cbd32017-05-27 17:50:54 +02002614"\n"
Gregory P. Smith163468a2017-05-29 10:03:41 -07002615"\'before\' callbacks are called in reverse order.\n"
2616"\'after_in_child\' and \'after_in_parent\' callbacks are called in order.");
Antoine Pitrou346cbd32017-05-27 17:50:54 +02002617
2618#define OS_REGISTER_AT_FORK_METHODDEF \
Serhiy Storchaka4a934d42018-11-27 11:27:36 +02002619 {"register_at_fork", (PyCFunction)(void(*)(void))os_register_at_fork, METH_FASTCALL|METH_KEYWORDS, os_register_at_fork__doc__},
Antoine Pitrou346cbd32017-05-27 17:50:54 +02002620
2621static PyObject *
Gregory P. Smith163468a2017-05-29 10:03:41 -07002622os_register_at_fork_impl(PyObject *module, PyObject *before,
2623 PyObject *after_in_child, PyObject *after_in_parent);
Antoine Pitrou346cbd32017-05-27 17:50:54 +02002624
2625static PyObject *
Serhiy Storchakaa5552f02017-12-15 13:11:11 +02002626os_register_at_fork(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames)
Antoine Pitrou346cbd32017-05-27 17:50:54 +02002627{
2628 PyObject *return_value = NULL;
Gregory P. Smith163468a2017-05-29 10:03:41 -07002629 static const char * const _keywords[] = {"before", "after_in_child", "after_in_parent", NULL};
Serhiy Storchaka31913912019-03-14 10:32:22 +02002630 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;
Gregory P. Smith163468a2017-05-29 10:03:41 -07002633 PyObject *before = NULL;
2634 PyObject *after_in_child = NULL;
2635 PyObject *after_in_parent = NULL;
Antoine Pitrou346cbd32017-05-27 17:50:54 +02002636
Serhiy Storchaka31913912019-03-14 10:32:22 +02002637 args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 0, 0, 0, argsbuf);
2638 if (!args) {
Antoine Pitrou346cbd32017-05-27 17:50:54 +02002639 goto exit;
2640 }
Serhiy Storchaka31913912019-03-14 10:32:22 +02002641 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];
2657skip_optional_kwonly:
Gregory P. Smith163468a2017-05-29 10:03:41 -07002658 return_value = os_register_at_fork_impl(module, before, after_in_child, after_in_parent);
Antoine Pitrou346cbd32017-05-27 17:50:54 +02002659
2660exit:
2661 return return_value;
2662}
2663
2664#endif /* defined(HAVE_FORK) */
2665
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03002666#if defined(HAVE_FORK1)
2667
2668PyDoc_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
2679static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03002680os_fork1_impl(PyObject *module);
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03002681
2682static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03002683os_fork1(PyObject *module, PyObject *Py_UNUSED(ignored))
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03002684{
2685 return os_fork1_impl(module);
2686}
2687
2688#endif /* defined(HAVE_FORK1) */
2689
2690#if defined(HAVE_FORK)
2691
2692PyDoc_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
2703static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03002704os_fork_impl(PyObject *module);
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03002705
2706static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03002707os_fork(PyObject *module, PyObject *Py_UNUSED(ignored))
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03002708{
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
2716PyDoc_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 \
Serhiy Storchaka4a934d42018-11-27 11:27:36 +02002723 {"sched_get_priority_max", (PyCFunction)(void(*)(void))os_sched_get_priority_max, METH_FASTCALL|METH_KEYWORDS, os_sched_get_priority_max__doc__},
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03002724
2725static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03002726os_sched_get_priority_max_impl(PyObject *module, int policy);
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03002727
2728static PyObject *
Serhiy Storchakaa5552f02017-12-15 13:11:11 +02002729os_sched_get_priority_max(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames)
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03002730{
2731 PyObject *return_value = NULL;
Serhiy Storchaka9171a8b2016-08-14 10:52:18 +03002732 static const char * const _keywords[] = {"policy", NULL};
Serhiy Storchaka31913912019-03-14 10:32:22 +02002733 static _PyArg_Parser _parser = {NULL, _keywords, "sched_get_priority_max", 0};
2734 PyObject *argsbuf[1];
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03002735 int policy;
2736
Serhiy Storchaka31913912019-03-14 10:32:22 +02002737 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()) {
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03002748 goto exit;
Serhiy Storchaka5dee6552016-06-09 16:16:06 +03002749 }
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03002750 return_value = os_sched_get_priority_max_impl(module, policy);
2751
2752exit:
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
2760PyDoc_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 \
Serhiy Storchaka4a934d42018-11-27 11:27:36 +02002767 {"sched_get_priority_min", (PyCFunction)(void(*)(void))os_sched_get_priority_min, METH_FASTCALL|METH_KEYWORDS, os_sched_get_priority_min__doc__},
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03002768
2769static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03002770os_sched_get_priority_min_impl(PyObject *module, int policy);
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03002771
2772static PyObject *
Serhiy Storchakaa5552f02017-12-15 13:11:11 +02002773os_sched_get_priority_min(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames)
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03002774{
2775 PyObject *return_value = NULL;
Serhiy Storchaka9171a8b2016-08-14 10:52:18 +03002776 static const char * const _keywords[] = {"policy", NULL};
Serhiy Storchaka31913912019-03-14 10:32:22 +02002777 static _PyArg_Parser _parser = {NULL, _keywords, "sched_get_priority_min", 0};
2778 PyObject *argsbuf[1];
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03002779 int policy;
2780
Serhiy Storchaka31913912019-03-14 10:32:22 +02002781 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()) {
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03002792 goto exit;
Serhiy Storchaka5dee6552016-06-09 16:16:06 +03002793 }
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03002794 return_value = os_sched_get_priority_min_impl(module, policy);
2795
2796exit:
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
2804PyDoc_STRVAR(os_sched_getscheduler__doc__,
2805"sched_getscheduler($module, pid, /)\n"
2806"--\n"
2807"\n"
Min ho Kimc4cacc82019-07-31 08:16:13 +10002808"Get the scheduling policy for the process identified by pid.\n"
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03002809"\n"
2810"Passing 0 for pid returns the scheduling policy for the calling process.");
2811
2812#define OS_SCHED_GETSCHEDULER_METHODDEF \
Serhiy Storchaka92e8af62015-04-04 00:12:11 +03002813 {"sched_getscheduler", (PyCFunction)os_sched_getscheduler, METH_O, os_sched_getscheduler__doc__},
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03002814
2815static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03002816os_sched_getscheduler_impl(PyObject *module, pid_t pid);
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03002817
2818static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03002819os_sched_getscheduler(PyObject *module, PyObject *arg)
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03002820{
2821 PyObject *return_value = NULL;
2822 pid_t pid;
2823
Serhiy Storchaka5dee6552016-06-09 16:16:06 +03002824 if (!PyArg_Parse(arg, "" _Py_PARSE_PID ":sched_getscheduler", &pid)) {
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03002825 goto exit;
Serhiy Storchaka5dee6552016-06-09 16:16:06 +03002826 }
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03002827 return_value = os_sched_getscheduler_impl(module, pid);
2828
2829exit:
2830 return return_value;
2831}
2832
2833#endif /* defined(HAVE_SCHED_H) && defined(HAVE_SCHED_SETSCHEDULER) */
2834
William Orr81574b82018-10-01 22:19:56 -07002835#if defined(HAVE_SCHED_H) && (defined(HAVE_SCHED_SETPARAM) || defined(HAVE_SCHED_SETSCHEDULER) || defined(POSIX_SPAWN_SETSCHEDULER) || defined(POSIX_SPAWN_SETSCHEDPARAM))
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03002836
2837PyDoc_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
2846static PyObject *
2847os_sched_param_impl(PyTypeObject *type, PyObject *sched_priority);
2848
2849static PyObject *
2850os_sched_param(PyTypeObject *type, PyObject *args, PyObject *kwargs)
2851{
2852 PyObject *return_value = NULL;
Serhiy Storchaka9171a8b2016-08-14 10:52:18 +03002853 static const char * const _keywords[] = {"sched_priority", NULL};
Serhiy Storchaka31913912019-03-14 10:32:22 +02002854 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);
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03002858 PyObject *sched_priority;
2859
Serhiy Storchaka31913912019-03-14 10:32:22 +02002860 fastargs = _PyArg_UnpackKeywords(_PyTuple_CAST(args)->ob_item, nargs, kwargs, NULL, &_parser, 1, 1, 0, argsbuf);
2861 if (!fastargs) {
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03002862 goto exit;
Serhiy Storchaka5dee6552016-06-09 16:16:06 +03002863 }
Serhiy Storchaka31913912019-03-14 10:32:22 +02002864 sched_priority = fastargs[0];
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03002865 return_value = os_sched_param_impl(type, sched_priority);
2866
2867exit:
2868 return return_value;
2869}
2870
William Orr81574b82018-10-01 22:19:56 -07002871#endif /* defined(HAVE_SCHED_H) && (defined(HAVE_SCHED_SETPARAM) || defined(HAVE_SCHED_SETSCHEDULER) || defined(POSIX_SPAWN_SETSCHEDULER) || defined(POSIX_SPAWN_SETSCHEDPARAM)) */
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03002872
2873#if defined(HAVE_SCHED_H) && defined(HAVE_SCHED_SETSCHEDULER)
2874
2875PyDoc_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 \
Serhiy Storchaka4a934d42018-11-27 11:27:36 +02002885 {"sched_setscheduler", (PyCFunction)(void(*)(void))os_sched_setscheduler, METH_FASTCALL, os_sched_setscheduler__doc__},
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03002886
2887static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03002888os_sched_setscheduler_impl(PyObject *module, pid_t pid, int policy,
Larry Hastings89964c42015-04-14 18:07:59 -04002889 struct sched_param *param);
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03002890
2891static PyObject *
Serhiy Storchakaa5552f02017-12-15 13:11:11 +02002892os_sched_setscheduler(PyObject *module, PyObject *const *args, Py_ssize_t nargs)
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03002893{
2894 PyObject *return_value = NULL;
2895 pid_t pid;
2896 int policy;
2897 struct sched_param param;
2898
Sylvain74453812017-06-10 06:51:48 +02002899 if (!_PyArg_ParseStack(args, nargs, "" _Py_PARSE_PID "iO&:sched_setscheduler",
2900 &pid, &policy, convert_sched_param, &param)) {
Victor Stinner259f0e42017-01-17 01:35:17 +01002901 goto exit;
2902 }
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03002903 return_value = os_sched_setscheduler_impl(module, pid, policy, &param);
2904
2905exit:
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
2913PyDoc_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 \
Serhiy Storchaka92e8af62015-04-04 00:12:11 +03002923 {"sched_getparam", (PyCFunction)os_sched_getparam, METH_O, os_sched_getparam__doc__},
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03002924
2925static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03002926os_sched_getparam_impl(PyObject *module, pid_t pid);
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03002927
2928static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03002929os_sched_getparam(PyObject *module, PyObject *arg)
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03002930{
2931 PyObject *return_value = NULL;
2932 pid_t pid;
2933
Serhiy Storchaka5dee6552016-06-09 16:16:06 +03002934 if (!PyArg_Parse(arg, "" _Py_PARSE_PID ":sched_getparam", &pid)) {
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03002935 goto exit;
Serhiy Storchaka5dee6552016-06-09 16:16:06 +03002936 }
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03002937 return_value = os_sched_getparam_impl(module, pid);
2938
2939exit:
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
2947PyDoc_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 \
Serhiy Storchaka4a934d42018-11-27 11:27:36 +02002957 {"sched_setparam", (PyCFunction)(void(*)(void))os_sched_setparam, METH_FASTCALL, os_sched_setparam__doc__},
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03002958
2959static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03002960os_sched_setparam_impl(PyObject *module, pid_t pid,
Larry Hastings89964c42015-04-14 18:07:59 -04002961 struct sched_param *param);
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03002962
2963static PyObject *
Serhiy Storchakaa5552f02017-12-15 13:11:11 +02002964os_sched_setparam(PyObject *module, PyObject *const *args, Py_ssize_t nargs)
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03002965{
2966 PyObject *return_value = NULL;
2967 pid_t pid;
2968 struct sched_param param;
2969
Sylvain74453812017-06-10 06:51:48 +02002970 if (!_PyArg_ParseStack(args, nargs, "" _Py_PARSE_PID "O&:sched_setparam",
2971 &pid, convert_sched_param, &param)) {
Victor Stinner259f0e42017-01-17 01:35:17 +01002972 goto exit;
2973 }
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03002974 return_value = os_sched_setparam_impl(module, pid, &param);
2975
2976exit:
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
2984PyDoc_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 \
Serhiy Storchaka92e8af62015-04-04 00:12:11 +03002993 {"sched_rr_get_interval", (PyCFunction)os_sched_rr_get_interval, METH_O, os_sched_rr_get_interval__doc__},
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03002994
2995static double
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03002996os_sched_rr_get_interval_impl(PyObject *module, pid_t pid);
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03002997
2998static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03002999os_sched_rr_get_interval(PyObject *module, PyObject *arg)
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03003000{
3001 PyObject *return_value = NULL;
3002 pid_t pid;
3003 double _return_value;
3004
Serhiy Storchaka5dee6552016-06-09 16:16:06 +03003005 if (!PyArg_Parse(arg, "" _Py_PARSE_PID ":sched_rr_get_interval", &pid)) {
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03003006 goto exit;
Serhiy Storchaka5dee6552016-06-09 16:16:06 +03003007 }
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03003008 _return_value = os_sched_rr_get_interval_impl(module, pid);
Serhiy Storchaka5dee6552016-06-09 16:16:06 +03003009 if ((_return_value == -1.0) && PyErr_Occurred()) {
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03003010 goto exit;
Serhiy Storchaka5dee6552016-06-09 16:16:06 +03003011 }
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03003012 return_value = PyFloat_FromDouble(_return_value);
3013
3014exit:
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
3022PyDoc_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
3031static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03003032os_sched_yield_impl(PyObject *module);
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03003033
3034static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03003035os_sched_yield(PyObject *module, PyObject *Py_UNUSED(ignored))
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03003036{
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
3044PyDoc_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 \
Serhiy Storchaka4a934d42018-11-27 11:27:36 +02003053 {"sched_setaffinity", (PyCFunction)(void(*)(void))os_sched_setaffinity, METH_FASTCALL, os_sched_setaffinity__doc__},
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03003054
3055static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03003056os_sched_setaffinity_impl(PyObject *module, pid_t pid, PyObject *mask);
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03003057
3058static PyObject *
Serhiy Storchakaa5552f02017-12-15 13:11:11 +02003059os_sched_setaffinity(PyObject *module, PyObject *const *args, Py_ssize_t nargs)
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03003060{
3061 PyObject *return_value = NULL;
3062 pid_t pid;
3063 PyObject *mask;
3064
Sylvain74453812017-06-10 06:51:48 +02003065 if (!_PyArg_ParseStack(args, nargs, "" _Py_PARSE_PID "O:sched_setaffinity",
3066 &pid, &mask)) {
Victor Stinner259f0e42017-01-17 01:35:17 +01003067 goto exit;
3068 }
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03003069 return_value = os_sched_setaffinity_impl(module, pid, mask);
3070
3071exit:
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
3079PyDoc_STRVAR(os_sched_getaffinity__doc__,
3080"sched_getaffinity($module, pid, /)\n"
3081"--\n"
3082"\n"
Charles-François Natali80d62e62015-08-13 20:37:08 +01003083"Return the affinity of the process identified by pid (or the current process if zero).\n"
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03003084"\n"
3085"The affinity is returned as a set of CPU identifiers.");
3086
3087#define OS_SCHED_GETAFFINITY_METHODDEF \
Serhiy Storchaka92e8af62015-04-04 00:12:11 +03003088 {"sched_getaffinity", (PyCFunction)os_sched_getaffinity, METH_O, os_sched_getaffinity__doc__},
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03003089
3090static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03003091os_sched_getaffinity_impl(PyObject *module, pid_t pid);
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03003092
3093static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03003094os_sched_getaffinity(PyObject *module, PyObject *arg)
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03003095{
3096 PyObject *return_value = NULL;
3097 pid_t pid;
3098
Serhiy Storchaka5dee6552016-06-09 16:16:06 +03003099 if (!PyArg_Parse(arg, "" _Py_PARSE_PID ":sched_getaffinity", &pid)) {
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03003100 goto exit;
Serhiy Storchaka5dee6552016-06-09 16:16:06 +03003101 }
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03003102 return_value = os_sched_getaffinity_impl(module, pid);
3103
3104exit:
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
3112PyDoc_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
3124static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03003125os_openpty_impl(PyObject *module);
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03003126
3127static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03003128os_openpty(PyObject *module, PyObject *Py_UNUSED(ignored))
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03003129{
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
3137PyDoc_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
3151static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03003152os_forkpty_impl(PyObject *module);
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03003153
3154static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03003155os_forkpty(PyObject *module, PyObject *Py_UNUSED(ignored))
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03003156{
3157 return os_forkpty_impl(module);
3158}
3159
3160#endif /* defined(HAVE_FORKPTY) */
3161
3162#if defined(HAVE_GETEGID)
3163
3164PyDoc_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
3173static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03003174os_getegid_impl(PyObject *module);
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03003175
3176static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03003177os_getegid(PyObject *module, PyObject *Py_UNUSED(ignored))
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03003178{
3179 return os_getegid_impl(module);
3180}
3181
3182#endif /* defined(HAVE_GETEGID) */
3183
3184#if defined(HAVE_GETEUID)
3185
3186PyDoc_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
3195static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03003196os_geteuid_impl(PyObject *module);
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03003197
3198static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03003199os_geteuid(PyObject *module, PyObject *Py_UNUSED(ignored))
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03003200{
3201 return os_geteuid_impl(module);
3202}
3203
3204#endif /* defined(HAVE_GETEUID) */
3205
3206#if defined(HAVE_GETGID)
3207
3208PyDoc_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
3217static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03003218os_getgid_impl(PyObject *module);
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03003219
3220static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03003221os_getgid(PyObject *module, PyObject *Py_UNUSED(ignored))
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03003222{
3223 return os_getgid_impl(module);
3224}
3225
3226#endif /* defined(HAVE_GETGID) */
3227
Berker Peksag39404992016-09-15 20:45:16 +03003228#if defined(HAVE_GETPID)
3229
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03003230PyDoc_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
3239static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03003240os_getpid_impl(PyObject *module);
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03003241
3242static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03003243os_getpid(PyObject *module, PyObject *Py_UNUSED(ignored))
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03003244{
3245 return os_getpid_impl(module);
3246}
3247
Berker Peksag39404992016-09-15 20:45:16 +03003248#endif /* defined(HAVE_GETPID) */
3249
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03003250#if defined(HAVE_GETGROUPS)
3251
3252PyDoc_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
3261static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03003262os_getgroups_impl(PyObject *module);
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03003263
3264static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03003265os_getgroups(PyObject *module, PyObject *Py_UNUSED(ignored))
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03003266{
3267 return os_getgroups_impl(module);
3268}
3269
3270#endif /* defined(HAVE_GETGROUPS) */
3271
3272#if defined(HAVE_GETPGID)
3273
3274PyDoc_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 \
Serhiy Storchaka4a934d42018-11-27 11:27:36 +02003281 {"getpgid", (PyCFunction)(void(*)(void))os_getpgid, METH_FASTCALL|METH_KEYWORDS, os_getpgid__doc__},
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03003282
3283static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03003284os_getpgid_impl(PyObject *module, pid_t pid);
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03003285
3286static PyObject *
Serhiy Storchakaa5552f02017-12-15 13:11:11 +02003287os_getpgid(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames)
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03003288{
3289 PyObject *return_value = NULL;
Serhiy Storchaka9171a8b2016-08-14 10:52:18 +03003290 static const char * const _keywords[] = {"pid", NULL};
3291 static _PyArg_Parser _parser = {"" _Py_PARSE_PID ":getpgid", _keywords, 0};
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03003292 pid_t pid;
3293
Victor Stinner3e1fad62017-01-17 01:29:01 +01003294 if (!_PyArg_ParseStackAndKeywords(args, nargs, kwnames, &_parser,
Serhiy Storchaka5dee6552016-06-09 16:16:06 +03003295 &pid)) {
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03003296 goto exit;
Serhiy Storchaka5dee6552016-06-09 16:16:06 +03003297 }
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03003298 return_value = os_getpgid_impl(module, pid);
3299
3300exit:
3301 return return_value;
3302}
3303
3304#endif /* defined(HAVE_GETPGID) */
3305
3306#if defined(HAVE_GETPGRP)
3307
3308PyDoc_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
3317static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03003318os_getpgrp_impl(PyObject *module);
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03003319
3320static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03003321os_getpgrp(PyObject *module, PyObject *Py_UNUSED(ignored))
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03003322{
3323 return os_getpgrp_impl(module);
3324}
3325
3326#endif /* defined(HAVE_GETPGRP) */
3327
3328#if defined(HAVE_SETPGRP)
3329
3330PyDoc_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
3339static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03003340os_setpgrp_impl(PyObject *module);
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03003341
3342static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03003343os_setpgrp(PyObject *module, PyObject *Py_UNUSED(ignored))
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03003344{
3345 return os_setpgrp_impl(module);
3346}
3347
3348#endif /* defined(HAVE_SETPGRP) */
3349
3350#if defined(HAVE_GETPPID)
3351
3352PyDoc_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
3364static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03003365os_getppid_impl(PyObject *module);
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03003366
3367static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03003368os_getppid(PyObject *module, PyObject *Py_UNUSED(ignored))
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03003369{
3370 return os_getppid_impl(module);
3371}
3372
3373#endif /* defined(HAVE_GETPPID) */
3374
3375#if defined(HAVE_GETLOGIN)
3376
3377PyDoc_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
3386static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03003387os_getlogin_impl(PyObject *module);
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03003388
3389static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03003390os_getlogin(PyObject *module, PyObject *Py_UNUSED(ignored))
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03003391{
3392 return os_getlogin_impl(module);
3393}
3394
3395#endif /* defined(HAVE_GETLOGIN) */
3396
3397#if defined(HAVE_GETUID)
3398
3399PyDoc_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
3408static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03003409os_getuid_impl(PyObject *module);
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03003410
3411static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03003412os_getuid(PyObject *module, PyObject *Py_UNUSED(ignored))
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03003413{
3414 return os_getuid_impl(module);
3415}
3416
3417#endif /* defined(HAVE_GETUID) */
3418
3419#if defined(HAVE_KILL)
3420
3421PyDoc_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 \
Serhiy Storchaka4a934d42018-11-27 11:27:36 +02003428 {"kill", (PyCFunction)(void(*)(void))os_kill, METH_FASTCALL, os_kill__doc__},
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03003429
3430static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03003431os_kill_impl(PyObject *module, pid_t pid, Py_ssize_t signal);
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03003432
3433static PyObject *
Serhiy Storchakaa5552f02017-12-15 13:11:11 +02003434os_kill(PyObject *module, PyObject *const *args, Py_ssize_t nargs)
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03003435{
3436 PyObject *return_value = NULL;
3437 pid_t pid;
3438 Py_ssize_t signal;
3439
Sylvain74453812017-06-10 06:51:48 +02003440 if (!_PyArg_ParseStack(args, nargs, "" _Py_PARSE_PID "n:kill",
3441 &pid, &signal)) {
Victor Stinner259f0e42017-01-17 01:35:17 +01003442 goto exit;
3443 }
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03003444 return_value = os_kill_impl(module, pid, signal);
3445
3446exit:
3447 return return_value;
3448}
3449
3450#endif /* defined(HAVE_KILL) */
3451
3452#if defined(HAVE_KILLPG)
3453
3454PyDoc_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 \
Serhiy Storchaka4a934d42018-11-27 11:27:36 +02003461 {"killpg", (PyCFunction)(void(*)(void))os_killpg, METH_FASTCALL, os_killpg__doc__},
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03003462
3463static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03003464os_killpg_impl(PyObject *module, pid_t pgid, int signal);
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03003465
3466static PyObject *
Serhiy Storchakaa5552f02017-12-15 13:11:11 +02003467os_killpg(PyObject *module, PyObject *const *args, Py_ssize_t nargs)
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03003468{
3469 PyObject *return_value = NULL;
3470 pid_t pgid;
3471 int signal;
3472
Sylvain74453812017-06-10 06:51:48 +02003473 if (!_PyArg_ParseStack(args, nargs, "" _Py_PARSE_PID "i:killpg",
3474 &pgid, &signal)) {
Victor Stinner259f0e42017-01-17 01:35:17 +01003475 goto exit;
3476 }
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03003477 return_value = os_killpg_impl(module, pgid, signal);
3478
3479exit:
3480 return return_value;
3481}
3482
3483#endif /* defined(HAVE_KILLPG) */
3484
3485#if defined(HAVE_PLOCK)
3486
3487PyDoc_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 \
Serhiy Storchaka92e8af62015-04-04 00:12:11 +03003494 {"plock", (PyCFunction)os_plock, METH_O, os_plock__doc__},
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03003495
3496static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03003497os_plock_impl(PyObject *module, int op);
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03003498
3499static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03003500os_plock(PyObject *module, PyObject *arg)
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03003501{
3502 PyObject *return_value = NULL;
3503 int op;
3504
Serhiy Storchaka32d96a22018-12-25 13:23:47 +02003505 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()) {
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03003512 goto exit;
Serhiy Storchaka5dee6552016-06-09 16:16:06 +03003513 }
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03003514 return_value = os_plock_impl(module, op);
3515
3516exit:
3517 return return_value;
3518}
3519
3520#endif /* defined(HAVE_PLOCK) */
3521
3522#if defined(HAVE_SETUID)
3523
3524PyDoc_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 \
Serhiy Storchaka92e8af62015-04-04 00:12:11 +03003531 {"setuid", (PyCFunction)os_setuid, METH_O, os_setuid__doc__},
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03003532
3533static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03003534os_setuid_impl(PyObject *module, uid_t uid);
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03003535
3536static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03003537os_setuid(PyObject *module, PyObject *arg)
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03003538{
3539 PyObject *return_value = NULL;
3540 uid_t uid;
3541
Serhiy Storchaka32d96a22018-12-25 13:23:47 +02003542 if (!_Py_Uid_Converter(arg, &uid)) {
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03003543 goto exit;
Serhiy Storchaka5dee6552016-06-09 16:16:06 +03003544 }
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03003545 return_value = os_setuid_impl(module, uid);
3546
3547exit:
3548 return return_value;
3549}
3550
3551#endif /* defined(HAVE_SETUID) */
3552
3553#if defined(HAVE_SETEUID)
3554
3555PyDoc_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 \
Serhiy Storchaka92e8af62015-04-04 00:12:11 +03003562 {"seteuid", (PyCFunction)os_seteuid, METH_O, os_seteuid__doc__},
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03003563
3564static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03003565os_seteuid_impl(PyObject *module, uid_t euid);
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03003566
3567static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03003568os_seteuid(PyObject *module, PyObject *arg)
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03003569{
3570 PyObject *return_value = NULL;
3571 uid_t euid;
3572
Serhiy Storchaka32d96a22018-12-25 13:23:47 +02003573 if (!_Py_Uid_Converter(arg, &euid)) {
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03003574 goto exit;
Serhiy Storchaka5dee6552016-06-09 16:16:06 +03003575 }
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03003576 return_value = os_seteuid_impl(module, euid);
3577
3578exit:
3579 return return_value;
3580}
3581
3582#endif /* defined(HAVE_SETEUID) */
3583
3584#if defined(HAVE_SETEGID)
3585
3586PyDoc_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 \
Serhiy Storchaka92e8af62015-04-04 00:12:11 +03003593 {"setegid", (PyCFunction)os_setegid, METH_O, os_setegid__doc__},
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03003594
3595static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03003596os_setegid_impl(PyObject *module, gid_t egid);
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03003597
3598static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03003599os_setegid(PyObject *module, PyObject *arg)
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03003600{
3601 PyObject *return_value = NULL;
3602 gid_t egid;
3603
Serhiy Storchaka32d96a22018-12-25 13:23:47 +02003604 if (!_Py_Gid_Converter(arg, &egid)) {
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03003605 goto exit;
Serhiy Storchaka5dee6552016-06-09 16:16:06 +03003606 }
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03003607 return_value = os_setegid_impl(module, egid);
3608
3609exit:
3610 return return_value;
3611}
3612
3613#endif /* defined(HAVE_SETEGID) */
3614
3615#if defined(HAVE_SETREUID)
3616
3617PyDoc_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 \
Serhiy Storchaka4a934d42018-11-27 11:27:36 +02003624 {"setreuid", (PyCFunction)(void(*)(void))os_setreuid, METH_FASTCALL, os_setreuid__doc__},
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03003625
3626static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03003627os_setreuid_impl(PyObject *module, uid_t ruid, uid_t euid);
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03003628
3629static PyObject *
Serhiy Storchakaa5552f02017-12-15 13:11:11 +02003630os_setreuid(PyObject *module, PyObject *const *args, Py_ssize_t nargs)
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03003631{
3632 PyObject *return_value = NULL;
3633 uid_t ruid;
3634 uid_t euid;
3635
Serhiy Storchaka4fa95912019-01-11 16:01:14 +02003636 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)) {
Victor Stinner259f0e42017-01-17 01:35:17 +01003643 goto exit;
3644 }
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03003645 return_value = os_setreuid_impl(module, ruid, euid);
3646
3647exit:
3648 return return_value;
3649}
3650
3651#endif /* defined(HAVE_SETREUID) */
3652
3653#if defined(HAVE_SETREGID)
3654
3655PyDoc_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 \
Serhiy Storchaka4a934d42018-11-27 11:27:36 +02003662 {"setregid", (PyCFunction)(void(*)(void))os_setregid, METH_FASTCALL, os_setregid__doc__},
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03003663
3664static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03003665os_setregid_impl(PyObject *module, gid_t rgid, gid_t egid);
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03003666
3667static PyObject *
Serhiy Storchakaa5552f02017-12-15 13:11:11 +02003668os_setregid(PyObject *module, PyObject *const *args, Py_ssize_t nargs)
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03003669{
3670 PyObject *return_value = NULL;
3671 gid_t rgid;
3672 gid_t egid;
3673
Serhiy Storchaka4fa95912019-01-11 16:01:14 +02003674 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)) {
Victor Stinner259f0e42017-01-17 01:35:17 +01003681 goto exit;
3682 }
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03003683 return_value = os_setregid_impl(module, rgid, egid);
3684
3685exit:
3686 return return_value;
3687}
3688
3689#endif /* defined(HAVE_SETREGID) */
3690
3691#if defined(HAVE_SETGID)
3692
3693PyDoc_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 \
Serhiy Storchaka92e8af62015-04-04 00:12:11 +03003700 {"setgid", (PyCFunction)os_setgid, METH_O, os_setgid__doc__},
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03003701
3702static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03003703os_setgid_impl(PyObject *module, gid_t gid);
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03003704
3705static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03003706os_setgid(PyObject *module, PyObject *arg)
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03003707{
3708 PyObject *return_value = NULL;
3709 gid_t gid;
3710
Serhiy Storchaka32d96a22018-12-25 13:23:47 +02003711 if (!_Py_Gid_Converter(arg, &gid)) {
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03003712 goto exit;
Serhiy Storchaka5dee6552016-06-09 16:16:06 +03003713 }
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03003714 return_value = os_setgid_impl(module, gid);
3715
3716exit:
3717 return return_value;
3718}
3719
3720#endif /* defined(HAVE_SETGID) */
3721
3722#if defined(HAVE_SETGROUPS)
3723
3724PyDoc_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
3737PyDoc_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 \
Serhiy Storchaka4a934d42018-11-27 11:27:36 +02003747 {"wait3", (PyCFunction)(void(*)(void))os_wait3, METH_FASTCALL|METH_KEYWORDS, os_wait3__doc__},
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03003748
3749static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03003750os_wait3_impl(PyObject *module, int options);
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03003751
3752static PyObject *
Serhiy Storchakaa5552f02017-12-15 13:11:11 +02003753os_wait3(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames)
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03003754{
3755 PyObject *return_value = NULL;
Serhiy Storchaka9171a8b2016-08-14 10:52:18 +03003756 static const char * const _keywords[] = {"options", NULL};
Serhiy Storchaka31913912019-03-14 10:32:22 +02003757 static _PyArg_Parser _parser = {NULL, _keywords, "wait3", 0};
3758 PyObject *argsbuf[1];
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03003759 int options;
3760
Serhiy Storchaka31913912019-03-14 10:32:22 +02003761 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()) {
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03003772 goto exit;
Serhiy Storchaka5dee6552016-06-09 16:16:06 +03003773 }
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03003774 return_value = os_wait3_impl(module, options);
3775
3776exit:
3777 return return_value;
3778}
3779
3780#endif /* defined(HAVE_WAIT3) */
3781
3782#if defined(HAVE_WAIT4)
3783
3784PyDoc_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 \
Serhiy Storchaka4a934d42018-11-27 11:27:36 +02003794 {"wait4", (PyCFunction)(void(*)(void))os_wait4, METH_FASTCALL|METH_KEYWORDS, os_wait4__doc__},
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03003795
3796static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03003797os_wait4_impl(PyObject *module, pid_t pid, int options);
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03003798
3799static PyObject *
Serhiy Storchakaa5552f02017-12-15 13:11:11 +02003800os_wait4(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames)
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03003801{
3802 PyObject *return_value = NULL;
Serhiy Storchaka9171a8b2016-08-14 10:52:18 +03003803 static const char * const _keywords[] = {"pid", "options", NULL};
3804 static _PyArg_Parser _parser = {"" _Py_PARSE_PID "i:wait4", _keywords, 0};
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03003805 pid_t pid;
3806 int options;
3807
Victor Stinner3e1fad62017-01-17 01:29:01 +01003808 if (!_PyArg_ParseStackAndKeywords(args, nargs, kwnames, &_parser,
Serhiy Storchaka5dee6552016-06-09 16:16:06 +03003809 &pid, &options)) {
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03003810 goto exit;
Serhiy Storchaka5dee6552016-06-09 16:16:06 +03003811 }
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03003812 return_value = os_wait4_impl(module, pid, options);
3813
3814exit:
3815 return return_value;
3816}
3817
3818#endif /* defined(HAVE_WAIT4) */
3819
3820#if (defined(HAVE_WAITID) && !defined(__APPLE__))
3821
3822PyDoc_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 \
Serhiy Storchaka4a934d42018-11-27 11:27:36 +02003840 {"waitid", (PyCFunction)(void(*)(void))os_waitid, METH_FASTCALL, os_waitid__doc__},
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03003841
3842static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03003843os_waitid_impl(PyObject *module, idtype_t idtype, id_t id, int options);
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03003844
3845static PyObject *
Serhiy Storchakaa5552f02017-12-15 13:11:11 +02003846os_waitid(PyObject *module, PyObject *const *args, Py_ssize_t nargs)
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03003847{
3848 PyObject *return_value = NULL;
3849 idtype_t idtype;
3850 id_t id;
3851 int options;
3852
Sylvain74453812017-06-10 06:51:48 +02003853 if (!_PyArg_ParseStack(args, nargs, "i" _Py_PARSE_PID "i:waitid",
3854 &idtype, &id, &options)) {
Victor Stinner259f0e42017-01-17 01:35:17 +01003855 goto exit;
3856 }
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03003857 return_value = os_waitid_impl(module, idtype, id, options);
3858
3859exit:
3860 return return_value;
3861}
3862
3863#endif /* (defined(HAVE_WAITID) && !defined(__APPLE__)) */
3864
3865#if defined(HAVE_WAITPID)
3866
3867PyDoc_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 \
Serhiy Storchaka4a934d42018-11-27 11:27:36 +02003879 {"waitpid", (PyCFunction)(void(*)(void))os_waitpid, METH_FASTCALL, os_waitpid__doc__},
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03003880
3881static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03003882os_waitpid_impl(PyObject *module, pid_t pid, int options);
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03003883
3884static PyObject *
Serhiy Storchakaa5552f02017-12-15 13:11:11 +02003885os_waitpid(PyObject *module, PyObject *const *args, Py_ssize_t nargs)
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03003886{
3887 PyObject *return_value = NULL;
3888 pid_t pid;
3889 int options;
3890
Sylvain74453812017-06-10 06:51:48 +02003891 if (!_PyArg_ParseStack(args, nargs, "" _Py_PARSE_PID "i:waitpid",
3892 &pid, &options)) {
Victor Stinner259f0e42017-01-17 01:35:17 +01003893 goto exit;
3894 }
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03003895 return_value = os_waitpid_impl(module, pid, options);
3896
3897exit:
3898 return return_value;
3899}
3900
3901#endif /* defined(HAVE_WAITPID) */
3902
3903#if defined(HAVE_CWAIT)
3904
3905PyDoc_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 \
Serhiy Storchaka4a934d42018-11-27 11:27:36 +02003917 {"waitpid", (PyCFunction)(void(*)(void))os_waitpid, METH_FASTCALL, os_waitpid__doc__},
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03003918
3919static PyObject *
Victor Stinner581139c2016-09-06 15:54:20 -07003920os_waitpid_impl(PyObject *module, intptr_t pid, int options);
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03003921
3922static PyObject *
Serhiy Storchakaa5552f02017-12-15 13:11:11 +02003923os_waitpid(PyObject *module, PyObject *const *args, Py_ssize_t nargs)
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03003924{
3925 PyObject *return_value = NULL;
Victor Stinner581139c2016-09-06 15:54:20 -07003926 intptr_t pid;
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03003927 int options;
3928
Sylvain74453812017-06-10 06:51:48 +02003929 if (!_PyArg_ParseStack(args, nargs, "" _Py_PARSE_INTPTR "i:waitpid",
3930 &pid, &options)) {
Victor Stinner259f0e42017-01-17 01:35:17 +01003931 goto exit;
3932 }
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03003933 return_value = os_waitpid_impl(module, pid, options);
3934
3935exit:
3936 return return_value;
3937}
3938
3939#endif /* defined(HAVE_CWAIT) */
3940
3941#if defined(HAVE_WAIT)
3942
3943PyDoc_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
3955static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03003956os_wait_impl(PyObject *module);
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03003957
3958static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03003959os_wait(PyObject *module, PyObject *Py_UNUSED(ignored))
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03003960{
3961 return os_wait_impl(module);
3962}
3963
3964#endif /* defined(HAVE_WAIT) */
3965
Serhiy Storchaka12a69db2018-09-17 15:38:27 +03003966#if (defined(HAVE_READLINK) || defined(MS_WINDOWS))
3967
3968PyDoc_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 \
Serhiy Storchaka4a934d42018-11-27 11:27:36 +02003981 {"readlink", (PyCFunction)(void(*)(void))os_readlink, METH_FASTCALL|METH_KEYWORDS, os_readlink__doc__},
Serhiy Storchaka12a69db2018-09-17 15:38:27 +03003982
3983static PyObject *
3984os_readlink_impl(PyObject *module, path_t *path, int dir_fd);
3985
3986static PyObject *
3987os_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};
Serhiy Storchaka31913912019-03-14 10:32:22 +02003991 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;
Serhiy Storchaka12a69db2018-09-17 15:38:27 +03003994 path_t path = PATH_T_INITIALIZE("readlink", "path", 0, 0);
3995 int dir_fd = DEFAULT_DIR_FD;
3996
Serhiy Storchaka31913912019-03-14 10:32:22 +02003997 args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 1, 1, 0, argsbuf);
3998 if (!args) {
Serhiy Storchaka12a69db2018-09-17 15:38:27 +03003999 goto exit;
4000 }
Serhiy Storchaka31913912019-03-14 10:32:22 +02004001 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 }
4010skip_optional_kwonly:
Serhiy Storchaka12a69db2018-09-17 15:38:27 +03004011 return_value = os_readlink_impl(module, &path, dir_fd);
4012
4013exit:
4014 /* Cleanup for path */
4015 path_cleanup(&path);
4016
4017 return return_value;
4018}
4019
4020#endif /* (defined(HAVE_READLINK) || defined(MS_WINDOWS)) */
4021
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03004022#if defined(HAVE_SYMLINK)
4023
4024PyDoc_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 \
Serhiy Storchaka4a934d42018-11-27 11:27:36 +02004041 {"symlink", (PyCFunction)(void(*)(void))os_symlink, METH_FASTCALL|METH_KEYWORDS, os_symlink__doc__},
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03004042
4043static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03004044os_symlink_impl(PyObject *module, path_t *src, path_t *dst,
Larry Hastings89964c42015-04-14 18:07:59 -04004045 int target_is_directory, int dir_fd);
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03004046
4047static PyObject *
Serhiy Storchakaa5552f02017-12-15 13:11:11 +02004048os_symlink(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames)
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03004049{
4050 PyObject *return_value = NULL;
Serhiy Storchaka9171a8b2016-08-14 10:52:18 +03004051 static const char * const _keywords[] = {"src", "dst", "target_is_directory", "dir_fd", NULL};
Serhiy Storchaka31913912019-03-14 10:32:22 +02004052 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;
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03004055 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
Serhiy Storchaka31913912019-03-14 10:32:22 +02004060 args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 2, 3, 0, argsbuf);
4061 if (!args) {
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03004062 goto exit;
Serhiy Storchaka5dee6552016-06-09 16:16:06 +03004063 }
Serhiy Storchaka31913912019-03-14 10:32:22 +02004064 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 }
4082skip_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 }
4089skip_optional_kwonly:
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03004090 return_value = os_symlink_impl(module, &src, &dst, target_is_directory, dir_fd);
4091
4092exit:
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
4105PyDoc_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
4118static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03004119os_times_impl(PyObject *module);
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03004120
4121static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03004122os_times(PyObject *module, PyObject *Py_UNUSED(ignored))
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03004123{
4124 return os_times_impl(module);
4125}
4126
4127#endif /* defined(HAVE_TIMES) */
4128
4129#if defined(HAVE_GETSID)
4130
4131PyDoc_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 \
Serhiy Storchaka92e8af62015-04-04 00:12:11 +03004138 {"getsid", (PyCFunction)os_getsid, METH_O, os_getsid__doc__},
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03004139
4140static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03004141os_getsid_impl(PyObject *module, pid_t pid);
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03004142
4143static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03004144os_getsid(PyObject *module, PyObject *arg)
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03004145{
4146 PyObject *return_value = NULL;
4147 pid_t pid;
4148
Serhiy Storchaka5dee6552016-06-09 16:16:06 +03004149 if (!PyArg_Parse(arg, "" _Py_PARSE_PID ":getsid", &pid)) {
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03004150 goto exit;
Serhiy Storchaka5dee6552016-06-09 16:16:06 +03004151 }
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03004152 return_value = os_getsid_impl(module, pid);
4153
4154exit:
4155 return return_value;
4156}
4157
4158#endif /* defined(HAVE_GETSID) */
4159
4160#if defined(HAVE_SETSID)
4161
4162PyDoc_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
4171static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03004172os_setsid_impl(PyObject *module);
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03004173
4174static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03004175os_setsid(PyObject *module, PyObject *Py_UNUSED(ignored))
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03004176{
4177 return os_setsid_impl(module);
4178}
4179
4180#endif /* defined(HAVE_SETSID) */
4181
4182#if defined(HAVE_SETPGID)
4183
4184PyDoc_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 \
Serhiy Storchaka4a934d42018-11-27 11:27:36 +02004191 {"setpgid", (PyCFunction)(void(*)(void))os_setpgid, METH_FASTCALL, os_setpgid__doc__},
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03004192
4193static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03004194os_setpgid_impl(PyObject *module, pid_t pid, pid_t pgrp);
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03004195
4196static PyObject *
Serhiy Storchakaa5552f02017-12-15 13:11:11 +02004197os_setpgid(PyObject *module, PyObject *const *args, Py_ssize_t nargs)
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03004198{
4199 PyObject *return_value = NULL;
4200 pid_t pid;
4201 pid_t pgrp;
4202
Sylvain74453812017-06-10 06:51:48 +02004203 if (!_PyArg_ParseStack(args, nargs, "" _Py_PARSE_PID "" _Py_PARSE_PID ":setpgid",
4204 &pid, &pgrp)) {
Victor Stinner259f0e42017-01-17 01:35:17 +01004205 goto exit;
4206 }
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03004207 return_value = os_setpgid_impl(module, pid, pgrp);
4208
4209exit:
4210 return return_value;
4211}
4212
4213#endif /* defined(HAVE_SETPGID) */
4214
4215#if defined(HAVE_TCGETPGRP)
4216
4217PyDoc_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 \
Serhiy Storchaka92e8af62015-04-04 00:12:11 +03004224 {"tcgetpgrp", (PyCFunction)os_tcgetpgrp, METH_O, os_tcgetpgrp__doc__},
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03004225
4226static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03004227os_tcgetpgrp_impl(PyObject *module, int fd);
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03004228
4229static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03004230os_tcgetpgrp(PyObject *module, PyObject *arg)
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03004231{
4232 PyObject *return_value = NULL;
4233 int fd;
4234
Serhiy Storchaka32d96a22018-12-25 13:23:47 +02004235 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()) {
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03004242 goto exit;
Serhiy Storchaka5dee6552016-06-09 16:16:06 +03004243 }
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03004244 return_value = os_tcgetpgrp_impl(module, fd);
4245
4246exit:
4247 return return_value;
4248}
4249
4250#endif /* defined(HAVE_TCGETPGRP) */
4251
4252#if defined(HAVE_TCSETPGRP)
4253
4254PyDoc_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 \
Serhiy Storchaka4a934d42018-11-27 11:27:36 +02004261 {"tcsetpgrp", (PyCFunction)(void(*)(void))os_tcsetpgrp, METH_FASTCALL, os_tcsetpgrp__doc__},
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03004262
4263static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03004264os_tcsetpgrp_impl(PyObject *module, int fd, pid_t pgid);
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03004265
4266static PyObject *
Serhiy Storchakaa5552f02017-12-15 13:11:11 +02004267os_tcsetpgrp(PyObject *module, PyObject *const *args, Py_ssize_t nargs)
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03004268{
4269 PyObject *return_value = NULL;
4270 int fd;
4271 pid_t pgid;
4272
Sylvain74453812017-06-10 06:51:48 +02004273 if (!_PyArg_ParseStack(args, nargs, "i" _Py_PARSE_PID ":tcsetpgrp",
4274 &fd, &pgid)) {
Victor Stinner259f0e42017-01-17 01:35:17 +01004275 goto exit;
4276 }
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03004277 return_value = os_tcsetpgrp_impl(module, fd, pgid);
4278
4279exit:
4280 return return_value;
4281}
4282
4283#endif /* defined(HAVE_TCSETPGRP) */
4284
4285PyDoc_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 \
Serhiy Storchaka4a934d42018-11-27 11:27:36 +02004297 {"open", (PyCFunction)(void(*)(void))os_open, METH_FASTCALL|METH_KEYWORDS, os_open__doc__},
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03004298
4299static int
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03004300os_open_impl(PyObject *module, path_t *path, int flags, int mode, int dir_fd);
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03004301
4302static PyObject *
Serhiy Storchakaa5552f02017-12-15 13:11:11 +02004303os_open(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames)
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03004304{
4305 PyObject *return_value = NULL;
Serhiy Storchaka9171a8b2016-08-14 10:52:18 +03004306 static const char * const _keywords[] = {"path", "flags", "mode", "dir_fd", NULL};
Serhiy Storchaka31913912019-03-14 10:32:22 +02004307 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;
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03004310 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
Serhiy Storchaka31913912019-03-14 10:32:22 +02004316 args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 2, 3, 0, argsbuf);
4317 if (!args) {
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03004318 goto exit;
Serhiy Storchaka5dee6552016-06-09 16:16:06 +03004319 }
Serhiy Storchaka31913912019-03-14 10:32:22 +02004320 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 }
4349skip_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 }
4356skip_optional_kwonly:
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03004357 _return_value = os_open_impl(module, &path, flags, mode, dir_fd);
Serhiy Storchaka5dee6552016-06-09 16:16:06 +03004358 if ((_return_value == -1) && PyErr_Occurred()) {
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03004359 goto exit;
Serhiy Storchaka5dee6552016-06-09 16:16:06 +03004360 }
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03004361 return_value = PyLong_FromLong((long)_return_value);
4362
4363exit:
4364 /* Cleanup for path */
4365 path_cleanup(&path);
4366
4367 return return_value;
4368}
4369
4370PyDoc_STRVAR(os_close__doc__,
4371"close($module, /, fd)\n"
4372"--\n"
4373"\n"
4374"Close a file descriptor.");
4375
4376#define OS_CLOSE_METHODDEF \
Serhiy Storchaka4a934d42018-11-27 11:27:36 +02004377 {"close", (PyCFunction)(void(*)(void))os_close, METH_FASTCALL|METH_KEYWORDS, os_close__doc__},
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03004378
4379static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03004380os_close_impl(PyObject *module, int fd);
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03004381
4382static PyObject *
Serhiy Storchakaa5552f02017-12-15 13:11:11 +02004383os_close(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames)
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03004384{
4385 PyObject *return_value = NULL;
Serhiy Storchaka9171a8b2016-08-14 10:52:18 +03004386 static const char * const _keywords[] = {"fd", NULL};
Serhiy Storchaka31913912019-03-14 10:32:22 +02004387 static _PyArg_Parser _parser = {NULL, _keywords, "close", 0};
4388 PyObject *argsbuf[1];
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03004389 int fd;
4390
Serhiy Storchaka31913912019-03-14 10:32:22 +02004391 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()) {
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03004402 goto exit;
Serhiy Storchaka5dee6552016-06-09 16:16:06 +03004403 }
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03004404 return_value = os_close_impl(module, fd);
4405
4406exit:
4407 return return_value;
4408}
4409
4410PyDoc_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 \
Serhiy Storchaka4a934d42018-11-27 11:27:36 +02004417 {"closerange", (PyCFunction)(void(*)(void))os_closerange, METH_FASTCALL, os_closerange__doc__},
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03004418
4419static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03004420os_closerange_impl(PyObject *module, int fd_low, int fd_high);
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03004421
4422static PyObject *
Serhiy Storchakaa5552f02017-12-15 13:11:11 +02004423os_closerange(PyObject *module, PyObject *const *args, Py_ssize_t nargs)
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03004424{
4425 PyObject *return_value = NULL;
4426 int fd_low;
4427 int fd_high;
4428
Serhiy Storchaka4fa95912019-01-11 16:01:14 +02004429 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()) {
Victor Stinner259f0e42017-01-17 01:35:17 +01004448 goto exit;
4449 }
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03004450 return_value = os_closerange_impl(module, fd_low, fd_high);
4451
4452exit:
4453 return return_value;
4454}
4455
4456PyDoc_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 \
Serhiy Storchaka92e8af62015-04-04 00:12:11 +03004463 {"dup", (PyCFunction)os_dup, METH_O, os_dup__doc__},
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03004464
4465static int
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03004466os_dup_impl(PyObject *module, int fd);
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03004467
4468static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03004469os_dup(PyObject *module, PyObject *arg)
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03004470{
4471 PyObject *return_value = NULL;
4472 int fd;
4473 int _return_value;
4474
Serhiy Storchaka32d96a22018-12-25 13:23:47 +02004475 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()) {
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03004482 goto exit;
Serhiy Storchaka5dee6552016-06-09 16:16:06 +03004483 }
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03004484 _return_value = os_dup_impl(module, fd);
Serhiy Storchaka5dee6552016-06-09 16:16:06 +03004485 if ((_return_value == -1) && PyErr_Occurred()) {
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03004486 goto exit;
Serhiy Storchaka5dee6552016-06-09 16:16:06 +03004487 }
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03004488 return_value = PyLong_FromLong((long)_return_value);
4489
4490exit:
4491 return return_value;
4492}
4493
4494PyDoc_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 \
Serhiy Storchaka4a934d42018-11-27 11:27:36 +02004501 {"dup2", (PyCFunction)(void(*)(void))os_dup2, METH_FASTCALL|METH_KEYWORDS, os_dup2__doc__},
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03004502
Benjamin Petersonbbdb17d2017-12-29 13:13:06 -08004503static int
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03004504os_dup2_impl(PyObject *module, int fd, int fd2, int inheritable);
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03004505
4506static PyObject *
Serhiy Storchakaa5552f02017-12-15 13:11:11 +02004507os_dup2(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames)
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03004508{
4509 PyObject *return_value = NULL;
Serhiy Storchaka9171a8b2016-08-14 10:52:18 +03004510 static const char * const _keywords[] = {"fd", "fd2", "inheritable", NULL};
Serhiy Storchaka31913912019-03-14 10:32:22 +02004511 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;
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03004514 int fd;
4515 int fd2;
4516 int inheritable = 1;
Benjamin Petersonbbdb17d2017-12-29 13:13:06 -08004517 int _return_value;
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03004518
Serhiy Storchaka31913912019-03-14 10:32:22 +02004519 args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 2, 3, 0, argsbuf);
4520 if (!args) {
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03004521 goto exit;
Serhiy Storchaka5dee6552016-06-09 16:16:06 +03004522 }
Serhiy Storchaka31913912019-03-14 10:32:22 +02004523 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 }
4548skip_optional_pos:
Benjamin Petersonbbdb17d2017-12-29 13:13:06 -08004549 _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);
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03004554
4555exit:
4556 return return_value;
4557}
4558
4559#if defined(HAVE_LOCKF)
4560
4561PyDoc_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 \
Serhiy Storchaka4a934d42018-11-27 11:27:36 +02004575 {"lockf", (PyCFunction)(void(*)(void))os_lockf, METH_FASTCALL, os_lockf__doc__},
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03004576
4577static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03004578os_lockf_impl(PyObject *module, int fd, int command, Py_off_t length);
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03004579
4580static PyObject *
Serhiy Storchakaa5552f02017-12-15 13:11:11 +02004581os_lockf(PyObject *module, PyObject *const *args, Py_ssize_t nargs)
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03004582{
4583 PyObject *return_value = NULL;
4584 int fd;
4585 int command;
4586 Py_off_t length;
4587
Serhiy Storchaka4fa95912019-01-11 16:01:14 +02004588 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)) {
Victor Stinner259f0e42017-01-17 01:35:17 +01004610 goto exit;
4611 }
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03004612 return_value = os_lockf_impl(module, fd, command, length);
4613
4614exit:
4615 return return_value;
4616}
4617
4618#endif /* defined(HAVE_LOCKF) */
4619
4620PyDoc_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 \
Serhiy Storchaka4a934d42018-11-27 11:27:36 +02004630 {"lseek", (PyCFunction)(void(*)(void))os_lseek, METH_FASTCALL, os_lseek__doc__},
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03004631
4632static Py_off_t
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03004633os_lseek_impl(PyObject *module, int fd, Py_off_t position, int how);
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03004634
4635static PyObject *
Serhiy Storchakaa5552f02017-12-15 13:11:11 +02004636os_lseek(PyObject *module, PyObject *const *args, Py_ssize_t nargs)
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03004637{
4638 PyObject *return_value = NULL;
4639 int fd;
4640 Py_off_t position;
4641 int how;
4642 Py_off_t _return_value;
4643
Serhiy Storchaka4fa95912019-01-11 16:01:14 +02004644 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()) {
Victor Stinner259f0e42017-01-17 01:35:17 +01004666 goto exit;
4667 }
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03004668 _return_value = os_lseek_impl(module, fd, position, how);
Serhiy Storchaka5dee6552016-06-09 16:16:06 +03004669 if ((_return_value == -1) && PyErr_Occurred()) {
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03004670 goto exit;
Serhiy Storchaka5dee6552016-06-09 16:16:06 +03004671 }
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03004672 return_value = PyLong_FromPy_off_t(_return_value);
4673
4674exit:
4675 return return_value;
4676}
4677
4678PyDoc_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 \
Serhiy Storchaka4a934d42018-11-27 11:27:36 +02004685 {"read", (PyCFunction)(void(*)(void))os_read, METH_FASTCALL, os_read__doc__},
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03004686
4687static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03004688os_read_impl(PyObject *module, int fd, Py_ssize_t length);
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03004689
4690static PyObject *
Serhiy Storchakaa5552f02017-12-15 13:11:11 +02004691os_read(PyObject *module, PyObject *const *args, Py_ssize_t nargs)
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03004692{
4693 PyObject *return_value = NULL;
4694 int fd;
4695 Py_ssize_t length;
4696
Serhiy Storchaka4fa95912019-01-11 16:01:14 +02004697 if (!_PyArg_CheckPositional("read", nargs, 2, 2)) {
Victor Stinner259f0e42017-01-17 01:35:17 +01004698 goto exit;
4699 }
Serhiy Storchaka4fa95912019-01-11 16:01:14 +02004700 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 }
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03004726 return_value = os_read_impl(module, fd, length);
4727
4728exit:
4729 return return_value;
4730}
4731
4732#if defined(HAVE_READV)
4733
4734PyDoc_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 \
Serhiy Storchaka4a934d42018-11-27 11:27:36 +02004749 {"readv", (PyCFunction)(void(*)(void))os_readv, METH_FASTCALL, os_readv__doc__},
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03004750
4751static Py_ssize_t
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03004752os_readv_impl(PyObject *module, int fd, PyObject *buffers);
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03004753
4754static PyObject *
Serhiy Storchakaa5552f02017-12-15 13:11:11 +02004755os_readv(PyObject *module, PyObject *const *args, Py_ssize_t nargs)
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03004756{
4757 PyObject *return_value = NULL;
4758 int fd;
4759 PyObject *buffers;
4760 Py_ssize_t _return_value;
4761
Serhiy Storchaka4fa95912019-01-11 16:01:14 +02004762 if (!_PyArg_CheckPositional("readv", nargs, 2, 2)) {
Victor Stinner259f0e42017-01-17 01:35:17 +01004763 goto exit;
4764 }
Serhiy Storchaka4fa95912019-01-11 16:01:14 +02004765 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];
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03004775 _return_value = os_readv_impl(module, fd, buffers);
Serhiy Storchaka5dee6552016-06-09 16:16:06 +03004776 if ((_return_value == -1) && PyErr_Occurred()) {
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03004777 goto exit;
Serhiy Storchaka5dee6552016-06-09 16:16:06 +03004778 }
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03004779 return_value = PyLong_FromSsize_t(_return_value);
4780
4781exit:
4782 return return_value;
4783}
4784
4785#endif /* defined(HAVE_READV) */
4786
4787#if defined(HAVE_PREAD)
4788
4789PyDoc_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 \
Serhiy Storchaka4a934d42018-11-27 11:27:36 +02004799 {"pread", (PyCFunction)(void(*)(void))os_pread, METH_FASTCALL, os_pread__doc__},
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03004800
4801static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03004802os_pread_impl(PyObject *module, int fd, int length, Py_off_t offset);
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03004803
4804static PyObject *
Serhiy Storchakaa5552f02017-12-15 13:11:11 +02004805os_pread(PyObject *module, PyObject *const *args, Py_ssize_t nargs)
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03004806{
4807 PyObject *return_value = NULL;
4808 int fd;
4809 int length;
4810 Py_off_t offset;
4811
Serhiy Storchaka4fa95912019-01-11 16:01:14 +02004812 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)) {
Victor Stinner259f0e42017-01-17 01:35:17 +01004834 goto exit;
4835 }
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03004836 return_value = os_pread_impl(module, fd, length, offset);
4837
4838exit:
4839 return return_value;
4840}
4841
4842#endif /* defined(HAVE_PREAD) */
4843
Pablo Galindo4defba32018-01-27 16:16:37 +00004844#if (defined(HAVE_PREADV) || defined (HAVE_PREADV2))
4845
4846PyDoc_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 \
Serhiy Storchaka4a934d42018-11-27 11:27:36 +02004867 {"preadv", (PyCFunction)(void(*)(void))os_preadv, METH_FASTCALL, os_preadv__doc__},
Pablo Galindo4defba32018-01-27 16:16:37 +00004868
4869static Py_ssize_t
4870os_preadv_impl(PyObject *module, int fd, PyObject *buffers, Py_off_t offset,
4871 int flags);
4872
4873static PyObject *
4874os_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
Serhiy Storchaka4fa95912019-01-11 16:01:14 +02004883 if (!_PyArg_CheckPositional("preadv", nargs, 3, 4)) {
Pablo Galindo4defba32018-01-27 16:16:37 +00004884 goto exit;
4885 }
Serhiy Storchaka4fa95912019-01-11 16:01:14 +02004886 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 }
4911skip_optional:
Pablo Galindo4defba32018-01-27 16:16:37 +00004912 _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
4918exit:
4919 return return_value;
4920}
4921
4922#endif /* (defined(HAVE_PREADV) || defined (HAVE_PREADV2)) */
4923
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03004924PyDoc_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 \
Serhiy Storchaka4a934d42018-11-27 11:27:36 +02004931 {"write", (PyCFunction)(void(*)(void))os_write, METH_FASTCALL, os_write__doc__},
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03004932
4933static Py_ssize_t
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03004934os_write_impl(PyObject *module, int fd, Py_buffer *data);
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03004935
4936static PyObject *
Serhiy Storchakaa5552f02017-12-15 13:11:11 +02004937os_write(PyObject *module, PyObject *const *args, Py_ssize_t nargs)
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03004938{
4939 PyObject *return_value = NULL;
4940 int fd;
4941 Py_buffer data = {NULL, NULL};
4942 Py_ssize_t _return_value;
4943
Serhiy Storchaka4fa95912019-01-11 16:01:14 +02004944 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')) {
Rémi Lapeyre4901fe22019-08-29 16:49:08 +02004960 _PyArg_BadArgument("write", "argument 2", "contiguous buffer", args[1]);
Victor Stinner259f0e42017-01-17 01:35:17 +01004961 goto exit;
4962 }
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03004963 _return_value = os_write_impl(module, fd, &data);
Serhiy Storchaka5dee6552016-06-09 16:16:06 +03004964 if ((_return_value == -1) && PyErr_Occurred()) {
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03004965 goto exit;
Serhiy Storchaka5dee6552016-06-09 16:16:06 +03004966 }
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03004967 return_value = PyLong_FromSsize_t(_return_value);
4968
4969exit:
4970 /* Cleanup for data */
Serhiy Storchaka5dee6552016-06-09 16:16:06 +03004971 if (data.obj) {
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03004972 PyBuffer_Release(&data);
Serhiy Storchaka5dee6552016-06-09 16:16:06 +03004973 }
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03004974
4975 return return_value;
4976}
4977
Giampaolo Rodola4a172cc2018-06-12 23:04:50 +02004978#if defined(__APPLE__)
4979
4980PyDoc_STRVAR(os__fcopyfile__doc__,
4981"_fcopyfile($module, infd, outfd, flags, /)\n"
4982"--\n"
4983"\n"
Giampaolo Rodolac7f02a92018-06-19 08:27:29 -07004984"Efficiently copy content or metadata of 2 regular file descriptors (macOS).");
Giampaolo Rodola4a172cc2018-06-12 23:04:50 +02004985
4986#define OS__FCOPYFILE_METHODDEF \
Serhiy Storchaka4a934d42018-11-27 11:27:36 +02004987 {"_fcopyfile", (PyCFunction)(void(*)(void))os__fcopyfile, METH_FASTCALL, os__fcopyfile__doc__},
Giampaolo Rodola4a172cc2018-06-12 23:04:50 +02004988
4989static PyObject *
4990os__fcopyfile_impl(PyObject *module, int infd, int outfd, int flags);
4991
4992static PyObject *
4993os__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
Serhiy Storchaka4fa95912019-01-11 16:01:14 +02005000 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()) {
Giampaolo Rodola4a172cc2018-06-12 23:04:50 +02005028 goto exit;
5029 }
5030 return_value = os__fcopyfile_impl(module, infd, outfd, flags);
5031
5032exit:
5033 return return_value;
5034}
5035
5036#endif /* defined(__APPLE__) */
5037
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03005038PyDoc_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 \
Serhiy Storchaka4a934d42018-11-27 11:27:36 +02005048 {"fstat", (PyCFunction)(void(*)(void))os_fstat, METH_FASTCALL|METH_KEYWORDS, os_fstat__doc__},
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03005049
5050static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03005051os_fstat_impl(PyObject *module, int fd);
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03005052
5053static PyObject *
Serhiy Storchakaa5552f02017-12-15 13:11:11 +02005054os_fstat(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames)
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03005055{
5056 PyObject *return_value = NULL;
Serhiy Storchaka9171a8b2016-08-14 10:52:18 +03005057 static const char * const _keywords[] = {"fd", NULL};
Serhiy Storchaka31913912019-03-14 10:32:22 +02005058 static _PyArg_Parser _parser = {NULL, _keywords, "fstat", 0};
5059 PyObject *argsbuf[1];
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03005060 int fd;
5061
Serhiy Storchaka31913912019-03-14 10:32:22 +02005062 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()) {
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03005073 goto exit;
Serhiy Storchaka5dee6552016-06-09 16:16:06 +03005074 }
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03005075 return_value = os_fstat_impl(module, fd);
5076
5077exit:
5078 return return_value;
5079}
5080
5081PyDoc_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 \
Serhiy Storchaka92e8af62015-04-04 00:12:11 +03005091 {"isatty", (PyCFunction)os_isatty, METH_O, os_isatty__doc__},
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03005092
5093static int
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03005094os_isatty_impl(PyObject *module, int fd);
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03005095
5096static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03005097os_isatty(PyObject *module, PyObject *arg)
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03005098{
5099 PyObject *return_value = NULL;
5100 int fd;
5101 int _return_value;
5102
Serhiy Storchaka32d96a22018-12-25 13:23:47 +02005103 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()) {
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03005110 goto exit;
Serhiy Storchaka5dee6552016-06-09 16:16:06 +03005111 }
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03005112 _return_value = os_isatty_impl(module, fd);
Serhiy Storchaka5dee6552016-06-09 16:16:06 +03005113 if ((_return_value == -1) && PyErr_Occurred()) {
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03005114 goto exit;
Serhiy Storchaka5dee6552016-06-09 16:16:06 +03005115 }
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03005116 return_value = PyBool_FromLong((long)_return_value);
5117
5118exit:
5119 return return_value;
5120}
5121
5122#if defined(HAVE_PIPE)
5123
5124PyDoc_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
5136static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03005137os_pipe_impl(PyObject *module);
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03005138
5139static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03005140os_pipe(PyObject *module, PyObject *Py_UNUSED(ignored))
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03005141{
5142 return os_pipe_impl(module);
5143}
5144
5145#endif /* defined(HAVE_PIPE) */
5146
5147#if defined(HAVE_PIPE2)
5148
5149PyDoc_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 \
Serhiy Storchaka92e8af62015-04-04 00:12:11 +03005162 {"pipe2", (PyCFunction)os_pipe2, METH_O, os_pipe2__doc__},
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03005163
5164static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03005165os_pipe2_impl(PyObject *module, int flags);
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03005166
5167static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03005168os_pipe2(PyObject *module, PyObject *arg)
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03005169{
5170 PyObject *return_value = NULL;
5171 int flags;
5172
Serhiy Storchaka32d96a22018-12-25 13:23:47 +02005173 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()) {
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03005180 goto exit;
Serhiy Storchaka5dee6552016-06-09 16:16:06 +03005181 }
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03005182 return_value = os_pipe2_impl(module, flags);
5183
5184exit:
5185 return return_value;
5186}
5187
5188#endif /* defined(HAVE_PIPE2) */
5189
5190#if defined(HAVE_WRITEV)
5191
5192PyDoc_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 \
Serhiy Storchaka4a934d42018-11-27 11:27:36 +02005202 {"writev", (PyCFunction)(void(*)(void))os_writev, METH_FASTCALL, os_writev__doc__},
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03005203
5204static Py_ssize_t
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03005205os_writev_impl(PyObject *module, int fd, PyObject *buffers);
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03005206
5207static PyObject *
Serhiy Storchakaa5552f02017-12-15 13:11:11 +02005208os_writev(PyObject *module, PyObject *const *args, Py_ssize_t nargs)
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03005209{
5210 PyObject *return_value = NULL;
5211 int fd;
5212 PyObject *buffers;
5213 Py_ssize_t _return_value;
5214
Serhiy Storchaka4fa95912019-01-11 16:01:14 +02005215 if (!_PyArg_CheckPositional("writev", nargs, 2, 2)) {
Victor Stinner259f0e42017-01-17 01:35:17 +01005216 goto exit;
5217 }
Serhiy Storchaka4fa95912019-01-11 16:01:14 +02005218 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];
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03005228 _return_value = os_writev_impl(module, fd, buffers);
Serhiy Storchaka5dee6552016-06-09 16:16:06 +03005229 if ((_return_value == -1) && PyErr_Occurred()) {
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03005230 goto exit;
Serhiy Storchaka5dee6552016-06-09 16:16:06 +03005231 }
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03005232 return_value = PyLong_FromSsize_t(_return_value);
5233
5234exit:
5235 return return_value;
5236}
5237
5238#endif /* defined(HAVE_WRITEV) */
5239
5240#if defined(HAVE_PWRITE)
5241
5242PyDoc_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 \
Serhiy Storchaka4a934d42018-11-27 11:27:36 +02005253 {"pwrite", (PyCFunction)(void(*)(void))os_pwrite, METH_FASTCALL, os_pwrite__doc__},
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03005254
5255static Py_ssize_t
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03005256os_pwrite_impl(PyObject *module, int fd, Py_buffer *buffer, Py_off_t offset);
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03005257
5258static PyObject *
Serhiy Storchakaa5552f02017-12-15 13:11:11 +02005259os_pwrite(PyObject *module, PyObject *const *args, Py_ssize_t nargs)
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03005260{
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
Serhiy Storchaka4fa95912019-01-11 16:01:14 +02005267 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')) {
Rémi Lapeyre4901fe22019-08-29 16:49:08 +02005283 _PyArg_BadArgument("pwrite", "argument 2", "contiguous buffer", args[1]);
Serhiy Storchaka4fa95912019-01-11 16:01:14 +02005284 goto exit;
5285 }
5286 if (!Py_off_t_converter(args[2], &offset)) {
Victor Stinner259f0e42017-01-17 01:35:17 +01005287 goto exit;
5288 }
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03005289 _return_value = os_pwrite_impl(module, fd, &buffer, offset);
Serhiy Storchaka5dee6552016-06-09 16:16:06 +03005290 if ((_return_value == -1) && PyErr_Occurred()) {
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03005291 goto exit;
Serhiy Storchaka5dee6552016-06-09 16:16:06 +03005292 }
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03005293 return_value = PyLong_FromSsize_t(_return_value);
5294
5295exit:
5296 /* Cleanup for buffer */
Serhiy Storchaka5dee6552016-06-09 16:16:06 +03005297 if (buffer.obj) {
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03005298 PyBuffer_Release(&buffer);
Serhiy Storchaka5dee6552016-06-09 16:16:06 +03005299 }
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03005300
5301 return return_value;
5302}
5303
5304#endif /* defined(HAVE_PWRITE) */
5305
Pablo Galindo4defba32018-01-27 16:16:37 +00005306#if (defined(HAVE_PWRITEV) || defined (HAVE_PWRITEV2))
5307
5308PyDoc_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 \
Serhiy Storchaka4a934d42018-11-27 11:27:36 +02005329 {"pwritev", (PyCFunction)(void(*)(void))os_pwritev, METH_FASTCALL, os_pwritev__doc__},
Pablo Galindo4defba32018-01-27 16:16:37 +00005330
5331static Py_ssize_t
5332os_pwritev_impl(PyObject *module, int fd, PyObject *buffers, Py_off_t offset,
5333 int flags);
5334
5335static PyObject *
5336os_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
Serhiy Storchaka4fa95912019-01-11 16:01:14 +02005345 if (!_PyArg_CheckPositional("pwritev", nargs, 3, 4)) {
Pablo Galindo4defba32018-01-27 16:16:37 +00005346 goto exit;
5347 }
Serhiy Storchaka4fa95912019-01-11 16:01:14 +02005348 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 }
5373skip_optional:
Pablo Galindo4defba32018-01-27 16:16:37 +00005374 _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
5380exit:
5381 return return_value;
5382}
5383
5384#endif /* (defined(HAVE_PWRITEV) || defined (HAVE_PWRITEV2)) */
5385
Pablo Galindoaac4d032019-05-31 19:39:47 +01005386#if defined(HAVE_COPY_FILE_RANGE)
5387
5388PyDoc_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
5412static PyObject *
5413os_copy_file_range_impl(PyObject *module, int src, int dst, Py_ssize_t count,
5414 PyObject *offset_src, PyObject *offset_dst);
5415
5416static PyObject *
5417os_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];
5479skip_optional_pos:
5480 return_value = os_copy_file_range_impl(module, src, dst, count, offset_src, offset_dst);
5481
5482exit:
5483 return return_value;
5484}
5485
5486#endif /* defined(HAVE_COPY_FILE_RANGE) */
5487
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03005488#if defined(HAVE_MKFIFO)
5489
5490PyDoc_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 \
Serhiy Storchaka4a934d42018-11-27 11:27:36 +02005502 {"mkfifo", (PyCFunction)(void(*)(void))os_mkfifo, METH_FASTCALL|METH_KEYWORDS, os_mkfifo__doc__},
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03005503
5504static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03005505os_mkfifo_impl(PyObject *module, path_t *path, int mode, int dir_fd);
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03005506
5507static PyObject *
Serhiy Storchakaa5552f02017-12-15 13:11:11 +02005508os_mkfifo(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames)
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03005509{
5510 PyObject *return_value = NULL;
Serhiy Storchaka9171a8b2016-08-14 10:52:18 +03005511 static const char * const _keywords[] = {"path", "mode", "dir_fd", NULL};
Serhiy Storchaka31913912019-03-14 10:32:22 +02005512 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;
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03005515 path_t path = PATH_T_INITIALIZE("mkfifo", "path", 0, 0);
5516 int mode = 438;
5517 int dir_fd = DEFAULT_DIR_FD;
5518
Serhiy Storchaka31913912019-03-14 10:32:22 +02005519 args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 1, 2, 0, argsbuf);
5520 if (!args) {
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03005521 goto exit;
Serhiy Storchaka5dee6552016-06-09 16:16:06 +03005522 }
Serhiy Storchaka31913912019-03-14 10:32:22 +02005523 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 }
5543skip_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 }
5550skip_optional_kwonly:
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03005551 return_value = os_mkfifo_impl(module, &path, mode, dir_fd);
5552
5553exit:
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
5564PyDoc_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 \
Serhiy Storchaka4a934d42018-11-27 11:27:36 +02005583 {"mknod", (PyCFunction)(void(*)(void))os_mknod, METH_FASTCALL|METH_KEYWORDS, os_mknod__doc__},
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03005584
5585static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03005586os_mknod_impl(PyObject *module, path_t *path, int mode, dev_t device,
Larry Hastings89964c42015-04-14 18:07:59 -04005587 int dir_fd);
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03005588
5589static PyObject *
Serhiy Storchakaa5552f02017-12-15 13:11:11 +02005590os_mknod(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames)
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03005591{
5592 PyObject *return_value = NULL;
Serhiy Storchaka9171a8b2016-08-14 10:52:18 +03005593 static const char * const _keywords[] = {"path", "mode", "device", "dir_fd", NULL};
Serhiy Storchaka31913912019-03-14 10:32:22 +02005594 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;
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03005597 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
Serhiy Storchaka31913912019-03-14 10:32:22 +02005602 args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 1, 3, 0, argsbuf);
5603 if (!args) {
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03005604 goto exit;
Serhiy Storchaka5dee6552016-06-09 16:16:06 +03005605 }
Serhiy Storchaka31913912019-03-14 10:32:22 +02005606 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 }
5634skip_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 }
5641skip_optional_kwonly:
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03005642 return_value = os_mknod_impl(module, &path, mode, device, dir_fd);
5643
5644exit:
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
5655PyDoc_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 \
Serhiy Storchaka92e8af62015-04-04 00:12:11 +03005662 {"major", (PyCFunction)os_major, METH_O, os_major__doc__},
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03005663
5664static unsigned int
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03005665os_major_impl(PyObject *module, dev_t device);
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03005666
5667static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03005668os_major(PyObject *module, PyObject *arg)
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03005669{
5670 PyObject *return_value = NULL;
5671 dev_t device;
5672 unsigned int _return_value;
5673
Serhiy Storchaka32d96a22018-12-25 13:23:47 +02005674 if (!_Py_Dev_Converter(arg, &device)) {
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03005675 goto exit;
Serhiy Storchaka5dee6552016-06-09 16:16:06 +03005676 }
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03005677 _return_value = os_major_impl(module, device);
Serhiy Storchaka5dee6552016-06-09 16:16:06 +03005678 if ((_return_value == (unsigned int)-1) && PyErr_Occurred()) {
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03005679 goto exit;
Serhiy Storchaka5dee6552016-06-09 16:16:06 +03005680 }
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03005681 return_value = PyLong_FromUnsignedLong((unsigned long)_return_value);
5682
5683exit:
5684 return return_value;
5685}
5686
5687#endif /* defined(HAVE_DEVICE_MACROS) */
5688
5689#if defined(HAVE_DEVICE_MACROS)
5690
5691PyDoc_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 \
Serhiy Storchaka92e8af62015-04-04 00:12:11 +03005698 {"minor", (PyCFunction)os_minor, METH_O, os_minor__doc__},
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03005699
5700static unsigned int
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03005701os_minor_impl(PyObject *module, dev_t device);
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03005702
5703static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03005704os_minor(PyObject *module, PyObject *arg)
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03005705{
5706 PyObject *return_value = NULL;
5707 dev_t device;
5708 unsigned int _return_value;
5709
Serhiy Storchaka32d96a22018-12-25 13:23:47 +02005710 if (!_Py_Dev_Converter(arg, &device)) {
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03005711 goto exit;
Serhiy Storchaka5dee6552016-06-09 16:16:06 +03005712 }
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03005713 _return_value = os_minor_impl(module, device);
Serhiy Storchaka5dee6552016-06-09 16:16:06 +03005714 if ((_return_value == (unsigned int)-1) && PyErr_Occurred()) {
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03005715 goto exit;
Serhiy Storchaka5dee6552016-06-09 16:16:06 +03005716 }
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03005717 return_value = PyLong_FromUnsignedLong((unsigned long)_return_value);
5718
5719exit:
5720 return return_value;
5721}
5722
5723#endif /* defined(HAVE_DEVICE_MACROS) */
5724
5725#if defined(HAVE_DEVICE_MACROS)
5726
5727PyDoc_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 \
Serhiy Storchaka4a934d42018-11-27 11:27:36 +02005734 {"makedev", (PyCFunction)(void(*)(void))os_makedev, METH_FASTCALL, os_makedev__doc__},
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03005735
5736static dev_t
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03005737os_makedev_impl(PyObject *module, int major, int minor);
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03005738
5739static PyObject *
Serhiy Storchakaa5552f02017-12-15 13:11:11 +02005740os_makedev(PyObject *module, PyObject *const *args, Py_ssize_t nargs)
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03005741{
5742 PyObject *return_value = NULL;
5743 int major;
5744 int minor;
5745 dev_t _return_value;
5746
Serhiy Storchaka4fa95912019-01-11 16:01:14 +02005747 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()) {
Victor Stinner259f0e42017-01-17 01:35:17 +01005766 goto exit;
5767 }
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03005768 _return_value = os_makedev_impl(module, major, minor);
Serhiy Storchaka5dee6552016-06-09 16:16:06 +03005769 if ((_return_value == (dev_t)-1) && PyErr_Occurred()) {
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03005770 goto exit;
Serhiy Storchaka5dee6552016-06-09 16:16:06 +03005771 }
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03005772 return_value = _PyLong_FromDev(_return_value);
5773
5774exit:
5775 return return_value;
5776}
5777
5778#endif /* defined(HAVE_DEVICE_MACROS) */
5779
Steve Dowerf7377032015-04-12 15:44:54 -04005780#if (defined HAVE_FTRUNCATE || defined MS_WINDOWS)
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03005781
5782PyDoc_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 \
Serhiy Storchaka4a934d42018-11-27 11:27:36 +02005789 {"ftruncate", (PyCFunction)(void(*)(void))os_ftruncate, METH_FASTCALL, os_ftruncate__doc__},
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03005790
5791static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03005792os_ftruncate_impl(PyObject *module, int fd, Py_off_t length);
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03005793
5794static PyObject *
Serhiy Storchakaa5552f02017-12-15 13:11:11 +02005795os_ftruncate(PyObject *module, PyObject *const *args, Py_ssize_t nargs)
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03005796{
5797 PyObject *return_value = NULL;
5798 int fd;
5799 Py_off_t length;
5800
Serhiy Storchaka4fa95912019-01-11 16:01:14 +02005801 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)) {
Victor Stinner259f0e42017-01-17 01:35:17 +01005814 goto exit;
5815 }
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03005816 return_value = os_ftruncate_impl(module, fd, length);
5817
5818exit:
5819 return return_value;
5820}
5821
Steve Dowerf7377032015-04-12 15:44:54 -04005822#endif /* (defined HAVE_FTRUNCATE || defined MS_WINDOWS) */
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03005823
Steve Dowerf7377032015-04-12 15:44:54 -04005824#if (defined HAVE_TRUNCATE || defined MS_WINDOWS)
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03005825
5826PyDoc_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 \
Serhiy Storchaka4a934d42018-11-27 11:27:36 +02005836 {"truncate", (PyCFunction)(void(*)(void))os_truncate, METH_FASTCALL|METH_KEYWORDS, os_truncate__doc__},
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03005837
5838static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03005839os_truncate_impl(PyObject *module, path_t *path, Py_off_t length);
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03005840
5841static PyObject *
Serhiy Storchakaa5552f02017-12-15 13:11:11 +02005842os_truncate(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames)
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03005843{
5844 PyObject *return_value = NULL;
Serhiy Storchaka9171a8b2016-08-14 10:52:18 +03005845 static const char * const _keywords[] = {"path", "length", NULL};
Serhiy Storchaka31913912019-03-14 10:32:22 +02005846 static _PyArg_Parser _parser = {NULL, _keywords, "truncate", 0};
5847 PyObject *argsbuf[2];
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03005848 path_t path = PATH_T_INITIALIZE("truncate", "path", 0, PATH_HAVE_FTRUNCATE);
5849 Py_off_t length;
5850
Serhiy Storchaka31913912019-03-14 10:32:22 +02005851 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)) {
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03005859 goto exit;
Serhiy Storchaka5dee6552016-06-09 16:16:06 +03005860 }
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03005861 return_value = os_truncate_impl(module, &path, length);
5862
5863exit:
5864 /* Cleanup for path */
5865 path_cleanup(&path);
5866
5867 return return_value;
5868}
5869
Steve Dowerf7377032015-04-12 15:44:54 -04005870#endif /* (defined HAVE_TRUNCATE || defined MS_WINDOWS) */
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03005871
5872#if (defined(HAVE_POSIX_FALLOCATE) && !defined(POSIX_FADVISE_AIX_BUG))
5873
5874PyDoc_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 \
Serhiy Storchaka4a934d42018-11-27 11:27:36 +02005884 {"posix_fallocate", (PyCFunction)(void(*)(void))os_posix_fallocate, METH_FASTCALL, os_posix_fallocate__doc__},
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03005885
5886static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03005887os_posix_fallocate_impl(PyObject *module, int fd, Py_off_t offset,
Larry Hastings89964c42015-04-14 18:07:59 -04005888 Py_off_t length);
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03005889
5890static PyObject *
Serhiy Storchakaa5552f02017-12-15 13:11:11 +02005891os_posix_fallocate(PyObject *module, PyObject *const *args, Py_ssize_t nargs)
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03005892{
5893 PyObject *return_value = NULL;
5894 int fd;
5895 Py_off_t offset;
5896 Py_off_t length;
5897
Serhiy Storchaka4fa95912019-01-11 16:01:14 +02005898 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)) {
Victor Stinner259f0e42017-01-17 01:35:17 +01005914 goto exit;
5915 }
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03005916 return_value = os_posix_fallocate_impl(module, fd, offset, length);
5917
5918exit:
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
5926PyDoc_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 \
Serhiy Storchaka4a934d42018-11-27 11:27:36 +02005941 {"posix_fadvise", (PyCFunction)(void(*)(void))os_posix_fadvise, METH_FASTCALL, os_posix_fadvise__doc__},
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03005942
5943static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03005944os_posix_fadvise_impl(PyObject *module, int fd, Py_off_t offset,
Larry Hastings89964c42015-04-14 18:07:59 -04005945 Py_off_t length, int advice);
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03005946
5947static PyObject *
Serhiy Storchakaa5552f02017-12-15 13:11:11 +02005948os_posix_fadvise(PyObject *module, PyObject *const *args, Py_ssize_t nargs)
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03005949{
5950 PyObject *return_value = NULL;
5951 int fd;
5952 Py_off_t offset;
5953 Py_off_t length;
5954 int advice;
5955
Serhiy Storchaka4fa95912019-01-11 16:01:14 +02005956 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()) {
Victor Stinner259f0e42017-01-17 01:35:17 +01005981 goto exit;
5982 }
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03005983 return_value = os_posix_fadvise_impl(module, fd, offset, length, advice);
5984
5985exit:
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
5993PyDoc_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 \
Serhiy Storchaka4a934d42018-11-27 11:27:36 +02006000 {"putenv", (PyCFunction)(void(*)(void))os_putenv, METH_FASTCALL, os_putenv__doc__},
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03006001
6002static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03006003os_putenv_impl(PyObject *module, PyObject *name, PyObject *value);
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03006004
6005static PyObject *
Serhiy Storchakaa5552f02017-12-15 13:11:11 +02006006os_putenv(PyObject *module, PyObject *const *args, Py_ssize_t nargs)
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03006007{
6008 PyObject *return_value = NULL;
6009 PyObject *name;
6010 PyObject *value;
6011
Serhiy Storchaka4fa95912019-01-11 16:01:14 +02006012 if (!_PyArg_CheckPositional("putenv", nargs, 2, 2)) {
Victor Stinner259f0e42017-01-17 01:35:17 +01006013 goto exit;
6014 }
Serhiy Storchaka4fa95912019-01-11 16:01:14 +02006015 if (!PyUnicode_Check(args[0])) {
Rémi Lapeyre4901fe22019-08-29 16:49:08 +02006016 _PyArg_BadArgument("putenv", "argument 1", "str", args[0]);
Serhiy Storchaka4fa95912019-01-11 16:01:14 +02006017 goto exit;
6018 }
6019 if (PyUnicode_READY(args[0]) == -1) {
6020 goto exit;
6021 }
6022 name = args[0];
6023 if (!PyUnicode_Check(args[1])) {
Rémi Lapeyre4901fe22019-08-29 16:49:08 +02006024 _PyArg_BadArgument("putenv", "argument 2", "str", args[1]);
Serhiy Storchaka4fa95912019-01-11 16:01:14 +02006025 goto exit;
6026 }
6027 if (PyUnicode_READY(args[1]) == -1) {
6028 goto exit;
6029 }
6030 value = args[1];
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03006031 return_value = os_putenv_impl(module, name, value);
6032
6033exit:
6034 return return_value;
6035}
6036
6037#endif /* defined(HAVE_PUTENV) && defined(MS_WINDOWS) */
6038
6039#if defined(HAVE_PUTENV) && !defined(MS_WINDOWS)
6040
6041PyDoc_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 \
Serhiy Storchaka4a934d42018-11-27 11:27:36 +02006048 {"putenv", (PyCFunction)(void(*)(void))os_putenv, METH_FASTCALL, os_putenv__doc__},
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03006049
6050static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03006051os_putenv_impl(PyObject *module, PyObject *name, PyObject *value);
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03006052
6053static PyObject *
Serhiy Storchakaa5552f02017-12-15 13:11:11 +02006054os_putenv(PyObject *module, PyObject *const *args, Py_ssize_t nargs)
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03006055{
6056 PyObject *return_value = NULL;
6057 PyObject *name = NULL;
6058 PyObject *value = NULL;
6059
Serhiy Storchaka4fa95912019-01-11 16:01:14 +02006060 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)) {
Victor Stinner259f0e42017-01-17 01:35:17 +01006067 goto exit;
6068 }
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03006069 return_value = os_putenv_impl(module, name, value);
6070
6071exit:
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
6084PyDoc_STRVAR(os_unsetenv__doc__,
6085"unsetenv($module, name, /)\n"
6086"--\n"
6087"\n"
6088"Delete an environment variable.");
6089
6090#define OS_UNSETENV_METHODDEF \
Serhiy Storchaka92e8af62015-04-04 00:12:11 +03006091 {"unsetenv", (PyCFunction)os_unsetenv, METH_O, os_unsetenv__doc__},
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03006092
6093static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03006094os_unsetenv_impl(PyObject *module, PyObject *name);
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03006095
6096static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03006097os_unsetenv(PyObject *module, PyObject *arg)
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03006098{
6099 PyObject *return_value = NULL;
6100 PyObject *name = NULL;
6101
Serhiy Storchaka32d96a22018-12-25 13:23:47 +02006102 if (!PyUnicode_FSConverter(arg, &name)) {
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03006103 goto exit;
Serhiy Storchaka5dee6552016-06-09 16:16:06 +03006104 }
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03006105 return_value = os_unsetenv_impl(module, name);
6106
6107exit:
6108 /* Cleanup for name */
6109 Py_XDECREF(name);
6110
6111 return return_value;
6112}
6113
6114#endif /* defined(HAVE_UNSETENV) */
6115
6116PyDoc_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 \
Serhiy Storchaka92e8af62015-04-04 00:12:11 +03006123 {"strerror", (PyCFunction)os_strerror, METH_O, os_strerror__doc__},
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03006124
6125static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03006126os_strerror_impl(PyObject *module, int code);
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03006127
6128static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03006129os_strerror(PyObject *module, PyObject *arg)
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03006130{
6131 PyObject *return_value = NULL;
6132 int code;
6133
Serhiy Storchaka32d96a22018-12-25 13:23:47 +02006134 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()) {
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03006141 goto exit;
Serhiy Storchaka5dee6552016-06-09 16:16:06 +03006142 }
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03006143 return_value = os_strerror_impl(module, code);
6144
6145exit:
6146 return return_value;
6147}
6148
6149#if defined(HAVE_SYS_WAIT_H) && defined(WCOREDUMP)
6150
6151PyDoc_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 \
Serhiy Storchaka92e8af62015-04-04 00:12:11 +03006158 {"WCOREDUMP", (PyCFunction)os_WCOREDUMP, METH_O, os_WCOREDUMP__doc__},
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03006159
6160static int
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03006161os_WCOREDUMP_impl(PyObject *module, int status);
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03006162
6163static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03006164os_WCOREDUMP(PyObject *module, PyObject *arg)
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03006165{
6166 PyObject *return_value = NULL;
6167 int status;
6168 int _return_value;
6169
Serhiy Storchaka32d96a22018-12-25 13:23:47 +02006170 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()) {
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03006177 goto exit;
Serhiy Storchaka5dee6552016-06-09 16:16:06 +03006178 }
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03006179 _return_value = os_WCOREDUMP_impl(module, status);
Serhiy Storchaka5dee6552016-06-09 16:16:06 +03006180 if ((_return_value == -1) && PyErr_Occurred()) {
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03006181 goto exit;
Serhiy Storchaka5dee6552016-06-09 16:16:06 +03006182 }
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03006183 return_value = PyBool_FromLong((long)_return_value);
6184
6185exit:
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
6193PyDoc_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 \
Serhiy Storchaka4a934d42018-11-27 11:27:36 +02006203 {"WIFCONTINUED", (PyCFunction)(void(*)(void))os_WIFCONTINUED, METH_FASTCALL|METH_KEYWORDS, os_WIFCONTINUED__doc__},
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03006204
6205static int
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03006206os_WIFCONTINUED_impl(PyObject *module, int status);
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03006207
6208static PyObject *
Serhiy Storchakaa5552f02017-12-15 13:11:11 +02006209os_WIFCONTINUED(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames)
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03006210{
6211 PyObject *return_value = NULL;
Serhiy Storchaka9171a8b2016-08-14 10:52:18 +03006212 static const char * const _keywords[] = {"status", NULL};
Serhiy Storchaka31913912019-03-14 10:32:22 +02006213 static _PyArg_Parser _parser = {NULL, _keywords, "WIFCONTINUED", 0};
6214 PyObject *argsbuf[1];
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03006215 int status;
6216 int _return_value;
6217
Serhiy Storchaka31913912019-03-14 10:32:22 +02006218 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()) {
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03006229 goto exit;
Serhiy Storchaka5dee6552016-06-09 16:16:06 +03006230 }
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03006231 _return_value = os_WIFCONTINUED_impl(module, status);
Serhiy Storchaka5dee6552016-06-09 16:16:06 +03006232 if ((_return_value == -1) && PyErr_Occurred()) {
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03006233 goto exit;
Serhiy Storchaka5dee6552016-06-09 16:16:06 +03006234 }
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03006235 return_value = PyBool_FromLong((long)_return_value);
6236
6237exit:
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
6245PyDoc_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 \
Serhiy Storchaka4a934d42018-11-27 11:27:36 +02006252 {"WIFSTOPPED", (PyCFunction)(void(*)(void))os_WIFSTOPPED, METH_FASTCALL|METH_KEYWORDS, os_WIFSTOPPED__doc__},
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03006253
6254static int
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03006255os_WIFSTOPPED_impl(PyObject *module, int status);
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03006256
6257static PyObject *
Serhiy Storchakaa5552f02017-12-15 13:11:11 +02006258os_WIFSTOPPED(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames)
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03006259{
6260 PyObject *return_value = NULL;
Serhiy Storchaka9171a8b2016-08-14 10:52:18 +03006261 static const char * const _keywords[] = {"status", NULL};
Serhiy Storchaka31913912019-03-14 10:32:22 +02006262 static _PyArg_Parser _parser = {NULL, _keywords, "WIFSTOPPED", 0};
6263 PyObject *argsbuf[1];
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03006264 int status;
6265 int _return_value;
6266
Serhiy Storchaka31913912019-03-14 10:32:22 +02006267 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()) {
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03006278 goto exit;
Serhiy Storchaka5dee6552016-06-09 16:16:06 +03006279 }
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03006280 _return_value = os_WIFSTOPPED_impl(module, status);
Serhiy Storchaka5dee6552016-06-09 16:16:06 +03006281 if ((_return_value == -1) && PyErr_Occurred()) {
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03006282 goto exit;
Serhiy Storchaka5dee6552016-06-09 16:16:06 +03006283 }
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03006284 return_value = PyBool_FromLong((long)_return_value);
6285
6286exit:
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
6294PyDoc_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 \
Serhiy Storchaka4a934d42018-11-27 11:27:36 +02006301 {"WIFSIGNALED", (PyCFunction)(void(*)(void))os_WIFSIGNALED, METH_FASTCALL|METH_KEYWORDS, os_WIFSIGNALED__doc__},
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03006302
6303static int
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03006304os_WIFSIGNALED_impl(PyObject *module, int status);
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03006305
6306static PyObject *
Serhiy Storchakaa5552f02017-12-15 13:11:11 +02006307os_WIFSIGNALED(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames)
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03006308{
6309 PyObject *return_value = NULL;
Serhiy Storchaka9171a8b2016-08-14 10:52:18 +03006310 static const char * const _keywords[] = {"status", NULL};
Serhiy Storchaka31913912019-03-14 10:32:22 +02006311 static _PyArg_Parser _parser = {NULL, _keywords, "WIFSIGNALED", 0};
6312 PyObject *argsbuf[1];
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03006313 int status;
6314 int _return_value;
6315
Serhiy Storchaka31913912019-03-14 10:32:22 +02006316 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()) {
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03006327 goto exit;
Serhiy Storchaka5dee6552016-06-09 16:16:06 +03006328 }
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03006329 _return_value = os_WIFSIGNALED_impl(module, status);
Serhiy Storchaka5dee6552016-06-09 16:16:06 +03006330 if ((_return_value == -1) && PyErr_Occurred()) {
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03006331 goto exit;
Serhiy Storchaka5dee6552016-06-09 16:16:06 +03006332 }
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03006333 return_value = PyBool_FromLong((long)_return_value);
6334
6335exit:
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
6343PyDoc_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 \
Serhiy Storchaka4a934d42018-11-27 11:27:36 +02006350 {"WIFEXITED", (PyCFunction)(void(*)(void))os_WIFEXITED, METH_FASTCALL|METH_KEYWORDS, os_WIFEXITED__doc__},
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03006351
6352static int
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03006353os_WIFEXITED_impl(PyObject *module, int status);
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03006354
6355static PyObject *
Serhiy Storchakaa5552f02017-12-15 13:11:11 +02006356os_WIFEXITED(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames)
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03006357{
6358 PyObject *return_value = NULL;
Serhiy Storchaka9171a8b2016-08-14 10:52:18 +03006359 static const char * const _keywords[] = {"status", NULL};
Serhiy Storchaka31913912019-03-14 10:32:22 +02006360 static _PyArg_Parser _parser = {NULL, _keywords, "WIFEXITED", 0};
6361 PyObject *argsbuf[1];
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03006362 int status;
6363 int _return_value;
6364
Serhiy Storchaka31913912019-03-14 10:32:22 +02006365 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()) {
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03006376 goto exit;
Serhiy Storchaka5dee6552016-06-09 16:16:06 +03006377 }
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03006378 _return_value = os_WIFEXITED_impl(module, status);
Serhiy Storchaka5dee6552016-06-09 16:16:06 +03006379 if ((_return_value == -1) && PyErr_Occurred()) {
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03006380 goto exit;
Serhiy Storchaka5dee6552016-06-09 16:16:06 +03006381 }
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03006382 return_value = PyBool_FromLong((long)_return_value);
6383
6384exit:
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
6392PyDoc_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 \
Serhiy Storchaka4a934d42018-11-27 11:27:36 +02006399 {"WEXITSTATUS", (PyCFunction)(void(*)(void))os_WEXITSTATUS, METH_FASTCALL|METH_KEYWORDS, os_WEXITSTATUS__doc__},
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03006400
6401static int
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03006402os_WEXITSTATUS_impl(PyObject *module, int status);
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03006403
6404static PyObject *
Serhiy Storchakaa5552f02017-12-15 13:11:11 +02006405os_WEXITSTATUS(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames)
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03006406{
6407 PyObject *return_value = NULL;
Serhiy Storchaka9171a8b2016-08-14 10:52:18 +03006408 static const char * const _keywords[] = {"status", NULL};
Serhiy Storchaka31913912019-03-14 10:32:22 +02006409 static _PyArg_Parser _parser = {NULL, _keywords, "WEXITSTATUS", 0};
6410 PyObject *argsbuf[1];
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03006411 int status;
6412 int _return_value;
6413
Serhiy Storchaka31913912019-03-14 10:32:22 +02006414 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()) {
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03006425 goto exit;
Serhiy Storchaka5dee6552016-06-09 16:16:06 +03006426 }
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03006427 _return_value = os_WEXITSTATUS_impl(module, status);
Serhiy Storchaka5dee6552016-06-09 16:16:06 +03006428 if ((_return_value == -1) && PyErr_Occurred()) {
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03006429 goto exit;
Serhiy Storchaka5dee6552016-06-09 16:16:06 +03006430 }
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03006431 return_value = PyLong_FromLong((long)_return_value);
6432
6433exit:
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
6441PyDoc_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 \
Serhiy Storchaka4a934d42018-11-27 11:27:36 +02006448 {"WTERMSIG", (PyCFunction)(void(*)(void))os_WTERMSIG, METH_FASTCALL|METH_KEYWORDS, os_WTERMSIG__doc__},
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03006449
6450static int
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03006451os_WTERMSIG_impl(PyObject *module, int status);
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03006452
6453static PyObject *
Serhiy Storchakaa5552f02017-12-15 13:11:11 +02006454os_WTERMSIG(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames)
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03006455{
6456 PyObject *return_value = NULL;
Serhiy Storchaka9171a8b2016-08-14 10:52:18 +03006457 static const char * const _keywords[] = {"status", NULL};
Serhiy Storchaka31913912019-03-14 10:32:22 +02006458 static _PyArg_Parser _parser = {NULL, _keywords, "WTERMSIG", 0};
6459 PyObject *argsbuf[1];
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03006460 int status;
6461 int _return_value;
6462
Serhiy Storchaka31913912019-03-14 10:32:22 +02006463 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()) {
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03006474 goto exit;
Serhiy Storchaka5dee6552016-06-09 16:16:06 +03006475 }
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03006476 _return_value = os_WTERMSIG_impl(module, status);
Serhiy Storchaka5dee6552016-06-09 16:16:06 +03006477 if ((_return_value == -1) && PyErr_Occurred()) {
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03006478 goto exit;
Serhiy Storchaka5dee6552016-06-09 16:16:06 +03006479 }
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03006480 return_value = PyLong_FromLong((long)_return_value);
6481
6482exit:
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
6490PyDoc_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 \
Serhiy Storchaka4a934d42018-11-27 11:27:36 +02006497 {"WSTOPSIG", (PyCFunction)(void(*)(void))os_WSTOPSIG, METH_FASTCALL|METH_KEYWORDS, os_WSTOPSIG__doc__},
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03006498
6499static int
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03006500os_WSTOPSIG_impl(PyObject *module, int status);
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03006501
6502static PyObject *
Serhiy Storchakaa5552f02017-12-15 13:11:11 +02006503os_WSTOPSIG(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames)
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03006504{
6505 PyObject *return_value = NULL;
Serhiy Storchaka9171a8b2016-08-14 10:52:18 +03006506 static const char * const _keywords[] = {"status", NULL};
Serhiy Storchaka31913912019-03-14 10:32:22 +02006507 static _PyArg_Parser _parser = {NULL, _keywords, "WSTOPSIG", 0};
6508 PyObject *argsbuf[1];
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03006509 int status;
6510 int _return_value;
6511
Serhiy Storchaka31913912019-03-14 10:32:22 +02006512 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()) {
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03006523 goto exit;
Serhiy Storchaka5dee6552016-06-09 16:16:06 +03006524 }
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03006525 _return_value = os_WSTOPSIG_impl(module, status);
Serhiy Storchaka5dee6552016-06-09 16:16:06 +03006526 if ((_return_value == -1) && PyErr_Occurred()) {
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03006527 goto exit;
Serhiy Storchaka5dee6552016-06-09 16:16:06 +03006528 }
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03006529 return_value = PyLong_FromLong((long)_return_value);
6530
6531exit:
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
6539PyDoc_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 \
Serhiy Storchaka92e8af62015-04-04 00:12:11 +03006548 {"fstatvfs", (PyCFunction)os_fstatvfs, METH_O, os_fstatvfs__doc__},
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03006549
6550static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03006551os_fstatvfs_impl(PyObject *module, int fd);
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03006552
6553static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03006554os_fstatvfs(PyObject *module, PyObject *arg)
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03006555{
6556 PyObject *return_value = NULL;
6557 int fd;
6558
Serhiy Storchaka32d96a22018-12-25 13:23:47 +02006559 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()) {
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03006566 goto exit;
Serhiy Storchaka5dee6552016-06-09 16:16:06 +03006567 }
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03006568 return_value = os_fstatvfs_impl(module, fd);
6569
6570exit:
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
6578PyDoc_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 \
Serhiy Storchaka4a934d42018-11-27 11:27:36 +02006589 {"statvfs", (PyCFunction)(void(*)(void))os_statvfs, METH_FASTCALL|METH_KEYWORDS, os_statvfs__doc__},
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03006590
6591static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03006592os_statvfs_impl(PyObject *module, path_t *path);
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03006593
6594static PyObject *
Serhiy Storchakaa5552f02017-12-15 13:11:11 +02006595os_statvfs(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames)
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03006596{
6597 PyObject *return_value = NULL;
Serhiy Storchaka9171a8b2016-08-14 10:52:18 +03006598 static const char * const _keywords[] = {"path", NULL};
Serhiy Storchaka31913912019-03-14 10:32:22 +02006599 static _PyArg_Parser _parser = {NULL, _keywords, "statvfs", 0};
6600 PyObject *argsbuf[1];
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03006601 path_t path = PATH_T_INITIALIZE("statvfs", "path", 0, PATH_HAVE_FSTATVFS);
6602
Serhiy Storchaka31913912019-03-14 10:32:22 +02006603 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)) {
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03006608 goto exit;
Serhiy Storchaka5dee6552016-06-09 16:16:06 +03006609 }
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03006610 return_value = os_statvfs_impl(module, &path);
6611
6612exit:
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
6623PyDoc_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 \
Serhiy Storchaka4a934d42018-11-27 11:27:36 +02006630 {"_getdiskusage", (PyCFunction)(void(*)(void))os__getdiskusage, METH_FASTCALL|METH_KEYWORDS, os__getdiskusage__doc__},
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03006631
6632static PyObject *
Steve Dower23ad6d02018-02-22 10:39:10 -08006633os__getdiskusage_impl(PyObject *module, path_t *path);
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03006634
6635static PyObject *
Serhiy Storchakaa5552f02017-12-15 13:11:11 +02006636os__getdiskusage(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames)
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03006637{
6638 PyObject *return_value = NULL;
Serhiy Storchaka9171a8b2016-08-14 10:52:18 +03006639 static const char * const _keywords[] = {"path", NULL};
Serhiy Storchaka31913912019-03-14 10:32:22 +02006640 static _PyArg_Parser _parser = {NULL, _keywords, "_getdiskusage", 0};
6641 PyObject *argsbuf[1];
Steve Dower23ad6d02018-02-22 10:39:10 -08006642 path_t path = PATH_T_INITIALIZE("_getdiskusage", "path", 0, 0);
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03006643
Serhiy Storchaka31913912019-03-14 10:32:22 +02006644 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)) {
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03006649 goto exit;
Serhiy Storchaka5dee6552016-06-09 16:16:06 +03006650 }
Steve Dower23ad6d02018-02-22 10:39:10 -08006651 return_value = os__getdiskusage_impl(module, &path);
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03006652
6653exit:
Steve Dower23ad6d02018-02-22 10:39:10 -08006654 /* Cleanup for path */
6655 path_cleanup(&path);
6656
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03006657 return return_value;
6658}
6659
6660#endif /* defined(MS_WINDOWS) */
6661
6662#if defined(HAVE_FPATHCONF)
6663
6664PyDoc_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 \
Serhiy Storchaka4a934d42018-11-27 11:27:36 +02006673 {"fpathconf", (PyCFunction)(void(*)(void))os_fpathconf, METH_FASTCALL, os_fpathconf__doc__},
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03006674
6675static long
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03006676os_fpathconf_impl(PyObject *module, int fd, int name);
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03006677
6678static PyObject *
Serhiy Storchakaa5552f02017-12-15 13:11:11 +02006679os_fpathconf(PyObject *module, PyObject *const *args, Py_ssize_t nargs)
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03006680{
6681 PyObject *return_value = NULL;
6682 int fd;
6683 int name;
6684 long _return_value;
6685
Serhiy Storchaka4fa95912019-01-11 16:01:14 +02006686 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)) {
Victor Stinner259f0e42017-01-17 01:35:17 +01006699 goto exit;
6700 }
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03006701 _return_value = os_fpathconf_impl(module, fd, name);
Serhiy Storchaka5dee6552016-06-09 16:16:06 +03006702 if ((_return_value == -1) && PyErr_Occurred()) {
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03006703 goto exit;
Serhiy Storchaka5dee6552016-06-09 16:16:06 +03006704 }
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03006705 return_value = PyLong_FromLong(_return_value);
6706
6707exit:
6708 return return_value;
6709}
6710
6711#endif /* defined(HAVE_FPATHCONF) */
6712
6713#if defined(HAVE_PATHCONF)
6714
6715PyDoc_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 \
Serhiy Storchaka4a934d42018-11-27 11:27:36 +02006726 {"pathconf", (PyCFunction)(void(*)(void))os_pathconf, METH_FASTCALL|METH_KEYWORDS, os_pathconf__doc__},
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03006727
6728static long
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03006729os_pathconf_impl(PyObject *module, path_t *path, int name);
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03006730
6731static PyObject *
Serhiy Storchakaa5552f02017-12-15 13:11:11 +02006732os_pathconf(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames)
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03006733{
6734 PyObject *return_value = NULL;
Serhiy Storchaka9171a8b2016-08-14 10:52:18 +03006735 static const char * const _keywords[] = {"path", "name", NULL};
Serhiy Storchaka31913912019-03-14 10:32:22 +02006736 static _PyArg_Parser _parser = {NULL, _keywords, "pathconf", 0};
6737 PyObject *argsbuf[2];
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03006738 path_t path = PATH_T_INITIALIZE("pathconf", "path", 0, PATH_HAVE_FPATHCONF);
6739 int name;
6740 long _return_value;
6741
Serhiy Storchaka31913912019-03-14 10:32:22 +02006742 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)) {
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03006750 goto exit;
Serhiy Storchaka5dee6552016-06-09 16:16:06 +03006751 }
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03006752 _return_value = os_pathconf_impl(module, &path, name);
Serhiy Storchaka5dee6552016-06-09 16:16:06 +03006753 if ((_return_value == -1) && PyErr_Occurred()) {
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03006754 goto exit;
Serhiy Storchaka5dee6552016-06-09 16:16:06 +03006755 }
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03006756 return_value = PyLong_FromLong(_return_value);
6757
6758exit:
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
6769PyDoc_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 \
Serhiy Storchaka92e8af62015-04-04 00:12:11 +03006776 {"confstr", (PyCFunction)os_confstr, METH_O, os_confstr__doc__},
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03006777
6778static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03006779os_confstr_impl(PyObject *module, int name);
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03006780
6781static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03006782os_confstr(PyObject *module, PyObject *arg)
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03006783{
6784 PyObject *return_value = NULL;
6785 int name;
6786
Serhiy Storchaka32d96a22018-12-25 13:23:47 +02006787 if (!conv_confstr_confname(arg, &name)) {
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03006788 goto exit;
Serhiy Storchaka5dee6552016-06-09 16:16:06 +03006789 }
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03006790 return_value = os_confstr_impl(module, name);
6791
6792exit:
6793 return return_value;
6794}
6795
6796#endif /* defined(HAVE_CONFSTR) */
6797
6798#if defined(HAVE_SYSCONF)
6799
6800PyDoc_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 \
Serhiy Storchaka92e8af62015-04-04 00:12:11 +03006807 {"sysconf", (PyCFunction)os_sysconf, METH_O, os_sysconf__doc__},
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03006808
6809static long
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03006810os_sysconf_impl(PyObject *module, int name);
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03006811
6812static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03006813os_sysconf(PyObject *module, PyObject *arg)
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03006814{
6815 PyObject *return_value = NULL;
6816 int name;
6817 long _return_value;
6818
Serhiy Storchaka32d96a22018-12-25 13:23:47 +02006819 if (!conv_sysconf_confname(arg, &name)) {
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03006820 goto exit;
Serhiy Storchaka5dee6552016-06-09 16:16:06 +03006821 }
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03006822 _return_value = os_sysconf_impl(module, name);
Serhiy Storchaka5dee6552016-06-09 16:16:06 +03006823 if ((_return_value == -1) && PyErr_Occurred()) {
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03006824 goto exit;
Serhiy Storchaka5dee6552016-06-09 16:16:06 +03006825 }
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03006826 return_value = PyLong_FromLong(_return_value);
6827
6828exit:
6829 return return_value;
6830}
6831
6832#endif /* defined(HAVE_SYSCONF) */
6833
6834PyDoc_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
6846static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03006847os_abort_impl(PyObject *module);
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03006848
6849static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03006850os_abort(PyObject *module, PyObject *Py_UNUSED(ignored))
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03006851{
6852 return os_abort_impl(module);
6853}
6854
Steve Dowercc16be82016-09-08 10:35:16 -07006855#if defined(MS_WINDOWS)
6856
6857PyDoc_STRVAR(os_startfile__doc__,
Serhiy Storchaka279f4462019-09-14 12:24:05 +03006858"startfile($module, /, filepath, operation=<unrepresentable>)\n"
Steve Dowercc16be82016-09-08 10:35:16 -07006859"--\n"
6860"\n"
Steve Dowercc16be82016-09-08 10:35:16 -07006861"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 \
Serhiy Storchaka4a934d42018-11-27 11:27:36 +02006879 {"startfile", (PyCFunction)(void(*)(void))os_startfile, METH_FASTCALL|METH_KEYWORDS, os_startfile__doc__},
Steve Dowercc16be82016-09-08 10:35:16 -07006880
6881static PyObject *
Serhiy Storchakaafb3e712018-12-14 11:19:51 +02006882os_startfile_impl(PyObject *module, path_t *filepath,
6883 const Py_UNICODE *operation);
Steve Dowercc16be82016-09-08 10:35:16 -07006884
6885static PyObject *
Serhiy Storchakaa5552f02017-12-15 13:11:11 +02006886os_startfile(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames)
Steve Dowercc16be82016-09-08 10:35:16 -07006887{
6888 PyObject *return_value = NULL;
Victor Stinner37e4ef72016-09-09 20:00:13 -07006889 static const char * const _keywords[] = {"filepath", "operation", NULL};
6890 static _PyArg_Parser _parser = {"O&|u:startfile", _keywords, 0};
Steve Dowercc16be82016-09-08 10:35:16 -07006891 path_t filepath = PATH_T_INITIALIZE("startfile", "filepath", 0, 0);
Serhiy Storchakaafb3e712018-12-14 11:19:51 +02006892 const Py_UNICODE *operation = NULL;
Steve Dowercc16be82016-09-08 10:35:16 -07006893
Victor Stinner3e1fad62017-01-17 01:29:01 +01006894 if (!_PyArg_ParseStackAndKeywords(args, nargs, kwnames, &_parser,
Steve Dowercc16be82016-09-08 10:35:16 -07006895 path_converter, &filepath, &operation)) {
6896 goto exit;
6897 }
6898 return_value = os_startfile_impl(module, &filepath, operation);
6899
6900exit:
6901 /* Cleanup for filepath */
6902 path_cleanup(&filepath);
6903
6904 return return_value;
6905}
6906
6907#endif /* defined(MS_WINDOWS) */
6908
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03006909#if defined(HAVE_GETLOADAVG)
6910
6911PyDoc_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
6924static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03006925os_getloadavg_impl(PyObject *module);
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03006926
6927static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03006928os_getloadavg(PyObject *module, PyObject *Py_UNUSED(ignored))
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03006929{
6930 return os_getloadavg_impl(module);
6931}
6932
6933#endif /* defined(HAVE_GETLOADAVG) */
6934
6935PyDoc_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 \
Serhiy Storchaka4a934d42018-11-27 11:27:36 +02006945 {"device_encoding", (PyCFunction)(void(*)(void))os_device_encoding, METH_FASTCALL|METH_KEYWORDS, os_device_encoding__doc__},
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03006946
6947static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03006948os_device_encoding_impl(PyObject *module, int fd);
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03006949
6950static PyObject *
Serhiy Storchakaa5552f02017-12-15 13:11:11 +02006951os_device_encoding(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames)
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03006952{
6953 PyObject *return_value = NULL;
Serhiy Storchaka9171a8b2016-08-14 10:52:18 +03006954 static const char * const _keywords[] = {"fd", NULL};
Serhiy Storchaka31913912019-03-14 10:32:22 +02006955 static _PyArg_Parser _parser = {NULL, _keywords, "device_encoding", 0};
6956 PyObject *argsbuf[1];
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03006957 int fd;
6958
Serhiy Storchaka31913912019-03-14 10:32:22 +02006959 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()) {
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03006970 goto exit;
Serhiy Storchaka5dee6552016-06-09 16:16:06 +03006971 }
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03006972 return_value = os_device_encoding_impl(module, fd);
6973
6974exit:
6975 return return_value;
6976}
6977
6978#if defined(HAVE_SETRESUID)
6979
6980PyDoc_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 \
Serhiy Storchaka4a934d42018-11-27 11:27:36 +02006987 {"setresuid", (PyCFunction)(void(*)(void))os_setresuid, METH_FASTCALL, os_setresuid__doc__},
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03006988
6989static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03006990os_setresuid_impl(PyObject *module, uid_t ruid, uid_t euid, uid_t suid);
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03006991
6992static PyObject *
Serhiy Storchakaa5552f02017-12-15 13:11:11 +02006993os_setresuid(PyObject *module, PyObject *const *args, Py_ssize_t nargs)
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03006994{
6995 PyObject *return_value = NULL;
6996 uid_t ruid;
6997 uid_t euid;
6998 uid_t suid;
6999
Serhiy Storchaka4fa95912019-01-11 16:01:14 +02007000 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)) {
Victor Stinner259f0e42017-01-17 01:35:17 +01007010 goto exit;
7011 }
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03007012 return_value = os_setresuid_impl(module, ruid, euid, suid);
7013
7014exit:
7015 return return_value;
7016}
7017
7018#endif /* defined(HAVE_SETRESUID) */
7019
7020#if defined(HAVE_SETRESGID)
7021
7022PyDoc_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 \
Serhiy Storchaka4a934d42018-11-27 11:27:36 +02007029 {"setresgid", (PyCFunction)(void(*)(void))os_setresgid, METH_FASTCALL, os_setresgid__doc__},
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03007030
7031static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03007032os_setresgid_impl(PyObject *module, gid_t rgid, gid_t egid, gid_t sgid);
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03007033
7034static PyObject *
Serhiy Storchakaa5552f02017-12-15 13:11:11 +02007035os_setresgid(PyObject *module, PyObject *const *args, Py_ssize_t nargs)
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03007036{
7037 PyObject *return_value = NULL;
7038 gid_t rgid;
7039 gid_t egid;
7040 gid_t sgid;
7041
Serhiy Storchaka4fa95912019-01-11 16:01:14 +02007042 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)) {
Victor Stinner259f0e42017-01-17 01:35:17 +01007052 goto exit;
7053 }
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03007054 return_value = os_setresgid_impl(module, rgid, egid, sgid);
7055
7056exit:
7057 return return_value;
7058}
7059
7060#endif /* defined(HAVE_SETRESGID) */
7061
7062#if defined(HAVE_GETRESUID)
7063
7064PyDoc_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
7073static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03007074os_getresuid_impl(PyObject *module);
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03007075
7076static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03007077os_getresuid(PyObject *module, PyObject *Py_UNUSED(ignored))
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03007078{
7079 return os_getresuid_impl(module);
7080}
7081
7082#endif /* defined(HAVE_GETRESUID) */
7083
7084#if defined(HAVE_GETRESGID)
7085
7086PyDoc_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
7095static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03007096os_getresgid_impl(PyObject *module);
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03007097
7098static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03007099os_getresgid(PyObject *module, PyObject *Py_UNUSED(ignored))
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03007100{
7101 return os_getresgid_impl(module);
7102}
7103
7104#endif /* defined(HAVE_GETRESGID) */
7105
7106#if defined(USE_XATTRS)
7107
7108PyDoc_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"
BNMetricsb9427072018-11-02 15:20:19 +00007114"path may be either a string, a path-like object, or an open file descriptor.\n"
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03007115"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 \
Serhiy Storchaka4a934d42018-11-27 11:27:36 +02007120 {"getxattr", (PyCFunction)(void(*)(void))os_getxattr, METH_FASTCALL|METH_KEYWORDS, os_getxattr__doc__},
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03007121
7122static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03007123os_getxattr_impl(PyObject *module, path_t *path, path_t *attribute,
Larry Hastings89964c42015-04-14 18:07:59 -04007124 int follow_symlinks);
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03007125
7126static PyObject *
Serhiy Storchakaa5552f02017-12-15 13:11:11 +02007127os_getxattr(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames)
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03007128{
7129 PyObject *return_value = NULL;
Serhiy Storchaka9171a8b2016-08-14 10:52:18 +03007130 static const char * const _keywords[] = {"path", "attribute", "follow_symlinks", NULL};
Serhiy Storchaka31913912019-03-14 10:32:22 +02007131 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;
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03007134 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
Serhiy Storchaka31913912019-03-14 10:32:22 +02007138 args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 2, 2, 0, argsbuf);
7139 if (!args) {
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03007140 goto exit;
Serhiy Storchaka5dee6552016-06-09 16:16:06 +03007141 }
Serhiy Storchaka31913912019-03-14 10:32:22 +02007142 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 }
7155skip_optional_kwonly:
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03007156 return_value = os_getxattr_impl(module, &path, &attribute, follow_symlinks);
7157
7158exit:
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
7171PyDoc_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"
BNMetricsb9427072018-11-02 15:20:19 +00007178"path may be either a string, a path-like object, or an open file descriptor.\n"
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03007179"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 \
Serhiy Storchaka4a934d42018-11-27 11:27:36 +02007184 {"setxattr", (PyCFunction)(void(*)(void))os_setxattr, METH_FASTCALL|METH_KEYWORDS, os_setxattr__doc__},
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03007185
7186static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03007187os_setxattr_impl(PyObject *module, path_t *path, path_t *attribute,
Larry Hastings89964c42015-04-14 18:07:59 -04007188 Py_buffer *value, int flags, int follow_symlinks);
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03007189
7190static PyObject *
Serhiy Storchakaa5552f02017-12-15 13:11:11 +02007191os_setxattr(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames)
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03007192{
7193 PyObject *return_value = NULL;
Serhiy Storchaka9171a8b2016-08-14 10:52:18 +03007194 static const char * const _keywords[] = {"path", "attribute", "value", "flags", "follow_symlinks", NULL};
Serhiy Storchaka31913912019-03-14 10:32:22 +02007195 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;
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03007198 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
Serhiy Storchaka31913912019-03-14 10:32:22 +02007204 args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 3, 4, 0, argsbuf);
7205 if (!args) {
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03007206 goto exit;
Serhiy Storchaka5dee6552016-06-09 16:16:06 +03007207 }
Serhiy Storchaka31913912019-03-14 10:32:22 +02007208 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')) {
Rémi Lapeyre4901fe22019-08-29 16:49:08 +02007218 _PyArg_BadArgument("setxattr", "argument 'value'", "contiguous buffer", args[2]);
Serhiy Storchaka31913912019-03-14 10:32:22 +02007219 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 }
7238skip_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 }
7246skip_optional_kwonly:
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03007247 return_value = os_setxattr_impl(module, &path, &attribute, &value, flags, follow_symlinks);
7248
7249exit:
7250 /* Cleanup for path */
7251 path_cleanup(&path);
7252 /* Cleanup for attribute */
7253 path_cleanup(&attribute);
7254 /* Cleanup for value */
Serhiy Storchaka5dee6552016-06-09 16:16:06 +03007255 if (value.obj) {
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03007256 PyBuffer_Release(&value);
Serhiy Storchaka5dee6552016-06-09 16:16:06 +03007257 }
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03007258
7259 return return_value;
7260}
7261
7262#endif /* defined(USE_XATTRS) */
7263
7264#if defined(USE_XATTRS)
7265
7266PyDoc_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"
BNMetricsb9427072018-11-02 15:20:19 +00007272"path may be either a string, a path-like object, or an open file descriptor.\n"
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03007273"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 \
Serhiy Storchaka4a934d42018-11-27 11:27:36 +02007278 {"removexattr", (PyCFunction)(void(*)(void))os_removexattr, METH_FASTCALL|METH_KEYWORDS, os_removexattr__doc__},
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03007279
7280static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03007281os_removexattr_impl(PyObject *module, path_t *path, path_t *attribute,
Larry Hastings89964c42015-04-14 18:07:59 -04007282 int follow_symlinks);
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03007283
7284static PyObject *
Serhiy Storchakaa5552f02017-12-15 13:11:11 +02007285os_removexattr(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames)
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03007286{
7287 PyObject *return_value = NULL;
Serhiy Storchaka9171a8b2016-08-14 10:52:18 +03007288 static const char * const _keywords[] = {"path", "attribute", "follow_symlinks", NULL};
Serhiy Storchaka31913912019-03-14 10:32:22 +02007289 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;
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03007292 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
Serhiy Storchaka31913912019-03-14 10:32:22 +02007296 args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 2, 2, 0, argsbuf);
7297 if (!args) {
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03007298 goto exit;
Serhiy Storchaka5dee6552016-06-09 16:16:06 +03007299 }
Serhiy Storchaka31913912019-03-14 10:32:22 +02007300 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 }
7313skip_optional_kwonly:
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03007314 return_value = os_removexattr_impl(module, &path, &attribute, follow_symlinks);
7315
7316exit:
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
7329PyDoc_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"
BNMetricsb9427072018-11-02 15:20:19 +00007335"path may be either None, a string, a path-like object, or an open file descriptor.\n"
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03007336"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 \
Serhiy Storchaka4a934d42018-11-27 11:27:36 +02007342 {"listxattr", (PyCFunction)(void(*)(void))os_listxattr, METH_FASTCALL|METH_KEYWORDS, os_listxattr__doc__},
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03007343
7344static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03007345os_listxattr_impl(PyObject *module, path_t *path, int follow_symlinks);
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03007346
7347static PyObject *
Serhiy Storchakaa5552f02017-12-15 13:11:11 +02007348os_listxattr(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames)
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03007349{
7350 PyObject *return_value = NULL;
Serhiy Storchaka9171a8b2016-08-14 10:52:18 +03007351 static const char * const _keywords[] = {"path", "follow_symlinks", NULL};
Serhiy Storchaka31913912019-03-14 10:32:22 +02007352 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;
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03007355 path_t path = PATH_T_INITIALIZE("listxattr", "path", 1, 1);
7356 int follow_symlinks = 1;
7357
Serhiy Storchaka31913912019-03-14 10:32:22 +02007358 args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 0, 1, 0, argsbuf);
7359 if (!args) {
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03007360 goto exit;
Serhiy Storchaka5dee6552016-06-09 16:16:06 +03007361 }
Serhiy Storchaka31913912019-03-14 10:32:22 +02007362 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 }
7373skip_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 }
7381skip_optional_kwonly:
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03007382 return_value = os_listxattr_impl(module, &path, follow_symlinks);
7383
7384exit:
7385 /* Cleanup for path */
7386 path_cleanup(&path);
7387
7388 return return_value;
7389}
7390
7391#endif /* defined(USE_XATTRS) */
7392
7393PyDoc_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 \
Serhiy Storchaka92e8af62015-04-04 00:12:11 +03007400 {"urandom", (PyCFunction)os_urandom, METH_O, os_urandom__doc__},
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03007401
7402static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03007403os_urandom_impl(PyObject *module, Py_ssize_t size);
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03007404
7405static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03007406os_urandom(PyObject *module, PyObject *arg)
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03007407{
7408 PyObject *return_value = NULL;
7409 Py_ssize_t size;
7410
Serhiy Storchaka32d96a22018-12-25 13:23:47 +02007411 if (PyFloat_Check(arg)) {
7412 PyErr_SetString(PyExc_TypeError,
7413 "integer argument expected, got float" );
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03007414 goto exit;
Serhiy Storchaka5dee6552016-06-09 16:16:06 +03007415 }
Serhiy Storchaka32d96a22018-12-25 13:23:47 +02007416 {
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 }
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03007428 return_value = os_urandom_impl(module, size);
7429
7430exit:
7431 return return_value;
7432}
7433
Zackery Spytz43fdbd22019-05-29 13:57:07 -06007434#if defined(HAVE_MEMFD_CREATE)
7435
7436PyDoc_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
7444static PyObject *
7445os_memfd_create_impl(PyObject *module, PyObject *name, unsigned int flags);
7446
7447static PyObject *
7448os_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 }
7477skip_optional_pos:
7478 return_value = os_memfd_create_impl(module, name, flags);
7479
7480exit:
7481 /* Cleanup for name */
7482 Py_XDECREF(name);
7483
7484 return return_value;
7485}
7486
7487#endif /* defined(HAVE_MEMFD_CREATE) */
7488
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03007489PyDoc_STRVAR(os_cpu_count__doc__,
7490"cpu_count($module, /)\n"
7491"--\n"
7492"\n"
Charles-François Natali80d62e62015-08-13 20:37:08 +01007493"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))``");
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03007498
7499#define OS_CPU_COUNT_METHODDEF \
7500 {"cpu_count", (PyCFunction)os_cpu_count, METH_NOARGS, os_cpu_count__doc__},
7501
7502static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03007503os_cpu_count_impl(PyObject *module);
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03007504
7505static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03007506os_cpu_count(PyObject *module, PyObject *Py_UNUSED(ignored))
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03007507{
7508 return os_cpu_count_impl(module);
7509}
7510
7511PyDoc_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 \
Serhiy Storchaka92e8af62015-04-04 00:12:11 +03007518 {"get_inheritable", (PyCFunction)os_get_inheritable, METH_O, os_get_inheritable__doc__},
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03007519
7520static int
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03007521os_get_inheritable_impl(PyObject *module, int fd);
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03007522
7523static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03007524os_get_inheritable(PyObject *module, PyObject *arg)
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03007525{
7526 PyObject *return_value = NULL;
7527 int fd;
7528 int _return_value;
7529
Serhiy Storchaka32d96a22018-12-25 13:23:47 +02007530 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()) {
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03007537 goto exit;
Serhiy Storchaka5dee6552016-06-09 16:16:06 +03007538 }
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03007539 _return_value = os_get_inheritable_impl(module, fd);
Serhiy Storchaka5dee6552016-06-09 16:16:06 +03007540 if ((_return_value == -1) && PyErr_Occurred()) {
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03007541 goto exit;
Serhiy Storchaka5dee6552016-06-09 16:16:06 +03007542 }
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03007543 return_value = PyBool_FromLong((long)_return_value);
7544
7545exit:
7546 return return_value;
7547}
7548
7549PyDoc_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 \
Serhiy Storchaka4a934d42018-11-27 11:27:36 +02007556 {"set_inheritable", (PyCFunction)(void(*)(void))os_set_inheritable, METH_FASTCALL, os_set_inheritable__doc__},
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03007557
7558static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03007559os_set_inheritable_impl(PyObject *module, int fd, int inheritable);
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03007560
7561static PyObject *
Serhiy Storchakaa5552f02017-12-15 13:11:11 +02007562os_set_inheritable(PyObject *module, PyObject *const *args, Py_ssize_t nargs)
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03007563{
7564 PyObject *return_value = NULL;
7565 int fd;
7566 int inheritable;
7567
Serhiy Storchaka4fa95912019-01-11 16:01:14 +02007568 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()) {
Victor Stinner259f0e42017-01-17 01:35:17 +01007587 goto exit;
7588 }
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03007589 return_value = os_set_inheritable_impl(module, fd, inheritable);
7590
7591exit:
7592 return return_value;
7593}
7594
7595#if defined(MS_WINDOWS)
7596
7597PyDoc_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 \
Serhiy Storchaka92e8af62015-04-04 00:12:11 +03007604 {"get_handle_inheritable", (PyCFunction)os_get_handle_inheritable, METH_O, os_get_handle_inheritable__doc__},
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03007605
7606static int
Victor Stinner581139c2016-09-06 15:54:20 -07007607os_get_handle_inheritable_impl(PyObject *module, intptr_t handle);
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03007608
7609static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03007610os_get_handle_inheritable(PyObject *module, PyObject *arg)
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03007611{
7612 PyObject *return_value = NULL;
Victor Stinner581139c2016-09-06 15:54:20 -07007613 intptr_t handle;
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03007614 int _return_value;
7615
Serhiy Storchaka5dee6552016-06-09 16:16:06 +03007616 if (!PyArg_Parse(arg, "" _Py_PARSE_INTPTR ":get_handle_inheritable", &handle)) {
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03007617 goto exit;
Serhiy Storchaka5dee6552016-06-09 16:16:06 +03007618 }
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03007619 _return_value = os_get_handle_inheritable_impl(module, handle);
Serhiy Storchaka5dee6552016-06-09 16:16:06 +03007620 if ((_return_value == -1) && PyErr_Occurred()) {
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03007621 goto exit;
Serhiy Storchaka5dee6552016-06-09 16:16:06 +03007622 }
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03007623 return_value = PyBool_FromLong((long)_return_value);
7624
7625exit:
7626 return return_value;
7627}
7628
7629#endif /* defined(MS_WINDOWS) */
7630
7631#if defined(MS_WINDOWS)
7632
7633PyDoc_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 \
Serhiy Storchaka4a934d42018-11-27 11:27:36 +02007640 {"set_handle_inheritable", (PyCFunction)(void(*)(void))os_set_handle_inheritable, METH_FASTCALL, os_set_handle_inheritable__doc__},
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03007641
7642static PyObject *
Victor Stinner581139c2016-09-06 15:54:20 -07007643os_set_handle_inheritable_impl(PyObject *module, intptr_t handle,
Larry Hastings89964c42015-04-14 18:07:59 -04007644 int inheritable);
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03007645
7646static PyObject *
Serhiy Storchakaa5552f02017-12-15 13:11:11 +02007647os_set_handle_inheritable(PyObject *module, PyObject *const *args, Py_ssize_t nargs)
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03007648{
7649 PyObject *return_value = NULL;
Victor Stinner581139c2016-09-06 15:54:20 -07007650 intptr_t handle;
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03007651 int inheritable;
7652
Sylvain74453812017-06-10 06:51:48 +02007653 if (!_PyArg_ParseStack(args, nargs, "" _Py_PARSE_INTPTR "p:set_handle_inheritable",
7654 &handle, &inheritable)) {
Victor Stinner259f0e42017-01-17 01:35:17 +01007655 goto exit;
7656 }
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03007657 return_value = os_set_handle_inheritable_impl(module, handle, inheritable);
7658
7659exit:
7660 return return_value;
7661}
7662
7663#endif /* defined(MS_WINDOWS) */
7664
Serhiy Storchaka12a69db2018-09-17 15:38:27 +03007665#if !defined(MS_WINDOWS)
7666
7667PyDoc_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
7678static int
7679os_get_blocking_impl(PyObject *module, int fd);
7680
7681static PyObject *
7682os_get_blocking(PyObject *module, PyObject *arg)
7683{
7684 PyObject *return_value = NULL;
7685 int fd;
7686 int _return_value;
7687
Serhiy Storchaka32d96a22018-12-25 13:23:47 +02007688 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()) {
Serhiy Storchaka12a69db2018-09-17 15:38:27 +03007695 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
7703exit:
7704 return return_value;
7705}
7706
7707#endif /* !defined(MS_WINDOWS) */
7708
7709#if !defined(MS_WINDOWS)
7710
7711PyDoc_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 \
Serhiy Storchaka4a934d42018-11-27 11:27:36 +02007721 {"set_blocking", (PyCFunction)(void(*)(void))os_set_blocking, METH_FASTCALL, os_set_blocking__doc__},
Serhiy Storchaka12a69db2018-09-17 15:38:27 +03007722
7723static PyObject *
7724os_set_blocking_impl(PyObject *module, int fd, int blocking);
7725
7726static PyObject *
7727os_set_blocking(PyObject *module, PyObject *const *args, Py_ssize_t nargs)
7728{
7729 PyObject *return_value = NULL;
7730 int fd;
7731 int blocking;
7732
Serhiy Storchaka4fa95912019-01-11 16:01:14 +02007733 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()) {
Serhiy Storchaka12a69db2018-09-17 15:38:27 +03007752 goto exit;
7753 }
7754 return_value = os_set_blocking_impl(module, fd, blocking);
7755
7756exit:
7757 return return_value;
7758}
7759
7760#endif /* !defined(MS_WINDOWS) */
7761
Serhiy Storchaka49d02d12016-11-06 13:45:33 +02007762PyDoc_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
7771static int
7772os_DirEntry_is_symlink_impl(DirEntry *self);
7773
7774static PyObject *
7775os_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
7786exit:
7787 return return_value;
7788}
7789
7790PyDoc_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 \
Serhiy Storchaka4a934d42018-11-27 11:27:36 +02007797 {"stat", (PyCFunction)(void(*)(void))os_DirEntry_stat, METH_FASTCALL|METH_KEYWORDS, os_DirEntry_stat__doc__},
Serhiy Storchaka49d02d12016-11-06 13:45:33 +02007798
7799static PyObject *
7800os_DirEntry_stat_impl(DirEntry *self, int follow_symlinks);
7801
7802static PyObject *
Serhiy Storchakaa5552f02017-12-15 13:11:11 +02007803os_DirEntry_stat(DirEntry *self, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames)
Serhiy Storchaka49d02d12016-11-06 13:45:33 +02007804{
7805 PyObject *return_value = NULL;
7806 static const char * const _keywords[] = {"follow_symlinks", NULL};
Serhiy Storchaka31913912019-03-14 10:32:22 +02007807 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;
Serhiy Storchaka49d02d12016-11-06 13:45:33 +02007810 int follow_symlinks = 1;
7811
Serhiy Storchaka31913912019-03-14 10:32:22 +02007812 args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 0, 0, 0, argsbuf);
7813 if (!args) {
Serhiy Storchaka49d02d12016-11-06 13:45:33 +02007814 goto exit;
7815 }
Serhiy Storchaka31913912019-03-14 10:32:22 +02007816 if (!noptargs) {
7817 goto skip_optional_kwonly;
7818 }
7819 follow_symlinks = PyObject_IsTrue(args[0]);
7820 if (follow_symlinks < 0) {
7821 goto exit;
7822 }
7823skip_optional_kwonly:
Serhiy Storchaka49d02d12016-11-06 13:45:33 +02007824 return_value = os_DirEntry_stat_impl(self, follow_symlinks);
7825
7826exit:
7827 return return_value;
7828}
7829
7830PyDoc_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 \
Serhiy Storchaka4a934d42018-11-27 11:27:36 +02007837 {"is_dir", (PyCFunction)(void(*)(void))os_DirEntry_is_dir, METH_FASTCALL|METH_KEYWORDS, os_DirEntry_is_dir__doc__},
Serhiy Storchaka49d02d12016-11-06 13:45:33 +02007838
7839static int
7840os_DirEntry_is_dir_impl(DirEntry *self, int follow_symlinks);
7841
7842static PyObject *
Serhiy Storchakaa5552f02017-12-15 13:11:11 +02007843os_DirEntry_is_dir(DirEntry *self, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames)
Serhiy Storchaka49d02d12016-11-06 13:45:33 +02007844{
7845 PyObject *return_value = NULL;
7846 static const char * const _keywords[] = {"follow_symlinks", NULL};
Serhiy Storchaka31913912019-03-14 10:32:22 +02007847 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;
Serhiy Storchaka49d02d12016-11-06 13:45:33 +02007850 int follow_symlinks = 1;
7851 int _return_value;
7852
Serhiy Storchaka31913912019-03-14 10:32:22 +02007853 args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 0, 0, 0, argsbuf);
7854 if (!args) {
Serhiy Storchaka49d02d12016-11-06 13:45:33 +02007855 goto exit;
7856 }
Serhiy Storchaka31913912019-03-14 10:32:22 +02007857 if (!noptargs) {
7858 goto skip_optional_kwonly;
7859 }
7860 follow_symlinks = PyObject_IsTrue(args[0]);
7861 if (follow_symlinks < 0) {
7862 goto exit;
7863 }
7864skip_optional_kwonly:
Serhiy Storchaka49d02d12016-11-06 13:45:33 +02007865 _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
7871exit:
7872 return return_value;
7873}
7874
7875PyDoc_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 \
Serhiy Storchaka4a934d42018-11-27 11:27:36 +02007882 {"is_file", (PyCFunction)(void(*)(void))os_DirEntry_is_file, METH_FASTCALL|METH_KEYWORDS, os_DirEntry_is_file__doc__},
Serhiy Storchaka49d02d12016-11-06 13:45:33 +02007883
7884static int
7885os_DirEntry_is_file_impl(DirEntry *self, int follow_symlinks);
7886
7887static PyObject *
Serhiy Storchakaa5552f02017-12-15 13:11:11 +02007888os_DirEntry_is_file(DirEntry *self, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames)
Serhiy Storchaka49d02d12016-11-06 13:45:33 +02007889{
7890 PyObject *return_value = NULL;
7891 static const char * const _keywords[] = {"follow_symlinks", NULL};
Serhiy Storchaka31913912019-03-14 10:32:22 +02007892 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;
Serhiy Storchaka49d02d12016-11-06 13:45:33 +02007895 int follow_symlinks = 1;
7896 int _return_value;
7897
Serhiy Storchaka31913912019-03-14 10:32:22 +02007898 args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 0, 0, 0, argsbuf);
7899 if (!args) {
Serhiy Storchaka49d02d12016-11-06 13:45:33 +02007900 goto exit;
7901 }
Serhiy Storchaka31913912019-03-14 10:32:22 +02007902 if (!noptargs) {
7903 goto skip_optional_kwonly;
7904 }
7905 follow_symlinks = PyObject_IsTrue(args[0]);
7906 if (follow_symlinks < 0) {
7907 goto exit;
7908 }
7909skip_optional_kwonly:
Serhiy Storchaka49d02d12016-11-06 13:45:33 +02007910 _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
7916exit:
7917 return return_value;
7918}
7919
7920PyDoc_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
7929static PyObject *
7930os_DirEntry_inode_impl(DirEntry *self);
7931
7932static PyObject *
7933os_DirEntry_inode(DirEntry *self, PyObject *Py_UNUSED(ignored))
7934{
7935 return os_DirEntry_inode_impl(self);
7936}
7937
7938PyDoc_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
7947static PyObject *
7948os_DirEntry___fspath___impl(DirEntry *self);
7949
7950static PyObject *
7951os_DirEntry___fspath__(DirEntry *self, PyObject *Py_UNUSED(ignored))
7952{
7953 return os_DirEntry___fspath___impl(self);
7954}
7955
7956PyDoc_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"
BNMetricsb9427072018-11-02 15:20:19 +00007962"path can be specified as either str, bytes, or a path-like object. If path\n"
Serhiy Storchaka49d02d12016-11-06 13:45:33 +02007963"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 \
Serhiy Storchaka4a934d42018-11-27 11:27:36 +02007969 {"scandir", (PyCFunction)(void(*)(void))os_scandir, METH_FASTCALL|METH_KEYWORDS, os_scandir__doc__},
Serhiy Storchaka49d02d12016-11-06 13:45:33 +02007970
7971static PyObject *
7972os_scandir_impl(PyObject *module, path_t *path);
7973
7974static PyObject *
Serhiy Storchakaa5552f02017-12-15 13:11:11 +02007975os_scandir(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames)
Serhiy Storchaka49d02d12016-11-06 13:45:33 +02007976{
7977 PyObject *return_value = NULL;
7978 static const char * const _keywords[] = {"path", NULL};
Serhiy Storchaka31913912019-03-14 10:32:22 +02007979 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;
Serhiy Storchakaea720fe2017-03-30 09:12:31 +03007982 path_t path = PATH_T_INITIALIZE("scandir", "path", 1, PATH_HAVE_FDOPENDIR);
Serhiy Storchaka49d02d12016-11-06 13:45:33 +02007983
Serhiy Storchaka31913912019-03-14 10:32:22 +02007984 args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 0, 1, 0, argsbuf);
7985 if (!args) {
Serhiy Storchaka49d02d12016-11-06 13:45:33 +02007986 goto exit;
7987 }
Serhiy Storchaka31913912019-03-14 10:32:22 +02007988 if (!noptargs) {
7989 goto skip_optional_pos;
7990 }
7991 if (!path_converter(args[0], &path)) {
7992 goto exit;
7993 }
7994skip_optional_pos:
Serhiy Storchaka49d02d12016-11-06 13:45:33 +02007995 return_value = os_scandir_impl(module, &path);
7996
7997exit:
7998 /* Cleanup for path */
7999 path_cleanup(&path);
8000
8001 return return_value;
8002}
8003
Ethan Furman410ef8e2016-06-04 12:06:26 -07008004PyDoc_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"
Brett Cannonb4f43e92016-06-09 14:32:08 -07008010"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.");
Ethan Furman410ef8e2016-06-04 12:06:26 -07008013
8014#define OS_FSPATH_METHODDEF \
Serhiy Storchaka4a934d42018-11-27 11:27:36 +02008015 {"fspath", (PyCFunction)(void(*)(void))os_fspath, METH_FASTCALL|METH_KEYWORDS, os_fspath__doc__},
Ethan Furman410ef8e2016-06-04 12:06:26 -07008016
8017static PyObject *
Serhiy Storchaka2954f832016-07-07 18:20:03 +03008018os_fspath_impl(PyObject *module, PyObject *path);
Ethan Furman410ef8e2016-06-04 12:06:26 -07008019
8020static PyObject *
Serhiy Storchakaa5552f02017-12-15 13:11:11 +02008021os_fspath(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames)
Ethan Furman410ef8e2016-06-04 12:06:26 -07008022{
8023 PyObject *return_value = NULL;
Serhiy Storchaka9171a8b2016-08-14 10:52:18 +03008024 static const char * const _keywords[] = {"path", NULL};
Serhiy Storchaka31913912019-03-14 10:32:22 +02008025 static _PyArg_Parser _parser = {NULL, _keywords, "fspath", 0};
8026 PyObject *argsbuf[1];
Ethan Furman410ef8e2016-06-04 12:06:26 -07008027 PyObject *path;
8028
Serhiy Storchaka31913912019-03-14 10:32:22 +02008029 args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 1, 1, 0, argsbuf);
8030 if (!args) {
Ethan Furman410ef8e2016-06-04 12:06:26 -07008031 goto exit;
Serhiy Storchaka5dee6552016-06-09 16:16:06 +03008032 }
Serhiy Storchaka31913912019-03-14 10:32:22 +02008033 path = args[0];
Ethan Furman410ef8e2016-06-04 12:06:26 -07008034 return_value = os_fspath_impl(module, path);
8035
8036exit:
8037 return return_value;
8038}
8039
Victor Stinner9b1f4742016-09-06 16:18:52 -07008040#if defined(HAVE_GETRANDOM_SYSCALL)
8041
8042PyDoc_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 \
Serhiy Storchaka4a934d42018-11-27 11:27:36 +02008049 {"getrandom", (PyCFunction)(void(*)(void))os_getrandom, METH_FASTCALL|METH_KEYWORDS, os_getrandom__doc__},
Victor Stinner9b1f4742016-09-06 16:18:52 -07008050
8051static PyObject *
8052os_getrandom_impl(PyObject *module, Py_ssize_t size, int flags);
8053
8054static PyObject *
Serhiy Storchakaa5552f02017-12-15 13:11:11 +02008055os_getrandom(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames)
Victor Stinner9b1f4742016-09-06 16:18:52 -07008056{
8057 PyObject *return_value = NULL;
8058 static const char * const _keywords[] = {"size", "flags", NULL};
Serhiy Storchaka31913912019-03-14 10:32:22 +02008059 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;
Victor Stinner9b1f4742016-09-06 16:18:52 -07008062 Py_ssize_t size;
8063 int flags = 0;
8064
Serhiy Storchaka31913912019-03-14 10:32:22 +02008065 args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 1, 2, 0, argsbuf);
8066 if (!args) {
Victor Stinner9b1f4742016-09-06 16:18:52 -07008067 goto exit;
8068 }
Serhiy Storchaka31913912019-03-14 10:32:22 +02008069 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 }
8098skip_optional_pos:
Victor Stinner9b1f4742016-09-06 16:18:52 -07008099 return_value = os_getrandom_impl(module, size, flags);
8100
8101exit:
8102 return return_value;
8103}
8104
8105#endif /* defined(HAVE_GETRANDOM_SYSCALL) */
8106
Steve Dower2438cdf2019-03-29 16:37:16 -07008107#if defined(MS_WINDOWS)
8108
8109PyDoc_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
8125static PyObject *
8126os__add_dll_directory_impl(PyObject *module, path_t *path);
8127
8128static PyObject *
8129os__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
8146exit:
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
8157PyDoc_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
8170static PyObject *
8171os__remove_dll_directory_impl(PyObject *module, PyObject *cookie);
8172
8173static PyObject *
8174os__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
8189exit:
8190 return return_value;
8191}
8192
8193#endif /* defined(MS_WINDOWS) */
8194
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03008195#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
Serhiy Storchakaf0b50152015-05-13 00:52:39 +03008255#ifndef OS__GETFULLPATHNAME_METHODDEF
8256 #define OS__GETFULLPATHNAME_METHODDEF
8257#endif /* !defined(OS__GETFULLPATHNAME_METHODDEF) */
8258
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03008259#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
Pablo Galindo6c6ddf92018-01-29 01:56:10 +00008295#ifndef OS_POSIX_SPAWN_METHODDEF
8296 #define OS_POSIX_SPAWN_METHODDEF
8297#endif /* !defined(OS_POSIX_SPAWN_METHODDEF) */
8298
Joannah Nanjekye92b83222019-01-16 16:29:26 +03008299#ifndef OS_POSIX_SPAWNP_METHODDEF
8300 #define OS_POSIX_SPAWNP_METHODDEF
8301#endif /* !defined(OS_POSIX_SPAWNP_METHODDEF) */
8302
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03008303#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
Antoine Pitrou346cbd32017-05-27 17:50:54 +02008311#ifndef OS_REGISTER_AT_FORK_METHODDEF
8312 #define OS_REGISTER_AT_FORK_METHODDEF
8313#endif /* !defined(OS_REGISTER_AT_FORK_METHODDEF) */
8314
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03008315#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
Berker Peksag39404992016-09-15 20:45:16 +03008383#ifndef OS_GETPID_METHODDEF
8384 #define OS_GETPID_METHODDEF
8385#endif /* !defined(OS_GETPID_METHODDEF) */
8386
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03008387#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
Serhiy Storchaka12a69db2018-09-17 15:38:27 +03008475#ifndef OS_READLINK_METHODDEF
8476 #define OS_READLINK_METHODDEF
8477#endif /* !defined(OS_READLINK_METHODDEF) */
8478
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03008479#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
Pablo Galindo4defba32018-01-27 16:16:37 +00008519#ifndef OS_PREADV_METHODDEF
8520 #define OS_PREADV_METHODDEF
8521#endif /* !defined(OS_PREADV_METHODDEF) */
8522
Giampaolo Rodola4a172cc2018-06-12 23:04:50 +02008523#ifndef OS__FCOPYFILE_METHODDEF
8524 #define OS__FCOPYFILE_METHODDEF
8525#endif /* !defined(OS__FCOPYFILE_METHODDEF) */
8526
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03008527#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
Pablo Galindo4defba32018-01-27 16:16:37 +00008543#ifndef OS_PWRITEV_METHODDEF
8544 #define OS_PWRITEV_METHODDEF
8545#endif /* !defined(OS_PWRITEV_METHODDEF) */
8546
Pablo Galindoaac4d032019-05-31 19:39:47 +01008547#ifndef OS_COPY_FILE_RANGE_METHODDEF
8548 #define OS_COPY_FILE_RANGE_METHODDEF
8549#endif /* !defined(OS_COPY_FILE_RANGE_METHODDEF) */
8550
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03008551#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
Steve Dowercc16be82016-09-08 10:35:16 -07008655#ifndef OS_STARTFILE_METHODDEF
8656 #define OS_STARTFILE_METHODDEF
8657#endif /* !defined(OS_STARTFILE_METHODDEF) */
8658
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03008659#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
Zackery Spytz43fdbd22019-05-29 13:57:07 -06008695#ifndef OS_MEMFD_CREATE_METHODDEF
8696 #define OS_MEMFD_CREATE_METHODDEF
8697#endif /* !defined(OS_MEMFD_CREATE_METHODDEF) */
8698
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03008699#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) */
Victor Stinner9b1f4742016-09-06 16:18:52 -07008706
Serhiy Storchaka12a69db2018-09-17 15:38:27 +03008707#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
Victor Stinner9b1f4742016-09-06 16:18:52 -07008715#ifndef OS_GETRANDOM_METHODDEF
8716 #define OS_GETRANDOM_METHODDEF
8717#endif /* !defined(OS_GETRANDOM_METHODDEF) */
Steve Dower2438cdf2019-03-29 16:37:16 -07008718
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) */
Serhiy Storchaka279f4462019-09-14 12:24:05 +03008726/*[clinic end generated code: output=113d9fbdd18a62f5 input=a9049054013a1b77]*/