@@ -3705,6 +3705,61 @@ os_pread(PyObject *module, PyObject *const *args, Py_ssize_t nargs)
37053705
37063706#endif /* defined(HAVE_PREAD) */
37073707
3708+ #if (defined(HAVE_PREADV ) || defined (HAVE_PREADV2 ))
3709+
3710+ PyDoc_STRVAR (os_preadv__doc__ ,
3711+ "preadv($module, fd, buffers, offset, flags=0, /)\n"
3712+ "--\n"
3713+ "\n"
3714+ "Reads from a file descriptor into a number of mutable bytes-like objects.\n"
3715+ "\n"
3716+ "Combines the functionality of readv() and pread(). As readv(), it will\n"
3717+ "transfer data into each buffer until it is full and then move on to the next\n"
3718+ "buffer in the sequence to hold the rest of the data. Its fourth argument,\n"
3719+ "specifies the file offset at which the input operation is to be performed. It\n"
3720+ "will return the total number of bytes read (which can be less than the total\n"
3721+ "capacity of all the objects).\n"
3722+ "\n"
3723+ "The flags argument contains a bitwise OR of zero or more of the following flags:\n"
3724+ "\n"
3725+ "- RWF_HIPRI\n"
3726+ "- RWF_NOWAIT\n"
3727+ "\n"
3728+ "Using non-zero flags requires Linux 4.6 or newer." );
3729+
3730+ #define OS_PREADV_METHODDEF \
3731+ {"preadv", (PyCFunction)os_preadv, METH_FASTCALL, os_preadv__doc__},
3732+
3733+ static Py_ssize_t
3734+ os_preadv_impl (PyObject * module , int fd , PyObject * buffers , Py_off_t offset ,
3735+ int flags );
3736+
3737+ static PyObject *
3738+ os_preadv (PyObject * module , PyObject * const * args , Py_ssize_t nargs )
3739+ {
3740+ PyObject * return_value = NULL ;
3741+ int fd ;
3742+ PyObject * buffers ;
3743+ Py_off_t offset ;
3744+ int flags = 0 ;
3745+ Py_ssize_t _return_value ;
3746+
3747+ if (!_PyArg_ParseStack (args , nargs , "iOO&|i:preadv" ,
3748+ & fd , & buffers , Py_off_t_converter , & offset , & flags )) {
3749+ goto exit ;
3750+ }
3751+ _return_value = os_preadv_impl (module , fd , buffers , offset , flags );
3752+ if ((_return_value == -1 ) && PyErr_Occurred ()) {
3753+ goto exit ;
3754+ }
3755+ return_value = PyLong_FromSsize_t (_return_value );
3756+
3757+ exit :
3758+ return return_value ;
3759+ }
3760+
3761+ #endif /* (defined(HAVE_PREADV) || defined (HAVE_PREADV2)) */
3762+
37083763PyDoc_STRVAR (os_write__doc__ ,
37093764"write($module, fd, data, /)\n"
37103765"--\n"
@@ -3963,6 +4018,61 @@ os_pwrite(PyObject *module, PyObject *const *args, Py_ssize_t nargs)
39634018
39644019#endif /* defined(HAVE_PWRITE) */
39654020
4021+ #if (defined(HAVE_PWRITEV ) || defined (HAVE_PWRITEV2 ))
4022+
4023+ PyDoc_STRVAR (os_pwritev__doc__ ,
4024+ "pwritev($module, fd, buffers, offset, flags=0, /)\n"
4025+ "--\n"
4026+ "\n"
4027+ "Writes the contents of bytes-like objects to a file descriptor at a given offset.\n"
4028+ "\n"
4029+ "Combines the functionality of writev() and pwrite(). All buffers must be a sequence\n"
4030+ "of bytes-like objects. Buffers are processed in array order. Entire contents of first\n"
4031+ "buffer is written before proceeding to second, and so on. The operating system may\n"
4032+ "set a limit (sysconf() value SC_IOV_MAX) on the number of buffers that can be used.\n"
4033+ "This function writes the contents of each object to the file descriptor and returns\n"
4034+ "the total number of bytes written.\n"
4035+ "\n"
4036+ "The flags argument contains a bitwise OR of zero or more of the following flags:\n"
4037+ "\n"
4038+ "- RWF_DSYNC\n"
4039+ "- RWF_SYNC\n"
4040+ "\n"
4041+ "Using non-zero flags requires Linux 4.7 or newer." );
4042+
4043+ #define OS_PWRITEV_METHODDEF \
4044+ {"pwritev", (PyCFunction)os_pwritev, METH_FASTCALL, os_pwritev__doc__},
4045+
4046+ static Py_ssize_t
4047+ os_pwritev_impl (PyObject * module , int fd , PyObject * buffers , Py_off_t offset ,
4048+ int flags );
4049+
4050+ static PyObject *
4051+ os_pwritev (PyObject * module , PyObject * const * args , Py_ssize_t nargs )
4052+ {
4053+ PyObject * return_value = NULL ;
4054+ int fd ;
4055+ PyObject * buffers ;
4056+ Py_off_t offset ;
4057+ int flags = 0 ;
4058+ Py_ssize_t _return_value ;
4059+
4060+ if (!_PyArg_ParseStack (args , nargs , "iOO&|i:pwritev" ,
4061+ & fd , & buffers , Py_off_t_converter , & offset , & flags )) {
4062+ goto exit ;
4063+ }
4064+ _return_value = os_pwritev_impl (module , fd , buffers , offset , flags );
4065+ if ((_return_value == -1 ) && PyErr_Occurred ()) {
4066+ goto exit ;
4067+ }
4068+ return_value = PyLong_FromSsize_t (_return_value );
4069+
4070+ exit :
4071+ return return_value ;
4072+ }
4073+
4074+ #endif /* (defined(HAVE_PWRITEV) || defined (HAVE_PWRITEV2)) */
4075+
39664076#if defined(HAVE_MKFIFO )
39674077
39684078PyDoc_STRVAR (os_mkfifo__doc__ ,
@@ -6239,6 +6349,10 @@ os_getrandom(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject
62396349 #define OS_PREAD_METHODDEF
62406350#endif /* !defined(OS_PREAD_METHODDEF) */
62416351
6352+ #ifndef OS_PREADV_METHODDEF
6353+ #define OS_PREADV_METHODDEF
6354+ #endif /* !defined(OS_PREADV_METHODDEF) */
6355+
62426356#ifndef OS_PIPE_METHODDEF
62436357 #define OS_PIPE_METHODDEF
62446358#endif /* !defined(OS_PIPE_METHODDEF) */
@@ -6255,6 +6369,10 @@ os_getrandom(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject
62556369 #define OS_PWRITE_METHODDEF
62566370#endif /* !defined(OS_PWRITE_METHODDEF) */
62576371
6372+ #ifndef OS_PWRITEV_METHODDEF
6373+ #define OS_PWRITEV_METHODDEF
6374+ #endif /* !defined(OS_PWRITEV_METHODDEF) */
6375+
62586376#ifndef OS_MKFIFO_METHODDEF
62596377 #define OS_MKFIFO_METHODDEF
62606378#endif /* !defined(OS_MKFIFO_METHODDEF) */
@@ -6410,4 +6528,4 @@ os_getrandom(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject
64106528#ifndef OS_GETRANDOM_METHODDEF
64116529 #define OS_GETRANDOM_METHODDEF
64126530#endif /* !defined(OS_GETRANDOM_METHODDEF) */
6413- /*[clinic end generated code: output=6345053cd5992caf input=a9049054013a1b77]*/
6531+ /*[clinic end generated code: output=06ace805893aa10c input=a9049054013a1b77]*/
0 commit comments