add some POSIX pxd's and a few tests
authorLisandro Dalcin <dalcinl@gmail.com>
Wed, 5 May 2010 17:51:56 +0000 (14:51 -0300)
committerLisandro Dalcin <dalcinl@gmail.com>
Wed, 5 May 2010 17:51:56 +0000 (14:51 -0300)
Cython/Includes/posix/__init__.pxd [new file with mode: 0644]
Cython/Includes/posix/fcntl.pxd [new file with mode: 0644]
Cython/Includes/posix/unistd.pxd [new file with mode: 0644]
runtests.py
tests/compile/posix_pxds.pyx [new file with mode: 0644]
tests/run/posix_test.pyx [new file with mode: 0644]

diff --git a/Cython/Includes/posix/__init__.pxd b/Cython/Includes/posix/__init__.pxd
new file mode 100644 (file)
index 0000000..fa81ada
--- /dev/null
@@ -0,0 +1 @@
+# empty file
diff --git a/Cython/Includes/posix/fcntl.pxd b/Cython/Includes/posix/fcntl.pxd
new file mode 100644 (file)
index 0000000..093eab0
--- /dev/null
@@ -0,0 +1,67 @@
+# http://www.opengroup.org/onlinepubs/009695399/basedefs/fcntl.h.html
+
+cdef extern from "fcntl.h" nogil:
+
+    enum: F_DUPFD
+    enum: F_GETFD
+    enum: F_SETFD
+    enum: F_GETFL
+    enum: F_SETFL
+    enum: F_GETLK
+    enum: F_SETLK
+    enum: F_SETLKW
+    enum: F_GETOWN
+    enum: F_SETOWN
+
+    enum: FD_CLOEXEC
+
+    enum: F_RDLCK
+    enum: F_UNLCK
+    enum: F_WRLCK
+
+    enum: SEEK_SET
+    enum: SEEK_CUR
+    enum: SEEK_END
+
+    enum: O_CREAT
+    enum: O_EXCL
+    enum: O_NOCTTY
+    enum: O_TRUNC
+
+    enum: O_APPEND
+    enum: O_DSYNC
+    enum: O_NONBLOCK
+    enum: O_RSYNC
+    enum: O_SYNC
+
+    enum: O_ACCMODE # O_RDONLY|O_WRONLY|O_RDWR
+
+    enum: O_RDONLY
+    enum: O_WRONLY
+    enum: O_RDWR
+
+    enum: S_IFMT
+    enum: S_IFBLK
+    enum: S_IFCHR
+    enum: S_IFIFO
+    enum: S_IFREG
+    enum: S_IFDIR
+    enum: S_IFLNK
+    enum: S_IFSOCK
+
+    ctypedef int    mode_t
+    ctypedef signed pid_t
+    ctypedef signed off_t
+
+    struct flock:
+        short l_type
+        short l_whence
+        off_t l_start
+        off_t l_len
+        pid_t l_pid
+
+    int creat(char *, mode_t)
+    int fcntl(int, int, ...)
+    int open(char *, int, ...)
+    #int open (char *, int, mode_t)
+    
diff --git a/Cython/Includes/posix/unistd.pxd b/Cython/Includes/posix/unistd.pxd
new file mode 100644 (file)
index 0000000..8fdfdfb
--- /dev/null
@@ -0,0 +1,127 @@
+# http://www.opengroup.org/onlinepubs/009695399/basedefs/unistd.h.html
+
+cdef extern from "unistd.h" nogil:
+
+    #:NULL
+
+    enum: R_OK
+    enum: W_OK
+    enum: X_OK
+    enum: F_OK
+
+    # confstr()
+    #_CS_PATH
+    #_CS_POSIX_*
+
+    enum: SEEK_SET
+    enum: SEEK_CUR
+    enum: SEEK_END
+
+    enum: F_LOCK
+    enum: F_TEST
+    enum: F_TLOCK
+    enum: F_ULOCK
+    
+    # pathconf()
+    # _PC_*
+
+    # sysconf()
+    # _SC_*
+
+    enum: STDIN_FILENO #0
+    enum: STDOUT_FILENO        #1
+    enum: STDERR_FILENO        #2
+
+    #:ctypedef unsigned size_t
+    #:ctypedef signed ssize_t
+    ctypedef int uid_t
+    ctypedef int gid_t
+    ctypedef signed off_t
+    ctypedef signed pid_t
+    ctypedef unsigned useconds_t
+    ctypedef signed intptr_t
+
+    int          access(char *, int)
+    unsigned     alarm(unsigned)
+    int          chdir(char *)
+    int          chown(char *, uid_t, gid_t)
+    int          close(int)
+    size_t       confstr(int, char *, size_t)
+    char        *crypt(char *, char *)
+    char        *ctermid(char *)
+    int          dup(int)
+    int          dup2(int, int)
+    void         encrypt(char[64], int)
+    int          execl(char *, char *, ...)
+    int          execle(char *, char *, ...)
+    int          execlp(char *, char *, ...)
+    int          execv(char *, char *[])
+    int          execve(char *, char *[], char *[])
+    int          execvp(char *, char *[])
+    void        _exit(int)
+    int          fchown(int, uid_t, gid_t)
+    int          fchdir(int)
+    int          fdatasync(int)
+    pid_t        fork()
+    long         fpathconf(int, int)
+    int          fsync(int)
+    int          ftruncate(int, off_t)
+    char        *getcwd(char *, size_t)
+    gid_t        getegid()
+    uid_t        geteuid()
+    gid_t        getgid()
+    int          getgroups(int, gid_t [])
+    long         gethostid()
+    int          gethostname(char *, size_t)
+    char        *getlogin()
+    int          getlogin_r(char *, size_t)
+    int          getopt(int, char * [], char *)
+    pid_t        getpgid(pid_t)
+    pid_t        getpgrp()
+    pid_t        getpid()
+    pid_t        getppid()
+    pid_t        getsid(pid_t)
+    uid_t        getuid()
+    char        *getwd(char *)
+    int          isatty(int)
+    int          lchown(char *, uid_t, gid_t)
+    int          link(char *, char *)
+    int          lockf(int, int, off_t)
+    off_t        lseek(int, off_t, int)
+    int          nice(int)
+    long         pathconf(char *, int)
+    int          pause()
+    int          pipe(int [2])
+    ssize_t      pread(int, void *, size_t, off_t)
+    ssize_t      pwrite(int, void *, size_t, off_t)
+    ssize_t      read(int, void *, size_t)
+    ssize_t      readlink(char *, char *, size_t)
+    int          rmdir(char *)
+    int          setegid(gid_t)
+    int          seteuid(uid_t)
+    int          setgid(gid_t)
+    int          setpgid(pid_t, pid_t)
+    pid_t        setpgrp()
+    int          setregid(gid_t, gid_t)
+    int          setreuid(uid_t, uid_t)
+    pid_t        setsid()
+    int          setuid(uid_t)
+    unsigned     sleep(unsigned)
+    void         swab(void *, void *, ssize_t)
+    int          symlink(char *, char *)
+    void         sync()
+    long         sysconf(int)
+    pid_t        tcgetpgrp(int)
+    int          tcsetpgrp(int, pid_t)
+    int          truncate(char *, off_t)
+    char        *ttyname(int)
+    int          ttyname_r(int, char *, size_t)
+    useconds_t   ualarm(useconds_t, useconds_t)
+    int          unlink(char *)
+    int          usleep(useconds_t)
+    pid_t        vfork()
+    ssize_t      write(int, void *, size_t)
+    char         *optarg
+    int          optind
+    int          opterr
+    int          optopt
index ba34f9909b18d98e7d8bda454a88315ce68233d9..891f0b69aa5ecdecfd676b717c2deeef3053588e 100644 (file)
@@ -35,7 +35,8 @@ TEST_RUN_DIRS = ['run', 'wrappers', 'pyregr']
 # which should be excluded if the module is not present.
 EXT_DEP_MODULES = {
     'numpy' : re.compile('.*\.numpy_.*').match,
-    'pstats' : re.compile('.*\.pstats_.*').match
+    'pstats' : re.compile('.*\.pstats_.*').match,
+    'posix' : re.compile('.*\.posix_.*').match,
 }
 
 def get_numpy_include_dirs():
