>Submitter-Id: current-users >Originator: Jens Rehsack >Organization: LiWing IT-Services >Confidential: no >Synopsis: [PATCH] /usr/sbin/moused fails if ums is built into kernel >Severity: serious >Priority: high >Category: bin >Class: sw-bug >Release: FreeBSD 5.1-CURRENT i386 >Environment: System: FreeBSD statler 5.1-CURRENT FreeBSD 5.1-CURRENT #0: Sat Nov 15 14:11:24 GMT 2003 root_at_statler:/usr/obj/usr/src/sys/STATLER i386 >Description: If the device ums is built into the kernel and not as module, and the module is not build (eg. excluded by MODULES_OVERRIDE), moused fails with: 'unable to load USB mouse driver: No such file or directory' >How-To-Repeat: Build a -CURRENT kernel with ums, don't build the ums module, use an usb-mouse and reboot. >Fix: --- patch-usr.sbin::moused::moused.c begins here --- Index: usr.sbin/moused/moused.c =================================================================== diff -u usr.sbin/moused/moused.c.orig usr.sbin/moused/moused.c --- usr.sbin/moused/moused.c.orig Sat Nov 15 14:51:14 2003 +++ usr.sbin/moused/moused.c Sat Nov 15 15:08:10 2003 _at__at_ -70,6 +70,9 _at__at_ #include <sys/socket.h> #include <sys/stat.h> #include <sys/un.h> +#include <sys/param.h> +#include <sys/linker.h> +#include <sys/module.h> #include <unistd.h> #define MAX_CLICKTHRESHOLD 2000 /* 2 seconds */ _at__at_ -495,6 +498,8 _at__at_ static int kidspad(u_char rxc, mousestatus_t *act); +static int usbmodule(void); + int main(int argc, char *argv[]) { _at__at_ -754,8 +759,7 _at__at_ retry = 1; if (strncmp(rodent.portname, "/dev/ums", 8) == 0) { - if (kldload("ums") == -1 && errno != EEXIST) - logerr(1, "unable to load USB mouse driver"); + usbmodule(); retry = 5; } _at__at_ -824,6 +828,43 _at__at_ /* NOT REACHED */ exit(0); +} + +static int +usbmodule(void) +{ + int fileid, modid, loaded = 0; + struct kld_file_stat fstat; + struct module_stat mstat; + + for( fileid = kldnext(0); loaded == 0 && fileid > 0; + fileid = kldnext(fileid) ) + { + fstat.version = sizeof(fstat); + if( kldstat( fileid, &fstat ) < 0 ) + continue; + if( strncmp( fstat.name, "uhub/ums", 8 ) == 0 ) + { + loaded = 1; + break; + } + + for( modid = kldfirstmod(fileid); modid > 0; + modid = modfnext(modid) ) + { + mstat.version = sizeof(mstat); + if( modstat( modid, &mstat ) < 0 ) + continue; + if( strncmp( mstat.name, "uhub/ums", 8 ) == 0 ) + { + loaded = 1; + break; + } + } + } + + if( !loaded && kldload("ums") == -1 && errno != EEXIST ) + logerr(1, "unable to load USB mouse driver"); } static void --- patch-usr.sbin::moused::moused.c ends here ---Received on Mon Nov 17 2003 - 01:55:46 UTC
This archive was generated by hypermail 2.4.0 : Wed May 19 2021 - 11:37:29 UTC