diff options
Diffstat (limited to 'hw/xfree86/os-support/shared/sigio.c')
-rw-r--r-- | hw/xfree86/os-support/shared/sigio.c | 300 |
1 files changed, 146 insertions, 154 deletions
diff --git a/hw/xfree86/os-support/shared/sigio.c b/hw/xfree86/os-support/shared/sigio.c index 274a8ab7e..12ae8a480 100644 --- a/hw/xfree86/os-support/shared/sigio.c +++ b/hw/xfree86/os-support/shared/sigio.c @@ -56,146 +56,145 @@ #include <xorg-config.h> #endif -# include <X11/X.h> -# include "xf86.h" -# include "xf86Priv.h" -# include "xf86_OSlib.h" -# include "inputstr.h" +#include <X11/X.h> +#include "xf86.h" +#include "xf86Priv.h" +#include "xf86_OSlib.h" +#include "inputstr.h" #ifdef HAVE_STROPTS_H -# include <stropts.h> +#include <stropts.h> #endif #ifdef MAXDEVICES /* MAXDEVICES represents the maximimum number of input devices usable * at the same time plus one entry for DRM support. */ -# define MAX_FUNCS (MAXDEVICES + 1) +#define MAX_FUNCS (MAXDEVICES + 1) #else -# define MAX_FUNCS 16 +#define MAX_FUNCS 16 #endif typedef struct _xf86SigIOFunc { - void (*f) (int, void *); - int fd; - void *closure; + void (*f) (int, void *); + int fd; + void *closure; } Xf86SigIOFunc; -static Xf86SigIOFunc xf86SigIOFuncs[MAX_FUNCS]; -static int xf86SigIOMax; -static int xf86SigIOMaxFd; -static fd_set xf86SigIOMask; +static Xf86SigIOFunc xf86SigIOFuncs[MAX_FUNCS]; +static int xf86SigIOMax; +static int xf86SigIOMaxFd; +static fd_set xf86SigIOMask; /* * SIGIO gives no way of discovering which fd signalled, select * to discover */ static void -xf86SIGIO (int sig) +xf86SIGIO(int sig) { - int i; - fd_set ready; - struct timeval to; - int save_errno = errno; /* do not clobber the global errno */ - int r; + int i; + fd_set ready; + struct timeval to; + int save_errno = errno; /* do not clobber the global errno */ + int r; ready = xf86SigIOMask; to.tv_sec = 0; to.tv_usec = 0; - SYSCALL (r = select (xf86SigIOMaxFd, &ready, 0, 0, &to)); + SYSCALL(r = select(xf86SigIOMaxFd, &ready, 0, 0, &to)); for (i = 0; r > 0 && i < xf86SigIOMax; i++) - if (xf86SigIOFuncs[i].f && FD_ISSET (xf86SigIOFuncs[i].fd, &ready)) - { - (*xf86SigIOFuncs[i].f)(xf86SigIOFuncs[i].fd, - xf86SigIOFuncs[i].closure); - r--; - } + if (xf86SigIOFuncs[i].f && FD_ISSET(xf86SigIOFuncs[i].fd, &ready)) { + (*xf86SigIOFuncs[i].f) (xf86SigIOFuncs[i].fd, + xf86SigIOFuncs[i].closure); + r--; + } if (r > 0) { - xf86Msg(X_ERROR, "SIGIO %d descriptors not handled\n", r); + xf86Msg(X_ERROR, "SIGIO %d descriptors not handled\n", r); } /* restore global errno */ errno = save_errno; } static int -xf86IsPipe (int fd) +xf86IsPipe(int fd) { - struct stat buf; - - if (fstat (fd, &buf) < 0) - return 0; + struct stat buf; + + if (fstat(fd, &buf) < 0) + return 0; return S_ISFIFO(buf.st_mode); } int -xf86InstallSIGIOHandler(int fd, void (*f)(int, void *), void *closure) +xf86InstallSIGIOHandler(int fd, void (*f) (int, void *), void *closure) { struct sigaction sa; struct sigaction osa; - int i; + int i; int blocked; int installed = FALSE; if (!xf86Info.useSIGIO) - return 0; + return 0; - for (i = 0; i < MAX_FUNCS; i++) - { - if (!xf86SigIOFuncs[i].f) - { - if (xf86IsPipe (fd)) - return 0; - blocked = xf86BlockSIGIO(); + for (i = 0; i < MAX_FUNCS; i++) { + if (!xf86SigIOFuncs[i].f) { + if (xf86IsPipe(fd)) + return 0; + blocked = xf86BlockSIGIO(); #ifdef O_ASYNC - if (fcntl(fd, F_SETFL, fcntl(fd, F_GETFL) | O_ASYNC) == -1) { - xf86Msg(X_WARNING, "fcntl(%d, O_ASYNC): %s\n", - fd, strerror(errno)); - } else { - if (fcntl(fd, F_SETOWN, getpid()) == -1) { - xf86Msg(X_WARNING, "fcntl(%d, F_SETOWN): %s\n", - fd, strerror(errno)); - } else { - installed = TRUE; - } - } + if (fcntl(fd, F_SETFL, fcntl(fd, F_GETFL) | O_ASYNC) == -1) { + xf86Msg(X_WARNING, "fcntl(%d, O_ASYNC): %s\n", + fd, strerror(errno)); + } + else { + if (fcntl(fd, F_SETOWN, getpid()) == -1) { + xf86Msg(X_WARNING, "fcntl(%d, F_SETOWN): %s\n", + fd, strerror(errno)); + } + else { + installed = TRUE; + } + } #endif -#ifdef I_SETSIG /* System V Streams - used on Solaris for input devices */ - if (!installed && isastream(fd)) { - if (ioctl(fd, I_SETSIG, S_INPUT | S_ERROR | S_HANGUP) == -1) { - xf86Msg(X_WARNING, "fcntl(%d, I_SETSIG): %s\n", - fd, strerror(errno)); - } else { - installed = TRUE; - } - } +#ifdef I_SETSIG /* System V Streams - used on Solaris for input devices */ + if (!installed && isastream(fd)) { + if (ioctl(fd, I_SETSIG, S_INPUT | S_ERROR | S_HANGUP) == -1) { + xf86Msg(X_WARNING, "fcntl(%d, I_SETSIG): %s\n", + fd, strerror(errno)); + } + else { + installed = TRUE; + } + } #endif - if (!installed) { - xf86UnblockSIGIO(blocked); - return 0; - } - sigemptyset(&sa.sa_mask); - sigaddset(&sa.sa_mask, SIGIO); - sa.sa_flags = 0; - sa.sa_handler = xf86SIGIO; - sigaction(SIGIO, &sa, &osa); - xf86SigIOFuncs[i].fd = fd; - xf86SigIOFuncs[i].closure = closure; - xf86SigIOFuncs[i].f = f; - if (i >= xf86SigIOMax) - xf86SigIOMax = i+1; - if (fd >= xf86SigIOMaxFd) - xf86SigIOMaxFd = fd + 1; - FD_SET (fd, &xf86SigIOMask); - xf86UnblockSIGIO(blocked); - return 1; - } - /* Allow overwriting of the closure and callback */ - else if (xf86SigIOFuncs[i].fd == fd) - { - xf86SigIOFuncs[i].closure = closure; - xf86SigIOFuncs[i].f = f; - return 1; - } + if (!installed) { + xf86UnblockSIGIO(blocked); + return 0; + } + sigemptyset(&sa.sa_mask); + sigaddset(&sa.sa_mask, SIGIO); + sa.sa_flags = 0; + sa.sa_handler = xf86SIGIO; + sigaction(SIGIO, &sa, &osa); + xf86SigIOFuncs[i].fd = fd; + xf86SigIOFuncs[i].closure = closure; + xf86SigIOFuncs[i].f = f; + if (i >= xf86SigIOMax) + xf86SigIOMax = i + 1; + if (fd >= xf86SigIOMaxFd) + xf86SigIOMaxFd = fd + 1; + FD_SET(fd, &xf86SigIOMask); + xf86UnblockSIGIO(blocked); + return 1; + } + /* Allow overwriting of the closure and callback */ + else if (xf86SigIOFuncs[i].fd == fd) { + xf86SigIOFuncs[i].closure = closure; + xf86SigIOFuncs[i].f = f; + return 1; + } } return 0; } @@ -205,105 +204,98 @@ xf86RemoveSIGIOHandler(int fd) { struct sigaction sa; struct sigaction osa; - int i; + int i; int max; int maxfd; int ret; if (!xf86Info.useSIGIO) - return 0; + return 0; max = 0; maxfd = -1; ret = 0; - for (i = 0; i < MAX_FUNCS; i++) - { - if (xf86SigIOFuncs[i].f) - { - if (xf86SigIOFuncs[i].fd == fd) - { - xf86SigIOFuncs[i].f = 0; - xf86SigIOFuncs[i].fd = 0; - xf86SigIOFuncs[i].closure = 0; - FD_CLR (fd, &xf86SigIOMask); - ret = 1; - } - else - { - max = i + 1; - if (xf86SigIOFuncs[i].fd >= maxfd) - maxfd = xf86SigIOFuncs[i].fd + 1; - } - } + for (i = 0; i < MAX_FUNCS; i++) { + if (xf86SigIOFuncs[i].f) { + if (xf86SigIOFuncs[i].fd == fd) { + xf86SigIOFuncs[i].f = 0; + xf86SigIOFuncs[i].fd = 0; + xf86SigIOFuncs[i].closure = 0; + FD_CLR(fd, &xf86SigIOMask); + ret = 1; + } + else { + max = i + 1; + if (xf86SigIOFuncs[i].fd >= maxfd) + maxfd = xf86SigIOFuncs[i].fd + 1; + } + } } - if (ret) - { + if (ret) { #ifdef O_ASYNC - fcntl(fd, F_SETFL, fcntl(fd, F_GETFL) & ~O_ASYNC); + fcntl(fd, F_SETFL, fcntl(fd, F_GETFL) & ~O_ASYNC); #endif #ifdef I_SETSIG - if (isastream(fd)) { - if (ioctl(fd, I_SETSIG, 0) == -1) { - xf86Msg(X_WARNING, "fcntl(%d, I_SETSIG, 0): %s\n", - fd, strerror(errno)); - } - } + if (isastream(fd)) { + if (ioctl(fd, I_SETSIG, 0) == -1) { + xf86Msg(X_WARNING, "fcntl(%d, I_SETSIG, 0): %s\n", + fd, strerror(errno)); + } + } #endif - xf86SigIOMax = max; - xf86SigIOMaxFd = maxfd; - if (!max) - { - sigemptyset(&sa.sa_mask); - sigaddset(&sa.sa_mask, SIGIO); - sa.sa_flags = 0; - sa.sa_handler = SIG_IGN; - sigaction(SIGIO, &sa, &osa); - } + xf86SigIOMax = max; + xf86SigIOMaxFd = maxfd; + if (!max) { + sigemptyset(&sa.sa_mask); + sigaddset(&sa.sa_mask, SIGIO); + sa.sa_flags = 0; + sa.sa_handler = SIG_IGN; + sigaction(SIGIO, &sa, &osa); + } } return ret; } int -xf86BlockSIGIO (void) +xf86BlockSIGIO(void) { - sigset_t set, old; - int ret; - - sigemptyset (&set); - sigaddset (&set, SIGIO); - sigprocmask (SIG_BLOCK, &set, &old); - ret = sigismember (&old, SIGIO); - return ret; + sigset_t set, old; + int ret; + + sigemptyset(&set); + sigaddset(&set, SIGIO); + sigprocmask(SIG_BLOCK, &set, &old); + ret = sigismember(&old, SIGIO); + return ret; } void -xf86UnblockSIGIO (int wasset) +xf86UnblockSIGIO(int wasset) { - sigset_t set; + sigset_t set; - if (!wasset) - { - sigemptyset (&set); - sigaddset (&set, SIGIO); - sigprocmask (SIG_UNBLOCK, &set, NULL); + if (!wasset) { + sigemptyset(&set); + sigaddset(&set, SIGIO); + sigprocmask(SIG_UNBLOCK, &set, NULL); } } void -xf86AssertBlockedSIGIO (char *where) +xf86AssertBlockedSIGIO(char *where) { - sigset_t set, old; + sigset_t set, old; - sigemptyset (&set); - sigprocmask (SIG_BLOCK, &set, &old); - if (!sigismember (&old, SIGIO)) - xf86Msg (X_ERROR, "SIGIO not blocked at %s\n", where); + sigemptyset(&set); + sigprocmask(SIG_BLOCK, &set, &old); + if (!sigismember(&old, SIGIO)) + xf86Msg(X_ERROR, "SIGIO not blocked at %s\n", where); } /* XXX This is a quick hack for the benefit of xf86SetSilkenMouse() */ int -xf86SIGIOSupported (void) +xf86SIGIOSupported(void) { return 1; } |