diff --git a/tests/compile/posix_pxds.pyx b/tests/compile/posix_pxds.pyx
new file mode 100644 (file)
index 0000000..4a6995f
--- /dev/null
@@ -0,0 +1,9 @@
+cimport posix
+
+cimport posix.unistd
+from posix cimport unistd
+from posix.unistd cimport *
+
+cimport posix.fcntl
+from posix cimport fcntl
+from posix.fcntl  cimport *
diff --git a/tests/run/posix_test.pyx b/tests/run/posix_test.pyx
new file mode 100644 (file)
index 0000000..5c11c9e
--- /dev/null
@@ -0,0 +1,92 @@
+from libc.stdio   cimport *
+from posix.unistd cimport *
+from posix.fcntl  cimport *
+
+cdef int noisy_function() except -1:
+    cdef int ret = 0
+    ret = printf(b"0123456789\n", 0)
+    assert ret == 11
+    ret = fflush(stdout)
+    assert ret == 0
+    ret = fprintf(stdout, b"0123456789\n", 0)
+    assert ret == 11
+    ret = fflush(stdout)
+    assert ret == 0
+    ret = write(STDOUT_FILENO, b"0123456789\n", 11)
+    assert ret == 11
+    return  0
+
+
+def test_silent_stdout():
+    """
+    >>> test_silent_stdout()
+    """
+    cdef int ret
+    cdef int stdout_save, dev_null
+    stdout_save = dup(STDOUT_FILENO)
+    assert stdout_save != -1
+    dev_null = open(b"/dev/null", O_WRONLY, 0)
+    assert dev_null != -1
+    ret = dup2(dev_null, STDOUT_FILENO)
+    assert ret == STDOUT_FILENO
+    ret = close(dev_null)
+    assert ret == 0
+    try:
+        noisy_function()
+    finally:
+        ret = dup2(stdout_save, STDOUT_FILENO)
+        assert ret == STDOUT_FILENO
+        ret = close(stdout_save)
+        assert ret == 0
+
+cdef class silent_fd:
+
+    cdef int fd_save, fd
+
+    def __cinit__(self, int fd=-1):
+        self.fd_save = -1
+        self.fd = STDOUT_FILENO
+        if fd != -1:
+            self.fd = fd
+
+    def __enter__(self):
+        cdef int ret = 0, dev_null = -1
+        assert self.fd_save == -1
+        dev_null = open(b"/dev/null", O_WRONLY, 0)
+        assert dev_null != -1
+        try:
+            self.fd_save = dup(self.fd)
+            assert self.fd_save != -1
+            try:
+                ret = dup2(dev_null, self.fd)
+                assert ret != -1
+            except:
+                ret = close(self.fd_save)
+                self.fd_save = -1
+        finally:
+            ret = close(dev_null)
+
+    def __exit__(self, t, v, tb):
+        cdef int ret = 0
+        if self.fd_save != -1:
+            ret = dup2(self.fd_save, self.fd)
+            assert ret == self.fd
+            ret = close(self.fd_save)
+            assert ret == 0
+            self.fd_save = -1
+        return None
+
+def test_silent_stdout_ctxmanager():
+    """
+    >> test_silent_stdout_ctxmanager()
+    """
+    with silent_fd():
+        noisy_function()
+    try:
+        with silent_fd():
+            noisy_function()
+            raise RuntimeError
+    except RuntimeError:
+        pass
+    with silent_fd(STDOUT_FILENO):
+        noisy_function()