pth_syscall.c

来自「Linux下的中文输入法」· C语言 代码 · 共 726 行 · 第 1/2 页

C
726
字号
intern int pth_sc_sigprocmask(int how, const sigset_t *set, sigset_t *oset){    /* internal exit point for Pth */    if (pth_syscall_fct_tab[PTH_SCF_sigprocmask].addr != NULL)        return ((int (*)(int, const sigset_t *, sigset_t *))               pth_syscall_fct_tab[PTH_SCF_sigprocmask].addr)               (how, set, oset);#if defined(HAVE_SYSCALL) && defined(SYS___sigprocmask14) /* NetBSD */    else return (int)syscall(SYS___sigprocmask14, how, set, oset);#elif defined(HAVE_SYSCALL) && defined(SYS_sigprocmask)    else return (int)syscall(SYS_sigprocmask, how, set, oset);#else    else PTH_SYSCALL_ERROR(-1, ENOSYS, "sigprocmask");#endif}/* ==== Pth hard syscall wrapper for sigwait(3) ==== */int sigwait(const sigset_t *, int *);int sigwait(const sigset_t *set, int *sigp){    /* external entry point for application */    pth_implicit_init();    return pth_sigwait(set, sigp);}/* NOTICE: internally fully emulated, so still no   internal exit point pth_sc_sigwait necessary! *//* ==== Pth hard syscall wrapper for waitpid(2) ==== */pid_t waitpid(pid_t, int *, int);pid_t waitpid(pid_t wpid, int *status, int options){    /* external entry point for application */    pth_implicit_init();    return pth_waitpid(wpid, status, options);}intern pid_t pth_sc_waitpid(pid_t wpid, int *status, int options){    /* internal exit point for Pth */    if (pth_syscall_fct_tab[PTH_SCF_waitpid].addr != NULL)        return ((pid_t (*)(pid_t, int *, int))               pth_syscall_fct_tab[PTH_SCF_waitpid].addr)               (wpid, status, options);#if defined(HAVE_SYSCALL) && defined(SYS_waitpid)    else return (pid_t)syscall(SYS_waitpid, wpid, status, options);#else    else PTH_SYSCALL_ERROR(-1, ENOSYS, "waitpid");#endif}/* ==== Pth hard syscall wrapper for connect(2) ==== */int connect(int, const struct sockaddr *, socklen_t);int connect(int s, const struct sockaddr *addr, socklen_t addrlen){    /* external entry point for application */    pth_implicit_init();    return pth_connect(s, addr, addrlen);}intern int pth_sc_connect(int s, const struct sockaddr *addr, socklen_t addrlen){    /* internal exit point for Pth */    if (pth_syscall_fct_tab[PTH_SCF_connect].addr != NULL)        return ((int (*)(int, const struct sockaddr *, socklen_t))               pth_syscall_fct_tab[PTH_SCF_connect].addr)               (s, addr, addrlen);#if defined(HAVE_SYSCALL) && defined(SYS_connect)    else return (int)syscall(SYS_connect, s, addr, addrlen);#elif defined(HAVE_SYSCALL) && defined(SYS_socketcall) && defined(SOCKOP_connect) /* Linux */    else {        unsigned long args[3];        args[0] = (unsigned long)s;        args[1] = (unsigned long)addr;        args[2] = (unsigned long)addrlen;        return (int)syscall(SYS_socketcall, SOCKOP_connect, args);    }#else    else PTH_SYSCALL_ERROR(-1, ENOSYS, "connect");#endif}/* ==== Pth hard syscall wrapper for accept(2) ==== */int accept(int, struct sockaddr *, socklen_t *);int accept(int s, struct sockaddr *addr, socklen_t *addrlen){    /* external entry point for application */    pth_implicit_init();    return pth_accept(s, addr, addrlen);}intern int pth_sc_accept(int s, struct sockaddr *addr, socklen_t *addrlen){    /* internal exit point for Pth */    if (pth_syscall_fct_tab[PTH_SCF_accept].addr != NULL)        return ((int (*)(int, struct sockaddr *, socklen_t *))               pth_syscall_fct_tab[PTH_SCF_accept].addr)               (s, addr, addrlen);#if defined(HAVE_SYSCALL) && defined(SYS_accept)    else return (int)syscall(SYS_accept, s, addr, addrlen);#elif defined(HAVE_SYSCALL) && defined(SYS_socketcall) && defined(SOCKOP_accept) /* Linux */    else {        unsigned long args[3];        args[0] = (unsigned long)s;        args[1] = (unsigned long)addr;        args[2] = (unsigned long)addrlen;        return (int)syscall(SYS_socketcall, SOCKOP_accept, args);    }#else    else PTH_SYSCALL_ERROR(-1, ENOSYS, "accept");#endif}/* ==== Pth hard syscall wrapper for select(2) ==== */int select(int, fd_set *, fd_set *, fd_set *, struct timeval *);int select(int nfds, fd_set *readfds, fd_set *writefds,           fd_set *exceptfds, struct timeval *timeout){    /* external entry point for application */    pth_implicit_init();    return pth_select(nfds, readfds, writefds, exceptfds, timeout);}intern int pth_sc_select(int nfds, fd_set *readfds, fd_set *writefds,                         fd_set *exceptfds, struct timeval *timeout){    /* internal exit point for Pth */    if (pth_syscall_fct_tab[PTH_SCF_select].addr != NULL)        return ((int (*)(int, fd_set *, fd_set *, fd_set *, struct timeval *))               pth_syscall_fct_tab[PTH_SCF_select].addr)               (nfds, readfds, writefds, exceptfds, timeout);#if defined(HAVE_SYSCALL) && defined(SYS__newselect) /* Linux */    else return (int)syscall(SYS__newselect, nfds, readfds, writefds, exceptfds, timeout);#elif defined(HAVE_SYSCALL) && defined(SYS_select)    else return (int)syscall(SYS_select, nfds, readfds, writefds, exceptfds, timeout);#else    else PTH_SYSCALL_ERROR(-1, ENOSYS, "accept");#endif}/* ==== Pth hard syscall wrapper for pselect(2) ==== */int pselect(int, fd_set *, fd_set *, fd_set *, const struct timespec *, const sigset_t *);int pselect(int nfds, fd_set *rfds, fd_set *wfds, fd_set *efds,            const struct timespec *ts, const sigset_t *mask){    /* external entry point for application */    pth_implicit_init();    return pth_pselect(nfds, rfds, wfds, efds, ts, mask);}/* NOTICE: internally fully emulated, so still no   internal exit point pth_sc_pselect necessary! *//* ==== Pth hard syscall wrapper for poll(2) ==== */int poll(struct pollfd *, nfds_t, int);int poll(struct pollfd *pfd, nfds_t nfd, int timeout){    /* external entry point for application */    pth_implicit_init();    return pth_poll(pfd, nfd, timeout);}/* NOTICE: internally fully emulated, so still no   internal exit point pth_sc_poll necessary! *//* ==== Pth hard syscall wrapper for read(2) ==== */ssize_t read(int, void *, size_t);ssize_t read(int fd, void *buf, size_t nbytes){    /* external entry point for application */    pth_implicit_init();    return pth_read(fd, buf, nbytes);}intern ssize_t pth_sc_read(int fd, void *buf, size_t nbytes){    /* internal exit point for Pth */    if (pth_syscall_fct_tab[PTH_SCF_read].addr != NULL)        return ((ssize_t (*)(int, void *, size_t))               pth_syscall_fct_tab[PTH_SCF_read].addr)               (fd, buf, nbytes);#if defined(HAVE_SYSCALL) && defined(SYS_read)    else return (ssize_t)syscall(SYS_read, fd, buf, nbytes);#else    else PTH_SYSCALL_ERROR(-1, ENOSYS, "read");#endif}/* ==== Pth hard syscall wrapper for write(2) ==== */ssize_t write(int, const void *, size_t);ssize_t write(int fd, const void *buf, size_t nbytes){    /* external entry point for application */    pth_implicit_init();    return pth_write(fd, buf, nbytes);}intern ssize_t pth_sc_write(int fd, const void *buf, size_t nbytes){    /* internal exit point for Pth */    if (pth_syscall_fct_tab[PTH_SCF_write].addr != NULL)        return ((ssize_t (*)(int, const void *, size_t))               pth_syscall_fct_tab[PTH_SCF_write].addr)               (fd, buf, nbytes);#if defined(HAVE_SYSCALL) && defined(SYS_write)    else return (ssize_t)syscall(SYS_write, fd, buf, nbytes);#else    else PTH_SYSCALL_ERROR(-1, ENOSYS, "write");#endif}/* ==== Pth hard syscall wrapper for readv(2) ==== */ssize_t readv(int, const struct iovec *, int);ssize_t readv(int fd, const struct iovec *iov, int iovcnt){    /* external entry point for application */    pth_implicit_init();    return pth_readv(fd, iov, iovcnt);}intern ssize_t pth_sc_readv(int fd, const struct iovec *iov, int iovcnt){    /* internal exit point for Pth */    if (pth_syscall_fct_tab[PTH_SCF_readv].addr != NULL)        return ((ssize_t (*)(int, const struct iovec *, int))               pth_syscall_fct_tab[PTH_SCF_readv].addr)               (fd, iov, iovcnt);#if defined(HAVE_SYSCALL) && defined(SYS_readv)    else return (ssize_t)syscall(SYS_readv, fd, iov, iovcnt);#else    else PTH_SYSCALL_ERROR(-1, ENOSYS, "readv");#endif}/* ==== Pth hard syscall wrapper for writev(2) ==== */ssize_t writev(int, const struct iovec *, int);ssize_t writev(int fd, const struct iovec *iov, int iovcnt){    /* external entry point for application */    pth_implicit_init();    return pth_writev(fd, iov, iovcnt);}intern ssize_t pth_sc_writev(int fd, const struct iovec *iov, int iovcnt){    /* internal exit point for Pth */    if (pth_syscall_fct_tab[PTH_SCF_writev].addr != NULL)        return ((ssize_t (*)(int, const struct iovec *, int))               pth_syscall_fct_tab[PTH_SCF_writev].addr)               (fd, iov, iovcnt);#if defined(HAVE_SYSCALL) && defined(SYS_writev)    else return (ssize_t)syscall(SYS_writev, fd, iov, iovcnt);#else    else PTH_SYSCALL_ERROR(-1, ENOSYS, "writev");#endif}/* ==== Pth hard syscall wrapper for pread(2) ==== */ssize_t pread(int, void *, size_t, off_t);ssize_t pread(int fd, void *buf, size_t nbytes, off_t offset){    /* external entry point for application */    pth_implicit_init();    return pth_pread(fd, buf, nbytes, offset);}/* NOTICE: internally fully emulated, so still no   internal exit point pth_sc_pread necessary! *//* ==== Pth hard syscall wrapper for pwrite(2) ==== */ssize_t pwrite(int, const void *, size_t, off_t);ssize_t pwrite(int fd, const void *buf, size_t nbytes, off_t offset){    /* external entry point for application */    pth_implicit_init();    return pth_pwrite(fd, buf, nbytes, offset);}/* NOTICE: internally fully emulated, so still no   internal exit point pth_sc_pwrite necessary! *//* ==== Pth hard syscall wrapper for recv(2) ==== */ssize_t recv(int, void *, size_t, int);ssize_t recv(int fd, void *buf, size_t nbytes, int flags){    /* external entry point for application */    pth_implicit_init();    return pth_recv(fd, buf, nbytes, flags);}intern ssize_t pth_sc_recv(int fd, void *buf, size_t nbytes, int flags){    /* internal exit point for Pth */    if (pth_syscall_fct_tab[PTH_SCF_recv].addr != NULL)        return ((ssize_t (*)(int, void *, size_t, int))               pth_syscall_fct_tab[PTH_SCF_recv].addr)               (fd, buf, nbytes, flags);#if defined(HAVE_SYSCALL) && defined(SYS_recv)    else return (ssize_t)syscall(SYS_recv, fd, buf, nbytes, flags);#elif defined(HAVE_SYSCALL) && defined(SYS_recvfrom)    else return (ssize_t)syscall(SYS_recvfrom, fd, buf, nbytes, flags, (struct sockaddr *)NULL, (socklen_t *)NULL);#else    else PTH_SYSCALL_ERROR(-1, ENOSYS, "recv");#endif}/* ==== Pth hard syscall wrapper for send(2) ==== */ssize_t send(int, void *, size_t, int);ssize_t send(int fd, void *buf, size_t nbytes, int flags){    /* external entry point for application */    pth_implicit_init();    return pth_send(fd, buf, nbytes, flags);}intern ssize_t pth_sc_send(int fd, void *buf, size_t nbytes, int flags){    /* internal exit point for Pth */    if (pth_syscall_fct_tab[PTH_SCF_send].addr != NULL)        return ((ssize_t (*)(int, void *, size_t, int))               pth_syscall_fct_tab[PTH_SCF_send].addr)               (fd, buf, nbytes, flags);#if defined(HAVE_SYSCALL) && defined(SYS_send)    else return (ssize_t)syscall(SYS_send, fd, buf, nbytes, flags);#elif defined(HAVE_SYSCALL) && defined(SYS_sendto)    else return (ssize_t)syscall(SYS_sendto, fd, buf, nbytes, flags, (struct sockaddr *)NULL, 0);#else    else PTH_SYSCALL_ERROR(-1, ENOSYS, "send");#endif}/* ==== Pth hard syscall wrapper for recvfrom(2) ==== */ssize_t recvfrom(int, void *, size_t, int, struct sockaddr *, socklen_t *);ssize_t recvfrom(int fd, void *buf, size_t nbytes, int flags, struct sockaddr *from, socklen_t *fromlen){    /* external entry point for application */    pth_implicit_init();    return pth_recvfrom(fd, buf, nbytes, flags, from, fromlen);}intern ssize_t pth_sc_recvfrom(int fd, void *buf, size_t nbytes, int flags, struct sockaddr *from, socklen_t *fromlen){    /* internal exit point for Pth */    if (pth_syscall_fct_tab[PTH_SCF_recvfrom].addr != NULL)        return ((ssize_t (*)(int, void *, size_t, int, struct sockaddr *, socklen_t *))               pth_syscall_fct_tab[PTH_SCF_recvfrom].addr)               (fd, buf, nbytes, flags, from, fromlen);#if defined(HAVE_SYSCALL) && defined(SYS_recvfrom)    else return (ssize_t)syscall(SYS_recvfrom, fd, buf, nbytes, flags, from, fromlen);#else    else PTH_SYSCALL_ERROR(-1, ENOSYS, "recvfrom");#endif}/* ==== Pth hard syscall wrapper for sendto(2) ==== */ssize_t sendto(int, const void *, size_t, int, const struct sockaddr *, socklen_t);ssize_t sendto(int fd, const void *buf, size_t nbytes, int flags, const struct sockaddr *to, socklen_t tolen){    /* external entry point for application */    pth_implicit_init();    return pth_sendto(fd, buf, nbytes, flags, to, tolen);}intern ssize_t pth_sc_sendto(int fd, const void *buf, size_t nbytes, int flags, const struct sockaddr *to, socklen_t tolen){    /* internal exit point for Pth */    if (pth_syscall_fct_tab[PTH_SCF_sendto].addr != NULL)        return ((ssize_t (*)(int, const void *, size_t, int, const struct sockaddr *, socklen_t))               pth_syscall_fct_tab[PTH_SCF_sendto].addr)               (fd, buf, nbytes, flags, to, tolen);#if defined(HAVE_SYSCALL) && defined(SYS_sendto)    else return (ssize_t)syscall(SYS_sendto, fd, buf, nbytes, flags, to, tolen);#else    else PTH_SYSCALL_ERROR(-1, ENOSYS, "sendto");#endif}#endif /* PTH_SYSCALL_HARD */

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?