From a8e94960f7688dcdd005c9dc9567b6c871a6bd51 Mon Sep 17 00:00:00 2001 From: Chris Gianelloni Date: Tue, 8 Apr 2008 02:11:09 +0000 Subject: Updated Gentoo patch. svn path=/; revision=167 --- sys-apps/hwsetup/Manifest | 2 +- sys-apps/hwsetup/files/1.2-7-gentoo.patch | 1712 ++++++++++++++--------------- 2 files changed, 821 insertions(+), 893 deletions(-) diff --git a/sys-apps/hwsetup/Manifest b/sys-apps/hwsetup/Manifest index 07351d9..0145917 100644 --- a/sys-apps/hwsetup/Manifest +++ b/sys-apps/hwsetup/Manifest @@ -2,7 +2,7 @@ AUX 1.2-3-dyn_blacklist.patch 1625 RMD160 bba78724a2a9d89309f8fd2a50d8d2525cc818 AUX 1.2-3-fastprobe.patch 2817 RMD160 5cadca96d654739d61db18287bf2a71f4d7a00ca SHA1 9d05f2542f4fc9b8ae4ace559bec8a9720ea77b5 SHA256 9a16e4ddaada2bc115a48a6d60b5cac72d49f33c7eecf245f6337df627a4a0d0 AUX 1.2-3-gentoo.patch 1430 RMD160 fae21df5ef10085fe6336c483b5b2c2145f1f787 SHA1 b17b2ae05a819c9be68145f8ba5054dddf276a6d SHA256 1d1b6b3199b4a395febe7a68fc85a59c090ab99918f6a5e02739210e7c182e83 AUX 1.2-7-dyn_blacklist.patch 1996 RMD160 e299ee153e13f9a80d7a28209cf62268dfb9e8bd SHA1 192ea0961e02a1a84b6efc98a02b360d859d4ca1 SHA256 625c60827eea5f17b5d833276cf7924223e6ab1fa681f8518c4e8e1070465339 -AUX 1.2-7-gentoo.patch 31769 RMD160 49405be15eedfff89d2af2b070b5a7404c4c70fb SHA1 aa287eb653f5c894461686a68ad19f8192de2ce1 SHA256 48bebeb33d361d34b5ef9183d6850c0f8533931b7657ce0eb2d94189e7026760 +AUX 1.2-7-gentoo.patch 29142 RMD160 c946498a1ab92fdbdacd3ce7c817af01fd96363c SHA1 d7b42af3cac6e880cb86b7177f78b8b1b3a96e5e SHA256 c7cb6b193b1f0cfbd85e26ca4a87de4ed4331271076f6fdfcc14a6e0b83e1c40 DIST hwsetup_1.2-3.tar.gz 10828 RMD160 d3ce42ac74e5b0ccb9ae73fc0092f172b83a653a SHA1 101b42ee5016e250d69dbbfec7cd65e9d499eacd SHA256 faf346f5f342c0ab26631e31440632f6009ff206feafd1667a488e2f0ba4bb37 DIST hwsetup_1.2-7.tar.gz 10706 RMD160 7895b32c81254b2ca1575ab12dcc6fa39d011e17 SHA1 c91cb22c07755ecbfce8e9e6826e8e2580f103f8 SHA256 aa72b37ce306b5191cabd31eb5f19ab2a5e635697a263c6735d10c7bf99f9589 EBUILD hwsetup-1.2-r1.ebuild 1727 RMD160 115b3598de83bb68c208903fb06f0ebcad36eee0 SHA1 3b8e5747b6908d7f1bfa9a65d6627e0ca3480af6 SHA256 64aa9018379e4e91b3929484c3290c2a2e5e9e891ec89ecc6e2478adad9857f3 diff --git a/sys-apps/hwsetup/files/1.2-7-gentoo.patch b/sys-apps/hwsetup/files/1.2-7-gentoo.patch index 5d85e99..3b07911 100644 --- a/sys-apps/hwsetup/files/1.2-7-gentoo.patch +++ b/sys-apps/hwsetup/files/1.2-7-gentoo.patch @@ -1,30 +1,7 @@ -diff -urN hwsetup-1.2.dyn_blacklist/hwsetup.c hwsetup-1.2/hwsetup.c ---- hwsetup-1.2.dyn_blacklist/hwsetup.c 2008-04-07 18:51:24.000000000 -0700 -+++ hwsetup-1.2/hwsetup.c 2008-04-07 19:00:42.000000000 -0700 -@@ -244,14 +244,15 @@ - - int syntax(char *option) - { -- printf(VERSION); -+ puts(VERSION); - if(option) fprintf(stderr,"hwsetup: Unknown option '%s'\n\n",option); -- printf("Usage: hwsetup\n" -- " -v be verbose\n" -- " -p print rotating prompt\n" -- " -a ignore audio devices\n" -- " -s ignore scsi controllers\n" -- " -n probe only, don't configure anything.\n"); -+ puts("Usage: hwsetup\n" -+ "\t\t-v\tbe verbose\n" -+ "\t\t-p\tprint rotating prompt\n" -+ "\t\t-a\tignore audio devices\n" -+ "\t\t-s\tignore scsi controllers\n" -+ "\t\t-n\tprobe only, don't configure anything.\n" -+ "\t\t-f\trun a fast probe."); - return option?1:0; - } - -@@ -387,7 +388,7 @@ +diff -urN hwsetup-1.2.fastprobe/hwsetup.c hwsetup-1.2/hwsetup.c +--- hwsetup-1.2.fastprobe/hwsetup.c 2008-04-07 19:09:08.000000000 -0700 ++++ hwsetup-1.2/hwsetup.c 2008-04-07 19:07:55.000000000 -0700 +@@ -388,7 +388,7 @@ sprintf(fullpath,"%.90s%.32s",xpath,server[i]); if(!exists(fullpath)) continue; strncpy(xi.xserver,server[i],sizeof(xi.xserver)); @@ -33,16 +10,7 @@ diff -urN hwsetup-1.2.dyn_blacklist/hwsetup.c hwsetup-1.2/hwsetup.c } } if((xpos=strstr(d->driver,xorg))!=NULL) /* Check for Xorg */ -@@ -560,7 +561,7 @@ - { - signal(SIGALRM,SIG_IGN); - fprintf(stderr,"\nWARNING: Autodetection seems to hang,\n" -- "please check your computers BIOS settings.\n"); -+ "please check your computer's BIOS settings.\n"); - fflush(stderr); - if(wpid) { kill(wpid,SIGTERM); usleep(2500000); kill(wpid,SIGKILL); wpid=0; } - exit(1); /* exit program */ -@@ -652,7 +653,7 @@ +@@ -653,7 +653,7 @@ int writeconfig(char *name,struct device *d,int verbose) { FILE *f,*k; @@ -51,862 +19,822 @@ diff -urN hwsetup-1.2.dyn_blacklist/hwsetup.c hwsetup-1.2/hwsetup.c char *desc; unlink(name); if((f=fopen(name,"w"))==NULL) -@@ -733,12 +734,13 @@ - return 0; - } - +diff -urN hwsetup-1.2.fastprobe/hwsetup.c.orig hwsetup-1.2/hwsetup.c.orig +--- hwsetup-1.2.fastprobe/hwsetup.c.orig 2008-04-07 19:09:03.000000000 -0700 ++++ hwsetup-1.2/hwsetup.c.orig 1969-12-31 16:00:00.000000000 -0800 +@@ -1,815 +0,0 @@ +-/****************************************************************************\ +-* HWSETUP - non-interactive hardware detection and configuration * +-* loads modules, generates /dev links, no isapnp autoconfiguration (yet) * +-* needs kudzu-devel (ver. 0.23 and up) * +-* Author: Klaus Knopper * +-\****************************************************************************/ +- +-/* Needed for strcasestr */ +-#ifndef _GNU_SOURCE +-#define _GNU_SOURCE 1 +-#endif +- +-#include +-#include +-#include +-#include +-#include +-#include +-#include +-#include +-#include +-#include +-#include +-#include +-#undef _i_wanna_build_this_crap_ +-/* #define _i_wanna_build_this_crap_ 1 */ /* Necessary for ISAPNP */ +-#include "kudzu.h" +-#if defined(_i_wanna_build_this_crap_) +-#include "isapnp.h" +-#endif +- +-#define VERSION "HWSETUP 1.2, an automatic hardware configuration tool\n" \ +- "(C) 2006 Klaus Knopper \n\n" +- +-/* Note: These are for Xfree 4, not Xorg. */ +-#define CARDSDB "/usr/share/hwdata/Cards" +-#define XPATH "/usr/X11R6/bin/" +-#define XMODPATH "/usr/X11R6/lib/modules/drivers/" +- +-#define VERBOSE_PRINT 1 +-#define VERBOSE_PROMPT 2 +- +-#define SKIP_AUDIO 1 +-#define SKIP_SCSI 2 +- +-#define MAX_TIME 180 /* Maximum of seconds to run, total */ +-#define MAX_TIME_MODULE 4 /* Maximum time in seconds to wait until a module */ +- /* is successfully loaded before continuing */ +- +-#ifdef BLACKLIST +-/* Do not, under any circumstances, load these modules automatically, */ +-/* even if in pcitable. (libkudzu may ignore this, and the KNOPPIX */ +-/* autoconfig scripts may probe them, too) */ +-char *blacklist[200][200] = +-{ "apm","agpgart","yenta_socket","i82092","i82365","tcic", +- "pcmcia_core","ds","ohci1394","hisax", "hisax_fcpcipnp", +- "hisax_isac","hisax_st5481", +- /* Winmodems, unusable, can block sound slot */ +- "snd-atiixp-modem", "snd-intel8x0m","snd-via82xx-modem" +-}; +- +-int blacklistsize = 13; +-void gen_blacklist(){ +- int n = 13; +- int size = 0; +- char *comment; +- char module[1024]; +- FILE *stream; +- +- if((stream = fopen ("/usr/share/hwdata/blacklist", "r")) != (FILE *)0) { +- while((fgets(module, 1023, stream)) != (char *)0 ) { +- +- comment = strchr(module, '#'); +- if (comment != 0) *comment = '\0'; +- comment = strchr(module, '\n'); +- if (comment != 0) *comment = '\0'; +- size = strlen(module); +- if (size < 2) continue; +- strcat (module , " \0"); +- strcpy(blacklist[n] , module); +- n++; +- if ( n == 200 ) break; +- //printf(module); +- } +- blacklistsize = n; +- } +-} +-#endif +- +-/* If a conflicting module in a row is already loaded, the new module will not be probed anymore */ +-#define CONFLICT_SET 2 +-struct conflict { char *name; int loaded; } conflicts [][CONFLICT_SET] = +-{ +- {{ "ad1848",0}, {"snd-nm256",0}}, +- {{ "ali5455",0}, {"intel8x0",0}}, +- {{ "cmpci",0}, {"snd-cmipci",0}}, +- {{ "cs46xx",0}, {"snd-cs46xx",0}}, +- {{ "cs4281",0}, {"snd-cs4281",0}}, +- {{ "emu10k1",0}, {"snd-emu10k1",0}}, +- {{ "es1370",0}, {"snd-ens1370",0}}, +- {{ "es1371",0}, {"snd-ens1371",0}}, +- {{ "esssolo1",0}, {"snd-es1938",0}}, +- {{ "forte",0}, {"snd-fm801",0}}, +- {{ "i810_audio",0}, {"snd-intel8x0",0}}, +- {{ "maestro",0}, {"snd-es1960",0}}, +- {{ "maestro3",0}, {"snd-maestro3",0}}, +- {{ "nm256_audio",0}, {"snd-nm256",0}}, +- {{ "rme96xx",0}, {"snd-rme9652",0}}, +- {{ "sonicvibes",0}, {"snd-sonicvibes",0}}, +- {{ "trident",0}, {"snd-trident",0}}, +- {{ "via82cxxx_audio",0}, {"snd-via82xx",0}}, +- {{ "ymfpci",0}, {"snd-ymfpci",0}}, +- {{ "sk98lin",0}, {"skge",0}} +-}; +- +-struct loaded_module { char *name; struct loaded_module *next; } *loaded_modules = NULL; +- +-/* compare module names, case insensitive and with -/_ */ +-int modcmp(char *m1, char *m2) +-{ +- if(!m1 || !m2) return 1; +- for(;;) +- { +- int c1 = tolower(*m1); +- int c2 = tolower(*m2); +- if(c1 == '_') c1 = '-'; +- if(c2 == '_') c2 = '-'; +- if(c1 != c2) return 1; +- if(!c1 || !c2) break; +- m1++; m2++; +- } +- return 0; +-} +- +-/* returns true if module already loaded */ +-int check_loaded(char *name) +-{ +- struct loaded_module *curr = loaded_modules; +- while(curr) +- { +- if(name && curr->name && !modcmp(name, curr->name)) return 1; +- curr = curr->next; +- } +- return 0; +-} +- +-/* Returns name of conflicting module, or NULL if no conflict */ +-char *check_conflict(char *name) +-{ +- int i; +- if(!name) return 0; +- for(i=0; i<(sizeof(conflicts)/sizeof(struct conflict)/CONFLICT_SET); i++) +- { +- int j; +- for(j=0; jnext = new; +- curr = curr->next; +- } +- name = strtok(buffer," "); +- if(!name) continue; +- curr->name = strdup(name); +- set_conflict(name); +- } +- fclose(f); +-} +- +-char *get_description(struct device *d) +-{ +- /* pci.ids lookup using the pci library, i.e. most likely /usr/share/misc/pci.ids */ +- static char devbuf[128]; +- +- memset(devbuf,0,sizeof(devbuf)); +- if(d) +- { +- static struct pci_access *pacc = NULL; +- int vendorid, deviceid; +- switch(d->bus) +- { +- case BUS_PCI: vendorid=((struct pciDevice *)d)->vendorId; +- deviceid=((struct pciDevice *)d)->deviceId; +- break; +- case BUS_USB: vendorid=((struct usbDevice *)d)->vendorId; +- deviceid=((struct usbDevice *)d)->deviceId; +- break; +- default: return d->desc; +- } +- if(!pacc) +- { +- if(!(pacc=pci_alloc())) return d->desc; +- pci_init(pacc); +- } +- if(vendorid>0 && deviceid>0 && +- pci_lookup_name(pacc, devbuf, sizeof(devbuf), +- PCI_LOOKUP_VENDOR | PCI_LOOKUP_DEVICE, +- vendorid, deviceid, 0, 0)) +- { +- devbuf[127]=0; +- return devbuf; +- } +- } +- return d->desc; +-} +- +-/* These need to be global, so we can kill them in case of problems */ +-pid_t wpid=0; +- +-int syntax(char *option) +-{ +- printf(VERSION); +- if(option) fprintf(stderr,"hwsetup: Unknown option '%s'\n\n",option); +- printf("Usage: hwsetup\n" +- " -v be verbose\n" +- " -p print rotating prompt\n" +- " -a ignore audio devices\n" +- " -s ignore scsi controllers\n" +- " -n probe only, don't configure anything.\n"); +- return option?1:0; +-} +- +-pid_t startwheel(void) /* Feedback while detecting hardware */ +-{ +- char v[]="Autoconfiguring devices... "; +- char r[]="/-\\|"; +- char *b="\b"; +- pid_t pid; +- if((pid=fork())>0) return pid; /* return Child PID to Master process */ +- else if(pid==0) +- { +- int i,j; +- /* Allow killing of process */ +- signal(SIGHUP,SIG_DFL); +- signal(SIGINT,SIG_DFL); +- signal(SIGTERM,SIG_DFL); +- write(2,v,sizeof(v)-1); +- for(i=j=0;;i++,j++) +- { +- if(j%8==7) write(2,"\033[42;32m \033[0m",13); /* a green space */ +- write(2,&r[i%4],1); write(2,b,1); +- usleep(40000); +- } +- exit(0); /* Exit child process */ +- } +- return 0; +-} +- +-int exists(char *filename) +-{ +- struct stat s; +- return !stat(filename,&s); +-} +- +-struct xinfo { +-char xserver[16]; +-char xmodule[16]; +-char xdesc[128]; +-char xopts[128]; +-}; +- +-struct xinfo *getxinfo(struct device *d) +-{ +- const char *xfree4="XFree86", *xorg="Xorg", *xvesa4="vesa"; +- const char *xpath=XPATH; +- static struct xinfo xi; +- int rescanned=0; +- memset(&xi,0,sizeof(struct xinfo)); +- if(d->desc) strcpy(xi.xdesc, get_description(d)); +- if(d->driver) +- { +- const char *server[]={"XF86_3DLabs", "XF86_Mach64", "XF86_Mach32", +- "XF86_Mach8", "XF86_AGX", "XF86_P9000", "XF86_S3V", "XF86_S3V", +- "XF86_S3", "XF86_W32", "XF86_8514", "XF86_I128", "XF86_SVGA", +- xfree4, xorg, NULL}; +- char *xpos; +- if(!strncasecmp(d->driver,"Card:",5)) /* RedHat Cards-DB */ +- { /* Kudzu "Cards" format */ +- FILE *cardsdb; +- char xfree3server[128]; +- memset(xfree3server,0,sizeof(xfree3server)); +- if((cardsdb=fopen(CARDSDB,"r"))!=NULL) +- { /* Try to find Server and Module in /usr/share/kudzu/Cards */ +- char buffer[1024]; +- char searchfor[128]; +- int found=0; +- memset(searchfor,0,sizeof(searchfor)); +- sscanf(&d->driver[5],"%127[^\r\n]",searchfor); +- while(!found && !feof(cardsdb) && fgets(buffer,1024,cardsdb)) +- { +- char sfound[128]; +- memset(sfound,0,sizeof(sfound)); +- if(strncasecmp(buffer,"NAME ",5) || +- (sscanf(&buffer[5],"%127[^\r\n]",sfound)!=1) || +- strcasecmp(sfound,searchfor)) continue; +- while(!feof(cardsdb) && fgets(buffer,1024,cardsdb)) +- { +- if(buffer[0]<32) break; /* End-of-line */ +- if(!strncasecmp(buffer,"SERVER ",7)) +- { +- char x[20]=""; +- if(sscanf(&buffer[7],"%19s",x)==1) +- { +- char xserver[32]; +- char fullpath[128]; +- char *xf[2]={"","XF86_"}; +- int i; +- for(i=0;i<2;i++) +- { +- sprintf(xserver,"%s%.24s",xf[i],x); +- sprintf(fullpath,"%.90s%.32s",xpath,xserver); +- if(exists(fullpath)) +- { +- strncpy(xfree3server,xserver,sizeof(xfree3server)); +- break; /* for */ +- } +- } +- } +- } +- else if(!strncasecmp(buffer,"DRIVER ",7)) +- { +- char xmodule[32]; +- char fullpath[128]; +- sscanf(&buffer[7],"%31s",xmodule); +- sprintf(fullpath,XMODPATH"%.31s_drv.o",xmodule); +- if(exists(fullpath)) +- { +- strncpy(xi.xmodule,xmodule,sizeof(xi.xmodule)); +- } +- } +- else if(!strncasecmp(buffer,"SEE ",4)&&rescanned<10) +- { /* rescan Cards-DB for other server */ +- fseek(cardsdb,0L,SEEK_SET); ++rescanned; +- memset(searchfor,0,sizeof(searchfor)); +- sscanf(&buffer[4],"%127[^\r\n]",searchfor); +- break; /* Continue with outer while() */ +- } +- } +- } +- fclose(cardsdb); +- } +- } +- /* Card not found in Cards database -> Try to read "Xorg(module)" from driver */ +- if(!*xi.xserver) +- { +- int i; +- for(i=0;server[i]!=NULL;i++) +- { +- if(strstr(d->driver,server[i])) +- { +- char fullpath[128]; +- sprintf(fullpath,"%.90s%.32s",xpath,server[i]); +- if(!exists(fullpath)) continue; +- strncpy(xi.xserver,server[i],sizeof(xi.xserver)); +- } +- } +- } +- if((xpos=strstr(d->driver,xorg))!=NULL) /* Check for Xorg */ +- { +- char xm[32]=""; +- if(sscanf(xpos,"Xorg(%30[^)])",xm)==1) strcpy(xi.xmodule,xm); +- } +- else if((xpos=strstr(d->driver,xfree4))!=NULL) /* Check for XFree 4 */ +- { +- char xm[32]=""; +- if(sscanf(xpos,"XFree86(%30[^)])",xm)==1) strcpy(xi.xmodule,xm); +- } +- } /* if -> driver */ +- /* Special options required? */ +- if(d->desc) +- { +- strncpy(xi.xdesc,get_description(d),128); +- xi.xdesc[127] = 0; /* 0-terminate (strncpy is not safe) */ +- } +- /* Fallback values: Guess xorg driver from pci.ids description (or vendor-string) */ +- if(!*xi.xserver) strcpy(xi.xserver,xorg); +- if(!*xi.xmodule) +- { +- if(*xi.xdesc) +- { /* first, the most common or "easy to guess" ones */ +- if(strcasestr(xi.xdesc,"Riva") && strcasestr(xi.xdesc,"128")) strcpy(xi.xmodule,"riva128"); +- else if(strcasestr(xi.xdesc,"NVidia")) strcpy(xi.xmodule,"nv"); +- else if(strcasestr(xi.xdesc,"ATI ")) +- { +- if(strcasestr(xi.xdesc,"R128")) strcpy(xi.xmodule,"r128"); +- else strcpy(xi.xmodule,"ati"); /* Will autoload "radeon" */ +- } +- else if(strcasestr(xi.xdesc,"Trident")) strcpy(xi.xmodule,"trident"); +- else if(strcasestr(xi.xdesc,"Rendition")) strcpy(xi.xmodule,"rendition"); +- else if(strcasestr(xi.xdesc,"Tseng")) strcpy(xi.xmodule,"tseng"); +- else if(strcasestr(xi.xdesc,"Intel")) +- { +- if(strcasestr(xi.xdesc,"128")) strcpy(xi.xmodule,"i128"); +- else if(strcasestr(xi.xdesc,"740")) strcpy(xi.xmodule,"i740"); +- else if(strcasestr(xi.xdesc,"810")||strcasestr(xi.xdesc,"82")||strcasestr(xi.xdesc,"830")||strcasestr(xi.xdesc,"9")) strcpy(xi.xmodule,"i810"); +- else strcpy(xi.xmodule,xvesa4); +- } +- else if(strcasestr(xi.xdesc,"Matrox")) strcpy(xi.xmodule,"mga"); +- else if(strcasestr(xi.xdesc,"Neomagic")) strcpy(xi.xmodule,"neomagic"); +- else if(strcasestr(xi.xdesc,"VMWare")) strcpy(xi.xmodule,"vmware"); +- else if(strcasestr(xi.xdesc,"Savage")) +- { +- if(strcasestr(xi.xdesc,"S3Virge")) strcpy(xi.xmodule,"s3virge"); +- else if(strcasestr(xi.xdesc,"S3")) strcpy(xi.xmodule,"s3"); +- else strcpy(xi.xmodule,"savage"); +- } +- else if(strcasestr(xi.xdesc,"Cyrix")) strcpy(xi.xmodule,"cyrix"); +- else if(strcasestr(xi.xdesc,"NSC ")) strcpy(xi.xmodule,"nsc"); +- else if(strcasestr(xi.xdesc,"SIS ")) +- { +- if(strcasestr(xi.xdesc,"USB")) strcpy(xi.xmodule,"sisusb"); +- else strcpy(xi.xmodule,"sis"); +- } +- else if(strcasestr(xi.xdesc,"Cirrus")) +- { +- if(strcasestr(xi.xdesc,"Alpine")) strcpy(xi.xmodule,"cirrus_alpine"); +- if(strcasestr(xi.xdesc,"Laguna")) strcpy(xi.xmodule,"cirrus_laguna"); +- else strcpy(xi.xmodule,"cirrus"); +- } +- else if(strcasestr(xi.xdesc,"Newport")) strcpy(xi.xmodule,"newport"); +- else if(strcasestr(xi.xdesc,"Siliconmotion")||strcasestr(xi.xdesc,"Silicon Motion")) strcpy(xi.xmodule,"siliconmotion"); +- else if(strcasestr(xi.xdesc,"Chips")) strcpy(xi.xmodule,"chips"); +- else if(strcasestr(xi.xdesc,"VIA ")) strcpy(xi.xmodule,"via"); +- } +- else strcpy(xi.xmodule,xvesa4); +- } +- if(*xi.xdesc) +- { +- /* Handle special cards that require special options */ +- if(strstr(xi.xdesc,"Trident")||strstr(xi.xdesc,"TGUI") +- ||strstr(xi.xdesc,"Cirrus")||strstr(xi.xdesc,"clgd")) +- { +- if(!strcmp(xi.xserver,xfree4)||!strcmp(xi.xserver,xorg)) +- strncpy(xi.xopts,"-depth 16",sizeof(xi.xopts)-1); +- else +- strncpy(xi.xopts,"-bpp 16",sizeof(xi.xopts)-1); +- } +- else if(strstr(xi.xdesc,"Savage 4")) /* S3 Inc.|Savage 4 */ +- { +- if(!strcmp(xi.xserver,xfree4)||!strcmp(xi.xserver,xorg)) +- strncpy(xi.xopts,"-depth 32",sizeof(xi.xopts)-1); +- else +- strncpy(xi.xopts,"-bpp 32",sizeof(xi.xopts)-1); +- } +- } +- return ξ +-} +- +-void hw_info(struct device *d) +-{ +- enum deviceClass class=d->type; +- enum deviceBus bus=d->bus; +- char *unknown="UNKNOWN"; +- char *desc; +- /* These used to be much easier when they were still arrays... */ +- char *classname=class==CLASS_UNSPEC?"UNSPEC": class==CLASS_OTHER?"OTHER": +- class==CLASS_NETWORK?"NETWORK":class==CLASS_SCSI?"SCSI": +- class==CLASS_VIDEO?"VIDEO": class==CLASS_AUDIO?"AUDIO": +- class==CLASS_MOUSE?"MOUSE": class==CLASS_MODEM?"MODEM": +- class==CLASS_CDROM?"CDROM": class==CLASS_TAPE?"TAPE": +- class==CLASS_FLOPPY?"FLOPPY": class==CLASS_SCANNER?"SCANNER": +- class==CLASS_HD?"HD": class==CLASS_RAID?"RAID": +- class==CLASS_PRINTER?"PRINTER":class==CLASS_CAPTURE?"CAPTURE": +- class==CLASS_USB?"USB": class==CLASS_MONITOR?"MONITOR": +- class==CLASS_KEYBOARD?"KEYBOARD":unknown; +- char *busname= bus==BUS_OTHER?"OTHER": bus==BUS_PCI? "PCI": +- bus==BUS_SBUS?"SBUS": bus==BUS_PSAUX?"PSAUX": +- bus==BUS_SERIAL?"SERIAL":bus==BUS_PARALLEL?"PARALLEL": +- bus==BUS_SCSI?"SCSI": bus==BUS_IDE?"IDE": +- bus==BUS_DDC?"DDC": bus==BUS_USB?"USB": +- bus==BUS_KEYBOARD?"KEYBOARD": +-#if defined(_i_wanna_build_this_crap_) +- bus==BUS_ISAPNP?"ISAPNP": +-#endif +- unknown; +- desc = get_description(d); +- printf( +- "---\n" +- "class: %s\n" +- "bus: %s\n" +- "device: %s\n" +- "driver: %s\n" +- "desc: %s\n",classname, busname, d->device?d->device:"(null)",d->driver, +- desc?desc:"(empty)"); +-} +- +-/* rename /dev/mouse -> /dev/mouse1, /dev/mouse1 -> /dev/mouse2 recursive */ +-int checkmoveup(char *filename, int oldnum) +-{ +- int newnum=oldnum+1; +- char srcname[64], dstname[64]; +- struct stat buf; +- sprintf(srcname,(oldnum>0)?"%.32s%d":"%.32s",filename,oldnum); +- if(stat(srcname,&buf)) return 0; /* File does not exist, OK. */ +- sprintf(dstname,"%.32s%d",filename,newnum); +- /* recursive if file exists, otherwise just rename it */ +- return (!stat(dstname,&buf) && checkmoveup(filename,newnum))?errno: +- rename(srcname,dstname); +-} +- +-int link_dev(struct device *d, char *target, int tnum, int verbose) +-{ +- const char devdir[]="/dev/"; +- if(d&&d->device) +- { +- char devname[64], dstname[64]; +- sprintf(devname,"%s%.32s",devdir,d->device); +- sprintf(dstname,"%s%.32s",devdir,target); +- if(checkmoveup(dstname, tnum)) return -1; /* Read-only FS?! */ +- if(tnum>0) sprintf(dstname,"%s%.32s%1d",devdir,target,tnum); +- if(verbose&VERBOSE_PRINT) printf("symlink(%.32s,%.32s)\n",devname,dstname); +- return symlink(devname,dstname); +- } +- return -1; +-} +- +-void segfault_handler(int dummy) +-{ +- signal(SIGSEGV,SIG_IGN); +- fprintf(stderr,"\nWARNING: Caught signal SEGV while executing modprobe.\n"); +- fflush(stderr); +-} +- +-void alarm_handler(int dummy) +-{ +- signal(SIGALRM,SIG_IGN); +- fprintf(stderr,"\nWARNING: Autodetection seems to hang,\n" +- "please check your computers BIOS settings.\n"); +- fflush(stderr); +- if(wpid) { kill(wpid,SIGTERM); usleep(2500000); kill(wpid,SIGKILL); wpid=0; } +- exit(1); /* exit program */ +-} +- +-int load_mod(char *m,int verbose) +-{ +- int pstatus,i; +- time_t now; +- pid_t mpid; +- char *cc; +- if((m==NULL)||(!strcmp("unknown",m))||(!strcmp("ignore",m))|| check_loaded(m)) return 0; +-#ifdef BLACKLIST +- for(i=0;iio) +- { +- if(verbose&VERBOSE_PRINT) printf("io: "); +- for(io_max=0;io_max<64&&(io[io_max]=d->io[io_max])!=-1;io_max++) +- if(verbose&VERBOSE_PRINT) printf("0x%x, ",(int)io[io_max]); +- if(verbose&VERBOSE_PRINT) printf("\n"); +- } +- if(d->irq) +- { +- if(verbose&VERBOSE_PRINT) printf("irq: "); +- for(irq_max=0;irq_max<16&&(irq[irq_max]=d->irq[irq_max])!=-1;irq_max++) +- if(verbose&VERBOSE_PRINT) printf("0x%d, ",(int)irq[irq_max]); +- if(verbose&VERBOSE_PRINT) printf("\n"); +- } +- if(d->dma) +- { +- if(verbose&VERBOSE_PRINT) printf("dma: "); +- for(dma_max=0;dma_max<8&&(dma[dma_max]=d->dma[dma_max])!=-1;dma_max++) +- if(verbose&VERBOSE_PRINT) printf("%d, ",(int)dma[dma_max]); +- if(verbose&VERBOSE_PRINT) printf("\n"); +- } +- /* no configuration possible (yet) */ +-#if 0 +- /* Hier müssten die freien Interrupts/IOs/DMAs untersucht werden, aber erst +- NACHDEM alle anderen Treiber geladen wurden, anschließend eine +- /etc/isapnp.conf mit den vermutlich richtigen Werten geschrieben und +- mit isapnp geladen werden. Abschließend: */ +- return modprobe(d->driver,free_io,free_irq,free_dma,verbose); +-#endif +- return(0); +-} +-#endif +- +-int writeconfig(char *name,struct device *d,int verbose) +-{ +- FILE *f,*k; +- const char *kconfig="/etc/sysconfig/knoppix"; +- char *desc; +- unlink(name); +- if((f=fopen(name,"w"))==NULL) +- { /* Read-only filesystem on /etc ?! */ +- fprintf(stderr,"Can't write to '%s': %s",name,strerror(errno)); +- return 1; +- } +- if((k=fopen(kconfig,"a"))==NULL) { fclose(f); return 1; } +- if(verbose&VERBOSE_PRINT) +- { +- printf("write config(%s)\n",name); +- printf("update config(%s)\n",kconfig); +- } +- desc = get_description(d); +- switch(d->type) +- { +- case CLASS_AUDIO: +- { +- if(desc) fprintf(f,"FULLNAME=\"%s\"\n",desc), +- fprintf(k,"SOUND_FULLNAME=\"%s\"\n",desc); +- if(d->driver) +- { +- char *cc=check_conflict(d->driver); +- fprintf(f,"DRIVER=\"%s\"\n",cc?cc:d->driver), +- fprintf(k,"SOUND_DRIVER=\"%s\"\n",cc?cc:d->driver); +- } +- }; break; +- case CLASS_MOUSE: +- { +- char *t1,*t2; +- if(d->bus==BUS_PSAUX) { t1="ps2"; t2="PS/2"; } +- else if(d->bus==BUS_USB) { t1="imps2"; t2="IMPS/2"; } +- else { t1="ms"; t2="Microsoft"; } +- fprintf(f,"MOUSETYPE=\"%s\"\nXMOUSETYPE=\"%s\"\n",t1,t2); +- if(desc) fprintf(f,"FULLNAME=\"%s\"\n",desc), +- fprintf(k,"MOUSE_FULLNAME=\"%s\"\n",desc); +- if(d->device) fprintf(f,"DEVICE=\"/dev/%s\"\n",d->device), +- fprintf(k,"MOUSE_DEVICE=\"/dev/%s\"\n",d->device); +- }; break; +- case CLASS_NETWORK: +- { +- if(desc) fprintf(f,"FULLNAME=\"%s\"\n",desc), +- fprintf(k,"NETCARD_FULLNAME=\"%s\"\n",desc); +- if(d->driver) fprintf(f,"DRIVER=\"%s\"\n",d->driver), +- fprintf(k,"NETCARD_DRIVER=\"%s\"\n",d->driver); +- }; break; +- case CLASS_VIDEO: +- { +- const char *xserver="XSERVER=\"%s\"\n"; +- const char *xmodule="XMODULE=\"%s\"\n"; +- const char *xopts="XOPTIONS=\"%s\"\n"; +- const char *xdesc="XDESC=\"%s\"\n"; +- struct xinfo *xi=getxinfo(d); +- if(xi) +- { +- if(*xi->xserver) +- { fprintf(f,xserver,xi->xserver); fprintf(k,xserver,xi->xserver); } +- if(*xi->xmodule) +- { fprintf(f,xmodule,xi->xmodule); fprintf(k,xmodule,xi->xmodule); } +- if(*xi->xopts) +- { fprintf(f,xopts,xi->xopts); fprintf(k,xopts,xi->xopts); } +- if(*xi->xdesc) +- { fprintf(f,xdesc,xi->xdesc); fprintf(k,xdesc,xi->xdesc); } +- } +- }; break; +- case CLASS_FLOPPY: +- { +- if(desc) fprintf(f,"FULLNAME='%s'\n",desc), +- fprintf(k,"FLOPPY_FULLNAME='%s'\n",desc); +- if(d->device) fprintf(f,"DEVICE=\"/dev/%s\"\n",d->device), +- fprintf(k,"FLOPPY_DEVICE=\"/dev/%s\"\n",d->device); +- if(d->driver) fprintf(f,"DRIVER=\"%s\"\n",d->driver), +- fprintf(k,"FLOPPY_DRIVER=\"%s\"\n",d->driver); +- }; break; +- default: break; +- } +- fclose(f); fclose(k); +- return 0; +-} +- -int hw_setup(enum deviceClass dc, int verbose, int probeonly, int skip) -+int hw_setup(enum deviceClass dc, int verbose, int probeonly, int skip, int fastprobe) - { - int i,mouse=0,cdrom=0,modem=0,scanner=0; -+ int probeopt=fastprobe?PROBE_SAFE:PROBE_ALL; - struct device **currentDevs, *d, *serialmouse=NULL, *usbmouse=NULL; - if(verbose&VERBOSE_PROMPT) wpid=startwheel(); +-{ +- int i,mouse=0,cdrom=0,modem=0,scanner=0; +- struct device **currentDevs, *d, *serialmouse=NULL, *usbmouse=NULL; +- if(verbose&VERBOSE_PROMPT) wpid=startwheel(); - currentDevs=probeDevices(dc,BUS_UNSPEC,PROBE_ALL); -+ currentDevs=probeDevices(dc,BUS_UNSPEC,probeopt); - if(verbose&VERBOSE_PROMPT&&wpid>0) { kill(wpid,SIGTERM); wpid=0; usleep(160000); write(2,"\033[0m Done.\n",11); } - if(currentDevs==NULL) return -1; - check_proc_modules(); /* Get currently loaded module list */ -@@ -794,7 +796,7 @@ - - int main(int argc, char **argv) - { +- if(verbose&VERBOSE_PROMPT&&wpid>0) { kill(wpid,SIGTERM); wpid=0; usleep(160000); write(2,"\033[0m Done.\n",11); } +- if(currentDevs==NULL) return -1; +- check_proc_modules(); /* Get currently loaded module list */ +- for(i=0;(d=currentDevs[i]);i++) +- { +- if(verbose&VERBOSE_PRINT) hw_info(d); +- if(!probeonly) +- { +-#if defined(_i_wanna_build_this_crap_) +- if(d->bus==BUS_ISAPNP&&configure_isapnp(d,verbose)) continue; +-#endif +- switch(d->type) +- { +- case CLASS_MOUSE: /* Choose serial over PS2/USB mouse IF present */ +- /* For some reason, PS/2 ALWAYS detects a mouse */ +- if(d->bus==BUS_SERIAL) +- { mouse=0; serialmouse=d; } +- else if(d->bus==BUS_USB) /* Need usbdevfs for */ +- { mouse=0; usbmouse=d; /* this to work */ +- load_mod(d->driver,verbose); } +- if(!mouse) +- writeconfig("/etc/sysconfig/mouse",d,verbose); +- link_dev(d,"mouse",mouse++,verbose); +- break; +- case CLASS_CDROM: if(d->bus==BUS_USB) load_mod(d->driver,verbose); +- link_dev(d,"cdrom", cdrom++,verbose); break; +- case CLASS_MODEM: if(d->bus==BUS_USB) load_mod(d->driver,verbose); +- link_dev(d,"modem", modem++,verbose); break; +- case CLASS_SCANNER: if(d->bus==BUS_USB) load_mod(d->driver,verbose); +- link_dev(d,"scanner",scanner++,verbose); break; +- case CLASS_VIDEO: writeconfig("/etc/sysconfig/xserver",d,verbose); +- break; +- case CLASS_AUDIO: if(skip&SKIP_AUDIO) break; +- writeconfig("/etc/sysconfig/sound",d,verbose); +- load_mod(d->driver,verbose); break; +- case CLASS_NETWORK: writeconfig("/etc/sysconfig/netcard",d,verbose); +- load_mod(d->driver,verbose); break; +- case CLASS_FLOPPY: writeconfig("/etc/sysconfig/floppy",d,verbose); +- load_mod(d->driver,verbose); break; +- case CLASS_KEYBOARD:if(d->bus==BUS_USB) load_mod(d->driver,verbose); +- break; +- case CLASS_CAPTURE: /* Just load the module for these */ +- case CLASS_SCSI: if(skip&SKIP_SCSI) break; +- case CLASS_OTHER: /* Yet unsupported or "guessed" devices in kudzu. Module probe may hang here. */ +- case CLASS_RAID: load_mod(d->driver,verbose); break; +- case CLASS_SOCKET: /* yenta_socket or similar is handled by knoppix-autoconfig */ +- default: /* do nothing */ break; +- } +- } +- } +- return 0; +-} +- +-int main(int argc, char **argv) +-{ - int i, verbose=0, probeonly=0, skip=0; -+ int i, verbose=0, probeonly=0, skip=0, fast=0; - enum deviceClass dc=CLASS_UNSPEC; - for(i=1;i * -+\****************************************************************************/ -+ -+/* Needed for strcasestr */ -+#ifndef _GNU_SOURCE -+#define _GNU_SOURCE 1 -+#endif -+ -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#undef _i_wanna_build_this_crap_ -+/* #define _i_wanna_build_this_crap_ 1 */ /* Necessary for ISAPNP */ -+#include "kudzu.h" -+#if defined(_i_wanna_build_this_crap_) -+#include "isapnp.h" -+#endif -+ -+#define VERSION "HWSETUP 1.2, an automatic hardware configuration tool\n" \ -+ "(C) 2006 Klaus Knopper \n\n" -+ -+/* Note: These are for Xfree 4, not Xorg. */ -+#define CARDSDB "/usr/share/hwdata/Cards" -+#define XPATH "/usr/X11R6/bin/" -+#define XMODPATH "/usr/X11R6/lib/modules/drivers/" -+ -+#define VERBOSE_PRINT 1 -+#define VERBOSE_PROMPT 2 -+ -+#define SKIP_AUDIO 1 -+#define SKIP_SCSI 2 -+ -+#define MAX_TIME 180 /* Maximum of seconds to run, total */ -+#define MAX_TIME_MODULE 4 /* Maximum time in seconds to wait until a module */ -+ /* is successfully loaded before continuing */ -+ -+#ifdef BLACKLIST -+/* Do not, under any circumstances, load these modules automatically, */ -+/* even if in pcitable. (libkudzu may ignore this, and the KNOPPIX */ -+/* autoconfig scripts may probe them, too) */ -+char *blacklist[200][200] = -+{ "apm","agpgart","yenta_socket","i82092","i82365","tcic", -+ "pcmcia_core","ds","ohci1394","hisax", "hisax_fcpcipnp", -+ "hisax_isac","hisax_st5481", -+ /* Winmodems, unusable, can block sound slot */ -+ "snd-atiixp-modem", "snd-intel8x0m","snd-via82xx-modem" -+}; -+ -+int blacklistsize = 13; -+void gen_blacklist(){ -+ int n = 13; -+ int size = 0; -+ char *comment; -+ char module[1024]; -+ FILE *stream; -+ -+ if((stream = fopen ("/usr/share/hwdata/blacklist", "r")) != (FILE *)0) { -+ while((fgets(module, 1023, stream)) != (char *)0 ) { -+ -+ comment = strchr(module, '#'); -+ if (comment != 0) *comment = '\0'; -+ comment = strchr(module, '\n'); -+ if (comment != 0) *comment = '\0'; -+ size = strlen(module); -+ if (size < 2) continue; -+ strcat (module , " \0"); -+ strcpy(blacklist[n] , module); -+ n++; -+ if ( n == 200 ) break; -+ //printf(module); -+ } -+ blacklistsize = n; -+ } -+} -+#endif -+ -+/* If a conflicting module in a row is already loaded, the new module will not be probed anymore */ -+#define CONFLICT_SET 2 -+struct conflict { char *name; int loaded; } conflicts [][CONFLICT_SET] = -+{ -+ {{ "ad1848",0}, {"snd-nm256",0}}, -+ {{ "ali5455",0}, {"intel8x0",0}}, -+ {{ "cmpci",0}, {"snd-cmipci",0}}, -+ {{ "cs46xx",0}, {"snd-cs46xx",0}}, -+ {{ "cs4281",0}, {"snd-cs4281",0}}, -+ {{ "emu10k1",0}, {"snd-emu10k1",0}}, -+ {{ "es1370",0}, {"snd-ens1370",0}}, -+ {{ "es1371",0}, {"snd-ens1371",0}}, -+ {{ "esssolo1",0}, {"snd-es1938",0}}, -+ {{ "forte",0}, {"snd-fm801",0}}, -+ {{ "i810_audio",0}, {"snd-intel8x0",0}}, -+ {{ "maestro",0}, {"snd-es1960",0}}, -+ {{ "maestro3",0}, {"snd-maestro3",0}}, -+ {{ "nm256_audio",0}, {"snd-nm256",0}}, -+ {{ "rme96xx",0}, {"snd-rme9652",0}}, -+ {{ "sonicvibes",0}, {"snd-sonicvibes",0}}, -+ {{ "trident",0}, {"snd-trident",0}}, -+ {{ "via82cxxx_audio",0}, {"snd-via82xx",0}}, -+ {{ "ymfpci",0}, {"snd-ymfpci",0}}, -+ {{ "sk98lin",0}, {"skge",0}} -+}; -+ -+struct loaded_module { char *name; struct loaded_module *next; } *loaded_modules = NULL; -+ -+/* compare module names, case insensitive and with -/_ */ -+int modcmp(char *m1, char *m2) -+{ -+ if(!m1 || !m2) return 1; -+ for(;;) -+ { -+ int c1 = tolower(*m1); -+ int c2 = tolower(*m2); -+ if(c1 == '_') c1 = '-'; -+ if(c2 == '_') c2 = '-'; -+ if(c1 != c2) return 1; -+ if(!c1 || !c2) break; -+ m1++; m2++; -+ } -+ return 0; -+} -+ -+/* returns true if module already loaded */ -+int check_loaded(char *name) -+{ -+ struct loaded_module *curr = loaded_modules; -+ while(curr) -+ { -+ if(name && curr->name && !modcmp(name, curr->name)) return 1; -+ curr = curr->next; -+ } -+ return 0; -+} -+ -+/* Returns name of conflicting module, or NULL if no conflict */ -+char *check_conflict(char *name) -+{ -+ int i; -+ if(!name) return 0; -+ for(i=0; i<(sizeof(conflicts)/sizeof(struct conflict)/CONFLICT_SET); i++) -+ { -+ int j; -+ for(j=0; jnext = new; -+ curr = curr->next; -+ } -+ name = strtok(buffer," "); -+ if(!name) continue; -+ curr->name = strdup(name); -+ set_conflict(name); -+ } -+ fclose(f); -+} -+ -+char *get_description(struct device *d) -+{ -+ /* pci.ids lookup using the pci library, i.e. most likely /usr/share/misc/pci.ids */ -+ static char devbuf[128]; -+ -+ memset(devbuf,0,sizeof(devbuf)); -+ if(d) -+ { -+ static struct pci_access *pacc = NULL; -+ int vendorid, deviceid; -+ switch(d->bus) -+ { -+ case BUS_PCI: vendorid=((struct pciDevice *)d)->vendorId; -+ deviceid=((struct pciDevice *)d)->deviceId; -+ break; -+ case BUS_USB: vendorid=((struct usbDevice *)d)->vendorId; -+ deviceid=((struct usbDevice *)d)->deviceId; -+ break; -+ default: return d->desc; -+ } -+ if(!pacc) -+ { -+ if(!(pacc=pci_alloc())) return d->desc; -+ pci_init(pacc); -+ } -+ if(vendorid>0 && deviceid>0 && -+ pci_lookup_name(pacc, devbuf, sizeof(devbuf), -+ PCI_LOOKUP_VENDOR | PCI_LOOKUP_DEVICE, -+ vendorid, deviceid, 0, 0)) -+ { -+ devbuf[127]=0; -+ return devbuf; -+ } -+ } -+ return d->desc; -+} -+ -+/* These need to be global, so we can kill them in case of problems */ -+pid_t wpid=0; -+ -+int syntax(char *option) -+{ -+ printf(VERSION); -+ if(option) fprintf(stderr,"hwsetup: Unknown option '%s'\n\n",option); -+ printf("Usage: hwsetup\n" -+ " -v be verbose\n" -+ " -p print rotating prompt\n" -+ " -a ignore audio devices\n" -+ " -s ignore scsi controllers\n" -+ " -n probe only, don't configure anything.\n"); -+ return option?1:0; -+} -+ -+pid_t startwheel(void) /* Feedback while detecting hardware */ -+{ -+ char v[]="Autoconfiguring devices... "; -+ char r[]="/-\\|"; -+ char *b="\b"; -+ pid_t pid; -+ if((pid=fork())>0) return pid; /* return Child PID to Master process */ -+ else if(pid==0) -+ { -+ int i,j; -+ /* Allow killing of process */ -+ signal(SIGHUP,SIG_DFL); -+ signal(SIGINT,SIG_DFL); -+ signal(SIGTERM,SIG_DFL); -+ write(2,v,sizeof(v)-1); -+ for(i=j=0;;i++,j++) -+ { -+ if(j%8==7) write(2,"\033[42;32m \033[0m",13); /* a green space */ -+ write(2,&r[i%4],1); write(2,b,1); -+ usleep(40000); -+ } -+ exit(0); /* Exit child process */ -+ } -+ return 0; -+} -+ -+int exists(char *filename) -+{ -+ struct stat s; -+ return !stat(filename,&s); -+} -+ -+struct xinfo { -+char xserver[16]; -+char xmodule[16]; -+char xdesc[128]; -+char xopts[128]; -+}; -+ -+struct xinfo *getxinfo(struct device *d) -+{ -+ const char *xfree4="XFree86", *xorg="Xorg", *xvesa4="vesa"; -+ const char *xpath=XPATH; -+ static struct xinfo xi; -+ int rescanned=0; -+ memset(&xi,0,sizeof(struct xinfo)); -+ if(d->desc) strcpy(xi.xdesc, get_description(d)); -+ if(d->driver) -+ { -+ const char *server[]={"XF86_3DLabs", "XF86_Mach64", "XF86_Mach32", -+ "XF86_Mach8", "XF86_AGX", "XF86_P9000", "XF86_S3V", "XF86_S3V", -+ "XF86_S3", "XF86_W32", "XF86_8514", "XF86_I128", "XF86_SVGA", -+ xfree4, xorg, NULL}; -+ char *xpos; -+ if(!strncasecmp(d->driver,"Card:",5)) /* RedHat Cards-DB */ -+ { /* Kudzu "Cards" format */ -+ FILE *cardsdb; -+ char xfree3server[128]; -+ memset(xfree3server,0,sizeof(xfree3server)); -+ if((cardsdb=fopen(CARDSDB,"r"))!=NULL) -+ { /* Try to find Server and Module in /usr/share/kudzu/Cards */ -+ char buffer[1024]; -+ char searchfor[128]; -+ int found=0; -+ memset(searchfor,0,sizeof(searchfor)); -+ sscanf(&d->driver[5],"%127[^\r\n]",searchfor); -+ while(!found && !feof(cardsdb) && fgets(buffer,1024,cardsdb)) -+ { -+ char sfound[128]; -+ memset(sfound,0,sizeof(sfound)); -+ if(strncasecmp(buffer,"NAME ",5) || -+ (sscanf(&buffer[5],"%127[^\r\n]",sfound)!=1) || -+ strcasecmp(sfound,searchfor)) continue; -+ while(!feof(cardsdb) && fgets(buffer,1024,cardsdb)) -+ { -+ if(buffer[0]<32) break; /* End-of-line */ -+ if(!strncasecmp(buffer,"SERVER ",7)) -+ { -+ char x[20]=""; -+ if(sscanf(&buffer[7],"%19s",x)==1) -+ { -+ char xserver[32]; -+ char fullpath[128]; -+ char *xf[2]={"","XF86_"}; -+ int i; -+ for(i=0;i<2;i++) -+ { -+ sprintf(xserver,"%s%.24s",xf[i],x); -+ sprintf(fullpath,"%.90s%.32s",xpath,xserver); -+ if(exists(fullpath)) -+ { -+ strncpy(xfree3server,xserver,sizeof(xfree3server)); -+ break; /* for */ -+ } -+ } -+ } -+ } -+ else if(!strncasecmp(buffer,"DRIVER ",7)) -+ { -+ char xmodule[32]; -+ char fullpath[128]; -+ sscanf(&buffer[7],"%31s",xmodule); -+ sprintf(fullpath,XMODPATH"%.31s_drv.o",xmodule); -+ if(exists(fullpath)) -+ { -+ strncpy(xi.xmodule,xmodule,sizeof(xi.xmodule)); -+ } -+ } -+ else if(!strncasecmp(buffer,"SEE ",4)&&rescanned<10) -+ { /* rescan Cards-DB for other server */ -+ fseek(cardsdb,0L,SEEK_SET); ++rescanned; -+ memset(searchfor,0,sizeof(searchfor)); -+ sscanf(&buffer[4],"%127[^\r\n]",searchfor); -+ break; /* Continue with outer while() */ -+ } -+ } -+ } -+ fclose(cardsdb); -+ } -+ } -+ /* Card not found in Cards database -> Try to read "Xorg(module)" from driver */ -+ if(!*xi.xserver) -+ { -+ int i; -+ for(i=0;server[i]!=NULL;i++) -+ { -+ if(strstr(d->driver,server[i])) -+ { -+ char fullpath[128]; -+ sprintf(fullpath,"%.90s%.32s",xpath,server[i]); -+ if(!exists(fullpath)) continue; -+ strncpy(xi.xserver,server[i],sizeof(xi.xserver)); -+ } -+ } -+ } -+ if((xpos=strstr(d->driver,xorg))!=NULL) /* Check for Xorg */ -+ { -+ char xm[32]=""; -+ if(sscanf(xpos,"Xorg(%30[^)])",xm)==1) strcpy(xi.xmodule,xm); -+ } -+ else if((xpos=strstr(d->driver,xfree4))!=NULL) /* Check for XFree 4 */ -+ { -+ char xm[32]=""; -+ if(sscanf(xpos,"XFree86(%30[^)])",xm)==1) strcpy(xi.xmodule,xm); -+ } -+ } /* if -> driver */ -+ /* Special options required? */ -+ if(d->desc) -+ { -+ strncpy(xi.xdesc,get_description(d),128); -+ xi.xdesc[127] = 0; /* 0-terminate (strncpy is not safe) */ -+ } -+ /* Fallback values: Guess xorg driver from pci.ids description (or vendor-string) */ -+ if(!*xi.xserver) strcpy(xi.xserver,xorg); -+ if(!*xi.xmodule) -+ { -+ if(*xi.xdesc) -+ { /* first, the most common or "easy to guess" ones */ -+ if(strcasestr(xi.xdesc,"Riva") && strcasestr(xi.xdesc,"128")) strcpy(xi.xmodule,"riva128"); -+ else if(strcasestr(xi.xdesc,"NVidia")) strcpy(xi.xmodule,"nv"); -+ else if(strcasestr(xi.xdesc,"ATI ")) -+ { -+ if(strcasestr(xi.xdesc,"R128")) strcpy(xi.xmodule,"r128"); -+ else strcpy(xi.xmodule,"ati"); /* Will autoload "radeon" */ -+ } -+ else if(strcasestr(xi.xdesc,"Trident")) strcpy(xi.xmodule,"trident"); -+ else if(strcasestr(xi.xdesc,"Rendition")) strcpy(xi.xmodule,"rendition"); -+ else if(strcasestr(xi.xdesc,"Tseng")) strcpy(xi.xmodule,"tseng"); -+ else if(strcasestr(xi.xdesc,"Intel")) -+ { -+ if(strcasestr(xi.xdesc,"128")) strcpy(xi.xmodule,"i128"); -+ else if(strcasestr(xi.xdesc,"740")) strcpy(xi.xmodule,"i740"); -+ else if(strcasestr(xi.xdesc,"810")||strcasestr(xi.xdesc,"82")||strcasestr(xi.xdesc,"830")||strcasestr(xi.xdesc,"9")) strcpy(xi.xmodule,"i810"); -+ else strcpy(xi.xmodule,xvesa4); -+ } -+ else if(strcasestr(xi.xdesc,"Matrox")) strcpy(xi.xmodule,"mga"); -+ else if(strcasestr(xi.xdesc,"Neomagic")) strcpy(xi.xmodule,"neomagic"); -+ else if(strcasestr(xi.xdesc,"VMWare")) strcpy(xi.xmodule,"vmware"); -+ else if(strcasestr(xi.xdesc,"Savage")) -+ { -+ if(strcasestr(xi.xdesc,"S3Virge")) strcpy(xi.xmodule,"s3virge"); -+ else if(strcasestr(xi.xdesc,"S3")) strcpy(xi.xmodule,"s3"); -+ else strcpy(xi.xmodule,"savage"); -+ } -+ else if(strcasestr(xi.xdesc,"Cyrix")) strcpy(xi.xmodule,"cyrix"); -+ else if(strcasestr(xi.xdesc,"NSC ")) strcpy(xi.xmodule,"nsc"); -+ else if(strcasestr(xi.xdesc,"SIS ")) -+ { -+ if(strcasestr(xi.xdesc,"USB")) strcpy(xi.xmodule,"sisusb"); -+ else strcpy(xi.xmodule,"sis"); -+ } -+ else if(strcasestr(xi.xdesc,"Cirrus")) -+ { -+ if(strcasestr(xi.xdesc,"Alpine")) strcpy(xi.xmodule,"cirrus_alpine"); -+ if(strcasestr(xi.xdesc,"Laguna")) strcpy(xi.xmodule,"cirrus_laguna"); -+ else strcpy(xi.xmodule,"cirrus"); -+ } -+ else if(strcasestr(xi.xdesc,"Newport")) strcpy(xi.xmodule,"newport"); -+ else if(strcasestr(xi.xdesc,"Siliconmotion")||strcasestr(xi.xdesc,"Silicon Motion")) strcpy(xi.xmodule,"siliconmotion"); -+ else if(strcasestr(xi.xdesc,"Chips")) strcpy(xi.xmodule,"chips"); -+ else if(strcasestr(xi.xdesc,"VIA ")) strcpy(xi.xmodule,"via"); -+ } -+ else strcpy(xi.xmodule,xvesa4); -+ } -+ if(*xi.xdesc) -+ { -+ /* Handle special cards that require special options */ -+ if(strstr(xi.xdesc,"Trident")||strstr(xi.xdesc,"TGUI") -+ ||strstr(xi.xdesc,"Cirrus")||strstr(xi.xdesc,"clgd")) -+ { -+ if(!strcmp(xi.xserver,xfree4)||!strcmp(xi.xserver,xorg)) -+ strncpy(xi.xopts,"-depth 16",sizeof(xi.xopts)-1); -+ else -+ strncpy(xi.xopts,"-bpp 16",sizeof(xi.xopts)-1); -+ } -+ else if(strstr(xi.xdesc,"Savage 4")) /* S3 Inc.|Savage 4 */ -+ { -+ if(!strcmp(xi.xserver,xfree4)||!strcmp(xi.xserver,xorg)) -+ strncpy(xi.xopts,"-depth 32",sizeof(xi.xopts)-1); -+ else -+ strncpy(xi.xopts,"-bpp 32",sizeof(xi.xopts)-1); -+ } -+ } -+ return ξ -+} -+ -+void hw_info(struct device *d) -+{ -+ enum deviceClass class=d->type; -+ enum deviceBus bus=d->bus; -+ char *unknown="UNKNOWN"; -+ char *desc; -+ /* These used to be much easier when they were still arrays... */ -+ char *classname=class==CLASS_UNSPEC?"UNSPEC": class==CLASS_OTHER?"OTHER": -+ class==CLASS_NETWORK?"NETWORK":class==CLASS_SCSI?"SCSI": -+ class==CLASS_VIDEO?"VIDEO": class==CLASS_AUDIO?"AUDIO": -+ class==CLASS_MOUSE?"MOUSE": class==CLASS_MODEM?"MODEM": -+ class==CLASS_CDROM?"CDROM": class==CLASS_TAPE?"TAPE": -+ class==CLASS_FLOPPY?"FLOPPY": class==CLASS_SCANNER?"SCANNER": -+ class==CLASS_HD?"HD": class==CLASS_RAID?"RAID": -+ class==CLASS_PRINTER?"PRINTER":class==CLASS_CAPTURE?"CAPTURE": -+ class==CLASS_USB?"USB": class==CLASS_MONITOR?"MONITOR": -+ class==CLASS_KEYBOARD?"KEYBOARD":unknown; -+ char *busname= bus==BUS_OTHER?"OTHER": bus==BUS_PCI? "PCI": -+ bus==BUS_SBUS?"SBUS": bus==BUS_PSAUX?"PSAUX": -+ bus==BUS_SERIAL?"SERIAL":bus==BUS_PARALLEL?"PARALLEL": -+ bus==BUS_SCSI?"SCSI": bus==BUS_IDE?"IDE": -+ bus==BUS_DDC?"DDC": bus==BUS_USB?"USB": -+ bus==BUS_KEYBOARD?"KEYBOARD": -+#if defined(_i_wanna_build_this_crap_) -+ bus==BUS_ISAPNP?"ISAPNP": -+#endif -+ unknown; -+ desc = get_description(d); -+ printf( -+ "---\n" -+ "class: %s\n" -+ "bus: %s\n" -+ "device: %s\n" -+ "driver: %s\n" -+ "desc: %s\n",classname, busname, d->device?d->device:"(null)",d->driver, -+ desc?desc:"(empty)"); -+} -+ -+/* rename /dev/mouse -> /dev/mouse1, /dev/mouse1 -> /dev/mouse2 recursive */ -+int checkmoveup(char *filename, int oldnum) -+{ -+ int newnum=oldnum+1; -+ char srcname[64], dstname[64]; -+ struct stat buf; -+ sprintf(srcname,(oldnum>0)?"%.32s%d":"%.32s",filename,oldnum); -+ if(stat(srcname,&buf)) return 0; /* File does not exist, OK. */ -+ sprintf(dstname,"%.32s%d",filename,newnum); -+ /* recursive if file exists, otherwise just rename it */ -+ return (!stat(dstname,&buf) && checkmoveup(filename,newnum))?errno: -+ rename(srcname,dstname); -+} -+ -+int link_dev(struct device *d, char *target, int tnum, int verbose) -+{ -+ const char devdir[]="/dev/"; -+ if(d&&d->device) -+ { -+ char devname[64], dstname[64]; -+ sprintf(devname,"%s%.32s",devdir,d->device); -+ sprintf(dstname,"%s%.32s",devdir,target); -+ if(checkmoveup(dstname, tnum)) return -1; /* Read-only FS?! */ -+ if(tnum>0) sprintf(dstname,"%s%.32s%1d",devdir,target,tnum); -+ if(verbose&VERBOSE_PRINT) printf("symlink(%.32s,%.32s)\n",devname,dstname); -+ return symlink(devname,dstname); -+ } -+ return -1; -+} -+ -+void segfault_handler(int dummy) -+{ -+ signal(SIGSEGV,SIG_IGN); -+ fprintf(stderr,"\nWARNING: Caught signal SEGV while executing modprobe.\n"); -+ fflush(stderr); -+} -+ -+void alarm_handler(int dummy) -+{ -+ signal(SIGALRM,SIG_IGN); -+ fprintf(stderr,"\nWARNING: Autodetection seems to hang,\n" -+ "please check your computers BIOS settings.\n"); -+ fflush(stderr); -+ if(wpid) { kill(wpid,SIGTERM); usleep(2500000); kill(wpid,SIGKILL); wpid=0; } -+ exit(1); /* exit program */ -+} -+ -+int load_mod(char *m,int verbose) -+{ -+ int pstatus,i; -+ time_t now; -+ pid_t mpid; -+ char *cc; -+ if((m==NULL)||(!strcmp("unknown",m))||(!strcmp("ignore",m))|| check_loaded(m)) return 0; -+#ifdef BLACKLIST -+ for(i=0;iio) -+ { -+ if(verbose&VERBOSE_PRINT) printf("io: "); -+ for(io_max=0;io_max<64&&(io[io_max]=d->io[io_max])!=-1;io_max++) -+ if(verbose&VERBOSE_PRINT) printf("0x%x, ",(int)io[io_max]); -+ if(verbose&VERBOSE_PRINT) printf("\n"); -+ } -+ if(d->irq) -+ { -+ if(verbose&VERBOSE_PRINT) printf("irq: "); -+ for(irq_max=0;irq_max<16&&(irq[irq_max]=d->irq[irq_max])!=-1;irq_max++) -+ if(verbose&VERBOSE_PRINT) printf("0x%d, ",(int)irq[irq_max]); -+ if(verbose&VERBOSE_PRINT) printf("\n"); -+ } -+ if(d->dma) -+ { -+ if(verbose&VERBOSE_PRINT) printf("dma: "); -+ for(dma_max=0;dma_max<8&&(dma[dma_max]=d->dma[dma_max])!=-1;dma_max++) -+ if(verbose&VERBOSE_PRINT) printf("%d, ",(int)dma[dma_max]); -+ if(verbose&VERBOSE_PRINT) printf("\n"); -+ } -+ /* no configuration possible (yet) */ -+#if 0 -+ /* Hier müssten die freien Interrupts/IOs/DMAs untersucht werden, aber erst -+ NACHDEM alle anderen Treiber geladen wurden, anschließend eine -+ /etc/isapnp.conf mit den vermutlich richtigen Werten geschrieben und -+ mit isapnp geladen werden. Abschließend: */ -+ return modprobe(d->driver,free_io,free_irq,free_dma,verbose); -+#endif -+ return(0); -+} -+#endif -+ -+int writeconfig(char *name,struct device *d,int verbose) -+{ -+ FILE *f,*k; -+ const char *kconfig="/etc/sysconfig/knoppix"; -+ char *desc; -+ unlink(name); -+ if((f=fopen(name,"w"))==NULL) -+ { /* Read-only filesystem on /etc ?! */ -+ fprintf(stderr,"Can't write to '%s': %s",name,strerror(errno)); -+ return 1; -+ } -+ if((k=fopen(kconfig,"a"))==NULL) { fclose(f); return 1; } -+ if(verbose&VERBOSE_PRINT) -+ { -+ printf("write config(%s)\n",name); -+ printf("update config(%s)\n",kconfig); -+ } -+ desc = get_description(d); -+ switch(d->type) -+ { -+ case CLASS_AUDIO: -+ { -+ if(desc) fprintf(f,"FULLNAME=\"%s\"\n",desc), -+ fprintf(k,"SOUND_FULLNAME=\"%s\"\n",desc); -+ if(d->driver) -+ { -+ char *cc=check_conflict(d->driver); -+ fprintf(f,"DRIVER=\"%s\"\n",cc?cc:d->driver), -+ fprintf(k,"SOUND_DRIVER=\"%s\"\n",cc?cc:d->driver); -+ } -+ }; break; -+ case CLASS_MOUSE: -+ { -+ char *t1,*t2; -+ if(d->bus==BUS_PSAUX) { t1="ps2"; t2="PS/2"; } -+ else if(d->bus==BUS_USB) { t1="imps2"; t2="IMPS/2"; } -+ else { t1="ms"; t2="Microsoft"; } -+ fprintf(f,"MOUSETYPE=\"%s\"\nXMOUSETYPE=\"%s\"\n",t1,t2); -+ if(desc) fprintf(f,"FULLNAME=\"%s\"\n",desc), -+ fprintf(k,"MOUSE_FULLNAME=\"%s\"\n",desc); -+ if(d->device) fprintf(f,"DEVICE=\"/dev/%s\"\n",d->device), -+ fprintf(k,"MOUSE_DEVICE=\"/dev/%s\"\n",d->device); -+ }; break; -+ case CLASS_NETWORK: -+ { -+ if(desc) fprintf(f,"FULLNAME=\"%s\"\n",desc), -+ fprintf(k,"NETCARD_FULLNAME=\"%s\"\n",desc); -+ if(d->driver) fprintf(f,"DRIVER=\"%s\"\n",d->driver), -+ fprintf(k,"NETCARD_DRIVER=\"%s\"\n",d->driver); -+ }; break; -+ case CLASS_VIDEO: -+ { -+ const char *xserver="XSERVER=\"%s\"\n"; -+ const char *xmodule="XMODULE=\"%s\"\n"; -+ const char *xopts="XOPTIONS=\"%s\"\n"; -+ const char *xdesc="XDESC=\"%s\"\n"; -+ struct xinfo *xi=getxinfo(d); -+ if(xi) -+ { -+ if(*xi->xserver) -+ { fprintf(f,xserver,xi->xserver); fprintf(k,xserver,xi->xserver); } -+ if(*xi->xmodule) -+ { fprintf(f,xmodule,xi->xmodule); fprintf(k,xmodule,xi->xmodule); } -+ if(*xi->xopts) -+ { fprintf(f,xopts,xi->xopts); fprintf(k,xopts,xi->xopts); } -+ if(*xi->xdesc) -+ { fprintf(f,xdesc,xi->xdesc); fprintf(k,xdesc,xi->xdesc); } -+ } -+ }; break; -+ case CLASS_FLOPPY: -+ { -+ if(desc) fprintf(f,"FULLNAME='%s'\n",desc), -+ fprintf(k,"FLOPPY_FULLNAME='%s'\n",desc); -+ if(d->device) fprintf(f,"DEVICE=\"/dev/%s\"\n",d->device), -+ fprintf(k,"FLOPPY_DEVICE=\"/dev/%s\"\n",d->device); -+ if(d->driver) fprintf(f,"DRIVER=\"%s\"\n",d->driver), -+ fprintf(k,"FLOPPY_DRIVER=\"%s\"\n",d->driver); -+ }; break; -+ default: break; -+ } -+ fclose(f); fclose(k); -+ return 0; -+} -+ -+int hw_setup(enum deviceClass dc, int verbose, int probeonly, int skip) -+{ -+ int i,mouse=0,cdrom=0,modem=0,scanner=0; -+ struct device **currentDevs, *d, *serialmouse=NULL, *usbmouse=NULL; -+ if(verbose&VERBOSE_PROMPT) wpid=startwheel(); -+ currentDevs=probeDevices(dc,BUS_UNSPEC,PROBE_ALL); -+ if(verbose&VERBOSE_PROMPT&&wpid>0) { kill(wpid,SIGTERM); wpid=0; usleep(160000); write(2,"\033[0m Done.\n",11); } -+ if(currentDevs==NULL) return -1; -+ check_proc_modules(); /* Get currently loaded module list */ -+ for(i=0;(d=currentDevs[i]);i++) -+ { -+ if(verbose&VERBOSE_PRINT) hw_info(d); -+ if(!probeonly) -+ { -+#if defined(_i_wanna_build_this_crap_) -+ if(d->bus==BUS_ISAPNP&&configure_isapnp(d,verbose)) continue; -+#endif -+ switch(d->type) -+ { -+ case CLASS_MOUSE: /* Choose serial over PS2/USB mouse IF present */ -+ /* For some reason, PS/2 ALWAYS detects a mouse */ -+ if(d->bus==BUS_SERIAL) -+ { mouse=0; serialmouse=d; } -+ else if(d->bus==BUS_USB) /* Need usbdevfs for */ -+ { mouse=0; usbmouse=d; /* this to work */ -+ load_mod(d->driver,verbose); } -+ if(!mouse) -+ writeconfig("/etc/sysconfig/mouse",d,verbose); -+ link_dev(d,"mouse",mouse++,verbose); -+ break; -+ case CLASS_CDROM: if(d->bus==BUS_USB) load_mod(d->driver,verbose); -+ link_dev(d,"cdrom", cdrom++,verbose); break; -+ case CLASS_MODEM: if(d->bus==BUS_USB) load_mod(d->driver,verbose); -+ link_dev(d,"modem", modem++,verbose); break; -+ case CLASS_SCANNER: if(d->bus==BUS_USB) load_mod(d->driver,verbose); -+ link_dev(d,"scanner",scanner++,verbose); break; -+ case CLASS_VIDEO: writeconfig("/etc/sysconfig/xserver",d,verbose); -+ break; -+ case CLASS_AUDIO: if(skip&SKIP_AUDIO) break; -+ writeconfig("/etc/sysconfig/sound",d,verbose); -+ load_mod(d->driver,verbose); break; -+ case CLASS_NETWORK: writeconfig("/etc/sysconfig/netcard",d,verbose); -+ load_mod(d->driver,verbose); break; -+ case CLASS_FLOPPY: writeconfig("/etc/sysconfig/floppy",d,verbose); -+ load_mod(d->driver,verbose); break; -+ case CLASS_KEYBOARD:if(d->bus==BUS_USB) load_mod(d->driver,verbose); -+ break; -+ case CLASS_CAPTURE: /* Just load the module for these */ -+ case CLASS_SCSI: if(skip&SKIP_SCSI) break; -+ case CLASS_OTHER: /* Yet unsupported or "guessed" devices in kudzu. Module probe may hang here. */ -+ case CLASS_RAID: load_mod(d->driver,verbose); break; -+ case CLASS_SOCKET: /* yenta_socket or similar is handled by knoppix-autoconfig */ -+ default: /* do nothing */ break; -+ } -+ } -+ } -+ return 0; -+} -+ -+int main(int argc, char **argv) -+{ -+ int i, verbose=0, probeonly=0, skip=0; -+ enum deviceClass dc=CLASS_UNSPEC; -+ for(i=1;i