qmsk/net/libc.pyx
author Tero Marttila <terom@fixme.fi>
Sat, 26 Sep 2009 21:46:36 +0300
changeset 51 c6b4abfc21da
parent 19 e6b670dbfe3b
permissions -rw-r--r--
qmsk/net/lib/event2/base.pxd
11
7ae92c2b433f move libc+py back to qmsk.net.x
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
     1
from qmsk.net.libc cimport *
7ae92c2b433f move libc+py back to qmsk.net.x
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
     2
from qmsk.net.py cimport raise_errno
7
74fde84264b1 broke Cython with this package magic
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     3
19
e6b670dbfe3b socket.setblocking
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
     4
cdef fcntl_set_flag (int fd, int flag, bint value) :
e6b670dbfe3b socket.setblocking
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
     5
    """
e6b670dbfe3b socket.setblocking
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
     6
        Set the given FCNTL file status flag(s) to the given boolean value.
e6b670dbfe3b socket.setblocking
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
     7
e6b670dbfe3b socket.setblocking
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
     8
        This will first get the current flags, then compute the new flags, and then update them if they have changed.
e6b670dbfe3b socket.setblocking
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
     9
    """
e6b670dbfe3b socket.setblocking
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
    10
    
e6b670dbfe3b socket.setblocking
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
    11
    # get current flags
e6b670dbfe3b socket.setblocking
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
    12
    cdef int old_flags = fcntl(fd, F_GETFL, 0)
e6b670dbfe3b socket.setblocking
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
    13
e6b670dbfe3b socket.setblocking
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
    14
    if old_flags < 0 :
e6b670dbfe3b socket.setblocking
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
    15
        raise_errno('fcntl')
e6b670dbfe3b socket.setblocking
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
    16
e6b670dbfe3b socket.setblocking
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
    17
    # set bit
e6b670dbfe3b socket.setblocking
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
    18
    cdef int new_flags = (old_flags & ~flag) | (flag if value else 0)
e6b670dbfe3b socket.setblocking
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
    19
    
e6b670dbfe3b socket.setblocking
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
    20
    if new_flags != old_flags :
e6b670dbfe3b socket.setblocking
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
    21
        # set flags
e6b670dbfe3b socket.setblocking
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
    22
        if fcntl(fd, F_SETFL, new_flags) :
e6b670dbfe3b socket.setblocking
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
    23
            raise_errno('fcntl')
e6b670dbfe3b socket.setblocking
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
    24
e6b670dbfe3b socket.setblocking
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
    25
7
74fde84264b1 broke Cython with this package magic
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    26
#cdef class Errno (py.OSError) :
74fde84264b1 broke Cython with this package magic
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    27
#    def __init__ (self, func) :
74fde84264b1 broke Cython with this package magic
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    28
#        self.func = func
74fde84264b1 broke Cython with this package magic
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    29
#        self.err = errno
74fde84264b1 broke Cython with this package magic
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    30
#        self.strerror = strerror(errno)
74fde84264b1 broke Cython with this package magic
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    31
#
74fde84264b1 broke Cython with this package magic
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    32
#    def __str__ (self) :
74fde84264b1 broke Cython with this package magic
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    33
#        return "%s: %s" % (self.func, self.strerror)
74fde84264b1 broke Cython with this package magic
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    34
#
74fde84264b1 broke Cython with this package magic
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    35
#cdef class GAIError (py.OSError) :
74fde84264b1 broke Cython with this package magic
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    36
#    def __init__ (self, func, err) :
74fde84264b1 broke Cython with this package magic
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    37
#        self.func = func
74fde84264b1 broke Cython with this package magic
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    38
#        self.err = err
74fde84264b1 broke Cython with this package magic
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    39
#        self.strerror = gai_strerror(err)
74fde84264b1 broke Cython with this package magic
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    40
#
74fde84264b1 broke Cython with this package magic
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    41
#    def __str__ (self) :
74fde84264b1 broke Cython with this package magic
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    42
#        return "%s: %s" % (self.func, self.strerror)
74fde84264b1 broke Cython with this package magic
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    43
#