Add SIGIO/SIGPOLL support for Solaris
Signed-off-by: Alan Coopersmith <alan.coopersmith@sun.com>
This commit is contained in:
parent
0c467b1f99
commit
64b7f96dca
|
@ -113,7 +113,7 @@ AM_CONDITIONAL(XSERVER_DTRACE, [test "x$WDTRACE" != "xno"])
|
||||||
|
|
||||||
AC_HEADER_DIRENT
|
AC_HEADER_DIRENT
|
||||||
AC_HEADER_STDC
|
AC_HEADER_STDC
|
||||||
AC_CHECK_HEADERS([fcntl.h stdlib.h string.h unistd.h dlfcn.h])
|
AC_CHECK_HEADERS([fcntl.h stdlib.h string.h unistd.h dlfcn.h stropts.h])
|
||||||
|
|
||||||
dnl Checks for typedefs, structures, and compiler characteristics.
|
dnl Checks for typedefs, structures, and compiler characteristics.
|
||||||
AC_C_CONST
|
AC_C_CONST
|
||||||
|
|
|
@ -63,6 +63,10 @@
|
||||||
# include "xf86_OSlib.h"
|
# include "xf86_OSlib.h"
|
||||||
# include "inputstr.h"
|
# include "inputstr.h"
|
||||||
|
|
||||||
|
#ifdef HAVE_STROPTS_H
|
||||||
|
# include <stropts.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Linux libc5 defines FASYNC, but not O_ASYNC. Don't know if it is
|
* Linux libc5 defines FASYNC, but not O_ASYNC. Don't know if it is
|
||||||
* functional or not.
|
* functional or not.
|
||||||
|
@ -139,6 +143,7 @@ xf86InstallSIGIOHandler(int fd, void (*f)(int, void *), void *closure)
|
||||||
struct sigaction osa;
|
struct sigaction osa;
|
||||||
int i;
|
int i;
|
||||||
int blocked;
|
int blocked;
|
||||||
|
int installed = FALSE;
|
||||||
|
|
||||||
for (i = 0; i < MAX_FUNCS; i++)
|
for (i = 0; i < MAX_FUNCS; i++)
|
||||||
{
|
{
|
||||||
|
@ -147,15 +152,30 @@ xf86InstallSIGIOHandler(int fd, void (*f)(int, void *), void *closure)
|
||||||
if (xf86IsPipe (fd))
|
if (xf86IsPipe (fd))
|
||||||
return 0;
|
return 0;
|
||||||
blocked = xf86BlockSIGIO();
|
blocked = xf86BlockSIGIO();
|
||||||
|
#ifdef O_ASYNC
|
||||||
if (fcntl(fd, F_SETFL, fcntl(fd, F_GETFL) | O_ASYNC) == -1) {
|
if (fcntl(fd, F_SETFL, fcntl(fd, F_GETFL) | O_ASYNC) == -1) {
|
||||||
xf86Msg(X_WARNING, "fcntl(%d, O_ASYNC): %s\n",
|
xf86Msg(X_WARNING, "fcntl(%d, O_ASYNC): %s\n",
|
||||||
fd, strerror(errno));
|
fd, strerror(errno));
|
||||||
xf86UnblockSIGIO(blocked);
|
} else {
|
||||||
return 0;
|
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_SETOWN, getpid()) == -1) {
|
#endif
|
||||||
xf86Msg(X_WARNING, "fcntl(%d, F_SETOWN): %s\n",
|
#ifdef I_SETSIG /* System V Streams - used on Solaris for input devices */
|
||||||
fd, strerror(errno));
|
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);
|
xf86UnblockSIGIO(blocked);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -221,7 +241,17 @@ xf86RemoveSIGIOHandler(int fd)
|
||||||
}
|
}
|
||||||
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));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
xf86SigIOMax = max;
|
xf86SigIOMax = max;
|
||||||
xf86SigIOMaxFd = maxfd;
|
xf86SigIOMaxFd = maxfd;
|
||||||
if (!max)
|
if (!max)
|
||||||
|
|
|
@ -21,7 +21,8 @@ noinst_LTLIBRARIES = libsolaris.la
|
||||||
libsolaris_la_SOURCES = sun_init.c \
|
libsolaris_la_SOURCES = sun_init.c \
|
||||||
sun_vid.c sun_bell.c $(AGP_SRC) sun_apm.c \
|
sun_vid.c sun_bell.c $(AGP_SRC) sun_apm.c \
|
||||||
$(srcdir)/../shared/kmod_noop.c \
|
$(srcdir)/../shared/kmod_noop.c \
|
||||||
$(srcdir)/../shared/posix_tty.c $(srcdir)/../shared/sigiostubs.c \
|
$(srcdir)/../shared/posix_tty.c \
|
||||||
|
$(srcdir)/../shared/sigio.c \
|
||||||
$(srcdir)/../shared/stdResource.c \
|
$(srcdir)/../shared/stdResource.c \
|
||||||
$(srcdir)/../shared/vidmem.c \
|
$(srcdir)/../shared/vidmem.c \
|
||||||
$(VTSW_SRC)
|
$(VTSW_SRC)
|
||||||
|
|
|
@ -54,6 +54,9 @@
|
||||||
/* Solaris 8 or later? */
|
/* Solaris 8 or later? */
|
||||||
#undef __SOL8__
|
#undef __SOL8__
|
||||||
|
|
||||||
|
/* Define to 1 if you have the <stropts.h> header file. */
|
||||||
|
#undef HAVE_STROPTS_H
|
||||||
|
|
||||||
/* Define to 1 if you have the <sys/kd.h> header file. */
|
/* Define to 1 if you have the <sys/kd.h> header file. */
|
||||||
#undef HAVE_SYS_KD_H
|
#undef HAVE_SYS_KD_H
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue