Find the answer to your Linux question:
Results 1 to 2 of 2
Hi everybody! I'm new in this forum. I am installing a Linux distribution on a USB pen drive. Once I had configured the kernel, I have installed the bash shell, ...
Enjoy an ad free experience by logging in. Not a member yet? Register.
  1. #1
    Just Joined!
    Join Date
    Jul 2008
    Posts
    1

    Problem with hwsetup.c (Knoppix hardware detection), booting from USB pen drive


    Hi everybody! I'm new in this forum.
    I am installing a Linux distribution on a USB pen drive. Once I had configured the kernel, I have installed the bash shell, the grub and the following packages: coreutils, e2fsprogs, sysvinit, util-linux.
    Now I want to automatically detect mouse when booting from the pen drive. I have modified the knoppix hwsetup.c file as follows:
    Code:
    /****************************************************************************\
    * 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 <knopper@knopper.net>                                *
    \****************************************************************************/
    
    /* Needed for strcasestr */
    #ifndef _GNU_SOURCE
    #define _GNU_SOURCE 1
    #endif
    
    #include <stdio.h>
    #include <string.h>
    #include <ctype.h>
    #include <unistd.h>
    #include <stdlib.h>
    #include <errno.h>
    #include <signal.h>
    #include <time.h>
    #include <sys/types.h>
    #include <sys/wait.h>
    #include <sys/stat.h>
    #include <pci/pci.h>
    #undef _i_wanna_build_this_crap_
    /* #define _i_wanna_build_this_crap_ 1 */ /* Necessary for ISAPNP */
    #include <kudzu/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 <knoppix@knopper.net>\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[] =
    { "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"
    };
    #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; j<CONFLICT_SET; j++)
        {
         if(!modcmp(name,conflicts[i][j].name) &&
            conflicts[i][!j].loaded) return conflicts[i][!j].name;
        }
      }
     return NULL;
    }
    
    void set_conflict(char *name)
    {
     int i;
     if(!name) return;
     for(i=0; i<(sizeof(conflicts)/sizeof(struct conflict)/CONFLICT_SET); i++)
      {
       int j;
       for(j=0; j<CONFLICT_SET; j++)
        {
         if(!modcmp(name,conflicts[i][j].name)) conflicts[i][j].loaded=1;
        }
      }
    }
    
    void check_proc_modules(void)
    {
     struct loaded_module *curr = NULL, *new = NULL;
     FILE *f = fopen("/proc/modules", "r");
     if(!f) return;
     for(;;)
      {
       char buffer[1024], *name;
       memset(buffer,0,sizeof(buffer));
       if(!fgets(buffer,1024, f) || ferror(f)) break;
       new = (struct loaded_module *) malloc(sizeof(struct loaded_module));
       if(!new) { fclose(f); return; }
       memset(new,0,sizeof(struct loaded_module));
       if(!loaded_modules) { loaded_modules = curr = new; }
       else
        {
         curr->next = 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];
    };
    
    
    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;i<(sizeof(blacklist)/sizeof(char*));i++)
      {
       if(!modcmp(blacklist[i],m))
        {
         if(verbose&VERBOSE_PRINT) printf("not loading module %.32s (is in blacklist)\n",m);
         return 0;
        }
      }
    #endif
     if((cc=check_conflict(m))!=NULL)
      {
       if(verbose&VERBOSE_PRINT) printf("not loading module %.32s (conflicts with loaded module '%.32s' for same device)\n", m, cc);
       return 0;
      }
     if((mpid=fork())==0)
      { /* child process */
       if(verbose&VERBOSE_PRINT) printf("modprobe(%.32s)\n",m);
       signal(SIGSEGV,segfault_handler);
       /* Send modprobe errors to /dev/null */
       if(!(verbose&VERBOSE_PRINT)) freopen("/dev/null","w",stderr);
       execl("/sbin/modprobe","modprobe",m,NULL);
       exit(1);
      }
     now=time(0);
     do
      {
       usleep(125000); /* Delay 1/8s */
       /* We SHOULD wait for modprobe to finish! */
       if(waitpid(mpid,&pstatus,WNOHANG)) break;
      }
     while((time(0) - now) < MAX_TIME_MODULE);
     set_conflict(m);
     return pstatus;
    }
    
    
    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_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;
       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;
          
           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<argc;i++)
      {
       if(!strcasecmp(argv[i],"-v"))      verbose|=VERBOSE_PRINT;
       else if(!strcasecmp(argv[i],"-p")) verbose|=VERBOSE_PROMPT;
       else if(!strcasecmp(argv[i],"-a")) skip|=SKIP_AUDIO;
       else if(!strcasecmp(argv[i],"-s")) skip|=SKIP_SCSI;
       else if(!strcasecmp(argv[i],"-n")) probeonly=1;
       else return syntax(argv[i]);
      }
     /* Allow SIGTERM, SIGINT: rmmod depends on this. */
     signal(SIGTERM,SIG_DFL); signal(SIGINT,SIG_DFL);
     signal(SIGALRM,alarm_handler); alarm(MAX_TIME);
     return hw_setup(dc,verbose,probeonly,skip);
    }
    and I have copied it into the bin folder of my pen drive.

    Then I have written the following script to run the program:
    Code:
    #!/bin/bash
    PATH=/sbin:/bin ; export PATH
    hwsetup
    cat  /etc/sysconfig/mouse
    I have copied it into the etc/init.d folder and I have created a symbolic link to it into the etc/rcS.d folder.

    On booting from my pen drive I receive a segmentation fault error. It seems that the problem stands in the probeDevices function (which is called in the hw_setup function), but I don't understand why.
    Could it be a problem with the kudzu library?

    Thanks
    Antonella

  2. #2
    Just Joined!
    Join Date
    Jul 2008
    Posts
    1

    Post как поставить сауну в квартире?

    Добрый день!
    40 минут и сауна у вас дома
    Малые габариты, 220 В, малая мощность.это очень просто, бесплатно доставим и установим в любом месте -
    Инфракрасная сауна для квартиры и бизнеса

    P.S.Инфракрасная сауна - машина здоровья в доме!

    Увидимся!

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •