@@@ cython and python 3 wip
[mLib-python] / fdutils.pyx
index 8e5d94a..124ef23 100644 (file)
 def fdflags(file,
             unsigned fbic = 0, unsigned fxor = 0,
             unsigned fdbic = 0, unsigned fdxor = 0):
+  """
+  fdflags(FILE, [fbic = 0], [fxor = 0], [fdbic = 0], [fdxor = 0])
+
+  Set fcntl(2) file and descriptor flags.  If these are FL and FD, then
+  update:
+
+    * FL = (FL & ~FBIC) ^ FXOR
+    * FD = (FD & ~FDBIC) ^ FDXOR
+
+  FILE may be integer file descriptor or an object with `fileno' method.
+  """
   cdef int rc
-  rc = _fdflags(_getfd(fd), fbix, fxor, fdbic, fdxor)
+  rc = _fdflags(_getfd(file), fbic, fxor, fdbic, fdxor)
   if rc < 0:
     _oserror()
   return rc
 
 def fdsend(sock, file, buffer):
-  cdef void *p
-  cdef int len
+  """
+  fdsend(SOCK, FILE, BUFFER) -> RC:
+    send FILE over Unix-domain socket SOCK, along with BUFFER
+  """
+  cdef const void *p
+  cdef Py_ssize_t len
   cdef int rc
   PyObject_AsReadBuffer(buffer, &p, &len)
   rc = fdpass_send(_getfd(sock), _getfd(file), p, len)
@@ -42,19 +57,21 @@ def fdsend(sock, file, buffer):
     _oserror()
   return rc
 
-def fdrecv(sock, unsigned size):
+def fdrecv(sock, size_t size):
+  """
+  fdrecv(SOCK, SIZE) -> FD, BUFFER
+    receive file FD and BUFFER of length up to SIZE from Unix-domain SOCK
+  """
   cdef void *p
   cdef buf
-  cdef int len
+  cdef Py_ssize_t len
   cdef PyObject *obj
   cdef int fd
-  buf = PyString_FromStringAndSize(NULL, size)
-  p = PyString_AS_STRING(buf)
-  len = fdpass_recv(_getfd(sock), &fd, p, size)
+  buf = BIN_FROMSTRLEN(NULL, size)
+  len = fdpass_recv(_getfd(sock), &fd, BIN_PTR(buf), size)
   if len < 0:
     _oserror()
-  obj = <PyObject *>buf
-  _PyString_Resize(&obj, len)
-  return fd, <object>obj
+  BIN_SETLEN(buf, len)
+  return fd, buf
 
 ###----- That's all, folks --------------------------------------------------