Zwischencommit Installer...
authorms <ms@ea5c0bd1-69bd-2848-81d8-4f18e57aeed8>
Mon, 30 Oct 2006 20:23:28 +0000 (20:23 +0000)
committerms <ms@ea5c0bd1-69bd-2848-81d8-4f18e57aeed8>
Mon, 30 Oct 2006 20:23:28 +0000 (20:23 +0000)
git-svn-id: http://svn.ipfire.org/svn/ipfire/trunk@333 ea5c0bd1-69bd-2848-81d8-4f18e57aeed8

208 files changed:
lfs/boot.img
lfs/driver.img
lfs/initrd
lfs/installer
lfs/newt
lfs/pciutils
lfs/pcmciautils
lfs/scsi.img
lfs/slang
lfs/util-linux
make.sh
src/hwinfo/COPYING [new file with mode: 0644]
src/hwinfo/ChangeLog [new file with mode: 0644]
src/hwinfo/Makefile [new file with mode: 0644]
src/hwinfo/Makefile.common [new file with mode: 0644]
src/hwinfo/README [new file with mode: 0644]
src/hwinfo/VERSION [new file with mode: 0644]
src/hwinfo/doc/example1.c [new file with mode: 0644]
src/hwinfo/doc/example2.c [new file with mode: 0644]
src/hwinfo/doc/footer.html [new file with mode: 0644]
src/hwinfo/doc/hwinfo.8 [new file with mode: 0644]
src/hwinfo/doc/libhd.doc [new file with mode: 0644]
src/hwinfo/doc/libhd.doxy [new file with mode: 0644]
src/hwinfo/gen-hwcfg-disk.sh [new file with mode: 0755]
src/hwinfo/getsysinfo [new file with mode: 0755]
src/hwinfo/hwbootscan [new file with mode: 0644]
src/hwinfo/hwbootscan.rc [new file with mode: 0644]
src/hwinfo/hwinfo.c [new file with mode: 0644]
src/hwinfo/hwscan.c [new file with mode: 0644]
src/hwinfo/hwscand.c [new file with mode: 0644]
src/hwinfo/hwscanqueue.c [new file with mode: 0644]
src/hwinfo/init_message.h [new file with mode: 0644]
src/hwinfo/scripts/mci [new file with mode: 0755]
src/hwinfo/src/Makefile [new file with mode: 0644]
src/hwinfo/src/hd/Makefile [new file with mode: 0644]
src/hwinfo/src/hd/adb.c [new file with mode: 0644]
src/hwinfo/src/hd/adb.h [new file with mode: 0644]
src/hwinfo/src/hd/bios.c [new file with mode: 0644]
src/hwinfo/src/hd/bios.h [new file with mode: 0644]
src/hwinfo/src/hd/block.c [new file with mode: 0644]
src/hwinfo/src/hd/block.h [new file with mode: 0644]
src/hwinfo/src/hd/braille.c [new file with mode: 0644]
src/hwinfo/src/hd/braille.h [new file with mode: 0644]
src/hwinfo/src/hd/cpu.c [new file with mode: 0644]
src/hwinfo/src/hd/cpu.h [new file with mode: 0644]
src/hwinfo/src/hd/edd.c [new file with mode: 0644]
src/hwinfo/src/hd/edd.h [new file with mode: 0644]
src/hwinfo/src/hd/fb.c [new file with mode: 0644]
src/hwinfo/src/hd/fb.h [new file with mode: 0644]
src/hwinfo/src/hd/floppy.c [new file with mode: 0644]
src/hwinfo/src/hd/floppy.h [new file with mode: 0644]
src/hwinfo/src/hd/hd.c [new file with mode: 0644]
src/hwinfo/src/hd/hd.h [new file with mode: 0644]
src/hwinfo/src/hd/hd_int.h [new file with mode: 0644]
src/hwinfo/src/hd/hddb.c [new file with mode: 0644]
src/hwinfo/src/hd/hddb.h [new file with mode: 0644]
src/hwinfo/src/hd/hddb_int.h [new file with mode: 0644]
src/hwinfo/src/hd/hdp.c [new file with mode: 0644]
src/hwinfo/src/hd/hdp.h [new file with mode: 0644]
src/hwinfo/src/hd/ibm-notebooks.h [new file with mode: 0644]
src/hwinfo/src/hd/input.c [new file with mode: 0644]
src/hwinfo/src/hd/input.h [new file with mode: 0644]
src/hwinfo/src/hd/int.c [new file with mode: 0644]
src/hwinfo/src/hd/int.h [new file with mode: 0644]
src/hwinfo/src/hd/isa.c [new file with mode: 0644]
src/hwinfo/src/hd/isa.h [new file with mode: 0644]
src/hwinfo/src/hd/isapnp.c [new file with mode: 0644]
src/hwinfo/src/hd/isapnp.h [new file with mode: 0644]
src/hwinfo/src/hd/isdn.c [new file with mode: 0644]
src/hwinfo/src/hd/isdn.h [new file with mode: 0644]
src/hwinfo/src/hd/kbd.c [new file with mode: 0644]
src/hwinfo/src/hd/kbd.h [new file with mode: 0644]
src/hwinfo/src/hd/klog.c [new file with mode: 0644]
src/hwinfo/src/hd/klog.h [new file with mode: 0644]
src/hwinfo/src/hd/manual.c [new file with mode: 0644]
src/hwinfo/src/hd/manual.h [new file with mode: 0644]
src/hwinfo/src/hd/memory.c [new file with mode: 0644]
src/hwinfo/src/hd/memory.h [new file with mode: 0644]
src/hwinfo/src/hd/misc.c [new file with mode: 0644]
src/hwinfo/src/hd/misc.h [new file with mode: 0644]
src/hwinfo/src/hd/modem.c [new file with mode: 0644]
src/hwinfo/src/hd/modem.h [new file with mode: 0644]
src/hwinfo/src/hd/monitor.c [new file with mode: 0644]
src/hwinfo/src/hd/monitor.h [new file with mode: 0644]
src/hwinfo/src/hd/mouse.c [new file with mode: 0644]
src/hwinfo/src/hd/mouse.h [new file with mode: 0644]
src/hwinfo/src/hd/net.c [new file with mode: 0644]
src/hwinfo/src/hd/net.h [new file with mode: 0644]
src/hwinfo/src/hd/parallel.c [new file with mode: 0644]
src/hwinfo/src/hd/parallel.h [new file with mode: 0644]
src/hwinfo/src/hd/pci.c [new file with mode: 0644]
src/hwinfo/src/hd/pci.h [new file with mode: 0644]
src/hwinfo/src/hd/pcmcia.c [new file with mode: 0644]
src/hwinfo/src/hd/pcmcia.h [new file with mode: 0644]
src/hwinfo/src/hd/pppoe.c [new file with mode: 0644]
src/hwinfo/src/hd/pppoe.h [new file with mode: 0644]
src/hwinfo/src/hd/prom.c [new file with mode: 0644]
src/hwinfo/src/hd/prom.h [new file with mode: 0644]
src/hwinfo/src/hd/s390.c [new file with mode: 0644]
src/hwinfo/src/hd/s390.h [new file with mode: 0644]
src/hwinfo/src/hd/sbus.c [new file with mode: 0644]
src/hwinfo/src/hd/sbus.h [new file with mode: 0644]
src/hwinfo/src/hd/serial.c [new file with mode: 0644]
src/hwinfo/src/hd/serial.h [new file with mode: 0644]
src/hwinfo/src/hd/smbios.c [new file with mode: 0644]
src/hwinfo/src/hd/smbios.h [new file with mode: 0644]
src/hwinfo/src/hd/sys.c [new file with mode: 0644]
src/hwinfo/src/hd/sys.h [new file with mode: 0644]
src/hwinfo/src/hd/usb.c [new file with mode: 0644]
src/hwinfo/src/hd/usb.h [new file with mode: 0644]
src/hwinfo/src/hd/version.h [new file with mode: 0644]
src/hwinfo/src/hd/veth.c [new file with mode: 0644]
src/hwinfo/src/hd/veth.h [new file with mode: 0644]
src/hwinfo/src/hd/wlan.c [new file with mode: 0644]
src/hwinfo/src/hd/wlan.h [new file with mode: 0644]
src/hwinfo/src/ids/Makefile [new file with mode: 0644]
src/hwinfo/src/ids/cdb_x11 [new file with mode: 0755]
src/hwinfo/src/ids/check_hd.c [new file with mode: 0644]
src/hwinfo/src/ids/convert_hd [new file with mode: 0755]
src/hwinfo/src/ids/get_adaptec [new file with mode: 0755]
src/hwinfo/src/ids/get_pcmcia [new file with mode: 0755]
src/hwinfo/src/ids/hd_ids.c [new file with mode: 0644]
src/hwinfo/src/ids/src/braille [new file with mode: 0644]
src/hwinfo/src/ids/src/bus [new file with mode: 0644]
src/hwinfo/src/ids/src/camera [new file with mode: 0644]
src/hwinfo/src/ids/src/chipcard [new file with mode: 0644]
src/hwinfo/src/ids/src/class [new file with mode: 0644]
src/hwinfo/src/ids/src/dvb [new file with mode: 0644]
src/hwinfo/src/ids/src/extra [new file with mode: 0644]
src/hwinfo/src/ids/src/isapnp [new file with mode: 0644]
src/hwinfo/src/ids/src/modem [new file with mode: 0644]
src/hwinfo/src/ids/src/modem.i386 [new file with mode: 0644]
src/hwinfo/src/ids/src/monitor [new file with mode: 0644]
src/hwinfo/src/ids/src/mouse [new file with mode: 0644]
src/hwinfo/src/ids/src/network [new file with mode: 0644]
src/hwinfo/src/ids/src/pci [new file with mode: 0644]
src/hwinfo/src/ids/src/pcmcia [new file with mode: 0644]
src/hwinfo/src/ids/src/ppc [new file with mode: 0644]
src/hwinfo/src/ids/src/s390 [new file with mode: 0644]
src/hwinfo/src/ids/src/scanner [new file with mode: 0644]
src/hwinfo/src/ids/src/sound [new file with mode: 0644]
src/hwinfo/src/ids/src/special [new file with mode: 0644]
src/hwinfo/src/ids/src/storage [new file with mode: 0644]
src/hwinfo/src/ids/src/tv [new file with mode: 0644]
src/hwinfo/src/ids/src/usb [new file with mode: 0644]
src/hwinfo/src/ids/src/usb2 [new file with mode: 0644]
src/hwinfo/src/ids/src/x11.amd64 [new file with mode: 0644]
src/hwinfo/src/ids/src/x11.axp [new file with mode: 0644]
src/hwinfo/src/ids/src/x11.i386 [new file with mode: 0644]
src/hwinfo/src/ids/src/x11.ia64 [new file with mode: 0644]
src/hwinfo/src/ids/src/x11.ppc [new file with mode: 0644]
src/hwinfo/src/ids/src/x11.ppc.special [new file with mode: 0644]
src/hwinfo/src/ids/src/x11.sparc [new file with mode: 0644]
src/hwinfo/src/ids/update_x11 [new file with mode: 0755]
src/hwinfo/src/int10/AsmMacros.h [new file with mode: 0644]
src/hwinfo/src/int10/Makefile [new file with mode: 0644]
src/hwinfo/src/int10/README [new file with mode: 0644]
src/hwinfo/src/int10/emu_vm86.c [new file with mode: 0644]
src/hwinfo/src/int10/i10_int.c [new file with mode: 0644]
src/hwinfo/src/int10/i10_io.c [new file with mode: 0644]
src/hwinfo/src/int10/i10_pci.c [new file with mode: 0644]
src/hwinfo/src/int10/i10_v86.c [new file with mode: 0644]
src/hwinfo/src/int10/i10_vbios.c [new file with mode: 0644]
src/hwinfo/src/int10/int10.c [new file with mode: 0644]
src/hwinfo/src/int10/pci.h [new file with mode: 0644]
src/hwinfo/src/int10/v86bios.h [new file with mode: 0644]
src/hwinfo/src/int10/vbios.h [new file with mode: 0644]
src/hwinfo/src/int10/vm86_struct.h [new file with mode: 0644]
src/hwinfo/src/isdn/Makefile [new file with mode: 0644]
src/hwinfo/src/isdn/cdb/ISDN.axp.txt [new file with mode: 0644]
src/hwinfo/src/isdn/cdb/ISDN.i386.txt [new file with mode: 0644]
src/hwinfo/src/isdn/cdb/ISDN.ppc.txt [new file with mode: 0644]
src/hwinfo/src/isdn/cdb/ISDN.x86_64.txt [new file with mode: 0644]
src/hwinfo/src/isdn/cdb/Makefile [new file with mode: 0644]
src/hwinfo/src/isdn/cdb/cdb_hwdb.h [new file with mode: 0644]
src/hwinfo/src/isdn/cdb/cdb_read.c [new file with mode: 0644]
src/hwinfo/src/isdn/cdb/cdb_read.h [new file with mode: 0644]
src/hwinfo/src/isdn/cdb/isdn_cdb.c [new file with mode: 0644]
src/hwinfo/src/isdn/cdb/isdn_cdb.lex [new file with mode: 0644]
src/hwinfo/src/isdn/cdb/isdn_cdb_def.h [new file with mode: 0644]
src/hwinfo/src/isdn/cdb/mk_isdnhwdb.c [new file with mode: 0644]
src/hwinfo/src/isdn/cdbisdn.c [new file with mode: 0644]
src/hwinfo/src/isdn/isa_probe.c [new file with mode: 0644]
src/hwinfo/src/isdn/libihw.txt [new file with mode: 0644]
src/hwinfo/src/smp/Makefile [new file with mode: 0644]
src/hwinfo/src/smp/README [new file with mode: 0644]
src/hwinfo/src/smp/smp.c [new file with mode: 0644]
src/hwinfo/src/x86emu/LICENSE [new file with mode: 0644]
src/hwinfo/src/x86emu/Makefile [new file with mode: 0644]
src/hwinfo/src/x86emu/debug.c [new file with mode: 0644]
src/hwinfo/src/x86emu/decode.c [new file with mode: 0644]
src/hwinfo/src/x86emu/fpu.c [new file with mode: 0644]
src/hwinfo/src/x86emu/include/x86emu.h [new file with mode: 0644]
src/hwinfo/src/x86emu/include/x86emu/fpu_regs.h [new file with mode: 0644]
src/hwinfo/src/x86emu/include/x86emu/regs.h [new file with mode: 0644]
src/hwinfo/src/x86emu/include/x86emu/types.h [new file with mode: 0644]
src/hwinfo/src/x86emu/ops.c [new file with mode: 0644]
src/hwinfo/src/x86emu/ops2.c [new file with mode: 0644]
src/hwinfo/src/x86emu/prim_ops.c [new file with mode: 0644]
src/hwinfo/src/x86emu/sys.c [new file with mode: 0644]
src/hwinfo/src/x86emu/validate.c [new file with mode: 0644]
src/hwinfo/src/x86emu/x86emu/debug.h [new file with mode: 0644]
src/hwinfo/src/x86emu/x86emu/decode.h [new file with mode: 0644]
src/hwinfo/src/x86emu/x86emu/fpu.h [new file with mode: 0644]
src/hwinfo/src/x86emu/x86emu/ops.h [new file with mode: 0644]
src/hwinfo/src/x86emu/x86emu/prim_asm.h [new file with mode: 0644]
src/hwinfo/src/x86emu/x86emu/prim_ops.h [new file with mode: 0644]
src/hwinfo/src/x86emu/x86emu/x86emui.h [new file with mode: 0644]

index 5156c04..2577a33 100644 (file)
@@ -26,6 +26,8 @@
 
 include Config
 
+VER = ipfire
+
 THISAPP    = boot-$(VERSION).img
 TARGET     = $(DIR_INFO)/$(THISAPP)
 
@@ -62,7 +64,7 @@ $(TARGET) :
                sed -e 's/boot IPFire/boot IPFire $(VERSION)/' $(DIR_SRC)/config/kernel/install-message \
                        > /install/mnt/message; \
                cp $(DIR_SRC)/config/kernel/syslinux.cfg    /install/mnt/syslinux.cfg; \
-               cp /boot/vmlinuz-installer                  /install/mnt/vmlinuz; \
+               cp /boot/vmlinuz-$(KVER)                    /install/mnt/vmlinuz; \
                cp /install/images/fdinitrd.gz              /install/mnt/instroot.gz; \
                umount /install/mnt; \
                losetup -d $$LOOPDEV; \
index f197e89..d9d6b7d 100644 (file)
 # Makefiles are based on LFSMake, which is                                    #
 # Copyright (C) 2002 Rod Roard <rod@sunsetsystems.com>                        #
 #                                                                             #
-# Modifications by:                                                           #
-# ??-12-2003 Mark Wormgoor < mark@wormgoor.com>                               #
-#          - Modified Makefile for IPCop build                                #
-#                                                                             #
-# $Id: driver.img,v 1.24.2.7 2006/01/29 20:17:30 franck78 Exp $
-#                                                                             #
 ###############################################################################
 
 ###############################################################################
@@ -32,6 +26,8 @@
 
 include Config
 
+VER = ipfire
+
 THISAPP    = driver-$(VERSION).img
 TARGET     = $(DIR_INFO)/$(THISAPP)
 
@@ -57,9 +53,7 @@ $(TARGET) :
 
        # make new dependencies 
        depmod -a -F /boot/System.map-$(KVER) $(KVER)
-       if [ "$(MACHINE)" = "i386" ]; then \
-               depmod -a -F /boot/System.map-$(KVER)-smp $(KVER)-smp; \
-       fi
+       depmod -a -F /boot/System.map-$(KVER)-smp $(KVER)-smp
 
        # Create drivers floppy
        cd /tmp && rm -rf drivers.tgz drivers.tar bin lib etc var
@@ -100,19 +94,15 @@ $(TARGET) :
        cd /tmp && tar xf drivers.tar
        cd /tmp && mkdir -p {bin,etc/pcmcia,var/lib/pcmcia,var/run}
        cd /tmp && cp -aR /install/misc/bin/* bin
-       cd /tmp && cp -r /etc/pcmcia/{config*,net*} etc/pcmcia
+#      cd /tmp && cp -r /etc/pcmcia/{config*,net*} etc/pcmcia
        # cardmgr wants to execute these to bring up the card, we'll
        # create blank ones as we'll bring them up ourselves
-       cd /tmp/etc/pcmcia && rm -f network 
-       cd /tmp/etc/pcmcia && touch network
-       cd /tmp/etc/pcmcia && chmod +x network
+#      cd /tmp/etc/pcmcia && rm -f network 
+#      cd /tmp/etc/pcmcia && touch network
+#      cd /tmp/etc/pcmcia && chmod +x network
        cd /tmp && tar -cf - bin/ etc/pcmcia var lib/modules/$(KVER) | gzip -9 -c > drivers.tgz
 
-       if [ "$(MACHINE)" = "alpha" ]; then \
-               cp /tmp/drivers.tgz /install/images/drivers-$(VERSION).img; \
-       else \
-               dd if=/tmp/drivers.tgz of=/install/images/drivers-$(VERSION).img bs=1440k count=1 conv=sync; \
-       fi
+       dd if=/tmp/drivers.tgz of=/install/images/drivers-$(VERSION).img bs=2880k count=1 conv=sync
        rm -rf /tmp/drivers.tgz /tmp/drivers.tar /tmp/bin /tmp/lib
 
        ### If this fails, the disk is TOO FULL !!!!
index 66c578e..8449552 100644 (file)
 # Makefiles are based on LFSMake, which is                                    #
 # Copyright (C) 2002 Rod Roard <rod@sunsetsystems.com>                        #
 #                                                                             #
-# Modifications by:                                                           #
-# ??-12-2003 Mark Wormgoor < mark@wormgoor.com>                               #
-#          - Modified Makefile for IPCop build                                #
-#                                                                             #
-# $Id: initrd,v 1.26.2.8 2005/12/03 21:28:44 franck78 Exp $
-#                                                                             #
 ###############################################################################
 
 ###############################################################################
@@ -32,6 +26,8 @@
 
 include Config
 
+VER = ipfire
+
 THISAPP    = initrd
 DIR_APP    = $(DIR_SRC)/$(THISAPP)
 TARGET     = $(DIR_INFO)/$(THISAPP)
@@ -62,41 +58,34 @@ $(TARGET) :
        # Finish up initrd directory
        -mkdir -p /install/initrd/{etc,lib/modules/$(KVER)/kernel/drivers,cdrom,dev,harddisk,proc,tmp,usr/share/terminfo/l,var/run} && \
        ln -sf /bin /install/initrd/sbin
-       cd /install/initrd/dev && /dev/make_devices 
+#      cd /install/initrd/dev && /dev/make_devices 
        cp -aRf $(DIR_SRC)/config/install/* /install/initrd/etc/
        rm -rf /install/initrd/etc/CVS/
        cd /install/initrd/dev && ln -sf fd0 floppy
        chmod 755 /install/initrd/etc/halt /install/initrd/etc/rc
        cp -f /usr/share/terminfo/l/linux /install/initrd/usr/share/terminfo/l
 
-       if [ "$(MACHINE)" = "alpha" ]; then \
-               tar cvzf /tmp/libc.tgz /usr/share/locale /lib/libc.* /lib/libc-* /lib/libdl* /lib/libnsl* /lib/libresolv* /lib/libutil* /lib/ld* /lib/libcrypt*; \
-               tar xvzf /tmp/libc.tgz -C /install/initrd; \
-               strip /install/initrd/lib/*; \
-               rm -f /tmp/libc.tgz; \
-       fi
-
        # Extra modules
        -mkdir -p /install/initrd/lib/modules/$(KVER)/kernel/drivers/scsi
-       cp -f /lib/modules/$(KVER)/kernel/drivers/scsi/{scsi_mod.o.gz,sd_mod.o.gz,sr_mod.o.gz} \
+       cp -f /lib/modules/$(KVER)/kernel/drivers/scsi/{scsi_mod.ko,sd_mod.ko,sr_mod.ko} \
            /install/initrd/lib/modules/$(KVER)/kernel/drivers/scsi/
        -mkdir -p /install/initrd/lib/modules/$(KVER)/kernel/drivers/usb/storage/
-       cp -f /lib/modules/$(KVER)/kernel/drivers/usb/storage/*.o.gz \
+       cp -f /lib/modules/$(KVER)/kernel/drivers/usb/storage/*.ko \
            /install/initrd/lib/modules/$(KVER)/kernel/drivers/usb/storage/
 
        -mkdir -p /install/initrd/lib/modules/$(KVER)/kernel/drivers/usb/host/
-       cp -f /lib/modules/$(KVER)/kernel/drivers/usb/host/{usb-*,ehci*} \
-             /lib/modules/$(KVER)/kernel/drivers/usb/hid.o.gz \
-             /lib/modules/$(KVER)/kernel/drivers/usb/*core.o.gz \
+       cp -f /lib/modules/$(KVER)/kernel/drivers/usb/host/ehci* \
+             /lib/modules/$(KVER)/kernel/drivers/usb/input/usbhid.ko \
+             /lib/modules/$(KVER)/kernel/drivers/usb/core/usbcore.ko \
            /install/initrd/lib/modules/$(KVER)/kernel/drivers/usb/
 
-       -mkdir -p /install/initrd/lib/modules/$(KVER)/kernel/drivers/input
-       cp -f /lib/modules/$(KVER)/kernel/drivers/input/{input.o.gz,keybdev.o.gz} \
-           /install/initrd/lib/modules/$(KVER)/kernel/drivers/input/
+#      -mkdir -p /install/initrd/lib/modules/$(KVER)/kernel/drivers/input
+#      cp -f /lib/modules/$(KVER)/kernel/drivers/input/{input.ko,keybdev.ko} \
+#          /install/initrd/lib/modules/$(KVER)/kernel/drivers/input/
 
-       -mkdir -p /install/initrd/lib/modules/$(KVER)/kernel/drivers/pnp
-       cp -f /lib/modules/$(KVER)/kernel/drivers/pnp/* \
-           /install/initrd/lib/modules/$(KVER)/kernel/drivers/pnp/
+#      -mkdir -p /install/initrd/lib/modules/$(KVER)/kernel/drivers/pnp
+#      cp -f /lib/modules/$(KVER)/kernel/drivers/pnp/* \
+#          /install/initrd/lib/modules/$(KVER)/kernel/drivers/pnp/
 
        cp -f /lib/modules/$(KVER)/modules.* /install/initrd/lib/modules/$(KVER)/
 
index 6b34f7f..ba34c89 100644 (file)
 # Makefiles are based on LFSMake, which is                                    #
 # Copyright (C) 2002 Rod Roard <rod@sunsetsystems.com>                        #
 #                                                                             #
-# Modifications by:                                                           #
-# ??-12-2003 Mark Wormgoor < mark@wormgoor.com>                               #
-#          - Modified Makefile for IPCop build                                #
-#                                                                             #
-# $Id: installer,v 1.6.2.3 2005/02/05 15:38:15 gespinasse Exp $
-#                                                                             #
 ###############################################################################
 
 ###############################################################################
@@ -32,6 +26,8 @@
 
 include Config
 
+VER = ipfire
+
 THISAPP    = installer
 DIR_APP    = $(DIR_SRC)/$(THISAPP)
 TARGET     = $(DIR_INFO)/$(THISAPP)
index 5a215ac..b8ee2db 100644 (file)
--- a/lfs/newt
+++ b/lfs/newt
 # Makefiles are based on LFSMake, which is                                    #
 # Copyright (C) 2002 Rod Roard <rod@sunsetsystems.com>                        #
 #                                                                             #
-# Modifications by:                                                           #
-# ??-12-2003 Mark Wormgoor < mark@wormgoor.com>                               #
-#          - Modified Makefile for IPCop build                                #
-#                                                                             #
-# $Id: newt,v 1.8.2.3 2005/02/05 15:38:15 gespinasse Exp $
-#                                                                             #
 ###############################################################################
 
 ###############################################################################
@@ -36,7 +30,7 @@ VER        = 0.50.17
 
 THISAPP    = newt-utf8_$(VER)
 DL_FILE    = $(THISAPP).orig.tar.gz
-DL_FROM    = $(URL_DEBIAN)/n/newt-utf8
+DL_FROM    = $(URL_IPFIRE)
 DIR_APP    = $(DIR_SRC)/newt-0.50.17
 ifeq "$(LFS_PASS)" "install"
   TARGET     = $(DIR_INFO)/$(THISAPP)-install
index 86d9737..a31b0fa 100644 (file)
@@ -81,7 +81,7 @@ $(TARGET) : $(patsubst %,$(DIR_DL)/%,$(objects))
 
 ifeq "$(LFS_PASS)" "install"
        cd $(DIR_APP)/lib && CFLAGS="-Os -fomit-frame-pointer" ./configure
-       cd $(DIR_APP)/lib && CFLAGS="-Os -fomit-frame-pointer" make
+       cd $(DIR_APP)/lib && CFLAGS="-Os -fomit-frame-pointer" make $(MAKETUNING)
        -mkdir -p /install/include/pci
        cd $(DIR_APP) && install -m 0644 lib/libpci.a /install/lib
        cd $(DIR_APP) && install -m 0644 lib/{config,header,pci}.h /install/include/pci
index f1f1d19..a3c0862 100644 (file)
@@ -30,7 +30,7 @@ VER        = 014
 
 THISAPP    = pcmciautils-$(VER)
 DL_FILE    = $(THISAPP).tar.bz2
-DL_FROM    = $(URL_SFNET)/pcmcia-cs
+DL_FROM    = $(URL_IPFIRE)
 DIR_APP    = $(DIR_SRC)/$(THISAPP)
 ifeq "$(LFS_PASS)" "install"
   TARGET     = $(DIR_INFO)/$(THISAPP)-install
@@ -76,22 +76,17 @@ $(subst %,%_MD5,$(objects)) :
 $(TARGET) : $(patsubst %,$(DIR_DL)/%,$(objects))
        @$(PREBUILD)
        @rm -rf $(DIR_APP) && cd $(DIR_SRC) && tar jxf $(DIR_DL)/$(DL_FILE)
-       cd $(DIR_APP) && make #$(MAKETUNING)
-       cd $(DIR_APP) && make install
-## This is saved...
-#ifeq "$(LFS_PASS)" "install"
-#      cd $(DIR_APP) && ./Configure -n --kernel=/usr/src/linux --notrust --cardbus --pnp --apm --nox11 --srctree --ucc=gcc --kcc="$(KGCC)"
+ifeq "$(LFS_PASS)" "install"
 #      cd $(DIR_APP) && make -C cardmgr
 #      cd $(DIR_APP) && mkdir -p /install/misc/bin
 #      cd $(DIR_APP) && install -s -m 0755 cardmgr/cardmgr /install/misc/bin
 #      cd $(DIR_APP) && install -s -m 0755 cardmgr/cardctl /install/misc/bin
-#else
-#      cd $(DIR_APP) && ./Configure -n --kernel=/usr/src/linux --notrust --cardbus --pnp --apm --nox11 --srctree --ucc=gcc --kcc="$(KGCC)"
-#      cd $(DIR_APP) && make all
-#      cd $(DIR_APP) && make install
-#
-#      # Install our own extra pcmcia configs
-#      cp $(DIR_SRC)/src/pcmcia/*.conf /etc/pcmcia
-#endif
+else
+       cd $(DIR_APP) && make
+       cd $(DIR_APP) && make install
+
+       # Install our own extra pcmcia configs
+       cp $(DIR_SRC)/src/pcmcia/*.conf /etc/pcmcia
+endif
        @rm -rf $(DIR_APP)
        @$(POSTBUILD)
index 1f9663a..988ee5e 100644 (file)
 # Makefiles are based on LFSMake, which is                                    #
 # Copyright (C) 2002 Rod Roard <rod@sunsetsystems.com>                        #
 #                                                                             #
-# Modifications by:                                                           #
-# ??-12-2003 Mark Wormgoor < mark@wormgoor.com>                               #
-#          - Modified Makefile for IPCop build                                #
-#                                                                             #
-# $Id: scsi.img,v 1.19.2.4 2005/02/05 15:38:15 gespinasse Exp $
-#                                                                             #
 ###############################################################################
 
 ###############################################################################
@@ -32,6 +26,8 @@
 
 include Config
 
+VER = ipfire
+
 THISAPP    = scsi-$(VERSION).img
 TARGET     = $(DIR_INFO)/$(THISAPP)
 
@@ -58,24 +54,20 @@ $(TARGET) :
        -mkdir -p /install/images
        cd /tmp && rm -rf scsi.tgz scsi.tar bin etc lib var
 
-       cd / && tar -cf /tmp/scsi.tar lib/modules/$(KVER)/kernel/drivers/{scsi,pcmcia,message/fusion} lib/modules/$(KVER)/kernel/drivers/block/{DAC960.o.gz,cpqarray.o.gz,cciss.o.gz} lib/modules/$(KVER)/kernel/drivers/ide
+       cd / && tar -cf /tmp/scsi.tar lib/modules/$(KVER)/kernel/drivers/{scsi,pcmcia,message/fusion} lib/modules/$(KVER)/kernel/drivers/block/{DAC960.ko,cpqarray.ko,cciss.ko} lib/modules/$(KVER)/kernel/drivers/ide
        cd /tmp && tar xf scsi.tar
        cd /tmp && rm -f lib/modules/$(KVER)/kernel/drivers/message/fusion/mptlan*
        cd /tmp && mkdir -p {bin,etc/pcmcia/scsi,var/lib/pcmcia,var/run}
        cd /tmp && cp -aR /install/misc/bin/* bin
-       cd /tmp && cp -r /etc/pcmcia/{config*,scsi*} etc/pcmcia/scsi
+#      cd /tmp && cp -r /etc/pcmcia/{config*,scsi*} etc/pcmcia/scsi
        # cardmgr wants to execute these to bring up the card, we'll
        # create blank ones as we'll bring them up ourselves
-       cd /tmp/etc/pcmcia/scsi && rm -f scsi
-       cd /tmp/etc/pcmcia/scsi && touch scsi
-       cd /tmp/etc/pcmcia/scsi && chmod +x scsi
+#      cd /tmp/etc/pcmcia/scsi && rm -f scsi
+#      cd /tmp/etc/pcmcia/scsi && touch scsi
+#      cd /tmp/etc/pcmcia/scsi && chmod +x scsi
        cd /tmp && tar -cf - bin/ etc/pcmcia var lib/modules/$(KVER) | gzip -9 -c > scsi.tgz
 
-       if [ "$(MACHINE)" = "alpha" ]; then \
-               cp /tmp/scsi.tgz /install/images/scsidrv-$(VERSION).img; \
-       else \
-               dd if=/tmp/scsi.tgz of=/install/images/scsidrv-$(VERSION).img bs=2880k count=1 conv=sync; \
-       fi
+       dd if=/tmp/scsi.tgz of=/install/images/scsidrv-$(VERSION).img bs=2880k count=1 conv=sync
        rm -f /tmp/scsi.tgz
 
        ### If this fails, the disk is TOO FULL !!!!
index 036660a..78d0794 100644 (file)
--- a/lfs/slang
+++ b/lfs/slang
@@ -78,16 +78,15 @@ $(TARGET) : $(patsubst %,$(DIR_DL)/%,$(objects))
        @rm -rf $(DIR_APP) && cd $(DIR_SRC) && tar jxf $(DIR_DL)/$(DL_FILE)
 ifeq "$(LFS_PASS)" "install"
        -mkdir -p /install/lib
-       cd $(DIR_APP) && sed -i -e 's/libslang.a:/libslang.a:\ $$(OBJS)/' Makefile
-       cd $(DIR_APP) && CFLAGS="-Os -fomit-frame-pointer -Wall -fPIC" make -e libslang.a
-       cd $(DIR_APP) && install -m 0644 libslang.a /install/lib
-       -mkdir -p /install/include/slang
-       cd $(DIR_APP) && install -m 0644 slang.h slcurses.h /install/include/slang
+       cd $(DIR_APP) && ./configure --prefix=""
+       cd $(DIR_APP) && make $(MAKETUNING) elf
+       cd $(DIR_APP)/src && make $(MAKETUNING) install-elf DESTDIR="/opt/$(MACHINE)-uClibc"
+       rm -vf /opt/$(MACHINE)-uClibc/lib/libslang.so*
 else
        cd $(DIR_APP) && ./configure --prefix=/usr --sysconfdir=/etc
-       cd $(DIR_APP) && make
-       cd $(DIR_APP) && make elf
-       cd $(DIR_APP) && make install-elf
+       cd $(DIR_APP) && make $(MAKETUNING)
+       cd $(DIR_APP) && make elf $(MAKETUNING)
+       cd $(DIR_APP) && make install-elf $(MAKETUNING)
        cd $(DIR_APP) && chmod -v 755 /usr/lib/libslang.so.2.0.6
 endif
        @rm -rf $(DIR_APP)
index 411316b..9b0ad5d 100644 (file)
@@ -36,7 +36,11 @@ DIR_APP    = $(DIR_SRC)/$(THISAPP)
 # Normal build or /tools build.
 #
 ifeq "$(ROOT)" ""
+ifeq "$(LFS_PASS)" "install"
+  TARGET = $(DIR_INFO)/$(THISAPP)-install
+else
   TARGET = $(DIR_INFO)/$(THISAPP)
+endif
 else
   TARGET = $(DIR_INFO)/$(THISAPP)-tools
 endif
@@ -80,6 +84,16 @@ $(TARGET) : $(patsubst %,$(DIR_DL)/%,$(objects))
        @$(PREBUILD)
        @rm -rf $(DIR_APP) && cd $(DIR_SRC) && tar jxf $(DIR_DL)/$(DL_FILE)
 ifeq "$(ROOT)" ""
+ifeq "$(LFS_PASS)" "install"
+       cd $(DIR_APP) && CFLAGS="-Os -fomit-frame-pointer" ./configure
+       cd $(DIR_APP) && echo "HAVE_SLANG=yes" >> make_include
+       cd $(DIR_APP) && echo "SLANGFLAGS=-I/opt/$(MACHINE)-uClibc/include/slang" >> make_include
+       cd $(DIR_APP)/fdisk && make cfdisk
+       cd $(DIR_APP)/fdisk && install -m 0755 cfdisk /install/initrd/bin
+       cd $(DIR_APP)/disk-utils && make LDFLAGS=-static mkfs.minix fsck.minix
+       cd $(DIR_APP)/disk-utils && install -m 0755 mkfs.minix /sbin/mkfs.minix.static
+       cd $(DIR_APP)/disk-utils && install -m 0755 fsck.minix /sbin/fsck.minix.static
+else
        cd $(DIR_APP) && sed -i 's@etc/adjtime@var/lib/hwclock/adjtime@g' \
                                hwclock/hwclock.c
        -mkdir -p /var/lib/hwclock
@@ -87,6 +101,7 @@ ifeq "$(ROOT)" ""
        cd $(DIR_APP) && ./configure
        cd $(DIR_APP) && make $(MAKETUNING) HAVE_KILL=yes HAVE_SLN=yes
        cd $(DIR_APP) && make HAVE_KILL=yes HAVE_SLN=yes install
+endif
 else
        cd $(DIR_APP) && sed -i 's@/usr/include@/tools/include@g' configure
        cd $(DIR_APP) && ./configure
diff --git a/make.sh b/make.sh
index b5d65fe..5eb8ba5 100644 (file)
--- a/make.sh
+++ b/make.sh
@@ -551,21 +551,23 @@ buildinstaller() {
   installmake sysvinit
   installmake e2fsprogs
   installmake misc-progs
-exiterror STOP HERE!
-  ipfiremake syslinux
-  ipfiremake as86
-  ipfiremake mbr
+  installmake sysfsutils
+#  installmake hwinfo
   installmake slang
   installmake util-linux
   installmake newt
   installmake pciutils
-  installmake pcmcia-cs
-  installmake kbd
+  installmake pcmciautils
   installmake installer
   installmake scsi.img
   installmake driver.img
   installmake initrd
   installmake boot.img
+exiterror STOP HERE!
+  ipfiremake syslinux
+  ipfiremake as86
+  ipfiremake mbr
+  installmake kbd
 }
 
 buildpackages() {
diff --git a/src/hwinfo/COPYING b/src/hwinfo/COPYING
new file mode 100644 (file)
index 0000000..1609d96
--- /dev/null
@@ -0,0 +1,341 @@
+----------------------------------------------------------------------
+
+                   GNU GENERAL PUBLIC LICENSE
+                      Version 2, June 1991
+
+ Copyright (C) 1989, 1991 Free Software Foundation, Inc.
+                          675 Mass Ave, Cambridge, MA 02139, USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+                           Preamble
+
+  The licenses for most software are designed to take away your
+freedom to share and change it.  By contrast, the GNU General Public
+License is intended to guarantee your freedom to share and change free
+software--to make sure the software is free for all its users.  This
+General Public License applies to most of the Free Software
+Foundation's software and to any other program whose authors commit to
+using it.  (Some other Free Software Foundation software is covered by
+the GNU Library General Public License instead.)  You can apply it to
+your programs, too.
+
+  When we speak of free software, we are referring to freedom, not
+price.  Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+this service if you wish), that you receive source code or can get it
+if you want it, that you can change the software or use pieces of it
+in new free programs; and that you know you can do these things.
+
+  To protect your rights, we need to make restrictions that forbid
+anyone to deny you these rights or to ask you to surrender the rights.
+These restrictions translate to certain responsibilities for you if you
+distribute copies of the software, or if you modify it.
+
+  For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must give the recipients all the rights that
+you have.  You must make sure that they, too, receive or can get the
+source code.  And you must show them these terms so they know their
+rights.
+
+  We protect your rights with two steps: (1) copyright the software, and
+(2) offer you this license which gives you legal permission to copy,
+distribute and/or modify the software.
+
+  Also, for each author's protection and ours, we want to make certain
+that everyone understands that there is no warranty for this free
+software.  If the software is modified by someone else and passed on, we
+want its recipients to know that what they have is not the original, so
+that any problems introduced by others will not reflect on the original
+authors' reputations.
+
+  Finally, any free program is threatened constantly by software
+patents.  We wish to avoid the danger that redistributors of a free
+program will individually obtain patent licenses, in effect making the
+program proprietary.  To prevent this, we have made it clear that any
+patent must be licensed for everyone's free use or not licensed at all.
+
+  The precise terms and conditions for copying, distribution and
+modification follow.
+\f
+                   GNU GENERAL PUBLIC LICENSE
+   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+  0. This License applies to any program or other work which contains
+a notice placed by the copyright holder saying it may be distributed
+under the terms of this General Public License.  The "Program", below,
+refers to any such program or work, and a "work based on the Program"
+means either the Program or any derivative work under copyright law:
+that is to say, a work containing the Program or a portion of it,
+either verbatim or with modifications and/or translated into another
+language.  (Hereinafter, translation is included without limitation in
+the term "modification".)  Each licensee is addressed as "you".
+
+Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope.  The act of
+running the Program is not restricted, and the output from the Program
+is covered only if its contents constitute a work based on the
+Program (independent of having been made by running the Program).
+Whether that is true depends on what the Program does.
+
+  1. You may copy and distribute verbatim copies of the Program's
+source code as you receive it, in any medium, provided that you
+conspicuously and appropriately publish on each copy an appropriate
+copyright notice and disclaimer of warranty; keep intact all the
+notices that refer to this License and to the absence of any warranty;
+and give any other recipients of the Program a copy of this License
+along with the Program.
+
+You may charge a fee for the physical act of transferring a copy, and
+you may at your option offer warranty protection in exchange for a fee.
+
+  2. You may modify your copy or copies of the Program or any portion
+of it, thus forming a work based on the Program, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+    a) You must cause the modified files to carry prominent notices
+    stating that you changed the files and the date of any change.
+
+    b) You must cause any work that you distribute or publish, that in
+    whole or in part contains or is derived from the Program or any
+    part thereof, to be licensed as a whole at no charge to all third
+    parties under the terms of this License.
+
+    c) If the modified program normally reads commands interactively
+    when run, you must cause it, when started running for such
+    interactive use in the most ordinary way, to print or display an
+    announcement including an appropriate copyright notice and a
+    notice that there is no warranty (or else, saying that you provide
+    a warranty) and that users may redistribute the program under
+    these conditions, and telling the user how to view a copy of this
+    License.  (Exception: if the Program itself is interactive but
+    does not normally print such an announcement, your work based on
+    the Program is not required to print an announcement.)
+\f
+These requirements apply to the modified work as a whole.  If
+identifiable sections of that work are not derived from the Program,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works.  But when you
+distribute the same sections as part of a whole which is a work based
+on the Program, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Program.
+
+In addition, mere aggregation of another work not based on the Program
+with the Program (or with a work based on the Program) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+  3. You may copy and distribute the Program (or a work based on it,
+under Section 2) in object code or executable form under the terms of
+Sections 1 and 2 above provided that you also do one of the following:
+
+    a) Accompany it with the complete corresponding machine-readable
+    source code, which must be distributed under the terms of Sections
+    1 and 2 above on a medium customarily used for software interchange; or,
+
+    b) Accompany it with a written offer, valid for at least three
+    years, to give any third party, for a charge no more than your
+    cost of physically performing source distribution, a complete
+    machine-readable copy of the corresponding source code, to be
+    distributed under the terms of Sections 1 and 2 above on a medium
+    customarily used for software interchange; or,
+
+    c) Accompany it with the information you received as to the offer
+    to distribute corresponding source code.  (This alternative is
+    allowed only for noncommercial distribution and only if you
+    received the program in object code or executable form with such
+    an offer, in accord with Subsection b above.)
+
+The source code for a work means the preferred form of the work for
+making modifications to it.  For an executable work, complete source
+code means all the source code for all modules it contains, plus any
+associated interface definition files, plus the scripts used to
+control compilation and installation of the executable.  However, as a
+special exception, the source code distributed need not include
+anything that is normally distributed (in either source or binary
+form) with the major components (compiler, kernel, and so on) of the
+operating system on which the executable runs, unless that component
+itself accompanies the executable.
+
+If distribution of executable or object code is made by offering
+access to copy from a designated place, then offering equivalent
+access to copy the source code from the same place counts as
+distribution of the source code, even though third parties are not
+compelled to copy the source along with the object code.
+\f
+  4. You may not copy, modify, sublicense, or distribute the Program
+except as expressly provided under this License.  Any attempt
+otherwise to copy, modify, sublicense or distribute the Program is
+void, and will automatically terminate your rights under this License.
+However, parties who have received copies, or rights, from you under
+this License will not have their licenses terminated so long as such
+parties remain in full compliance.
+
+  5. You are not required to accept this License, since you have not
+signed it.  However, nothing else grants you permission to modify or
+distribute the Program or its derivative works.  These actions are
+prohibited by law if you do not accept this License.  Therefore, by
+modifying or distributing the Program (or any work based on the
+Program), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Program or works based on it.
+
+  6. Each time you redistribute the Program (or any work based on the
+Program), the recipient automatically receives a license from the
+original licensor to copy, distribute or modify the Program subject to
+these terms and conditions.  You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties to
+this License.
+
+  7. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License.  If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Program at all.  For example, if a patent
+license would not permit royalty-free redistribution of the Program by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Program.
+
+If any portion of this section is held invalid or unenforceable under
+any particular circumstance, the balance of the section is intended to
+apply and the section as a whole is intended to apply in other
+circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system, which is
+implemented by public license practices.  Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+\f
+  8. If the distribution and/or use of the Program is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Program under this License
+may add an explicit geographical distribution limitation excluding
+those countries, so that distribution is permitted only in or among
+countries not thus excluded.  In such case, this License incorporates
+the limitation as if written in the body of this License.
+
+  9. The Free Software Foundation may publish revised and/or new versions
+of the General Public License from time to time.  Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+Each version is given a distinguishing version number.  If the Program
+specifies a version number of this License which applies to it and "any
+later version", you have the option of following the terms and conditions
+either of that version or of any later version published by the Free
+Software Foundation.  If the Program does not specify a version number of
+this License, you may choose any version ever published by the Free Software
+Foundation.
+
+  10. If you wish to incorporate parts of the Program into other free
+programs whose distribution conditions are different, write to the author
+to ask for permission.  For software which is copyrighted by the Free
+Software Foundation, write to the Free Software Foundation; we sometimes
+make exceptions for this.  Our decision will be guided by the two goals
+of preserving the free status of all derivatives of our free software and
+of promoting the sharing and reuse of software generally.
+
+                           NO WARRANTY
+
+  11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
+FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW.  EXCEPT WHEN
+OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
+PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
+OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.  THE ENTIRE RISK AS
+TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU.  SHOULD THE
+PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
+REPAIR OR CORRECTION.
+
+  12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
+REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
+INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
+OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
+TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
+YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
+PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGES.
+
+                    END OF TERMS AND CONDITIONS
+\f
+           How to Apply These Terms to Your New Programs
+
+  If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+  To do so, attach the following notices to the program.  It is safest
+to attach them to the start of each source file to most effectively
+convey the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+    <one line to give the program's name and a brief idea of what it does.>
+    Copyright (C) 19yy  <name of author>
+
+    This program is free software; you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation; either version 2 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with this program; if not, write to the Free Software
+    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+
+Also add information on how to contact you by electronic and paper mail.
+
+If the program is interactive, make it output a short notice like this
+when it starts in an interactive mode:
+
+    Gnomovision version 69, Copyright (C) 19yy name of author
+    Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+    This is free software, and you are welcome to redistribute it
+    under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License.  Of course, the commands you use may
+be called something other than `show w' and `show c'; they could even be
+mouse-clicks or menu items--whatever suits your program.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the program, if
+necessary.  Here is a sample; alter the names:
+
+  Yoyodyne, Inc., hereby disclaims all copyright interest in the program
+  `Gnomovision' (which makes passes at compilers) written by James Hacker.
+
+  <signature of Ty Coon>, 1 April 1989
+  Ty Coon, President of Vice
+
+This General Public License does not permit incorporating your program into
+proprietary programs.  If your program is a subroutine library, you may
+consider it more useful to permit linking proprietary applications with the
+library.  If this is what you want to do, use the GNU Library General
+Public License instead of this License.
diff --git a/src/hwinfo/ChangeLog b/src/hwinfo/ChangeLog
new file mode 100644 (file)
index 0000000..58c542d
--- /dev/null
@@ -0,0 +1,1956 @@
+22/3/2005:     v10.16
+       - updated X11 data (#74130)
+
+21/3/2005:     v10.15
+       - mls: faster hwscand
+
+21/3/2005:     v10.14
+       - updated X11 data (#74022)
+
+19/3/2005:     v10.13
+       - fix wrong entry for Fritz!Card DSL SL USB and
+         make ppp mode detection safer (#71995)
+       - adjusted ltmodem info (#71979)
+
+18/3/2005:     v10.12
+       - updated nongpl info
+       - reverting slamr patch (#72301)
+       - pcmcia info updated (#73057)
+       - pci dev names updated
+       - read /proc/modules less often
+       - updated X11 data
+       - aic7xxx/aic79xx driver info update
+       - fix Fritz!Box Fon entry in database
+
+17/3/2005:     v10.11
+       - another notebook (#67412)
+       - do wlan detection for --netcard (#73077)
+       - remove Eicon cards from 64 bit archs, the driver does not support
+         64 bit yet (#55722)
+
+16/3/2005:     v10.10
+       - updated notebook display data
+       - fix udev db reading
+       - updated X11 data
+       - ltmodem device id update
+       - no check for gfx card changes (#72907)
+
+14/3/2005:     v10.9
+       - hardware detection for ISDN PCMCIA cards (#71208)
+       - updated ISDN data
+       - updated X11 data
+       - better network type detection (#70991, #71231, #67325)
+       - load some acpi modules on hp notebook (#72146)
+       - fixed isapnp sound card detection (#67303)
+       - slamr: ttySL0 -> ttyLT0 (#72301)
+
+7/3/2005:      v10.8
+       - updated X11 data
+
+4/3/2005:      v10.7
+       - s390: made ccwgroup walking more robust
+       - fixed bios base mem detection
+       - allow device class in 'hwinfo --db' request
+       - updated X11 data
+
+28/2/2005:     v10.6
+       - jg: improved wlan patch (no dependency on libiw)
+
+28/2/2005:     v10.5
+       - fixed model name for some SGI hardware (#63973)
+       - fix Fritz!Card DSL SL USB ID (#66674)
+       - better heuristics to assign BIOS driver numbers (#66669)
+       - removed ahci vs. ata_piix hack (#65218)
+
+25/2/2005:     v10.4
+       - report pci class 0x403 as audio devices (#66466)
+       - load ahci *and* ata_piix (#65218)
+       - symlink /dev/fb might be missing; trying fb0, too (#66501)
+       - reorder modules.pcimap entries so that more specific matches are
+         considered first (#66594)
+       - ensure nvida network cards are network cards (#65852)
+       - updated X11 data 
+
+23/2/2005:     v10.3
+       - reworked pcmcia code to give cardbus devices sysfs ids
+
+21/2/2005:     v10.2
+       - jg: added wlan feature detection
+
+17/2/2005:     v10.1
+       - notebook lcd data update
+       - build shared tiny lib
+
+15/2/2005:     v10.0
+       - libhd interface changes: geometry values
+       - prepare for wlan feature detection
+       - x11 db update
+       - better disk geometry handling
+
+8/2/2005:      v9.36
+       - added '--kernel-version' option
+
+31/1/2004:     v9.35
+       - updated X11 data
+
+14/12/2004:    v9.34
+       - fixed access to undefined memory (#39238)
+       - fix segfault when using 'x11=foo' boot option (#46367)
+       - add additional check to catch broken BIOSes (#48665)
+       - abort BIOS code execution if it takes too long (#48665)
+       - find usb serial lines
+
+2/12/2004:     v9.33
+       - s390: identify new CU types 2107, 1750 as DASD
+       - fixed some dvb entries (#47057)
+       - s390: added new prog_if ID pif_dasd_fba to identify FBA DASDs
+         (reqd. by fehr)
+       - less agressively assume scsi devs are disks (#47654)
+       - fixed external hardware db parser (#47606, comment 6)
+       - ibm notebook data updated
+       - avoid libsysfs accidentally reading pci config space
+       - fixed parsing of scsi serial id (#48757)
+       - look at /sys/class/net/*/type, too (#48812)
+
+13/10/2004:    v9.32
+       - report network interfaces correctly even though udev lists them
+
+12/10/2004:    v9.31
+       - report usb host-to-host links as network devs (#22739)
+
+11/10/2004:    v9.30
+       - find ide devices != cdrom & disk (#39911, #45229)
+       - return special ids for synaptics touchpad (#46649)
+
+7/10/2004:     v9.29
+       - fixed segfault with large /proc/interrupt entries (e.g. 512 cpus) (#46582)
+
+1/10/2004:     v9.28
+       - list bluetooth isdn box as bt device, too (#46626)
+
+1/10/2004:     v9.27
+       - smartlink-softmodem is back (#46594)
+       - added some dvb cards (#46612)
+
+30/9/2004:     v9.26
+       - updated X11 data (#45870)
+
+29/9/2004:     v9.25
+       - removed obsolete module info; reworked pcmcia info
+
+29/9/2004:     v9.24
+       - updated pcmcia & usb network data (#33647)
+       - updated pci device names
+
+29/9/2004:     v9.23
+       - use SG_IO for SCSI device accesses (#46058)
+
+28/9/2004:     v9.22
+       - added gen-hwcfg-disk.sh (#46311)
+
+27/9/2004:     v9.21
+       - updated ancient audio info (#46096)
+       - add ipw/atmel firmware packages (#45960)
+       - updated X11 data
+       - added new isdn cards to database
+
+27/9/2004:     v9.20
+       - report bluetooth devices (#45893)
+
+24/9/2004:     v9.19
+       - return package info for sony notebooks, too (35245)
+
+23/9/2004:     v9.18
+       - added --pcmcia option to hwscanqueue (#44290)
+       - return package info in system entry (#35245)
+
+22/9/2004:     v9.17
+       - updated X11 data
+
+21/9/2004:     v9.16
+       - drop workaround for multiple hotplug events by broken kernel
+
+21/9/2004:     v9.15
+       - replaced raiddetect with dmraid
+
+20/9/2004:     v9.14
+       - sata info update (#45551)
+       - look at smbios data for smp detection, too
+
+17/9/2004:     v9.13
+       - added some epson scanners (#45074)
+       - adaptec module info update
+
+13/9/2004:     v9.12
+       - kernel-nongpl stuff only for i386 (#45099)
+       - updated megaraid module info
+       - ibm notebook info update (#45038)
+
+13/9/2004:     v9.11
+       - clear hd_data struct after it has been released (#44855)
+       - updated X11 data
+       - changed sata vendor name handling a bit
+       - isdn: remove old bluetooth packages from database
+
+10/9/2004:     v9.10
+       - sata driver seems to generate a dummy scsi vendor name (#44286)
+
+6/9/2004:      v9.9
+       - updated tv-card info
+
+6/9/2004:      v9.8
+       - removed ancient function hd_has_special_eide()
+       - use edd module to get extended BIOS features (#44649)
+       - 'hwinfo --map' includes a hardware scan
+
+3/9/2004:      v9.7
+       - win modem dev name change (#44253)
+       - added nongpl module info
+       - fixed /tmp file handling (#44538)
+
+30/8/2004:     v9.6
+       - changed hwbootscan to use bash (#44199)
+       - fixed hd.ids parser bug
+       - updated X11 data
+
+23/8/2004:     v9.5
+       - updated X11 data
+       - added display sizes for a number of IBM notebooks
+
+18/8/2004:     v9.4
+       - new wlan data (#42759, #39481, #43921)
+       - hwscan now really moved to /sbin 
+
+16/8/2004:     v9.3
+       - move hwscan* to /sbin (#43601)
+
+5/8/2004:      v9.2
+       - push/pop don't work with 32bit regs on amd64 (#43531)
+
+4/8/2004:      v9.1
+       - get netcard link state via ethtool ioctl
+
+6/7/2004:      v9.0
+       - ids/src/s390: changed "OSA Express Ethernet card" to "OSA Express
+          Network card" (can be Token Ring, too)
+       - joined changes up to 8.60 from 9.1 branch:
+       - major 229, minors >= 128 are hvsi%u devies (host virtual
+          serial interface) (requested by IBM)
+       - ids/src/s390: use subclass 0x86 for OSA Express (bug #41461)
+       - changed Broadcom netcard name (#42362)
+       - dac960 data corrected (#41659)
+       - s390: set status.available to yes for IUCV devs (bug #41525)
+       - s390: give bus_iucv a name (bug #41525)
+       - s390: give the IUCV "controller" subclass ID and name (bug #41525)
+       - ia64: fixed unaligned accesses (#41589)
+       - check file size so we don't read outside mmap()-ed region
+       - ppc: handle iseries_veth correctly in loaded and unloaded module
+         state. #41347/LTC#8984
+       - send smaller scsi INQUIRY command (#38731)
+       - added scsi.noserial probe option; useful for some usb sticks (#40485)
+       - adding pci id fix from #40175
+       - updated b44 vs. bcm4400 data
+       - s390: fixed several DASD IDs
+       - s390: fixed --disk filtering (bug #41231)
+       - made --only more effective (#37933)
+       - hwscanqueue: closing file descriptors to allow parent to terminate
+       - added debug option to cpu emulation to help tracing bios related system
+         crashes (#40644)
+       - use sysfs_bus_id for unique ID calculation on CCW devices to avoid
+         duplicate IDs (bug #40587)
+       - read /proc/iSeries/config to get number of veth devs (#40527)
+       - load sg module before looking for scanners (#40478)
+       - updated usb scanner data (#40480)
+       - got latest pci device names from pciutils
+       - use mmap() to access /dev/mem & re-enable bios access
+         on ia64 (#34550)
+       - take out ips (#39993)
+       - fixed cdb_x11 script (#40335)
+       - updated X11 data (#40335)
+       - fixed UML fix (#40271)
+       - don't check alternate settings (#40266)
+       - added functions necessary to build a model name to tiny version;
+         this is needed by linuxrc (#39092)
+       - detect IUCV pseudodevices (bug #39456)
+       - added hd_busid_to_hwcfg() (bug #39456)
+       - updated X11 data (#39767)
+       - fixed strange side effect of UML detection (#39946)
+       - s390: enhance grouped channel detection using ccwgroup bus
+       - use *last* console parameter for serial console
+       - look for usb network cards (#37870)
+       - network class id cleanup (#39456)
+       - add bus.name for bus.id == bus_ccw
+       - avoid unspecific network types (#38874)
+       - fixed memory size detection (#34895, #38758)
+       - report UML network (#39521)
+       - 'hwinfo --map' returns mapping new -> old block
+         device names (#39437)
+       - s390: set is.notready flag on unformatted DASDs (bug #39174)
+       - rewrote serial console handling (#39029, #23322, #35824)
+       - updated X11 data (#39282)
+       - subclass 0x83 for xpnet card (#35867)
+       - add UML keyboard (#38922)
+       - s390: add bus id bus_ccw
+       - s390: set bus.id, sysfs_bus_id and sysfs_device_link for all devices
+       - s390: do not do pr_s390disks by default, and run it after pr_s390
+         to keep already detected non-disk devices from being deleted
+       - s390: implement rw/ro info properly
+       - s390: fake geometry and size of unformatted DASDs to most likely
+         values
+       - removed veth.* (not needed)
+       - fixed bug in modules.alias conversion script (#38800)
+       - fixed linmodem data (#38800)
+       - handle veth devices on iSeries (#38696, #37981)
+       - another de4x5 vs. tulip case (#39127)
+       - fixed cdrom config segfault (might happen while reading inconsistent
+         cdrom config data)
+       - support pSeries vscsi (#36029)
+       - bcm5700, not tg3 on ppc* (#38647)
+       - add Acer TravelMate 660 & Asus S5200N LCD sizes (#38149)
+       - make SGI IOC4 known as storage controller (#38628)
+       - support SGI XPNET (#35867)
+
+6/4/2004:      v8.38
+       - do call --partion with --fast in hwscand polling code
+
+6/4/2004:      v8.37
+       - fixed unique ids for pci devs (#37570)
+
+6/4/2004:      v8.36
+       - run raiddetect only on x86-like archs (#36157)
+       - don't run raiddetect if we didn't find any disks
+
+5/4/2004:      v8.35
+       - don't run raiddetect if --fast option is used
+
+5/4/2004:      v8.34
+       - make --only accept device names, too (#38265)
+       - check return value from hd_sysfs_id() (#38266)
+       - make it more resistant against strange libsysfs data (#38259)
+       - tg3 vs bcm5700 again (#38268)
+
+2/4/2004:      v8.33
+       - another wlan card (#38119)
+
+2/4/2004:      v8.32
+       - store driver list & sysfs info in hardware config files
+
+2/4/2004:      v8.31
+       - add Fritz!Card DSL SL USB in database
+       - hwbootscan: move icon creation from coldplug
+       - lt modem (#36552)
+       - fixed some module names (#37285, #37518)
+       - added dvb cards (#32730)
+       - use old bios disk assign code if there's no edd info
+
+1/4/2004:      v8.30
+       - wlan card detection fix (#37872)
+       - updated X11 data
+       - read isapnp from sysfs (#35157)
+
+1/4/2004:      v8.29
+       - hwscanqueue: remember commands and ignore the same commands for 20
+         seconds (workaround some unexpected signals from kernel)
+       - hwscand: set long timeout to 10 seconds
+       - hwscan*: add --partition command
+
+31/3/2004:     v8.28
+       - rewrote input device handling
+       - load ide-cd, sd_mod, sr_mod before looking for block devs (#37558)
+       - fixed usb printer detection
+       - run 'raiddetect' to tag ide soft raid devices
+       - minor vbe bios fixes
+
+30/3/2004:     v8.27
+       - changed bios probing to do less things
+       - added duplicate DASD detection code from the late dasd.c
+         to block.c (bug #37068)
+       - changed bios probing to do less things
+       - another winmodem (#37335)
+
+29/3/2004:     v8.26
+       - don't run modprobe if it doesn't exist
+
+29/3/2004:     v8.25
+       - add edd support
+
+28/3/2004:     v8.24
+       - added hwscand hwscanqueue
+       - use sysfs for usb devices
+       - scsi tapes detected again
+       - added hardware class 'tape'
+       - added getsysinfo script (collect data to debug hw detection)
+
+25/3/2004:     v8.23
+       - added hd_is_uml() to report if we're running in an UM kernel
+       - b44 vs. bcm4400 (#36763)
+       - fix inconsitency in device name list
+       - allow device names in 'hwscan --show'
+
+22/3/2004:     v8.22
+       - removed Intel-v92ham support (#36667)
+       - worked on new sysfs block code
+
+21/3/2004:     v8.21
+       - use sysfs for block devices
+
+15/3/2004:     v8.20
+       - fixed 8139cp/too module info (#36028)
+
+15/3/2004:     v8.19
+       - do not reverse sysfs order (libsysfs does it)
+       - updated X11 data
+       - return real device name, not udev symlink
+       - DSL hardware detection for none pppoe (kkeil)
+
+14/3/2004:     v8.18
+       - s390: added two missing DASD device types
+       - added '--root' option (for testing)
+       - added '--db' option for database queries
+       - fixed 'x11i' parameter handling
+       - read pci.handmap
+
+9/3/2004:      v8.17
+       - udevinfo moved to /usr/bin
+
+8/3/2004:      v8.16
+       - added host info for s390 SCSI devices
+       - added disk-only probing method for s390
+       - added WWPN, FCP LUN for s390 SCSI devices
+       - updated X11 data
+
+4/3/2004:      v8.15
+       - s390: added LCSS info to ccw_t
+       - link libhd against libsysfs
+       - added hw item for quick DASD rescanning
+       - updated digital camera ids.
+       - pci from sysfs finished
+       - network interfaces from sysfs
+
+1/3/2004:      v8.14
+       - fix smp detection on ia32e (#34742)
+       - store some new fields in unique-id files
+       - better error logging for vbios init
+       - disable all BIOS related things on ia64 (#34550)
+       - updated X11 data
+       - use sysfs for pci data (not default)
+
+24/2/2004:     v8.13
+       - include x86emu into libhd.so
+       - don't segfault if we couldn't get a shared memory segment
+
+23/2/2004:     v8.12
+       - fixed Makefile
+
+23/2/2004:     v8.11
+       - added '--version' (#31925)
+
+23/2/2004:     v8.10
+       - check for hyperthreading on amd64 (#34742)
+       - removed last references to ataraid from hardware db
+       - added new x86 emulator (#34545)
+       - return MacRISC<n> (#34591)
+
+17/2/2004:     v8.09
+       - handle '-' vs. '_' in module names
+
+17/2/2004:     v8.08
+       - isdn database optional read from /usr/share/hwinfo/ISDN.CDB.hwdb
+       - mk_isdnhwdb tool to convert CDB data to ISDN.CDB.hwdb
+       - fixed Makefile
+
+16/2/2004:     v8.07
+       - fixed ia64 unaligned access (#32396)
+       - use modprobe for tulip (#32911)
+
+11/2/2004:     v8.06
+       - fixed segfault on s390*
+       - removed special ia64 hardware data: new kernel, new game
+
+9/2/2004:      v8.05
+       - nvnet -> forcedeth (#25531)
+       - sata module data updated
+       - moved psaux mice to input/mice
+       - make convert_hd understand modules.alias files
+
+6/2/2004:      v8.04
+       - sysfs includes moved
+       - usb modules renamed
+       - really basic udev & sysfs support for block devs
+
+4/12/2003:     v8.03
+       - proper multichannel device detection (finally...)
+       - identify virtual reader/punch/printer
+
+2/12/2003:     v8.02
+       - build with "-pipe"
+       - accommodated to changes in format of /proc/dasd/devices
+       - ditched storage subclass dasd, introduced s390disk prog_if instead
+       - ditched fake CTC controller generation
+       - deal with unsorted bus trees in multichannel device detection
+
+18/11/2003:    v8.01
+       - converted s390 HW detection to sysfs
+       - moved CU/device models to separate data structure
+       - added more s390 devices
+       - rewrote parsing of SMBIOS data structures
+
+28/10/2003:    v8.00
+       - get pci config type from kernel log (#30704)
+       - add new flag 'cpuemu' to use cpu emulation on i386
+
+22/9/2003:     v7.30
+       - updated usb scanner & webcam data
+       - updated X11 data
+       - hwbootscan: split 'hwscan --pci --disk' call to avoid
+         wrong unique ids for some pci devices (#31545)
+
+21/9/2003:     v7.29
+       - updated X11 data
+
+18/9/2003:     v7.28
+       - set ATA RAID bus type to 'RAID' (#31235)
+
+17/9/2003:     v7.27
+       - don't make every parport into a printer (#31161)
+       - some driver data updated
+
+16/9/2003:     v7.26
+       - default to 'printer' if a class tag is missing in parport
+         autoprobe data (#30982)
+       - fixed serial console detection (#30936)
+
+15/9/2003:     v7.25
+       - pcmcia data update
+
+15/9/2003:     v7.24
+       - report pci modems (#30887)
+       - don't get fooled by removed pcmcia cards
+       - wlan data update (#30886, #30823, #30501)
+       - driver data update (#30384, #29468, #30745)
+
+15/9/2003:     v7.23
+       - ignore alternative usb interface settings
+
+11/9/2003:     v7.22
+       - updated X11 data
+       - don't read from cd drives that don't exist (#23248)
+
+10/9/2003:     v7.21
+       - fixed monitor data interpretation bug (#29718)
+
+9/9/2003:      v7.20
+       - more ltmodem ids
+       - uli: implementation of S/390 hardware detection
+
+8/9/2003:      v7.19
+       - updated driver info (#25457, #29481, #25531)
+       - updated X11 data
+       - added --combine option to check_hd to assist in creating
+         driver data
+       - fixed minor typos
+
+6/9/2003:      v7.18
+       - updated usb mouse data (#29719)
+       - better touch pad/track point reporting for notebooks
+       - fork() for serial mouse & modem detection (#25843, #26513)
+       - fixed hwbootscan (#29959)
+       - don't load imm.o module (#14175)
+
+2/9/2003:      v7.17
+       - catch more vm86() faults (#28381)
+       - added 'active' status flag (not modified by libhd)
+
+1/9/2003:      v7.16
+       - update ISDN CDB data
+       - catch faults inside vm86() code (#29571)
+       - give wlan cards their own subclass (#29506)
+       - updated X11 data
+
+28/8/2003:     v7.15
+       - iopl() may fail even if we're root (#29494)
+
+27/8/2003:     v7.14
+       - probe for multiple hardware classes at a time
+
+26/8/2003:     v7.13
+       - default ISDN data for all ARCH
+       - update ISDN CDB data
+
+26/8/2003:     v7.12
+       - updated X11 data (#29316)
+       - add ISDN database for ia64
+       - fix minor warnings
+
+25/8/2003:     v7.11
+       - don't try BIOS things on SGI Altix (#28663)
+
+25/8/2003:     v7.10
+       - added lots of new camera ids.
+       - new isdn data taken from cdb
+       - updated X11 data
+
+18/8/2003:     v7.09
+       - add ChildIDs field (reverse of ParentID)
+
+12/8/2003:     v7.08
+       - better internal hwclass handling
+
+11/8/2003:     v7.07
+       - define HARDWARE_DIR in hd.h
+
+8/8/2003:      v7.06
+       - use modprobe instead of insmod for scsi modules
+
+5/8/2003:      v7.05
+       - ltmodem is back
+       - parent id, again
+
+5/8/2003:      v7.04
+       - hp officejet scanner gets package info & own subclass
+
+1/8/2003:      v7.03
+       - reworked usb things
+
+18/7/2003:     v7.02
+       - changed disk size reading for 2.6
+       - more 2.6 header fixes
+
+17/7/2003:     v7.01
+       - store parent id (#27508) and hotplug field
+       - new attempt to work around broken cciss_ioctl.h inclue file
+
+16/7/2003:     v7.00
+       - detect pcmcia cards
+       - updated x11 data
+
+16/4/2003:     v6.20
+       - fixed megaraid info (#26325)
+
+27/3/2003:     v6.19
+       - scan for partitions
+
+13/3/2003:     v6.18
+       - ltmodem stuff makes trouble, removed (#25309)
+
+13/3/2003:     v6.17
+       - updated X11 data (#25217)
+
+12/3/2003:     v6.16
+       - be more careful when joining feature flags of
+         ide-scsi handled devices (#25169)
+
+12/3/2003:     v6.15
+       - limit the maximum amount of data we expect looking
+         for serial mice (#25153) 
+
+11/3/2003:     v6.14
+       - updated ide raid info (#25010)
+
+10/3/2003:     v6.13
+       - added more notebook data
+
+8/3/2003:      v6.12
+       - fixed ide-scsi detection bug (device names mixed up if more than
+         one device is handled by ide-scsi)
+
+8/3/2003:      v6.11
+       - updated data from pci utils
+
+8/3/2003:      v6.10
+       - detect wlan cards (#23491)
+
+7/3/2003:      v6.09
+       - usb multiple interfaces again: only for HID devices (#24824)
+       - add monitor vendor & device name
+       - allow hwscan to be disabled at boot time via 'hwprobe=-scan'
+
+6/3/2003:      v6.08
+       - updated X11 data
+       - added '--dsl' option to hwscan
+
+6/3/2003:      v6.07
+       - write ff to /dev/lp0 if imm.o didn't load (#14175)
+       - probe for scsi cache even in fast mode, else we miss scsi cd writers
+       - better Epson scanner detection (#20837)
+       - fixed stupid '\0'-missing-at-end-of-buffer bug
+       - added '--slient' option to hwscan (don't show ids)
+       - cleaned up notebook lcd detection and added more data
+
+4/3/2003:      v6.06
+       - fixed floppy detection (#24283)
+
+4/3/2003:      v6.05
+       - fixed ataraid detection (format of /proc/ide/ide?/config
+         changed, #23057, #24528)
+
+3/3/2003:      v6.04
+       - bcm instead of tg3 (request by ak)
+       - reenable mouse probing, but without serial mice and no dialog (#20309)
+       - support some winmodems
+       - updated X11 data
+
+26/2/2003:     v6.03
+       - better ZIP drive handling
+       - handle usb devices with multiple interfaces (#21487, #22223, #22843)
+       - removed 'Looking for braille...' line
+       - fixed multi-CDROM bug (#24280)
+       - save/restore feature flags (#23364)
+       - keep feature flags for ide-scsi handled drives (#23550)
+
+25/2/2003:     v6.02
+       - fixed 64 bit int -> pointer gcc warnings
+       - fixed minor database lookup bug
+       - database parser logs to logfile, not stderr
+       - support serial mice with really strange vendor ids (#24137)
+
+24/2/2003:     v6.01
+       - add fibre channel adapters to storage controller list (#23686)
+
+24/2/2003:     v6.00
+       - fixed gcc warnings
+       - updated module info
+       - increased major version
+
+18/2/2003:     v5.55
+       - added pppoe detection
+       - updated X11 data
+
+18/2/2003:     v5.54
+       - removed experimental code causing segfault on compaq machines
+
+10/2/2003:     v5.53
+       - remove mouse probing from hwbootscan, it sometimes
+         hangs and takes too long.
+       - add --fast to --cdrom probe, so the cdrom is not opened.
+       - updated X11 data
+
+4/2/2003:      v5.52
+       - fixed pci base addresses on 64bit archs (#21075)
+
+20/1/2003:     v5.51
+       - detection of more Microcom modems
+       - updated the pcmcia controllers fallback list
+       - added a minimal man page
+       - add AVM Fritz!Card DSL USB
+       - updated X11 data
+
+13/1/2003:     v5.50
+       - added Myrinet support (#21130)
+       - make it compile on !(x86_64 & ia64) again
+
+9/1/2003:      v5.49
+       - fixed some network card names (#22795)
+       - added wheel mouse data (#22797)
+       - make it compile on x86_64 & ia64 again
+
+13/12/2002:    v5.48
+       - cdrom feature list (dvd, cdr, etc)
+
+27/11/2002:    v5.47
+       - changed tg3/bcm* on ia64 (#21984)
+       - one ncr53c8xx vs. sym53c8xx issue (#21984)
+       - cleanup ISDN ids, remove unsupported protocols (#22179)
+
+25/11/2002:    v5.46
+       - rewrote assignment of BIOS driver numbers
+       - slight cleanup of int10 code
+
+19/11/2002:    v5.45
+       - use eepro100 instead of e100 on ia64 (#21055)
+
+18/11/2002:    v5.44
+       - fixed qla* module info (#21567)
+
+6/11/2002:     v5.43
+       - joined with 8.1 branch
+
+4/11/2002:     v5.42
+       - check for REDIRECT in hwscan init script (in case it gets called
+         from the commandline). #17773
+
+4/11/2002:     v5.41
+       - do some consistency checks on legacy data from BIOS area (#21462)
+
+17/10/2002:    v5.40
+       - updated megaraid info (#21043)
+
+10/10/2002:    v5.39
+       - updated tg3/bcm5700 driver info (#19913)
+
+7/10/2002:     v5.38
+       - added aacraid driver info (#20592)
+       - don't run yast if no keyboard is attached (#19768)
+
+30/9/2002:     v5.37
+       - add "Virtual" to veth description string (#20319)
+
+27/9/2002:     v5.36
+       - fixed floppy detection (#20269)
+       - x11 data update (#20182)
+       - added IBM ServeRAID ids (#20268)
+
+23/9/2002:     v5.35
+       - 'hwscan --pci' should add prom id (#19648)
+
+20/9/2002:     v5.34
+       - ia64: switch back to reading ACPI tables for SMP detection.
+
+18/9/2002:     v5.33
+       - fixed chksum call causing hwinfo to hang in some cases on ia64
+       - don't overwrite vga modelist
+
+10/9/2002:     v5.32
+       - avoid alignment problems on ia64
+       - fixed usb-cdrom probing (#19407, #19440)
+       - removed '--fast' for disk probing; instead, fixed i2o & cciss
+
+10/9/2002:     v5.31
+       - probe for cdrom & disk at boot (#19297)
+       - '--fast' option has effect on disk probing (no i2o & cciss)
+       - dmfe instead of tulip (#19271)
+       - convert_hd now understands XML properly
+       - removed outdated docs
+
+9/9/2002:      v5.30
+       - probe also USB isdn controllers (#18830)
+       - added '--help' option to check_hd & convert_hd
+       - converted pci info to utf8
+
+7/9/2002:      v5.29
+       - make sure usb floppies are reported as such (#12262)
+
+6/9/2002:      v5.28
+       - new x11 data
+       - report s390x arch properly
+
+5/9/2002:      v5.27
+       - added amd-8111 info
+       - fixed dpt info (#18914)
+       - always smp on s390* (#18990)
+       - changed pcnet32 description (#18892)
+
+4/9/2002:      v5.26
+       - show boot catalog address in cd info
+
+4/9/2002:      v5.25
+       - switched escon adapter from 0x70 to 0x8
+       - corrected number for CTC, IUCV, HSI and QETH
+       - fix usb isdn adapter detection (#18829)
+       - updated pci & usb data
+
+3/9/2002:      v5.24
+       - fixed ata raid code
+       - new usb mouse (#18296)
+
+3/9/2002:      v5.23
+       - updated x11 data
+
+02/9/2002:     v5.22
+       - code for detekting configured CTC, IUCV, HSI and QETH
+         adapters on s390/s390x
+       - fixed iSeries network id
+
+29/8/2002:     v5.21
+       - braille detection on sparc
+       - fixed script that reads CDB data
+       - log error messages from vm86 code
+       - better chipcard reader support
+       - use _exit instead of exit on some more places.
+       - prepared for uclibc
+       - save & restore resource data
+
+28/8/2002:     v5.20
+       - got rid of gcc warning
+
+28/8/2002:     v5.19
+       - added x86_64 x11 data
+
+27/8/2002:     v5.18
+       - changed dasd.c to accept old and new format of /proc/dasd/devices
+       - better serial mouse detection (#18384)
+
+27/8/2002:     v5.17
+       - msvec: detect some microcom modems (#15359)
+
+26/8/2002:     v5.16
+       - use "reprobe" as yast2 argument, not (.reprobe)
+       - added some new hardware types
+       - fixed usb & ieee1394 controller detection
+
+22/8/2002:     v5.15
+       - check cpuid for hyperthreading (#13532)
+       - add new bus id 'Virtual IO' for DASD (#18202)
+       - use grub on x86_64
+       - fixed s390 cpu detection
+
+20/8/2002:     v5.14
+       - mls: x86 emu for BIOS calls on ia64
+
+19/8/2002:     v5.13
+       - mls: x86 emu for BIOS calls on x86_64
+       - updated x11 data
+
+16/8/2002:     v5.12
+       - changes in libhd interface
+
+15/8/2002:     v5.11
+       - segfault in hwinfo, part 2
+       - fixed symbios module entry
+
+13/8/2002:     v5.10
+       - get isdn model name from isdn database
+       - updated megaraid info
+       - make install creates /etc/init.d
+
+13/8/2002:     v5.09
+       - added info for firewire module
+       - fixed convert_hd to work with perl 5.8
+
+12/8/2002:     v5.08
+       - fixed evil segfault in hwinfo
+       - updated docs
+
+9/8/2002:      v5.07
+       - moved unique key file to var/lib/hardware/unique-keys
+       - moved things from var/lib/libhd to var/lib/hardware
+       - added HD_VERSION #define to hd.h
+
+8/8/2002:      v5.06
+       - extended isdn package info
+       - detect dvb cards
+       - fixed reading driver info
+       - updated driver info
+       - changed tv card detection code
+
+6/8/2002:      v5.05
+       - minor libhd interface changes
+
+5/8/2002:      v5.04
+       - gmac -> sungem
+       - don't source rc.config
+       - report cardbus cards
+       - _exit instead of exit to avoid calling QT destructors in Yast2
+       - activated new database code
+
+22/7/2002:     v5.03
+       - updated x11 data
+
+22/7/2002:     v5.02
+       - run hwbootscan rc script after "kbd" script
+       - don't _change_ config status in hwbootscan
+       - save %gs register around vm86() syscall (%gs may be used in glibc)
+       - isdn changes
+       - better handling of dasd devs
+       - grub instead of lilo on ix86
+
+13/6/2002:     v5.01
+       - made ia64 cpu model entry more useful
+       - get bios led status
+
+6/6/2002:      v5.00
+       - assign hardware added via 'hwprobe' a proper inital status
+       - added alsa driver info
+       - dropped old pnpdump() code
+
+24/4/2002:     v4.26
+       - add x86-64 support
+
+27/3/2002:     v4.25
+       - prevent doubled cdrom hardware items
+
+27/3/2002:     v4.24
+       - fixed cdrom device detection (#15553)
+       - don't assign lp8 to nonexistent usb printers
+
+25/3/2002:     v4.23
+       - updated help texts
+
+25/3/2002:     v4.22
+       - recognize fibre channel controllers as storage controllers
+
+24/3/2002:     v4.21
+       - read bios data in libhd_tiny (to allow vaio handling in linuxrc, #12075)
+       - read /etc/module.pcimap, too (it's there during installation)
+       - new x11 data
+       - de4x5.o vs. tulip.o issue (#15303)
+       - added Netgear WLAN-Card data (#14848)
+
+21/3/2002:     v4.20
+       - remove /var/lib/hardware/LOCK in hwbootscan (#15217)
+       - updated X11 data
+       - prefer tg3 over bcm5700
+       - fixed broken framebuffer detection: reenabled & fixed pci setup code
+
+18/3/2002:     v4.19
+       - fixed segfault in ide code
+
+16/3/2002:     v4.18
+       - fixed bug that caused 'Processor' scsi devices to be treated
+         as disks (mentioned in #15007)
+
+14/3/2002:     v4.17
+       - udated mptbase driver info (#14732)
+       - better handling of usb-storage devices
+       - add mouse info we got from smbios
+       - use info from modules.pcimap
+       - detect memory size > 4GB (#14287)
+
+9/3/2002:      v4.16
+       - made hwbootscan an init script again, started after hotplug.
+       - do not delete the reconfig.needed files, but set configured=no
+         and needed=no to avoid problems with unsupported graphic cards.
+       - added usb ids from usbutils
+       - fixed network module info (#14529)
+       - improved smbios parser
+       - updated x11 driver info
+       - isdn: fix wrong names (AVM) and add more USB devices
+       - disabled pci setup code that caused infinite loops on
+         some systems with isa gfxcards
+
+4/3/2002:      v4.15
+       - new isdn data
+       - look at /proc/apm, too
+       - updated network driver info
+       - detect fujitsu siemens notebook lcd
+       - updated x11 driver info
+       - updated pci device list
+       - check for isapnp devs in boot.hwscan, too
+
+1/3/2002:      v4.14
+       - detect USB scanner by just looking if the module is usbscanner
+       - new scanner ids
+       - camera subclass ids were 1 off from enumeration
+       - added some new hardware classes: bios, bridge, hub, usb_ctrl
+       - added '--pci' and '--isapnp' options to hwscan
+       - fixed evil segfault caused by reading some hardware configs
+       - added '--fast' option to hwscan: don't check for tricky hardware
+         as serial mice or parport zips unless they had been found
+         previously
+       - boot.hwscan: probe for mice & pci hardware only (to be faster)
+       - don't try to access 'not available' devices
+
+25/2/2002:     v4.13
+       - meissner: boot.hwscan:
+         probe for storage, network, tv, sound handware
+       - updated x11 data
+       - handle usb ehci controller
+       - added basic smbios parser
+
+21/2/2002:     v4.12
+       - meissner: boot.hwscan: fixed confused curses output
+       - new isdn database
+       - update 'not available' state
+       - changed unique_id algorithm for usb devices
+
+18/2/2002:     v4.11
+       - added new scanner
+       - updated x11 data
+       - experimental support for hpt3* ideraid
+
+12/2/2002:     v4.10
+       - meissner: mouse probing is in choose_mouse
+       - meissner: added arguments for light probing '(.reprobe)' as suggested by tom
+
+11/2/2002:     v4.09
+       - isdn database now in libhd, support for multiple isdn driver
+
+7/2/2002:      v4.08
+       - renamed a function to avoid conflicts with linuxrc
+
+7/2/2002:      v4.07
+       - fixed dac960 detection: we used to return just the 1st disk
+
+7/2/2002:      v4.06
+       - first attempt to handle ide raid controller
+       - use /proc/partitions to find disks, too
+
+6/2/2002:      v4.05
+       - make hd_list() work properly if LIBHD_TINY is defined
+       - added new braille display
+       - hwinfo accepts '--netcard' as alias to '--network_ctrl'
+
+4/2/2002:      v4.04
+       - store a config string along with the config status
+
+4/2/2002:      v4.03
+       - changed hd_change_status() prototype
+
+20/1/2002:     v4.02
+       - fixed bug that prevented hwprobe env var to work in some cases
+
+28/1/2002:     v4.01
+       - hwscan: touch /var/lib/hardware/.update if things have changed
+       - meissner: added boot scripts
+
+21/1/2001:     v4.00
+       - increased major version number, as we're incompatible to v3 meanwhile
+       - added function to set hardware config status data directly
+
+20/1/2002:     v3.40
+       - updated hwscan so it does something useful
+       - updated x11 data
+
+14/1/2002:     v3.39
+       - next try with dietlibc on sparc
+
+14/1/2002:     v3.38
+       - olh: assume veth always present
+       - make it work with dietlibc on sparc
+       - new class: hw_usb_ctrl
+
+4/1/2002:      v3.37
+       - reimplemented iSeries veth device detection (#12680)
+
+14/12/2001:    v3.36
+       - create version for linking against dietlibc
+       - mls: continue even if some vbe calls fail
+
+26/11/2001:    v3.35
+       - prepare for arm
+
+22/11/2001:    v3.34
+       - call cpu probe for keyboard query
+       - reduced libhd_tiny size
+
+2/11/2001:.    v3.33
+       - read country code from usb devices
+
+30/10/2001:    v3.32
+       - handle iSeries network and storage devices
+         return ppc64 when uname -m returns it
+
+18/10/2001:    v3.31
+       - gmac controllers are powered off when unconfigured, so
+         we have to provide the class id ourself (#11733)
+
+15/10/2001:    v3.30
+       - don't load parport modules on pmac (#11743)
+       - provide monitor sync data if they are missing
+
+10/10/2001:    v3.29
+       - more apple monitor fixes
+
+9/10/2001:     v3.28
+       - work around incorrect iMac monitor data
+
+8/10/2001:     v3.27
+       - ppc: detect swim3 floppy (#11643)
+       - ppc: pr_prom needs pr_pci in some cases
+       - add monitor entry based on fbdev data, if we have
+         nothing better (#11344)
+
+5/10/2001:     v3.26
+       - fix the check for active framebuffer (ppc)
+         the current one is a hack and doesnt work in all cases
+       - use pc104 instead of powerpcps2 (ppc)
+       - longer timeouts in modem detection (#11432)
+       - don't merge pci and proc data on ppc (#10435)
+       - pci data are inconsistent on ppc, remove consistency check (#11551)
+       - new x11 data (ppc)
+
+24/9/2001:     v3.25
+       - updated X11 data
+       - no longer default to XF3 for installation on ppc (#11260)
+
+24/9/2001:     v3.24
+       - added LSIFC9xx/LSI409xx Fibre Channel (#11251)
+
+24/9/2001:     v3.23
+       - use aic7xxx_old one some controllers (#11202)
+       - use de4x5 instead of tulip for one card (#11093)
+       - updated X11 data
+
+20/9/2001:     v3.22
+       - make AIPTEK tablet a mouse again
+       - added old_unique_id field
+       - updated driver info
+
+19/9/2001:     v3.21
+       - new sound card
+       - new x11 data
+
+18/9/2001:     v3.20
+       - rewrote floppy detection to make it work on non-i386 archs
+       - new x11 data
+
+11/9/2001:     v3.19
+       - updated X11 data
+       - get current video mode
+
+10/9/2001:     v3.18
+       - updated X11 data
+       - make it work with diet-libc
+       - should correctly report vmware cards now
+
+4/9/2001:      v3.17
+       - changed unique_id calculation (#10139)
+       - introduced arch_ppc64, CHRP64 -> CHRP
+       - new X11 data
+
+3/9/2001:      v3.16
+       - usb printer device names have changed
+       - new x11 data
+       - fixed segfault bug in ide-scsi handling
+
+29/8/2001:     v3.15
+       - new x11 data
+       - ignore obviously broken ddc info
+
+27/8/2001:     v3.14
+       - new qlogic driver info (#9868)
+       - completely new x11 data
+
+23/8/2001:     v3.13
+       - fixed to work with the new cpqarray driver
+       - fixed evil database bug (#9798)
+
+20/8/2001:     v3.12
+       - removed usb network module info
+       - added iSeries disks
+
+17/8/2001:     v3.11
+       - added usb network data
+
+17/8/2001:     v3.10
+       - install in $DESTDIR
+       - handle ide-scsi drives
+       - fix segfault bug in apm detection
+
+9/8/2001:      v3.09
+       - fixed some drivers.audio entries
+
+6/8/2001:      v3.08
+       - added sungem
+       - fixed qlogicfc entry
+       - fixed tv card detection
+
+1/8/2001:      v3.07
+       - fixed typo in short model name calculation
+
+31/7/2001:     v3.06
+       - make now builds shared version per default
+
+30/7/2001:     v3.05
+       - integrated hwscan
+
+27/7/2001:     v3.04
+       - added chipcard reader support
+       - added camera (webcam) support
+       - added framebuffer support (currently: VESA)
+
+26/7/2001:     v3.03
+       - support (usb) joysticks
+
+25/7/2001:     v3.02
+       - added access functions for /var/lib/hardware/ to libhd
+       - hwinfo: no progress info if output is redirected
+       - hwinfo: multiple arguments allowed
+       - assign a hw_class
+
+24/7/2001:     v3.01
+       - report smp capability only if >1 processors are active
+
+23/7/2001:     v3.00
+       - SMP code can now handle empty MP tables
+       - support module lists in driver info
+       - new 'manual' flag indicating hardware that was not
+         detected but entered manually
+       - report usb capability only if the controller has an irq assigned
+
+27/6/2001:     v2.22
+       - added usb scanner detection
+       - set gpm protocol to imps2 for wheel mice
+       - bios based monitor detection enabled per default
+       - made usb module loading default
+
+25/6/2001:     v2.21
+       - sndirsch: corrected 3D info for geforce3 cards
+
+21/6/2001:     v2.20
+       - updated driver info for new gdth.o
+
+19/6/2001:     v2.19
+       - fixed for s390x
+
+13/6/2001:     v2.18
+       - schwab: don't dereference free'd pointer
+       - prefer e100.o over eepro100.o (#8797)
+       - fixed framebuffer mode detection bug (#8620)
+
+7/6/2001:      v2.17
+       - fixed keyboard detection on sparc
+
+22/5/2001:     v2.16
+       - dan: fix usb modem bug (#8490)
+       - remove 3d & xf_v3 driver info for ia64
+
+14/5/2001:     v2.15
+       - use isapnp_reset=0 for loading isa-pnp.o
+
+11/5/2001:     v2.14
+       - new driver data for 3c509
+       - X11 data updated
+       - have i2o cards listed as storage controllers (#6335)
+
+10/5/2001:     v2.13
+       - increase /dev/psaux timeout
+       - adapted missing keyboard detection for kernel 2.4
+
+10/5/2001:     v2.12
+       - less things in libhd_tiny.a
+       - read block 0 from disks _before_ going to look for the boot device
+       - vmware detection clobbers %ebx; fixed
+       - completely new monitor data base (#7536)
+
+7/5/2001:      v2.11
+       - preserve %ebx in i10_v86.c::vm86_rep
+
+7/5/2001:      v2.10
+       - rewrote isapnp detection for 2.4 kernel
+       - updated driver info data
+       - added "Baum" braille display detection
+
+3/5/2001:      v2.09
+       - support vbe bios calls to get monitor data (default: disabled)
+       - added more usb wheel mice
+
+3/5/2001:      v2.08
+       - added vmware check
+       - don't do scsi write cache detection in vmware
+       - added ia64 smp detection
+       - ia64 x11 data added
+       - use tulip instead of de4x5 (#7317)
+
+30/4/2001:     v2.07
+       - updated x11 data
+       - fixed multi-head display handling
+       - adapted compaq smart array detection for kernel 2.4
+
+25/4/2001:     v2.06
+       - parport detection updated for kernel 2.4
+       - add scsi hostadapter info to debug output
+       - usb-storage again
+       - boot_ia64 -> boot_elilo
+
+24/4/2001:     v2.05
+       - worked on usb-storage support
+       - no isa-pnp probing in linuxrc
+
+20/4/2001:     v2.04
+       - better usb-storage support
+
+19/4/2001:     v2.03
+       - reworked floppy detection
+       - identify devices with removable media
+       - zip drives are always reported as floppies
+
+18/4/2001:     v2.02
+       - reworked ps/2 mouse code
+       - provide number of buttons/wheels for mice
+       - X11 data updated (ia32)
+
+7/4/2001:      v2.01
+       - new output format for support tool
+       - more options for hwinfo
+       - include pcmcia/cardbus cards in device lists
+
+5/4/2001:      v2.00
+       - new major version due to incompatible interface changes
+       - integrated experimental changes (split was after v1.90)
+
+3/4/2001:      v1.99
+       - fixed segfault bug in alpha smp code
+
+26/3/2001:     v1.98
+       - unique id format changed
+
+21/3/2001:     v1.97
+       - fixed src/ids/Makefile for axp
+       - slightly changed display detection code on axp
+
+20/3/2001:     v1.96
+       - new axp x11 data
+
+28/2/2001:     v1.95
+       - stepan: removed ISDN on alpha
+       - avoid trigraphs while generating the data base
+
+22/2/2001:     v1.94
+       - fixed hd_copy() segfault bug (ppc)
+
+21/2/2001:     v1.93
+       - implemented SMP detection on ppc
+
+20/2/2001:     v1.92
+       - backport of new SMP detection code (ia32)
+       - get console speed from kernel command line (ppc)
+
+15/2/2001:     v1.91
+       - fixed evil scsi device detection bug
+         (missing scsi devices under some strange circumstances)
+       - don't probe physical scsi geometry
+
+12/2/2001:     v1.90
+       - changed display adapter detection code to prefer sbus cards
+
+9/2/2001:      v1.89
+       - kkaempf: "ld -shared" is forbidden, changed to "gcc"
+
+7/2/2001:      v1.88
+       - new x11 data (sparc)
+
+31/1/2001:     v1.87
+       - mls: new oem stuff
+
+30/1/2001:     v1.86
+       - new x11 data (sparc)
+
+29/1/2001:     v1.85
+       - kukuk: sparc keyboard patches
+
+23/1/2001:     v1.84
+       - mls: added '--packages' option to hwinfo
+
+21/1/2001:     v1.83
+       - new x11 data (sparc)
+
+19/1/2001:     v1.82
+       - ncr*.o instead of sym*.o for 53c895a
+       - new x11 data (ia32)
+
+18/1/2001:     v1.81
+       - fixed ISAPnP device name handling
+       - back to ncr*.o for 53c875 [devid 0xf] (#5816)
+       - added new tulip card
+
+17/1/2001:     v1.80
+       - updated dac960 driver info
+
+17/1/2001:     v1.79
+       - new x11 data
+       - added '--help' option to hwinfo
+       - implemented a basic getopt-style hwinfo interface
+       - activate pr_bios if pr_misc is set
+
+16/1/2001:     v1.78
+       - updated driver info (starfire/qla2x00)
+
+16/1/2001:     v1.77
+       - back to old version scheme to avoid update problems
+
+15/1/2001:     v1.0.76
+       - updated scsi driver info
+
+15/1/2001:     v1.0.75
+       - new x11 data
+       - make XF 4 default if no X11 info is found (ia32 only)
+       - fixed serial line detection bug
+
+14/1/2001:     v1.0.74
+       - updated pci name list
+       - updated scsi/network driver info
+
+12/1/2001:     v1.0.73
+       - new x11 data
+       - sym*.o instead of ncr*.o for 53C875
+       - quick fix for Wacom tablets
+
+12/1/2001:     v1.0.72
+       - fix minor bug in printer detection
+       - fix bios disk number detection
+
+11/1/2001:     v1.0.71
+       - arvin: made res_pppd_option work
+       - arvin: fixed detection of terminal adapters
+       - sped up new modem stuff if no modem is connected
+
+11/1/2001:     v1.0.70:
+       - new x11 data (sparc)
+
+10/1/2001:     v1.0.69
+       - introduced res_pppd_option
+       - new x11 data (ia32)
+
+9/1/2001:      v1.0.68
+       - smid@suse.cz: improved modem init string code
+
+8/1/2001:      v1.0.67
+       - fixed color depth handling
+       - fixed multi-soundcard bug
+       - new x11 data
+
+7/1/2001:      v1.0.66
+       - kendy@suse.cz: use BIOS port info for parport
+       - new x11 data for all archs
+       - 8139too instead of rtl8139 whenever possible
+
+20/12/2000:    v1.0.65
+       - added modem init string patch from smid@suse.cz
+
+19/12/2000:    v1.0.64
+       - added cciss stuff
+       - updated x11 data
+
+18/12/2000:    v1.0.63
+       - BIOS lba stuff now works
+
+18/12/2000:    v1.0.62
+       - updated x11 data
+
+14/12/2000:    v1.0.61
+       - updated x11 data
+       - build pnpdump only on i386 and alpha
+       - hwinfo can now update x11 info in install.inf
+
+13/12/2000:    v1.0.60
+       - hwinfo can now update braille info in install.inf
+       - activate alva braille detection
+
+13/12/2000:    v1.0.59
+       - updated x11 data
+
+12/12/2000:    v1.0.58
+       - new version number scheme (due to shared lib)
+       - create shared libhd
+       - report BIOS lba extension support
+       - rearranged building libhd_tiny a bit
+
+12/12/2000:    v1.57
+       - fixed isapnp segfault bug
+       - updated x11 data
+
+8/12/200:      v1.56
+       - new alva detection code
+       - added cd-r/dvd detection
+       - read "el torito" boot info
+       - updated x11 info
+
+7/12/2000:     v1.55
+       - fixed evil hddb bug
+       - added 3d script field
+
+9/11/2000:     v1.54
+       - started work on hddb fix
+       - renamed timeout -> hd_timeout
+
+27/10/2000:    v1.53
+       - remove memory leaks, part 2 (ppc)
+
+26/10/2000:    v1.52
+       - add CD-RW detection (and DVD)
+
+25/10/2000:    v1.51
+       - remove memory leaks, part 1
+
+10/10/2000:    v1.50
+       - distinguish between chrp & chrp64
+
+10/10/2000:    v1.49
+       - provide a unique key for every hardware item
+
+10/10/2000:    v1.48
+       - cpu/smp detection code improved
+
+28/9/2000:     v1.47
+       - sparc: new x11 info
+
+22/9/2000:     v1.46
+       - ppc: fixed serial line & modem detection
+
+21/9/2000:     v1.45
+       - provide CHPID on s390
+
+20/9/2000:     v1.44
+       - added missing closedir()
+
+18/9/2000:     v1.43
+       - improved /proc/interrupt parsing
+       - ppc: always return a ps/2 mouse for PreP & CHRP
+       - skip serial device detection for console & yast2ser /proc/cmdline
+         entries
+       - ids updated
+
+18/9/2000:     v1.42
+       - now *really* disabled braille except on ia32
+
+15/9/2000:     v1.41
+       - ppc: changed some ids
+
+13/9/2000:     v1.40
+       - serial console detection for ppc
+
+13/9/2000:     v1.39
+       - ppc x11 driver info
+       - ppc serial console
+       - braille only on ia32
+       - fixed scsi segfault bug
+
+8/9/2000:      v1.38
+       - updated device ids
+       - added basic i2o support
+       - disabled isapnp on ppc
+
+7/9/2000:      v1.37
+       - fixed modem segfault bug
+       - fixed Zip device detection
+
+6/9/2000:      v1.36
+       - s390 network devices
+
+5/9/2000:      v1.35
+       - s390: finds disks
+       - ppc: better sound detection
+
+25/8/2000:     v1.34
+       - new platform cpu entry on alpha
+
+24/8/2000:     v1.33
+       - better monitor & display detection on ppc
+
+23/8/2000:     v1.32
+       - made libhd at least to compile on s390
+
+23/8/2000:     v1.31
+       - slightly changed memory detection
+       - ADB mice: /dev/input/mice
+
+15/8/2000:     v1.30
+       - added monitor detection on ppc
+       - fixed iso9660 info reading 
+
+14/8/2000:     v1.29
+       - added PROM parser for ppc; currently handles
+          SCSI, network, sound & floppy devices
+
+9/8/2000:      v1.28
+       - added pr_misc to hw_isdn
+       - fixed memory size detection
+       - added 'generation' to system entry (for ppc)
+       - new scsi detection code
+       - kukuk: PS/2 keyboard detection on UltraSPARC
+
+28/7/2000:     v1.27
+       - fixed 'x11' parameter parsing
+
+27/7/2000:     v1.26
+       - added '--special' option to hwinfo (needed for live CD)
+       - updated x11 data
+
+24/7/2000:     v1.25
+       - SMP detection: look for 'apic' flag
+       - updated x11 data
+
+20/7/2000:     v1.24
+       - fixed Vaio detection
+       - updated special ide chipset list
+       - included more functions in LIBHD_TINY
+       - updated x11 data
+
+19/7/2000:     v1.23
+       - updated x11 data
+
+18/7/2000:     v1.22
+       - dropped alva probing
+       - updated x11 data
+
+15/7/2000:     v1.21
+       - fixed isapnp isdn probing bug
+       - updated x11 data
+
+14/7/2000:     v1.20
+       - fixed stupid printer probing bug
+       - updated x11 data
+
+13/7/2000:     v1.19
+       - fixed bootdevice detection bug
+       - detect PowerBooks
+
+12/7/2000:     v1.18
+       - updated alsa driver info
+       - updated minicdb id data
+       - fixed missing isapnp sound cards bug
+
+11/7/2000:     v1.17
+       - added Sony Vaio detection
+       - changed lance driver entry
+       - fixed isdn/network card bug
+       - updated id data
+
+10/7/2000:     v1.16
+       - pnpdump: start port scanning at port 0x20b, not 0x203
+         (skips potential game port)
+       - get ids directly from minicdb
+
+7/7/2000:      v1.15
+       - fixed hw_sys/hw_tv probing bug
+
+6/7/2000:      v1.14
+       - new 'system' hw entry
+       - sparc smp detection: active -> probed
+
+5/7/2000:      v1.13
+       - added parallel Zip drive detection
+
+3/7/2000:      v1.12
+       - don't list cardbus/pcmcia devs in hd_list()
+       - add multimedia/video boards to display adapters
+
+27/6/2000:     v1.11
+       - increased timeout in fhp detection
+
+27/6/2000:     v1.10
+       - fixed bug in braille detection
+
+26/6/2000:     v1.09
+       - updated README
+       - fixed bug in 'hwprobe' handling
+
+26/6/2000:     v1.08
+       - new usb mouse devices
+
+22/6/2000:     v1.07
+       - activated serial line scanning in linuxrc
+       - extendend 'hwprobe=' features
+
+21/6/2000:     v1.06
+       - fhp_old braille detection implemented
+       - alva & ht braille stuff added
+
+21/6/2000:     v1.05
+       - changed (driver_info_x11_t).x11.raw to str_list_t
+
+21/6/2000:     v1.04
+       - added 'x11' kernel cmdline param
+
+20/6/2000:     v1.03
+       - fixed mk_ids (used to drop all non-x11 ids)
+       - improved 'hwprobe=' functionality
+       - fhp braille detection implemented
+
+20/6/2000:     v1.02
+       - updated pciutils & sax/sax2 data
+       - added fire gl1
+       - added 'hwprobe' env resp. kernel cmdline param
+
+13/6/2000:     v1.01
+       - new module info
+       - fix old VGA entries
+       - hw_tv now functional
+
+9/6/2000:      v1.00
+       - added hw_monitor, hw_printer, hw_tv, hw_scanner
+         [hw_tv, hw_scanner still non-funcional]
+       - improved ddc parsing (new syslinux!)
+
+7/6/2000:      v0.99
+       - added hd_list() function
+
+6//6/2000:     v0.98
+       - hd_display_list() function
+       - new SaX[2] data
+       - changed mk_ids to provide 3d *and* non-3d x11 entries
+
+31/5/2000:     v0.97
+       - provides info about bios disk ids
+
+30/5/2000:     v0.96
+       - extended X11 driver info (for XF86 4.0)
+       - added Thorsten's small SPARC patch
+       - extended serial line info
+       - note: v0.95 was a ppc quick-hack only version needed for 6.4;
+          it will not be integrated into the main tree
+
+24/5/2000:     v0.94
+       - fixed tmp file security hole
+       - added hd_{mouse/keyboard/floppy}_list() functions
+
+15/5/2000:     v0.93
+       - integrated Thorsten Kukuk's patches (mostly SPARC stuff)
+       - some minor other fixes
+
+17/4/2000:     v0.92
+       - ADB mouse driver info extended
+       - color code stuff updated
+
+11/4/2000:     v0.91
+       - fixed XkbModel typo on intel/axp
+       - ia64 patches from Andreas
+       - new Mac color code
+
+31/3/2000:     v0.89
+       - changed XkbModel to "powerpcps2" on chrp machines
+       - more iMac colors
+
+24/3/2000:     v0.88
+       - read color code on macs
+
+21/3/2000:     v0.87
+       - added Netfinity graphics card fix
+       - 3com net card driver adjustments
+       - ISDN info fix
+       - SPARC keyboard code
+       - added keyboard driver info
+
+14/3/2000:     v0.86
+       - flush serial buffer before close()
+
+8/3/2000:      v0.85
+       - some minor bug fixes
+
+8/3/2000:      v0.84
+       - changed display adapter probing to include bc_multimedia
+
+8/3/2000:      v0.83
+       - pci cards are attached to their resp. bridges
+       - card bus cards not listed by probe_by_class
+
+6/3/2000:      v0.82
+       - X server list fixes
+
+5/3/2000:      v0.81
+       - some monitor data
+
+4/3/2000:      v0.80
+       - new probing flag pr_scsi_geo: defaults to off due to
+          problems on scsi-Zip's
+
+3/3/2000:      v0.79
+       - tuned probing flags
+       - renamed drivers file
+       - added "Belinea 10 20 20" data (ddc info lies about supported modes!)
+
+29/2/2000:     v0.78
+       - new graphics cards
+
+28/2/2000:     v0.77
+       - modem fix: give default name if none could be determined
+       - added 3Com Robotics recognition
+       - added physical SCSI geometry
+
+28/2/2000:     v0.76
+       - automatic usb module loading
+       - rewrite of the probing flags stuff; new probing flags
+       - new hd_display() function
+
+26/2/2000:     v0.75
+       - pcmcia detection now looks at class ids
+       - fixed pcmcia detection bug
+       - added usb detection function
+
+26/2/2000:     v0.74
+       - added alsa isapnp sound cards
+
+25/2/2000:     v0.73
+       - sparc & baud rate fix
+       - new libihw
+       - minor usb improvements
+       - better keyboard detection
+       - ressource management for irqs
+       - isdn fixes/improvements
+       - added some sound cards
+
+24/2/2000:     v0.72
+       - libihw used only on ix86 & axp
+       - pc keyboard detection
+
+23/2/2000:     v0.71
+       - isdn stuff
+
+22/2/2000:     v0.70
+       - changed x11/3d driver info
+
+18/2/2000:     v0.69
+       - mouse code now resets serial lines
+
+18/2/2000:     v0.68
+       - new try at AGP detection
+       - improved mylex code
+       - added compaq smart raid detection
+       - improved scsi code
+
+17/2/2000:     v0.67
+       - improved CPU code on axp & ppc
+       - changed serial line code: use non-blocking open
+
+16/2/2000:     v0.66
+       - new ids
+       - added Mylex detection (dac960)
+
+15/2/2000:     v0.65
+       - a lot of driver info
+       - timeout problem opening serial devs?
+
+12/2/2000:     v0.64
+       - added some ids
+       - added Zoom modem detection
+
+11/2/2000:     v0.63
+       - fixed isapnp for ppc
+
+11/2/2000:     v0.62
+       - Makefile now knows about sparc64
+       - driver info: 3c90x vs. 3c59x; see comment in drivers.SuSE
+       - worked on ISDN stuff
+
+10/2/2000:     v0.61
+       - added peliminary usb storage device handling
+       - added ISA-PnP memory range decoding
+       - added ISDN probing for ISA cards (*very* preliminary)
+
+8/2/2000:      v0.60
+       - added UMAX USB scanner ids
+       - small modem fix (open fds)
+       - determines boot device
+
+5/2/2000:      v0.59
+       - improved boot floppy: now with usb support
+       - changed hw behavior: no listing on console if a logfile is used
+       - fixed missing baud defines on SPARC
+       - added 3d graphics card info
+       - changed internal mouse ids from PnP ids --> special ids
+       - some 64 bit pci fixes
+       - pci devices with missing class info: get class info from data base
+       - added more usb ids
+
+4/2/2000:      v0.58
+       - added generic ne2000 info
+       - improved printing of modules.conf entries
+       - moved ID handling macros (MAKE_ID, etc) to hd.h
+
+3/2/2000:      v0.57
+       - added lp-devices to mk_floppy
+       - added usb vendor list
+       - NOTE: hd_class_list() interface slightly changed!!!
+       - USB support complete rewritten
+       - modem fix: avoid selecting a device twice!
+       - driver info: take compatible devices into account
+
+2/2/2000:      v0.56
+       - more driver info
+       - added hd_smp_support()
+
+1/2/2000:      v0.55
+       - made hd_module_is_active() global
+       - added pcnet32 info
+       - added 'static' target
+       - fixed ddc string parser
+       - fixed monitor driver info parser
+       - added tiny target: -> libhd_tiny.a is minimum version for linuxrc
+
+27/10/2000:    v0.54
+       - rescan == 3 --> return new entries since last call with rescan == 2
+
+27/10/2000:    v0.53
+       - fixed driver entries with modules.conf lines
+       - fixed internal handling of modules.conf entries
+       - added new feature to hd_*_list() functions:
+         rescan == 2 --> return only new entries
+
+25/10/2000:    v0.52
+       - started this log :-)
+       - modem code now handles non-pnp modems
+       - added a baud resource to modem entries: holds the modem's max.
+         port speed
+       - added some modem ids
+       - updated docu (interface.html)
diff --git a/src/hwinfo/Makefile b/src/hwinfo/Makefile
new file mode 100644 (file)
index 0000000..72c7ffb
--- /dev/null
@@ -0,0 +1,95 @@
+TOPDIR         = $(CURDIR)
+SUBDIRS                = src
+TARGETS                = hwinfo hwscan hwscand hwscanqueue
+CLEANFILES     = hwinfo hwinfo.static hwscan hwscan.static hwscand hwscanqueue doc/libhd doc/*~
+LIBDIR         = /lib
+ULIBDIR                = /usr$(LIBDIR)
+LIBS           = -lhd
+SLIBS          = -lhd -lsysfs
+TLIBS          = -lhd_tiny -lsysfs
+SO_LIBS                = -lsysfs
+TSO_LIBS       = -lsysfs
+
+export SO_LIBS
+
+include Makefile.common
+
+SHARED_FLAGS   =
+OBJS_NO_TINY   = names.o parallel.o modem.o
+
+.PHONY:        fullstatic static shared tiny doc diet tinydiet uc tinyuc
+
+hwscan: hwscan.o $(LIBHD)
+       $(CC) hwscan.o $(LDFLAGS) $(LIBS) -o $@
+
+hwinfo: hwinfo.o $(LIBHD)
+       $(CC) hwinfo.o $(LDFLAGS) $(LIBS) -o $@
+
+hwscand: hwscand.o
+       $(CC) $< $(LDFLAGS) -o $@
+
+hwscanqueue: hwscanqueue.o
+       $(CC) $< $(LDFLAGS) -o $@
+
+# kept for compatibility
+shared:
+       @make
+
+tiny:
+       @make EXTRA_FLAGS=-DLIBHD_TINY LIBHD_BASE=libhd_tiny LIBS="$(TLIBS)" SO_LIBS="$(TSO_LIBS)"
+
+tinyinstall:
+       @make EXTRA_FLAGS=-DLIBHD_TINY LIBHD_BASE=libhd_tiny LIBS="$(TLIBS)" SO_LIBS="$(TSO_LIBS)" install
+
+tinystatic:
+       @make EXTRA_FLAGS=-DLIBHD_TINY LIBHD_BASE=libhd_tiny SHARED_FLAGS= LIBS="$(TLIBS)" SO_LIBS="$(TSO_LIBS)"
+
+tinystaticinstall:
+       @make EXTRA_FLAGS=-DLIBHD_TINY LIBHD_BASE=libhd_tiny SHARED_FLAGS= LIBS="$(TLIBS)" SO_LIBS="$(TSO_LIBS)" install
+
+diet:
+       @make CC="diet gcc" EXTRA_FLAGS="-fno-pic -DDIET" SHARED_FLAGS= LIBS="$(SLIBS)"
+
+tinydiet:
+       @make CC="diet gcc" EXTRA_FLAGS="-fno-pic -DLIBHD_TINY -DDIET" SHARED_FLAGS= LIBS="$(SLIBS)"
+
+uc:
+       @make CC="/opt/i386-linux-uclibc/bin/i386-uclibc-gcc" EXTRA_FLAGS="-fno-pic -DUCLIBC" SHARED_FLAGS= LIBS="$(SLIBS)"
+
+tinyuc:
+       @make CC="/opt/i386-linux-uclibc/usr/bin/gcc" EXTRA_FLAGS="-fno-pic -DLIBHD_TINY -DUCLIBC" SHARED_FLAGS= LIBS="$(SLIBS)"
+
+static:
+       make SHARED_FLAGS= LIBS="$(SLIBS)"
+
+fullstatic: static
+       $(CC) -static hwinfo.o $(LDFLAGS) $(SLIBS) -o hwinfo.static
+       $(CC) -static hwscan.o $(LDFLAGS) $(SLIBS) -o hwscan.static
+       strip -R .note -R .comment hwinfo.static
+       strip -R .note -R .comment hwscan.static
+
+doc:
+       @cd doc ; doxygen libhd.doxy
+
+install:
+       install -d -m 755 $(DESTDIR)/sbin $(DESTDIR)/usr/sbin $(DESTDIR)$(LIBDIR) $(DESTDIR)$(ULIBDIR)\
+               $(DESTDIR)/usr/include $(DESTDIR)/etc/init.d
+       install -m 755 hwinfo $(DESTDIR)/usr/sbin
+       install -m 755 hwscan hwscand hwscanqueue $(DESTDIR)/sbin
+       install -m 755 -s src/ids/check_hd $(DESTDIR)/usr/sbin
+       install -m 755 src/ids/convert_hd $(DESTDIR)/usr/sbin
+       if [ -f $(LIBHD_SO) ] ; then \
+               install $(LIBHD_SO) $(DESTDIR)$(LIBDIR) ; \
+               ln -snf $(LIBHD_NAME) $(DESTDIR)$(LIBDIR)/$(LIBHD_SONAME) ; \
+               ln -snf $(LIBDIR)/$(LIBHD_SONAME) $(DESTDIR)$(ULIBDIR)/$(LIBHD_BASE).so ; \
+       else \
+               install -m 644 $(LIBHD) $(DESTDIR)$(ULIBDIR) ; \
+       fi
+       install -m 644 src/hd/hd.h $(DESTDIR)/usr/include
+       install -m 755 hwbootscan getsysinfo gen-hwcfg-disk.sh $(DESTDIR)/usr/sbin
+       install -m 755 hwbootscan.rc $(DESTDIR)/etc/init.d/hwscan
+       install -m 755 src/isdn/cdb/mk_isdnhwdb $(DESTDIR)/usr/sbin
+       install -d -m 755 $(DESTDIR)/usr/share/hwinfo
+       install -m 644 src/isdn/cdb/ISDN.CDB.txt $(DESTDIR)/usr/share/hwinfo
+       install -m 644 src/isdn/cdb/ISDN.CDB.hwdb $(DESTDIR)/usr/share/hwinfo
+
diff --git a/src/hwinfo/Makefile.common b/src/hwinfo/Makefile.common
new file mode 100644 (file)
index 0000000..771fc31
--- /dev/null
@@ -0,0 +1,66 @@
+# libhd/Makefile.common
+
+ARCH   := $(shell uname -m)
+ifeq "$(ARCH)" "i486"
+ARCH   := i386
+endif
+ifeq "$(ARCH)" "i586"
+ARCH   := i386
+endif
+ifeq "$(ARCH)" "i686"
+ARCH   := i386
+endif
+ifeq "$(ARCH)" "parisc"
+EXTRA_FLAGS := -fPIC $(EXTRA_FLAGS)
+endif
+
+LIBHD_VERSION          := $(shell cat $(TOPDIR)/VERSION)
+LIBHD_MINOR_VERSION    := $(shell cut -d . -f 2 $(TOPDIR)/VERSION)
+LIBHD_MAJOR_VERSION    := $(shell cut -d . -f 1 $(TOPDIR)/VERSION)
+
+CC     = gcc
+LD     = ld
+CFLAGS = -Wall -O2 -pipe -g $(SHARED_FLAGS) $(EXTRA_FLAGS) -I/opt/i586-uClibc/include -I/opt/i586-uClibc/usr/include -I$(TOPDIR)/src/hd
+SHARED_FLAGS   = -fPIC
+
+LDFLAGS        = -Lsrc
+
+CFILES         = $(wildcard *.c)
+OBJS           = $(CFILES:.c=.o)
+LIBHD_BASE     = libhd
+LIBHD          = $(TOPDIR)/src/$(LIBHD_BASE).a
+LIBHD_SONAME   = $(LIBHD_BASE).so.$(LIBHD_MAJOR_VERSION)
+LIBHD_NAME     = $(LIBHD_BASE).so.$(LIBHD_VERSION)
+LIBHD_SO       = $(TOPDIR)/src/$(LIBHD_NAME)
+LIBHD_D                = $(TOPDIR)/src/.lib
+
+export CC TOPDIR CFLAGS LIBHD ARCH
+
+.PHONY: all distclean clean install subdirs
+
+%.o: %.c
+       $(CC) -c $(CFLAGS) $<
+
+all: subdirs $(TARGETS)
+
+install: all
+
+ifneq "$(SUBDIRS)" ""
+subdirs:
+       @for i in $(SUBDIRS) ; do make -C $$i $(MAKECMDGOALS) || exit ; done
+endif
+
+clean: subdirs
+       @rm -rf $(OBJS) .depend $(CLEANFILES) *~
+
+distclean: subdirs
+       @rm -rf $(OBJS) .depend $(CLEANFILES) $(DISTCLEANFILES) *~
+
+ifneq "$(CFILES)" ""
+ifeq ($(findstring $(MAKECMDGOALS), clean distclean),)
+.depend: $(CFILES)
+       @$(CC) -MG -MM $(CFLAGS) $(CFILES) >$@
+
+-include .depend
+endif
+endif
diff --git a/src/hwinfo/README b/src/hwinfo/README
new file mode 100644 (file)
index 0000000..2740fb5
--- /dev/null
@@ -0,0 +1,149 @@
+1. Usage
+========
+
+  hwinfo [debug=deb_flag] [log=log_file] [list[+]=hw_item] [[+|-]probe_option1] [[+|-]probe_option2] ...
+
+Examples:
+
+  hwinfo
+    - probes for nearly everything
+
+  hwinfo +all
+    - probes for everything
+
+  hwinfo log=hw_log
+    - default probing, output is written to hw_log
+      *** Please don't use "hwinfo >some_log 2>&1" to store the output into a
+      log file! ***
+
+  hwinfo -all +ide
+    - probe for ide drives only
+
+  hwinfo +all -isapnp -floppy
+    - probe for everything *except* isapnp and floppies
+
+Some probing flags do not stand for complete modules but enable additional
+features; e.g. "pci.range" or "cdrom.info".
+
+Example:
+  hwinfo -all +cdrom
+  gives a list of all cdrom's
+
+  hwinfo -all +cdrom.info
+  additionally reads the iso9660 info
+
+To get a list of all supported probing flags, call 'hwinfo -all'.
+
+
+2. Environment variables/kernel cmdline parameters
+==================================================
+
+You can control the hardware probing using the environment variable
+"hwprobe" and the kernel cmdline parameters "hwprobe" & "x11".
+
+If "hwprobe" is set on the kernel cmdline, the environment variable
+"hwprobe" is ignored. Otherwise, the meaning of both is exactly the same.
+
+  x11
+    - Controls the X server/X version to prefer. It is either "3" or "4" or the
+      name of the X server/X server module to use (XF3: server name without
+      the leading "XF86_", XF4: the server module name).
+
+      Examples:
+        x11=3
+          o prefer XFree86 3.x over 4.x (if possible)
+
+        x11=SVGA
+          o use the XF86_SVGA server (*** Even if the server does not
+            support the card! ***)
+
+        x11=nv
+          o use the XF4 nv_drv.o driver (*** Even if the module does not
+            support the card! ***)
+
+  hwprobe
+    - Controls which probing flags should *always* be set/cleared. (These
+      settings *cannot* be overridden by command line switches.)
+
+      Examples:
+        hwprobe=-isapnp
+          o *never* do any isapnp probing
+
+        hwprobe=-braille,-modem
+          o don't look for braille displays & modems
+
+    - Allows you to add and remove hardware from the probing results. In this case
+      the syntax is (-: remove, +: add at end of list, <nothing>: add at begin of
+      list):
+        hwprobe=[+-]<device_class>:<vendor_id>:<device_id>[:<unix_device_file>]
+
+      <device_class>, <vendor_id> and <device_id> are device ids as used by libhd.
+      See the output of hwinfo for examples. In connection with "-", you can use
+      "*" as a placeholder that matches every id.
+
+      Note: <unix_device_file> is optional.
+
+      Note2: you cannot usefully *add* hardware that needs more info than that
+      given by the hwprobe entry. Disks & floppies are notable examples.
+      (But you can *remove* them.)
+
+      Here is a typical hwinfo output for a mouse, with the relevant ids
+      underlined (<device_class> is the combined base_class & sub_class),
+      [see 1st example below]:
+
+        14: PS/2 00.0: 10500 PS/2 Mouse
+                       ^^^^^ -->       <device_class>
+          [Created at mouse.110]
+          Vendor: s0200 "Unknown"
+                  ^^^^^  -->           <vendor_id>
+          Model: 0002 "Generic PS/2 Mouse"
+                 ^^^^  -->             <device_id>
+          Device File: /dev/psaux
+                       ^^^^^^^^^^ -->  <unix_device_file>
+          Driver Info #0:
+            XFree86 Protocol: ps/2
+            GPM Protocol: ps2
+          Attached to: #8 (PS/2 Controller)
+
+
+      Examples:
+        hwprobe=+10500:s200:2:/dev/psaux
+          o add a ps/2 mouse [at the end of the hardware list]
+
+        hwprobe=10500:s200:2:/dev/psaux
+          o add a ps/2 mouse [at the start of the hardware list, so it
+            is our default mouse]
+
+        hwprobe=+10b00:s5001:0:/dev/ttyS0
+          o add a braille display connected to /dev/ttyS0
+
+        hwprobe=-10500:s200:2:/dev/psaux
+          o remove ps/2 mice attached to /dev/psaux
+
+        hwprobe=-10500:s200:2
+          o remove all ps/2 mice
+
+        hwprobe=-10500:*:*
+          o remove all ps/2 mice
+
+        hwprobe=-*:*:*:/dev/hdc
+          o remove /dev/hdc
+
+        hwprobe=+401:1274:5000
+          o add an ensoniq sound card
+
+      Grafics cards are are slightly trickier:
+
+        hwprobe=+300:1014:b7
+          o add a Fire GL1 card
+            Note: this way you'll get a multihead config. You'll probably
+            rather want the following example.
+
+        hwprobe=-300:*:*,+300:1014:b7
+          o remove all graphics cards; then add a Fire GL1 card
+
+        hwprobe=+400:121a:1
+          o add a 3fx voodoo card (Note the class "400", not "300"!)
+
+    - for more ids, see "src/ids/names.*" and "src/ids/drivers.*"
+
diff --git a/src/hwinfo/VERSION b/src/hwinfo/VERSION
new file mode 100644 (file)
index 0000000..ea158a2
--- /dev/null
@@ -0,0 +1 @@
+10.16
diff --git a/src/hwinfo/doc/example1.c b/src/hwinfo/doc/example1.c
new file mode 100644 (file)
index 0000000..7de3e47
--- /dev/null
@@ -0,0 +1,26 @@
+#include <stdio.h>
+#include <stdlib.h>
+
+#include <hd.h>
+
+int main(int argc, char **argv)
+{
+  hd_data_t *hd_data;
+  hd_t *hd;
+
+  hd_data = calloc(1, sizeof *hd_data);
+
+  hd = hd_list(hd_data, hw_scsi, 1, NULL);
+
+  for(; hd; hd = hd->next) {
+    hd_dump_entry(hd_data, hd, stdout)
+  }
+
+  hd_free_hd_list(hd);         /* free it */
+  hd_free_hd_data(hd_data);
+
+  free(hd_data);
+
+  return 0;
+}
+
diff --git a/src/hwinfo/doc/example2.c b/src/hwinfo/doc/example2.c
new file mode 100644 (file)
index 0000000..cc2a9db
--- /dev/null
@@ -0,0 +1,26 @@
+#include <stdio.h>
+#include <stdlib.h>
+
+#include <hd.h>
+
+int main(int argc, char **argv)
+{
+  hd_data_t *hd_data;
+  hd_t *hd;
+  unsigned display_idx;
+
+  hd_data = calloc(1, sizeof *hd_data);
+
+  hd = hd_list(hd_data, hw_display, 1, NULL);
+  display_idx = hd_display_adapter(hd_data);
+
+  hd_dump_entry(hd_data, hd_get_device_by_idx(hd_data, display_idx), stdout)
+
+  hd_free_hd_list(hd);
+  hd_free_hd_data(hd_data);
+
+  free(hd_data);
+
+  return 0;
+}
+
diff --git a/src/hwinfo/doc/footer.html b/src/hwinfo/doc/footer.html
new file mode 100644 (file)
index 0000000..62b274f
--- /dev/null
@@ -0,0 +1 @@
+</body></html>
diff --git a/src/hwinfo/doc/hwinfo.8 b/src/hwinfo/doc/hwinfo.8
new file mode 100644 (file)
index 0000000..03bca33
--- /dev/null
@@ -0,0 +1,92 @@
+.\" Michal Svec <msvec@suse.cz>
+.\"
+.\" Process this file with
+.\" groff -man -Tascii foo.1
+.\"
+.\"
+.TH HWINFO 8 "January 2003" "hwinfo" "System configuration"
+.\"
+.\"
+.SH NAME
+hwinfo \- probe for hardware
+.\"
+.\"
+.SH SYNOPSIS
+.B hwinfo [
+.I options
+.B ]
+.\"
+.\"
+.SH DESCRIPTION
+.B hwinfo
+is used to probe for the hardware present in the system. It can be used
+to generate a system overview log which can be later used for support.
+.\"
+.\"
+.SH OPTIONS
+.\"
+.TP
+.BI --debug " " level
+Set debug
+.B level.
+The debug info is shown only in the log file. If you specify a log file,
+the debug level is implicitly set to a reasonable value.
+.\"
+.TP
+.BI --dump-db " " n
+Dump hardware data base,
+.B n
+is either
+.B 0
+for the external data base, or
+.B 1
+for the internal data base.
+.\"
+.TP
+.BI --help
+Print a usage and exit.
+.\"
+.TP
+.BI --log " " logfile
+Write info to
+.B logfile.
+.\"
+.TP
+.BI --short
+Just a short listing.
+.\"
+.TP
+.BI --version
+Show libhd version.
+.\"
+.TP
+.BI --<hwitem>
+Probe for the particular hardware item. Available hardware items are:
+.B all, bios, block, bluetooth, braille, bridge, camera, cdrom, chipcard, cpu,
+.B disk, dsl, dvb, floppy, framebuffer, gfxcard, hub, ide, isapnp, isdn,
+.B joystick, keyboard, memory, modem, monitor, mouse, netcard, network,
+.B partition, pci, pcmcia, pcmcia-ctrl, pppoe, printer, scanner, scsi, smp,
+.B sound, storage-ctrl, sys, tape, tv, usb, usb-ctrl, vbe, wlan,
+and
+.B zip.
+.\"
+.\"
+.SH FILES
+.B /var/lib/hardware/*
+.\"
+.\"
+.SH BUGS
+Not all hardware can be detected.
+.\"
+.\"
+.SH AUTHOR
+.nf
+Steffen Winterfeldt <snwint@suse.de> - hwinfo
+Michal Svec <msvec@suse.cz> - manual page
+.fi
+.\"
+.\"
+.SH "SEE ALSO"
+Documentation in /usr/share/doc/packages/hwinfo.
+.\"
+.\" EOF
diff --git a/src/hwinfo/doc/libhd.doc b/src/hwinfo/doc/libhd.doc
new file mode 100644 (file)
index 0000000..419a328
--- /dev/null
@@ -0,0 +1,109 @@
+/*! \mainpage libhd documentation
+
+<h2>Introduction</h2>
+
+libhd is a hardware detection lib.
+
+<h2>Changes</h2>
+
+\ref libhd_5_12
+
+<h2>Examples</h2>
+
+\ref example1
+
+\ref example2
+
+*/
+
+
+/*! \page examples Examples
+
+\ref example1
+
+\ref example2
+
+<hr>
+
+\subsection example1 Get list of SCSI controllers
+
+\include example1.c
+
+<hr>
+
+\subsection example2 Get primary display controller
+
+\include example2.c
+
+*/
+
+/*! \page changes Changes
+
+\ref libhd_5_12
+
+<hr>
+
+\subsection libhd_5_12 libhd-5.12
+
+<ul>
+
+  <li>changes in \ref hd_t
+
+    <ul>
+
+    <li>\ref hd_t::bus "bus" is now a struct, use \ref hd_t::bus "bus.id" instead.
+
+    <li>\ref hd_t::base_class "base_class" is now a struct, use \ref hd_t::base_class "base_class.id" instead.
+
+    <li>\ref hd_t::sub_class "sub_class" is now a struct, use \ref hd_t::sub_class "sub_class.id" instead.
+
+    <li>\ref hd_t::prog_if "prog_if" is now a struct, use \ref hd_t::prog_if "prog_if.id" instead.
+
+    <li>\ref hd_t::vendor "vendor" is a struct replacing vend and vend_name.
+      Use \ref hd_t::vendor "vendor.id" and \ref hd_t::vendor "vendor.name" now.
+
+    <li>\ref hd_t::device "device" is a struct replacing dev and dev_name.
+      Use \ref hd_t::device "device.id" and \ref hd_t::device "device.name" now.
+
+    <li>\ref hd_t::sub_vendor "sub_vendor" is a struct replacing sub_vend and sub_vend_name.
+      Use \ref hd_t::sub_vendor "sub_vendor.id" and \ref hd_t::sub_vendor "sub_vendor.name" now.
+
+    <li>\ref hd_t::sub_device "sub_device" is a struct replacing sub_dev and sub_dev_name.
+      Use \ref hd_t::sub_device "sub_device.id" and \ref hd_t::sub_device "sub_device.name" now.
+
+    <li>\ref hd_t::revision "revision" is a struct replacing rev and rev_name.
+      Use \ref hd_t::revision "revision.id" and \ref hd_t::revision "revision.name" now.
+
+    <li>\ref hd_t::compat_vendor "compat_vendor" is a struct replacing compat_vend.
+      Use \ref hd_t::compat_vendor "compat_vendor.id" now.
+
+    <li>\ref hd_t::compat_device "compat_device" is a struct replacing compat_dev.
+      Use \ref hd_t::compat_device "compat_device.id" now.
+
+    </ul>
+
+  <li>interface functions removed
+
+    <ul>
+
+    <li>hd_bus_name is gone. Use \ref hd_t::bus "bus.name" instead.
+
+    <li>hd_class_name is gone. Use \ref hd_t::base_class "base_class.name",
+      \ref hd_t::sub_class "sub_class.name" or \ref hd_t::prog_if "prog_if.name" instead.
+
+    <li>hd_vendor_name is gone. Use \ref hd_t::vendor "vendor.name" instead.
+
+    <li>hd_device_name is gone. Use \ref hd_t::device "device.name" instead.
+
+    <li>hd_sub_device_name is gone. Use \ref hd_t::sub_device "sub_device.name" instead.
+
+    <li>hd_find_device_by_name is gone.
+
+    </ul>
+
+</ul>
+
+<hr>
+
+*/
+
diff --git a/src/hwinfo/doc/libhd.doxy b/src/hwinfo/doc/libhd.doxy
new file mode 100644 (file)
index 0000000..30bc2fa
--- /dev/null
@@ -0,0 +1,898 @@
+# Doxyfile 1.2.13.1
+
+# This file describes the settings to be used by the documentation system
+# doxygen (www.doxygen.org) for a project
+#
+# All text after a hash (#) is considered a comment and will be ignored
+# The format is:
+#       TAG = value [value, ...]
+# For lists items can also be appended using:
+#       TAG += value [value, ...]
+# Values that contain spaces should be placed between quotes (" ")
+
+#---------------------------------------------------------------------------
+# General configuration options
+#---------------------------------------------------------------------------
+
+# The PROJECT_NAME tag is a single word (or a sequence of words surrounded 
+# by quotes) that should identify the project.
+
+PROJECT_NAME           = libhd
+
+# The PROJECT_NUMBER tag can be used to enter a project or revision number. 
+# This could be handy for archiving the generated documentation or 
+# if some version control system is used.
+
+PROJECT_NUMBER         = 5.0
+
+# The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) 
+# base path where the generated documentation will be put. 
+# If a relative path is entered, it will be relative to the location 
+# where doxygen was started. If left blank the current directory will be used.
+
+OUTPUT_DIRECTORY       = libhd
+
+# The OUTPUT_LANGUAGE tag is used to specify the language in which all 
+# documentation generated by doxygen is written. Doxygen will use this 
+# information to generate all constant output in the proper language. 
+# The default language is English, other supported languages are: 
+# Brazilian, Chinese, Croatian, Czech, Danish, Dutch, Finnish, French, 
+# German, Greek, Hungarian, Italian, Japanese, Korean, Norwegian, Polish, 
+# Portuguese, Romanian, Russian, Slovak, Slovene, Spanish and Swedish.
+
+OUTPUT_LANGUAGE        = English
+
+# If the EXTRACT_ALL tag is set to YES doxygen will assume all entities in 
+# documentation are documented, even if no documentation was available. 
+# Private class members and static file members will be hidden unless 
+# the EXTRACT_PRIVATE and EXTRACT_STATIC tags are set to YES
+
+EXTRACT_ALL            = YES
+
+# If the EXTRACT_PRIVATE tag is set to YES all private members of a class 
+# will be included in the documentation.
+
+EXTRACT_PRIVATE        = NO
+
+# If the EXTRACT_STATIC tag is set to YES all static members of a file 
+# will be included in the documentation.
+
+EXTRACT_STATIC         = YES
+
+# If the EXTRACT_LOCAL_CLASSES tag is set to YES classes (and structs) 
+# defined locally in source files will be included in the documentation. 
+# If set to NO only classes defined in header files are included.
+
+EXTRACT_LOCAL_CLASSES  = YES
+
+# If the HIDE_UNDOC_MEMBERS tag is set to YES, Doxygen will hide all 
+# undocumented members of documented classes, files or namespaces. 
+# If set to NO (the default) these members will be included in the 
+# various overviews, but no documentation section is generated. 
+# This option has no effect if EXTRACT_ALL is enabled.
+
+HIDE_UNDOC_MEMBERS     = NO
+
+# If the HIDE_UNDOC_CLASSES tag is set to YES, Doxygen will hide all 
+# undocumented classes that are normally visible in the class hierarchy. 
+# If set to NO (the default) these class will be included in the various 
+# overviews. This option has no effect if EXTRACT_ALL is enabled.
+
+HIDE_UNDOC_CLASSES     = NO
+
+# If the BRIEF_MEMBER_DESC tag is set to YES (the default) Doxygen will 
+# include brief member descriptions after the members that are listed in 
+# the file and class documentation (similar to JavaDoc). 
+# Set to NO to disable this.
+
+BRIEF_MEMBER_DESC      = YES
+
+# If the REPEAT_BRIEF tag is set to YES (the default) Doxygen will prepend 
+# the brief description of a member or function before the detailed description. 
+# Note: if both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the 
+# brief descriptions will be completely suppressed.
+
+REPEAT_BRIEF           = YES
+
+# If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then 
+# Doxygen will generate a detailed section even if there is only a brief 
+# description.
+
+ALWAYS_DETAILED_SEC    = NO
+
+# If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all inherited 
+# members of a class in the documentation of that class as if those members were 
+# ordinary class members. Constructors, destructors and assignment operators of 
+# the base classes will not be shown.
+
+INLINE_INHERITED_MEMB  = NO
+
+# If the FULL_PATH_NAMES tag is set to YES then Doxygen will prepend the full 
+# path before files name in the file list and in the header files. If set 
+# to NO the shortest path that makes the file name unique will be used.
+
+FULL_PATH_NAMES        = NO
+
+# If the FULL_PATH_NAMES tag is set to YES then the STRIP_FROM_PATH tag 
+# can be used to strip a user defined part of the path. Stripping is 
+# only done if one of the specified strings matches the left-hand part of 
+# the path. It is allowed to use relative paths in the argument list.
+
+STRIP_FROM_PATH        = 
+
+# The INTERNAL_DOCS tag determines if documentation 
+# that is typed after a \internal command is included. If the tag is set 
+# to NO (the default) then the documentation will be excluded. 
+# Set it to YES to include the internal documentation.
+
+INTERNAL_DOCS          = NO
+
+# Setting the STRIP_CODE_COMMENTS tag to YES (the default) will instruct 
+# doxygen to hide any special comment blocks from generated source code 
+# fragments. Normal C and C++ comments will always remain visible.
+
+STRIP_CODE_COMMENTS    = YES
+
+# If the CASE_SENSE_NAMES tag is set to NO then Doxygen will only generate 
+# file names in lower case letters. If set to YES upper case letters are also 
+# allowed. This is useful if you have classes or files whose names only differ 
+# in case and if your file system supports case sensitive file names. Windows 
+# users are adviced to set this option to NO.
+
+CASE_SENSE_NAMES       = YES
+
+# If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter 
+# (but less readable) file names. This can be useful is your file systems 
+# doesn't support long names like on DOS, Mac, or CD-ROM.
+
+SHORT_NAMES            = NO
+
+# If the HIDE_SCOPE_NAMES tag is set to NO (the default) then Doxygen 
+# will show members with their full class and namespace scopes in the 
+# documentation. If set to YES the scope will be hidden.
+
+HIDE_SCOPE_NAMES       = NO
+
+# If the VERBATIM_HEADERS tag is set to YES (the default) then Doxygen 
+# will generate a verbatim copy of the header file for each class for 
+# which an include is specified. Set to NO to disable this.
+
+VERBATIM_HEADERS       = YES
+
+# If the SHOW_INCLUDE_FILES tag is set to YES (the default) then Doxygen 
+# will put list of the files that are included by a file in the documentation 
+# of that file.
+
+SHOW_INCLUDE_FILES     = YES
+
+# If the JAVADOC_AUTOBRIEF tag is set to YES then Doxygen 
+# will interpret the first line (until the first dot) of a JavaDoc-style 
+# comment as the brief description. If set to NO, the JavaDoc 
+# comments  will behave just like the Qt-style comments (thus requiring an 
+# explict @brief command for a brief description.
+
+JAVADOC_AUTOBRIEF      = YES
+
+# If the INHERIT_DOCS tag is set to YES (the default) then an undocumented 
+# member inherits the documentation from any documented member that it 
+# reimplements.
+
+INHERIT_DOCS           = YES
+
+# If the INLINE_INFO tag is set to YES (the default) then a tag [inline] 
+# is inserted in the documentation for inline members.
+
+INLINE_INFO            = YES
+
+# If the SORT_MEMBER_DOCS tag is set to YES (the default) then doxygen 
+# will sort the (detailed) documentation of file and class members 
+# alphabetically by member name. If set to NO the members will appear in 
+# declaration order.
+
+SORT_MEMBER_DOCS       = YES
+
+# If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC 
+# tag is set to YES, then doxygen will reuse the documentation of the first 
+# member in the group (if any) for the other members of the group. By default 
+# all members of a group must be documented explicitly.
+
+DISTRIBUTE_GROUP_DOC   = NO
+
+# The TAB_SIZE tag can be used to set the number of spaces in a tab. 
+# Doxygen uses this value to replace tabs by spaces in code fragments.
+
+TAB_SIZE               = 8
+
+# The GENERATE_TODOLIST tag can be used to enable (YES) or 
+# disable (NO) the todo list. This list is created by putting \todo 
+# commands in the documentation.
+
+GENERATE_TODOLIST      = YES
+
+# The GENERATE_TESTLIST tag can be used to enable (YES) or 
+# disable (NO) the test list. This list is created by putting \test 
+# commands in the documentation.
+
+GENERATE_TESTLIST      = YES
+
+# The GENERATE_BUGLIST tag can be used to enable (YES) or 
+# disable (NO) the bug list. This list is created by putting \bug 
+# commands in the documentation.
+
+GENERATE_BUGLIST       = YES
+
+# This tag can be used to specify a number of aliases that acts 
+# as commands in the documentation. An alias has the form "name=value". 
+# For example adding "sideeffect=\par Side Effects:\n" will allow you to 
+# put the command \sideeffect (or @sideeffect) in the documentation, which 
+# will result in a user defined paragraph with heading "Side Effects:". 
+# You can put \n's in the value part of an alias to insert newlines.
+
+ALIASES                = 
+
+# The ENABLED_SECTIONS tag can be used to enable conditional 
+# documentation sections, marked by \if sectionname ... \endif.
+
+ENABLED_SECTIONS       = 
+
+# The MAX_INITIALIZER_LINES tag determines the maximum number of lines 
+# the initial value of a variable or define consist of for it to appear in 
+# the documentation. If the initializer consists of more lines than specified 
+# here it will be hidden. Use a value of 0 to hide initializers completely. 
+# The appearance of the initializer of individual variables and defines in the 
+# documentation can be controlled using \showinitializer or \hideinitializer 
+# command in the documentation regardless of this setting.
+
+MAX_INITIALIZER_LINES  = 30
+
+# Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C sources 
+# only. Doxygen will then generate output that is more tailored for C. 
+# For instance some of the names that are used will be different. The list 
+# of all members will be omitted, etc.
+
+OPTIMIZE_OUTPUT_FOR_C  = YES
+
+# Set the SHOW_USED_FILES tag to NO to disable the list of files generated 
+# at the bottom of the documentation of classes and structs. If set to YES the 
+# list will mention the files that were used to generate the documentation.
+
+SHOW_USED_FILES        = YES
+
+#---------------------------------------------------------------------------
+# configuration options related to warning and progress messages
+#---------------------------------------------------------------------------
+
+# The QUIET tag can be used to turn on/off the messages that are generated 
+# by doxygen. Possible values are YES and NO. If left blank NO is used.
+
+QUIET                  = NO
+
+# The WARNINGS tag can be used to turn on/off the warning messages that are 
+# generated by doxygen. Possible values are YES and NO. If left blank 
+# NO is used.
+
+WARNINGS               = YES
+
+# If WARN_IF_UNDOCUMENTED is set to YES, then doxygen will generate warnings 
+# for undocumented members. If EXTRACT_ALL is set to YES then this flag will 
+# automatically be disabled.
+
+WARN_IF_UNDOCUMENTED   = YES
+
+# The WARN_FORMAT tag determines the format of the warning messages that 
+# doxygen can produce. The string should contain the $file, $line, and $text 
+# tags, which will be replaced by the file and line number from which the 
+# warning originated and the warning text.
+
+WARN_FORMAT            = 
+
+# The WARN_LOGFILE tag can be used to specify a file to which warning 
+# and error messages should be written. If left blank the output is written 
+# to stderr.
+
+WARN_LOGFILE           = 
+
+#---------------------------------------------------------------------------
+# configuration options related to the input files
+#---------------------------------------------------------------------------
+
+# The INPUT tag can be used to specify the files and/or directories that contain 
+# documented source files. You may enter file names like "myfile.cpp" or 
+# directories like "/usr/src/myproject". Separate the files or directories 
+# with spaces.
+
+INPUT                  = libhd.doc ../src
+
+# If the value of the INPUT tag contains directories, you can use the 
+# FILE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp 
+# and *.h) to filter out the source-files in the directories. If left 
+# blank the following patterns are tested: 
+# *.c *.cc *.cxx *.c++ *.java *.ii *.ixx *.ipp *.i++ *.inl *.h *.hh *.hxx *.hpp 
+# *.h++ *.idl
+
+FILE_PATTERNS          = *.c *.h
+
+# The RECURSIVE tag can be used to turn specify whether or not subdirectories 
+# should be searched for input files as well. Possible values are YES and NO. 
+# If left blank NO is used.
+
+RECURSIVE              = YES
+
+# The EXCLUDE tag can be used to specify files and/or directories that should 
+# excluded from the INPUT source files. This way you can easily exclude a 
+# subdirectory from a directory tree whose root is specified with the INPUT tag.
+
+EXCLUDE                = ../src/ids
+
+# If the value of the INPUT tag contains directories, you can use the 
+# EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude 
+# certain files from those directories.
+
+EXCLUDE_PATTERNS       = 
+
+# The EXAMPLE_PATH tag can be used to specify one or more files or 
+# directories that contain example code fragments that are included (see 
+# the \include command).
+
+EXAMPLE_PATH           = .
+
+# If the value of the EXAMPLE_PATH tag contains directories, you can use the 
+# EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp 
+# and *.h) to filter out the source-files in the directories. If left 
+# blank all files are included.
+
+EXAMPLE_PATTERNS       = *.c
+
+# If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be 
+# searched for input files to be used with the \include or \dontinclude 
+# commands irrespective of the value of the RECURSIVE tag. 
+# Possible values are YES and NO. If left blank NO is used.
+
+EXAMPLE_RECURSIVE      = NO
+
+# The IMAGE_PATH tag can be used to specify one or more files or 
+# directories that contain image that are included in the documentation (see 
+# the \image command).
+
+IMAGE_PATH             = 
+
+# The INPUT_FILTER tag can be used to specify a program that doxygen should 
+# invoke to filter for each input file. Doxygen will invoke the filter program 
+# by executing (via popen()) the command <filter> <input-file>, where <filter> 
+# is the value of the INPUT_FILTER tag, and <input-file> is the name of an 
+# input file. Doxygen will then use the output that the filter program writes 
+# to standard output.
+
+INPUT_FILTER           = 
+
+# If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using 
+# INPUT_FILTER) will be used to filter the input files when producing source 
+# files to browse.
+
+FILTER_SOURCE_FILES    = NO
+
+#---------------------------------------------------------------------------
+# configuration options related to source browsing
+#---------------------------------------------------------------------------
+
+# If the SOURCE_BROWSER tag is set to YES then a list of source files will 
+# be generated. Documented entities will be cross-referenced with these sources.
+
+SOURCE_BROWSER         = NO
+
+# Setting the INLINE_SOURCES tag to YES will include the body 
+# of functions and classes directly in the documentation.
+
+INLINE_SOURCES         = NO
+
+# If the REFERENCED_BY_RELATION tag is set to YES (the default) 
+# then for each documented function all documented 
+# functions referencing it will be listed.
+
+REFERENCED_BY_RELATION = YES
+
+# If the REFERENCES_RELATION tag is set to YES (the default) 
+# then for each documented function all documented entities 
+# called/used by that function will be listed.
+
+REFERENCES_RELATION    = YES
+
+#---------------------------------------------------------------------------
+# configuration options related to the alphabetical class index
+#---------------------------------------------------------------------------
+
+# If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index 
+# of all compounds will be generated. Enable this if the project 
+# contains a lot of classes, structs, unions or interfaces.
+
+ALPHABETICAL_INDEX     = NO
+
+# If the alphabetical index is enabled (see ALPHABETICAL_INDEX) then 
+# the COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns 
+# in which this list will be split (can be a number in the range [1..20])
+
+COLS_IN_ALPHA_INDEX    = 5
+
+# In case all classes in a project start with a common prefix, all 
+# classes will be put under the same header in the alphabetical index. 
+# The IGNORE_PREFIX tag can be used to specify one or more prefixes that 
+# should be ignored while generating the index headers.
+
+IGNORE_PREFIX          = 
+
+#---------------------------------------------------------------------------
+# configuration options related to the HTML output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_HTML tag is set to YES (the default) Doxygen will 
+# generate HTML output.
+
+GENERATE_HTML          = YES
+
+# The HTML_OUTPUT tag is used to specify where the HTML docs will be put. 
+# If a relative path is entered the value of OUTPUT_DIRECTORY will be 
+# put in front of it. If left blank `html' will be used as the default path.
+
+HTML_OUTPUT            = 
+
+# The HTML_HEADER tag can be used to specify a personal HTML header for 
+# each generated HTML page. If it is left blank doxygen will generate a 
+# standard header.
+
+HTML_HEADER            = 
+
+# The HTML_FOOTER tag can be used to specify a personal HTML footer for 
+# each generated HTML page. If it is left blank doxygen will generate a 
+# standard footer.
+
+HTML_FOOTER            = footer.html
+
+# The HTML_STYLESHEET tag can be used to specify a user defined cascading 
+# style sheet that is used by each HTML page. It can be used to 
+# fine-tune the look of the HTML output. If the tag is left blank doxygen 
+# will generate a default style sheet
+
+HTML_STYLESHEET        = 
+
+# If the HTML_ALIGN_MEMBERS tag is set to YES, the members of classes, 
+# files or namespaces will be aligned in HTML using tables. If set to 
+# NO a bullet list will be used.
+
+HTML_ALIGN_MEMBERS     = YES
+
+# If the GENERATE_HTMLHELP tag is set to YES, additional index files 
+# will be generated that can be used as input for tools like the 
+# Microsoft HTML help workshop to generate a compressed HTML help file (.chm) 
+# of the generated HTML documentation.
+
+GENERATE_HTMLHELP      = NO
+
+# If the GENERATE_HTMLHELP tag is set to YES, the GENERATE_CHI flag 
+# controls if a separate .chi index file is generated (YES) or that 
+# it should be included in the master .chm file (NO).
+
+GENERATE_CHI           = NO
+
+# If the GENERATE_HTMLHELP tag is set to YES, the BINARY_TOC flag 
+# controls whether a binary table of contents is generated (YES) or a 
+# normal table of contents (NO) in the .chm file.
+
+BINARY_TOC             = NO
+
+# The TOC_EXPAND flag can be set to YES to add extra items for group members 
+# to the contents of the Html help documentation and to the tree view.
+
+TOC_EXPAND             = NO
+
+# The DISABLE_INDEX tag can be used to turn on/off the condensed index at 
+# top of each HTML page. The value NO (the default) enables the index and 
+# the value YES disables it.
+
+DISABLE_INDEX          = NO
+
+# This tag can be used to set the number of enum values (range [1..20]) 
+# that doxygen will group on one line in the generated HTML documentation.
+
+ENUM_VALUES_PER_LINE   = 4
+
+# If the GENERATE_TREEVIEW tag is set to YES, a side panel will be
+# generated containing a tree-like index structure (just like the one that 
+# is generated for HTML Help). For this to work a browser that supports 
+# JavaScript and frames is required (for instance Mozilla, Netscape 4.0+, 
+# or Internet explorer 4.0+). Note that for large projects the tree generation 
+# can take a very long time. In such cases it is better to disable this feature. 
+# Windows users are probably better off using the HTML help feature.
+
+GENERATE_TREEVIEW      = NO
+
+# If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be 
+# used to set the initial width (in pixels) of the frame in which the tree 
+# is shown.
+
+TREEVIEW_WIDTH         = 250
+
+#---------------------------------------------------------------------------
+# configuration options related to the LaTeX output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_LATEX tag is set to YES (the default) Doxygen will 
+# generate Latex output.
+
+GENERATE_LATEX         = YES
+
+# The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put. 
+# If a relative path is entered the value of OUTPUT_DIRECTORY will be 
+# put in front of it. If left blank `latex' will be used as the default path.
+
+LATEX_OUTPUT           = 
+
+# If the COMPACT_LATEX tag is set to YES Doxygen generates more compact 
+# LaTeX documents. This may be useful for small projects and may help to 
+# save some trees in general.
+
+COMPACT_LATEX          = NO
+
+# The PAPER_TYPE tag can be used to set the paper type that is used 
+# by the printer. Possible values are: a4, a4wide, letter, legal and 
+# executive. If left blank a4wide will be used.
+
+PAPER_TYPE             = a4wide
+
+# The EXTRA_PACKAGES tag can be to specify one or more names of LaTeX 
+# packages that should be included in the LaTeX output.
+
+EXTRA_PACKAGES         = 
+
+# The LATEX_HEADER tag can be used to specify a personal LaTeX header for 
+# the generated latex document. The header should contain everything until 
+# the first chapter. If it is left blank doxygen will generate a 
+# standard header. Notice: only use this tag if you know what you are doing!
+
+LATEX_HEADER           = 
+
+# If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated 
+# is prepared for conversion to pdf (using ps2pdf). The pdf file will 
+# contain links (just like the HTML output) instead of page references 
+# This makes the output suitable for online browsing using a pdf viewer.
+
+PDF_HYPERLINKS         = NO
+
+# If the USE_PDFLATEX tag is set to YES, pdflatex will be used instead of 
+# plain latex in the generated Makefile. Set this option to YES to get a 
+# higher quality PDF documentation.
+
+USE_PDFLATEX           = NO
+
+# If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \\batchmode. 
+# command to the generated LaTeX files. This will instruct LaTeX to keep 
+# running if errors occur, instead of asking the user for help. 
+# This option is also used when generating formulas in HTML.
+
+LATEX_BATCHMODE        = NO
+
+#---------------------------------------------------------------------------
+# configuration options related to the RTF output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_RTF tag is set to YES Doxygen will generate RTF output 
+# The RTF output is optimised for Word 97 and may not look very pretty with 
+# other RTF readers or editors.
+
+GENERATE_RTF           = NO
+
+# The RTF_OUTPUT tag is used to specify where the RTF docs will be put. 
+# If a relative path is entered the value of OUTPUT_DIRECTORY will be 
+# put in front of it. If left blank `rtf' will be used as the default path.
+
+RTF_OUTPUT             = 
+
+# If the COMPACT_RTF tag is set to YES Doxygen generates more compact 
+# RTF documents. This may be useful for small projects and may help to 
+# save some trees in general.
+
+COMPACT_RTF            = NO
+
+# If the RTF_HYPERLINKS tag is set to YES, the RTF that is generated 
+# will contain hyperlink fields. The RTF file will 
+# contain links (just like the HTML output) instead of page references. 
+# This makes the output suitable for online browsing using WORD or other 
+# programs which support those fields. 
+# Note: wordpad (write) and others do not support links.
+
+RTF_HYPERLINKS         = NO
+
+# Load stylesheet definitions from file. Syntax is similar to doxygen's 
+# config file, i.e. a series of assigments. You only have to provide 
+# replacements, missing definitions are set to their default value.
+
+RTF_STYLESHEET_FILE    = 
+
+# Set optional variables used in the generation of an rtf document. 
+# Syntax is similar to doxygen's config file.
+
+RTF_EXTENSIONS_FILE    = 
+
+#---------------------------------------------------------------------------
+# configuration options related to the man page output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_MAN tag is set to YES (the default) Doxygen will 
+# generate man pages
+
+GENERATE_MAN           = NO
+
+# The MAN_OUTPUT tag is used to specify where the man pages will be put. 
+# If a relative path is entered the value of OUTPUT_DIRECTORY will be 
+# put in front of it. If left blank `man' will be used as the default path.
+
+MAN_OUTPUT             = 
+
+# The MAN_EXTENSION tag determines the extension that is added to 
+# the generated man pages (default is the subroutine's section .3)
+
+MAN_EXTENSION          = 
+
+# If the MAN_LINKS tag is set to YES and Doxygen generates man output, 
+# then it will generate one additional man file for each entity 
+# documented in the real man page(s). These additional files 
+# only source the real man page, but without them the man command 
+# would be unable to find the correct page. The default is NO.
+
+MAN_LINKS              = NO
+
+#---------------------------------------------------------------------------
+# configuration options related to the XML output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_XML tag is set to YES Doxygen will 
+# generate an XML file that captures the structure of 
+# the code including all documentation. Note that this 
+# feature is still experimental and incomplete at the 
+# moment.
+
+GENERATE_XML           = NO
+
+#---------------------------------------------------------------------------
+# configuration options for the AutoGen Definitions output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_AUTOGEN_DEF tag is set to YES Doxygen will 
+# generate an AutoGen Definitions (see autogen.sf.net) file 
+# that captures the structure of the code including all 
+# documentation. Note that this feature is still experimental 
+# and incomplete at the moment.
+
+GENERATE_AUTOGEN_DEF   = NO
+
+#---------------------------------------------------------------------------
+# Configuration options related to the preprocessor   
+#---------------------------------------------------------------------------
+
+# If the ENABLE_PREPROCESSING tag is set to YES (the default) Doxygen will 
+# evaluate all C-preprocessor directives found in the sources and include 
+# files.
+
+ENABLE_PREPROCESSING   = YES
+
+# If the MACRO_EXPANSION tag is set to YES Doxygen will expand all macro 
+# names in the source code. If set to NO (the default) only conditional 
+# compilation will be performed. Macro expansion can be done in a controlled 
+# way by setting EXPAND_ONLY_PREDEF to YES.
+
+MACRO_EXPANSION        = NO
+
+# If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES 
+# then the macro expansion is limited to the macros specified with the 
+# PREDEFINED and EXPAND_AS_PREDEFINED tags.
+
+EXPAND_ONLY_PREDEF     = NO
+
+# If the SEARCH_INCLUDES tag is set to YES (the default) the includes files 
+# in the INCLUDE_PATH (see below) will be search if a #include is found.
+
+SEARCH_INCLUDES        = YES
+
+# The INCLUDE_PATH tag can be used to specify one or more directories that 
+# contain include files that are not input files but should be processed by 
+# the preprocessor.
+
+INCLUDE_PATH           = 
+
+# You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard 
+# patterns (like *.h and *.hpp) to filter out the header-files in the 
+# directories. If left blank, the patterns specified with FILE_PATTERNS will 
+# be used.
+
+INCLUDE_FILE_PATTERNS  = 
+
+# The PREDEFINED tag can be used to specify one or more macro names that 
+# are defined before the preprocessor is started (similar to the -D option of 
+# gcc). The argument of the tag is a list of macros of the form: name 
+# or name=definition (no spaces). If the definition and the = are 
+# omitted =1 is assumed.
+
+PREDEFINED             = 
+
+# If the MACRO_EXPANSION and EXPAND_PREDEF_ONLY tags are set to YES then 
+# this tag can be used to specify a list of macro names that should be expanded. 
+# The macro definition that is found in the sources will be used. 
+# Use the PREDEFINED tag if you want to use a different macro definition.
+
+EXPAND_AS_DEFINED      = 
+
+# If the SKIP_FUNCTION_MACROS tag is set to YES (the default) then 
+# doxygen's preprocessor will remove all function-like macros that are alone 
+# on a line and do not end with a semicolon. Such function macros are typically 
+# used for boiler-plate code, and will confuse the parser if not removed.
+
+SKIP_FUNCTION_MACROS   = YES
+
+#---------------------------------------------------------------------------
+# Configuration::addtions related to external references   
+#---------------------------------------------------------------------------
+
+# The TAGFILES tag can be used to specify one or more tagfiles.
+
+TAGFILES               = 
+
+# When a file name is specified after GENERATE_TAGFILE, doxygen will create 
+# a tag file that is based on the input files it reads.
+
+GENERATE_TAGFILE       = 
+
+# If the ALLEXTERNALS tag is set to YES all external classes will be listed 
+# in the class index. If set to NO only the inherited external classes 
+# will be listed.
+
+ALLEXTERNALS           = NO
+
+# The PERL_PATH should be the absolute path and name of the perl script 
+# interpreter (i.e. the result of `which perl').
+
+PERL_PATH              = 
+
+#---------------------------------------------------------------------------
+# Configuration options related to the dot tool   
+#---------------------------------------------------------------------------
+
+# If the CLASS_DIAGRAMS tag is set to YES (the default) Doxygen will 
+# generate a inheritance diagram (in Html, RTF and LaTeX) for classes with base or 
+# super classes. Setting the tag to NO turns the diagrams off. Note that this 
+# option is superceded by the HAVE_DOT option below. This is only a fallback. It is 
+# recommended to install and use dot, since it yield more powerful graphs.
+
+CLASS_DIAGRAMS         = YES
+
+# If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is 
+# available from the path. This tool is part of Graphviz, a graph visualization 
+# toolkit from AT&T and Lucent Bell Labs. The other options in this section 
+# have no effect if this option is set to NO (the default)
+
+HAVE_DOT               = NO
+
+# If the CLASS_GRAPH and HAVE_DOT tags are set to YES then doxygen 
+# will generate a graph for each documented class showing the direct and 
+# indirect inheritance relations. Setting this tag to YES will force the 
+# the CLASS_DIAGRAMS tag to NO.
+
+CLASS_GRAPH            = YES
+
+# If the COLLABORATION_GRAPH and HAVE_DOT tags are set to YES then doxygen 
+# will generate a graph for each documented class showing the direct and 
+# indirect implementation dependencies (inheritance, containment, and 
+# class references variables) of the class with other documented classes.
+
+COLLABORATION_GRAPH    = YES
+
+# If set to YES, the inheritance and collaboration graphs will show the 
+# relations between templates and their instances.
+
+TEMPLATE_RELATIONS     = YES
+
+# If set to YES, the inheritance and collaboration graphs will hide 
+# inheritance and usage relations if the target is undocumented 
+# or is not a class.
+
+HIDE_UNDOC_RELATIONS   = YES
+
+# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDE_GRAPH, and HAVE_DOT 
+# tags are set to YES then doxygen will generate a graph for each documented 
+# file showing the direct and indirect include dependencies of the file with 
+# other documented files.
+
+INCLUDE_GRAPH          = YES
+
+# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDED_BY_GRAPH, and 
+# HAVE_DOT tags are set to YES then doxygen will generate a graph for each 
+# documented header file showing the documented files that directly or 
+# indirectly include this file.
+
+INCLUDED_BY_GRAPH      = YES
+
+# If the GRAPHICAL_HIERARCHY and HAVE_DOT tags are set to YES then doxygen 
+# will graphical hierarchy of all classes instead of a textual one.
+
+GRAPHICAL_HIERARCHY    = YES
+
+# The tag DOT_PATH can be used to specify the path where the dot tool can be 
+# found. If left blank, it is assumed the dot tool can be found on the path.
+
+DOT_PATH               = 
+
+# The DOTFILE_DIRS tag can be used to specify one or more directories that 
+# contain dot files that are included in the documentation (see the 
+# \dotfile command).
+
+DOTFILE_DIRS           = 
+
+# The MAX_DOT_GRAPH_WIDTH tag can be used to set the maximum allowed width 
+# (in pixels) of the graphs generated by dot. If a graph becomes larger than 
+# this value, doxygen will try to truncate the graph, so that it fits within 
+# the specified constraint. Beware that most browsers cannot cope with very 
+# large images.
+
+MAX_DOT_GRAPH_WIDTH    = 1024
+
+# The MAX_DOT_GRAPH_HEIGHT tag can be used to set the maximum allows height 
+# (in pixels) of the graphs generated by dot. If a graph becomes larger than 
+# this value, doxygen will try to truncate the graph, so that it fits within 
+# the specified constraint. Beware that most browsers cannot cope with very 
+# large images.
+
+MAX_DOT_GRAPH_HEIGHT   = 1024
+
+# If the GENERATE_LEGEND tag is set to YES (the default) Doxygen will 
+# generate a legend page explaining the meaning of the various boxes and 
+# arrows in the dot generated graphs.
+
+GENERATE_LEGEND        = YES
+
+# If the DOT_CLEANUP tag is set to YES (the default) Doxygen will 
+# remove the intermedate dot files that are used to generate 
+# the various graphs.
+
+DOT_CLEANUP            = YES
+
+#---------------------------------------------------------------------------
+# Configuration::addtions related to the search engine   
+#---------------------------------------------------------------------------
+
+# The SEARCHENGINE tag specifies whether or not a search engine should be 
+# used. If set to NO the values of all tags below this one will be ignored.
+
+SEARCHENGINE           = NO
+
+# The CGI_NAME tag should be the name of the CGI script that 
+# starts the search engine (doxysearch) with the correct parameters. 
+# A script with this name will be generated by doxygen.
+
+CGI_NAME               = 
+
+# The CGI_URL tag should be the absolute URL to the directory where the 
+# cgi binaries are located. See the documentation of your http daemon for 
+# details.
+
+CGI_URL                = 
+
+# The DOC_URL tag should be the absolute URL to the directory where the 
+# documentation is located. If left blank the absolute path to the 
+# documentation, with file:// prepended to it, will be used.
+
+DOC_URL                = 
+
+# The DOC_ABSPATH tag should be the absolute path to the directory where the 
+# documentation is located. If left blank the directory on the local machine 
+# will be used.
+
+DOC_ABSPATH            = 
+
+# The BIN_ABSPATH tag must point to the directory where the doxysearch binary 
+# is installed.
+
+BIN_ABSPATH            = 
+
+# The EXT_DOC_PATHS tag can be used to specify one or more paths to 
+# documentation generated for other projects. This allows doxysearch to search 
+# the documentation for these projects as well.
+
+EXT_DOC_PATHS          = 
diff --git a/src/hwinfo/gen-hwcfg-disk.sh b/src/hwinfo/gen-hwcfg-disk.sh
new file mode 100755 (executable)
index 0000000..c13cda6
--- /dev/null
@@ -0,0 +1,50 @@
+#!/bin/bash
+#
+# gen-hwcfg-disk.sh
+#
+# Generates hwcfg file for all configured disks
+#
+
+if [ -x /sbin/ata_identify ]; then
+    ATA_ID=/sbin/ata_identify
+elif [ -x /lib/klibc/bin/ata_identify ]; then
+    ATA_ID=/lib/klibc/bin/ata_identify
+else
+    echo "ata_identify not found, please install udev"
+    exit 1
+fi
+
+hwcfg=/etc/sysconfig/hardware
+
+if [ ! -d "$hwcfg" ]; then
+    echo "No hardware configuration directory found"
+    exit 1
+fi
+
+# IDE disks first
+for ifname in /sys/block/hd*; do
+    id=$($ATA_ID /dev/${ifname##*/} 2> /dev/null)
+    if [ $?  -eq 0 ]; then
+       filename="SATA_$id"
+       echo "Generate hwcfg file for $filename"
+       echo "DEVICE=${ifname##*/}" > ${hwcfg}/hwcfg-disk-id-${filename}
+    fi
+done
+
+# SCSI disks next
+for ifname in /sys/block/sd*; do
+    if [ -d $ifname/device ]; then
+       read vendor < $ifname/device/vendor
+       if [ "$vendor" = "ATA" ]; then
+           # We need page 0x80 to get the serial number
+           page="-p 0x80"
+       else
+           page=
+       fi
+       scsi_id -g $page -s ${ifname#/sys} 2> /dev/null | while read vendor model serial; do
+           filename="${vendor}_${model}_${serial}"
+           echo "Generate hwcfg file for $filename"
+           echo "DEVICE=${ifname##*/}" > ${hwcfg}/hwcfg-disk-id-${filename}
+       done
+    fi
+done
diff --git a/src/hwinfo/getsysinfo b/src/hwinfo/getsysinfo
new file mode 100755 (executable)
index 0000000..1081a6b
--- /dev/null
@@ -0,0 +1,77 @@
+#! /bin/sh
+
+if [ "$1" ] ; then
+  cat <<EOF
+Usage: getsysinfo
+Collect some system data that are useful for debugging
+hardware detection bugs.
+EOF
+  exit 0
+fi
+
+# collect some system data
+
+dir=`mktemp -d /tmp/getsysinfo.XXXXXXXXXX`
+
+[ -d "$dir" ] || exit 1
+
+host=`hostname`
+[ "$host" ] || host=xxx
+
+mkdir -p "$dir/$host"
+
+for i in \
+  /proc/bus/input \
+  /proc/cpuinfo \
+  /proc/device-tree \
+  /proc/devices \
+  /proc/dma \
+  /proc/driver/nvram \
+  /proc/fb \
+  /proc/iSeries \
+  /proc/ide \
+  /proc/interrupts \
+  /proc/iomem \
+  /proc/ioports \
+  /proc/meminfo \
+  /proc/modules \
+  /proc/net/dev \
+  /proc/partitions \
+  /proc/scsi \
+  /proc/sys/dev/cdrom/info \
+  /proc/sys/dev/parport \
+  /proc/tty \
+  /proc/version \
+  /sys \
+  /var/log/boot.msg
+do
+  if [ -e "$i" ] ; then
+    echo "$i"
+    cp -a --parents "$i" "$dir/$host" 2>/dev/null
+    chmod -R u+w,a+r,a+X "$dir/$host"
+  fi
+done
+
+echo /proc/mounts
+cp --parents /proc/mounts "$dir/$host"
+
+echo -e "\n------  dmesg start  ------\n" >>"$dir/$host/var/log/boot.msg"
+dmesg >>"$dir/$host/var/log/boot.msg"
+
+file="$host.tar.gz"
+tar -C "$dir" -zcf "$dir/$file" "$host"
+
+rm -f "/tmp/$file"
+
+if [ -e "/tmp/$file" ] ; then
+  echo "Warning: /tmp/$file exists, no info written"\!
+  rm -rf "$dir"
+  exit 1
+fi
+
+ln -nf "$dir/$file" "/tmp/$file"
+
+rm -rf "$dir"
+
+echo -e "\nSystem data written to: /tmp/$file"
+
diff --git a/src/hwinfo/hwbootscan b/src/hwinfo/hwbootscan
new file mode 100644 (file)
index 0000000..6bcfb25
--- /dev/null
@@ -0,0 +1,15 @@
+#!/bin/bash
+
+rm -f /var/lib/hardware/LOCK
+
+/sbin/hwscan --silent --boot --fast --isapnp --pci --block --floppy --mouse
+
+#
+# create icons for static drives
+#
+if [ -e /etc/hotplug/hotplug.subfs.functions ]; then
+  . /etc/hotplug/hotplug.subfs.functions
+  coldplug_create_subfs
+fi
+
+exit 0
diff --git a/src/hwinfo/hwbootscan.rc b/src/hwinfo/hwbootscan.rc
new file mode 100644 (file)
index 0000000..26484ea
--- /dev/null
@@ -0,0 +1,101 @@
+#! /bin/sh
+# Copyright (c) 2002 SuSE GmbH Nuernberg, Germany.  All rights reserved.
+#
+# Author: Marcus Meissner <meissner@suse.de>
+#
+# /etc/init.d/hwscan
+#
+# System startup script for boot hw probing and reconfiguration
+#
+### BEGIN INIT INFO
+# Provides: hwscan
+# Required-Start:
+# X-UnitedLinux-Should-Start: hotplug kbd
+# Required-Stop:
+# Default-Start: 2 3 5
+# Default-Stop:
+# Description: Hardware scan and reconfiguration on boot.
+### END INIT INFO
+
+HWBOOTSCAN_BIN=/usr/sbin/hwbootscan
+test -x $HWBOOTSCAN_BIN || exit 5
+
+# Shell functions sourced from /etc/rc.status:
+#      rc_check         check and set local and overall rc status
+#      rc_status        check and set local and overall rc status
+#      rc_status -v     ditto but be verbose in local rc status
+#      rc_status -v -r  ditto and clear the local rc status
+#      rc_failed        set local and overall rc status to failed
+#      rc_reset         clear local rc status (overall remains)
+#      rc_exit          exit appropriate to overall rc status
+. /etc/rc.status
+
+# First reset status of this service
+rc_reset
+
+# Return values acc. to LSB for all commands but status:
+# 0 - success
+# 1 - misc error
+# 2 - invalid or excess args
+# 3 - unimplemented feature (e.g. reload)
+# 4 - insufficient privilege
+# 5 - program not installed
+# 6 - program not configured
+# 7 - program is not running
+#
+# Note that starting an already running service, stopping
+# or restarting a not-running service as well as the restart
+# with force-reload (in case signalling is not supported) are
+# considered a success.
+
+case "$1" in
+    start)
+       echo -n "Starting hardware scan on boot"
+       rc_splash "YaST"
+       [ -n "$REDIRECT" ] && exec 0<> $REDIRECT 1>&0 2>&0
+       $HWBOOTSCAN_BIN
+       rc_check
+        rc_status -v
+       ;;
+    stop)
+       rc_check
+       ;;
+    restart)
+        ## Stop the service and regardless of whether it was
+        ## running or not, start it again.
+        # Remember status and be quiet
+       rc_check
+        ;;
+    force-reload)
+        ## Signal the daemon to reload its config. Most daemons
+        ## do this on signal 1 (SIGHUP).
+        ## If it does not support it, restart.
+        # Remember status and be quiet
+       rc_check
+        ;;
+    reload)
+        ## Like force-reload, but if daemon does not support
+        ## signalling, do nothing (!)
+
+        # If it supports signalling:
+       rc_reset
+        ;;
+    status)
+        ## Check status with checkproc(8), if process is running
+        ## checkproc will return with exit status 0.
+
+        # Status has a slightly different for the status command:
+        # 0 - service running
+        # 1 - service dead, but /var/run/  pid  file exists
+        # 2 - service dead, but /var/lock/ lock file exists
+        # 3 - service not running
+
+       rc_reset
+        ;;
+    *)
+       echo "Usage: $0 {start|stop|restart|force-reload|reload|status}"
+       exit 1
+       ;;
+esac
+rc_exit
+
diff --git a/src/hwinfo/hwinfo.c b/src/hwinfo/hwinfo.c
new file mode 100644 (file)
index 0000000..8b32957
--- /dev/null
@@ -0,0 +1,2103 @@
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+#include <fcntl.h>
+#include <getopt.h>
+#include <errno.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+
+#include "hd.h"
+#include "hd_int.h"
+
+static int get_probe_flags(int, char **, hd_data_t *);
+static void progress2(char *, char *);
+
+// ##### temporary solution, fix it later!
+str_list_t *read_file(char *file_name, unsigned start_line, unsigned lines);
+str_list_t *search_str_list(str_list_t *sl, char *str);
+str_list_t *add_str_list(str_list_t **sl, char *str);
+char *new_str(const char *);
+
+static unsigned deb = 0;
+static char *log_file = "";
+static char *list = NULL;
+static int listplus = 0;
+
+static int test = 0;
+static int is_short = 0;
+
+static char *showconfig = NULL;
+static char *saveconfig = NULL;
+static hd_hw_item_t hw_item[100] = { };
+static int hw_items = 0;
+
+int braille_install_info(hd_data_t *hd_data);
+int x11_install_info(hd_data_t *hd_data);
+int oem_install_info(hd_data_t *hd_data);
+void dump_packages(hd_data_t *hd_data);
+
+void do_hw(hd_data_t *hd_data, FILE *f, hd_hw_item_t hw_item);
+void do_hw_multi(hd_data_t *hd_data, FILE *f, hd_hw_item_t *hw_items);
+void do_short(hd_data_t *hd_data, hd_t *hd, FILE *f);
+void do_test(hd_data_t *hd_data);
+void help(void);
+void dump_db_raw(hd_data_t *hd_data);
+void dump_db(hd_data_t *hd_data);
+void do_chroot(hd_data_t *hd_data, char *dir);
+void ask_db(hd_data_t *hd_data, char *query);
+void get_mapping(hd_data_t *hd_data);
+
+
+struct {
+  unsigned db_idx;
+  unsigned separate:1;
+  char *root;
+} opt;
+
+struct option options[] = {
+  { "special", 1, NULL, 1 },
+  { "help", 0, NULL, 'h' },
+  { "debug", 1, NULL, 'd' },
+  { "version", 0, NULL, 400 },
+  { "log", 1, NULL, 'l' },
+  { "packages", 0, NULL, 'p' },
+  { "test", 0, NULL, 300 },
+  { "format", 1, NULL, 301 },
+  { "show-config", 1, NULL, 302 },
+  { "save-config", 1, NULL, 303 },
+  { "short", 0, NULL, 304 },
+  { "fast", 0, NULL, 305 },
+  { "dump-db", 1, NULL, 306 },
+  { "dump-db-raw", 1, NULL, 307 },
+  { "separate", 0, NULL, 308 },
+  { "root", 1, NULL, 309 },
+  { "db", 1, NULL, 310 },
+  { "only", 1, NULL, 311 },
+  { "listmd", 0, NULL, 312 },
+  { "map", 0, NULL, 313 },
+  { "kernel-version", 1, NULL, 314 },
+  { "cdrom", 0, NULL, 1000 + hw_cdrom },
+  { "floppy", 0, NULL, 1000 + hw_floppy },
+  { "disk", 0, NULL, 1000 + hw_disk },
+  { "network", 0, NULL, 1000 + hw_network },
+  { "display", 0, NULL, 1000 + hw_display },
+  { "gfxcard", 0, NULL, 1000 + hw_display },
+  { "framebuffer", 0, NULL, 1000 + hw_framebuffer },
+  { "monitor", 0, NULL, 1000 + hw_monitor },
+  { "camera", 0, NULL, 1000 + hw_camera },
+  { "mouse", 0, NULL, 1000 + hw_mouse },
+  { "joystick", 0, NULL, 1000 + hw_joystick },
+  { "keyboard", 0, NULL, 1000 + hw_keyboard },
+  { "chipcard", 0, NULL, 1000 + hw_chipcard },
+  { "sound", 0, NULL, 1000 + hw_sound },
+  { "isdn", 0, NULL, 1000 + hw_isdn },
+  { "modem", 0, NULL, 1000 + hw_modem },
+  { "storage-ctrl", 0, NULL, 1000 + hw_storage_ctrl },
+  { "storage_ctrl", 0, NULL, 1000 + hw_storage_ctrl },
+  { "netcard", 0, NULL, 1000 + hw_network_ctrl },
+  { "netcards", 0, NULL, 1000 + hw_network_ctrl },     // outdated, just kept for comaptibility
+  { "network-ctrl", 0, NULL, 1000 + hw_network_ctrl },
+  { "network_ctrl", 0, NULL, 1000 + hw_network_ctrl },
+  { "printer", 0, NULL, 1000 + hw_printer },
+  { "tv", 0, NULL, 1000 + hw_tv },
+  { "dvb", 0, NULL, 1000 + hw_dvb },
+  { "scanner", 0, NULL, 1000 + hw_scanner },
+  { "braille", 0, NULL, 1000 + hw_braille },
+  { "sys", 0, NULL, 1000 + hw_sys },
+  { "bios", 0, NULL, 1000 + hw_bios },
+  { "cpu", 0, NULL, 1000 + hw_cpu },
+  { "partition", 0, NULL, 1000 + hw_partition },
+  { "usb-ctrl", 0, NULL, 1000 + hw_usb_ctrl },
+  { "usb_ctrl", 0, NULL, 1000 + hw_usb_ctrl },
+  { "usb", 0, NULL, 1000 + hw_usb },
+  { "pci", 0, NULL, 1000 + hw_pci },
+  { "isapnp", 0, NULL, 1000 + hw_isapnp },
+  { "scsi", 0, NULL, 1000 + hw_scsi },
+  { "ide", 0, NULL, 1000 + hw_ide },
+  { "bridge", 0, NULL, 1000 + hw_bridge },
+  { "hub", 0, NULL, 1000 + hw_hub },
+  { "memory", 0, NULL, 1000 + hw_memory },
+  { "manual", 0, NULL, 1000 + hw_manual },
+  { "pcmcia", 0, NULL, 1000 + hw_pcmcia },
+  { "pcmcia_ctrl", 0, NULL, 1000 + hw_pcmcia_ctrl },
+  { "ieee1394", 0, NULL, 1000 + hw_ieee1394 },
+  { "ieee1394_ctrl", 0, NULL, 1000 + hw_ieee1394_ctrl },
+  { "firewire", 0, NULL, 1000 + hw_ieee1394 },
+  { "firewire_ctrl", 0, NULL, 1000 + hw_ieee1394_ctrl },
+  { "hotplug", 0, NULL, 1000 + hw_hotplug },
+  { "hotplug_ctrl", 0, NULL, 1000 + hw_hotplug_ctrl },
+  { "zip", 0, NULL, 1000 + hw_zip },
+  { "pppoe", 0, NULL, 1000 + hw_pppoe },
+  { "dsl", 0, NULL, 1000 + hw_dsl },
+  { "wlan", 0, NULL, 1000 + hw_wlan },
+  { "redasd", 0, NULL, 1000 + hw_redasd },
+  { "block", 0, NULL, 1000 + hw_block },
+  { "tape", 0, NULL, 1000 + hw_tape },
+  { "vbe", 0, NULL, 1000 + hw_vbe },
+  { "bluetooth", 0, NULL, 1000 + hw_bluetooth },
+  { "all", 0, NULL, 2000 },
+  { "reallyall", 0, NULL, 2001 },
+  { "smp", 0, NULL, 2002 },
+  { "arch", 0, NULL, 2003 },
+  { "uml", 0, NULL, 2004 },
+  { }
+};
+
+
+/*
+ * Just scan the hardware and dump all info.
+ */
+int main(int argc, char **argv)
+{
+  hd_data_t *hd_data;
+  hd_t *hd;
+  FILE *f = NULL;
+  int i;
+  unsigned first_probe = 1;
+
+  hd_data = calloc(1, sizeof *hd_data);
+  hd_data->progress = isatty(1) ? progress2 : NULL;
+  hd_data->debug=~(HD_DEB_DRIVER_INFO | HD_DEB_HDDB);
+
+  for(i = 0; i < argc; i++) {
+    if(strstr(argv[i], "--") == argv[i]) break;
+  }
+
+  if(i != argc) {
+    /* new style interface */
+
+    opterr = 0;
+
+    while((i = getopt_long(argc, argv, "hd:l:p", options, NULL)) != -1) {
+      switch(i) {
+        case 1:
+          if(!strcmp(optarg, "braille")) {
+            braille_install_info(hd_data);
+          }
+          else if(!strcmp(optarg, "x11")) {
+            x11_install_info(hd_data);
+          }
+          else if(!strcmp(optarg, "oem")) {
+            oem_install_info(hd_data);
+          }
+          else {
+            help();
+            return 1;
+          }
+          break;
+
+        case 'd':
+          hd_data->debug = strtol(optarg, NULL, 0);
+          break;
+
+        case 'l':
+          log_file = optarg;
+          break;
+
+        case 'p':
+          dump_packages(hd_data);
+         break;
+
+        case 300:
+          do_test(hd_data);
+          break;
+
+        case 301:
+          hd_data->flags.dformat = strtol(optarg, NULL, 0);
+          break;
+
+        case 302:
+          showconfig = optarg;
+          break;
+
+        case 303:
+          saveconfig = optarg;
+          break;
+
+        case 304:
+          is_short = 1;
+          break;
+
+        case 305:
+          hd_data->flags.fast = 1;
+          break;
+
+        case 306:
+          opt.db_idx = strtoul(optarg, NULL, 0);
+          dump_db(hd_data);
+          break;
+
+        case 307:
+          opt.db_idx = strtoul(optarg, NULL, 0);
+          dump_db_raw(hd_data);
+          break;
+
+        case 308:
+          /* basically for debugging */
+          opt.separate = 1;
+          break;
+
+        case 309:
+          opt.root = optarg;
+          break;
+
+        case 310:
+          ask_db(hd_data, optarg);
+          break;
+
+        case 311:
+          if(*optarg) add_str_list(&hd_data->only, optarg);
+          break;
+
+        case 312:
+          hd_data->flags.list_md = 1;
+          break;
+
+        case 313:
+          get_mapping(hd_data);
+          break;
+
+        case 314:
+          if(*optarg) setenv("LIBHD_KERNELVERSION", optarg, 1);
+          break;
+
+        case 400:
+          printf("%s\n", hd_version());
+         break;
+
+        case 1000 ... 1100:
+          if(hw_items < (int) (sizeof hw_item / sizeof *hw_item) - 1)
+            hw_item[hw_items++] = i - 1000;
+          break;
+
+        case 2000:
+        case 2001:
+        case 2002:
+        case 2003:
+        case 2004:
+          if(hw_items < (int) (sizeof hw_item / sizeof *hw_item) - 1)
+            hw_item[hw_items++] = i;
+          break;
+
+        default:
+          help();
+          return 0;
+      }
+    }
+
+    if(!hw_items && is_short) hw_item[hw_items++] = 2000;      /* all */
+
+    if(hw_items >= 0 || showconfig || saveconfig) {
+      if(*log_file) {
+        if(!strcmp(log_file, "-")) {
+          f = fdopen(1, "w");
+        }
+        else {
+          f = fopen(log_file, "w+");
+        }
+      }
+
+      if(opt.root) do_chroot(hd_data, opt.root);
+
+      if(opt.separate || hw_items <= 1) {
+        for(i = 0; i < hw_items; i++) {
+          if(i) fputc('\n', f ? f : stdout);
+          do_hw(hd_data, f, hw_item[i]);
+        }
+      }
+      else {
+        hw_item[hw_items] = 0;
+        do_hw_multi(hd_data, f, hw_item);
+      }
+
+#ifndef LIBHD_TINY
+      if(showconfig) {
+        hd = hd_read_config(hd_data, showconfig);
+        if(hd) {
+          hd_dump_entry(hd_data, hd, f ? f : stdout);
+          hd = hd_free_hd_list(hd);
+        }
+        else {
+          fprintf(f ? f : stdout, "No config data: %s\n", showconfig);
+        }
+      }
+
+      if(saveconfig) {
+        for(hd = hd_data->hd; hd; hd = hd->next) {
+          if(!strcmp(hd->unique_id, saveconfig)) {
+            i = hd_write_config(hd_data, hd);
+            fprintf(f ? f : stdout, "%s: %s\n",
+              saveconfig,
+              i ? "Error writing config data" : "config saved"
+            );
+            break;
+          }
+        }
+        if(!hd) {
+          fprintf(f ? f : stdout, "No such hardware: %s\n", saveconfig);
+        }
+      }
+#endif
+
+      if(f) fclose(f);
+    }
+
+    hd_free_hd_data(hd_data);
+    free(hd_data);
+
+    return 0;
+  }
+
+  /* old style interface */
+
+  argc--; argv++;
+
+  if(argc == 1 && !strcmp(*argv, "-h")) {
+    help();
+    return 0;
+  }
+
+  do {
+    if(first_probe)                            /* only for the 1st probing */
+      hd_set_probe_feature(hd_data, pr_default);
+    else {
+      hd_clear_probe_feature(hd_data, pr_all);
+    }
+
+    if((i = get_probe_flags(argc, argv, hd_data)) < 0) return 1;
+    deb = hd_data->debug;
+    argc -= i; argv += i;
+
+    if(opt.root && first_probe) do_chroot(hd_data, opt.root);
+
+    hd_scan(hd_data);
+    if(hd_data->progress) printf("\r%64s\r", "");
+
+    first_probe = 0;
+  } while(argc);
+
+  if(*log_file) {
+    if(!strcmp(log_file, "-")) {
+      f = fdopen(1, "w");
+    }
+    else {
+      f = fopen(log_file, "w+");
+    }
+  }
+
+  if((hd_data->debug & HD_DEB_SHOW_LOG) && hd_data->log) {
+    if(*log_file) {
+      fprintf(f ? f : stdout,
+        "============ start hardware log ============\n"
+      );
+    }
+    fprintf(f ? f : stdout,
+      "============ start debug info ============\n%s=========== end debug info ============\n",
+      hd_data->log
+    );
+  }
+
+  for(hd = hd_data->hd; hd; hd = hd->next) {
+    hd_dump_entry(hd_data, hd, f ? f : stdout);
+  }
+
+  if(*log_file) {
+    fprintf(f ? f : stdout,
+      "============ end hardware log ============\n"
+    );
+  }
+
+  i = -1;
+  if(list) {
+    if(!strcmp(list, "cdrom")) i = hw_cdrom;
+    if(!strcmp(list, "disk")) i = hw_disk;
+    if(!strcmp(list, "floppy")) i = hw_floppy;
+    if(!strcmp(list, "network")) i = hw_network;
+    if(!strcmp(list, "display")) i = hw_display;
+    if(!strcmp(list, "monitor")) i = hw_monitor;
+    if(!strcmp(list, "mouse")) i = hw_mouse;
+    if(!strcmp(list, "keyboard")) i = hw_keyboard;
+    if(!strcmp(list, "sound")) i = hw_sound;
+    if(!strcmp(list, "isdn")) i = hw_isdn;
+    if(!strcmp(list, "dsl")) i = hw_dsl;
+    if(!strcmp(list, "modem")) i = hw_modem;
+    if(!strcmp(list, "storage_ctrl")) i = hw_storage_ctrl;
+    if(!strcmp(list, "network_ctrl")) i = hw_network_ctrl;
+    if(!strcmp(list, "netcards")) i = hw_network_ctrl;
+    if(!strcmp(list, "printer")) i = hw_printer;
+    if(!strcmp(list, "tv")) i = hw_tv;
+    if(!strcmp(list, "scanner")) i = hw_scanner;
+    if(!strcmp(list, "braille")) i = hw_braille;
+    if(!strcmp(list, "sys")) i = hw_sys;
+    if(!strcmp(list, "cpu")) i = hw_cpu;
+
+    if(i >= 0) {
+      hd = hd_list(hd_data, i, listplus, NULL);
+      printf("\n");
+      printf("-- %s list --\n", list);
+      for(; hd; hd = hd->next) hd_dump_entry(hd_data, hd, stdout);
+      printf("-- %s list end --\n", list);
+      hd = hd_free_hd_list(hd);
+    }
+  }
+
+  if(f) fclose(f);
+
+  hd_free_hd_data(hd_data);
+  free(hd_data);
+
+  return 0;
+}
+
+
+void do_hw(hd_data_t *hd_data, FILE *f, hd_hw_item_t hw_item)
+{
+  hd_t *hd, *hd0;
+  int smp = -1, uml = 0, i;
+  char *s, *t;
+  enum boot_arch b_arch;
+  enum cpu_arch c_arch;
+
+  hd0 = NULL;
+
+  switch(hw_item) {
+    case 2002:
+      smp = hd_smp_support(hd_data);
+      break;
+
+    case 2000:
+    case 2001:
+    case 2003:
+      i = -1;
+      switch((int) hw_item) {
+        case 2000: i = pr_default; break;
+        case 2001: i = pr_all; break;
+        case 2003: i = pr_cpu; break;
+      }
+      if(i != -1) {
+        hd_clear_probe_feature(hd_data, pr_all);
+        hd_set_probe_feature(hd_data, i);
+        hd_scan(hd_data);
+        hd0 = hd_data->hd;
+      }
+      break;
+
+    case 2004:
+      uml = hd_is_uml(hd_data);
+      break;
+
+    default:
+      hd0 = hd_list(hd_data, hw_item, 1, NULL);
+  }
+
+  if(hd_data->progress) {
+    printf("\r%64s\r", "");
+    fflush(stdout);
+  }
+
+  if(f) {
+    if((hd_data->debug & HD_DEB_SHOW_LOG) && hd_data->log) {
+      fprintf(f,
+        "============ start hardware log ============\n"
+      );
+      fprintf(f,
+        "============ start debug info ============\n%s=========== end debug info ============\n",
+        hd_data->log
+      );
+    }
+
+    for(hd = hd_data->hd; hd; hd = hd->next) {
+      hd_dump_entry(hd_data, hd, f);
+    }
+
+    fprintf(f,
+      "============ end hardware log ============\n"
+    );
+  }
+
+  if(hw_item == 2002) {
+    fprintf(f ? f : stdout,
+      "SMP support: %s",
+      smp < 0 ? "unknown" : smp > 0 ? "yes" : "no"
+    );
+    if(smp > 0) fprintf(f ? f : stdout, " (%u cpus)", smp);
+    fprintf(f ? f : stdout, "\n");
+  }
+  else if(hw_item == 2003) {
+    c_arch = hd_cpu_arch(hd_data);
+    b_arch = hd_boot_arch(hd_data);
+
+    s = t = "Unknown";
+    switch(c_arch) {
+      case arch_unknown:
+        break;
+      case arch_intel:
+        s = "X86 (32)";
+        break;
+      case arch_alpha:
+        s = "Alpha";
+        break;
+      case arch_sparc:
+        s = "Sparc (32)";
+        break;
+      case arch_sparc64:
+        s = "UltraSparc (64)";
+        break;
+      case arch_ppc:
+        s = "PowerPC";
+        break;
+      case arch_ppc64:
+        s = "PowerPC (64)";
+        break;
+      case arch_68k:
+        s = "68k";
+        break;
+      case arch_ia64:
+        s = "IA-64";
+        break;
+      case arch_s390:
+        s = "S390";
+        break;
+      case arch_s390x:
+        s = "S390x";
+        break;
+      case arch_arm:
+        s = "ARM";
+        break;
+      case arch_mips:
+        s = "MIPS";
+        break;
+      case arch_x86_64:
+        s = "X86_64";
+        break;
+    }
+
+    switch(b_arch) {
+      case boot_unknown:
+        break;
+      case boot_lilo:
+        t = "lilo";
+        break;
+      case boot_milo:
+        t = "milo";
+        break;
+      case boot_aboot:
+        t = "aboot";
+        break;
+      case boot_silo:
+        t = "silo";
+        break;
+      case boot_ppc:
+        t = "ppc";
+        break;
+      case boot_elilo:
+        t = "elilo";
+        break;
+      case boot_s390:
+        t = "s390";
+        break;
+      case boot_mips:
+        t = "mips";
+        break;
+      case boot_grub:
+        t = "grub";
+        break;
+    }
+
+    fprintf(f ? f : stdout, "Arch: %s/%s\n", s, t);
+  }
+  else if(hw_item == 2004) {
+    fprintf(f ? f : stdout, "UML: %s\n", uml ? "yes" : "no");
+  }
+  else {
+    if(is_short) {
+      /* always to stdout */
+      do_short(hd_data, hd0, stdout);
+      if(f) do_short(hd_data, hd0, f);
+    }
+    else {
+      for(hd = hd0; hd; hd = hd->next) {
+        hd_dump_entry(hd_data, hd, f ? f : stdout);
+      }
+    }
+  }
+
+  if(hw_item == hw_display && hd0) {
+    fprintf(f ? f : stdout, "\nPrimary display adapter: #%u\n", hd_display_adapter(hd_data));
+  }
+
+  if(hd0 != hd_data->hd) hd_free_hd_list(hd0);
+}
+
+
+void do_hw_multi(hd_data_t *hd_data, FILE *f, hd_hw_item_t *hw_items)
+{
+  hd_t *hd, *hd0;
+
+  hd0 = hd_list2(hd_data, hw_items, 1);
+
+  if(hd_data->progress) {
+    printf("\r%64s\r", "");
+    fflush(stdout);
+  }
+
+  if(f) {
+    if((hd_data->debug & HD_DEB_SHOW_LOG) && hd_data->log) {
+      fprintf(f,
+        "============ start hardware log ============\n"
+      );
+      fprintf(f,
+        "============ start debug info ============\n%s=========== end debug info ============\n",
+        hd_data->log
+      );
+    }
+
+    for(hd = hd_data->hd; hd; hd = hd->next) {
+      hd_dump_entry(hd_data, hd, f);
+    }
+
+    fprintf(f,
+      "============ end hardware log ============\n"
+    );
+  }
+
+  if(is_short) {
+    /* always to stdout */
+    do_short(hd_data, hd0, stdout);
+    if(f) do_short(hd_data, hd0, f);
+  }
+  else {
+    for(hd = hd0; hd; hd = hd->next) {
+      hd_dump_entry(hd_data, hd, f ? f : stdout);
+    }
+  }
+
+  hd_free_hd_list(hd0);
+}
+
+
+void do_short(hd_data_t *hd_data, hd_t *hd, FILE *f)
+{
+#ifndef LIBHD_TINY
+  hd_hw_item_t item;
+  hd_t *hd1;
+  int i;
+  char *s;
+
+  for(item = 1; item < hw_all; item++) {
+    i = 0;
+    s = hd_hw_item_name(item);
+    if(!s) continue;
+
+    if(item == hw_sys) continue;
+
+    for(hd1 = hd; hd1; hd1 = hd1->next) {
+      if(hd1->hw_class == item) {
+        if(!i++) fprintf(f, "%s:\n", s);
+        fprintf(f, "  %-20s %s\n",
+          hd1->unix_dev_name ? hd1->unix_dev_name : "",
+          hd1->model ? hd1->model : "???"
+        );
+      }
+    }
+  }
+#endif
+}
+
+
+#if 0
+typedef struct {
+  char *vendor, *model, *driver;
+} scanner_t;
+
+static scanner_t scanner_data[] = {
+  { "Abaton", "SCAN 300/GS", "abaton" },
+  { "Abaton", "SCAN 300/S", "abaton" },
+  { "Acer", "300f", "SnapScan" },
+  { "Acer", "310s", "SnapScan" },
+  { "Acer", "610plus", "SnapScan" },
+  { "Acer", "610s", "SnapScan" },
+  { "Acer", "Prisa 1240", "SnapScan" },
+  { "Acer", "Prisa 3300", "SnapScan" },
+  { "Acer", "Prisa 4300", "SnapScan" },
+  { "Acer", "Prisa 5300", "SnapScan" },
+  { "Acer", "Prisa 620s", "SnapScan" },
+  { "Acer", "Prisa 620u", "SnapScan" },
+  { "Acer", "Prisa 620ut", "SnapScan" },
+  { "Acer", "Prisa 640bu", "SnapScan" },
+  { "Acer", "Prisa 640u", "SnapScan" },
+  { "Agfa", "Arcus II", "microtek" },
+  { "Agfa", "DuoScan", "microtek" },
+  { "Agfa", "FOCUS COLOR", "agfafocus" },
+  { "Agfa", "FOCUS GS SCANNER", "agfafocus" },
+  { "Agfa", "FOCUS II", "agfafocus" },
+  { "Agfa", "FOCUS LINEART SCANNER", "agfafocus" },
+  { "Agfa", "SnapScan 1212u", "SnapScan" },
+  { "Agfa", "SnapScan 1236s", "SnapScan" },
+  { "Agfa", "SnapScan 1236u", "SnapScan" },
+  { "Agfa", "SnapScan 300", "SnapScan" },
+  { "Agfa", "SnapScan 310", "SnapScan" },
+  { "Agfa", "SnapScan 600", "SnapScan" },
+  { "Agfa", "SnapScan e20", "SnapScan" },
+  { "Agfa", "SnapScan e25", "SnapScan" },
+  { "Agfa", "SnapScan e40", "SnapScan" },
+  { "Agfa", "SnapScan e50", "SnapScan" },
+  { "Agfa", "SnapScan e60", "SnapScan" },
+  { "Agfa", "StudioScan", "microtek" },
+  { "Agfa", "StudioScan II", "microtek" },
+  { "Agfa", "StudioScan IIsi", "microtek" },
+  { "Apple", "APPLE SCANNER", "apple" },
+  { "Apple", "COLORONESCANNER", "apple" },
+  { "Apple", "ONESCANNER", "apple" },
+  { "Artec", "A6000C", "artec" },
+  { "Artec", "A6000C PLUS", "artec" },
+  { "Artec", "AM12S", "artec" },
+  { "Artec", "AT12", "artec" },
+  { "Artec", "AT3", "artec" },
+  { "Artec", "AT6", "artec" },
+  { "Artec", "ColorOneScanner", "artec" },
+  { "Avision", "AV 620 CS", "avision" },
+  { "Avision", "AV 6240", "avision" },
+  { "Avision", "AV 630 CS", "avision" },
+  { "B&H SCSI", "COPISCAN II 2135", "bh" },
+  { "B&H SCSI", "COPISCAN II 2137", "bh" },
+  { "B&H SCSI", "COPISCAN II 2137A", "bh" },
+  { "B&H SCSI", "COPISCAN II 2138A", "bh" },
+  { "B&H SCSI", "COPISCAN II 3238", "bh" },
+  { "B&H SCSI", "COPISCAN II 3338", "bh" },
+  { "B&H SCSI", "COPISCAN II 6338", "bh" },
+  { "BlackWidow", "BW4800SP", "artec" },
+  { "Canon", "CANOSCAN 2700F", "canon" },
+  { "Canon", "CANOSCAN 300", "canon" },
+  { "Canon", "CANOSCAN 600", "canon" },
+  { "Devcom", "9636PRO", "pie" },
+  { "Devcom", "9636S", "pie" },
+  { "EDGE", "KTX-9600US", "umax" },
+  { "Epson", "ES-8500", "epson" },
+  { "Epson", "EXPRESSION 1600", "epson" },
+  { "Epson", "EXPRESSION 1680", "epson" },
+  { "Epson", "EXPRESSION 636", "epson" },
+  { "Epson", "EXPRESSION 800", "epson" },
+  { "Epson", "FILMSCAN 200", "epson" },
+  { "Epson", "GT-5500", "epson" },
+  { "Epson", "GT-7000", "epson" },
+  { "Epson", "GT-8000", "epson" },
+  { "Epson", "PERFECTION 1200PHOTO", "epson" },
+  { "Epson", "PERFECTION 1200S", "epson" },
+  { "Epson", "PERFECTION 1200U", "epson" },
+  { "Epson", "PERFECTION 1240", "epson" },
+  { "Epson", "PERFECTION 1640", "epson" },
+  { "Epson", "PERFECTION 1650", "epson" },
+  { "Epson", "PERFECTION 610", "epson" },
+  { "Epson", "PERFECTION 636S", "epson" },
+  { "Epson", "PERFECTION 636U", "epson" },
+  { "Epson", "PERFECTION 640", "epson" },
+  { "Epson", "PERFECTION1200", "epson" },
+  { "Epson", "Perfection 600", "umax" },
+  { "Escom", "Image Scanner 256", "umax" },
+  { "Escort", "Galleria 600", "umax" },
+  { "Fujitsu", "M3091DCD", "m3091" },
+  { "Fujitsu", "M3096G", "m3096g" },
+  { "Fujitsu", "SP15C", "sp15c" },
+  { "Genius", "ColorPage-HR5 Pro", "umax" },
+  { "Guillemot", "Maxi Scan A4 Deluxe", "SnapScan" },
+  { "HP", "HP OFFICEJET K SERIES", "hp" },
+  { "HP", "HP OFFICEJET V SERIES", "hp" },
+  { "HP", "HP PHOTOSMART PHOTOSCANNER", "hp" },
+  { "HP", "HP PSC 700 SERIES", "hp" },
+  { "HP", "HP PSC 900 SERIES", "hp" },
+  { "HP", "HP SCANJET 3C", "hp" },
+  { "HP", "HP SCANJET 3P", "hp" },
+  { "HP", "HP SCANJET 4100C", "hp" },
+  { "HP", "HP SCANJET 4C", "hp" },
+  { "HP", "HP SCANJET 4P", "hp" },
+  { "HP", "HP SCANJET 5200C", "hp" },
+  { "HP", "HP SCANJET 6100C", "hp" },
+  { "HP", "HP SCANJET 6200C", "hp" },
+  { "HP", "HP SCANJET 6250C", "hp" },
+  { "HP", "HP SCANJET 6300C", "hp" },
+  { "HP", "HP SCANJET 6350C", "hp" },
+  { "HP", "HP SCANJET 6390C", "hp" },
+  { "HP", "HP SCANJET IIC", "hp" },
+  { "HP", "HP SCANJET IICX", "hp" },
+  { "HP", "HP SCANJET IIP", "hp" },
+  { "HP", "HP ScanJet 5p", "hp" },
+  { "HP", "HP4200", "hp4200" },
+  { "Highscreen", "Scanboostar Premium", "umax" },
+  { "Linotype Hell", "Jade", "umax" },
+  { "Linotype Hell", "Jade2", "umax" },
+  { "Linotype Hell", "Linoscan 1400", "umax" },
+  { "Linotype Hell", "Opal", "umax" },
+  { "Linotype Hell", "Opal Ultra", "umax" },
+  { "Linotype Hell", "Saphir", "umax" },
+  { "Linotype Hell", "Saphir HiRes", "umax" },
+  { "Linotype Hell", "Saphir Ultra", "umax" },
+  { "Linotype Hell", "Saphir Ultra II", "umax" },
+  { "Linotype Hell", "Saphir2", "umax" },
+  { "Microtek", "Phantom 636", "microtek2" },
+  { "Microtek", "ScanMaker 330", "microtek2" },
+  { "Microtek", "ScanMaker 3600", "sm3600" },
+  { "Microtek", "ScanMaker 630", "microtek2" },
+  { "Microtek", "ScanMaker 636", "microtek2" },
+  { "Microtek", "ScanMaker 9600XL", "microtek2" },
+  { "Microtek", "ScanMaker E3plus", "microtek2" },
+  { "Microtek", "ScanMaker V300", "microtek2" },
+  { "Microtek", "ScanMaker V310", "microtek2" },
+  { "Microtek", "ScanMaker V600", "microtek2" },
+  { "Microtek", "ScanMaker V6USL", "microtek2" },
+  { "Microtek", "ScanMaker X6", "microtek2" },
+  { "Microtek", "ScanMaker X6EL", "microtek2" },
+  { "Microtek", "ScanMaker X6USB", "microtek2" },
+  { "Microtek", "Scanmaker 35", "microtek" },
+  { "Microtek", "Scanmaker 35t+", "microtek" },
+  { "Microtek", "Scanmaker 45t", "microtek" },
+  { "Microtek", "Scanmaker 600G", "microtek" },
+  { "Microtek", "Scanmaker 600G S", "microtek" },
+  { "Microtek", "Scanmaker 600GS", "microtek" },
+  { "Microtek", "Scanmaker 600S", "microtek" },
+  { "Microtek", "Scanmaker 600Z", "microtek" },
+  { "Microtek", "Scanmaker 600Z S", "microtek" },
+  { "Microtek", "Scanmaker 600ZS", "microtek" },
+  { "Microtek", "Scanmaker E2", "microtek" },
+  { "Microtek", "Scanmaker E3", "microtek" },
+  { "Microtek", "Scanmaker E6", "microtek" },
+  { "Microtek", "Scanmaker II", "microtek" },
+  { "Microtek", "Scanmaker IIG", "microtek" },
+  { "Microtek", "Scanmaker IIHR", "microtek" },
+  { "Microtek", "Scanmaker III", "microtek" },
+  { "Microtek", "Scanmaker IISP", "microtek" },
+  { "Microtek", "SlimScan C6", "microtek2" },
+  { "Mustek", "1200 CU", "mustek_usb" },
+  { "Mustek", "1200 CU Plus", "mustek_usb" },
+  { "Mustek", "1200 UB", "mustek_usb" },
+  { "Mustek", "600 CU", "mustek_usb" },
+  { "Mustek", "Paragon 1200 A3 Pro", "mustek" },
+  { "Mustek", "Paragon 1200 III SP", "mustek" },
+  { "Mustek", "Paragon 1200 LS", "mustek" },
+  { "Mustek", "Paragon 1200 SP Pro", "mustek" },
+  { "Mustek", "Paragon 600 II CD", "mustek" },
+  { "Mustek", "Paragon 800 II SP", "mustek" },
+  { "Mustek", "Paragon MFC-600S", "mustek" },
+  { "Mustek", "Paragon MFC-800S", "mustek" },
+  { "Mustek", "Paragon MFS-12000CX", "mustek" },
+  { "Mustek", "Paragon MFS-12000SP", "mustek" },
+  { "Mustek", "Paragon MFS-1200SP", "mustek" },
+  { "Mustek", "Paragon MFS-6000CX", "mustek" },
+  { "Mustek", "Paragon MFS-6000SP", "mustek" },
+  { "Mustek", "Paragon MFS-8000SP", "mustek" },
+  { "Mustek", "ScanExpress 12000SP", "mustek" },
+  { "Mustek", "ScanExpress 12000SP Plus", "mustek" },
+  { "Mustek", "ScanExpress 6000SP", "mustek" },
+  { "Mustek", "ScanExpress A3 SP", "mustek" },
+  { "Mustek", "ScanMagic 600 II SP", "mustek" },
+  { "Mustek", "ScanMagic 9636S", "mustek" },
+  { "Mustek", "ScanMagic 9636S Plus", "mustek" },
+  { "NEC", "PC-IN500/4C", "nec" },
+  { "Nikon", "AX-210", "umax" },
+  { "Nikon", "LS-1000", "coolscan" },
+  { "Nikon", "LS-20", "coolscan" },
+  { "Nikon", "LS-2000", "coolscan" },
+  { "Nikon", "LS-30", "coolscan" },
+  { "Pie", "9630S", "pie" },
+  { "Pie", "ScanAce 1230S", "pie" },
+  { "Pie", "ScanAce 1236S", "pie" },
+  { "Pie", "ScanAce 630S", "pie" },
+  { "Pie", "ScanAce 636S", "plustek" },
+  { "Pie", "ScanAce II", "pie" },
+  { "Pie", "ScanAce II Plus", "pie" },
+  { "Pie", "ScanAce III", "pie" },
+  { "Pie", "ScanAce III Plus", "pie" },
+  { "Pie", "ScanAce Plus", "pie" },
+  { "Pie", "ScanAce ScanMedia", "pie" },
+  { "Pie", "ScanAce ScanMedia II", "pie" },
+  { "Pie", "ScanAce V", "pie" },
+  { "Plustek", "OpticPro 19200S", "artec" },
+  { "Polaroid", "DMC", "dmc" },
+  { "Ricoh", "Ricoh IS50", "ricoh" },
+  { "Ricoh", "Ricoh IS60", "ricoh" },
+  { "Scanport", "SQ4836", "microtek2" },
+  { "Sharp", "9036 Flatbed scanner", "sharp" },
+  { "Sharp", "JX-250", "sharp" },
+  { "Sharp", "JX-320", "sharp" },
+  { "Sharp", "JX-330", "sharp" },
+  { "Sharp", "JX-350", "sharp" },
+  { "Sharp", "JX-610", "sharp" },
+  { "Siemens", "9036 Flatbed scanner", "s9036" },
+  { "Siemens", "FOCUS COLOR PLUS", "agfafocus" },
+  { "Siemens", "ST400", "st400" },
+  { "Siemens", "ST800", "st400" },
+  { "Tamarack", "Artiscan 12000C", "tamarack" },
+  { "Tamarack", "Artiscan 6000C", "tamarack" },
+  { "Tamarack", "Artiscan 8000C", "tamarack" },
+  { "Trust", "Compact Scan USB 19200", "mustek_usb" },
+  { "Trust", "Imagery 1200 SP", "mustek" },
+  { "Trust", "Imagery 4800 SP", "mustek" },
+  { "Trust", "SCSI Connect 19200", "mustek" },
+  { "Trust", "SCSI excellence series 19200", "mustek" },
+  { "UMAX", "Astra 1200S", "umax" },
+  { "UMAX", "Astra 1220S", "umax" },
+  { "UMAX", "Astra 2100S", "umax" },
+  { "UMAX", "Astra 2200", "umax" },
+  { "UMAX", "Astra 2200 S", "umax" },
+  { "UMAX", "Astra 2200 U", "umax" },
+  { "UMAX", "Astra 2400S", "umax" },
+  { "UMAX", "Astra 600S", "umax" },
+  { "UMAX", "Astra 610S", "umax" },
+  { "UMAX", "Gemini D-16", "umax" },
+  { "UMAX", "Mirage D-16L", "umax" },
+  { "UMAX", "Mirage II", "umax" },
+  { "UMAX", "Mirage IIse", "umax" },
+  { "UMAX", "PL-II", "umax" },
+  { "UMAX", "PSD", "umax" },
+  { "UMAX", "PowerLook", "umax" },
+  { "UMAX", "PowerLook 2000", "umax" },
+  { "UMAX", "PowerLook 3000", "umax" },
+  { "UMAX", "PowerLook III", "umax" },
+  { "UMAX", "Supervista S-12", "umax" },
+  { "UMAX", "UC 1200S", "umax" },
+  { "UMAX", "UC 1200SE", "umax" },
+  { "UMAX", "UC 1260", "umax" },
+  { "UMAX", "UC 630", "umax" },
+  { "UMAX", "UC 840", "umax" },
+  { "UMAX", "UG 630", "umax" },
+  { "UMAX", "UG 80", "umax" },
+  { "UMAX", "UMAX S-12", "umax" },
+  { "UMAX", "UMAX S-12G", "umax" },
+  { "UMAX", "UMAX S-6E", "umax" },
+  { "UMAX", "UMAX S-6EG", "umax" },
+  { "UMAX", "UMAX VT600", "umax" },
+  { "UMAX", "Vista S6", "umax" },
+  { "UMAX", "Vista S6E", "umax" },
+  { "UMAX", "Vista-S8", "umax" },
+  { "UMAX", "Vista-T630", "umax" },
+  { "Ultima", "A6000C", "artec" },
+  { "Ultima", "A6000C PLUS", "artec" },
+  { "Ultima", "AM12S", "artec" },
+  { "Ultima", "AT12", "artec" },
+  { "Ultima", "AT3", "artec" },
+  { "Ultima", "AT6", "artec" },
+  { "Ultima", "ColorOneScanner", "artec" },
+  { "Vobis", "HighScan", "microtek2" },
+  { "Vobis", "Scanboostar Premium", "umax" },
+  { "Vuego", "Close SnapScan 310 compatible.", "SnapScan" }
+};
+
+static char *scanner_info(hd_t *hd)
+{
+  int i;
+
+  if(!hd->vendor.name || !hd->device.name) return NULL;
+
+  for(i = 0; (unsigned) i < sizeof scanner_data / sizeof *scanner_data; i++) {
+    if(
+      !strcasecmp(scanner_data[i].vendor, hd->vendor.name) &&
+      !strcasecmp(scanner_data[i].model, hd->device.name)
+    ) {
+      return scanner_data[i].driver;
+    }
+  }
+
+  return NULL;
+}
+
+#endif
+
+void do_test(hd_data_t *hd_data)
+{
+#if 0
+  hd_t *hd, *hd0;
+  hd_res_t *res;
+  driver_info_t *di;
+  FILE *f;
+  int i, wheels, buttons;
+  unsigned u;
+  uint64_t ul;
+  char *s, *s1;
+  hd_hw_item_t item, items[] = {
+    hw_display, hw_monitor, hw_tv, hw_sound, hw_mouse, hw_disk, hw_cdrom,
+    hw_floppy, hw_modem, hw_isdn, hw_scanner, hw_camera
+  };
+
+  hd_set_probe_feature(hd_data, pr_default);
+  hd_scan(hd_data);
+
+  f = fopen("/tmp/hw_overview.log", "w");
+
+  for(i = 0; (unsigned) i < sizeof items / sizeof *items; i++) {
+    item = items[i];
+    hd0 = hd_list(hd_data, item, 0, NULL);
+
+    if(!hd0) continue;
+  
+    switch(item) {
+      case hw_disk:
+        fprintf(f, "Disk\n");
+        for(hd = hd0; hd; hd = hd->next) {
+          u = 0;
+          for(res = hd->res; res; res = res->next) {
+            if(res->any.type == res_size && res->size.unit == size_unit_sectors) {
+              ul = (uint64_t) res->size.val1 * (res->size.val2 ?: 0x200);
+              u = ((ul >> 29) + 1) >> 1;
+            }
+          }
+          s = hd->bus.name;
+          fprintf(f, "  %s", hd->model);
+          if(u) {
+            fprintf(f, " (");
+            if(s) fprintf(f, "%s, ", s);
+            fprintf(f, "%u GB)", u);
+          }
+          fprintf(f, "\n");
+        }
+        fprintf(f, "\n");
+        break;
+
+      case hw_cdrom:
+        fprintf(f, "CD-ROM\n");
+        for(hd = hd0; hd; hd = hd->next) {
+          s = hd->bus.name;
+          fprintf(f, "  %s (", hd->model);
+          if(s) fprintf(f, "%s, ", s);
+          fprintf(f, "%s)", hd->prog_if.name ?: "CD-ROM");
+          fprintf(f, "\n");
+        }
+        fprintf(f, "\n");
+        break;
+
+      case hw_monitor:
+        fprintf(f, "Monitor\n");
+        for(hd = hd0; hd; hd = hd->next) {
+          s = hd->model;
+          if(!strcmp(hd->unique_id, "rdCR.EY_qmtb9YY0")) s = "not detected";
+          fprintf(f, "  %s\n", s);
+        }
+        fprintf(f, "\n");
+        break;
+
+      case hw_display:
+        fprintf(f, "GFX Card\n");
+        for(hd = hd0; hd; hd = hd->next) {
+          u = 0;
+          s1 = NULL;
+          for(di = hd->driver_info; di; di = di->next) {
+            if(di->any.type == di_x11) {
+              if(!s1) s1 = di->x11.server;
+              if(di->x11.x3d && !u) {
+                s1 = di->x11.server;
+                u = 1;
+              }
+            }
+          }
+          if(!s1) {
+            s1 = "not supported";
+            u = 0;
+          }
+          fprintf(f, "  %s (%s", hd->model, s1);
+          if(u) fprintf(f, ", 3D support");
+          fprintf(f, ")");
+          fprintf(f, "\n");
+        }
+        fprintf(f, "\n");
+        break;
+
+      case hw_mouse:
+        fprintf(f, "Mouse\n");
+        for(hd = hd0; hd; hd = hd->next) {
+          buttons = wheels = -1;       // make gcc happy
+          s = NULL;
+          for(di = hd->driver_info; di; di = di->next) {
+            if(di->any.type == di_mouse) {
+              buttons = di->mouse.buttons;
+              wheels = di->mouse.wheels;
+              s = di->mouse.xf86;
+              break;
+            }
+          }
+          if(!s) {
+            s = "not supported";
+            buttons = wheels = -1;
+          }
+          fprintf(f, "  %s (%s", hd->model, s);
+          if(buttons >= 0) fprintf(f, ", %d buttons", buttons);
+          if(wheels >= 0) fprintf(f, ", %d wheels", wheels);
+          fprintf(f, ")");
+          fprintf(f, "\n");
+        }
+        fprintf(f, "\n");
+        break;
+
+      case hw_tv:
+        fprintf(f, "TV Card\n");
+        for(hd = hd0; hd; hd = hd->next) {
+          s = NULL;
+          for(di = hd->driver_info; di; di = di->next) {
+            if(
+              (di->any.type == di_any || di->any.type == di_module) &&
+              di->any.hddb0 &&
+              di->any.hddb0->str
+            ) {
+              s = di->any.hddb0->str;
+              break;
+            }
+          }
+          if(!s) {
+            s = "not supported";
+          }
+          fprintf(f, "  %s (%s)\n", hd->model, s);
+        }
+        fprintf(f, "\n");
+        break;
+
+      case hw_sound:
+        fprintf(f, "Sound Card\n");
+        for(hd = hd0; hd; hd = hd->next) {
+          s = NULL;
+          for(di = hd->driver_info; di; di = di->next) {
+            if(
+              (di->any.type == di_any || di->any.type == di_module) &&
+              di->any.hddb0 &&
+              di->any.hddb0->str
+            ) {
+              s = di->any.hddb0->str;
+              break;
+            }
+          }
+          if(!s) {
+            s = "not supported";
+          }
+          fprintf(f, "  %s (%s)\n", hd->model, s);
+        }
+        fprintf(f, "\n");
+        break;
+
+      case hw_camera:
+        fprintf(f, "Digital Camera/WebCam\n");
+        for(hd = hd0; hd; hd = hd->next) {
+          fprintf(f, "  %s\n", hd->model);
+        }
+        fprintf(f, "\n");
+        break;
+
+      case hw_floppy:
+        fprintf(f, "Floppy/Zip Drive\n");
+        for(hd = hd0; hd; hd = hd->next) {
+          fprintf(f, "  %s\n", hd->model);
+        }
+        fprintf(f, "\n");
+        break;
+
+      case hw_modem:
+        fprintf(f, "Modem\n");
+        for(hd = hd0; hd; hd = hd->next) {
+          fprintf(f, "  %s\n", hd->model);
+        }
+        fprintf(f, "\n");
+        break;
+
+      case hw_isdn:
+        fprintf(f, "ISDN\n");
+        for(hd = hd0; hd; hd = hd->next) {
+          fprintf(f, "  %s (%ssupported)\n", hd->model, hd->driver_info ? "" : "not ");
+        }
+        fprintf(f, "\n");
+        break;
+
+      case hw_scanner:
+        fprintf(f, "Scanner\n");
+        for(hd = hd0; hd; hd = hd->next) {
+          s = scanner_info(hd);
+          if(!s) s = "not supported";
+          fprintf(f, "  %s (%s)\n", hd->model, s);
+        }
+        fprintf(f, "\n");
+        break;
+
+      default:
+        break;
+    }
+
+    hd_free_hd_list(hd0);
+
+  }
+
+  fclose(f);
+
+  f = fopen("/tmp/hw_detail.log", "w");
+
+  if(hd_data->log) {
+    fprintf(f,
+      "============ start detailed hardware log ============\n"
+    );
+    fprintf(f,
+      "============ start debug info ============\n%s=========== end debug info ============\n",
+      hd_data->log
+    );
+  }
+
+  for(hd = hd_data->hd; hd; hd = hd->next) {
+    hd_dump_entry(hd_data, hd, f);
+  }
+
+  fprintf(f,
+    "============ end detailed hardware log ============\n"
+  );
+
+  fclose(f);
+
+  fprintf(stderr, "\n");
+
+#endif
+
+#if 0
+  hd_t *hd;
+  hd_t *hd0 = NULL;
+
+  for(hd = hd_list(hd_data, hw_cdrom, 1, hd0); hd; hd = hd->next) {
+    fprintf(stderr, "cdrom: %s, %s\n", hd->unix_dev_name, hd->model);
+  }
+
+  for(hd = hd_list(hd_data, hw_cdrom, 1, hd0); hd; hd = hd->next) {
+    fprintf(stderr, "cdrom: %s, %s\n", hd->unix_dev_name, hd->model);
+  }
+#endif
+
+#if 0
+  hd_t *hd;
+
+  hd = hd_list(hd_data, hw_disk, 1, NULL);
+  hd_free_hd_list(hd);
+  hd_free_hd_data(hd_data);
+
+  hd = hd_list(hd_data, hw_cdrom, 1, NULL);
+  hd_free_hd_list(hd);
+  hd_free_hd_data(hd_data);
+
+  hd = hd_list(hd_data, hw_storage_ctrl, 1, NULL);
+  hd_free_hd_list(hd);
+  hd_free_hd_data(hd_data);
+
+  hd = hd_list(hd_data, hw_display, 1, NULL);
+  hd_free_hd_list(hd);
+  hd_free_hd_data(hd_data);
+
+#if 0
+  for(hd = hd_data->hd; hd; hd = hd->next) {
+    hd_dump_entry(hd_data, hd, stdout);
+  }
+
+  printf("%s\n", hd_data->log);
+#endif
+
+#endif
+
+#if 0
+  hd_t *hd, *hd0;
+
+  hd0 = hd_list(hd_data, hw_sound, 1, NULL);
+  hd0 = hd_list(hd_data, hw_sound, 1, NULL);
+
+  for(hd = hd0; hd; hd = hd->next) {
+    hd_dump_entry(hd_data, hd, stdout);
+  }
+
+#if 0
+  hd_data->log = free_mem(hd_data->log);
+  dump_hddb_data(hd_data, hd_data->hddb_dev, "hddb_dev, final");  
+  if(hd_data->log) printf("%s", hd_data->log);
+#endif
+
+#endif
+
+#if 0
+  hd_t *hd;
+  driver_info_t *di;
+  str_list_t *sl;
+
+  hd = hd_list(hd_data, hw_sys, 1, NULL);
+
+  for(di = hd->driver_info; di; di = di->next) {
+    if(di->any.type == di_module) {
+      for(sl = di->module.names; sl; sl = sl->next) printf("%s\n", sl->str);
+    }
+  }
+
+#endif
+}
+
+
+void help()
+{
+  fprintf(stderr,
+    "Usage: hwinfo [options]\n"
+    "Probe for hardware.\n"
+    "  --short        just a short listing\n"
+    "  --log logfile  write info to logfile\n"
+    "  --debug level  set debuglevel\n"
+    "  --version      show libhd version\n"
+    "  --dump-db n    dump hardware data base, 0: external, 1: internal\n"
+    "  --hw_item      probe for hw_item\n"
+    "  hw_item is one of:\n"
+    "    all, bios, block, bluetooth, braille, bridge, camera, cdrom, chipcard, cpu,\n"
+    "    disk, dsl, dvb, floppy, framebuffer, gfxcard, hub, ide, isapnp, isdn,\n"
+    "    joystick, keyboard, memory, modem, monitor, mouse, netcard, network,\n"
+    "    partition, pci, pcmcia, pcmcia-ctrl, pppoe, printer, scanner, scsi, smp,\n"
+    "    sound, storage-ctrl, sys, tape, tv, usb, usb-ctrl, vbe, wlan, zip\n\n"
+    "  Note: debug info is shown only in the log file. (If you specify a\n"
+    "  log file the debug level is implicitly set to a reasonable value.)\n"
+  );
+}
+
+
+/*
+ * Parse command line options.
+ */
+int get_probe_flags(int argc, char **argv, hd_data_t *hd_data)
+{
+  int i, j, k;
+  char *s, *t;
+  for(i = 0; i < argc; i++) {
+    s = argv[i];
+
+    if(!strcmp(s, ".")) {
+      return i + 1;
+    }
+
+    t = "debug=";
+    if(!strncmp(s, t, strlen(t))) {
+      hd_data->debug = strtol(s + strlen(t), NULL, 0);
+      continue;
+    }
+
+    t = "list=";
+    if(!strncmp(s, t, strlen(t))) {
+      list = s + strlen(t);
+      continue;
+    }
+
+    t = "list+=";
+    if(!strncmp(s, t, strlen(t))) {
+      list = s + strlen(t);
+      listplus = 1;
+      continue;
+    }
+
+    t = "log=";
+    if(!strncmp(s, t, strlen(t))) {
+      log_file = s + strlen(t);
+      continue;
+    }
+
+    t = "only=";
+    if(!strncmp(s, t, strlen(t))) {
+      add_str_list(&hd_data->only, s + strlen(t));
+      continue;
+    }
+
+    t = "root=";
+    if(!strncmp(s, t, strlen(t))) {
+      opt.root = s + strlen(t);
+      continue;
+    }
+
+    k = 1;
+    if(*s == '+')
+      s++;
+    else if(*s == '-')
+      k = 0, s++;
+
+    if((j = hd_probe_feature_by_name(s))) {
+      if(k)
+        hd_set_probe_feature(hd_data, j);
+      else
+        hd_clear_probe_feature(hd_data, j);
+      continue;
+    }
+
+    fprintf(stderr, "oops: don't know what to do with \"%s\"\n", s);
+    return -1;
+  }
+
+  return argc;
+}
+
+/*
+ * A simple progress function.
+ */
+void progress2(char *pos, char *msg)
+{
+  if(!test) printf("\r%64s\r", "");
+  printf("> %s: %s", pos, msg);
+  if(test) printf("\n");
+  fflush(stdout);
+}
+
+
+#define INSTALL_INF    "/etc/install.inf"
+
+int braille_install_info(hd_data_t *hd_data)
+{
+  hd_t *hd;
+  int ok = 0;
+  char *braille = NULL;
+  char *braille_dev = NULL;
+  str_list_t *sl0, *sl;
+  FILE *f;
+
+  hd = hd_list(hd_data, hw_braille, 1, NULL);
+
+  if(hd_data->progress) {
+    printf("\r%64s\r", "");
+    fflush(stdout);
+  }
+
+  for(; hd; hd = hd->next) {
+    if(
+      hd->base_class.id == bc_braille &&       /* is a braille display */
+      hd->unix_dev_name &&                     /* and has a device name */
+      (braille = hd->device.name)
+    ) {
+      braille_dev = hd->unix_dev_name;
+      ok = 1;
+      break;
+    }
+  }
+
+  if(!ok) return 1;
+
+  printf("found a %s at %s\n", braille, braille_dev);
+
+  sl0 = read_file(INSTALL_INF, 0, 0);
+  f = fopen(INSTALL_INF, "w");
+  if(!f) {
+    perror(INSTALL_INF);
+    return 1;
+  }
+  
+  for(sl = sl0; sl; sl = sl->next) {
+    if(
+      strstr(sl->str, "Braille:") != sl->str &&
+      strstr(sl->str, "Brailledevice:") != sl->str
+    ) {
+      fprintf(f, "%s", sl->str);
+    }
+  }
+
+  fprintf(f, "Braille: %s\n", braille);
+  fprintf(f, "Brailledevice: %s\n", braille_dev);
+  
+  fclose(f);
+
+  return 0;
+}
+
+
+/*
+ * get VGA parameter from /proc/cmdline
+ */
+int get_fb_mode()
+{
+#ifndef __PPC__
+  FILE *f;
+  char buf[256], *s, *t;
+  int i, fb_mode = 0;
+
+  if((f = fopen("/proc/cmdline", "r"))) {
+    if(fgets(buf, sizeof buf, f)) {
+      t = buf;
+      while((s = strsep(&t, " "))) {
+        if(sscanf(s, "vga=%i", &i) == 1) fb_mode = i;
+        if(strstr(s, "vga=normal") == s) fb_mode = 0;
+      }
+    }
+    fclose(f);
+  }
+
+  return fb_mode > 0x10 ? fb_mode : 0;
+#else /* __PPC__ */
+  /* this is the only valid test for active framebuffer ... */
+  FILE *f = NULL;
+  int fb_mode = 0;
+  if((f = fopen("/dev/fb", "r"))) {
+    fb_mode++;
+    fclose(f);
+  }
+
+  return fb_mode;
+#endif
+}
+
+
+/*
+ * read "x11i=" entry from /proc/cmdline
+ */
+char *get_x11i()
+{
+  FILE *f;
+  char buf[256], *s, *t;
+  static char x11i[64] = { };
+
+  if(*x11i) return x11i;
+
+  if((f = fopen("/proc/cmdline", "r"))) {
+    if(fgets(buf, sizeof buf, f)) {
+      t = buf;
+      while((s = strsep(&t, " "))) {
+        if(sscanf(s, "x11i=%60s", x11i) == 1) break;
+      }
+    }
+    fclose(f);
+  }
+
+  return x11i;
+}
+
+
+/*
+ * Assumes xf86_ver to be either "3" or "4" (or empty).
+ */
+char *get_xserver(hd_data_t *hd_data, char **version, char **busid, driver_info_t **x11_driver)
+{
+  static char display[16];
+  static char xf86_ver[2];
+  static char id[32];
+  char c, *x11i = get_x11i();
+  driver_info_t *di;
+  hd_t *hd;
+
+  *x11_driver = NULL;
+
+  *display = *xf86_ver = *id = c = 0;
+  *version = xf86_ver;
+  *busid = id;
+
+  if(x11i) {
+    if(*x11i == '3' || *x11i == '4') {
+      c = *x11i;
+    }
+    else {
+      if(*x11i >= 'A' && *x11i <= 'Z') {
+        c = '3';
+      }
+      if(*x11i >= 'a' && *x11i <= 'z') {
+        c = '4';
+      }
+      if(c) {
+        strncpy(display, x11i, sizeof display - 1);
+        display[sizeof display - 1] = 0;
+      }
+    }
+  }
+
+  if(c) { xf86_ver[0] = c; xf86_ver[1] = 0; }
+
+  hd = hd_get_device_by_idx(hd_data, hd_display_adapter(hd_data));
+
+  if(hd && hd->bus.id == bus_pci)
+    sprintf(id, "%d:%d:%d", hd->slot >> 8, hd->slot & 0xff, hd->func);
+
+  if(!hd || *display) return display;
+
+  for(di = hd->driver_info; di; di = di->next) {
+    if(di->any.type == di_x11 && di->x11.server && di->x11.xf86_ver && !di->x11.x3d) {
+      if(c == 0 || c == di->x11.xf86_ver[0]) {
+        xf86_ver[0] = di->x11.xf86_ver[0];
+        xf86_ver[1] = 0;
+        strncpy(display, di->x11.server, sizeof display - 1);
+        display[sizeof display - 1] = 0;
+        *x11_driver = di;
+        break;
+      }
+    }
+  }
+
+  if(*display) return display;
+
+  if(c == 0) c = '4';  /* default to XF 4, if nothing else is known  */
+
+  xf86_ver[0] = c;
+  xf86_ver[1] = 0;
+  strcpy(display, c == '3' ? "FBDev" : "fbdev");
+
+  return display;
+}
+
+int x11_install_info(hd_data_t *hd_data)
+{
+  hd_t *hd;
+  driver_info_t *di;
+  char *x11i;
+  int fb_mode, kbd_ok = 0;
+  unsigned yast2_color = 0;
+  char *xkbrules = NULL, *xkbmodel = NULL, *xkblayout = NULL;
+  char *xserver, *version, *busid;
+  driver_info_t *x11_driver;
+  str_list_t *sl0, *sl;
+  FILE *f;
+
+  /* get color info */
+  hd_set_probe_feature(hd_data, pr_cpu);
+  hd_set_probe_feature(hd_data, pr_prom);
+  hd_scan(hd_data);
+
+  x11i = get_x11i();
+  fb_mode = get_fb_mode();
+
+  hd_list(hd_data, hw_display, 1, NULL);
+
+  for(hd = hd_list(hd_data, hw_keyboard, 1, NULL); hd; hd = hd->next) {
+    kbd_ok = 1;
+    di = hd->driver_info;
+    if(di && di->any.type == di_kbd) {
+      xkbrules = di->kbd.XkbRules;
+      xkbmodel = di->kbd.XkbModel;
+      xkblayout = di->kbd.XkbLayout;
+      break;
+    }
+    /* don't free di */
+  }
+
+  xserver = get_xserver(hd_data, &version, &busid, &x11_driver);
+
+  switch(hd_mac_color(hd_data)) {
+    case 0x01:
+      yast2_color = 0x5a4add;
+      break;
+    case 0x04:
+      yast2_color = 0x32cd32;
+      break;
+    case 0x05:
+      yast2_color = 0xff7f50;
+      break;
+    case 0x07:
+      yast2_color = 0x000000;
+      break;
+    case 0xff:
+      yast2_color = 0x7f7f7f;
+      break;
+  }
+
+  if(hd_data->progress) {
+    printf("\r%64s\r", "");
+    fflush(stdout);
+  }
+
+  sl0 = read_file(INSTALL_INF, 0, 0);
+  f = fopen(INSTALL_INF, "w");
+  if(!f) {
+    perror(INSTALL_INF);
+    return 1;
+  }
+  
+  for(sl = sl0; sl; sl = sl->next) {
+    if(
+      strstr(sl->str, "Framebuffer:") != sl->str &&
+      strstr(sl->str, "XServer:") != sl->str &&
+      strstr(sl->str, "XVersion:") != sl->str &&
+      strstr(sl->str, "XBusID:") != sl->str &&
+      strstr(sl->str, "X11i:") != sl->str &&
+      strstr(sl->str, "Keyboard:") != sl->str &&
+      strstr(sl->str, "XkbRules:") != sl->str &&
+      strstr(sl->str, "XkbModel:") != sl->str &&
+      strstr(sl->str, "XkbLayout:") != sl->str &&
+      strstr(sl->str, "XF86Ext:") != sl->str &&
+      strstr(sl->str, "XF86Raw:") != sl->str
+    ) {
+      fprintf(f, "%s", sl->str);
+    }
+  }
+
+  fprintf(f, "Keyboard: %d\n", kbd_ok);
+  if(fb_mode) fprintf(f, "Framebuffer: 0x%04x\n", fb_mode);
+  if(x11i) fprintf(f, "X11i: %s\n", x11i);
+  if(xserver && *xserver) {
+    fprintf(f, "XServer: %s\n", xserver);
+    if(*version) fprintf(f, "XVersion: %s\n", version);
+    if(*busid) fprintf(f, "XBusID: %s\n", busid);
+  }
+  if(xkbrules && *xkbrules) fprintf(f, "XkbRules: %s\n", xkbrules);
+  if(xkbmodel && *xkbmodel) fprintf(f, "XkbModel: %s\n", xkbmodel);
+  if(xkblayout && *xkblayout) fprintf(f, "XkbLayout: %s\n", xkblayout);
+
+  if(x11_driver) {
+    for(sl = x11_driver->x11.extensions; sl; sl = sl->next) {
+      if(*sl->str) fprintf(f, "XF86Ext:   Load\t\t\"%s\"\n", sl->str);
+    }
+    for(sl = x11_driver->x11.options; sl; sl = sl->next) {
+      if(*sl->str) fprintf(f, "XF86Raw:   Option\t\"%s\"\n", sl->str);
+    }
+    for(sl = x11_driver->x11.raw; sl; sl = sl->next) {
+      if(*sl->str) fprintf(f, "XF86Raw:   %s\n", sl->str);
+    }
+  }
+
+  fclose(f);
+
+  return 0;
+}
+
+
+char *xserver3map[] =
+{
+#ifdef __i386__
+  "VGA16", "xvga16",
+  "RUSH", "xrush",
+#endif
+#if defined(__i386__) || defined(__alpha__) || defined(__ia64__)
+  "SVGA", "xsvga",
+  "3DLABS", "xglint",
+#endif
+#if defined(__i386__) || defined(__alpha__)
+  "MACH64", "xmach64",
+  "P9000", "xp9k",
+  "S3", "xs3",
+#endif
+#ifdef __alpha__
+  "TGA", "xtga",
+#endif
+#ifdef __sparc__
+  "SUNMONO", "xsunmono",
+  "SUN", "xsun",
+  "SUN24", "xsun24",
+#endif
+#if 0
+  "VMWARE", "xvmware",
+#endif
+  0, 0
+};
+
+
+void dump_packages(hd_data_t *hd_data)
+{
+  str_list_t *sl;
+  int i;
+
+  hd_data->progress = NULL;
+  hd_scan(hd_data);
+
+  sl = get_hddb_packages(hd_data);
+
+  for(i = 0; xserver3map[i]; i += 2) {
+    if (!search_str_list(sl, xserver3map[i + 1]))
+      add_str_list(&sl, new_str(xserver3map[i + 1]));
+  }
+
+  for(; sl; sl = sl->next) {
+    printf("%s\n", sl->str);
+  }
+}
+
+
+struct x11pack {
+  struct x11pack *next;
+  char *pack;
+};
+
+int oem_install_info(hd_data_t *hd_data)
+{
+  hd_t *hd;
+  str_list_t *str;
+  str_list_t *x11packs = 0;
+  str_list_t *sl0, *sl;
+  FILE *f;
+  int pcmcia, i;
+
+  driver_info_x11_t *di, *drvinfo;
+
+  hd_set_probe_feature(hd_data, pr_pci);
+  hd_scan(hd_data);
+  pcmcia = hd_has_pcmcia(hd_data);
+
+  for(hd = hd_list(hd_data, hw_display, 1, NULL); hd; hd = hd->next) {
+    for(str = hd->requires; str; str = str->next) {
+      if(!search_str_list(x11packs, str->str)) {
+        add_str_list(&x11packs, str->str);
+      }
+    }
+    drvinfo = (driver_info_x11_t *) hd->driver_info;
+    for (di = drvinfo; di; di = (driver_info_x11_t *)di->next) {
+      if (di->type != di_x11)
+       continue;
+      if (di->xf86_ver[0] == '3') {
+        char *server = di->server;
+        if (server) {
+         for (i = 0; xserver3map[i]; i += 2)
+           if (!strcmp(xserver3map[i], server))
+             break;
+         if (xserver3map[i])
+           if (!search_str_list(x11packs, xserver3map[i + 1]))
+             add_str_list(&x11packs, xserver3map[i + 1]);
+       }
+      }
+    }
+  }
+
+  if(hd_data->progress) {
+    printf("\r%64s\r", "");
+    fflush(stdout);
+  }
+
+  sl0 = read_file(INSTALL_INF, 0, 0);
+  f = fopen(INSTALL_INF, "w");
+  if(!f) {
+    perror(INSTALL_INF);
+    return 1;
+  }
+  for(sl = sl0; sl; sl = sl->next) {
+    if(
+      strstr(sl->str, "X11Packages:") != sl->str &&
+      strstr(sl->str, "Pcmcia:") != sl->str
+    ) {
+      fprintf(f, "%s", sl->str);
+    }
+  }
+  if (x11packs) {
+    fprintf(f, "X11Packages: ");
+    for (sl = x11packs; sl; sl = sl->next) {
+      if (sl != x11packs)
+        fputc(',', f);
+      fprintf(f, "%s", sl->str);
+    }
+    fputc('\n', f);
+  }
+  if (pcmcia)
+    fprintf(f, "Pcmcia: %d\n", pcmcia);
+  fclose(f);
+  return 0;
+}
+
+
+void dump_db_raw(hd_data_t *hd_data)
+{
+  hd_data->progress = NULL;
+  hd_clear_probe_feature(hd_data, pr_all);
+  hd_scan(hd_data);
+
+  if(opt.db_idx >= sizeof hd_data->hddb2 / sizeof *hd_data->hddb2) return;
+
+  hddb_dump_raw(hd_data->hddb2[opt.db_idx], stdout);
+}
+
+
+void dump_db(hd_data_t *hd_data)
+{
+  hd_data->progress = NULL;
+  hd_clear_probe_feature(hd_data, pr_all);
+  hd_scan(hd_data);
+
+  if(opt.db_idx >= sizeof hd_data->hddb2 / sizeof *hd_data->hddb2) return;
+
+  hddb_dump(hd_data->hddb2[opt.db_idx], stdout);
+}
+
+
+void do_chroot(hd_data_t *hd_data, char *dir)
+{
+  int i;
+
+  i = chroot(dir);
+  ADD2LOG("chroot %s: %s\n", dir, i ? strerror(errno) : "ok");
+
+  if(!i) chdir("/");
+}
+
+
+void ask_db(hd_data_t *hd_data, char *query)
+{
+  hd_t *hd;
+  driver_info_t *di;
+  str_list_t *sl, *query_sl;
+  unsigned tag = 0, u, cnt;
+  char buf[256];
+
+  setenv("hwprobe", "-all", 1);
+  hd_scan(hd_data);
+
+  hd = add_hd_entry(hd_data, __LINE__, 0);
+
+  query_sl = hd_split(' ', query);
+
+  for(sl = query_sl; sl; sl = sl->next) {
+    if(!strcmp(sl->str, "pci")) { tag = TAG_PCI; continue; }
+    if(!strcmp(sl->str, "usb")) { tag = TAG_USB; continue; }
+    if(!strcmp(sl->str, "pnp")) { tag = TAG_EISA; continue; }
+    if(!strcmp(sl->str, "isapnp")) { tag = TAG_EISA; continue; }
+    if(!strcmp(sl->str, "special")) { tag = TAG_SPECIAL; continue; }
+    if(!strcmp(sl->str, "pcmcia")) { tag = TAG_PCMCIA; continue; }
+
+    if(sscanf(sl->str, "class=%i%n", &u, &cnt) >= 1 && !sl->str[cnt]) {
+      hd->base_class.id = u >> 16;
+      hd->sub_class.id = (u >> 8) & 0xff;
+      hd->prog_if.id = u & 0xff;
+      continue;
+    }
+
+    if(sscanf(sl->str, "vendor=%i%n", &u, &cnt) >= 1 && !sl->str[cnt]) {
+      hd->vendor.id = MAKE_ID(tag, u);
+      continue;
+    }
+
+    if(sscanf(sl->str, "vendor=%3s%n", buf, &cnt) >= 1 && !sl->str[cnt]) {
+      u = name2eisa_id(buf);
+      if(u) hd->vendor.id = u;
+      tag = TAG_EISA;
+      continue;
+    }
+
+    if(sscanf(sl->str, "device=%i%n", &u, &cnt) >= 1 && !sl->str[cnt]) {
+      hd->device.id = MAKE_ID(tag, u);
+      continue;
+    }
+
+    if(sscanf(sl->str, "subvendor=%i%n", &u, &cnt) >= 1 && !sl->str[cnt]) {
+      hd->sub_vendor.id = MAKE_ID(tag, u);
+      continue;
+    }
+
+    if(sscanf(sl->str, "subvendor=%3s%n", buf, &cnt) >= 1 && !sl->str[cnt]) {
+      u = name2eisa_id(buf);
+      if(u) hd->sub_vendor.id = u;
+      tag = TAG_EISA;
+      continue;
+    }
+
+    if(sscanf(sl->str, "subdevice=%i%n", &u, &cnt) >= 1 && !sl->str[cnt]) {
+      hd->sub_device.id = MAKE_ID(tag, u);
+      continue;
+    }
+
+    if(sscanf(sl->str, "revision=%i%n", &u, &cnt) >= 1 && !sl->str[cnt]) {
+      hd->revision.id = u;
+      continue;
+    }
+
+    if(sscanf(sl->str, "serial=%255s%n", buf, &cnt) >= 1 && !sl->str[cnt]) {
+      hd->serial = new_str(buf);
+      continue;
+    }
+
+  }
+
+  free_str_list(query_sl);
+
+  hddb_add_info(hd_data, hd);
+
+  for(di = hd->driver_info; di; di = di->next) {
+    if(di->any.type == di_module && di->module.modprobe) {
+      for(sl = di->module.names; sl; sl = sl->next) {
+        printf("%s%c", sl->str, sl->next ? ' ' : '\n');
+      }
+    }
+  }
+}
+
+
+int is_same_block_dev(hd_t *hd1, hd_t *hd2)
+{
+  if(!hd1 || !hd2 || hd1 == hd2) return 0;
+
+  if(
+    hd1->base_class.id != hd2->base_class.id ||
+    hd1->sub_class.id != hd2->sub_class.id
+  ) return 0;
+
+  if(
+    !hd1->model ||
+    !hd2->model ||
+    strcmp(hd1->model, hd2->model)
+  ) return 0;
+
+  if(hd1->revision.name || hd2->revision.name) {
+    if(
+      !hd1->revision.name ||
+      !hd2->revision.name ||
+      strcmp(hd1->revision.name, hd2->revision.name)
+    ) return 0;
+  }
+
+  if(hd1->serial || hd2->serial) {
+    if(
+      !hd1->serial ||
+      !hd2->serial ||
+      strcmp(hd1->serial, hd2->serial)
+    ) return 0;
+  }
+
+  return 1;
+}
+
+
+hd_t *get_same_block_dev(hd_t *hd_list, hd_t *hd, hd_status_value_t status)
+{
+  for(; hd_list; hd_list = hd_list->next) {
+    if(hd_list->status.available != status) continue;
+    if(is_same_block_dev(hd_list, hd)) return hd_list;
+  }
+
+  return NULL;
+}
+
+
+void get_mapping(hd_data_t *hd_data)
+{
+  hd_t *hd_manual, *hd, *hd2;
+  struct {
+    hd_t *hd;
+    unsigned unknown:1;
+  } map[256] = { };
+  unsigned maps = 0, u;
+  int broken, first;
+  hd_hw_item_t hw_items[] = { hw_disk, hw_cdrom, 0 };
+
+  hd_data->progress = NULL;
+
+  hd_data->flags.list_all = 1;
+
+  hd_manual = hd_list2(hd_data, hw_items, 1);
+  for(hd = hd_manual; hd && maps < sizeof map / sizeof *map; hd = hd->next) {
+    if(!hd->unix_dev_name) continue;
+
+    if(hd->status.available == status_yes) {
+      /* check if we already have an active device with the same name */
+      for(broken = u = 0; u < maps; u++) {
+        if(!strcmp(map[u].hd->unix_dev_name, hd->unix_dev_name)) {
+          map[u].unknown = 1;
+          broken = 1;
+        }
+      }
+      if(broken) continue;
+
+      /* ensure we really can tell different devices apart */
+      if(get_same_block_dev(hd_manual, hd, status_yes)) {
+        map[maps].hd = hd;
+        map[maps].unknown = 1;
+      }
+      else {
+        map[maps].hd = hd;
+      }
+      maps++;
+    }
+  }
+
+  /* ok, we have a list of all new devs */
+
+  for(u = 0; u < maps; u++) {
+    if(map[u].unknown) {
+      printf("%s\n", map[u].hd->unix_dev_name);
+    }
+    else {
+      first = 1;
+      for(hd2 = hd_manual; (hd2 = get_same_block_dev(hd2, map[u].hd, status_no)); hd2 = hd2->next) {
+        if(hd2->unix_dev_name && strcmp(map[u].hd->unix_dev_name, hd2->unix_dev_name)) {
+          printf("%s\t%s", first ? map[u].hd->unix_dev_name : "", hd2->unix_dev_name);
+          first = 0;
+        }
+      }
+      if(!first) printf("\n");
+    }
+
+  }
+
+}
+
diff --git a/src/hwinfo/hwscan.c b/src/hwinfo/hwscan.c
new file mode 100644 (file)
index 0000000..75e9a79
--- /dev/null
@@ -0,0 +1,625 @@
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+#include <getopt.h>
+
+#include "hd.h"
+#include "hd_int.h"
+
+struct option options[] = {
+  { "help", 0, NULL, 'h' },
+  { "verbose", 0, NULL, 'v' },
+  { "version", 0, NULL, 400 },
+  { "show", 1, NULL, 500 },
+  { "list", 0, NULL, 501 },
+  { "cfg", 1, NULL, 502 },
+  { "avail", 1, NULL, 503 },
+  { "need", 1, NULL, 504 },
+  { "new", 0, NULL, 505 },
+  { "fast", 0, NULL, 506 },
+  { "silent", 0, NULL, 507 },
+  { "boot", 0, NULL, 508 },
+  { "active", 1, NULL, 509 },
+  { "only", 1, NULL, 510 },
+  { "sys", 0, NULL, 1000 + hw_sys },
+  { "cpu", 0, NULL, 1000 + hw_cpu },
+  { "keyboard", 0, NULL, 1000 + hw_keyboard },
+  { "braille", 0, NULL, 1000 + hw_braille },
+  { "mouse", 0, NULL, 1000 + hw_mouse },
+  { "joystick", 0, NULL, 1000 + hw_joystick },
+  { "printer", 0, NULL, 1000 + hw_printer },
+  { "scanner", 0, NULL, 1000 + hw_scanner },
+  { "chipcard", 0, NULL, 1000 + hw_chipcard },
+  { "monitor", 0, NULL, 1000 + hw_monitor },
+  { "tv", 0, NULL, 1000 + hw_tv },
+  { "gfxcard", 0, NULL, 1000 + hw_display },
+  { "framebuffer", 0, NULL, 1000 + hw_framebuffer },
+  { "camera", 0, NULL, 1000 + hw_camera },
+  { "sound", 0, NULL, 1000 + hw_sound },
+  { "storage-ctrl", 0, NULL, 1000 + hw_storage_ctrl },
+  { "storage_ctrl", 0, NULL, 1000 + hw_storage_ctrl },
+  { "netcard", 0, NULL, 1000 + hw_network_ctrl },
+  { "network-ctrl", 0, NULL, 1000 + hw_network_ctrl },
+  { "network_ctrl", 0, NULL, 1000 + hw_network_ctrl },
+  { "isdn", 0, NULL, 1000 + hw_isdn },
+  { "modem", 0, NULL, 1000 + hw_modem },
+  { "network", 0, NULL, 1000 + hw_network },
+  { "disk", 0, NULL, 1000 + hw_disk },
+  { "partition", 0, NULL, 1000 + hw_partition },
+  { "cdrom", 0, NULL, 1000 + hw_cdrom },
+  { "floppy", 0, NULL, 1000 + hw_floppy },
+  { "update", 0, NULL, 1000 + hw_manual },
+  { "usb-ctrl", 0, NULL, 1000 + hw_usb_ctrl },
+  { "usb_ctrl", 0, NULL, 1000 + hw_usb_ctrl },
+  { "usb", 0, NULL, 1000 + hw_usb },
+  { "bios", 0, NULL, 1000 + hw_bios },
+  { "pci", 0, NULL, 1000 + hw_pci },
+  { "isapnp", 0, NULL, 1000 + hw_isapnp },
+  { "bridge", 0, NULL, 1000 + hw_bridge },
+  { "hub", 0, NULL, 1000 + hw_hub },
+  { "scsi", 0, NULL, 1000 + hw_scsi },
+  { "ide", 0, NULL, 1000 + hw_ide },
+  { "memory", 0, NULL, 1000 + hw_memory },
+  { "dvb", 0, NULL, 1000 + hw_dvb },
+  { "pcmcia", 0, NULL, 1000 + hw_pcmcia },
+  { "pcmcia_ctrl", 0, NULL, 1000 + hw_pcmcia_ctrl },
+  { "ieee1394", 0, NULL, 1000 + hw_ieee1394 },
+  { "firewire", 0, NULL, 1000 + hw_ieee1394 },
+  { "ieee1394_ctrl", 0, NULL, 1000 + hw_ieee1394_ctrl },
+  { "firewire_ctrl", 0, NULL, 1000 + hw_ieee1394_ctrl },
+  { "hotplug", 0, NULL, 1000 + hw_hotplug },
+  { "hotplug_ctrl", 0, NULL, 1000 + hw_hotplug_ctrl },
+  { "zip", 0, NULL, 1000 + hw_zip },
+  { "pppoe", 0, NULL, 1000 + hw_pppoe },
+  { "dsl", 0, NULL, 1000 + hw_dsl },
+  { "wlan", 0, NULL, 1000 + hw_wlan },
+  { "block", 0, NULL, 1000 + hw_block },
+  { "tape", 0, NULL, 1000 + hw_tape },
+  { "vbe", 0, NULL, 1000 + hw_vbe },
+  { "bluetooth", 0, NULL, 1000 + hw_bluetooth },
+  { "all", 0, NULL, 1000 + hw_all },
+  { }
+};
+
+int verbose = 0;
+hd_hw_item_t scan_item[100] = { };
+unsigned scan_items = 0;
+int found_items = 0;
+
+struct {
+  unsigned show:1;
+  unsigned scan:1;
+  unsigned list:1;
+  unsigned config_cfg:1;
+  unsigned config_avail:1;
+  unsigned config_need:1;
+  unsigned config_active:1;
+  unsigned new:1;
+  unsigned fast:1;
+  unsigned silent:1;
+  unsigned boot:1;
+  str_list_t *only;
+} opt;
+
+void help(void);
+int do_scan(hd_hw_item_t *items);
+int do_show(char *id);
+int do_list(hd_hw_item_t *items);
+int do_config(int type, char *val, char *id);
+int fast_ok(hd_hw_item_t *items);
+int has_item(hd_hw_item_t *items, hd_hw_item_t item);
+int has_hw_class(hd_t *hd, hd_hw_item_t *items);
+
+
+int main(int argc, char **argv)
+{
+  int rc = 0;
+
+#ifndef LIBHD_TINY
+
+  char *id = NULL;
+  char *config_cfg = NULL;
+  char *config_avail = NULL;
+  char *config_need = NULL;
+  char *config_active = NULL;
+  int i;
+  int ok = 0;
+  FILE *f;
+
+  opterr = 0;
+
+  while((i = getopt_long(argc, argv, "hv", options, NULL)) != -1) {
+    switch(i) {
+      case 'v':
+        verbose++;
+        break;
+
+      case 400:
+        printf("%s\n", hd_version());
+        ok = 1;
+        break;
+
+      case 500:
+        opt.show = 1;
+        id = optarg;
+        break;
+
+      case 501:
+        opt.list = 1;
+        break;
+
+      case 502:
+        opt.config_cfg = 1;
+        config_cfg = optarg;
+        break;
+
+      case 503:
+        opt.config_avail = 1;
+        config_avail = optarg;
+        break;
+
+      case 504:
+        opt.config_need = 1;
+        config_need = optarg;
+        break;
+
+      case 505:
+        opt.new = 1;
+        break;
+
+      case 506:
+        opt.fast = 1;
+        break;
+
+      case 507:
+        opt.silent = 1;
+        break;
+
+      case 508:
+        opt.boot = 1;
+        break;
+
+      case 509:
+        opt.config_active = 1;
+        config_active = optarg;
+        break;
+
+      case 510:
+        if(*optarg) add_str_list(&opt.only, optarg);
+        break;
+
+      case 1000 ... 1100:
+        opt.scan = 1;
+        if(scan_items + 1 < sizeof scan_item / sizeof *scan_item) {
+          scan_item[scan_items++] = i - 1000;
+        }
+        break;
+
+      default:
+        help();
+        return 1;
+    }
+  }
+
+  scan_item[scan_items] = 0;
+
+  if(opt.scan && !opt.list) {
+    if(argv[optind] || !scan_items) return help(), 1;
+    rc = do_scan(scan_item);
+    if(found_items) {
+      unlink(HARDWARE_DIR "/.update");         /* the old file */
+      unlink(HARDWARE_UNIQUE_KEYS "/.update"); /* so we trigger a rescan */
+      if((f = fopen(HARDWARE_UNIQUE_KEYS "/.update", "a"))) fclose(f);
+    }
+    ok = 1;
+  }
+
+  if(opt.show) {
+    do_show(id);
+    ok = 1;
+  }
+
+  if(opt.list) {
+    do_list(scan_item);
+    ok = 1;
+  }
+
+  if(opt.config_cfg) {
+    if(!argv[optind]) return help(), 1;
+    do_config(1, config_cfg, argv[optind]);
+    ok = 1;
+  }
+
+  if(opt.config_avail) {
+    if(!argv[optind]) return help(), 1;
+    do_config(2, config_avail, argv[optind]);
+    ok = 1;
+  }
+
+  if(opt.config_need) {
+    if(!argv[optind]) return help(), 1;
+    do_config(3, config_need, argv[optind]);
+    ok = 1;
+  }
+
+  if(opt.config_active) {
+    if(!argv[optind]) return help(), 1;
+    do_config(4, config_active, argv[optind]);
+    ok = 1;
+  }
+
+  if(!ok) help();
+
+#endif         /* !defined(LIBHD_TINY) */
+
+  return rc;
+}
+
+void help()
+{
+  fprintf(stderr,
+    "Usage: hwscan [options]\n"
+    "Show information about currently known hardware.\n"
+    "  --list            show list of known hardware\n"
+    "  --version         show libhd version\n"
+    "  --silent          don't show hardware config changes\n"
+    "  --boot            run only if we haven't been disabled via 'hwprobe=-scan'\n"
+    "  --cfg=state id    change 'configured' status; id is one of the\n"
+    "                    ids from 'hwscan --list'\n"
+    "                    state is one of new, no, yes\n"
+    "  --avail=state id  change 'available' status\n"
+    "  --need=state id   change 'needed' status\n"
+    "  --active=state id change 'active' status\n"
+    "  --hw_item         probe for hw_item and update status info\n"
+    "  hw_item is one of:\n"
+    "    all, bios, block, bluetooth, braille, bridge, camera, cdrom, chipcard, cpu,\n"
+    "    disk, dsl, dvb, floppy, framebuffer, gfxcard, hub, ide, isapnp, isdn,\n"
+    "    joystick, keyboard, memory, modem, monitor, mouse, netcard, network,\n"
+    "    partition, pci, pcmcia, pcmcia-ctrl, pppoe, printer, scanner, scsi, smp,\n"
+    "    sound, storage-ctrl, sys, tape, tv, usb, usb-ctrl, vbe, wlan, zip\n"
+  );
+}
+
+#ifndef LIBHD_TINY
+
+int do_scan(hd_hw_item_t *items)
+{
+  int run_config = 0;
+  hd_status_t status = { };
+  hd_data_t *hd_data;
+  hd_t *hd, *hd1;
+  int err = 0;
+
+  if(opt.fast) opt.fast = fast_ok(items);
+
+  hd_data = calloc(1, sizeof *hd_data);
+
+  if(opt.boot) {
+    /* look if we have been disabled */
+    hd_clear_probe_feature(hd_data, pr_all);
+    hd_scan(hd_data);
+    hd_set_probe_feature(hd_data, pr_scan);
+    if(!hd_probe_feature(hd_data, pr_scan)) {
+      hd_free_hd_data(hd_data);
+      free(hd_data);
+      return 0;
+    }
+  }
+
+  hd_data->only = opt.only;
+  opt.only = NULL;
+
+  hd_data->flags.list_all = 1;
+  hd_data->flags.fast = opt.fast;
+
+  hd = hd_list2(hd_data, items, 1);
+
+  if(hd) found_items = 1;
+
+  for(hd1 = hd; hd1; hd1 = hd1->next) {
+    err = hd_write_config(hd_data, hd1);
+    if(verbose >= 2) {
+      printf(
+        "write=%d %s: (cfg=%s, avail=%s, need=%s, active=%s",
+        err,
+        hd1->unique_id,
+        hd_status_value_name(hd1->status.configured),
+        hd_status_value_name(hd1->status.available),
+        hd_status_value_name(hd1->status.needed),
+        hd_status_value_name(hd1->status.active)
+      );
+      if(hd1->unix_dev_name) {
+        printf(", dev=%s", hd1->unix_dev_name);
+      }
+      printf(
+        ") %s\n",
+        hd1->model
+      );
+      
+    }
+    if(err) break;
+  }
+
+  if(err) {
+    fprintf(stderr,
+      "Error writing configuration for %s (%s)\n",
+      hd1->unique_id,
+      hd1->model
+    );
+    exit(1);
+  }
+
+  hd = hd_free_hd_list(hd);
+
+  if(opt.new) {
+    status.configured = status_new;
+  }
+  else {
+    status.reconfig = status_yes;
+  }
+
+  hd = hd_list_with_status2(hd_data, items, status);
+  if(hd) run_config = 1;
+
+  if(verbose) {
+    for(hd1 = hd; hd1; hd1 = hd1->next) {
+      printf(
+        "%s: (cfg=%s, avail=%s, need=%s, active=%s",
+        hd1->unique_id,
+        hd_status_value_name(hd1->status.configured),
+        hd_status_value_name(hd1->status.available),
+        hd_status_value_name(hd1->status.needed),
+        hd_status_value_name(hd1->status.active)
+      );
+      if(hd1->unix_dev_name) {
+        printf(", dev=%s", hd1->unix_dev_name);
+      }
+      printf(
+        ") %s\n",
+        hd1->model
+      );
+    }
+  }
+  else if(!opt.silent) {
+    for(hd1 = hd; hd1; hd1 = hd1->next) printf("%s\n", hd1->unique_id);
+  }
+
+  hd = hd_free_hd_list(hd);
+
+  hd_free_hd_data(hd_data);
+  free(hd_data);
+
+  return run_config ^ 1;
+}
+
+
+int do_show(char *id)
+{
+  hd_data_t *hd_data;
+  hd_t *hd;
+
+  hd_data = calloc(1, sizeof *hd_data);
+
+  if ( id[0] == '/' ){
+     int nr=0;
+     char *_id = 0;
+     hd_t *hd_manual;
+
+     hd_manual = hd_list(hd_data, hw_manual, 1, NULL);
+     for(hd = hd_manual; hd; hd = hd->next) {
+        if(hd->status.available != status_yes) continue;
+        if(!search_str_list(hd->unix_dev_names, id)) continue;
+       _id = hd->unique_id;
+        nr++;
+     }
+
+     if ( nr == 1 ) /* > 1 means our database is not okay */
+        hd = hd_read_config(hd_data, _id);
+  }else
+    hd = hd_read_config(hd_data, id);
+
+  if(hd) {
+    hd_data->debug = -1;
+    hd_dump_entry(hd_data, hd, stdout);
+    hd = hd_free_hd_list(hd);
+  }
+  else {
+    printf("no such hardware item: %s\n", id);
+  }
+
+  hd_free_hd_data(hd_data);
+  free(hd_data);
+
+  return 0;
+}
+
+
+int do_list(hd_hw_item_t *items)
+{
+  hd_data_t *hd_data;
+  hd_t *hd, *hd_manual;
+  char *s;
+  char status[64];
+  int i;
+
+  hd_data = calloc(1, sizeof *hd_data);
+
+  hd_manual = hd_list(hd_data, hw_manual, 1, NULL);
+
+  for(hd = hd_manual; hd; hd = hd->next) {
+    if(opt.scan && ! has_hw_class(hd, items)) continue;
+
+    strcpy(status, "(");
+
+    i = 0;
+    if(hd->status.configured && (s = hd_status_value_name(hd->status.configured))) {
+      sprintf(status + strlen(status), "%scfg=%s", i ? ", " : "", s);
+      i++;
+    }
+
+    if(hd->status.available && (s = hd_status_value_name(hd->status.available))) {
+      sprintf(status + strlen(status), "%savail=%s", i ? ", " : "", s);
+      i++;
+    }
+
+    if(hd->status.needed && (s = hd_status_value_name(hd->status.needed))) {
+      sprintf(status + strlen(status), "%sneed=%s", i ? ", " : "", s);
+      i++;
+    }
+
+    if(hd->status.active && (s = hd_status_value_name(hd->status.active))) {
+      sprintf(status + strlen(status), "%sactive=%s", i ? ", " : "", s);
+      i++;
+    }
+
+    strcat(status, ")");
+
+    s = hd_hw_item_name(hd->hw_class);
+    if(!s) s = "???";
+
+    printf("%s: %-32s %-16s %s\n", hd->unique_id, status, s, hd->model);
+    if(hd->config_string) {
+      printf("   configured as: \"%s\"\n", hd->config_string);
+    }
+  }
+
+  hd_free_hd_list(hd_manual);
+
+  hd_free_hd_data(hd_data);
+  free(hd_data);
+
+  return 0;
+}
+
+
+int do_config(int type, char *val, char *id)
+{
+  hd_data_t *hd_data;
+  hd_t *hd;
+  hd_status_value_t status = 0;
+  int i;
+  char *s;
+
+  hd_data = calloc(1, sizeof *hd_data);
+
+  if ( id[0] == '/' ){
+     int nr=0;
+     char *_id = 0;
+     hd_t *hd_manual;
+
+     hd_manual = hd_list(hd_data, hw_manual, 1, NULL);
+     for(hd = hd_manual; hd; hd = hd->next) {
+        if(hd->status.available != status_yes) continue;
+        if(!search_str_list(hd->unix_dev_names, id)) continue;
+       _id = hd->unique_id;
+        nr++;
+     }
+     if ( nr == 1 )
+        hd = hd_read_config(hd_data, _id);
+  }else
+    hd = hd_read_config(hd_data, id);
+
+  if(hd) {
+    for(i = 1; i < 8; i++) {
+      s = hd_status_value_name(i);
+      if(s && !strcmp(val, s)) {
+        status = i;
+        break;
+      }
+    }
+    if(!status) {
+      printf("invalid status: %s\n", val);
+    }
+    else {
+      switch(type) {
+        case 1:
+          hd->status.configured = status;
+          break;
+
+        case 2:
+          hd->status.available = status;
+          break;
+
+        case 3:
+          hd->status.needed = status;
+          break;
+
+        case 4:
+          hd->status.active = status;
+          break;
+      }
+      hd_write_config(hd_data, hd);
+    }
+    hd = hd_free_hd_list(hd);
+  }
+  else {
+    printf("no such hardware item: %s\n", id);
+  }
+
+  hd_free_hd_data(hd_data);
+  free(hd_data);
+
+  return 0;
+}
+
+
+/*
+ * Check whether a 'fast' scan would suffice to re-check the presence
+ * of all known hardware.
+ */
+int fast_ok(hd_hw_item_t *items)
+{
+  hd_data_t *hd_data;
+  hd_t *hd, *hd1;
+  int ok = 1;
+
+  if(!has_item(items, hw_mouse) && !has_item(items, hw_storage_ctrl)) {
+    return 1;
+  }
+
+  hd_data = calloc(1, sizeof *hd_data);
+
+  hd_data->flags.list_all = 1;
+
+  hd = hd_list(hd_data, hw_manual, 1, NULL);
+
+  for(hd1 = hd; hd1; hd1 = hd1->next) {
+    /* serial mice */
+    if(hd1->hw_class == hw_mouse && hd1->bus.id == bus_serial) {
+      ok = 0;
+      break;
+    }
+    /* parallel zip */
+    if(hd1->hw_class == hw_storage_ctrl && hd1->bus.id == bus_parallel) {
+      ok = 0;
+      break;
+    }
+  }
+
+  hd_free_hd_data(hd_data);
+  free(hd_data);
+
+  return ok;
+}
+
+
+/* check if item is in items */
+int has_item(hd_hw_item_t *items, hd_hw_item_t item)
+{
+  while(*items) if(*items++ == item) return 1;
+
+  return 0;
+}
+
+
+/* check if one of items is in hw_class */
+int has_hw_class(hd_t *hd, hd_hw_item_t *items)
+{
+  while(*items) if(hd_is_hw_class(hd, *items++)) return 1;
+
+  return 0;
+}
+
+
+#endif         /* !defined(LIBHD_TINY) */
diff --git a/src/hwinfo/hwscand.c b/src/hwinfo/hwscand.c
new file mode 100644 (file)
index 0000000..becc07d
--- /dev/null
@@ -0,0 +1,257 @@
+
+/* hwscan front end
+   Copyright 2004 by SUSE (<adrian@suse.de>) */
+
+#include <sys/types.h>
+#include <sys/ipc.h>
+#include <sys/msg.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <time.h>
+#include <unistd.h>
+#include <fcntl.h>
+#include <stdlib.h>
+#include <string.h>
+#include <stdio.h>
+
+#include "init_message.h"
+
+#define TIMEOUT 2
+#define LONG_TIMEOUT 0
+#define BUFFERS 1024
+
+int main( int argc, char **argv )
+{
+        int ret, i;
+       key_t key = KEY;
+       int msgid;
+       int mode = 0;
+       int dev_nr = 0;
+       int lines = 0;
+       int block, usb, firewire, pci;
+       int dev_last_state[BUFFERS];
+       int dev_counter[BUFFERS];
+       char * command_device[NR_COMMANDS][BUFFERS];
+       time_t command_device_last[NR_COMMANDS][BUFFERS];
+       time_t last;
+       char **commands;
+       char **devices;
+       char buffer[32];
+       message m;
+
+       // are we running already, maybe ?
+       {
+               do {
+                       ssize_t r;
+                       char b[1024];
+                       char link[1024];
+                       int fd = open( PID_FILE, O_RDONLY );
+                       if ( fd >= 0 && (r=read(fd,b,1023)) > 0 ){
+                               close(fd);
+                               b[r]='\0';
+                               snprintf(link, 1023, "/proc/%s/exe", b);
+                               if ( (r=readlink( link, b, 1023 )) > 0 ){
+                                       b[r]='\0';
+                                       if ( r<8 )
+                                               unlink(PID_FILE);
+                                       else if ( strcmp("/hwscand", b+strlen(b)-8) )
+                                               unlink(PID_FILE);
+                                       else
+                                               exit(1);
+                               }else
+                                       unlink(PID_FILE);
+                       }else if ( fd >= 0 )
+                               unlink(PID_FILE);
+               } while ( 0 > (ret = open( PID_FILE, O_WRONLY|O_CREAT|O_EXCL, S_IRUSR|S_IWUSR ) ) );
+               sprintf(buffer, "%d", getpid());
+               if ( ret < 0 || write(ret,buffer,strlen(buffer)) <= 0 ){
+                       perror("hwscand: unable to write pid file "PID_FILE);
+                       exit(1);
+               }
+               close(ret);
+       }
+
+       // initialize ...
+       for ( i=0; i<NR_COMMANDS; i++ ){
+               command_device[i][0] = 0;
+               command_device_last[i][0] = 1;
+       }
+
+       last=block=usb=firewire=pci=0;
+       commands = (char**) malloc( BUFFERS * sizeof(char*) );
+       devices  = (char**) malloc( BUFFERS * sizeof(char*) );
+
+       msgid = msgget(key, IPC_CREAT | 0600);
+        if (msgid < 0) {
+               perror("msgget");
+               exit(1);
+        }
+
+       while (1) {
+               if ( last || dev_nr )
+                       mode = IPC_NOWAIT;
+               else
+                       mode = 0;
+
+               if( msgrcv(msgid, &m, MESSAGE_BUFFER, 1, mode) >= 0 ){
+                       char *p = m.mtext;
+
+                       if ( p == 0 ){
+                               fprintf( stderr, "hwscand: error, zero sized message\n" );
+                       }else{
+                               if ( p[0] == 'S' && strlen(p) > 1 ){
+                                       // scan calls
+                                       char z[2];
+                                       int c;
+                                       z[0] = *(p+1);
+                                       z[1] = '\0';
+                                       c = atoi(z);
+                                       if ( c < NR_COMMANDS ){
+                                               if ( ! command_with_device[c] ){
+                                                       last = time(0L);
+                                                       if ( LONG_TIMEOUT+command_device_last[c][0] < time(0L) )
+                                                               command_device_last[c][0] = 0;
+                                               }else
+                                               for ( i=0; i<BUFFERS; i++ ){
+                                                       if ( !command_device[c][i] ){
+                                                               last = time(0L);
+                                                               command_device[c][i] = strdup(p+2);
+                                                               command_device[c][i+1] = 0;
+                                                               command_device_last[c][i] = 0;
+                                                               break;
+                                                       }else if ( !strcmp(command_device[c][i], p+2) ){
+                                                               last = time(0L);
+                                                               if ( LONG_TIMEOUT+command_device_last[c][i] < time(0L) )
+                                                                       command_device_last[c][i] = 0;
+                                                               break;
+                                                       }
+                                               }
+                                       }
+                               }
+                               if ( p[0] == 'C' && lines < BUFFERS ){
+                                       last = time(0L);
+                                       // config calls
+                                       commands[lines] = strdup(p+1);
+                                       lines++;        
+                               }
+                               if ( p[0] == 'A' && dev_nr < BUFFERS ){ 
+                                       // add scan devices
+                                       devices[dev_nr]        = strdup(p+1);
+                                       dev_last_state[dev_nr] = 0;
+                                       dev_counter[dev_nr]    = 0;
+                                       dev_nr++;
+                               }
+                               if ( p[0] == 'R' && dev_nr < BUFFERS ){ 
+                                       for ( i=0; i<dev_nr; i++ ){
+                                               if ( !strcmp(p+1, devices[i]) ){
+                                                       int j;
+                                                       free(devices[i]);
+                                                       for ( j=i; j+1<dev_nr; j++ ){
+                                                               devices[j]        = devices[j+1];
+                                                               dev_last_state[j] = dev_last_state[j+1];
+                                                               dev_counter[j]    = dev_counter[j+1];
+                                                       }
+                                                       dev_nr--;
+                                               }
+                                       }
+                               }
+                       }
+#if DEBUG
+                               printf("CALL RECEIVED %s\n", p);
+#endif
+               }else{
+                       // we do this only in scanning mode ...
+
+                       sleep(1);
+                       for ( i=0; i<dev_nr; i++ ){
+                               if (dev_counter[i]<0) continue;
+                               dev_counter[i]++;
+                               if ( dev_counter[i] > 5 ){
+                                       int fd;
+                                       char buf[MESSAGE_BUFFER];
+                                       dev_counter[i] = 0;
+                                       fd = open( devices[i], O_RDONLY );
+                                       strcpy( buf, "/sbin/hwscan --fast --partition --only=");
+                                       strcat( buf, devices[i] );
+                                       if ( fd < 0 ){
+                                               if ( dev_last_state[i] )
+                                                       system(buf);
+                                               dev_last_state[i] = 0;
+                                       }else{
+                                               if ( dev_last_state[i] == 0)
+                                                       system(buf);
+                                               dev_last_state[i] = 1;
+                                               close(fd);
+                                       }
+                               }
+                       }
+               }
+               
+               if ( last && (last+TIMEOUT <= time(0L)) ){
+                       char buf[MESSAGE_BUFFER * NR_COMMANDS];
+                       int run_really = 0;
+
+                       last=0;
+                       strcpy( buf, "/sbin/hwscan --fast --boot --silent" );
+                       for ( i=0; i<NR_COMMANDS; i++ ){
+                               if ( command_with_device[i] == 0 &&
+                                    command_device_last[i][0] == 0 ){
+                                       command_device_last[i][0] = time(0L);
+                                       strcat( buf, " --");
+                                       strcat( buf, command_args[i] );
+                                       run_really = 1;
+                               } else {
+                                       int j;
+                                       int commappended = 0;
+
+                                       for ( j=0; j<BUFFERS; j++ ){
+                                               if ( !command_device[i][j] )
+                                                       break;
+                                               if ( command_device_last[i][j] == 0 ){
+                                                       if (!commappended) {
+                                                               strcat( buf, " --");
+                                                               strcat( buf, command_args[i] );
+                                                               commappended = 1;
+                                                       }
+                                                       strcat( buf, " --only=" );
+                                                       strcat( buf, command_device[i][j] );
+                                                       command_device_last[i][j] = time(0L);
+                                                       run_really = 1;
+                                                       if (strlen(buf) > sizeof(buf) - MESSAGE_BUFFER)
+                                                               break;
+                                               }
+                                       }
+                               }
+                               if (strlen(buf) > sizeof(buf) - MESSAGE_BUFFER) {
+                                       last = time(0L);        /* call me again */
+                                       break;
+                               }
+                       }
+
+                       if ( run_really ){
+#if DEBUG
+                               printf("RUN %s\n", buf);
+#endif
+                               system(buf);
+#if DEBUG                              
+                               printf("RUN quit %s\n", buf);
+#endif
+                       }
+                       if ( lines ){
+                               for (i=0; i<lines; i++){
+#if DEBUG
+                               printf("CALL DIRECT %s\n", commands[i]);
+#endif
+                                       system(commands[i]);
+#if DEBUG
+                               printf("CALL quit %s\n", commands[i]);
+#endif
+                                       free(commands[i]);
+                               }
+                               lines=0;
+                       }
+               }
+       }
+
+       return 0;
+}
diff --git a/src/hwinfo/hwscanqueue.c b/src/hwinfo/hwscanqueue.c
new file mode 100644 (file)
index 0000000..6af2fc5
--- /dev/null
@@ -0,0 +1,126 @@
+
+/* hwscan front end
+   Copyright 2004 by SUSE (<adrian@suse.de>) */
+
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <sys/ipc.h>
+#include <sys/msg.h>
+#include <signal.h>
+#include <fcntl.h>
+#include <unistd.h>
+#include <stdlib.h>
+#include <string.h>
+#include <stdio.h>
+
+#include "init_message.h"
+
+int main( int argc, char **argv )
+{
+       int ret;
+       unsigned short i;
+        key_t key = KEY;
+        int msgid;
+       message m;
+       char *device = argv[2];
+
+       if ( argc < 2 ){
+               fprintf( stderr, "help: hwscanqueue hwscan-commands\n" );
+               fprintf( stderr, "help: commands:\n" );
+               for ( i=0; i<NR_COMMANDS; i++ ){
+                       fprintf( stderr, "      --%s", command_args[i]  );
+                       if ( command_with_device[i] )
+                               fprintf( stderr, " device" );
+                       fprintf( stderr, "\n");
+               }
+               fprintf( stderr, "      --avail=yes/no id\n" );
+               fprintf( stderr, "      --scan=device\n" );
+               fprintf( stderr, "      --stop=device\n" );
+               exit(1);
+       }
+
+       if ( !strncmp("--cfg=", argv[1], 6) && argc>2 )
+               snprintf( m.mtext, MESSAGE_BUFFER, "C/sbin/hwscan %s %s", argv[1], argv[2]  );
+       else if ( !strncmp("--avail=", argv[1], 8) && argc>2 )
+               snprintf( m.mtext, MESSAGE_BUFFER, "C/sbin/hwscan %s %s", argv[1], argv[2]  );
+       else if ( !strncmp("--scan=", argv[1], 7) )
+               snprintf( m.mtext, MESSAGE_BUFFER, "A%s", argv[1]+7 );
+       else if ( !strncmp("--stop=", argv[1], 7) )
+               snprintf( m.mtext, MESSAGE_BUFFER, "R%s", argv[1]+7 );
+       else if ( !strncmp("--", argv[1], 2) ){
+               for ( i=0; i<NR_COMMANDS; i++ ){
+                       if ( !strcmp(argv[1]+2,command_args[i]) ){
+#if DEBUG
+                               printf("COMMAND %s\n", command_args[i] );
+#endif
+                               snprintf( m.mtext, MESSAGE_BUFFER, "S%d", i );
+                               if (command_with_device[i]){
+                                       if ( !device ){
+                                               fprintf(stderr, "need a device for this command\n");
+                                               exit(1);
+                                       }
+                                       strncat( m.mtext, device, MESSAGE_BUFFER-3 );
+                               }
+                               break;
+                       }
+               }
+               if ( i>=NR_COMMANDS ){
+                       fprintf(stderr, "unknown command\n");
+                       exit(1);
+               }
+       }else
+               exit(1);
+
+        if ( (msgid = msgget(key, IPC_CREAT | 0600)) < 0 ){
+               perror("unable to init.");
+                exit(1);
+        }
+       m.mtype = 1;
+       ret = msgsnd( msgid, &m, MESSAGE_BUFFER, IPC_NOWAIT);
+#if DEBUG
+       printf("SEND %s, return %d\n", m.mtext, ret );
+#endif
+
+       if ( ret < 0 )
+               perror("message send failed");
+       else{
+               // success ... start hwscand, if it is not yet running
+               ssize_t r;
+               char buffer[1024];
+               char link[1024];
+               int fd = open( PID_FILE, O_RDONLY );
+               if ( fd >= 0 && (r=read(fd,buffer,1023)) > 0 ){
+                       close(fd);
+                       buffer[r]='\0';
+                       snprintf(link, 1023, "/proc/%s/exe", buffer);
+                       if ( (r=readlink( link, buffer, 1023 )) > 0 ){
+                               buffer[r]='\0';
+                               if ( r<8 )
+                                       fd=-1;
+                               else if ( strcmp("/hwscand", buffer+strlen(buffer)-8) )
+                                       fd=-1;
+                       }else
+                               fd=-1;
+               }else
+                       fd=-1;
+
+               if ( fd < 0 ){
+                       pid_t pid;
+                       signal(SIGCHLD,SIG_IGN);
+                       pid=fork();
+                       if (pid==0){
+                               /* Change directory to allow clean shut-down */
+                               chdir("/");
+                               /* Close std fds */
+                               close(0);
+                               close(1);
+                               close(2);
+                               /* Start hwscand */
+                               execve("/sbin/hwscand", 0, 0);
+                       }
+               }
+       }
+
+       exit(ret);
+}
+
diff --git a/src/hwinfo/init_message.h b/src/hwinfo/init_message.h
new file mode 100644 (file)
index 0000000..1e3243c
--- /dev/null
@@ -0,0 +1,17 @@
+#define MESSAGE_BUFFER 1024
+#define KEY 8024;
+#define PID_FILE "/var/run/hwscand.pid"
+
+// WARNING NEEDS TO BE <= 9
+#define NR_COMMANDS 7
+// WARNING NEEDS TO BE <= 9
+static const char *command_args[] = { "block", "partition", "usb", "firewire", "pci", "pcmcia", "bluetooth" };
+static const int command_with_device[] = { 1, 1, 0, 0, 0, 0, 0 };
+
+typedef struct msgbuf {
+        long mtype;
+        char mtext[MESSAGE_BUFFER+1];
+} message;
+
+#define DEBUG 0
+
diff --git a/src/hwinfo/scripts/mci b/src/hwinfo/scripts/mci
new file mode 100755 (executable)
index 0000000..b6443ed
--- /dev/null
@@ -0,0 +1,113 @@
+#! /usr/bin/perl
+
+sub addr2line;
+
+$list = shift;
+$bin = shift;
+$ofs = shift;
+
+die "usage: mci data_file binary\n" unless -f($list);
+
+open F, $list; 
+
+while(<F>) {
+  if(/^;\s*(.+?)\s*$/) {
+    @i = split ' ', $1;
+    $i[0] = sprintf "%-24s", $i[0];
+    $i[1] = addr2line $i[1];
+    print "; ", join("\t", @i), "\n";
+    next
+  }
+  @i = split;
+
+  die "oops, format error" if @i > 3;
+
+  if(@i == 1) {
+    if($i[0] =~ /^>(\S+)/) {
+      unshift @funcs, $1;
+    }
+    elsif($i[0] =~ /<(\S+)/) {
+     if($funcs[0] eq $1) {
+       shift @funcs
+     }
+     else {
+       die "oops, strange data (line $.)\n"
+     }
+    }
+    else {
+       die "oops, format error"
+    }
+  }
+  else {
+    $func = $i[0];
+    $addr = $i[1];
+    $size = undef;
+    $size = @i == 2 ? undef : $i[2];
+
+    if(defined $size) {
+      if(exists $mem{$addr}) {
+        $x = addr2line $func;
+        $y = addr2line ${$mem{$addr}}[1];
+        print "malloc oops (line $.): mem $addr; old: $y, size ${$mem{$addr}}[0]; new: $x, size $size\n";
+      }
+      $mem{$addr} = [ $size, $func, @funcs ];
+      delete $lfree{$addr};
+    }
+    else {
+      if(!exists $mem{$addr}) {
+        $xx = "";
+        $first = 1;
+        for $f ($func, @funcs) {
+          $xx .= "<-" unless $first;
+          $first = 0; 
+          $xx .=  addr2line $f;
+        }
+        print "free oops (line $.): $addr ($xx) [last free: line $lfree{$addr}]\n";
+      }
+      delete $mem{$addr};
+      $lfree{$addr} .= " $.";
+    }
+  }
+}
+
+for (sort keys %mem) {
+  $total += oct(${$mem{$_}}[0]);
+  $cnt++;
+
+#  $x = `addr2line -s -e $bin ${$mem{$_}}[1]`;
+#  chomp $x;
+#  $x = $x =~ /\?{2}/ ? undef : "$x ";
+  $x = addr2line ${$mem{$_}}[1];
+
+  print "$_\t${$mem{$_}}[0]\t";
+  $first = 1;
+  for $f (@{$mem{$_}}[1..$#{$mem{$_}}]) {
+    print "<-" unless $first;
+    $first = 0; 
+    print addr2line $f;
+  }
+  print "\n"
+}
+
+printf "total: %u bytes in %u blocks\n", $total, $cnt;
+
+
+sub addr2line
+{
+  my ($x, $y);
+
+  return $_[0] unless $bin;
+
+  $y = sprintf "0x%x", oct($_[0]) + $ofs;
+
+  return $addr_cache{$y} if exists $addr_cache{$y};
+
+  $x = `addr2line -s -e $bin $y`;
+  chomp $x;
+  $x = $x =~ /\?{2}/ ? $_[0] : $x;
+
+  $addr_cache{$y} = $x;
+
+  return $x;
+}
+
diff --git a/src/hwinfo/src/Makefile b/src/hwinfo/src/Makefile
new file mode 100644 (file)
index 0000000..b8e55a1
--- /dev/null
@@ -0,0 +1,38 @@
+TOPDIR         = ..
+SUBDIRS                = hd isdn ids
+TARGETS                = touch $(LIBHD) $(LIBHD_SO)
+CLEANFILES     = $(LIBHD) $(LIBHD_D) $(LIBHD_SO) *.so *.so.* *.a
+
+.PHONY: touch
+
+include $(TOPDIR)/Makefile.common
+
+ifneq "$(findstring $(ARCH), i386 x86_64 ia64)" ""
+ifneq ($(LIBHD_BASE), libhd_tiny)
+SUBDIRS        += x86emu int10
+endif
+endif
+
+#ifeq "$(findstring $(ARCH), i386 alpha)" ""
+#SUBDIRS       := $(filter-out pnpdump, $(SUBDIRS))
+#endif
+
+$(LIBHD): $(OBJS)
+       ar r $@ $?
+       @rm -f $(LIBHD_D)
+
+ifdef SHARED_FLAGS
+$(LIBHD_SO): $(LIBHD)
+       $(CC) -shared $(SO_LIBS) -Wl,--whole-archive $(LIBHD) -Wl,--no-whole-archive \
+               -Wl,-soname=$(LIBHD_SONAME) \
+               -o $(LIBHD_SO) 
+       ln -snf $(LIBHD_NAME) $(LIBHD_SONAME)
+       ln -snf $(LIBHD_SONAME) $(LIBHD_BASE).so
+else
+$(LIBHD_SO):
+endif
+
+subdirs: touch
+
+touch:
+       @touch -r $(LIBHD) $(LIBHD_D) 2>/dev/null || true
diff --git a/src/hwinfo/src/hd/Makefile b/src/hwinfo/src/hd/Makefile
new file mode 100644 (file)
index 0000000..b4c62b0
--- /dev/null
@@ -0,0 +1,14 @@
+TOPDIR         = ../..
+TARGETS                = $(LIBHD_D)
+CLEANFILES     = version.h
+
+include $(TOPDIR)/Makefile.common
+
+version.h: $(TOPDIR)/VERSION
+       @echo "#define HD_VERSION_STRING \"`cat $(TOPDIR)/VERSION`\"" >$@
+
+hd.h: $(TOPDIR)/VERSION
+       @perl -pi -e "s/define\s+HD_VERSION\s+\d+/define HD_VERSION\t$(LIBHD_MAJOR_VERSION)/" $@
+
+$(LIBHD_D): $(OBJS)
+       ar r $(LIBHD) $?
diff --git a/src/hwinfo/src/hd/adb.c b/src/hwinfo/src/hd/adb.c
new file mode 100644 (file)
index 0000000..d71e45e
--- /dev/null
@@ -0,0 +1,78 @@
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+#include <fcntl.h>
+#include <errno.h>
+#include <termios.h>
+#include <sys/stat.h>
+#include <sys/types.h>
+#include <sys/time.h>
+#include <sys/ioctl.h>
+
+#include "hd.h"
+#include "hd_int.h"
+#include "adb.h"
+
+/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+ * adb info
+ *
+ * - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+ */
+
+#ifdef __PPC__
+
+void hd_scan_adb(hd_data_t *hd_data)
+{
+  int i;
+  unsigned u, adr = 0;
+  hd_t *hd;
+  str_list_t *sl;
+
+  if(!hd_probe_feature(hd_data, pr_adb)) return;
+
+  hd_data->module = mod_adb;
+
+  /* some clean-up */
+  remove_hd_entries(hd_data);
+
+  PROGRESS(1, 0, "get info");
+
+  for(sl = hd_data->klog; sl; sl = sl->next) {
+    if(sscanf(sl->str, "<4>ADB mouse at %u, %*[a-z ] %i", &u, &i) == 2 && u < 32) {
+      /* u: max 15 actually, but who cares... */
+      if(!(adr & (1 << u))) {
+        adr |= 1 << u;
+        hd = add_hd_entry(hd_data, __LINE__, 0);
+        hd->base_class.id = bc_mouse;
+        hd->sub_class.id = sc_mou_bus;
+        hd->bus.id = bus_adb;
+        hd->slot = u;
+//        hd->func = i;
+        hd->unix_dev_name = new_str(DEV_MICE);
+
+        hd->vendor.id = MAKE_ID(TAG_SPECIAL, 0x0100);
+        hd->device.id = MAKE_ID(TAG_SPECIAL, 0x0300 + i);
+      }
+    }
+
+    if(sscanf(sl->str, "<4>ADB keyboard at %u, %*[a-z ] %i", &u, &i) == 2 && u < 32) {
+      /* u: max 15 actually, but who cares... */
+      if(!(adr & (1 << u))) {
+        adr |= 1 << u;
+        hd = add_hd_entry(hd_data, __LINE__, 0);
+        hd->base_class.id = bc_keyboard;
+        hd->sub_class.id = 0;
+        hd->bus.id = bus_adb;
+        hd->slot = u;
+//        hd->func = i;
+//        hd->unix_dev_name = new_str(DEV_ADBMOUSE);
+
+        hd->vendor.id = MAKE_ID(TAG_SPECIAL, 0x0100);
+        hd->device.id = MAKE_ID(TAG_SPECIAL, 0x0200+i);
+      }
+    }
+  }
+}
+
+#endif /* __PPC__ */
diff --git a/src/hwinfo/src/hd/adb.h b/src/hwinfo/src/hd/adb.h
new file mode 100644 (file)
index 0000000..de68612
--- /dev/null
@@ -0,0 +1 @@
+void hd_scan_adb(hd_data_t *hd_data);
diff --git a/src/hwinfo/src/hd/bios.c b/src/hwinfo/src/hd/bios.c
new file mode 100644 (file)
index 0000000..fcdfabd
--- /dev/null
@@ -0,0 +1,1014 @@
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+#include <fcntl.h>
+#include <byteswap.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#if defined(__i386__) || defined (__x86_64__) || defined(__ia64__)
+#include <sys/io.h>
+#endif
+typedef unsigned long kernel_ulong_t;
+#include <linux/types.h>
+#ifdef __UCLIBC__
+#include <linux/pci.h>
+#else
+#include <sys/pci.h>
+#endif
+
+#include "hd.h"
+#include "hd_int.h"
+#include "bios.h"
+#include "smbios.h"
+#include "klog.h"
+
+/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+ * bios info
+ *
+ * - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+ */
+
+#if defined(__i386__) || defined (__x86_64__) || defined (__ia64__)
+
+static struct {
+  int width;
+  int height;
+  char *vendor;
+  char *name;
+  char *version;
+} panel_data[] = {
+  {  800,  600, "Fujitsu Siemens", "LiteLine", "LF6" },
+  { 1024,  768, "ASUSTEK", "L2000D", NULL },
+  { 1024,  768, "ASUSTeK Computer Inc.", "L8400C series Notebook PC", NULL },
+  { 1024,  768, "ASUSTeK Computer Inc.", "S5N", NULL },
+  { 1024,  768, "Acer", "TravelMate 720", NULL },
+  { 1024,  768, "COMPAL", "N30T5", NULL },
+  { 1024,  768, "Dell Computer Corporation", "Inspiron 5000", NULL },
+  { 1024,  768, "Dell Computer Corporation", "Latitude C400", NULL },
+  { 1024,  768, "Dell Computer Corporation", "Latitude C600", NULL },
+  { 1024,  768, "Dell Computer Corporation", "Latitude CPt C400GT", NULL },
+  { 1024,  768, "Hewlett-Packard", "HP OmniBook PC", "HP OmniBook 4150 B" },
+  { 1280,  800, "Hewlett-Packard", "hp compaq nx9105 (DU367T#ABD)", "03" },
+  { 1280,  800, "Hewlett-Packard", "Pavilion zv5000 (PA456EA#ABD)", "F.11" },
+#include "ibm-notebooks.h"
+  { 1400, 1050, "IBM", "73geu99", NULL },
+  { 1024,  768, "KDST", "KDS6KSUMO", NULL  },
+  { 1024,  768, "Sony Corporation", "PCG-F370(UC)", NULL },
+  { 1024,  768, "Sony Corporation", "PCG-N505SN", NULL },
+  { 1024,  768, "TOSHIBA", "S2400-103", NULL },
+  { 1280,  800, "Acer", "Aspire 1520", NULL },
+  { 1400, 1050, "Acer", "TravelMate 660", NULL },
+  { 1400, 1050, "Dell Computer Corporation", "Inspiron 8000", NULL },
+  { 1600, 1200, "Dell Computer Corporation", "Inspiron 8200", NULL },
+  { 1600, 1200, "Dell Computer Corporation", "Latitude C840", NULL }
+};
+
+#define BIOS_TEST
+
+typedef struct {
+  unsigned eax, ebx, ecx, edx, esi, edi, eip, es, iret, cli;
+} bios32_regs_t;
+
+static void read_memory(hd_data_t *hd_data, memory_range_t *mem);
+static void dump_memory(hd_data_t *hd_data, memory_range_t *mem, int sparse, char *label);
+static void get_pnp_support_status(memory_range_t *mem, bios_info_t *bt);
+static void smbios_get_info(hd_data_t *hd_data, memory_range_t *mem, bios_info_t *bt);
+static void get_fsc_info(hd_data_t *hd_data, memory_range_t *mem, bios_info_t *bt);
+static void add_panel_info(hd_data_t *hd_data, bios_info_t *bt);
+static void add_mouse_info(hd_data_t *hd_data, bios_info_t *bt);
+static unsigned char crc(unsigned char *mem, unsigned len);
+static int get_smp_info(hd_data_t *hd_data, memory_range_t *mem, smp_info_t *smp);
+static void parse_mpconfig(hd_data_t *hd_data, memory_range_t *mem, smp_info_t *smp);
+static int get_bios32_info(hd_data_t *hd_data, memory_range_t *mem, bios32_info_t *bios32);
+
+int detect_smp_bios(hd_data_t *hd_data)
+{
+  bios_info_t *bt;
+  hd_smbios_t *sm;
+  hd_t *hd;
+  int cpus;
+
+  if(!hd_data->bios_ram.data) return -1;       /* hd_scan_bios() not called */
+
+  for(bt = NULL, hd = hd_data->hd; hd; hd = hd->next) {
+    if(
+      hd->base_class.id == bc_internal &&
+      hd->sub_class.id == sc_int_bios &&
+      hd->detail &&
+      hd->detail->type == hd_detail_bios &&
+      (bt = hd->detail->bios.data)
+    ) {
+      break;
+    }
+  }
+
+  if(!bt) return -1;
+
+  cpus = 0;
+
+  /* look at smbios data in case there's no mp table */
+  if(hd_data->smbios) {
+    for(sm = hd_data->smbios; sm; sm = sm->next) {
+      if(
+        sm->any.type == sm_processor &&
+        sm->processor.pr_type.id == 3 &&       /* cpu */
+        sm->processor.cpu_status.id == 1       /* enabled */
+      ) {
+        cpus++;
+      }
+    }
+    ADD2LOG("  smp detect: mp %d cpus, smbios %d cpus\n", bt->smp.ok ? bt->smp.cpus_en : 0, cpus);
+  }
+
+  if(bt->smp.ok && bt->smp.cpus_en) cpus = bt->smp.cpus_en;
+
+  return cpus;
+}
+
+
+void hd_scan_bios(hd_data_t *hd_data)
+{
+  hd_t *hd;
+  bios_info_t *bt;
+  char *s;
+  unsigned char *bios_ram;
+  unsigned u, u1;
+  memory_range_t mem;
+  unsigned smp_ok;
+#ifndef LIBHD_TINY
+  vbe_info_t *vbe;
+  vbe_mode_info_t *mi;
+  hd_res_t *res;
+  str_list_t *sl;
+#endif
+
+  if(!hd_probe_feature(hd_data, pr_bios)) return;
+
+  /* we better do nothing on a SGI Altix machine */
+  if(hd_is_sgi_altix(hd_data)) return;
+
+  hd_data->module = mod_bios;
+
+  /* some clean-up */
+  remove_hd_entries(hd_data);
+
+  PROGRESS(1, 0, "cmdline");
+
+  hd = add_hd_entry(hd_data, __LINE__, 0);
+  hd->base_class.id = bc_internal;
+  hd->sub_class.id = sc_int_bios;
+  hd->detail = new_mem(sizeof *hd->detail);
+  hd->detail->type = hd_detail_bios;
+  hd->detail->bios.data = bt = new_mem(sizeof *bt);
+
+  /*
+   * first, look for APM support
+   */
+  if((s = get_cmd_param(hd_data, 1))) {
+    if(strlen(s) >= 10) {
+      bt->apm_supported = 1;
+      bt->apm_ver = hex(s, 1);
+      bt->apm_subver = hex(s + 1, 1);
+      bt->apm_bios_flags = hex(s + 2, 2);
+      /*
+       * Bitfields for APM flags (from Ralf Brown's list):
+       * Bit(s)  Description
+       *  0      16-bit protected mode interface supported
+       *  1      32-bit protected mode interface supported
+       *  2      CPU idle call reduces processor speed
+       *  3      BIOS power management disabled
+       *  4      BIOS power management disengaged (APM v1.1)
+       *  5-7    reserved
+       */
+      bt->apm_enabled = (bt->apm_bios_flags & 8) ? 0 : 1;
+
+      bt->vbe_ver = hex(s + 4, 2);
+      bt->vbe_ver = (((bt->vbe_ver >> 4) & 0xf) << 8) + (bt->vbe_ver & 0xf);
+      bt->vbe_video_mem = hex(s + 6, 4) << 16;
+    }
+
+    s = free_mem(s);
+  }
+
+  if((s = get_cmd_param(hd_data, 2))) {
+    if(strlen(s) > 8) {
+      if(s[8] == '.') bt->lba_support = 1;
+    }
+
+    s = free_mem(s);
+  }
+
+  PROGRESS(1, 1, "apm");
+
+  if(!bt->apm_ver) {
+    str_list_t *sl0, *sl;
+
+    sl0 = read_file(PROC_APM, 0, 0);
+    if(sl0) {
+      bt->apm_supported = 1;
+      bt->apm_enabled = 1;
+      ADD2LOG("----- %s -----\n", PROC_APM);
+      for(sl = sl0; sl; sl = sl->next) {
+        ADD2LOG("  %s", sl->str);
+      }
+      ADD2LOG("----- %s end -----\n", PROC_APM);
+    }
+    free_str_list(sl0);
+  }
+
+  /*
+   * get the i/o ports for the parallel & serial interfaces from the BIOS
+   * memory area starting at 0x40:0
+   */
+  PROGRESS(2, 0, "ram");
+
+  hd_data->bios_ram.start = BIOS_RAM_START;
+  hd_data->bios_ram.size = BIOS_RAM_SIZE;
+  read_memory(hd_data, &hd_data->bios_ram);
+
+  hd_data->bios_rom.start = BIOS_ROM_START;
+  hd_data->bios_rom.size = BIOS_ROM_SIZE;
+  read_memory(hd_data, &hd_data->bios_rom);
+
+  if(hd_data->bios_ram.data) {
+    bios_ram = hd_data->bios_ram.data;
+
+    bt->ser_port0 = (bios_ram[1] << 8) + bios_ram[0];
+    bt->ser_port1 = (bios_ram[3] << 8) + bios_ram[2];
+    bt->ser_port2 = (bios_ram[5] << 8) + bios_ram[4];
+    bt->ser_port3 = (bios_ram[7] << 8) + bios_ram[6];
+
+    bt->par_port0 = (bios_ram[  9] << 8) + bios_ram[  8];
+    bt->par_port1 = (bios_ram[0xb] << 8) + bios_ram[0xa];
+    bt->par_port2 = (bios_ram[0xd] << 8) + bios_ram[0xc];
+
+    bt->led.scroll_lock = bios_ram[0x97] & 1;
+    bt->led.num_lock = (bios_ram[0x97] >> 1) & 1;
+    bt->led.caps_lock = (bios_ram[0x97] >> 2) & 1;
+    bt->led.ok = 1;
+
+    /*
+     * do some consistency checks:
+     *
+     * ports must be < 0x1000 and not appear twice
+     */
+    if(bt->ser_port0 >= 0x1000) bt->ser_port0 = 0;
+
+    if(
+      bt->ser_port1 >= 0x1000 ||
+      bt->ser_port1 == bt->ser_port0
+    ) bt->ser_port1 = 0;
+
+    if(
+      bt->ser_port2 >= 0x1000 ||
+      bt->ser_port2 == bt->ser_port0 ||
+      bt->ser_port2 == bt->ser_port1
+    ) bt->ser_port2 = 0;
+
+    if(
+      bt->ser_port3 >= 0x1000 ||
+      bt->ser_port3 == bt->ser_port0 ||
+      bt->ser_port3 == bt->ser_port1 ||
+      bt->ser_port3 == bt->ser_port2
+    ) bt->ser_port3 = 0;
+
+    if(bt->par_port0 >= 0x1000) bt->par_port0 = 0;
+
+    if(
+      bt->par_port1 >= 0x1000 ||
+      bt->par_port1 == bt->par_port0
+    ) bt->par_port1 = 0;
+
+    if(
+      bt->par_port2 >= 0x1000 ||
+      bt->par_port2 == bt->par_port0 ||
+      bt->par_port2 == bt->par_port1
+    ) bt->par_port2 = 0;
+
+    ADD2LOG("  bios: %u disks\n", bios_ram[0x75]);
+
+    bt->low_mem_size = ((bios_ram[0x14] << 8) + bios_ram[0x13]) << 10;
+
+    if(bt->low_mem_size) {
+      ADD2LOG("  bios: %uk low mem\n", bt->low_mem_size >> 10);
+    }
+
+    /* too unusual */
+    if(bt->low_mem_size >= (768 << 10) || bt->low_mem_size < (384 << 10)) {
+      bt->low_mem_size = 0;
+    }
+
+    hd_data->bios_ebda.start = hd_data->bios_ebda.size = 0;
+    hd_data->bios_ebda.data = free_mem(hd_data->bios_ebda.data);
+    u = ((bios_ram[0x0f] << 8) + bios_ram[0x0e]) << 4;
+    if(u) {
+      hd_data->bios_ebda.start = u;
+      hd_data->bios_ebda.size = 1;     /* just one byte */
+      read_memory(hd_data, &hd_data->bios_ebda);
+      if(hd_data->bios_ebda.data) {
+        u1 = hd_data->bios_ebda.data[0];
+        if(u1 > 0 && u1 <= 64) {       /* be sensible, typically only 1k */
+          u1 <<= 10;
+          if(u + u1 <= (1 << 20)) {
+            hd_data->bios_ebda.size = u1;
+            read_memory(hd_data, &hd_data->bios_ebda);
+          }
+        }
+      }
+    }
+
+    if(hd_data->bios_ebda.data) {
+      ADD2LOG(
+        "  bios: EBDA 0x%05x bytes at 0x%05x\n",
+        hd_data->bios_ebda.size, hd_data->bios_ebda.start
+      );
+    }
+  }
+
+  /*
+   * read the bios rom and look for useful things there...
+   */
+  PROGRESS(2, 0, "rom");
+
+  if(hd_data->bios_rom.data) {
+    get_pnp_support_status(&hd_data->bios_rom, bt);
+    smbios_get_info(hd_data, &hd_data->bios_rom, bt);
+    get_fsc_info(hd_data, &hd_data->bios_rom, bt);
+    add_panel_info(hd_data, bt);
+    add_mouse_info(hd_data, bt);
+  }
+
+  PROGRESS(3, 0, "smp");
+
+  smp_ok = 0;
+
+  mem = hd_data->bios_ebda;
+  smp_ok = get_smp_info(hd_data, &mem, &bt->smp);
+
+  if(!smp_ok) {
+    mem = hd_data->bios_rom;
+    if(mem.data) {
+      mem.size -= 0xf0000 - mem.start;
+      mem.data += 0xf0000 - mem.start;
+      mem.start = 0xf0000;
+      if(mem.size < (1 << 20)) smp_ok = get_smp_info(hd_data, &mem, &bt->smp);
+    }
+  }
+
+  if(!smp_ok) {
+    mem.size = 1 << 10;
+    mem.start = 639 << 10;
+    mem.data = NULL;
+    read_memory(hd_data, &mem);
+    if(mem.data) smp_ok = get_smp_info(hd_data, &mem, &bt->smp);
+    mem.data = free_mem(mem.data);
+  }
+
+  if(bt->smp.ok && bt->smp.mpconfig) {
+    mem.start = bt->smp.mpconfig;
+    mem.size = 1 << 16;
+    mem.data = NULL;
+    read_memory(hd_data, &mem);
+    parse_mpconfig(hd_data, &mem, &bt->smp);
+    mem.data = free_mem(mem.data);
+  }
+  
+  if((hd_data->debug & HD_DEB_BIOS)) {
+    dump_memory(hd_data, &hd_data->bios_ram, 0, "BIOS data");
+    dump_memory(hd_data, &hd_data->bios_ebda, hd_data->bios_ebda.size <= (8 << 10) ? 0 : 1, "EBDA");
+    // dump_memory(hd_data, &hd_data->bios_rom, 1, "BIOS ROM");
+
+    if(bt->smp.ok && bt->smp.mpfp) {
+      mem.start = bt->smp.mpfp;
+      mem.size = 0x10;
+      mem.data = NULL;
+      read_memory(hd_data, &mem);
+      dump_memory(hd_data, &mem, 0, "MP FP");
+      mem.data = free_mem(mem.data);
+    }
+
+    if(bt->smp.ok && bt->smp.mpconfig && bt->smp.mpconfig_size) {
+      mem.start = bt->smp.mpconfig;
+      mem.size = bt->smp.mpconfig_size;
+      mem.data = NULL;
+      read_memory(hd_data, &mem);
+      dump_memory(hd_data, &mem, 0, "MP config table");
+      mem.data = free_mem(mem.data);
+    }
+  }
+
+#ifndef LIBHD_TINY
+  if(hd_probe_feature(hd_data, pr_bios_vesa)) {
+    PROGRESS(4, 0, "vbe");
+
+    vbe = &bt->vbe;
+    vbe->ok = 0;
+
+    if(!hd_data->klog) read_klog(hd_data);
+    for(sl = hd_data->klog; sl; sl = sl->next) {
+      if(sscanf(sl->str, "<6>PCI: Using configuration type %u", &u) == 1) {
+        hd_data->pci_config_type = u;
+        ADD2LOG("  klog: pci config type %u\n", hd_data->pci_config_type);
+      }
+    }
+
+    get_vbe_info(hd_data, vbe);
+
+    if(vbe->ok) {
+      bt->vbe_ver = vbe->version;
+    }
+
+    if(vbe->ok && vbe->fb_start) {
+      hd = add_hd_entry(hd_data, __LINE__, 0);
+      hd->base_class.id = bc_framebuffer;
+      hd->sub_class.id = sc_fb_vesa;
+
+      hd_set_hw_class(hd, hw_vbe);
+
+#if 0
+      hd->detail = new_mem(sizeof *hd->detail);
+      hd->detail->type = hd_detail_bios;
+      hd->detail->bios.data = bt = new_mem(sizeof *bt);
+#endif
+
+      hd->vendor.name = new_str(vbe->vendor_name);
+      hd->device.name = new_str(vbe->product_name);
+      hd->sub_vendor.name = new_str(vbe->oem_name);
+      hd->revision.name = new_str(vbe->product_revision);
+
+      res = add_res_entry(&hd->res, new_mem(sizeof *res));
+      res->phys_mem.type = res_phys_mem;
+      res->phys_mem.range = vbe->memory;
+
+      res = add_res_entry(&hd->res, new_mem(sizeof *res));
+      res->mem.type = res_mem;
+      res->mem.base = vbe->fb_start;
+      res->mem.range = vbe->memory;
+      res->mem.access = acc_rw;
+      res->mem.enabled = 1;
+
+      if(vbe->mode) {
+        for(u = 0; u < vbe->modes; u++) {
+          mi = vbe->mode + u;
+          if(
+            (mi->attributes & 1) &&    /* mode supported */
+            mi->fb_start &&
+            mi->pixel_size != -1u      /* text mode */
+          ) {
+            res = add_res_entry(&hd->res, new_mem(sizeof *res));
+            res->framebuffer.type = res_framebuffer;
+            res->framebuffer.width = mi->width;
+            res->framebuffer.bytes_p_line = mi->bytes_p_line;
+            res->framebuffer.height = mi->height;
+            res->framebuffer.colorbits = mi->pixel_size;
+            res->framebuffer.mode = mi->number + 0x200;
+          }
+        }
+      }
+
+#if 0
+      if(
+        hd->vend_name &&
+        !strcmp(hd->vend_name, "Matrox") &&
+        hd->device.name &&
+        (
+          strstr(hd->dev_name, "G200") ||
+          strstr(hd->dev_name, "G400") ||
+          strstr(hd->dev_name, "G450")
+        )
+      ) {
+        hd->broken = 1;
+      }
+#endif
+
+    }
+  }
+#endif /* LIBHD_TINY */
+
+  PROGRESS(5, 0, "32");
+
+  mem = hd_data->bios_rom;
+  if(mem.data) {
+    mem.size -= 0xe0000 - mem.start;
+    mem.data += 0xe0000 - mem.start;
+    mem.start = 0xe0000;
+    if(mem.size < (1 << 20)) get_bios32_info(hd_data, &mem, &bt->bios32);
+  }
+
+  if(bt->bios32.ok) {
+    mem = hd_data->bios_rom;
+
+    if(
+      mem.start <= 0xfffea &&
+      mem.start + mem.size >= 0xfffea + 6 &&
+      !memcmp(mem.data + 0xfffea - mem.start, "COMPAQ", 6)
+    ) {
+      bt->bios32.compaq = 1;
+      ADD2LOG("  bios32: compaq machine\n");
+    }
+  }
+
+}
+
+
+void read_memory(hd_data_t *hd_data, memory_range_t *mem)
+{
+#ifdef BIOS_TEST
+  char *s = getenv("LIBHD_MEM");
+#endif
+
+#ifdef LIBHD_MEMCHECK
+  {
+    if(libhd_log) fprintf(libhd_log, ">%p\n", CALLED_FROM(read_memory, mem));
+  }
+#endif
+
+  if(mem->data) free_mem(mem->data);
+  mem->data = new_mem(mem->size);
+#ifdef BIOS_TEST
+  hd_read_mmap(hd_data, s ?: DEV_MEM, mem->data, mem->start, mem->size);
+#else
+  hd_read_mmap(hd_data, DEV_MEM, mem->data, mem->start, mem->size);
+#endif
+
+#ifdef LIBHD_MEMCHECK
+  {
+    if(libhd_log) fprintf(libhd_log, "<%p\n", CALLED_FROM(read_memory, mem));
+  }
+#endif
+}
+
+
+void dump_memory(hd_data_t *hd_data, memory_range_t *mem, int sparse, char *label)
+{
+  unsigned u, step;
+
+  if(!mem->size || !mem->data) return;
+
+#if 1
+  step = sparse ? 0x1000 : 0x10;
+#else
+  step = 0x10;
+#endif
+
+  ADD2LOG("----- %s 0x%05x - 0x%05x -----\n", label, mem->start, mem->start + mem->size - 1);
+  for(u = 0; u < mem->size; u += step) {
+    ADD2LOG("  %03x  ", u + mem->start);
+    hexdump(&hd_data->log, 1, mem->size - u > 0x10 ? 0x10 : mem->size - u, mem->data + u);
+    ADD2LOG("\n");
+  }
+  ADD2LOG("----- %s end -----\n", label);
+}
+
+
+void get_pnp_support_status(memory_range_t *mem, bios_info_t *bt)
+{
+  int i;
+  unsigned char pnp[4] = { '$', 'P', 'n', 'P' };
+  unsigned char *t;
+  unsigned l, cs;
+
+  if(!mem->data) return;
+
+  for(i = 0xf0000 - mem->start; (unsigned) i < mem->size; i += 0x10) {
+    t = mem->data + i;
+    if(t[0] == pnp[0] && t[1] == pnp[1] && t[2] == pnp[2] && t[3] == pnp[3]) {
+      for(l = cs = 0; l < t[5]; l++) { cs += t[l]; }
+      if((cs & 0xff) == 0) {           // checksum ok
+        bt->is_pnp_bios = 1;
+//        printf("0x%x bytes at 0x%x, cs = 0x%x\n", t[5], i, cs);
+        bt->pnp_id = t[0x17] + (t[0x18] << 8) + (t[0x19] << 16) + (t[0x20] << 24);
+      }
+    }
+  }
+}
+
+unsigned char crc(unsigned char *mem, unsigned len)
+{
+  unsigned char uc = 0;
+
+  while(len--) uc += *mem++;
+
+  return uc;
+}
+
+
+void smbios_get_info(hd_data_t *hd_data, memory_range_t *mem, bios_info_t *bt)
+{
+  unsigned u, u1, u2, ok, hlen = 0, ofs;
+  unsigned addr = 0, len = 0, scnt;
+  unsigned structs = 0, type, slen;
+  char *s;
+  memory_range_t memory;
+  hd_smbios_t *sm;
+
+  if(!mem->data || mem->size < 0x100) return;
+
+  for(u = ok = 0; u <= mem->size - 0x100; u += 0x10) {
+    if(*(unsigned *) (mem->data + u) == 0x5f4d535f) {  /* "_SM_" */
+      hlen = mem->data[u + 5];
+      addr = *(unsigned *) (mem->data + u + 0x18);
+      len = *(unsigned short *) (mem->data + u + 0x16);
+      structs = *(unsigned short *) (mem->data + u + 0x1c);
+      if(hlen < 0x1e) continue;
+      ok = crc(mem->data + u, hlen) == 0 && addr < (1 << 20) && len;
+      if(ok) break;
+    }
+  }
+
+  if(!ok) return;
+
+  bt->smbios_ver = (mem->data[u + 6] << 8) + mem->data[u + 7];
+
+  hd_data->smbios = smbios_free(hd_data->smbios);
+
+  memory.start = mem->start + u;
+  memory.size = hlen;
+  memory.data = mem->data + u;
+  dump_memory(hd_data, &memory, 0, "SMBIOS Entry Point");
+
+  memory.start = addr;
+  memory.size = len;
+  memory.data = NULL;
+  read_memory(hd_data, &memory);
+  if(len >= 0x4000) {
+    ADD2LOG(
+      "  SMBIOS Structure Table at 0x%05x (size 0x%x)\n",
+      addr, len
+    );
+  }
+  else {
+    dump_memory(hd_data, &memory, 0, "SMBIOS Structure Table");
+  }
+
+  for(type = 0, u = 0, ofs = 0; u < structs && ofs + 3 < len; u++) {
+    type = memory.data[ofs];
+    slen = memory.data[ofs + 1];
+    if(ofs + slen > len || slen < 4) break;
+    sm = smbios_add_entry(&hd_data->smbios, new_mem(sizeof *sm));
+    sm->any.type = type;
+    sm->any.data_len = slen;
+    sm->any.data = new_mem(slen);
+    memcpy(sm->any.data, memory.data + ofs, slen);
+    sm->any.handle = memory.data[ofs + 2] + (memory.data[ofs + 3] << 8);
+    ADD2LOG("  type 0x%02x [0x%04x]: ", type, sm->any.handle);
+    if(slen) hexdump(&hd_data->log, 0, slen, sm->any.data);
+    ADD2LOG("\n");
+    if(type == sm_end) break;
+    ofs += slen;
+    u1 = ofs;
+    u2 = 1;
+    scnt = 0;
+    while(ofs + 1 < len) {
+      if(!memory.data[ofs]) {
+        if(ofs > u1) {
+          s = canon_str(memory.data + u1, strlen(memory.data + u1));
+          add_str_list(&sm->any.strings, s);
+          scnt++;
+          if(*s) ADD2LOG("       str%d: \"%s\"\n", scnt, s);
+          free_mem(s);
+          u1 = ofs + 1;
+          u2++;
+        }
+        if(!memory.data[ofs + 1]) {
+          ofs += 2;
+          break;
+        }
+      }
+      ofs++;
+    }
+  }
+
+  if(u != structs) {
+    if(type == sm_end) {
+      ADD2LOG("  smbios: stopped at end tag\n");
+    }
+    else {
+      ADD2LOG("  smbios oops: only %d of %d structs found\n", u, structs);
+    }
+  }
+
+  memory.data = free_mem(memory.data);
+
+  smbios_parse(hd_data);
+}
+
+
+void get_fsc_info(hd_data_t *hd_data, memory_range_t *mem, bios_info_t *bt)
+{
+  unsigned u, mtype, fsc_id;
+  unsigned x, y;
+  hd_smbios_t *sm;
+  char *vendor = NULL;
+
+  if(!mem->data || mem->size < 0x20) return;
+
+  for(sm = hd_data->smbios; sm; sm = sm->next) {
+    if(sm->any.type == sm_sysinfo) {
+      vendor = sm->sysinfo.manuf;
+      break;
+    }
+  }
+
+  vendor = vendor && !strcasecmp(vendor, "Fujitsu") ? "Fujitsu" : "Fujitsu Siemens";
+
+  for(u = 0; u <= mem->size - 0x20; u += 0x10) {
+    if(
+      *(unsigned *) (mem->data + u) == 0x696a7546 &&
+      *(unsigned *) (mem->data + u + 4) == 0x20757374
+    ) {
+      mtype = *(unsigned *) (mem->data + u + 0x14);
+      if(!crc(mem->data + u, 0x20) && !(mtype & 0xf0000000)) {
+        fsc_id = (mtype >> 12) & 0xf;
+
+