From 9cb900552231f53e34b1fc799ef392776449fabe Mon Sep 17 00:00:00 2001 From: Lisandro Dalcin Date: Wed, 5 May 2010 14:51:56 -0300 Subject: [PATCH] add some POSIX pxd's and a few tests --- Cython/Includes/posix/__init__.pxd | 1 + Cython/Includes/posix/fcntl.pxd | 67 +++++++++++++++ Cython/Includes/posix/unistd.pxd | 127 +++++++++++++++++++++++++++++ runtests.py | 3 +- tests/compile/posix_pxds.pyx | 9 ++ tests/run/posix_test.pyx | 92 +++++++++++++++++++++ 6 files changed, 298 insertions(+), 1 deletion(-) create mode 100644 Cython/Includes/posix/__init__.pxd create mode 100644 Cython/Includes/posix/fcntl.pxd create mode 100644 Cython/Includes/posix/unistd.pxd create mode 100644 tests/compile/posix_pxds.pyx create mode 100644 tests/run/posix_test.pyx diff --git a/Cython/Includes/posix/__init__.pxd b/Cython/Includes/posix/__init__.pxd new file mode 100644 index 00000000..fa81adaf --- /dev/null +++ b/Cython/Includes/posix/__init__.pxd @@ -0,0 +1 @@ +# empty file diff --git a/Cython/Includes/posix/fcntl.pxd b/Cython/Includes/posix/fcntl.pxd new file mode 100644 index 00000000..093eab00 --- /dev/null +++ b/Cython/Includes/posix/fcntl.pxd @@ -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 index 00000000..8fdfdfbc --- /dev/null +++ b/Cython/Includes/posix/unistd.pxd @@ -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 diff --git a/runtests.py b/runtests.py index ba34f990..891f0b69 100644 --- a/runtests.py +++ b/runtests.py @@ -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 index 00000000..4a6995f6 --- /dev/null +++ b/tests/compile/posix_pxds.pyx @@ -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 index 00000000..5c11c9e0 --- /dev/null +++ b/tests/run/posix_test.pyx @@ -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() -- 2.26.2