summaryrefslogtreecommitdiffstats
path: root/usr.sbin/moused
diff options
context:
space:
mode:
authorhselasky <hselasky@FreeBSD.org>2012-09-24 17:13:33 +0000
committerhselasky <hselasky@FreeBSD.org>2012-09-24 17:13:33 +0000
commit2eed5d6e946b871405317c654c5b82e658751cf6 (patch)
tree76f05e4d77105cda2964b074b133fd41ebb2b27d /usr.sbin/moused
parent17ea6066adcd37b8128ac12a30348905a4e19aa6 (diff)
downloadFreeBSD-src-2eed5d6e946b871405317c654c5b82e658751cf6.zip
FreeBSD-src-2eed5d6e946b871405317c654c5b82e658751cf6.tar.gz
Make sure moused is exiting as quick as possible after that the
umsX character device returns a read error. Update devd.conf rules to use "DEVFS" events which are generated after that the umsX character device node has been created/destroyed, and then there should be no need for moused to wait up to 10 seconds for umsX to be ready. Opening umsX should not fail except if the kernel is low on memory. In that case the user can replug the USB mouse or use "usbconfig" to reset the device. In case of USB mouse devices, moused should neither retry to open its character device, once the first read error has happened. This is an indication of device detach. MFC after: 1 week
Diffstat (limited to 'usr.sbin/moused')
-rw-r--r--usr.sbin/moused/moused.c20
1 files changed, 8 insertions, 12 deletions
diff --git a/usr.sbin/moused/moused.c b/usr.sbin/moused/moused.c
index 78e65fa..93eec99 100644
--- a/usr.sbin/moused/moused.c
+++ b/usr.sbin/moused/moused.c
@@ -408,6 +408,7 @@ static struct rodentparam {
int cfd; /* /dev/consolectl file descriptor */
int mremsfd; /* mouse remote server file descriptor */
int mremcfd; /* mouse remote client file descriptor */
+ int is_removable; /* set if device is removable, like USB */
long clickthreshold; /* double click speed in msec */
long button2timeout; /* 3 button emulation timeout */
mousehw_t hw; /* mouse device hardware information */
@@ -434,6 +435,7 @@ static struct rodentparam {
.cfd = -1,
.mremsfd = -1,
.mremcfd = -1,
+ .is_removable = 0,
.clickthreshold = DFLT_CLICKTHRESHOLD,
.button2timeout = DFLT_BUTTON2TIMEOUT,
.accelx = 1.0,
@@ -570,7 +572,6 @@ main(int argc, char *argv[])
int c;
int i;
int j;
- static int retry;
for (i = 0; i < MOUSE_MAXBUTTON; ++i)
mstate[i] = &bstate[i];
@@ -876,10 +877,8 @@ main(int argc, char *argv[])
usage();
}
- retry = 1;
- if (strncmp(rodent.portname, "/dev/ums", 8) == 0) {
- retry = 5;
- }
+ if (strncmp(rodent.portname, "/dev/ums", 8) == 0)
+ rodent.is_removable = 1;
for (;;) {
if (setjmp(env) == 0) {
@@ -888,13 +887,8 @@ main(int argc, char *argv[])
signal(SIGQUIT, cleanup);
signal(SIGTERM, cleanup);
signal(SIGUSR1, pause_mouse);
- for (i = 0; i < retry; ++i) {
- if (i > 0)
- sleep(2);
- rodent.mfd = open(rodent.portname, O_RDWR | O_NONBLOCK);
- if (rodent.mfd != -1 || errno != ENOENT)
- break;
- }
+
+ rodent.mfd = open(rodent.portname, O_RDWR | O_NONBLOCK);
if (rodent.mfd == -1)
logerr(1, "unable to open %s", rodent.portname);
if (r_identify() == MOUSE_PROTO_UNKNOWN) {
@@ -944,6 +938,8 @@ main(int argc, char *argv[])
if (rodent.cfd != -1)
close(rodent.cfd);
rodent.mfd = rodent.cfd = -1;
+ if (rodent.is_removable)
+ exit(0);
}
/* NOT REACHED */
OpenPOWER on IntegriCloud