blob: 561cbb0ca82ab32a44e0c2c37acb53f6effaf88b [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 *
Dong-hee Naad7736f2019-09-25 14:47:04 +09004802os_pread_impl(PyObject *module, int fd, Py_ssize_t 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;
Dong-hee Naad7736f2019-09-25 14:47:04 +09004809 Py_ssize_t length;
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03004810 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 }
Dong-hee Naad7736f2019-09-25 14:47:04 +09004829 {
4830 Py_ssize_t ival = -1;
4831 PyObject *iobj = PyNumber_Index(args[1]);
4832 if (iobj != NULL) {
4833 ival = PyLong_AsSsize_t(iobj);
4834 Py_DECREF(iobj);
4835 }
4836 if (ival == -1 && PyErr_Occurred()) {
4837 goto exit;
4838 }
4839 length = ival;
Serhiy Storchaka4fa95912019-01-11 16:01:14 +02004840 }
4841 if (!Py_off_t_converter(args[2], &offset)) {
Victor Stinner259f0e42017-01-17 01:35:17 +01004842 goto exit;
4843 }
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03004844 return_value = os_pread_impl(module, fd, length, offset);
4845
4846exit:
4847 return return_value;
4848}
4849
4850#endif /* defined(HAVE_PREAD) */
4851
Pablo Galindo4defba32018-01-27 16:16:37 +00004852#if (defined(HAVE_PREADV) || defined (HAVE_PREADV2))
4853
4854PyDoc_STRVAR(os_preadv__doc__,
4855"preadv($module, fd, buffers, offset, flags=0, /)\n"
4856"--\n"
4857"\n"
4858"Reads from a file descriptor into a number of mutable bytes-like objects.\n"
4859"\n"
4860"Combines the functionality of readv() and pread(). As readv(), it will\n"
4861"transfer data into each buffer until it is full and then move on to the next\n"
4862"buffer in the sequence to hold the rest of the data. Its fourth argument,\n"
4863"specifies the file offset at which the input operation is to be performed. It\n"
4864"will return the total number of bytes read (which can be less than the total\n"
4865"capacity of all the objects).\n"
4866"\n"
4867"The flags argument contains a bitwise OR of zero or more of the following flags:\n"
4868"\n"
4869"- RWF_HIPRI\n"
4870"- RWF_NOWAIT\n"
4871"\n"
4872"Using non-zero flags requires Linux 4.6 or newer.");
4873
4874#define OS_PREADV_METHODDEF \
Serhiy Storchaka4a934d42018-11-27 11:27:36 +02004875 {"preadv", (PyCFunction)(void(*)(void))os_preadv, METH_FASTCALL, os_preadv__doc__},
Pablo Galindo4defba32018-01-27 16:16:37 +00004876
4877static Py_ssize_t
4878os_preadv_impl(PyObject *module, int fd, PyObject *buffers, Py_off_t offset,
4879 int flags);
4880
4881static PyObject *
4882os_preadv(PyObject *module, PyObject *const *args, Py_ssize_t nargs)
4883{
4884 PyObject *return_value = NULL;
4885 int fd;
4886 PyObject *buffers;
4887 Py_off_t offset;
4888 int flags = 0;
4889 Py_ssize_t _return_value;
4890
Serhiy Storchaka4fa95912019-01-11 16:01:14 +02004891 if (!_PyArg_CheckPositional("preadv", nargs, 3, 4)) {
Pablo Galindo4defba32018-01-27 16:16:37 +00004892 goto exit;
4893 }
Serhiy Storchaka4fa95912019-01-11 16:01:14 +02004894 if (PyFloat_Check(args[0])) {
4895 PyErr_SetString(PyExc_TypeError,
4896 "integer argument expected, got float" );
4897 goto exit;
4898 }
4899 fd = _PyLong_AsInt(args[0]);
4900 if (fd == -1 && PyErr_Occurred()) {
4901 goto exit;
4902 }
4903 buffers = args[1];
4904 if (!Py_off_t_converter(args[2], &offset)) {
4905 goto exit;
4906 }
4907 if (nargs < 4) {
4908 goto skip_optional;
4909 }
4910 if (PyFloat_Check(args[3])) {
4911 PyErr_SetString(PyExc_TypeError,
4912 "integer argument expected, got float" );
4913 goto exit;
4914 }
4915 flags = _PyLong_AsInt(args[3]);
4916 if (flags == -1 && PyErr_Occurred()) {
4917 goto exit;
4918 }
4919skip_optional:
Pablo Galindo4defba32018-01-27 16:16:37 +00004920 _return_value = os_preadv_impl(module, fd, buffers, offset, flags);
4921 if ((_return_value == -1) && PyErr_Occurred()) {
4922 goto exit;
4923 }
4924 return_value = PyLong_FromSsize_t(_return_value);
4925
4926exit:
4927 return return_value;
4928}
4929
4930#endif /* (defined(HAVE_PREADV) || defined (HAVE_PREADV2)) */
4931
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03004932PyDoc_STRVAR(os_write__doc__,
4933"write($module, fd, data, /)\n"
4934"--\n"
4935"\n"
4936"Write a bytes object to a file descriptor.");
4937
4938#define OS_WRITE_METHODDEF \
Serhiy Storchaka4a934d42018-11-27 11:27:36 +02004939 {"write", (PyCFunction)(void(*)(void))os_write, METH_FASTCALL, os_write__doc__},
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03004940
4941static Py_ssize_t
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03004942os_write_impl(PyObject *module, int fd, Py_buffer *data);
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03004943
4944static PyObject *
Serhiy Storchakaa5552f02017-12-15 13:11:11 +02004945os_write(PyObject *module, PyObject *const *args, Py_ssize_t nargs)
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03004946{
4947 PyObject *return_value = NULL;
4948 int fd;
4949 Py_buffer data = {NULL, NULL};
4950 Py_ssize_t _return_value;
4951
Serhiy Storchaka4fa95912019-01-11 16:01:14 +02004952 if (!_PyArg_CheckPositional("write", nargs, 2, 2)) {
4953 goto exit;
4954 }
4955 if (PyFloat_Check(args[0])) {
4956 PyErr_SetString(PyExc_TypeError,
4957 "integer argument expected, got float" );
4958 goto exit;
4959 }
4960 fd = _PyLong_AsInt(args[0]);
4961 if (fd == -1 && PyErr_Occurred()) {
4962 goto exit;
4963 }
4964 if (PyObject_GetBuffer(args[1], &data, PyBUF_SIMPLE) != 0) {
4965 goto exit;
4966 }
4967 if (!PyBuffer_IsContiguous(&data, 'C')) {
Rémi Lapeyre4901fe22019-08-29 16:49:08 +02004968 _PyArg_BadArgument("write", "argument 2", "contiguous buffer", args[1]);
Victor Stinner259f0e42017-01-17 01:35:17 +01004969 goto exit;
4970 }
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03004971 _return_value = os_write_impl(module, fd, &data);
Serhiy Storchaka5dee6552016-06-09 16:16:06 +03004972 if ((_return_value == -1) && PyErr_Occurred()) {
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03004973 goto exit;
Serhiy Storchaka5dee6552016-06-09 16:16:06 +03004974 }
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03004975 return_value = PyLong_FromSsize_t(_return_value);
4976
4977exit:
4978 /* Cleanup for data */
Serhiy Storchaka5dee6552016-06-09 16:16:06 +03004979 if (data.obj) {
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03004980 PyBuffer_Release(&data);
Serhiy Storchaka5dee6552016-06-09 16:16:06 +03004981 }
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03004982
4983 return return_value;
4984}
4985
Giampaolo Rodola4a172cc2018-06-12 23:04:50 +02004986#if defined(__APPLE__)
4987
4988PyDoc_STRVAR(os__fcopyfile__doc__,
Serhiy Storchaka140a7d12019-10-13 11:59:31 +03004989"_fcopyfile($module, in_fd, out_fd, flags, /)\n"
Giampaolo Rodola4a172cc2018-06-12 23:04:50 +02004990"--\n"
4991"\n"
Giampaolo Rodolac7f02a92018-06-19 08:27:29 -07004992"Efficiently copy content or metadata of 2 regular file descriptors (macOS).");
Giampaolo Rodola4a172cc2018-06-12 23:04:50 +02004993
4994#define OS__FCOPYFILE_METHODDEF \
Serhiy Storchaka4a934d42018-11-27 11:27:36 +02004995 {"_fcopyfile", (PyCFunction)(void(*)(void))os__fcopyfile, METH_FASTCALL, os__fcopyfile__doc__},
Giampaolo Rodola4a172cc2018-06-12 23:04:50 +02004996
4997static PyObject *
Serhiy Storchaka140a7d12019-10-13 11:59:31 +03004998os__fcopyfile_impl(PyObject *module, int in_fd, int out_fd, int flags);
Giampaolo Rodola4a172cc2018-06-12 23:04:50 +02004999
5000static PyObject *
5001os__fcopyfile(PyObject *module, PyObject *const *args, Py_ssize_t nargs)
5002{
5003 PyObject *return_value = NULL;
Serhiy Storchaka140a7d12019-10-13 11:59:31 +03005004 int in_fd;
5005 int out_fd;
Giampaolo Rodola4a172cc2018-06-12 23:04:50 +02005006 int flags;
5007
Serhiy Storchaka4fa95912019-01-11 16:01:14 +02005008 if (!_PyArg_CheckPositional("_fcopyfile", nargs, 3, 3)) {
5009 goto exit;
5010 }
5011 if (PyFloat_Check(args[0])) {
5012 PyErr_SetString(PyExc_TypeError,
5013 "integer argument expected, got float" );
5014 goto exit;
5015 }
Serhiy Storchaka140a7d12019-10-13 11:59:31 +03005016 in_fd = _PyLong_AsInt(args[0]);
5017 if (in_fd == -1 && PyErr_Occurred()) {
Serhiy Storchaka4fa95912019-01-11 16:01:14 +02005018 goto exit;
5019 }
5020 if (PyFloat_Check(args[1])) {
5021 PyErr_SetString(PyExc_TypeError,
5022 "integer argument expected, got float" );
5023 goto exit;
5024 }
Serhiy Storchaka140a7d12019-10-13 11:59:31 +03005025 out_fd = _PyLong_AsInt(args[1]);
5026 if (out_fd == -1 && PyErr_Occurred()) {
Serhiy Storchaka4fa95912019-01-11 16:01:14 +02005027 goto exit;
5028 }
5029 if (PyFloat_Check(args[2])) {
5030 PyErr_SetString(PyExc_TypeError,
5031 "integer argument expected, got float" );
5032 goto exit;
5033 }
5034 flags = _PyLong_AsInt(args[2]);
5035 if (flags == -1 && PyErr_Occurred()) {
Giampaolo Rodola4a172cc2018-06-12 23:04:50 +02005036 goto exit;
5037 }
Serhiy Storchaka140a7d12019-10-13 11:59:31 +03005038 return_value = os__fcopyfile_impl(module, in_fd, out_fd, flags);
Giampaolo Rodola4a172cc2018-06-12 23:04:50 +02005039
5040exit:
5041 return return_value;
5042}
5043
5044#endif /* defined(__APPLE__) */
5045
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03005046PyDoc_STRVAR(os_fstat__doc__,
5047"fstat($module, /, fd)\n"
5048"--\n"
5049"\n"
5050"Perform a stat system call on the given file descriptor.\n"
5051"\n"
5052"Like stat(), but for an open file descriptor.\n"
5053"Equivalent to os.stat(fd).");
5054
5055#define OS_FSTAT_METHODDEF \
Serhiy Storchaka4a934d42018-11-27 11:27:36 +02005056 {"fstat", (PyCFunction)(void(*)(void))os_fstat, METH_FASTCALL|METH_KEYWORDS, os_fstat__doc__},
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03005057
5058static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03005059os_fstat_impl(PyObject *module, int fd);
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03005060
5061static PyObject *
Serhiy Storchakaa5552f02017-12-15 13:11:11 +02005062os_fstat(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames)
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03005063{
5064 PyObject *return_value = NULL;
Serhiy Storchaka9171a8b2016-08-14 10:52:18 +03005065 static const char * const _keywords[] = {"fd", NULL};
Serhiy Storchaka31913912019-03-14 10:32:22 +02005066 static _PyArg_Parser _parser = {NULL, _keywords, "fstat", 0};
5067 PyObject *argsbuf[1];
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03005068 int fd;
5069
Serhiy Storchaka31913912019-03-14 10:32:22 +02005070 args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 1, 1, 0, argsbuf);
5071 if (!args) {
5072 goto exit;
5073 }
5074 if (PyFloat_Check(args[0])) {
5075 PyErr_SetString(PyExc_TypeError,
5076 "integer argument expected, got float" );
5077 goto exit;
5078 }
5079 fd = _PyLong_AsInt(args[0]);
5080 if (fd == -1 && PyErr_Occurred()) {
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03005081 goto exit;
Serhiy Storchaka5dee6552016-06-09 16:16:06 +03005082 }
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03005083 return_value = os_fstat_impl(module, fd);
5084
5085exit:
5086 return return_value;
5087}
5088
5089PyDoc_STRVAR(os_isatty__doc__,
5090"isatty($module, fd, /)\n"
5091"--\n"
5092"\n"
5093"Return True if the fd is connected to a terminal.\n"
5094"\n"
5095"Return True if the file descriptor is an open file descriptor\n"
5096"connected to the slave end of a terminal.");
5097
5098#define OS_ISATTY_METHODDEF \
Serhiy Storchaka92e8af62015-04-04 00:12:11 +03005099 {"isatty", (PyCFunction)os_isatty, METH_O, os_isatty__doc__},
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03005100
5101static int
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03005102os_isatty_impl(PyObject *module, int fd);
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03005103
5104static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03005105os_isatty(PyObject *module, PyObject *arg)
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03005106{
5107 PyObject *return_value = NULL;
5108 int fd;
5109 int _return_value;
5110
Serhiy Storchaka32d96a22018-12-25 13:23:47 +02005111 if (PyFloat_Check(arg)) {
5112 PyErr_SetString(PyExc_TypeError,
5113 "integer argument expected, got float" );
5114 goto exit;
5115 }
5116 fd = _PyLong_AsInt(arg);
5117 if (fd == -1 && PyErr_Occurred()) {
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03005118 goto exit;
Serhiy Storchaka5dee6552016-06-09 16:16:06 +03005119 }
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03005120 _return_value = os_isatty_impl(module, fd);
Serhiy Storchaka5dee6552016-06-09 16:16:06 +03005121 if ((_return_value == -1) && PyErr_Occurred()) {
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03005122 goto exit;
Serhiy Storchaka5dee6552016-06-09 16:16:06 +03005123 }
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03005124 return_value = PyBool_FromLong((long)_return_value);
5125
5126exit:
5127 return return_value;
5128}
5129
5130#if defined(HAVE_PIPE)
5131
5132PyDoc_STRVAR(os_pipe__doc__,
5133"pipe($module, /)\n"
5134"--\n"
5135"\n"
5136"Create a pipe.\n"
5137"\n"
5138"Returns a tuple of two file descriptors:\n"
5139" (read_fd, write_fd)");
5140
5141#define OS_PIPE_METHODDEF \
5142 {"pipe", (PyCFunction)os_pipe, METH_NOARGS, os_pipe__doc__},
5143
5144static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03005145os_pipe_impl(PyObject *module);
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03005146
5147static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03005148os_pipe(PyObject *module, PyObject *Py_UNUSED(ignored))
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03005149{
5150 return os_pipe_impl(module);
5151}
5152
5153#endif /* defined(HAVE_PIPE) */
5154
5155#if defined(HAVE_PIPE2)
5156
5157PyDoc_STRVAR(os_pipe2__doc__,
5158"pipe2($module, flags, /)\n"
5159"--\n"
5160"\n"
5161"Create a pipe with flags set atomically.\n"
5162"\n"
5163"Returns a tuple of two file descriptors:\n"
5164" (read_fd, write_fd)\n"
5165"\n"
5166"flags can be constructed by ORing together one or more of these values:\n"
5167"O_NONBLOCK, O_CLOEXEC.");
5168
5169#define OS_PIPE2_METHODDEF \
Serhiy Storchaka92e8af62015-04-04 00:12:11 +03005170 {"pipe2", (PyCFunction)os_pipe2, METH_O, os_pipe2__doc__},
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03005171
5172static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03005173os_pipe2_impl(PyObject *module, int flags);
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03005174
5175static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03005176os_pipe2(PyObject *module, PyObject *arg)
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03005177{
5178 PyObject *return_value = NULL;
5179 int flags;
5180
Serhiy Storchaka32d96a22018-12-25 13:23:47 +02005181 if (PyFloat_Check(arg)) {
5182 PyErr_SetString(PyExc_TypeError,
5183 "integer argument expected, got float" );
5184 goto exit;
5185 }
5186 flags = _PyLong_AsInt(arg);
5187 if (flags == -1 && PyErr_Occurred()) {
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03005188 goto exit;
Serhiy Storchaka5dee6552016-06-09 16:16:06 +03005189 }
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03005190 return_value = os_pipe2_impl(module, flags);
5191
5192exit:
5193 return return_value;
5194}
5195
5196#endif /* defined(HAVE_PIPE2) */
5197
5198#if defined(HAVE_WRITEV)
5199
5200PyDoc_STRVAR(os_writev__doc__,
5201"writev($module, fd, buffers, /)\n"
5202"--\n"
5203"\n"
5204"Iterate over buffers, and write the contents of each to a file descriptor.\n"
5205"\n"
5206"Returns the total number of bytes written.\n"
5207"buffers must be a sequence of bytes-like objects.");
5208
5209#define OS_WRITEV_METHODDEF \
Serhiy Storchaka4a934d42018-11-27 11:27:36 +02005210 {"writev", (PyCFunction)(void(*)(void))os_writev, METH_FASTCALL, os_writev__doc__},
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03005211
5212static Py_ssize_t
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03005213os_writev_impl(PyObject *module, int fd, PyObject *buffers);
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03005214
5215static PyObject *
Serhiy Storchakaa5552f02017-12-15 13:11:11 +02005216os_writev(PyObject *module, PyObject *const *args, Py_ssize_t nargs)
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03005217{
5218 PyObject *return_value = NULL;
5219 int fd;
5220 PyObject *buffers;
5221 Py_ssize_t _return_value;
5222
Serhiy Storchaka4fa95912019-01-11 16:01:14 +02005223 if (!_PyArg_CheckPositional("writev", nargs, 2, 2)) {
Victor Stinner259f0e42017-01-17 01:35:17 +01005224 goto exit;
5225 }
Serhiy Storchaka4fa95912019-01-11 16:01:14 +02005226 if (PyFloat_Check(args[0])) {
5227 PyErr_SetString(PyExc_TypeError,
5228 "integer argument expected, got float" );
5229 goto exit;
5230 }
5231 fd = _PyLong_AsInt(args[0]);
5232 if (fd == -1 && PyErr_Occurred()) {
5233 goto exit;
5234 }
5235 buffers = args[1];
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03005236 _return_value = os_writev_impl(module, fd, buffers);
Serhiy Storchaka5dee6552016-06-09 16:16:06 +03005237 if ((_return_value == -1) && PyErr_Occurred()) {
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03005238 goto exit;
Serhiy Storchaka5dee6552016-06-09 16:16:06 +03005239 }
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03005240 return_value = PyLong_FromSsize_t(_return_value);
5241
5242exit:
5243 return return_value;
5244}
5245
5246#endif /* defined(HAVE_WRITEV) */
5247
5248#if defined(HAVE_PWRITE)
5249
5250PyDoc_STRVAR(os_pwrite__doc__,
5251"pwrite($module, fd, buffer, offset, /)\n"
5252"--\n"
5253"\n"
5254"Write bytes to a file descriptor starting at a particular offset.\n"
5255"\n"
5256"Write buffer to fd, starting at offset bytes from the beginning of\n"
5257"the file. Returns the number of bytes writte. Does not change the\n"
5258"current file offset.");
5259
5260#define OS_PWRITE_METHODDEF \
Serhiy Storchaka4a934d42018-11-27 11:27:36 +02005261 {"pwrite", (PyCFunction)(void(*)(void))os_pwrite, METH_FASTCALL, os_pwrite__doc__},
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03005262
5263static Py_ssize_t
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03005264os_pwrite_impl(PyObject *module, int fd, Py_buffer *buffer, Py_off_t offset);
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03005265
5266static PyObject *
Serhiy Storchakaa5552f02017-12-15 13:11:11 +02005267os_pwrite(PyObject *module, PyObject *const *args, Py_ssize_t nargs)
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03005268{
5269 PyObject *return_value = NULL;
5270 int fd;
5271 Py_buffer buffer = {NULL, NULL};
5272 Py_off_t offset;
5273 Py_ssize_t _return_value;
5274
Serhiy Storchaka4fa95912019-01-11 16:01:14 +02005275 if (!_PyArg_CheckPositional("pwrite", nargs, 3, 3)) {
5276 goto exit;
5277 }
5278 if (PyFloat_Check(args[0])) {
5279 PyErr_SetString(PyExc_TypeError,
5280 "integer argument expected, got float" );
5281 goto exit;
5282 }
5283 fd = _PyLong_AsInt(args[0]);
5284 if (fd == -1 && PyErr_Occurred()) {
5285 goto exit;
5286 }
5287 if (PyObject_GetBuffer(args[1], &buffer, PyBUF_SIMPLE) != 0) {
5288 goto exit;
5289 }
5290 if (!PyBuffer_IsContiguous(&buffer, 'C')) {
Rémi Lapeyre4901fe22019-08-29 16:49:08 +02005291 _PyArg_BadArgument("pwrite", "argument 2", "contiguous buffer", args[1]);
Serhiy Storchaka4fa95912019-01-11 16:01:14 +02005292 goto exit;
5293 }
5294 if (!Py_off_t_converter(args[2], &offset)) {
Victor Stinner259f0e42017-01-17 01:35:17 +01005295 goto exit;
5296 }
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03005297 _return_value = os_pwrite_impl(module, fd, &buffer, offset);
Serhiy Storchaka5dee6552016-06-09 16:16:06 +03005298 if ((_return_value == -1) && PyErr_Occurred()) {
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03005299 goto exit;
Serhiy Storchaka5dee6552016-06-09 16:16:06 +03005300 }
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03005301 return_value = PyLong_FromSsize_t(_return_value);
5302
5303exit:
5304 /* Cleanup for buffer */
Serhiy Storchaka5dee6552016-06-09 16:16:06 +03005305 if (buffer.obj) {
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03005306 PyBuffer_Release(&buffer);
Serhiy Storchaka5dee6552016-06-09 16:16:06 +03005307 }
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03005308
5309 return return_value;
5310}
5311
5312#endif /* defined(HAVE_PWRITE) */
5313
Pablo Galindo4defba32018-01-27 16:16:37 +00005314#if (defined(HAVE_PWRITEV) || defined (HAVE_PWRITEV2))
5315
5316PyDoc_STRVAR(os_pwritev__doc__,
5317"pwritev($module, fd, buffers, offset, flags=0, /)\n"
5318"--\n"
5319"\n"
5320"Writes the contents of bytes-like objects to a file descriptor at a given offset.\n"
5321"\n"
5322"Combines the functionality of writev() and pwrite(). All buffers must be a sequence\n"
5323"of bytes-like objects. Buffers are processed in array order. Entire contents of first\n"
5324"buffer is written before proceeding to second, and so on. The operating system may\n"
5325"set a limit (sysconf() value SC_IOV_MAX) on the number of buffers that can be used.\n"
5326"This function writes the contents of each object to the file descriptor and returns\n"
5327"the total number of bytes written.\n"
5328"\n"
5329"The flags argument contains a bitwise OR of zero or more of the following flags:\n"
5330"\n"
5331"- RWF_DSYNC\n"
5332"- RWF_SYNC\n"
5333"\n"
5334"Using non-zero flags requires Linux 4.7 or newer.");
5335
5336#define OS_PWRITEV_METHODDEF \
Serhiy Storchaka4a934d42018-11-27 11:27:36 +02005337 {"pwritev", (PyCFunction)(void(*)(void))os_pwritev, METH_FASTCALL, os_pwritev__doc__},
Pablo Galindo4defba32018-01-27 16:16:37 +00005338
5339static Py_ssize_t
5340os_pwritev_impl(PyObject *module, int fd, PyObject *buffers, Py_off_t offset,
5341 int flags);
5342
5343static PyObject *
5344os_pwritev(PyObject *module, PyObject *const *args, Py_ssize_t nargs)
5345{
5346 PyObject *return_value = NULL;
5347 int fd;
5348 PyObject *buffers;
5349 Py_off_t offset;
5350 int flags = 0;
5351 Py_ssize_t _return_value;
5352
Serhiy Storchaka4fa95912019-01-11 16:01:14 +02005353 if (!_PyArg_CheckPositional("pwritev", nargs, 3, 4)) {
Pablo Galindo4defba32018-01-27 16:16:37 +00005354 goto exit;
5355 }
Serhiy Storchaka4fa95912019-01-11 16:01:14 +02005356 if (PyFloat_Check(args[0])) {
5357 PyErr_SetString(PyExc_TypeError,
5358 "integer argument expected, got float" );
5359 goto exit;
5360 }
5361 fd = _PyLong_AsInt(args[0]);
5362 if (fd == -1 && PyErr_Occurred()) {
5363 goto exit;
5364 }
5365 buffers = args[1];
5366 if (!Py_off_t_converter(args[2], &offset)) {
5367 goto exit;
5368 }
5369 if (nargs < 4) {
5370 goto skip_optional;
5371 }
5372 if (PyFloat_Check(args[3])) {
5373 PyErr_SetString(PyExc_TypeError,
5374 "integer argument expected, got float" );
5375 goto exit;
5376 }
5377 flags = _PyLong_AsInt(args[3]);
5378 if (flags == -1 && PyErr_Occurred()) {
5379 goto exit;
5380 }
5381skip_optional:
Pablo Galindo4defba32018-01-27 16:16:37 +00005382 _return_value = os_pwritev_impl(module, fd, buffers, offset, flags);
5383 if ((_return_value == -1) && PyErr_Occurred()) {
5384 goto exit;
5385 }
5386 return_value = PyLong_FromSsize_t(_return_value);
5387
5388exit:
5389 return return_value;
5390}
5391
5392#endif /* (defined(HAVE_PWRITEV) || defined (HAVE_PWRITEV2)) */
5393
Pablo Galindoaac4d032019-05-31 19:39:47 +01005394#if defined(HAVE_COPY_FILE_RANGE)
5395
5396PyDoc_STRVAR(os_copy_file_range__doc__,
5397"copy_file_range($module, /, src, dst, count, offset_src=None,\n"
5398" offset_dst=None)\n"
5399"--\n"
5400"\n"
5401"Copy count bytes from one file descriptor to another.\n"
5402"\n"
5403" src\n"
5404" Source file descriptor.\n"
5405" dst\n"
5406" Destination file descriptor.\n"
5407" count\n"
5408" Number of bytes to copy.\n"
5409" offset_src\n"
5410" Starting offset in src.\n"
5411" offset_dst\n"
5412" Starting offset in dst.\n"
5413"\n"
5414"If offset_src is None, then src is read from the current position;\n"
5415"respectively for offset_dst.");
5416
5417#define OS_COPY_FILE_RANGE_METHODDEF \
5418 {"copy_file_range", (PyCFunction)(void(*)(void))os_copy_file_range, METH_FASTCALL|METH_KEYWORDS, os_copy_file_range__doc__},
5419
5420static PyObject *
5421os_copy_file_range_impl(PyObject *module, int src, int dst, Py_ssize_t count,
5422 PyObject *offset_src, PyObject *offset_dst);
5423
5424static PyObject *
5425os_copy_file_range(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames)
5426{
5427 PyObject *return_value = NULL;
5428 static const char * const _keywords[] = {"src", "dst", "count", "offset_src", "offset_dst", NULL};
5429 static _PyArg_Parser _parser = {NULL, _keywords, "copy_file_range", 0};
5430 PyObject *argsbuf[5];
5431 Py_ssize_t noptargs = nargs + (kwnames ? PyTuple_GET_SIZE(kwnames) : 0) - 3;
5432 int src;
5433 int dst;
5434 Py_ssize_t count;
5435 PyObject *offset_src = Py_None;
5436 PyObject *offset_dst = Py_None;
5437
5438 args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 3, 5, 0, argsbuf);
5439 if (!args) {
5440 goto exit;
5441 }
5442 if (PyFloat_Check(args[0])) {
5443 PyErr_SetString(PyExc_TypeError,
5444 "integer argument expected, got float" );
5445 goto exit;
5446 }
5447 src = _PyLong_AsInt(args[0]);
5448 if (src == -1 && PyErr_Occurred()) {
5449 goto exit;
5450 }
5451 if (PyFloat_Check(args[1])) {
5452 PyErr_SetString(PyExc_TypeError,
5453 "integer argument expected, got float" );
5454 goto exit;
5455 }
5456 dst = _PyLong_AsInt(args[1]);
5457 if (dst == -1 && PyErr_Occurred()) {
5458 goto exit;
5459 }
5460 if (PyFloat_Check(args[2])) {
5461 PyErr_SetString(PyExc_TypeError,
5462 "integer argument expected, got float" );
5463 goto exit;
5464 }
5465 {
5466 Py_ssize_t ival = -1;
5467 PyObject *iobj = PyNumber_Index(args[2]);
5468 if (iobj != NULL) {
5469 ival = PyLong_AsSsize_t(iobj);
5470 Py_DECREF(iobj);
5471 }
5472 if (ival == -1 && PyErr_Occurred()) {
5473 goto exit;
5474 }
5475 count = ival;
5476 }
5477 if (!noptargs) {
5478 goto skip_optional_pos;
5479 }
5480 if (args[3]) {
5481 offset_src = args[3];
5482 if (!--noptargs) {
5483 goto skip_optional_pos;
5484 }
5485 }
5486 offset_dst = args[4];
5487skip_optional_pos:
5488 return_value = os_copy_file_range_impl(module, src, dst, count, offset_src, offset_dst);
5489
5490exit:
5491 return return_value;
5492}
5493
5494#endif /* defined(HAVE_COPY_FILE_RANGE) */
5495
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03005496#if defined(HAVE_MKFIFO)
5497
5498PyDoc_STRVAR(os_mkfifo__doc__,
5499"mkfifo($module, /, path, mode=438, *, dir_fd=None)\n"
5500"--\n"
5501"\n"
5502"Create a \"fifo\" (a POSIX named pipe).\n"
5503"\n"
5504"If dir_fd is not None, it should be a file descriptor open to a directory,\n"
5505" and path should be relative; path will then be relative to that directory.\n"
5506"dir_fd may not be implemented on your platform.\n"
5507" If it is unavailable, using it will raise a NotImplementedError.");
5508
5509#define OS_MKFIFO_METHODDEF \
Serhiy Storchaka4a934d42018-11-27 11:27:36 +02005510 {"mkfifo", (PyCFunction)(void(*)(void))os_mkfifo, METH_FASTCALL|METH_KEYWORDS, os_mkfifo__doc__},
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03005511
5512static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03005513os_mkfifo_impl(PyObject *module, path_t *path, int mode, int dir_fd);
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03005514
5515static PyObject *
Serhiy Storchakaa5552f02017-12-15 13:11:11 +02005516os_mkfifo(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames)
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03005517{
5518 PyObject *return_value = NULL;
Serhiy Storchaka9171a8b2016-08-14 10:52:18 +03005519 static const char * const _keywords[] = {"path", "mode", "dir_fd", NULL};
Serhiy Storchaka31913912019-03-14 10:32:22 +02005520 static _PyArg_Parser _parser = {NULL, _keywords, "mkfifo", 0};
5521 PyObject *argsbuf[3];
5522 Py_ssize_t noptargs = nargs + (kwnames ? PyTuple_GET_SIZE(kwnames) : 0) - 1;
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03005523 path_t path = PATH_T_INITIALIZE("mkfifo", "path", 0, 0);
5524 int mode = 438;
5525 int dir_fd = DEFAULT_DIR_FD;
5526
Serhiy Storchaka31913912019-03-14 10:32:22 +02005527 args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 1, 2, 0, argsbuf);
5528 if (!args) {
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03005529 goto exit;
Serhiy Storchaka5dee6552016-06-09 16:16:06 +03005530 }
Serhiy Storchaka31913912019-03-14 10:32:22 +02005531 if (!path_converter(args[0], &path)) {
5532 goto exit;
5533 }
5534 if (!noptargs) {
5535 goto skip_optional_pos;
5536 }
5537 if (args[1]) {
5538 if (PyFloat_Check(args[1])) {
5539 PyErr_SetString(PyExc_TypeError,
5540 "integer argument expected, got float" );
5541 goto exit;
5542 }
5543 mode = _PyLong_AsInt(args[1]);
5544 if (mode == -1 && PyErr_Occurred()) {
5545 goto exit;
5546 }
5547 if (!--noptargs) {
5548 goto skip_optional_pos;
5549 }
5550 }
5551skip_optional_pos:
5552 if (!noptargs) {
5553 goto skip_optional_kwonly;
5554 }
5555 if (!MKFIFOAT_DIR_FD_CONVERTER(args[2], &dir_fd)) {
5556 goto exit;
5557 }
5558skip_optional_kwonly:
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03005559 return_value = os_mkfifo_impl(module, &path, mode, dir_fd);
5560
5561exit:
5562 /* Cleanup for path */
5563 path_cleanup(&path);
5564
5565 return return_value;
5566}
5567
5568#endif /* defined(HAVE_MKFIFO) */
5569
5570#if (defined(HAVE_MKNOD) && defined(HAVE_MAKEDEV))
5571
5572PyDoc_STRVAR(os_mknod__doc__,
5573"mknod($module, /, path, mode=384, device=0, *, dir_fd=None)\n"
5574"--\n"
5575"\n"
5576"Create a node in the file system.\n"
5577"\n"
5578"Create a node in the file system (file, device special file or named pipe)\n"
5579"at path. mode specifies both the permissions to use and the\n"
5580"type of node to be created, being combined (bitwise OR) with one of\n"
5581"S_IFREG, S_IFCHR, S_IFBLK, and S_IFIFO. If S_IFCHR or S_IFBLK is set on mode,\n"
5582"device defines the newly created device special file (probably using\n"
5583"os.makedev()). Otherwise device is ignored.\n"
5584"\n"
5585"If dir_fd is not None, it should be a file descriptor open to a directory,\n"
5586" and path should be relative; path will then be relative to that directory.\n"
5587"dir_fd may not be implemented on your platform.\n"
5588" If it is unavailable, using it will raise a NotImplementedError.");
5589
5590#define OS_MKNOD_METHODDEF \
Serhiy Storchaka4a934d42018-11-27 11:27:36 +02005591 {"mknod", (PyCFunction)(void(*)(void))os_mknod, METH_FASTCALL|METH_KEYWORDS, os_mknod__doc__},
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03005592
5593static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03005594os_mknod_impl(PyObject *module, path_t *path, int mode, dev_t device,
Larry Hastings89964c42015-04-14 18:07:59 -04005595 int dir_fd);
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03005596
5597static PyObject *
Serhiy Storchakaa5552f02017-12-15 13:11:11 +02005598os_mknod(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames)
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03005599{
5600 PyObject *return_value = NULL;
Serhiy Storchaka9171a8b2016-08-14 10:52:18 +03005601 static const char * const _keywords[] = {"path", "mode", "device", "dir_fd", NULL};
Serhiy Storchaka31913912019-03-14 10:32:22 +02005602 static _PyArg_Parser _parser = {NULL, _keywords, "mknod", 0};
5603 PyObject *argsbuf[4];
5604 Py_ssize_t noptargs = nargs + (kwnames ? PyTuple_GET_SIZE(kwnames) : 0) - 1;
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03005605 path_t path = PATH_T_INITIALIZE("mknod", "path", 0, 0);
5606 int mode = 384;
5607 dev_t device = 0;
5608 int dir_fd = DEFAULT_DIR_FD;
5609
Serhiy Storchaka31913912019-03-14 10:32:22 +02005610 args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 1, 3, 0, argsbuf);
5611 if (!args) {
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03005612 goto exit;
Serhiy Storchaka5dee6552016-06-09 16:16:06 +03005613 }
Serhiy Storchaka31913912019-03-14 10:32:22 +02005614 if (!path_converter(args[0], &path)) {
5615 goto exit;
5616 }
5617 if (!noptargs) {
5618 goto skip_optional_pos;
5619 }
5620 if (args[1]) {
5621 if (PyFloat_Check(args[1])) {
5622 PyErr_SetString(PyExc_TypeError,
5623 "integer argument expected, got float" );
5624 goto exit;
5625 }
5626 mode = _PyLong_AsInt(args[1]);
5627 if (mode == -1 && PyErr_Occurred()) {
5628 goto exit;
5629 }
5630 if (!--noptargs) {
5631 goto skip_optional_pos;
5632 }
5633 }
5634 if (args[2]) {
5635 if (!_Py_Dev_Converter(args[2], &device)) {
5636 goto exit;
5637 }
5638 if (!--noptargs) {
5639 goto skip_optional_pos;
5640 }
5641 }
5642skip_optional_pos:
5643 if (!noptargs) {
5644 goto skip_optional_kwonly;
5645 }
5646 if (!MKNODAT_DIR_FD_CONVERTER(args[3], &dir_fd)) {
5647 goto exit;
5648 }
5649skip_optional_kwonly:
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03005650 return_value = os_mknod_impl(module, &path, mode, device, dir_fd);
5651
5652exit:
5653 /* Cleanup for path */
5654 path_cleanup(&path);
5655
5656 return return_value;
5657}
5658
5659#endif /* (defined(HAVE_MKNOD) && defined(HAVE_MAKEDEV)) */
5660
5661#if defined(HAVE_DEVICE_MACROS)
5662
5663PyDoc_STRVAR(os_major__doc__,
5664"major($module, device, /)\n"
5665"--\n"
5666"\n"
5667"Extracts a device major number from a raw device number.");
5668
5669#define OS_MAJOR_METHODDEF \
Serhiy Storchaka92e8af62015-04-04 00:12:11 +03005670 {"major", (PyCFunction)os_major, METH_O, os_major__doc__},
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03005671
5672static unsigned int
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03005673os_major_impl(PyObject *module, dev_t device);
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03005674
5675static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03005676os_major(PyObject *module, PyObject *arg)
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03005677{
5678 PyObject *return_value = NULL;
5679 dev_t device;
5680 unsigned int _return_value;
5681
Serhiy Storchaka32d96a22018-12-25 13:23:47 +02005682 if (!_Py_Dev_Converter(arg, &device)) {
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03005683 goto exit;
Serhiy Storchaka5dee6552016-06-09 16:16:06 +03005684 }
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03005685 _return_value = os_major_impl(module, device);
Serhiy Storchaka5dee6552016-06-09 16:16:06 +03005686 if ((_return_value == (unsigned int)-1) && PyErr_Occurred()) {
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03005687 goto exit;
Serhiy Storchaka5dee6552016-06-09 16:16:06 +03005688 }
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03005689 return_value = PyLong_FromUnsignedLong((unsigned long)_return_value);
5690
5691exit:
5692 return return_value;
5693}
5694
5695#endif /* defined(HAVE_DEVICE_MACROS) */
5696
5697#if defined(HAVE_DEVICE_MACROS)
5698
5699PyDoc_STRVAR(os_minor__doc__,
5700"minor($module, device, /)\n"
5701"--\n"
5702"\n"
5703"Extracts a device minor number from a raw device number.");
5704
5705#define OS_MINOR_METHODDEF \
Serhiy Storchaka92e8af62015-04-04 00:12:11 +03005706 {"minor", (PyCFunction)os_minor, METH_O, os_minor__doc__},
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03005707
5708static unsigned int
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03005709os_minor_impl(PyObject *module, dev_t device);
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03005710
5711static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03005712os_minor(PyObject *module, PyObject *arg)
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03005713{
5714 PyObject *return_value = NULL;
5715 dev_t device;
5716 unsigned int _return_value;
5717
Serhiy Storchaka32d96a22018-12-25 13:23:47 +02005718 if (!_Py_Dev_Converter(arg, &device)) {
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03005719 goto exit;
Serhiy Storchaka5dee6552016-06-09 16:16:06 +03005720 }
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03005721 _return_value = os_minor_impl(module, device);
Serhiy Storchaka5dee6552016-06-09 16:16:06 +03005722 if ((_return_value == (unsigned int)-1) && PyErr_Occurred()) {
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03005723 goto exit;
Serhiy Storchaka5dee6552016-06-09 16:16:06 +03005724 }
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03005725 return_value = PyLong_FromUnsignedLong((unsigned long)_return_value);
5726
5727exit:
5728 return return_value;
5729}
5730
5731#endif /* defined(HAVE_DEVICE_MACROS) */
5732
5733#if defined(HAVE_DEVICE_MACROS)
5734
5735PyDoc_STRVAR(os_makedev__doc__,
5736"makedev($module, major, minor, /)\n"
5737"--\n"
5738"\n"
5739"Composes a raw device number from the major and minor device numbers.");
5740
5741#define OS_MAKEDEV_METHODDEF \
Serhiy Storchaka4a934d42018-11-27 11:27:36 +02005742 {"makedev", (PyCFunction)(void(*)(void))os_makedev, METH_FASTCALL, os_makedev__doc__},
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03005743
5744static dev_t
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03005745os_makedev_impl(PyObject *module, int major, int minor);
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03005746
5747static PyObject *
Serhiy Storchakaa5552f02017-12-15 13:11:11 +02005748os_makedev(PyObject *module, PyObject *const *args, Py_ssize_t nargs)
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03005749{
5750 PyObject *return_value = NULL;
5751 int major;
5752 int minor;
5753 dev_t _return_value;
5754
Serhiy Storchaka4fa95912019-01-11 16:01:14 +02005755 if (!_PyArg_CheckPositional("makedev", nargs, 2, 2)) {
5756 goto exit;
5757 }
5758 if (PyFloat_Check(args[0])) {
5759 PyErr_SetString(PyExc_TypeError,
5760 "integer argument expected, got float" );
5761 goto exit;
5762 }
5763 major = _PyLong_AsInt(args[0]);
5764 if (major == -1 && PyErr_Occurred()) {
5765 goto exit;
5766 }
5767 if (PyFloat_Check(args[1])) {
5768 PyErr_SetString(PyExc_TypeError,
5769 "integer argument expected, got float" );
5770 goto exit;
5771 }
5772 minor = _PyLong_AsInt(args[1]);
5773 if (minor == -1 && PyErr_Occurred()) {
Victor Stinner259f0e42017-01-17 01:35:17 +01005774 goto exit;
5775 }
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03005776 _return_value = os_makedev_impl(module, major, minor);
Serhiy Storchaka5dee6552016-06-09 16:16:06 +03005777 if ((_return_value == (dev_t)-1) && PyErr_Occurred()) {
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03005778 goto exit;
Serhiy Storchaka5dee6552016-06-09 16:16:06 +03005779 }
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03005780 return_value = _PyLong_FromDev(_return_value);
5781
5782exit:
5783 return return_value;
5784}
5785
5786#endif /* defined(HAVE_DEVICE_MACROS) */
5787
Steve Dowerf7377032015-04-12 15:44:54 -04005788#if (defined HAVE_FTRUNCATE || defined MS_WINDOWS)
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03005789
5790PyDoc_STRVAR(os_ftruncate__doc__,
5791"ftruncate($module, fd, length, /)\n"
5792"--\n"
5793"\n"
5794"Truncate a file, specified by file descriptor, to a specific length.");
5795
5796#define OS_FTRUNCATE_METHODDEF \
Serhiy Storchaka4a934d42018-11-27 11:27:36 +02005797 {"ftruncate", (PyCFunction)(void(*)(void))os_ftruncate, METH_FASTCALL, os_ftruncate__doc__},
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03005798
5799static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03005800os_ftruncate_impl(PyObject *module, int fd, Py_off_t length);
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03005801
5802static PyObject *
Serhiy Storchakaa5552f02017-12-15 13:11:11 +02005803os_ftruncate(PyObject *module, PyObject *const *args, Py_ssize_t nargs)
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03005804{
5805 PyObject *return_value = NULL;
5806 int fd;
5807 Py_off_t length;
5808
Serhiy Storchaka4fa95912019-01-11 16:01:14 +02005809 if (!_PyArg_CheckPositional("ftruncate", nargs, 2, 2)) {
5810 goto exit;
5811 }
5812 if (PyFloat_Check(args[0])) {
5813 PyErr_SetString(PyExc_TypeError,
5814 "integer argument expected, got float" );
5815 goto exit;
5816 }
5817 fd = _PyLong_AsInt(args[0]);
5818 if (fd == -1 && PyErr_Occurred()) {
5819 goto exit;
5820 }
5821 if (!Py_off_t_converter(args[1], &length)) {
Victor Stinner259f0e42017-01-17 01:35:17 +01005822 goto exit;
5823 }
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03005824 return_value = os_ftruncate_impl(module, fd, length);
5825
5826exit:
5827 return return_value;
5828}
5829
Steve Dowerf7377032015-04-12 15:44:54 -04005830#endif /* (defined HAVE_FTRUNCATE || defined MS_WINDOWS) */
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03005831
Steve Dowerf7377032015-04-12 15:44:54 -04005832#if (defined HAVE_TRUNCATE || defined MS_WINDOWS)
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03005833
5834PyDoc_STRVAR(os_truncate__doc__,
5835"truncate($module, /, path, length)\n"
5836"--\n"
5837"\n"
5838"Truncate a file, specified by path, to a specific length.\n"
5839"\n"
5840"On some platforms, path may also be specified as an open file descriptor.\n"
5841" If this functionality is unavailable, using it raises an exception.");
5842
5843#define OS_TRUNCATE_METHODDEF \
Serhiy Storchaka4a934d42018-11-27 11:27:36 +02005844 {"truncate", (PyCFunction)(void(*)(void))os_truncate, METH_FASTCALL|METH_KEYWORDS, os_truncate__doc__},
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03005845
5846static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03005847os_truncate_impl(PyObject *module, path_t *path, Py_off_t length);
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03005848
5849static PyObject *
Serhiy Storchakaa5552f02017-12-15 13:11:11 +02005850os_truncate(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames)
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03005851{
5852 PyObject *return_value = NULL;
Serhiy Storchaka9171a8b2016-08-14 10:52:18 +03005853 static const char * const _keywords[] = {"path", "length", NULL};
Serhiy Storchaka31913912019-03-14 10:32:22 +02005854 static _PyArg_Parser _parser = {NULL, _keywords, "truncate", 0};
5855 PyObject *argsbuf[2];
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03005856 path_t path = PATH_T_INITIALIZE("truncate", "path", 0, PATH_HAVE_FTRUNCATE);
5857 Py_off_t length;
5858
Serhiy Storchaka31913912019-03-14 10:32:22 +02005859 args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 2, 2, 0, argsbuf);
5860 if (!args) {
5861 goto exit;
5862 }
5863 if (!path_converter(args[0], &path)) {
5864 goto exit;
5865 }
5866 if (!Py_off_t_converter(args[1], &length)) {
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03005867 goto exit;
Serhiy Storchaka5dee6552016-06-09 16:16:06 +03005868 }
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03005869 return_value = os_truncate_impl(module, &path, length);
5870
5871exit:
5872 /* Cleanup for path */
5873 path_cleanup(&path);
5874
5875 return return_value;
5876}
5877
Steve Dowerf7377032015-04-12 15:44:54 -04005878#endif /* (defined HAVE_TRUNCATE || defined MS_WINDOWS) */
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03005879
5880#if (defined(HAVE_POSIX_FALLOCATE) && !defined(POSIX_FADVISE_AIX_BUG))
5881
5882PyDoc_STRVAR(os_posix_fallocate__doc__,
5883"posix_fallocate($module, fd, offset, length, /)\n"
5884"--\n"
5885"\n"
5886"Ensure a file has allocated at least a particular number of bytes on disk.\n"
5887"\n"
5888"Ensure that the file specified by fd encompasses a range of bytes\n"
5889"starting at offset bytes from the beginning and continuing for length bytes.");
5890
5891#define OS_POSIX_FALLOCATE_METHODDEF \
Serhiy Storchaka4a934d42018-11-27 11:27:36 +02005892 {"posix_fallocate", (PyCFunction)(void(*)(void))os_posix_fallocate, METH_FASTCALL, os_posix_fallocate__doc__},
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03005893
5894static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03005895os_posix_fallocate_impl(PyObject *module, int fd, Py_off_t offset,
Larry Hastings89964c42015-04-14 18:07:59 -04005896 Py_off_t length);
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03005897
5898static PyObject *
Serhiy Storchakaa5552f02017-12-15 13:11:11 +02005899os_posix_fallocate(PyObject *module, PyObject *const *args, Py_ssize_t nargs)
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03005900{
5901 PyObject *return_value = NULL;
5902 int fd;
5903 Py_off_t offset;
5904 Py_off_t length;
5905
Serhiy Storchaka4fa95912019-01-11 16:01:14 +02005906 if (!_PyArg_CheckPositional("posix_fallocate", nargs, 3, 3)) {
5907 goto exit;
5908 }
5909 if (PyFloat_Check(args[0])) {
5910 PyErr_SetString(PyExc_TypeError,
5911 "integer argument expected, got float" );
5912 goto exit;
5913 }
5914 fd = _PyLong_AsInt(args[0]);
5915 if (fd == -1 && PyErr_Occurred()) {
5916 goto exit;
5917 }
5918 if (!Py_off_t_converter(args[1], &offset)) {
5919 goto exit;
5920 }
5921 if (!Py_off_t_converter(args[2], &length)) {
Victor Stinner259f0e42017-01-17 01:35:17 +01005922 goto exit;
5923 }
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03005924 return_value = os_posix_fallocate_impl(module, fd, offset, length);
5925
5926exit:
5927 return return_value;
5928}
5929
5930#endif /* (defined(HAVE_POSIX_FALLOCATE) && !defined(POSIX_FADVISE_AIX_BUG)) */
5931
5932#if (defined(HAVE_POSIX_FADVISE) && !defined(POSIX_FADVISE_AIX_BUG))
5933
5934PyDoc_STRVAR(os_posix_fadvise__doc__,
5935"posix_fadvise($module, fd, offset, length, advice, /)\n"
5936"--\n"
5937"\n"
5938"Announce an intention to access data in a specific pattern.\n"
5939"\n"
5940"Announce an intention to access data in a specific pattern, thus allowing\n"
5941"the kernel to make optimizations.\n"
5942"The advice applies to the region of the file specified by fd starting at\n"
5943"offset and continuing for length bytes.\n"
5944"advice is one of POSIX_FADV_NORMAL, POSIX_FADV_SEQUENTIAL,\n"
5945"POSIX_FADV_RANDOM, POSIX_FADV_NOREUSE, POSIX_FADV_WILLNEED, or\n"
5946"POSIX_FADV_DONTNEED.");
5947
5948#define OS_POSIX_FADVISE_METHODDEF \
Serhiy Storchaka4a934d42018-11-27 11:27:36 +02005949 {"posix_fadvise", (PyCFunction)(void(*)(void))os_posix_fadvise, METH_FASTCALL, os_posix_fadvise__doc__},
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03005950
5951static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03005952os_posix_fadvise_impl(PyObject *module, int fd, Py_off_t offset,
Larry Hastings89964c42015-04-14 18:07:59 -04005953 Py_off_t length, int advice);
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03005954
5955static PyObject *
Serhiy Storchakaa5552f02017-12-15 13:11:11 +02005956os_posix_fadvise(PyObject *module, PyObject *const *args, Py_ssize_t nargs)
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03005957{
5958 PyObject *return_value = NULL;
5959 int fd;
5960 Py_off_t offset;
5961 Py_off_t length;
5962 int advice;
5963
Serhiy Storchaka4fa95912019-01-11 16:01:14 +02005964 if (!_PyArg_CheckPositional("posix_fadvise", nargs, 4, 4)) {
5965 goto exit;
5966 }
5967 if (PyFloat_Check(args[0])) {
5968 PyErr_SetString(PyExc_TypeError,
5969 "integer argument expected, got float" );
5970 goto exit;
5971 }
5972 fd = _PyLong_AsInt(args[0]);
5973 if (fd == -1 && PyErr_Occurred()) {
5974 goto exit;
5975 }
5976 if (!Py_off_t_converter(args[1], &offset)) {
5977 goto exit;
5978 }
5979 if (!Py_off_t_converter(args[2], &length)) {
5980 goto exit;
5981 }
5982 if (PyFloat_Check(args[3])) {
5983 PyErr_SetString(PyExc_TypeError,
5984 "integer argument expected, got float" );
5985 goto exit;
5986 }
5987 advice = _PyLong_AsInt(args[3]);
5988 if (advice == -1 && PyErr_Occurred()) {
Victor Stinner259f0e42017-01-17 01:35:17 +01005989 goto exit;
5990 }
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03005991 return_value = os_posix_fadvise_impl(module, fd, offset, length, advice);
5992
5993exit:
5994 return return_value;
5995}
5996
5997#endif /* (defined(HAVE_POSIX_FADVISE) && !defined(POSIX_FADVISE_AIX_BUG)) */
5998
5999#if defined(HAVE_PUTENV) && defined(MS_WINDOWS)
6000
6001PyDoc_STRVAR(os_putenv__doc__,
6002"putenv($module, name, value, /)\n"
6003"--\n"
6004"\n"
6005"Change or add an environment variable.");
6006
6007#define OS_PUTENV_METHODDEF \
Serhiy Storchaka4a934d42018-11-27 11:27:36 +02006008 {"putenv", (PyCFunction)(void(*)(void))os_putenv, METH_FASTCALL, os_putenv__doc__},
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03006009
6010static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03006011os_putenv_impl(PyObject *module, PyObject *name, PyObject *value);
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03006012
6013static PyObject *
Serhiy Storchakaa5552f02017-12-15 13:11:11 +02006014os_putenv(PyObject *module, PyObject *const *args, Py_ssize_t nargs)
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03006015{
6016 PyObject *return_value = NULL;
6017 PyObject *name;
6018 PyObject *value;
6019
Serhiy Storchaka4fa95912019-01-11 16:01:14 +02006020 if (!_PyArg_CheckPositional("putenv", nargs, 2, 2)) {
Victor Stinner259f0e42017-01-17 01:35:17 +01006021 goto exit;
6022 }
Serhiy Storchaka4fa95912019-01-11 16:01:14 +02006023 if (!PyUnicode_Check(args[0])) {
Rémi Lapeyre4901fe22019-08-29 16:49:08 +02006024 _PyArg_BadArgument("putenv", "argument 1", "str", args[0]);
Serhiy Storchaka4fa95912019-01-11 16:01:14 +02006025 goto exit;
6026 }
6027 if (PyUnicode_READY(args[0]) == -1) {
6028 goto exit;
6029 }
6030 name = args[0];
6031 if (!PyUnicode_Check(args[1])) {
Rémi Lapeyre4901fe22019-08-29 16:49:08 +02006032 _PyArg_BadArgument("putenv", "argument 2", "str", args[1]);
Serhiy Storchaka4fa95912019-01-11 16:01:14 +02006033 goto exit;
6034 }
6035 if (PyUnicode_READY(args[1]) == -1) {
6036 goto exit;
6037 }
6038 value = args[1];
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03006039 return_value = os_putenv_impl(module, name, value);
6040
6041exit:
6042 return return_value;
6043}
6044
6045#endif /* defined(HAVE_PUTENV) && defined(MS_WINDOWS) */
6046
6047#if defined(HAVE_PUTENV) && !defined(MS_WINDOWS)
6048
6049PyDoc_STRVAR(os_putenv__doc__,
6050"putenv($module, name, value, /)\n"
6051"--\n"
6052"\n"
6053"Change or add an environment variable.");
6054
6055#define OS_PUTENV_METHODDEF \
Serhiy Storchaka4a934d42018-11-27 11:27:36 +02006056 {"putenv", (PyCFunction)(void(*)(void))os_putenv, METH_FASTCALL, os_putenv__doc__},
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03006057
6058static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03006059os_putenv_impl(PyObject *module, PyObject *name, PyObject *value);
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03006060
6061static PyObject *
Serhiy Storchakaa5552f02017-12-15 13:11:11 +02006062os_putenv(PyObject *module, PyObject *const *args, Py_ssize_t nargs)
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03006063{
6064 PyObject *return_value = NULL;
6065 PyObject *name = NULL;
6066 PyObject *value = NULL;
6067
Serhiy Storchaka4fa95912019-01-11 16:01:14 +02006068 if (!_PyArg_CheckPositional("putenv", nargs, 2, 2)) {
6069 goto exit;
6070 }
6071 if (!PyUnicode_FSConverter(args[0], &name)) {
6072 goto exit;
6073 }
6074 if (!PyUnicode_FSConverter(args[1], &value)) {
Victor Stinner259f0e42017-01-17 01:35:17 +01006075 goto exit;
6076 }
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03006077 return_value = os_putenv_impl(module, name, value);
6078
6079exit:
6080 /* Cleanup for name */
6081 Py_XDECREF(name);
6082 /* Cleanup for value */
6083 Py_XDECREF(value);
6084
6085 return return_value;
6086}
6087
6088#endif /* defined(HAVE_PUTENV) && !defined(MS_WINDOWS) */
6089
6090#if defined(HAVE_UNSETENV)
6091
6092PyDoc_STRVAR(os_unsetenv__doc__,
6093"unsetenv($module, name, /)\n"
6094"--\n"
6095"\n"
6096"Delete an environment variable.");
6097
6098#define OS_UNSETENV_METHODDEF \
Serhiy Storchaka92e8af62015-04-04 00:12:11 +03006099 {"unsetenv", (PyCFunction)os_unsetenv, METH_O, os_unsetenv__doc__},
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03006100
6101static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03006102os_unsetenv_impl(PyObject *module, PyObject *name);
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03006103
6104static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03006105os_unsetenv(PyObject *module, PyObject *arg)
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03006106{
6107 PyObject *return_value = NULL;
6108 PyObject *name = NULL;
6109
Serhiy Storchaka32d96a22018-12-25 13:23:47 +02006110 if (!PyUnicode_FSConverter(arg, &name)) {
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03006111 goto exit;
Serhiy Storchaka5dee6552016-06-09 16:16:06 +03006112 }
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03006113 return_value = os_unsetenv_impl(module, name);
6114
6115exit:
6116 /* Cleanup for name */
6117 Py_XDECREF(name);
6118
6119 return return_value;
6120}
6121
6122#endif /* defined(HAVE_UNSETENV) */
6123
6124PyDoc_STRVAR(os_strerror__doc__,
6125"strerror($module, code, /)\n"
6126"--\n"
6127"\n"
6128"Translate an error code to a message string.");
6129
6130#define OS_STRERROR_METHODDEF \
Serhiy Storchaka92e8af62015-04-04 00:12:11 +03006131 {"strerror", (PyCFunction)os_strerror, METH_O, os_strerror__doc__},
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03006132
6133static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03006134os_strerror_impl(PyObject *module, int code);
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03006135
6136static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03006137os_strerror(PyObject *module, PyObject *arg)
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03006138{
6139 PyObject *return_value = NULL;
6140 int code;
6141
Serhiy Storchaka32d96a22018-12-25 13:23:47 +02006142 if (PyFloat_Check(arg)) {
6143 PyErr_SetString(PyExc_TypeError,
6144 "integer argument expected, got float" );
6145 goto exit;
6146 }
6147 code = _PyLong_AsInt(arg);
6148 if (code == -1 && PyErr_Occurred()) {
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03006149 goto exit;
Serhiy Storchaka5dee6552016-06-09 16:16:06 +03006150 }
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03006151 return_value = os_strerror_impl(module, code);
6152
6153exit:
6154 return return_value;
6155}
6156
6157#if defined(HAVE_SYS_WAIT_H) && defined(WCOREDUMP)
6158
6159PyDoc_STRVAR(os_WCOREDUMP__doc__,
6160"WCOREDUMP($module, status, /)\n"
6161"--\n"
6162"\n"
6163"Return True if the process returning status was dumped to a core file.");
6164
6165#define OS_WCOREDUMP_METHODDEF \
Serhiy Storchaka92e8af62015-04-04 00:12:11 +03006166 {"WCOREDUMP", (PyCFunction)os_WCOREDUMP, METH_O, os_WCOREDUMP__doc__},
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03006167
6168static int
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03006169os_WCOREDUMP_impl(PyObject *module, int status);
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03006170
6171static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03006172os_WCOREDUMP(PyObject *module, PyObject *arg)
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03006173{
6174 PyObject *return_value = NULL;
6175 int status;
6176 int _return_value;
6177
Serhiy Storchaka32d96a22018-12-25 13:23:47 +02006178 if (PyFloat_Check(arg)) {
6179 PyErr_SetString(PyExc_TypeError,
6180 "integer argument expected, got float" );
6181 goto exit;
6182 }
6183 status = _PyLong_AsInt(arg);
6184 if (status == -1 && PyErr_Occurred()) {
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03006185 goto exit;
Serhiy Storchaka5dee6552016-06-09 16:16:06 +03006186 }
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03006187 _return_value = os_WCOREDUMP_impl(module, status);
Serhiy Storchaka5dee6552016-06-09 16:16:06 +03006188 if ((_return_value == -1) && PyErr_Occurred()) {
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03006189 goto exit;
Serhiy Storchaka5dee6552016-06-09 16:16:06 +03006190 }
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03006191 return_value = PyBool_FromLong((long)_return_value);
6192
6193exit:
6194 return return_value;
6195}
6196
6197#endif /* defined(HAVE_SYS_WAIT_H) && defined(WCOREDUMP) */
6198
6199#if defined(HAVE_SYS_WAIT_H) && defined(WIFCONTINUED)
6200
6201PyDoc_STRVAR(os_WIFCONTINUED__doc__,
6202"WIFCONTINUED($module, /, status)\n"
6203"--\n"
6204"\n"
6205"Return True if a particular process was continued from a job control stop.\n"
6206"\n"
6207"Return True if the process returning status was continued from a\n"
6208"job control stop.");
6209
6210#define OS_WIFCONTINUED_METHODDEF \
Serhiy Storchaka4a934d42018-11-27 11:27:36 +02006211 {"WIFCONTINUED", (PyCFunction)(void(*)(void))os_WIFCONTINUED, METH_FASTCALL|METH_KEYWORDS, os_WIFCONTINUED__doc__},
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03006212
6213static int
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03006214os_WIFCONTINUED_impl(PyObject *module, int status);
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03006215
6216static PyObject *
Serhiy Storchakaa5552f02017-12-15 13:11:11 +02006217os_WIFCONTINUED(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames)
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03006218{
6219 PyObject *return_value = NULL;
Serhiy Storchaka9171a8b2016-08-14 10:52:18 +03006220 static const char * const _keywords[] = {"status", NULL};
Serhiy Storchaka31913912019-03-14 10:32:22 +02006221 static _PyArg_Parser _parser = {NULL, _keywords, "WIFCONTINUED", 0};
6222 PyObject *argsbuf[1];
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03006223 int status;
6224 int _return_value;
6225
Serhiy Storchaka31913912019-03-14 10:32:22 +02006226 args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 1, 1, 0, argsbuf);
6227 if (!args) {
6228 goto exit;
6229 }
6230 if (PyFloat_Check(args[0])) {
6231 PyErr_SetString(PyExc_TypeError,
6232 "integer argument expected, got float" );
6233 goto exit;
6234 }
6235 status = _PyLong_AsInt(args[0]);
6236 if (status == -1 && PyErr_Occurred()) {
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03006237 goto exit;
Serhiy Storchaka5dee6552016-06-09 16:16:06 +03006238 }
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03006239 _return_value = os_WIFCONTINUED_impl(module, status);
Serhiy Storchaka5dee6552016-06-09 16:16:06 +03006240 if ((_return_value == -1) && PyErr_Occurred()) {
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03006241 goto exit;
Serhiy Storchaka5dee6552016-06-09 16:16:06 +03006242 }
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03006243 return_value = PyBool_FromLong((long)_return_value);
6244
6245exit:
6246 return return_value;
6247}
6248
6249#endif /* defined(HAVE_SYS_WAIT_H) && defined(WIFCONTINUED) */
6250
6251#if defined(HAVE_SYS_WAIT_H) && defined(WIFSTOPPED)
6252
6253PyDoc_STRVAR(os_WIFSTOPPED__doc__,
6254"WIFSTOPPED($module, /, status)\n"
6255"--\n"
6256"\n"
6257"Return True if the process returning status was stopped.");
6258
6259#define OS_WIFSTOPPED_METHODDEF \
Serhiy Storchaka4a934d42018-11-27 11:27:36 +02006260 {"WIFSTOPPED", (PyCFunction)(void(*)(void))os_WIFSTOPPED, METH_FASTCALL|METH_KEYWORDS, os_WIFSTOPPED__doc__},
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03006261
6262static int
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03006263os_WIFSTOPPED_impl(PyObject *module, int status);
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03006264
6265static PyObject *
Serhiy Storchakaa5552f02017-12-15 13:11:11 +02006266os_WIFSTOPPED(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames)
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03006267{
6268 PyObject *return_value = NULL;
Serhiy Storchaka9171a8b2016-08-14 10:52:18 +03006269 static const char * const _keywords[] = {"status", NULL};
Serhiy Storchaka31913912019-03-14 10:32:22 +02006270 static _PyArg_Parser _parser = {NULL, _keywords, "WIFSTOPPED", 0};
6271 PyObject *argsbuf[1];
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03006272 int status;
6273 int _return_value;
6274
Serhiy Storchaka31913912019-03-14 10:32:22 +02006275 args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 1, 1, 0, argsbuf);
6276 if (!args) {
6277 goto exit;
6278 }
6279 if (PyFloat_Check(args[0])) {
6280 PyErr_SetString(PyExc_TypeError,
6281 "integer argument expected, got float" );
6282 goto exit;
6283 }
6284 status = _PyLong_AsInt(args[0]);
6285 if (status == -1 && PyErr_Occurred()) {
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03006286 goto exit;
Serhiy Storchaka5dee6552016-06-09 16:16:06 +03006287 }
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03006288 _return_value = os_WIFSTOPPED_impl(module, status);
Serhiy Storchaka5dee6552016-06-09 16:16:06 +03006289 if ((_return_value == -1) && PyErr_Occurred()) {
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03006290 goto exit;
Serhiy Storchaka5dee6552016-06-09 16:16:06 +03006291 }
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03006292 return_value = PyBool_FromLong((long)_return_value);
6293
6294exit:
6295 return return_value;
6296}
6297
6298#endif /* defined(HAVE_SYS_WAIT_H) && defined(WIFSTOPPED) */
6299
6300#if defined(HAVE_SYS_WAIT_H) && defined(WIFSIGNALED)
6301
6302PyDoc_STRVAR(os_WIFSIGNALED__doc__,
6303"WIFSIGNALED($module, /, status)\n"
6304"--\n"
6305"\n"
6306"Return True if the process returning status was terminated by a signal.");
6307
6308#define OS_WIFSIGNALED_METHODDEF \
Serhiy Storchaka4a934d42018-11-27 11:27:36 +02006309 {"WIFSIGNALED", (PyCFunction)(void(*)(void))os_WIFSIGNALED, METH_FASTCALL|METH_KEYWORDS, os_WIFSIGNALED__doc__},
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03006310
6311static int
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03006312os_WIFSIGNALED_impl(PyObject *module, int status);
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03006313
6314static PyObject *
Serhiy Storchakaa5552f02017-12-15 13:11:11 +02006315os_WIFSIGNALED(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames)
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03006316{
6317 PyObject *return_value = NULL;
Serhiy Storchaka9171a8b2016-08-14 10:52:18 +03006318 static const char * const _keywords[] = {"status", NULL};
Serhiy Storchaka31913912019-03-14 10:32:22 +02006319 static _PyArg_Parser _parser = {NULL, _keywords, "WIFSIGNALED", 0};
6320 PyObject *argsbuf[1];
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03006321 int status;
6322 int _return_value;
6323
Serhiy Storchaka31913912019-03-14 10:32:22 +02006324 args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 1, 1, 0, argsbuf);
6325 if (!args) {
6326 goto exit;
6327 }
6328 if (PyFloat_Check(args[0])) {
6329 PyErr_SetString(PyExc_TypeError,
6330 "integer argument expected, got float" );
6331 goto exit;
6332 }
6333 status = _PyLong_AsInt(args[0]);
6334 if (status == -1 && PyErr_Occurred()) {
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03006335 goto exit;
Serhiy Storchaka5dee6552016-06-09 16:16:06 +03006336 }
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03006337 _return_value = os_WIFSIGNALED_impl(module, status);
Serhiy Storchaka5dee6552016-06-09 16:16:06 +03006338 if ((_return_value == -1) && PyErr_Occurred()) {
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03006339 goto exit;
Serhiy Storchaka5dee6552016-06-09 16:16:06 +03006340 }
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03006341 return_value = PyBool_FromLong((long)_return_value);
6342
6343exit:
6344 return return_value;
6345}
6346
6347#endif /* defined(HAVE_SYS_WAIT_H) && defined(WIFSIGNALED) */
6348
6349#if defined(HAVE_SYS_WAIT_H) && defined(WIFEXITED)
6350
6351PyDoc_STRVAR(os_WIFEXITED__doc__,
6352"WIFEXITED($module, /, status)\n"
6353"--\n"
6354"\n"
6355"Return True if the process returning status exited via the exit() system call.");
6356
6357#define OS_WIFEXITED_METHODDEF \
Serhiy Storchaka4a934d42018-11-27 11:27:36 +02006358 {"WIFEXITED", (PyCFunction)(void(*)(void))os_WIFEXITED, METH_FASTCALL|METH_KEYWORDS, os_WIFEXITED__doc__},
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03006359
6360static int
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03006361os_WIFEXITED_impl(PyObject *module, int status);
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03006362
6363static PyObject *
Serhiy Storchakaa5552f02017-12-15 13:11:11 +02006364os_WIFEXITED(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames)
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03006365{
6366 PyObject *return_value = NULL;
Serhiy Storchaka9171a8b2016-08-14 10:52:18 +03006367 static const char * const _keywords[] = {"status", NULL};
Serhiy Storchaka31913912019-03-14 10:32:22 +02006368 static _PyArg_Parser _parser = {NULL, _keywords, "WIFEXITED", 0};
6369 PyObject *argsbuf[1];
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03006370 int status;
6371 int _return_value;
6372
Serhiy Storchaka31913912019-03-14 10:32:22 +02006373 args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 1, 1, 0, argsbuf);
6374 if (!args) {
6375 goto exit;
6376 }
6377 if (PyFloat_Check(args[0])) {
6378 PyErr_SetString(PyExc_TypeError,
6379 "integer argument expected, got float" );
6380 goto exit;
6381 }
6382 status = _PyLong_AsInt(args[0]);
6383 if (status == -1 && PyErr_Occurred()) {
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03006384 goto exit;
Serhiy Storchaka5dee6552016-06-09 16:16:06 +03006385 }
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03006386 _return_value = os_WIFEXITED_impl(module, status);
Serhiy Storchaka5dee6552016-06-09 16:16:06 +03006387 if ((_return_value == -1) && PyErr_Occurred()) {
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03006388 goto exit;
Serhiy Storchaka5dee6552016-06-09 16:16:06 +03006389 }
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03006390 return_value = PyBool_FromLong((long)_return_value);
6391
6392exit:
6393 return return_value;
6394}
6395
6396#endif /* defined(HAVE_SYS_WAIT_H) && defined(WIFEXITED) */
6397
6398#if defined(HAVE_SYS_WAIT_H) && defined(WEXITSTATUS)
6399
6400PyDoc_STRVAR(os_WEXITSTATUS__doc__,
6401"WEXITSTATUS($module, /, status)\n"
6402"--\n"
6403"\n"
6404"Return the process return code from status.");
6405
6406#define OS_WEXITSTATUS_METHODDEF \
Serhiy Storchaka4a934d42018-11-27 11:27:36 +02006407 {"WEXITSTATUS", (PyCFunction)(void(*)(void))os_WEXITSTATUS, METH_FASTCALL|METH_KEYWORDS, os_WEXITSTATUS__doc__},
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03006408
6409static int
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03006410os_WEXITSTATUS_impl(PyObject *module, int status);
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03006411
6412static PyObject *
Serhiy Storchakaa5552f02017-12-15 13:11:11 +02006413os_WEXITSTATUS(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames)
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03006414{
6415 PyObject *return_value = NULL;
Serhiy Storchaka9171a8b2016-08-14 10:52:18 +03006416 static const char * const _keywords[] = {"status", NULL};
Serhiy Storchaka31913912019-03-14 10:32:22 +02006417 static _PyArg_Parser _parser = {NULL, _keywords, "WEXITSTATUS", 0};
6418 PyObject *argsbuf[1];
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03006419 int status;
6420 int _return_value;
6421
Serhiy Storchaka31913912019-03-14 10:32:22 +02006422 args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 1, 1, 0, argsbuf);
6423 if (!args) {
6424 goto exit;
6425 }
6426 if (PyFloat_Check(args[0])) {
6427 PyErr_SetString(PyExc_TypeError,
6428 "integer argument expected, got float" );
6429 goto exit;
6430 }
6431 status = _PyLong_AsInt(args[0]);
6432 if (status == -1 && PyErr_Occurred()) {
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03006433 goto exit;
Serhiy Storchaka5dee6552016-06-09 16:16:06 +03006434 }
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03006435 _return_value = os_WEXITSTATUS_impl(module, status);
Serhiy Storchaka5dee6552016-06-09 16:16:06 +03006436 if ((_return_value == -1) && PyErr_Occurred()) {
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03006437 goto exit;
Serhiy Storchaka5dee6552016-06-09 16:16:06 +03006438 }
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03006439 return_value = PyLong_FromLong((long)_return_value);
6440
6441exit:
6442 return return_value;
6443}
6444
6445#endif /* defined(HAVE_SYS_WAIT_H) && defined(WEXITSTATUS) */
6446
6447#if defined(HAVE_SYS_WAIT_H) && defined(WTERMSIG)
6448
6449PyDoc_STRVAR(os_WTERMSIG__doc__,
6450"WTERMSIG($module, /, status)\n"
6451"--\n"
6452"\n"
6453"Return the signal that terminated the process that provided the status value.");
6454
6455#define OS_WTERMSIG_METHODDEF \
Serhiy Storchaka4a934d42018-11-27 11:27:36 +02006456 {"WTERMSIG", (PyCFunction)(void(*)(void))os_WTERMSIG, METH_FASTCALL|METH_KEYWORDS, os_WTERMSIG__doc__},
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03006457
6458static int
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03006459os_WTERMSIG_impl(PyObject *module, int status);
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03006460
6461static PyObject *
Serhiy Storchakaa5552f02017-12-15 13:11:11 +02006462os_WTERMSIG(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames)
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03006463{
6464 PyObject *return_value = NULL;
Serhiy Storchaka9171a8b2016-08-14 10:52:18 +03006465 static const char * const _keywords[] = {"status", NULL};
Serhiy Storchaka31913912019-03-14 10:32:22 +02006466 static _PyArg_Parser _parser = {NULL, _keywords, "WTERMSIG", 0};
6467 PyObject *argsbuf[1];
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03006468 int status;
6469 int _return_value;
6470
Serhiy Storchaka31913912019-03-14 10:32:22 +02006471 args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 1, 1, 0, argsbuf);
6472 if (!args) {
6473 goto exit;
6474 }
6475 if (PyFloat_Check(args[0])) {
6476 PyErr_SetString(PyExc_TypeError,
6477 "integer argument expected, got float" );
6478 goto exit;
6479 }
6480 status = _PyLong_AsInt(args[0]);
6481 if (status == -1 && PyErr_Occurred()) {
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03006482 goto exit;
Serhiy Storchaka5dee6552016-06-09 16:16:06 +03006483 }
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03006484 _return_value = os_WTERMSIG_impl(module, status);
Serhiy Storchaka5dee6552016-06-09 16:16:06 +03006485 if ((_return_value == -1) && PyErr_Occurred()) {
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03006486 goto exit;
Serhiy Storchaka5dee6552016-06-09 16:16:06 +03006487 }
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03006488 return_value = PyLong_FromLong((long)_return_value);
6489
6490exit:
6491 return return_value;
6492}
6493
6494#endif /* defined(HAVE_SYS_WAIT_H) && defined(WTERMSIG) */
6495
6496#if defined(HAVE_SYS_WAIT_H) && defined(WSTOPSIG)
6497
6498PyDoc_STRVAR(os_WSTOPSIG__doc__,
6499"WSTOPSIG($module, /, status)\n"
6500"--\n"
6501"\n"
6502"Return the signal that stopped the process that provided the status value.");
6503
6504#define OS_WSTOPSIG_METHODDEF \
Serhiy Storchaka4a934d42018-11-27 11:27:36 +02006505 {"WSTOPSIG", (PyCFunction)(void(*)(void))os_WSTOPSIG, METH_FASTCALL|METH_KEYWORDS, os_WSTOPSIG__doc__},
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03006506
6507static int
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03006508os_WSTOPSIG_impl(PyObject *module, int status);
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03006509
6510static PyObject *
Serhiy Storchakaa5552f02017-12-15 13:11:11 +02006511os_WSTOPSIG(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames)
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03006512{
6513 PyObject *return_value = NULL;
Serhiy Storchaka9171a8b2016-08-14 10:52:18 +03006514 static const char * const _keywords[] = {"status", NULL};
Serhiy Storchaka31913912019-03-14 10:32:22 +02006515 static _PyArg_Parser _parser = {NULL, _keywords, "WSTOPSIG", 0};
6516 PyObject *argsbuf[1];
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03006517 int status;
6518 int _return_value;
6519
Serhiy Storchaka31913912019-03-14 10:32:22 +02006520 args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 1, 1, 0, argsbuf);
6521 if (!args) {
6522 goto exit;
6523 }
6524 if (PyFloat_Check(args[0])) {
6525 PyErr_SetString(PyExc_TypeError,
6526 "integer argument expected, got float" );
6527 goto exit;
6528 }
6529 status = _PyLong_AsInt(args[0]);
6530 if (status == -1 && PyErr_Occurred()) {
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03006531 goto exit;
Serhiy Storchaka5dee6552016-06-09 16:16:06 +03006532 }
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03006533 _return_value = os_WSTOPSIG_impl(module, status);
Serhiy Storchaka5dee6552016-06-09 16:16:06 +03006534 if ((_return_value == -1) && PyErr_Occurred()) {
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03006535 goto exit;
Serhiy Storchaka5dee6552016-06-09 16:16:06 +03006536 }
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03006537 return_value = PyLong_FromLong((long)_return_value);
6538
6539exit:
6540 return return_value;
6541}
6542
6543#endif /* defined(HAVE_SYS_WAIT_H) && defined(WSTOPSIG) */
6544
6545#if (defined(HAVE_FSTATVFS) && defined(HAVE_SYS_STATVFS_H))
6546
6547PyDoc_STRVAR(os_fstatvfs__doc__,
6548"fstatvfs($module, fd, /)\n"
6549"--\n"
6550"\n"
6551"Perform an fstatvfs system call on the given fd.\n"
6552"\n"
6553"Equivalent to statvfs(fd).");
6554
6555#define OS_FSTATVFS_METHODDEF \
Serhiy Storchaka92e8af62015-04-04 00:12:11 +03006556 {"fstatvfs", (PyCFunction)os_fstatvfs, METH_O, os_fstatvfs__doc__},
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03006557
6558static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03006559os_fstatvfs_impl(PyObject *module, int fd);
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03006560
6561static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03006562os_fstatvfs(PyObject *module, PyObject *arg)
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03006563{
6564 PyObject *return_value = NULL;
6565 int fd;
6566
Serhiy Storchaka32d96a22018-12-25 13:23:47 +02006567 if (PyFloat_Check(arg)) {
6568 PyErr_SetString(PyExc_TypeError,
6569 "integer argument expected, got float" );
6570 goto exit;
6571 }
6572 fd = _PyLong_AsInt(arg);
6573 if (fd == -1 && PyErr_Occurred()) {
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03006574 goto exit;
Serhiy Storchaka5dee6552016-06-09 16:16:06 +03006575 }
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03006576 return_value = os_fstatvfs_impl(module, fd);
6577
6578exit:
6579 return return_value;
6580}
6581
6582#endif /* (defined(HAVE_FSTATVFS) && defined(HAVE_SYS_STATVFS_H)) */
6583
6584#if (defined(HAVE_STATVFS) && defined(HAVE_SYS_STATVFS_H))
6585
6586PyDoc_STRVAR(os_statvfs__doc__,
6587"statvfs($module, /, path)\n"
6588"--\n"
6589"\n"
6590"Perform a statvfs system call on the given path.\n"
6591"\n"
6592"path may always be specified as a string.\n"
6593"On some platforms, path may also be specified as an open file descriptor.\n"
6594" If this functionality is unavailable, using it raises an exception.");
6595
6596#define OS_STATVFS_METHODDEF \
Serhiy Storchaka4a934d42018-11-27 11:27:36 +02006597 {"statvfs", (PyCFunction)(void(*)(void))os_statvfs, METH_FASTCALL|METH_KEYWORDS, os_statvfs__doc__},
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03006598
6599static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03006600os_statvfs_impl(PyObject *module, path_t *path);
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03006601
6602static PyObject *
Serhiy Storchakaa5552f02017-12-15 13:11:11 +02006603os_statvfs(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames)
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03006604{
6605 PyObject *return_value = NULL;
Serhiy Storchaka9171a8b2016-08-14 10:52:18 +03006606 static const char * const _keywords[] = {"path", NULL};
Serhiy Storchaka31913912019-03-14 10:32:22 +02006607 static _PyArg_Parser _parser = {NULL, _keywords, "statvfs", 0};
6608 PyObject *argsbuf[1];
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03006609 path_t path = PATH_T_INITIALIZE("statvfs", "path", 0, PATH_HAVE_FSTATVFS);
6610
Serhiy Storchaka31913912019-03-14 10:32:22 +02006611 args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 1, 1, 0, argsbuf);
6612 if (!args) {
6613 goto exit;
6614 }
6615 if (!path_converter(args[0], &path)) {
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03006616 goto exit;
Serhiy Storchaka5dee6552016-06-09 16:16:06 +03006617 }
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03006618 return_value = os_statvfs_impl(module, &path);
6619
6620exit:
6621 /* Cleanup for path */
6622 path_cleanup(&path);
6623
6624 return return_value;
6625}
6626
6627#endif /* (defined(HAVE_STATVFS) && defined(HAVE_SYS_STATVFS_H)) */
6628
6629#if defined(MS_WINDOWS)
6630
6631PyDoc_STRVAR(os__getdiskusage__doc__,
6632"_getdiskusage($module, /, path)\n"
6633"--\n"
6634"\n"
6635"Return disk usage statistics about the given path as a (total, free) tuple.");
6636
6637#define OS__GETDISKUSAGE_METHODDEF \
Serhiy Storchaka4a934d42018-11-27 11:27:36 +02006638 {"_getdiskusage", (PyCFunction)(void(*)(void))os__getdiskusage, METH_FASTCALL|METH_KEYWORDS, os__getdiskusage__doc__},
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03006639
6640static PyObject *
Steve Dower23ad6d02018-02-22 10:39:10 -08006641os__getdiskusage_impl(PyObject *module, path_t *path);
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03006642
6643static PyObject *
Serhiy Storchakaa5552f02017-12-15 13:11:11 +02006644os__getdiskusage(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames)
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03006645{
6646 PyObject *return_value = NULL;
Serhiy Storchaka9171a8b2016-08-14 10:52:18 +03006647 static const char * const _keywords[] = {"path", NULL};
Serhiy Storchaka31913912019-03-14 10:32:22 +02006648 static _PyArg_Parser _parser = {NULL, _keywords, "_getdiskusage", 0};
6649 PyObject *argsbuf[1];
Steve Dower23ad6d02018-02-22 10:39:10 -08006650 path_t path = PATH_T_INITIALIZE("_getdiskusage", "path", 0, 0);
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03006651
Serhiy Storchaka31913912019-03-14 10:32:22 +02006652 args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 1, 1, 0, argsbuf);
6653 if (!args) {
6654 goto exit;
6655 }
6656 if (!path_converter(args[0], &path)) {
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03006657 goto exit;
Serhiy Storchaka5dee6552016-06-09 16:16:06 +03006658 }
Steve Dower23ad6d02018-02-22 10:39:10 -08006659 return_value = os__getdiskusage_impl(module, &path);
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03006660
6661exit:
Steve Dower23ad6d02018-02-22 10:39:10 -08006662 /* Cleanup for path */
6663 path_cleanup(&path);
6664
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03006665 return return_value;
6666}
6667
6668#endif /* defined(MS_WINDOWS) */
6669
6670#if defined(HAVE_FPATHCONF)
6671
6672PyDoc_STRVAR(os_fpathconf__doc__,
6673"fpathconf($module, fd, name, /)\n"
6674"--\n"
6675"\n"
6676"Return the configuration limit name for the file descriptor fd.\n"
6677"\n"
6678"If there is no limit, return -1.");
6679
6680#define OS_FPATHCONF_METHODDEF \
Serhiy Storchaka4a934d42018-11-27 11:27:36 +02006681 {"fpathconf", (PyCFunction)(void(*)(void))os_fpathconf, METH_FASTCALL, os_fpathconf__doc__},
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03006682
6683static long
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03006684os_fpathconf_impl(PyObject *module, int fd, int name);
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03006685
6686static PyObject *
Serhiy Storchakaa5552f02017-12-15 13:11:11 +02006687os_fpathconf(PyObject *module, PyObject *const *args, Py_ssize_t nargs)
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03006688{
6689 PyObject *return_value = NULL;
6690 int fd;
6691 int name;
6692 long _return_value;
6693
Serhiy Storchaka4fa95912019-01-11 16:01:14 +02006694 if (!_PyArg_CheckPositional("fpathconf", nargs, 2, 2)) {
6695 goto exit;
6696 }
6697 if (PyFloat_Check(args[0])) {
6698 PyErr_SetString(PyExc_TypeError,
6699 "integer argument expected, got float" );
6700 goto exit;
6701 }
6702 fd = _PyLong_AsInt(args[0]);
6703 if (fd == -1 && PyErr_Occurred()) {
6704 goto exit;
6705 }
6706 if (!conv_path_confname(args[1], &name)) {
Victor Stinner259f0e42017-01-17 01:35:17 +01006707 goto exit;
6708 }
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03006709 _return_value = os_fpathconf_impl(module, fd, name);
Serhiy Storchaka5dee6552016-06-09 16:16:06 +03006710 if ((_return_value == -1) && PyErr_Occurred()) {
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03006711 goto exit;
Serhiy Storchaka5dee6552016-06-09 16:16:06 +03006712 }
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03006713 return_value = PyLong_FromLong(_return_value);
6714
6715exit:
6716 return return_value;
6717}
6718
6719#endif /* defined(HAVE_FPATHCONF) */
6720
6721#if defined(HAVE_PATHCONF)
6722
6723PyDoc_STRVAR(os_pathconf__doc__,
6724"pathconf($module, /, path, name)\n"
6725"--\n"
6726"\n"
6727"Return the configuration limit name for the file or directory path.\n"
6728"\n"
6729"If there is no limit, return -1.\n"
6730"On some platforms, path may also be specified as an open file descriptor.\n"
6731" If this functionality is unavailable, using it raises an exception.");
6732
6733#define OS_PATHCONF_METHODDEF \
Serhiy Storchaka4a934d42018-11-27 11:27:36 +02006734 {"pathconf", (PyCFunction)(void(*)(void))os_pathconf, METH_FASTCALL|METH_KEYWORDS, os_pathconf__doc__},
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03006735
6736static long
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03006737os_pathconf_impl(PyObject *module, path_t *path, int name);
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03006738
6739static PyObject *
Serhiy Storchakaa5552f02017-12-15 13:11:11 +02006740os_pathconf(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames)
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03006741{
6742 PyObject *return_value = NULL;
Serhiy Storchaka9171a8b2016-08-14 10:52:18 +03006743 static const char * const _keywords[] = {"path", "name", NULL};
Serhiy Storchaka31913912019-03-14 10:32:22 +02006744 static _PyArg_Parser _parser = {NULL, _keywords, "pathconf", 0};
6745 PyObject *argsbuf[2];
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03006746 path_t path = PATH_T_INITIALIZE("pathconf", "path", 0, PATH_HAVE_FPATHCONF);
6747 int name;
6748 long _return_value;
6749
Serhiy Storchaka31913912019-03-14 10:32:22 +02006750 args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 2, 2, 0, argsbuf);
6751 if (!args) {
6752 goto exit;
6753 }
6754 if (!path_converter(args[0], &path)) {
6755 goto exit;
6756 }
6757 if (!conv_path_confname(args[1], &name)) {
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03006758 goto exit;
Serhiy Storchaka5dee6552016-06-09 16:16:06 +03006759 }
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03006760 _return_value = os_pathconf_impl(module, &path, name);
Serhiy Storchaka5dee6552016-06-09 16:16:06 +03006761 if ((_return_value == -1) && PyErr_Occurred()) {
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03006762 goto exit;
Serhiy Storchaka5dee6552016-06-09 16:16:06 +03006763 }
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03006764 return_value = PyLong_FromLong(_return_value);
6765
6766exit:
6767 /* Cleanup for path */
6768 path_cleanup(&path);
6769
6770 return return_value;
6771}
6772
6773#endif /* defined(HAVE_PATHCONF) */
6774
6775#if defined(HAVE_CONFSTR)
6776
6777PyDoc_STRVAR(os_confstr__doc__,
6778"confstr($module, name, /)\n"
6779"--\n"
6780"\n"
6781"Return a string-valued system configuration variable.");
6782
6783#define OS_CONFSTR_METHODDEF \
Serhiy Storchaka92e8af62015-04-04 00:12:11 +03006784 {"confstr", (PyCFunction)os_confstr, METH_O, os_confstr__doc__},
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03006785
6786static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03006787os_confstr_impl(PyObject *module, int name);
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03006788
6789static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03006790os_confstr(PyObject *module, PyObject *arg)
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03006791{
6792 PyObject *return_value = NULL;
6793 int name;
6794
Serhiy Storchaka32d96a22018-12-25 13:23:47 +02006795 if (!conv_confstr_confname(arg, &name)) {
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03006796 goto exit;
Serhiy Storchaka5dee6552016-06-09 16:16:06 +03006797 }
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03006798 return_value = os_confstr_impl(module, name);
6799
6800exit:
6801 return return_value;
6802}
6803
6804#endif /* defined(HAVE_CONFSTR) */
6805
6806#if defined(HAVE_SYSCONF)
6807
6808PyDoc_STRVAR(os_sysconf__doc__,
6809"sysconf($module, name, /)\n"
6810"--\n"
6811"\n"
6812"Return an integer-valued system configuration variable.");
6813
6814#define OS_SYSCONF_METHODDEF \
Serhiy Storchaka92e8af62015-04-04 00:12:11 +03006815 {"sysconf", (PyCFunction)os_sysconf, METH_O, os_sysconf__doc__},
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03006816
6817static long
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03006818os_sysconf_impl(PyObject *module, int name);
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03006819
6820static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03006821os_sysconf(PyObject *module, PyObject *arg)
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03006822{
6823 PyObject *return_value = NULL;
6824 int name;
6825 long _return_value;
6826
Serhiy Storchaka32d96a22018-12-25 13:23:47 +02006827 if (!conv_sysconf_confname(arg, &name)) {
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03006828 goto exit;
Serhiy Storchaka5dee6552016-06-09 16:16:06 +03006829 }
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03006830 _return_value = os_sysconf_impl(module, name);
Serhiy Storchaka5dee6552016-06-09 16:16:06 +03006831 if ((_return_value == -1) && PyErr_Occurred()) {
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03006832 goto exit;
Serhiy Storchaka5dee6552016-06-09 16:16:06 +03006833 }
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03006834 return_value = PyLong_FromLong(_return_value);
6835
6836exit:
6837 return return_value;
6838}
6839
6840#endif /* defined(HAVE_SYSCONF) */
6841
6842PyDoc_STRVAR(os_abort__doc__,
6843"abort($module, /)\n"
6844"--\n"
6845"\n"
6846"Abort the interpreter immediately.\n"
6847"\n"
6848"This function \'dumps core\' or otherwise fails in the hardest way possible\n"
6849"on the hosting operating system. This function never returns.");
6850
6851#define OS_ABORT_METHODDEF \
6852 {"abort", (PyCFunction)os_abort, METH_NOARGS, os_abort__doc__},
6853
6854static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03006855os_abort_impl(PyObject *module);
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03006856
6857static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03006858os_abort(PyObject *module, PyObject *Py_UNUSED(ignored))
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03006859{
6860 return os_abort_impl(module);
6861}
6862
Steve Dowercc16be82016-09-08 10:35:16 -07006863#if defined(MS_WINDOWS)
6864
6865PyDoc_STRVAR(os_startfile__doc__,
Serhiy Storchaka279f4462019-09-14 12:24:05 +03006866"startfile($module, /, filepath, operation=<unrepresentable>)\n"
Steve Dowercc16be82016-09-08 10:35:16 -07006867"--\n"
6868"\n"
Steve Dowercc16be82016-09-08 10:35:16 -07006869"Start a file with its associated application.\n"
6870"\n"
6871"When \"operation\" is not specified or \"open\", this acts like\n"
6872"double-clicking the file in Explorer, or giving the file name as an\n"
6873"argument to the DOS \"start\" command: the file is opened with whatever\n"
6874"application (if any) its extension is associated.\n"
6875"When another \"operation\" is given, it specifies what should be done with\n"
6876"the file. A typical operation is \"print\".\n"
6877"\n"
6878"startfile returns as soon as the associated application is launched.\n"
6879"There is no option to wait for the application to close, and no way\n"
6880"to retrieve the application\'s exit status.\n"
6881"\n"
6882"The filepath is relative to the current directory. If you want to use\n"
6883"an absolute path, make sure the first character is not a slash (\"/\");\n"
6884"the underlying Win32 ShellExecute function doesn\'t work if it is.");
6885
6886#define OS_STARTFILE_METHODDEF \
Serhiy Storchaka4a934d42018-11-27 11:27:36 +02006887 {"startfile", (PyCFunction)(void(*)(void))os_startfile, METH_FASTCALL|METH_KEYWORDS, os_startfile__doc__},
Steve Dowercc16be82016-09-08 10:35:16 -07006888
6889static PyObject *
Serhiy Storchakaafb3e712018-12-14 11:19:51 +02006890os_startfile_impl(PyObject *module, path_t *filepath,
6891 const Py_UNICODE *operation);
Steve Dowercc16be82016-09-08 10:35:16 -07006892
6893static PyObject *
Serhiy Storchakaa5552f02017-12-15 13:11:11 +02006894os_startfile(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames)
Steve Dowercc16be82016-09-08 10:35:16 -07006895{
6896 PyObject *return_value = NULL;
Victor Stinner37e4ef72016-09-09 20:00:13 -07006897 static const char * const _keywords[] = {"filepath", "operation", NULL};
6898 static _PyArg_Parser _parser = {"O&|u:startfile", _keywords, 0};
Steve Dowercc16be82016-09-08 10:35:16 -07006899 path_t filepath = PATH_T_INITIALIZE("startfile", "filepath", 0, 0);
Serhiy Storchakaafb3e712018-12-14 11:19:51 +02006900 const Py_UNICODE *operation = NULL;
Steve Dowercc16be82016-09-08 10:35:16 -07006901
Victor Stinner3e1fad62017-01-17 01:29:01 +01006902 if (!_PyArg_ParseStackAndKeywords(args, nargs, kwnames, &_parser,
Steve Dowercc16be82016-09-08 10:35:16 -07006903 path_converter, &filepath, &operation)) {
6904 goto exit;
6905 }
6906 return_value = os_startfile_impl(module, &filepath, operation);
6907
6908exit:
6909 /* Cleanup for filepath */
6910 path_cleanup(&filepath);
6911
6912 return return_value;
6913}
6914
6915#endif /* defined(MS_WINDOWS) */
6916
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03006917#if defined(HAVE_GETLOADAVG)
6918
6919PyDoc_STRVAR(os_getloadavg__doc__,
6920"getloadavg($module, /)\n"
6921"--\n"
6922"\n"
6923"Return average recent system load information.\n"
6924"\n"
6925"Return the number of processes in the system run queue averaged over\n"
6926"the last 1, 5, and 15 minutes as a tuple of three floats.\n"
6927"Raises OSError if the load average was unobtainable.");
6928
6929#define OS_GETLOADAVG_METHODDEF \
6930 {"getloadavg", (PyCFunction)os_getloadavg, METH_NOARGS, os_getloadavg__doc__},
6931
6932static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03006933os_getloadavg_impl(PyObject *module);
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03006934
6935static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03006936os_getloadavg(PyObject *module, PyObject *Py_UNUSED(ignored))
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03006937{
6938 return os_getloadavg_impl(module);
6939}
6940
6941#endif /* defined(HAVE_GETLOADAVG) */
6942
6943PyDoc_STRVAR(os_device_encoding__doc__,
6944"device_encoding($module, /, fd)\n"
6945"--\n"
6946"\n"
6947"Return a string describing the encoding of a terminal\'s file descriptor.\n"
6948"\n"
6949"The file descriptor must be attached to a terminal.\n"
6950"If the device is not a terminal, return None.");
6951
6952#define OS_DEVICE_ENCODING_METHODDEF \
Serhiy Storchaka4a934d42018-11-27 11:27:36 +02006953 {"device_encoding", (PyCFunction)(void(*)(void))os_device_encoding, METH_FASTCALL|METH_KEYWORDS, os_device_encoding__doc__},
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03006954
6955static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03006956os_device_encoding_impl(PyObject *module, int fd);
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03006957
6958static PyObject *
Serhiy Storchakaa5552f02017-12-15 13:11:11 +02006959os_device_encoding(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames)
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03006960{
6961 PyObject *return_value = NULL;
Serhiy Storchaka9171a8b2016-08-14 10:52:18 +03006962 static const char * const _keywords[] = {"fd", NULL};
Serhiy Storchaka31913912019-03-14 10:32:22 +02006963 static _PyArg_Parser _parser = {NULL, _keywords, "device_encoding", 0};
6964 PyObject *argsbuf[1];
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03006965 int fd;
6966
Serhiy Storchaka31913912019-03-14 10:32:22 +02006967 args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 1, 1, 0, argsbuf);
6968 if (!args) {
6969 goto exit;
6970 }
6971 if (PyFloat_Check(args[0])) {
6972 PyErr_SetString(PyExc_TypeError,
6973 "integer argument expected, got float" );
6974 goto exit;
6975 }
6976 fd = _PyLong_AsInt(args[0]);
6977 if (fd == -1 && PyErr_Occurred()) {
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03006978 goto exit;
Serhiy Storchaka5dee6552016-06-09 16:16:06 +03006979 }
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03006980 return_value = os_device_encoding_impl(module, fd);
6981
6982exit:
6983 return return_value;
6984}
6985
6986#if defined(HAVE_SETRESUID)
6987
6988PyDoc_STRVAR(os_setresuid__doc__,
6989"setresuid($module, ruid, euid, suid, /)\n"
6990"--\n"
6991"\n"
6992"Set the current process\'s real, effective, and saved user ids.");
6993
6994#define OS_SETRESUID_METHODDEF \
Serhiy Storchaka4a934d42018-11-27 11:27:36 +02006995 {"setresuid", (PyCFunction)(void(*)(void))os_setresuid, METH_FASTCALL, os_setresuid__doc__},
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03006996
6997static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03006998os_setresuid_impl(PyObject *module, uid_t ruid, uid_t euid, uid_t suid);
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03006999
7000static PyObject *
Serhiy Storchakaa5552f02017-12-15 13:11:11 +02007001os_setresuid(PyObject *module, PyObject *const *args, Py_ssize_t nargs)
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03007002{
7003 PyObject *return_value = NULL;
7004 uid_t ruid;
7005 uid_t euid;
7006 uid_t suid;
7007
Serhiy Storchaka4fa95912019-01-11 16:01:14 +02007008 if (!_PyArg_CheckPositional("setresuid", nargs, 3, 3)) {
7009 goto exit;
7010 }
7011 if (!_Py_Uid_Converter(args[0], &ruid)) {
7012 goto exit;
7013 }
7014 if (!_Py_Uid_Converter(args[1], &euid)) {
7015 goto exit;
7016 }
7017 if (!_Py_Uid_Converter(args[2], &suid)) {
Victor Stinner259f0e42017-01-17 01:35:17 +01007018 goto exit;
7019 }
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03007020 return_value = os_setresuid_impl(module, ruid, euid, suid);
7021
7022exit:
7023 return return_value;
7024}
7025
7026#endif /* defined(HAVE_SETRESUID) */
7027
7028#if defined(HAVE_SETRESGID)
7029
7030PyDoc_STRVAR(os_setresgid__doc__,
7031"setresgid($module, rgid, egid, sgid, /)\n"
7032"--\n"
7033"\n"
7034"Set the current process\'s real, effective, and saved group ids.");
7035
7036#define OS_SETRESGID_METHODDEF \
Serhiy Storchaka4a934d42018-11-27 11:27:36 +02007037 {"setresgid", (PyCFunction)(void(*)(void))os_setresgid, METH_FASTCALL, os_setresgid__doc__},
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03007038
7039static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03007040os_setresgid_impl(PyObject *module, gid_t rgid, gid_t egid, gid_t sgid);
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03007041
7042static PyObject *
Serhiy Storchakaa5552f02017-12-15 13:11:11 +02007043os_setresgid(PyObject *module, PyObject *const *args, Py_ssize_t nargs)
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03007044{
7045 PyObject *return_value = NULL;
7046 gid_t rgid;
7047 gid_t egid;
7048 gid_t sgid;
7049
Serhiy Storchaka4fa95912019-01-11 16:01:14 +02007050 if (!_PyArg_CheckPositional("setresgid", nargs, 3, 3)) {
7051 goto exit;
7052 }
7053 if (!_Py_Gid_Converter(args[0], &rgid)) {
7054 goto exit;
7055 }
7056 if (!_Py_Gid_Converter(args[1], &egid)) {
7057 goto exit;
7058 }
7059 if (!_Py_Gid_Converter(args[2], &sgid)) {
Victor Stinner259f0e42017-01-17 01:35:17 +01007060 goto exit;
7061 }
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03007062 return_value = os_setresgid_impl(module, rgid, egid, sgid);
7063
7064exit:
7065 return return_value;
7066}
7067
7068#endif /* defined(HAVE_SETRESGID) */
7069
7070#if defined(HAVE_GETRESUID)
7071
7072PyDoc_STRVAR(os_getresuid__doc__,
7073"getresuid($module, /)\n"
7074"--\n"
7075"\n"
7076"Return a tuple of the current process\'s real, effective, and saved user ids.");
7077
7078#define OS_GETRESUID_METHODDEF \
7079 {"getresuid", (PyCFunction)os_getresuid, METH_NOARGS, os_getresuid__doc__},
7080
7081static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03007082os_getresuid_impl(PyObject *module);
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03007083
7084static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03007085os_getresuid(PyObject *module, PyObject *Py_UNUSED(ignored))
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03007086{
7087 return os_getresuid_impl(module);
7088}
7089
7090#endif /* defined(HAVE_GETRESUID) */
7091
7092#if defined(HAVE_GETRESGID)
7093
7094PyDoc_STRVAR(os_getresgid__doc__,
7095"getresgid($module, /)\n"
7096"--\n"
7097"\n"
7098"Return a tuple of the current process\'s real, effective, and saved group ids.");
7099
7100#define OS_GETRESGID_METHODDEF \
7101 {"getresgid", (PyCFunction)os_getresgid, METH_NOARGS, os_getresgid__doc__},
7102
7103static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03007104os_getresgid_impl(PyObject *module);
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03007105
7106static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03007107os_getresgid(PyObject *module, PyObject *Py_UNUSED(ignored))
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03007108{
7109 return os_getresgid_impl(module);
7110}
7111
7112#endif /* defined(HAVE_GETRESGID) */
7113
7114#if defined(USE_XATTRS)
7115
7116PyDoc_STRVAR(os_getxattr__doc__,
7117"getxattr($module, /, path, attribute, *, follow_symlinks=True)\n"
7118"--\n"
7119"\n"
7120"Return the value of extended attribute attribute on path.\n"
7121"\n"
BNMetricsb9427072018-11-02 15:20:19 +00007122"path may be either a string, a path-like object, or an open file descriptor.\n"
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03007123"If follow_symlinks is False, and the last element of the path is a symbolic\n"
7124" link, getxattr will examine the symbolic link itself instead of the file\n"
7125" the link points to.");
7126
7127#define OS_GETXATTR_METHODDEF \
Serhiy Storchaka4a934d42018-11-27 11:27:36 +02007128 {"getxattr", (PyCFunction)(void(*)(void))os_getxattr, METH_FASTCALL|METH_KEYWORDS, os_getxattr__doc__},
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03007129
7130static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03007131os_getxattr_impl(PyObject *module, path_t *path, path_t *attribute,
Larry Hastings89964c42015-04-14 18:07:59 -04007132 int follow_symlinks);
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03007133
7134static PyObject *
Serhiy Storchakaa5552f02017-12-15 13:11:11 +02007135os_getxattr(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames)
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03007136{
7137 PyObject *return_value = NULL;
Serhiy Storchaka9171a8b2016-08-14 10:52:18 +03007138 static const char * const _keywords[] = {"path", "attribute", "follow_symlinks", NULL};
Serhiy Storchaka31913912019-03-14 10:32:22 +02007139 static _PyArg_Parser _parser = {NULL, _keywords, "getxattr", 0};
7140 PyObject *argsbuf[3];
7141 Py_ssize_t noptargs = nargs + (kwnames ? PyTuple_GET_SIZE(kwnames) : 0) - 2;
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03007142 path_t path = PATH_T_INITIALIZE("getxattr", "path", 0, 1);
7143 path_t attribute = PATH_T_INITIALIZE("getxattr", "attribute", 0, 0);
7144 int follow_symlinks = 1;
7145
Serhiy Storchaka31913912019-03-14 10:32:22 +02007146 args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 2, 2, 0, argsbuf);
7147 if (!args) {
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03007148 goto exit;
Serhiy Storchaka5dee6552016-06-09 16:16:06 +03007149 }
Serhiy Storchaka31913912019-03-14 10:32:22 +02007150 if (!path_converter(args[0], &path)) {
7151 goto exit;
7152 }
7153 if (!path_converter(args[1], &attribute)) {
7154 goto exit;
7155 }
7156 if (!noptargs) {
7157 goto skip_optional_kwonly;
7158 }
7159 follow_symlinks = PyObject_IsTrue(args[2]);
7160 if (follow_symlinks < 0) {
7161 goto exit;
7162 }
7163skip_optional_kwonly:
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03007164 return_value = os_getxattr_impl(module, &path, &attribute, follow_symlinks);
7165
7166exit:
7167 /* Cleanup for path */
7168 path_cleanup(&path);
7169 /* Cleanup for attribute */
7170 path_cleanup(&attribute);
7171
7172 return return_value;
7173}
7174
7175#endif /* defined(USE_XATTRS) */
7176
7177#if defined(USE_XATTRS)
7178
7179PyDoc_STRVAR(os_setxattr__doc__,
7180"setxattr($module, /, path, attribute, value, flags=0, *,\n"
7181" follow_symlinks=True)\n"
7182"--\n"
7183"\n"
7184"Set extended attribute attribute on path to value.\n"
7185"\n"
BNMetricsb9427072018-11-02 15:20:19 +00007186"path may be either a string, a path-like object, or an open file descriptor.\n"
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03007187"If follow_symlinks is False, and the last element of the path is a symbolic\n"
7188" link, setxattr will modify the symbolic link itself instead of the file\n"
7189" the link points to.");
7190
7191#define OS_SETXATTR_METHODDEF \
Serhiy Storchaka4a934d42018-11-27 11:27:36 +02007192 {"setxattr", (PyCFunction)(void(*)(void))os_setxattr, METH_FASTCALL|METH_KEYWORDS, os_setxattr__doc__},
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03007193
7194static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03007195os_setxattr_impl(PyObject *module, path_t *path, path_t *attribute,
Larry Hastings89964c42015-04-14 18:07:59 -04007196 Py_buffer *value, int flags, int follow_symlinks);
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03007197
7198static PyObject *
Serhiy Storchakaa5552f02017-12-15 13:11:11 +02007199os_setxattr(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames)
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03007200{
7201 PyObject *return_value = NULL;
Serhiy Storchaka9171a8b2016-08-14 10:52:18 +03007202 static const char * const _keywords[] = {"path", "attribute", "value", "flags", "follow_symlinks", NULL};
Serhiy Storchaka31913912019-03-14 10:32:22 +02007203 static _PyArg_Parser _parser = {NULL, _keywords, "setxattr", 0};
7204 PyObject *argsbuf[5];
7205 Py_ssize_t noptargs = nargs + (kwnames ? PyTuple_GET_SIZE(kwnames) : 0) - 3;
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03007206 path_t path = PATH_T_INITIALIZE("setxattr", "path", 0, 1);
7207 path_t attribute = PATH_T_INITIALIZE("setxattr", "attribute", 0, 0);
7208 Py_buffer value = {NULL, NULL};
7209 int flags = 0;
7210 int follow_symlinks = 1;
7211
Serhiy Storchaka31913912019-03-14 10:32:22 +02007212 args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 3, 4, 0, argsbuf);
7213 if (!args) {
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03007214 goto exit;
Serhiy Storchaka5dee6552016-06-09 16:16:06 +03007215 }
Serhiy Storchaka31913912019-03-14 10:32:22 +02007216 if (!path_converter(args[0], &path)) {
7217 goto exit;
7218 }
7219 if (!path_converter(args[1], &attribute)) {
7220 goto exit;
7221 }
7222 if (PyObject_GetBuffer(args[2], &value, PyBUF_SIMPLE) != 0) {
7223 goto exit;
7224 }
7225 if (!PyBuffer_IsContiguous(&value, 'C')) {
Rémi Lapeyre4901fe22019-08-29 16:49:08 +02007226 _PyArg_BadArgument("setxattr", "argument 'value'", "contiguous buffer", args[2]);
Serhiy Storchaka31913912019-03-14 10:32:22 +02007227 goto exit;
7228 }
7229 if (!noptargs) {
7230 goto skip_optional_pos;
7231 }
7232 if (args[3]) {
7233 if (PyFloat_Check(args[3])) {
7234 PyErr_SetString(PyExc_TypeError,
7235 "integer argument expected, got float" );
7236 goto exit;
7237 }
7238 flags = _PyLong_AsInt(args[3]);
7239 if (flags == -1 && PyErr_Occurred()) {
7240 goto exit;
7241 }
7242 if (!--noptargs) {
7243 goto skip_optional_pos;
7244 }
7245 }
7246skip_optional_pos:
7247 if (!noptargs) {
7248 goto skip_optional_kwonly;
7249 }
7250 follow_symlinks = PyObject_IsTrue(args[4]);
7251 if (follow_symlinks < 0) {
7252 goto exit;
7253 }
7254skip_optional_kwonly:
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03007255 return_value = os_setxattr_impl(module, &path, &attribute, &value, flags, follow_symlinks);
7256
7257exit:
7258 /* Cleanup for path */
7259 path_cleanup(&path);
7260 /* Cleanup for attribute */
7261 path_cleanup(&attribute);
7262 /* Cleanup for value */
Serhiy Storchaka5dee6552016-06-09 16:16:06 +03007263 if (value.obj) {
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03007264 PyBuffer_Release(&value);
Serhiy Storchaka5dee6552016-06-09 16:16:06 +03007265 }
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03007266
7267 return return_value;
7268}
7269
7270#endif /* defined(USE_XATTRS) */
7271
7272#if defined(USE_XATTRS)
7273
7274PyDoc_STRVAR(os_removexattr__doc__,
7275"removexattr($module, /, path, attribute, *, follow_symlinks=True)\n"
7276"--\n"
7277"\n"
7278"Remove extended attribute attribute on path.\n"
7279"\n"
BNMetricsb9427072018-11-02 15:20:19 +00007280"path may be either a string, a path-like object, or an open file descriptor.\n"
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03007281"If follow_symlinks is False, and the last element of the path is a symbolic\n"
7282" link, removexattr will modify the symbolic link itself instead of the file\n"
7283" the link points to.");
7284
7285#define OS_REMOVEXATTR_METHODDEF \
Serhiy Storchaka4a934d42018-11-27 11:27:36 +02007286 {"removexattr", (PyCFunction)(void(*)(void))os_removexattr, METH_FASTCALL|METH_KEYWORDS, os_removexattr__doc__},
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03007287
7288static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03007289os_removexattr_impl(PyObject *module, path_t *path, path_t *attribute,
Larry Hastings89964c42015-04-14 18:07:59 -04007290 int follow_symlinks);
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03007291
7292static PyObject *
Serhiy Storchakaa5552f02017-12-15 13:11:11 +02007293os_removexattr(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames)
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03007294{
7295 PyObject *return_value = NULL;
Serhiy Storchaka9171a8b2016-08-14 10:52:18 +03007296 static const char * const _keywords[] = {"path", "attribute", "follow_symlinks", NULL};
Serhiy Storchaka31913912019-03-14 10:32:22 +02007297 static _PyArg_Parser _parser = {NULL, _keywords, "removexattr", 0};
7298 PyObject *argsbuf[3];
7299 Py_ssize_t noptargs = nargs + (kwnames ? PyTuple_GET_SIZE(kwnames) : 0) - 2;
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03007300 path_t path = PATH_T_INITIALIZE("removexattr", "path", 0, 1);
7301 path_t attribute = PATH_T_INITIALIZE("removexattr", "attribute", 0, 0);
7302 int follow_symlinks = 1;
7303
Serhiy Storchaka31913912019-03-14 10:32:22 +02007304 args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 2, 2, 0, argsbuf);
7305 if (!args) {
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03007306 goto exit;
Serhiy Storchaka5dee6552016-06-09 16:16:06 +03007307 }
Serhiy Storchaka31913912019-03-14 10:32:22 +02007308 if (!path_converter(args[0], &path)) {
7309 goto exit;
7310 }
7311 if (!path_converter(args[1], &attribute)) {
7312 goto exit;
7313 }
7314 if (!noptargs) {
7315 goto skip_optional_kwonly;
7316 }
7317 follow_symlinks = PyObject_IsTrue(args[2]);
7318 if (follow_symlinks < 0) {
7319 goto exit;
7320 }
7321skip_optional_kwonly:
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03007322 return_value = os_removexattr_impl(module, &path, &attribute, follow_symlinks);
7323
7324exit:
7325 /* Cleanup for path */
7326 path_cleanup(&path);
7327 /* Cleanup for attribute */
7328 path_cleanup(&attribute);
7329
7330 return return_value;
7331}
7332
7333#endif /* defined(USE_XATTRS) */
7334
7335#if defined(USE_XATTRS)
7336
7337PyDoc_STRVAR(os_listxattr__doc__,
7338"listxattr($module, /, path=None, *, follow_symlinks=True)\n"
7339"--\n"
7340"\n"
7341"Return a list of extended attributes on path.\n"
7342"\n"
BNMetricsb9427072018-11-02 15:20:19 +00007343"path may be either None, a string, a path-like object, or an open file descriptor.\n"
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03007344"if path is None, listxattr will examine the current directory.\n"
7345"If follow_symlinks is False, and the last element of the path is a symbolic\n"
7346" link, listxattr will examine the symbolic link itself instead of the file\n"
7347" the link points to.");
7348
7349#define OS_LISTXATTR_METHODDEF \
Serhiy Storchaka4a934d42018-11-27 11:27:36 +02007350 {"listxattr", (PyCFunction)(void(*)(void))os_listxattr, METH_FASTCALL|METH_KEYWORDS, os_listxattr__doc__},
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03007351
7352static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03007353os_listxattr_impl(PyObject *module, path_t *path, int follow_symlinks);
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03007354
7355static PyObject *
Serhiy Storchakaa5552f02017-12-15 13:11:11 +02007356os_listxattr(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames)
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03007357{
7358 PyObject *return_value = NULL;
Serhiy Storchaka9171a8b2016-08-14 10:52:18 +03007359 static const char * const _keywords[] = {"path", "follow_symlinks", NULL};
Serhiy Storchaka31913912019-03-14 10:32:22 +02007360 static _PyArg_Parser _parser = {NULL, _keywords, "listxattr", 0};
7361 PyObject *argsbuf[2];
7362 Py_ssize_t noptargs = nargs + (kwnames ? PyTuple_GET_SIZE(kwnames) : 0) - 0;
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03007363 path_t path = PATH_T_INITIALIZE("listxattr", "path", 1, 1);
7364 int follow_symlinks = 1;
7365
Serhiy Storchaka31913912019-03-14 10:32:22 +02007366 args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 0, 1, 0, argsbuf);
7367 if (!args) {
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03007368 goto exit;
Serhiy Storchaka5dee6552016-06-09 16:16:06 +03007369 }
Serhiy Storchaka31913912019-03-14 10:32:22 +02007370 if (!noptargs) {
7371 goto skip_optional_pos;
7372 }
7373 if (args[0]) {
7374 if (!path_converter(args[0], &path)) {
7375 goto exit;
7376 }
7377 if (!--noptargs) {
7378 goto skip_optional_pos;
7379 }
7380 }
7381skip_optional_pos:
7382 if (!noptargs) {
7383 goto skip_optional_kwonly;
7384 }
7385 follow_symlinks = PyObject_IsTrue(args[1]);
7386 if (follow_symlinks < 0) {
7387 goto exit;
7388 }
7389skip_optional_kwonly:
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03007390 return_value = os_listxattr_impl(module, &path, follow_symlinks);
7391
7392exit:
7393 /* Cleanup for path */
7394 path_cleanup(&path);
7395
7396 return return_value;
7397}
7398
7399#endif /* defined(USE_XATTRS) */
7400
7401PyDoc_STRVAR(os_urandom__doc__,
7402"urandom($module, size, /)\n"
7403"--\n"
7404"\n"
7405"Return a bytes object containing random bytes suitable for cryptographic use.");
7406
7407#define OS_URANDOM_METHODDEF \
Serhiy Storchaka92e8af62015-04-04 00:12:11 +03007408 {"urandom", (PyCFunction)os_urandom, METH_O, os_urandom__doc__},
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03007409
7410static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03007411os_urandom_impl(PyObject *module, Py_ssize_t size);
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03007412
7413static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03007414os_urandom(PyObject *module, PyObject *arg)
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03007415{
7416 PyObject *return_value = NULL;
7417 Py_ssize_t size;
7418
Serhiy Storchaka32d96a22018-12-25 13:23:47 +02007419 if (PyFloat_Check(arg)) {
7420 PyErr_SetString(PyExc_TypeError,
7421 "integer argument expected, got float" );
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03007422 goto exit;
Serhiy Storchaka5dee6552016-06-09 16:16:06 +03007423 }
Serhiy Storchaka32d96a22018-12-25 13:23:47 +02007424 {
7425 Py_ssize_t ival = -1;
7426 PyObject *iobj = PyNumber_Index(arg);
7427 if (iobj != NULL) {
7428 ival = PyLong_AsSsize_t(iobj);
7429 Py_DECREF(iobj);
7430 }
7431 if (ival == -1 && PyErr_Occurred()) {
7432 goto exit;
7433 }
7434 size = ival;
7435 }
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03007436 return_value = os_urandom_impl(module, size);
7437
7438exit:
7439 return return_value;
7440}
7441
Zackery Spytz43fdbd22019-05-29 13:57:07 -06007442#if defined(HAVE_MEMFD_CREATE)
7443
7444PyDoc_STRVAR(os_memfd_create__doc__,
7445"memfd_create($module, /, name, flags=MFD_CLOEXEC)\n"
7446"--\n"
7447"\n");
7448
7449#define OS_MEMFD_CREATE_METHODDEF \
7450 {"memfd_create", (PyCFunction)(void(*)(void))os_memfd_create, METH_FASTCALL|METH_KEYWORDS, os_memfd_create__doc__},
7451
7452static PyObject *
7453os_memfd_create_impl(PyObject *module, PyObject *name, unsigned int flags);
7454
7455static PyObject *
7456os_memfd_create(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames)
7457{
7458 PyObject *return_value = NULL;
7459 static const char * const _keywords[] = {"name", "flags", NULL};
7460 static _PyArg_Parser _parser = {NULL, _keywords, "memfd_create", 0};
7461 PyObject *argsbuf[2];
7462 Py_ssize_t noptargs = nargs + (kwnames ? PyTuple_GET_SIZE(kwnames) : 0) - 1;
7463 PyObject *name = NULL;
7464 unsigned int flags = MFD_CLOEXEC;
7465
7466 args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 1, 2, 0, argsbuf);
7467 if (!args) {
7468 goto exit;
7469 }
7470 if (!PyUnicode_FSConverter(args[0], &name)) {
7471 goto exit;
7472 }
7473 if (!noptargs) {
7474 goto skip_optional_pos;
7475 }
7476 if (PyFloat_Check(args[1])) {
7477 PyErr_SetString(PyExc_TypeError,
7478 "integer argument expected, got float" );
7479 goto exit;
7480 }
7481 flags = (unsigned int)PyLong_AsUnsignedLongMask(args[1]);
7482 if (flags == (unsigned int)-1 && PyErr_Occurred()) {
7483 goto exit;
7484 }
7485skip_optional_pos:
7486 return_value = os_memfd_create_impl(module, name, flags);
7487
7488exit:
7489 /* Cleanup for name */
7490 Py_XDECREF(name);
7491
7492 return return_value;
7493}
7494
7495#endif /* defined(HAVE_MEMFD_CREATE) */
7496
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03007497PyDoc_STRVAR(os_cpu_count__doc__,
7498"cpu_count($module, /)\n"
7499"--\n"
7500"\n"
Charles-François Natali80d62e62015-08-13 20:37:08 +01007501"Return the number of CPUs in the system; return None if indeterminable.\n"
7502"\n"
7503"This number is not equivalent to the number of CPUs the current process can\n"
7504"use. The number of usable CPUs can be obtained with\n"
7505"``len(os.sched_getaffinity(0))``");
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03007506
7507#define OS_CPU_COUNT_METHODDEF \
7508 {"cpu_count", (PyCFunction)os_cpu_count, METH_NOARGS, os_cpu_count__doc__},
7509
7510static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03007511os_cpu_count_impl(PyObject *module);
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03007512
7513static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03007514os_cpu_count(PyObject *module, PyObject *Py_UNUSED(ignored))
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03007515{
7516 return os_cpu_count_impl(module);
7517}
7518
7519PyDoc_STRVAR(os_get_inheritable__doc__,
7520"get_inheritable($module, fd, /)\n"
7521"--\n"
7522"\n"
7523"Get the close-on-exe flag of the specified file descriptor.");
7524
7525#define OS_GET_INHERITABLE_METHODDEF \
Serhiy Storchaka92e8af62015-04-04 00:12:11 +03007526 {"get_inheritable", (PyCFunction)os_get_inheritable, METH_O, os_get_inheritable__doc__},
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03007527
7528static int
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03007529os_get_inheritable_impl(PyObject *module, int fd);
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03007530
7531static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03007532os_get_inheritable(PyObject *module, PyObject *arg)
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03007533{
7534 PyObject *return_value = NULL;
7535 int fd;
7536 int _return_value;
7537
Serhiy Storchaka32d96a22018-12-25 13:23:47 +02007538 if (PyFloat_Check(arg)) {
7539 PyErr_SetString(PyExc_TypeError,
7540 "integer argument expected, got float" );
7541 goto exit;
7542 }
7543 fd = _PyLong_AsInt(arg);
7544 if (fd == -1 && PyErr_Occurred()) {
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03007545 goto exit;
Serhiy Storchaka5dee6552016-06-09 16:16:06 +03007546 }
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03007547 _return_value = os_get_inheritable_impl(module, fd);
Serhiy Storchaka5dee6552016-06-09 16:16:06 +03007548 if ((_return_value == -1) && PyErr_Occurred()) {
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03007549 goto exit;
Serhiy Storchaka5dee6552016-06-09 16:16:06 +03007550 }
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03007551 return_value = PyBool_FromLong((long)_return_value);
7552
7553exit:
7554 return return_value;
7555}
7556
7557PyDoc_STRVAR(os_set_inheritable__doc__,
7558"set_inheritable($module, fd, inheritable, /)\n"
7559"--\n"
7560"\n"
7561"Set the inheritable flag of the specified file descriptor.");
7562
7563#define OS_SET_INHERITABLE_METHODDEF \
Serhiy Storchaka4a934d42018-11-27 11:27:36 +02007564 {"set_inheritable", (PyCFunction)(void(*)(void))os_set_inheritable, METH_FASTCALL, os_set_inheritable__doc__},
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03007565
7566static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03007567os_set_inheritable_impl(PyObject *module, int fd, int inheritable);
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03007568
7569static PyObject *
Serhiy Storchakaa5552f02017-12-15 13:11:11 +02007570os_set_inheritable(PyObject *module, PyObject *const *args, Py_ssize_t nargs)
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03007571{
7572 PyObject *return_value = NULL;
7573 int fd;
7574 int inheritable;
7575
Serhiy Storchaka4fa95912019-01-11 16:01:14 +02007576 if (!_PyArg_CheckPositional("set_inheritable", nargs, 2, 2)) {
7577 goto exit;
7578 }
7579 if (PyFloat_Check(args[0])) {
7580 PyErr_SetString(PyExc_TypeError,
7581 "integer argument expected, got float" );
7582 goto exit;
7583 }
7584 fd = _PyLong_AsInt(args[0]);
7585 if (fd == -1 && PyErr_Occurred()) {
7586 goto exit;
7587 }
7588 if (PyFloat_Check(args[1])) {
7589 PyErr_SetString(PyExc_TypeError,
7590 "integer argument expected, got float" );
7591 goto exit;
7592 }
7593 inheritable = _PyLong_AsInt(args[1]);
7594 if (inheritable == -1 && PyErr_Occurred()) {
Victor Stinner259f0e42017-01-17 01:35:17 +01007595 goto exit;
7596 }
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03007597 return_value = os_set_inheritable_impl(module, fd, inheritable);
7598
7599exit:
7600 return return_value;
7601}
7602
7603#if defined(MS_WINDOWS)
7604
7605PyDoc_STRVAR(os_get_handle_inheritable__doc__,
7606"get_handle_inheritable($module, handle, /)\n"
7607"--\n"
7608"\n"
7609"Get the close-on-exe flag of the specified file descriptor.");
7610
7611#define OS_GET_HANDLE_INHERITABLE_METHODDEF \
Serhiy Storchaka92e8af62015-04-04 00:12:11 +03007612 {"get_handle_inheritable", (PyCFunction)os_get_handle_inheritable, METH_O, os_get_handle_inheritable__doc__},
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03007613
7614static int
Victor Stinner581139c2016-09-06 15:54:20 -07007615os_get_handle_inheritable_impl(PyObject *module, intptr_t handle);
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03007616
7617static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03007618os_get_handle_inheritable(PyObject *module, PyObject *arg)
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03007619{
7620 PyObject *return_value = NULL;
Victor Stinner581139c2016-09-06 15:54:20 -07007621 intptr_t handle;
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03007622 int _return_value;
7623
Serhiy Storchaka5dee6552016-06-09 16:16:06 +03007624 if (!PyArg_Parse(arg, "" _Py_PARSE_INTPTR ":get_handle_inheritable", &handle)) {
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03007625 goto exit;
Serhiy Storchaka5dee6552016-06-09 16:16:06 +03007626 }
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03007627 _return_value = os_get_handle_inheritable_impl(module, handle);
Serhiy Storchaka5dee6552016-06-09 16:16:06 +03007628 if ((_return_value == -1) && PyErr_Occurred()) {
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03007629 goto exit;
Serhiy Storchaka5dee6552016-06-09 16:16:06 +03007630 }
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03007631 return_value = PyBool_FromLong((long)_return_value);
7632
7633exit:
7634 return return_value;
7635}
7636
7637#endif /* defined(MS_WINDOWS) */
7638
7639#if defined(MS_WINDOWS)
7640
7641PyDoc_STRVAR(os_set_handle_inheritable__doc__,
7642"set_handle_inheritable($module, handle, inheritable, /)\n"
7643"--\n"
7644"\n"
7645"Set the inheritable flag of the specified handle.");
7646
7647#define OS_SET_HANDLE_INHERITABLE_METHODDEF \
Serhiy Storchaka4a934d42018-11-27 11:27:36 +02007648 {"set_handle_inheritable", (PyCFunction)(void(*)(void))os_set_handle_inheritable, METH_FASTCALL, os_set_handle_inheritable__doc__},
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03007649
7650static PyObject *
Victor Stinner581139c2016-09-06 15:54:20 -07007651os_set_handle_inheritable_impl(PyObject *module, intptr_t handle,
Larry Hastings89964c42015-04-14 18:07:59 -04007652 int inheritable);
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03007653
7654static PyObject *
Serhiy Storchakaa5552f02017-12-15 13:11:11 +02007655os_set_handle_inheritable(PyObject *module, PyObject *const *args, Py_ssize_t nargs)
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03007656{
7657 PyObject *return_value = NULL;
Victor Stinner581139c2016-09-06 15:54:20 -07007658 intptr_t handle;
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03007659 int inheritable;
7660
Sylvain74453812017-06-10 06:51:48 +02007661 if (!_PyArg_ParseStack(args, nargs, "" _Py_PARSE_INTPTR "p:set_handle_inheritable",
7662 &handle, &inheritable)) {
Victor Stinner259f0e42017-01-17 01:35:17 +01007663 goto exit;
7664 }
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03007665 return_value = os_set_handle_inheritable_impl(module, handle, inheritable);
7666
7667exit:
7668 return return_value;
7669}
7670
7671#endif /* defined(MS_WINDOWS) */
7672
Serhiy Storchaka12a69db2018-09-17 15:38:27 +03007673#if !defined(MS_WINDOWS)
7674
7675PyDoc_STRVAR(os_get_blocking__doc__,
7676"get_blocking($module, fd, /)\n"
7677"--\n"
7678"\n"
7679"Get the blocking mode of the file descriptor.\n"
7680"\n"
7681"Return False if the O_NONBLOCK flag is set, True if the flag is cleared.");
7682
7683#define OS_GET_BLOCKING_METHODDEF \
7684 {"get_blocking", (PyCFunction)os_get_blocking, METH_O, os_get_blocking__doc__},
7685
7686static int
7687os_get_blocking_impl(PyObject *module, int fd);
7688
7689static PyObject *
7690os_get_blocking(PyObject *module, PyObject *arg)
7691{
7692 PyObject *return_value = NULL;
7693 int fd;
7694 int _return_value;
7695
Serhiy Storchaka32d96a22018-12-25 13:23:47 +02007696 if (PyFloat_Check(arg)) {
7697 PyErr_SetString(PyExc_TypeError,
7698 "integer argument expected, got float" );
7699 goto exit;
7700 }
7701 fd = _PyLong_AsInt(arg);
7702 if (fd == -1 && PyErr_Occurred()) {
Serhiy Storchaka12a69db2018-09-17 15:38:27 +03007703 goto exit;
7704 }
7705 _return_value = os_get_blocking_impl(module, fd);
7706 if ((_return_value == -1) && PyErr_Occurred()) {
7707 goto exit;
7708 }
7709 return_value = PyBool_FromLong((long)_return_value);
7710
7711exit:
7712 return return_value;
7713}
7714
7715#endif /* !defined(MS_WINDOWS) */
7716
7717#if !defined(MS_WINDOWS)
7718
7719PyDoc_STRVAR(os_set_blocking__doc__,
7720"set_blocking($module, fd, blocking, /)\n"
7721"--\n"
7722"\n"
7723"Set the blocking mode of the specified file descriptor.\n"
7724"\n"
7725"Set the O_NONBLOCK flag if blocking is False,\n"
7726"clear the O_NONBLOCK flag otherwise.");
7727
7728#define OS_SET_BLOCKING_METHODDEF \
Serhiy Storchaka4a934d42018-11-27 11:27:36 +02007729 {"set_blocking", (PyCFunction)(void(*)(void))os_set_blocking, METH_FASTCALL, os_set_blocking__doc__},
Serhiy Storchaka12a69db2018-09-17 15:38:27 +03007730
7731static PyObject *
7732os_set_blocking_impl(PyObject *module, int fd, int blocking);
7733
7734static PyObject *
7735os_set_blocking(PyObject *module, PyObject *const *args, Py_ssize_t nargs)
7736{
7737 PyObject *return_value = NULL;
7738 int fd;
7739 int blocking;
7740
Serhiy Storchaka4fa95912019-01-11 16:01:14 +02007741 if (!_PyArg_CheckPositional("set_blocking", nargs, 2, 2)) {
7742 goto exit;
7743 }
7744 if (PyFloat_Check(args[0])) {
7745 PyErr_SetString(PyExc_TypeError,
7746 "integer argument expected, got float" );
7747 goto exit;
7748 }
7749 fd = _PyLong_AsInt(args[0]);
7750 if (fd == -1 && PyErr_Occurred()) {
7751 goto exit;
7752 }
7753 if (PyFloat_Check(args[1])) {
7754 PyErr_SetString(PyExc_TypeError,
7755 "integer argument expected, got float" );
7756 goto exit;
7757 }
7758 blocking = _PyLong_AsInt(args[1]);
7759 if (blocking == -1 && PyErr_Occurred()) {
Serhiy Storchaka12a69db2018-09-17 15:38:27 +03007760 goto exit;
7761 }
7762 return_value = os_set_blocking_impl(module, fd, blocking);
7763
7764exit:
7765 return return_value;
7766}
7767
7768#endif /* !defined(MS_WINDOWS) */
7769
Serhiy Storchaka49d02d12016-11-06 13:45:33 +02007770PyDoc_STRVAR(os_DirEntry_is_symlink__doc__,
7771"is_symlink($self, /)\n"
7772"--\n"
7773"\n"
7774"Return True if the entry is a symbolic link; cached per entry.");
7775
7776#define OS_DIRENTRY_IS_SYMLINK_METHODDEF \
7777 {"is_symlink", (PyCFunction)os_DirEntry_is_symlink, METH_NOARGS, os_DirEntry_is_symlink__doc__},
7778
7779static int
7780os_DirEntry_is_symlink_impl(DirEntry *self);
7781
7782static PyObject *
7783os_DirEntry_is_symlink(DirEntry *self, PyObject *Py_UNUSED(ignored))
7784{
7785 PyObject *return_value = NULL;
7786 int _return_value;
7787
7788 _return_value = os_DirEntry_is_symlink_impl(self);
7789 if ((_return_value == -1) && PyErr_Occurred()) {
7790 goto exit;
7791 }
7792 return_value = PyBool_FromLong((long)_return_value);
7793
7794exit:
7795 return return_value;
7796}
7797
7798PyDoc_STRVAR(os_DirEntry_stat__doc__,
7799"stat($self, /, *, follow_symlinks=True)\n"
7800"--\n"
7801"\n"
7802"Return stat_result object for the entry; cached per entry.");
7803
7804#define OS_DIRENTRY_STAT_METHODDEF \
Serhiy Storchaka4a934d42018-11-27 11:27:36 +02007805 {"stat", (PyCFunction)(void(*)(void))os_DirEntry_stat, METH_FASTCALL|METH_KEYWORDS, os_DirEntry_stat__doc__},
Serhiy Storchaka49d02d12016-11-06 13:45:33 +02007806
7807static PyObject *
7808os_DirEntry_stat_impl(DirEntry *self, int follow_symlinks);
7809
7810static PyObject *
Serhiy Storchakaa5552f02017-12-15 13:11:11 +02007811os_DirEntry_stat(DirEntry *self, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames)
Serhiy Storchaka49d02d12016-11-06 13:45:33 +02007812{
7813 PyObject *return_value = NULL;
7814 static const char * const _keywords[] = {"follow_symlinks", NULL};
Serhiy Storchaka31913912019-03-14 10:32:22 +02007815 static _PyArg_Parser _parser = {NULL, _keywords, "stat", 0};
7816 PyObject *argsbuf[1];
7817 Py_ssize_t noptargs = nargs + (kwnames ? PyTuple_GET_SIZE(kwnames) : 0) - 0;
Serhiy Storchaka49d02d12016-11-06 13:45:33 +02007818 int follow_symlinks = 1;
7819
Serhiy Storchaka31913912019-03-14 10:32:22 +02007820 args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 0, 0, 0, argsbuf);
7821 if (!args) {
Serhiy Storchaka49d02d12016-11-06 13:45:33 +02007822 goto exit;
7823 }
Serhiy Storchaka31913912019-03-14 10:32:22 +02007824 if (!noptargs) {
7825 goto skip_optional_kwonly;
7826 }
7827 follow_symlinks = PyObject_IsTrue(args[0]);
7828 if (follow_symlinks < 0) {
7829 goto exit;
7830 }
7831skip_optional_kwonly:
Serhiy Storchaka49d02d12016-11-06 13:45:33 +02007832 return_value = os_DirEntry_stat_impl(self, follow_symlinks);
7833
7834exit:
7835 return return_value;
7836}
7837
7838PyDoc_STRVAR(os_DirEntry_is_dir__doc__,
7839"is_dir($self, /, *, follow_symlinks=True)\n"
7840"--\n"
7841"\n"
7842"Return True if the entry is a directory; cached per entry.");
7843
7844#define OS_DIRENTRY_IS_DIR_METHODDEF \
Serhiy Storchaka4a934d42018-11-27 11:27:36 +02007845 {"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 +02007846
7847static int
7848os_DirEntry_is_dir_impl(DirEntry *self, int follow_symlinks);
7849
7850static PyObject *
Serhiy Storchakaa5552f02017-12-15 13:11:11 +02007851os_DirEntry_is_dir(DirEntry *self, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames)
Serhiy Storchaka49d02d12016-11-06 13:45:33 +02007852{
7853 PyObject *return_value = NULL;
7854 static const char * const _keywords[] = {"follow_symlinks", NULL};
Serhiy Storchaka31913912019-03-14 10:32:22 +02007855 static _PyArg_Parser _parser = {NULL, _keywords, "is_dir", 0};
7856 PyObject *argsbuf[1];
7857 Py_ssize_t noptargs = nargs + (kwnames ? PyTuple_GET_SIZE(kwnames) : 0) - 0;
Serhiy Storchaka49d02d12016-11-06 13:45:33 +02007858 int follow_symlinks = 1;
7859 int _return_value;
7860
Serhiy Storchaka31913912019-03-14 10:32:22 +02007861 args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 0, 0, 0, argsbuf);
7862 if (!args) {
Serhiy Storchaka49d02d12016-11-06 13:45:33 +02007863 goto exit;
7864 }
Serhiy Storchaka31913912019-03-14 10:32:22 +02007865 if (!noptargs) {
7866 goto skip_optional_kwonly;
7867 }
7868 follow_symlinks = PyObject_IsTrue(args[0]);
7869 if (follow_symlinks < 0) {
7870 goto exit;
7871 }
7872skip_optional_kwonly:
Serhiy Storchaka49d02d12016-11-06 13:45:33 +02007873 _return_value = os_DirEntry_is_dir_impl(self, follow_symlinks);
7874 if ((_return_value == -1) && PyErr_Occurred()) {
7875 goto exit;
7876 }
7877 return_value = PyBool_FromLong((long)_return_value);
7878
7879exit:
7880 return return_value;
7881}
7882
7883PyDoc_STRVAR(os_DirEntry_is_file__doc__,
7884"is_file($self, /, *, follow_symlinks=True)\n"
7885"--\n"
7886"\n"
7887"Return True if the entry is a file; cached per entry.");
7888
7889#define OS_DIRENTRY_IS_FILE_METHODDEF \
Serhiy Storchaka4a934d42018-11-27 11:27:36 +02007890 {"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 +02007891
7892static int
7893os_DirEntry_is_file_impl(DirEntry *self, int follow_symlinks);
7894
7895static PyObject *
Serhiy Storchakaa5552f02017-12-15 13:11:11 +02007896os_DirEntry_is_file(DirEntry *self, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames)
Serhiy Storchaka49d02d12016-11-06 13:45:33 +02007897{
7898 PyObject *return_value = NULL;
7899 static const char * const _keywords[] = {"follow_symlinks", NULL};
Serhiy Storchaka31913912019-03-14 10:32:22 +02007900 static _PyArg_Parser _parser = {NULL, _keywords, "is_file", 0};
7901 PyObject *argsbuf[1];
7902 Py_ssize_t noptargs = nargs + (kwnames ? PyTuple_GET_SIZE(kwnames) : 0) - 0;
Serhiy Storchaka49d02d12016-11-06 13:45:33 +02007903 int follow_symlinks = 1;
7904 int _return_value;
7905
Serhiy Storchaka31913912019-03-14 10:32:22 +02007906 args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 0, 0, 0, argsbuf);
7907 if (!args) {
Serhiy Storchaka49d02d12016-11-06 13:45:33 +02007908 goto exit;
7909 }
Serhiy Storchaka31913912019-03-14 10:32:22 +02007910 if (!noptargs) {
7911 goto skip_optional_kwonly;
7912 }
7913 follow_symlinks = PyObject_IsTrue(args[0]);
7914 if (follow_symlinks < 0) {
7915 goto exit;
7916 }
7917skip_optional_kwonly:
Serhiy Storchaka49d02d12016-11-06 13:45:33 +02007918 _return_value = os_DirEntry_is_file_impl(self, follow_symlinks);
7919 if ((_return_value == -1) && PyErr_Occurred()) {
7920 goto exit;
7921 }
7922 return_value = PyBool_FromLong((long)_return_value);
7923
7924exit:
7925 return return_value;
7926}
7927
7928PyDoc_STRVAR(os_DirEntry_inode__doc__,
7929"inode($self, /)\n"
7930"--\n"
7931"\n"
7932"Return inode of the entry; cached per entry.");
7933
7934#define OS_DIRENTRY_INODE_METHODDEF \
7935 {"inode", (PyCFunction)os_DirEntry_inode, METH_NOARGS, os_DirEntry_inode__doc__},
7936
7937static PyObject *
7938os_DirEntry_inode_impl(DirEntry *self);
7939
7940static PyObject *
7941os_DirEntry_inode(DirEntry *self, PyObject *Py_UNUSED(ignored))
7942{
7943 return os_DirEntry_inode_impl(self);
7944}
7945
7946PyDoc_STRVAR(os_DirEntry___fspath____doc__,
7947"__fspath__($self, /)\n"
7948"--\n"
7949"\n"
7950"Returns the path for the entry.");
7951
7952#define OS_DIRENTRY___FSPATH___METHODDEF \
7953 {"__fspath__", (PyCFunction)os_DirEntry___fspath__, METH_NOARGS, os_DirEntry___fspath____doc__},
7954
7955static PyObject *
7956os_DirEntry___fspath___impl(DirEntry *self);
7957
7958static PyObject *
7959os_DirEntry___fspath__(DirEntry *self, PyObject *Py_UNUSED(ignored))
7960{
7961 return os_DirEntry___fspath___impl(self);
7962}
7963
7964PyDoc_STRVAR(os_scandir__doc__,
7965"scandir($module, /, path=None)\n"
7966"--\n"
7967"\n"
7968"Return an iterator of DirEntry objects for given path.\n"
7969"\n"
BNMetricsb9427072018-11-02 15:20:19 +00007970"path can be specified as either str, bytes, or a path-like object. If path\n"
Serhiy Storchaka49d02d12016-11-06 13:45:33 +02007971"is bytes, the names of yielded DirEntry objects will also be bytes; in\n"
7972"all other circumstances they will be str.\n"
7973"\n"
7974"If path is None, uses the path=\'.\'.");
7975
7976#define OS_SCANDIR_METHODDEF \
Serhiy Storchaka4a934d42018-11-27 11:27:36 +02007977 {"scandir", (PyCFunction)(void(*)(void))os_scandir, METH_FASTCALL|METH_KEYWORDS, os_scandir__doc__},
Serhiy Storchaka49d02d12016-11-06 13:45:33 +02007978
7979static PyObject *
7980os_scandir_impl(PyObject *module, path_t *path);
7981
7982static PyObject *
Serhiy Storchakaa5552f02017-12-15 13:11:11 +02007983os_scandir(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames)
Serhiy Storchaka49d02d12016-11-06 13:45:33 +02007984{
7985 PyObject *return_value = NULL;
7986 static const char * const _keywords[] = {"path", NULL};
Serhiy Storchaka31913912019-03-14 10:32:22 +02007987 static _PyArg_Parser _parser = {NULL, _keywords, "scandir", 0};
7988 PyObject *argsbuf[1];
7989 Py_ssize_t noptargs = nargs + (kwnames ? PyTuple_GET_SIZE(kwnames) : 0) - 0;
Serhiy Storchakaea720fe2017-03-30 09:12:31 +03007990 path_t path = PATH_T_INITIALIZE("scandir", "path", 1, PATH_HAVE_FDOPENDIR);
Serhiy Storchaka49d02d12016-11-06 13:45:33 +02007991
Serhiy Storchaka31913912019-03-14 10:32:22 +02007992 args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 0, 1, 0, argsbuf);
7993 if (!args) {
Serhiy Storchaka49d02d12016-11-06 13:45:33 +02007994 goto exit;
7995 }
Serhiy Storchaka31913912019-03-14 10:32:22 +02007996 if (!noptargs) {
7997 goto skip_optional_pos;
7998 }
7999 if (!path_converter(args[0], &path)) {
8000 goto exit;
8001 }
8002skip_optional_pos:
Serhiy Storchaka49d02d12016-11-06 13:45:33 +02008003 return_value = os_scandir_impl(module, &path);
8004
8005exit:
8006 /* Cleanup for path */
8007 path_cleanup(&path);
8008
8009 return return_value;
8010}
8011
Ethan Furman410ef8e2016-06-04 12:06:26 -07008012PyDoc_STRVAR(os_fspath__doc__,
8013"fspath($module, /, path)\n"
8014"--\n"
8015"\n"
8016"Return the file system path representation of the object.\n"
8017"\n"
Brett Cannonb4f43e92016-06-09 14:32:08 -07008018"If the object is str or bytes, then allow it to pass through as-is. If the\n"
8019"object defines __fspath__(), then return the result of that method. All other\n"
8020"types raise a TypeError.");
Ethan Furman410ef8e2016-06-04 12:06:26 -07008021
8022#define OS_FSPATH_METHODDEF \
Serhiy Storchaka4a934d42018-11-27 11:27:36 +02008023 {"fspath", (PyCFunction)(void(*)(void))os_fspath, METH_FASTCALL|METH_KEYWORDS, os_fspath__doc__},
Ethan Furman410ef8e2016-06-04 12:06:26 -07008024
8025static PyObject *
Serhiy Storchaka2954f832016-07-07 18:20:03 +03008026os_fspath_impl(PyObject *module, PyObject *path);
Ethan Furman410ef8e2016-06-04 12:06:26 -07008027
8028static PyObject *
Serhiy Storchakaa5552f02017-12-15 13:11:11 +02008029os_fspath(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames)
Ethan Furman410ef8e2016-06-04 12:06:26 -07008030{
8031 PyObject *return_value = NULL;
Serhiy Storchaka9171a8b2016-08-14 10:52:18 +03008032 static const char * const _keywords[] = {"path", NULL};
Serhiy Storchaka31913912019-03-14 10:32:22 +02008033 static _PyArg_Parser _parser = {NULL, _keywords, "fspath", 0};
8034 PyObject *argsbuf[1];
Ethan Furman410ef8e2016-06-04 12:06:26 -07008035 PyObject *path;
8036
Serhiy Storchaka31913912019-03-14 10:32:22 +02008037 args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 1, 1, 0, argsbuf);
8038 if (!args) {
Ethan Furman410ef8e2016-06-04 12:06:26 -07008039 goto exit;
Serhiy Storchaka5dee6552016-06-09 16:16:06 +03008040 }
Serhiy Storchaka31913912019-03-14 10:32:22 +02008041 path = args[0];
Ethan Furman410ef8e2016-06-04 12:06:26 -07008042 return_value = os_fspath_impl(module, path);
8043
8044exit:
8045 return return_value;
8046}
8047
Victor Stinner9b1f4742016-09-06 16:18:52 -07008048#if defined(HAVE_GETRANDOM_SYSCALL)
8049
8050PyDoc_STRVAR(os_getrandom__doc__,
8051"getrandom($module, /, size, flags=0)\n"
8052"--\n"
8053"\n"
8054"Obtain a series of random bytes.");
8055
8056#define OS_GETRANDOM_METHODDEF \
Serhiy Storchaka4a934d42018-11-27 11:27:36 +02008057 {"getrandom", (PyCFunction)(void(*)(void))os_getrandom, METH_FASTCALL|METH_KEYWORDS, os_getrandom__doc__},
Victor Stinner9b1f4742016-09-06 16:18:52 -07008058
8059static PyObject *
8060os_getrandom_impl(PyObject *module, Py_ssize_t size, int flags);
8061
8062static PyObject *
Serhiy Storchakaa5552f02017-12-15 13:11:11 +02008063os_getrandom(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames)
Victor Stinner9b1f4742016-09-06 16:18:52 -07008064{
8065 PyObject *return_value = NULL;
8066 static const char * const _keywords[] = {"size", "flags", NULL};
Serhiy Storchaka31913912019-03-14 10:32:22 +02008067 static _PyArg_Parser _parser = {NULL, _keywords, "getrandom", 0};
8068 PyObject *argsbuf[2];
8069 Py_ssize_t noptargs = nargs + (kwnames ? PyTuple_GET_SIZE(kwnames) : 0) - 1;
Victor Stinner9b1f4742016-09-06 16:18:52 -07008070 Py_ssize_t size;
8071 int flags = 0;
8072
Serhiy Storchaka31913912019-03-14 10:32:22 +02008073 args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 1, 2, 0, argsbuf);
8074 if (!args) {
Victor Stinner9b1f4742016-09-06 16:18:52 -07008075 goto exit;
8076 }
Serhiy Storchaka31913912019-03-14 10:32:22 +02008077 if (PyFloat_Check(args[0])) {
8078 PyErr_SetString(PyExc_TypeError,
8079 "integer argument expected, got float" );
8080 goto exit;
8081 }
8082 {
8083 Py_ssize_t ival = -1;
8084 PyObject *iobj = PyNumber_Index(args[0]);
8085 if (iobj != NULL) {
8086 ival = PyLong_AsSsize_t(iobj);
8087 Py_DECREF(iobj);
8088 }
8089 if (ival == -1 && PyErr_Occurred()) {
8090 goto exit;
8091 }
8092 size = ival;
8093 }
8094 if (!noptargs) {
8095 goto skip_optional_pos;
8096 }
8097 if (PyFloat_Check(args[1])) {
8098 PyErr_SetString(PyExc_TypeError,
8099 "integer argument expected, got float" );
8100 goto exit;
8101 }
8102 flags = _PyLong_AsInt(args[1]);
8103 if (flags == -1 && PyErr_Occurred()) {
8104 goto exit;
8105 }
8106skip_optional_pos:
Victor Stinner9b1f4742016-09-06 16:18:52 -07008107 return_value = os_getrandom_impl(module, size, flags);
8108
8109exit:
8110 return return_value;
8111}
8112
8113#endif /* defined(HAVE_GETRANDOM_SYSCALL) */
8114
Steve Dower2438cdf2019-03-29 16:37:16 -07008115#if defined(MS_WINDOWS)
8116
8117PyDoc_STRVAR(os__add_dll_directory__doc__,
8118"_add_dll_directory($module, /, path)\n"
8119"--\n"
8120"\n"
8121"Add a path to the DLL search path.\n"
8122"\n"
8123"This search path is used when resolving dependencies for imported\n"
8124"extension modules (the module itself is resolved through sys.path),\n"
8125"and also by ctypes.\n"
8126"\n"
8127"Returns an opaque value that may be passed to os.remove_dll_directory\n"
8128"to remove this directory from the search path.");
8129
8130#define OS__ADD_DLL_DIRECTORY_METHODDEF \
8131 {"_add_dll_directory", (PyCFunction)(void(*)(void))os__add_dll_directory, METH_FASTCALL|METH_KEYWORDS, os__add_dll_directory__doc__},
8132
8133static PyObject *
8134os__add_dll_directory_impl(PyObject *module, path_t *path);
8135
8136static PyObject *
8137os__add_dll_directory(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames)
8138{
8139 PyObject *return_value = NULL;
8140 static const char * const _keywords[] = {"path", NULL};
8141 static _PyArg_Parser _parser = {NULL, _keywords, "_add_dll_directory", 0};
8142 PyObject *argsbuf[1];
8143 path_t path = PATH_T_INITIALIZE("_add_dll_directory", "path", 0, 0);
8144
8145 args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 1, 1, 0, argsbuf);
8146 if (!args) {
8147 goto exit;
8148 }
8149 if (!path_converter(args[0], &path)) {
8150 goto exit;
8151 }
8152 return_value = os__add_dll_directory_impl(module, &path);
8153
8154exit:
8155 /* Cleanup for path */
8156 path_cleanup(&path);
8157
8158 return return_value;
8159}
8160
8161#endif /* defined(MS_WINDOWS) */
8162
8163#if defined(MS_WINDOWS)
8164
8165PyDoc_STRVAR(os__remove_dll_directory__doc__,
8166"_remove_dll_directory($module, /, cookie)\n"
8167"--\n"
8168"\n"
8169"Removes a path from the DLL search path.\n"
8170"\n"
8171"The parameter is an opaque value that was returned from\n"
8172"os.add_dll_directory. You can only remove directories that you added\n"
8173"yourself.");
8174
8175#define OS__REMOVE_DLL_DIRECTORY_METHODDEF \
8176 {"_remove_dll_directory", (PyCFunction)(void(*)(void))os__remove_dll_directory, METH_FASTCALL|METH_KEYWORDS, os__remove_dll_directory__doc__},
8177
8178static PyObject *
8179os__remove_dll_directory_impl(PyObject *module, PyObject *cookie);
8180
8181static PyObject *
8182os__remove_dll_directory(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames)
8183{
8184 PyObject *return_value = NULL;
8185 static const char * const _keywords[] = {"cookie", NULL};
8186 static _PyArg_Parser _parser = {NULL, _keywords, "_remove_dll_directory", 0};
8187 PyObject *argsbuf[1];
8188 PyObject *cookie;
8189
8190 args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 1, 1, 0, argsbuf);
8191 if (!args) {
8192 goto exit;
8193 }
8194 cookie = args[0];
8195 return_value = os__remove_dll_directory_impl(module, cookie);
8196
8197exit:
8198 return return_value;
8199}
8200
8201#endif /* defined(MS_WINDOWS) */
8202
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03008203#ifndef OS_TTYNAME_METHODDEF
8204 #define OS_TTYNAME_METHODDEF
8205#endif /* !defined(OS_TTYNAME_METHODDEF) */
8206
8207#ifndef OS_CTERMID_METHODDEF
8208 #define OS_CTERMID_METHODDEF
8209#endif /* !defined(OS_CTERMID_METHODDEF) */
8210
8211#ifndef OS_FCHDIR_METHODDEF
8212 #define OS_FCHDIR_METHODDEF
8213#endif /* !defined(OS_FCHDIR_METHODDEF) */
8214
8215#ifndef OS_FCHMOD_METHODDEF
8216 #define OS_FCHMOD_METHODDEF
8217#endif /* !defined(OS_FCHMOD_METHODDEF) */
8218
8219#ifndef OS_LCHMOD_METHODDEF
8220 #define OS_LCHMOD_METHODDEF
8221#endif /* !defined(OS_LCHMOD_METHODDEF) */
8222
8223#ifndef OS_CHFLAGS_METHODDEF
8224 #define OS_CHFLAGS_METHODDEF
8225#endif /* !defined(OS_CHFLAGS_METHODDEF) */
8226
8227#ifndef OS_LCHFLAGS_METHODDEF
8228 #define OS_LCHFLAGS_METHODDEF
8229#endif /* !defined(OS_LCHFLAGS_METHODDEF) */
8230
8231#ifndef OS_CHROOT_METHODDEF
8232 #define OS_CHROOT_METHODDEF
8233#endif /* !defined(OS_CHROOT_METHODDEF) */
8234
8235#ifndef OS_FSYNC_METHODDEF
8236 #define OS_FSYNC_METHODDEF
8237#endif /* !defined(OS_FSYNC_METHODDEF) */
8238
8239#ifndef OS_SYNC_METHODDEF
8240 #define OS_SYNC_METHODDEF
8241#endif /* !defined(OS_SYNC_METHODDEF) */
8242
8243#ifndef OS_FDATASYNC_METHODDEF
8244 #define OS_FDATASYNC_METHODDEF
8245#endif /* !defined(OS_FDATASYNC_METHODDEF) */
8246
8247#ifndef OS_CHOWN_METHODDEF
8248 #define OS_CHOWN_METHODDEF
8249#endif /* !defined(OS_CHOWN_METHODDEF) */
8250
8251#ifndef OS_FCHOWN_METHODDEF
8252 #define OS_FCHOWN_METHODDEF
8253#endif /* !defined(OS_FCHOWN_METHODDEF) */
8254
8255#ifndef OS_LCHOWN_METHODDEF
8256 #define OS_LCHOWN_METHODDEF
8257#endif /* !defined(OS_LCHOWN_METHODDEF) */
8258
8259#ifndef OS_LINK_METHODDEF
8260 #define OS_LINK_METHODDEF
8261#endif /* !defined(OS_LINK_METHODDEF) */
8262
Serhiy Storchakaf0b50152015-05-13 00:52:39 +03008263#ifndef OS__GETFULLPATHNAME_METHODDEF
8264 #define OS__GETFULLPATHNAME_METHODDEF
8265#endif /* !defined(OS__GETFULLPATHNAME_METHODDEF) */
8266
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03008267#ifndef OS__GETFINALPATHNAME_METHODDEF
8268 #define OS__GETFINALPATHNAME_METHODDEF
8269#endif /* !defined(OS__GETFINALPATHNAME_METHODDEF) */
8270
8271#ifndef OS__GETVOLUMEPATHNAME_METHODDEF
8272 #define OS__GETVOLUMEPATHNAME_METHODDEF
8273#endif /* !defined(OS__GETVOLUMEPATHNAME_METHODDEF) */
8274
8275#ifndef OS_NICE_METHODDEF
8276 #define OS_NICE_METHODDEF
8277#endif /* !defined(OS_NICE_METHODDEF) */
8278
8279#ifndef OS_GETPRIORITY_METHODDEF
8280 #define OS_GETPRIORITY_METHODDEF
8281#endif /* !defined(OS_GETPRIORITY_METHODDEF) */
8282
8283#ifndef OS_SETPRIORITY_METHODDEF
8284 #define OS_SETPRIORITY_METHODDEF
8285#endif /* !defined(OS_SETPRIORITY_METHODDEF) */
8286
8287#ifndef OS_SYSTEM_METHODDEF
8288 #define OS_SYSTEM_METHODDEF
8289#endif /* !defined(OS_SYSTEM_METHODDEF) */
8290
8291#ifndef OS_UNAME_METHODDEF
8292 #define OS_UNAME_METHODDEF
8293#endif /* !defined(OS_UNAME_METHODDEF) */
8294
8295#ifndef OS_EXECV_METHODDEF
8296 #define OS_EXECV_METHODDEF
8297#endif /* !defined(OS_EXECV_METHODDEF) */
8298
8299#ifndef OS_EXECVE_METHODDEF
8300 #define OS_EXECVE_METHODDEF
8301#endif /* !defined(OS_EXECVE_METHODDEF) */
8302
Pablo Galindo6c6ddf92018-01-29 01:56:10 +00008303#ifndef OS_POSIX_SPAWN_METHODDEF
8304 #define OS_POSIX_SPAWN_METHODDEF
8305#endif /* !defined(OS_POSIX_SPAWN_METHODDEF) */
8306
Joannah Nanjekye92b83222019-01-16 16:29:26 +03008307#ifndef OS_POSIX_SPAWNP_METHODDEF
8308 #define OS_POSIX_SPAWNP_METHODDEF
8309#endif /* !defined(OS_POSIX_SPAWNP_METHODDEF) */
8310
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03008311#ifndef OS_SPAWNV_METHODDEF
8312 #define OS_SPAWNV_METHODDEF
8313#endif /* !defined(OS_SPAWNV_METHODDEF) */
8314
8315#ifndef OS_SPAWNVE_METHODDEF
8316 #define OS_SPAWNVE_METHODDEF
8317#endif /* !defined(OS_SPAWNVE_METHODDEF) */
8318
Antoine Pitrou346cbd32017-05-27 17:50:54 +02008319#ifndef OS_REGISTER_AT_FORK_METHODDEF
8320 #define OS_REGISTER_AT_FORK_METHODDEF
8321#endif /* !defined(OS_REGISTER_AT_FORK_METHODDEF) */
8322
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03008323#ifndef OS_FORK1_METHODDEF
8324 #define OS_FORK1_METHODDEF
8325#endif /* !defined(OS_FORK1_METHODDEF) */
8326
8327#ifndef OS_FORK_METHODDEF
8328 #define OS_FORK_METHODDEF
8329#endif /* !defined(OS_FORK_METHODDEF) */
8330
8331#ifndef OS_SCHED_GET_PRIORITY_MAX_METHODDEF
8332 #define OS_SCHED_GET_PRIORITY_MAX_METHODDEF
8333#endif /* !defined(OS_SCHED_GET_PRIORITY_MAX_METHODDEF) */
8334
8335#ifndef OS_SCHED_GET_PRIORITY_MIN_METHODDEF
8336 #define OS_SCHED_GET_PRIORITY_MIN_METHODDEF
8337#endif /* !defined(OS_SCHED_GET_PRIORITY_MIN_METHODDEF) */
8338
8339#ifndef OS_SCHED_GETSCHEDULER_METHODDEF
8340 #define OS_SCHED_GETSCHEDULER_METHODDEF
8341#endif /* !defined(OS_SCHED_GETSCHEDULER_METHODDEF) */
8342
8343#ifndef OS_SCHED_SETSCHEDULER_METHODDEF
8344 #define OS_SCHED_SETSCHEDULER_METHODDEF
8345#endif /* !defined(OS_SCHED_SETSCHEDULER_METHODDEF) */
8346
8347#ifndef OS_SCHED_GETPARAM_METHODDEF
8348 #define OS_SCHED_GETPARAM_METHODDEF
8349#endif /* !defined(OS_SCHED_GETPARAM_METHODDEF) */
8350
8351#ifndef OS_SCHED_SETPARAM_METHODDEF
8352 #define OS_SCHED_SETPARAM_METHODDEF
8353#endif /* !defined(OS_SCHED_SETPARAM_METHODDEF) */
8354
8355#ifndef OS_SCHED_RR_GET_INTERVAL_METHODDEF
8356 #define OS_SCHED_RR_GET_INTERVAL_METHODDEF
8357#endif /* !defined(OS_SCHED_RR_GET_INTERVAL_METHODDEF) */
8358
8359#ifndef OS_SCHED_YIELD_METHODDEF
8360 #define OS_SCHED_YIELD_METHODDEF
8361#endif /* !defined(OS_SCHED_YIELD_METHODDEF) */
8362
8363#ifndef OS_SCHED_SETAFFINITY_METHODDEF
8364 #define OS_SCHED_SETAFFINITY_METHODDEF
8365#endif /* !defined(OS_SCHED_SETAFFINITY_METHODDEF) */
8366
8367#ifndef OS_SCHED_GETAFFINITY_METHODDEF
8368 #define OS_SCHED_GETAFFINITY_METHODDEF
8369#endif /* !defined(OS_SCHED_GETAFFINITY_METHODDEF) */
8370
8371#ifndef OS_OPENPTY_METHODDEF
8372 #define OS_OPENPTY_METHODDEF
8373#endif /* !defined(OS_OPENPTY_METHODDEF) */
8374
8375#ifndef OS_FORKPTY_METHODDEF
8376 #define OS_FORKPTY_METHODDEF
8377#endif /* !defined(OS_FORKPTY_METHODDEF) */
8378
8379#ifndef OS_GETEGID_METHODDEF
8380 #define OS_GETEGID_METHODDEF
8381#endif /* !defined(OS_GETEGID_METHODDEF) */
8382
8383#ifndef OS_GETEUID_METHODDEF
8384 #define OS_GETEUID_METHODDEF
8385#endif /* !defined(OS_GETEUID_METHODDEF) */
8386
8387#ifndef OS_GETGID_METHODDEF
8388 #define OS_GETGID_METHODDEF
8389#endif /* !defined(OS_GETGID_METHODDEF) */
8390
Berker Peksag39404992016-09-15 20:45:16 +03008391#ifndef OS_GETPID_METHODDEF
8392 #define OS_GETPID_METHODDEF
8393#endif /* !defined(OS_GETPID_METHODDEF) */
8394
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03008395#ifndef OS_GETGROUPS_METHODDEF
8396 #define OS_GETGROUPS_METHODDEF
8397#endif /* !defined(OS_GETGROUPS_METHODDEF) */
8398
8399#ifndef OS_GETPGID_METHODDEF
8400 #define OS_GETPGID_METHODDEF
8401#endif /* !defined(OS_GETPGID_METHODDEF) */
8402
8403#ifndef OS_GETPGRP_METHODDEF
8404 #define OS_GETPGRP_METHODDEF
8405#endif /* !defined(OS_GETPGRP_METHODDEF) */
8406
8407#ifndef OS_SETPGRP_METHODDEF
8408 #define OS_SETPGRP_METHODDEF
8409#endif /* !defined(OS_SETPGRP_METHODDEF) */
8410
8411#ifndef OS_GETPPID_METHODDEF
8412 #define OS_GETPPID_METHODDEF
8413#endif /* !defined(OS_GETPPID_METHODDEF) */
8414
8415#ifndef OS_GETLOGIN_METHODDEF
8416 #define OS_GETLOGIN_METHODDEF
8417#endif /* !defined(OS_GETLOGIN_METHODDEF) */
8418
8419#ifndef OS_GETUID_METHODDEF
8420 #define OS_GETUID_METHODDEF
8421#endif /* !defined(OS_GETUID_METHODDEF) */
8422
8423#ifndef OS_KILL_METHODDEF
8424 #define OS_KILL_METHODDEF
8425#endif /* !defined(OS_KILL_METHODDEF) */
8426
8427#ifndef OS_KILLPG_METHODDEF
8428 #define OS_KILLPG_METHODDEF
8429#endif /* !defined(OS_KILLPG_METHODDEF) */
8430
8431#ifndef OS_PLOCK_METHODDEF
8432 #define OS_PLOCK_METHODDEF
8433#endif /* !defined(OS_PLOCK_METHODDEF) */
8434
8435#ifndef OS_SETUID_METHODDEF
8436 #define OS_SETUID_METHODDEF
8437#endif /* !defined(OS_SETUID_METHODDEF) */
8438
8439#ifndef OS_SETEUID_METHODDEF
8440 #define OS_SETEUID_METHODDEF
8441#endif /* !defined(OS_SETEUID_METHODDEF) */
8442
8443#ifndef OS_SETEGID_METHODDEF
8444 #define OS_SETEGID_METHODDEF
8445#endif /* !defined(OS_SETEGID_METHODDEF) */
8446
8447#ifndef OS_SETREUID_METHODDEF
8448 #define OS_SETREUID_METHODDEF
8449#endif /* !defined(OS_SETREUID_METHODDEF) */
8450
8451#ifndef OS_SETREGID_METHODDEF
8452 #define OS_SETREGID_METHODDEF
8453#endif /* !defined(OS_SETREGID_METHODDEF) */
8454
8455#ifndef OS_SETGID_METHODDEF
8456 #define OS_SETGID_METHODDEF
8457#endif /* !defined(OS_SETGID_METHODDEF) */
8458
8459#ifndef OS_SETGROUPS_METHODDEF
8460 #define OS_SETGROUPS_METHODDEF
8461#endif /* !defined(OS_SETGROUPS_METHODDEF) */
8462
8463#ifndef OS_WAIT3_METHODDEF
8464 #define OS_WAIT3_METHODDEF
8465#endif /* !defined(OS_WAIT3_METHODDEF) */
8466
8467#ifndef OS_WAIT4_METHODDEF
8468 #define OS_WAIT4_METHODDEF
8469#endif /* !defined(OS_WAIT4_METHODDEF) */
8470
8471#ifndef OS_WAITID_METHODDEF
8472 #define OS_WAITID_METHODDEF
8473#endif /* !defined(OS_WAITID_METHODDEF) */
8474
8475#ifndef OS_WAITPID_METHODDEF
8476 #define OS_WAITPID_METHODDEF
8477#endif /* !defined(OS_WAITPID_METHODDEF) */
8478
8479#ifndef OS_WAIT_METHODDEF
8480 #define OS_WAIT_METHODDEF
8481#endif /* !defined(OS_WAIT_METHODDEF) */
8482
Serhiy Storchaka12a69db2018-09-17 15:38:27 +03008483#ifndef OS_READLINK_METHODDEF
8484 #define OS_READLINK_METHODDEF
8485#endif /* !defined(OS_READLINK_METHODDEF) */
8486
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03008487#ifndef OS_SYMLINK_METHODDEF
8488 #define OS_SYMLINK_METHODDEF
8489#endif /* !defined(OS_SYMLINK_METHODDEF) */
8490
8491#ifndef OS_TIMES_METHODDEF
8492 #define OS_TIMES_METHODDEF
8493#endif /* !defined(OS_TIMES_METHODDEF) */
8494
8495#ifndef OS_GETSID_METHODDEF
8496 #define OS_GETSID_METHODDEF
8497#endif /* !defined(OS_GETSID_METHODDEF) */
8498
8499#ifndef OS_SETSID_METHODDEF
8500 #define OS_SETSID_METHODDEF
8501#endif /* !defined(OS_SETSID_METHODDEF) */
8502
8503#ifndef OS_SETPGID_METHODDEF
8504 #define OS_SETPGID_METHODDEF
8505#endif /* !defined(OS_SETPGID_METHODDEF) */
8506
8507#ifndef OS_TCGETPGRP_METHODDEF
8508 #define OS_TCGETPGRP_METHODDEF
8509#endif /* !defined(OS_TCGETPGRP_METHODDEF) */
8510
8511#ifndef OS_TCSETPGRP_METHODDEF
8512 #define OS_TCSETPGRP_METHODDEF
8513#endif /* !defined(OS_TCSETPGRP_METHODDEF) */
8514
8515#ifndef OS_LOCKF_METHODDEF
8516 #define OS_LOCKF_METHODDEF
8517#endif /* !defined(OS_LOCKF_METHODDEF) */
8518
8519#ifndef OS_READV_METHODDEF
8520 #define OS_READV_METHODDEF
8521#endif /* !defined(OS_READV_METHODDEF) */
8522
8523#ifndef OS_PREAD_METHODDEF
8524 #define OS_PREAD_METHODDEF
8525#endif /* !defined(OS_PREAD_METHODDEF) */
8526
Pablo Galindo4defba32018-01-27 16:16:37 +00008527#ifndef OS_PREADV_METHODDEF
8528 #define OS_PREADV_METHODDEF
8529#endif /* !defined(OS_PREADV_METHODDEF) */
8530
Giampaolo Rodola4a172cc2018-06-12 23:04:50 +02008531#ifndef OS__FCOPYFILE_METHODDEF
8532 #define OS__FCOPYFILE_METHODDEF
8533#endif /* !defined(OS__FCOPYFILE_METHODDEF) */
8534
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03008535#ifndef OS_PIPE_METHODDEF
8536 #define OS_PIPE_METHODDEF
8537#endif /* !defined(OS_PIPE_METHODDEF) */
8538
8539#ifndef OS_PIPE2_METHODDEF
8540 #define OS_PIPE2_METHODDEF
8541#endif /* !defined(OS_PIPE2_METHODDEF) */
8542
8543#ifndef OS_WRITEV_METHODDEF
8544 #define OS_WRITEV_METHODDEF
8545#endif /* !defined(OS_WRITEV_METHODDEF) */
8546
8547#ifndef OS_PWRITE_METHODDEF
8548 #define OS_PWRITE_METHODDEF
8549#endif /* !defined(OS_PWRITE_METHODDEF) */
8550
Pablo Galindo4defba32018-01-27 16:16:37 +00008551#ifndef OS_PWRITEV_METHODDEF
8552 #define OS_PWRITEV_METHODDEF
8553#endif /* !defined(OS_PWRITEV_METHODDEF) */
8554
Pablo Galindoaac4d032019-05-31 19:39:47 +01008555#ifndef OS_COPY_FILE_RANGE_METHODDEF
8556 #define OS_COPY_FILE_RANGE_METHODDEF
8557#endif /* !defined(OS_COPY_FILE_RANGE_METHODDEF) */
8558
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03008559#ifndef OS_MKFIFO_METHODDEF
8560 #define OS_MKFIFO_METHODDEF
8561#endif /* !defined(OS_MKFIFO_METHODDEF) */
8562
8563#ifndef OS_MKNOD_METHODDEF
8564 #define OS_MKNOD_METHODDEF
8565#endif /* !defined(OS_MKNOD_METHODDEF) */
8566
8567#ifndef OS_MAJOR_METHODDEF
8568 #define OS_MAJOR_METHODDEF
8569#endif /* !defined(OS_MAJOR_METHODDEF) */
8570
8571#ifndef OS_MINOR_METHODDEF
8572 #define OS_MINOR_METHODDEF
8573#endif /* !defined(OS_MINOR_METHODDEF) */
8574
8575#ifndef OS_MAKEDEV_METHODDEF
8576 #define OS_MAKEDEV_METHODDEF
8577#endif /* !defined(OS_MAKEDEV_METHODDEF) */
8578
8579#ifndef OS_FTRUNCATE_METHODDEF
8580 #define OS_FTRUNCATE_METHODDEF
8581#endif /* !defined(OS_FTRUNCATE_METHODDEF) */
8582
8583#ifndef OS_TRUNCATE_METHODDEF
8584 #define OS_TRUNCATE_METHODDEF
8585#endif /* !defined(OS_TRUNCATE_METHODDEF) */
8586
8587#ifndef OS_POSIX_FALLOCATE_METHODDEF
8588 #define OS_POSIX_FALLOCATE_METHODDEF
8589#endif /* !defined(OS_POSIX_FALLOCATE_METHODDEF) */
8590
8591#ifndef OS_POSIX_FADVISE_METHODDEF
8592 #define OS_POSIX_FADVISE_METHODDEF
8593#endif /* !defined(OS_POSIX_FADVISE_METHODDEF) */
8594
8595#ifndef OS_PUTENV_METHODDEF
8596 #define OS_PUTENV_METHODDEF
8597#endif /* !defined(OS_PUTENV_METHODDEF) */
8598
8599#ifndef OS_UNSETENV_METHODDEF
8600 #define OS_UNSETENV_METHODDEF
8601#endif /* !defined(OS_UNSETENV_METHODDEF) */
8602
8603#ifndef OS_WCOREDUMP_METHODDEF
8604 #define OS_WCOREDUMP_METHODDEF
8605#endif /* !defined(OS_WCOREDUMP_METHODDEF) */
8606
8607#ifndef OS_WIFCONTINUED_METHODDEF
8608 #define OS_WIFCONTINUED_METHODDEF
8609#endif /* !defined(OS_WIFCONTINUED_METHODDEF) */
8610
8611#ifndef OS_WIFSTOPPED_METHODDEF
8612 #define OS_WIFSTOPPED_METHODDEF
8613#endif /* !defined(OS_WIFSTOPPED_METHODDEF) */
8614
8615#ifndef OS_WIFSIGNALED_METHODDEF
8616 #define OS_WIFSIGNALED_METHODDEF
8617#endif /* !defined(OS_WIFSIGNALED_METHODDEF) */
8618
8619#ifndef OS_WIFEXITED_METHODDEF
8620 #define OS_WIFEXITED_METHODDEF
8621#endif /* !defined(OS_WIFEXITED_METHODDEF) */
8622
8623#ifndef OS_WEXITSTATUS_METHODDEF
8624 #define OS_WEXITSTATUS_METHODDEF
8625#endif /* !defined(OS_WEXITSTATUS_METHODDEF) */
8626
8627#ifndef OS_WTERMSIG_METHODDEF
8628 #define OS_WTERMSIG_METHODDEF
8629#endif /* !defined(OS_WTERMSIG_METHODDEF) */
8630
8631#ifndef OS_WSTOPSIG_METHODDEF
8632 #define OS_WSTOPSIG_METHODDEF
8633#endif /* !defined(OS_WSTOPSIG_METHODDEF) */
8634
8635#ifndef OS_FSTATVFS_METHODDEF
8636 #define OS_FSTATVFS_METHODDEF
8637#endif /* !defined(OS_FSTATVFS_METHODDEF) */
8638
8639#ifndef OS_STATVFS_METHODDEF
8640 #define OS_STATVFS_METHODDEF
8641#endif /* !defined(OS_STATVFS_METHODDEF) */
8642
8643#ifndef OS__GETDISKUSAGE_METHODDEF
8644 #define OS__GETDISKUSAGE_METHODDEF
8645#endif /* !defined(OS__GETDISKUSAGE_METHODDEF) */
8646
8647#ifndef OS_FPATHCONF_METHODDEF
8648 #define OS_FPATHCONF_METHODDEF
8649#endif /* !defined(OS_FPATHCONF_METHODDEF) */
8650
8651#ifndef OS_PATHCONF_METHODDEF
8652 #define OS_PATHCONF_METHODDEF
8653#endif /* !defined(OS_PATHCONF_METHODDEF) */
8654
8655#ifndef OS_CONFSTR_METHODDEF
8656 #define OS_CONFSTR_METHODDEF
8657#endif /* !defined(OS_CONFSTR_METHODDEF) */
8658
8659#ifndef OS_SYSCONF_METHODDEF
8660 #define OS_SYSCONF_METHODDEF
8661#endif /* !defined(OS_SYSCONF_METHODDEF) */
8662
Steve Dowercc16be82016-09-08 10:35:16 -07008663#ifndef OS_STARTFILE_METHODDEF
8664 #define OS_STARTFILE_METHODDEF
8665#endif /* !defined(OS_STARTFILE_METHODDEF) */
8666
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03008667#ifndef OS_GETLOADAVG_METHODDEF
8668 #define OS_GETLOADAVG_METHODDEF
8669#endif /* !defined(OS_GETLOADAVG_METHODDEF) */
8670
8671#ifndef OS_SETRESUID_METHODDEF
8672 #define OS_SETRESUID_METHODDEF
8673#endif /* !defined(OS_SETRESUID_METHODDEF) */
8674
8675#ifndef OS_SETRESGID_METHODDEF
8676 #define OS_SETRESGID_METHODDEF
8677#endif /* !defined(OS_SETRESGID_METHODDEF) */
8678
8679#ifndef OS_GETRESUID_METHODDEF
8680 #define OS_GETRESUID_METHODDEF
8681#endif /* !defined(OS_GETRESUID_METHODDEF) */
8682
8683#ifndef OS_GETRESGID_METHODDEF
8684 #define OS_GETRESGID_METHODDEF
8685#endif /* !defined(OS_GETRESGID_METHODDEF) */
8686
8687#ifndef OS_GETXATTR_METHODDEF
8688 #define OS_GETXATTR_METHODDEF
8689#endif /* !defined(OS_GETXATTR_METHODDEF) */
8690
8691#ifndef OS_SETXATTR_METHODDEF
8692 #define OS_SETXATTR_METHODDEF
8693#endif /* !defined(OS_SETXATTR_METHODDEF) */
8694
8695#ifndef OS_REMOVEXATTR_METHODDEF
8696 #define OS_REMOVEXATTR_METHODDEF
8697#endif /* !defined(OS_REMOVEXATTR_METHODDEF) */
8698
8699#ifndef OS_LISTXATTR_METHODDEF
8700 #define OS_LISTXATTR_METHODDEF
8701#endif /* !defined(OS_LISTXATTR_METHODDEF) */
8702
Zackery Spytz43fdbd22019-05-29 13:57:07 -06008703#ifndef OS_MEMFD_CREATE_METHODDEF
8704 #define OS_MEMFD_CREATE_METHODDEF
8705#endif /* !defined(OS_MEMFD_CREATE_METHODDEF) */
8706
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03008707#ifndef OS_GET_HANDLE_INHERITABLE_METHODDEF
8708 #define OS_GET_HANDLE_INHERITABLE_METHODDEF
8709#endif /* !defined(OS_GET_HANDLE_INHERITABLE_METHODDEF) */
8710
8711#ifndef OS_SET_HANDLE_INHERITABLE_METHODDEF
8712 #define OS_SET_HANDLE_INHERITABLE_METHODDEF
8713#endif /* !defined(OS_SET_HANDLE_INHERITABLE_METHODDEF) */
Victor Stinner9b1f4742016-09-06 16:18:52 -07008714
Serhiy Storchaka12a69db2018-09-17 15:38:27 +03008715#ifndef OS_GET_BLOCKING_METHODDEF
8716 #define OS_GET_BLOCKING_METHODDEF
8717#endif /* !defined(OS_GET_BLOCKING_METHODDEF) */
8718
8719#ifndef OS_SET_BLOCKING_METHODDEF
8720 #define OS_SET_BLOCKING_METHODDEF
8721#endif /* !defined(OS_SET_BLOCKING_METHODDEF) */
8722
Victor Stinner9b1f4742016-09-06 16:18:52 -07008723#ifndef OS_GETRANDOM_METHODDEF
8724 #define OS_GETRANDOM_METHODDEF
8725#endif /* !defined(OS_GETRANDOM_METHODDEF) */
Steve Dower2438cdf2019-03-29 16:37:16 -07008726
8727#ifndef OS__ADD_DLL_DIRECTORY_METHODDEF
8728 #define OS__ADD_DLL_DIRECTORY_METHODDEF
8729#endif /* !defined(OS__ADD_DLL_DIRECTORY_METHODDEF) */
8730
8731#ifndef OS__REMOVE_DLL_DIRECTORY_METHODDEF
8732 #define OS__REMOVE_DLL_DIRECTORY_METHODDEF
8733#endif /* !defined(OS__REMOVE_DLL_DIRECTORY_METHODDEF) */
Serhiy Storchaka140a7d12019-10-13 11:59:31 +03008734/*[clinic end generated code: output=fe7897441fed5402 input=a9049054013a1b77]*/