--- /dev/null
+#
+# Bootstrap Makefile.in
+#
+# Version $Id$
+#
+@MCOMMON@
+
+working_dir=@working_dir@
+
+srcdir = @srcdir@
+VPATH = @srcdir@
+.PATH: @srcdir@
+topdir = ..
+thisdir = bootstrap
+
+
+first_rule: all
+dummy:
+
+MKDIR = $(topdir)/autoconf/mkinstalldirs
+
+#-------------------------------------------------------------------------
+
+all: Makefile
+
+
+depend:
+
+
+#-------------------------------------------------------------------------
+
+
+install:
+
+uninstall:
+
+Makefile: Makefile.in
+ cd $(topdir) \
+ && CONFIG_FILES=$(thisdir)/$@ CONFIG_HEADERS= $(SHELL) ./config.status
+
+Makefiles:
+ $(SHELL) config.status
+
+clean:
+ @$(RMF) *~ 1 2 3
+
+# clean for distribution
+distclean: clean
+ @$(RMF) -r CVS
+
+devclean: clean
+ @for subdir in freebsd linux solaris; do \
+ if [ -f $${subdir}/Makefile ]; then \
+ (cd $${subdir}; $(MAKE) devclean) \
+ fi; \
+# ------------------------------------------------------------------------
--- /dev/null
+Makefile
+diskinfo
+format.hda
+mount_drives
+partition.hda
+sfdisk
+start_network
+1
+bacula-fd
+bacula-fd.conf
--- /dev/null
+#
+# bootstrap/freebsd Makefile.in
+#
+# Version $Id$
+#
+@MCOMMON@
+
+working_dir=@working_dir@
+
+srcdir = @srcdir@
+VPATH = @srcdir@
+.PATH: @srcdir@
+topdir = ../..
+thisdir = freebsd
+
+
+first_rule: all
+dummy:
+
+MKDIR = $(topdir)/autoconf/mkinstalldirs
+
+#-------------------------------------------------------------------------
+
+all: Makefile
+
+depend:
+
+
+#-------------------------------------------------------------------------
+
+
+install:
+
+uninstall:
+
+Makefile: Makefile.in
+ cd $(topdir) \
+ && CONFIG_FILES=$(thisdir)/$@ CONFIG_HEADERS= $(SHELL) ./config.status
+
+Makefiles:
+ $(SHELL) config.status
+
+clean:
+ @$(RMF) *~ 1 2 3
+ @$(RMF) format.* partition.* start_network mount_drives
+ @$(RMF) sfdisk bacula-fd bacula-fd.gz bacula-fd.conf
+ @$(RMF) -r diskinfo
+
+# clean for distribution
+distclean: clean
+ @$(RMF) Makefile
+ @$(RMF) -r CVS
+
+devclean: clean
+ @$(RMF) Makefile
+
+# ------------------------------------------------------------------------
--- /dev/null
+/etc/exports
+/etc/fstab
+/etc/group
+/etc/gshadow
+/etc/host.conf
+/etc/hosts
+/etc/hosts.allow
+/etc/hosts.deny
+/etc/modules.conf
+/etc/passwd
+/etc/resolv.conf
+/etc/shadow
+/etc/sysconfig
--- /dev/null
+#!/bin/sh
+#
+# Create bootstrap information files -- prelude to creating a
+# Bacula Rescue Disk
+#
+# Kern Sibbald, December MMII
+# This source distributed under the GPL
+#
+di=diskinfo
+cwd=`pwd`
+host=`uname -s`
+case $host in
+ Linux)
+ ;;
+ FreeBSD | SunOS | IRIX)
+ echo ""
+ echo "This code is not yet adapted to this OS"
+ exit 1
+ ;;
+ *)
+ echo ""
+ echo "Unknown operating system type: $host"
+ exit 1
+ ;;
+esac
+if [ ! `whoami` = "root" ] ; then
+ echo ""
+ echo "You need to be root to run this, otherwise"
+ echo "sfdisk produces no output. Continuing anyway ..."
+ echo ""
+fi
+
+#
+# First collect information
+#
+echo "Begin collecting system info"
+mkdir -p $di
+cd $di
+mount -l >mount.bsi
+mount -l -t ext2 >mount.ext2.bsi
+mount -l -t ext3 >mount.ext3.bsi
+cp /etc/fstab fstab.bsi
+cp /etc/mtab mtab.bsi
+df -Tl >df.bsi
+sfdisk -s >sfdisk.disks.bsi
+grep "^/dev/" sfdisk.disks.bsi | sed -n 's/\(^.*\):.*$/\1/p' >disks.bsi
+for i in `cat disks.bsi`; do
+ j=`echo $i | cut -c6-`
+ sfdisk -l $i >sfdisk.$j.bsi
+ sfdisk -d $i >sfdisk.make.$j.bsi
+done
+route -n >route.bsi
+ifconfig >ifconfig.bsi
+echo "Done collecting info. Building scripts ..."
+
+#
+# Done collecting information
+#
+
+
+#
+# First create partitioning script(s)
+#
+for i in `cat disks.bsi`; do
+ j=`echo $i | cut -c6-`
+ cat >$cwd/partition.$j <<END_OF_DATA
+#!/bin/sh
+#
+# Partition disk $i -- created by getdiskinfo
+echo ""
+echo "This script will repartition disk $i."
+echo ""
+echo "IT WILL DESTROY ALL DATA ON DISK $i !!!!"
+echo ""
+echo -n "Are you sure you want to continue? (yes/no): "
+read a
+if [ x\$a != xyes ] ; then
+ exit 1
+fi
+echo "Partitioning disk $i"
+# zap partition info
+dd if=/dev/zero of=$i bs=512 count=2
+# repartition
+sfdisk $i <$di/sfdisk.make.$j.bsi | less
+echo ""
+echo "The previous partitioning was:"
+cat $di/sfdisk.$j.bsi
+#
+echo ""
+echo "The new partitioning is:"
+sfdisk -l $i
+echo ""
+echo "If the disk is correctly partitioned, you should"
+echo "now run the \"format.$j\" script."
+echo ""
+END_OF_DATA
+
+ chmod 755 $cwd/partition.$j
+done
+
+#
+# Create formatting script(s)
+#
+for i in `cat disks.bsi`; do
+ j=`echo $i | cut -c6-`
+ cat >$cwd/format.$j <<END_OF_DATA
+#!/bin/sh
+#
+# Format all partitions on disk $i -- created by getdiskinfo
+#
+echo ""
+echo "This script will format all partitions on disk $i."
+echo ""
+echo "IT WILL DESTROY ALL DATA ON DISK $i !!!!"
+echo ""
+echo -n "Are you sure you want to continue? (yes/no): "
+read a
+if [ x\$a != xyes ] ; then
+ exit 1
+fi
+echo "Do you want to do a disk check for bad blocks?"
+echo -n "It is recommended, but takes time. (yes/no): "
+read a
+if [ x\$a = xyes ] ; then
+ check="-c"
+else
+ check=
+fi
+END_OF_DATA
+
+ # Find swap partitions in output from sfdisk
+ k=`grep "^$i.*82 Linux swap" sfdisk.$j.bsi | cut -d ' ' -f 1`
+ for disk in $k; do
+ echo "echo \"Formatting $disk -- swap partition\"" >>$cwd/format.$j
+ echo "mkswap $check $disk" >>$cwd/format.$j
+ echo "echo \"\"" >>$cwd/format.$j
+ done
+ # Find ext2 partitions in mount output
+ k=`grep "^$i" mount.ext2.bsi | cut -d ' ' -f 1`
+ for disk in $k; do
+ echo "echo \"Formating $disk -- ext2 partition\"" >>$cwd/format.$j
+ label=`grep "^$disk" mount.ext2.bsi | cut -d ' ' -f 7 | cut -c2- | cut -d ] -f 1`
+ if [ x$label = x ] ; then
+ echo "mke2fs -v \$check $disk" >>$cwd/format.$j
+ else
+ echo "mke2fs -v \$check -L $label $disk" >>$cwd/format.$j
+ fi
+ echo "echo \"\"" >>$cwd/format.$j
+ done
+ # Find ext3 partitions in mount output
+ k=`grep "^$i" mount.ext3.bsi | cut -d ' ' -f 1`
+ for disk in $k; do
+ echo "echo \"Formating $disk -- ext3 partition\"" >>$cwd/format.$j
+ label=`grep "^$disk" mount.ext3.bsi | cut -d ' ' -f 7 | cut -c2- | cut -d ] -f 1`
+ if [ x$label = x ] ; then
+ echo "mke2fs -v -j \$check $disk" >>$cwd/format.$j
+ else
+ echo "mke2fs -v -j \$check -L $label $disk" >>$cwd/format.$j
+ fi
+ echo "echo \"\"" >>$cwd/format.$j
+ done
+ chmod 755 $cwd/format.$j
+done
+
+cd $cwd
+
+#
+# Create network start script
+#
+host=`hostname`
+ip=`host $host | cut -d ' ' -f 4`
+cat >start_network <<END_OF_DATA
+#!/bin/sh
+#
+# Start network -- created by getdiskinfo
+#
+ip=$ip
+dev=eth0
+ifconfig lo up
+ifconfig \$dev up \$ip
+route add default gw \$ip dev \$dev
+END_OF_DATA
+
+chmod 755 start_network
+
+cat >mount_drives <<END_OF_DATA
+#!/bin/sh
+#
+# Mount disk drives -- created by getdiskinfo
+#
+END_OF_DATA
+sed -n 's/\(^.*\)\ on\ \(.*\)\ type.*$/mkdir -p \/mnt\/disk\2/p' $di/mount.ext2.bsi >>mount_drives
+sed -n 's/\(^.*\)\ on\ \(.*\)\ type.*$/mkdir -p \/mnt\/disk\2/p' $di/mount.ext3.bsi >>mount_drives
+echo "#" >>mount_drives
+sed -n 's/\(^.*\)\ on\ \(.*\)\ type.*$/mount \1 \/mnt\/disk\2/p' $di/mount.ext2.bsi >/tmp/1$$
+sed -n 's/\(^.*\)\ on\ \(.*\)\ type.*$/mount \1 \/mnt\/disk\2/p' $di/mount.ext3.bsi >>/tmp/1$$
+# sort so that root is mounted first
+sort -k 3 </tmp/1$$ >>mount_drives
+rm -f /tmp/1$$
+
+chmod 755 mount_drives
+
+# copy sfdisk so we will have it
+cp -f /sbin/sfdisk .
--- /dev/null
+#!/bin/sh
+#
+# Script to make a Bacula "rescue" disk
+#
+device=/mnt/floppy
+dev=/dev/fd0
+
+# Print Usage message
+usage () {
+ cat <<END_OF_DATA
+Usage: make_rescue_disk
+ -h, --help print this message
+ --make-static-bacula make static File daemon and add to diskette
+ --copy-static-bacula copy static File daemon to diskette
+ --copy-etc-files copy files in etc list to diskette
+END_OF_DATA
+}
+
+# defaults
+make_bacula=no
+copy_bacula=no
+copy_etc=no
+
+#
+# Process command line options
+#
+for option in "$@" ; do
+ case "$option" in
+ -h | --help)
+ usage
+ exit 0
+ ;;
+ --make-static-bacula)
+ make_bacula=yes
+ copy_bacula=yes
+ ;;
+ --copy-static-bacula)
+ copy_bacula=yes
+ ;;
+ --copy-etc-files)
+ copy_etc=yes
+ ;;
+ *)
+ echo "Unknown option specified: $option"
+ usage
+ exit 1
+ ;;
+ esac
+done
+
+echo ""
+echo "Place a blank diskette in your floppy drive."
+echo "It will be formatted and all data will be lost."
+echo ""
+echo -n "Press return when ready: "
+read a
+umount $device 2>&1 >/dev/null
+if [ $? = 0 ] ; then
+ mounted=1
+else
+ mounted=0
+fi
+mke2fs $dev
+mount $dev $device 2>&1 >/dev/null
+
+if [ x$make_bacula = "xyes" ] ; then
+ ./make_static_bacula
+fi
+
+if [ x$copy_bacula = "xyes" -a ! -e bacula-fd ] ; then
+ echo " "
+ echo "bacula-fd not found. If you want Bacula on this"
+ echo "rescue disk please run \"make_static_bacula\" first."
+ echo "Continuing anyway ..."
+ echo " "
+ exit 1
+ have_bacula=no
+else
+ echo "Stripping and compressing Bacula"
+ strip bacula-fd
+ gzip bacula-fd
+ have_bacula=yes
+fi
+
+echo "Copying files to $device"
+cp -a . $device
+
+if [ x$copy_etc = "xyes" ] ; then
+ echo "Tarring /etc files to $device"
+ tar --create --gzip --file $device/etc.gz --files-from backup.etc.list
+fi
+
+if [ x$have_bacula = "xyes" ] ; then
+ rm -f bacula-fd.gz bacula-fd.conf
+fi
+sync
+if [ $mounted = 0 ] ; then
+ umount $device
+fi
--- /dev/null
+#!/bin/sh
+#
+# Note, this creates the directory etc, so if you want
+# the files to go into the real /etc, you must be one
+# level up when executing it. Otherwise you end up with
+# a /etc/etc directory.
+#
+device=/mnt/floppy
+tar -v -z -f $device/etc.gz
--- /dev/null
+#!/bin/sh
+#
+# Script to run grub to recreate the MBR
+#
+# Find boot partition if any
+bootp=`grep "^/dev/.*\ on\ /boot" diskinfo/mount.bsi | cut -d ' ' -f 1`
+# find boot device
+if [ x$bootp != x ] ; then
+ bootdev=`echo $bootp | cut -c1-8`
+else
+ bootdev=`grep "^/dev/.*\ on\ /" diskinfo/mount.bsi | cut -c1-8`
+fi
+chroot /mnt/disk /sbin/grub-install $bootdev
+sync
--- /dev/null
+#!/bin/sh
+#
+# Script to run lilo and re-create the MBR
+#
+chroot /mnt/disk /sbin/lilo -v -C /etc/lilo.conf
+sync
--- /dev/null
+Makefile
+diskinfo
+format.hda
+mount_drives
+partition.hda
+sfdisk
+start_network
+1
+bacula-fd
+bacula-fd.conf
--- /dev/null
+
+all:
+
+install:
+
+uninstall:
+
+clean:
+
+distclean:
+
+depend:
--- /dev/null
+bootcd.iso
+Makefile
+cdtree
--- /dev/null
+
+.PATH: .
+
+
+first_rule: all
+dummy:
+
+#-------------------------------------------------------------------------
+
+# Make an iso boot image
+iso:
+ rm -f bootcd.iso
+ mkisofs -A "Bacula Rescue Disk" -V "Bacula Rescue Disk" \
+ -J -R -T -o bootcd.iso \
+ -b boot/isolinux/isolinux.bin -c boot/isolinux/boot.cat \
+ -no-emul-boot -boot-load-size 4 -boot-info-table cdtree
+
+# try booting it with qemu emulator
+boot:
+ qemu -cdrom bootcd.iso
+
+initrd:
+ ./makeinitrd
+
+kernel:
+ ./makekernel
+
+binaries:
+ ./makebinaries
+
+static-bacula: dummy
+ @(cd bacula; make copy-static-fd)
+
+bacula: dummy
+ @(cd bacula; make)
+
+all: kernel binaries bacula initrd iso
+
+copy-static-fd: kernel binaries static-bacula initrd iso
+
+
+# This needs to be customized for your burner.
+burn:
+ cdrecord dev=@CDSTL@ gracetime=2 fs=4096k driveropts=burnfree -v \
+ -useinfo speed=48 -dao -eject -pad -data "bootcd.iso"
+
+# Blank the CDROM assuming it is +rw
+blank:
+ cdrecord dev=@CDSTL@ gracetime=2 -v blank=fast -useinfo speed=48
+
+scan:
+ cdrecord -scanbus
+
+distclean:
+clean:
+#
+# Clean out files that are rebuilt
+#
+ @rm -f bootcd.iso
+ @rm -f 1 2 3 4
+ @rm -rf mnt
+ @rm -rf roottree/bin roottree/proc roottree/boot
+ @rm -rf roottree/lib roottree/sbin roottree/dev
+ @rm -rf roottree/dev roottree/sys roottree/sysroot
+ @rm -rf roottree/sys
+ @rm -rf roottree/initrd roottree/cdrom roottree/mnt
+ @rm -rf roottree/tmp roottree/var
+ @rm -f roottree/etc/services roottree/etc/exports
+ @rm -f roottree/etc/gshadow roottree/etc/shadow
+ @rm -f roottree/etc/passwd roottree/etc/group
+ @rm -f roottree/etc/hosts roottree/etc/bashrc
+ @rm -f roottree/etc/filesystems roottree/etc/fstab
+ @rm -f roottree/etc/protocols roottree/etc/localtime
+ @rm -f roottree/etc/ld.so.cache
+ @rm -f roottree/etc/modules.conf roottree/etc/syslog.conf
+ @rm -rf roottree/etc/pam.d roottree/etc/ssh
+ @rm -rf roottree/etc/security roottree/etc/init.d
+ @rm -rf roottree/bacula-*
+ @rm -f cdtree/boot/isolinux/initrd.img
+ @rm -f cdtree/boot/isolinux/isolinux.cfg
+ @rm -f cdtree/boot/isolinux/vmlinuz
+ @rm -f cdtree/boot/isolinux/map
+ @(cd bacula; make distclean)
--- /dev/null
+
+This is the Bacula Rescue CD source directory. The some of the
+scripts in this directory were dervied from Martin L. Purschke's
+"Roll your own Linux Rescue or Setup CD". See:
+http://www.phenix.bnl.gov/~purschke/RescueCD/ for more details.
+This information was invaluable in creating this rescue disk.
+However, not much of the original code (if any) remains.
+
+The idea is to build a boot CD that contains a copy of your
+current system that can be booted in an emergency to either
+repair your filesystem, or to load Bacula to restore your
+filesystem. Even though this boot CD is built from your system,
+it can be booted on almost any system.
+
+Requirements:
+- A Linux system (known to work with RedHat Enterprise 3.0)
+- It will boot and run on any hardware that isolinux can boot
+ from.
+
+To build an ISO image for burning a CD, you do the following:
+
+ cd <bacula-source>
+ ./configure (your-options)
+ make
+ cd <bacula-source>/rescue/linux/cdrom
+ su
+ make all
+
+to burn it, do:
+
+ make burn
+
+to cleanup, do:
+
+ make clean
+
+When running these scripts, you should have few or no warnings.
+
+You will probably also have a number of "Could not finds" under
+updating binaries.
+
+As long as the script runs to completion, you can probably ignore
+any such warnings.
+
+The Makefile will copy your kernel and some files it needs, then copy
+your binary files as well as the shared libraries they need to run, and
+finally, it will copy certain configuration components from your /etc
+directory including your passwd file. And finally, it will collect the
+information necessary to restore all your harddisks. You can find that
+information in /bacula after the disk has booted. /bacula/bin will
+contain a statically linked version of the current beta Bacula fd and
+a default bacula-fd.conf file.
+
+The ISO image will be left in:
+
+ <rescue>/bootcd.iso
+
+When you boot the CD, always choose the default by hitting return.
+When the system finishes booting you will be presented with a login
+prompt at which point, you should login as root using the root password
+from your system. Boot options other than the default have not be tested
+(actually, I am going to remove them), and logging into any user other
+than root is not likely to work.
+
+What do you have when you boot?
+- Your kernel will be booted in a simplifed environment.
+- Everything is running in a RAM disk file.
+- Access to the CDROM in /cdrom and anything you put in cdtree will
+ be in the /cdrom directory.
+- You will start in /root, with nothing unless you put it in
+ roottree/root before making the ISO.
+- You will have a good number of standard Unix programs available.
+ Do an "ls -l /sbin" to see the list. To add more add them to
+ rootsbin.list
+- A /lib containing all the shared libraries used by the programs in
+ /sbin. If you add more programs other than to rootsbin.list, you
+ will need to manually add any required shared libraries.
+- A /lib/modules/kernel-name/ with all your kernel modules.
+- An /etc directory containing a stripped down and modified version
+ of your system files. Everything is *vastly* simplified, and probably
+ not in the usual places, but many things such as your passwd file
+ will be there.
+- A /bacula-hostname directory containing the basic rescue disk contents
+ mentioned in the manual concerning the floppy rescue. Note,
+ hostname is the name of the host on which you built the CDROM
+ (this allows having multiple rescues on a single CDROM).
+- A /bacula-hostname/bin directory containing a statically linked Bacula
+ from the current development stream, and a bacula-fd.conf file.
+ With this and the contents of the /bacula-hostname directory, you have
+ all the scripts necessary to reconstruct your hard disks, and to
+ launch a Bacula File daemon for restoring the system.
+
+Adding your own files:
+- Anything you put in the directory roottree will be
+ put into the initial ram disk, and loaded into memory.
+ This is the normal way to add files. However, the size of
+ the ramdisk file is limited to your machine's total
+ memory size. Currently, with the contents of a single
+ machine (you can actually put multiple machines on a
+ single CD), the size is about 50MB. Most machines today
+ should handle this.
+- Anything you put in the directory cdtree will go on the
+ CDROM, but will not be loaded in memory. This means that
+ you must be able to mount the CDROM to read it -- normally
+ the CDROM should be automatically mounted when the system
+ boots, but the detection is not yet too good, so you may
+ need to manually mount it. On the other hand, anything you
+ add to cdtree can be read without booting it by simply
+ mounting the CDROM -- it also does not use precious
+ RAM.
+
+
+Other make targets:
+- make kernel --- rebuild the kernel files
+- make binaries --- rebuild the binary files
+- make bacula --- rebuild a static Bacula File daemon
+ and make a snapshot of your hard disk
+ layout.
+- make initrd --- make a new ram disk image.
+- make iso --- make a new ISO image.
+- make scan --- use cdrecord to scan your scsi drivers for
+ a cd burner.
+- make blank --- blank a CD-RW disk (you may need to adjust
+ the dev= specification using the "make scan"
+ output.
+- make burn --- burn the ISO (you may need to adjust the
+ dev= specification using the "make scan" output).
+
+
+Work to be done:
+- Test with SCSI boot.
+- Look at doing some hardware detection in the second half of
+ the boot process.
+
+The boot process works as follows:
+- isolinux puts up the boot screen. According to what options you
+ select, it will boot.
+- The whole roottree is in the initrd.img and will be loaded in
+ memory. It may take more time than you are used to to load.
+- The script "linuxrc" in /roottree is run. This script is *very*
+ simple and doesn't do much other than mounting /proc and
+ remounting the root (/) read/write.
+
+- When booting is complete, the init process is started and it calls
+ the script /etc/sysinit (in roottree) as determined by the setting
+ in /etc/inittab (i.e. the si entry).
+
+- sysinit mounts the root filesystem as read write, sets up a few system
+ files, turns on logging, attempts to the cdrom on /cdrom. This is very
+ likely to fail. It is nothing to worry about, but means that unless
+ you manually mount the cdrom, you will not be able to access it.
+ To run the standard Bacula restore, there is no need to access the
+ cdrom after the boot. Then sysinit calls the
+ /etc/load_eth0 script, and finally, sysinit sets up the loop back interface.
+
+- load_eth0 attempts to find and load the ethernet kernel module.
+ It does not, however, start the network.
+
+- Then init follows the instructions in inittab for the run level
+ chosen (default 2), which is to call /etc/rc.d/rc 2
+
+- rc tells init to switch to single user mode
+
+- If the run level is greater than 2, rc calls /etc/start_network.sh,
+ which attempts to setup the network with dhcp. (some work needed here)
+
+On a standard Linux system, the boot is almost the same. The root filesystem
+and all the other files, including /linuxrc, that go in the initial ram image
+(initrd) are made by the script /sbin/mkinitrd. Note, this is not used here,
+we do the work ourselves in makeinitrd.
+
+Reading an ISO image:
+
+ mkdir mnt
+ su
+ mount -o loop xxx.iso mnt
+ ls -l mnt
+ ...
+ umount mnt
+ rm -rf mnt
+
+Unpacking in initrd.img:
+ mkdir mnt
+ su
+ mount -o loop xxx.iso mnt
+ cp mnt/isolinux/initrd.img initrd.gz
+ unmount mnt
+ gunzip initrd.gz
+ mount -o loop initrd mnt
+
+mkbootdisk --device bootcd.iso --iso 2.6.10-1.770_FC3
+
+http://www.xs4all.nl/~ekonijn/yaird/
--- /dev/null
+#!/bin/sh
+
+# this script finds all binaries and updates them with the ones
+# from your system, in order to maintain them more easily.
+# Be careful. If you have specially made binaries (perhaps lean ones),
+# they will be overwritten.
+
+TOPDIR=`pwd`
+R=roottree
+PATH="/sbin:/bin:/usr/sbin:/usr/bin:$PATH"
+
+
+
+rm -rf $R/sbin
+mkdir -p $R/etc $R/initrd $R/lib $R/mnt $R/mnt/cdrom
+mkdir -p $R/proc $R/root $R/sbin $R/tmp $R/var
+mkdir -p $R/dev $R/sys $R/initrd $R/sysroot
+mkdir -p $R/etc/terminfo $R/etc/terminfo/l
+mkdir -p $R/var/lib $R/var/log $R/var/run $R/var/state
+mkdir -p $R/var/lib/nfs
+mkdir -p $R/var/log/news
+touch $R/var/log/news/news.crit $R/var/log/news/news.err $R/var/log/news.notice
+
+cd $R
+ln -sf sbin bin
+cd $TOPDIR
+
+echo "Building root /sbin. Some Could not find messages are normal ..."
+for file in `cat rootsbin.list` ; do
+ command=`basename $file`
+ fullfile=`which $command 2> /dev/null`
+ if [ x$fullfile != x ] ; then
+# echo "updating $command in roottree with $fullfile"
+ cp -fpd $fullfile $file
+ if [ $? != 0 ] ; then
+ echo "Update failed."
+ exit 1
+ fi
+ strip $file 2>/dev/null
+ else
+ echo "==== Could not find $command on your system ===="
+ rm -f $file
+ fi
+done
+# Special cases
+cd roottree/sbin
+ln -sf halt reboot
+cd $TOPDIR
+
+# Copy all needed shared libraries
+echo "Building root shared libaries ..."
+rm -f `find roottree/lib/ -maxdepth 1 -type f 2>/dev/null`
+#
+# Statically linked binaries create an error
+# message from ldd, so we ignore those
+#
+for lib in `find roottree/sbin/ -type f -exec ldd {} \; | awk '{print $3}' | sort | uniq` ; do
+ if [ -e $lib ] ; then
+ cp -fp $lib roottree/lib/
+ if [ $? != 0 ] ; then
+ echo "Update failed."
+ exit 1
+ fi
+ fi
+done
+strip `find roottree/lib/ -maxdepth 1 -type f` 2>/dev/null
+
+
+cp -p /etc/services roottree/etc/
+if [ $? != 0 ] ; then
+ echo "Update failed."
+ exit 1
+fi
+
+#
+# Get a bunch of stuff from /etc
+#
+echo "Building /etc ..."
+for file in `cat rootetc.list` ; do
+ if [ -e $file ] ; then
+ cp -fp $file roottree/etc/
+ else
+ echo "==== Could not find $file in /etc ===="
+ fi
+done
+if [ -e /etc/modules.conf ] ; then
+ cp -fp /etc/modules.conf roottree/etc/
+fi
+if [ -e /etc/modprobe.conf ] ; then
+ cp -fp /etc/modprobe.conf roottree/etc/
+fi
+rm -rf roottree/etc/pam.d
+if [ -e /etc/pam.d ] ; then
+ cp -a /etc/pam.d roottree/etc/
+ if [ -e /etc/pam.conf ] ; then
+ cp -fp /etc/pam.conf roottree/etc/
+ fi
+fi
+
+if [ -e /etc/init.d ] ; then
+ rm -rf roottree/etc/init.d
+ cp -aL /etc/init.d roottree/etc/
+fi
+
+if [ -e /etc/udev ] ; then
+ rm -rf roottree/etc/udev
+ cp -aL /etc/udev roottree/etc/
+fi
+
+
+if [ -e /etc/ssh ] ; then
+ cp -a /etc/ssh roottree/etc/
+ echo "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
+ echo "!!!! !!!!"
+ echo "!!!! Warning your /etc/ssh directory was copied. !!!!"
+ echo "!!!! Keep this directory and the CDROM secure. !!!!"
+ echo "!!!! !!!!"
+ echo "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
+fi
+if [ -e /etc/security ] ; then
+ cp -a /etc/security roottree/etc/
+fi
+
+#
+# Pull a few files needed by PAM
+#
+if [ -e /lib/libnss_files.so.1 ] ; then
+ cp -fp /lib/libnss_files.so.1 roottree/lib/
+fi
+cp -fp /lib/libnss_files.so.2 roottree/lib/
+cp -a /lib/security roottree/lib/
--- /dev/null
+#!/bin/sh
+
+TOPDIR=`pwd`
+
+# mkdir -p /mnt/loop1 /mnt/loop2
+
+# we need to set aside a few loop devices. I chose (in reverse order of their appearance)
+# -- loop1 for the boot image
+# -- loop2 for the RAM disk image
+# since the loop1 choice is reflected in the lilo.loopfix file,
+# you should not change that (or you need to change the file).
+# I had used loop0 first, but I found that this is used by the Samba daemon.
+# Also, I assume that the mount points are /mnt/loop{1,2}.
+# In principle we could do with one, but it comes in handy to be able to
+# leave one mounted, so I took two different ones.
+
+# Assume that everything to be loaded into memory with the
+# RAM disk image (initrd) is is in the roottree directory.
+
+echo "Creating the Initial RAM disk image.... "
+
+# first find out how much space we need.
+ISIZE=`du -s -k roottree/ | awk '{print $1}'`
+
+# add 2 Meg for extra
+ISIZE=`expr $ISIZE + 2048`
+echo "Initial RAM disk contents will be $ISIZE KB"
+
+# delete the existing RAM disk image, if there is one
+rm -f root
+
+# dd if=/dev/zero of=$TOPDIR/root bs=1k count=$ISIZE
+
+# umount /mnt/loop2 2>/dev/null >/dev/null
+# losetup -d /dev/loop2 2>/dev/null >/dev/null
+
+# # associate it with /dev/loop2
+# losetup /dev/loop2 $TOPDIR/root
+
+# # make an ext2 filesystem on it. Set reserve to 0
+# mke2fs -q -m 0 /dev/loop2 $ISIZE
+# if [ $? != 0 ] ; then
+# echo "Build failed."
+# exit 1
+# fi
+
+# # we mount it...
+# mount /dev/loop2 /mnt/loop2
+
+# # ... and delete the lost+found directory
+# rm -rf /mnt/loop2/lost+found
+
+# # then we copy the contents of our roottree to this filesystem
+# cp -dpR roottree/* /mnt/loop2/
+# if [ $? != 0 ] ; then
+# echo "RAM disk build failed."
+# exit 1
+# fi
+
+# # and unmount and divorce /dev/loop2
+# umount /mnt/loop2
+# losetup -d /dev/loop2
+
+(cd roottree; find . | cpio --quiet -c -o) >root
+
+echo "Building initial RAM disk done"
+
+# Now we have the image of the RAM disk in $TOPDIR/loopfiles/root. We
+# compress this one and write the compressed image to the boot tree:
+
+echo "Compressing the RAM disk image.... "
+
+# delete any existing one
+rm -f cdtree/boot/isolinux/initrd.img
+
+# and gzip our RAM disk image and put it in the right place.
+# gzip -9 -c root >cdtree/boot/isolinux/initrd.img
+gzip -9 < root >cdtree/boot/isolinux/initrd.img
+if [ $? != 0 ] ; then
+ echo "Build failed"
+ exit 1
+fi
+
+rdsize=`expr $ISIZE \* 1024`
+echo "Ramdisk size is $rdsize"
+
+echo "Making isolinux.cfg"
+cat >cdtree/boot/isolinux/isolinux.cfg <<END_OF_DATA
+default linux
+prompt 1
+display boot.msg
+timeout 300
+F1 boot.msg
+F2 options.msg
+F3 general.msg
+F4 kernel.msg
+label linux
+ kernel vmlinuz
+ append ramdisk_size=$rdsize initrd=initrd.img
+label memtest86
+ kernel memtest
+ append -
+END_OF_DATA
+
+# we are done with the RAM disk image, delete it
+rm -f root
+
+echo "Initial RAM disk initrd.img is built."
--- /dev/null
+#! /bin/sh
+
+# This script updates the kernel and modules from your
+# current system.
+#
+
+TOPDIR=`pwd`
+KERNEL=`uname -r`
+KERNEL=2.6.10-1.770_FC3
+
+rm -rf roottree/dev
+tar xfz dev.tar.gz -C roottree
+if [ $? != 0 ] ; then
+ echo "Update failed."
+ exit 1
+fi
+
+#
+# Update modules in root RAM disk
+# Keep kernel directory structure
+#
+echo "Updating modules in root RAM disk"
+rm -rf roottree/lib/modules
+mkdir -p roottree/lib/modules
+cp -af /lib/modules/$KERNEL/ roottree/lib/modules/
+
+kernel="/boot/vmlinuz-$KERNEL"
+echo "Coping $kernel to $TOPDIR/cdtree/boot/isolinux/vmlinuz"
+cp -f $kernel $TOPDIR/cdtree/boot/isolinux/vmlinuz
+if [ $? != 0 ] ; then
+ echo "Could not find kernel. Update failed."
+ exit 1
+fi
+if [ -e /boot/map ] ; then
+ cp -f /boot/map $TOPDIR/cdtree/boot/isolinux/map
+ if [ $? != 0 ] ; then
+ echo "Update failed."
+ exit 1
+ fi
+fi
--- /dev/null
+#!/bin/bash
+
+# mkbootdisk
+#
+# Written by Erik Troan <ewt@redhat.com>
+
+pause=yes
+unset kernel
+device=bootcd.iso
+unset verbose
+unset kernelargs
+unset mountopts
+unset isoimage
+unset realdev
+size=1440
+failed=0
+isoimage=1
+verbose=1
+
+MOUNTDIR=`mktemp -d /tmp/mkbootdisk.XXXXXX`
+PATH=/sbin:$PATH
+export PATH
+
+VERSION=1.5.2
+
+usage () {
+ cat >&2 <<EOF
+usage: `basename $0` [--version] [--noprompt] [--device <devicefile>]
+ [--verbose -v] [--iso] [--kernelargs <args>] [--size <size>] <kernel>
+ (ex: `basename $0` --device /dev/fd1 2.0.31)
+EOF
+ exit $1
+}
+
+while [ $# -gt 0 ]; do
+ case $1 in
+ --device)
+ shift
+ device=$1
+ ;;
+ --kernelargs)
+ shift
+ kernelargs=$1
+ ;;
+ --help)
+ usage 0
+ ;;
+ --iso)
+ isoimage=1
+ ;;
+ --size)
+ shift
+ size=$1
+ ;;
+ --noprompt)
+ unset pause
+ ;;
+ -v)
+ verbose=true
+ ;;
+ --verbose)
+ verbose=true
+ ;;
+ --version)
+ echo "mkbootdisk: version $VERSION"
+ exit 0
+ ;;
+ *)
+ if [ -z "$kernel" ]; then
+ kernel=$1
+ else
+ usage
+ fi
+ ;;
+ esac
+
+ shift
+done
+
+[ -z "$kernel" ] && usage 1
+
+[ -d /lib/modules/$kernel ] || {
+ echo "/lib/modules/$kernel is not a directory." >&2
+ exit 1
+}
+
+[ -f /boot/vmlinuz-$kernel ] || {
+ echo "/boot/vmlinuz-$kernel does not exist." >&2
+ exit 1
+}
+
+
+rootdev=`awk '$1 ~ /^[^#]/ && $2 ~ /^\/$/ { print $1 ; exit }' /etc/fstab`
+
+if [ $(echo $rootdev | cut -c1-6) = "LABEL=" ]; then
+ rootlabel=$(echo $rootdev | cut -c7-)
+
+ # whee, now we have to look through every partition looking for
+ # the thing called $rootlabel, which could be raid. Ick.
+
+ list=$(tail +3 /proc/partitions | awk '{ print $4 '} | grep '^md')
+ list="$list $(tail +3 /proc/partitions |
+ awk '{ print $4 '} | grep -v '^md')"
+ rootdev=""
+ for dev in $list; do
+ if tune2fs -l /dev/$dev >/dev/null 2>/dev/null; then
+ label=$(tune2fs -l /dev/$dev 2>/dev/null |
+ grep "Filesystem volume name" | awk '{print $4}')
+ if [ "$label" = $rootlabel ]; then
+ rootdev=/dev/$dev
+ break
+ fi
+ fi
+ done
+fi
+
+if [ -z "$kernelargs" -a -x /sbin/grubby -a -f /boot/grub/grub.conf ]; then
+ # sed gross... this grep's for the args= line and removes the args=" and "$
+ defkernel=$(grubby --default-kernel)
+ if [ -n "$defkernel" ]; then
+ kernelargs=$(grubby --info "$defkernel" |
+ sed -n '/^args=/{s/^args="//;s/"$//;p;}')
+ fi
+fi
+
+[ -z "$rootdev" ] && {
+ echo 'Cannot find root partition in /etc/fstab.' >&2
+ exit 1
+}
+
+rm -rf $MOUNTDIR
+mkdir $MOUNTDIR || {
+ echo "Failed to create $MOUNTDIR" >&2
+ exit 1
+}
+[ -d $MOUNTDIR ] || {
+ echo "$MOUNTDIR is not a directory!" >&2
+ exit 1
+}
+
+cfgfile=$MOUNTDIR/isolinux/isolinux.cfg
+bootmsg=$MOUNTDIR/isolinux/boot.msg
+
+# create an iso image; the directory is all we need
+[ -n "$verbose" ] && echo -n "Installing isolinux... "
+mkdir $MOUNTDIR/isolinux
+cp /usr/lib/syslinux/isolinux.bin $MOUNTDIR/isolinux
+[ -n "$verbose" ] && echo done
+
+
+BOOTDESTDIR=$MOUNTDIR/isolinux
+
+[ -n "$verbose" ] && echo -n "Copying /boot/vmlinuz-$kernel... "
+cp -p /boot/vmlinuz-$kernel $BOOTDESTDIR/vmlinuz
+[ $? = 0 ] || failed=1
+[ -n "$verbose" ] && echo "done."
+
+[ -n "$verbose" ] && echo -n "Copying /boot/initrd-$kernel.img... "
+if [ -f /boot/initrd-$kernel.img ]; then
+ cp -p /boot/initrd-$kernel.img $BOOTDESTDIR/initrd.img
+fi
+[ $? = 0 ] || failed=1
+[ -n "$verbose" ] && echo "done."
+
+[ -n "$verbose" ] && echo -n "Configuring bootloader... "
+
+[ -f $BOOTDESTDIR/initrd.img ] && INITRDARG="initrd=initrd.img"
+
+if [ $(echo $rootdev | cut -b 6-9) = "loop" ]; then
+ rootdev=$(ls -l $rootdev | sed 's/,//' | awk '{ printf("%02x%02x\n", $5, $6); }')
+fi
+
+cat > $cfgfile <<EOF
+default linux
+prompt 1
+display boot.msg
+timeout 100
+label linux
+ kernel vmlinuz
+ append $INITRDARG $kernelargs root=$rootdev
+EOF
+
+[ $? = 0 ] || failed=1
+
+[ -n "$verbose" ] && echo "append $INITRDARG kernelargs=$kernlargs root=$rootdev"
+
+
+chmod 644 $cfgfile
+
+if [ -f /etc/redhat-release ]; then
+ title="$(sed 's/ release.*$//' < /etc/redhat-release)"
+else
+ title="Red Hat Linux"
+fi
+
+
+cat >> $bootmsg <<EOF
+
+Press <return> (or wait 10 seconds) to boot your $title system from
+$rootdev. You may override the default linux kernel parameters by typing
+"linux <params>", followed by <return> if you like.
+
+EOF
+
+[ $? = 0 ] || failed=1
+
+[ -n "$verbose" ] && echo "done."
+
+mkisofs \
+ -A "Red Hat Linux Boot CD" \
+ -V "Red Hat Linux Boot CD" \
+ -J -R -T -quiet \
+ -o $device \
+ -b isolinux/isolinux.bin -c isolinux/boot.cat -no-emul-boot \
+ -boot-load-size 4 -boot-info-table $MOUNTDIR
+rm -rf $MOUNTDIR/*
+rmdir $MOUNTDIR
+
+
+if [ $failed -eq 1 ]; then
+ exit 1
+else
+ exit 0
+fi
--- /dev/null
+#!/bin/bash
+
+# mkinitrd
+#
+# Written by Erik Troan <ewt@redhat.com>
+#
+# Contributors:
+# Elliot Lee <sopwith@cuc.edu>
+# Miguel de Icaza <miguel@nuclecu.unam.mx>
+# Christian 'Dr. Disk' Hechelmann <drdisk@ds9.au.s.shuttle.de>
+# Michael K. Johnson <johnsonm@redhat.com>
+# Pierre Habraken <Pierre.Habraken@ujf-grenoble.fr>
+# Jakub Jelinek <jakub@redhat.com>
+# Carlo Arenas Belon (carenas@chasqui.lared.net.pe>
+# Keith Owens <kaos@ocs.com.au>
+# Bernhard Rosenkraenzer <bero@redhat.com>
+# Matt Wilson <msw@redhat.com>
+# Trond Eivind Glomsrød <teg@redhat.com>
+# Jeremy Katz <katzj@redhat.com>
+# Preston Brown <pbrown@redhat.com>
+# Bill Nottingham <notting@redhat.com>
+# Guillaume Cottenceau <gc@mandrakesoft.com>
+
+
+PATH=/sbin:/usr/sbin:/bin:/usr/bin:$PATH
+export PATH
+
+VERSION=4.1.18
+
+compress=1
+allowmissing=""
+target="cdtree/boot/isolinux/initrd.img"
+kernel=2.6.10-1.770_FC3
+force=""
+verbose=""
+MODULES=""
+img_vers=""
+builtins=""
+pivot=1
+initramfs="1"
+modulefile=/etc/modules.conf
+rc=0
+
+IMAGESIZE=8000
+PRESCSIMODS="scsi_mod sd_mod unknown"
+fstab="/etc/fstab"
+
+rm -f $target
+if [ -f /etc/udev/udev.conf ]; then
+ USE_UDEV="yes"
+ UDEV_TMPFS="yes"
+ UDEV_KEEP_DEV="yes"
+ . /etc/udev/udev.conf
+ [ -x /sbin/udev.static ] || USE_UDEV=
+fi
+
+usage () {
+ echo "usage: `basename $0` [--version] [-v] [-f] [--preload <module>]" >&2
+ echo " [--omit-scsi-modules] [--omit-raid-modules] [--omit-lvm-modules]" >&2
+ echo " [--with=<module>] [--image-version] [--fstab=<fstab>] [--nocompress]" >&2
+ echo " [--builtin=<module>] [--nopivot] <initrd-image> <kernel-version>" >&2
+ echo "" >&2
+ echo " (ex: `basename $0` /boot/initrd-2.2.5-15.img 2.2.5-15)" >&2
+ exit 1
+}
+
+moduledep() {
+ if [ ! -f "/lib/modules/$kernel/modules.dep" ]; then
+ echo "No dep file found for kernel $kernel" >&2
+ exit 1
+ fi
+
+ [ -n "$verbose" ] && echo -n "Looking for deps of module $1"
+ deps=$(awk 'BEGIN { searched=ARGV[2]; ARGV[2]=""; rc=1 } \
+ function modname(filename) { match(filename, /\/([^\/]+)\.k?o:?$/, ret); return ret[1] } \
+ function show() { if (orig == searched) { print dep; orig=""; rc=0; exit } } \
+ /^\/lib/ { show(); \
+ orig=modname($1); dep=""; \
+ if ($2) { for (i = 2; i <= NF; i++) { dep=sprintf("%s %s", dep, modname($i)); } } } \
+ /^ / { dep=sprintf("%s %s", dep, modname($1)); } \
+ END { show(); exit(rc) }' /lib/modules/$kernel/modules.dep $1)
+ [ -n "$verbose" ] && echo -e "\t$deps"
+}
+
+findmodule() {
+ skiperrors=""
+
+ if [ $1 == "--skiperrors" ]; then
+ skiperrors=--skiperrors
+ shift
+ fi
+
+ local modName=$1
+
+ if [ "$modName" = "off" -o "$modName" = "null" ]; then
+ return
+ fi
+
+ if [ $(echo $modName | cut -b1) = "-" ]; then
+ skiperrors=--skiperrors
+ modName=$(echo $modName | cut -b2-)
+ fi
+
+ if echo $builtins | egrep -q '(^| )'$modName'( |$)' ; then
+ [ -n "$verbose" ] && echo "module $modName assumed to be built in"
+ set +x
+ return
+ fi
+
+ # special cases
+ if [ "$modName" = "i2o_block" ]; then
+ findmodule i2o_core
+ findmodule -i2o_pci
+ modName="i2o_block"
+ elif [ "$modName" = "ppa" ]; then
+ findmodule parport
+ findmodule parport_pc
+ modName="ppa"
+ elif [ "$modName" = "sbp2" ]; then
+ findmodule ieee1394
+ findmodule ohci1394
+ modName="sbp2"
+ else
+ moduledep $modName
+ for i in $deps; do
+ findmodule $i
+ done
+ fi
+
+ for modExt in o.gz o ko ; do
+ if [ -d /lib/modules/$kernel/updates ]; then
+ fmPath=`(cd /lib/modules/$kernel/updates; echo find . -name $modName.$modExt -type f | /sbin/nash --quiet) | /bin/awk {'print $1; exit;'}`
+ fi
+
+ if [ -f /lib/modules/$kernel/updates/$fmPath ]; then
+ fmPath=updates/$fmPath
+ break
+ fi
+
+ fmPath=`(cd /lib/modules/$kernel; echo find . -name $modName.$modExt -type f | /sbin/nash --quiet) | /bin/awk {'print $1; exit;'}`
+ if [ -f /lib/modules/$kernel/$fmPath ]; then
+ break
+ fi
+ done
+
+ if [ ! -f /lib/modules/$kernel/$fmPath ]; then
+ if [ -n "$skiperrors" ]; then
+ return
+ fi
+
+ # ignore the absence of the scsi modules
+ for n in $PRESCSIMODS; do
+ if [ "$n" = "$modName" ]; then
+ return;
+ fi
+ done;
+
+ if [ -n "$allowmissing" ]; then
+ echo "WARNING: No module $modName found for kernel $kernel, continuing anyway" >&2
+ return
+ fi
+
+ echo "No module $modName found for kernel $kernel, aborting." >&2
+ exit 1
+ fi
+
+ # only need to add each module once
+ if ! echo $MODULES | grep -q "$fmPath" 2>/dev/null ; then
+ MODULES="$MODULES $fmPath"
+ fi
+}
+
+inst() {
+ if [ "$#" != "2" ];then
+ echo "usage: inst <file> <destination>"
+ return
+ fi
+ [ -n "$verbose" ] && echo "$1 -> $2"
+ cp $1 $2
+}
+
+while [ $# -gt 0 ]; do
+ case $1 in
+ --fstab*)
+ if echo $1 | grep -q '=' ; then
+ fstab=`echo $1 | sed 's/^--fstab=//'`
+ else
+ fstab=$2
+ shift
+ fi
+ ;;
+
+ --with-usb)
+ withusb=yes
+ ;;
+
+ --with*)
+ if echo $1 | grep -q '=' ; then
+ modname=`echo $1 | sed 's/^--with=//'`
+ else
+ modname=$2
+ shift
+ fi
+
+ basicmodules="$basicmodules $modname"
+ ;;
+
+ --builtin*)
+ if echo $1 | grep -q '=' ; then
+ modname=`echo $1 | sed 's/^--builtin=//'`
+ else
+ modname=$2
+ shift
+ fi
+ builtins="$builtins $modname"
+ ;;
+
+ --version)
+ echo "mkinitrd: version $VERSION"
+ exit 0
+ ;;
+
+ -v)
+ verbose=-v
+ ;;
+
+ --nocompress)
+ compress=""
+ ;;
+
+ --nopivot)
+ pivot=""
+ ;;
+
+ --ifneeded)
+ # legacy
+ ;;
+
+ -f)
+ force=1
+ ;;
+ --preload*)
+ if echo $1 | grep -q '=' ; then
+ modname=`echo $1 | sed 's/^--preload=//'`
+ else
+ modname=$2
+ shift
+ fi
+ PREMODS="$PREMODS $modname"
+ ;;
+ --omit-scsi-modules)
+ PRESCSIMODS=""
+ noscsi=1;
+ ;;
+ --omit-raid-modules)
+ noraid=1;
+ ;;
+ --omit-lvm-modules)
+ nolvm=1
+ ;;
+ --image-version)
+ img_vers=yes
+ ;;
+ --noudev)
+ USE_UDEV=
+ ;;
+ --allow-missing)
+ allowmissing=yes
+ ;;
+ *)
+ if [ -z "$target" ]; then
+ target=$1
+ elif [ -z "$kernel" ]; then
+ kernel=$1
+ else
+ usage
+ fi
+ ;;
+ esac
+
+ shift
+done
+
+if [ -z "$target" -o -z "$kernel" ]; then
+ usage
+fi
+
+if [ -n "$img_vers" ]; then
+ target="$target-$kernel"
+fi
+
+if [ -z "$force" -a -f $target ]; then
+ echo "$target already exists." >&2
+ exit 1
+fi
+
+if [ ! -d /lib/modules/$kernel ]; then
+ echo "/lib/modules/$kernel is not a directory." >&2
+ exit 1
+fi
+
+if [ $UID != 0 ]; then
+ echo "mkinitrd must be run as root"
+ exit 1
+fi
+
+kernelmajor=`echo $kernel | cut -d . -f 1,2`
+
+if [ "$kernelmajor" == "2.4" ]; then
+ if [ -n "$verbose" ]; then echo "Creating old-style initrd"; fi
+ USE_UDEV=
+else
+ if [ -n "$verbose" ]; then echo "Creating initramfs"; fi
+ modulefile=/etc/modprobe.conf
+ initramfs=1
+ pivot=""
+fi
+
+# if we're not using udev, don't set any of the other bits
+[ -z "$USE_UDEV" ] && UDEV_TMPFS= && UDEV_KEEP_DEV=
+
+# find a temporary directory which doesn't use tmpfs
+TMPDIR=""
+for t in /tmp /var/tmp /root ${PWD}; do
+ if [ ! -d $t ]; then continue; fi
+ if ! echo access -w $t | /sbin/nash --quiet; then continue; fi
+
+ fs=$(df -T $t 2>/dev/null | awk '{line=$1;} END {printf $2;}')
+ if [ "$fs" != "tmpfs" ]; then
+ TMPDIR=$t
+ break
+ fi
+done
+
+if [ -z "$TMPDIR" ]; then
+ echo "no temporary directory could be found" >&2
+ exit 1
+fi
+
+if [ $TMPDIR = "/root" -o $TMPDIR = "${PWD}" ]; then
+ echo "WARNING: using $TMPDIR for temporary files" >&2
+fi
+
+for n in $PREMODS; do
+ findmodule $n
+done
+
+needusb=""
+if [ -n "$withusb" ]; then
+ # If / or /boot is on a USB device include the driver. With root by
+ # label we could still get some odd behaviors
+ for fs in / /boot ; do
+ esc=$(echo $fs | sed 's,/,\\/,g')
+ dev=$(mount | awk "/ on ${esc} / { print \$1 }" | sed 's/[0-9]*$//' | cut -d/ -f3)
+ if [ "$(echo $dev | cut -c1-2)" = sd ]; then
+ if [ `which kudzu 2>/dev/null` ]; then
+ host=$(kudzu --probe -b scsi |
+ gawk '/^device: '${dev}'/,/^host:/ { if (/^host/) { print $2; exit; } }')
+ if [ -d /proc/scsi/usb-storage-${host} -o -f /proc/scsi/usb-storage/${host} ]; then
+ needusb=1
+ fi
+ fi
+ fi
+ done
+fi
+
+if [ -n "$needusb" ]; then
+ drivers=$(awk '/^alias[[:space:]]+usb-controller[0-9]* / { print $3}' < $modulefile)
+ if [ -n "$drivers" ]; then
+ for driver in $drivers; do
+ findmodule $driver
+ done
+ findmodule scsi_mod
+ findmodule sd_mod
+ findmodule usb-storage
+ fi
+fi
+
+if [ -z "$noscsi" ]; then
+ if [ ! -f $modulefile ]; then
+ modulefile=/etc/conf.modules
+ fi
+
+ if [ -f $modulefile ]; then
+ scsimodules=`grep "alias[[:space:]]\+scsi_hostadapter" $modulefile | grep -v '^[ ]*#' | LC_ALL=C sort -u | awk '{ print $3 }'`
+
+ if [ -n "$scsimodules" ]; then
+ for n in $PRESCSIMODS; do
+ findmodule $n
+ done
+
+ for n in $scsimodules; do
+ # for now allow scsi modules to come from anywhere. There are some
+ # RAID controllers with drivers in block/
+ findmodule $n
+ done
+ fi
+ fi
+fi
+
+# If we have ide devices and module ide, do the right thing
+ide=/proc/ide/ide*
+if [ -n "$ide" ]; then
+ findmodule -ide-disk
+fi
+
+# If we use LVM, include lvm-mod
+if [ -z "$nolvm" ]; then
+ if [ -f /proc/lvm/global ]; then
+ if grep -q '^VG:' /proc/lvm/global ; then
+ if [ "$kernelmajor" == "2.4" ]; then
+ findmodule -lvm-mod
+ else
+ findmodule -dm-mod
+ fi
+ fi
+ fi
+
+ if [ -x /sbin/dmsetup -a -e /dev/mapper/control ]; then
+ dmout=$(/sbin/dmsetup ls 2>/dev/null)
+ if [ "$dmout" != "No devices found" -a "$dmout" != "" ]; then
+ findmodule -dm-mod
+ fi
+ fi
+fi
+
+# If we have dasd devices, include the necessary modules (S/390)
+if [ -d /proc/dasd ]; then
+ findmodule -dasd_mod
+ findmodule -dasd_eckd_mod
+ findmodule -dasd_fba_mod
+fi
+
+if [ -z "$noraid" -a -f /proc/mdstat ]; then
+ # load appropriate raid devices if necessary -- we'll load whatever
+ # /proc/mdstat suggests
+
+ # note that the awk below contains a space and a tab
+ for level in $(awk '/^md[0-9][0-9]*[ ]*:/ { print $4 }' \
+ /proc/mdstat | sort -u); do
+ case $level in
+ linear)
+ findmodule linear
+ startraid=1
+ ;;
+ multipath)
+ findmodule multipath
+ startraid=1
+ ;;
+ raid[01456])
+ findmodule $level
+ startraid=1
+ ;;
+ *)
+ echo "raid level $level (in /proc/mdstat) not recognized" >&2
+ ;;
+ esac
+ done
+
+ if [ -n "$startraid" ]; then
+ raiddevices=$(awk '/^md[0-9][0-9]*[ ]*:/ { print $1 }' \
+ /proc/mdstat | sort)
+ fi
+fi
+
+# check to see if we need to set up a loopback filesystem
+rootdev=$(awk '/^[ \t]*[^#]/ { if ($2 == "/") { print $1; }}' $fstab)
+if echo $rootdev | cut -d/ -f3 | grep -q loop ; then
+ key="^# $(echo $rootdev | cut -d/ -f3 | tr '[a-z]' '[A-Z]'):"
+ if ! grep "$key" $fstab > /dev/null; then
+ echo "The root filesystem is on a $rootdev, but there is no magic entry in $fstab" 1>&2
+ echo "for this device. Consult the mkinitrd man page for more information" 2>&2
+ exit 1
+ fi
+
+ line=$(grep "$key" $fstab)
+ loopDev=$(echo $line | awk '{print $3}')
+ loopFs=$(echo $line | awk '{print $4}')
+ loopFile=$(echo $line | awk '{print $5}')
+
+ basicmodules="$basicmodules -loop"
+ if [ "$loopFs" = "vfat" -o "$loopFs" = "msdos" ]; then
+ basicmodules="$basicmodules -fat"
+ fi
+ basicmodules="$basicmodules -${loopFs}"
+# check if the root fs is on a logical volume
+elif ! echo $rootdev | cut -c1-6 |grep -q "LABEL=" ; then
+ rootdev=$(echo "readlink $rootdev" | /sbin/nash --quiet)
+ major=`ls -l $rootdev | sed -e "s/.* \\([0-9]\+\\), *[0-9]\+.*/\\1/"`
+ [ "$major" != "58" ] || root_lvm=1
+ if echo $rootdev |grep -q /dev/mapper 2>/dev/null ; then root_lvm=1 ; fi
+fi
+
+rootfs=$(awk '{ if ($1 !~ /^[ \t]*#/ && $2 == "/") { print $3; }}' $fstab)
+rootopts=$(awk '{ if ($1 !~ /^[ \t]*#/ && $2 == "/") { print $4; }}' $fstab)
+
+# in case the root filesystem is modular
+findmodule -${rootfs}
+
+if [ -n "$root_lvm" ]; then
+ if [ "$kernelmajor" == "2.4" ]; then
+ findmodule -lvm-mod
+ else
+ findmodule -dm-mod
+ # DM requires all of these to be there in case someone used the
+ # feature. broken. (#132001)
+ findmodule -dm-mirror
+ findmodule -dm-zero
+ findmodule -dm-snapshot
+ fi
+fi
+
+for n in $basicmodules; do
+ findmodule $n
+done
+
+if [ -n "$verbose" ]; then
+ echo "Using modules: $MODULES"
+fi
+
+
+MNTIMAGE=roottree
+IMAGE=root
+RCFILE=$MNTIMAGE/init
+
+if [ -z "$MNTIMAGE" -o -z "$IMAGE" ]; then
+ echo "Error creating temporaries. Try again" >&2
+ exit 1
+fi
+
+mkdir -p $MNTIMAGE
+mkdir -p $MNTIMAGE/lib
+mkdir -p $MNTIMAGE/bin
+mkdir -p $MNTIMAGE/etc
+mkdir -p $MNTIMAGE/dev
+mkdir -p $MNTIMAGE/loopfs
+mkdir -p $MNTIMAGE/proc
+mkdir -p $MNTIMAGE/sys
+mkdir -p $MNTIMAGE/sysroot
+ln -s bin $MNTIMAGE/sbin
+
+inst /sbin/nash "$MNTIMAGE/bin/nash"
+inst /sbin/insmod.static "$MNTIMAGE/bin/insmod"
+ln -s /sbin/nash $MNTIMAGE/sbin/modprobe
+
+if [ -n "$USE_UDEV" ]; then
+ inst /sbin/udev.static $MNTIMAGE/sbin/udev
+ ln -s udev $MNTIMAGE/sbin/udevstart
+ mkdir -p $MNTIMAGE/etc/udev
+ inst /etc/udev/udev.conf $MNTIMAGE/etc/udev/udev.conf
+ ln -s /sbin/nash $MNTIMAGE/sbin/hotplug
+fi
+
+for MODULE in $MODULES; do
+ if [ -x /usr/bin/strip ]; then
+ /usr/bin/strip -g $verbose /lib/modules/$kernel/$MODULE -o $MNTIMAGE/lib/$(basename $MODULE)
+ else
+ cp $verbose -a /lib/modules/$kernel/$MODULE $MNTIMAGE/lib
+ fi
+done
+
+# mknod'ing the devices instead of copying them works both with and
+# without devfs...
+mknod $MNTIMAGE/dev/console c 5 1
+mknod $MNTIMAGE/dev/null c 1 3
+mknod $MNTIMAGE/dev/ram b 1 1
+mknod $MNTIMAGE/dev/systty c 4 0
+for i in 1 2 3 4; do
+ mknod $MNTIMAGE/dev/tty$i c 4 $i
+done
+
+# FIXME -- this won't work if you're using devfs
+if [ -n "$root_lvm" -a "$kernelmajor" == "2.4" ]; then
+ pvs=$(/sbin/pvscan | grep " PV " | /bin/awk {'print $5;'} |sed 's/"//g')
+ for pv in $pvs; do
+ cp $verbose --parents -a $pv $MNTIMAGE/
+ done
+
+ inst /sbin/vgwrapper "$MNTIMAGE/bin/vgwrapper"
+ ln "$MNTIMAGE/bin/vgwrapper" "$MNTIMAGE/bin/vgscan"
+ ln "$MNTIMAGE/bin/vgwrapper" "$MNTIMAGE/bin/vgchange"
+
+ mknod $MNTIMAGE/dev/lvm b 109 0
+fi
+
+if [ -n "$root_lvm" -a "$kernelmajor" == "2.6" ]; then
+ inst /sbin/lvm.static "$MNTIMAGE/bin/lvm"
+ if [ -f /etc/lvm/lvm.conf ]; then
+ cp $verbose --parents /etc/lvm/lvm.conf $MNTIMAGE/
+ fi
+fi
+
+echo "#!/bin/nash" > $RCFILE
+echo "" >> $RCFILE
+
+echo "mount -t proc /proc /proc" >> $RCFILE
+echo "setquiet" >> $RCFILE
+echo "echo Mounted /proc filesystem" >> $RCFILE
+
+if [ "$kernelmajor" != "2.4" ]; then
+ echo "echo Mounting sysfs" >> $RCFILE
+ echo "mount -t sysfs none /sys" >> $RCFILE
+fi
+
+if [ -n "$USE_UDEV" ]; then
+ if [ -n "$UDEV_TMPFS" ]; then
+ cat >> $RCFILE <<EOF
+echo Creating /dev
+mount -o mode=0755 -t tmpfs none /dev
+mknod /dev/console c 5 1
+mknod /dev/null c 1 3
+mknod /dev/zero c 1 5
+mkdir /dev/pts
+mkdir /dev/shm
+EOF
+ fi
+ cat >> $RCFILE <<EOF
+echo Starting udev
+/sbin/udevstart
+echo -n "/sbin/hotplug" > /proc/sys/kernel/hotplug
+EOF
+fi
+
+for MODULE in $MODULES; do
+ text=""
+ module=`echo $MODULE | sed "s|.*/||" | sed "s/.k\?o$//"`
+ fullmodule=`echo $MODULE | sed "s|.*/||"`
+
+ options=`sed -n -e "s/^options[ ][ ]*$module[ ][ ]*//p" $modulefile 2>/dev/null`
+
+ if [ -n "$verbose" ]; then
+ if [ -n "$options" ]; then
+ text=" with options $options"
+ fi
+ echo "Loading module $module$text"
+ fi
+ echo "echo \"Loading $fullmodule module\"" >> $RCFILE
+ echo "insmod /lib/$fullmodule $options" >> $RCFILE
+
+ # Hack - we need a delay after loading usb-storage to give things
+ # time to settle down before we start looking a block devices
+ if [ "$module" = "usb-storage" ]; then
+ echo "sleep 5" >> $RCFILE
+ fi
+ if [ "$module" = "zfcp" -a -f /etc/zfcp.conf ]; then
+ echo "sleep 2" >> $RCFILE
+ cat /etc/zfcp.conf | grep -v "^#" | tr "A-Z" "a-z" | while read DEVICE SCSIID WWPN SCSILUN FCPLUN; do
+ echo "echo -n $WWPN > /sys/bus/ccw/drivers/zfcp/${DEVICE/0x/}/port_add" >>$RCFILE
+ echo "echo -n $FCPLUN > /sys/bus/ccw/drivers/zfcp/${DEVICE/0x/}/$WWPN/unit_add" >>$RCFILE
+ echo "echo -n 1 > /sys/bus/ccw/drivers/zfcp/${DEVICE/0x/}/online" >>$RCFILE
+ done
+ fi
+done
+
+# HACK: module loading + device creation isn't necessarily synchronous...
+# this will make sure that we have all of our devices before trying
+# things like RAID or LVM
+if [ -n "$USE_UDEV" ]; then
+ echo "/sbin/udevstart" >> $RCFILE
+fi
+
+if [ -n "$startraid" ]; then
+ for dev in $raiddevices; do
+ cp -a /dev/${dev} $MNTIMAGE/dev
+ echo "raidautorun /dev/${dev}" >> $RCFILE
+ done
+fi
+
+if [ -z "$USE_UDEV" ]; then
+ echo "echo Creating block devices" >> $RCFILE
+ echo "mkdevices /dev" >> $RCFILE
+fi
+
+if [ -n "$loopDev" ]; then
+ mkdir /initrd
+ cp -a $loopDev $MNTIMAGE/dev
+ cp -a $rootdev $MNTIMAGE/dev
+ echo "echo Mounting device containing loopback root filesystem" >> $RCFILE
+ echo "mount -t $loopFs $loopDev /loopfs" >> $RCFILE
+ echo "echo Setting up loopback device $rootdev" >> $RCFILE
+ echo "losetup $rootdev /loopfs$loopFile" >> $RCFILE
+elif [ -n "$root_lvm" ]; then
+ if [ "$kernelmajor" == "2.4" ]; then
+ echo "echo Scanning logical volumes" >> $RCFILE
+ echo "vgscan" >> $RCFILE
+ echo "echo Activating logical volumes" >> $RCFILE
+ echo "vgchange -ay" >> $RCFILE
+ else
+ echo "echo Making device-mapper control node" >> $RCFILE
+ echo "mkdmnod" >> $RCFILE
+ echo "echo Scanning logical volumes" >> $RCFILE
+ echo "lvm vgscan" >> $RCFILE
+ echo "echo Activating logical volumes" >> $RCFILE
+ echo "lvm vgchange -ay" >> $RCFILE
+ echo "echo Making device nodes" >> $RCFILE
+ echo "lvm vgmknodes" >> $RCFILE
+ fi
+fi
+
+echo "echo Creating root device" >> $RCFILE
+echo "mkrootdev /dev/root" >> $RCFILE
+rootdev=/dev/root
+
+if [ "$kernelmajor" != "2.4" ]; then
+ echo "umount /sys" >> $RCFILE
+fi
+
+if [ -n "$initramfs" ]; then
+ echo "echo Mounting root filesystem" >> $RCFILE
+ echo "mount -o $rootopts --ro -t $rootfs $rootdev /sysroot" >> $RCFILE
+
+ [ -n "$UDEV_KEEP_DEV" ] && echo "mount -t tmpfs --bind /dev /sysroot/dev" >> $RCFILE
+
+ echo "echo Switching to new root" >> $RCFILE
+ echo "switchroot /sysroot" >> $RCFILE
+else
+ if [ -n "$pivot" ]; then
+ echo "echo 0x0100 > /proc/sys/kernel/real-root-dev" >> $RCFILE
+
+ echo "echo Mounting root filesystem" >> $RCFILE
+ echo "mount -o $rootopts --ro -t $rootfs $rootdev /sysroot" >> $RCFILE
+
+ echo "pivot_root /sysroot /sysroot/initrd" >> $RCFILE
+ echo "umount /initrd/proc" >> $RCFILE
+ else
+ echo "umount /proc" >> $RCFILE
+ fi
+fi
+
+[ -n "$UDEV_TMPFS" ] && echo "umount /initrd/dev" >> $RCFILE
+chmod +x $RCFILE
+
+ (cd $MNTIMAGE; find . | cpio --quiet -c -o) > $IMAGE || exit 1
+
+if [ -n "$compress" ]; then
+ gzip -9 < $IMAGE > $target || rc=1
+else
+ cp -a $IMAGE $target || rc=1
+fi
+
+exit $rc
--- /dev/null
+/etc/bashrc
+/etc/exports
+/etc/gshadow
+/etc/shadow
+/etc/passwd
+/etc/group
+/etc/hosts
+/etc/filesystems
+/etc/fstab
+/etc/protocols
+/etc/localtime
+/etc/ld.so.cache
+/etc/syslog.conf
--- /dev/null
+/etc/bashrc
+/etc/exports
+/etc/gshadow
+/etc/shadow
+/etc/passwd
+/etc/group
+/etc/hosts
+/etc/filesystems
+/etc/fstab
+/etc/protocols
+/etc/localtime
+/etc/ld.so.cache
+/etc/syslog.conf
--- /dev/null
+roottree/sbin/arp
+roottree/sbin/ash
+roottree/sbin/awk
+roottree/sbin/badblocks
+roottree/sbin/basename
+roottree/sbin/bash
+roottree/sbin/bunzip2
+roottree/sbin/bzip2
+roottree/sbin/cat
+roottree/sbin/cdrecord
+roottree/sbin/chattr
+roottree/sbin/chgrp
+roottree/sbin/chkconfig
+roottree/sbin/chmod
+roottree/sbin/chown
+roottree/sbin/chroot
+roottree/sbin/clear
+roottree/sbin/consoletype
+roottree/sbin/cp
+roottree/sbin/cut
+roottree/sbin/date
+roottree/sbin/dd
+roottree/sbin/debugfs
+roottree/sbin/df
+roottree/sbin/dhclient
+roottree/sbin/dhcpd
+roottree/sbin/diff
+roottree/sbin/dig
+roottree/sbin/dmesg
+roottree/sbin/dosfsck
+roottree/sbin/du
+roottree/sbin/dump
+roottree/sbin/e2fsck
+roottree/sbin/egrep
+roottree/sbin/eject
+roottree/sbin/false
+roottree/sbin/fdisk
+roottree/sbin/fgrep
+roottree/sbin/file
+roottree/sbin/find
+roottree/sbin/findfs
+roottree/sbin/free
+roottree/sbin/fsck
+roottree/sbin/fsck.cramfs
+roottree/sbin/fsck.ext2
+roottree/sbin/fsck.ext3
+roottree/sbin/fsck.jfs
+roottree/sbin/fsck.msdos
+roottree/sbin/fsck.vfat
+roottree/sbin/ftp
+roottree/sbin/gdb
+roottree/sbin/getkey
+roottree/sbin/grep
+roottree/sbin/grub
+roottree/sbin/gunzip
+roottree/sbin/gzip
+roottree/sbin/halt
+roottree/sbin/hdparm
+roottree/sbin/head
+roottree/sbin/hostname
+roottree/sbin/hotplug
+roottree/sbin/id
+roottree/sbin/ifconfig
+roottree/sbin/init
+roottree/sbin/insmod
+roottree/sbin/insmod.static
+roottree/sbin/ipcalc
+roottree/sbin/kill
+roottree/sbin/killall
+roottree/sbin/killall5
+roottree/sbin/klogd
+roottree/sbin/last
+roottree/sbin/ldd
+roottree/sbin/less
+roottree/sbin/lilo
+roottree/sbin/ln
+roottree/sbin/loadkeys
+roottree/sbin/login
+roottree/sbin/losetup
+roottree/sbin/ls
+roottree/sbin/lsmod
+roottree/sbin/lsof
+roottree/sbin/lspci
+roottree/sbin/lsusb
+roottree/sbin/ltrace
+roottree/sbin/mail
+roottree/sbin/md5sum
+roottree/sbin/mgetty
+roottree/sbin/mingetty
+roottree/sbin/mkbootdisk
+roottree/sbin/mkdir
+roottree/sbin/mkdosfs
+roottree/sbin/mke2fs
+roottree/sbin/mkfs
+roottree/sbin/mkfs.cramfs
+roottree/sbin/mkfs.ext2
+roottree/sbin/mkfs.ext3
+roottree/sbin/mkfs.jfs
+roottree/sbin/mkfs.msdos
+roottree/sbin/mkfs.vfat
+roottree/sbin/mkinitrd
+roottree/sbin/mkisofs
+roottree/sbin/mknod
+roottree/sbin/mkreiserfs
+roottree/sbin/mkswap
+roottree/sbin/modinfo
+roottree/sbin/mktemp
+roottree/sbin/modprobe
+roottree/sbin/more
+roottree/sbin/mount
+roottree/sbin/mt
+roottree/sbin/mv
+roottree/sbin/nash
+roottree/sbin/netstat
+roottree/sbin/nice
+roottree/sbin/nm
+roottree/sbin/nmap
+roottree/sbin/nologin
+roottree/sbin/od
+roottree/sbin/passwd
+roottree/sbin/ping
+roottree/sbin/portmap
+roottree/sbin/printenv
+roottree/sbin/ps
+roottree/sbin/pwd
+roottree/sbin/raidstart
+roottree/sbin/reboot
+roottree/sbin/reiserfsck
+roottree/sbin/rm
+roottree/sbin/rmt
+roottree/sbin/rmdir
+roottree/sbin/rmmod
+roottree/sbin/route
+roottree/sbin/rpc.lockd
+roottree/sbin/rpc.statd
+roottree/sbin/runlevel
+roottree/sbin/scp
+roottree/sbin/script
+roottree/sbin/scsi_info
+roottree/sbin/sfdisk
+roottree/sbin/sh
+roottree/sbin/shutdown
+roottree/sbin/sleep
+roottree/sbin/sort
+roottree/sbin/ssh
+roottree/sbin/ssh-keygen
+roottree/sbin/strace
+roottree/sbin/strings
+roottree/sbin/stty
+roottree/sbin/su
+roottree/sbin/swapoff
+roottree/sbin/swapon
+roottree/sbin/sync
+roottree/sbin/sysctl
+roottree/sbin/syslogd
+roottree/sbin/tail
+roottree/sbin/tar
+roottree/sbin/telinit
+roottree/sbin/test
+roottree/sbin/top
+roottree/sbin/touch
+roottree/sbin/tput
+roottree/sbin/true
+roottree/sbin/tune2fs
+roottree/sbin/udev
+roottree/sbin/udevstart
+roottree/sbin/umount
+roottree/sbin/uname
+roottree/sbin/usleep
+roottree/sbin/vi
+roottree/sbin/w
+roottree/sbin/which
+roottree/sbin/who
+roottree/sbin/whoami
+roottree/sbin/zcat
--- /dev/null
+roottree/sbin/arp
+roottree/sbin/ash
+roottree/sbin/awk
+roottree/sbin/badblocks
+roottree/sbin/basename
+roottree/sbin/bash
+roottree/sbin/bunzip2
+roottree/sbin/bzip2
+roottree/sbin/cat
+roottree/sbin/cdrecord
+roottree/sbin/chattr
+roottree/sbin/chgrp
+roottree/sbin/chkconfig
+roottree/sbin/chmod
+roottree/sbin/chown
+roottree/sbin/chroot
+roottree/sbin/clear
+roottree/sbin/consoletype
+roottree/sbin/cp
+roottree/sbin/cut
+roottree/sbin/date
+roottree/sbin/dd
+roottree/sbin/debugfs
+roottree/sbin/df
+roottree/sbin/dhclient
+roottree/sbin/dhcpd
+roottree/sbin/diff
+roottree/sbin/dig
+roottree/sbin/dmesg
+roottree/sbin/dosfsck
+roottree/sbin/du
+roottree/sbin/dump
+roottree/sbin/e2fsck
+roottree/sbin/egrep
+roottree/sbin/eject
+roottree/sbin/false
+roottree/sbin/fdisk
+roottree/sbin/fgrep
+roottree/sbin/file
+roottree/sbin/find
+roottree/sbin/findfs
+roottree/sbin/free
+roottree/sbin/fsck
+roottree/sbin/fsck.cramfs
+roottree/sbin/fsck.ext2
+roottree/sbin/fsck.ext3
+roottree/sbin/fsck.jfs
+roottree/sbin/fsck.msdos
+roottree/sbin/fsck.vfat
+roottree/sbin/ftp
+roottree/sbin/gdb
+roottree/sbin/getkey
+roottree/sbin/grep
+roottree/sbin/grub
+roottree/sbin/gunzip
+roottree/sbin/gzip
+roottree/sbin/halt
+roottree/sbin/hdparm
+roottree/sbin/head
+roottree/sbin/hostname
+roottree/sbin/hotplug
+roottree/sbin/id
+roottree/sbin/ifconfig
+roottree/sbin/init
+roottree/sbin/insmod
+roottree/sbin/insmod.static
+roottree/sbin/ipcalc
+roottree/sbin/kill
+roottree/sbin/killall
+roottree/sbin/killall5
+roottree/sbin/klogd
+roottree/sbin/last
+roottree/sbin/ldd
+roottree/sbin/less
+roottree/sbin/lilo
+roottree/sbin/ln
+roottree/sbin/loadkeys
+roottree/sbin/login
+roottree/sbin/losetup
+roottree/sbin/ls
+roottree/sbin/lsmod
+roottree/sbin/lsof
+roottree/sbin/lspci
+roottree/sbin/lsusb
+roottree/sbin/ltrace
+roottree/sbin/mail
+roottree/sbin/md5sum
+roottree/sbin/mgetty
+roottree/sbin/mingetty
+roottree/sbin/mkbootdisk
+roottree/sbin/mkdir
+roottree/sbin/mkdosfs
+roottree/sbin/mke2fs
+roottree/sbin/mkfs
+roottree/sbin/mkfs.cramfs
+roottree/sbin/mkfs.ext2
+roottree/sbin/mkfs.ext3
+roottree/sbin/mkfs.jfs
+roottree/sbin/mkfs.msdos
+roottree/sbin/mkfs.vfat
+roottree/sbin/mkinitrd
+roottree/sbin/mkisofs
+roottree/sbin/mknod
+roottree/sbin/mkreiserfs
+roottree/sbin/mkswap
+roottree/sbin/modinfo
+roottree/sbin/mktemp
+roottree/sbin/modprobe
+roottree/sbin/more
+roottree/sbin/mount
+roottree/sbin/mt
+roottree/sbin/mv
+roottree/sbin/nash
+roottree/sbin/netstat
+roottree/sbin/nice
+roottree/sbin/nm
+roottree/sbin/nmap
+roottree/sbin/nologin
+roottree/sbin/od
+roottree/sbin/passwd
+roottree/sbin/ping
+roottree/sbin/portmap
+roottree/sbin/printenv
+roottree/sbin/ps
+roottree/sbin/pwd
+roottree/sbin/raidstart
+roottree/sbin/reboot
+roottree/sbin/reiserfsck
+roottree/sbin/rm
+roottree/sbin/rmt
+roottree/sbin/rmdir
+roottree/sbin/rmmod
+roottree/sbin/route
+roottree/sbin/rpc.lockd
+roottree/sbin/rpc.statd
+roottree/sbin/runlevel
+roottree/sbin/scp
+roottree/sbin/script
+roottree/sbin/scsi_info
+roottree/sbin/sfdisk
+roottree/sbin/sh
+roottree/sbin/shutdown
+roottree/sbin/sleep
+roottree/sbin/sort
+roottree/sbin/ssh
+roottree/sbin/ssh-keygen
+roottree/sbin/strace
+roottree/sbin/strings
+roottree/sbin/stty
+roottree/sbin/su
+roottree/sbin/swapoff
+roottree/sbin/swapon
+roottree/sbin/sync
+roottree/sbin/sysctl
+roottree/sbin/syslogd
+roottree/sbin/tail
+roottree/sbin/tar
+roottree/sbin/telinit
+roottree/sbin/test
+roottree/sbin/top
+roottree/sbin/touch
+roottree/sbin/tput
+roottree/sbin/true
+roottree/sbin/tune2fs
+roottree/sbin/udev
+roottree/sbin/udevstart
+roottree/sbin/umount
+roottree/sbin/uname
+roottree/sbin/usleep
+roottree/sbin/vi
+roottree/sbin/w
+roottree/sbin/which
+roottree/sbin/who
+roottree/sbin/whoami
+roottree/sbin/zcat
--- /dev/null
+var
+tmp
+sbin
+proc
+mnt
+lib
+initrd
+dev
+cdrom
+bacula-rufus
--- /dev/null
+
+This directory contains the root directory structure that will
+be loaded once Linux is in memory and the CDROM has been detected.
+It is loaded as a RAM disk and replaces the initrd. It is in fact a
+quite complete set of commands, and you can quite liberally add to
+it. Do so by adding the files you want to either rootsbin.list (note
+/bin and /sbin are in the same directory).
+
+Quite a few files will be added to this directory automatically either
+by the makekernel script or by the makebinaries script. Be a bit
+careful about what files you add to /etc as it is somewhat tailored to
+be a streamlined boot process. In fact, the normal RedHat files in
+rc.d, ... are probably not there -- it is rather simplified and reminiscent
+of an old Unix system.
--- /dev/null
+init.d
+terminfo
+ssh
+shadow
+security
+passwd
+pam.d
+ld.so.cache
+gshadow
+group
+protocols
+services
+syslog.conf
--- /dev/null
+#
+# inittab This file describes how the INIT process should set up
+# the system in a certain run-level.
+#
+# Author: Miquel van Smoorenburg, <miquels@drinkel.nl.mugnet.org>
+# Modified for RHS Linux by Marc Ewing and Donnie Barnes
+#
+
+# Default runlevel. The runlevels used by RHS are:
+# 0 - halt (Do NOT set initdefault to this)
+# 1 - Single user mode
+# 2 - Multiuser, without NFS (The same as 3, if you do not have networking)
+# 3 - Full multiuser mode
+# 4 - unused
+# 5 - X11
+# 6 - reboot (Do NOT set initdefault to this)
+#
+id:2:initdefault:
+
+# System initialization.
+si::sysinit:/etc/sysinit
+
+#shutdown
+l0:0:wait:/sbin/halt -fd
+
+# normal run levels
+l1:1:wait:/bin/bash -i -l
+l2:2:wait:/etc/rc.d/rc 2
+l3:3:wait:/etc/rc.d/rc 3
+l4:4:wait:/etc/rc.d/rc 4
+l5:5:wait:/etc/rc.d/rc 5
+
+# reboot
+l6:6:wait:/sbin/reboot -fd
+
+# Trap CTRL-ALT-DELETE
+ca::ctrlaltdel:/sbin/halt -d
+
+
+# Run gettys in standard runlevels
+1:2345:respawn:/sbin/mingetty tty1
+2:2345:respawn:/sbin/mingetty tty2
+3:2345:respawn:/sbin/mingetty tty3
+4:2345:respawn:/sbin/mingetty tty4
+5:2345:respawn:/sbin/mingetty tty5
--- /dev/null
+
+Welcome to the Bacula Rescue CDROM
+
+\r \v
+
+Please login using root and your root password ...
--- /dev/null
+Czech cs lat2-sun16 iso02 cs_CZ cz-lat2 Europe/Prague
+English en None None en_US us America/New_York
+Danish da lat0-sun16 iso15 da_DK us Europe/Copenhagen
+French fr None None fr_FR fr-latin1 Europe/Paris
+German de None None de_DE de-latin1 Europe/Berlin
+Hungarian hu lat2-sun16 iso02 hu_HU hu Europe/Budapest
+Icelandic is lat0-sun16 iso15 is_IS is-latin1 Atlantic/Reykjavik
+Italian it lat0-sun16 iso15 it_IT it Europe/Rome
+Norwegian no lat0-sun16 iso15 no_NO no-latin1 Europe/Oslo
+Romanian ro lat2-sun16 iso02 ro_RO ro Europe/Bucharest
+Russian ru cyr-sun16 koi8-r ru_RU.KOI8-R ru Europe/Moscow
+Serbian sr cyr-sun16 iso05 sr_YU us Europe/Belgrade
+Slovak sk lat2-sun16 iso02 sk_SK sk-qwerty Europe/Bratislava
+Slovenian sl lat2-sun16 iso02 sl_SI slovene Europe/Ljubljana
+Spanish es None None es_ES es Europe/Madrid
+Swedish sv lat0-sun16 iso15 sv_SE se-latin1 Europe/Stockholm
+Turkish tr lat5-sun16 iso09 tr_TR trq Europe/Istanbul
+Ukrainian uk cyr-sun16 koi8-u uk_UA.KOI8-U uk Europe/Kiev
--- /dev/null
+boot=/dev/hda
+map=/bdisk/boot/map
+install=/bdisk/boot/boot.b
+backup=/dev/null
+prompt
+timeout=300
+default=linux
+
+image=/boot/vmlinuz
+ label=linux
+ read-only
+ root=/dev/hda1
+
--- /dev/null
+#! /bin/sh
+#
+# Attempt to load the ethernet card module
+#
+
+XPWD=`pwd`
+cd /lib/modules/*/kernel/drivers/net
+
+echo "Finding network module"
+
+modprobe mii 2>/dev/null >/dev/null
+modprobe 8390 2>/dev/null >/dev/null
+
+for card in *.o */*.o; do
+ if insmod ${card} >/dev/null 2>&1 ; then
+ if ifconfig eth0 >/dev/null 2>&1 ; then
+ cat >>/etc/modules.conf <<EOF
+alias eth0 $card
+EOF
+ echo "Ethernet card eth0 is a $card"
+ sleep 2
+ exit
+ fi
+ fi
+done
+echo "Sorry no ethernet card module found."
+sleep 3
--- /dev/null
+#!/bin/sh
+#
+# Try mounting the CDROM drive
+#
+
+echo "Doing mount_cdrom ..."
+modprobe nls_iso8859-1 2>/dev/null >/dev/null
+modprobe cdrom 2>/dev/null >/dev/null
+modprobe scsi_mod 2>/dev/null >/dev/null
+
+DISKS="/dev/hd?"
+if [ -f /proc/scsi/scsi ] ; then
+ HAVE_SCSI="yes"
+ DISKS="$DISKS /dev/scd? /dev/scd?? /dev/sd?[1-9] /dev/sd?[1-9][1-9]"
+else
+ HAVE_SCSI="no"
+fi
+DISKS="$DISKS /dev/hd?[1-9] /dev/hd?[1-9][1-9]"
+
+echo "Trying to find CDROM on ..."
+for disk in $DISKS; do
+ if [ x$DEBUG = xyes ] ; then
+ echo "Trying to mount device $disk"
+ fi
+ if test -b $disk && mount -t iso9660 -o ro -n $disk /mnt/cdrom 2>/dev/null >/dev/null ; then
+# if test -b $disk && mount -t iso9660 -o ro -n $disk /mnt/cdrom ; then
+ if [ -e /mnt/cdrom/BaculaRescueCD ] ; then
+ echo "Found the Bacula Rescue CDROM on $disk"
+ sleep 3
+ exit
+ else
+ umount /mnt/cdrom
+ fi
+ else
+ if [ x$DEBUG = xyes ] ; then
+ cat /proc/modules
+ sleep 2
+ fi
+ fi
+done
+
+echo "Sorry could not find the CDROM"
+sleep 5
--- /dev/null
+/dev/root / ext2 rw 0 0
+/dev/cdrom /mnt/cdrom iso9660 ro 0 0
--- /dev/null
+#
+# /etc/nsswitch.conf
+#
+# An example Name Service Switch config file. This file should be
+# sorted with the most-used services at the beginning.
+#
+# The entry '[NOTFOUND=return]' means that the search for an
+# entry should stop if the search in the previous entry turned
+# up nothing. Note that if the search failed due to some other reason
+# (like no NIS server responding) then the search continues with the
+# next entry.
+#
+# Legal entries are:
+#
+# nisplus or nis+ Use NIS+ (NIS version 3)
+# nis or yp Use NIS (NIS version 2), also called YP
+# dns Use DNS (Domain Name Service)
+# files Use the local files
+# db Use the local database (.db) files
+# compat Use NIS on compat mode
+# hesiod Use Hesiod for user lookups
+# [NOTFOUND=return] Stop searching if not found so far
+#
+
+# To use db, put the "db" in front of "files" for entries you want to be
+# looked up first in the databases
+#
+# Example:
+
+passwd: files
+shadow: files
+group: files
+hosts: files
+bootparams: files
+ethers: files
+netmasks: files
+networks: files
+protocols: files
+rpc: files
+services: files
+netgroup: files
+publickey: files
+automount: files
+aliases: files
--- /dev/null
+# /etc/profile
+
+# System wide environment and startup programs, for login setup
+# Functions and aliases go in /etc/bashrc
+
+pathmunge () {
+ if ! echo $PATH | /bin/egrep -q "(^|:)$1($|:)" ; then
+ if [ "$2" = "after" ] ; then
+ PATH=$PATH:$1
+ else
+ PATH=$1:$PATH
+ fi
+ fi
+}
+
+# Path manipulation
+if [ `id -u` = 0 ]; then
+ pathmunge /sbin
+ pathmunge /usr/sbin
+ pathmunge /usr/local/sbin
+fi
+
+pathmunge /usr/X11R6/bin after
+
+unset pathmunge
+
+# No core files by default
+ulimit -S -c 0 > /dev/null 2>&1
+
+USER="`id -un`"
+LOGNAME=$USER
+MAIL="/var/spool/mail/$USER"
+
+HOSTNAME=`/bin/hostname`
+HISTSIZE=1000
+
+if [ -z "$INPUTRC" -a ! -f "$HOME/.inputrc" ]; then
+ INPUTRC=/etc/inputrc
+fi
+
+export PATH USER LOGNAME MAIL HOSTNAME HISTSIZE INPUTRC
+
+for i in /etc/profile.d/*.sh ; do
+ if [ -r "$i" ]; then
+ . $i
+ fi
+done
+
+unset i
--- /dev/null
+#! /bin/sh -v
+#
+
+argv1="$1"
+
+if [ $argv1 -eq 1 ] ; then
+ exec init -t1 S
+fi
--- /dev/null
+console
+vc/1
+vc/2
+vc/3
+vc/4
+vc/5
+vc/6
+vc/7
+vc/8
+vc/9
+vc/10
+vc/11
+tty1
+tty2
+tty3
+tty4
+tty5
+tty6
+tty7
+tty8
+tty9
+tty10
+tty11
--- /dev/null
+#! /bin/sh
+#
+# This script is not used by Bacula. You should try the script
+# in bacula-hostname/start_network.
+# We leave this here because it could be useful if you are
+# getting an IP address with DHCP. You might need to change
+# dhcpcd below to dhclient if you are running RedHat
+#
+
+if ifconfig eth0 >/dev/null 2>&1 ; then
+
+ echo "Setting up network..."
+ /bin/dhcpcd $eth0
+
+ echo "done"
+
+ ifconfig
+ exit
+
+fi
+
+echo "No network card present, cannot configure network"
+sleep 3
--- /dev/null
+#!/bin/sh
+
+echo "Start sysinit ..."
+
+PATH="/sbin:/usr/sbin:/bin:/usr/bin:/usr/X11R6/bin"
+export PATH
+
+echo "Remounting root filesystem read-write"
+mount -o remount,rw /dev/root /
+
+mount -t proc none /proc
+mount -t devpts none /dev/pts
+[ -d /proc/bus/usb ] && mount -n -t usbfs /proc/bus/usb /proc/bus/usb
+mount -n -t sysfs /sys /sys >/dev/null 2>&1
+
+[ -x /sbin/start_udev ] && /sbin/start_udev
+
+# Clear mtab
+(> /etc/mtab) &> /dev/null
+
+# Enter root, /proc and (potentially) /proc/bus/usb and devfs into mtab.
+mount -f /
+mount -f /proc
+mount -f /sys >/dev/null 2>&1
+mount -f /dev/pts
+[ -f /proc/bus/usb/devices ] && mount -f -t usbfs usbfs /proc/bus/usb
+[ -e /dev/.devfsd ] && mount -f -t devfs devfs /dev
+
+
+touch /var/run/utmp /var/run/wtmp /var/log/wtmp
+chgrp utmp /var/run/utmp /var/log/wtmp
+chmod 0664 /var/run/utmp /var/log/wtmp
+
+syslogd -m 0
+klogd -x
+
+echo "Attempting to mount CDDOM..."
+/etc/mount_cdrom
+
+echo "Loading the ethernet driver module"
+/etc/load_eth0
+
+ifconfig lo 127.0.0.1 netmask 255.0.0.0 up
+
+/bin/hostname RescueCD
+
+echo "Boot complete."
+sleep 3 # give time to read messages
--- /dev/null
+
+
+
+dumb|80-column dumb tty:\
+ :am:\
+ :co#80:\
+ :bl=^G:cr=^M:do=^J:sf=^J:
+unknown|unknown terminal type:\
+ :gn:tc=dumb:
+lpr|printer|line printer:\
+ :hc:os:\
+ :co#132:li#66:\
+ :bl=^G:cr=^M:do=^J:ff=^L:le=^H:sf=^J:
+
+
+klone+acs|alternate character set for ansi.sys displays:\
+ :ac=`\004a\261f\370g\361h\260j\331k\277l\332m\300n\305o~q\304r\362s_t\303u\264v\301w\302x\263y\371z\372{\373|\374}\375~\376.\031-\030\054\021+^P0\333p\304r\304y\363z\362{\343|\330}\234:\
+ :ae=\E[10m:as=\E[11m:
+
+klone+sgr|attribute control for ansi.sys displays:\
+ :S2=\E[11m:S3=\E[10m:ae=\E[11m:as=\E11m:mb=\E[5m:\
+ :md=\E[1m:me=\E[0;10m:mk=\E[8m:mr=\E[7m:\
+ :..sa=\E[0;10%?%p1%t;7%;%?%p2%t;4%;%?%p3%t;7%;%?%p4%t;5%;%?%p6%t;1%;%?%p7%t;8%;%?%p9%t;11%;m:\
+ :se=\E[m:so=\E[7m:ue=\E[m:us=\E[4m:
+
+klone+sgr-dumb|attribute control for ansi.sys displays (no ESC [ 11 m):\
+ :ae=\E[12m:as=\E12m:mb=\E[5m:md=\E[1m:me=\E[0;10m:\
+ :mk=\E[8m:mr=\E[7m:\
+ :..sa=\E[0;10%?%p1%t;7%;%?%p2%t;4%;%?%p3%t;7%;%?%p4%t;5%;%?%p6%t;1%;%?%p7%t;8%;%?%p9%t;12%;m:\
+ :se=\E[m:so=\E[7m:ue=\E[m:us=\E[4m:
+
+klone+color|color control for ansi.sys and ISO6429-compatible displays:\
+ :Co#8:NC#3:pa#64:\
+ :AB=\E[4%p1%dm:AF=\E[3%p1%dm:Sb=\E[%+(m:Sf=\E[%+^^m:\
+ :op=\E[37;40m:
+
+ibcs2|Intel Binary Compatibility Standard prescriptions:\
+ :AL=\E[%dL:DC=\E[%dP:DO=\E[%dB:IC=\E[%d@:LE=\E[%dD:\
+ :RA=\E[?7l:RI=\E[%dC:S1=\E=%p1%dg:SA=\E[?7h:\
+ :SF=\E[%dS:SR=\E[%dT:UP=\E[%dA:bt=\E[Z:ch=\E[%i%dG:\
+ :cl=\Ec:cm=\E[%i%d;%dH:ct=\E[g:cv=\E[%i%dd:ec=\E[%dX:\
+ :ei=:im=:rc=\E8:sc=\E7:st=\EH:
+
+
+ansi-mini|any ansi terminal with pessimistic assumptions:\
+ :am:bs:\
+ :co#80:it#8:li#24:\
+ :ce=\E[K:cl=\E[H\E[2J:cm=\E[%i%d;%dH:do=\E[B:ho=\E[H:\
+ :le=\E[D:nd=\E[C:ta=^I:up=\E[A:
+
+pcansi-m|pcansi-mono|ibm-pc terminal programs claiming to be ansi (mono mode):\
+ :am:bs:mi:ms:\
+ :co#80:it#8:li#24:\
+ :al=\E[L:bl=^G:bt=\E[Z:cd=\E[J:ce=\E[K:cl=\E[H\E[J:\
+ :cm=\E[%i%d;%dH:cr=^M:ct=\E[2g:dc=\E[P:dl=\E[M:\
+ :do=\E[B:ho=\E[H:kb=^H:kd=\E[B:kh=\E[H:kl=\E[D:\
+ :kr=\E[C:ku=\E[A:le=\E[D:nd=\E[C:sf=^J:st=\EH:ta=^I:\
+ :up=\E[A:tc=klone+sgr-dumb:
+pcansi-25-m|pcansi25m|ibm-pc terminal programs with 25 lines (mono mode):\
+ :li#25:tc=pcansi-m:
+pcansi-33-m|pcansi33m|ibm-pc terminal programs with 33 lines (mono mode):\
+ :li#33:tc=pcansi-m:
+pcansi-43-m|ansi43m|ibm-pc terminal programs with 43 lines (mono mode):\
+ :li#43:tc=pcansi-m:
+pcansi|ibm-pc terminal programs claiming to be ansi:\
+ :tc=klone+color:tc=pcansi-m:
+pcansi-25|pcansi25|ibm-pc terminal programs with 25 lines:\
+ :li#25:tc=pcansi:
+pcansi-33|pcansi33|ibm-pc terminal programs with 33 lines:\
+ :li#33:tc=pcansi:
+pcansi-43|pcansi43|ibm-pc terminal programs with 43 lines:\
+ :li#43:tc=pcansi:
+
+ansi-m|ansi-mono|ANSI X3.64-1979 terminal with ANSI.SYS compatible attributes:\
+ :5i:\
+ :AL=\E[%dL:DC=\E[%dP:DL=\E[%dM:DO=\E[%dB:IC=\E[%d@:\
+ :LE=\E[%dD:RI=\E[%dC:SF=\E[%dS:SR=\E[%dT:UP=\E[%dA:\
+ :cb=\E[1K:ch=\E[%i%dG:ct=\E[2g:cv=\E[%i%dd:ec=\E[%dX:\
+ :ei=:im=:kB=\E[Z:kI=\E[L:kb=^H:kd=\E[B:kl=\E[D:\
+ :kr=\E[C:ku=\E[A:nw=\r\E[S:pf=\E[4i:po=\E[5i:\
+ :..rp=%p1%c\E[%p2%{1}%-%db:s0=\E(B:s1=\E)B:s2=\E*B:\
+ :s3=\E+B:ta=\E[I:tc=pcansi-m:
+
+ansi|ansi/pc-term compatible with color:\
+ :u6=\E[%i%d;%dR:u7=\E[6n:..u8=\E[?%[;0123456789]c:\
+ :u9=\E[c:tc=klone+color:tc=klone+acs:tc=klone+sgr:tc=ansi-m:
+
+ansi.sys-old|ANSI.SYS under PC-DOS 2.1:\
+ :am:mi:ms:xo:\
+ :co#80:li#25:\
+ :RA=\E[?7l:SA=\E[?7h:ce=\E[k:cl=\E[2J:cm=\E[%i%d;%dH:\
+ :do=\E[B:ho=\E[H:is=\E[m\E[?7h:kd=^J:kh=^^:kl=^H:\
+ :kr=^L:ku=^K:le=^H:nd=\E[C:pk=\E[0;%+:;"%s":rc=\E[u:\
+ :sc=\E[s:u6=\E[%i%d;%dR:u7=\E[6n:up=\E[A:tc=klone+color:tc=klone+acs:tc=klone+sgr:
+ansi.sys|ANSI.SYS 3.1 and later versions:\
+ :ce=\E[K:tc=ansi.sys-old:
+
+ansi.sysk|ansisysk|PC-DOS 3.1 ANSI.SYS with keypad redefined for vi:\
+ :is=U2 PC-DOS 3.1 ANSI.SYS with keypad redefined for vi 9-29-86\n\E[;75;8p:\
+ :ke=\E[;71;0;71p\E[;72;0;72p\E[;73;0;73p\E[;77;0;77p\E[;80;0;80p\E[;81;0;81p\E[;82;0;82p\E[;83;0;83p:\
+ :ks=\E[;71;30p\E[;72;11p\E[;73;27;21p\E[;77;12p\E[;80;10p\E[;81;27;4p\E[;82;27;27;105p\E[;83;127p:tc=ansi.sys:
+nansi.sys|nansisys|PC-DOS Public Domain NANSI.SYS:\
+ :al=\E[1L:dc=\E[1P:dl=\E[1M:ei=:ic=\E[1@:im=:\
+ :is=U3 PC-DOS Public Domain NANSI.SYS 9-23-86\n:tc=ansi.sys:
+nansi.sysk|nansisysk|PC-DOS Public Domain NANSI.SYS with keypad redefined for vi:\
+ :al=\E[1L:dc=\E[1P:dl=\E[1M:ei=:ic=\E[1@:im=:\
+ :is=U4 PC-DOS Public Domain NANSI.SYS with keypad redefined for vi 9-29-86\n\E[;75;8p:tc=ansi.sysk:
+
+
+linux|linux-lat|linux console:\
+ :am:eo:mi:ms:ut:xn:xo:\
+ :co#80:it#8:li#25:\
+ :&7=^Z:@7=\E[4~:AL=\E[%dL:DC=\E[%dP:DL=\E[%dM:\
+ :F1=\E[23~:F2=\E[24~:F3=\E[25~:F4=\E[26~:F5=\E[28~:\
+ :F6=\E[29~:F7=\E[31~:F8=\E[32~:F9=\E[33~:FA=\E[34~:\
+ :IC=\E[%d@:K2=\E[G:al=\E[L:bl=^G:cd=\E[J:ce=\E[K:\
+ :ch=\E[%i%dG:cl=\E[H\E[J:cm=\E[%i%d;%dH:cr=^M:\
+ :cs=\E[%i%d;%dr:ct=\E[3g:cv=\E[%i%dd:dc=\E[P:dl=\E[M:\
+ :do=^J:ei=\E[4l:ho=\E[H:ic=\E[@:im=\E[4h:k1=\E[[A:\
+ :k2=\E[[B:k3=\E[[C:k4=\E[[D:k5=\E[[E:k6=\E[17~:\
+ :k7=\E[18~:k8=\E[19~:k9=\E[20~:k;=\E[21~:kB=\E[Z:\
+ :kD=\E[3~:kI=\E[2~:kN=\E[6~:kP=\E[5~:kb=^H:kd=\E[B:\
+ :kh=\E[1~:kl=\E[D:kr=\E[C:ku=\E[A:le=^H:mr=\E[7m:\
+ :nd=\E[C:nw=^M^J:r1=\Ec:rc=\E8:sc=\E7:sf=^J:sr=\EM:\
+ :st=\EH:ta=^I:u6=\E[%i%d;%dR:u7=\E[6n:u8=\E[?6c:\
+ :u9=\E[c:up=\E[A:vb=200\E[?5h\E[?5l:ve=\E[?25h:\
+ :vi=\E[?25l:tc=klone+sgr:tc=klone+color:tc=klone+acs:
+linux-m|Linux console no color:\
+ :Co@:pa@:\
+ :AB@:AF@:Sb@:Sf@:tc=linux:
+
+linux-nic|linux with ich/ich1 suppressed for non-curses programs:\
+ :IC@:ei=:ic@:im=:tc=linux:
+
+scoansi|SCO Extended ANSI standard crt:\
+ :am:bs:eo:xo:\
+ :co#80:it#8:li#25:\
+ :@7=\E[F:ae=\E[10m:al=\E[L:as=\E[12m:bt=\E[Z:cd=\E[J:\
+ :ce=\E[K:cl=\E[H\E[2J:cm=\E[%i%d;%dH:dc=\E[P:dl=\E[M:\
+ :do=\E[B:ei=:ho=\E[H:ic=\E[@:im=:k1=\E[M:k2=\E[N:\
+ :k3=\E[O:k4=\E[P:k5=\E[Q:k6=\E[R:k7=\E[S:k8=\E[T:\
+ :k9=\E[U:k;=\E[V:kN=\E[G:kP=\E[I:kb=^H:kd=\E[B:\
+ :kh=\E[H:kl=\E[D:kr=\E[C:ku=\E[A:le=\E[D:mb=\E[5m:\
+ :md=\E[1m:me=\E[m:nd=\E[C:se=\E[m:sf=\E[S:so=\E[7m:\
+ :sr=\E[T:ta=^I:ue=\E[m:up=\E[A:us=\E[4m:
+
+att6386|at386|386at|AT&T WGS 6386 console:\
+ :am:bw:eo:xo:\
+ :co#80:it#8:li#25:\
+ :@7=\E[Y:AL=\E[%dL:DC=\E[%dP:DL=\E[%dM:DO=\E[%dB:\
+ :F1=\EOZ:F2=\EOA:IC=\E[%d@:LE=\E[%dD:RI=\E[%dC:\
+ :SF=\E[%dS:SR=\E[%dT:UP=\E[%dA:\
+ :ac=``a1fxgqh0jYk?lZm@nEooppqDrrsstCu4vAwBx3yyzz{{||}}~~:\
+ :ae=\E[10m:al=\E[1L:as=\E[12m:bl=^G:bt=\E[Z:cd=\E[J:\
+ :ce=\E[K:ch=\E[%i%dG:cl=\E[2J\E[H:cm=\E[%i%d;%dH:\
+ :cr=^M:ct=\E[2g:cv=\E[%i%dd:dc=\E[P:dl=\E[1M:do=\E[B:\
+ :ec=\E[%dX:ei=:ho=\E[H:ic=\E[1@:im=:is=\E[0;10;39m:\
+ :k1=\EOP:k2=\EOQ:k3=\EOR:k4=\EOS:k5=\EOT:k6=\EOU:\
+ :k7=\EOV:k8=\EOW:k9=\EOX:k;=\EOY:kB=^]:kD=\E[P:\
+ :kI=\E[@:kM=\E0:kN=\E[U:kP=\E[V:kb=^H:kd=\E[B:\
+ :kh=\E[H:kl=\E[D:kr=\E[C:ku=\E[A:le=\E[D:mb=\E[5m:\
+ :md=\E[1m:me=\E[0;10m:mh=\E[2m:mk=\E[9m:mr=\E[7m:\
+ :nd=\E[C:nw=\r\E[S:rc=\E8:\
+ :..sa=\E[10m\E[0%?%p1%p3%|%t;7%;%?%p2%t;4%;%?%p4%t;5%;%?%p5%t;2%;?%p6%t;1%;%?%p9%t;12%e;10%;%?%p7%t;9%;m:\
+ :sc=\E7:se=\E[m:sf=\E[S:so=\E[7m:sr=\E[T:st=\EH:\
+ :ta=^I:ue=\E[m:up=\E[A:us=\E[4m:ve=\E[=1C:vi=\E[=C:tc=klone+color:
+pc6300plus|AT&T 6300 plus:\
+ :am:xo:\
+ :co#80:li#24:\
+ :al=\E[1L:bl=^G:cd=\E[0J:ce=\E[0K:cl=\E[2J\E[H:\
+ :cm=\E[%i%2;%2H:cr=^M:ct=\E[3g:dc=\E[1P:dl=\E[1M:\
+ :do=\E[B:ei=:ho=\E[H:ic=\E[1@:im=:k1=\EOc:k2=\EOd:\
+ :k3=\EOe:k4=\EOf:k5=\EOg:k6=\EOh:k7=\EOi:k8=\EOj:\
+ :k9=\EOk:k;=\EOu:kb=^H:kd=\E[B:kl=\E[D:kr=\E[C:\
+ :ku=\E[A:le=^H:mb=\E[5m:md=\E[1m:me=\E[m:mh=\E[2m:\
+ :mk=\E[9m:mr=\E[7m:nd=\E[C:nw=^M^J:se=\E[m:sf=^J:\
+ :so=\E[7m:st=\EH:ue=\E[m:up=\E[A:us=\E[4m:ve=\E[=1C:\
+ :vi=\E[=C:
+
+att7300|unixpc|pc7300|3b1|s4|AT&T UNIX PC Model 7300:\
+ :am:xn:xo:\
+ :co#80:it#8:li#24:\
+ :AL=\E[%dL:DL=\E[%dM:DO=\E[%dB:LE=\E[%dD:RI=\E[%dC:\
+ :UP=\E[%dA:ae=\E[10m:al=\E[L:as=\E[11m:bl=^G:bt=\E^I:\
+ :cd=\E[0J:ce=\E[0K:cl=\E[2J\E[H:cm=\E[%i%d;%dH:cr=^M:\
+ :dc=\E[P:dl=\E[M:do=\E[B:ei=:ho=\E[H:i1=^O:ic=\E[@:\
+ :im=:k1=\EOP:k2=\EOQ:k3=\EOR:k4=\EOS:k5=\E5:k6=\E6:\
+ :k7=\E7:k8=\E8:kD=\Edc:kI=\Eim:kN=\Epg:kP=\EPG:kb=^H:\
+ :kd=\E[B:kh=\Ehm:kl=\E[D:kr=\E[C:ku=\E[A:md=\E[7m:\
+ :me=\E[0;10m:mh=\E[2m:mr=\E[7m:nd=\E[C:nw=\EE:\
+ :se=\E[m:sf=^J:so=\E[7m:sr=\EM:ue=\E[m:up=\E[A:\
+ :us=\E[4m:ve=\E[=1C:vi=\E[=C:
+
+iris-ansi|iris-ansi-net|IRIS emulating ANSI terminal:\
+ :am:\
+ :co#80:it#8:li#40:\
+ :!2=\E[218q:#2=\E[143q:#4=\E[158q:%9=\E[209q:\
+ :%f=\E[210q:%i=\E[167q:&7=\E[217q:*4=\E[P:*7=\E[147q:\
+ :@7=\E[146q:@8=^M:AL=\E[%dL:DL=\E[%dM:DO=\E[%dB:\
+ :F1=\EOR:F2=\EOS:LE=\E[%dD:RA=\E[?7l:RI=\E[%dC:\
+ :SA=\E[?7h:UP=\E[%dA:al=\E[L:bl=^G:cb=\E[1K:cd=\E[J:\
+ :ce=\E[K:cl=\E[H\E[2J:cm=\E[%i%d;%dH:cr=^M:ct=\E[3g:\
+ :dl=\E[M:do=^J:ho=\E[H:\
+ :is=\E[?1l\E>\E[?7h\E[100g\E[0m\E7\E[r\E8:k1=\E[001q:\
+ :k2=\E[002q:k3=\E[003q:k4=\E[004q:k5=\E[005q:\
+ :k6=\E[006q:k7=\E[007q:k8=\E[008q:k9=\EOP:k;=\EOQ:\
+ :kB=\E[Z:kD=\177:kI=\E[139q:kM=\E[146q:kN=\E[154q:\
+ :kP=\E[150q:kb=^H:kd=\E[B:kh=\E[H:kl=\E[D:kr=\E[C:\
+ :ku=\E[A:le=\E[D:md=\E[1m:me=\E[m:mr=\E[7m:nd=\E[C:\
+ :nw=\EE:pk=\EP101;%d.y%s\E\\:rc=\E8:sc=\E7:se=\E[m:\
+ :sf=\ED:so=\E[1;7m:sr=\EM:st=\EH:ta=^I:ue=\E[m:\
+ :up=\E[A:us=\E[4m:ve=\E[9/y\E[12/y\E[=6l:\
+ :vs=\E[10/y\E[=1h\E[=2l\E[=6h:
+
+pcix|PC/IX console:\
+ :am:bw:eo:\
+ :co#80:li#24:\
+ :cd=\E[J:ce=\E[K:cl=\Ec:cm=\E[%i%2;%2H:do=\E[B:\
+ :ho=\E[H:le=^H:nd=\E[C:se=\E[m:so=\E[7m:ue=\E[m:\
+ :up=\E[A:us=\E[4m:
+
+ibmpcx|xenix|ibmx|IBM PC xenix console display:\
+ :am:ms:\
+ :co#80:li#25:\
+ :@7=\E[d:al=\E[L:cd=\E[J:ce=\E[K:cl=^L:cm=\E[%d;%dH:\
+ :dc=\E[P:dl=\E[M:do=\E[B:ei=:ho=\E[H:ic=\E[@:im=:\
+ :k1=\E[K:k2=\E[L:k3=\E[M:k4=\E[N:kN=\E[e:kP=\E[Z:\
+ :kb=^H:kd=\E[B:kh=\E[Y:kl=\E[D:kr=\E[C:ku=\E[A:le=^H:\
+ :nd=\E[C:up=\E[A:tc=klone+acs:tc=klone+sgr:
+
+
+qnx|qnx4|qnx console:\
+ :am:km:mi:ms:xt:\
+ :co#80:it#4:li#25:\
+ :al=\EE:bl=^G:cd=\EJ:ce=\EK:cl=\EH\EJ:cm=\EY%+ %+ :\
+ :cr=^M:dc=\Ef:dl=\EF:do=^J:ei=:ho=\EH:ic=\Ee:im=:\
+ :k1=\377\201:k2=\377\202:k3=\377\203:k4=\377\204:\
+ :k5=\377\205:k6=\377\206:k7=\377\207:k8=\377\210:\
+ :k9=\377\211:kD=\377\254:kI=\377\253:kN=\377\252:\
+ :kP=\377\242:kd=\377\251:kh=\377\240:kl=\377\244:\
+ :kr=\377\246:ku=\377\241:le=^H:mb=\E{:md=\E<:\
+ :me=\E}\E]\E>\E):mr=\E(:nd=\EC:rp=\Eg%r%+ %.:se=\E):\
+ :sf=^J:so=\E(:sr=\EI:ta=^I:te=\ER:ue=\E]:up=\EA:\
+ :us=\E[:ve=\Ey1:vi=\Ey0:vs=\Ey2:
+
+
+pcvtXX|pcvt vt200 emulator (DEC VT220):\
+ :am:km:mi:ms:xn:\
+ :it#8:vt#3:\
+ :AL=\E[%dL:DC=\E[%dP:DL=\E[%dM:DO=\E[%dB:IC=\E[%d@:\
+ :LE=\E[%dD:RA=\E[?7l:RI=\E[%dC:SA=\E[?7h:SF=\E[%dS:\
+ :SR=\E[%dT:UP=\E[%dA:\
+ :ac=llmmkkjjuuttvvwwqqxxnnoosspprr``aaffgg~~..--++\054\054hhII00yyzz:\
+ :ae=\E(B:al=\E[L:as=\E(0:bl=^G:cb=\E[1K:cd=\E[J:\
+ :ce=\E[K:cl=\E[H\E[J:cm=\E[%i%d;%dH:cr=^M:\
+ :cs=\E[%i%d;%dr:ct=\E[3g:dc=\E[P:dl=\E[M:do=\E[B:\
+ :ei=\E[4l:ho=\E[H:\
+ :i1=\E>\E[?3l\E[?4l\E[?5l\E[?7h\E[?8h:im=\E[4h:\
+ :k1=\E[17~:k2=\E[18~:k3=\E[19~:k4=\E[20~:k5=\E[21~:\
+ :k6=\E[23~:k7=\E[24~:k8=\E[25~:kD=\E[3~:kH=\E[4~:\
+ :kI=\E[2~:kN=\E[6~:kP=\E[5~:kb=\177:kd=\EOB:\
+ :ke=\E[?1l\E>:kh=\E[1~:kl=\EOD:kr=\EOC:ks=\E[?1h\E=:\
+ :ku=\EOA:le=^H:mb=\E[5m:md=\E[1m:me=\E[m:mr=\E[7m:\
+ :nd=\E[C:nw=\EE:\
+ :r1=\Ec\E>\E[?3l\E[?4l\E[?5l\E[?7h\E[?8h:rc=\E8:\
+ :rf=/usr/share/tabset/vt100:sc=\E7:se=\E[27m:sf=\ED:\
+ :so=\E[7m:sr=\EM:st=\EH:ta=^I:ue=\E[24m:up=\E[A:\
+ :us=\E[4m:
+
+pcvt25|dec vt220 emulation with 25 lines:\
+ :co#80:li#25:\
+ :is=\E[1;25r\E[25;1H:tc=pcvtXX:
+pcvt28|dec vt220 emulation with 28 lines:\
+ :co#80:li#28:\
+ :is=\E[1;28r\E[28;1H:tc=pcvtXX:
+pcvt35|dec vt220 emulation with 35 lines:\
+ :co#80:li#35:\
+ :is=\E[1;35r\E[35;1H:tc=pcvtXX:
+pcvt40|dec vt220 emulation with 40 lines:\
+ :co#80:li#40:\
+ :is=\E[1;40r\E[40;1H:tc=pcvtXX:
+pcvt43|dec vt220 emulation with 43 lines:\
+ :co#80:li#43:\
+ :is=\E[1;43r\E[43;1H:tc=pcvtXX:
+pcvt50|dec vt220 emulation with 50 lines:\
+ :co#80:li#50:\
+ :is=\E[1;50r\E[50;1H:tc=pcvtXX:
+
+pcvt25w|dec vt220 emulation with 25 lines and 132 cols:\
+ :co#132:li#25:\
+ :is=\E[1;25r\E[25;1H:tc=pcvtXX:
+pcvt28w|dec vt220 emulation with 28 lines and 132 cols:\
+ :co#132:li#28:\
+ :is=\E[1;28r\E[28;1H:tc=pcvtXX:
+pcvt35w|dec vt220 emulation with 35 lines and 132 cols:\
+ :co#132:li#35:\
+ :is=\E[1;35r\E[35;1H:tc=pcvtXX:
+pcvt40w|dec vt220 emulation with 40 lines and 132 cols:\
+ :co#132:li#40:\
+ :is=\E[1;40r\E[40;1H:tc=pcvtXX:
+pcvt43w|dec vt220 emulation with 43 lines and 132 cols:\
+ :co#132:li#43:\
+ :is=\E[1;43r\E[43;1H:tc=pcvtXX:
+pcvt50w|dec vt220 emulation with 50 lines and 132 cols:\
+ :co#132:li#50:\
+ :is=\E[1;50r\E[50;1H:tc=pcvtXX:
+
+
+origpc3|origibmpc3|IBM PC 386BSD Console:\
+ :am:bw:eo:xo:\
+ :co#80:li#25:\
+ :ac=l\332q\304k\277x\263j\331m\300w\302u\264v\301t\303n\305:\
+ :cd=\E[J:ce=\E[K:cl=\Ec:cm=\E[%i%2;%2H:do=\E[B:\
+ :ho=\E[H:kd=\E[B:kh=\E[Y:kl=\E[D:kr=\E[C:ku=\E[A:\
+ :le=^H:md=\E[7m:me=\E[m\E[1;0x\E[2;7x:nd=\E[C:\
+ :se=\E[1;0x\E[2;7x:sf=\E[S:so=\E[1;7x\E[2;0x:sr=\E[T:\
+ :ue=\E[1;0x\E[2;7x:up=\E[A:us=\E[1;7x\E[2;0x:
+
+oldpc3|oldibmpc3|old IBM PC BSD/386 Console:\
+ :km:\
+ :li#25:\
+ :al=\E[L:bl=^G:cr=^M:dl=\E[M:do=^J:kH=\E[F:kI=\E[L:\
+ :kN=\E[G:kP=\E[I:kb=^H:kd=\E[B:kh=\E[H:kl=\E[D:\
+ :kr=\E[C:ku=\E[A:md=\E[=15F:me=\E[=R:mh=\E[=8F:\
+ :nw=^M^J:sf=^J:ta=^I:
+
+bsdos|BSD/OS console:\
+ :am:bw:eo:km:xo:\
+ :co#80:it#8:li#25:\
+ :AL=\E[%dL:DL=\E[%dM:DO=\E[%dB:LE=\E[%dD:RI=\E[%dC:\
+ :UP=\E[%dA:al=\E[L:bl=^G:cd=\E[J:ce=\E[K:cl=\Ec:\
+ :cm=\E[%i%d;%dH:cr=^M:dl=\E[M:do=^J:ho=\E[H:kH=\E[F:\
+ :kI=\E[L:kN=\E[G:kP=\E[I:kb=^H:kd=\E[B:kh=\E[H:\
+ :kl=\E[D:kr=\E[C:ku=\E[A:le=^H:mb=\E[5m:md=\E[1m:\
+ :me=\E[0m:mh=\E[=8F:mr=\E[7m:nd=\E[C:nw=^M^J:rc=\E8:\
+ :sc=\E7:se=\E[0m:sf=^J:so=\E[7m:ta=^I:up=\E[A:
+bsdos-bold|IBM PC BSD/386 Console with bold instead of underline:\
+ :ue=\E[0m:us=\E[1m:tc=bsdos:
+
+pc3|IBM PC BSD/386 Console:\
+ :tc=bsdos:
+ibmpc3|pc3-bold|IBM PC BSD/386 Console with bold instead of underline:\
+ :us=\E[1m:tc=bsdos-bold:
+
+
+vt52|dec vt52:\
+ :co#80:it#8:li#24:\
+ :bl=^G:cd=\EJ:ce=\EK:cl=\EH\EJ:cm=\EY%+ %+ :cr=^M:\
+ :do=\EB:ho=\EH:kb=^H:kd=\EB:kl=\ED:kr=\EC:ku=\EA:\
+ :le=\ED:nd=\EC:nw=^M^J:sf=^J:sr=\EI:ta=^I:up=\EA:
+
+vt100|vt100-am|dec vt100 (w/advanced video):\
+ :am:ms:xn:xo:\
+ :co#80:it#8:li#24:vt#3:\
+ :@8=\EOM:DO=\E[%dB:K1=\EOq:K2=\EOr:K3=\EOs:K4=\EOp:\
+ :K5=\EOn:LE=\E[%dD:RA=\E[?7l:RI=\E[%dC:SA=\E[?7h:\
+ :UP=\E[%dA:\
+ :ac=``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~:\
+ :ae=^O:as=^N:bl=^G:cb=\E[1K:cd=\E[J:ce=\E[K:\
+ :cl=\E[H\E[J:cm=\E[%i%d;%dH:cr=^M:cs=\E[%i%d;%dr:\
+ :ct=\E[3g:do=^J:eA=\E(B\E)0:ho=\E[H:k0=\EOy:k1=\EOP:\
+ :k2=\EOQ:k3=\EOR:k4=\EOS:k5=\EOt:k6=\EOu:k7=\EOv:\
+ :k8=\EOl:k9=\EOw:k;=\EOx:kb=^H:kd=\EOB:ke=\E[?1l\E>:\
+ :kl=\EOD:kr=\EOC:ks=\E[?1h\E=:ku=\EOA:le=^H:mb=\E[5m:\
+ :md=\E[1m:me=\E[m\017:mr=\E[7m:nd=\E[C:\
+ :r2=\E>\E[?3l\E[?4l\E[?5l\E[?7h\E[?8h:rc=\E8:\
+ :..sa=\E[0%?%p1%p6%|%t;1%;%?%p2%t;4%;%?%p1%p3%|%t;7%;%?%p4%t;5%;m%?%p9%t\016%e\017%;:\
+ :sc=\E7:se=\E[m:sf=^J:so=\E[7m:sr=\EM:st=\EH:ta=^I:\
+ :ue=\E[m:up=\E[A:us=\E[4m:
+vt100nam|vt100-nam|vt100 no automargins:\
+ :am@:xn@:tc=vt100-am:
+
+vt100-w|vt100-w-am|dec vt100 132 cols (w/advanced video):\
+ :co#132:li#24:\
+ :r2=\E>\E[?3h\E[?4l\E[?5l\E[?8h:tc=vt100-am:
+vt100-w-nam|vt100-nam-w|dec vt100 132 cols (w/advanced video no automargin):\
+ :co#132:li#14:vt@:\
+ :r2=\E>\E[?3h\E[?4l\E[?5l\E[?8h:tc=vt100-nam:
+
+vt100-nav|vt100 without advanced video option:\
+ :sg#1:\
+ :mb@:md@:me@:mr@:sa@:se=\E[m:so=\E[7m:ue@:us@:tc=vt100:
+vt100-nav-w|vt100-w-nav|dec vt100 132 cols 14 lines (no advanced video option):\
+ :co#132:li#14:tc=vt100-nav:
+
+vt100-s|vt100-s-top|vt100-top-s|vt100 for use with top sysline:\
+ :es:hs:\
+ :li#23:\
+ :cl=\E[2;1H\E[J:cm=\E[%i%+^A;%dH:cs=\E[%i%i%d;%dr:\
+ :ds=\E7\E[1;24r\E8:fs=\E8:ho=\E[2;1H:\
+ :is=\E7\E[2;24r\E8:ts=\E7\E[1;%p1%dH\E[1K:tc=vt100-am:
+
+vt100-s-bot|vt100-bot-s|vt100 for use with bottom sysline:\
+ :es:hs:\
+ :li#23:\
+ :ds=\E7\E[1;24r\E8:fs=\E8:is=\E[1;23r\E[23;1H:\
+ :ts=\E7\E[24;%p1%dH\E[1K:tc=vt100-am:
+
+vt102|dec vt102:\
+ :mi:\
+ :al=\E[L:dc=\E[P:dl=\E[M:ei=\E[4l:im=\E[4h:tc=vt100:
+vt102-w|dec vt102 in wide mode:\
+ :li#132:\
+ :r3=\E[?3h:tc=vt102:
+
+vt102-nsgr|vt102 no sgr (use if you see snowflakes after highlight changes):\
+ :me=\E[m:sa@:tc=vt102:
+
+vt125|vt125 graphics terminal:\
+ :cl=\E[H\E[2J\EPpS(E)\E\\:tc=vt100:
+
+vt131|dec vt131:\
+ :am:xn:\
+ :co#80:it#8:li#24:vt#3:\
+ :RA=\E[?7h:bl=^G:cd=50\E[J:ce=3\E[K:cl=50\E[;H\E[2J:\
+ :cm=5\E[%i%d;%dH:cr=^M:cs=\E[%i%d;%dr:do=^J:ho=\E[H:\
+ :is=\E[1;24r\E[24;1H:k1=\EOP:k2=\EOQ:k3=\EOR:k4=\EOS:\
+ :kb=^H:kd=\EOB:ke=\E[?1l\E>:kl=\EOD:kr=\EOC:\
+ :ks=\E[?1h\E=:ku=\EOA:le=^H:mb=2\E[5m:md=2\E[1m:\
+ :me=2\E[m:mr=2\E[7m:nd=2\E[C:nw=^M^J:\
+ :r1=\E>\E[?3l\E[?4l\E[?5l\E[?7h\E[?8h:rc=\E8:sc=\E7:\
+ :se=2\E[m:so=2\E[7m:sr=5\EM:ta=^I:ue=2\E[m:up=2\E[A:\
+ :us=2\E[4m:
+
+vt132|DEC vt132:\
+ :xn:\
+ :al=\E[L:dc=\E[P:dl=\E[M:ei=\E[4h:im=\E[4l:ip=:sf=\n:tc=vt100:
+
+vt220|vt200|DEC VT220 in vt100 emulation mode:\
+ :am:mi:xn:xo:\
+ :co#80:li#24:vt#3:\
+ :@7=\E[4~:RA=\E[?7l:SA=\E[?7h:\
+ :ac=kkllmmjjnnwwqquuttvvxx:ae=\E(B:al=\E[L:as=\E(0:\
+ :bl=^G:cd=\E[J:ce=\E[K:cl=\E[H\E[2J:cm=\E[%i%d;%dH:\
+ :cr=^M:cs=\E[%i%d;%dr:dc=\E[P:dl=\E[M:do=\E[B:\
+ :ei=\E[4l:ho=\E[H:if=/usr/lib/tabset/vt100:im=\E[4h:\
+ :is=\E[1;24r\E[24;1H:k1=\EOP:k2=\EOQ:k3=\EOR:k4=\EOS:\
+ :k5=\E[17~:k6=\E[18~:k7=\E[19~:k8=\E[20~:k9=\E[21~:\
+ :k;=\E[29~:kD=\E[3~:kI=\E[2~:kN=\E[6~:kP=\E[5~:kb=^H:\
+ :kd=\E[B:kh=\E[1~:kl=\E[D:kr=\E[C:ku=\E[A:le=^H:\
+ :mb=\E[5m:md=\E[1m:me=\E[m:mr=\E[7m:nd=\E[C:\
+ :r2=\E>\E[?3l\E[?4l\E[?5l\E[?7h\E[?8h:rc=\E8:\
+ :rf=/usr/lib/tabset/vt100:\
+ :..sa=\E[0%?%p6%t;1%;%?%p2%t;4%;%?%p4%t;5%;%?%p1%p3%|%t;7%;m%?%p9%t\E(0%e\E(B%;:\
+ :sc=\E7:se=\E[27m:sf=20\ED:so=\E[7m:sr=14\EM:ta=^I:\
+ :ue=\E[24m:up=\E[A:us=\E[4m:ve=\E[?25h:vi=\E[?25l:
+vt220-w|vt200-w|DEC vt220 in wide mode:\
+ :co#132:\
+ :r3=\E[?3h:tc=vt220:
+
+vt220d|DEC VT220 in vt100 mode with DEC function key labeling:\
+ :F1=\E[23~:F2=\E[24~:F3=\E[25~:F4=\E[26~:F5=\E[28~:\
+ :F6=\E[29~:F7=\E[31~:F8=\E[32~:F9=\E[33~:FA=\E[34~:\
+ :k5@:k6=\E[17~:k7=\E[18~:k8=\E[19~:k9=\E[20~:\
+ :k;=\E[21~:tc=vt220:
+
+vt220-nam|v200-nam|VT220 in vt100 mode with no auto margins:\
+ :am@:\
+ :r2=\E>\E[?3l\E[?4l\E[?5l\E[?7l\E[?8h:tc=vt220:
+
+vt220-8|dec vt220 8 bit terminal:\
+ :am:mi:ms:xn:xo:\
+ :co#80:it#8:li#24:\
+ :AL=\E[%dL:DC=\E[%dP:DL=\E[%dM:DO=\E[%dB:IC=\E[%d@:\
+ :LE=\E[%dD:RI=\E[%dC:UP=\E[%dA:ae=^O:al=\E[L:as=^N:\
+ :bl=^G:cd=\E[J:ce=\E[K:cl=\E[H\E[J:cm=\E[%i%d;%dH:\
+ :cr=^M:cs=\E[%i%d;%dr:ct=\E[3g:dc=\E[P:dl=\E[M:do=^J:\
+ :ec=\E[%dX:ei=\E[4l:ho=\E[H:if=/usr/lib/tabset/vt100:\
+ :im=\E[4h:is=\E[?7h\E[>\E[?1h\E F\E[?4l:k1=\EOP:\
+ :k2=\EOQ:k3=\EOR:k4=\EOS:k6=\E[17~:k7=\E[18~:\
+ :k8=\E[19~:k9=\E[20~:kI=\E[2~:kN=\E[6~:kP=\E[5~:\
+ :kb=^H:kd=\E[B:kh=\E[H:kl=\E[D:kr=\E[C:ku=\E[A:le=^H:\
+ :mb=\E[5m:md=\E[1m:me=\E[m:mr=\E[7m:nd=\E[C:nw=\EE:\
+ :rc=\E8:sc=\E7:se=\E[27m:sf=\ED:so=\E[7m:sr=\EM:\
+ :st=\EH:ta=^I:ue=\E[24m:up=\E[A:us=\E[4m:\
+ :vb=\E[?5h\E[?5l:
+
+
+vt320nam|v320n|DEC VT320 in vt100 emul. mode with NO AUTO WRAP mode:\
+ :am@:\
+ :r2=\E>\E[?3l\E[?4l\E[?5l\E[?7l\E[?8h:tc=vt220:
+
+vt320|vt300|dec vt320 7 bit terminal:\
+ :am:es:hs:mi:ms:xn:\
+ :co#80:li#24:ws#80:\
+ :AL=\E[%dL:DC=\E[%dP:DL=\E[%dM:DO=\E[%dB:IC=\E[%d@:\
+ :K1=\EOw:K2=\EOu:K3=\EOy:K4=\EOq:K5=\EOs:LE=\E[%dD:\
+ :RI=\E[%dC:UP=\E[%dA:ae=\E(B:al=\E[L:as=\E(0:bl=^G:\
+ :cd=\E[J:ce=\E[K:cl=\E[H\E[2J:cm=\E[%i%d;%dH:cr=^M:\
+ :cs=\E[%i%d;%dr:ct=\E[3g:dc=\E[P:dl=\E[M:do=^J:\
+ :ec=\E[%dX:ei=\E[4l:ho=\E[H:im=\E[4h:\
+ :is=\E>\E[?3l\E[?4l\E[5?l\E[?7h\E[?8h\E[1;24r\E[24;1H:\
+ :k1=\EOP:k2=\EOQ:k3=\EOR:k4=\EOS:k6=\E[17~:k7=\E[18~:\
+ :k8=\E[19~:k9=\E[20~:kD=\E[3~:kI=\E[2~:kN=\E[6~:\
+ :kP=\E[5~:kb=\177:kd=\EOB:ke=\E[?1l\E>:kh=\E[1~:\
+ :kl=\EOD:kr=\EOC:ks=\E[?1h\E=:ku=\EOA:le=^H:mb=\E[5m:\
+ :md=\E[1m:me=\E[m:mr=\E[7m:nd=\E[C:nw=\EE:rc=\E8:\
+ :sc=\E7:se=\E[m:sf=\ED:so=\E[7m:sr=\EM:st=\EH:ta=^I:\
+ :ts=\E[1$}\E[H\E[K:ue=\E[m:up=\E[A:us=\E[4m:\
+ :ve=\E[?25h:vi=\E[?25l:
+vt320-nam|vt300-nam|dec vt320 7 bit terminal with no am to make SAS happy:\
+ :am@:\
+ :is=\E>\E[?3l\E[?4l\E[5?l\E[?7l\E[?8h\E[1;24r\E[24;1H:\
+ :r2=\E>\E[?3l\E[?4l\E[5?l\E[?7l\E[?8h\E[1;24r\E[24;1H:tc=vt320:
+vt320-w|vt300-w|dec vt320 wide 7 bit terminal:\
+ :co#132:ws#132:\
+ :is=\E>\E[?3h\E[?4l\E[5?l\E[?7h\E[?8h\E[1;24r\E[24;1H:\
+ :r2=\E>\E[?3h\E[?4l\E[5?l\E[?7h\E[?8h\E[1;24r\E[24;1H:tc=vt320:
+vt320-w-nam|vt300-w-nam|dec vt320 wide 7 bit terminal with no am:\
+ :am@:\
+ :is=\E>\E[?3h\E[?4l\E[5?l\E[?7l\E[?8h\E[1;24r\E[24;1H:\
+ :r2=\E>\E[?3h\E[?4l\E[5?l\E[?7l\E[?8h\E[1;24r\E[24;1H:tc=vt320-w:
+
+vt340|dec-vt340|vt330|dec-vt330|dec vt340 graphics terminal with 24 line page:\
+ :am:es:hs:mi:ms:xn:xo:\
+ :co#80:it#8:li#24:vt#3:\
+ :AL=\E[%dL:DC=\E[%dP:DL=\E[%dM:DO=\E[%dB:IC=\E[%d@:\
+ :LE=\E[%dD:RA=\E[?7l:RI=\E[%dC:SA=\E[?7h:UP=\E[%dA:\
+ :ae=^O:al=\E[L:as=^N:cd=\E[J:ce=\E[K:cl=\E[H\E[J:\
+ :cm=\E[%i%d;%dH:cr=^M:cs=\E[%i%d;%dr:ct=\E[3g:\
+ :dc=\E[P:dl=\E[M:do=^J:ds=\E[2$~\r\E[1$}\E[K\E[$}:\
+ :ei=\E[4l:fs=\E[$}:ho=\E[H:im=\E[4h:\
+ :is=\E<\E F\E>\E[?1h\E[?3l\E[?4l\E[?5l\E[?7h\E[?8h\E[1;24r\E[24;1H:\
+ :k1=\EOP:k2=\EOQ:k3=\EOR:k4=\EOS:k6=\E[17~:k7=\E[18~:\
+ :k8=\E[19~:k9=\E[20~:kb=^H:kd=\EOB:ke=\E[?1l\E>:\
+ :kl=\EOD:kr=\EOC:ks=\E[?1h\E=:ku=\EOA:l1=pf1:l2=pf2:\
+ :l3=pf3:l4=pf4:le=^H:mb=\E[5m:md=\E[1m:me=\E[m:\
+ :mr=\E[7m:nd=\E[C:nw=^M\ED:r1=\E[?3l:rc=\E8:\
+ :rf=/usr/lib/tabset/vt100:sc=\E7:se=\E[27m:sf=\ED:\
+ :so=\E[7m:sr=\EM:st=\EH:ta=^I:\
+ :ts=\E[2$~\E[1$}\E[1;%dH:ue=\E[24m:up=\E[A:us=\E[4m:\
+ :vb=200\E[?5h\E[?5l:ve=\E[?25h:vi=\E[?25l:vs=\E[?25h:
+
+vt400|vt400-24|dec-vt400|dec vt400 24x80 column autowrap:\
+ :am:es:hs:mi:ms:xn:xo:\
+ :co#80:it#8:li#24:vt#3:\
+ :AL=\E[%dL:DC=\E[%dP:DL=\E[%dM:DO=\E[%dB:IC=\E[%d@:\
+ :LE=\E[%dD:RA=\E[?7l:RI=\E[%dC:SA=\E[?7h:UP=\E[%dA:\
+ :ae=^O:al=\E[L:as=^N:cd=10\E[J:ce=4\E[K:\
+ :cl=10\E[H\E[J:cm=\E[%i%d;%dH:cr=^M:cs=\E[%i%d;%dr:\
+ :ct=\E[3g:dc=\E[P:dl=\E[M:do=^J:\
+ :ds=\E[2$~\r\E[1$}\E[K\E[$}:ei=\E[4l:fs=\E[$}:\
+ :ho=\E[H:ic=\E[@:im=\E[4h:\
+ :is=\E<\E F\E>\E[?1h\E[?3l\E[?4l\E[?5l\E[?7h\E[?8h\E[1;24r\E[24;1H:\
+ :k1=\EOP:k2=\EOQ:k3=\EOR:k4=\EOS:k6=\E[17~:k7=\E[18~:\
+ :k8=\E[19~:k9=\E[20~:kb=^H:kd=\EOB:ke=\E[?1l\E>:\
+ :kl=\EOD:kr=\EOC:ks=\E[?1h\E=:ku=\EOA:l1=pf1:l2=pf2:\
+ :l3=pf3:l4=pf4:le=^H:mb=\E[5m:md=\E[1m:me=\E[m:\
+ :mr=\E[7m:nd=\E[C:nw=^M\ED:r1=\E<\E[?3l\E[!p\E[?7h:\
+ :rc=\E8:rf=/usr/lib/tabset/vt100:sc=\E7:se=\E[27m:\
+ :sf=\ED:so=\E[7m:sr=\EM:st=\EH:ta=^I:\
+ :ts=\E[2$~\E[1$}\E[1;%dH:ue=\E[24m:up=\E[A:us=\E[4m:\
+ :vb=200\E[?5h\E[?5l:ve=\E[?25h:vi=\E[?25l:vs=\E[?25h:
+
+vt420|DEC VT420:\
+ :am:mi:xn:xo:\
+ :co#80:li#24:vt#3:\
+ :*6=\E[4~:@0=\E[1~:RA=\E[?7l:\
+ :S5=\E[?0;0r\E>\E[?3l\E[?4l\E[?5l\E[?7h\E[?8h:\
+ :SA=\E[?7h:\
+ :ac=``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~:\
+ :ae=\E(B:al=\E[L:as=\E(0:bl=^G:cd=\E[J:ce=\E[K:\
+ :cl=\E[H\E[2J:cm=\E[%i%d;%dH:cr=^M:cs=\E[%i%d;%dr:\
+ :dc=\E[P:dl=\E[M:do=\E[B:ei=\E[4l:ho=\E[H:\
+ :i2=\E[?67h\E[64;1"p:if=/usr/lib/tabset/vt100:\
+ :im=\E[4h:is=\E[1;24r\E[24;1H:k1=\EOP:k2=\EOQ:\
+ :k3=\EOR:k4=\EOS:k5=\E[17~:k6=\E[18~:k7=\E[19~:\
+ :k8=\E[20~:k9=\E[21~:k;=\E[29~:kD=\E[3~:kI=\E[2~:\
+ :kN=\E[6~:kP=\E[5~:kb=^H:kd=\E[B:ke=\E>:kl=\E[D:\
+ :kr=\E[C:ks=\E=:ku=\E[A:le=^H:mb=\E[5m:md=\E[1m:\
+ :me=\E[m:mr=\E[7m:nd=\E[C:r3=\E[?67h\E[64;1"p:rc=\E8:\
+ :rf=/usr/lib/tabset/vt100:\
+ :..sa=\E[0%?%p6%t;1%;%?%p2%t;4%;%?%p4%t;5%;%?%p1%p3%|%t;7%;m%?%p9%t\E(0%e\E(B%;:\
+ :se=\E[m:sf=\ED:so=\E[7m:sr=\EM:ta=^I:ue=\E[m:\
+ :up=\E[A:us=\E[4m:
+
+vt420pc|DEC VT420 w/PC keyboard:\
+ :@7=\E[4~:F1=\E[23~:F2=\E[24~:F3=\E[11;2~:\
+ :F4=\E[12;2~:F5=\E[13;2~:F6=\E[14;2~:F7=\E[15;2~:\
+ :F8=\E[17;2~:F9=\E[18;2~:FA=\E[19;2~:FB=\E[20;2~:\
+ :FC=\E[21;2~:FD=\E[23;2~:FE=\E[24;2~:FF=\E[23~:\
+ :FG=\E[24~:FH=\E[25~:FI=\E[26~:FJ=\E[28~:FK=\E[29~:\
+ :FL=\E[31~:FM=\E[32~:FN=\E[33~:FO=\E[34~:FP=\E[35~:\
+ :FQ=\E[36~:FR=\E[23;2~:FS=\E[24;2~:FT=\E[25;2~:\
+ :FU=\E[26;2~:FV=\E[28;2~:FW=\E[29;2~:FX=\E[31;2~:\
+ :FY=\E[32;2~:FZ=\E[33;2~:Fa=\E[34;2~:Fb=\E[35;2~:\
+ :Fc=\E[36;2~:S6=USR_TERM\072vt420pcdos\072:k1=\E[11~:\
+ :k2=\E[12~:k3=\E[13~:k4=\E[14~:k5=\E[15~:k6=\E[17~:\
+ :k7=\E[18~:k8=\E[19~:k9=\E[20~:k;=\E[21~:kD=\177:\
+ :kh=\E[H:\
+ :..px=\EP1;1|%?%{16}%p1%>%t%{0}%e%{21}%p1%>%t%{1}%e%{25}%p1%>%t%{2}%e%{27}%p1%>%t%{3}%e%{30}%p1%>%t%{4}%e%{5}%;%p1%+%d/%p2%s\E\\:tc=vt420:
+
+vt420pcdos|DEC VT420 w/PC for DOS Merge:\
+ :li#25:\
+ :S1=%?%p2%{19}%=%t\E\023\021%e%p2%{32}%<%t\E%p2%c%e%p2%{127}%=%t\E\177%e%p2%c%;:\
+ :S4=\E[?1;2r\E[34h:\
+ :S5=\E[?0;0r\E>\E[?3l\E[?4l\E[?5l\E[?7h\E[?8h:S6@:\
+ :me=\E[m:sa@:tc=vt420pc:
+
+vt420f|DEC VT420 with VT kbd; VT400 mode; F1-F5 used as Fkeys:\
+ :F1=\E[23~:F2=\E[24~:F3=\E[25~:F4=\E[26~:F5=\E[28~:\
+ :F6=\E[29~:F7=\E[31~:F8=\E[32~:F9=\E[33~:FA=\E[34~:\
+ :k1=\E[11~:k2=\E[12~:k3=\E[13~:k4=\E[14~:k5=\E[15~:\
+ :k6=\E[17~:k7=\E[18~:k8=\E[19~:k9=\E[20~:k;=\E[21~:\
+ :kD=\177:kh=\E[H:l1=\EOP:l2=\EOQ:l3=\EOR:l4=\EOS:tc=vt420:
+
+vt510|DEC VT510:\
+ :tc=vt420:
+vt510pc|DEC VT510 w/PC keyboard:\
+ :tc=vt420pc:
+vt510pcdos|DEC VT510 w/PC for DOS Merge:\
+ :tc=vt420pcdos:
+
+vt520|DEC VT520:\
+ :am:mi:xn:xo:\
+ :co#80:li#24:vt#3:\
+ :*6=\E[4~:@0=\E[1~:RA=\E[?7l:\
+ :S5=\E[?0;0r\E>\E[?3l\E[?4l\E[?5l\E[?7h\E[?8h:\
+ :SA=\E[?7h:\
+ :ac=``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~:\
+ :ae=\E(B:al=\E[L:as=\E(0:bl=^G:cd=\E[J:ce=\E[K:\
+ :cl=\E[H\E[2J:cm=\E[%i%d;%dH:cr=^M:cs=\E[%i%d;%dr:\
+ :dc=\E[P:dl=\E[M:do=\E[B:ei=\E[4l:ho=\E[H:\
+ :i2=\E[?67h\E[64;1"p:if=/usr/lib/tabset/vt100:\
+ :im=\E[4h:is=\E[1;24r\E[24;1H:k0=\E[29~:k1=\EOP:\
+ :k2=\EOQ:k3=\EOR:k4=\EOS:k5=\E[17~:k6=\E[18~:\
+ :k7=\E[19~:k8=\E[20~:k9=\E[21~:k;=\E[29~:kD=\E[3~:\
+ :kI=\E[2~:kN=\E[6~:kP=\E[5~:kb=^H:kd=\E[B:kl=\E[D:\
+ :kr=\E[C:ku=\E[A:le=^H:mb=\E[5m:md=\E[1m:me=\E[m:\
+ :mr=\E[7m:nd=\E[C:\
+ :..px=\EP1;1|%?%{16}%p1%>%t%{0}%e%{21}%p1%>%t%{1}%e%{25}%p1%>%t%{2}%e%{27}%p1%>%t%{3}%e%{30}%p1%>%t%{4}%e%{5}%;%p1%+%d/%p2%s\E\\:\
+ :r3=\E[?67h\E[64;1"p:rc=\E8:rf=/usr/lib/tabset/vt100:\
+ :..sa=\E[0%?%p6%t;1%;%?%p2%t;4%;%?%p4%t;5%;%?%p1%p3%|%t;7%;m%?%p9%t\E(0%e\E(B%;:\
+ :se=\E[m:sf=\ED:so=\E[7m:sr=\EM:ta=^I:ue=\E[m:\
+ :up=\E[A:us=\E[4m:
+
+vt525|DEC VT525:\
+ :am:mi:xn:xo:\
+ :co#80:li#24:vt#3:\
+ :*6=\E[4~:@0=\E[1~:RA=\E[?7l:\
+ :S5=\E[?0;0r\E>\E[?3l\E[?4l\E[?5l\E[?7h\E[?8h:\
+ :SA=\E[?7h:\
+ :ac=``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~:\
+ :ae=\E(B:al=\E[L:as=\E(0:bl=^G:cd=\E[J:ce=\E[K:\
+ :cl=\E[H\E[2J:cm=\E[%i%d;%dH:cr=^M:cs=\E[%i%d;%dr:\
+ :dc=\E[P:dl=\E[M:do=\E[B:ei=\E[4l:ho=\E[H:\
+ :i2=\E[?67h\E[64;1"p:if=/usr/lib/tabset/vt100:\
+ :im=\E[4h:is=\E[1;24r\E[24;1H:k0=\E[29~:k1=\EOP:\
+ :k2=\EOQ:k3=\EOR:k4=\EOS:k5=\E[17~:k6=\E[18~:\
+ :k7=\E[19~:k8=\E[20~:k9=\E[21~:k;=\E[29~:kD=\E[3~:\
+ :kI=\E[2~:kN=\E[6~:kP=\E[5~:kb=^H:kd=\E[B:kl=\E[D:\
+ :kr=\E[C:ku=\E[A:le=^H:mb=\E[5m:md=\E[1m:me=\E[m:\
+ :mr=\E[7m:nd=\E[C:\
+ :..px=\EP1;1|%?%{16}%p1%>%t%{0}%e%{21}%p1%>%t%{1}%e%{25}%p1%>%t%{2}%e%{27}%p1%>%t%{3}%e%{30}%p1%>%t%{4}%e%{5}%;%p1%+%d/%p2%s\E\\:\
+ :r3=\E[?67h\E[64;1"p:rc=\E8:rf=/usr/lib/tabset/vt100:\
+ :..sa=\E[0%?%p6%t;1%;%?%p2%t;4%;%?%p4%t;5%;%?%p1%p3%|%t;7%;m%?%p9%t\E(0%e\E(B%;:\
+ :se=\E[m:sf=\ED:so=\E[7m:sr=\EM:ta=^I:ue=\E[m:\
+ :up=\E[A:us=\E[4m:
+
+
+dec-vt100|EWAN telnet's vt100 emulation:\
+ :tc=vt102-nsgr:
+
+z340|zstem vt340 terminal emulator 132col 42line:\
+ :li#42:\
+ :is=\E>\E[?3h\E[?4l\E[?5l\E[?7h\E[?8h\E[1;42r\E[42;1H:\
+ :r2=\E>\E[?3h\E[?4l\E[?5l\E[?7h\E[?8h\E[1;42r\E[42;1H:tc=vt320-w:
+z340-nam|zstem vt340 terminal emulator 132col 42line:\
+ :am@:\
+ :is=\E>\E[?3h\E[?4l\E[?5l\E[?7l\E[?8h\E[1;42r\E[42;1H:\
+ :r2=\E>\E[?3h\E[?4l\E[?5l\E[?7l\E[?8h\E[1;42r\E[42;1H:tc=z340:
+
+
+x10term|vs100-x10|xterm terminal emulator (X10 window system):\
+ :am:km:mi:ms:xn:xo:\
+ :co#80:it#8:li#65:\
+ :AL=\E[%dL:DC=\E[%dP:DL=\E[%dM:RA=\E[?7l:SA=\E[?7h:\
+ :al=\E[L:cd=\E[J:ce=\E[K:cl=\E[H\E[2J:cm=\E[%i%d;%dH:\
+ :cs=\E[%i%d;%dr:dc=\E[P:dl=\E[M:do=^J:ei=\E[4l:\
+ :ho=\E[H:im=\E[4h:is=\E\E[m\E[?7h\E[?1;4l:k1=\EOP:\
+ :k2=\EOQ:k3=\EOR:k4=\EOS:kb=^H:kd=\EOB:ke=\E[?1l\E>:\
+ :kl=\EOD:kr=\EOC:ks=\E[?1h\E=:ku=\EOA:le=^H:md=\E[1m:\
+ :me=\E[m:mr=\E[7m:nd=\E[C:\
+ :rs=\E[r\E<\E[m\E[H\E[2J\E[?7h\E[?1;3;4;6l:se=\E[m:\
+ :sf=^J:so=\E[7m:sr=\EM:ta=^I:ue=\E[m:up=\E[A:\
+ :us=\E[4m:
+xterm|vs100|xterm terminal emulator (X11R6 Window System):\
+ :am:km:mi:ms:xn:xo:\
+ :co#80:it#8:li#65:\
+ :AL=\E[%dL:DC=\E[%dP:DL=\E[%dM:DO=\E[%dB:IC=\E[%d@:\
+ :LE=\E[%dD:RI=\E[%dC:UP=\E[%dA:ae=^O:al=\E[L:as=^N:\
+ :bl=^G:cd=\E[J:ce=\E[K:cl=\E[H\E[2J:cm=\E[%i%d;%dH:\
+ :cr=^M:cs=\E[%i%d;%dr:ct=\E[3k:dc=\E[P:dl=\E[M:do=^J:\
+ :ei=\E[4l:ho=\E[H:ic=\E[@:im=\E[4h:\
+ :is=\E[r\E[m\E[2J\E[H\E[?7h\E[?1;3;4;6l\E[4l:\
+ :k1=\E[11~:k2=\E[12~:k3=\E[13~:k4=\E[14~:k5=\E[15~:\
+ :k6=\E[17~:k7=\E[18~:k8=\E[19~:k9=\E[20~:kI=\E[2~:\
+ :kN=\E[6~:kP=\E[5~:kb=^H:kd=\EOB:ke=\E[?1l\E>:\
+ :kh=\E[@:kl=\EOD:kr=\EOC:ks=\E[?1h\E=:ku=\EOA:le=^H:\
+ :md=\E[1m:me=\E[m:mr=\E[7m:nd=\E[C:rc=\E8:sc=\E7:\
+ :se=\E[m:sf=^J:so=\E[7m:sr=\EM:ta=^I:\
+ :te=\E[2J\E[?47l\E8:ti=\E7\E[?47h:ue=\E[m:up=\E[A:\
+ :us=\E[4m:
+xterm-bold|xterm terminal emulator (X11R6 Window System) standout w/bold:\
+ :so=\E[1m:tc=xterm:
+xterms|vs100s|xterm terminal emulator (small screen 24x80):\
+ :co#80:li#24:tc=xterm:
+kterm|kterm kanji terminal emulator (X window system):\
+ :es:hs:\
+ :cs=\E[%i%d;%dr:ds=\E[?H:fs=\E[?F:rc=\E8:sc=\E7:\
+ :ts=\E[?E\E[?%i%dT:tc=xterm:
+
+xterm-nic|xterm with ich/ich1 suppressed for non-curses programs:\
+ :IC@:ei=:ic@:im=:tc=xterm:
+
+xterm-color|xterm with color support:\
+ :tc=xterm:tc=klone+color:
+
+xterm-pcolor|xterm with color used for highlights and status line:\
+ :hs:\
+ :ws#40:\
+ :ds=\E]0;\007:fs=^G:md=\E[1m\E[43m:mr=\E[7m\E[34m:\
+ :so=\E[7m\E[31m:ts=\E]0;:us=\E[4m\E[42m:tc=xterm:
+
+hpterm|X-hpterm|hp X11 terminal emulator:\
+ :am:da:db:mi:xs:\
+ :Nl#8:co#80:lh#2:li#24:lm#0:lw#8:pb#9600:sg#0:\
+ :LF=\E&j@:LO=\E&jB:ae=^O:al=\EL:as=^N:bl=^G:bt=\Ei:\
+ :cd=\EJ:ce=\EK:ch=\E&a%dC:cl=\E&a0y0C\EJ:\
+ :cm=\E&a%dy%dC:cr=^M:ct=\E3:cv=\E&a%dY:dc=\EP:dl=\EM:\
+ :do=\EB:ei=\ER:im=\EQ:k1=\Ep:k2=\Eq:k3=\Er:k4=\Es:\
+ :k5=\Et:k6=\Eu:k7=\Ev:k8=\Ew:kA=\EL:kC=\EJ:kD=\EP:\
+ :kE=\EK:kF=\ES:kH=\EF:kI=\EQ:kL=\EM:kM=\ER:kN=\EU:\
+ :kP=\EV:kR=\ET:kS=\EJ:kT=\E1:ka=\E3:kb=^H:kd=\EB:\
+ :ke=\E&s0A:kh=\Eh:kl=\ED:kr=\EC:ks=\E&s1A:kt=\E2:\
+ :ku=\EA:le=^H:md=\E&dB:me=\E&d@:mh=\E&dH:ml=\El:\
+ :mr=\E&dB:mu=\Em:nd=\EC:..pk=\E&f%p1%dk%p2%l%dL%p2%s:\
+ :..pl=\E&f1a%p1%dk%p2%l%dL%p2%s:\
+ :..pn=\E&f%p1%dk%p2%l%dd0L%p2%s:\
+ :..px=\E&f2a%p1%dk%p2%l%dL%p2%s:\
+ :..sa=\E&d%?%p7%t%'s'%c%;%p1%p3%|%p6%|%{2}%*%p2%{4}%*%+%p4%+%p5%{8}%*%+%'@'%+%c%?%p9%t%'\016'%c%e%'\017'%c%;:\
+ :se=\E&d@:sf=^J:so=\E&dJ:sr=\ET:st=\E1:ta=^I:\
+ :ue=\E&d@:up=\EA:us=\E&dD:
+
+emu|emu native mode:\
+ :mi:ms:xo:\
+ :Co#15:co#80:it#8:li#24:pa#64:vt#200:\
+ :*6=\Esel:@0=\Efind:@8=^M:\
+ :AB=\Es%i%p1%d; setaf=\Er%i%p1%d;:AL=\EQ%d;:\
+ :DC=\EI%d;:DL=\ER%d;:DO=\Ep%d;:F1=\EF11:F2=\EF12:\
+ :F3=\EF13:F4=\EF14:F5=\EF15:F6=\EF16:F7=\EF17:\
+ :F8=\EF18:F9=\EF19:FA=\EF20:LE=\Eq-%d;:RI=\Eq%d;:\
+ :UP=\Ep-%d;:\
+ :ac=a\202f\260g261j\213k\214l\215m\216n\217o\220q\222s\224t\225u\226v\227w\230x\231~\244:\
+ :ae=\200:al=\EQ1;:as=\200:bl=^G:cb=\EL:ce=\EK:\
+ :cl=\EP\EE0;0;:cm=\EE%d;%d;:cr=^M:cs=\Ek%d;%d;:\
+ :ct=\Ej:dc=\EI1;:dl=\ER1;:do=\EB:eA=\200:\
+ :ec=\Ej%d;\ned=\EN:ei=\EX:ho=\EE0;0;:if=\200:im=\EY:\
+ :is=\ES\Er0;\Es0;:k0=\EF00:k1=\EF01:k2=\EF02:\
+ :k3=\EF03:k4=\EF04:k5=\EF05:k6=\EF06:k7=\EF07:\
+ :k8=\EF08:k9=\EF09:k;=\EF10:kD=\177:kI=\Eins:\
+ :kN=\Enext:kP=\Eprior:kb=^H:kd=\EB:kl=\EC:kr=\ED:\
+ :ku=\EA:le=^H:mb=\ES\EW:md=\ES\EU:me=\ES:mr=\ES\ET:\
+ :nd=\ED:oc=\Es0;\Er0;:r2=\ES\Es0;\Er0;:se=\ES:sf=\EG:\
+ :so=\ES\ET:sr=\EF:st=\Eh:ta=^I:ue=\ES:up=\EA:\
+ :us=\ES\EV:ve=\Ea:vi=\EZ:vs=\Ea:
+
+
+cbunix|cb unix virtual terminal:\
+ :am:da:db:\
+ :co#80:li#24:lm#0:\
+ :al=\EP:bl=^G:cd=\EL:ce=\EK:cl=\EL:cm=\EG%r%.%.:\
+ :cr=^M:dc=\EM:dl=\EN:do=^J:ei=:ic=\EO:im=:kd=\EB:\
+ :kh=\EE:kl=\ED:kr=\EC:ku=\EA:le=^H:nd=\EC:se=\Eb^D:\
+ :sf=^J:so=\Ea^D:ue=\Eb^A:up=\EA:us=\Ea^A:
+vremote|virtual remote terminal:\
+ :am@:\
+ :co#79:tc=cbunix:
+pty|4bsd pseudo teletype:\
+ :cm=\EG%+ %+ :se=\Eb$:so=\Ea$:ue=\Eb!:us=\Ea!:tc=cbunix:
+
+
+screen|VT 100/ANSI X3.64 virtual terminal:\
+ :am:km:mi:ms:xn:\
+ :co#80:it#8:li#24:\
+ :AL=\E[%dL:DC=\E[%dP:DL=\E[%dM:DO=\E[%dB:F1=\E[23~:\
+ :F2=\E[24~:IC=\E[%d@:LE=\E[%dD:RI=\E[%dC:UP=\E[%dA:\
+ :ac=``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~..--++\054\054hhII00:\
+ :ae=^O:al=\E[L:as=^N:bl=^G:bt=\E[Z:cd=\E[J:ce=\E[K:\
+ :cl=\E[H\E[J:cm=\E[%i%d;%dH:cr=^M:cs=\E[%i%d;%dr:\
+ :ct=\E[3g:dc=\E[P:dl=\E[M:do=^J:ei=\E[4l:ho=\E[H:\
+ :im=\E[4h:is=\E)0:k1=\EOP:k2=\EOQ:k3=\EOR:k4=\EOS:\
+ :k5=\E[15~:k6=\E[17~:k7=\E[18~:k8=\E[19~:k9=\E[20~:\
+ :k;=\E[21~:kD=\E[3~:kH=\E[4~:kI=\E[2~:kN=\E[6~:\
+ :kP=\E[5~:kb=^H:kd=\EOB:ke=\E[?1l\E>:kh=\E[1~:\
+ :kl=\EOD:kr=\EOC:ks=\E[?1h\E=:ku=\EOA:le=^H:mb=\E[5m:\
+ :md=\E[1m:me=\E[m:mr=\E[7m:nd=\E[C:nw=\EE:r2=\Ec:\
+ :rc=\E8:sc=\E7:se=\E[23m:sf=^J:so=\E[3m:sr=\EM:\
+ :st=\EH:ta=^I:ue=\E[24m:up=\EM:us=\E[4m:
+screen-w|VT 100/ANSI X3.64 virtual terminal with 132 cols:\
+ :co#132:tc=screen:
+
+screen2|VT 100/ANSI X3.64 virtual terminal:\
+ :co#80:it#8:li#24:\
+ :AL=\E[%dL:DC=\E[%dP:DL=\E[%dM:DO=\E[%dB:IC=\E[%d@:\
+ :LE=\E[%dD:RI=\E[%dC:UP=\E[%dA:al=\E[L:bt=\E[Z:\
+ :cd=\E[J:ce=\E[K:cl=\E[2J\E[H:cm=\E[%i%d;%dH:cr=^M:\
+ :ct=\E[3g:dc=\E[P:dl=\E[M:do=\E[B:ei=\E[4l:ic=:\
+ :im=\E[4h:k0=\E~:k1=\ES:k2=\ET:k3=\EU:k4=\EV:k5=\EW:\
+ :k6=\EP:k7=\EQ:k8=\ER:k9=\E0I:kb=^H:kd=\EB:kh=\EH:\
+ :kl=\ED:kr=\EC:ku=\EA:le=^H:nd=\E[C:nw=^M^J:r1=\Ec:\
+ :rc=\E8:sc=\E7:se=\E[23m:sf=^J:so=\E[3m:sr=\EM:\
+ :st=\EH:ta=^I:ue=\E[24m:up=\E[A:us=\E[4m:
+screen3|VT 100/ANSI X3.64 virtual terminal:\
+ :km:mi:ms:\
+ :co#80:it#8:li#24:\
+ :AL=\E[%dL:DC=\E[%dP:DL=\E[%dM:DO=\E[%dB:IC=\E[%d@:\
+ :LE=\E[%dD:RI=\E[%dC:UP=\E[%dA:al=\E[L:bl=^G:bt=\E[Z:\
+ :cd=\E[J:ce=\E[K:cl=\E[H\E[J:cm=\E[%i%d;%dH:cr=^M:\
+ :cs=\E[%i%d;%dr:ct=\E[3g:dc=\E[P:dl=\E[M:do=^J:\
+ :ei=\E[4l:ho=\E[H:im=\E[4h:is=\E)0:k1=\EOP:k2=\EOQ:\
+ :k3=\EOR:k4=\EOS:kb=^H:kd=\EOB:ke=\E>:kl=\EOD:\
+ :kr=\EOC:ks=\E=:ku=\EOA:le=^H:mb=\E[5m:md=\E[1m:\
+ :me=\E[m:mr=\E[7m:nd=\E[C:nw=\EE:r1=\Ec:rc=\E8:\
+ :sc=\E7:se=\E[23m:sf=^J:so=\E[3m:sr=\EM:st=\EH:ta=^I:\
+ :ue=\E[24m:up=\EM:us=\E[4m:
+
+
+
+oldsun|Sun Microsystems Workstation console:\
+ :am:km:mi:ms:\
+ :co#80:it#8:li#34:\
+ :AL=\E[%dL:DC=\E[%dP:DL=\E[%dM:IC=\E[%d@:al=\E[L:\
+ :bl=^G:cd=\E[J:ce=\E[K:cl=^L:cm=\E[%i%d;%dH:cr=^M:\
+ :dc=\E[P:dl=\E[M:do=\E[B:ei=:i1=\E[1r:ic=\E[@:im=:\
+ :k1=\EOP:k2=\EOQ:k3=\EOR:k4=\EOS:kd=\E[B:kh=\E[H:\
+ :kl=\E[D:kr=\E[C:ku=\E[A:le=^H:nd=\E[C:se=\E[m:sf=^J:\
+ :so=\E[7m:ta=^I:up=\E[A:
+sun|sun1|sun2|Sun Microsystems Inc. workstation console:\
+ :am:km:ms:\
+ :co#80:li#35:\
+ :%7=\E[194z:&5=\E[193z:&8=\E[195z:@7=\E[220z:\
+ :AL=\E[%dL:DC=\E[%dP:DL=\E[%dM:F1=\E[234z:F2=\E[235z:\
+ :IC=\E[%d@:K2=\E[218z:al=\E[L:bl=^G:cd=\E[J:ce=\E[K:\
+ :cl=^L:cm=\E[%i%d;%dH:cr=^M:dc=\E[P:dl=\E[M:do=^J:\
+ :ei=:ic=\E[@:im=:k1=\E[224z:k2=\E[225z:k3=\E[226z:\
+ :k4=\E[227z:k5=\E[228z:k6=\E[229z:k7=\E[230z:\
+ :k8=\E[231z:k9=\E[232z:k;=\E[233z:kD=\177:kN=\E[222z:\
+ :kP=\E[216z:kb=^H:kd=\E[B:kh=\E[214z:kl=\E[D:kr=\E[C:\
+ :ku=\E[A:le=^H:md=\E[1m:me=\E[m:mr=\E[7m:nd=\E[C:\
+ :r2=\E[s:\
+ :..sa=\E[0%?%p6%t;1%;%?%p2%t;4%;%?%p1%p3%|%t;7%;m:\
+ :se=\E[m:sf=^J:so=\E[7m:ta=^I:ue=\E[m:up=\E[A:\
+ :us=\E[4m:
+sun-s|Sun Microsystems Workstation window with status line:\
+ :hs:\
+ :li#34:\
+ :ds=\E]l\E\\:fs=\E\\:ts=\E]l:tc=sun:
+sun-e-s|sun-s-e|Sun Microsystems Workstation with status hacked for emacs:\
+ :hs:\
+ :ds=\E]l\E\\:fs=\E\\:ts=\E]l:tc=sun-e:
+sun-48|Sun 48-line window:\
+ :co#80:li#48:tc=sun:
+sun-34|Sun 34-line window:\
+ :co#80:li#34:tc=sun:
+sun-24|Sun 24-line window:\
+ :co#80:li#24:tc=sun:
+sun-17|Sun 17-line window:\
+ :co#80:li#17:tc=sun:
+sun-12|Sun 12-line window:\
+ :co#80:li#12:tc=sun:
+sun-1|Sun 1-line window for sysline:\
+ :es:hs:\
+ :co#80:li#1:\
+ :ds=^L:fs=\E[K:ts=^M:tc=sun:
+sun-e|sun-nic|sune|Sun Microsystems Workstation without insert character:\
+ :ei@:ic@:im@:tc=sun:
+sun-c|sun-cmd|Sun Microsystems Workstation console with scrollable history:\
+ :te=\E[>4h:ti=\E[>4l:tc=sun:
+
+
+wsiris|iris40|iris emulating a 40 line visual 50 (approximately):\
+ :am:\
+ :co#80:it#8:li#40:\
+ :al=\EL:cd=\EJ:ce=\EK:cl=\Ev:cm=\EY%+ %+ :dl=\EM:\
+ :ho=\EH:is=\E7B0\E7F7\E7C2\E7R3:k0=\E0:k1=\E1:k2=\E2:\
+ :k3=\E3:k4=\E4:k5=\E5:k6=\E6:k7=\E7:k8=\E8:k9=\E9:\
+ :kd=\EB:kl=\ED:kr=\EC:ku=\EA:le=^H:nd=\EC:se=\E0@:\
+ :so=\E9P:sr=\EI:ta=^I:ue=\E7R3\E0@:up=\EA:\
+ :us=\E7R2\E9P:ve=\E>:vs=\E;:
+
+
+psterm|psterm-basic|NeWS psterm-80x34:\
+ :am:bs:hs:km:ul:\
+ :co#80:it#8:li#34:\
+ :al=\EA:cd=\EB:ce=\EC:cl=^L:cm=\E%d;%d;:cs=\EE%d;%d;:\
+ :dc=\EF:dl=\EK:do=\EP:ei=\ENi:fs=\ENl:ho=\ER:i1=\EN*:\
+ :im=\EOi:kd=\E[B:kl=\E[D:kr=\E[C:ku=\E[A:le=\ET:\
+ :ll=\EU:mb=\EOb:md=\EOd:me=\EN*:mr=\EOr:nd=\EV:rc=^\:\
+ :sc=^]:se=\ENo:sf=\EW:so=\EOo:sr=\EX:ta=^I:te=\ENt:\
+ :ti=\EOt:ts=\EOl:ue=\ENu:up=\EY:us=\EOu:vb=\EZ:
+psterm-96x48|NeWS psterm 96x48:\
+ :co#96:li#48:tc=psterm:
+psterm-90x28|NeWS psterm 90x28:\
+ :co#90:li#28:tc=psterm:
+psterm-80x24|NeWS psterm 80x24:\
+ :co#80:li#24:tc=psterm:
+psterm-fast|NeWS psterm fast version (flaky ctrl chars):\
+ :am:bs:hs:km:ul:\
+ :co#80:it#8:li#34:\
+ :al=^A:cd=^B:ce=^C:cl=^L:cm=\004%d;%d;:cs=\005%d;%d;:\
+ :dc=^F:dl=^K:do=^P:ei=^Ni:fs=^Nl:ho=^R:i1=^N*:im=^Oi:\
+ :kd=\E[B:kl=\E[D:kr=\E[C:ku=\E[A:le=^T:ll=^U:mb=^Ob:\
+ :md=^Od:me=^N*:mr=^Or:nd=^V:rc=^\:sc=^]:se=^No:sf=^W:\
+ :so=^Oo:sr=^X:ta=^I:te=^Nt:ti=^Ot:ts=^Ol:ue=^Nu:\
+ :up=^Y:us=^Ou:vb=^Z:
+
+
+apollo|apollo console:\
+ :am:mi:\
+ :co#88:li#53:\
+ :al=\EI:cd=\EJ:ce=\EK:ch=\EN%d:cl=^L:cm=\EM%+ %d):\
+ :cv=\EO+ :dc=\EP:dl=\EL:do=\EB:ei=\ER:im=\EQ:le=^H:\
+ :nd=\EC:se=\ET:sf=\EE:so=\ES:sr=\ED:te=\EX:ti=\EW:\
+ :ue=\EV:up=\EA:us=\EU:
+
+apollo_15P|apollo 15 inch display:\
+ :ei@:im@:tc=vt132:
+apollo_19L|apollo 19 inch display:\
+ :ei@:im@:tc=vt132:
+apollo_color|apollo color display:\
+ :ei@:im@:tc=vt132:
+
+
+fos|fortune|Fortune system:\
+ :am:bw:\
+ :co#80:li#25:\
+ :@7=^Ak\r:@8=^Aq:ac=l m"k(j*v%w#q&x-:ae=^O:al=\034E:\
+ :as=\Eo:bl=^G:cd=\034Y:ce=^\Z:cl=\014:cm=\034C%+ %+ :\
+ :cr=^M:dc=\034W:dl=\034R:do=\n:ei=:ho=\036:ic=\034Q:\
+ :im=:is=^_..:k1=^Aa\r:k2=^Ab\r:k3=^Ac\r:k4=^Ad\r:\
+ :k5=^Ae\r:k6=^Af\r:k7=^Ag\r:k8=^Ah\r:kN=^Ao\r:\
+ :kP=^An\r:kb=^H:kd=^Ay\r:kh=^A?\r:kl=^Aw\r:kr=^Az\r:\
+ :ku=^Ax\r:le=^H:mb=\EN:me=\EI:mr=\EH:nw=^M^J:se=^\I`:\
+ :sf=^J:so=^\H`:ta=^Z:ue=^\IP:up=\013:us=^\HP:ve=\E\\:\
+ :vi=\E]:vs=\E\072:
+
+
+
+altos2|alt2|altos-2|altos II:\
+ :co#80:it#8:li#24:sg#0:\
+ :*5=^Am\r:*8=^An\r:DL=\E[M:FM=^A`\r:FN=^Aa\r:\
+ :FO=^Ab\r:FP=^Ac\r:FQ=^Ad\r:FR=^Ae\r:FS=^Af\r:\
+ :FT=^Ag\r:FU=^Ah\r:FV=^Ai\r:FW=^Aj\r:FX=^Ak\r:\
+ :RA=\E[?7l:SA=\E[?7h:al=\E[L:cd=\E[J:ce=\E[K:\
+ :cl=\E[H\E[2J:cm=\E[%i%d;%dH:cr=^M:dc=\E[P:do=\E[1B:\
+ :ei=:ho=\E[H:ic=\E[@:if=/usr/share/lib/tabset/vt100:\
+ :im=:is=\E>\E[?3l\E[?4l\E[?5l\E[?7h\E[?8h:k0=^AI\r:\
+ :k1=^A@\r:k2=^AA\r:k3=^AB\r:k4=^AC\r:k5=^AD\r:\
+ :k6=^AE\r:k7=^AF\r:k8=^AG\r:k9=^AH\r:kA=^AJ\r:\
+ :kB=^AK\r:kC=^AL\r:kD=^AM\r:kE=^AN\r:kF=^AO\r:kb=^H:\
+ :kd=\E[B:kh=\E[f:kl=\E[D:kr=\E[C:ku=\E[A:le=^H:\
+ :nd=\E[1C:nw=^M^J:se=\E[m:sf=^J:so=\E[7m:ta=^I:\
+ :ue=\E[m:up=\E[1A:us=\E[4m:
+altos3|altos5|alt3|alt5|altos-3|altos-5|altos III or V:\
+ :mb=\E[5p:me=\E[p:sr=\EM:tc=altos2:
+altos4|alt4|altos-4|altos IV:\
+ :tc=wy50:
+altos7|alt7|altos VII:\
+ :am:mi:\
+ :co#80:li#24:sg#0:\
+ :*5=^Am\r:*8=^An\r:DL=\ER:FM=^A`\r:FN=^Aa\r:FO=^Ab\r:\
+ :FP=^Ac\r:FQ=^Ad\r:FR=^Ae\r:FS=^Af\r:FT=^Ag\r:\
+ :FU=^Ah\r:FV=^Ai\r:FW=^Aj\r:FX=^Ak\r:\
+ :ac=l2m1k3j5t4u9v=w0q\072x6n8\nblink=\EG2:al=\EE:\
+ :cd=\EY:ce=\ET:cl=\E+^^:cm=\E=%+ %+ :cr=^M:dc=\EW:\
+ :do=^J:ei=\Er:ho=^^:im=\Eq:\
+ :is=\E`\072\Ee(\EO\Ee6\Ec41\E~4\Ec21\Eu\E~2:k0=^AI\r:\
+ :k1=^A@\r:k2=^AA\r:k3=^AB\r:k4=^AC\r:k5=^AD\r:\
+ :k6=^AE\r:k7=^AF\r:k8=^AG\r:k9=^AH\r:kA=^AJ\r:\
+ :kB=^AK\r:kC=^AL\r:kD=^AM\r:kE=^AN\r:kF=^AO\r:kN=\EK:\
+ :kP=\EJ:kb=^H:kd=^J:kh=^^:kl=^H:kr=^L:ku=^K:le=^H:\
+ :md=\EGt:me=\EG0:mh=\EGp:mk=\EG1:mr=\EG4:nd=^L:\
+ :nw=^M^J:pf=\EJ:po=\Ed#:se=\EG0:sf=^J:so=\EG4:sr=\Ej:\
+ :ta=^I:ue=\EG0:up=^K:us=\EG8:
+altos7pc|alt7pc|altos PC VII:\
+ :@7=\ET:tc=altos7:
+
+
+hpgeneric|hp|hewlett-packard generic terminal:\
+ :am:da:db:mi:xs:\
+ :co#80:li#24:lm#0:vt#6:\
+ :al=\EL:bl=^G:cd=\EJ:ce=\EK:ch=\E&a%dC:cl=\EH\EJ:\
+ :cm=\E&a%r%dc%dY:cr=^M:ct=\E3:cv=\E&a%dY:dc=\EP:\
+ :dl=\EM:do=^J:ei=\ER:im=\EQ:kB=\Ei:kb=^H:le=^H:\
+ :nd=\EC:se=\E&d@:sf=^J:so=\E&dJ:st=\E1:ta=^I:\
+ :ue=\E&d@:up=\EA:us=\E&dD:
+
+hp110|hewlett-packard model 110 portable:\
+ :li#16:tc=hpgeneric:
+
+hp+pfk+cr|hp function keys with CR:\
+ :k1=\Ep\r:k2=\Eq\r:k3=\Er\r:k4=\Es\r:k5=\Et\r:\
+ :k6=\Eu\r:k7=\Ev\r:k8=\Ew\r:
+
+hp+pfk-cr|hp function keys w/o CR:\
+ :k1=\Ep:k2=\Eq:k3=\Er:k4=\Es:k5=\Et:k6=\Eu:k7=\Ev:\
+ :k8=\Ew:
+
+hp+pfk+arrows|hp alternate arrow definitions:\
+ :k1@:k2@:k3@:k4@:k5@:k6@:k7@:k8@:kF=\Er\r:kH=\Eq\r:\
+ :kR=\Es\r:kd=\Ew\r:kh=\Ep\r:kl=\Eu\r:kr=\Ev\r:\
+ :ku=\Et\r:
+
+hp+arrows|hp arrow definitions:\
+ :kF=\ES:kH=\EF:kR=\ET:kd=\EB:kh=\Eh:kl=\ED:kr=\EC:\
+ :ku=\EA:
+
+hp262x|HP 262x terminals:\
+ :xs:\
+ :cd=\EJ:dc=\EP:ip=:kA=\EL:kD=\EP:kE=\EK:kF=\ES:\
+ :kI=\EQ:kL=\EM:kM=\ER:kN=\EU:kP=\EV:kR=\ET:kS=\EJ:\
+ :kd=\EB:ke=\E&s0A:kh=\Eh:kl=\ED:kr=\EC:ks=\E&s1A:\
+ :ku=\EA:mb=\E&dA:me=\E&d@:mk=\E&dS:mr=\E&dB:\
+ :..sa=\E&d%'@'%?%p1%t%'B'%|%;%?%p2%t%'D'%|%;%?%p3%t%'B'%|%;%?%p4%t%'A'%|%;%c:\
+ :se=\E&d@:sf=\ES:so=\E&dB:ta=\011:ue=\E&d@:us=\E&dD:
+
+hp2621-ba|2621-ba|2621 w/new rom and strap A set:\
+ :ke@:ks@:tc=hp+arrows:tc=hp2621:
+
+hp2621|hp2621a|hp2621A|2621|2621a|2621A|hp2621-wl|2621-wl|hp 2621 w/labels:\
+ :is=\E&jA\r:ke=\E&jA:tc=hp2621-fl:
+hp2621-fl|2621-fl|hp 2621:\
+ :xo:xs@:\
+ :pb#19200:\
+ :bt=\Ei:cm=\E&a%r%dc%dY:dc=\EP:ip=:is=\E&j@\r:\
+ :ke=\E&j@:ks=\E&jB:me=\E&d@:se=\E&d@:so=\E&dD:\
+ :ta=\011:ue=\E&d@:us=\E&dD:tc=hp+pfk+cr:tc=hpgeneric:
+
+hp2621p|2621p|2621P|hp 2621 with printer:\
+ :pf=\E&p13C:po=\E&p11C:tc=hp2621:
+
+hp2621p-a|2621p-a|hp2621p with fn as arrows:\
+ :tc=hp+pfk+arrows:tc=hp2621p:
+
+hp2621-k45|hp2621k45|2621k45|k45|hp 2621 with 45 keyboard:\
+ :kb=^H:kd=\EB:ke=\E&s0A:kh=\Eh:kl=\ED:kr=\EC:\
+ :ks=\E&s1A:ku=\EA:tc=hp2621:
+
+hp2621-48|48 line 2621:\
+ :li#48:\
+ :cm=\E&a%r%dc%dR:cv=\E&a%dR:ho=\EH:tc=hp2621:
+
+hp2621-nl|hp 2621 with no labels:\
+ :kd@:ke@:kh@:kl@:kr@:ks@:ku@:tc=hp2621-fl:
+
+hp2621-nt|hp 2621 w/no tabs:\
+ :ta@:tc=hp2621:
+
+hp2624|hp2624a|hp2624b|hp2624b-4p|2624-4p|2624|2624a|2624b|Hewlett Packard 2624 B:\
+ :da:db:\
+ :lm#96:\
+ :vb=\E&w13F\E&w12F\E&w13F\E&w12F:tc=hp+labels:tc=scrhp:
+
+hp2626|hp2626a|hp2626p|2626|2626a|2626p|2626A|2626P|hp 2626:\
+ :da:db:\
+ :lm#0:pb#19200:\
+ :SF=\E&r%dD:SR=\E&r%dU:cd=\ED\EJ\EC:ip=:is=\E&j@\r:tc=hp+pfk+cr:tc=hp+labels:tc=scrhp:
+
+hp2626-s|2626-s|hp 2626 using only 23 lines:\
+ :es:hs:\
+ :li#23:\
+ :fs=\E&d@\E&w7f2p1I\E&w4f1I:\
+ :i1=\E&q3t0{0H \E&w0f115n1I \E&w0f1n2I\n\E&w2f1i0d0u22l0S \E&w2f2i0d23u23l0S \E&w7f2p1I \r:\
+ :ts=\E&w7f2p2I\E&w4f2I\r\EK\E&a%p1%dC:tc=hp2626:
+hp2626-ns|2626-ns|hp 2626 using all 24 lines:\
+ :i1=\E&q3t0{0H \E&w0f118n1I \E&w0f1n2I\n\E&w2f1i0d0u23l0S \E&w3f2I \E&w7f2p1I \r:tc=hp2626:
+hp2626-12|2626-12|hewlett-packard 2626 12 lines:\
+ :li#12:tc=hp2626:
+hp2626-12x40|2626-12x40|hewlett-packard 2626 12 lines 40 columns:\
+ :co#40:li#12:tc=hp2626:
+hp2626-x40|2626-x40|hewlett-packard 2626 40 columns:\
+ :co#40:tc=hp2626:
+hp2626-12-s|2626-12-s|hewlett-packard 2626 11 lines plus status:\
+ :li#11:tc=hp2626-s:
+
+hp2627a-rev|hp 2627 with reverse video colors:\
+ :cr=^M:do=^J:\
+ :is=\E&v0m1a0b0c1x1y1z1i0a0b1c1x1y1z0i0S\E&j@\r\E3\r:\
+ :kb=^H:kd=^J:kl=^H:nw=^M^J:sf=^J:ta=^I:\
+ :ue=\E&v0S\E&d@:us=\E&dD\E&v1S:tc=hp2621-nl:
+hp2627a|2627|hp 2627 color terminal with no labels:\
+ :cr=^M:do=^J:\
+ :is=\E&v0m1a1b0c1i0a1b1c2i1a0b0c0i0S\E&j@\r\E3\r:\
+ :kb=^H:kd=^J:kl=^H:nw=^M^J:se=\E&v0S:sf=^J:so=\E&v2S:\
+ :ta=^I:ue=\E&v0S\E&d@:us=\E&dD\E&v1S:tc=hp2621-nl:
+hp2627c|hp 2627 color (cyan) terminal with no labels:\
+ :cr=^M:do=^J:\
+ :is=\E&v0m1a0b0c2i1a1b0c1i0a1b1c0i0S\E&j@\r\E3\r:\
+ :kb=^H:kd=^J:kl=^H:nw=^M^J:sf=^J:ta=^I:tc=hp2627a:
+
+hp2640a|2640a|hp 2640a:\
+ :cm@:ke@:ks@:tc=hp2645:
+
+hp2640b|hp2644a|hp 264x series:\
+ :ke@:ks@:tc=hp2645:
+
+hp2645|hp45|HP 2645 series:\
+ :pb#9600:\
+ :cr=\r:kA=\EL:kD=\EP:kE=\EK:kF=\ES:kI=\EQ:kL=\EM:\
+ :kM=\ER:kN=\EU:kP=\EV:kR=\ET:kS=\EJ:kT=\E1:kd=\EB:\
+ :ke=\E&s0A:kh=\Eh:kl=\ED:kr=\EC:ks=\E&s1A:kt=\E2:\
+ :ku=\EA:mb=\E&dA:me=\E&d@:mh=\E&dH:mr=\E&dB:\
+ :..sa=\E&d%'@'%?%p1%t%'B'%|%;%?%p2%t%'D'%|%;%?%p3%t%'B'%|%;%?%p4%t%'A'%|%;%?%p5%t%'H'%|%;%?%p6%t%'B'%|%;%c:\
+ :us=\E&dD:tc=hpgeneric:
+hp2648|hp2648a|2648a|2648A|2648|HP 2648a graphics terminal:\
+ :cl=\EH\EJ:cm=\E&a%r%dc%dY:dc=\EP:ip=:tc=hp2645:
+
+hp150|hewlett packard Model 150:\
+ :tc=hp2622:
+
+hp2382a|hp2382|hewlett packard 2382a:\
+ :da:db:\
+ :lh#1:lm#48:\
+ :ac@:ae@:as@:me=\E&d@:\
+ :..pn=\E&f0a%p1%dk%p2%l%Pa%?%ga%t%ga%d%e1%;d0L%?%ga%!%t %;%p2%s:\
+ :..sa=\E&d%{0}%Pa%?%p4%t%{1}%ga%+%Pa%;%?%p1%p3%|%p6%|%t%{2}%ga%+%Pa%;%?%p2%p6%|%t%{4}%ga%+%Pa%;%?%p1%p5%|%t%{8}%ga%+%Pa%;%?%p7%t%?%ga%ts%ga%'@'%+%e%'S'%;%e%?%ga%t%ga%'@'%+%e%'@'%;%;%c:tc=hp+labels:tc=scrhp:
+
+hp2621-a|hp2621a-a|2621-a|hp2621 with fn as arrows:\
+ :tc=hp+pfk+arrows:tc=hp2621-fl:
+
+
+newhpkeyboard|generic entry for HP extended keyboard:\
+ :kA=\EL:kB=\Ei:kC=\EJ:kD=\EP:kE=\EK:kF=\ET:kH=\EF:\
+ :kI=\EQ:kL=\EM:kM=\ER:kN=\EU:kP=\EV:kR=\ES:kS=\EJ:\
+ :kb=^H:kd=\EB:ke=\E&s0A:kh=\Eh:kl=\ED:kr=\EC:\
+ :ks=\E&s1A:ku=\EA:tc=hp+pfk-cr:
+
+newhp|generic entry for new hewlett packard terminals:\
+ :am:bw:mi:xo:xs:\
+ :co#80:li#24:pb#4800:\
+ :ac=T1R!U2S"W3O#V4P$t5u6w7v8\072'9(LQKWlRkT5I3@2[MAJSmFjGdHQ;Y+Z*X\0724>q\\\054x.n/:\
+ :ae=^O:al=\EL:as=^N:bl=^G:bt=\Ei:cd=\EJ:ce=\EK:cr=^M:\
+ :ct=\E3:dc=\EP:dl=\EM:do=^J:ei=\ER:i1=\E&jB:im=\EQ:\
+ :ip=:le=^H:mb=\E&dA:md=\E&dF:me=\E&d@\017:mh=\E&dH:\
+ :mk=\E&dS:mr=\E&dB:nd=\EC:nw=^M^J:\
+ :..pk=\E&f0a%p1%dk0d%p2%l%dL%p2%s:\
+ :..pl=\E&f1a%p1%dk0d%p2%l%dL%p2%s:\
+ :..px=\E&f2a%p1%dk0d%p2%l%dL%p2%s:r1=\Eg:\
+ :..sa=\E&d%{0}%Pa%?%p4%t%{1}%ga%+%Pa%;%?%p1%p3%|%p6%|%t%{2}%ga%+%Pa%;%?%p2%p6%|%t%{4}%ga%+%Pa%;%?%p1%p5%|%t%{8}%ga%+%Pa%;%?%p7%t%?%ga%ts%ga%'@'%+%e%'S'%;%e%?%ga%t%ga%'@'%+%e%'@'%;%;%c%?%p9%t\016%e\017%;:\
+ :se=\E&d@:sf=^J:so=\E&dJ:sr=\ET:st=\E1:ta=\011:\
+ :ue=\E&d@:up=\EA:us=\E&dD:tc=newhpkeyboard:
+
+memhp|memory relative addressing for new HP ttys:\
+ :vt#6:\
+ :CM=\E&a%p1%dr%p2%dC:DO=\E&a+%dR:LE=\E&a-%dC:\
+ :RI=\E&a+%dC:UP=\E&a-%dR:ch=\E&a%dC:cl=\EH\EJ:\
+ :cm=\E&a%dr%dC:cv=\E&a%dR:ho=\EH:ll=\E&a23R\r:tc=newhp:
+
+scrhp|screen relative addressing for new HP ttys:\
+ :CM=\E&a%p1%dr%p2%dC:DO=\E&a+%dR:LE=\E&a-%dC:\
+ :RI=\E&a+%dC:UP=\E&a-%dR:ch=\E&a%dC:cl=\E&a0c0Y\EJ:\
+ :cm=\E&a%dy%dC:cv=\E&a%dY:ho=\E&a0y0C:ll=\E&a0y0C\EA:tc=newhp:
+
+hp+labels|"standard" label info for new HP ttys:\
+ :Nl#8:lh#2:lw#8:\
+ :LO=\E&jB:\
+ :..pn=\E&f2a%p1%dk%p2%l%Pa%?%ga%t%ga%d%e1%;d0L%?%ga%!%t %;%p2%s:
+
+hp+printer|"standard" printer info for HP ttys:\
+ :ff=\E&p4u0C:pf=\E&p13C:po=\E&p11C:ps=\EH\E&p4dF:
+
+
+hp2621b|2621b|hp 2621b with old style keyboard:\
+ :Nl#8:lh#1:lm#48:lw#8:\
+ :LO=\E&jB:kF=\ET:kH=\EF:kR=\ES:kd=\EB:kh=\Eh:kl=\ED:\
+ :kr=\EC:ku=\EA:\
+ :..pn=\E&f0a%p1%dk%p2%l%Pa%?%ga%t%ga%d%e1%;d3L%?%ga%!%t%{32}%c%;%p2%s\E%'o'%p1%+%c\r:tc=hp2621:
+
+hp2621b-p|2621b-p|hp 2621b with printer:\
+ :tc=hp+printer:tc=hp2621b:
+
+hp2621b-kx|2621b-kx|hp 2621b with extended keyboard:\
+ :tc=newhpkeyboard:tc=hp2621b:
+
+hp2621b-kx-p|2621b-kx-p|hp 2621b with new keyboard & printer:\
+ :tc=hp+printer:tc=hp2621b-kx:
+
+hp2622|hp2622a|2622|2622a|hp 2622:\
+ :da:db:\
+ :lm#0:pb#19200:\
+ :is=\E&dj@\r:tc=hp+pfk+cr:tc=hp+labels:tc=scrhp:
+
+hp2623|hp2623a|2623|2623a|hp 2623:\
+ :tc=hp2622:
+
+hp2624b-p|hp2624b-4p-p|hewlett packard 2624 B with printer:\
+ :tc=hp+printer:tc=hp2624:
+
+hp2624-10p|hp2624a-10p|hp2624b-10p|2624-10p|2624a-10p|2624b-10p|hewlett packard 2624 B w/ 10 pages of memory:\
+ :lm#240:tc=hp2624:
+
+hp2624b-10p-p|hewlett packard 2624 B w/ extra memory & printer:\
+ :lm#240:tc=hp2624b-p:
+
+hp+color|hp with colors:\
+ :cc:\
+ :Co#16:NC#17:pa#7:\
+ :..Ip=\E&v%?%p2%{1000}%=%t1%e.%p2%d%;a\n%?%p3%{1000}%=%t1%e.%p3%d%;b\n%?%p4%{1000}%=%t1%e.%p4%d%;c\n%?%p5%{1000}%=%t1%e.%p5%d%;x\n%?%p6%{1000}%=%t1%e.%p6%d%;y\n%?%p7%{1000}%=%t1%e.%p7%d%;z\n%p1%dI:\
+ :oc=\E&v0m1a1b1c0I\E&v1a1I\E&v1b2I\E&v1a1b3I\E&v1c4I\E&v1a1c5I\E&v1b1c6I\E&v1x1y7I:\
+ :op=\E&v0S:sp=\E&v%dS:
+
+hp2397a|2397a|hp2397|2397|hewlett packard 2397A color terminal:\
+ :is=\E&w6f80X:tc=memhp:tc=hp+labels:tc=hp+color:
+
+hpansi|hp700|hewlett packard 700/44 in HP-PCterm mode:\
+ :am:eo:xn:xo:\
+ :co#80:li#25:\
+ :@7=\E[4~:RA=\E[?7l:S4=\E[>11h\EPO**x0/65;1/67\E\\:\
+ :S5=\E[>11l\EP1**x0/11;1/13\E[m\E\\:SA=\E[?7h:XF=g:\
+ :XN=e:\
+ :ac=k\277l\332m\300j\331n\305w\302q\304u\264t\303v\301x\263:\
+ :al=\E[L:bl=^G:bt=\E[Z:cd=\E[J:ce=\E[K:cl=\E[2J\E[H:\
+ :cm=\E[%i%d;%dH:cr=^M:dc=\E[P:dl=\E[M:do=\E[B:ei=:\
+ :ho=\E[H:ic=\E[@:im=:\
+ :is=\E[44"p\E[?7h\E[>10h\E[>12h\EP1;1|3/7F\E\\:\
+ :k1=\E[17~:k2=\E[18~:k3=\E[19~:k4=\E[20~:k5=\E[21~:\
+ :k6=\E[23~:k7=\E[24~:k8=\E[25~:k9=\E[26~:k;=\E[28~:\
+ :kB=\E[Z:kN=\E[6~:kP=\E[5~:kb=^H:kd=\E[B:kh=\E[1~:\
+ :kl=\E[D:kr=\E[C:ku=\E[A:le=\E[D:nd=\E[C:se=\E[m:\
+ :sf=^J:so=\E[7m:ta=^I:ue=\E[m:up=\E[A:us=\E[4m:\
+ :ve=\E[?25h:vi=\E[?25l:
+hp2392|2392|2393|239x series:\
+ :co#80:\
+ :bt=\Ei:cm=\E&a%dy%dC:cv=\E&a%dY:im=\EQ:k1=\Ep\r:\
+ :k2=\Eq\r:k3=\Er\r:k4=\Es\r:k5=\Et\r:k6=\Eu\r:\
+ :k7=\Ev\r:k8=\Ew\r:kF=\EU:kN=\Eu:kP=\Ev:kR=\EV:\
+ :kh=\Eh:ue=\E&d@:us=\E&dD:tc=hpsub:
+
+hpsub|hp terminals -- capability subset:\
+ :am:da:db:mi:xo:xs:\
+ :li#24:\
+ :al=\EL:bl=^G:cd=\EJ:ce=\EK:ch=\E&a%dC:cl=\EH\EJ:\
+ :cr=^M:dc=\EP:dl=\EM:do=\EB:ei=\ER:\
+ :if=/usr/lib/tabset/stdcrt:is=\E&s1A\E<\E&k0\\:kb=^H:\
+ :kd=\EB:ke=\E&s0A:kh=\Eh:kl=\ED:kr=\EC:ks=\E&s1A:\
+ :ku=\EA:le=^H:nd=\EC:se=\E&d@:sf=^J:so=\E&dB:ta=^I:\
+ :up=\EA:
+
+hpex|hp extended capabilites:\
+ :cm=\E&a%dy%dC:cr=^M:cv=\E&a%dY:do=^J:im=\EQ:kb=^H:\
+ :kd=^J:kl=^H:nw=^M^J:sf=^J:ta=^I:ue=\E&d@:us=\E&dD:tc=hpsub:
+
+hp236|hp236 internal terminal emulator:\
+ :am:\
+ :co#80:li#24:\
+ :al=\EG:ce=\EK:cl=\EF:cm=\EE%+ %+ :dc=\EJ:dl=\EH:ei=:\
+ :ic=\EI:im=:le=^H:se=\ECI:so=\EBI:up=^K:ve=\EDE:\
+ :vs=\EDB:
+
+hp300h|HP Catseye console:\
+ :am:da:db:mi:xs:\
+ :co#128:li#51:lm#0:sg#0:\
+ :al=\EL:bl=^G:bt=\Ei:cd=\EJ:ce=\EK:ch=\E&a%dC:\
+ :cl=\E&a0y0C\EJ:cm=\E&a%dy%dC:cr=^M:ct=\E3:\
+ :cv=\E&a%dY:dc=\EP:dl=\EM:do=\EB:ei=\ER:\
+ :if=/usr/share/tabset/stdcrt:im=\EQ:kb=^H:kd=\EB:\
+ :ke=\E&s0A:kh=\Eh:kl=\ED:kr=\EC:ks=\E&s1A:ku=\EA:\
+ :le=^H:me=\E&d@:nd=\EC:se=\E&d@:sf=^J:so=\E&dB:ta=^I:\
+ :ue=\E&d@:up=\EA:us=\E&dD:
+hp9837|hp98720|hp98721|HP 9000/300 workstations:\
+ :am:da:db:mi:xs:\
+ :co#128:it#8:li#46:lm#0:\
+ :al=\EL:bl=^G:bt=\Ei:cd=\EJ:ce=\EK:ch=\E&a%dC:\
+ :cl=\E&a0y0C\EJ:cm=\E&a%dy%dC:ct=\E3:cv=\E&a%dY:\
+ :dc=\EP:dl=\EM:do=\EB:ei=\ER:im=\EQ:is=\E&v0m1b0i&j@:\
+ :kA=\EL:kD=\EP:kE=\EK:kI=\EQ:kL=\EM:kN=\EU:kP=\EV:\
+ :kS=\EJ:kb=^H:kd=\EB:ke=\E&s0A:kh=\Eh:kl=\ED:kr=\EC:\
+ :ks=\E&s1A:ku=\EA:le=^H:me=\E&d@:nd=\EC:se=\E&v0S:\
+ :sf=^J:so=\E&v5S:st=\E1:ta=^I:ue=\E&d@:up=\EA:\
+ :us=\E&dD:
+hp98550|hp98550a|HP 9000 Series 300 color console:\
+ :am:da:db:mi:xs:\
+ :co#128:it#8:li#49:lm#0:\
+ :ae=^O:al=\EL:as=^N:bl=^G:bt=\Ei:cd=\EJ:ce=\EK:\
+ :ch=\E&a%dC:cl=\EH\EJ:cm=\E&a%dy%dC:cr=^M:ct=\E3:\
+ :cv=\E&a%dY:dc=\EP:dl=\EM:do=^J:ei=\ER:\
+ :if=/usr/share/tabset/9837:im=\EQ:k1=\Ep:k2=\Eq:\
+ :k3=\Er:k4=\Es:k5=\Et:k6=\Eu:k7=\Ev:k8=\Ew:kA=\EL:\
+ :kC=\EJ:kD=\EP:kE=\EK:kF=\ES:kH=\EF:kI=\EQ:kL=\EM:\
+ :kM=\ER:kN=\EU:kP=\EV:kR=\ET:kS=\EJ:kT=\E1:ka=\E3:\
+ :kb=^H:kd=\EB:ke=\E&s0A:kh=\Eh:kl=\ED:kr=\EC:\
+ :ks=\E&s1A:kt=\E2:ku=\EA:le=^H:mb=\E&dA:md=\E&dJ:\
+ :me=\E&d@:mh=\E&dH:mk=\E&ds:mr=\E&dJ:nd=\EC:se=\E&d@:\
+ :sf=^J:so=\E&dJ:st=\E1:ta=^I:ue=\E&d@:up=\EA:\
+ :us=\E&dD:ve=\E*dQ:vi=\E*dR:
+hp700-wy|HP700/41 emulating wyse30:\
+ :am:bw:mi:ms:\
+ :co#80:it#8:li#24:sg#1:ug#1:\
+ :al=0.7*\EE:bt=\EI:cd=\EY:ce=10\ET:cl=^Z:\
+ :cm=\E=%+ %+ :cr=^M:ct=\E0:cv=\E[%+ :dc=\EW:dl=\ER:\
+ :do=^V:ei=\Er:ho=^^:i1=\E~"\EC\Er\E(\EG0\003\E`9\E`1:\
+ :if=/usr/share/tabset/hp700-wy:im=\Eq:kB=\EI:kC=^Z:\
+ :kE=\ET:kI=\Eq:kM=\Er:kS=\EY:kT=\EI:kb=\177:kd=^V:\
+ :kh=^^:kl=^H:kr=^L:ku=^K:le=^H:ll=^^^K:nd=^L:\
+ :se=10\EG0:so=10\EG4:sr=\Ej:ta=\011\nhts=\E1:\
+ :ue=10\EG0:up=^K:us=10\EG8:
+hp70092|70092a|70092A|hp70092a|hp70092A|HP 700/92:\
+ :am:da:db:xs:\
+ :Nl#8:co#80:lh#2:li#24:lm#0:lw#8:\
+ :LF=\E&j@:LO=\E&jB:ae=^O:al=\EL:as=^N:bl=^G:bt=\Ei:\
+ :ce=\EK:ch=\E&a%dC:cl=\E&a0y0C\EJ:cm=\E&a%dy%dC:\
+ :cr=^M:ct=\E3:cv=\E&a%dY:dc=\EP:dl=\EM:do=\EB:ei=\ER:\
+ :im=\EQ:k1=\Ep:k2=\Eq:k3=\Er:k4=\Es:k5=\Et:k6=\Eu:\
+ :k7=\Ev:k8=\Ew:kA=\EL:kC=\EJ:kD=\EP:kE=\EK:kF=\ES:\
+ :kH=\EF:kI=\EQ:kL=\EM:kM=\ER:kN=\EU:kP=\EV:kR=\ET:\
+ :kS=\EJ:kT=\E1:ka=\E3:kb=^H:kd=\EB:ke=\E&s0A:kh=\Eh:\
+ :kl=\ED:kr=\EC:ks=\E&s1A:kt=\E2:ku=\EA:le=^H:\
+ :mb=\E&dA:md=\E&dB:me=\E&d@:mh=\E&dH:mr=\E&dB:nd=\EC:\
+ :se=\E&d@:so=\E&dJ:sr=\ET:st=\E1:ta=^I:ue=\E&d@:\
+ :up=\EA:us=\E&dD:
+
+bobcat|sbobcat|HP 9000 model 300 console:\
+ :am:da:db:mi:xs:\
+ :co#128:it#8:li#47:sg#0:\
+ :al=10*\EL:bt=\Ei:cd=\EJ:ce=\EK:ch=6\E&a%dC:\
+ :cl=\EH\EJ:cm=6\E&a%dy%dC:cr=^M:cv=6\E&a%dY:dc=\EP:\
+ :dl=10*\EM:do=\EB:ei=\ER:im=\EQ:kb=^H:kd=\EB:\
+ :ke=\E&s0A:kh=\Eh:kl=\ED:kr=\EC:ks=\E&s1A:ku=\EA:\
+ :le=^H:nd=\EC:nw=^M^J:se=\E&d@:sf=^J:so=\E&dB:ta=^I:\
+ :ue=\E&d@:up=\EA:us=\E&dD:
+gator-t|HP 9000 model 237 emulating extra-tall AAA:\
+ :li#94:tc=gator:
+gator|HP 9000 model 237 emulating AAA:\
+ :bw:km:mi:ul:\
+ :co#128:it#8:li#47:\
+ :AL=1*\E[%dL:DC=4\E[%dP:DL=1*\E[%dM:IC=4\E[%d@:\
+ :al=\E[L:bl=^G:bt=\E[Z:cd=\E[J:ce=\E[K:ch=\E[%i%d`:\
+ :cl=\E[H\E[J:cm=\E[%i%d;%dH:cr=^M:dc=\E[P:dl=\E[M:\
+ :do=^J:ei=:ho=\E[H:ic=\E[@:im=:kb=^H:kd=^J:kl=^H:\
+ :le=^H:me=\E[m:mr=\E[7m:nd=\E[C:nw=^M^J:\
+ :rp=1*%.\E[%db:se=\E[m:so=\E[7m:ta=^I:ue=\E[m:up=\EM:\
+ :us=\E[4m:
+gator-52|HP 9000 model 237 emulating VT52:\
+ :co#128:li#47:tc=vt52:
+gator-52t|HP 9000 model 237 emulating extra-tall VT52:\
+ :li#94:tc=gator-52:
+
+
+dku7003-dumb|Honeywell Bull DKU 7003 dumb mode:\
+ :co#80:li#25:\
+ :cd=^_:ce=\E[K:cl=^]^_:cm=\E[%i%d;%dH:cr=^M:do=^K:\
+ :ho=^]:kb=^H:kd=^K:kh=^]:kl=^Y:kr=^X:ku=^Z:le=^Y:\
+ :nd=^X:nw=^M^J:sf=^J:ta=^I:up=^Z:vb=\E[2h\E[2l:
+dku7003|Honeywell Bull DKU 7003 all features described:\
+ :ms:\
+ :sg#1:ug#1:\
+ :mb=\E[5m:md=\E[7m:me=\E[m:mh=\E[2m:mr=\E[7m:se=\E[m:\
+ :so=\E[7m:ue=\E[m:us=\E[4m:tc=dku7003-dumb:
+
+
+adm1a|adm1|lsi adm1a:\
+ :am:\
+ :co#80:li#24:\
+ :bl=^G:cl=\E;:cm=\E=%+ %+ :cr=^M:do=^J:ho=^^:le=^H:\
+ :nd=^L:sf=^J:up=^K:
+adm2|lsi adm2:\
+ :am:\
+ :co#80:li#24:\
+ :al=\EE:bl=^G:cd=\EY:ce=\ET:cl=\E;:cm=\E=%+ %+ :\
+ :cr=^M:dc=\EW:dl=\ER:do=^J:ei=:ho=^^:ic=\EQ:im=:\
+ :kd=^J:kh=^^:kl=^H:kr=^L:ku=^K:le=^H:nd=^L:sf=^J:\
+ :up=^K:
+adm3|lsi adm3:\
+ :am:\
+ :co#80:li#24:\
+ :bl=^G:cl=^Z:cr=^M:do=^J:le=^H:sf=^J:
+adm3a|lsi adm3a:\
+ :am:\
+ :co#80:li#24:\
+ :bl=^G:cl=\032:cm=\E=%+ %+ :cr=^M:do=^J:ho=^^:le=^H:\
+ :nd=^L:sf=^J:up=^K:
+adm3a+|adm3a plus:\
+ :kd=^J:kl=^H:kr=^L:ku=^K:tc=adm3a:
+adm5|lsi adm5:\
+ :sg#1:\
+ :bl=^G:cd=\EY:ce=\ET:cr=^M:do=^J:kb=^H:kh=^^:se=\EG:\
+ :so=\EG:tc=adm3a+:
+adm11|lsi adm11:\
+ :am:hs:\
+ :co#80:li#24:\
+ :bl=^G:cd=\EY:ce=\ET:cl=^Z:cm=\E=%+ %+ :cr=^M:do=^J:\
+ :ds=\Eh:fs=\E(\r:kb=^H:kd=^J:kh=^^:kl=^H:kr=^L:ku=^K:\
+ :le=^H:nd=^L:se=\E(:so=\E):ts=\EF\E):up=^K:
+adm12|lsi adm12:\
+ :am:mi:\
+ :co#80:li#24:\
+ :al=\EE:bl=^G:cd=\EY:ce=\ET:cl=^Z:cm=\E=%+ %+ :cr=^M:\
+ :dc=\EW:dl=\ER:do=^J:ei=\Er:ho=^^:im=\Eq:is=\Eq:\
+ :k0=^A0\r:k1=^A1\r:k2=^A2\r:k3=^A3\r:k4=^A4\r:\
+ :k5=^A5\r:k6=^A6\r:k7=^A7\r:k8=^A8\r:k9=^A9\r:kd=^J:\
+ :kl=^H:kr=^L:ku=^K:le=^H:mk=\EG1:nd=^L:se=\EG0:\
+ :so=\EG4:ue=\EG0:up=^K:us=\EG8:
+adm20|lear siegler adm20:\
+ :am:\
+ :co#80:it#8:li#24:\
+ :al=\EE:bl=^G:bt=\EI:cd=\EY:ce=\ET:cl=^Z:\
+ :cm=\E=%i%r%+^_%+^_:cr=^M:dc=\EW:dl=\ER:ei=:ho=^^:\
+ :ic=\EQ:im=:k1=^A:k2=^B:k3=^W:k4=^D:k5=^E:k6=^X:\
+ :k7=^Z:le=^H:nd=^L:se=\E(:so=\E):ta=^I:up=^K:
+adm21|lear siegler adm21:\
+ :sg#1:ug#1:\
+ :al=30*\EE:bl=^G:cd=\EY:ce=\ET:cr=^M:dc=\EW:\
+ :dl=30*\ER:do=^J:ei=:ic=\EQ:im=:kb=^H:kd=^J:kh=^^:\
+ :kl=^H:kr=^L:ku=^K:se=\EG0:sf=^J:so=\EG4:ue=\EG0:\
+ :us=\EG8:tc=adm3a:
+adm22|lsi adm22:\
+ :am:\
+ :co#80:li#24:\
+ :al=\EE:bl=^G:bt=\EI:cd=\Ey:ce=\Et:cl=\E+:\
+ :cm=\E=%+ %+ :cr=^M:dc=\EW:dl=\ER:do=^J:ei=:ho=^^:\
+ :ic=\EQ:im=:\
+ :is=\E%\014\014\014\016\003\200\003\002\003\002\200\200\200\200\200\200\200\200\200\200\200:\
+ :k1=^A@\r:k2=^AA\r:k3=^AB\r:k4=^AC\r:k5=^AD\r:\
+ :k6=^AE\r:k7=^AF\r:kb=^H:kd=^J:kh=^^:kl=^H:kr=^L:\
+ :ku=^K:l1=F1:l2=F2:l3=F3:l4=F4:l5=F5:l6=F6:l7=F7:\
+ :le=^H:nd=^L:se=\E(:so=\E):ta=\Ei:up=^K:
+adm31|lsi adm31:\
+ :am:mi:\
+ :co#80:li#24:\
+ :al=\EE:bl=^G:cd=\EY:ce=\ET:cl=\E*:cm=\E=%+ %+ :\
+ :cr=^M:dc=\EW:dl=\ER:do=^J:ei=\Er:ho=^^:im=\Eq:\
+ :is=\Eu\E0:k0=^A0\r:k1=^A1\r:k2=^A2\r:k3=^A3\r:\
+ :k4=^A4\r:k5=^A5\r:k6=^A6\r:k7=^A7\r:k8=^A8\r:\
+ :k9=^A9\r:kd=^J:kl=^H:kr=^L:ku=^K:le=^H:nd=^L:\
+ :se=\EG0:sf=^J:so=\EG1:ue=\EG0:up=^K:us=\EG1:
+adm31-old|o31|old adm31:\
+ :so=\EG4:ue@:us@:tc=adm31:
+adm36|lsi adm36:\
+ :am:mi:\
+ :co#80:li#24:\
+ :RA=\E[?7l:SA=\E[?7h:al=\E[1L:cd=\E[0J:ce=\E[0K:\
+ :cl=\E[H\E[2J:cm=\E[%i%d;%dH:dl=\E[1M:ei=\E[4l:\
+ :im=\E[4h:is=\E[6;?7h\E[4;20;?1;?3;?6;?4l\E(B\E)B\E>:\
+ :kd=\EB:kl=\ED:kr=\EC:ku=\E[A:le=^H:nd=\E[D:up=\E[A:
+adm42|lsi adm42:\
+ :am:\
+ :co#80:li#24:\
+ :al=\EE:bl=^G:bt=\EI:cd=\EY:ce=\ET:cl=\E;:\
+ :cm=\E=%+ %+ :cr=^M:dc=\EW:dl=\ER:do=^J:ei=\Er:\
+ :im=\Eq:ip=:kd=^J:kh=^^:kl=^H:kr=^L:ku=^K:le=^H:\
+ :nd=^L:pc=\177:se=\EG0:sf=^J:so=\EG4:ta=^I:up=^K:\
+ :vs=\EC\E3 \E3(:
+adm42-ns|lsi adm-42 with no system line:\
+ :al=\EE\EF \011:bt=\EI\EF \011:cd=\EY\EF \011:\
+ :ce=\ET\EF \011:cl=\E;\EF \011:cm=\E=%+ %+ \EF \011:\
+ :dc=\EW\EF \011:dl=\ER\EF \011:ei=\Er\EF \011:\
+ :im=\Eq\EF \011:tc=adm42:
+
+
+pt100|pt200|wren|fenix|prime pt100/pt200:\
+ :am:bw:mi:ms:\
+ :co#80:it#8:li#24:\
+ :DC=\E[%dP:DL=\E[M:DO=\E[%dB:LE=\E[%dD:RI=\E[%dC:\
+ :UP=\E[%dA:al=\E[L\E[t:bt=\E[Z:cd=\E[J\E[r:\
+ :ce=\E[K\E[t:cl=\E?:cm=\E0%+!%+!:cr=^M:dc=\E[P:\
+ :do=\ED:ei=\E[4l:ho=\E$B:im=\E[4h:kb=^H:kd=\E[B:\
+ :ke=\E[>13l:kh=\E$A:kl=\E[D:kr=\E[C:ks=\E[>13h:\
+ :ku=\E[A:le=^H:nd=\E[C:nw=^M^J:se=\E[m:sf=^J:\
+ :so=\E[2;7m:ta=^I:\
+ :ti=\E[>1l\E[>2l\E[>16l\E[4l\E[>9l\E[20l\E[>3l\E[>7h\E[>12l\E[1Q:\
+ :ue=\E[m:up=\EM:us=\E[4m:vb=\E$\E$P:
+pt100w|pt200w|wrenw|fenixw|prime pt100/pt200 in 132-column mode:\
+ :co#132:\
+ :cm=\E[%i%d;%dH:tc=pt100:
+pt250|Prime PT250:\
+ :so@:tc=pt100:
+pt250w|Prime PT250 in 132-column mode:\
+ :so@:tc=pt100w:
+
+
+qvt101|qvt108|qume qvt 101 and QVT 108:\
+ :sg#1:\
+ :se=\EG0:so=\EG4:tc=qvt101+:
+
+qvt101+|qvt101p|qume qvt 101 PLUS product:\
+ :am:bw:hs:ul:\
+ :co#80:li#24:sg#0:\
+ :al=\EE:bl=^G:bt=\EI:cd=\EY:ce=\ET:cl=^Z:\
+ :cm=\E=%+ %+ :cr=^M:ct=\E3:dc=\EW:dl=\ER:do=^J:\
+ :ds=\Eg\Ef\r:ei=:fs=^M:ho=^^:ic=\EQ:im=:k1=^A@\r:\
+ :k2=^AA\r:k3=^AB\r:k4=^AC\r:k5=^AD\r:k6=^AE\r:\
+ :k7=^AF\r:k8=^AG\r:k9=^AH\r:k;=^AI\r:kA=\EE:kB=\EI:\
+ :kE=\ET:kI=\EQ:kL=\ER:kS=\EY:kb=^H:kd=^J:kh=^^:kl=^H:\
+ :kr=^L:ku=^K:le=^H:mr=\EG4:nd=^L:pf=\EA:po=\E@:\
+ :se=\E(:sf=^J:so=\E0P\E):st=\E1:ta=^I:ts=\Eg\Ef:\
+ :ue=\EG0:up=^K:us=\EG8:vb=\Eb\Ed:ve=\E.4:
+qvt102|qume qvt 102:\
+ :ve=\E.:tc=qvt101:
+qvt103|qume qvt 103:\
+ :am:xn:xo:\
+ :co#80:it#8:li#24:vt#3:\
+ :DO=\E[%dB:LE=\E[%dD:RA=\E[?7l:RI=\E[%dC:SA=\E[?7h:\
+ :UP=\E[%dA:bl=^G:cd=\E[J:ce=\E[K:cl=\E[H\E[2J:\
+ :cm=\E[%i%d;%dH:cr=^M:cs=\E[%i%d;%dr:ct=\E[3g:do=^J:\
+ :ho=\E[H:k1=\EOP:k2=\EOQ:k3=\EOR:k4=\EOS:kb=^H:\
+ :kd=\EOB:ke=\E[?1l\E>:kl=\EOD:kr=\EOC:ks=\E[?1h\E=:\
+ :ku=\EOA:le=^H:mb=\E[5m:md=\E[1m:me=\E[m:mr=\E[7m:\
+ :nd=\E[C:r2=\E>\E[?3l\E[?4l\E[?5l\E[?7h\E[?8h:rc=\E8:\
+ :..sa=\E[%?%p1%t;7%;%?%p2%t;4%;%?%p3%t;7%;%?%p4%t;5%;%?%p6%t;1%;m:\
+ :sc=\E7:se=\E[m:sf=^J:so=\E[7m:sr=\EM:st=\EH:ta=^I:\
+ :ue=\E[m:up=\E[A:us=\E[4m:
+qvt103-w|qume qvt103 132 cols:\
+ :co#132:li#24:\
+ :r2=\E>\E[?3h\E[?4l\E[?5l\E[?8h:tc=qvt103:
+qvt119+|qvt119p|qvt119|qume qvt 119 and 119PLUS terminals:\
+ :am:hs:mi:ms:\
+ :co#80:li#24:sg#0:\
+ :al=\EE:bl=^G:bt=\EI:cd=\Ey:ce=\Et:cl=\E*1:\
+ :cm=\E=%+ %+ :cr=^M:ct=\E3:dc=\EW:dl=\ER:do=^J:\
+ :ds=\Eg\Ef\r:ei=\Er:fs=^M:ho=^^:im=\Eq:\
+ :is=\EDF\EC\EG0\Er\E(\E%EX:k0=^AI\r:k1=^A@\r:\
+ :k2=^AA\r:k3=^AB\r:k4=^AC\r:k5=^AD\r:k6=^AE\r:\
+ :k7=^AF\r:k8=^AG\r:k9=^AH\r:kb=^H:kd=^J:kh=^^:kl=^H:\
+ :kr=^L:ku=^K:le=^H:nd=^L:pf=\EA:po=\E@:se=\EG0:sf=^J:\
+ :so=\EG4:sr=\EJ:st=\E1:ta=^I:ts=\Eg\Ef:ue=\EG0:up=^K:\
+ :us=\EG8:vb=\En0\En1:ve=\E.4:vs=\E.2:
+qvt119+-25|qvt119p-25|QVT 119 PLUS with 25 data lines:\
+ :li#25:tc=qvt119+:
+qvt119+-w|qvt119p-w|qvt119-w|QVT 119 and 119 PLUS in 132 column mode:\
+ :co#132:\
+ :is=\EDF\EC\EG0\Er\E(\E%\EX\En4:tc=qvt119+:
+qvt119+-25-w|qvt119p-25-w|qvt119-25-w|QVT 119 and 119 PLUS 132 by 25:\
+ :li#25:tc=qvt119+:
+qvt203|qvt203+|qume qvt 203 Plus:\
+ :al=\E[L:dc=\E[P:dl=\E[M:ei=\E[4l:im=\E[4h:ip=:\
+ :k0=\E[29~:k1=\E[17~:k2=\E[18~:k3=\E[19~:k4=\E[20~:\
+ :k5=\E[21~:k6=\E[23~:k7=\E[24~:k8=\E[25~:k9=\E[28~:\
+ :sf=\n:tc=qvt103:
+qvt203-w|qvt203-w-am|qume qvt 203 PLUS in 132 cols (w/advanced video):\
+ :co#132:li#24:\
+ :r2=\E>\E[?3h\E[?4l\E[?5l\E[?8h:tc=qvt203:
+qvt203-25|QVT 203 PLUS with 25 by 80 column mode:\
+ :co#80:li#25:\
+ :is=\E[=40h\E[?3l:tc=qvt203:
+qvt203-25-w|QVT 203 PLUS with 25 by 132 columns:\
+ :co#132:li#25:\
+ :r2=\E[?3h\E[=40h:tc=qvt203:
+
+
+tvi803|televideo 803:\
+ :cl=\E*:tc=tvi950:
+
+tvi910|televideo model 910:\
+ :am:ms:\
+ :co#80:it#8:li#24:sg#1:ug#1:\
+ :bl=^G:bt=\EI:cd=\EY:ce=\ET:ch=\E]%+ :cl=^Z:\
+ :cm=\E=%+ %+ :cr=^M:cv=\E[%+ :do=^J:ho=\E=\001\001:\
+ :if=/usr/share/tabset/stdcrt:k0=^AI\r:k1=^A@\r:\
+ :k2=^AA\r:k3=^AB\r:k4=^AC\r:k5=^AD\r:k6=^AE\r:\
+ :k7=^AF\r:k8=^AG\r:k9=^AH\r:kb=^H:kd=^J:kh=^^:kl=^H:\
+ :kr=^L:ku=^K:le=^H:nd=^L:se=\EG0:sf=^J:so=\EG4:ta=^I:\
+ :ue=\EG0:up=^K:us=\EG8:
+tvi910+|910+|televideo 910+:\
+ :al=\EE:dc=\EW:dl=\ER:ei=:ho=^^:ic=\EQ:im=:k0=^A@\r:\
+ :k1=^AA\r:k2=^AB\r:k3=^AC\r:k4=^AD\r:k5=^AE\r:\
+ :k6=^AF\r:k7=^AG\r:k8=^AH\r:k9=^AI\r:ll=\E=7 :tc=tvi910:
+
+tvi912|tvi914|tvi920|old televideo 912/914/920:\
+ :am:\
+ :co#80:it#8:li#24:sg#1:ug#1:\
+ :al=\EE:bl=^G:cd=\Ey:ce=\ET:cl=^Z:cm=\E=%+ %+ :cr=^M:\
+ :ct=\E3:dc=\EW:dl=\ER:do=^J:ei=:ho=^^:ic=\EQ:\
+ :if=/usr/share/tabset/stdcrt:im=:k0=^AI\r:k1=^A@\r:\
+ :k2=^AA\r:k3=^AB\r:k4=^AC\r:k5=^AD\r:k6=^AE\r:\
+ :k7=^AF\r:k8=^AG\r:k9=^AH\r:kb=^H:kd=^J:kl=^H:kr=^L:\
+ :ku=^K:le=^H:nd=^L:se=\Ek:sf=^J:so=\Ej:st=\E1:ta=^I:\
+ :ue=\Em:up=^K:us=\El:
+tvi912c|tvi912b|912c|912b|tvi|new televideo 912:\
+ :al=\EE:dl=\ER:tc=tvi912:
+tvi912-2p|tvi920-2p|912-2p|920-2p|tvi-2p|televideo w/2 pages:\
+ :te=\E-07 :ti=\E-17 :tc=tvi912:
+tvi912cc|tvi912 at cowell college:\
+ :cm@:tc=tvi912c:
+
+tvi920b|tvi920c|new televideo 920:\
+ :al=\EE:dl=\ER:k0=^AI\r:k1=^A@\r:k2=^AA\r:k3=^AB\r:\
+ :k4=^AC\r:k5=^AD\r:k6=^AE\r:k7=^AF\r:k8=^AG\r:\
+ :k9=^AH\r:tc=tvi912:
+
+tvi921|televideo model 921 with sysline same as page & real vi function:\
+ :am:hs:xn:xs:\
+ :co#80:li#24:sg#0:\
+ :ae=\E%:al=\EE:as=\E$:cd=\EY:ce=\ET:cl=^Z:\
+ :cm=3\E=%+ %+ :cr=^M:dc=\EW:dl=1*\ER:do=^V:\
+ :ds=\Ef\r\Eg:ei=:fs=\Eg:ho=^^:ic=\EQ:\
+ :if=/usr/lib/tabset/stdcrt:im=:\
+ :is=\El\E"\EF1\E.3\017\EA\E<:kA=\EE:kC=^Z:kD=\EW:\
+ :kE=\ET:kI=\EQ:kL=1*\ER:kS=\EY:kb=^H:kd=^V:kl=^H:\
+ :kr=^L:ku=^K:le=^H:nd=^L:nw=^M^J:se=\EG0:sf=^J:\
+ :so=\EG4:ta=^I:ts=\Ef\EG0:ue=\EG0:up=^K:us=\EG8:\
+ :ve=\E.3:vs=\E.2:
+tvi92B|televideo model 921 with sysline same as page & real vi function:\
+ :am:hs:xn:xs:\
+ :co#80:li#24:sg#0:\
+ :ae=\E%:al=\EE:as=\E$:cd=\EY:ce=\ET:cl=^Z:\
+ :cm=3\E=%+ %+ :cr=^M:dc=\EW:dl=1*\ER:do=^V:\
+ :ds=\Ef\r\Eg:ei=:fs=\Eg:ho=^^:ic=\EQ:\
+ :if=/usr/lib/tabset/stdcrt:im=:\
+ :is=\El\E"\EF1\E.3\017\EA\E<:kA=\EE:kC=^Z:kD=\EW:\
+ :kE=\ET:kI=\EQ:kL=1*\ER:kS=\EY:kb=^H:kd=^V:kl=^H:\
+ :kr=^L:ku=^K:le=^H:nd=^L:nw=^M^J:se=\EG0:sf=^J:\
+ :so=\EG4:ta=^I:ts=\Ef\EG0:ue=\EG0:up=^K:us=\EG8:\
+ :vb=\Eb\Ed:ve=\E.3:vs=\E.2:
+tvi92D|tvi92B with DTR instead of XON/XOFF & better padding:\
+ :al=2*\EE:dl=2*\ER:is=\El\E"\EF1\E.3\016\EA\E<:\
+ :kA=2*\EE:kL=2*\ER:tc=tvi92B:
+
+tvi924|televideo tvi924:\
+ :am:bw:hs:in:mi:ms:xn:xo:\
+ :co#80:it#8:li#24:sg#0:ws#80:\
+ :F1=^AK\r:F2=^AL\r:F3=^AM\r:F4=^AN\r:F5=^AO\r:al=\EE:\
+ :bl=^G:bt=\EI:cd=\Ey:ce=\Et:cl=\E*0:cm=\E=%+ %+ :\
+ :cr=^M:cs=\E_%+ %+ :ct=\E3:dc=\EW:dl=\ER:do=^V:\
+ :ds=\Es0\Ef\031:ei=:fs=\031\Es1:ho=^^:\
+ :i1=\017\E%\E'\E(\EDF\EC\EG0\EN0\Es0\Ev0:ic=\EQ:\
+ :if=/usr/lib/tabset/stdcrt:im=:k0=^A@\r:k1=^AA\r:\
+ :k2=^AB\r:k3=^AC\r:k4=^AD\r:k5=^AE\r:k6=^AF\r:\
+ :k7=^AG\r:k8=^AH\r:k9=^AI\r:k;=^AJ\r:kA=\EE:kC=\E*0:\
+ :kD=\EW:kE=\Et:kI=\EQ:kL=\ER:kS=\Ey:kb=^H:kd=^V:\
+ :kh=^^:kl=^H:kr=^L:ku=^K:l0=F1:l1=F2:l2=F3:l3=F4:\
+ :l4=F5:l5=F6:l6=F7:l7=F8:l8=F9:l9=F10:la=F11:le=^H:\
+ :mb=\EG2:me=\EG0:mk=\EG1:nd=^L:pk=\E|%+1%s\031:\
+ :se=\EG0:sf=^J:so=\EG4:sr=\Ej:st=\E1:ta=^I:ts=\Ef:\
+ :ue=\EG0:up=^K:us=\EG8:vb=\Eb\Ed:ve=\E.3:vi=\E.0:\
+ :vs=\E.1:
+
+tvi925|925|televideo 925:\
+ :am:bw:hs:ul:\
+ :co#80:li#24:sg#1:ug#1:\
+ :al=\EE:bl=^G:bt=\EI:cd=\EY:ce=\ET:cl=^Z:\
+ :cm=\E=%+ %+ :cr=^M:ct=\E3:dc=\EW:dl=\ER:do=^V:\
+ :ds=\Eh:ei=:fs=^M\Eg:ho=^^:ic=\EQ:im=:\
+ :is=\El\E"\nkclr=\032:k0=^AI\r:k1=^A@\r:k2=^AA\r:\
+ :k3=^AB\r:k4=^AC\r:k5=^AD\r:k6=^AE\r:k7=^AF\r:\
+ :k8=^AG\r:k9=^AH\r:kA=\EE:kD=\EW:kE=\ET:kI=\EQ:\
+ :kL=\ER:kS=\EY:kb=^H:kd=^V:kh=^^:kl=^H:kr=^L:ku=^K:\
+ :le=^H:nd=^L:se=\EG0:sf=^J:so=\EG4:sr=\Ej:st=\E1:\
+ :ta=^I:ts=\Eh\Ef:ue=\EG0:up=^K:us=\EG8:vb=\Eb\Ed:\
+ :ve=\E.4:vs=\E.2:
+
+tvi950|950|televideo 950:\
+ :am:hs:mi:ms:xn:xo:\
+ :co#80:it#8:li#24:sg#1:ug#1:\
+ :ac=d\rc\014e\nb\011i\013:ae=^X:al=\EE:as=^U:bl=^G:\
+ :bt=\EI:cd=\Ey:ce=\Et:cl=\E*:cm=\E=%+ %+ :cr=^M:\
+ :ct=\E3:dc=\EW:dl=\ER:do=^J:ds=\Eg\Ef\r:ei=\Er:fs=^M:\
+ :ho=^^:ic=\EQ:im=\Eq:\
+ :is=\EDF\EC\Ed\EG0\Eg\Er\EO\E'\E(\E%\Ew\EX\Ee \017\011\El\E016\E004\Ex0\200\200\Ex1\200\200\Ex2\200\200\011\Ex3\200\200\Ex4\r\200\Ef\r:\
+ :k0=^A0\r:k1=^A@\r:k2=^AA\r:k3=^AB\r:k4=^AC\r:\
+ :k5=^AD\r:k6=^AE\r:k7=^AF\r:k8=^AG\r:k9=^AH\r:kA=\EE:\
+ :kB=\EI:kC=\E*:kD=\EW:kE=\Et:kI=\EQ:kL=\ER:kS=\Ey:\
+ :kb=^H:kd=^V:kh=^^:kl=^H:kr=^L:ku=^K:le=^H:nd=^L:\
+ :pf=\Ea:po=\E`:se=\EG0:sf=^J:so=\EG4:sr=\Ej:st=\E1:\
+ :ta=^I:ts=\Eg\Ef:ue=\EG0:up=^K:us=\EG8:vb=\Eb\Ed:
+tvi950-2p|950-2p|televideo950 w/2 pages:\
+ :is=\EDF\EC\Ed\EG0\Eg\Er\EO\E'\E(\E%\Ew\EX\Ee \017\011\Ek\E016\E004\Ex0\200\200\Ex1\200\200\Ex2\200\200\011\Ex3\200\200\Ex4\r\200\E\\2\E-07 \011:\
+ :ke=\Ek:ks=\El:te=\E\\2\E-07 :ti=\E\\1\E-07 :tc=tvi950:
+tvi950-4p|950-4p|televideo950 w/4 pages:\
+ :is=\EDF\EC\Ed\EG0\Eg\Er\EO\E'\E(\E%\Ew\EX\Ee \017\011\Ek\E016\E004\Ex0\200\200\Ex1\200\200\Ex2\200\200\011\Ex3\200\200\Ex4\r\200\E\\3\E-07 \011:\
+ :ke=\Ek:ks=\El:te=\E\\3\E-07 :ti=\E\\1\E-07 :tc=tvi950:
+tvi950-rv|950-rv|televideo950 rev video:\
+ :is=\EDF\EC\Eb\EG0\Eg\Er\EO\E'\E(\E%\Ew\EX\Ee \017\011\El\E016\E004\Ex0\200\200\Ex1\200\200\Ex2\200\200\011\Ex3\200\200\Ex4\r\200:\
+ :vb=\Ed\Eb:tc=tvi950:
+
+tvi950-rv-2p|950-rv-2p|televideo950 rev video w/2 pages:\
+ :is=\EDF\EC\Eb\EG0\Eg\Er\EO\E'\E(\E%\Ew\EX\Ee \017\011\Ek\E016\E004\Ex0\200\200\Ex1\200\200\Ex2\200\200\011\Ex3\200\200\Ex4\r\200\E\\2\E-07 :\
+ :ke=\Ek:ks=\El:te=\E\\2\E-07 :ti=\E\\1\E-07 :\
+ :vb=\Ed\Eb:tc=tvi950:
+
+tvi950-rv-4p|950-rv-4p|televideo950 rev video w/4 pages:\
+ :is=\EDF\EC\Eb\EG0\Er\EO\E'\E(\E%\Ew\EX\Ee \017\011\Ek\E016\E004\Ex0\200\200\Ex1\200\200\Ex2\200\200\011\Ex3\200\200\Ex4\r\200\E\\3\E-07 :\
+ :ke=\Ek:ks=\El:te=\E\\3\E-07 :ti=\E\\1\E-07 :\
+ :vb=\Ed\Eb:tc=tvi950:
+tvi955|televideo 955:\
+ :5i:ms@:\
+ :it#8:sg@:\
+ :RA=\E[=7l:RX=^N:SA=\E[=7h:SX=^O:\
+ :ac=0_`RjHkGlFmEnIoPqKsQtMuLvOwNxJ:ae=\E%:as=\E$:\
+ :cm=\E[%i%d;%dH:do=^V:\
+ :is=\E[=3l\EF1\Ed\EG0\E[=5l\E%\El:kM=\EQ:kN=\EK:\
+ :kP=\EJ:kT=\E1:ka=\E3:kt=\E2:mb=\EG2:me=\EG0\E[=5l:\
+ :mh=\E[=5h:mk=\EG1:mr=\EG4:ps=\EP:\
+ :r1=\EDF\EC\Eg\Er\EO\E'\E(\Ew\EX\Ee \017\E0P\E6\200\E0p\E4\200\Ef\r:\
+ :sf@:ve=\E.2:vi=\E.0:vs=\E.1:tc=tvi950:
+tvi955-w|955-w|televideo955 w/132 cols:\
+ :co#132:\
+ :is=\E[=3h\EF1\Ed\EG0\E[=5l\E%\El:tc=tvi955:
+tvi955-hb|955-hb|televideo955 half-bright:\
+ :is=\E[=3l\EF1\Ed\EG0\E[=5h\E%\El:md=\E[=5l:\
+ :me=\EG0\E[=5h:mh@:tc=tvi955:
+tvi970|televideo 970:\
+ :da:db:mi:ms:\
+ :co#80:it#8:li#24:\
+ :ae=\E(B:al=\E[L:as=\E(B:bt=\E[Z:cd=\E[0J:ce=\E[0K:\
+ :cl=\E[H\E[2J:cm=\E[%i%d;%df:dc=\E[P:dl=\E[M:do=\ED:\
+ :ds=\Eg\Ef\r:ei=\E[4l:im=\E[4h:\
+ :is=\E<\E[?21l\E[19h\E[1Q\E[10l\E[7l\E[H\E[2J:\
+ :k1=\E?a:k2=\E?b:k3=\E?c:k4=\E?d:k5=\E?e:k6=\E?f:\
+ :k7=\E?g:k8=\E?h:k9=\E?i:kb=^H:kd=\E[B:kh=\E[H:\
+ :kl=\E[D:kr=\E[C:ku=\E[A:le=^H:nd=\E[C:se=\E[m:\
+ :so=\E[7m:sr=\EM:ta=^I:ue=\E[m:up=\EM:us=\E[4m:\
+ :vb=\E[5;m\E[0;m:vs=\E[1Q:
+tvipt|televideo personal terminal:\
+ :am:\
+ :co#80:li#24:\
+ :SA=\Ev:al=\EE:bt=\EI:ce=\ET:cl=^Z:cm=\E=%+ %+ :\
+ :dl=\ER:ho=^^:if=/usr/share/tabset/stdcrt:\
+ :is=\Ev\Eu\EK:kb=^H:kd=^J:kl=^H:kr=^L:ku=^K:le=^H:\
+ :nd=^L:se=\EF:so=\EG1@A\EH:ue=\EF:up=^K:us=\EG1B@\EH:
+
+
+vi50|visual 50:\
+ :am:ms:\
+ :co#80:it#8:li#24:\
+ :al=\EL:bt=4\Ez:cd=\Ek:ce=16\EK:cl=\Ev:cm=\EY%+ %+ :\
+ :cr=^M:dl=3*\EM:do=\EB:ho=\EH:k1=\EP:k2=\EQ:k3=\ER:\
+ :k4=\EV:k5=\EE:k6=\E]:k7=\EL:k8=\Ev:k9=\EM:kb=^H:\
+ :kd=\EB:kh=\EH:kl=\ED:kr=\EC:ku=\EA:le=^H:nd=\EC:\
+ :nw=^M^J:sf=^J:ta=^I:up=\EA:
+vi50adm|visual 50 in adm3a mode:\
+ :am:ms:\
+ :co#80:it#8:li#24:\
+ :al=\EL:bl=^G:cd=\Ek:ce=\EK:cl=^Z:cm=\E=%+ %+ :cr=^M:\
+ :dl=\EM:do=^J:ho=\EH:kb=^H:kd=\EB:kh=\EH:kl=\ED:\
+ :kr=\EC:ku=\EA:le=^H:nd=^L:se=\ET:sf=^J:so=\EU:ta=^I:\
+ :up=^K:
+vi55|Visual 55:\
+ :am:mi:ms:\
+ :co#80:it#8:li#24:\
+ :al=\EL:cd=\EJ:ce=\EK:cl=\Ev:cm=\EY%+ %+ :\
+ :cs=\E_%+A%+A:dc=\Ew:dl=\EM:do=^J:ei=\Eb:ho=\EH:\
+ :im=\Ea:is=\Ev\E_AX\Eb\EW\E9P\ET:kb=^H:kd=\EB:kl=\ED:\
+ :kr=\EC:ku=\EA:le=^H:nd=\EC:se=\ET:so=\EU:sr=\EI:\
+ :ta=^I:up=\EA:
+
+vi200|vis200|visual 200 with function keys:\
+ :am:\
+ :co#80:it#8:li#24:\
+ :al=\EL:bl=^G:cd=\Ey:ce=\Ex:cl=\Ev:cm=\EY%+ %+ :\
+ :cr=^M:dc=\EO:dl=\EM:do=^J:ei=\Ej:ho=\EH:im=\Ei:\
+ :is=\E3\Eb\Ej\E\\\El\EG\Ec\Ek:k0=\EP:k1=\EQ:k2=\ER:\
+ :k3=\E :k4=\E!:k5=\E":k6=\E#:k7=\E$:k8=\E%:k9=\E&:\
+ :kd=\EB:kh=\EH:kl=\ED:kr=\EC:ku=\EA:le=^H:nd=\EC:\
+ :se=\E3:sf=^J:so=\E4:sr=\EI:ta=^I:up=\EA:ve=\Ec:\
+ :vs=\Ed:
+vi200-f|visual|visual 200 no function keys:\
+ :is=\E3\Eb\Ej\E\\\El\EG\Ed\Ek:k0=\E?p:k1=\E?q:\
+ :k2=\E?r:k3=\E?s:k4=\E?t:k5=\E?u:k6=\E?v:k7=\E?w:\
+ :k8=\E?x:k9=\E?y:ke=\E>:ks=\E=:se@:so@:tc=vi200:
+vi200-rv|visual 200 reverse video:\
+ :se=\E3:so=\E4:sr@:ve@:vs@:tc=vi200:
+
+vi300|visual 300 ansi x3.64:\
+ :am:bw:mi:xn:\
+ :co#80:li#24:\
+ :RA=\E[?7l:SA=\E[?7h:al=\E[L:bl=^G:bt=\E[Z:cd=\E[J:\
+ :ce=\E[K:cl=\E[H\E[2J:cm=\E[%i%d;%dH:cr=^M:dc=\E[P:\
+ :dl=\E[M:do=\E[B:ei=\E[4l:ho=\E[H:im=\E[4h:\
+ :is=\E[7s\E[2;3;4;20;?5;?6l\E[12;?7h\E[1Q\E[0;1(D\E[8s:\
+ :k1=\E_A\E\\:k2=\E_B\E\\:k3=\E_C\E\\:k4=\E_D\E\\:\
+ :k5=\E_E\E\\:k6=\E_F\E\\:k7=\E_G\E\\:k8=\E_H\E\\:\
+ :k9=\E_I\E\\:kd=\E[B:kh=\E[H:kl=\E[D:kr=\E[C:ku=\E[A:\
+ :le=^H:nd=\E[C:se=\E[m:sf=^J:so=\E[1m:sr=\EM:ta=^I:\
+ :ue=\E[m:up=\E[A:us=\E[4m:
+vi300-old|visual 300 with old firmware (set edit extent reversed):\
+ :is=\E[7s\E[2;3;4;20;?5;?6l\E[12;?7h\E[2Q\E[0;1(D\E[8s:tc=vi300:
+
+vi500|visual 500:\
+ :am:mi:ms:\
+ :co#80:it#8:li#33:\
+ :ae=^O:al=3*\EL\Ex:as=^N:bt=4\Ez:cd=3*\Ey:ce=16\Ex:\
+ :cl=6*\Ev:cm=\EY%+ %+ :cr=^M:cs=\E(%+ %+ :dc=3*\EO:\
+ :dl=3*\EM:do=\EB:ei=\Ej:ho=\EH:im=\Ei:\
+ :is=\E3\E\001\E\007\E\003\Ek\EG\Ed\EX\El\E>\Eb\E\\:\
+ :kb=^H:kd=\EB:kh=\EH:kl=\ED:kr=\EC:ku=\EA:le=^H:\
+ :nd=\EC:nw=^M^J:se=\E^G:sf=^J:so=\E^H:ta=8\011:\
+ :ue=\E^C:up=\EA:us=\E^D:
+
+vi550|visual 550 ansi x3.64:\
+ :li#33:\
+ :cl=\030\E[H\E[2J:tc=vi300:
+
+vi603|visual603|visual 603:\
+ :hs:mi:\
+ :al=\E[L:bl=^G:cd=\E[J:ce=\E[K:cl=\E[H\E[J:\
+ :cm=\E[%i%d;%dH:cs=\E[%i%d;%dr:dc=\E[P:dl=\E[M:\
+ :ds=\EP2;1~\E\\:ei=\E[4l:fs=\E\\:\
+ :i1=\E>\E[?3l\E[?4l\E[?7h\E[?8h\E[1;24r:im=\E[4h:\
+ :mb=\E[5m:md=\E[1m:me=\E[m:mr=\E[7m:nd=\E[C:\
+ :se=\E[27m:sf=\ED:so=\E[7m:sr=\EM:ts=\EP2~:ue=\E[24m:\
+ :up=\E[A:us=\E[4m:tc=vt100:
+
+
+wy30|wyse30|Wyse 30:\
+ :5i:am:bw:hs:mi:ms:xo:\
+ :Nl#8:co#80:lh#1:li#24:lw#8:ma#1:ws#45:\
+ :#2=\E{:&3=\Er:@8=\E7:LF=\EA11:LO=\EA10:\
+ :ac=0wa_h[jukslrmqnxqzttuyv]wpxv:ae=\EH^C:al=\EE:\
+ :as=\EH^B:bl=^G:bt=\EI:cd=\EY:ce=\ET:cl=\E+:\
+ :cm=\E=%+ %+ :cr=^M:ct=\E0:dc=\EW:dl=\ER:do=^J:\
+ :ds=\EF\r:ei=\Er:fs=^M:ho=^^:im=\Eq:ip=:\
+ :is=\E'\E(\E^3\E`9\016\024:k1=^A@\r:k2=^AA\r:\
+ :k3=^AB\r:k4=^AC\r:k5=^AD\r:k6=^AE\r:k7=^AF\r:\
+ :k8=^AG\r:kA=\EE:kB=\EI:kD=\EW:kE=\ET:kI=\EQ:kL=\ER:\
+ :kN=\EK:kP=\EJ:kS=\EY:kb=^H:kd=^J:kh=^^:kl=^H:kr=^L:\
+ :ku=^K:le=^H:ll=^^^K:me=\E(\EH\003:mh=\E`7\E):\
+ :mp=\E`7\E):nd=^L:nw=^M^J:pf=^T:pn=\Ez%+/%s\r:po=^X:\
+ :ps=\EP:px=\Ez%+?%s\177:\
+ :..sa=%?%p1%p5%p8%|%|%t\E`7\E)%e\E(%;%?%p9%t\EH\002%e\EH\003%;:\
+ :se=\E(:sf=\n:so=\E`7\E):sr=\Ej:st=\E1:ta=\011:\
+ :ts=\EF:up=^K:vb=\E`8\E`9:ve=\E`1:vi=\E`0:
+wy30-mc|wyse30-mc|wyse 30 with magic cookies:\
+ :ms@:\
+ :ma@:sg#1:ug#1:\
+ :ae=\EG0\EH\003:as=\EG0\EH\002:mb=\EG2:\
+ :me=\EG0\E(\EH\003:mh=\EGp:mk=\EG1:mp=\EG0\E):\
+ :mr=\EG4:\
+ :..sa=\EG%'0'%?%p2%p6%|%t%{8}%|%;%?%p1%p3%|%p6%|%t%{4}%|%;%?%p4%t%{2}%|%;%?%p1%p5%|%t%{64}%|%;%?%p7%t%{1}%|%;%c%?%p8%t\E)%e\E(%;%?%p9%t\EH\002%e\EH\003%;:\
+ :se=\EG0:so=\EG4:te=\EG0:ue=\EG0:us=\EG8:tc=wy30:
+wy30-vb|wyse30-vb|wyse 30 visible bell:\
+ :bl@:tc=wy30:
+wy50|wyse50|Wyse 50:\
+ :5i:am:bw:hs:mi:ms:xo:\
+ :Nl#8:co#80:lh#1:li#24:lw#8:ma#1:ws#45:\
+ :#2=\E{:%9=\EP:&3=\Er:@8=\E7:F1=^AJ\r:F2=^AK\r:\
+ :F3=^AL\r:F4=^AM\r:F5=^AN\r:F6=^AO\r:LF=\EA11:\
+ :LO=\EA10:ac=0wa_h[jukslrmqnxqzttuyv]wpxv:ae=\EH^C:\
+ :al=\EE:as=\EH^B:bl=^G:bt=\EI:cd=\EY:ce=\ET:cl=\E+:\
+ :cm=\E=%+ %+ :cr=^M:ct=\E0:dc=\EW:dl=\ER:do=^J:\
+ :ds=\EF\r:ei=\Er:fs=^M:ho=^^:i1=\E`\072\E`9:im=\Eq:\
+ :ip=:is=\016\024\E'\E(:k1=^A@\r:k2=^AA\r:k3=^AB\r:\
+ :k4=^AC\r:k5=^AD\r:k6=^AE\r:k7=^AF\r:k8=^AG\r:\
+ :k9=^AH\r:k;=^AI\r:kA=\EE:kB=\EI:kD=\EW:kE=\ET:\
+ :kI=\EQ:kL=\ER:kN=\EK:kP=\EJ:kS=\EY:kb=^H:kd=^J:\
+ :kh=^^:kl=^H:kr=^L:ku=^K:le=^H:ll=^^^K:me=\E(\EH\003:\
+ :mh=\E`7\E):mp=\E`7\E):mr=\E`6\E):nd=^L:nw=^M^J:\
+ :pf=^T:pn=\Ez%+/%s\r:po=^X:ps=\EP:px=\Ez%+?%s\177:\
+ :..sa=%?%p1%p3%|%t\E`6\E)\n%e%p5%p8%|%t\E`7\E)%e\E(%;\n%?%p9%t\EH\002%e\EH\003%;:\
+ :se=\E(:sf=\n:so=\E`6\E):sr=\Ej:st=\E1:ta=^I:ts=\EF:\
+ :up=^K:vb=\E`8\E`9:ve=\E`1:vi=\E`0:
+wy50-mc|wyse50-mc|wyse 50 with magic cookies:\
+ :ms@:\
+ :ma@:sg#1:ug#1:\
+ :ae=\EG0\EH\003:as=\EG0\EH\002:mb=\EG2:\
+ :me=\EG0\E(\EH\003:mh=\EGp:mk=\EG1:mp=\EG0\E):\
+ :mr=\EG4:\
+ :..sa=\EG%'0'%?%p2%p6%|%t%{8}%|%;%?%p1%p3%|%p6%|%t%{4}%|%;%?%p4%t%{2}%|%;%?%p1%p5%|%t%{64}%|%;%?%p7%t%{1}%|%;%c%?%p8%t\E)%e\E(%;%?%p9%t\EH\002%e\EH\003%;:\
+ :se=\EG0:so=\EGt:te=\EG0:ue=\EG0:us=\EG8:tc=wy50:
+wy50-vb|wyse50-vb|wyse 50 visible bell:\
+ :bl@:tc=wy50:
+wy50-w|wyse50-w|wyse 50 132-column:\
+ :Nl#16:co#132:lw#7:ws#97:\
+ :cm=\Ea%i%dR%dC:dc=\EW:i1=\E`;\E`9:tc=wy50:
+wy50-wvb|wyse50-wvb|wyse 50 132-column visible bell:\
+ :bl@:tc=wy50-w:
+wy350|wyse350|Wyse 350:\
+ :5i:am:bw:hs:mi:xo:\
+ :Co#8:NC#55:Nl#8:co#80:lh#1:li#24:lw#8:pa#8:sg#1:\
+ :ug#1:ws#45:\
+ :#2=\E{:%9=\EP:&3=\Er:@8=\E7:F1=^AJ\r:F2=^AK\r:\
+ :F3=^AL\r:F4=^AM\r:F5=^AN\r:F6=^AO\r:LF=\EA11:\
+ :LO=\EA10:Sb= :ac=0wa_h[jukslrmqnxqzttuyv]wpxv:\
+ :ae=\EG0\EH\003:al=\EE:as=\EG0\EH\002:bl=^G:bt=\EI:\
+ :cd=\EY:ce=\ET:cl=\E+:cm=\E=%+ %+ :cr=^M:ct=\E0:\
+ :dc=\EW:dl=\ER:do=^J:ds=\EF\r:ei=\Er:fs=^M:ho=^^:\
+ :i1=\E`\072\E`9:i2=\E%?:im=\Eq:ip=:is=\016\024\E'\E(:\
+ :k1=^A@\r:k2=^AA\r:k3=^AB\r:k4=^AC\r:k5=^AD\r:\
+ :k6=^AE\r:k7=^AF\r:k8=^AG\r:k9=^AH\r:k;=^AI\r:kA=\EE:\
+ :kB=\EI:kD=\EW:kE=\ET:kI=\EQ:kL=\ER:kN=\EK:kP=\EJ:\
+ :kS=\EY:kb=^H:kd=^J:kh=^^:kl=^H:kr=^L:ku=^K:le=^H:\
+ :ll=^^^K:mb=\EG2:me=\EG0\E(\EH\003%{0}%PA%{0}%PC:\
+ :mh=\EGp:mk=\EG1:mp=\EG0\E):mr=\EG4:nd=^L:nw=^M^J:\
+ :oc=\E%?:op=\EG0:pf=^T:pn=\Ez%+/%s\r:po=^X:ps=\EP:\
+ :px=\Ez%+?%s\177:se=\EG0:sf=\n:so=\EG4:sr=\Ej:st=\E1:\
+ :ta=^I:ts=\EF:ue=\EG0:up=^K:us=\EG8:vb=\E`8\E`9:\
+ :ve=\E`1:vi=\E`0:
+wy350-vb|wyse350-vb|wyse 350 visible bell:\
+ :bl@:tc=wy350:
+wy350-w|wyse350-w|wyse 350 132-column:\
+ :Nl#16:co#132:lw#7:ws#97:\
+ :cm=\Ea%i%dR%dC:dc=\EW:i1=\E`;\E`9:tc=wy350:
+wy350-wvb|wyse350-wvb|wyse 350 132-column visible bell:\
+ :bl@:tc=wy350-w:
+wy100|wyse 100:\
+ :hs:mi:\
+ :co#80:li#24:sg#1:ug#1:\
+ :al=\EE:bl=^G:cd=\EY:ce=\ET:cl=\E;:cm=\E=%+ %+ :\
+ :cr=^M:dc=\EW:dl=\ER:do=^J:ds=\EA31:ei=\Er:fs=^M:\
+ :im=\Eq:is=\Eu\E0:k1=^A@\r:k2=^AA\r:k3=^AB\r:\
+ :k4=^AC\r:k5=^AD\r:k6=^AE\r:k7=^AF\r:k8=^AG\r:kb=^H:\
+ :kd=^J:kh=\E{:kl=^H:kr=^L:ku=^K:le=^H:nd=^L:se=\EG0:\
+ :sf=^J:so=\EG4:ts=\EF:ue=\EG0:up=^K:us=\EG8:
+wy120|wyse120|wy150|wyse150|Wyse 120/150:\
+ :am:bw:hs:km:mi:ms:xo:\
+ :co#80:it#8:li#24:pb#9601:ws#45:\
+ :ae=\EcD:al=\EE:as=\EcE:bl=^G:bt=\EI:cd=\EY:ce=\ET:\
+ :cl=\E+:cm=\E=%+ %+ :cr=^M:dc=\EW:dl=\ER:do=^J:\
+ :ds=\EF\r:ei=\Er:fs=^M:ho=^^:i1=\EcB0\EcC1:\
+ :i2=\EwJ\Ew1:im=\Eq:ip=:\
+ :is=\Ed$\EcD\E'\Er\EH\003\Ed/\EO\Ee1\Ed*\E`@\E`9\E`1\016\024\El:\
+ :k1=^A@\r:k2=^AA\r:k3=^AB\r:k4=^AC\r:k5=^AD\r:\
+ :k6=^AE\r:k7=^AF\r:k8=^AG\r:k9=^AH\r:kD=\EW:kI=\EQ:\
+ :kN=\EK:kP=\EJ:kb=^H:kd=^J:kh=^^:kl=^H:kr=^L:ku=^K:\
+ :le=^H:ll=^^^K:mb=\EG2:me=\E(\EH\003\EG0\EcD:mh=\EGp:\
+ :mr=\EG4:nd=^L:nw=\r\n:se=\EG0:sf=\n:so=\EGt:sr=\Ej:\
+ :st=\E1:ta=\011:te=\Ew1:ti=\Ew0:ts=\EF:ue=\EG0:up=^K:\
+ :us=\EG8:vb=\E`8\E`9:ve=\E`1:vi=\E`0:
+wy120-w|wyse120-w|wy150-w|wyse150-w|wyse 120/150 132-column:\
+ :Nl#16:co#132:lw#7:ws#97:\
+ :cm=\Ea%i%dR%dC:dc=\EW:ip=:r2=\E`;:tc=wy120:
+wy120-25|wyse120-25|wy150-25|wyse150-25|wyse 120/150 80-column 25-lines:\
+ :Nl@:lh@:li#25:lw@:\
+ :pn@:r3=\EwG\Ee):tc=wy120:
+wy120-25-w|wyse120-25-w|wy150-25-w|wyse150-25-w|wyse 120/150 132-column 25-lines:\
+ :Nl@:lh@:li#25:lw@:\
+ :pn@:r3=\EwG\Ee):tc=wy120-w:
+wy120-vb|wyse120-vb|wy150-vb|wyse150-vb|Wyse 120/150 visible bell:\
+ :bl@:tc=wy120:
+wy120-w-vb|wy120-wvb|wyse120-wvb|wy150-w-vb|wyse150-w-vb|Wyse 120/150 132-column visible bell:\
+ :bl@:tc=wy120-w:
+wy60|wyse60|Wyse 60:\
+ :am:bw:hs:km:mi:ms:\
+ :co#80:li#24:ws#45:\
+ :ae=\EcD:al=\EE:as=\EcE:bl=^G:bt=\EI:cd=\EY:ce=\ET:\
+ :cl=\E+:cm=\E=%+ %+ :cr=^M:ct=\E0:dc=\EW:dl=\ER:\
+ :do=^J:ds=\EF\r:ei=\Er:fs=^M:ho=\E{:i1=\EcB0\EcC1:\
+ :i2=\EwJ\Ew1:im=\Eq:ip=:\
+ :is=\Ed$\EcD\E'\Er\EH\003\Ed/\EO\Ee1\Ed*\E`@\E`9\E`1\016\024\El:\
+ :k1=^A@\r:k2=^AA\r:k3=^AB\r:k4=^AC\r:k5=^AD\r:\
+ :k6=^AE\r:k7=^AF\r:k8=^AG\r:k9=^AH\r:kD=\EW:kI=\EQ:\
+ :kN=\EK:kP=\EJ:kb=^H:kd=^J:kh=^^:kl=^H:kr=^L:ku=^K:\
+ :le=^H:ll=\E{^K:mb=\EG2:me=\E(\EH\003\EG0\EcD:\
+ :mh=\EGp:mr=\EG4:nd=^L:nw=\r\n:se=\EG0:sf=\n:so=\EGt:\
+ :sr=\Ej:st=\E1:ta=\011:te=\Ew1:ti=\Ew0:ts=\EF:\
+ :ue=\EG0:up=^K:us=\EG8:vb=\E`8\E`9:ve=\E`1:vi=\E`0:
+wy60-w|wyse60-w|wyse 60 132-column:\
+ :Nl#16:co#132:lw#7:ws#97:\
+ :cm=\Ea%i%dR%dC:dc=\EW:ip=:r2=\EeF\E`;:tc=wy60:
+wy60-25|wyse60-25|wyse 60 80-column 25-lines:\
+ :Nl@:lh@:li#25:lw@:\
+ :pn@:r3=\EwG\Ee):tc=wy60:
+wy60-25-w|wyse60-25-w|wyse 60 132-column 25-lines:\
+ :Nl@:lh@:li#25:lw@:\
+ :pn@:r3=\EwG\Ee):tc=wy60-w:
+wy60-42|wyse60-42|wyse 60 80-column 42-lines:\
+ :li#42:\
+ :al=\EE:cd=\Ey:cl=\E+:cm=\E=%+ %+ :dc=\EW:dl=\ER:\
+ :i1=\EcB2\EcC3:ip=:nw=\r\n:r3=\Ee*:sf=\n:sr=\Ej:tc=wy60:
+wy60-42-w|wyse60-42-w|wyse 60 132-column 42-lines:\
+ :Nl#16:co#132:lw#7:ws#97:\
+ :cd=\Ey:cl=\E+:cm=\Ea%i%dR%dC:dc=\EW:ho=\036:ip=:\
+ :nw=\r\n:r2=\EeF\E`;:tc=wy60-42:
+wy60-43|wyse60-43|wyse 60 80-column 43-lines:\
+ :Nl@:lh@:li#43:lw@:\
+ :pn@:r3=\Ee+:tc=wy60-42:
+wy60-43-w|wyse60-43-w|wyse 60 132-column 43-lines:\
+ :Nl@:lh@:li#43:lw@:\
+ :pn@:r3=\Ee+:tc=wy60-42-w:
+wy60-vb|wyse60-vb|Wyse 60 visible bell:\
+ :bl@:tc=wy60:
+wy60-w-vb|wy60-wvb|wyse60-wvb|Wyse 60 132-column visible bell:\
+ :bl@:tc=wy60-w:
+
+wy99gt|wyse99gt|Wyse 99gt:\
+ :ms@:\
+ :al=\EE:cd=\Ey:ce=\Et:cl=\E+:dc=\EW:dl=\ER:i2=\Ew0:\
+ :ip=:nw@:r2=\E`\072:sf=\n:sr=\Ej:ta=\011:te=\Ew0:\
+ :ti=\Ew1:u0=\E~>\E8:u1=\E[42h:vb=\E`8\E`9:tc=wy60:
+wy99gt-w|wyse99gt-w|wyse 99gt 132-column:\
+ :Nl#16:co#132:lw#7:ws#97:\
+ :cd=\Ey:cl=\E+:cm=\Ea%i%dR%dC:dc=\EW:ip=:r2=\E`;:tc=wy99gt:
+wy99gt-25|wyse99gt-25|wyse 99gt 80-column 25-lines:\
+ :Nl@:lh@:li#25:lw@:\
+ :pn@:r2=\E`\072:r3=\EwG\Ee):tc=wy99gt:
+wy99gt-25-w|wyse99gt-25-w|wyse 99gt 132-column 25-lines:\
+ :Nl@:lh@:li#25:lw@:\
+ :pn@:r2=\E`;:tc=wy99gt-w:
+wy99gt-vb|wyse99gt-vb|Wyse 99gt visible bell:\
+ :bl@:tc=wy99gt:
+wy99gt-w-vb|wy99gt-wvb|wyse99gt-wvb|Wyse 99gt 132-column visible bell:\
+ :bl@:tc=wy99gt-w:
+wy160|wyse160|Wyse 160:\
+ :am:bw:hs:km:mi:ms:\
+ :co#80:li#24:ws#38:\
+ :ae=\EcD:al=\EE:as=\EcE:bl=^G:bt=\EI:cd=\EY:ce=\ET:\
+ :cl=\E+:cm=\E=%+ %+ :cr=^M:ct=\E0:dc=\EW:dl=\ER:\
+ :do=^J:ds=\EF\r:ei=\Er:fs=^M:ho=\E{:i1=\EcB0\EcC1:\
+ :i2=\Ew0:im=\Eq:ip=:\
+ :is=\Ed$\EcD\E'\Er\EH\003\Ed/\EO\Ee1\Ed*\E`@\E`9\E`1\016\024\El:\
+ :k1=^A@\r:k2=^AA\r:k3=^AB\r:k4=^AC\r:k5=^AD\r:\
+ :k6=^AE\r:k7=^AF\r:k8=^AG\r:k9=^AH\r:kD=\EW:kI=\EQ:\
+ :kN=\EK:kP=\EJ:kb=^H:kd=^J:kh=^^:kl=^H:kr=^L:ku=^K:\
+ :le=^H:ll=\E{^K:mb=\EG2:me=\E(\EH\003\EG0\EcD:\
+ :mh=\EGp:mr=\EG4:nd=^L:nw=\r\n:se=\EG0:sf=\n:so=\EGt:\
+ :sr=\Ej:st=\E1:ta=^I:te=\Ew0:ti=\Ew1:ts=\EF:ue=\EG0:\
+ :up=^K:us=\EG8:vb=\E`8\E`9:ve=\E`1:vi=\E`0:
+wy160-w|wyse160-w|wyse 160 132-column:\
+ :Nl#16:co#132:lw#7:ws#90:\
+ :cm=\Ea%i%dR%dC:dc=\EW:r2=\EeF\E`;:tc=wy160:
+wy160-25|wyse160-25|wyse 160 80-column 25-lines:\
+ :Nl@:lh@:li#25:lw@:\
+ :pn@:r3=\EwG\Ee):tc=wy160:
+wy160-25-w|wyse160-25-w|wyse 160 132-column 25-lines:\
+ :Nl@:lh@:li#25:lw@:\
+ :pn@:r3=\EwG\Ee):tc=wy160-w:
+wy160-42|wyse160-42|wyse 160 80-column 42-lines:\
+ :li#42:\
+ :al=\EE:cd=\Ey:cl=\E+:dl=\ER:i1=\EcB2\EcC3:nw=\r\n:\
+ :r3=\Ee*:sf=\n:sr=\Ej:tc=wy160:
+wy160-42-w|wyse160-42-w|wyse 160 132-column 42-lines:\
+ :Nl#16:co#132:lw#7:ws#90:\
+ :cm=\Ea%i%dR%dC:dc=\EW:ip=:r2=\EeF\E`;:tc=wy160-42:
+wy160-43|wyse160-43|wyse 160 80-column 43-lines:\
+ :Nl@:lh@:li#43:lw@:\
+ :pn@:r3=\Ee+:tc=wy160-42:
+wy160-43-w|wyse160-43-w|wyse 160 132-column 43-lines:\
+ :Nl@:lh@:li#43:lw@:\
+ :pn@:r3=\Ee+:tc=wy160-42-w:
+wy160-vb|wyse160-vb|Wyse 160 visible bell:\
+ :bl@:tc=wy160:
+wy160-w-vb|wy160-wvb|wyse160-wvb|Wyse 160 132-column visible bell:\
+ :bl@:tc=wy160-w:
+wy75|wyse75|wyse 75:\
+ :am:hs:mi:ms:xn:xo:\
+ :co#80:li#24:ma#1:pb#1201:ws#78:\
+ :AL=\E[%dL:DC=\E[%dP:DL=\E[%dM:DO=\E[%dB:IC=\E[%d@:\
+ :K1=\EOw:K2=\EOu:K3=\EOy:K4=\EOq:K5=\EOs:LE=\E[%dD:\
+ :RI=\E[%dC:UP=\E[%dA:ae=^O:al=\E[L:as=^N:bl=^G:\
+ :bt=\E[Z:cd=\E[J:ce=\E[K:cl=\E[H\E[J:cm=\E[%i%d;%dH:\
+ :cr=^M:cs=\E[%i%d;%dr:ct=\E[3g:dc=\E[P:dl=\E[M:do=^J:\
+ :ds=\E[>\\\054\001\001\E[>-\001\001:ec=\E[%dX:\
+ :ei=\E[4l:fs=^A:ho=\E[H:\
+ :i1=\E[2;4;20;30l\E[?1;10l\E[12h\E[?7;8;25h:i2=\E[m:\
+ :im=\E[4h:ip=:is=\E>\E(B\E)0\017:k1=\E[?5i:k2=\E[?3i:\
+ :k3=\E[2i:k4=\E[@:k5=\E[M:k6=\E[17~:k7=\E[18~:\
+ :k8=\E[19~:k9=\E[20~:kI=\E[@:kN=\E[6~:kP=\E[5~:kb=^H:\
+ :kd=\E[B:ke=\E>:kh=\E[H:kl=\E[D:kr=\E[C:\
+ :ks=\E[?1l\E[?7h\E=:ku=\E[A:le=^H:me=\E[m\017:\
+ :mh=\E[0t\E[2m:mr=\E[1t\E[7m:nd=\E[C:rc=\E8:sc=\E7:\
+ :se=\E[m:sf=\n:so=\E[1t\E[7m:sr=\EM:st=\EH:ta=^I:\
+ :ts=\E[>\\\054\001:ue=\E[m:up=\E[A:us=\E[2t\E[4m:\
+ :vb=\E[30h\E\\\054\E[30l:ve=\E[?25h:vi=\E[?25l:
+wy75-mc|wyse75-mc|wyse 75 with magic cookies:\
+ :ms@:\
+ :ma@:sg#1:ug#1:\
+ :ae=\E[0p\017:as=\E[0p\016:i2=\E[m\E[p:mb=\E[2p:\
+ :me=\E[0p\017:mh=\E[1p:mk=\E[4p:mr=\E[16p:\
+ :..sa=\E[%{0}%?%p2%p6%|%t%{8}%|%;%?%p1%p3%|%p6%|%t%{16}%|%;%?%p4%t%{2}%|%;%?%p1%p5%|%t%{1}%|%;%?%p7%t%{4}%|%;%dp%?%p9%t\016%e\017%;:\
+ :se=\E[0p:so=\E[17p:ue=\E[0p:us=\E[8p:tc=wy75:
+wy75-vb|wyse75-vb|wyse 75 with visible bell:\
+ :pb@:\
+ :bl@:tc=wy75:
+wy75-w|wyse75-w|wyse 75 in 132 column mode:\
+ :co#132:ws#130:\
+ :r2=\E[35h\E[?3h:tc=wy75:
+wy75-wvb|wyse75-wvb|wyse 75 with visible bell 132 columns:\
+ :pb@:\
+ :bl@:tc=wy75-w:
+wy85|wyse85|wyse 85:\
+ :am:hs:mi:ms:xn:xo:\
+ :co#80:it#8:li#24:ws#80:\
+ :AL=\E[%dL:DC=\E[%dP:DL=\E[%dM:DO=\E[%dB:IC=\E[%d@:\
+ :K1=\EOw:K2=\EOu:K3=\EOy:K4=\EOq:K5=\EOs:LE=\E[%dD:\
+ :RI=\E[%dC:UP=\E[%dA:ae=^O:al=\E[L:as=^N:bl=^G:\
+ :bt=\E[Z:cd=\E[J:ce=\E[K:cl=\E[H\E[J:cm=\E[%i%d;%dH:\
+ :cr=^M:cs=\E[%i%d;%dr:ct=\E[3g:dc=\E[P:dl=\E[M:do=^J:\
+ :ds=\E[40l:ec=\E[%dX:ei=\E[4l:fs=\E[1;24r\E8:ho=\E[H:\
+ :i1=\E[62;1"p\E[?5W:i2=\E>\E(B\E)0\017\E[m:im=\E[4h:\
+ :ip=:is=\E[2;4;20;30l\E[?1;4;10;16l\E[12h\E[?7;8;25h:\
+ :k1=\EOP:k2=\EOQ:k3=\EOR:k4=\EOS:k6=\E[17~:k7=\E[18~:\
+ :k8=\E[19~:k9=\E[20~:kD=\E[3~:kI=\E[2~:kN=\E[6~:\
+ :kP=\E[5~:kb=^H:kd=\E[B:ke=\E>:kh=\E[26~:kl=\E[D:\
+ :kr=\E[C:ks=\E[?1l\E=:ku=\E[A:le=^H:mb=\E[5m:\
+ :md=\E[1m:me=\E[m\017:mh=\E[2m:mr=\E[7m:nd=\E[C:\
+ :rc=\E8:sc=\E7:se=\E[m:sf=\n:so=\E[7m:sr=\EM:st=\EH:\
+ :ta=\011:ts=\E[40h\E7\E[25;%i%p1%dH:ue=\E[m:up=\E[A:\
+ :us=\E[4m:vb=\E[30h\E\\\054\E[30l:ve=\E[?25h:\
+ :vi=\E[?25l:
+wy85-vb|wyse85-vb|wyse 85 with visible bell:\
+ :bl@:vb=\E[30h\E\\\054\E[30l:tc=wy85:
+wy85-w|wyse85-w|wyse 85 in 132-column mode:\
+ :co#132:ws#132:\
+ :r2=\E[35h\E[?3h:tc=wy85:
+wy85-wvb|wyse85-wvb|wyse 85 with visible bell 132-columns:\
+ :bl@:tc=wy85-w:
+wy185|wyse185|wyse 185:\
+ :am:hs:km:mi:ms:xn:xo:\
+ :co#80:it#8:li#24:ws#80:\
+ :AL=\E[%dL:DC=\E[%dP:DL=\E[%dM:DO=\E[%dB:IC=\E[%d@:\
+ :K1=\EOw:K2=\EOu:K3=\EOy:K4=\EOq:K5=\EOs:LE=\E[%dD:\
+ :RI=\E[%dC:UP=\E[%dA:ae=^O:al=\E[L:as=^N:bl=^G:\
+ :bt=\E[Z:cd=\E[J:ce=\E[K:cl=\E[H\E[J:cm=\E[%i%d;%dH:\
+ :cr=^M:cs=\E[%i%d;%dr:ct=\E[3g:dc=\E[P:dl=\E[M:do=^J:\
+ :ds=\E7\E[99;0H\E[K\E8:ec=\E[%dX:ei=\E[4l:\
+ :fs=\E[1;24r\E8:ho=\E[H:i1=\E[?5W:\
+ :i2=\E>\E(B\E)0\017\E[m:im=\E[4h:ip=:\
+ :is=\E[2;4;20;30l\E[?1;4;10;16l\E[12h\E[?7;8;25h:\
+ :k1=\EOP:k2=\EOQ:k3=\EOR:k4=\EOS:k6=\E[17~:k7=\E[18~:\
+ :k8=\E[19~:k9=\E[20~:kD=\E[3~:kI=\E[2~:kN=\E[6~:\
+ :kP=\E[5~:kb=^H:kd=\E[B:ke=\E>:kh=\E[26~:kl=\E[D:\
+ :kr=\E[C:ks=\E[?1l\E=:ku=\E[A:le=^H:mb=\E[5m:\
+ :md=\E[1m:me=\E[m\017:mh=\E[2m:mr=\E[7m:nd=\E[C:\
+ :rc=\E8:sc=\E7:se=\E[27m:sf=\n:so=\E[7m:sr=\EM:\
+ :st=\EH:ta=^I:te=\E[ R:ti=\E[ Q:ts=\E7\E[99;%i%p1%dH:\
+ :ue=\E[24m:up=\E[A:us=\E[4m:vb=\E[30h\E\\\054\E[30l:\
+ :ve=\E[34h\E[?25h:vi=\E[?25l:vs=\E[?25h\E[34l:
+wy185-24|wyse185-24|wyse 185 with 24 data lines:\
+ :hs@:\
+ :ds@:fs@:r3=\E[?5l\E[47h\E[40l\E[1;24r:ts@:tc=wy185:
+wy185-vb|wyse185-vb|wyse 185+flash:\
+ :bl@:tc=wy185:
+wy185-w|wyse185-w|wyse 185 in 132-column mode:\
+ :co#132:ws#132:\
+ :DC=\E[%dP:IC=\E[%d@:dc=\E[P:ei=:im=:ip=:\
+ :r2=\E[35h\E[?3h:tc=wy185:
+wy185-wvb|wyse185-wvb|wyse 185+flash+132 cols:\
+ :bl@:tc=wy185-w:
+
+
+wy325|wyse325|Wyse epc:\
+ :am:bw:hs:mi:\
+ :co#80:li#24:pb#9601:ws#45:\
+ :ae=\EcD:al=\EE:as=\EcE:bl=^G:bt=\EI:cd=\EY:ce=\ET:\
+ :cl=\E+:cm=\E=%+ %+ :cr=^M:ct=\E0:dc=\EW:dl=\ER:\
+ :do=^J:ds=\EF\r:ei=\Er:fs=^M:ho=^^:i1=\EcB0\EcC1:\
+ :i2=\Ew0:im=\Eq:ip=:\
+ :is=\EcD\E'\Er\EH\003\Ed/\EO\Ee1\Ed*\E`@\E`9\E`1\016\024\El:\
+ :k1=^A@\r:k2=^AA\r:k3=^AB\r:k4=^AC\r:k5=^AD\r:\
+ :k6=^AE\r:k7=^AF\r:k8=^AG\r:k9=^AH\r:kD=\EW:kI=\Eq:\
+ :kN=\EK:kP=\EJ:kb=^H:kd=^J:kh=^^:kl=^H:kr=^L:ku=^K:\
+ :le=^H:ll=^^^K:mb=\EG2:me=\E(\EH\003\EG0\EcD:mh=\EGp:\
+ :mr=\EG4:nd=^L:se=\EG0:sf=\n:so=\EGt:sr=\Ej:st=\E1:\
+ :ta=^I:te=\Ew0:ti=\Ew1:ts=\EF:ue=\EG0:up=^K:us=\EG8:\
+ :vb=\E`8\E`9:ve=\E`1:vi=\E`0:
+
+wy325-vb|wyse325-vb|wyse-325 with visual bell:\
+ :bl@:tc=wy325:
+
+wy325-w|wyse325-w|wy325w-24|wyse-325 in wide mode:\
+ :Nl#16:co#132:lw#7:ws#97:\
+ :cm=\Ea%i%dR%dC:dc=\EW:ip=:r2=\E`;:tc=wy325:
+wy325-25|wyse325-25|wy325-80|wyse-325|wyse-325 25 lines:\
+ :Nl@:lh@:li#25:lw@:\
+ :pn@:r3=\EwG\Ee):tc=wy325:
+wy325-25w|wyse325-25w|wy325 132 columns:\
+ :Nl@:lh@:li#25:lw@:\
+ :pn@:r3=\EwG\Ee):tc=wy325-w:
+wy325-w-vb|wy325-wvb|wyse325-wvb|wyse-325 wide mode reverse video:\
+ :bl@:tc=wy325-w:
+
+wy325-42|wyse325-42|wyse-325 42 lines:\
+ :Nl@:lh@:li#42:lw@:\
+ :pn@:r3=\EwG\Ee):tc=wy325:
+wy325-42w|wyse325-42w|wyse-325 42 lines wide mode:\
+ :Nl@:lh@:li#42:lw@:\
+ :pn@:r3=\EwG\Ee):tc=wy325-w:
+wy325-42w-vb|wy325-42wvb|wyse-325 42 lines wide mode visual bell:\
+ :bl@:tc=wy325-w:
+wy325-43|wyse325-43|wyse-325 43 lines:\
+ :Nl@:lh@:li#43:lw@:\
+ :pn@:tc=wy325:
+wy325-43w|wyse325-43w|wyse-325 43 lines wide mode:\
+ :Nl@:lh@:li#43:lw@:\
+ :pn@:r3=\EwG\Ee):tc=wy325-w:
+wy325-43w-vb|wy325-43wvb|wyse-325 43 lines wide mode visual bell:\
+ :bl@:tc=wy325-w:
+
+wy370-nk|wyse 370 without function keys:\
+ :am:hs:mi:ms:xn:xo:\
+ :co#80:it#8:li#24:ws#80:\
+ :AL=\E[%dL:DC=\E[%dP:DL=\E[%dM:DO=\E[%dB:IC=\E[%d@:\
+ :LE=\E[%dD:RI=\E[%dC:UP=\E[%dA:ae=^O:al=\E[L:as=^N:\
+ :bl=^G:bt=\E[Z:cd=\E[J:ce=\E[K:cl=\E[H\E[J:\
+ :cm=\E[%i%d;%dH:cr=^M:cs=\E[%i%d;%dr:ct=\E[3g:\
+ :dc=\E[P:dl=\E[M:do=^J:ds=\E[40l:ec=\E[%dX:ei=\E[4l:\
+ :fs=\E[1;24r\E8:ho=\E[H:i1=\E[90;1"p\E[?5W:\
+ :i2=\E>\017\E)0\E(B\E[63;0w\E[m:im=\E[4h:ip=:\
+ :is=\E[2;4;20;30;40l\E[?1;10;16l\E[12h\E[?7;8;25h:\
+ :ke=\E>:ks=\E[?1l\E=:le=^H:mb=\E[5m:md=\E[1m:\
+ :me=\E[m\017:mh=\E[2m:mr=\E[7m:nd=\E[C:rc=\E8:sc=\E7:\
+ :se=\E[27m:sf=\n:so=\E[7m:sr=\EM:st=\EH:ta=\011:\
+ :te=\E[ R:ti=\E[ Q:ts=\E[40l\E[40h\E7\E[99;%i%p1%dH:\
+ :ue=\E[24m:up=\E[A:us=\E[4m:vb=\E[30h\E\\\054\E[30l:\
+ :ve=\E[34h\E[?25h:vi=\E[?25l:vs=\E[?25h\E[34l:
+wy370|wyse370|wy370-101k|Wyse 370 with 101 key keyboard:\
+ :@8=\EOM:F1=\E[23~:F2=\E[24~:F3=\E[25~:F4=\E[26~:\
+ :F5=\E[28~:F6=\E[29~:k1=\E[?4i:k2=\E[?3i:k3=\E[2i:\
+ :k4=\E[@:k5=\E[M:k6=\E[17~:k7=\E[18~:k8=\E[19~:\
+ :k9=\E[20~:k;=\E[21~:kA=\EOP:kB=\E[Z:kD=\EOQ:kI=\EOP:\
+ :kL=\EOQ:kN=\E[U:kP=\E[V:kb=^H:kd=\E[B:kh=\E[H:\
+ :kl=\E[D:kr=\E[C:ku=\E[A:tc=wy370-nk:
+wy370-105k|Wyse 370 with 105 key keyboard:\
+ :%1=\E[28~:*6=\E[4~:@0=\E[1~:@8=\EOM:F1=\E[23~:\
+ :F2=\E[24~:F3=\E[25~:F4=\E[26~:F5=\E[28~:F6=\E[29~:\
+ :F7=\E[31~:F8=\E[32~:F9=\E[33~:FA=\E[34~:K1=\EOw:\
+ :K2=\EOu:K3=\EOy:K4=\EOq:K5=\EOs:k1=\EOP:k2=\EOQ:\
+ :k3=\EOR:k4=\EOS:k6=\E[17~:k7=\E[18~:k8=\E[19~:\
+ :k9=\E[20~:k;=\E[21~:kD=\E[3~:kI=\E[2~:kN=\E[6~:\
+ :kP=\E[5~:kb=^H:kd=\E[B:kh=\E[26~:kl=\E[D:kr=\E[C:\
+ :ku=\E[A:l1=PF1:l2=PF2:l3=PF3:l4=PF4:tc=wy370-nk:
+wy370-EPC|Wyse 370 with 102 key keyboard:\
+ :@7=\E[1~:@8=\EOM:F1=\E[23~:F2=\E[24~:k1=\EOP:\
+ :k2=\EOQ:k3=\EOR:k4=\EOS:k5=\E[M:k6=\E[17~:k7=\E[18~:\
+ :k8=\E[19~:k9=\E[20~:k;=\E[21~:kB=\E[Z:kI=\E[2~:\
+ :kN=\E[U:kP=\E[V:kb=^H:kd=\E[B:kh=\E[H:kl=\E[D:\
+ :kr=\E[C:ku=\E[A:tc=wy370-nk:
+wy370-vb|Wyse 370 with visible bell:\
+ :bl@:tc=wy370:
+wy370-w|Wyse 370 in 132-column mode:\
+ :co#132:ws#132:\
+ :r2=\E[35h\E[?3h:tc=wy370:
+wy370-wvb|Wyse 370 with visible bell 132-columns:\
+ :vb=\E[30h\E\\\054\E[30l:tc=wy370-w:
+wy370-rv|Wyse 370 reverse video:\
+ :r3=\E[32h\E[?5h:tc=wy370:
+wy99gt-tek|Wyse 99gt Tektronix 4010/4014 emulator:\
+ :am:os:\
+ :co#74:li#35:\
+ :bl=^G:cl=\E^L:\
+ :..cm=\035%{3040}%{89}%p1%*%-%Py\n%p2%{55}%*%Px\n%gy%{128}%/%{31}%&%{32}%+%c\n%gy%{3}%&%{4}%*%gx%{3}%&%+%{96}%+%c\n%gy%{004}%/%{31}%&%{96}%+%c\n%gx%{128}%/%{31}%&%{32}%+%c\n%gx%{004}%/%{31}%&%{64}%+%c\037:\
+ :cr=^M:do=^J:ff=^L:\
+ :hd=\036HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH\037:\
+ :ho=^]7`x @\037:\
+ :hu=\036DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD\037:\
+ :is=\E8:le=^H:nd= :nw=^M^J:u0=\E~>\E8:u1=\E[42h:\
+ :up=^K:
+wy160-tek|Wyse 160 Tektronix 4010/4014 emulator:\
+ :..cm=\035%{3103}%{91}%p1%*%-%Py\n%p2%{55}%*%Px\n%gy%{128}%/%{31}%&%{32}%+%c\n%gy%{3}%&%{4}%*%gx%{3}%&%+%{96}%+%c\n%gy%{004}%/%{31}%&%{96}%+%c\n%gx%{128}%/%{31}%&%{32}%+%c\n%gx%{004}%/%{31}%&%{64}%+%c\037:\
+ :ho=^]8`g @\037:tc=wy99gt-tek:
+wy370-tek|Wyse 370 Tektronix 4010/4014 emulator:\
+ :am:os:\
+ :co#80:li#36:\
+ :bl=^G:cl=\E^L:\
+ :..cm=\035%{775}%{108}%p1%*%{5}%/%-%Py\n%p2%{64}%*%{4}%+%{5}%/%Px\n%gy%{32}%/%{31}%&%{32}%+%c\n%gy%{31}%&%{96}%+%c\n%gx%{32}%/%{31}%&%{32}%+%c\n%gx%{31}%&%{64}%+%c\037:\
+ :cr=^M:do=^J:ff=^L:\
+ :hd=\036HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH\037:\
+ :ho=^]8g @\037:\
+ :hu=\036DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD\037:\
+ :is=\E8:kb=^H:kd=^J:kl=^H:kr=^I:ku=^K:le=^H:nd= :\
+ :nw=^M^J:u0=\E[?38h\E8:u1=\E[?38l\E)0:up=^K:
+
+
+wyse-vp|wyse|Wyse 50 in ADDS Viewpoint emulation mode with "enhance" on:\
+ :am:\
+ :co#80:it#8:li#24:\
+ :al=\EM:bl=^G:cd=\Ek:ce=\EK:cl=^L:cm=\EY%+ %+ :cr=^M:\
+ :dc=\EW:dl=\El:do=^J:ei=\Er:ho=^A:\
+ :if=/usr/share/tabset/wyse-adds:im=\Eq:\
+ :is=\E`\072\E`9\017\Er:kb=^H:kd=^J:kh=^A:kl=^U:kr=^F:\
+ :ku=^Z:le=^H:ll=^A^Z:nd=^F:nw=^M^J:\
+ :r1=\E`\072\E`9\017\Er:se=^O:sf=^J:so=^N:ta=^I:ue=^O:\
+ :up=^Z:us=^N:
+
+wy75ap|wyse75ap|wy-75ap|wyse-75ap|Wyse WY-75 Applications and Cursor keypad:\
+ :is=\E[1;24r\E[?10;3l\E[?1;25h\E[4l\E[m\E(B\E=:kb=^H:\
+ :kd=\EOB:ke=10\E[?1l\E>:kh=\EOH:kl=\EOD:kr=\EOC:\
+ :ks=10\E[?1h\E=:ku=\EOA:tc=wy75:
+
+wy100q|Wyse 100 for Quotron:\
+ :co#80:li#24:sg#1:ug#1:\
+ :al=\EE:bt=\EI:cd=\EY:ce=\ET:cl=^Z:cm=\E=%+ %+ :\
+ :dc=\EW:dl=\ER:do=^J:ei=\Er:ho=^^:im=\Eq:\
+ :is=\E`\072\200\EC\EDF\E0\E'\E(\EA21:kd=^J:kl=^H:\
+ :kr=^L:ku=^K:le=^H:nd=^L:se=\EG0:so=\EG4:sr=\Ej:\
+ :ue=\EG0:up=^K:us=\EG8:
+
+
+kermit|standard kermit:\
+ :co#80:li#24:\
+ :cd=\EJ:ce=\EK:cl=\EE:cm=\EY%+ %+ :ho=\EH:\
+ :is=K0 Standard Kermit 9-25-84\n:kd=^J:kh=^^:kl=^H:\
+ :kr=^L:ku=^K:le=^H:nd=\EC:up=\EA:
+kermit-am|standard kermit plus auto-margin:\
+ :am:\
+ :is=K1 Standard Kermit plus Automatic Margins\n:tc=kermit:
+pckermit|pckermit12|UCB IBMPC Kermit 1.2:\
+ :am:\
+ :li#25:\
+ :cd@:ce@:cl=\EH\EJ:\
+ :is=K2 UCB IBMPC Kermit 1.2 8-30-84\n:tc=kermit:
+pckermit120|UCB IBMPC Kermit 1.20:\
+ :it#8:li#24:\
+ :al=\EL:dc=\EN:dl=\EM:do=\EB:ei@:im@:\
+ :is=\EO\Eq\EJ\EY7 K3 UCB IBMPC Kermit 1.20 12-19-84\n:\
+ :se=\Eq:so=\Ep:ta=^I:vs=\EO\Eq\EEK3:tc=kermit:
+msk227|mskermit227|MS-DOS Kermit 2.27 for the IBMPC:\
+ :am@:\
+ :co#80:it#8:li#24:\
+ :al=\EL:cd=\EJ:ce=\EK:cl=\EE:cm=\EY%+ %+ :dc=\EN:\
+ :dl=\EM:do=\EB:ei=\EO:ho=\EH:im=\E@:\
+ :is=\EO\Eq\EG\Ew\EJ\EY7 K4 MS Kermit 2.27 for the IBMPC 3-17-85\n:\
+ :kd=^J:kh=^^:kl=^H:kr=^L:ku=^K:le=^H:nd=\EC:rc=\Ek:\
+ :sc=\Ej:se=\Eq:so=\Ep:ta=^I:up=\EA:vs=\EO\Eq\EG\EwK4:
+msk227am|mskermit227am|UCB MS-DOS Kermit 2.27 with automatic margins:\
+ :am:\
+ :is=\EO\Eq\EG\Ev\EJ\EY7 K5 MS Kermit 2.27 +automatic margins 3-17-85\n:\
+ :vs=\EO\Eq\EG\EvK5:tc=msk227:
+msk22714|mskermit22714|UCB MS-DOS Kermit 2.27 UCB 227.14 IBM PC:\
+ :am:\
+ :is=\EO\Eq\EG\Ev\EJ\EY7 K6 MS Kermit 2.27 UCB 227.14 IBM PC 3-17-85\n:\
+ :k0=\E0:k1=\E1:k2=\E2:k3=\E3:k4=\E4:k5=\E5:k6=\E6:\
+ :k7=\E7:k8=\E8:k9=\E9:md=\E[1m:me=\E[m:mr=\E[7m:\
+ :se=\E[m:so=\E[1m:ue=\E[m:us=\E[4m:vs=\EO\Eq\EG\EvK6:tc=mskermit227:
+vt320-k3|MS-Kermit 3.00's vt320 emulation:\
+ :am:es:hs:km:mi:ms:xn:\
+ :co#80:it#8:li#49:pb#9600:vt#3:\
+ :AL=\E[%dL:CC=\E:DC=\E[%dP:DL=\E[%dM:DO=\E[%dB:\
+ :IC=\E[%d@:LE=\E[%dD:RI=\E[%dC:SR=\E[%dL:UP=\E[%dA:\
+ :ae=\E(B:al=\E[L:as=\E(0:bl=^G:cd=\E[J:ce=\E[K:\
+ :cl=\E[H\E[J:cm=\E[%i%d;%dH:cr=^M:cs=\E[%i%d;%dr:\
+ :ct=\E[3g:dc=\E[P:dl=\E[M:do=^J:ds=\E[0$~:ec=\E[%dX:\
+ :ei=\E[4l:fs=\E[0$}:ho=\E[H:im=\E[4h:\
+ :is=\E>\E F\E[?1l\E[?7h\E[r\E[2$~:k0=\E[21~:k1=\EOP:\
+ :k2=\EOQ:k3=\EOR:k4=\EOS:k6=\E[17~:k7=\E[18~:\
+ :k8=\E[19~:k9=\E[20~:kI=\E[2~:kN=\E[6~:kP=\E[5~:\
+ :kb=^H:kd=\EOB:ke=\E[?1l\E>:kl=\EOD:kr=\EOC:\
+ :ks=\E[?1h\E=:ku=\EOA:le=^H:mb=\E[5m:md=\E[1m:\
+ :me=\E[m:mr=\E[7m:nd=\E[C:nw=^M^J:rc=\E8:sc=\E7:\
+ :se=\E[27m:sf=^J:so=\E[7m:sr=\EM:st=\EH:ta=^I:\
+ :ts=\E[1$}\r\E[K:ue=\E[24m:up=\E[A:us=\E[4m:\
+ :vb=\E[?5h\E[?5l\E[?5h\E[?5l\E[?5h\E[?5l:ve=\E[?25h:\
+ :vi=\E[?25l:
+vt320-k311|dec vt320 series as defined by kermit 3.11:\
+ :am:es:hs:mi:ms:xn:xo:\
+ :co#80:it#8:li#24:vt#3:\
+ :AL=\E[%dL:DC=\E[%dP:DL=\E[%dM:DO=\E[%dB:IC=\E[%d@:\
+ :LE=\E[%dD:RA=\E[?7l:RI=\E[%dC:SA=\E[?7h:UP=\E[%dA:\
+ :al=3\E[L:bl=^G:cd=\E[J:ce=\E[K:cl=\E[;H\E[2J:\
+ :cm=\E[%i%d;%dH:cr=^M:cs=\E[%i%d;%dr:ct=\E[3g:\
+ :dc=\E[P:dl=\E[M:do=^J:ds=\E[2$~\r\E[1$}\E[K\E[$}:\
+ :ei=\E[4l:fs=\E[$}:ho=\E[H:im=\E[4h:\
+ :is=\E>\E[?3l\E[?4l\E[?5l\E[?7h\E[?8h\E[1;24r\E[24;1H:\
+ :k1=\EOP:k2=\EOQ:k3=\EOR:k4=\EOS:k6=\E[17~:k7=\E[18~:\
+ :k8=\E[19~:k9=\E[20~:kb=^H:kd=\EOB:ke=\E[?1l\E>:\
+ :kl=\EOD:kr=\EOC:ks=\E[?1h\E=:ku=\EOA:l1=pf1:l2=pf2:\
+ :l3=pf3:l4=pf4:le=^H:mb=\E[5m:md=\E[1m:me=\E[m:\
+ :mr=\E[7m:nd=\E[C:nw=^M\ED:r1=\E[?3l:rc=\E8:\
+ :rf=/usr/lib/tabset/vt100:sc=\E7:se=\E[27m:sf=\ED:\
+ :so=\E[7m:sr=\EM:st=\EH:ta=^I:\
+ :ts=\E[2$~\E[1$}\E[1;%dH:ue=\E[24m:up=\E[A:us=\E[4m:\
+ :vb=\E[?5h\E[?5l:ve=\E[?25h:vi=\E[?25l:vs=\E[?25h:
+
+
+avatar0|avatar terminal emulator level 0:\
+ :am:ms:ut:\
+ :co#80:it#8:li#25:\
+ :as=:ce=^V^G:cm=\026\010%.%.:cr=^M:do=^V^D:le=^V^E:\
+ :mb=^A^V\177:md=^V^A^P:me=^V^A^G:mk=^V^A\200:\
+ :mr=^A^Vp:nd=^V^F:r2=^L:rp=\031%.%d:\
+ :..sa=\026\001%{0}%?%p1%t%{112}%|%;%?%p2%t%{1}%|%;%?%p3%t%{112}%|%;%?%p4%t{128}%|%;%?%p6%t%{16}%|%;:\
+ :sf=^J:so=^A^Vp:up=^V^C:us=^V^A:tc=klone+acs:
+avatar0+|avatar terminal emulator level 0+:\
+ :dc=^V^N:ei=\026\n\200\200\200\200:im=^V^I:tc=avatar0:
+avatar|avatar1|avatar terminal emulator level 1:\
+ :RA=^V":SA=^V$:al=^V+:dl=^V-:ei=^V^P:ve=^V'^A:\
+ :vi=^V'^B:vs=^V^C:tc=avatar0+:
+
+
+att2300|sv80|AT&T 2300 Video Information Terminal 80 column mode:\
+ :am:eo:mi:ms:xo:\
+ :co#80:it#8:li#24:\
+ :AL=\E[%dL:DC=\E[%dP:DL=\E[%dM:DO=\E[%dB:F1=\E[11r:\
+ :F2=\E[12r:F3=\E[13r:F4=\E[14r:F5=\E[15r:F6=\E[16r:\
+ :IC=\E[%d@:LE=\E[%dD:RI=\E[%dC:UP=\E[%dA:al=\E[L:\
+ :bl=^G:cb=\E[1K:cd=\E[J:ce=\E[K:cl=\E[H\E[J:\
+ :cm=\E[%i%d;%dH:cr=^M:dc=\E[P:dl=\E[M:do=^J:ei=\E[4l:\
+ :ho=\E[H:im=\E[4h:k1=\E[1r:k2=\E[2r:k3=\E[3r:\
+ :k4=\E[4r:k5=\E[5r:k6=\E[6r:k7=\E[7r:k8=\E[8r:\
+ :k9=\E[9r:k;=\E[10r:kA=\E[L:kB=\E[Z:kC=\E[J:kD=\E[P:\
+ :kI=\E[@:kL=\E[M:kb=^H:kd=\E[B:kh=\E[H:kl=\E[D:\
+ :kr=\E[C:ku=\E[A:le=^H:me=\E[m:mr=\E[7m:nd=\E[C:\
+ :pf=\E[4i:po=\E[5i:ps=\E[0i:se=\E[m:sf=^J:so=\E[7m:\
+ :ta=^I:up=\E[A:
+att2350|AT&T 2350 Video Information Terminal 80 column mode:\
+ :pf@:po@:ps@:tc=att2300:
+
+att5410v1|att4410v1|tty5410v1|AT&T 4410/5410 80 columns - version 1:\
+ :am:hs:mi:ms:xo:\
+ :Nl#8:co#80:it#8:lh#2:li#24:lw#8:ws#80:\
+ :ac=``aaffhhggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~00++--\\\054\\\054..:\
+ :ae=^O:al=\E[L:as=^N:bl=^G:cd=\E[J:ce=\E[K:\
+ :cl=\E[H\E[J:cm=\E[%i%d;%dH:cr=^M:cs=\E[%i%d;%dr:\
+ :dc=\E[P:dl=\E[M:do=\E[B:ei=:fs=\E8:ho=\E[H:\
+ :i1=\E[?3l\E)0:\
+ :i2=\E[1;03q f1 \EOP\E[2;03q f2 \EOQ\E[3;03q f3 \EOR\E[4;03q f4 \EOS\E[5;03q f5 \EOT\E[6;03q f6 \EOU\E[7;03q f7 \EOV\E[8;03q f8 \EOW:\
+ :ic=\E[@:im=:k1=\EOP:k2=\EOQ:k3=\EOR:k4=\EOS:k5=\EOT:\
+ :k6=\EOU:k7=\EOV:k8=\EOW:kC=\E[2J:kH=\E[24;1H:kb=^H:\
+ :kd=\E[B:kh=\E[H:kl=\E[D:kr=\E[C:ku=\E[A:le=^H:\
+ :ll=\E[24H:mb=\E[5m:md=\E[2;7m:me=\E[m\017:mh=\E[2m:\
+ :mk=\E[8m:mr=\E[7m:nd=\E[C:nw=^M^J:\
+ :r2=\Ec\E[?3l\E[2;0y:rc=\E8:sc=\E7:se=\E[m:sf=^J:\
+ :so=\E[7m:sr=\EM:ta=^I:ts=\E7\E[25;%p1%{1}%+%dH:\
+ :ue=\E[m:up=\E[A:us=\E[4m:
+
+att4410v1-w|att5410v1-w|tty5410v1-w|AT&T 4410/5410 132 columns - version 1:\
+ :co#132:ws#132:\
+ :i1=\E[?3h\E)0:r2=\Ec\E[?3h\E[2;0y:tc=att5410v1:
+
+att4410|att5410|tty5410|AT&T 4410/5410 80 columns - version 2:\
+ :..px=\E[%p1%d;%p2%l%02dq f%p1%d %p2%s:tc=att5410v1:
+
+att5410-w|att4410-w|4410-w|tty5410-w|5410-w|AT&T 4410/5410 in 132 column mode:\
+ :co#132:ws#132:\
+ :i1=\E[?3h\E)0:r2=\Ec\E[?3h\E[2;0y:tc=att4410:
+
+v5410|5410 in terms of a vt100:\
+ :am:mi:ms:xo:\
+ :co#80:it#8:li#24:vt#3:\
+ :@8=\EOM:K1=\EOq:K2=\EOr:K3=\EOs:K4=\EOp:K5=\EOn:\
+ :RA=\E[?7l:SA=\E[?7h:\
+ :ac=``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~:\
+ :ae=^O:al=\E[L:as=^N:bl=^G:cb=\E[1K:cd=\E[J:ce=\E[K:\
+ :cl=\E[H\E[J:cm=\E[%i%d;%dH:cr=^M:cs=\E[%i%d;%dr:\
+ :ct=\E[3g:dc=\E[P:dl=\E[M:do=^J:eA=\E(B\E)0:ei=:\
+ :ho=\E[H:ic=\E[@:im=:k0=\EOy:k1=\EOP:k2=\EOQ:k3=\EOR:\
+ :k4=\EOS:k5=\EOt:k6=\EOu:k7=\EOv:k8=\EOl:k9=\EOw:\
+ :k;=\EOx:kb=^H:kd=\EOB:ke=\E[?1l\E>:kl=\EOD:kr=\EOC:\
+ :ks=\E[?1h\E=:ku=\EOA:le=^H:mb=\E[5m:md=\E[1m:\
+ :me=\E[m\017:mr=\E[7m:nd=\E[C:\
+ :r2=\E>\E[?3l\E[?4l\E[?5l\E[?7h\E[?8h:rc=\E8:\
+ :..sa=\E[0%?%p1%p6%|%t;1%;%?%p2%t;4%;%?%p1%p3%|%t;7%;%?%p4%t;5%;m%?%p9%t\016%e\017%;:\
+ :sc=\E7:se=\E[m:sf=^J:so=\E[1;7m:sr=\EM:st=\EH:ta=^I:\
+ :ue=\E[m:up=\E[A:us=\E[4m:
+
+att4415|tty5420|att5420|AT&T 4415/5420 80 cols:\
+ :db:mi:xo:\
+ :Nl#8:lh#2:lm#78:lw#8:ws#55:\
+ :@1=\Et:@7=\Ez:@8=\Eent:AL=\E[%dL:\
+ :CM=\E[%i%p1%d;%p2%dt:DC=\E[%dP:DL=\E[%dM:DO=\E[%dB:\
+ :IC=\E[%d@:LE=\E[%dD:LF=\E|:LO=\E~:RA=\E[?7l:\
+ :RI=\E[%dC:SA=\E[?7h:SF=\E[%dE:SR=\E[%dF:UP=\E[%dA:\
+ :bt=\E[Z:ch=\E[%+^AG:cl=\E[x\E[J:cm=\E[%i%d;%dx:\
+ :ct=\E[3g:cv=\E[%+^Ad:ec=\E[%ds\E[%dD:ei=\E[4l:\
+ :ho=\E[x:i1=\E[?3l:i2=\E[?5l:ic@:im=\E[4h:\
+ :is=\E[m\017\E[1;2;3;4;6l\E[12;13;14;20l\E[?6;97;99l\E[?7h\E[4i\Ex\E[21;1j\212:\
+ :k1=\EOc:k2=\EOd:k3=\EOe:k4=\EOf:k5=\EOg:k6=\EOh:\
+ :k7=\EOi:k8=\EOj:kA=\E[L:kB=\E[Z:kD=\E[P:kE=\E[2K:\
+ :kF=\E[T:kH=\Eu:kI=\E[4h:kL=\E[M:kN=\E[U:kP=\E[V:\
+ :kR=\E[S:ke=\E[19;0j\E[21;1j\212:\
+ :ks=\E[19;1j\E[21;4j\Eent:l1=F1:l2=F2:l3=F3:l4=F4:\
+ :l5=F5:l6=F6:l7=F7:l8=F8:ll=\Ew:me=\E[m\017:mp=\EV:\
+ :pf=\E[?9i:po=\E[?4i:ps=\E[?2i:st=\EH:\
+ :ts=\E7\E[25;%p1%{8}%+%dH:vb=\E[?5h\E[?5l:\
+ :ve=\E[11;0j:vs=\E[11;1j:tc=att4410:
+
+att4415-w|tty5420-w|att5420-w|AT&T 4415/5420 132 cols:\
+ :co#132:lm#54:ws#97:\
+ :i1=\E[?3h:tc=att4415:
+
+att4415-rv|tty5420-rv|att5420-rv|AT&T 4415/5420 80 cols/rv:\
+ :i2=\E[?5h:vb=\E[?5l\E[?5h:tc=att4415:
+
+att4415-w-rv|tty5420-w-rv|att5420-w-rv|AT&T 4415/5420 132 cols/rv:\
+ :co#132:lm#54:ws#97:\
+ :i1=\E[?3h:i2=\E[?5h:vb=\E[?5l\E[?5h:tc=att4415:
+
+att4415+nl|4415+nl|tty5420+nl|att5420+nl|generic AT&T 4415/5420 changes for not changing labels:\
+ :k1@:k2@:k3@:k4@:k5@:k6@:k7@:k8@:\
+ :..pn=\E[%p1%d;0;0;1q%p2%\072-16.16s:\
+ :..px=\E[%p1%d;%p2%l%02d;0;1q F%p1%d %p2%s:
+
+att4415-nl|4415-nl|tty5420-nl|att5420-nl|AT&T 4415/5420 without changing labels:\
+ :k1@:k2@:k3@:k4@:k5@:k6@:k7@:k8@:tc=att4415+nl:tc=att4415:
+
+att4415-rv-nl|tty5420-rv-nl|att5420-rv-nl|AT&T 4415/5420 reverse video without changing labels:\
+ :k1@:k2@:k3@:k4@:k5@:k6@:k7@:k8@:tc=att4415+nl:tc=att4415-rv:
+
+att4415-w-nl|tty5420-w-nl|att5420-w-nl|AT&T 4415/5420 132 cols without changing labels:\
+ :k1@:k2@:k3@:k4@:k5@:k6@:k7@:k8@:tc=att4415+nl:tc=att4415-w:
+
+att4415-w-rv-n|tty5420-w-rv-n|att5420-w-rv-n|AT&T 4415/5420 132 cols reverse without changing labels:\
+ :k1@:k2@:k3@:k4@:k5@:k6@:k7@:k8@:tc=att4415+nl:tc=att4415-w-rv:
+
+att5420_2|AT&T 5420 model 2 80 cols:\
+ :am:db:hs:mi:ms:xo:\
+ :co#80:it#8:li#24:lm#78:ws#55:\
+ :AL=\E[%dL:CM=\E[%i%p1%d;%p2%dt:DC=\E[%dP:DL=\E[%dM:\
+ :IC=\E[%d@:LE=\E[%dD:RI=\E[%dC:SF=\E[%dE:SR=\E[%dF:\
+ :UP=\E[%dA:ae=^O:al=\E[L:as=^N:bt=\E[1Z:cd=\E[0J:\
+ :ce=\E[0K:cl=\EH\EJ:cm=\E[%i%d;%dH:cr=\EG:\
+ :cs=\E[%i%d;%dr:ct=\E[3g:dc=\E[P:dl=\E[M:do=\E[1B:\
+ :ec=\E[%ds\E[%dD:ei=:fs=\E8:ho=\E[H:\
+ :i1=\E[0;23r\Ex\Ey\E[2;0j\E[3;3j\E[4;0j\E[5;0j\E[6;0j\E[7;0j\E[8;0j\E[9;1j\E[10;0j\E[15;0j\E[16;1j\E[19;0j\E[20;1j\E[29;0j\E[1;24r:\
+ :ic=\E[@:im=:k1=\EOc:k2=\EOd:k3=\EOe:k4=\EOf:k5=\EOg:\
+ :k6=\EOh:k7=\EOi:k8=\EOj:kD=\E[P:kH=\Eu:kI=\E[4h:\
+ :kN=\E[U:kP=\E[V:kb=^H:kd=\E[B:ke=\E[19;0j:kh=\E[H:\
+ :kl=\E[D:kr=\E[C:ks=\E[19;1j:ku=\E[A:le=^H:ll=\Ew:\
+ :mb=\E[5m:me=\E[m\017:mh=\E[2m:mr=\E[7m:nd=\E[1C:\
+ :nw=^M^J:rc=\E8:sc=\E7:se=\E[m:sf=^J:so=\E[7m:sr=\EM:\
+ :st=\EH:ta=^I:ts=\E7\E[25;%p1%{8}%+%dH:ue=\E[m:\
+ :us=\E[4m:vb=\E[?5h\E[?5l:ve=\E[11;0j:vs=\E[11;1j:
+att5420_2-w|AT&T 5420 model 2 in 132 column mode:\
+ :co#132:\
+ :i1=\E[0;23r\Ex\Ey\E[2;0j\E[3;3j\E[4;0j\E[5;1j\E[6;0j\E[7;0j\E[8;0j\E[9;1j\E[10;0j\E[15;0j\E[16;1j\E[19;0j\E[20;1j\E[29;0j\E[1;24r:tc=att5420_2:
+
+att4418|att5418|AT&T 5418 80 cols:\
+ :am:xo:\
+ :co#80:li#24:\
+ :@8=\E[:AL=\E[%dL:DC=\E[%dP:DL=\E[%dM:DO=\E[%dB:\
+ :F1=\E[n:F2=\E[o:F3=\E[H:F4=\E[I:F5=\E[J:F8=\E[K:\
+ :F9=\E[L:FA=\E[E:FB=\E[_:FC=\E[M:FD=\E[N:FE=\E[O:\
+ :IC=\E[%d@:LE=\E[%dD:RI=\E[%dC:UP=\E[%dA:ae=^O:\
+ :al=\E[1L:as=^N:bl=^G:cd=\E[0J:ce=\E[0K:cl=\E[H\E[2J:\
+ :cm=\E[%i%d;%dH:cr=^M:dc=\E[1P:dl=\E[M:do=\E[B:ei=:\
+ :ho=\E[H:i1=\E[?3l:ic=\E[1@:im=:is=\E)0\E?6l\E?5l:\
+ :k1=\E[h:k2=\E[i:k3=\E[j:k6=\E[k:k7=\E[l:k8=\E[f:\
+ :k9=\E[w:k;=\E[m:kC=\E[%:kd=\EU:kh=\Ec:kl=\E@:kr=\EA:\
+ :ku=\ES:le=\E[D:mb=\E[5m:me=\E[m\017:mh=\E[2m:\
+ :mr=\E[7m:nd=\E[C:rc=\E8:sc=\E7:se=\E[m:sf=^J:\
+ :so=\E[7m:ue=\E[m:up=\E[A:us=\E[4m:
+att4418-w|att5418-w|AT&T 5418 132 cols:\
+ :co#132:\
+ :i1=\E[?3h:tc=att5418:
+
+att4420|tty4420|teletype 4420:\
+ :da:db:eo:ms:ul:xo:\
+ :co#80:li#24:lm#72:\
+ :al=\EL:bl=^G:cd=\EJ:ce=\Ez:cl=\EH\EJ:cm=\EY%+ %+ :\
+ :cr=\EG:dc=\EP:dl=\EM:dm@:do=\EB:ed@:ho=\EH:k0=\EU:\
+ :k3=\E@:kA=\EL:kB=\EO:kC=\EJ:kD=\EP:kF=\ES:kI=\E^:\
+ :kL=\EM:kR=\ET:kd=\EB:kh=\EH:kl=^H:kr=\EC:ku=\EA:\
+ :l0=segment advance:l3=cursor tab:le=\ED:nd=\EC:\
+ :se=\E~:sf=\EH\EM\EY7 :so=\E}:ue=\EZ:up=\EA:us=\E\\:
+
+att4424|tty4424|teletype 4424:\
+ :am:xo:\
+ :co#80:li#24:\
+ :AL=\E[%dL:DC=\E[%dP:DL=\E[%dM:DO=\E[%dB:IC=\E[%d@:\
+ :LE=\E[%dD:RI=\E[%dC:UP=\E[%dA:ae=\E(B:al=\EL:\
+ :as=\E(0:bl=^G:bt=\EO:cd=\EJ:ce=\Ez:cl=\E[H\E[2J:\
+ :cm=\E[%i%d;%dH:cr=^M:cs=\E[%i%d;%dr:ct=\EF:dc=\EP:\
+ :dl=\EM:do=\EB:ei=:ho=\E[H:ic=\E^:im=:\
+ :is=\E[20l\E[?7h:k1=\EOP:k2=\EOQ:k3=\EOR:k4=\EOS:\
+ :kC=\EJ:kb=^H:kd=\E[B:kh=\E[H:kl=\E[D:kr=\E[C:\
+ :ku=\E[A:le=^H:mb=\E3:md=\E3:me=\EX\E~\EZ\E4\E(B:\
+ :mh=\EW:mr=\E}:nd=\EC:nw=\EE:\
+ :..sa=\E[%?%p1%t7%;%?%p2%t;4%;%?%p3%t;7%;%?%p6%t;1%;%?%p6%p4%|%t;5%;%?%p5%t;0%;m:\
+ :se=\E~:sf=^J:so=\E}:sr=\ET:st=\EH:ta=^I:ti=\E[1m:\
+ :ue=\EZ:up=\EA:us=\E\\:
+
+att4424-1|tty4424-1|teletype 4424 in display function group I:\
+ :kC@:kd=\EB:kh@:kl=\ED:kr=\EC:ku=\EA:tc=att4424:
+
+att4424m|tty4424m|teletype 4424M:\
+ :am:da:db:mi:\
+ :co#80:it#8:li#23:\
+ :al=\EL:bl=^G:ce=\E[K:cl=\E[2;H\E[J:\
+ :cm=\E[%i%2;%2H\E[B:cr=^M:dc=\EP:dl=\EM:do=^J:ei=:\
+ :ic=\E^:im=:ip=2:is=\E[m\E[2;24r:k1=\EOP:k2=\EOQ:\
+ :k3=\EOR:k4=\EOS:kb=^H:kd=\E[B:kh=\E[H:kl=\E[D:\
+ :kr=\E[C:ku=\E[A:le=^H:nd=\E[C:nw=^M^J:se=\E[m:sf=^J:\
+ :so=\E[7m:sr=\ET:ta=^I:ue=\E[m:up=\E[A:us=\E[4m:
+
+att5425|tty5425|att4425|AT&T 4425/5425:\
+ :am:da:db:hs:mi:ms:xn:xo:\
+ :co#80:it#8:li#24:lm#78:ws#55:\
+ :AL=\E[%dL:DC=\E[%dP:DL=\E[%dM:DO=\E[%dB:IC=\E[%d@:\
+ :LE=\E[%dD:RI=\E[%dC:SF=\E[%dE:SR=\E[%dF:UP=\E[%dA:\
+ :ae=^O:al=\E[L:as=^N:bl=^G:bt=\E[Z:cd=\E[J:ce=\E[K:\
+ :cl=\E[H\E[J:cm=\E[%i%d;%dH:cr=^M:cs=\E[%i%d;%dr:\
+ :ct=\E[3g:dc=\E[P:dl=\E[M:do=^J:ec=\E[%ds\E[%dD:\
+ :ei=\E[4l:fs=\E8:ho=\E[H:i1=\E<\E[?3l:i2=\E[?5l:\
+ :im=\E[4h:\
+ :is=\E[m\017\E[1;2;3;4;6l\E[12;13;14;20l\E[?6;97;99l\E[?7h\E[4i\Ex\E[25;1j\212:\
+ :k1=\EOc:k2=\EOd:k3=\EOe:k4=\EOf:k5=\EOg:k6=\EOh:\
+ :k7=\EOi:k8=\EOj:kD=\E[P:kI=\E[4h:kb=^H:kd=\E[B:\
+ :ke=\E[21;0j\E[25;1j\212:kh=\E[H:kl=\E[D:kr=\E[C:\
+ :ks=\E[21;1j\E[25;4j\Eent\E~:ku=\E[A:le=^H:ll=\E[24H:\
+ :mb=\E[5m:md=\E[2;7m:me=\E[m\017:mh=\E[2m:mr=\E[7m:\
+ :nd=\E[C:nw=^M^J:rc=\E8:sc=\E7:se=\E[m:sf=^J:\
+ :so=\E[7m:sr=\EM:st=\EH:ta=^I:\
+ :ts=\E7\E[25;%p1%{8}%+%dH:ue=\E[m:up=\E[A:us=\E[4m:\
+ :vb=\E[?5h\E[?5l:ve=\E[12;0j:vs=\E[12;1j:
+
+att5425-nl|tty5425-nl|att4425-nl|AT&T 4425/5425 80 columns no labels:\
+ :ks=\E[21;1j\E[25;4j\Eent:tc=att4425:
+
+att5425-w|att4425-w|tty5425-w|teletype 4425/5425 in 132 column mode:\
+ :co#132:lm#54:ws#97:\
+ :i1=\E[?3h:tc=tty5425:
+
+att4426|tty4426|teletype 4426S:\
+ :am:da:db:xo:\
+ :co#80:li#24:lm#48:\
+ :AL=\E[%dL:DC=\E[%dP:DL=\E[%dM:DO=\E[%dB:IC=\E[%d@:\
+ :LE=\E[%dD:RA=\E[?7l:RI=\E[%dC:SA=\E[?7h:SF=\E[%dS:\
+ :SR=\E[%dT:UP=\E[%dA:ae=\E(B:al=\EL:as=\E(0:bl=^G:\
+ :cd=\E[J:ce=\E[0K:ch=\E[%dG:\
+ :cl=\E[H\E[2J\E[1U\E[H\E[2J\E[1V:cm=\E[%i%d;%dH:\
+ :cr=^M:ct=\E[3g:cv=\E[%dd:dc=\EP:dl=\E[M:do=\E[B:ei=:\
+ :ho=\E[H:i1=\Ec\E[?7h:ic=\E^:im=:is=\E[m\E[1;24r:\
+ :k1=\EOP:k2=\EOQ:k3=\EOR:k4=\EOS:k5=\EOT:k6=\EOU:\
+ :k7=\EOV:k8=\EOW:kB=\EO:kC=\E[2J:kH=\E[24;1H:kb=^H:\
+ :kd=\EB:kh=\E[H:kl=\ED:kr=\EC:ku=\EA:le=\E[D:\
+ :ll=\E[24H:md=\E[5m:me=\E[m\E(B:mr=\E[7m:nd=\E[C:\
+ :nw=^M^J:r2=\Ec\E[?3l\E[2;0y:rc=\E8:sc=\E7:se=\E[m:\
+ :sf=^J:so=\E[5m:sr=\ET:st=\E1:ta=^I:ue=\E[m:up=\EA:\
+ :us=\E[4m:
+
+att510a|510a|bct510a|510A|AT&T 510A Personal Terminal:\
+ :am:mi:ms:xn:xo:\
+ :Nl#8:co#80:lh#2:li#24:lw#7:\
+ :#4=\E[u:%i=\E[v:AL=\E[%dL:DC=\E[%dP:DL=\E[%dM:\
+ :DO=\E[%dB:F1=\EOe:F2=\EOf:F3=\EOg:F4=\EOh:F5=\EOi:\
+ :F6=\EOj:LE=\E[%dD:RI=\E[%dC:UP=\E[%dA:\
+ :ac=hrisjjkkllmmnnqqttuuvvwwxx{{||}}~~-f\\\054h.e+g`b:\
+ :ae=^O:al=\E[L:as=^N:bl=^G:bt=\E[Z:cb=\E[1K:cd=\E[0J:\
+ :ce=\E[0K:cl=\E[H\E[J:cm=\E[%i%d;%dH:cr=^M:ct=\E[3g:\
+ :dc=\E[P:dl=\E[M:do=\E[1B:eA=\E(B\E)1:ff=^L:ho=\E[H:\
+ :i1=\E(B\E)1\E[2l:i2=\E[21;1|\212:k1=\EOm:k2=\EOV:\
+ :k3=\EOu:k4=\ENj:k5=\ENe:k6=\ENf:k7=\ENh:k8=\E[H:\
+ :k9=\EOc:k;=\EOd:kB=\E[Z:kF=\E[S:kR=\E[T:kb=^H:\
+ :kd=\E[B:ke=\E[19;0|:kl=\E[D:kr=\E[C:ks=\E[19;1|:\
+ :ku=\E[A:le=^H:mb=\E[5m:md=\E[2;7m:me=\E[m\017:\
+ :mh=\E[2m:mr=\E[7m:nd=\E[C:nw=\EE:pf=\E[?8i:\
+ :po=\E[?4i:ps=\E[0i:rc=\E8:sc=\E7:se=\E[m:sf=^J:\
+ :so=\E[7m:sr=\EM:st=\EH:ta=^I:ue=\E[m:up=\E[A:\
+ :us=\E[4m:ve=\E[11;3|:vi=\E[11;0|:vs=\E[11;2|:
+
+att510d|510d|bct510d|510D|AT&T 510D Personal Terminal:\
+ :am:da:db:mi:ms:xn:xo:\
+ :co#80:li#24:lm#48:\
+ :AL=\E[%dL:DC=\E[%dP:DL=\E[%dM:DO=\E[%dB:IC=\E[%d@:\
+ :LE=\E[%dD:RI=\E[%dC:SF=\E[%dS:SR=\E[%dT:UP=\E[%dA:\
+ :ae=^O:al=\E[L:as=^N:bl=^G:bt=\E[Z:cd=\E[0J:ce=\E[0K:\
+ :cl=\E[H\E[J:cm=\E[%i%d;%dH:cr=^M:ct=\E[3g:dc=\E[P:\
+ :dl=\E[M:do=\E[1B:ei=\E[4l:ff=^L:ho=\E[H:\
+ :i1=\E(B\E)1\E[5;0|:i2=\E[21;1|\212:im=\E[4h:k1=\EOm:\
+ :k2=\EOV:k3=\EOu:k4=\ENj:k5=\ENe:k6=\ENf:k7=\ENh:\
+ :k8=\E[H:k9=\EOc:kb=^H:kd=\E[B:ke=\E[19;0|:kl=\E[D:\
+ :kr=\E[C:ks=\E[19;1|:ku=\E[A:le=^H:ll=\E#2:mb=\E[5m:\
+ :md=\E[2;7m:me=\E[m\017:mh=\E[2m:mr=\E[7m:nd=\E[C:\
+ :nw=\EE:rc=\E8:sc=\E7:se=\E[m:sf=^J:so=\E[7m:sr=\EM:\
+ :st=\EH:ta=^I:ue=\E[m:up=\E[A:us=\E[4m:ve=\E[11;3|:\
+ :vs=\E[11;2|:
+
+att500|att513|500bct|513bct|AT&T 513 using page mode:\
+ :am:mi:ms:xn:xo:\
+ :co#80:li#24:\
+ :AL=\E[%dL:DC=\E[%dP:DL=\E[%dM:DO=\E[%dB:IC=\E[%d@:\
+ :LE=\E[%dD:RI=\E[%dC:SF=\E[%dE:SR=\E[%dF:UP=\E[%dA:\
+ :ae=^O:al=\E[L:as=^N:bl=^G:bt=\E[Z:cd=\E[J:ce=\E[K:\
+ :cl=\E[H\E[J:cm=\E[%i%d;%dH:cr=^M:cs=%i\E[%d;%dr:\
+ :ct=\E[3g:dc=\E[P:dl=\E[M:do=^J:ei=\E[4l:ho=\E[H:\
+ :i1=\E?\E[3;3|\E[10;0|\E[21;1|\212\E[6;1|\E[1{\E[?99l:\
+ :im=\E[4h:k1=\EOc:k2=\EOd:k3=\EOe:k4=\EOf:k5=\EOg:\
+ :k6=\EOh:k7=\EOi:k8=\EOj:kD=\ENf:kI=\ENj:kN=\E[U:\
+ :kP=\E[V:kb=^H:kd=\E[B:ke=\E[19;0|\E[21;1|\212:\
+ :kh=\E[H:kl=\E[D:kr=\E[C:ks=\E[19;1|\E[21;4|\Eent:\
+ :ku=\E[A:le=^H:ll=\E#2:mb=\E[5m:md=\E[2;7m:\
+ :me=\E[m\017:mh=\E[2m:mr=\E[7m:nd=\E[C:nw=\EE:rc=\E8:\
+ :sc=\E7:se=\E[m:sf=^J:so=\E[7m:sr=\EM:st=\EH:ta=^I:\
+ :ue=\E[m:up=\E[A:us=\E[4m:ve=\E[11;0|:vs=\E[11;1|:
+
+att5310|att5320|AT&T Model 53210 or 5320 matrix printer:\
+ :co#132:it#8:li#66:\
+ :DO=\E[%de:RI=\E[%da:cr=^M:do=^J:ff=^L:i1=\Ec:\
+ :is=\E[20l\r:nd= :ta=^I:up=\EM:
+
+att5620|dmd|tty5620|ttydmd|5620|5620 terminal 88 columns:\
+ :NL:NP:am:xo:\
+ :co#88:it#8:li#70:\
+ :AL=\E[%dL:DC=\E[%dP:DL=\E[%dM:IC=\E[%d@:SF=\E[%dS:\
+ :SR=\E[%dT:al=\E[L:bl=^G:cd=\E[J:ce=\E[K:cl=\E[H\E[J:\
+ :cm=\E[%i%d;%dH:cr=^M:dc=\E[P:dl=\E[M:do=\E[B:ei=:\
+ :ho=\E[H:ic=\E[@:im=:kC=\E[2J:kH=\E[70;1H:kb=^H:\
+ :kd=\E[B:kh=\E[H:kl=\E[D:kr=\E[C:ku=\E[A:le=^H:\
+ :md=\E[2m:me=\E[m:mh=\E[2m:mr=\E[7m:nd=\E[C:nw=^J:\
+ :..px=\E[%p1%d;%p2%l%dq%p2%s:r1=\Ec:rc=\E8:sc=\E7:\
+ :se=\E[m:sf=\E[S:so=\E[7m:sr=\E[T:ta=^I:ue=\E[m:\
+ :up=\E[A:us=\E[4m:
+att5620-24|dmd-24|teletype dmd 5620 in a 24x80 layer:\
+ :li#24:tc=att5620:
+att5620-34|dmd-34|teletype dmd 5620 in a 34x80 layer:\
+ :li#34:tc=att5620:
+
+att605|605bct|AT&T 605 80 column 102key keyboard:\
+ :am:eo:xo:\
+ :co#80:li#24:ws#80:\
+ :DC=\E[%dP:DL=\E[%dM:IC=\E[%d@:ae=^O:al=\E[L:\
+ :as=\E)0\016:bl=^G:bt=\E[Z:cd=\E[J:ce=\E[K:\
+ :cl=\E[H\E[J:cm=\E[%i%d;%dH:cr=^M:dc=\E[P:dl=\E[M:\
+ :do=\E[B:ei=\E[4l:fs=\E8:\
+ :i1=\E[8;0|\E[?\E[13;20l\E[?\E[12h:ic=\E[@:im=\E[4h:\
+ :is=\E[m\017:k1=\EOc:k2=\EOd:k3=\EOe:k4=\EOf:k5=\EOg:\
+ :k6=\EOh:k7=\EOi:k8=\EOj:k9=\ENo:kD=\E[P:kI=\E[@:\
+ :kN=\E[U:kP=\E[V:kb=^H:kd=\E[B:kh=\E[H:kl=\E[D:\
+ :kr=\E[C:ku=\E[A:le=^H:ll=\E[24H:mb=\E[5m:md=\E[1m:\
+ :me=\E[m\017:mh=\E[2m:mr=\E[7m:nd=\E[C:nw=\EE:rc=\E8:\
+ :sc=\E7:se=\E[m:sf=^J:so=\E[7m:ta=^I:\
+ :ts=\E7\E[25;%i%p1%dx:ue=\E[m:up=\E[A:us=\E[4m:
+att605-pc|605bct-pc|ATT 605 in pc term mode:\
+ :@7=\E[F:AL=\E[L:S4=250\E[?11l\E[50;1|:\
+ :S5=400\E[50;0|:XF=g:XN=e:\
+ :ac=k\277l\332m\300j\331n\305w\302q\304u\264t\303v\301x\263:\
+ :al=\E[L:bt=\E[Z:dc=\E[P:dl=\E[M:do=\E[B:ei=:ic=\E[@:\
+ :im=:k1=\E[M:k2=\E[N:k3=\E[O:k4=\E[P:k5=\E[Q:k6=\E[R:\
+ :k7=\E[S:k8=\E[T:k9=\E[U:k;=\E[V:kB=\E[Z:kD=\E[P:\
+ :kI=\E[@:kL=\E[M:kN=\E[G:kP=\E[I:kd=\E[B:kh=\E[H:\
+ :kl=\E[D:kr=\E[C:ku=\E[A:le=\E[D:nd=\E[C:up=\E[A:tc=att605:
+att605-w|605bct-w|AT&T 605-w 132 column 102 key keyboard:\
+ :co#132:ws#132:\
+ :i1=\E[8;0|\E[?4;5;13;15l\E[13;20l\E[?3;7h\E[12h\E(B\E)0:tc=att605:
+att610|610bct|AT&T 610; 80 column; 98key keyboard:\
+ :am:es:hs:mi:ms:xn:xo:\
+ :co#80:it#8:li#24:ws#80:\
+ :AL=\E[%dL:DC=\E[%dP:DL=\E[%dM:DO=\E[%dB:IC=\E[%d@:\
+ :LE=\E[%dD:RI=\E[%dC:SF=\E[%dS:SR=\E[%dT:UP=\E[%dA:\
+ :ae=^O:al=\E[L:as=^N:bl=^G:bt=\E[Z:cd=\E[J:ce=\E[K:\
+ :cl=\E[H\E[J:cm=\E[%i%d;%dH:cr=^M:cs=\E[%i%d;%dr:\
+ :dc=\E[P:dl=\E[M:do=\E[B:ei=\E[4l:fs=\E8:ho=\E[H:\
+ :i1=\E[8;0|\E[?3;4;5;13;15l\E[13;20l\E[?7h\E[12h\E(B\E)0:\
+ :i2=\E(B\E)0:im=\E[4h:is=\E[m\017:k1=\EOc:k2=\EOd:\
+ :k3=\EOe:k4=\EOf:k5=\EOg:k6=\EOh:k7=\EOi:k8=\EOj:\
+ :k9=\ENo:kb=^H:kd=\E[B:kh=\E[H:kl=\E[D:kr=\E[C:\
+ :ku=\E[A:le=^H:ll=\E[24H:mb=\E[5m:md=\E[1m:\
+ :me=\E[m\017:mh=\E[2m:mr=\E[7m:nd=\E[C:nw=\EE:rc=\E8:\
+ :sc=\E7:se=\E[m:sf=\ED:so=\E[7m:sr=\EM:ta=^I:\
+ :ts=\E7\E[25;%i%p1%dx:ue=\E[m:up=\E[A:us=\E[4m:\
+ :vb=\E[?5h\E[?5l:ve=\E[?25h\E[?12l:vi=\E[?25l:\
+ :vs=\E[?12;25h:
+att610-w|610bct-w|AT&T 610; 132 column; 98key keyboard:\
+ :co#132:ws#132:\
+ :i1=\E[8;0|\E[?4;5;13;15l\E[13;20l\E[?3;7h\E[12h:tc=att610:
+
+att610-103k|610-103k|610bct-103k|AT&T 610; 80 column; 103key keyboard:\
+ :!1=\EOO:!2=\EOP:!3=\EOS:#1=\EOM:%0=\EOt:%1=\EOm:\
+ :%2=\ENi:%3=\EOl:%4=\ENc:%5=\ENh:%6=\EOv:%7=\EOr:\
+ :%8=\ENg:%9=\EOz:%a=\EOL:%b=\ENC:%c=\ENH:%d=\EOR:\
+ :%e=\ENG:%f=\EOZ:%g=\EOT:%h=\EOY:%j=\EOQ:&0=\EOW:\
+ :&1=\EOb:&2=\ENa:&3=\EOy:&4=\EOB:&5=\EOq:&6=\EOo:\
+ :&7=\EOp:&8=\EOs:&9=\ENB:*0=\EOX:*1=\EOU:*2=\END:\
+ :*3=\EON:*4=\ENF:*5=\ENE:*6=\ENI:*7=\ENN:*8=\EOA:\
+ :*9=\EOK:@0=\EOx:@1=\E9:@2=\EOw:@3=\EOV:@4=\EOu:\
+ :@5=\ENd:@6=\EOn:@7=\E0:@8=^M:@9=\EOk:F1@:F2@:F3@:\
+ :F4@:k9@:k;@:kD=\ENf:kE=\EOa:kI=\ENj:kL=\ENe:kM=\ENj:\
+ :kN=\E[U:kP=\E[V:tc=att610:
+att610-103k-w|610-103k-w|610bct-103k-w|AT&T 610; 132 column; 103key keyboard:\
+ :co#132:ws#132:\
+ :i1=\E[8;0|\E[?4;5;13;15l\E[13;20l\E[?3;7h\E[12h:tc=att610-103k:
+att615|615mt|AT&T 615; 80 column; 98key keyboard:\
+ :#4=\E[ A:%i=\E[ @:F5=\EOC:F6=\EOD:F7=\EOE:F8=\EOF:\
+ :F9=\EOG:FA=\EOH:FB=\EOI:FC=\EOJ:FD=\ENO:FE=\ENP:\
+ :FF=\ENQ:FG=\ENR:FH=\ENS:FI=\ENT:FJ=\EOP:FK=\EOQ:\
+ :FL=\EOR:FM=\EOS:FN=\EOw:FO=\EOx:FP=\EOy:FQ=\EOm:\
+ :FR=\EOt:FS=\EOu:FT=\EOv:FU=\EOl:FV=\EOq:FW=\EOr:\
+ :FX=\EOs:FY=\EOp:FZ=\EOn:Fa=\EOM:tc=att610:
+att615-w|615-w|615mt-w|AT&T 615; 132 column; 98key keyboard:\
+ :#4=\E[ A:%i=\E[ @:F5=\EOC:F6=\EOD:F7=\EOE:F8=\EOF:\
+ :F9=\EOG:FA=\EOH:FB=\EOI:FC=\EOJ:FD=\ENO:FE=\ENP:\
+ :FF=\ENQ:FG=\ENR:FH=\ENS:FI=\ENT:FJ=\EOP:FK=\EOQ:\
+ :FL=\EOR:FM=\EOS:FN=\EOw:FO=\EOx:FP=\EOy:FQ=\EOm:\
+ :FR=\EOt:FS=\EOu:FT=\EOv:FU=\EOl:FV=\EOq:FW=\EOr:\
+ :FX=\EOs:FY=\EOp:FZ=\EOn:Fa=\EOM:tc=att610-w:
+att615-103k|615-103k|615mt-103k|AT&T 615; 80 column; 103key keyboard:\
+ :#4=\E[ A:%i=\E[ @:tc=att610-103k:
+att615-103k-w|615-103k-w|615mt-103k-w|AT&T 615; 132 column; 103key keyboard:\
+ :#4=\E[ A:%i=\E[ @:tc=att610-103k-w:
+att620|620mtg|AT&T 620; 80 column; 98key keyboard:\
+ :am:es:hs:mi:ms:xn:xo:\
+ :co#80:it#8:li#24:ws#80:\
+ :AL=\E[%dL:DC=\E[%dP:DL=\E[%dM:DO=\E[%dB:IC=\E[%d@:\
+ :LE=\E[%dD:RI=\E[%dC:SF=\E[%dS:SR=\E[%dT:UP=\E[%dA:\
+ :ae=\E(B\017:al=\E[L:as=\E)0\016:bl=^G:bt=\E[Z:\
+ :cd=\E[J:ce=\E[K:cl=\E[H\E[J:cm=\E[%i%d;%dH:cr=^M:\
+ :cs=\E[%i%d;%dr:dc=\E[P:dl=\E[M:do=\E[B:ei=\E[4l:\
+ :fs=\E8:ho=\E[H:\
+ :i1=\E[8;0|\E[?3;4;5;13;15l\E[13;20l\E[?7h\E[12h:\
+ :i2=\E(B\E)0:im=\E[4h:is=\E[m\017:k1=\EOc:k2=\EOd:\
+ :k3=\EOe:k4=\EOf:k5=\EOg:k6=\EOh:k7=\EOi:k8=\EOj:\
+ :k9=\ENo:kb=^H:kd=\E[B:kh=\E[H:kl=\E[D:kr=\E[C:\
+ :ku=\E[A:le=^H:ll=\E[24H:mb=\E[5m:md=\E[1m:\
+ :me=\E[m\E(B\017:mh=\E[2m:mr=\E[7m:nd=\E[C:nw=\EE:\
+ :rc=\E8:sc=\E7:se=\E[m:sf=\ED:so=\E[7m:sr=\EM:ta=^I:\
+ :ts=\E7\E[25;%i%p1%dx:ue=\E[m:up=\E[A:us=\E[4m:\
+ :vb=\E[?5h\E[?5l:ve=\E[?25h\E[?12l:vi=\E[?25l:\
+ :vs=\E[?12;25h:
+att620-w|620-w|620mtg-w|AT&T 620; 132 column; 98key keyboard:\
+ :co#132:ws#132:\
+ :i1=\E[8;0|\E[?4;5;13;15l\E[13;20l\E[?3;7h\E[12h:tc=att620:
+att620-103k|620-103k|620mtg-103k|AT&T 620; 80 column; 103key keyboard:\
+ :!1=\EOO:!2=\EOP:!3=\EOS:#1=\EOM:%0=\EOt:%1=\EOm:\
+ :%2=\ENi:%3=\EOl:%4=\ENc:%5=\ENh:%6=\EOv:%7=\EOr:\
+ :%8=\ENg:%9=\EOz:%a=\EOL:%b=\ENC:%c=\ENH:%d=\EOR:\
+ :%e=\ENG:%f=\EOZ:%g=\EOT:%h=\EOY:%j=\EOQ:&0=\EOW:\
+ :&1=\EOb:&2=\ENa:&3=\EOy:&4=\EOB:&5=\EOq:&6=\EOo:\
+ :&7=\EOp:&8=\EOs:&9=\ENB:*0=\EOX:*1=\EOU:*2=\END:\
+ :*3=\EON:*4=\ENF:*5=\ENE:*6=\ENI:*7=\ENN:*8=\EOA:\
+ :*9=\EOK:@0=\EOx:@1=\E9:@2=\EOw:@3=\EOV:@4=\EOu:\
+ :@5=\ENd:@6=\EOn:@7=\E0:@8=^M:@9=\EOk:F1@:F2@:F3@:\
+ :F4@:F5@:F6@:F7@:F8@:F9@:FA@:FB@:FC@:FD@:FE@:FF@:FG@:\
+ :FH@:FI@:FJ@:FK@:FL@:FM@:FN@:FO@:FP@:FQ@:FR@:FS@:FT@:\
+ :FU@:FV@:FW@:FX@:FY@:FZ@:Fa@:k9@:k;@:kD=\ENf:kE=\EOa:\
+ :kI=\ENj:kL=\ENe:kM=\ENj:kN=\E[U:kP=\E[V:tc=att620:
+
+att620-103k-w|620-103k-w|620mtg-103k-w|AT&T 620; 132 column; 103key keyboard:\
+ :co#132:ws#132:\
+ :i1=\E[8;0|\E[?4;5;13;15l\E[13;20l\E[?3;7h\E[12h:tc=att620-103k:
+
+att630|5630|5630DMD|630MTG|AT&T 630 windowing terminal:\
+ :NP:am:da:db:mi:ms:xo:\
+ :co#80:it#8:li#60:lm#0:\
+ :@8=^M:AL=\E[%dL:DC=\E[%dP:DL=\E[%dM:DO=\E[%dB:\
+ :F1=\ENq:F2=\ENr:F3=\ENs:F4=\ENt:F5=\ENu:F6=\ENv:\
+ :F7=\ENw:F8=\ENx:F9=\ENy:FA=\ENz:FB=\EN{:FC=\EN|:\
+ :FD=\EN}:FE=\EN~:IC=\E[%d@:LE=\E[%dD:RI=\E[%dC:\
+ :SF=\E[%dS:SR=\E[%dT:UP=\E[%dA:al=\E[L:bl=^G:bt=\E[Z:\
+ :cb=\E[1K:cd=\E[J:ce=\E[K:cl=\E[H\E[J:cm=\E[%i%d;%dH:\
+ :cr=^M:dc=\E[P:dl=\E[M:do=\E[B:ei=\E[4l:ho=\E[H:\
+ :ic=\E[@:im=\E[4h:is=\E[m:k9=\ENo:k;=\ENp:kA=\E[L:\
+ :kB=\E[Z:kC=\E[2J:kD=\E[P:kI=\E[@:kL=\E[M:kb=^H:\
+ :kd=\E[B:kh=\E[H:kl=\E[D:kr=\E[C:ku=\E[A:le=^H:\
+ :mb=\E[5m:me=\E[m:mh=\E[2m:mr=\E[7m:nd=\E[C:nw=^M^J:\
+ :pf=\E[?4i:po=\E[?5i:..px=\E[%p1%d;%p2%l%dq%p2%s:\
+ :r2=\Ec:rc=\E8:\
+ :..sa=\E[0%?%p2%t;4%;%?%p1%p3%|%p4%|%p5%|%t;7%;m:\
+ :sc=\E7:se=\E[m:sf=\ED:so=\E[7m:sr=\EM:ta=^I:ue=\E[m:\
+ :up=\E[A:us=\E[4m:
+att630-24|5630-24|5630DMD-24|630MTG-24|AT&T 630 windowing terminal 24 lines:\
+ :li#24:tc=att630:
+
+att730|730MTG|AT&T 730 windowing terminal:\
+ :am:da:db:es:hs:mi:ms:xn:xo:\
+ :co#80:it#8:li#60:lm#0:ws#80:\
+ :AL=\E[%dL:DC=\E[%dP:DL=\E[%dM:DO=\E[%dB:IC=\E[%d@:\
+ :LE=\E[%dD:RI=\E[%dC:UP=\E[%dA:ae=^O:al=\E[L:as=^N:\
+ :bl=^G:bt=\E[Z:cd=\E[J:ce=\E[K:cl=\E[H\E[J:\
+ :cm=\E[%i%d;%dH:cr=^M:cs=\E[%i%d;%dr:dc=\E[P:dl=\E[M:\
+ :do=\E[B:ei=\E[4l:fs=\E8:ho=\E[H:\
+ :i1=\E[8;0|\E[?3;4;5;13;15l\E[13;20l\E[?7h\E[12h\E(B\E)B:\
+ :i2=\E(B\E)0:im=\E[4h:is=\E[m\017:k1=\EOc:k2=\EOd:\
+ :k3=\EOe:k4=\EOf:k5=\EOg:k6=\EOh:k7=\EOi:k8=\EOj:\
+ :k9=\ENo:kI=\E[@:kb=^H:kd=\E[B:kh=\E[H:kl=\E[D:\
+ :kr=\E[C:ku=\E[A:le=^H:mb=\E[5m:md=\E[1m:me=\E[m\017:\
+ :mh=\E[2m:mr=\E[7m:nd=\E[C:nw=\EE:rc=\E8:sc=\E7:\
+ :se=\E[27m:sf=\ED:so=\E[7m:sr=\EM:ta=^I:\
+ :ts=\E7\E[;%i%p1%dx:ue=\E[24m:up=\E[A:us=\E[4m:\
+ :vb=\E[?5h\E[?5l:ve=\E[?25h\E[?12l:vi=\E[?25l:\
+ :vs=\E[?12;25h:
+att730-41|730MTG-41|AT&T 730-41 windowing terminal Version:\
+ :li#41:tc=att730:
+att730-24|730MTG-24|AT&T 730-24 windowing terminal Version:\
+ :li#24:tc=att730:
+att730r|730MTGr|AT&T 730 rev video windowing terminal Version:\
+ :i1=\E[8;0|\E[?3;4;13;15l\E[?5h\E[13;20l\E[?7h\E[12h\E(B\E)B:\
+ :vb=\E[?5l\E[?5h:tc=att730:
+att730r-41|730MTG-41r|AT&T 730r-41 rev video windowing terminal Version:\
+ :li#41:tc=att730r:
+att730r-24|730MTGr-24|AT&T 730r-24 rev video windowing terminal Version:\
+ :li#24:tc=att730r:
+
+
+att505|pt505|att5430|gs5430|AT&T Personal Terminal 505 or 5430 GETSET terminal:\
+ :am:xo:\
+ :co#80:it#8:li#24:\
+ :&2=\E[27s:@4=\E!:AL=\E[%dL:DC=\E[%dP:DL=\E[%dM:\
+ :DO=\E[%dB:F8=\E[18s:F9=\E[19s:FA=\E[20s:FB=\E[21s:\
+ :FC=\E[22s:FD=\E[23s:FE=\E24s:FG=\E26s:LE=\E[%dD:\
+ :RA=\E[11;1j:RI=\E[%dC:SA=\E[11;0j:UP=\E[%dA:\
+ :ae=\E[10m:al=\E[L:as=\E[11m:bl=^G:cb=\E2K:cd=\E[0J:\
+ :ce=\E[0K:cl=\E[2J\E[H:cm=\E[%d;%dH:cr=^M:dc=\E[P:\
+ :dl=\E[M:do=\E[B:ei=\E[4l:ho=\E[H:\
+ :i1=\EPr\\E[0u\E[2J\E[0;0H\E[m\E[3l\E[<l\E[4l\E[>l\E[=l\E[?l:\
+ :im=\E[4h:k0=\E[00s:k1=\E[01s:k2=\E[02s:k3=\E[03s:\
+ :k4=\E[04s:k5=\E[05s:k6=\E[06s:kb=^H:kd=\E[B:kl=\E[D:\
+ :kr=\E[C:ku=\E[A:le=\E[D:mb=\E[5m:md=\E[1m:me=\E[m:\
+ :mr=\E[7m:nd=\E[C:pf=\E[4i:po=\E[5i:r1=\Ec:rc=\E8:\
+ :sc=\E7:se=\E[m:sf=^J:so=\E[1m:ta=^I:ue=\E[m:up=\E[A:\
+ :us=\E[4m:ve=\E[>l:vs=\E[>h:
+
+att505-24|pt505-24|gs5430-24|AT&T PT505 or 5430 GETSET version 1 24 lines:\
+ :li#24:\
+ :RA@:SA@:pf@:po@:rc@:sc@:tc=att505:
+tt505-22|pt505-22|gs5430-22|AT&T PT505 or 5430 GETSET version 1 22 lines:\
+ :li#22:tc=att505:
+
+
+ampex80|a80|d80|dialogue|dialogue80|ampex dialogue 80:\
+ :am:bw:ul:\
+ :co#80:it#8:li#24:\
+ :al=\EE:bl=^G:bt=\EI:cd=\Ey:ce=\Et:cl=\E*:\
+ :cm=\E=%+ %+ :cr=^M:ct=\E3:dc=\EW:dl=\ER:do=^J:ei=:\
+ :ic=\EQ:im=:is=\EA:le=^H:nd=^L:se=\Ek:sf=^J:so=\Ej:\
+ :st=\E1:ta=^I:ue=\Em:up=^K:us=\El:
+ampex175|ampex d175:\
+ :am:\
+ :co#80:li#24:\
+ :al=\EE:bl=^G:cd=\Ey:ce=\Et:cl=\E+:cm=\E=%+ %+ :\
+ :cr=^M:dc=\EW:dl=\ER:do=^J:ei=:ho=^^:ic=\EQ:im=:\
+ :is=\EX\EA\EF:kA=\EE:kD=\EW:kI=\EQ:kL=\ER:kd=^J:\
+ :kh=^^:kl=^H:kr=^L:ku=^K:le=^H:ll=^^^K:nd=^L:se=\Ek:\
+ :sf=^J:so=\Ej:te=\EF:ti=\EN:ue=\Em:up=^K:us=\El:
+ampex175-b|ampex d175 using left arrow for erase:\
+ :kb=^_:tc=ampex175:
+ampex210|a210|ampex a210:\
+ :am:hs:xn:\
+ :co#80:it#8:li#24:sg#1:ug#1:\
+ :al=\EE:bt=\EI:cd=\Ey:ce=\Et:cl=\E*:cm=\E=%+ %+ :\
+ :dc=\EW:dl=\ER:ei=:fs=\E.2:ho=^^:ic=\EQ:\
+ :if=/usr/share/tabset/std:im=:\
+ :is=\EC\Eu\E'\E(\El\EA\E%\E{\E.2\EG0\Ed\En:k0=^A0\r:\
+ :k1=^A1\r:k2=^A2\r:k3=^A3\r:k4=^A4\r:k5=^A5\r:\
+ :k6=^A6\r:k7=^A7\r:k8=^A8\r:k9=^A9\r:kd=^V:kh=^^:\
+ :kl=^H:kr=^L:ku=^K:le=^H:nd=^L:se=\EG0:so=\EG4:ta=^I:\
+ :ts=\E.0\Eg\E}\Ef:ue=\EG0:up=^K:us=\EG8:\
+ :vb=\EU\EX\EU\EX\EU\EX\EU\EX:
+ampex219|ampex-219|amp219|Ampex with Automargins:\
+ :hs:xn:\
+ :co#80:it#8:li#24:\
+ :RA=\E[?7l:SA=\E[?7h:bl=^G:bt=\E[Z:cd=\E[J:ce=\E[K:\
+ :cl=\E[H\E[2J:cm=\E[%i%d;%dH:cr=^M:cs=%i\E[%2;%2r:\
+ :do=\E[B:ho=\E[H:\
+ :is=\E>\E[?1l\E[?3l\E[?4l\E[?5l\E[?7h\E[?8h:\
+ :k0=\E[21~:k1=\E[7~:k2=\E[8~:k3=\E[9~:k4=\E[10~:\
+ :k5=\E[11~:k6=\E[17~:k7=\E[18~:k8=\E[19~:k9=\E[20~:\
+ :kd=\E[B:ke=\E>:kh=\E[H:kl=\E[D:kr=\E[C:ks=\E=:\
+ :ku=\E[A:le=^H:mb=\E[5m:md=\E[1m:me=\E[m:mh=\E[1m:\
+ :mr=\E[7m:nd=\E[C:se=\E[m:sf=^J:so=\E[7m:sr=\EM:\
+ :ta=^I:ue=\E[m:up=\E[A:us=\E[4m:
+ampex219w|ampex-219w|amp219w|Ampex 132 cols:\
+ :co#132:li#24:\
+ :bl=^G:cr=^M:do=^J:\
+ :is=\E>\E[?3h\E[?4l\E[?5l\E[?7h\E[?8h:sf=^J:\
+ :vs=\E[?3h:tc=ampex219:
+ampex232|ampex-232|Ampex Model 232:\
+ :am:\
+ :co#80:li#24:sg#1:ug#1:\
+ :al=5*\EE:bt=\EI:cd=\EY:ce=\ET:cl=\E+:cm=\E=%+ %+ :\
+ :dc=\EW:dl=5*\ER:do=^V:ei=:ic=\EQ:\
+ :if=/usr/lib/tabset/ampex:im=:is=\Eg\El:k0=^A@\r:\
+ :k1=^AA\r:k2=^AB\r:k3=^AC\r:k4=^AD\r:k5=^AE\r:\
+ :k6=^AF\r:k7=^AG\r:k8=^AH\r:k9=^AI\r:kb=^H:kd=^V:\
+ :kh=^^:kl=^H:kr=^L:ku=^K:le=^H:nd=^L:se=\EG0:so=\EG4:\
+ :ta=^I:ue=\EG0:up=^K:us=\EG8:vb=\Eb\Ed:ve=\E.4:\
+ :vi=\E.0:
+ampex232w|Ampex Model 232 / 132 columns:\
+ :co#132:li#24:\
+ :if=/usr/lib/tabset/amp-132:is=\E\034Eg\El:tc=ampex232:
+
+
+
+annarbor4080|aa4080|ann arbor 4080:\
+ :am:\
+ :co#80:li#40:\
+ :bl=^G:cl=\014:\
+ :..cm=\017%p2%{10}%/%{16}%*%p2%{10}%m%+%c%p1%?%p1%{19}%>%t%{12}%+%;%'@'%+%c:\
+ :cr=^M:ct=^^P^P:do=^J:ho=^K:kb=^^:kd=^J:kh=^K:kl=^H:\
+ :kr=^_:ku=^N:le=^H:nd=^_:sf=^J:st=^]^P1:ta=^I:up=^N:
+
+aaa+unk|aaa-unk|ann arbor ambassador (internal - don't use this directly):\
+ :am:km:mi:xo:\
+ :co#80:it#8:\
+ :AL=\E[%dL:DC=\E[%dP:DL=\E[%dM:DO=\E[%dB:IC=\E[%d@:\
+ :LE=\E[%dD:RI=\E[%dC:UP=\E[%dA:al=\E[L:bl=^G:bt=\E[Z:\
+ :cd=\E[J:ce=\E[K:cl=\E[H\E[J:cm=\E[%i%d;%dH:cr=^M:\
+ :ct=\E[2g:dc=\E[P:dl=\E[M:do=^K:ei=:ho=\E[H:\
+ :i1=\E[m\E7\E[H\E9\E8:i2=\E[1Q\E[>20;30l\EP`+x~M\E\\:\
+ :ic=\E[@:im=:k1=\EOA:k2=\EOB:k3=\EOC:k4=\EOD:k5=\EOE:\
+ :k6=\EOF:k7=\EOG:k8=\EOH:k9=\EOI:kD=\E[P:kI=\E[@:\
+ :kb=^H:kd=\E[B:\
+ :ke=\EP`>y~[[J`8xy~[[A`4xy~[[D`6xy~[[C`2xy~[[B\E\\:\
+ :kh=\E[H:kl=\E[D:kr=\E[C:\
+ :ks=\EP`>z~[[J`8xz~[[A`4xz~[[D`6xz~[[C`2xz~[[B\E\\:\
+ :ku=\E[A:le=^H:mb=\E[5m:md=\E[1m:me=\E[m:mm=\E[>52h:\
+ :mo=\E[>52l:mr=\E[7m:nd=\E[C:rc=\E8:sc=\E7:se=\E[m:\
+ :sf=^K:so=\E[7m:st=\EH:ta=^I:ue=\E[m:up=\E[A:\
+ :us=\E[4m:
+
+aaa+rv|ann arbor ambassador in reverse video:\
+ :i1=\E[7m\E7\E[H\E9\E8:mb=\E[5;7m:md=\E[1;7m:\
+ :me=\E[7m\016:mk=\E[7;8m:mr=\E[m:r1=\E[H\E[7m\E[J:\
+ :..sa=\E[%?%p1%p3%|%!%t7;%;%?%p2%t4;%;%?%p4%t5;%;%?%p6%t1;%;%?%p7%t8;%;m:\
+ :se=\E[7m:so=\E[m:ue=\E[7m:us=\E[4;7m:
+aaa+dec|ann arbor ambassador in dec vt100 mode:\
+ :ac=aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}:\
+ :ae=^N:as=^O:cs=\E[%i%d;%dr:eA=\E(0:\
+ :..sa=\E[%?%p1%p3%|%!%t7;%;%?%p2%t4;%;%?%p4%t5;%;%?%p6%t1;%;%?%p7%t8;%;m%?%p9%t\017%e\016%;:
+aaa-18|ann arbor ambassador/18 lines:\
+ :li#18:\
+ :is=\E7\E[60;0;0;18p\E8:te=\E[60;0;0;18p\E[60;1H\E[K:\
+ :ti=\E[18;0;0;18p:tc=aaa+unk:
+aaa-18-rv|ann arbor ambassador/18 lines+reverse video:\
+ :tc=aaa+rv:tc=aaa-18:
+aaa-20|ann arbor ambassador/20 lines:\
+ :li#20:\
+ :is=\E7\E[60;0;0;20p\E8:te=\E[60;0;0;20p\E[60;1H\E[K:\
+ :ti=\E[20;0;0;20p:tc=aaa+unk:
+aaa-22|ann arbor ambassador/22 lines:\
+ :li#22:\
+ :is=\E7\E[60;0;0;22p\E8:te=\E[60;0;0;22p\E[60;1H\E[K:\
+ :ti=\E[22;0;0;22p:tc=aaa+unk:
+aaa-24|ann arbor ambassador/24 lines:\
+ :li#24:\
+ :is=\E7\E[60;0;0;24p\E8:te=\E[60;0;0;24p\E[60;1H\E[K:\
+ :ti=\E[24;0;0;24p:tc=aaa+unk:
+aaa-24-rv|ann arbor ambassador/24 lines+reverse video:\
+ :tc=aaa+rv:tc=aaa-24:
+aaa-26|ann arbor ambassador/26 lines:\
+ :li#26:\
+ :is=\E7\E[60;0;0;26p\E8:te=\E[60;0;0;26p\E[26;1H\E[K:\
+ :ti=\E[H\E[J\E[26;0;0;26p:tc=aaa+unk:
+aaa-28|ann arbor ambassador/28 lines:\
+ :li#28:\
+ :is=\E7\E[60;0;0;28p\E8:te=\E[60;0;0;28p\E[28;1H\E[K:\
+ :ti=\E[H\E[J\E[28;0;0;28p:tc=aaa+unk:
+aaa-30-s|aaa-s|ann arbor ambassador/30 lines w/status:\
+ :es:hs:\
+ :li#29:\
+ :ds=\E7\E[60;0;0;30p\E[1;1H\E[K\E[H\E8\r\n\E[K:\
+ :fs=\E[>51l:is=\r\n\E[A\E7\E[60;1;0;30p\E8:\
+ :te=\E[60;1;0;30p\E[29;1H\E[K:\
+ :ti=\E[H\E[J\E[30;1;0;30p\E[30;1H\E[K:\
+ :ts=\E[>51h\E[1;%p1%dH\E[2K:tc=aaa+unk:
+aaa-30-s-rv|aaa-s-rv|ann arbor ambassador/30 lines+status+reverse video:\
+ :tc=aaa+rv:tc=aaa-30-s:
+aaa-s-ctxt|aaa-30-s-ctxt|ann arbor ambassador/30 lines+status+save context:\
+ :te=\E[60;1;0;30p\E[59;1H\E[K:\
+ :ti=\E[30;1H\E[K\E[30;1;0;30p:tc=aaa-30-s:
+aaa-s-rv-ctxt|aaa-30-s-rv-ct|ann arbor ambassador/30 lines+status+save context:\
+ :te=\E[60;1;0;30p\E[59;1H\E[K:\
+ :ti=\E[30;1H\E[K\E[30;1;0;30p:tc=aaa-30-s-rv:
+aaa|aaa-30|ambas|ambassador|ann arbor ambassador/30 lines:\
+ :li#30:\
+ :is=\E7\E[60;0;0;30p\E8:te=\E[60;0;0;30p\E[30;1H\E[K:\
+ :ti=\E[H\E[J\E[30;0;0;30p:tc=aaa+unk:
+aaa-30-rv|aaa-rv|ann arbor ambassador/30 lines in reverse video:\
+ :tc=aaa+rv:tc=aaa-30:
+aaa-30-ctxt|aaa-ctxt|ann arbor ambassador/30 lines; saving context:\
+ :te=\E[60;0;0;30p\E[60;1H\E[K:ti=\E[30;0;0;30p:tc=aaa-30:
+aaa-30-rv-ctxt|aaa-rv-ctxt|ann arbor ambassador/30 lines reverse video; saving context:\
+ :te=\E[60;0;0;30p\E[60;1H\E[K:ti=\E[30;0;0;30p:tc=aaa+rv:tc=aaa-30:
+aaa-36|ann arbor ambassador/36 lines:\
+ :li#36:\
+ :is=\E7\E[60;0;0;36p\E8:te=\E[60;0;0;36p\E[36;1H\E[K:\
+ :ti=\E[H\E[J\E[36;0;0;36p:tc=aaa+unk:
+aaa-36-rv|ann arbor ambassador/36 lines+reverse video:\
+ :tc=aaa+rv:tc=aaa-36:
+aaa-40|ann arbor ambassador/40 lines:\
+ :li#40:\
+ :is=\E7\E[60;0;0;40p\E8:te=\E[60;0;0;40p\E[40;1H\E[K:\
+ :ti=\E[H\E[J\E[40;0;0;40p:tc=aaa+unk:
+aaa-40-rv|ann arbor ambassador/40 lines+reverse video:\
+ :tc=aaa+rv:tc=aaa-40:
+aaa-48|ann arbor ambassador/48 lines:\
+ :li#48:\
+ :is=\E7\E[60;0;0;48p\E8:te=\E[60;0;0;48p\E[48;1H\E[K:\
+ :ti=\E[H\E[J\E[48;0;0;48p:tc=aaa+unk:
+aaa-48-rv|ann arbor ambassador/48 lines+reverse video:\
+ :tc=aaa+rv:tc=aaa-48:
+aaa-60-s|ann arbor ambassador/59 lines+status:\
+ :es:hs:\
+ :li#59:\
+ :ds=\E7\E[60;0;0;60p\E[1;1H\E[K\E[H\E8\r\n\E[K:\
+ :fs=\E[>51l:is=\r\n\E[A\E7\E[60;1;0;60p\E8:\
+ :ts=\E[>51h\E[1;%p1%dH\E[2K:tc=aaa+unk:
+aaa-60-s-rv|ann arbor ambassador/59 lines+status+reverse video:\
+ :tc=aaa+rv:tc=aaa-60-s:
+aaa-60-dec-rv|ann arbor ambassador/dec mode+59 lines+status+rev video:\
+ :tc=aaa+dec:tc=aaa+rv:tc=aaa-60-s:
+aaa-60|ann arbor ambassador/60 lines:\
+ :li#60:\
+ :is=\E7\E[60;0;0;60p\E[1Q\E[m\E[>20;30l\E8:tc=aaa+unk:
+aaa-60-rv|ann arbor ambassador/60 lines+reverse video:\
+ :tc=aaa+rv:tc=aaa-60:
+aaa-db|ann arbor ambassador 30/destructive backspace:\
+ :i2=\E[1Q\E[m\E[>20l\E[>30h:le=\E[D:tc=aaa-30:
+
+guru|guru-33|guru+unk|ann arbor guru/33 lines 80 cols:\
+ :li#33:\
+ :i2=\E[>59l:is=\E7\E[255;0;0;33;80;80p\E8\E[J:\
+ :te=\E[255p\E[255;1H\E[K:ti=\E[33p:vb=\E[>59h\E[>59l:tc=aaa+unk:
+guru+rv|guru changes for reverse video:\
+ :i2=\E[>59h:vb=\E[>59l\E[>59h:
+guru-rv|guru-33-rv|ann arbor guru/33 lines+reverse video:\
+ :tc=guru+rv:tc=guru-33:
+guru+s|guru status line:\
+ :es:hs:\
+ :ds=\E7\E[;0p\E[1;1H\E[K\E[H\E8\r\n\E[K:fs=\E[>51l:\
+ :te=\E[255;1p\E[255;1H\E[K:\
+ :ts=\E[>51h\E[1;%p1%dH\E[2K:
+guru-nctxt|guru with no saved context:\
+ :ti=\E[H\E[J\E[33p\E[255;1H\E[K:tc=guru:
+guru-s|guru-33-s|ann arbor guru/33 lines+status:\
+ :li#32:\
+ :is=\r\n\E[A\E7\E[255;1;0;33;80;80p\E8\E[J:\
+ :ti=\E[33;1p\E[255;1H\E[K:tc=guru+s:tc=guru+unk:
+guru-24|ann arbor guru 24 lines:\
+ :co#80:li#24:\
+ :is=\E7\E[255;0;0;24;80;80p\E8\E[J:ti=\E[24p:tc=guru+unk:
+guru-44|ann arbor guru 44 lines:\
+ :co#97:li#44:\
+ :is=\E7\E[255;0;0;44;97;100p\E8\E[J:ti=\E[44p:tc=guru+unk:
+guru-44-s|ann arbor guru/44 lines+status:\
+ :li#43:\
+ :is=\r\n\E[A\E7\E[255;1;0;44;80;80p\E8\E[J:\
+ :ti=\E[44;1p\E[255;1H\E[K:tc=guru+s:tc=guru+unk:
+guru-76|guru with 76 lines by 89 cols:\
+ :co#89:li#76:\
+ :is=\E7\E[255;0;0;76;89;100p\E8\E[J:ti=\E[76p:tc=guru+unk:
+guru-76-s|ann arbor guru/76 lines+status:\
+ :co#89:li#75:\
+ :is=\r\n\E[A\E7\E[255;1;0;76;89;100p\E8\E[J:\
+ :ti=\E[76;1p\E[255;1H\E[K:tc=guru+s:tc=guru+unk:
+guru-76-lp|guru-lp|guru with page bigger than line printer:\
+ :co#134:li#76:\
+ :is=\E7\E[255;0;0;76;134;134p\E8\E[J:ti=\E[76p:tc=guru+unk:
+guru-76-w|guru 76 lines by 178 cols:\
+ :co#178:li#76:\
+ :is=\E7\E[255;0;0;76;178;178p\E8\E[J:ti=\E[76p:tc=guru+unk:
+guru-76-w-s|ann arbor guru/76 lines+status+wide:\
+ :co#178:li#75:\
+ :is=\r\n\E[A\E7\E[255;1;0;76;178;178p\E8\E[J:\
+ :ti=\E[76;1p\E[255;1H\E[K:tc=guru+s:tc=guru+unk:
+guru-76-wm|guru 76 lines by 178 cols with 255 cols memory:\
+ :co#178:li#76:\
+ :is=\E7\E[255;0;0;76;178;255p\E8\E[J:ti=\E[76p:tc=guru+unk:
+aaa-rv-unk|ann arbor unknown type:\
+ :Nl#0:lh#0:lw#0:\
+ :ho=\E[H:i1=\E[7m\E7\E[H\E9\E8:mb=\E[5;7m:md=\E[1;7m:\
+ :me=\E[7m:mk=\E[7;8m:mr=\E[m:r1=\E[H\E[7m\E[J:\
+ :..sa=\E[%?%p1%!%t7;%;%?%p2%t4;%;%?%p3%t7;%;%?%p4%t5;%;%?%p6%t1;%;%?%p7%t8;%;m:\
+ :se=\E[7m:so=\E[m:ue=\E[7m:us=\E[4;7m:
+
+
+regent|Adds Regent Series:\
+ :am:bs:\
+ :co#80:li#24:\
+ :bl=^G:cl=^L:cr=^M:do=^J:ho=\EY :le=^U:ll=^A:nd=^F:\
+ :sf=^J:up=^Z:
+regent100|Adds Regent 100:\
+ :sg#1:ug#1:\
+ :bl=^G:cm=\013%+ %B\020%.:k0=^B1\r:k1=^B2\r:k2=^B3\r:\
+ :k3=^B4\r:k4=^B5\r:k5=^B6\r:k6=^B7\r:k7=^B8\r:l0=F1:\
+ :l1=F2:l2=F3:l3=F4:l4=F5:l5=F6:l6=F7:l7=F8:se=\E0@:\
+ :so=\E0P:ue=\E0@:us=\E0`:tc=regent:
+regent20|Adds Regent 20:\
+ :bl=^G:cd=\Ek:ce=\EK:cm=\EY%+ %+ :tc=regent:
+regent25|Adds Regent 25:\
+ :bl=^G:kd=^J:kh=^A:kl=^U:kr=^F:ku=^Z:tc=regent20:
+regent40|Adds Regent 40:\
+ :sg#1:ug#1:\
+ :al=\EM:bl=^G:dl=\El:k0=^B1\r:k1=^B2\r:k2=^B3\r:\
+ :k3=^B4\r:k4=^B5\r:k5=^B6\r:k6=^B7\r:k7=^B8\r:l0=F1:\
+ :l1=F2:l2=F3:l3=F4:l4=F5:l5=F6:l6=F7:l7=F8:se=\E0@:\
+ :so=\E0P:ue=\E0@:us=\E0`:tc=regent25:
+regent40+|Adds Regent 40+:\
+ :is=\EB:tc=regent40:
+regent60|regent200|Adds Regent 60:\
+ :dc=\EE:ei=\EF:im=\EF:is=\EV\EB:kD=\EE:kI=\EF:kM=\EF:\
+ :se=\ER\E0@\EV:so=\ER\E0P\EV:tc=regent40+:
+viewpoint|addsviewpoint|adds viewpoint:\
+ :am:\
+ :co#80:li#24:\
+ :bl=^G:cd=\Ek:ce=\EK:cl=^L:cm=\EY%+ %+ :cr=^M:dl=\El:\
+ :do=^J:is=\017\E0`:k0=^B1:k2=^B2:k3=^B!:k4=^B":\
+ :k5=^B#:kd=^J:kh=^A:kl=^U:kr=^F:ku=^Z:le=^H:ll=^A:\
+ :nd=^F:se=^O:sf=^J:so=^N:ue=^O:up=^Z:us=^N:\
+ :ve=\017\E0`:vs=\017\E0P:
+screwpoint|adds viewpoint with ^O bug:\
+ :se@:so@:ue@:us@:vs@:tc=viewpoint:
+
+vp3a+|viewpoint3a+|adds viewpoint 3a+:\
+ :am:bw:\
+ :co#80:it#8:li#24:\
+ :cd=\EY:ce=\ET:cl=\E*:cm=\E=%+ %+ :cr=^M:do=^J:ho=^^:\
+ :kb=^H:kd=^J:kh=^^:kl=^H:kr=^L:ku=^K:le=^H:me=\E(:\
+ :nd=^L:nw=^M^J:\
+ :..sa=\E0%'@'%?%p1%tQ%|%;%?%p2%t%'`'%|%;%?%p3%tP%|%;%?%p4%t%{2}%|%;%?%p5%t%{1}%|%;%?%p7%tD%|%;%c\E):\
+ :se=\E(:sf=^J:so=\E0Q\E):ta=^I:up=^K:ve=^X:vi=^W:
+vp60|viewpoint60|addsvp60|adds viewpoint60:\
+ :tc=regent40:
+vp90|viewpoint90|adds viewpoint 90:\
+ :bw:ms:xs:\
+ :co#80:li#24:\
+ :cd=\Ek:ce=\EK:cl=\EG\Ek:cm=\EY%+ %+ :dc=\EE:dl=\El:\
+ :do=^J:ei=:ho=\EY :ic=\EF \EF\025:im=:k0=^B1\r:\
+ :k1=^B2\r:k2=^B3\r:k3=^B4\r:k4=^B5\r:k5=^B6\r:\
+ :k6=^B7\r:k7=^B8\r:k8=^B9\r:k9=^B\072\r:k;=^B;\r:\
+ :kb=^H:kd=^J:kh=^A:kl=^U:kr=^F:ku=^Z:l0=F1:l1=F2:\
+ :l2=F3:l3=F4:l4=F5:l5=F6:l6=F7:l7=F8:l8=F9:l9=F10:\
+ :la=F11:le=^H:ll=^A:nd=^F:se=\ER\E0@\EV:sf=^J:\
+ :so=\ER\E0Q\EV:ta=^I:ue=\ER\E0@\EV:up=^Z:\
+ :us=\ER\E0`\EV:
+adds980|a980|adds consul 980:\
+ :am:\
+ :co#80:li#24:\
+ :al=\E\016:bl=^G:cl=\014\013@:cm=\013%+@\E\005%2:\
+ :cr=^M:dl=\E\017:do=^J:k0=\E0:k1=\E1:k2=\E2:k3=\E3:\
+ :k4=\E4:k5=\E5:k6=\E6:k7=\E7:k8=\E8:k9=\E9:le=^H:\
+ :nd=\E^E01:se=^O:sf=^J:so=^Y^^^N:
+
+
+cit80|cit-80|citoh 80:\
+ :am:\
+ :co#80:li#24:\
+ :cd=\EJ:ce=\EK:cl=\E[H\EJ:cm=\E[%i%2;%2H:cr=^M:ff=^L:\
+ :is=\E>:kd=\EOB:ke=\E[?1l\E>:kl=\EOD:kr=\EOC:\
+ :ks=\E[?1h\E=:ku=\EOA:le=^H:nd=\E[C:sf=^J:up=\E[A:
+cit101|citc|C.itoh fast vt100:\
+ :am:xn:\
+ :co#80:li#24:\
+ :RA=\E[?7l:SA=\E[?7h:al=\E[L:bl=^G:cd=\E[J:ce=\E[K:\
+ :cl=\E[H\E[2J:cm=\E[%i%d;%dH:dc=\E[P:dl=\E[M:ei=:\
+ :ic=\E[@:im=:\
+ :is=\E>\E[?3l\E[?4l\E[?5l\E[?7h\E[?8h\E[3g\E[>5g:\
+ :kd=\EOB:ke=\E[?1l\E>:kl=\EOD:kr=\EOC:ks=\E[?1h\E=:\
+ :ku=\EOA:le=^H:nd=\E[C:se=\E[m:so=\E[7m:ue=\E[m:\
+ :up=\E[A:us=\E[4m:vb=\E[?5h\E[?5l:ve=\E[V\E8:\
+ :vs=\E7\E[U:
+cit500|cit-500|cit 500:\
+ :am:xn:\
+ :co#80:it#8:li#64:\
+ :RA=\E[?7l:SA=\E[?7h:al=\E[L:cd=50\E[J:ce=3\E[K:\
+ :cl=50\E[H\E[2J:cm=5\E[%i%2;%2H:dc=\E[P:dl=\E[M:\
+ :do=\ED:is=\E(B\E)0\E>\E[?3l\E[?7h\E[?8h:k1=\EOP:\
+ :k2=\EOQ:k3=\EOR:k4=\EOS:kd=\EOB:ke=\E[?1l\E>:\
+ :kh=\E[H:kl=\EOD:kr=\EOC:ks=\E[?1h\E=:ku=\EOA:le=^H:\
+ :nd=2\E[C:se=2\E[m:so=2\E[7m:sr=5\EM:ta=^I:ue=2\E[m:\
+ :up=2\E[A:us=2\E[4m:
+
+citoh|ci8510|8510|c.itoh 8510a:\
+ :co#80:it#8:\
+ :is=\E(009\054017\054025\054033\054041\054049\054057\054065\054073.:\
+ :le@:md=\E!:me=\E"\EY:rp=\ER%r%03%.:sr=\Er:ue=\EY:\
+ :us=\EX:tc=lpr:
+citoh-pica|citoh in pica:\
+ :i1=\EN:tc=citoh:
+citoh-elite|citoh in elite:\
+ :co#96:\
+ :i1=\EE:\
+ :is=\E(009\054017\054025\054033\054041\054049\054057\054065\054073\054081\054089.:tc=citoh:
+citoh-comp|citoh in compressed:\
+ :co#136:\
+ :i1=\EQ:\
+ :is=\E(009\054017\054025\054033\054041\054049\054057\054065\054073\054081\054089\054097\054105\054113\054121\054129.:tc=citoh:
+citoh-prop|citoh-ps|ips|citoh in proportional spacing mode:\
+ :co#32767:\
+ :i1=\EP:tc=citoh:
+citoh-6lpi|citoh in 6 lines per inch mode:\
+ :i2=\EA:tc=citoh:
+citoh-8lpi|citoh in 8 lines per inch mode:\
+ :li#88:\
+ :i2=\EB:tc=citoh:
+
+
+cdc456|cdc 456 terminal:\
+ :am:\
+ :co#80:li#24:\
+ :al=\EL:bl=^G:cd=^X:ce=^V:cl=^Y^X:cm=\E1%+ %+ :cr=^M:\
+ :dl=\EJ:do=^J:ho=^Y:le=^H:nd=^L:sf=^J:up=^Z:
+
+
+c108|concept108|c108-8p|concept108-8p|concept 108 w/8 pages:\
+ :i2=\EU\E z"\Ev\001\177 !p\E ;"\E z \Ev \001\177p\Ep\n:\
+ :te=\Ev \001\177p\Ep\r\n:tc=c108-4p:
+c108-4p|concept108-4p|concept 108 w/4 pages:\
+ :es:hs:xo:\
+ :pb@:\
+ :ac=l\\qLkTxUmMjE:ae=\Ej :as=\Ej!:\
+ :..cm=\Ea%p1%?%p1%{95}%>%t\001%{96}%-%;%{32}%+%c%p2%?%p2%{95}%>%t\001%{96}%-%;%{32}%+%c:\
+ :cr=^M:dc=\E 1:ds=\E ;\177:fs=\Ee\E z :i1=\EK\E!\E F:\
+ :i2=\EU\E z"\Ev\177 !p\E ;"\E z \Ev \001 p\Ep\n:\
+ :sf=^J:te=\Ev \001 p\Ep\r\n:\
+ :ti=\EU\Ev 8p\Ep\r\E\025:\
+ :ts=\E z"\E?\E\005\EE\Ea %+ :ve=\Ew:vs=\EW:tc=c100:
+c108-rv|c108-rv-8p|concept 108 w/8 pages in reverse video:\
+ :te=\Ev \002 p\Ep\r\n:ti=\EU\Ev 8p\Ep\r:tc=c108-rv-4p:
+c108-rv-4p|concept108rv4p|concept 108 w/4 pages in reverse video:\
+ :i1=\Ek:se=\Ee:so=\EE:vb=\EK\Ek:tc=c108-4p:
+c108-w|c108-w-8p|concept108-w-8|concept108-w8p|concept 108 w/8 pages in wide mode:\
+ :co#132:\
+ :i1=\E F\E":te=\Ev ^A0\001D\Ep\r\n:\
+ :ti=\EU\Ev 8\001D\Ep\r:tc=c108-8p:
+
+c100|concept100|concept|c104|c100-4p|hds concept 100:\
+ :am:eo:mi:ul:xn:\
+ :co#80:li#24:pb#9600:vt#8:\
+ :al=\E\022:bl=^G:cd=\E\005:ce=\E\025:cl=\E?\E\005:\
+ :cm=\Ea%+ %+ :cr=\r:dc=\E\021:dl=\E\002:do=^J:\
+ :ei=\E :i1=\EK:i2=\Ev \Ep\n:im=\E^P:ip=:\
+ :is=\EU\Ef\E7\E5\E8\El\ENH\E\200\Eo&\200\Eo'\E\Eo!\200\E\007!\E\010A@ \E4#\072"\E\072a\E4#;"\E\072b\E4#<"\E\072c:\
+ :k1=\E5:k2=\E6:k3=\E7:k4=\E8:k5=\E9:k6=\E\072a:\
+ :k7=\E\072b:k8=\E\072c:kA=\E^R:kB=\E':kD=\E^Q:\
+ :kE=\E^S:kF=\E[:kI=\E^P:kL=\E^B:kM=\E\200:kN=\E-:\
+ :kP=\E.:kR=\E\\:kS=\E^C:kT=\E]:kb=^H:kd=\E<:ke=\Ex:\
+ :kh=\E?:kl=\E>:kr=\E=:ks=\EX:kt=\E_:ku=\E;:le=^H:\
+ :mb=\EC:me=\EN@:mh=\EE:mk=\EH:mp=\EI:mr=\ED:nd=\E=:\
+ :pf=\036o \E\EQ!\EYP\027:po=\EQ"\EY(\027\EYD\Eo \036:\
+ :rp=\Er%.%+ :se=\Ed:sf=^J:so=\ED:ta=\011:\
+ :te=\Ev \Ep\r\n:ti=\EU\Ev 8p\Ep\r\E\025:ue=\Eg:\
+ :up=\E;:us=\EG:vb=\Ek\EK:
+c100-rv|c100-rv-4p|concept100-rv|c100 rev video:\
+ :i1=\Ek:se=\Ee:so=\EE:vb=\EK\Ek:ve@:vs@:tc=c100:
+oc100|oconcept|c100-1p|old 1 page concept 100:\
+ :in:\
+ :i3@:tc=c100:
+
+avt-ns|concept avt no status line:\
+ :am:eo:mi:ul:xn:xo:\
+ :co#80:it#8:li#24:lm#192:\
+ :AL=\E[%dL:DL=\E[%dM:DO=\E[%dB:IC=\E[%d@:LE=\E[%dD:\
+ :RI=\E[%dC:UP=\E[%dA:ae=\016:al=\E[L:as=\017:bl=^G:\
+ :bt=\E[Z:cd=\E[J:ce=\E[K:ch=\E[%+^AG:cl=\E[H\E[J:\
+ :cm=\E[%i%d;%dH:cr=^M:cs=\E[%i%d;%dr:ct=\E[2g:\
+ :cv=\E[%+^Ad:dc=\E[P:dl=\E[M:do=^J:ei=\E4l:ho=\E[H:\
+ :i1=\E[=103l\E[=205l:ic=\E[@:im=\E1:ip=:\
+ :is=\E[1*q\E[2!t\E[7!t\E[=4;101;119;122l\E[=107;118;207h\E)1\E[1Q\EW\E[!y\E[!z\E>\E[0\0720\07232!r\E[0*w\E[w\E2\r\n\E[2;27!t:\
+ :k1=\EOP:k2=\EOQ:k3=\EOR:k4=\EOS:kA=\E^C\r:kD=\E^B\r:\
+ :kI=\E^A\r:kS=\E^D\r:kb=^H:kd=\E[B:ke=\E[!z\E[0;2u:\
+ :kh=\E[H:kl=\E[D:kr=\E[C:ks=\E[1!z\E[0;3u:ku=\E[A:\
+ :le=^H:ll=\E[24H:mb=\E[5m:md=\E[1m:me=\E[m:mh=\E[1!{:\
+ :mk=\E8m:mp=\E[99m:mr=\E[7m:nd=\E[C:pf=\E[4i:\
+ :pl=\E[%d;0u#%s#:po=\E[5i:ps=\E[0i:px=\E[%d;1u#%s#:\
+ :rc=\E8:sc=\E7:se=\E[7!{:sf=\n:so=\E[7m:sr=\EM:\
+ :st=\EH:ta=\011:te=\E[w\E2\r\n:\
+ :ti=\E[=4l\E[1;24w\E2\r:ue=\E[4!{:up=\E[A:us=\E[4m:\
+ :ve=\E[=119l:vs=\E[=119h:
+avt-rv-ns|concept avt in reverse video mode/no status line:\
+ :i1=\E[=103l\E[=205h:vb=\E[=205l\E[=205h:tc=avt-ns:
+avt-w-ns|concept avt in 132 column mode/no status line:\
+ :i1=\E[=103h\E[=205l:ti=\E[H\E[1;24;1;132w:tc=avt-ns:
+avt-w-rv-ns|concept avt in 132 column mode/no status line/reverse video:\
+ :i1=\E[=103h\E[=205h:ti=\E[H\E[1;24;1;132w:\
+ :vb=\E[=205l\E[=205h:tc=avt-ns:
+
+avt+s|concept avt status line changes:\
+ :es:hs:\
+ :lm#191:\
+ :ds=\E[0*w:fs=\E[1;1!w:\
+ :i2=\E[2w\E[2!w\E[1;1;1;80w\E[H\E[2*w\E[1!w\E2\r\n:\
+ :te=\E[2w\E2\r\n:ti=\E[2;25w\E2\r:\
+ :ts=\E[2;1!w\E[;%p1%dH\E[2K:
+avt|avt-s|concept-avt|avt w/80 columns:\
+ :tc=avt+s:tc=avt-ns:
+avt-rv|avt-rv-s|avt reverse video w/sl:\
+ :i1=\E[=103l\E[=205h:vb=\E[=205l\E[=205h:tc=avt+s:tc=avt-ns:
+avt-w|avt-w-s|concept avt 132 cols+status:\
+ :i1=\E[=103h\E[=205l:ti=\E[H\E[1;24;1;132w:tc=avt+s:tc=avt-ns:
+avt-w-rv|avt-w-rv-s|avt wide+status+rv:\
+ :i1=\E[=103h\E[=205h:ti=\E[H\E[1;24;1;132w:\
+ :vb=\E[=205l\E[=205h:tc=avt+s:tc=avt-ns:
+
+
+contel300|contel320|c300|Contel Business Systems C-300 or C-320:\
+ :am:in:xo:\
+ :co#80:li#24:sg#1:\
+ :al=\EL:bl=^G:cd=\EJ:ce=\EI:cl=\EK:cm=\EX%+ \EY%+ :\
+ :cr=^M:ct=\E3:dc=\EO:dl=\EM:do=^J:ei=:ho=\EH:ic=\EN:\
+ :im=:ip=:k0=\ERJ:k1=\ERA:k2=\ERB:k3=\ERC:k4=\ERD:\
+ :k5=\ERE:k6=\ERF:k7=\ERG:k8=\ERH:k9=\ERI:kb=^H:le=^H:\
+ :ll=\EH\EA:nd=\EC:se=\E!\200:sf=^J:so=\E!\r:st=\E1:\
+ :up=\EA:vb=\020\002\020\003:
+contel301|contel321|c301|c321|Contel Business Systems C-301 or C-321:\
+ :ei=:ic@:im=:ip@:se=\E!\200:so=\E!\r:vb@:tc=contel300:
+
+
+dg200|data general dasher 200:\
+ :NL:am:bw:\
+ :co#80:li#24:\
+ :bl=^G:ce=^K:cl=^L:cm=\020%r%.%.:cr=^M:do=^Z:ho=^H:\
+ :k0=^^z:k1=^^q:k2=^^r:k3=^^s:k4=^^t:k5=^^u:k6=^^v:\
+ :k7=^^w:k8=^^x:k9=^^y:kd=^Z:kh=^H:kl=^Y:kr=^X:ku=^W:\
+ :l0=f10:le=^Y:nd=^X:nw=^J:se=^^E:sf=^J:so=^^D:ue=^U:\
+ :up=^W:us=^T:
+dg211|Data General d211:\
+ :k0@:k1@:k2@:k3@:k4@:k5@:k6@:k7@:k8@:k9@:kb=^Y:l0@:\
+ :nw=^M^Z:se=00\036E\200/>:sf@:\
+ :so=00\036D\200\200\200\200\200/>:ta=^I:te=^L:\
+ :ti=^L^R:ve=^L:vs=^L^R:tc=dg200:
+
+dg450|dg6134|data general 6134:\
+ :le@:nd=^X:tc=dg200:
+
+dg460-ansi|Data General Dasher 460 in ANSI-mode:\
+ :am:ms:ul:\
+ :co#80:it#8:li#24:\
+ :al=\E[L:cd=\E[J:ce=\E[K:cl=\E[2J:cm=\E[%i%2;%2H:\
+ :dc=\E[P:dl=\E[M:do=\E[B:ei=:ho=\E[H:ic=\E[@:im=:\
+ :is=^^F@:k0=\E[001z:k1=\E[002z:k2=\E[003z:k3=\E[004z:\
+ :k4=\E[005z:k5=\E[006z:k6=\E[007z:k7=\E[008z:\
+ :k8=\E[009z:k9=\E[010z:kb=\E[D:kd=\E[B:kh=\E[H:\
+ :kl=\E[D:kr=\E[C:ku=\E[A:l0=f1:l1=f2:l2=f3:l3=f4:\
+ :l4=f5:l5=f6:l6=f7:l7=f8:l9=f10:le=^H:mb=\E[5m:\
+ :me=\E[m:mh=\E[2m:mr=\E[7m:nd=\E[C:nl=\ED:se=\E[m:\
+ :sf=\E[S:so=\E[7m:sr=\E[T:ta=^I:ue=\E[05:up=\E[A:\
+ :us=\E[4m:
+dg6053|data general 6053:\
+ :am:bs:bw:ul:\
+ :co#80:li#24:\
+ :bl=^G:ce=^K:cl=^L:cm=\020%r%.%.:cr=^M:do=^Z:ho=^H:\
+ :is=^R:k0=^^q:k1=^^r:k2=^^s:k3=^^t:k4=^^u:k5=^^v:\
+ :k6=^^w:k7=^^x:k8=^^y:kb=^Y:kd=^Z:kh=^H:kl=^Y:kr=^X:\
+ :ku=^W:le=^Y:nd=^X:nw=^M^Z:se=\200^^E:\
+ :so=\200\200\200\200\200\036D:ta=^I:te=^L:ti=^L^R:\
+ :ue=^U:up=^W:us=^T:ve=^L:vs=^L^R:
+
+
+cs10|colorscan|Datamedia Color Scan 10:\
+ :ms:\
+ :co#80:li#24:\
+ :bl=^G:cd=\E[J:ce=\E[K:cl=\E[H\E[J:cm=\E[%i%02;%02H:\
+ :cr=^M:do=^J:k1=\EOP:k2=\EOQ:k3=\EOR:k4=\EOS:kd=\E[B:\
+ :kl=\E[D:kr=\E[C:ku=\E[A:le=^H:nd=\E[C:se=\E[m:sf=^J:\
+ :so=\E[7m:ue=\E[m:up=\E[A:us=\E[4m:
+cs10-w|Datamedia Color Scan 10 with 132 columns:\
+ :co#132:\
+ :cm=\E[%i%02;%03H:tc=cs10:
+
+dm1520|dm1521|datamedia 1520:\
+ :am:xn:\
+ :co#80:it#8:li#24:\
+ :bl=^G:cd=^K:ce=^]:cl=^L:cm=\036%r%+ %+ :cr=^M:do=^J:\
+ :ho=^Y:kd=^J:kh=^Y:kl=^H:kr=^\:ku=^_:le=^H:nd=^\:\
+ :sf=^J:ta=^I:up=^_:
+dm2500|datamedia2500|datamedia 2500:\
+ :nc:\
+ :co#80:li#24:\
+ :al=\020\n\030\035\030\035:bl=^G:ce=^W:cl=^^^^\177:\
+ :cm=\014%r%n%.%.:dc=\020\010\030\035:\
+ :dl=\020\032\030\035:dm=^P:do=^J:ed=^X^]:\
+ :ei=\377\377\030\035:ho=^B:ic=\020\034\030\035:im=^P:\
+ :le=^H:nd=^\:pc=\377:se=^X^]:sf=^J:so=^N:up=^Z:
+dmchat|dmchat version of datamedia 2500:\
+ :km:\
+ :al=1*\020\n\030\035\030\035:dl=2\020\032\030\035:tc=dm2500:
+dm3025|datamedia 3025a:\
+ :km:\
+ :co#80:it#8:li#24:\
+ :al=\EP\n\EQ:bl=^G:cd=\EJ:ce=\EK:cl=\EM:\
+ :cm=\EY%r%+ %+ :cr=^M:dc=\010:dl=\EP\EA\EQ:dm=\EP:\
+ :do=^J:ed=\EQ:ei=\EQ:ho=\EH:im=\EP:ip=:is=\EQ\EU\EV:\
+ :le=^H:nd=\EC:se=\EO0:sf=^J:so=\EO1:ta=^I:up=\EA:
+dm3045|datamedia 3045a:\
+ :am:eo:km@:ul:xn:\
+ :al@:dc=\EB:dl@:dm@:ed@:ei=\EP:is=\EU\EV:k0=\Ey\r:\
+ :k1=\Ep\r:k2=\Eq\r:k3=\Er\r:k4=\Es\r:k5=\Et\r:\
+ :k6=\Eu\r:k7=\Ev\r:k8=\Ew\r:k9=\Ex\r:kh=\EH:kr=\EC:\
+ :ku=\EA:pc=\177:se@:so@:tc=dm3025:
+dm80|dmdt80|dt80|datamedia dt80/1:\
+ :cd=\E[J:ce=\E[K:cl=\E[2J\E[H:cm=%i\E[%d;%dH:do=^J:\
+ :ho=\E[H:nd=\E[C:pf=\E[4i:po=\E[5i:ps=\E[0i:se=\E[m:\
+ :so=\E[7m:sr=\EM:ue=\E[m:up=\E[A:us=\E[4m:tc=vt100:
+dm80w|dmdt80w|dt80w|datamedia dt80/1 in 132 char mode:\
+ :co#132:\
+ :cd=20\E[0J:ce=20\E[0K:cl=50\E[H\E[2J:\
+ :cm=5\E[%i%d;%dH:do=^J:up=5\E[A:tc=dm80:
+dtx-sas|dt80-sas|Datamedia DT803/DTX for SAS usage:\
+ :am:bw:\
+ :co#80:li#24:\
+ :ae=\EG:al=\EL:as=\EF:bl=^G:cd=^K:ce=^]:cl=^L:\
+ :cm=\E=%r%+ %+ :cr=^M:\
+ :..cs=\E=%p1%' '%+%c%' '%c\E#1\E=%p2%' '%+%c%' '%c\E#2:\
+ :ct=\E'0:dl=\EM:do=\EB:ff=^L:ho=^Y:\
+ :is=\E)0\E<\EP\E'0\E$2:kC=^L:kE=^]:kS=^K:kd=^J:kh=^Y:\
+ :kl=^H:kr=^\:ku=^_:le=^H:me=^X:mr=\E$2\004:nd=^\:\
+ :pf=^O:po=^N:se=^X:sf=\EB:so=\E$2\004:sr=\EI:st=\E'1:\
+ :ta=^I:up=^_:
+
+
+falco|ts1|ts-1|falco ts-1:\
+ :am:\
+ :co#80:it#8:li#24:\
+ :al=\EE:bl=^G:cd=\EY:ce=\ET\EG0\010:cl=\E*:\
+ :cm=\E=%+ %+ :cr=^M:dc=\EW:dl=\ER:do=^J:ei=\Er:ho=^^:\
+ :im=\Eq:is=\Eu\E3:k0=^A0\r:kd=^J:kl=^H:kr=^L:ku=^K:\
+ :le=^H:nd=^L:se=\Eg0:sf=^J:so=\Eg1:ta=^I:ue=\Eg0:\
+ :up=^K:us=\Eg1:
+falco-p|ts1p|ts-1p|falco ts-1 with paging option:\
+ :am:da:db:mi:ms:ul:\
+ :co#80:it#8:li#24:\
+ :al=\EE:bl=^G:bt=\EI:cd=\EY:ce=\ET\EG0\010\Eg0:\
+ :cl=\E*:cm=\E=%+ %+ :cr=^M:dc=\EW:dl=\ER:do=\E[B:\
+ :ei=\Er:im=\Eq:is=\EZ\E3\E_c:kd=\E[B:kh=\E[H:kl=\E[D:\
+ :kr=\E[C:ku=\E[A:le=^H:nd=\E[C:se=\Eg0:sf=^J:so=\Eg4:\
+ :ta=^I:te=\E_b:ti=\E_d:ue=\Eg0:up=\E[A:us=\Eg1:
+ts100|ts100-sp|falco ts100-sp:\
+ :am:mi:ms:xn:xo:\
+ :co#80:it#8:li#24:vt#3:\
+ :@8=\EOM:DO=\E[%dB:K1=\EOq:K2=\EOr:K3=\EOs:K4=\EOp:\
+ :K5=\EOn:LE=\E[%dD:RA=\E[?7l:RI=\E[%dC:SA=\E[?7h:\
+ :UP=\E[%dA:\
+ :ac=``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~:\
+ :ae=^O:al=\E~E:as=^N:bl=^G:cb=\E[1K:cd=\E[J:ce=\E[K:\
+ :cl=\E[H\E[J:cm=\E[%i%d;%dH:cr=^M:cs=\E[%i%d;%dr:\
+ :ct=\E[3g:dc=\E~W:dl=\E~R:do=^J:eA=\E(B\E)0:ei=:\
+ :ho=\E[H:i1=\E~)\E~ea:ic=\E~Q:im=:k0=\EOy:k1=\EOP:\
+ :k2=\EOQ:k3=\EOR:k4=\EOS:k5=\EOt:k6=\EOu:k7=\EOv:\
+ :k8=\EOl:k9=\EOw:k;=\EOx:kb=^H:kd=\EOB:ke=\E[?1l\E>:\
+ :kl=\EOD:kr=\EOC:ks=\E[?1h\E=:ku=\EOA:le=^H:mb=\E[5m:\
+ :md=\E[1m:me=\E[m\017:mr=\E[7m:nd=\E[C:\
+ :r2=\E>\E[?3l\E[?4l\E[?5l\E[?7h\E[?8h:rc=\E8:\
+ :..sa=\E[0%?%p1%p6%|%t;1%;%?%p2%t;4%;%?%p1%p3%|%t;7%;%?%p4%t;5%;m%?%p9%t\016%e\017%;:\
+ :sc=\E7:se=\E[m:sf=^J:so=\E[1;7m:sr=\EM:st=\EH:ta=^I:\
+ :ue=\E[m:up=\E[A:us=\E[4m:
+ts100-ctxt|falco ts-100 saving context:\
+ :te=\E~_b:ti=\E~_d\E[2J:tc=ts100:
+
+
+
+beacon|FCG Beacon System:\
+ :am:da:db:\
+ :co#80:li#32:\
+ :al=\EE:bl=\ESTART\r\E37\r\EEND\r:ce=\ET:cl=\EZ:\
+ :cm=\E=%+ %+ :cr=^M:dc=\EW:dl=\ER:do=^J:ei=:ho=\EH:\
+ :ic=\EQ:im=:le=^H:mb=\ESTART\r\E61\0541\r\EEND\r:\
+ :me=\ESTART\r\E78\r\E70\0540\r\EEND\r:\
+ :mr=\ESTART\r\E59\0541\r\EEND\r:nd=\EV:\
+ :se=\ESTART\r\E70\0540\r\EEND\r:sf=^J:\
+ :so=\ESTART\r\E70\0546\r\EEND\r:\
+ :ti=\ESTART\r\E2\0540\r\E12\r\EEND\r:\
+ :ue=\ESTART\r\E60\0540\r\EEND\r:up=\EU:\
+ :us=\ESTART\r\E60\0541\r\EEND\r:
+
+
+f1720|f1720a|fluke 1720A:\
+ :xt:\
+ :co#80:li#16:sg#1:ug#1:\
+ :bl=^G:cd=\E[J:ce=\E[K:cl=\E[H\E[2J:cm=\E[%i%d;%dH:\
+ :cr=^M:do=\E[B:is=\E[H\E[2J:kd=^]:kl=^_:kr=^^:ku=^\:\
+ :le=^H:nd=\E[C:se=\E[m:sf=\ED:so=\E[7m:sr=\EM:\
+ :ue=\E[m:up=\E[A:us=\E[4m:
+
+
+f100|freedom|freedom100|freedom model 100:\
+ :am:bw:hs:mi:ms:xo:\
+ :co#80:li#24:\
+ :ae=\E$:al=\EE:as=\E%:bl=^G:bt=\EI:cd=\EY:ce=\ET:\
+ :ch=\E]%+ :cl=^Z:cm=\E=%+ %+ :cr=^M:ct=\E3:cv=\E[%+ :\
+ :dc=\EW:dl=\ER:do=^J:ds=\Eg\Ef\r:ei=\Er:fs=^M:ho=^^:\
+ :im=\Eq:ip=:is=\Eg\Ef\r\Ed:k1=^A@\r:k2=^AA\r:\
+ :k3=^AB\r:k4=^AC\r:k5=^AD\r:k6=^AE\r:k7=^AF\r:\
+ :k8=^AG\r:k9=^AH\r:k;=^AI\r:kB=\EI:kb=^H:kd=^V:kh=^^:\
+ :kl=^H:kr=^L:ku=^K:le=^H:nd=^L:se=\EG0:sf=^J:so=\EG4:\
+ :sr=\Ej:st=\E1:ta=^I:ts=\Eg\Ef:ue=\EG0:up=^K:us=\EG8:\
+ :vb=\Eb\Ed:
+f100-rv|freedom-rv|freedom 100 in reverse video:\
+ :is=\Eg\Ef\r\Eb:vb=\Ed\Eb:tc=f100:
+f110|freedom110|Liberty Freedom 110:\
+ :bw@:es:\
+ :it#8:ws#80:\
+ :ae=\E%%:al=\EE:as=\E$:dl=\ER:do=^V:ds=\Ef\r:\
+ :ei=\Er\EO:im=\EO\Eq:ip@:is@:k0=^AI\r:k;@:kA=\EE:\
+ :kC=^^:kD=\EW:kE=\ET:kI=\EQ:kL=\ER:kS=\EY:mb=\EG2:\
+ :md=\EG0:me=\EG0:mh=\EG@:mk=\EG1:mr=\EG4:pf=\Ea:\
+ :po=\E`:so=\EG<:sr=\EJ:ts=\Ef:vb=\Eb\Ed:ve=\E.2:\
+ :vi=\E.1:vs=\E.2:tc=f100:
+f110-14|Liberty Freedom 110 14inch:\
+ :dc@:tc=f110:
+f110-w|Liberty Freedom 110 - 132 cols:\
+ :co#132:tc=f110:
+f110-14w|Liberty Freedom 110 14in/132 cols:\
+ :co#132:\
+ :dc@:tc=f110:
+f200|freedom200|Liberty Freedom 200:\
+ :am:es:hs:mi:ms:xo:\
+ :co#80:it#8:li#24:ws#80:\
+ :ae=\E%%:al=\EE:as=\E$:bl=^G:bt=\EI:cd=\EY:ce=\ET:\
+ :ch=\E]%+ :cl=^Z:cm=\E=%+ %+ :cr=^M:cs=\Em0%+ %+ :\
+ :ct=\E3:cv=\E[%+ :dc=\EW:dl=\ER:do=^V:ds=\Ef\r:\
+ :ei=\Er:fs=^M:ho=^^:im=\Eq:k0=^AI\r:k1=^A@\r:\
+ :k2=^AA\r:k3=^AB\r:k4=^AC\r:k5=^AD\r:k6=^AE\r:\
+ :k7=^AF\r:k8=^AG\r:k9=^AH\r:kA=\EE:kC=^^:kD=\EW:\
+ :kE=\ET:kI=\EQ:kL=\ER:kS=\EY:kb=^H:kd=^V:kl=^H:kr=^L:\
+ :ku=^K:le=^H:mb=\EG2:md=\EG0:me=\EG0:mh=\EG@:mk=\EG1:\
+ :mr=\EG4:nd=^L:pf=\Ea:po=\E`:se=\EG0:sf=^J:so=\EG<:\
+ :sr=\EJ:st=\E1:ts=\Ef:ue=\EG0:up=^K:us=\EG8:\
+ :vb=\Eo\En:ve=\E.1:vi=\E.0:vs=\E.1:
+f200-w|Liberty Freedom 200 - 132 cols:\
+ :co#132:tc=f200:
+f200vi|Liberty Freedom 200 for vi:\
+ :kd=^J:vb=\Eb\Ed:tc=f200:
+f200vi-w|Liberty Freedom 200 - 132 cols for vi:\
+ :co#132:tc=f200vi:
+
+go140|graphon go-140:\
+ :co#80:it#8:li#24:\
+ :RA=\E[?7l:SA=\E[?7h:al=\E[L:cd=10\E[J:ce=\E[K:\
+ :cl=10\E[H\E[2J:cm=\E[%i%2;%2H:dc=\E[P:dl=\E[M:\
+ :ei=\E[4l:if=/usr/share/tabset/vt100:im=\E[4h:\
+ :is=\E<\E=\E[?3l\E[?7l\E(B\E[J\E7\E[;r\E8\E[m\E[q:\
+ :k1=\EOP:k2=\EOQ:k3=\EOR:k4=\EOS:kd=\EOB:\
+ :ke=\E[?1l\E>:kh=\E[H:kl=\EOD:kr=\EOC:ks=\E[?1h\E=:\
+ :ku=\EOA:le=^H:nd=\E[C:se=\E[m:so=\E[7m:sr=\EM:ta=^I:\
+ :ue=\E[m:up=\E[A:us=\E[4m:
+go140w|graphon go-140 in 132 column mode:\
+ :am:\
+ :co#132:\
+ :is=\E<\E=\E[?3h\E[?7h\E(B\E[J\E7\E[;r\E8\E[m\E[q:tc=go140:
+go225|go-225|Graphon 225:\
+ :am:mi:xn:\
+ :co#80:it#8:li#25:vt#3:\
+ :RA=\E[?7l:SA=\E[?7h:al=\E[L:cd=\E[J:ce=\E[K:\
+ :cl=\E[H\E[J:cm=\E[%i%d;%dH:cs=\E[%i%d;%dr:dc=\E[P:\
+ :dl=\E[M:do=^J:ei=\E[4l:ho=\E[H:im=\E[4h:\
+ :is=\E>\E[?3l\E[?4l\E[?5l\E[?7h\E[?8h:k1=\EOP:\
+ :k2=\EOQ:k3=\EOR:k4=\EOS:kb=^H:kd=\E[B:ke=\E>:\
+ :kh=\E[H:kl=\E[D:kr=\E[C:ks=\E=:ku=\E[A:le=^H:\
+ :mb=\E[5m:md=\E[1m:me=\E[m:mr=\E[7m:nd=\E[C:\
+ :r1=\E[!p\E[?7h\E[2;1;1#w:rc=\E8:\
+ :rf=/usr/share/tabset/vt100:sc=\E7:se=\E[27m:sf=\ED:\
+ :so=\E[7m:sr=\EM:ta=^I:te=\E[!p\E[?7h\E[2;1;1#w:\
+ :ti=\E[2;0#w\E[1;25r:ue=\E[24m:up=\E[A:us=\E[4m:
+
+
+sb1|beehive superbee:\
+ :am:bw:da:db:mi:ul:xb:\
+ :co#80:li#25:sg#1:ug#1:\
+ :al=\EN\EL\EQ \EP \EO\ER\EA:\
+ :bl=^G:bt=\E`:cd=\EJ:ce=\EK:cl=\EH\EJ:cm=\EF%r%03%03:\
+ :cr=\r:ct=\E3:dc=\EP:dl=\EM:do=^J:ei=\ER:ho=\EH:\
+ :im=\EQ\EO:is=\EE\EX\EZ\EO\Eb\Eg\ER:k0=\E2:k1=\Ep:\
+ :k2=\Eq:k3=\Er:k4=\Es:k5=\Et:k6=\Eu:k7=\Ev:k8=\Ew:\
+ :k9=\E1:kE=\EK:kI=\EQ\EO:kL=\EM:kM=\ER:kS=\EJ:kb=^_:\
+ :kd=\EB:kh=\EH:kl=\ED:kr=\EC:ku=\EA:l0=TAB CLEAR:\
+ :l9=TAB SET:le=^H:nd=\EC:se=\E_3:sf=^J:so=\E_1:\
+ :st=\E1:ta=^I:ti=\EO:ue=\E_3:up=\EA:us=\E_0:
+sbi|superbee|beehive superbee at Indiana U.:\
+ :xb:\
+ :al=1\EN\EL\EQ \EP \EO\ER\EA:cr=\r:tc=sb1:
+superbee-xsb|beehive super bee:\
+ :am:da:db:xb:\
+ :co#80:it#8:li#25:\
+ :cd=\EJ:ce=\EK:cl=\EH\EJ:cm=\EF%r%3%3:cr=\r:ct=\E3:\
+ :dc=\EP:dl=\EM:do=^J:ho=\EH:is=\EH\EJ:k1=\Ep:k2=\Eq:\
+ :k3=\Er:k4=\Es:k5=\Et:k6=\Eu:k7=\Ev:k8=\Ew:kd=\EB:\
+ :kh=\EH:kl=\ED:kr=\EC:ku=\EA:le=^H:nd=\EC:se=\E_3:\
+ :sf=\n\200\200\200\n\200\200\200\EA\EK\200\200\200\ET\ET:\
+ :so=\E_1:st=\E1:ta=^I:up=\EA:ve=^J:
+superbeeic|super bee with insert char:\
+ :ei=\ER:ic=:im=\EQ:tc=superbee-xsb:
+sb2|sb3|fixed superbee:\
+ :xb@:tc=superbee:
+
+
+beehive|bee|harris beehive:\
+ :am:mi:\
+ :co#80:li#24:\
+ :al=\EL:bt=\E>:cd=\EJ:ce=\EK:cl=\EE:cm=\EF%+ %+ :\
+ :dc=\EP:dl=\EM:do=\EB:ei=\E@:ho=\EH:im=\EQ:kA=\EL:\
+ :kB=\E>:kC=\EE:kD=\EP:kE=\EK:kI=\EQ:kL=\EM:kM=\E@:\
+ :kb=^H:kd=\EB:kh=\EH:kl=\ED:kr=\EC:ku=\EA:le=^H:\
+ :nd=\EC:se=\Ed@:so=\EdP:ue=\Ed@:up=\EA:us=\Ed`:
+beehive3|bh3m|beehiveIIIm|harris beehive 3m:\
+ :am:\
+ :co#80:it#8:li#20:\
+ :al=\023:bl=^G:cd=^R:ce=^P:cl=^E^R:cr=^M:dl=\021:\
+ :do=^J:ho=^E:if=/usr/share/tabset/beehive:le=^H:\
+ :ll=^E^K:nd=^L:se= ^_:sf=^J:so=^] :ta=^I:up=^K:
+beehive4|bh4|beehive 4:\
+ :am:\
+ :co#80:li#24:\
+ :bl=^G:cd=\EJ:ce=\EK:cl=\EE:cr=^M:do=^J:ho=\EH:\
+ :le=\ED:nd=\EC:sf=^J:up=\EA:
+microb|microbee|micro bee series:\
+ :am:\
+ :co#80:it#8:li#24:\
+ :bl=^G:cd=\EJ:ce=\EK:cl=\EE:cm=\EF%+ %+ :cr=^M:do=^J:\
+ :k1=\Ep:k2=\Eq:k3=\Er:k4=\Es:k5=\Et:k6=\Eu:k7=\Ev:\
+ :k8=\Ew:k9=\Ex:kd=\EB:kh=\EH:kl=\ED:kr=\EC:ku=\EA:\
+ :le=^H:nd=\EC:se=\Ed@ :sf=^J:so= \EdP:ta=^I:ue=\Ed@:\
+ :up=\EA:us=\Ed`:
+
+ha8675|harris 8675:\
+ :F1=^W:F2=\ER:F3=\EE:F4=\EI:F5=\Ei:F6=\Eg:\
+ :is=\ES\E#\E*\Eh\Em\E?\E1\E9\E@\EX\EU:k1=^F:k2=^P:\
+ :k3=^N:k4=^V:k5=^J:k6=^T:k7=^H:k8=\177:k9=\Ee:k;=\Ed:tc=bee:
+ha8686|harris 8686:\
+ :F1=\EW:F2=\002\E{\003:F3=\002\E|\003:F4=\002\E}\003:\
+ :F5=\002\E~\003:F6=\002\E\177\003:\
+ :is=\ES\E#\E*\Eh\Em\E?\E1\E9\E@\EX\EU\E"*Z01\E"8F35021B7C83#\E"8F45021B7D83#\E"8F55021B7E83#\E"8F65021B7F83#\E"8F75021B7383#\E"8F851BD7#\E"8F95021B7083#\E"8FA5021B7183#\E"8FB5021B7283#:\
+ :k1=\002\Ep\003:k2=\002\Eq\003:k3=\002\Er\003:\
+ :k4=\002\Es\003:k5=\E3:k6=\EI:k7=\ER:k8=\EJ:k9=\E(:\
+ :k;=\Ej:tc=bee:
+
+
+hz1000|hazeltine 1000:\
+ :co#80:li#12:\
+ :bl=^G:cl=^L:cr=^M:do=^J:ho=^K:le=^H:nd= :sf=^J:
+hz1420|hazeltine 1420:\
+ :am:\
+ :co#80:li#24:\
+ :al=\E^Z:bl=^G:cd=\E^X:ce=\E^O:cl=\E^\:\
+ :cm=\E\021%r%.%+ :cr=^M:dl=\E^S:do=^J:le=^H:nd=^P:\
+ :se=\E^Y:sf=^J:so=\E^_:ta=^N:up=\E^L:
+hz1500|hazeltine 1500:\
+ :am:hz:\
+ :co#80:li#24:\
+ :al=~\032:bl=^G:cd=~\030:ce=~^O:cl=~^\:\
+ :cm=~\021%r%>^^ %+`%+`:cr=^M:dl=~\023:do=~^K:ho=~^R:\
+ :kd=^J:kh=~^R:kl=^H:kr=^P:ku=~^L:le=^H:nd=^P:se=~^Y:\
+ :sf=^J:so=~^_:up=~^L:
+hz1510|hazeltine 1510:\
+ :am:\
+ :co#80:li#24:\
+ :al=\E^Z:bl=^G:cd=\E^X:ce=\E^O:cl=\E^\:\
+ :cm=\E\021%r%.%.:cr=^M:dl=\E^S:do=\E^K:le=^H:nd=^P:\
+ :sf=^J:up=\E^L:
+hz1520|hazeltine 1520:\
+ :am:hz:\
+ :co#80:li#24:\
+ :al=~^Z:bl=^G:cd=~^X:ce=~^O:cl=~^\:cm=~\021%r%.%.:\
+ :cr=^M:dl=~^S:do=~^K:ho=~^R:le=^H:nd=^P:se=~^Y:sf=^J:\
+ :so=~^_:up=~^L:
+hz1552|hazeltine 1552:\
+ :al=\EE:dl=\EO:do=^J:k1=\EP:k2=\EQ:k3=\ER:l1=blue:\
+ :l2=red:l3=green:tc=vt52:
+hz1552-rv|hazeltine 1552 reverse video:\
+ :do=^J:se=\ET:so=\ES:tc=hz1552:
+hz2000|hazeltine 2000:\
+ :am:nc:\
+ :co#74:li#27:\
+ :al=~\032:bl=^G:cl=~\034:cm=~\021%r%.%.:dl=~\023:\
+ :do=^J:ho=~^R:le=^H:pc=\177:sf=^J:
+esprit|Hazeltine Esprit I:\
+ :am:bw:\
+ :co#80:li#24:\
+ :al=\E^Z:bl=^G:bt=\E^T:cd=\E^W:ce=\E^O:cl=\E^\:\
+ :cm=\E\021%r%.%.:cr=^M:dl=\E^S:do=\E^K:ho=\E^R:\
+ :is=\E?:k0=^B0^J:k1=^B1^J:k2=^B2^J:k3=^B3^J:k4=^B4^J:\
+ :k5=^B5^J:k6=^B6^J:k7=^B7^J:k8=^B8^J:k9=^B9^J:kb=^H:\
+ :kd=\E^K:ke=\E>:kh=\E^R:kl=^H:kr=^P:ks=\E<:ku=\E^L:\
+ :l0=0:l1=1:l2=2:l3=3:l4=4:l5=5:l6=6:l7=7:l8=8:l9=9:\
+ :le=^H:nd=^P:se=\E^Y:sf=^J:so=\E^_:up=\E^L:
+esprit-am|hazeltine esprit auto-margin:\
+ :am:tc=esprit:
+
+
+ibm327x|line mode IBM 3270 style:\
+ :gn:\
+ :ce=^M:cl=^M^J:ho=^M:
+
+ibm3101|i3101|IBM 3101-10:\
+ :am:xo:\
+ :co#80:li#24:\
+ :bl=^G:cd=\EJ:ce=\EI:cl=\EK:cm=\EY%+ %+ :cr=^M:\
+ :ct=\E1:do=^J:ho=\EH:if=/usr/share/tabset/ibm3101:\
+ :kb=^H:kd=\EB:kl=\ED:kr=\EC:ku=\EA:le=^H:nd=\EC:\
+ :nw=^M^J:sf=^J:st=\E0:ta=^I:up=\EA:
+ibm3151|i3151|IBM 3151:\
+ :me=\E4@:\
+ :..sa=\E4%{64}%?%p1%{0}%>%p1%{4}%<%&%t%{8}%|%;%?%p1%{7}%=%t%{16}%|%;%?%p2%t%{1}%|%;%?%p3%t%{4}%|%;%?%p4%t%{2}%|%;%c:\
+ :se=\E4@:so=\E4A:ue=\E4@:us=\E4B:tc=ibm3163:
+ibm3161|ibm3163|wy60-316X|wyse60-316X|IBM 3161/3163 display:\
+ :am:mi:ms:\
+ :co#80:it#8:li#24:\
+ :F1=\Ek\r:F2=\El\r:F3=\E!a\r:F4=\E!b\r:F5=\E!c\r:\
+ :F6=\E!d\r:F7=\E!e\r:F8=\E!f\r:F9=\E!g\r:FA=\E!h\r:\
+ :FB=\E!i\r:FC=\E!j\r:FD=\E!k\r:FE=\E!l\r:\
+ :ac=l\354q\361k\353x\370j\352m\355w\367u\365v\366t\364n\356:\
+ :bl=^G:cd=\EJ:ce=\EI:cl=\EH\EJ:cm=\EY%+ %+ :cr=^M:\
+ :dc=\EQ:dl=\EO:do=\EB:ho=\EH:k1=\Ea\r:k2=\Eb\r:\
+ :k3=\Ec\r:k4=\Ed\r:k5=\Ee\r:k6=\Ef\r:k7=\Eg\r:\
+ :k8=\Eh\r:k9=\Ei\r:k;=\Ej\r:kA=\EN:kB=\E2:kC=\EL\r:\
+ :kD=\EQ:kE=\EI:kI=\EP \010:kL=\EO:kS=\EJ:kT=\E0:\
+ :ka=\E 1:kb=^H:kd=\EB:kh=\EH:kl=\ED:kr=\EC:kt=\E1:\
+ :ku=\EA:le=\ED:mb=\E4D:md=\E4H:me=\E4@\E<@:mk=\E4P:\
+ :mr=\E4A:nd=\EC:\
+ :..sa=\E4%'@'%?%p1%t%'A'%|%;\n%?%p2%t%'B'%|%;\n%?%p3%t%'A'%|%;\n%?%p4%t%'D'%|%;\n%?%p5%t%'@'%|%;\n%?%p6%t%'H'%|%;\n%?%p7%t%'P'%|%;%c\n%?%p9%t\E>A%e\E<@%;:\
+ :se=\E4@:sf=^J:so=\E4A:te=\E>A:ti=\E>A:ue=\E4@:\
+ :up=\EA:us=\E4B:
+
+ibm3164|i3164|IBM 3164:\
+ :mb=\E4D:md=\E4H:me=\E4@:\
+ :..sa=\E4%{32}%?%p2%t%{1}%|%;%?%p3%t%{4}%|%;%?%p4%t%{2}%|%;%c%{39}%p1%-%c%{64}%c:tc=ibm3163:
+
+ibmaed|IBM Experimental display:\
+ :am:eo:ms:\
+ :co#80:it#8:li#52:\
+ :al=\EN:cd=\EJ:ce=\EI:cl=\EH\EK:cm=\EY%+ %+ :dc=\EQ:\
+ :dl=\EO:do=\EB:ei=:ho=\EH:ic=\EP:im=:kb=^H:kd=\EB:\
+ :kl=\ED:kr=\EC:ku=\EA:le=^H:nd=\EC:se=\E0:so=\E0:\
+ :ta=^I:up=\EA:vb=\EG:
+ibm-apl|apl|IBM apl terminal simulator:\
+ :li#25:tc=dm1520:
+ibmmono|ibm5151|IBM workstation monochrome:\
+ :es:hs:\
+ :al=\EL:dl=\EM:ds=\Ej\EY8 \EI\Ek:fs=\Ek:k0=\E<:\
+ :k1=\ES:k2=\ET:k3=\EU:k4=\EV:k5=\EW:k6=\EP:k7=\EQ:\
+ :k8=\ER:k9=\EY:kF=\EE:kI=\200:kN=\EE:kP=\Eg:kR=\EG:\
+ :kb=^H:kh=\EH:l0=f10:md=\EZ:me=\Ew\Eq\Ez\EB:\
+ :mk=\EF\Ef0;\Eb0;:mr=\Ep:se=\Ez:so=\EZ:sr=\EA:\
+ :ts=\Ej\EY8%+ \Eo:ue=\Ew:us=\EW:tc=ibm3101:
+ibmega|ibm5154|IBM Enhanced Color Display:\
+ :cr=^M:do=^J:kb=^H:kd=^J:kl=^H:nw=^M^J:sf=^J:ta=^I:tc=ibmmono:
+ibmega-c|ibm5154-c|IBM Enhanced Color Display:\
+ :se=\EB:so=\EF\Ef3;:ue=\EB:us=\EF\Ef2;:tc=ibmmono:
+ibmvga-c|IBM VGA display color termcap:\
+ :cr=^M:do=^J:kb=^H:kd=^J:kl=^H:nw=^M^J:sf=^J:ta=^I:tc=ibmega-c:
+ibmvga|IBM VGA display:\
+ :cr=^M:do=^J:kb=^H:kd=^J:kl=^H:nw=^M^J:sf=^J:ta=^I:tc=ibmega:
+rtpc|ibmapa16|ibm6155|IBM 6155 Extended Monochrome Graphics Display:\
+ :li#32:\
+ :ds=\Ej\EY@ \EI\Ek:ts=\Ej\EY@%+ \Eo:tc=ibmmono:
+ibmapa8c|ibmapa8|ibm6154|ibm6153|IBM 6153/4 Advanced Graphics Display:\
+ :li#31:\
+ :ds=\Ej\EY? \EI\Ek:ts=\Ej\EY?%+ \Eo:tc=ibmmono:
+ibmapa8c-c|ibm6154-c|IBM 6154 Advanced Color Graphics Display:\
+ :li#31:\
+ :ds=\Ej\EY? \EI\Ek:mh=\EF\Ef7;:ts=\Ej\EY?%+ \Eo:tc=ibmega-c:
+ibm8512|ibm8513|hft-c|IBM High Function Terminal:\
+ :am:mi:ms:\
+ :co#80:it#8:li#25:\
+ :AL=\E[%dL:DL=\E[%dM:RA=\E[?7l:SA=\E[?7h:ae=^O:\
+ :al=\E[L:as=^N:cd=\E[J:ce=\E[K:cl=\E[H\E[J:\
+ :cm=\E[%i%d;%dH:dl=\E[M:dm=\E[4h:do=^J:ec=\E[%dX:\
+ :ed=\E[4l:ei=\E[4l:ho=\E[H:im=\E[4h:\
+ :is=\Eb\E[m\017\E[?7h:k0=\E[010q:k1=\E[001q:\
+ :k2=\E[002q:k3=\E[003q:k4=\E[004q:k5=\E[005q:\
+ :k6=\E[006q:k7=\E[007q:k8=\E[008q:k9=\E[009q:kd=\E[B:\
+ :kh=\E[H:ku=\E[A:le=\E[D:mb=\E[5m:md=\E[1m:me=\E[m:\
+ :mr=\E[7m:nd=\E[C:r1=\Eb\E[m\017\E[?7h\E[H\E[J:\
+ :rc=\E[u:sc=\E[s:se=\E[m:so=\E[7m:te=\E[20h:\
+ :ti=\E[20;4l\E[?7h\Eb:ue=\E[m:up=\E[A:us=\E[4m:
+hft|AIWS High Function Terminal:\
+ :am:xo:\
+ :co#80:li#25:\
+ :al=\E[L:bl=^G:cd=\E[J:ce=\E[K:cl=\E[H\E[2J:\
+ :cm=\E[%i%d;%dH:cr=^M:dc=\E[P:dl=\E[M:do=^J:ei=\E6:\
+ :ho=\E[H:ic=\E[@:im=\E6:k1=\E[001q:k2=\E[002q:\
+ :k3=\E[003q:k4=\E[004q:k5=\E[005q:k6=\E[006q:\
+ :k7=\E[007q:k8=\E[008q:k9=\E[009q:kN=\E[153q:\
+ :kP=\E[159q:ka=\E[010q:kb=^H:kd=\E[B:kh=\E[H:kl=\E[D:\
+ :kr=\E[C:ku=\E[A:le=^H:mb=\E[5m:md=\E[1m:me=\E[m:\
+ :mk=\E[8m:mr=\E[7m:nd=\E[C:se=\E[m:sf=^J:so=\E[7m:\
+ :ta=^I:ue=\E[m:up=\E[A:us=\E[4m:
+ibm-system1|system1|ibm system/1 computer:\
+ :am:xt:\
+ :co#80:li#24:\
+ :bl=^G:cl=^Z:cm=\005%+ %+ :ho=^K:le=^H:nd=^\:sf=^J:\
+ :up=^^:
+
+ibm5081|ibmmpel|IBM 5081 1024x1024 256/4096 color display:\
+ :es:hs:\
+ :li#33:\
+ :ds=\Ej\EYA \EI\Ek:fs=\Ek:ts=\Ej\EYA%+ \Eo:tc=ibmmono:
+ibm5081-c|ibmmpel-c|IBM 5081 1024x1024 256/4096 enhanced color display:\
+ :es:hs:\
+ :li#33:\
+ :ds=\Ej\EYA \EI\Ek:fs=\Ek:ts=\Ej\EYA%+ \Eo:tc=ibmega-c:
+ibm8514|IBM 8514 color display:\
+ :es:hs:\
+ :li#41:\
+ :cr=^M:do=^J:ds=\Ej\EYI \EI\Ek:fs=\Ek:kb=^H:kd=^J:\
+ :kl=^H:nw=^M^J:sf=^J:ta=^I:ts=\Ej\EYI%+ \Eo:tc=ibmega:
+ibm8514-c|IBM 8514 color display:\
+ :es:hs:\
+ :li#41:\
+ :cr=^M:do=^J:ds=\Ej\EYI \EI\Ek:fs=\Ek:kb=^H:kd=^J:\
+ :kl=^H:nw=^M^J:sf=^J:ta=^I:ts=\Ej\EYI%+ \Eo:tc=ibmega-c:
+
+aixterm-m|IBM AIXterm Monochrome Terminal Emulator:\
+ :es:hs:\
+ :ac=llqqkkxxjjmmwwuuvvttnn:ds=\E[?E:fs=\E[?F:\
+ :md=\E[1m:me=\E[0;10m\E(B:s0=\E(B:s1=\E(0:\
+ :..sa=\E[%?%p1%t;7%;%?%p2%t;4%;%?%p3%t;7%;%?%p4%t;5%;%?%p6%t;1%;m:\
+ :sr@:ts=\E[?%p1%dT:tc=ibm6153:
+aixterm-m-old|IBM AIXterm Monochrome Terminal Emulator:\
+ :es:hs:\
+ :ds=\E[?E:fs=\E[?F:md=\E[1m:\
+ :..sa=\E[%?%p1%t;7%;%?%p2%t;4%;%?%p3%t;7%;%?%p4%t;5%;%?%p6%t;1%;m:\
+ :sr@:ts=\E[?%p1%dT:tc=ibm6153:
+jaixterm-m|IBM Kanji AIXterm Monochrome Terminal Emulator:\
+ :ac@:tc=aixterm-m:
+
+
+i100|gt100|gt100a|General Terminal 100A (formerly Infoton 100):\
+ :am:\
+ :co#80:li#24:\
+ :al=\EL:bl=^G:cd=\EJ:ce=\EK:cl=^L:cm=\Ef%r%+ %+ :\
+ :cr=^M:dl=\EM:do=^J:ho=\EH:le=^H:nd=\EC:se=\Ea:sf=^J:\
+ :so=\Eb:up=\EA:vb=\Eb\Ea:
+i400|infoton 400:\
+ :am:\
+ :co#80:li#25:\
+ :al=\E[L:bl=^G:ce=\E[N:cl=\E[2J:cm=%i\E[%3;%3H:cr=^M:\
+ :dc=\E[4h\E[2Q\E[P\E[4l\E[0Q:dl=\E[M:do=^J:\
+ :ei=\E[4l\E[0Q:im=\E[4h\E[2Q:le=^H:nd=\E[C:sf=^J:\
+ :up=\E[A:
+addrinfo:\
+ :am:\
+ :co#80:li#24:\
+ :bl=^G:cd=^K:cl=^L:..cm=\037%p1%{1}%-%c%p2%{1}%-%c:\
+ :cr=^M:do=^J:ho=^H:le=^Z:ll=^H^\:nd=^Y:sf=^J:up=^\:
+infoton:\
+ :am:\
+ :co#80:li#24:\
+ :bl=^G:cd=^K:cl=^L:cr=^M:do=^J:le=^Z:ll=^H^\:nd=^Y:\
+ :sf=^J:up=^\:
+
+
+intext|Interactive Systems Corporation modified owl 1200:\
+ :am:\
+ :co#80:it#8:li#24:sg#1:\
+ :al=\020:bl=^G:bt=^Y:cd=\026J:ce=^Kp^R:cl=\014:\
+ :cm=\017%+ %+ :cr=^M:dc=\022:dl=\021:do=^J:ei=^V<:\
+ :im=^V;:ip=:k0=^VJ\r:k1=^VA\r:k2=^VB\r:k3=^VC\r:\
+ :k4=^VD\r:k5=^VE\r:k6=^VF\r:k7=^VG\r:k8=^VH\r:\
+ :k9=^VI\r:kb=^H:kd=^J:ke=^V9:kh=^Z:kl=^_:kr=^^:\
+ :ks=\036\072\264\026%:ku=^\:le=^H:nd=^^:se=^V# :\
+ :sf=^J:so=^V$\054:ta=^I:up=^\:
+intext2|intextii|INTERACTIVE modified owl 1251:\
+ :am:bw:ul:\
+ :co#80:li#24:sg#0:\
+ :al=\E[L:bl=^G:bt=\E[Z:cd=\E[J:ce=\E[K:ch=\E[%+^AG:\
+ :cl=\E[H\E[2J:cm=\E[%i%d;%dH:cr=^M:dc=\E[P:dl=\E[M:\
+ :do=\E[B:ei=:ic=\E[@:im=:k0=\E@\r:k1=\EP\r:k2=\EQ\r:\
+ :k3=\ES\r:k4=\ET\r:k5=\EU\r:k6=\EV\r:k7=\EW\r:\
+ :k8=\EX\r:k9=\EY\r:kb=^H:kd=\EB\r:kh=\ER\r:kl=\ED\r:\
+ :kr=\EC\r:ku=\EA\r:l0=REFRSH:l1=DEL CH:l2=TABSET:\
+ :l3=GOTO:l4=+PAGE:l5=+SRCH:l6=-PAGE:l7=-SRCH:l8=LEFT:\
+ :l9=RIGHT:nd=\E[C:se=\E[2 D:sf=\E[S:so=\E[6 D:\
+ :sr=\E[T:ta=^I:ue=\E[2 D:up=\E[A:us=\E[18 D:\
+ :vb=\E[;;;;;;;;;2;;u\E[;;;;;;;;;1;;u:
+
+
+abm85|Kimtron ABM 85:\
+ :am:bw:ms:\
+ :co#80:it#8:li#24:sg#1:ug#1:\
+ :al=\EE:bt=\EI:cd=\Ey:ce=\Et:cl=\E*:cm=\E=%+ %+ :\
+ :dc=\EW:dl=\ER:do=^J:ei=\Er:\
+ :if=/usr/share/tabset/stdcrt:im=\EQ:\
+ :is=\EC\EX\Eg\En\E%\Er\E(\Ek\Em\Eq:kb=^H:kd=^J:kh=^^:\
+ :kl=^H:kr=^L:ku=^K:le=^H:nd=^L:se=\Ek:so=\Ej:ta=^I:\
+ :ue=\Em:up=^K:us=\El:
+abm85h|Kimtron ABM 85H native mode:\
+ :hs:\
+ :sg@:ug@:\
+ :bl=^G:ds=\Ee:fs=^M:im=\EZ:\
+ :is=\EC\EN\EX\024\016\EA\Ea\E%\E9\Ee\Er\En\E"\E}\E'\E(\Ef\r\EG0\Ed\E.4\El:\
+ :kd=^V:me=\E(\EG0:mh=\E):mr=\EG4:se=\EG0:so=\EG4:\
+ :ts=\Eg\Ef:ue=\EG0:us=\EG8:vb@:ve=\E.4:vs=\E.2:tc=abm85:
+abm85e|Kimtron ABM 85H in 920E mode:\
+ :sg@:\
+ :bl=^G:im=\EZ:\
+ :is=\EC\EX\EA\E%\E9\Ee\Er\En\E"\E}\E'\E(\Ef\r\Ek\Eq\Em:\
+ :me=\E(\Ek:mh=\E):mr=\Ej:vb@:tc=abm85:
+abm85h-old|oabm85h|o85h|Kimtron ABM 85H with old firmware rev.:\
+ :sg@:\
+ :bl=^G:im=\EZ:\
+ :is=\E}\EC\EX\Ee\En\E%\Er\E(\Ek\Em\Eq\Ed\ET\EC\E9\EF:\
+ :me=\E(\Ek:mh=\E):mr=\Ej:tc=abm85:
+kt7|kimtron model kt-7:\
+ :am:\
+ :co#80:it#8:li#24:\
+ :al=\EE:bt=\EI:cd=\EY:ce=\ET:cl=^Z:cm=\E=%+ %+ :\
+ :dc=\EW:dl=\ER:do=^V:ei=:fs=\Eg:ho=^^:ic=\EQ:\
+ :if=/usr/share/tabset/stdcrt:im=:is=\El\E":k0=^AI\r:\
+ :k1=^A@\r:k2=^AA\r:k3=^AB\r:k4=^AC\r:k5=^AD\r:\
+ :k6=^AE\r:k7=^AF\r:k8=^AG\r:k9=^AH\r:kA=\EE:kB=\EI:\
+ :kC=^Z:kD=\EW:kE=\ET:kI=\EQ:kL=\ER:kS=\EY:kb=^H:\
+ :kd=^V:kh=^^:kl=^H:kr=^L:ku=^K:le=^H:nd=^L:se=\EG0:\
+ :so=\EG4:ta=^I:ts=\Ef:ue=\EG0:up=^K:us=\EG8:
+
+
+act4|microterm|microterm act iv:\
+ :am:\
+ :co#80:li#24:\
+ :al=2.3*\001<2.3*/>:bl=^G:cd=2.2*\037:ce=.1*\036:\
+ :cl=12\014:cm=\024%+^X%>/0%+P:cr=^M:dc=.1*\004:\
+ :dl=2.3*\027:do=^K:ho=^]:kd=^K:kl=^H:kr=^X:ku=^Z:\
+ :le=^H:nd=^X:sf=^J:up=^Z:
+act5|microterm5|microterm act v:\
+ :kd=^K:kl=^H:kr=^X:ku=^Z:sr=\EH:uc=^H\EA:tc=act4:
+mime-fb|full bright mime1:\
+ :is=^S\E:se=^S:so=^Y:tc=mime:
+mime-hb|half bright mime1:\
+ :is=^Y\E:se=^Y:so=^S:tc=mime:
+mime|mime1|mime2|mimei|mimeii|microterm mime1:\
+ :am:\
+ :co#80:it#8:li#24:vt#9:\
+ :al=\001:bl=^G:cd=^_:ce=^^:cl=^]^C:\
+ :cm=\024%+^X%> 0%+P:cr=^M:dl=\027:do=^J:ho=^]:\
+ :is=^S\E^Q:kd=^K:kl=^H:kr=^X:ku=^Z:le=^H:nd=^X:sf=^J:\
+ :sr=\022:ta=\011:uc=^U:up=^Z:
+mime2a-s|microterm mime2a (emulating an enhanced soroc iq120):\
+ :am:\
+ :co#80:li#24:\
+ :al=\001:bl=^G:cd=\EJ:ce=\EK:cl=\EL:cm=\E=%+ %+ :\
+ :cr=^M:dc=\ED:dl=\027:do=^J:ei=^Z:ho=^^:im=\EE:ip=:\
+ :is=\E):kd=^J:kl=^H:kr=^L:ku=^K:le=^H:nd=^L:se=\E;:\
+ :sf=^J:so=\E\072:sr=\EI:ue=\E7:up=\EI:us=\E6:
+mime2a|mime2a-v|microterm mime2a (emulating an enhanced vt52):\
+ :co#80:it#8:li#24:\
+ :al=\001:bl=^G:cd=\EQ:ce=\EP:cl=\EL:cm=\EY%+ %+ :\
+ :cr=^M:dc=^N:dl=\027:do=^J:ei=^Z:ho=\EH:im=^O:ip=:\
+ :is=^Y:kd=\EB:kl=\ED:kr=\EC:ku=\EA:le=^H:nd=\EC:\
+ :se=\E9:sf=^J:so=\E8:sr=\EA:ta=^I:ue=\E5:up=\EA:\
+ :us=\E4:
+mime3a|mime1 emulating 3a:\
+ :am@:\
+ :kd=^K:kl=^H:kr=^X:ku=^Z:tc=adm3a:
+mime3ax|mime-3ax|mime1 emulating enhanced 3a:\
+ :it#8:\
+ :al=\001:cd=^_:ce=^X:dl=\027:ta=\011:tc=mime3a:
+mime314|mm314|mime 314:\
+ :am:\
+ :co#80:li#24:\
+ :al=^A:cd=^_:ce=^^:cl=^L:cm=\024%.%.:dc=^D:dl=^W:\
+ :ei=^V:ho=^]:im=^S:kd=^K:kl=^H:kr=^X:ku=^Z:le=^H:\
+ :nd=^X:ta=^I:up=^Z:
+mm340|mime340|mime 340:\
+ :co#80:li#24:\
+ :al=46\EU:cd=2*\037:ce=2.1\EL:cl=12\032:cm=\E=%+ %+ :\
+ :cr=^M:dc=2.1*\E#:dl=49.6\EV:do=^J:is=\E\054:kb=^H:\
+ :kd=^J:kl=^H:ku=^K:le=^H:nd=^L:nw=^M^J:sf=^J:ta=^I:\
+ :up=^K:
+mt4520-rv|micro-term 4520 reverse video:\
+ :am:hs:ms:xn:xo:\
+ :co#80:it#8:li#24:ws#80:\
+ :AL=\E[%dL:DC=\E[%dP:DL=\E[%dM:DO=\E[%dB:IC=\E[%d@:\
+ :LE=\E[%dD:RA=\E[?7l:RI=\E[%dC:SA=\E[?7h:UP=\E[%dA:\
+ :al=\E[L:bl=^G:cd=\E[J:ce=\E[K:cl=\E[H\E[J:\
+ :cm=\E[%i%d;%dH:cr=^M:cs=\E[%i%d;%dr:ct=\E[g:dc=\E[P:\
+ :dl=\E[M:do=\E[B:ei=:fs=\E[?5l\E[?5h:ho=\E[H:ic=\E[@:\
+ :im=:\
+ :is=\E(B\E[2l\E>\E[20l\E[?3l\E[?5h\E[?7h\E[1;24r\E[24;1H\E[H\E[J:\
+ :k1=\EOP:k2=\EOQ:k3=\EOR:k4=\EOS:kb=^H:kd=\E[B:\
+ :kh=\E[H:kl=\E[D:kr=\E[C:ku=\E[A:le=\E[D:ll=\E[24;1H:\
+ :nd=\E[C:nw=\EE:\
+ :r1=\E(B\E[2l\E>\E[20l\E[?3l\E[?5h\E[?7h\E[H\E[J:\
+ :rc=\E8:rf=/usr/lib/tabset/vt100:sc=\E7:se=\E[0m:\
+ :sf=\ED:so=\E[7m:sr=\EM:st=\EH:ta=^I:ts=\E[25;1H:\
+ :ue=\E[24m:up=\E[A:us=\E[4m:vb=\E[?5l\E[?5h:\
+ :ve=\E[0V\E8:vs=\E7\E[0U:
+
+ergo4000|microterm ergo 4000:\
+ :da:db:ms:\
+ :co#80:li#66:\
+ :AL=\E[1L:RA=\E[?7l:SA=\E[?7m:bl=^G:cd=\E[0J:\
+ :ce=\E[0K:cl=\E[H\E[2J:cm=\E[%i%d;%dH:cr=^M:dc=\E[1P:\
+ :dl=\E[1M:do=\E[B:ei=\E[4l:im=\E[4h:\
+ :is=\E<\E=\E[?1l\E[?4l\E[?5l\E[?7h\E[?8h:k1=\EOP:\
+ :k2=\EOQ:k3=\EOR:k4=\EOS:kd=\E[B:ke=\E=:kl=\E[D:\
+ :kr=\E[C:ks=\E=:ku=\E[A:l1=pf1:l2=pf2:l3=pf3:l4=pf4:\
+ :le=^H:nd=\E[C:se=\E[m:sf=\ED:so=\E[7m:sr=\EM:ta=^I:\
+ :up=\E[A:
+
+
+ncr7900i|7900i|ncr7900|7900|ncr 7900 model 1:\
+ :am:bw:ul:\
+ :co#80:li#24:sg#1:ug#1:\
+ :bl=^G:cd=\Ek:ce=\EK:cl=^L:cm=\E1%r%.%.:cr=^M:do=^J:\
+ :is=\E0@\010\E3\E4\E7:kd=^J:kh=^A:kl=^U:kr=^F:ku=^Z:\
+ :le=^H:ll=^A:mb=\E0B:me=\E0@:mh=\E0A:mr=\E0P:nd=^F:\
+ :pf=^T:po=^R:\
+ :..sa=\E0%p5%'@'%+%p4%{2}%*%+%p3%{16}%*%+%p2%{32}%*%+%p1%{17}%*%+%c:\
+ :se=\E0@:sf=^J:so=\E0Q:ue=\E0@:up=^Z:us=\E0`:
+ncr7900iv|ncr 7900 model 4:\
+ :am:bw:es:hs:\
+ :co#80:li#24:\
+ :al=\E^N:bl=^G:cl=^L:cm=\013%+@\E\005%02:cr=^M:\
+ :dl=\E^O:do=^J:ds=\Ey1:fs=\Ek\Ey5:ho=\013@\E^E00:\
+ :k1=\ES:k2=\ET:k3=\EU:k4=\EV:k5=\EW:k6=\EP:k7=\EQ:\
+ :k8=\ER:kb=^H:kd=\EB:kh=\EH:kl=\ED:kr=\EC:ku=\EA:\
+ :l6=blue:l7=red:l8=white:le=^H:nw=^M^J:sf=^J:\
+ :ts=\Ej\Ex5\Ex1\EY8%p1%{32}%+%c\Eo:
+ncr7901|7901|ncr 7901 model:\
+ :am:bw:ul:\
+ :co#80:li#24:\
+ :bl=^G:cd=\Ek:ce=\EK:ch=\020%+^J:cl=^L:cm=\EY%+ %+ :\
+ :cr=^M:cv=\013%+@:do=^J:is=\E4^O:kC=^L:kd=^J:kh=^H:\
+ :kl=^U:kr=^F:ku=^Z:le=^H:ll=^A:mb=\E0B:me=^O:mh=\E0A:\
+ :mr=\E0P:nd=^F:pf=^T:po=^R:\
+ :..sa=\E0%p5%'@'%+%p4%{2}%*%+%p3%{16}%*%+%p2%{32}%*%+%p1%{17}%*%+%c\016:\
+ :se=^O:sf=^J:so=\E0Q\016:ue=^O:up=^Z:us=\E0`\016:\
+ :ve=^X:vi=^W:
+
+
+bantam|pe550|pe6100|perkin elmer 550:\
+ :co#80:li#24:\
+ :bl=^G:ce=\EI:cl=\EK:cm=\EX%+ \EY%+ :cr=^M:do=^J:\
+ :ho=\EH:le=^H:ll=\EH\EA:nd=\EC:sf=^J:up=\EA:
+fox|pe1100|perkin elmer 1100:\
+ :am:\
+ :co#80:li#24:\
+ :bl=^G:cd=\EJ:ce=\EI:cl=\EH\EJ:cm=\EX%+ \EY%+ :cr=^M:\
+ :ct=\E3:do=^J:ho=\EH:le=^H:ll=\EH\EA:nd=\EC:sf=^J:\
+ :st=\E1:up=\EA:vb=\020\002\020\003:
+owl|pe1200|perkin elmer 1200:\
+ :am:in:\
+ :co#80:li#24:\
+ :al=\EL:bl=^G:cd=\EJ:ce=\EI:cl=\EH\EJ:\
+ :cm=\EX%+ \EY%+ :cr=^M:ct=\E3:dc=\EO:dl=\EM:do=^J:\
+ :ei=:ho=\EH:ic=\EN:im=:ip=:k0=\ERJ:k1=\ERA:k2=\ERB:\
+ :k3=\ERC:k4=\ERD:k5=\ERE:k6=\ERF:k7=\ERG:k8=\ERH:\
+ :k9=\ERI:kb=^H:le=^H:ll=\EH\EA:nd=\EC:se=\E!\200:\
+ :sf=^J:so=\E!^H:st=\E1:up=\EA:vb=\020\002\020\003:
+pe1251|pe6300|pe6312|perkin elmer 1251:\
+ :am:\
+ :co#80:it#8:li#24:pb#300:sg#1:vt#8:\
+ :bl=^G:cd=\EJ:ce=\EI:cl=\EK:cm=\EX%+ \EY%+ :cr=^M:\
+ :ct=\E3:do=\EB:ho=\EH:k0=\ERA:k1=\ERB:k2=\ERC:\
+ :k3=\ERD:k4=\ERE:k5=\ERF:k6=\ERG:k7=\ERH:k8=\ERI:\
+ :k9=\ERJ:k;=\ERK:le=\ED:nd=\EC:sf=^J:st=\E1:up=\EA:
+pe7000m|perkin elmer 7000 series monochrome monitor:\
+ :am:\
+ :co#80:li#24:\
+ :bl=^G:bt=\E!Y:cd=\EJ:ce=\EI:cl=\EK:cm=\ES%+ %+ :\
+ :cr=^M:do=\EB:ho=\EH:i1=\E!\200\EW 7o\Egf\ES7 :\
+ :k0=\E!\200:k1=\E!^A:k2=\E!^B:k3=\E!^C:k4=\E!^D:\
+ :k5=\E!^E:k6=\E!^F:k7=\E!^G:k8=\E!^H:k9=\E!^I:\
+ :k;=\E!^J:kb=^H:kd=\E!U:kh=\E!S:kl=\E!V:kr=\E!W:\
+ :ku=\E!T:le=\ED:ll=\ES7 :nd=\EC:sf=^J:sr=\ER:up=\EA:
+pe7000c|perkin elmer 7000 series colour monitor:\
+ :i1=\E!\200\EW 7o\Egf\Eb0\Ec7\ES7 :se=\Eb0:so=\Eb2:\
+ :ue=\E!\200:us=\E! :tc=pe7000m:
+
+
+uts30|sperry uts30 with cp/m@1R1:\
+ :am:bw:hs:\
+ :co#80:li#24:ws#40:\
+ :AL=\E[%dL:DC=\E[%dP:DL=\E[%dM:DO=\E[%dB:IC=\E[%d@:\
+ :LE=\E[%dD:RA=\E[?7l:RI=\E[%dC:SA=\E[?7m:SF=\E[%dB:\
+ :SR=\E[%dA:UP=\E[%dA:ae=\Ed:al=\EN:as=\EF:bl=^G:\
+ :cd=\E[J:ce=\E[K:cl=^L:cm=\E[%i%d;%dH:cr=^M:\
+ :cs=\EU%+ %+ :dc=\EM:dl=\EL:do=\EB:ei=:fs=^M:ho=\E[H:\
+ :ic=\EO:im=:is=\E[U 7\E[24;1H:kb=^H:kd=\EOB:kh=\E[H:\
+ :kl=\EOD:kr=\EOC:ku=\EOA:le=^H:mb=\E[5m:md=\E[1m:\
+ :me=\E[m:mr=\E[7m:nd=\EC:\
+ :r2=\E>\E[?3l\E[?4l\E[?5l\E[?7h\E[?8h:rc=\EX:\
+ :rf=/usr/lib/tabset/vt100:sc=\EW:se=\E[m:sf=^J:\
+ :so=\E[7m:sr=\EI:ta=^I:ts=\E]:uc=\EPB:ue=\E[m:\
+ :up=\E[A:us=\E[4m:ve=\ES:vi=\ER:
+
+
+tandem6510|adm3a repackaged by Tandem:\
+ :tc=adm3a:
+
+tandem653|t653x|Tandem 653x multipage terminal:\
+ :am:da:db:hs:\
+ :co#80:li#24:sg#1:ug#1:ws#64:\
+ :cd=\EJ:ce=\EK:cl=\EI:cm=\023%+ %+ :do=^J:ds=\Eo\r:\
+ :fs=^M:ho=\EH:if=/usr/share/tabset/tandem653:le=^H:\
+ :nd=\EC:se=\E6 :sf=\ES:so=\E6$:sr=\ET:ts=\Eo:ue=\E6 :\
+ :up=\EA:us=\E60:
+
+
+dmterm|deskmate terminal:\
+ :am:bw:\
+ :co#80:li#24:\
+ :al=\EP:bl=^G:cd=\EJ:ce=\EK:cl=\Ej:cm=\EY%+ %+ :\
+ :cr=^M:dc=\ES:dl=\ER:do=\EB:ei=:ho=\EH:ic=\EQ:im=:\
+ :k0=\E1:k1=\E2:k2=\E3:k3=\E4:k4=\E5:k5=\E6:k6=\E7:\
+ :k7=\E8:k8=\E9:k9=\E0:kd=\EB:kh=\EH:kl=\ED:kr=\EC:\
+ :ku=\EA:l0=f1:l1=f2:l2=f3:l3=f4:l4=f5:l5=f6:l6=f7:\
+ :l7=f8:l8=f9:l9=f10:le=^H:ll=\EE:nd=\EC:se=\EG0:\
+ :sf=\EX:so=\EG4:ta=^I:up=\EA:ve=\EG6:vi=\EG5:
+dt100|dt-100|Tandy DT-100 terminal:\
+ :xo:\
+ :co#80:li#24:sg#1:ug#1:\
+ :ac=kkllmmjjnnwwvvttuuqqxx:ae=^O:al=\E[L:as=^N:bl=^G:\
+ :cd=\E[J:ce=\E[K:cl=\E[H\E[2J:cm=\010\E[%i%d;%dH:\
+ :cr=^M:cs=\E[%2;%2r:dc=\E[P:dl=\E[M:do=\E[B:ei=:\
+ :ho=\E[H:ic=\E[@:im=:is=\E[?3l\E)0\E(B:k1=\E[?3i:\
+ :k2=\E[2i:k3=\E[@:k4=\E[M:k5=\E[17~:k6=\E[18~:\
+ :k7=\E[19~:k8=\E[20~:k9=\E[21~:k;=\E[?5i:kN=\E[29~:\
+ :kP=\E[28~:kd=\E[B:kh=\E[H:kl=\E[D:kr=\E[C:ku=\E[A:\
+ :l1=f1:l2=f2:l3=f3:l4=f4:l5=f5:l6=f6:l7=f7:l8=f8:\
+ :le=^H:nd=\E[C:se=\E[m:sf=^J:so=\E[7m:sr=\EM:ta=^I:\
+ :ue=\E[m:up=\E[A:us=\E[4m:ve=\E[?25h:vi=\E[?25l:
+dt100w|dt-100w|Tandy DT-100 terminal (wide mode):\
+ :co#132:tc=dt100:
+dt110|Tandy DT-110 emulating ansi:\
+ :xo:\
+ :co#80:li#24:\
+ :@7=\E[K:ac=kkllmmjjnnwwvvuuttqqxx:ae=^O:al=\E[0L:\
+ :as=^N:bl=^G:cd=\E[0J:ce=\E[0K:cl=\E[H\E[2J:\
+ :cm=\010\E[%i%d;%dH:cr=^M:cs=\E[%i%d;%dr:dc=\E[0P:\
+ :dl=\E[0M:do=\E[0B:eA=\E(B\E)0:ei=:ho=\E[H:ic=\E[0@:\
+ :im=:is=\E[?3l\E)0\E(B:k1=\E[1~:k2=\E[2~:k3=\E[3~:\
+ :k4=\E[4~:k5=\E[5~:k6=\E[6~:k7=\E[7~:k8=\E[8~:\
+ :k9=\E[9~:k;=\E[10~:kI=\E[@:kN=\E[26~:kP=\E[25~:\
+ :kd=\E[B:kh=\E[G:kl=\E[D:kr=\E[C:ku=\E[A:l0=f1:l1=f2:\
+ :l2=f3:l3=f4:l4=f5:l5=f6:l6=f7:l7=f8:l8=f9:l9=f10:\
+ :le=^H:nd=\E[C:se=\E[m:sf=^J:so=\E[7m:sr=\EM:ta=^I:\
+ :ue=\E[m:up=\E[0A:us=\E[4m:ve=\E[?25h:vi=\E[?25l:
+pt210|TRS-80 PT-210 printing terminal:\
+ :hc:os:\
+ :co#80:\
+ :bl=^G:cr=^M:do=^J:sf=^J:
+
+
+tek|tek4012|4012|tektronix 4012:\
+ :os:\
+ :co#75:li#35:\
+ :bl=^G:cl=\E\014:cr=^M:do=^J:ff=\014:is=\E^O:le=^H:
+tek4013|4013|tektronix 4013:\
+ :ae=\E^O:as=\E^N:tc=tek4012:
+tek4014|4014|tektronix 4014:\
+ :co#81:li#38:\
+ :is=\E\017\E9:tc=tek4012:
+tek4015|4015|tektronix 4015:\
+ :ae=\E^O:as=\E^N:tc=tek4014:
+tek4014-sm|4014-sm|tektronix 4014 in small font:\
+ :co#121:li#58:\
+ :is=\E\017\E\072:tc=tek4014:
+tek4015-sm|4015-sm|tektronix 4015 in small font:\
+ :ae=\E^O:as=\E^N:tc=tek4014-sm:
+tek4023|4023|tex|tektronix 4023:\
+ :am:\
+ :co#80:li#24:vt#4:\
+ :bl=^G:cl=\E\014:cm=\034%r%+ %+ :cr=^M:do=^J:le=^H:\
+ :nd=^I:se=^_@:sf=^J:so=^_P:
+tek4024|tek4025|tek4027|tektronix 4024/4025/4027:\
+ :am:da:db:\
+ :co#80:it#8:li#34:lm#0:\
+ :AL=\037up\r\037ili %d\r:CC=^_:DL=\037dli %d\r\006:\
+ :DO=\037dow %d\r:LE=\037lef %d\r:RI=\037rig %d\r:\
+ :UP=\037up %d\r:al=\037up\r\037ili\r:bl=^G:\
+ :cd=\037dli 50\r:cl=\037era\r\n\n:cr=^M:dc=\037dch\r:\
+ :dl=\037dli\r\006:do=^F^J:ei=:ic=\037ich\r \010:im=:\
+ :is=!com 31\r\n\037sto 9 17 25 33 41 49 57 65 73\r:\
+ :ke=\037lea p2\r\037lea p4\r\037lea p6\r\037lea p8\r\037lea f5\r:\
+ :ks=\037lea p4 /h/\r\037lea p8 /k/\r\037lea p6 / /\r\037lea p2 /j/\r\037lea f5 /H/\r:\
+ :le=^H:nd=\037rig\r:sf=^F^J:ta=^I:up=^K:
+tek4025-17|4025-17|4027-17|tek 4025 17 line window:\
+ :li#17:tc=tek4025:
+tek4025-17-ws|4025-17-ws|4025-17ws|4027-17ws|4027-17-ws|tek 4025 17 line window in workspace:\
+ :is=!com 31\r\n\037sto 9 17 25 33 41 49 57 65 73\r\037wor 17\r\037mon 17\r:\
+ :se=\037att s\r:so=\037att e\r:te=\037mon h\r:\
+ :ti=\037wor h\r:tc=tek4025-17:
+tek4025-ex|tek4027-ex|tek 4025/4027 w/!:\
+ :is=\037com 33\r\n!sto 9 17 25 33 41 49 57 65 73\r:\
+ :te=\037com 33\r:ti=!com 31\r:tc=tek4025:
+tek4025a|4025a|Tektronix 4025A:\
+ :am:bw:da:db:xo:\
+ :co#80:it#8:li#34:\
+ :CC=^]:DC=\035dch %d;:DL=\035dli %d;:DO=\035dow %d;:\
+ :LE=\035lef %d;:RI=\035rig %d;:SF=\035dow %d;:\
+ :UP=\035up %d;:al=\013\035ili;:bl=^G:bt=\035bac;:\
+ :ce=\035dch 80;:ch=\r\035rig %d;:\
+ :cl=\035era;\n\035rup;:cr=^M:ct=\035sto;:dc=\035dch;:\
+ :dl=\035dli;:do=^J:le=^H:nd=\035rig;:\
+ :rs=!com 29\035del 0\035rss t\035buf\035buf n\035cle\035dis\035dup\035ech r\035eol\035era g\035for n\035pad 203\035pad 209\035sno n\035sto 9 17 25 33 41 49 57 65 73\035wor 0;:\
+ :sf=^J:ta=^I:up=^K:
+tek4025-cr|4025-cr|tek 4025 for curses and rogue:\
+ :am:\
+ :co#80:it#8:li#33:\
+ :cl=\037era;:cm=\037jum%i%d\054%d;:do=^F^J:\
+ :is=!com 31\r\n\037sto 9 17 25 33 41 49 57 65 73\r:\
+ :le=^H:nd=\037rig;:sf=^F^J:ta=^I:te=\037wor 0:\
+ :ti=\037wor 33h:up=^K:
+tek4025ex|4025ex|4027ex|tek 4025 w/!:\
+ :is=\037com 33\r\n!sto 9\05417\05425\05433\05441\05449\05457\05465\05473\r:\
+ :te=\037com 33\r:ti=!com 31\r:tc=tek4025:
+tek4105|4105|tektronix 4105:\
+ :am:mi:ms:ul:xn:xt:\
+ :co#79:it#8:li#29:\
+ :ae=\E[m:al=\E[1L:as=\E[1m:bl=^G:bt=\E[Z:cd=\E[J:\
+ :ce=\E[K:cl=\E[2J\E[H:cm=\E[%i%2;%2H:cr=^M:ct=\E[1g:\
+ :dc=\E[1P:dl=\E[1M:do=\E[1B:ei=\E[4l:ho=\E[H:\
+ :i1=\E%!1\E[m:im=\E[4h:is=\E%!1\E[?6141\E[m:kb=^H:\
+ :kd=\E[1B:kl=\E[1D:kr=\E[1C:ku=\E[1A:mb=\E[=3;<7m:\
+ :md=\E[=7;<4m:me=\E[=0;<1m:mh=\E[=1;<6m:mk=\E[=6;<5:\
+ :mr=\E[=1;<3m:nd=\E[1C:se=\E[=0;<1m:sf=\E[S:\
+ :so=\E[=2;<3m:sr=\E[T:ta=^I:ti=\E%!1\E[?6l\E[2J:\
+ :ue=\E[=0;<1m:up=\E[1A:us=\E[=5;<2m:
+
+tek4105-30|4105-30|4015 emulating 30 line vt100:\
+ :am:mi:ms:xn:xo:\
+ :co#80:it#8:li#30:vt#3:\
+ :@8=\EOM:DO=\E[%dB:K1=\EOq:K2=\EOr:K3=\EOs:K4=\EOp:\
+ :K5=\EOn:LE=\E[%dD:RA=\E[?7l:RI=\E[%dC:SA=\E[?7h:\
+ :UP=\E[%dA:\
+ :ac=``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~:\
+ :ae=^O:as=^N:bl=^G:cb=\E[1K:cd=\E[J:ce=\E[K:\
+ :cl=\E[H\E[J:cm=\E[%i%d;%dH:cr=^M:cs=\E[%i%d;%dr:\
+ :ct=\E[3g:do=^J:eA=\E(B\E)0:ho=\E[H:k0=\EOy:k1=\EOP:\
+ :k2=\EOQ:k3=\EOR:k4=\EOS:k5=\EOt:k6=\EOu:k7=\EOv:\
+ :k8=\EOl:k9=\EOw:k;=\EOx:kb=^H:kd=\EOB:ke=\E[?1l\E>:\
+ :kl=\EOD:kr=\EOC:ks=\E[?1h\E=:ku=\EOA:le=^H:mb=\E[5m:\
+ :md=\E[1m:me=\E[m\017:mr=\E[7m:nd=\E[C:\
+ :r2=\E>\E[?3l\E[?4l\E[?5l\E[?7h\E[?8h:rc=\E8:\
+ :..sa=\E[0%?%p1%p6%|%t;1%;%?%p2%t;4%;%?%p1%p3%|%t;7%;%?%p4%t;5%;m%?%p9%t\016%e\017%;:\
+ :sc=\E7:se=\E[m:sf=^J:so=\E[1;7m:sr=\EM:st=\EH:ta=^I:\
+ :ue=\E[m:up=\E[A:us=\E[4m:
+
+tek4107|tek4109|4107|4109|tektronix terminals 4107 4109:\
+ :am:mi:ms:ul:xn:xt:\
+ :co#79:it#8:li#29:\
+ :bl=^G:cd=\EJ:ce=\EK:cl=\ELZ:cm=\EY%+ %+ :cr=^M:\
+ :do=^J:kb=^H:kd=\EB:kl=\ED:kr=\EC:ku=\EA:le=^H:\
+ :mb=\E%!1\E[5m\E%!0:md=\E%!1\E[1m\E%!0:\
+ :me=\E%!1\E[m\E%!0:mh=\E%!1\E[<0m\E%!0:\
+ :mr=\E%!1\E[7m\E%0:nd=\EC:\
+ :..sa=\E%%!1\E[%?%p1%t;7%;%?%p2%t;4%;%?%p3%t;7%;%?%p4%t;5%;%?%p6%t;1%;m\E%%!0:\
+ :se=\E%!1\E[m\E%!0:sf=^J:so=\E%!1\E[7;5m\E%!0:sr=\EI:\
+ :ta=^I:ue=\E%!1\E[m\E%!0:up=\EA:us=\E%!1\E[4m\E%!0:\
+ :ve=\E%!0:vs=\E%!3:
+tek4207-s|Tektronix 4207 with sysline but no memory:\
+ :es:hs:\
+ :ds=\E7\E[?6l\E[2K\E[?6h\E8:fs=\E[?6h\E8:\
+ :i1=\E%!1\E[2;32r\E[132D\E[2g\EH\E[8C\EH\E[8C\EH\E[8C\EH\E[8C\EH\E[8C\EH\E[8C\EH\E[8C\EH\E[8C\EH\E[8C\EH\E[J:\
+ :is=\E7\E[?6l\E[2K\E[?6h\E8:\
+ :ts=\E7\E[?6l\E[2K\E[;%i%df:tc=tek4107:
+
+otek4112|o4112-nd|otek4113|otek4114|old tektronix 4110 series:\
+ :am:\
+ :co#80:li#34:\
+ :bl=^G:cl=\E^L:cr=^M:do=^J:le=^H:sf=^J:te=\EKA1\ELV1:\
+ :ti=\EKA0\ELV0\EMG0:up=^K:
+tek4112|tek4114|tektronix 4110 series:\
+ :am:db:\
+ :co#80:li#34:\
+ :al=\E[L:bt=\E[Z:cd=\E[0J:ce=\E[0K:cl=\E[2J\E[0;0H:\
+ :cm=\E[%i%d;%dH:dc=\E[P:dl=\E[M:ei=:ic=\E[@:im=:\
+ :is=\E3!1:le=^H:nd=\E[C:se=\E[m:sf=\E7\E[0;0H\E[M\E8:\
+ :so=\E[7m:sr=\E7\E[0;0H\E[L\E8:ue=\E[m:up=\EM:\
+ :us=\E[4m:
+tek4112-nd|4112-nd|4112 not in dialog area:\
+ :ns:\
+ :up=^K:tc=tek4112:
+tek4112-5|4112-5|4112 in 5 line dialog area:\
+ :li#5:tc=tek4112:
+tek4113|tektronix 4113 color graphics with 5 line dialog area:\
+ :am:da:eo:\
+ :co#80:li#5:\
+ :cl=\ELZ:do=^J:is=\EKA1\ELL5\ELV0\ELV1:le=^H:\
+ :nd=\ELM1 \ELM0:uc=\010\ELM1_\ELM0:\
+ :vb=\ERBA4\ERBA4\ERBA4\ERBA4\ERBA4\ERBA4\ERBA4\ERBA4\ERBA4\ERBA4\ERB0:
+tek4113-34|4113-34|tektronix 4113 color graphics with 34 line dialog area:\
+ :li#34:\
+ :is=\EKA1\ELLB2\ELV0\ELV1:tc=tek4113:
+tek4113-nd|4113-nd|tektronix 4113 color graphics with no dialog area:\
+ :am:eo:\
+ :co#80:it#8:li#34:\
+ :cl=\E^L:do=^J:ho=\ELF7l\177 @:\
+ :is=\ELZ\EKA0\ELF7l\177 @:le=^H:ll=\ELF hl @:nd=^I:\
+ :se=\EMT1:so=\EMT2:ta=^I:uc=\010\EMG1_\EMG0:up=^K:\
+ :vb=\ERBA4\ERBA4\ERBA4\ERBA4\ERBA4\ERBA4\ERBA4\ERBA4\ERBA4\ERBA4\ERB0:\
+ :vs=\ELZ\EKA0:
+otek4115|Tektronix 4115:\
+ :am:bs:da:db:eo:\
+ :co#80:it#8:li#34:\
+ :RA=\E[?7l:SA=\E[?7h:al=\E[L:bt=\E[Z:cd=\E[J:ce=\E[K:\
+ :cl=\E[H\E[2J:cm=\E[%i%d;%dH:dc=\E[P:dl=\E[M:do=\E[B:\
+ :ei=\E[4l:ho=\E[H:if=/usr/share/tabset/vt100:\
+ :im=\E[4h:\
+ :is=\E%!0\E%\014\ELV0\EKA1\ELBB2\ENU@=\ELLB2\ELM0\ELV1\EKYA?\E%!1\E[<1l\E[?7h\E[?8h\E[34;1H\E[34B\E[m:\
+ :kb=^H:ke=\E>:ks=\E=:le=\E[D:nd=\E[C:se=\E[m:\
+ :so=\E[7m:sr=\EM:ta=^I:\
+ :te=\E%!0\ELBG8\E%!1\E[34;1H\E[J:ti=\E%!0\ELBB2\E%!1:\
+ :ue=\E[m:up=\E[A:us=\E[4m:\
+ :ve=\E%!0\ELBG8\E%!1\E[34;1H:vs=\E%!0\ELBB2\E%!1:
+tek4115|newer tektronix 4115 entry with more ANSI capabilities:\
+ :am:xo:\
+ :co#80:li#34:\
+ :AL=\E[%dL:DL=\E[%dM:DO=\E[%dB:IC=\E[%d@:LE=\E[%dD:\
+ :RA=\E[?7l:RI=\E[%dC:SA=\E[?7h:UP=\E[%dA:al=\E[L:\
+ :bl=^G:bt=\E[Z:cd=\E[J:ce=\E[K:ch=\E[%+^AG:\
+ :cl=\E[H\E[J:cm=\E[%i%d;%dH:cr=^M:ct=\E[2g:\
+ :cv=\E[%+^Ad:dc=\E[P:dl=\E[M:do=^J:ei=:ho=\E[H:\
+ :ic=\E[@:im=:kb=^H:kd=\E[B:kh=\E[H:kl=\E[D:kr=\E[C:\
+ :ku=\E[A:le=^H:mb=\E[5m:md=\E[1m:me=\E[m:mk=\E[8m:\
+ :mr=\E[7m:nd=\E[C:..rp=%p1%c\E[%p2%{1}%-%db:\
+ :..sa=\E[%?%p1%t7;%;%?%p2%t4;%;%?%p3%t7;%;%?%p4%t5;%;%?%p6%t1;%;m:\
+ :se=\E[m:sf=^J:so=\E[7m:st=\EH:ta=^I:ue=\E[m:up=\E[A:\
+ :us=\E[4m:
+tek4125|tektronix 4125:\
+ :li#34:\
+ :al=\E[1L:cs@:dl=\E[1M:im=\E1:\
+ :is=\E%\E!0\EQD1\EUX03\EKA\ELBB2\ELCE0\ELI100\ELJ2\ELLB2\ELM0\ELS1\ELX00\ELV1\E%\E!1\E>\E[?3l\E[?4l\E[?5l\E[?7h\E[?8h:\
+ :ks=\E=:rc@:sc@:tc=vt100:
+
+tek4207|Tektronix 4207 graphics terminal with memory:\
+ :am:bw:mi:ul:xn:\
+ :co#80:it#8:li#32:\
+ :al=3\E[L:bt=\E[Z:cd=\E[J:ce=5\E[K:cl=156\E[H\E[J:\
+ :cm=\E[%i%d;%dH:dc=4\E[P:dl=3\E[M:do=^J:ei=:ho=\E[H:\
+ :ic=4\E[@:im=:\
+ :is=\E%!0\ELBP0\E%!1\E[H\E[2g\EH\E[8C\EH\E[8C\EH\E[8C\EH\E[8C\EH\E[8C\EH\E[8C\EH\E[8C\EH\E[8C\EH\E[8C\EH\E[J:\
+ :kd=\ED:kh=\E[H:kl=\E[D:kr=\E[C:ku=\EM:le=^H:\
+ :mb=\E[5m:md=\E[1m:me=\E[m:mr=\E[7m:nd=\E[C:se=\E[m:\
+ :so=\E[7m:ta=^I:te=\E[?6h\E%!0\ELBP0\E%!1\E[32;1f:\
+ :ti=\E[?6l\E[H\E[J:ue=\E[m:up=\EM:us=\E[4m:
+
+tek4404|tektronix 4404:\
+ :co#80:it#8:li#32:\
+ :al=\E[1L:cd=\E[J:ce=\E[K:cl=\E[H\E[2J:\
+ :cm=\E[%i%d;%dH:cs=\E[%i%d;%dr:dc=\E[P:dl=\E[1M:\
+ :do=^J:ei=\E[4l:ho=\E[H:im=\E[4h:kd=\E[B:ke=\E[?1h:\
+ :kl=\E[D:kr=\E[C:ks=\E[?1l:ku=\E[A:le=^H:mb=\E[5m:\
+ :md=\E[1m:me=\E[m:nd=\E[C:rc=\E8:sc=\E7:se=\E[27m:\
+ :so=\E[7m:st=\E[2I:ta=^I:te=\E[1;1H\E[0J\E[?6h\E[?1l:\
+ :ti=\E%\E!1\E[1;32r\E[?6l\E>:ue=\E[m:up=\E[A:\
+ :us=\E[4m:
+ct8500|tektronix ct8500:\
+ :am:bw:da:db:\
+ :co#80:li#25:\
+ :al=\E^L:bl=^G:bt=\E^I:cd=\E^U:ce=\E^T:cl=\E^E:\
+ :cm=\E|%+ %+ :cr=^M:dc=\E^]:dl=\E^M:do=^J:ei=:\
+ :ic=\E^\:im=:is=\037\EZ\Ek:le=^H:me=\E :nd=\ES:\
+ :se=\E :sf=^J:so=\E$:sr=\E^A:ta=^I:ue=\E :up=\ER:\
+ :us=\E!:
+
+tek4205|4205|tektronix 4205:\
+ :cc:mi:ms:\
+ :Co#8:NC#49:co#80:it#8:li#30:pa#63:\
+ :AL=\E[%dL:DO=\E[%dB:IC=\E[%d@:LE=\E[%dD:RI=\E[%dC:\
+ :UP=\E[%dA:\
+ :ac=``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~:\
+ :ae=^O:al=\E[1L:as=^N:bl=^G:bt=\E[Z:cb=\E[1K:cd=\E[J:\
+ :ce=\E[K:cl=\E[2J\E[H:cm=\E[%i%d;%dH:cr=^M:ct=\E[1g:\
+ :dc=\E[1P:dl=\E[1M:do=\E[B:eA=\E)0:ec=\E%dX:ei=\E[4l:\
+ :ho=\E[H:i1=\E%!0\ETM1\E%!1\E[m:im=\E[4h:k0=\EOA:\
+ :k1=\EOB:k2=\EOC:k3=\EOD:k4=\EP:k5=\EQ:k6=\ER:k7=\ES:\
+ :kb=^H:kd=\E[B:kl=\E[D:kr=\E[C:ku=\E[A:le=\E[D:\
+ :mb=\E[5m:md=\E[=7;<4m:me=\E[=0;<1m\E[24;25;27m\017:\
+ :mh=\E[=1;<6m:mk=\E[=6;<5:mr=\E[7m:nd=\E[C:\
+ :oc=\E%!0\n\ETFB0\n0000\n1F4F4F4\n2F400\n30F40\n4A4C<F4\n50F4F4\n6F40F4\n7F4F40\n\E%!1:\
+ :op=\E[39;40m:se=\E[=0;<1m:sf=\ED:so=\E[=2;<3m:\
+ :sr=\EM:ta=^I:ti=\E%%!1\E[?6l\E[2J:ue=\E[24m:up=\E[A:\
+ :us=\E[4m:
+
+
+tty33|tty35|model 33 or 35 teletype:\
+ :hc:os:xo:\
+ :co#72:\
+ :bl=^G:cr=^M:do=^J:sf=^J:
+tty37|model 37 teletype:\
+ :hc:os:xo:\
+ :bl=^G:cr=^M:do=^J:hd=\E9:hu=\E8:le=^H:sf=^J:up=\E7:
+
+tty40|ds40|ds40-2|dataspeed40|teletype dataspeed 40/2:\
+ :xo:\
+ :co#80:li#24:\
+ :al=\EL:cd=\EJ:cl=\EH\EJ:cr=\EG:ct=\EH\E2:dc=\EP:\
+ :dl=\EM:do=\EB:ei=:ho=\EH:ic=\E^:im=:kb=^]:kl=^H:\
+ :le=^H:nd=\EC:pf=^T:po=\022:r2=\023\ER:se=\E4:sf=\ES:\
+ :so=\E3:sr=\ET:st=\E1:ta=\E@:up=\E7:
+tty43|model 43 teletype:\
+ :am:hc:os:xo:\
+ :co#132:\
+ :bl=^G:cr=^M:do=^J:kb=^H:le=^H:sf=^J:
+
+
+scanset|sc410|sc415|Tymshare Scan Set:\
+ :am:bw:ms:\
+ :co#80:li#24:\
+ :ac=l<m-k4j%q\\\054x5:ae=^O:as=^N:bl=^G:cd=\EJ:\
+ :ce=\EK:cl=\EH\EJ:cm=\EY%+ %+ :cr=^M:do=^J:ho=\EH:\
+ :kd=\EB:kl=\ED:kr=\EC:ku=\EA:le=^H:nd=^I:pf=\E;0:\
+ :po=\E;0:ps=\E;3:r1=\E>:rc=^C:sc=^B:sf=^J:up=^K:
+
+
+vc303|vc103|vc203|volker-craig 303:\
+ :am:ns:\
+ :co#80:li#24:\
+ :bl=^G:cl=\014:cr=^M:do=^J:ho=\013:kd=^J:kl=^H:kr=^I:\
+ :ku=^N:le=^H:ll=\017W:nd=^I:up=^N:
+vc303a|vc403a|volker-craig 303a:\
+ :ce=\026:cl=\030:ho=\031:kr=^U:ku=^Z:ll=^P:nd=^U:\
+ :up=^Z:tc=vc303:
+vc404|volker-craig 404:\
+ :am:\
+ :co#80:li#24:\
+ :bl=^G:cd=\027:ce=\026:cl=\030:cm=\020%+ %+ :cr=^M:\
+ :do=^J:ho=\031:kd=^J:kl=^H:kr=^U:ku=^Z:le=^H:nd=^U:\
+ :sf=^J:up=^Z:
+vc404-s|volker-craig 404 w/standout mode:\
+ :do=^J:se=^O:so=^N:tc=vc404:
+vc414|vc414h|Volker-Craig 414H in sane escape mode.:\
+ :am:bs:\
+ :co#80:li#24:\
+ :al=\E\032:cd=\E^X:ce=10\E\017:cl=\E\034:\
+ :cm=\E\021%r%.%.:dc=\E3:dl=\E\023:do=\E^K:ei=:\
+ :ho=\E^R:ic=\E\072:im=:k0=\EA:k1=\EB:k2=\EC:k3=\ED:\
+ :k4=\EE:k5=\EF:k6=\EG:k7=\EH:kd=\E^K:kh=\E^R:kl=^H:\
+ :kr=^P:ku=\E^L:l0=PF1:l1=PF2:l2=PF3:l3=PF4:l4=PF5:\
+ :l5=PF6:l6=PF7:l7=PF8:nd=^P:se=\E^_:so=\E^Y:up=\E^L:
+vc415|volker-craig 415:\
+ :cl=^L:tc=vc404:
+
+
+
+pcplot|pc-plot terminal emulation program:\
+ :xn@:\
+ :AL@:DL@:al@:cs@:dl@:rc@:sc@:tc=vt100:
+kaypro|kaypro2|kaypro II:\
+ :am:\
+ :co#80:li#24:\
+ :cl=1\032:cm=\E=%+ %+ :ho=^^:kd=^J:kl=^H:kr=^L:ku=^K:\
+ :le=^H:nd=^L:up=^K:
+
+ibmpc|ibm-pc|ibm5051|5051|IBM Personal Computer (no ANSI.SYS):\
+ :am:\
+ :co#80:li#24:\
+ :bl=^G:cl=^L^K:cr=^M^^:do=^J:ho=^K:im=\200R:kd=^_:\
+ :le=^]:nd=^\:sf=\n:up=^^:
+
+
+appleII|apple ii plus:\
+ :am:\
+ :co#80:it#8:li#24:\
+ :cd=^K:ce=^]:cl=^L:cm=\036%r%+ %+ :do=^J:ho=\E^Y:\
+ :is=\024T1\016:kd=^J:kr=^U:le=^H:nd=^\:se=^N:so=^O:\
+ :ta=^I:up=^_:vb=\024G1\024T1:ve=^TC2:vs=^TC6:
+apple-80|apple II with smarterm 80 col:\
+ :am:bw:\
+ :co#80:li#24:\
+ :bt=^R:cd=10*\013:ce=10\035:cl=10*\014:\
+ :cm=\036%r%+ %+ :cr=10*\r:do=^J:ho=^Y:le=^H:nd=^\:\
+ :up=^_:
+apple-soroc|apple emulating soroc 120:\
+ :am:\
+ :co#80:li#24:\
+ :bl=^G:cd=\EY:ce=\ET:cl=\E*:cm=\E=%+ %+ :cr=^M:do=^J:\
+ :ho=^^:kd=^J:kl=^H:kr=^L:ku=^K:le=^H:nd=^L:sf=^J:\
+ :up=^K:
+apple-videx|Apple with videx videoterm 80 column board with inverse video:\
+ :am:xn:\
+ :co#80:it#8:li#24:\
+ :cd=^K:ce=^]:cl=300\014:cm=\036%r%+ %+ :do=^J:ho=^Y:\
+ :kd=^J:kh=^Y:kl=^H:kr=^U:le=^H:nd=^\:se=^Z2:so=^Z3:\
+ :ta=^I:up=^_:
+lisa|apple lisa console display (black on white):\
+ :am:eo:ms:\
+ :co#88:it#8:li#32:\
+ :ac=lfmekcjdttuvvuwsqax`nb:ae=\E[10m:al=\E[L:\
+ :as=\E[11m:cd=\E[J:ce=\E[K:cl=^L:cm=\E[%i%d;%dH:\
+ :dc=\E[P:dl=\E[M:do=\E[B:ei=:ho=\E[H:ic=\E[@:im=:\
+ :is=\E>\E[m\014:kb=^H:kd=\E[B:kl=\E[D:kr=\E[C:\
+ :ku=\E[A:le=^H:nd=\E[C:se=\E[m:so=\E[7m:ta=^I:\
+ :ue=\E[m:up=\E[A:us=\E[4m:vi=\E[5h:vs=\E[5l:
+liswb|apple lisa console display (white on black):\
+ :is=\E>\E[0;7m\014:se=\E[0;7m:so=\E[m:ue=\E[0;7m:\
+ :us=\E[4m:tc=lisa:
+mac|macintosh|Macintosh with MacTerminal:\
+ :xn:\
+ :dN#30:\
+ :al=20\E[L:dc=7\E[P:dl=20\E[M:ei=:ic=9\E[@:im=:ip=7:tc=vt100:
+
+
+coco3|os9LII|Tandy CoCo3 24*80 OS9 Level II:\
+ :am:\
+ :co#80:it#8:li#24:\
+ :al=^_0:bl=^G:cd=^K:ce=^D:cl=5*\014:cm=2\002%r%+ %+ :\
+ :dl=^_1:do=^J:ho=^A:kd=^J:kl=^H:kr=^I:ku=^L:le=^H:\
+ :mb=^_":md=\E\072^A:me=\037!\E\072\200:mr=^_ :nd=^F:\
+ :se=^_!:so=^_ :ue=^_#:up=^I:us=^_":ve=^E!:vi=^E :
+trs2|trsII|trs80II|Radio Shack Model II using P&T CP/M:\
+ :am:ms:\
+ :co#80:it#8:li#24:\
+ :al=^D:bl=^G:cd=^B:ce=^A:cl=^L:cm=\EY%+ %+ :cr=^M:\
+ :dl=^K:do=^_:ho=^F:kb=^H:kd=^_:kl=^\:kr=^]:ku=^^:\
+ :le=^H:nd=^]:se=^O:sf=^J:so=^N:ta=^I:up=^^:
+trs16|trs-80 model 16 console:\
+ :am:\
+ :co#80:it#8:li#24:\
+ :ac=l_mbk`javewcquxs:ae=\ERg:al=\EL:as=\ERG:bl=^G:\
+ :cd=\EJ:ce=\EK:cl=^L:cm=\EY%+ %+ :cr=^M:dc=\EQ:\
+ :dl=\EM:do=\EB:ei=:ho=\EH:ic=\EP:im=:k0=^A:k1=^B:\
+ :k2=^D:k3=^L:k4=^U:k5=^P:k6=^N:k7=^S:kb=^H:kd=\EB:\
+ :kh=^W:kl=\ED:kr=\EC:ku=\EA:l0=f1:l1=f2:l2=f3:l3=f4:\
+ :l4=f5:l5=f6:l6=f7:l7=f8:le=^H:nd=\EC:pf=\E]+:\
+ :po=\E]=:se=\ER@:sf=^J:so=\ERD:ta=^I:up=\EA:ve=\ERC:\
+ :vi=\ERc:
+
+
+atari|atari st:\
+ :am:\
+ :co#80:it#8:li#25:\
+ :al=\EL:cd=\EJ:ce=\EK:cl=\EH\EJ:cm=\EY%+ %+ :dl=\EM:\
+ :do=\EB:kd=\EB:kl=\ED:kr=\EC:ku=\EA:le=\ED:nd=\EC:\
+ :se=\Eq:so=\Ep:sr=\EI:ta=^I:up=\EA:
+uniterm|uniterm49|UniTerm VT220 emulator with 49 lines:\
+ :li#49:\
+ :is=\E>\E[?3l\E[?4l\E[?5l\E[?7h\E[?8h\E[1;49r\E[49;1H:tc=vt220:
+
+
+amiga|Amiga ANSI:\
+ :am:bs:bw:xn:\
+ :co#80:li#24:\
+ :AL=\E[%dL:DC=\E[%dP:DL=\E[%dM:DO=\E[%dB:IC=\E[%d@:\
+ :LE=\E[%dD:RI=\E[%dC:SF=\E[%dS:SR=\E[%dT:UP=\E[%dA:\
+ :ae=^O:al=\E[L:as=^N:bl=^G:bt=\E[Z:cd=\E[J:ce=\E[K:\
+ :cl=\E[H\E[J:cm=\E[%i%d;%dH:dc=\E[P:dl=\E[M:do=\E[B:\
+ :ei=:ho=\E[H:ic=\E[@:im=:is=\E[20l:k0=\E9~:k1=\E0~:\
+ :k2=\E1~:k3=\E2~:k4=\E3~:k5=\E4~:k6=\E5~:k7=\E6~:\
+ :k8=\E7~:k9=\E8~:kb=^H:kd=\EB:kl=\ED:kr=\EC:ku=\EA:\
+ :le=\E[D:mb=\E[7;2m:md=\E[1m:me=\E[m:mh=\E[2m:\
+ :mk=\E[8m:mr=\E[7m:nd=\E[C:r1=\Ec:se=\E[m:sf=\E[S:\
+ :so=\E[7m:sr=\E[T:ue=\E[m:up=\E[A:us=\E[4m:ve=\E[ p:\
+ :vi=\E[0 p:
+
+ozzie|osborne|osborne1|osborne 1:\
+ :ms:ul:xt:\
+ :co#104:li#24:\
+ :al=\EE:bl=^G:ce=\ET:cl=^Z:cm=\E=%+ %+ :cr=^M:dc=\EW:\
+ :dl=\ER:do=^J:ei=:ic=\EQ:im=:kd=^J:kl=^H:kr=^L:ku=^K:\
+ :le=^H:nd=^L:se=\E(:sf=^J:so=\E):ue=\Em:up=^K:us=\El:
+
+
+minix|minix console:\
+ :co#80:it#8:li#25:\
+ :AL=\E[%dLce=\E[K:DC=\E[%dP:DL=\E[%dM:DO=\E[%dB:\
+ :IC=\E[%d@:LE=\E[%dD:RI=\E[%dC:UP=\E[%dA:al=\E[L:\
+ :cd=\E[0J:cl=\E[H\E[0J:cm=\E[%i%d;%dH:cr=^M:dc=\E[P:\
+ :dl=\E[M:do=\E[B:ei=:ho=\E[H:ic=\E[@:im=:k0=\E[Y:\
+ :k1=\E[V:k2=\E[U:k3=\E[T:k4=\E[S:k5=\E[G:kb=^H:\
+ :kd=\E[B:kh=\E[H:kl=\E[D:kr=\E[C:ku=\E[A:le=^H:\
+ :mb=\E[5m:md=\E[1m:me=\E[0m:mr=\E[7m:nd=\E[C:nw=^M^J:\
+ :se=\E[0m:sf=^J:so=\E[7m:sr=\EM:ta=^I:ue=\E[0m:\
+ :up=\E[A:us=\E[4m:
+
+pc-coherent|pcz19|coherent|IBM PC console running Coherent:\
+ :am:mi:\
+ :co#80:it#8:li#25:\
+ :bl=^G:cd=\EJ:ce=\EK:cl=\EE:cm=\EY%+ %+ :cr=^M:\
+ :dc=\EN:do=\EB:ei=\EO:ho=\EH:im=\E@:kb=^H:kd=\EB:\
+ :kh=\EH:kl=\ED:kr=\EC:ku=\EA:le=^H:nd=\EC:se=\Eq:\
+ :sf=^J:so=\Ep:sr=\EI:ta=^I:up=\EA:
+
+pc-venix|venix|IBM PC console running Venix:\
+ :co#80:it#8:li#25:\
+ :al=\EL:bl=^G:cd=\EJ:ce=\EK:cl=\EH\EJ:cm=\EY%+ %+ :\
+ :cr=^M:dl=\EM:do=^J:kb=^H:kd=\EP:kh=\EG:kl=\EK:\
+ :kr=\EM:ku=\EH:le=^H:nd=\EC:sf=^J:sr=\EI:ta=^I:\
+ :up=\EA:
+
+
+basis|BASIS108 computer with terminal translation table active:\
+ :cd=\EY:ce=\ET:cl=300\E*:do=5000\n:kb=^H:kd=^J:kl=^H:\
+ :kr=^L:ku=^K:se=\E):so=\E(:tc=adm3a:
+luna|luna68k|LUNA68K Bitmap console:\
+ :co#88:li#46:tc=ansi-mini:
+megatek|pegasus workstation terminal emulator:\
+ :am:os:\
+ :co#83:li#60:
+xerox820|x820|Xerox 820:\
+ :am:\
+ :co#80:li#24:\
+ :bl=^G:cd=^Q:ce=^X:cl=1^Z:cm=\E=%+ %+ :cr=^M:do=^J:\
+ :ho=^^:le=^H:nd=^L:sf=^J:up=^K:
+
+
+m2-nam|minitel|minitel-2|minitel-2-nam|France Telecom Minitel:\
+ :xn:\
+ :co#80:it#8:li#24:\
+ :ae=\E(B:al=\E[L:as=\E(0:cd=\E[J:ce=\E[K:cl=\E[H\E[J:\
+ :cm=\E[%i%d;%dH:dc=\E[P:dl=\E[M:ei=\E[4l:ho=\E[H:\
+ :im=\E[4h:ip=7:is=\E[1;24r\E[24;1H:k1=\EOP:k2=\EOQ:\
+ :k3=\EOR:k4=\EOS:kd=\E[B:kh=\E[H:kl=\E[D:kr=\E[C:\
+ :ku=\E[A:le=^H:nd=\E[C:se=\E[m:sf=^J:so=\E[7m:sr=\EM:\
+ :ta=^I:ue=\E[m:up=\E[A:us=\E[4m:
+
+
+
+abm80|amtek business machines 80:\
+ :am:bw:\
+ :co#80:li#24:\
+ :al=\E^Z:bt=^T:cd=\E^X:ce=\E^O:cl=\E^\:\
+ :cm=\E\021%r%+ %+ :dl=\E^S:do=\E^K:ho=\E^R:le=^H:\
+ :nd=^P:up=\E^L:
+
+
+blit|jerq|blit running teletype rom:\
+ :am:eo:ul:xo:\
+ :co#87:it#8:li#72:\
+ :AL=\EF%+ :DC=\Ee%+ :DL=\EE%+ :IC=\Ef%+ :al=\EF!:\
+ :bl=^G:ce=\EK:cl=^L:cm=\EY%r%+ %+ :cr=^M:dc=\Ee!:\
+ :dl=\EE!:do=^J:ei=:ic=\Ef!:im=:k1=\Ex:k2=\Ey:k3=\Ez:\
+ :kb=^H:kd=\EB:kl=\ED:kr=\EC:ku=\EA:le=\ED:nd=\EC:\
+ :sf=^J:ta=^I:up=\EA:
+
+cbblit|fixterm|blit running columbus code:\
+ :co#88:\
+ :cd=\EJ:ei=\ER:ic@:im=\EQ:pO=\EP%03:pf=^T:po=^R:\
+ :se=\EV!:so=\EU!:ue=\EV":us=\EU":vb=\E^G:tc=blit:
+
+oblit|ojerq|first version of blit rom:\
+ :am:da:db:eo:mi:ul:xo:\
+ :co#88:it#8:li#72:\
+ :AL=\Ef%+ :DL=\Ee%+ :al=\EF:bl=^G:cd=\EJ:ce=\EK:\
+ :cl=^L:cm=\EY%r%+ %+ :cr=^M:dc=\EO:dl=\EE:do=^J:\
+ :ei=\ER:im=\EQ:kb=^H:le=\ED:nd=\EC:sf=^J:ta=^I:\
+ :up=\EA:vb=\E^G:
+
+
+
+bitgraph|bg2.0nv|bg3.10nv|bbn bitgraph 2.0 or later (normal video):\
+ :is=\E>\E[?5l\E[?7h:vb=\E[?5h\E[?5l:tc=bg2.0:
+bg2.0rv|bg3.10rv|bbn bitgraph 2.0 (reverse video):\
+ :is=\E>\E[?5h\E[?7h:vb=\E[?5l\E[?5h:tc=bg2.0:
+bg2.0|bg3.10|bbn bitgraph 2.0 or later (no init):\
+ :xn:\
+ :co#85:li#64:\
+ :al=\E[L:bl=^G:cd=\E[J:ce=\E[K:cl=\E[H\E[J:\
+ :cm=%i\E[%d;%dH:cr=^M:cs=\E[%i%d;%dr:dl=\E[M:do=\E[B:\
+ :k1=\EOP:k2=\EOQ:k3=\EOR:k4=\EOS:kd=\E[B:ke=\E>:\
+ :kl=\E[D:kr=\E[C:ks=\E=:ku=\E[A:l1=PF1:l2=PF2:l3=PF3:\
+ :l4=PF4:le=^H:nd=\E[C:rc=\E8:sc=\E7:se=\E[m:sf=\n:\
+ :so=\E[7m:ta=^I:up=\E[A:
+
+bg1.25rv|bbn bitgraph 1.25 (reverse video):\
+ :is=\E>\E[?5h\E[?7h:vb=\E[?5l\E[?5h:tc=bg1.25:
+bg1.25nv|bbn bitgraph 1.25 (normal video):\
+ :is=\E>\E[?5l\E[?7h:vb=\E[?5h\E[?5l:tc=bg1.25:
+bg1.25|bbn bitgraph 1.25:\
+ :co#85:li#64:\
+ :RA=\E[?7l:SA=\E[?7h:al=\E[L:bl=^G:cd=\E[J:ce=\E[K:\
+ :cl=\E[H\E[J:cm=%i\E[%d;%dH:cr=^M:dl=\E[M:do=\E[B:\
+ :k1=\EP:k2=\EQ:k3=\ER:k4=\ES:kd=\EB:ke=\E>:kl=\ED:\
+ :kr=\EC:ks=\E=:ku=\EA:l1=PF1:l2=PF2:l3=PF3:l4=PF4:\
+ :le=^H:ll=\E[64;1H:nd=\E[C:se=\E[m:sf=\n:so=\E[7m:\
+ :ta=^I:up=\E[A:
+
+
+cg7900|chromatics|chromatics 7900:\
+ :am:\
+ :co#80:li#40:\
+ :al=^A>2:bl=^G:cd=^Al:ce=^A`:cl=^L:\
+ :cm=\001M%r%d\\\054%d\\\054:cr=^M:dc=^A<1:dl=^A<2:\
+ :do=^J:ei=:ho=^\:ic=^A>1:im=:le=^H:ll=^A|:nd=^]:\
+ :se=\001C1\\\054\001c2\\\054:sf=^J:\
+ :so=\001C4\\\054\001c7\\\054:\
+ :te=\001W0\\\05440\\\05485\\\05448\\\054\014\001W0\\\0540\\\05485\\\05448\\\054\001M0\\\05440\\\054:\
+ :ti=\001P0\001O1\001R1\001C4\\\054\001c0\\\054\014\001M0\\\05442\\\054WARNING DOUBLE ENTER ESCAPE and \025\001C1\\\054\001c2\\\054\001W0\\\0540\\\05479\\\05439\\\054:\
+ :uc=\001\001_\001\200:up=^K:
+
+
+ca22851|computer automation 22851:\
+ :am:\
+ :co#80:li#24:\
+ :bl=^G:cd=^\:ce=^]:cl=\014:cm=\002%i%.%.:cr=^M:do=^J:\
+ :ho=^^:kd=^W:kh=^^:kl=^U:ku=^V:le=^U:nd=^I:sf=^J:\
+ :up=^V:
+
+
+cyb83|xl83|cybernex xl-83:\
+ :am:\
+ :co#80:li#24:\
+ :bl=^G:cd=\020:ce=\017:cl=\014:cm=\027%+ %+ :cr=^M:\
+ :do=^J:ho=^K:kd=^J:kl=^H:kr=^I:ku=^N:le=^H:nd=^I:\
+ :sf=^J:sr=^N:up=^N:
+cyb110|mdl110|cybernex mdl-110:\
+ :am:\
+ :co#80:li#24:\
+ :al=\016A\016\035:bl=^G:cd=\016@\026:ce=\016@\026:\
+ :cl=\030:cm=\020%+ %+ :cr=^M:dc=\016A\036:\
+ :dl=\016A\016\036:do=^J:ei=:ho=^Y:ic=\016A\035:im=:\
+ :le=^H:nd=^U:se=^NG:sf=^J:so=^NF:ta=\011:up=^Z:
+
+
+dp3360|datapoint|datapoint 3360:\
+ :am:\
+ :co#82:li#25:\
+ :bl=^G:cd=^_:ce=^^:cl=^]^_:cr=^M:do=^J:ho=^]:le=^H:\
+ :nd=^X:sf=^J:up=^Z:
+
+
+gt40|dec gt40:\
+ :os:\
+ :co#72:li#30:\
+ :bl=^G:cr=^M:do=^J:le=^H:
+gt42|dec gt42:\
+ :os:\
+ :co#72:li#40:\
+ :bl=^G:cr=^M:do=^J:le=^H:
+vt50|dec vt50:\
+ :co#80:li#12:\
+ :bl=^G:cd=\EJ:ce=\EK:cl=\EH\EJ:cr=^M:do=^J:le=^H:\
+ :nd=\EC:sf=^J:ta=^I:up=\EA:
+vt50h|dec vt50h:\
+ :co#80:li#12:\
+ :bl=^G:cd=\EJ:ce=\EK:cl=\EH\EJ:cm=\EY%+ %+ :cr=^M:\
+ :do=^J:le=^H:nd=\EC:sf=^J:sr=\EI:ta=^I:up=\EA:
+vt61|vt-61|vt61.5|dec vt61:\
+ :co#80:li#24:\
+ :bl=^G:cd=\EJ:ce=\EK:cl=\EH\EJ:cm=\EY%+ %+ :cr=\r:\
+ :do=^J:kd=\EB:kl=\ED:kr=\EC:ku=\EA:le=^H:nd=\EC:\
+ :sf=\n:sr=\EI:ta=^I:up=\EA:
+
+gigi|vk100|dec gigi graphics terminal:\
+ :am:xn:\
+ :co#84:li#24:\
+ :DO=\E[%dB:LE=\E[%dD:RA=\E[?7l:RI=\E[%dC:SA=\E[?7h:\
+ :UP=\E[%dA:bl=^G:cd=\E[J:ce=\E[K:cl=\E[H\E[2J:\
+ :cm=\E[%i%d;%dH:cr=^M:do=^J:\
+ :is=\E>\E[?3l\E[?4l\E[?5l\E[?20l\E[?7h\E[?8h:k1=\EOP:\
+ :k2=\EOQ:k3=\EOR:k4=\EOS:kd=\EOB:ke=\E[?1l\E>:\
+ :kh=\E[H:kl=\EOD:kr=\EOC:ks=\E[?1h\E=:ku=\EOA:le=^H:\
+ :nd=\E[C:se=\E[m:sf=^J:so=\E[7;31m:sr=\EM:ta=^I:\
+ :ue=\E[m:up=\E[A:us=\E[4m:
+
+pro350|decpro|dec pro console:\
+ :co#80:it#8:li#24:\
+ :ae=\EG:as=\EF:cd=\EJ:ce=\EK:cl=\EH\EJ:cm=\EY%+ %+ :\
+ :do=\EB:ho=\EH:k0=\EE:k1=\EF:k2=\EG:k3=\EH:k4=\EI:\
+ :k5=\EJ:k6=\Ei:k7=\Ej:kd=\EB:kh=\EH:kl=\ED:kr=\EC:\
+ :ku=\EA:le=^H:nd=\EC:se=\E^N:so=\E^H:sr=\EI:ta=^I:\
+ :ue=\E^C:up=\EA:us=\E^D:
+
+dw1|decwriter I:\
+ :hc:os:\
+ :co#72:\
+ :bl=^G:cr=^M:do=^J:le=^H:sf=^J:
+dw2|decwriter|dw|decwriter II:\
+ :hc:os:\
+ :co#132:\
+ :bl=^G:cr=^M:do=^J:kb=^H:le=^H:sf=^J:
+
+dw3|la120|decwriter III:\
+ :hc:os:\
+ :co#132:\
+ :bl=^G:cr=^M:do=^J:\
+ :i1=\E(B\E[20l\E[w\E[0;132s\E[2g\E[z\E[66t\E[1;66r\E[4g\E>:\
+ :is=\E[9;17;25;33;41;49;57;65;73;81;89;97;105;113;121;129u\r:\
+ :kb=^H:le=^H:se=\E[w:sf=^J:so=\E[6w:ta=^I:
+dw4|decwriter IV:\
+ :am:hc:os:\
+ :co#132:\
+ :bl=^G:cr=^M:do=^J:is=\Ec:k0=\EOP:k1=\EOQ:k2=\EOR:\
+ :k3=\EOS:kb=^H:le=^H:sf=^J:ta=^I:
+
+ln03|dec ln03 laser printer:\
+ :hc:\
+ :co#80:li#66:\
+ :bl=^G:cr=^M:do=^J:hd=\EK:hu=\EL:nw=^M^J:se=\E[22m:\
+ :sf=^J:so=\E[1m:ta=^I:ue=\E[24m:us=\E[4m:
+ln03-w|dec ln03 laser printer 132 cols:\
+ :co#132:\
+ :bl=^G:cr=^M:do=^J:kb=^H:kd=^J:kl=^H:nw=^M^J:sf=^J:\
+ :ta=^I:tc=ln03:
+
+
+delta|dd5000|delta data 5000:\
+ :am:\
+ :co#80:li#27:\
+ :bl=^G:ce=^NU:cl=^NR:cm=\017%+^P%+^P:dc=^NV:do=^J:\
+ :ho=^NQ:le=^H:nd=^Y:sf=^J:up=^Z:
+
+
+ddr|rebus3180|ddr3180|Rebus/DDR 3180 vt100 emulator:\
+ :am:xn:\
+ :co#80:it#8:li#24:vt#3:\
+ :RA=\E[7l:SA=\E[7l:cd=50\E[J:ce=3\E[K:cl=50\E[H\E[2J:\
+ :cm=5\E[%i%d;%dH:cs=\E[%i%d;%dr:do=^J:ho=\E[H:\
+ :is=\E[1;24r\E[24;1H:k1=\EOP:k2=\EOQ:k3=\EOR:k4=\EOS:\
+ :kb=^H:kd=\E[B:ke=\E[?1l\E>:kl=\E[D:kr=\E[C:\
+ :ks=\E[?1h\E=:ku=\E[A:le=^H:mb=2\E[5m:md=2\E[1m:\
+ :me=2\E[m:mr=2\E[7m:nd=2\E[C:\
+ :r1=\E>\E[?3l\E[?4l\E[?5l\E[?7h\E[?8h:rc=\E8:\
+ :rf=/usr/share/lib/tabset/vt100:sc=\E7:se=\E[m:\
+ :sf=5\ED:so=\E[7m:sr=5\EM:ta=^I:ue=2\E[m:up=2\E[A:\
+ :us=2\E[4m:
+
+
+terminet1200|terminet300|tn1200|tn300|terminet|GE terminet 1200:\
+ :hc:os:\
+ :co#120:\
+ :bl=^G:cr=^M:do=^J:sf=^J:
+
+
+h19-a|heath-ansi|heathkit-a|heathkit h19 ansi mode:\
+ :am:mi:ms:\
+ :co#80:it#8:li#24:\
+ :RA=\E[?7l:SA=\E[?7h:ae=\E[11m:al=\E[1L:as=\E[10m:\
+ :bl=^G:cd=\E[J:ce=\E[K:cl=\E[2J:cm=\E[%i%d;%dH:cr=^M:\
+ :dc=\E[1P:dl=\E[1M:do=\E[1B:ei=\E[4l:ho=\E[H:\
+ :im=\E[4h:\
+ :is=\E<\E[>1;2;3;4;5;6;7;8;9l\E[m\E[11m\E[?7h:\
+ :k1=\EOS:k2=\EOT:k3=\EOU:k4=\EOV:k5=\EOW:k6=\EOP:\
+ :k7=\EOQ:k8=\EOR:kb=^H:kd=\E[1B:kh=\E[H:kl=\E[1D:\
+ :kr=\E[1C:ku=\E[1A:l6=blue:l7=red:l8=white:le=^H:\
+ :nd=\E[1C:se=\E[m:sf=^J:so=\E[7m:sr=\EM:ta=^I:\
+ :up=\E[1A:ve=\E[>4l:vs=\E[>4h:
+h19-bs|heathkit w/keypad shifted:\
+ :ke=\Eu:ks=\Et:tc=h19-b:
+h19-smul|heathkit w/keypad shifted/underscore cursor:\
+ :ke=\Eu:ks=\Et:tc=h19-u:
+h19|heath|h19-b|heathkit|heath-19|z19|zenith|heathkit h19:\
+ :am:es:hs:mi:ms:\
+ :co#80:it#8:li#24:\
+ :ae=\EG:al=\EL:as=\EF:bl=^G:cd=\EJ:ce=\EK:cl=\EE:\
+ :cm=\EY%+ %+ :cr=^M:dc=\EN:dl=\EM:do=\EB:ei=\EO:\
+ :fs=\Ek\Ey5:ho=\EH:im=\E@:ip=1.5<1.5/>:k1=\ES:k2=\ET:\
+ :k3=\EU:k4=\EV:k5=\EW:k6=\EP:k7=\EQ:k8=\ER:kb=^H:\
+ :kd=\EB:kh=\EH:kl=\ED:kr=\EC:ku=\EA:l6=blue:l7=red:\
+ :l8=white:le=^H:nd=\EC:se=\Eq:sf=^J:so=\Ep:sr=\EI:\
+ :ta=^I:ts=\Ej\Ex5\EY8%p1%{32}%+%c\Eo\Eo:up=\EA:\
+ :ve=\Ey4:vs=\Ex4:
+h19-u|heathkit with underscore cursor:\
+ :ve@:vs@:tc=h19-b:
+h19-us|h19us|heathkit w/keypad shifted/underscore cursor:\
+ :ke=\Eu:ks=\Et:tc=h19-u:
+h19-g|h19g|heathkit w/block cursor:\
+ :ve=\Ex4:tc=h19-b:
+alto-h19|altoh19|altoheath|alto-heath|alto emulating heathkit h19:\
+ :li#60:\
+ :al=\EL:dl=\EM:tc=h19:
+
+z29|zenith29|z29b|zenith z29b:\
+ :am:ms:\
+ :co#80:li#24:\
+ :ae=\EF:al=\EL:as=\EG:bl=^G:bt=\E-:cd=\EJ:ce=\EK:\
+ :cl=\EE:cm=\EY%+ %+ :cr=^M:dc=\EN:dl=\EM:do=\EB:ei=:\
+ :ho=\EH:ic=\E<\E[1@\E[?2h:im=:is=\E<\E[?2h\Ev:k0=\E~:\
+ :k1=\ES:k2=\ET:k3=\EU:k4=\EV:k5=\EW:k6=\EP:k7=\EQ:\
+ :k8=\ER:k9=\E0I:kb=^H:kd=\EB:kh=\EH:kl=\ED:kr=\EC:\
+ :ku=\EA:l0=home:le=^H:nd=\EC:se=\Eq:sf=\n:so=\Ep:\
+ :sr=\EI:ta=^I:ue=\Es0:up=\EA:us=\Es8:ve=\Ey4:vs=\Ex4:
+z29a|z29a-kc-bc|h29a-kc-bc|heath/zenith 29 in ansi mode:\
+ :es:hs:\
+ :co#80:it#8:li#24:\
+ :AL=\E[%dL:DC=\E[%dP:DL=\E[%dM:DO=\E[%dB:LE=\E[%dD:\
+ :RI=\E[%dC:UP=\E[%dA:bl=^G:cd=\E[J:ce=\E[K:cl=\E[2J:\
+ :cm=\E[%i%d;%dH:cr=^M:cs=\E[%i%d;%dr:ct=\E[3g:\
+ :dc=\E[1P:do=^J:ds=\E[>1l:fs=\E[u\E[>5l:ho=\E[H:\
+ :if=/usr/share/tabset/zenith29:k0=\E[~:k1=\EOS:\
+ :k2=\EOT:k3=\EOU:k4=\EOV:k5=\EOW:k6=\EOP:k7=\EOQ:\
+ :k8=\EOR:k9=\EOX:kC=\E[J:kS=\E[J:kb=^H:kd=\EOB:\
+ :kh=\E[H:kl=\EOD:kr=\EOC:ku=\EOA:l0=help:le=^H:\
+ :mb=\E[5m:md=\E[2m:me=\E[m:mh=\E[2m:mr=\E[7m:nd=\E[C:\
+ :nw=^M\ED:ps=\E#7:\
+ :r1=\E<\E[1;24r\E[24;1H\E[?7h\E[>4h\E[>1;2;3;5;6;7;8;9l\E[m\E[11m:\
+ :rc=\E[r:sc=\E[s:se=\E[m:sf=\ED:so=\E[7;2m:sr=\EM:\
+ :st=\EH:ta=^I:te=\E[?7h:ti=\E[?7l:\
+ :ts=\E[s\E[>5;1h\E[25;%i%dH\E[1K:ue=\E[m:up=\E[A:\
+ :us=\E[4m:
+z29a-kc-uc|h29a-kc-uc|z29 ansi mode with keyckick and underscore cursor:\
+ :r1=\E<\E[1;24r\E[24;1H\E[?7h\E[>1;2;3;4;5;6;7;8;9l\E[m\E[11m:tc=z29a:
+z29a-nkc-bc|h29a-nkc-bc|z29 ansi mode with block cursor and no keyclick:\
+ :r1=\E<\E[1;24r\E[24;1H\E[?7h\E[>2;4h\E[>1;3;5;6;7;8;9l\E[m\E[11m:tc=z29a:
+z29a-nkc-uc|h29a-nkc-uc|z29 ansi mode with underscore cursor and no keyclick:\
+ :r1=\E<\E[1;24r\E[24;1H\E[?7h\E[>2h\E[>1;3;4;5;6;7;8;9l\E[m\E[11m:tc=z29a:
+z39-a|z39a|zenith39-a|zenith39-ansi|Zenith 39 in ANSI mode:\
+ :5i:am:es:hs:mi:ms:xo:\
+ :co#80:li#24:\
+ :%1=\E[~:AL=\E[%dL:DC=\E[%dP:DL=\E[%dM:DO=\E[%dB:\
+ :K1=\EOw:K2=\EOy:K3=\EOu:K4=\EOq:K5=\EOs:LE=\E[%dD:\
+ :RI=\E[%dC:UP=\E[%dA:\
+ :ac=``aaffggjjkkllmmnnooqqssttuuvvwwxx~~0a:ae=\E(B:\
+ :al=\E[1L:as=\E(0:bl=^G:bt=\E[1Z:cb=\E[1K:cd=\E[0J:\
+ :ce=\E[0K:cl=\E[2J\E[H:cm=\E[%i%d;%dH:cr=^M:\
+ :cs=\E[%i%d;%dr:ct=\E[3g:dc=\E[1P:dl=\E[1M:do=\E[B:\
+ :ds=\E[>1l:ei=\E[4l:fs=\E[u:ho=\E[H:im=\E[4h:\
+ :is=\E<\E[>1;3;5;6;7l\E[0m\E[2J:k1=\EOS:k2=\EOT:\
+ :k3=\EOU:k4=\EOV:k5=\EOW:k6=\EOP:k7=\EOQ:k8=\EOR:\
+ :k9=\EOX:kS=\E[J:kb=^H:kd=\E[B:ke=\E[>7l:kh=\E[H:\
+ :kl=\E[D:kr=\E[C:ks=\E[>7h:ku=\E[A:le=^H:ll=\E[24;1H:\
+ :mb=\E[5m:md=\E[1m:me=\E[0m:mh=\E[2m:mr=\E[7m:\
+ :nd=\E[C:pf=\E[4i:po=\E[5i:ps=\E[?19h\E[i:\
+ :r2=\E<\Ec\200:rc=\E[u:sc=\E[s:se=\E[0m:sf=^J:\
+ :so=\E[7m:st=\EH:ta=^I:ts=\E[s\E[>1h\E[25;%i%p1%dH:\
+ :ue=\E[0m:up=\E[A:us=\E[4m:ve=\E[>5l:vi=\E[>5h:
+
+z100|h100|z110|z-100|h-100|heath/zenith z-100 pc with color monitor:\
+ :ve=\Ey4\Em70:vs=\Ex4\Em71:tc=z100bw:
+z100bw|h100bw|z110bw|z-100bw|h-100bw|heath/zenith z-100 pc:\
+ :mi:ms:\
+ :co#80:it#8:li#24:\
+ :ae=\EG:al=5*\EL:as=\EF:cd=\EJ:ce=\EK:cl=5*\EE:\
+ :cm=1*\EY%+ %+ :dc=1*\EN:dl=5*\EM:do=\EB:ei=\EO:\
+ :ho=\EH:im=\E@:k0=\EJ:k1=\ES:k2=\ET:k3=\EU:k4=\EV:\
+ :k5=\EW:k6=\EP:k7=\EQ:k8=\ER:k9=\EOI:kb=^H:kd=\EB:\
+ :kh=\EH:kl=\ED:kr=\EC:ku=\EA:le=^H:nd=\EC:se=\Eq:\
+ :so=\Ep:sr=\EI:ta=^I:up=\EA:ve=\Ey4:vs=\Ex4:
+p19|h19-b with il1/dl1:\
+ :al=2*\EL:dl=2*\EM:tc=h19-b:
+ztx|ztx11|zt-1|htx11|ztx-1-a|ztx-10 or 11:\
+ :am:es:hs:\
+ :co#80:it#8:li#24:\
+ :al=\EL:cd=\EJ:ce=\EK:cl=\EE:cm=\EY%+ %+ :dl=\EM:\
+ :do=^J:ds=\Ey1:fs=\Ek\Ey5:ho=\EH:\
+ :is=\Ej\EH\Eq\Ek\Ev\Ey1\Ey5\EG\Ey8\Ey9\Ey>:k0=\ES:\
+ :k1=\EB:k2=\EU:k3=\EV:k4=\EW:k5=\EP:k6=\EQ:k7=\ER:\
+ :kb=^H:kd=\EB:kl=\ED:kr=\EC:ku=\EA:le=^H:nd=\EC:\
+ :se=\Eq:so=\Es5:sr=\EI:ta=^I:\
+ :ts=\Ej\Ex5\Ex1\EY8%+ \Eo:ue=\Eq:up=\EA:us=\Es2:
+
+
+ims950-b|bare ims950 no init string:\
+ :is@:tc=ims950:
+ims950|ims televideo 950 emulation:\
+ :xn@:\
+ :k0@:k1@:k2@:k3@:k4@:k5@:k6@:k7@:k8@:k9@:kb@:kd@:kh@:\
+ :kl@:kr@:ku@:vb@:tc=tvi950:
+ims950-rv|ims tvi950 rev video:\
+ :xn@:\
+ :k0@:k1@:k2@:k3@:k4@:k5@:k6@:k7@:k8@:k9@:kb@:kd@:kh@:\
+ :kl@:kr@:ku@:vb@:tc=tvi950-rv:
+ims-ansi|ultima2|ultimaII|IMS Ultima II:\
+ :am:\
+ :co#80:it#8:li#24:\
+ :cd=\E[0J:ce=\E[0K:cl=\E[H\E[2J:cm=\E[%i%2;%2H:\
+ :do=\ED:if=/usr/share/tabset/vt100:\
+ :is=\E[m\E[>14l\E[?1;?5;20l\E>\E[1m\r:kd=\E[B:\
+ :kh=\E[H:kl=\E[D:kr=\E[C:ku=\E[A:le=^H:se=\E[m\E[1m:\
+ :so=\E[7m:sr=\EM:ta=^I:ue=\E[m\E[1m:up=\EM:us=\E[4m:
+
+
+superbrain|intertec superbrain:\
+ :am:bw:\
+ :co#80:li#24:\
+ :bl=^G:cd=\E~k<10*>:ce=\E~K:cl=\014:cm=\EY%+ %+ :\
+ :cr=^M:do=^J:kd=^J:kl=^U:kr=^F:ku=^K:le=^H:nd=^F:\
+ :sf=^J:ta=^I:te=^L:ti=^L:up=^K:
+intertube|intertec|Intertec InterTube:\
+ :am:\
+ :co#80:li#25:\
+ :bl=^G:cl=^L:cm=\EY%+ %+ :cr=^M:do=^J:ho=^A:le=^H:\
+ :nd=^F:se=\E0@:sf=^J:so=\E0P:up=^Z:
+intertube2|intertec data systems intertube 2:\
+ :ce=\EK:ch=\020%+^J:cm=\016%.\020%+^J:cv=\013%.:\
+ :ll=^K^X\r:tc=intertube:
+
+
+
+graphos|graphos III:\
+ :am:mi:\
+ :co#80:it#8:li#24:\
+ :AL=\E[%dL:DL=\E[%dM:DO=\E[%dB:LE=\E[%dD:RI=\E[%dC:\
+ :UP=\E[%dA:al=\E[L:cd=\E[J:ce=\E[K:cl=\E[H\E[2J:\
+ :cm=\E[%i%d;%dH:cr=^M:dc=\E[P:dl=\E[M:dm=\E[4h:\
+ :do=\E[B:ed=\E[4l:ei=\E[4l:ho=\E[H:\
+ :if=/usr/lib/tabset/init.graphos:im=\E[4h:k1=\EOP:\
+ :k2=\EOQ:k3=\EOR:k4=\EOS:kb=^H:kd=\E[B:kh=\E[H:\
+ :kl=\E[D:kr=\E[C:ku=\E[A:le=^H:nd=\E[C:nw=^M\ED:\
+ :rc=\E8:rf=/usr/lib/tabset/init.graphos:sc=\E7:\
+ :se=\E[m:sf=\ED:so=\E[7m:sr=\EM:ta=^I:up=\E[A:\
+ :ve=\Ez56;2;0;0z\Ez73z\Ez4;1;1z:\
+ :vs=\Ez4;2;1z\Ez56;2;80;24z:
+graphos-30|graphos III with 30 lines:\
+ :li#30:\
+ :vs=\Ez4;2;1z\Ez56;2;80;30z:tc=graphos:
+
+
+modgraph|mod|modgraph terminal emulating vt100:\
+ :xn@:\
+ :co#80:li#24:\
+ :is=\E^9;0s\E^7;1s\E[3g\E^11;9s\E^11;17s\E^11;25s\E^11;33s\E^11;41s\E^11;49s\E^11;57s\E^11;65s\E^11;73s\E^11;81s\E^11;89s:\
+ :rf@:sr=5\EM\E[K:vs=\E^9;0s\E^7;1s:tc=vt100:
+modgraph2|modgraph gx-1000 80x24 with keypad not enabled:\
+ :am:da:db:\
+ :co#80:it#8:li#24:\
+ :cd=50\EJ:ce=3\EK:cl=50\EH\EJ:cm=5\EY%+ %+ :\
+ :is=\E<\E^5;2s\E^7;1s\E[3g\E^11;9s\E^11;17s\E^11;25s\E^11;33s\E^11;41s\E^11;49s\E^11;57s\E^11;65s\E^11;73s\E^11;81s\E^11;89s\E^12;0s\E^14;2s\E^15;9s\E^25;1s\E^9;1s\E^27;1:\
+ :le=^H:nd=2\EC:sr=5\EI:ta=^I:up=2\EA:
+
+
+mt70|mt-70|Morrow MD-70; native Morrow mode:\
+ :am:mi:ms:xo:\
+ :co#80:it#8:li#24:\
+ :%1=^AO\r:F1=^A`\r:F2=^Aa\r:F3=^Ab\r:F4=^Ac\r:\
+ :F5=^Ad\r:F6=^Ae\r:F7=^Af\r:F8=^Ag\r:F9=^Ah\r:\
+ :FA=^Ai\r:ac=+z\\\054{.yOi-x`|jGkFlEmDnHtLuKvNwMxIqJ:\
+ :ae=\E%:al=\EE:as=\E$:bl=^G:bt=\EI:cd=\EY:ce=\ET:\
+ :cl=^Z:cm=\E=%+ %+ :cr=^M:ct=\E0:dc=\EW:dl=\ER:do=^J:\
+ :ei=:ho=^^:i1=\E"2\EG0\E]:ic=\EQ:im=:k1=^A@\r:\
+ :k2=^AA\r:k3=^AB\r:k4=^AC\r:k5=^AD\r:k6=^AE\r:\
+ :k7=^AF\r:k8=^AG\r:k9=^AH\r:k;=^AI\r:kB=^A^Z\r:\
+ :kC=^An\r:kD=\177:kb=^H:kd=^AK\r:kh=^AN\r:kl=^AL\r:\
+ :kr=^AM\r:ku=^AJ\r:le=^H:me=\EG0:mh=\EG2:mr=\EG4:\
+ :nd=^L:nw=^_:se=\EG0:sf=^J:so=\EG4:ta=^I:\
+ :ti=\E"2\EG0\E]:up=^K:us=\EG1:vb=\EK1\EK0:ve=\E"2:\
+ :vi=\E"0:
+
+
+omron|Omron 8025AG:\
+ :am:da:db:\
+ :co#80:li#24:\
+ :al=\EL:bl=^G:cd=\ER:ce=\EK:cl=\EJ:cr=^M:dc=\EP:\
+ :dl=\EM:do=^J:ho=\EH:le=^H:nd=\EC:se=\E4:sf=\ES:\
+ :so=\Ef:sr=\ET:up=\EA:vs=\EN:
+
+
+vsc|Signetics Vsc Video driver by RMC:\
+ :am:ms:\
+ :co#80:it#8:li#26:\
+ :ce=\E[K:cl=50\E[;H\E[2J:cm=\E[%i%d;%dH:cr=^M:do=^J:\
+ :ho=\E[H:kb=^H:kd=^J:kl=^H:le=^H:me=^_!:mr=^_ :\
+ :nd=\E[C:nw=^M^J:se=^_!:sf=^J:so=^_ :ta=^I:ue=^_#:\
+ :up=\E[A:us=^_":
+
+
+soroc120|iq120|soroc|soroc iq120:\
+ :cd=\EY:ce=\ET:cl=\E*:do=^J:kd=^J:kl=^H:kr=^L:ku=^K:tc=adm3a:
+soroc140|iq140|soroc iq140:\
+ :am:mi:\
+ :co#80:li#24:\
+ :al=\Ee:bl=^G:bt=\EI:cd=\Ey:ce=\Et:cl=\E+:\
+ :cm=\E=%+ %+ :cr=^M:dc=\Ew:dl=\Er:do=^J:ei=\E8:ho=^^:\
+ :im=\E9:k0=^A0\r:k1=^A@\r:k2=^AA\r:k3=^AB\r:k4=^AC\r:\
+ :k5=^AD\r:k6=^AE\r:k7=^AF\r:k8=^AG\r:k9=^AH\r:kb=^H:\
+ :kh=^^:kr=^L:ku=^K:le=^H:ll=^^^K:nd=^L:se=\E\177:\
+ :sf=^J:so=\E\177:ue=\E^A:up=^K:us=\E^A:
+
+
+swtp|ct82|southwest technical products ct82:\
+ :am:\
+ :co#82:li#20:\
+ :al=^^Y:bl=^G:cd=^V:ce=^F:cl=^L:cm=\013%r%.%.:cr=^M:\
+ :dc=^^H:dl=^Z:do=^J:ei=:ho=^P:ic=^^X:im=:\
+ :is=\034\022\036\023\036\004\035\027\011\023\036\035\036\017\035\027\022\011:\
+ :le=^D:ll=^C:nd=^S:se=^^^F:sf=^N:so=^^^V:sr=^O:up=^A:
+
+
+synertek|ktm|synertek380|synertek ktm 3/80 tubeless terminal:\
+ :am:\
+ :co#80:li#24:\
+ :cd=\EJ:ce=\EK:cl=^Z:cm=\E=%+ %+ :le=^H:nd=^L:up=^K:
+
+
+tab132|tab|tab132-15|tab 132/15:\
+ :da:db:\
+ :co#80:dN@:li#24:lm#96:\
+ :al=\E[L:cm=\E[%i%d;%dH:dc=\E[P:dl=\E[M:do=^J:\
+ :ei=\E[4l:im=\E[4h:is=\E[?7h\E[?3l\E[?5l:kd=\E[B:ke@:\
+ :kl=\E[D:ks@:ku=\E[A:tc=vt100:
+tab132-w|tab132 in wide mode:\
+ :co#132:\
+ :is=\E[?7h\E[?3h\E[?5l:tc=tab132:
+tab132-rv|tab132 in reverse-video mode:\
+ :is=\E[?7h\E[?3l\E[?5h:tc=tab132:
+tab132-w-rv|tab132 in reverse-video/wide mode:\
+ :is=\E[?7h\E[?3h\E[?5h:tc=tab132-w:
+
+
+
+t3700|dumb teleray 3700:\
+ :co#80:li#24:\
+ :bl=^G:cl=^L:cr=^M:do=^J:le=^H:sf=^J:
+t3800|teleray 3800 series:\
+ :co#80:it#8:li#24:\
+ :bl=^G:cd=\EJ:ce=\EK:cl=^L:cm=\EY%+ %+ :cr=^M:do=^J:\
+ :ho=\EH:le=^H:ll=\EY7 :nd=\EC:sf=^J:ta=^I:up=^K:
+t1061|teleray|teleray 1061:\
+ :am:km:xs:xt:\
+ :co#80:it#8:li#24:sg#1:ug#1:\
+ :al=\EL:bl=^G:cd=\EJ:ce=\EK:cl=\014:cm=\EY%+ %+ :\
+ :cr=^M:ct=\EG:dc=\EQ:dl=\EM:do=^J:ei=:ho=\EH:ic=\EP:\
+ :im=:ip=:\
+ :is=\Ee\EU01^Z1\EV\EU02^Z2\EV\EU03^Z3\EV\EU04^Z4\EV\EU05^Z5\EV\EU06^Z6\EV\EU07^Z7\EV\EU08^Z8\EV\Ef:\
+ :k1=^Z1:k2=^Z2:k3=^Z3:k4=^Z4:k5=^Z5:k6=^Z6:k7=^Z7:\
+ :k8=^Z8:le=^H:nd=\EC:se=\ER@:sf=^J:so= \ERD:st=\EF:\
+ :ta=^I:ue=\ER@:up=\EA:us=\ERH:
+t1061f|teleray 1061 with fast PROMs:\
+ :al=\EL:dl=\EM:ip@:tc=t1061:
+t10|teleray 10 special:\
+ :km:xs:xt:\
+ :co#80:it#8:li#24:sg#2:ug#2:\
+ :al=\EL:cd=\EJ:ce=\EK:cl=30\Ej:cm=\EY%+ %+ :dc=\EQ:\
+ :dl=\EM:ei=:ho=\EH:ic=\EP:im=:le=^H:nd=\EC:pc=\200:\
+ :se=\ER@:sf=\Eq:so=\ERD:sr=\Ep:ta=^I:ue=\ER@:up=\EA:\
+ :us=\ERH:
+t16|teleray 16:\
+ :am:da:db:mi:xs:xt:\
+ :co#80:li#24:\
+ :al=\E[L:bl=^G:cd=\E[0J:ce=\E[0K:cl=\E[H\E[2J:\
+ :cm=%i\E[%d;%df:cr=^M:dc=\E[P:dl=\E[M:do=\E[B:\
+ :ei=\E[4l:ho=\E[H:im=\E[4h:k1=^Z1:k2=^Z2:k3=^Z3:\
+ :k4=^Z4:k5=^Z5:k6=^Z6:k7=^Z7:k8=^Z8:k9=^Z9:k;=^Z0:\
+ :le=^H:nd=\E[C:se=\E[m:sf=^J:so=\E[7m:sr=\E[T:ta=^I:\
+ :te=\E[V\E[24;1f\E[?38h:ti=\E[U\E[?38l:ue=\E[m:\
+ :up=\E[A:us=\E[4m:
+
+
+ti700|ti733|ti735|ti745|ti800|ti silent 700/733/735/745 or omni 800:\
+ :hc:os:\
+ :co#80:\
+ :bl=^G:cr=\r:do=^J:le=^H:sf=^J:
+
+ti924|Texas Instruments 924 VDT 8859/1 7 bit CTRL:\
+ :am:xo:\
+ :co#80:it#8:li#24:\
+ :al=\E[L:bl=^G:cd=\E[J:ce=\E[K:cl=\E[2J\E[H:\
+ :cm=%i\E[%d;%dH:cr=^M:cs=%i\E[%d;%dr:ct=\E[3g:\
+ :dl=\E[M:do=\E[B:ho=\E[H:k1=\EOP:k2=\EOQ:k3=\EOR:\
+ :k4=\EOS:k5=\E[16~:k6=\E[17~:k7=\E[18~:k8=\E[19~:\
+ :k9=\E[20~:kD=\E[P:kI=\E[@:kb=^H:kd=\E[B:kl=\E[D:\
+ :kr=\E[C:ku=\E[A:le=\E[D:mb=\E[5m:md=\E[1m:me=\E[m:\
+ :mr=\E[7m:nd=\E[C:rc=\E8:sc=\E7:se=\E[m:sf=\ED:\
+ :so=\E[7m:sr=\EM:st=\EH:ta=^I:ue=\E[m:up=\E[A:\
+ :us=\E[4m:ve=\E[?25h:vi=\E[?25l:vs=\E[?31h:
+ti924-8|Texas Instruments 924 VDT 8859/1 8 bit CTRL:\
+ :am:xo:\
+ :co#80:it#8:li#24:\
+ :al=\E[L:bl=^G:cd=\E[J:ce=\E[K:cl=\E[2J\E[H:\
+ :cm=%i\E[%d;%dH:cr=^M:cs=%i\E[%d;%dr:ct=\E[3g:\
+ :dl=\E[M:do=\E[B:ho=\E[H:k1=P\217>:k2=Q\217>:\
+ :k3=R\217>:k4=S\217>:k5=~\23316>:k6=~\23317>:\
+ :k7=~\23318>:k8=~\23319>:k9=~\23320>:kD=P\233>:\
+ :kI=@\233>:kb=^H:kd=\E[B:kl=\E[D:kr=\E[C:ku=\E[A:\
+ :le=\E[D:mb=\E[5m:md=\E[1m:me=\E[m:mr=\E[7m:nd=\E[C:\
+ :rc=\E8:sc=\E7:se=\E[m:sf=\ED:so=\E[7m:sr=\EM:st=\EH:\
+ :ta=^I:ue=\E[m:up=\E[A:us=\E[4m:ve=\E[?25h:\
+ :vi=\E[?25l:vs=\E[?31h:
+ti924w|Texas Instruments 924 VDT 7 bit - 132 column mode:\
+ :co#132:tc=ti924:
+ti924-8w|Texas Instruments 924 VDT 8 bit - 132 column mode:\
+ :co#132:tc=ti924-8:
+ti931|Texas Instruments 931 VDT:\
+ :am:xo:\
+ :co#80:li#24:\
+ :al=\EN:bl=^G:cd=\EJ:ce=\EI:cl=\EL:cm=\EY%+ %+ :\
+ :cr=^M:dc=\EQ:dl=\EO:do=\EB:ei=:ho=\EH:ic=\ER\EP\EM:\
+ :im=:is=\EGB\E(@B@@\E):k1=\Ei1:k2=\Ei2:k3=\Ei3:\
+ :k4=\Ei4:k5=\Ei5:k6=\Ei6:k7=\Ei7:k8=\Ei8:k9=\Ei9:\
+ :kA=\EN:kD=\EQ:kI=\EP:kL=\EO:kd=\EB:kl=\ED:kr=\EC:\
+ :ku=\EA:le=\ED:mb=\E4P:me=\E4@:mk=\E4H:mr=\E4B:\
+ :nd=\EC:se=\E4@:sf=\Ea:so=\E4A:sr=\Eb:ue=\E4@:up=\EA:\
+ :us=\E4D:ve=\E4@:
+ti926|Texas Instruments 926 VDT 8859/1 7 bit CTRL:\
+ :cs@:sf=\E[1S:sr=\E[1T:tc=ti924:
+ti926-8|Texas Instruments 926 VDT 8859/1 8 bit CTRL:\
+ :cs@:sf=\2331S:sr=\2331T:tc=ti924-8:
+ti_ansi|basic entry for ti928:\
+ :am:eo:ut:xn:xo:\
+ :Co#8:co#80:it#8:li#25:pa#64:\
+ :@7=\E[F:Sb=\E[4%dm:Sf=\E[3%dm:al=\E[L:bl=^G:bt=\E[Z:\
+ :cd=\E[J:ce=\E[K:cl=\E[2J\E[H:cm=\E[%i%d;%dH:cr=^M:\
+ :cs=\E[%i%d;%dr:dc=\E[P:dl=\E[M:do=\E[B:ei=:ho=\E[H:\
+ :ic=\E[@:im=:k0=\E[V:k1=\E[M:k2=\E[N:k3=\E[O:k4=\E[P:\
+ :k5=\E[Q:k6=\E[R:k7=\E[S:k8=\E[T:k9=\E[U:kN=\E[G:\
+ :kP=\E[I:kb=^H:kd=\E[B:kh=\E[H:kl=\E[D:kr=\E[C:\
+ :ku=\E[A:le=^H:mb=\E[5m:md=\E[1m:me=\E[m:nd=\E[C:\
+ :op=\E[37;40m:se=\E[m:sf=\E[S:so=\E[7m:sr=\E[T:ta=^I:\
+ :ue=\E[m:up=\E[A:us=\E[4m:
+ti928|Texas Instruments 928 VDT 8859/1 7 bit CTRL:\
+ :%9=\E[35~:@7=\E_1\E\\:@8=\E[8~:F1=\E[29~:F2=\E[31~:\
+ :F3=\E[32~:F5=\E[34~:k1=\E[17~:k2=\E[18~:k3=\E[19~:\
+ :k4=\E[20~:k5=\E[21~:k6=\E[23~:k7=\E[24~:k8=\E[25~:\
+ :k9=\E[26~:k;=\E[28~:kD=\E[P:kI=\E[@:kN=\E[S:kP=\E[T:tc=ti_ansi:
+ti928-8|Texas Instruments 928 VDT 8859/1 8 bit CTRL:\
+ :%9=\23335~:@7=\2371\234:@8=\2338~:F1=\23329~:\
+ :F2=\23331~:F3=\23332~:F5=\23334~:k1=\23317~:\
+ :k2=\23318~:k3=\23319~:k4=\23320~:k5=\23321~:\
+ :k6=\23323~:k7=\23324~:k8=\23325~:k9=\23326~:\
+ :k;=\23328~:kD=\233P:kI=\233@:kN=\233S:kP=\233T:\
+ :kh=\233H:tc=ti_ansi:
+
+
+zen30|z30|zentec 30:\
+ :am:mi:ul:\
+ :co#80:li#24:\
+ :al=\EE:bl=^G:cd=\EY:ce=\ET:cl=\E*:cm=\E=%+ %+ :\
+ :cr=^M:dc=\EW:dl=\ER:do=^J:ei=\Er:ho=^^:im=\Eq:le=^H:\
+ :nd=^L:se=\EG0:sf=^J:so=\EG6:up=^K:
+zen50|z50|zentec zephyr:\
+ :am:\
+ :co#80:li#24:sg#1:\
+ :al=\EE:cd=\EY:ce=\ET:cl=\E+:cm=\E=%+ %+ :dc=\EW:\
+ :dl=\ER:ei=:ic=\EQ:im=:kd=^J:kh=^^:kl=^H:kr=^L:ku=^K:\
+ :le=^H:se=\EGO:so=\EG4:up=^K:
+
+
+
+masscomp|masscomp workstation console:\
+ :km:mi:\
+ :co#80:it#8:li#24:\
+ :al=\E[L:cd=\E[J:ce=\E[K:cl=\E[2J:cm=\E[%i%d;%dH:\
+ :dc=\E[P:dl=\E[M:do=\E[B:ei=\E[4l:im=\E[4h:\
+ :is=\EGc\EGb\EGw:kb=^H:kd=\EOB:kl=\EOD:kr=\EOC:\
+ :ku=\EOA:le=^H:nd=\E[C:se=\E[m:so=\E[7m:ta=^I:\
+ :ue=\EGau:up=\E[A:us=\EGu:
+masscomp1|masscomp large screen version 1:\
+ :co#104:li#36:tc=masscomp:
+masscomp2|masscomp large screen version 2:\
+ :co#64:li#21:tc=masscomp:
+
+
+qdss|qdcons|qdss glass tty:\
+ :am:\
+ :co#128:li#57:\
+ :cl=1\032:cm=\E=%.%.:do=^J:le=^H:nd=^L:up=^K:
+
+
+
+ctrm|C terminal emulator:\
+ :am:ut:xo:\
+ :Co#8:NC#2:Nl#0:co#80:lh#0:li#24:lm#0:lw#0:pa#63:\
+ :pb#19200:vt#6:\
+ :al=\EL:bl=^G:bt=\Ei:cd=\EJ:ce=\EK:ch=\E&a%dC:\
+ :cl=\EH\EJ:cm=\E&a%r%dc%dY:cr=^M:ct=\E3:cv=\E&a%dY:\
+ :dc=\EP:dl=\EM:do=^J:ei=\ER:im=\EQ:ip=:is=\E&jA\r:\
+ :k1=\Ep\r:k2=\Eq\r:k3=\Er\r:k4=\Es\r:k5=\Et\r:\
+ :k6=\Eu\r:k7=\Ev\r:k8=\Ew\r:kb=^H:kd=\Ew\r:ke=\E&jA:\
+ :kh=\Ep\r:kl=\Eu\r:kr=\Ev\r:ks=\E&jB:ku=\Et\r:le=^H:\
+ :mb=\E&dA%{1}%PA:md=%?%gH%{0}%=%t\E&dH%{1}%PH%;:\
+ :me=\E&d@%{0}%PA%{0}%PB%{0}%PH:\
+ :mr=%?%gB%{0}%=%t\E&dB%{1}%PB%;:nd=\EC:\
+ :op=\E&bn\E&bB\E&bG\E&bR\n%{0}%PX%{0}%PY%{0}%PZ\n%{1}%PW%{1}%PV%{1}%PU:\
+ :sf=^J:so=\E&dD:st=\E1:ta=\011:up=\EA:us=\E&dD:
+
+gs6300|emots|AT&T PC6300 with EMOTS terminal emulator:\
+ :am:ms:ut:xo:\
+ :Co#8:co#80:it#8:li#24:pa#63:\
+ :AL=\E[%dL:DC=\E[%dP:DL=\E[%dM:DO=\E[%dB:IC=\E[%d@:\
+ :LE=\E[%dD:LF=\E|:RI=\E[%dC:Sb=\E[?;%dm:\
+ :..Sf=\E[?%?%p1%{0}%=%t0\n%e%p1%{1}%=%t2\n%e%p1%{1}%-%d%;m:\
+ :UP=\E[%dA:\
+ :ac=\\\054\\\054..--++``aaffgghhiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~:\
+ :ae=\E[10m:al=\E[L:as=\E[11m:bl=^G:cd=\E[J:ce=\E[K:\
+ :cl=\E[H\E[J:cm=\E[%i%d;%dH:cr=^M:dc=\E[P:dl=\E[M:\
+ :do=^J:ei=:ho=\E[H:ic=\E[@:im=:is=\E[m:k1=\E[0s:\
+ :k2=\E[24s:k3=\E[1s:k4=\E[23s:k5=\E[2s:k6=\E[22s:\
+ :k7=\E[3s:k8=\E[21s:kB=^R^I:kb=^H:kd=\E[B:kh=\E[H:\
+ :kl=\E[D:kr=\E[C:ku=\E[A:le=^H:mb=\E[5m:md=\E[1m:\
+ :me=\E[m\E[10m:mr=\E[7m:nd=\E[C:op=\E[?;m:pf=\E[4i:\
+ :po=\E[5i:r1=\Ec:sf=^J:so=\E[1m:sr=\E[L:ta=^I:\
+ :up=\E[A:us=\E[4m:
+
+h19k|h19kermit|heathkit emulation provided by Kermit (no auto margin):\
+ :am@:da:db:xt:\
+ :it@:\
+ :ta@:tc=h19-u:
+
+versaterm|versaterm vt100 emulator for the macintosh:\
+ :am:xn:\
+ :co#80:it#8:li#24:\
+ :al=9\E[1L:bl=^G:cd=50\E[J:ce=3\E[K:cl=50\E[;H\E[2J:\
+ :cm=5\E[%i%d;%dH:cr=^M:cs=\E[%i%d;%dr:dc=7\E[1P:\
+ :dl=9\E[1M:do=^J:ei=:ho=\E[H:ic=7\E[1@:im=:\
+ :is=\E[1;24r\E[24;1H:k1=\EOP:k2=\EOQ:k3=\EOR:k4=\EOS:\
+ :kb=^H:kd=\EOB:ke=\E>\E[?1l:kl=\EOD:kr=\EOC:\
+ :ks=\E=\E[?1h:ku=\EOA:le=^H:mb=2\E[5m:md=2\E[1m:\
+ :me=2\E[m:mr=2\E[7m:nd=2\E[C:nw=^M^J:r1=\E>:rc=\E8:\
+ :rf=/usr/lib/tabset/vt100:sc=\E7:se=2\E[m:so=2\E[7m:\
+ :sr=5\EM:ta=^I:ue=2\E[m:up=2\E[A:us=2\E[4m:
+
+vs100t|tsim|vs100-tsim|tsim vs100 emulator:\
+ :am:\
+ :co#80:it#8:li#24:\
+ :AL=\E+%+ :DL=\E-%+ :al=\EI:cd=\EQ:ce=\EL:cl=\EE:\
+ :cm=\EM%+ %+ :cs=\ES%+ %+ :dc=\Ed:dl=\ED:do=^J:ei=:\
+ :ho=\EH:i1=\ER:ic=\Ei:im=:le=^H:nd=\En:se=\Er:so=\Eh:\
+ :ta=^I:ue=\Ev:up=^K:us=\Eu:
+
+xtalk|IBM PC with xtalk communication program (versions up to 3.4):\
+ :am:mi:ms:xo:\
+ :co#80:it#8:li#24:vt#3:\
+ :@8=\EOM:DO=\E[%dB:K1=\EOq:K2=\EOr:K3=\EOs:K4=\EOp:\
+ :K5=\EOn:LE=\E[%dD:RA=\E[?7l:RI=\E[%dC:SA=\E[?7h:\
+ :UP=\E[%dA:\
+ :ac=``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~:\
+ :ae=^O:al=\E[L:as=^N:bl=^G:cb=\E[1K:cd=\E[J:ce=\E[K:\
+ :cl=\E[H\E[J:cm=\E[%i%d;%dH:cr=^M:ct=\E[3g:dl=\E[M:\
+ :do=^J:eA=\E(B\E)0:ho=\E[H:k0=\EOy:k1=\EOP:k2=\EOQ:\
+ :k3=\EOR:k4=\EOS:k5=\EOt:k6=\EOu:k7=\EOv:k8=\EOl:\
+ :k9=\EOw:k;=\EOx:kb=^H:kd=\EOB:ke=\E[?1l\E>:kl=\EOD:\
+ :kr=\EOC:ks=\E[?1h\E=:ku=\EOA:le=^H:nd=\E[C:\
+ :r2=\E>\E[?3l\E[?4l\E[?5l\E[?7h\E[?8h:se=\E[m :sf=^J:\
+ :so=\E[7m :sr=\EM:st=\EH:ta=^I:up=\E[A:
+
+simterm|attpc running simterm:\
+ :am:\
+ :co#80:li#24:\
+ :al=\EL:bl=^G:cd=\EJ:ce=\EK:cl=\EH\EJ:cm=\E=%+ %+ :\
+ :cr=^M:dc=\ER:dl=\EM:do=\EB:ho=\EH:im=\EQ:le=^H:\
+ :nd=\EC:sf=^J:so=\E&dB:te=\EVE:ti=\EVS:up=\EA:
+
+
+diablo1620|diablo1720|diablo450|ipsi|diablo 1620:\
+ :hc:os:\
+ :co#132:it#8:\
+ :ch=\E\011%i%.:ct=\E2:do=^J:hd=\ED:hu=\EU:\
+ :if=/usr/share/tabset/xerox1720:kb=^H:le=^H:st=\E1:\
+ :ta=^I:up=\E^J:
+diablo1620-m8|diablo1640-m8|diablo 1620 w/8 column left margin:\
+ :co#124:\
+ :is=\r \E9:tc=diablo1620:
+diablo1640|diablo1730|diablo1740|diablo630|x1700|diablo|xerox|diablo 1640:\
+ :bl=^G:if=/usr/share/tabset/xerox1730:se=\E&:so=\EW:\
+ :ue=\ER:us=\EE:tc=diablo1620:
+diablo1640-lm|diablo-lm|xerox-lm|diablo 1640 with indented left margin:\
+ :co#124:\
+ :if=/usr/share/tabset/xerox1730-lm:se=\E&:so=\EW:\
+ :ue=\ER:us=\EE:tc=diablo1620:
+diablo1740-lm|630-lm|1730-lm|x1700-lm|diablo 1740 printer:\
+ :tc=diablo1640-lm:
+dtc382|DTC 382:\
+ :am:da:db:xs:\
+ :co#80:li#24:lm#96:\
+ :al=^P^Z:bl=^G:cd=\020\025\020\023\020\023:ce=^P^U:\
+ :cl=\020\035:cm=\020\021%r%.%.:cr=^P^M:dc=^X:dl=^P^S:\
+ :ei=^Pi:ho=^P^R:im=^PI:le=^H:nd=^PR:pc=\177:sf=^J:\
+ :te=\020\035:ue=^P \200:up=^P^L:us=^P ^P:ve=^Pb:\
+ :vs=^PB:
+dtc300s|DTC 300s:\
+ :hc:os:\
+ :co#132:\
+ :bl=^G:cr=^M:ct=\E3:do=^J:ff=^L:hd=\Eh:hu=\EH:kb=^H:\
+ :le=^H:sf=^J:st=\E1:ta=^I:up=^Z:
+gsi|mystery gsi terminal:\
+ :hc:os:\
+ :co#132:\
+ :bl=^G:cr=^M:do=^J:hd=\Eh:hu=\EH:le=^H:sf=^J:ta=^I:\
+ :up=^Z:
+aj830|aj832|aj|anderson jacobson:\
+ :hc:os:\
+ :bl=^G:cr=^M:do=^J:hd=\E9:hu=\E8:le=^H:sf=^J:up=\E7:
+aj510|Anderson-Jacobson model 510:\
+ :am:mi:\
+ :co#80:li#24:\
+ :al=2*\E&I:cd=\E'P:ce=\E'L:cl=^L:cm=\E#%+ %+ :\
+ :dc=.1*\E'D:dl=2*\E&D:ei=\E'J:ic=:im=\E'I:ip=.1*:\
+ :kd=\EZ:kl=\EW:kr=\EX:ku=\EY:le=^H:nd=\EX:pc=\177:\
+ :se=\E"I:so=\E"I:te=\E"N:ti=\E"N:ue=\E"U:up=\EY:\
+ :us=\E"U:
+nec5520|nec|spinwriter|nec 5520:\
+ :hc:os:\
+ :co#132:it#8:\
+ :bl=^G:cr=^M:ct=\E3:do=^J:ff=^L:hd=\E]s\n\E]W:\
+ :hu=\E]s\E9\E]W:kb=^H:le=^H:sf=^J:st=\E1:ta=^I:\
+ :up=\E9:
+qume5|qume|Qume Sprint 5:\
+ :hc:os:\
+ :co#80:it#8:\
+ :bl=^G:cr=^M:ct=\E3:do=^J:ff=^L:hd=\Eh:hu=\EH:kb=^H:\
+ :le=^H:sf=^J:st=\E1:ta=^I:up=^Z:
+xerox1720|x1720|x1750|xerox 1720:\
+ :hc:os:\
+ :co#132:it#8:\
+ :bl=^G:cr=^M:ct=\E2:do=^J:ff=^L:le=^H:sf=^J:st=\E1:\
+ :ta=^I:
+
+
+cad68-3|cgc3|cad68 basic monitor transparent mode size 3 chars:\
+ :am:\
+ :co#73:li#36:\
+ :cl=^Z:ho=^^:le=^H:nd=^L:up=^K:
+cad68-2|cgc2|cad68 basic monitor transparent mode size 2 chars:\
+ :am:\
+ :co#85:li#39:\
+ :cl=^Z:ho=^^:k1=\E5:k2=\E6:k3=\E7:k4=\E8:kd=\E2:\
+ :kl=\E3:kr=\E4:ku=\E1:le=^H:nd=^L:se=\Em^C:so=\Em^L:\
+ :up=^K:
+cops10|cops|cops-10|cops 10:\
+ :am:bw:\
+ :co#80:li#24:\
+ :bl=^G:cd=^W:ce=^V:cl=30\030:cm=\020%+ %+ :cr=^M:\
+ :do=^J:kb=^H:kd=^J:kh=^Y:kl=^H:kr=^L:ku=^K:le=^H:\
+ :nd=^L:sf=^J:up=^K:
+d132|datagraphix|datagraphix 132a:\
+ :da:db:in:\
+ :co#80:li#30:\
+ :al=\E3:bl=^G:cl=^L:cr=^M:dc=\E6:do=^J:ei=:ho=\Et:\
+ :ic=\E5:im=:nd=\El:sf=\Ev:sr=\Ew:up=\Ek:ve=\Em\En:\
+ :vs=\Ex:
+d800|Direct 800/A:\
+ :am:da:db:ms:xs:\
+ :co#80:it#8:li#24:\
+ :ae=\E[m:as=\E[1m:bl=^G:cd=\E[J:ce=\E[K:\
+ :cl=\E[1;1H\E[2J:cm=\E[%i%d;%dH:cr=^M:do=^J:k1=\EOP:\
+ :k2=\EOQ:k3=\EOR:k4=\EOS:k5=\EOT:k6=\EOU:k7=\EOV:\
+ :k8=\EOW:kd=\E[B:kl=\E[D:kr=\E[C:ku=\E[A:le=^H:\
+ :nd=\E[C:se=\E[m:sf=\ED:so=\E[7m:sr=\EM:ta=^I:\
+ :ue=\E[m:up=\E[A:us=\E[4m:ve=\E[>12h:vs=\E[>12l:
+digilog|digilog 333:\
+ :co#80:li#16:\
+ :bl=^G:ce=^X:cr=^M:do=^J:ho=^N:le=^H:nd=^I:sf=^J:\
+ :up=^O:
+env230|envision230|envision 230 graphics terminal:\
+ :xn@:\
+ :pf=\E[4i:po=\E[5i:ps=\E[0i:\
+ :..sa=\E[%?%p1%t;1%;%?%p2%t;4%;%?%p3%t;7%;%?%p4%t;5%;%?%p6%t;1%;m:tc=vt100:
+ep48|ep4080|execuport 4080:\
+ :am:os:\
+ :co#80:\
+ :bl=^G:cr=^M:do=^J:hd=^\:hu=^^:le=^H:sf=^J:
+ep40|ep4000|execuport 4000:\
+ :co#136:tc=ep4080:
+ifmr|Informer D304:\
+ :am:\
+ :co#80:li#24:\
+ :cd=\E/:ce=\EQ:cl=\EZ:cm=\EY%r%+ %+ :dc=\E\\:do=^J:\
+ :ei=:ho=\EH:ic=\E[:im=:le=^H:nd=\EC:se=\EK:so=\EJ:\
+ :sr=\En:up=\EA:
+opus3n1+|Esprit Opus3n1+ in wy60 mode with ANSI arrow keys:\
+ :am:bw:hs:km:mi:ms:ul:xo:\
+ :co#80:li#24:ws#80:\
+ :ae=\EH^C:al=\EE:as=\EH^B:bl=^G:bt=\EI:cd=\EY:ce=\ET:\
+ :cl=\E*:cm=\Ea%i%dR%dC:cr=^M:ct=\E0:dc=\EW:dl=\ER:\
+ :do=^J:ds=\Ez(\r:ei=\Er:fs=^M:ho=\036:\
+ :if=/usr/lib/tabset/std:im=\Eq:ip=:\
+ :is=\E`\072\Ee(\EO\Ee6\Ec41\E~4\Ec21\Ed/\Ezz&\E[A\177\Ezz'\E[B\177\Ezz(\E[D\177\Ezz)\E[C\177\Ezz<\E[Q\177\Ezz`\E[F\177\EA1*\EZH12:\
+ :k1=^A@\r:k2=^AA\r:k3=^AB\r:k4=^AC\r:k5=^AD\r:\
+ :k6=^AE\r:k7=^AF\r:k8=^AG\r:k9=^AH\r:kD=\EW:kI=\EQ:\
+ :kN=\EK:kP=\EJ:kb=^H:kd=\E[B:kh=^^:kl=\E[D:kr=\E[C:\
+ :ku=\E[A:le=^H:mb=\EG2:me=\E(\EH\003\EG0\EcD:mh=\EGp:\
+ :mr=\EG4:nd=^L:nw=\r\n:se=\EG0:sf=^J:so=\EG4:sr=\Ej:\
+ :st=\E1:ta=\011:\
+ :ti=\Ezz&\E[A\177\Ezz'\E[B\177\Ezz(\E[D\177\Ezz)\E[C\177\Ezz<\E[Q\177:\
+ :ts=\Ez(:uc=\EG8%p1%c\EG0:ue=\EG0:up=^K:us=\EG8:\
+ :ve=\E`1:vi=\E`0:
+ps300|Picture System 300:\
+ :xt:\
+ :it@:\
+ :se@:so@:ue@:us@:tc=vt100:
+teletec|Teletec Datascreen:\
+ :am:\
+ :co#80:li#24:\
+ :bl=^G:cl=^L:cr=^M:do=^J:ho=^^:le=^H:nd=^_:sf=^J:\
+ :up=^K:
+terak|Terak emulating Datamedia 1520:\
+ :tc=dm1520:
+v3220|LANPAR Vision II model 3220/3221/3222:\
+ :am:mi:xn:\
+ :co#80:it#8:li#24:\
+ :RA=\E[?7l:SA=\E[?7h:al=\E[L:cd=\E[J:ce=\E[K:\
+ :cl=\E[H\E[J:cm=\E[%i%d;%dH:dc=\E[P:dl=\E[M:ei=\E[4l:\
+ :im=\E[4h:is=\E>\E[?3l\E[?7h\E[?8h\E[p:k0=\E[1~:\
+ :k1=\E[2~:k2=\E[3~:k3=\E[4~:k4=\E[5~:k5=\E[6~:\
+ :k6=\E[OP:k7=\E[OQ:k8=\E[OR:k9=\E[OS:kd=\E[B:ke=\E>:\
+ :kh=\E[H:kl=\E[D:kr=\E[C:ks=\E=:ku=\E[A:le=^H:\
+ :nd=\E[C:se=\E[m:so=\E[7m:sr=\EM:ta=^I:ue=\E[m:\
+ :up=\E[A:us=\E[4m:
+
+
+
--- /dev/null
+#!/bin/ash
+#
+# First script called by Linux when booting
+#
+
+echo "======== init called ========"
+sbin/sleep 3
+sbin/chroot .
+#trap "" 1 2 3 15
+# exec >/dev/console </dev/console 2>&1
+PATH=sbin
+sbin/mount -t proc none /proc
+sbin/mount -t sysfs none /sys
+echo Creating /dev
+sbin/mount -o mode=0755 -t tmpfs none /dev
+sbin/mknod /dev/console c 5 1
+sbin/mknod /dev/null c 1 3
+sbin/mknod /dev/zero c 1 5
+sbin/mkdir /dev/pts
+sbin/mkdir /dev/shm
+echo Starting udev
+sbin/udevstart
+echo -n "/sbin/hotplug" > /proc/sys/kernel/hotplug
+echo "Loading scsi_mod.ko module"
+sbin/insmod /lib/scsi_mod.ko
+echo "Loading sd_mod.ko module"
+sbin/insmod /lib/sd_mod.ko
+echo "Loading aic7xxx.ko module"
+sbin/insmod /lib/aic7xxx.ko
+echo "Loading libata.ko module"
+sbin/insmod /lib/libata.ko
+echo "Loading ata_piix.ko module"
+sbin/insmod /lib/ata_piix.ko
+sbin/udevstart
+
+# CMDLINE=`cat /proc/cmdline`
+# DEBUG=""
+# case "$CMDLINE" in *debug*) DEBUG="yes"; ;; esac
+# export DEBUG
+
+# Magic incantation for root to remain in ram
+echo 0x0100 > /proc/sys/kernel/real-root-dev
+
+sbin/mount -o remount,rw /dev/root /
+
+# sh
+
+exec /sbin/init
--- /dev/null
+#!/bin/ash
+#
+# First script called by Linux when booting
+#
+
+echo "======== init called ========"
+sbin/sleep 3
+sbin/chroot .
+#trap "" 1 2 3 15
+# exec >/dev/console </dev/console 2>&1
+PATH=sbin
+sbin/mount -t proc none /proc
+sbin/mount -t sysfs none /sys
+echo Creating /dev
+sbin/mount -o mode=0755 -t tmpfs none /dev
+sbin/mknod /dev/console c 5 1
+sbin/mknod /dev/null c 1 3
+sbin/mknod /dev/zero c 1 5
+sbin/mkdir /dev/pts
+sbin/mkdir /dev/shm
+echo Starting udev
+sbin/udevstart
+echo -n "/sbin/hotplug" > /proc/sys/kernel/hotplug
+echo "Loading scsi_mod.ko module"
+sbin/insmod /lib/scsi_mod.ko
+echo "Loading sd_mod.ko module"
+sbin/insmod /lib/sd_mod.ko
+echo "Loading aic7xxx.ko module"
+sbin/insmod /lib/aic7xxx.ko
+echo "Loading libata.ko module"
+sbin/insmod /lib/libata.ko
+echo "Loading ata_piix.ko module"
+sbin/insmod /lib/ata_piix.ko
+sbin/udevstart
+
+# CMDLINE=`cat /proc/cmdline`
+# DEBUG=""
+# case "$CMDLINE" in *debug*) DEBUG="yes"; ;; esac
+# export DEBUG
+
+# Magic incantation for root to remain in ram
+echo 0x0100 > /proc/sys/kernel/real-root-dev
+
+sbin/mount -o remount,rw /dev/root /
+
+# sh
+
+exec /sbin/init
--- /dev/null
+#!/bin/sh
+#
+# First script called by Linux when booting
+#
+
+trap "" 1 2 3 15
+exec >/dev/console </dev/console 2>&1
+mount -t proc none /proc
+
+CMDLINE=`cat /proc/cmdline`
+DEBUG=""
+case "$CMDLINE" in *debug*) DEBUG="yes"; ;; esac
+export DEBUG
+
+# Magic incantation for root to remain in ram
+echo 0x0100 > /proc/sys/kernel/real-root-dev
+
+mount -o remount,rw /dev/root /
+
+# sh
+
+exit 0
--- /dev/null
+# ~/.bash_logout
+
+clear
--- /dev/null
+# .bash_profile
+
+# Get the aliases and functions
+if [ -f ~/.bashrc ]; then
+ . ~/.bashrc
+fi
+
+# User specific environment and startup programs
+
+PATH=$PATH:$HOME/bin
+BASH_ENV=$HOME/.bashrc
+USERNAME="root"
+
+export USERNAME BASH_ENV PATH
+
+
+
--- /dev/null
+# .bashrc
+
+# User specific aliases and functions
+
+alias rm='rm -i'
+alias cp='cp -i'
+alias mv='mv -i'
+alias dir='ls -l'
+
+PS1='[\u@\h \W]\$ '
+LESSCHARSET=latin1
+export LESSCHARSET
+
+# Source global definitions
+if [ -f /etc/bashrc ]; then
+ . /etc/bashrc
+fi
--- /dev/null
+Sun Feb 13 21:41:02 CET 2005
+ GNU Autoconf wants this.
--- /dev/null
+ GNU GENERAL PUBLIC LICENSE
+ Version 2, June 1991
+
+ Copyright (C) 1989, 1991 Free Software Foundation, Inc.
+ 59 Temple Place, Suite 330, Boston, MA 02111-1307, 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
+
+
+ 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 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.
--- /dev/null
+# do not edit -- automatically generated by arch changelog
+# arch-tag: automatic-ChangeLog--ekonijn@xs4all.nl--debian/yaird--devo--0.1
+#
+
+2005-03-20 22:08:17 GMT Erik van Konijnenburg <ekonijn@xs4all.nl> patch-33
+
+ Summary:
+ 0.0.5 - finalise
+ Revision:
+ yaird--devo--0.1--patch-33
+
+ * clean up NEWS, README, docs
+
+ modified files:
+ ChangeLog NEWS README TODO configure.in doc/concepts.xml
+ doc/shlibs.xml doc/tools.xml
+
+
+2005-03-19 23:44:53 GMT Erik van Konijnenburg <ekonijn@xs4all.nl> patch-32
+
+ Summary:
+ pre-0.0.5 add klibc shared libraries
+ Revision:
+ yaird--devo--0.1--patch-32
+
+ * Add executable findlibs, to determine dynamic loader and
+ basename of shared libraries, independent of which C library
+ is used. Since we don't know what path the loader will use
+ we cannot resolve shared libraries given as relative paths.
+ * factor out the finding of shared libraries from building
+ the image.
+ * Writeup on shared libraries and klibc.
+
+ new files:
+ doc/.arch-ids/shlibs.xml.id doc/shlibs.xml
+ exec/.arch-ids/findlibs.c.id exec/findlibs.c
+ perl/.arch-ids/SharedLibraries.pm.id perl/SharedLibraries.pm
+
+ modified files:
+ ChangeLog NEWS README TODO doc/Makefile.am doc/concepts.xml
+ doc/raid.xml doc/spec.xml doc/tools.xml doc/yaird.xml.in
+ exec/Makefile.am perl/Image.pm perl/Makefile.am perl/Plan.pm
+ perl/TestSet.pm
+
+
+2005-03-06 17:50:32 GMT Erik van Konijnenburg <ekonijn@xs4all.nl> patch-31
+
+ Summary:
+ pre-0.0.5 debian to initramfs
+ Revision:
+ yaird--devo--0.1--patch-31
+
+ * Document building with klibc in the README file.
+ * Adapt the Debian template to use initramfs instead of initrd.
+ The old template is available as Debian-initrd.
+ * Adapt Fedora template to use run_init.
+ * correct dependencies in doc makefile.
+ * doc: writup on initramfs and run_init; de-emphasize initrd.
+
+ new files:
+ templates/.arch-ids/Debian-initrd.pm.id
+ templates/Debian-initrd.pm
+
+ modified files:
+ ChangeLog NEWS README TODO doc/Makefile.am doc/concepts.xml
+ doc/input.xml doc/intro.xml doc/kernel.xml doc/raid.xml
+ doc/security.xml doc/spec.xml doc/yaird.xml.in
+ templates/Debian.pm templates/Fedora.pm
+
+
+2005-03-01 22:29:08 GMT Erik van Konijnenburg <ekonijn@xs4all.nl> patch-30
+
+ Summary:
+ post-0.0.4 - add run_init
+ Revision:
+ yaird--devo--0.1--patch-30
+
+ * rename directory src to perl
+ * add directory exec for stuff intended to go onto the image
+ * add exec/run_init, based on klibc;
+ not compiled with klibc in standard configuration.
+ * wrap the nuking of rootfs in ifdefs; these may go away once tested.
+ add --enable-nuke config flag to set the ifdef.
+ * automake mods to support C compilation
+ * let all templates know about location of exec, about yaird version.
+ * generate Conf.pm based on exec dir, yaird version.
+ * change install directory: lib not share since there's object code now.
+ * note the klibc licence in documentation.
+
+ new files:
+ .arch-ids/LICENCE.KLIBC.id .arch-ids/Makefile.incl.id
+ LICENCE.KLIBC Makefile.incl exec/.arch-ids/=id
+ exec/.arch-ids/Makefile.am.id exec/.arch-ids/run_init.c.id
+ exec/Makefile.am exec/run_init.c include/.arch-ids/=id
+ include/.arch-ids/config.h.in.id include/config.h.in
+
+ modified files:
+ ChangeLog Makefile.am NEWS TODO bootstrap.sh configure.in
+ doc/license.xml perl/ActionList.pm perl/Conf.pm.in
+ perl/Makefile.am perl/main.pl templates/Debian.pm
+ templates/Fedora.pm templates/Makefile.am
+
+ renamed files:
+ src/.arch-ids/=id
+ ==> perl/.arch-ids/=id
+ src/.arch-ids/ActionList.pm.id
+ ==> perl/.arch-ids/ActionList.pm.id
+ src/.arch-ids/ActiveBlockDev.pm.id
+ ==> perl/.arch-ids/ActiveBlockDev.pm.id
+ src/.arch-ids/ActiveBlockDevTab.pm.id
+ ==> perl/.arch-ids/ActiveBlockDevTab.pm.id
+ src/.arch-ids/Base.pm.id
+ ==> perl/.arch-ids/Base.pm.id
+ src/.arch-ids/Blacklist.pm.id
+ ==> perl/.arch-ids/Blacklist.pm.id
+ src/.arch-ids/BlockSpecialFile.pm.id
+ ==> perl/.arch-ids/BlockSpecialFile.pm.id
+ src/.arch-ids/BlockSpecialFileTab.pm.id
+ ==> perl/.arch-ids/BlockSpecialFileTab.pm.id
+ src/.arch-ids/Conf.pm.id
+ ==> perl/.arch-ids/Conf.pm.in.id
+ src/.arch-ids/FsEntry.pm.id
+ ==> perl/.arch-ids/FsEntry.pm.id
+ src/.arch-ids/FsOpts.pm.id
+ ==> perl/.arch-ids/FsOpts.pm.id
+ src/.arch-ids/FsTab.pm.id
+ ==> perl/.arch-ids/FsTab.pm.id
+ src/.arch-ids/Hardware.pm.id
+ ==> perl/.arch-ids/Hardware.pm.id
+ src/.arch-ids/IdeDev.pm.id
+ ==> perl/.arch-ids/IdeDev.pm.id
+ src/.arch-ids/Image.pm.id
+ ==> perl/.arch-ids/Image.pm.id
+ src/.arch-ids/Input.pm.id
+ ==> perl/.arch-ids/Input.pm.id
+ src/.arch-ids/InputTab.pm.id
+ ==> perl/.arch-ids/InputTab.pm.id
+ src/.arch-ids/KConfig.pm.id
+ ==> perl/.arch-ids/KConfig.pm.id
+ src/.arch-ids/LabeledPartition.pm.id
+ ==> perl/.arch-ids/LabeledPartition.pm.id
+ src/.arch-ids/LabeledPartitionTab.pm.id
+ ==> perl/.arch-ids/LabeledPartitionTab.pm.id
+ src/.arch-ids/LogicalVolume.pm.id
+ ==> perl/.arch-ids/LogicalVolume.pm.id
+ src/.arch-ids/LvmTab.pm.id
+ ==> perl/.arch-ids/LvmTab.pm.id
+ src/.arch-ids/Makefile.am.id
+ ==> perl/.arch-ids/Makefile.am.id
+ src/.arch-ids/ModDep.pm.id
+ ==> perl/.arch-ids/ModDep.pm.id
+ src/.arch-ids/ModDepTab.pm.id
+ ==> perl/.arch-ids/ModDepTab.pm.id
+ src/.arch-ids/Obj.pm.id
+ ==> perl/.arch-ids/Obj.pm.id
+ src/.arch-ids/Pack.pm.id
+ ==> perl/.arch-ids/Pack.pm.id
+ src/.arch-ids/PciDev.pm.id
+ ==> perl/.arch-ids/PciDev.pm.id
+ src/.arch-ids/PciMapEntry.pm.id
+ ==> perl/.arch-ids/PciMapEntry.pm.id
+ src/.arch-ids/PciTab.pm.id
+ ==> perl/.arch-ids/PciTab.pm.id
+ src/.arch-ids/PhysicalVolume.pm.id
+ ==> perl/.arch-ids/PhysicalVolume.pm.id
+ src/.arch-ids/Plan.pm.id
+ ==> perl/.arch-ids/Plan.pm.id
+ src/.arch-ids/RaidDev.pm.id
+ ==> perl/.arch-ids/RaidDev.pm.id
+ src/.arch-ids/RaidTab.pm.id
+ ==> perl/.arch-ids/RaidTab.pm.id
+ src/.arch-ids/ScsiDev.pm.id
+ ==> perl/.arch-ids/ScsiDev.pm.id
+ src/.arch-ids/TestSet.pm.id
+ ==> perl/.arch-ids/TestSet.pm.id
+ src/.arch-ids/UsbDev.pm.id
+ ==> perl/.arch-ids/UsbDev.pm.id
+ src/.arch-ids/UsbMapEntry.pm.id
+ ==> perl/.arch-ids/UsbMapEntry.pm.id
+ src/.arch-ids/UsbTab.pm.id
+ ==> perl/.arch-ids/UsbTab.pm.id
+ src/.arch-ids/VolumeGroup.pm.id
+ ==> perl/.arch-ids/VolumeGroup.pm.id
+ src/.arch-ids/main.pl.id
+ ==> perl/.arch-ids/main.pl.id
+ src/Conf.pm
+ ==> perl/Conf.pm.in
+
+ new directories:
+ exec exec/.arch-ids include include/.arch-ids perl/.arch-ids
+
+ removed directories:
+ src/.arch-ids
+
+ renamed directories:
+ src
+ ==> perl
+
+
+2005-02-24 23:13:31 GMT Erik van Konijnenburg <ekonijn@xs4all.nl> patch-29
+
+ Summary:
+ post-0.0.4 add tree copying
+ Revision:
+ yaird--devo--0.1--patch-29
+
+ * Add tree copy code to templates, to actionlist
+ processing, to image generation.
+ * Canonise filenames in templates to avoid
+ problems with eg /lib/modules/2.6.10-smp/kernel//./.
+ * In ActionList, add kernel version to every hash;
+ this allows template to refer to /lib/modules/version/kernel.
+
+ modified files:
+ ChangeLog NEWS TODO doc/concepts.xml src/ActionList.pm
+ src/Image.pm templates/Debian.pm templates/Fedora.pm
+
+
+2005-02-23 22:17:56 GMT Erik van Konijnenburg <ekonijn@xs4all.nl> patch-28
+
+ Summary:
+ post-0.0.4
+ Revision:
+ yaird--devo--0.1--patch-28
+
+ * Add --root=/dev/hdb option.
+ Since this needs to be in fstab, it's odd to
+ use a device name rather than a mount point,
+ but it's the conventional thing to do, so should
+ give rise to less confusion than changing it.
+
+ modified files:
+ ChangeLog NEWS README TODO src/FsTab.pm src/Plan.pm
+ src/main.pl
+
+
+2005-02-23 14:26:44 GMT Erik van Konijnenburg <ekonijn@xs4all.nl> patch-27
+
+ Summary:
+ 0.0.4
+ Revision:
+ yaird--devo--0.1--patch-27
+
+ * doc corrections: kernel command line no longer unsupported.
+ * bring fedora and debian templates to same level.
+
+ modified files:
+ ChangeLog NEWS doc/spec.xml templates/Debian.pm
+ templates/Fedora.pm
+
+
+2005-02-23 11:42:32 GMT Erik van Konijnenburg <ekonijn@xs4all.nl> patch-26
+
+ Summary:
+ pre-0.0.4 - kernel args
+ Revision:
+ yaird--devo--0.1--patch-26
+
+ * enough features for this week, time for some testing.
+ bump version number to 0.0.4
+ * Process kernel args, for now only init, ro, rw.
+ * as a consequence, single user mode boot now works.
+ * Ro/rw requires a new action attribute for mount: isRoot.
+ * options now only is fstab options, not the extra -n -t
+ stuff you may want to provide.
+ * new action attribute for mount: fsType.
+ * Document kernel args that may need support.
+
+
+ modified files:
+ ChangeLog TODO configure.in doc/kernel.xml src/Plan.pm
+ templates/Debian.pm
+
+
+2005-02-20 15:57:02 GMT Erik van Konijnenburg <ekonijn@xs4all.nl> patch-25
+
+ Summary:
+ post 0.0.3 - oops
+ Revision:
+ yaird--devo--0.1--patch-25
+
+ * oops, add src/ModDep.pm to version control
+
+ new files:
+ src/.arch-ids/ModDep.pm.id src/ModDep.pm
+
+ modified files:
+ ChangeLog
+
+
+2005-02-20 15:55:10 GMT Erik van Konijnenburg <ekonijn@xs4all.nl> patch-24
+
+ Summary:
+ post 0.0.3
+ Revision:
+ yaird--devo--0.1--patch-24
+
+ * Find module files based on listing in modules.dep,
+ not on scanning /lib/modules.
+ * Like modprobe, accept *any* suffix for a module
+ * But warn if the suffix is not .ko or .ko.gz,
+ and thus not likely to be generated by depmod.
+ * Remove ModDir; this is now redundant.
+ * Add ModDep.pm to encapsulate filename and
+ dependencies in a modules.dep line.
+ * Check against duplicate module names
+ * Add line numbers to module.dep parsing.
+ * Bugfix: ModDepTab::all returned hash not array.
+ * Stay closer to modprobe syntax regarding comment conventions
+ * In Debian template, verify existence of device
+ before making a node for it.
+
+ removed files:
+ src/.arch-ids/ModDir.pm.id src/ModDir.pm
+
+ modified files:
+ ChangeLog TODO src/Conf.pm src/Makefile.am src/ModDepTab.pm
+ src/Plan.pm src/TestSet.pm templates/Debian.pm
+
+
+2005-02-19 12:41:23 GMT Erik van Konijnenburg <ekonijn@xs4all.nl> patch-23
+
+ Summary:
+ post 0.0.3
+ Revision:
+ yaird--devo--0.1--patch-23
+
+ * In Hardware, recognise target\d+:\d+:\d+
+ as a new SCSI grouping, introduced in 2.6.10.
+ * In Hardware, warn about any unrecognised path component
+ * In TestSet, clean up harmless typo uncovered by warning.
+
+ modified files:
+ ChangeLog TODO src/Hardware.pm src/TestSet.pm
+
+
+2005-02-19 00:45:15 GMT Erik van Konijnenburg <ekonijn@xs4all.nl> patch-22
+
+ Summary:
+ post-0.0.3 patches
+ Revision:
+ yaird--devo--0.1--patch-22
+
+ * Empty lines in /etc/fstab are valid.
+ (Patch Goffredo Baroncelli)
+
+ modified files:
+ ChangeLog TODO src/FsTab.pm
+
+
+2005-02-16 15:51:52 GMT Erik van Konijnenburg <ekonijn@xs4all.nl> patch-21
+
+ Summary:
+ implement formats
+ Revision:
+ yaird--devo--0.1--patch-21
+
+ * implement --format options: directory, cramfs, cpio
+ * use 3rd open arg to avoid filename interpretation.
+ * adapt readme, concepts and security doc accordingly.
+
+ modified files:
+ ChangeLog README doc/concepts.xml doc/security.xml src/Base.pm
+ src/Blacklist.pm src/FsTab.pm src/Image.pm src/InputTab.pm
+ src/KConfig.pm src/LabeledPartition.pm src/LvmTab.pm
+ src/ModDepTab.pm src/Pack.pm src/PciTab.pm src/RaidTab.pm
+ src/UsbTab.pm
+
+
+2005-02-16 12:30:41 GMT Erik van Konijnenburg <ekonijn@xs4all.nl> patch-20
+
+ Summary:
+ recognise amd64 linux-gate
+ Revision:
+ yaird--devo--0.1--patch-20
+
+ * New ldd output pattern, cf debian Bug#295412.
+ Untested, I don't have 64bit.
+ * add framework for output formats.
+
+ new files:
+ src/.arch-ids/Pack.pm.id src/Pack.pm
+
+ modified files:
+ ChangeLog src/Image.pm src/Makefile.am src/main.pl
+
+
+2005-02-16 09:54:08 GMT Erik van Konijnenburg <ekonijn@xs4all.nl> patch-19
+
+ Summary:
+ gnu automake
+ Revision:
+ yaird--devo--0.1--patch-19
+
+ * factor out template/Makefile
+ * note automake in doc.
+ * add command line processing in main.
+ * add support for -v, -q, -d in Base.pm.
+ * correpsonding change in doc/spec, doc/security
+ * rewritten the README
+ * TODO now included
+
+ new files:
+ .arch-ids/TODO.id TODO templates/.arch-ids/Makefile.am.id
+ templates/Makefile.am
+
+ modified files:
+ ChangeLog Makefile.am README configure.in doc/security.xml
+ doc/spec.xml doc/tools.xml src/Base.pm src/main.pl
+
+
+2005-02-13 23:38:48 GMT Erik van Konijnenburg <ekonijn@xs4all.nl> patch-18
+
+ Summary:
+ oops in src/Makefile
+ Revision:
+ yaird--devo--0.1--patch-18
+
+ * Add to configure.in, or Makefile.in is not built from Makefile.am
+
+ modified files:
+ ChangeLog configure.in
+
+
+2005-02-13 23:36:27 GMT Erik van Konijnenburg <ekonijn@xs4all.nl> patch-17
+
+ Summary:
+ changelog misery, factoring makefile
+ Revision:
+ yaird--devo--0.1--patch-17
+
+ * remove, re-add changelog. Now it should get the log for this branch.
+ Is this what we want?
+ * Factor out src/Makefile.am
+
+ new files:
+ .arch-ids/ChangeLog.id ChangeLog src/.arch-ids/Makefile.am.id
+ src/Makefile.am
+
+ removed files:
+ .arch-ids/ChangeLog.id ChangeLog
+
+ modified files:
+ Makefile.am
+
+
+2005-02-13 23:27:22 GMT Erik van Konijnenburg <ekonijn@xs4all.nl> patch-16
+
+ Summary:
+ oops, wrong changelog.
+ Revision:
+ yaird--devo--0.1--patch-16
+
+ * Sigh, changelog from branch is copied unchanged.
+ It may be necessary to get rid of automatic tag.
+
+ modified files:
+ ChangeLog
+
+
+2005-02-13 23:23:33 GMT Erik van Konijnenburg <ekonijn@xs4all.nl> patch-15
+
+ Summary:
+ convert to automake
+ Revision:
+ yaird--devo--0.1--patch-15
+
+ * Bump to 0.0.3, use GNU automake
+
+ Patches applied:
+
+ * ekonijn@xs4all.nl--debian/yaird--gnu--0.1--base-0
+ tag of ekonijn@xs4all.nl--debian/yaird--devo--0.1--patch-14
+
+ * ekonijn@xs4all.nl--debian/yaird--gnu--0.1--patch-1
+ add GNU autoconf support
+
+ * ekonijn@xs4all.nl--debian/yaird--gnu--0.1--patch-2
+ add required files
+
+ * ekonijn@xs4all.nl--debian/yaird--gnu--0.1--patch-3
+ debug gnu automake
+
+ * ekonijn@xs4all.nl--debian/yaird--gnu--0.1--patch-4
+ tuning automake
+
+
+ new files:
+ .arch-ids/AUTHORS.id .arch-ids/ChangeLog.id
+ .arch-ids/Makefile.am.id .arch-ids/NEWS.id
+ .arch-ids/bootstrap.sh.id .arch-ids/configure.in.id AUTHORS
+ ChangeLog Makefile.am NEWS bootstrap.sh configure.in
+ doc/.arch-ids/Makefile.am.id doc/Makefile.am
+ templates/.arch-ids/=id
+
+ removed files:
+ doc/.arch-ids/Makefile.id doc/Makefile
+
+ modified files:
+ doc/yaird.xml.in src/main.pl
+
+ renamed files:
+ doc/.arch-ids/yaird.xml.id
+ ==> doc/.arch-ids/yaird.xml.in.id
+ doc/yaird.xml
+ ==> doc/yaird.xml.in
+ src/.arch-ids/Template.pm-Fedora.id
+ ==> templates/.arch-ids/Fedora.pm.id
+ src/.arch-ids/Template.pm.id
+ ==> templates/.arch-ids/Debian.pm.id
+ src/Template.pm
+ ==> templates/Debian.pm
+ src/Template.pm-Fedora
+ ==> templates/Fedora.pm
+
+ new directories:
+ templates templates/.arch-ids
+
+ new patches:
+ ekonijn@xs4all.nl--debian/yaird--gnu--0.1--base-0
+ ekonijn@xs4all.nl--debian/yaird--gnu--0.1--patch-1
+ ekonijn@xs4all.nl--debian/yaird--gnu--0.1--patch-2
+ ekonijn@xs4all.nl--debian/yaird--gnu--0.1--patch-3
+ ekonijn@xs4all.nl--debian/yaird--gnu--0.1--patch-4
+
+
+2005-02-12 01:48:49 GMT Erik van Konijnenburg <ekonijn@xs4all.nl> patch-14
+
+ Summary:
+ beware of last minute cleanup
+ Revision:
+ yaird--devo--0.1--patch-14
+
+ * Fedora template: removing ls caused a shared library
+ for /mnt/bin/cp to go missing. Fix.
+
+ modified files:
+ src/Template.pm-Fedora
+
+
+2005-02-09 23:40:12 GMT Erik van Konijnenburg <ekonijn@xs4all.nl> patch-13
+
+ Summary:
+ finalise before shipping.
+ Revision:
+ yaird--devo--0.1--patch-13
+
+ * Warning against ill advised use in README.
+ * Sample output in README.
+ * more detailed planner output.
+ * String method for actionList.
+ * typo prolog -> prologue.
+ * adapt TestSet to templating introduced in previous version.
+ * doc/intro: remove ref to non-existent manual page.
+
+ modified files:
+ README doc/intro.xml src/ActionList.pm src/Plan.pm
+ src/Template.pm src/Template.pm-Fedora src/TestSet.pm
+
+
+2005-02-09 22:04:21 GMT Erik van Konijnenburg <ekonijn@xs4all.nl> patch-12
+
+ Summary:
+ docs and finishing fedora
+ Revision:
+ yaird--devo--0.1--patch-12
+
+ * More info on initramfs found in Fedora port;
+ * Drop ls and more from the templates.
+ * Include Fedora sample template.
+ * Confess odd scripting for initramfs.
+ * Rename LICENSE to COPYING
+ * TestPlan has bugs, introduced while adding templating.
+
+ new files:
+ src/.arch-ids/Template.pm-Fedora.id src/Template.pm-Fedora
+
+ modified files:
+ README doc/kernel.xml doc/spec.xml src/Template.pm
+
+ renamed files:
+ .arch-ids/LICENSE.id
+ ==> .arch-ids/COPYING.id
+ LICENSE
+ ==> COPYING
+
+
+2005-02-09 16:16:35 GMT Erik van Konijnenburg <ekonijn@xs4all.nl> patch-11
+
+ Summary:
+ avoid error message on non-shared executable ldd
+ Revision:
+ yaird--devo--0.1--patch-11
+
+ * avoid error message on non-shared executable ldd,
+ needed because of strange file modes in FC3.
+
+ modified files:
+ src/Image.pm
+
+
+2005-02-09 16:05:04 GMT Erik van Konijnenburg <ekonijn@xs4all.nl> patch-10
+
+ Summary:
+ oops
+ Revision:
+ yaird--devo--0.1--patch-10
+
+ * Inverted pattern in previous fix to ldd.
+
+ modified files:
+ src/Image.pm
+
+
+2005-02-09 16:00:50 GMT Erik van Konijnenburg <ekonijn@xs4all.nl> patch-9
+
+ Summary:
+ other ldd output format
+ Revision:
+ yaird--devo--0.1--patch-9
+
+ * In FC3 ldd (v2.3.3), the => is omitted
+ if names on both sides are identical.
+
+
+ modified files:
+ src/Image.pm
+
+
+2005-02-09 13:14:52 GMT Erik van Konijnenburg <ekonijn@xs4all.nl> patch-8
+
+ Summary:
+ document templating
+ Revision:
+ yaird--devo--0.1--patch-8
+
+ * Discusse templating infrastructure under toolchain
+ * More logical ordering in concepts chapter,
+ discuss use of templates.
+ * Minor cleanup in security and licence chapters.
+
+ removed files:
+ doc/.arch-ids/templating.xml.id doc/templating.xml
+
+ modified files:
+ doc/concepts.xml doc/license.xml doc/security.xml doc/spec.xml
+ doc/tools.xml doc/yaird.xml
+
+
+2005-02-09 10:37:39 GMT Erik van Konijnenburg <ekonijn@xs4all.nl> patch-7
+
+ Summary:
+ implement template system
+ Revision:
+ yaird--devo--0.1--patch-7
+
+ Patches applied:
+
+ * ekonijn@xs4all.nl--debian/yaird--templ--0.1--base-0
+ tag of ekonijn@xs4all.nl--debian/yaird--devo--0.1--patch-6
+
+ * ekonijn@xs4all.nl--debian/yaird--templ--0.1--patch-1
+ implement template system:
+ * Note initramfs in FC3.
+ * Add chapter on templating to doc; unsatisfactory.
+ Specs chapter unchanged.
+ * Add debug, assert functions to Base.
+ * Add debug calls to Image.
+ * Fix bug in addDevicePlan for loop and duplicate detection: eq vs ==.
+ * Add templating infrastructure, based on HTML::Template.
+ * Ad Debian specific template.
+ * Adapt Plan to use templating infrastructure.
+ * Drop ad hoc plan expansion code.
+
+ new files:
+ doc/.arch-ids/templating.xml.id doc/templating.xml
+ src/.arch-ids/ActionList.pm.id src/.arch-ids/Template.pm.id
+ src/ActionList.pm src/Template.pm
+
+ modified files:
+ doc/kernel.xml doc/yaird.xml src/Base.pm src/Conf.pm
+ src/Image.pm src/Obj.pm src/Plan.pm src/main.pl
+
+ new patches:
+ ekonijn@xs4all.nl--debian/yaird--templ--0.1--base-0
+ ekonijn@xs4all.nl--debian/yaird--templ--0.1--patch-1
+
+
+2005-02-06 11:47:03 GMT Erik van Konijnenburg <ekonijn@xs4all.nl> patch-6
+
+ Summary:
+ oops, add KConfig.pm
+ Revision:
+ yaird--devo--0.1--patch-6
+
+ * oops, KConfig.pm needs to be added to tla archive.
+ previous version non-functional for this reason.
+
+ new files:
+ src/.arch-ids/KConfig.pm.id src/KConfig.pm
+
+
+2005-02-05 22:46:13 GMT Erik van Konijnenburg <ekonijn@xs4all.nl> patch-5
+
+ Summary:
+ preparations for Fedora port
+ Revision:
+ yaird--devo--0.1--patch-5
+
+ * divide concept.xml into simplesect's.
+ * correct USB_HID remark in input.xml
+ * add kernel config file reader
+ * add mapping module name to kernel config var.
+ * document kernel config interpretation.
+ * added test case for kernel config interpretation
+ * when resolving module names, drop the modules
+ that are built into the kernel.
+ * /etc/hotplug/blacklist.d does not have to exist.
+ * swap in /etc/fstab can have mount point 'swap'
+ as well as 'none'.
+ * No absolute path when using LVM tools: Debian
+ has them in /sbin, Fedora in /usr/sbin;
+ Including /sbin,/usr/sbin in $PATH solves this.
+ * Don't load modules for swap partitions,
+ since we don't do software suspend yet.
+ * Known issue: Fedora does not have dash, does
+ not have /etc/lvm-200. We'll need templating
+ to configure that away.
+
+ modified files:
+ doc/concepts.xml doc/input.xml doc/security.xml doc/spec.xml
+ src/Blacklist.pm src/Conf.pm src/FsTab.pm src/LvmTab.pm
+ src/ModDepTab.pm src/Plan.pm src/TestSet.pm src/main.pl
+
+
+2005-02-05 11:12:27 GMT Erik van Konijnenburg <ekonijn@xs4all.nl> patch-4
+
+ Summary:
+ reiser tested, limit PCI sibling awakening
+ Revision:
+ yaird--devo--0.1--patch-4
+
+ * Drop the todo item "test reiser"; completed succesfully.
+ * Drop 'redundant action' messages.
+ * Reduce PCI sibling awakening to USB functions only;
+ Note in doc.
+
+ modified files:
+ doc/concepts.xml doc/spec.xml src/Hardware.pm src/Plan.pm
+
+
+2005-02-05 00:11:33 GMT Erik van Konijnenburg <ekonijn@xs4all.nl> patch-3
+
+ Summary:
+ document UHCI/EHCI, fix LVM mknod
+ Revision:
+ yaird--devo--0.1--patch-3
+
+ * add a paragraph on EHCI/UHCI and load a module for
+ every function of a PCI slot to the concepts chapter.
+ * fix bug in generated mknod calls. Devices cannot always
+ be called /dev/hda, with hda the kernel name: the counter
+ example is /dev/vg0/root, device nodes generated by LVM.
+ Add function yspecial to activeBlockDev, to generate
+ a name appropriate for the block device.
+ * known bug: the PCI alternate function code is too generous.
+ Consider a chipset that has sound, ide and USB all as one
+ PCI slot. to be done.
+
+ modified files:
+ doc/concepts.xml src/ActiveBlockDev.pm src/LvmTab.pm
+ src/Plan.pm src/TestSet.pm
+
+
+2005-02-03 23:50:39 GMT Erik van Konijnenburg <ekonijn@xs4all.nl> patch-2
+
+ Summary:
+ fix EHCI/UHCI interference
+ Revision:
+ yaird--devo--0.1--patch-2
+
+ * It turns out some PCI EHCI drivers work best if the UHCI
+ driver is also loaded. Generalise to: always load modules
+ for every function of a PCI slot you need.
+
+ modified files:
+ src/Hardware.pm
+
+
+2005-02-03 21:26:53 GMT Erik van Konijnenburg <ekonijn@xs4all.nl> patch-1
+
+ Summary:
+ get rid of debug code
+ Revision:
+ yaird--devo--0.1--patch-1
+
+ * Drop hacked in 'sleep' action, leave sleep
+ on the image.
+
+ modified files:
+ src/Plan.pm
+
+
+2005-02-03 21:10:19 GMT Erik van Konijnenburg <ekonijn@xs4all.nl> base-0
+
+ Summary:
+ initial import
+ Revision:
+ yaird--devo--0.1--base-0
+
+ * first edition under version control.
+ seems to work in some simple cases,
+ still need to remove some debugging code.
+
+ new files:
+ LICENSE README doc/Makefile doc/authors.xml doc/concepts.xml
+ doc/figures/console.dia doc/figures/console.png doc/input.xml
+ doc/intro.xml doc/kernel.xml doc/license.xml doc/raid.xml
+ doc/security.xml doc/spec.xml doc/tools.xml doc/yaird.xml
+ src/ActiveBlockDev.pm src/ActiveBlockDevTab.pm src/Base.pm
+ src/Blacklist.pm src/BlockSpecialFile.pm
+ src/BlockSpecialFileTab.pm src/Conf.pm src/FsEntry.pm
+ src/FsOpts.pm src/FsTab.pm src/Hardware.pm src/IdeDev.pm
+ src/Image.pm src/Input.pm src/InputTab.pm
+ src/LabeledPartition.pm src/LabeledPartitionTab.pm
+ src/LogicalVolume.pm src/LvmTab.pm src/ModDepTab.pm
+ src/ModDir.pm src/Obj.pm src/PciDev.pm src/PciMapEntry.pm
+ src/PciTab.pm src/PhysicalVolume.pm src/Plan.pm src/RaidDev.pm
+ src/RaidTab.pm src/ScsiDev.pm src/TestSet.pm src/UsbDev.pm
+ src/UsbMapEntry.pm src/UsbTab.pm src/VolumeGroup.pm
+ src/main.pl
+
+
--- /dev/null
+Installation Instructions
+*************************
+
+Copyright (C) 1994, 1995, 1996, 1999, 2000, 2001, 2002, 2004, 2005 Free
+Software Foundation, Inc.
+
+This file is free documentation; the Free Software Foundation gives
+unlimited permission to copy, distribute and modify it.
+
+Basic Installation
+==================
+
+These are generic installation instructions.
+
+ The `configure' shell script attempts to guess correct values for
+various system-dependent variables used during compilation. It uses
+those values to create a `Makefile' in each directory of the package.
+It may also create one or more `.h' files containing system-dependent
+definitions. Finally, it creates a shell script `config.status' that
+you can run in the future to recreate the current configuration, and a
+file `config.log' containing compiler output (useful mainly for
+debugging `configure').
+
+ It can also use an optional file (typically called `config.cache'
+and enabled with `--cache-file=config.cache' or simply `-C') that saves
+the results of its tests to speed up reconfiguring. (Caching is
+disabled by default to prevent problems with accidental use of stale
+cache files.)
+
+ If you need to do unusual things to compile the package, please try
+to figure out how `configure' could check whether to do them, and mail
+diffs or instructions to the address given in the `README' so they can
+be considered for the next release. If you are using the cache, and at
+some point `config.cache' contains results you don't want to keep, you
+may remove or edit it.
+
+ The file `configure.ac' (or `configure.in') is used to create
+`configure' by a program called `autoconf'. You only need
+`configure.ac' if you want to change it or regenerate `configure' using
+a newer version of `autoconf'.
+
+The simplest way to compile this package is:
+
+ 1. `cd' to the directory containing the package's source code and type
+ `./configure' to configure the package for your system. If you're
+ using `csh' on an old version of System V, you might need to type
+ `sh ./configure' instead to prevent `csh' from trying to execute
+ `configure' itself.
+
+ Running `configure' takes awhile. While running, it prints some
+ messages telling which features it is checking for.
+
+ 2. Type `make' to compile the package.
+
+ 3. Optionally, type `make check' to run any self-tests that come with
+ the package.
+
+ 4. Type `make install' to install the programs and any data files and
+ documentation.
+
+ 5. You can remove the program binaries and object files from the
+ source code directory by typing `make clean'. To also remove the
+ files that `configure' created (so you can compile the package for
+ a different kind of computer), type `make distclean'. There is
+ also a `make maintainer-clean' target, but that is intended mainly
+ for the package's developers. If you use it, you may have to get
+ all sorts of other programs in order to regenerate files that came
+ with the distribution.
+
+Compilers and Options
+=====================
+
+Some systems require unusual options for compilation or linking that the
+`configure' script does not know about. Run `./configure --help' for
+details on some of the pertinent environment variables.
+
+ You can give `configure' initial values for configuration parameters
+by setting variables in the command line or in the environment. Here
+is an example:
+
+ ./configure CC=c89 CFLAGS=-O2 LIBS=-lposix
+
+ *Note Defining Variables::, for more details.
+
+Compiling For Multiple Architectures
+====================================
+
+You can compile the package for more than one kind of computer at the
+same time, by placing the object files for each architecture in their
+own directory. To do this, you must use a version of `make' that
+supports the `VPATH' variable, such as GNU `make'. `cd' to the
+directory where you want the object files and executables to go and run
+the `configure' script. `configure' automatically checks for the
+source code in the directory that `configure' is in and in `..'.
+
+ If you have to use a `make' that does not support the `VPATH'
+variable, you have to compile the package for one architecture at a
+time in the source code directory. After you have installed the
+package for one architecture, use `make distclean' before reconfiguring
+for another architecture.
+
+Installation Names
+==================
+
+By default, `make install' will install the package's files in
+`/usr/local/bin', `/usr/local/man', etc. You can specify an
+installation prefix other than `/usr/local' by giving `configure' the
+option `--prefix=PREFIX'.
+
+ You can specify separate installation prefixes for
+architecture-specific files and architecture-independent files. If you
+give `configure' the option `--exec-prefix=PREFIX', the package will
+use PREFIX as the prefix for installing programs and libraries.
+Documentation and other data files will still use the regular prefix.
+
+ In addition, if you use an unusual directory layout you can give
+options like `--bindir=DIR' to specify different values for particular
+kinds of files. Run `configure --help' for a list of the directories
+you can set and what kinds of files go in them.
+
+ If the package supports it, you can cause programs to be installed
+with an extra prefix or suffix on their names by giving `configure' the
+option `--program-prefix=PREFIX' or `--program-suffix=SUFFIX'.
+
+Optional Features
+=================
+
+Some packages pay attention to `--enable-FEATURE' options to
+`configure', where FEATURE indicates an optional part of the package.
+They may also pay attention to `--with-PACKAGE' options, where PACKAGE
+is something like `gnu-as' or `x' (for the X Window System). The
+`README' should mention any `--enable-' and `--with-' options that the
+package recognizes.
+
+ For packages that use the X Window System, `configure' can usually
+find the X include and library files automatically, but if it doesn't,
+you can use the `configure' options `--x-includes=DIR' and
+`--x-libraries=DIR' to specify their locations.
+
+Specifying the System Type
+==========================
+
+There may be some features `configure' cannot figure out automatically,
+but needs to determine by the type of machine the package will run on.
+Usually, assuming the package is built to be run on the _same_
+architectures, `configure' can figure that out, but if it prints a
+message saying it cannot guess the machine type, give it the
+`--build=TYPE' option. TYPE can either be a short name for the system
+type, such as `sun4', or a canonical name which has the form:
+
+ CPU-COMPANY-SYSTEM
+
+where SYSTEM can have one of these forms:
+
+ OS KERNEL-OS
+
+ See the file `config.sub' for the possible values of each field. If
+`config.sub' isn't included in this package, then this package doesn't
+need to know the machine type.
+
+ If you are _building_ compiler tools for cross-compiling, you should
+use the `--target=TYPE' option to select the type of system they will
+produce code for.
+
+ If you want to _use_ a cross compiler, that generates code for a
+platform different from the build platform, you should specify the
+"host" platform (i.e., that on which the generated programs will
+eventually be run) with `--host=TYPE'.
+
+Sharing Defaults
+================
+
+If you want to set default values for `configure' scripts to share, you
+can create a site shell script called `config.site' that gives default
+values for variables like `CC', `cache_file', and `prefix'.
+`configure' looks for `PREFIX/share/config.site' if it exists, then
+`PREFIX/etc/config.site' if it exists. Or, you can set the
+`CONFIG_SITE' environment variable to the location of the site script.
+A warning: not all `configure' scripts look for a site script.
+
+Defining Variables
+==================
+
+Variables not defined in a site shell script can be set in the
+environment passed to `configure'. However, some packages may run
+configure again during the build, and the customized values of these
+variables may be lost. In order to avoid this problem, you should set
+them in the `configure' command line, using `VAR=value'. For example:
+
+ ./configure CC=/usr/local2/bin/gcc
+
+causes the specified `gcc' to be used as the C compiler (unless it is
+overridden in the site shell script). Here is a another example:
+
+ /bin/bash ./configure CONFIG_SHELL=/bin/bash
+
+Here the `CONFIG_SHELL=/bin/bash' operand causes subsequent
+configuration-related scripts to be executed by `/bin/bash'.
+
+`configure' Invocation
+======================
+
+`configure' recognizes the following options to control how it operates.
+
+`--help'
+`-h'
+ Print a summary of the options to `configure', and exit.
+
+`--version'
+`-V'
+ Print the version of Autoconf used to generate the `configure'
+ script, and exit.
+
+`--cache-file=FILE'
+ Enable the cache: use and save the results of the tests in FILE,
+ traditionally `config.cache'. FILE defaults to `/dev/null' to
+ disable caching.
+
+`--config-cache'
+`-C'
+ Alias for `--cache-file=config.cache'.
+
+`--quiet'
+`--silent'
+`-q'
+ Do not print messages saying which checks are being made. To
+ suppress all normal output, redirect it to `/dev/null' (any error
+ messages will still be shown).
+
+`--srcdir=DIR'
+ Look for the package's source code in directory DIR. Usually
+ `configure' can determine that directory automatically.
+
+`configure' also accepts some other, not widely useful, options. Run
+`configure --help' for more details.
+
--- /dev/null
+# Makefile.in generated by automake 1.9.5 from Makefile.am.
+# Makefile. Generated from Makefile.in by configure.
+
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004, 2005 Free Software Foundation, Inc.
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+
+
+#
+# Makefile.am -- installation and packaging instructions
+# Copyright (C) 2005 Erik van Konijnenburg
+#
+# 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#
+# - auxdir contains executables that may be included in the generated
+# image
+# - perldir contains perl modules to be included by the main program
+#
+srcdir = .
+top_srcdir = .
+
+pkgdatadir = $(datadir)/yaird
+pkglibdir = $(libdir)/yaird
+pkgincludedir = $(includedir)/yaird
+top_builddir = .
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+INSTALL = /usr/bin/install -c
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+subdir = .
+DIST_COMMON = README $(am__configure_deps) $(srcdir)/Makefile.am \
+ $(srcdir)/Makefile.in $(top_srcdir)/configure \
+ $(top_srcdir)/include/config.h.in AUTHORS COPYING ChangeLog \
+ INSTALL NEWS TODO depcomp install-sh missing
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/configure.in
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+ $(ACLOCAL_M4)
+am__CONFIG_DISTCLEAN_FILES = config.status config.cache config.log \
+ configure.lineno configure.status.lineno
+mkinstalldirs = $(install_sh) -d
+CONFIG_HEADER = $(top_builddir)/include/config.h
+CONFIG_CLEAN_FILES =
+SOURCES =
+DIST_SOURCES =
+RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \
+ html-recursive info-recursive install-data-recursive \
+ install-exec-recursive install-info-recursive \
+ install-recursive installcheck-recursive installdirs-recursive \
+ pdf-recursive ps-recursive uninstall-info-recursive \
+ uninstall-recursive
+ETAGS = etags
+CTAGS = ctags
+DIST_SUBDIRS = $(SUBDIRS)
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+distdir = $(PACKAGE)-$(VERSION)
+top_distdir = $(distdir)
+am__remove_distdir = \
+ { test ! -d $(distdir) \
+ || { find $(distdir) -type d ! -perm -200 -exec chmod u+w {} ';' \
+ && rm -fr $(distdir); }; }
+DIST_ARCHIVES = $(distdir).tar.gz
+GZIP_ENV = --best
+distuninstallcheck_listfiles = find . -type f -print
+distcleancheck_listfiles = find . -type f -print
+ACLOCAL = ${SHELL} /home/kern/bacula/k/rescue/linux/cdrom/yaird-0.0.5/missing --run aclocal-1.9
+AMDEP_FALSE = #
+AMDEP_TRUE =
+AMTAR = ${SHELL} /home/kern/bacula/k/rescue/linux/cdrom/yaird-0.0.5/missing --run tar
+AUTOCONF = ${SHELL} /home/kern/bacula/k/rescue/linux/cdrom/yaird-0.0.5/missing --run autoconf
+AUTOHEADER = ${SHELL} /home/kern/bacula/k/rescue/linux/cdrom/yaird-0.0.5/missing --run autoheader
+AUTOMAKE = ${SHELL} /home/kern/bacula/k/rescue/linux/cdrom/yaird-0.0.5/missing --run automake-1.9
+AWK = gawk
+CC = gcc
+CCDEPMODE = depmode=gcc3
+CFLAGS = -g -O2
+CPPFLAGS =
+CYGPATH_W = echo
+DEFS = -DHAVE_CONFIG_H
+DEPDIR = .deps
+ECHO_C =
+ECHO_N = -n
+ECHO_T =
+EXEEXT =
+INITRD_TEMPLATE = Fedora
+INSTALL_DATA = ${INSTALL} -m 644
+INSTALL_PROGRAM = ${INSTALL}
+INSTALL_SCRIPT = ${INSTALL}
+INSTALL_STRIP_PROGRAM = ${SHELL} $(install_sh) -c -s
+LDFLAGS =
+LIBOBJS =
+LIBS =
+LTLIBOBJS =
+MAKEINFO = ${SHELL} /home/kern/bacula/k/rescue/linux/cdrom/yaird-0.0.5/missing --run makeinfo
+OBJEXT = o
+PACKAGE = yaird
+PACKAGE_BUGREPORT =
+PACKAGE_NAME =
+PACKAGE_STRING =
+PACKAGE_TARNAME =
+PACKAGE_VERSION =
+PATH_SEPARATOR = :
+PERL = /usr/bin/perl
+SET_MAKE =
+SHELL = /bin/sh
+STRIP =
+VERSION = 0.0.5
+XMLTO = /usr/bin/xmlto
+ac_ct_CC = gcc
+ac_ct_STRIP =
+am__fastdepCC_FALSE = #
+am__fastdepCC_TRUE =
+am__include = include
+am__leading_dot = .
+am__quote =
+am__tar = ${AMTAR} chof - "$$tardir"
+am__untar = ${AMTAR} xf -
+bindir = ${exec_prefix}/bin
+build_alias =
+datadir = ${prefix}/share
+exec_prefix = ${prefix}
+host_alias =
+includedir = ${prefix}/include
+infodir = ${prefix}/info
+install_sh = /home/kern/bacula/k/rescue/linux/cdrom/yaird-0.0.5/install-sh
+libdir = ${exec_prefix}/lib
+libexecdir = ${exec_prefix}/libexec
+localstatedir = ${prefix}/var
+mandir = ${prefix}/man
+mkdir_p = mkdir -p --
+oldincludedir = /usr/include
+prefix = /usr/local
+program_transform_name = s,x,x,
+sbindir = ${exec_prefix}/sbin
+sharedstatedir = ${prefix}/com
+sysconfdir = ${prefix}/etc
+target_alias =
+auxdir = $(pkglibdir)/exec
+perldir = $(pkglibdir)/perl
+SUBDIRS = perl templates doc exec
+
+# not compiled, but must go in the tarball.
+EXTRA_DIST = \
+ bootstrap.sh
+
+all: all-recursive
+
+.SUFFIXES:
+am--refresh:
+ @:
+$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps)
+ @for dep in $?; do \
+ case '$(am__configure_deps)' in \
+ *$$dep*) \
+ echo ' cd $(srcdir) && $(AUTOMAKE) --gnu '; \
+ cd $(srcdir) && $(AUTOMAKE) --gnu \
+ && exit 0; \
+ exit 1;; \
+ esac; \
+ done; \
+ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu Makefile'; \
+ cd $(top_srcdir) && \
+ $(AUTOMAKE) --gnu Makefile
+.PRECIOUS: Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+ @case '$?' in \
+ *config.status*) \
+ echo ' $(SHELL) ./config.status'; \
+ $(SHELL) ./config.status;; \
+ *) \
+ echo ' cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe)'; \
+ cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe);; \
+ esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+ $(SHELL) ./config.status --recheck
+
+$(top_srcdir)/configure: $(am__configure_deps)
+ cd $(srcdir) && $(AUTOCONF)
+$(ACLOCAL_M4): $(am__aclocal_m4_deps)
+ cd $(srcdir) && $(ACLOCAL) $(ACLOCAL_AMFLAGS)
+
+include/config.h: include/stamp-h1
+ @if test ! -f $@; then \
+ rm -f include/stamp-h1; \
+ $(MAKE) include/stamp-h1; \
+ else :; fi
+
+include/stamp-h1: $(top_srcdir)/include/config.h.in $(top_builddir)/config.status
+ @rm -f include/stamp-h1
+ cd $(top_builddir) && $(SHELL) ./config.status include/config.h
+$(top_srcdir)/include/config.h.in: $(am__configure_deps)
+ cd $(top_srcdir) && $(AUTOHEADER)
+ rm -f include/stamp-h1
+ touch $@
+
+distclean-hdr:
+ -rm -f include/config.h include/stamp-h1
+uninstall-info-am:
+
+# This directory's subdirectories are mostly independent; you can cd
+# into them and run `make' without going through this Makefile.
+# To change the values of `make' variables: instead of editing Makefiles,
+# (1) if the variable is set in `config.status', edit `config.status'
+# (which will cause the Makefiles to be regenerated when you run `make');
+# (2) otherwise, pass the desired values on the `make' command line.
+$(RECURSIVE_TARGETS):
+ @failcom='exit 1'; \
+ for f in x $$MAKEFLAGS; do \
+ case $$f in \
+ *=* | --[!k]*);; \
+ *k*) failcom='fail=yes';; \
+ esac; \
+ done; \
+ dot_seen=no; \
+ target=`echo $@ | sed s/-recursive//`; \
+ list='$(SUBDIRS)'; for subdir in $$list; do \
+ echo "Making $$target in $$subdir"; \
+ if test "$$subdir" = "."; then \
+ dot_seen=yes; \
+ local_target="$$target-am"; \
+ else \
+ local_target="$$target"; \
+ fi; \
+ (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
+ || eval $$failcom; \
+ done; \
+ if test "$$dot_seen" = "no"; then \
+ $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \
+ fi; test -z "$$fail"
+
+mostlyclean-recursive clean-recursive distclean-recursive \
+maintainer-clean-recursive:
+ @failcom='exit 1'; \
+ for f in x $$MAKEFLAGS; do \
+ case $$f in \
+ *=* | --[!k]*);; \
+ *k*) failcom='fail=yes';; \
+ esac; \
+ done; \
+ dot_seen=no; \
+ case "$@" in \
+ distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \
+ *) list='$(SUBDIRS)' ;; \
+ esac; \
+ rev=''; for subdir in $$list; do \
+ if test "$$subdir" = "."; then :; else \
+ rev="$$subdir $$rev"; \
+ fi; \
+ done; \
+ rev="$$rev ."; \
+ target=`echo $@ | sed s/-recursive//`; \
+ for subdir in $$rev; do \
+ echo "Making $$target in $$subdir"; \
+ if test "$$subdir" = "."; then \
+ local_target="$$target-am"; \
+ else \
+ local_target="$$target"; \
+ fi; \
+ (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
+ || eval $$failcom; \
+ done && test -z "$$fail"
+tags-recursive:
+ list='$(SUBDIRS)'; for subdir in $$list; do \
+ test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \
+ done
+ctags-recursive:
+ list='$(SUBDIRS)'; for subdir in $$list; do \
+ test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \
+ done
+
+ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
+ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | \
+ $(AWK) ' { files[$$0] = 1; } \
+ END { for (i in files) print i; }'`; \
+ mkid -fID $$unique
+tags: TAGS
+
+TAGS: tags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
+ $(TAGS_FILES) $(LISP)
+ tags=; \
+ here=`pwd`; \
+ if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \
+ include_option=--etags-include; \
+ empty_fix=.; \
+ else \
+ include_option=--include; \
+ empty_fix=; \
+ fi; \
+ list='$(SUBDIRS)'; for subdir in $$list; do \
+ if test "$$subdir" = .; then :; else \
+ test ! -f $$subdir/TAGS || \
+ tags="$$tags $$include_option=$$here/$$subdir/TAGS"; \
+ fi; \
+ done; \
+ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | \
+ $(AWK) ' { files[$$0] = 1; } \
+ END { for (i in files) print i; }'`; \
+ if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \
+ test -n "$$unique" || unique=$$empty_fix; \
+ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+ $$tags $$unique; \
+ fi
+ctags: CTAGS
+CTAGS: ctags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
+ $(TAGS_FILES) $(LISP)
+ tags=; \
+ here=`pwd`; \
+ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | \
+ $(AWK) ' { files[$$0] = 1; } \
+ END { for (i in files) print i; }'`; \
+ test -z "$(CTAGS_ARGS)$$tags$$unique" \
+ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
+ $$tags $$unique
+
+GTAGS:
+ here=`$(am__cd) $(top_builddir) && pwd` \
+ && cd $(top_srcdir) \
+ && gtags -i $(GTAGS_ARGS) $$here
+
+distclean-tags:
+ -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
+
+distdir: $(DISTFILES)
+ $(am__remove_distdir)
+ mkdir $(distdir)
+ $(mkdir_p) $(distdir)/doc $(distdir)/include
+ @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \
+ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \
+ list='$(DISTFILES)'; for file in $$list; do \
+ case $$file in \
+ $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \
+ $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \
+ esac; \
+ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+ dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \
+ if test "$$dir" != "$$file" && test "$$dir" != "."; then \
+ dir="/$$dir"; \
+ $(mkdir_p) "$(distdir)$$dir"; \
+ else \
+ dir=''; \
+ fi; \
+ if test -d $$d/$$file; then \
+ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+ cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
+ fi; \
+ cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
+ else \
+ test -f $(distdir)/$$file \
+ || cp -p $$d/$$file $(distdir)/$$file \
+ || exit 1; \
+ fi; \
+ done
+ list='$(DIST_SUBDIRS)'; for subdir in $$list; do \
+ if test "$$subdir" = .; then :; else \
+ test -d "$(distdir)/$$subdir" \
+ || $(mkdir_p) "$(distdir)/$$subdir" \
+ || exit 1; \
+ distdir=`$(am__cd) $(distdir) && pwd`; \
+ top_distdir=`$(am__cd) $(top_distdir) && pwd`; \
+ (cd $$subdir && \
+ $(MAKE) $(AM_MAKEFLAGS) \
+ top_distdir="$$top_distdir" \
+ distdir="$$distdir/$$subdir" \
+ distdir) \
+ || exit 1; \
+ fi; \
+ done
+ -find $(distdir) -type d ! -perm -777 -exec chmod a+rwx {} \; -o \
+ ! -type d ! -perm -444 -links 1 -exec chmod a+r {} \; -o \
+ ! -type d ! -perm -400 -exec chmod a+r {} \; -o \
+ ! -type d ! -perm -444 -exec $(SHELL) $(install_sh) -c -m a+r {} {} \; \
+ || chmod -R a+r $(distdir)
+dist-gzip: distdir
+ tardir=$(distdir) && $(am__tar) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz
+ $(am__remove_distdir)
+
+dist-bzip2: distdir
+ tardir=$(distdir) && $(am__tar) | bzip2 -9 -c >$(distdir).tar.bz2
+ $(am__remove_distdir)
+
+dist-tarZ: distdir
+ tardir=$(distdir) && $(am__tar) | compress -c >$(distdir).tar.Z
+ $(am__remove_distdir)
+
+dist-shar: distdir
+ shar $(distdir) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).shar.gz
+ $(am__remove_distdir)
+
+dist-zip: distdir
+ -rm -f $(distdir).zip
+ zip -rq $(distdir).zip $(distdir)
+ $(am__remove_distdir)
+
+dist dist-all: distdir
+ tardir=$(distdir) && $(am__tar) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz
+ $(am__remove_distdir)
+
+# This target untars the dist file and tries a VPATH configuration. Then
+# it guarantees that the distribution is self-contained by making another
+# tarfile.
+distcheck: dist
+ case '$(DIST_ARCHIVES)' in \
+ *.tar.gz*) \
+ GZIP=$(GZIP_ENV) gunzip -c $(distdir).tar.gz | $(am__untar) ;;\
+ *.tar.bz2*) \
+ bunzip2 -c $(distdir).tar.bz2 | $(am__untar) ;;\
+ *.tar.Z*) \
+ uncompress -c $(distdir).tar.Z | $(am__untar) ;;\
+ *.shar.gz*) \
+ GZIP=$(GZIP_ENV) gunzip -c $(distdir).shar.gz | unshar ;;\
+ *.zip*) \
+ unzip $(distdir).zip ;;\
+ esac
+ chmod -R a-w $(distdir); chmod a+w $(distdir)
+ mkdir $(distdir)/_build
+ mkdir $(distdir)/_inst
+ chmod a-w $(distdir)
+ dc_install_base=`$(am__cd) $(distdir)/_inst && pwd | sed -e 's,^[^:\\/]:[\\/],/,'` \
+ && dc_destdir="$${TMPDIR-/tmp}/am-dc-$$$$/" \
+ && cd $(distdir)/_build \
+ && ../configure --srcdir=.. --prefix="$$dc_install_base" \
+ $(DISTCHECK_CONFIGURE_FLAGS) \
+ && $(MAKE) $(AM_MAKEFLAGS) \
+ && $(MAKE) $(AM_MAKEFLAGS) dvi \
+ && $(MAKE) $(AM_MAKEFLAGS) check \
+ && $(MAKE) $(AM_MAKEFLAGS) install \
+ && $(MAKE) $(AM_MAKEFLAGS) installcheck \
+ && $(MAKE) $(AM_MAKEFLAGS) uninstall \
+ && $(MAKE) $(AM_MAKEFLAGS) distuninstallcheck_dir="$$dc_install_base" \
+ distuninstallcheck \
+ && chmod -R a-w "$$dc_install_base" \
+ && ({ \
+ (cd ../.. && umask 077 && mkdir "$$dc_destdir") \
+ && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" install \
+ && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" uninstall \
+ && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" \
+ distuninstallcheck_dir="$$dc_destdir" distuninstallcheck; \
+ } || { rm -rf "$$dc_destdir"; exit 1; }) \
+ && rm -rf "$$dc_destdir" \
+ && $(MAKE) $(AM_MAKEFLAGS) dist \
+ && rm -rf $(DIST_ARCHIVES) \
+ && $(MAKE) $(AM_MAKEFLAGS) distcleancheck
+ $(am__remove_distdir)
+ @(echo "$(distdir) archives ready for distribution: "; \
+ list='$(DIST_ARCHIVES)'; for i in $$list; do echo $$i; done) | \
+ sed -e '1{h;s/./=/g;p;x;}' -e '$${p;x;}'
+distuninstallcheck:
+ @cd $(distuninstallcheck_dir) \
+ && test `$(distuninstallcheck_listfiles) | wc -l` -le 1 \
+ || { echo "ERROR: files left after uninstall:" ; \
+ if test -n "$(DESTDIR)"; then \
+ echo " (check DESTDIR support)"; \
+ fi ; \
+ $(distuninstallcheck_listfiles) ; \
+ exit 1; } >&2
+distcleancheck: distclean
+ @if test '$(srcdir)' = . ; then \
+ echo "ERROR: distcleancheck can only run from a VPATH build" ; \
+ exit 1 ; \
+ fi
+ @test `$(distcleancheck_listfiles) | wc -l` -eq 0 \
+ || { echo "ERROR: files left in build directory after distclean:" ; \
+ $(distcleancheck_listfiles) ; \
+ exit 1; } >&2
+check-am: all-am
+check: check-recursive
+all-am: Makefile
+installdirs: installdirs-recursive
+installdirs-am:
+install: install-recursive
+install-exec: install-exec-recursive
+install-data: install-data-recursive
+uninstall: uninstall-recursive
+
+install-am: all-am
+ @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-recursive
+install-strip:
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ `test -z '$(STRIP)' || \
+ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+mostlyclean-generic:
+
+clean-generic:
+
+distclean-generic:
+ -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+
+maintainer-clean-generic:
+ @echo "This command is intended for maintainers to use"
+ @echo "it deletes files that may require special tools to rebuild."
+clean: clean-recursive
+
+clean-am: clean-generic mostlyclean-am
+
+distclean: distclean-recursive
+ -rm -f $(am__CONFIG_DISTCLEAN_FILES)
+ -rm -f Makefile
+distclean-am: clean-am distclean-generic distclean-hdr distclean-tags
+
+dvi: dvi-recursive
+
+dvi-am:
+
+html: html-recursive
+
+info: info-recursive
+
+info-am:
+
+install-data-am:
+
+install-exec-am:
+
+install-info: install-info-recursive
+
+install-man:
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-recursive
+ -rm -f $(am__CONFIG_DISTCLEAN_FILES)
+ -rm -rf $(top_srcdir)/autom4te.cache
+ -rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-recursive
+
+mostlyclean-am: mostlyclean-generic
+
+pdf: pdf-recursive
+
+pdf-am:
+
+ps: ps-recursive
+
+ps-am:
+
+uninstall-am: uninstall-info-am
+
+uninstall-info: uninstall-info-recursive
+
+.PHONY: $(RECURSIVE_TARGETS) CTAGS GTAGS all all-am am--refresh check \
+ check-am clean clean-generic clean-recursive ctags \
+ ctags-recursive dist dist-all dist-bzip2 dist-gzip dist-shar \
+ dist-tarZ dist-zip distcheck distclean distclean-generic \
+ distclean-hdr distclean-recursive distclean-tags \
+ distcleancheck distdir distuninstallcheck dvi dvi-am html \
+ html-am info info-am install install-am install-data \
+ install-data-am install-exec install-exec-am install-info \
+ install-info-am install-man install-strip installcheck \
+ installcheck-am installdirs installdirs-am maintainer-clean \
+ maintainer-clean-generic maintainer-clean-recursive \
+ mostlyclean mostlyclean-generic mostlyclean-recursive pdf \
+ pdf-am ps ps-am tags tags-recursive uninstall uninstall-am \
+ uninstall-info-am
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
--- /dev/null
+#
+# Makefile.am -- installation and packaging instructions
+# Copyright (C) 2005 Erik van Konijnenburg
+#
+# 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#
+# - auxdir contains executables that may be included in the generated
+# image
+# - perldir contains perl modules to be included by the main program
+#
+
+auxdir = $(pkglibdir)/exec
+perldir = $(pkglibdir)/perl
+
+SUBDIRS = perl templates doc exec
+
+# not compiled, but must go in the tarball.
+EXTRA_DIST = \
+ bootstrap.sh
--- /dev/null
+# Makefile.in generated by automake 1.9.5 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004, 2005 Free Software Foundation, Inc.
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+@SET_MAKE@
+
+#
+# Makefile.am -- installation and packaging instructions
+# Copyright (C) 2005 Erik van Konijnenburg
+#
+# 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#
+# - auxdir contains executables that may be included in the generated
+# image
+# - perldir contains perl modules to be included by the main program
+#
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH = @srcdir@
+pkgdatadir = $(datadir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+top_builddir = .
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+INSTALL = @INSTALL@
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+subdir = .
+DIST_COMMON = README $(am__configure_deps) $(srcdir)/Makefile.am \
+ $(srcdir)/Makefile.in $(top_srcdir)/configure \
+ $(top_srcdir)/include/config.h.in AUTHORS COPYING ChangeLog \
+ INSTALL NEWS TODO depcomp install-sh missing
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/configure.in
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+ $(ACLOCAL_M4)
+am__CONFIG_DISTCLEAN_FILES = config.status config.cache config.log \
+ configure.lineno configure.status.lineno
+mkinstalldirs = $(install_sh) -d
+CONFIG_HEADER = $(top_builddir)/include/config.h
+CONFIG_CLEAN_FILES =
+SOURCES =
+DIST_SOURCES =
+RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \
+ html-recursive info-recursive install-data-recursive \
+ install-exec-recursive install-info-recursive \
+ install-recursive installcheck-recursive installdirs-recursive \
+ pdf-recursive ps-recursive uninstall-info-recursive \
+ uninstall-recursive
+ETAGS = etags
+CTAGS = ctags
+DIST_SUBDIRS = $(SUBDIRS)
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+distdir = $(PACKAGE)-$(VERSION)
+top_distdir = $(distdir)
+am__remove_distdir = \
+ { test ! -d $(distdir) \
+ || { find $(distdir) -type d ! -perm -200 -exec chmod u+w {} ';' \
+ && rm -fr $(distdir); }; }
+DIST_ARCHIVES = $(distdir).tar.gz
+GZIP_ENV = --best
+distuninstallcheck_listfiles = find . -type f -print
+distcleancheck_listfiles = find . -type f -print
+ACLOCAL = @ACLOCAL@
+AMDEP_FALSE = @AMDEP_FALSE@
+AMDEP_TRUE = @AMDEP_TRUE@
+AMTAR = @AMTAR@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CPPFLAGS = @CPPFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EXEEXT = @EXEEXT@
+INITRD_TEMPLATE = @INITRD_TEMPLATE@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+LDFLAGS = @LDFLAGS@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LTLIBOBJS = @LTLIBOBJS@
+MAKEINFO = @MAKEINFO@
+OBJEXT = @OBJEXT@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PERL = @PERL@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+VERSION = @VERSION@
+XMLTO = @XMLTO@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_STRIP = @ac_ct_STRIP@
+am__fastdepCC_FALSE = @am__fastdepCC_FALSE@
+am__fastdepCC_TRUE = @am__fastdepCC_TRUE@
+am__include = @am__include@
+am__leading_dot = @am__leading_dot@
+am__quote = @am__quote@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build_alias = @build_alias@
+datadir = @datadir@
+exec_prefix = @exec_prefix@
+host_alias = @host_alias@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+oldincludedir = @oldincludedir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+auxdir = $(pkglibdir)/exec
+perldir = $(pkglibdir)/perl
+SUBDIRS = perl templates doc exec
+
+# not compiled, but must go in the tarball.
+EXTRA_DIST = \
+ bootstrap.sh
+
+all: all-recursive
+
+.SUFFIXES:
+am--refresh:
+ @:
+$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps)
+ @for dep in $?; do \
+ case '$(am__configure_deps)' in \
+ *$$dep*) \
+ echo ' cd $(srcdir) && $(AUTOMAKE) --gnu '; \
+ cd $(srcdir) && $(AUTOMAKE) --gnu \
+ && exit 0; \
+ exit 1;; \
+ esac; \
+ done; \
+ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu Makefile'; \
+ cd $(top_srcdir) && \
+ $(AUTOMAKE) --gnu Makefile
+.PRECIOUS: Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+ @case '$?' in \
+ *config.status*) \
+ echo ' $(SHELL) ./config.status'; \
+ $(SHELL) ./config.status;; \
+ *) \
+ echo ' cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe)'; \
+ cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe);; \
+ esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+ $(SHELL) ./config.status --recheck
+
+$(top_srcdir)/configure: $(am__configure_deps)
+ cd $(srcdir) && $(AUTOCONF)
+$(ACLOCAL_M4): $(am__aclocal_m4_deps)
+ cd $(srcdir) && $(ACLOCAL) $(ACLOCAL_AMFLAGS)
+
+include/config.h: include/stamp-h1
+ @if test ! -f $@; then \
+ rm -f include/stamp-h1; \
+ $(MAKE) include/stamp-h1; \
+ else :; fi
+
+include/stamp-h1: $(top_srcdir)/include/config.h.in $(top_builddir)/config.status
+ @rm -f include/stamp-h1
+ cd $(top_builddir) && $(SHELL) ./config.status include/config.h
+$(top_srcdir)/include/config.h.in: $(am__configure_deps)
+ cd $(top_srcdir) && $(AUTOHEADER)
+ rm -f include/stamp-h1
+ touch $@
+
+distclean-hdr:
+ -rm -f include/config.h include/stamp-h1
+uninstall-info-am:
+
+# This directory's subdirectories are mostly independent; you can cd
+# into them and run `make' without going through this Makefile.
+# To change the values of `make' variables: instead of editing Makefiles,
+# (1) if the variable is set in `config.status', edit `config.status'
+# (which will cause the Makefiles to be regenerated when you run `make');
+# (2) otherwise, pass the desired values on the `make' command line.
+$(RECURSIVE_TARGETS):
+ @failcom='exit 1'; \
+ for f in x $$MAKEFLAGS; do \
+ case $$f in \
+ *=* | --[!k]*);; \
+ *k*) failcom='fail=yes';; \
+ esac; \
+ done; \
+ dot_seen=no; \
+ target=`echo $@ | sed s/-recursive//`; \
+ list='$(SUBDIRS)'; for subdir in $$list; do \
+ echo "Making $$target in $$subdir"; \
+ if test "$$subdir" = "."; then \
+ dot_seen=yes; \
+ local_target="$$target-am"; \
+ else \
+ local_target="$$target"; \
+ fi; \
+ (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
+ || eval $$failcom; \
+ done; \
+ if test "$$dot_seen" = "no"; then \
+ $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \
+ fi; test -z "$$fail"
+
+mostlyclean-recursive clean-recursive distclean-recursive \
+maintainer-clean-recursive:
+ @failcom='exit 1'; \
+ for f in x $$MAKEFLAGS; do \
+ case $$f in \
+ *=* | --[!k]*);; \
+ *k*) failcom='fail=yes';; \
+ esac; \
+ done; \
+ dot_seen=no; \
+ case "$@" in \
+ distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \
+ *) list='$(SUBDIRS)' ;; \
+ esac; \
+ rev=''; for subdir in $$list; do \
+ if test "$$subdir" = "."; then :; else \
+ rev="$$subdir $$rev"; \
+ fi; \
+ done; \
+ rev="$$rev ."; \
+ target=`echo $@ | sed s/-recursive//`; \
+ for subdir in $$rev; do \
+ echo "Making $$target in $$subdir"; \
+ if test "$$subdir" = "."; then \
+ local_target="$$target-am"; \
+ else \
+ local_target="$$target"; \
+ fi; \
+ (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
+ || eval $$failcom; \
+ done && test -z "$$fail"
+tags-recursive:
+ list='$(SUBDIRS)'; for subdir in $$list; do \
+ test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \
+ done
+ctags-recursive:
+ list='$(SUBDIRS)'; for subdir in $$list; do \
+ test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \
+ done
+
+ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
+ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | \
+ $(AWK) ' { files[$$0] = 1; } \
+ END { for (i in files) print i; }'`; \
+ mkid -fID $$unique
+tags: TAGS
+
+TAGS: tags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
+ $(TAGS_FILES) $(LISP)
+ tags=; \
+ here=`pwd`; \
+ if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \
+ include_option=--etags-include; \
+ empty_fix=.; \
+ else \
+ include_option=--include; \
+ empty_fix=; \
+ fi; \
+ list='$(SUBDIRS)'; for subdir in $$list; do \
+ if test "$$subdir" = .; then :; else \
+ test ! -f $$subdir/TAGS || \
+ tags="$$tags $$include_option=$$here/$$subdir/TAGS"; \
+ fi; \
+ done; \
+ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | \
+ $(AWK) ' { files[$$0] = 1; } \
+ END { for (i in files) print i; }'`; \
+ if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \
+ test -n "$$unique" || unique=$$empty_fix; \
+ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+ $$tags $$unique; \
+ fi
+ctags: CTAGS
+CTAGS: ctags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
+ $(TAGS_FILES) $(LISP)
+ tags=; \
+ here=`pwd`; \
+ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | \
+ $(AWK) ' { files[$$0] = 1; } \
+ END { for (i in files) print i; }'`; \
+ test -z "$(CTAGS_ARGS)$$tags$$unique" \
+ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
+ $$tags $$unique
+
+GTAGS:
+ here=`$(am__cd) $(top_builddir) && pwd` \
+ && cd $(top_srcdir) \
+ && gtags -i $(GTAGS_ARGS) $$here
+
+distclean-tags:
+ -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
+
+distdir: $(DISTFILES)
+ $(am__remove_distdir)
+ mkdir $(distdir)
+ $(mkdir_p) $(distdir)/doc $(distdir)/include
+ @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \
+ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \
+ list='$(DISTFILES)'; for file in $$list; do \
+ case $$file in \
+ $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \
+ $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \
+ esac; \
+ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+ dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \
+ if test "$$dir" != "$$file" && test "$$dir" != "."; then \
+ dir="/$$dir"; \
+ $(mkdir_p) "$(distdir)$$dir"; \
+ else \
+ dir=''; \
+ fi; \
+ if test -d $$d/$$file; then \
+ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+ cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
+ fi; \
+ cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
+ else \
+ test -f $(distdir)/$$file \
+ || cp -p $$d/$$file $(distdir)/$$file \
+ || exit 1; \
+ fi; \
+ done
+ list='$(DIST_SUBDIRS)'; for subdir in $$list; do \
+ if test "$$subdir" = .; then :; else \
+ test -d "$(distdir)/$$subdir" \
+ || $(mkdir_p) "$(distdir)/$$subdir" \
+ || exit 1; \
+ distdir=`$(am__cd) $(distdir) && pwd`; \
+ top_distdir=`$(am__cd) $(top_distdir) && pwd`; \
+ (cd $$subdir && \
+ $(MAKE) $(AM_MAKEFLAGS) \
+ top_distdir="$$top_distdir" \
+ distdir="$$distdir/$$subdir" \
+ distdir) \
+ || exit 1; \
+ fi; \
+ done
+ -find $(distdir) -type d ! -perm -777 -exec chmod a+rwx {} \; -o \
+ ! -type d ! -perm -444 -links 1 -exec chmod a+r {} \; -o \
+ ! -type d ! -perm -400 -exec chmod a+r {} \; -o \
+ ! -type d ! -perm -444 -exec $(SHELL) $(install_sh) -c -m a+r {} {} \; \
+ || chmod -R a+r $(distdir)
+dist-gzip: distdir
+ tardir=$(distdir) && $(am__tar) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz
+ $(am__remove_distdir)
+
+dist-bzip2: distdir
+ tardir=$(distdir) && $(am__tar) | bzip2 -9 -c >$(distdir).tar.bz2
+ $(am__remove_distdir)
+
+dist-tarZ: distdir
+ tardir=$(distdir) && $(am__tar) | compress -c >$(distdir).tar.Z
+ $(am__remove_distdir)
+
+dist-shar: distdir
+ shar $(distdir) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).shar.gz
+ $(am__remove_distdir)
+
+dist-zip: distdir
+ -rm -f $(distdir).zip
+ zip -rq $(distdir).zip $(distdir)
+ $(am__remove_distdir)
+
+dist dist-all: distdir
+ tardir=$(distdir) && $(am__tar) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz
+ $(am__remove_distdir)
+
+# This target untars the dist file and tries a VPATH configuration. Then
+# it guarantees that the distribution is self-contained by making another
+# tarfile.
+distcheck: dist
+ case '$(DIST_ARCHIVES)' in \
+ *.tar.gz*) \
+ GZIP=$(GZIP_ENV) gunzip -c $(distdir).tar.gz | $(am__untar) ;;\
+ *.tar.bz2*) \
+ bunzip2 -c $(distdir).tar.bz2 | $(am__untar) ;;\
+ *.tar.Z*) \
+ uncompress -c $(distdir).tar.Z | $(am__untar) ;;\
+ *.shar.gz*) \
+ GZIP=$(GZIP_ENV) gunzip -c $(distdir).shar.gz | unshar ;;\
+ *.zip*) \
+ unzip $(distdir).zip ;;\
+ esac
+ chmod -R a-w $(distdir); chmod a+w $(distdir)
+ mkdir $(distdir)/_build
+ mkdir $(distdir)/_inst
+ chmod a-w $(distdir)
+ dc_install_base=`$(am__cd) $(distdir)/_inst && pwd | sed -e 's,^[^:\\/]:[\\/],/,'` \
+ && dc_destdir="$${TMPDIR-/tmp}/am-dc-$$$$/" \
+ && cd $(distdir)/_build \
+ && ../configure --srcdir=.. --prefix="$$dc_install_base" \
+ $(DISTCHECK_CONFIGURE_FLAGS) \
+ && $(MAKE) $(AM_MAKEFLAGS) \
+ && $(MAKE) $(AM_MAKEFLAGS) dvi \
+ && $(MAKE) $(AM_MAKEFLAGS) check \
+ && $(MAKE) $(AM_MAKEFLAGS) install \
+ && $(MAKE) $(AM_MAKEFLAGS) installcheck \
+ && $(MAKE) $(AM_MAKEFLAGS) uninstall \
+ && $(MAKE) $(AM_MAKEFLAGS) distuninstallcheck_dir="$$dc_install_base" \
+ distuninstallcheck \
+ && chmod -R a-w "$$dc_install_base" \
+ && ({ \
+ (cd ../.. && umask 077 && mkdir "$$dc_destdir") \
+ && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" install \
+ && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" uninstall \
+ && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" \
+ distuninstallcheck_dir="$$dc_destdir" distuninstallcheck; \
+ } || { rm -rf "$$dc_destdir"; exit 1; }) \
+ && rm -rf "$$dc_destdir" \
+ && $(MAKE) $(AM_MAKEFLAGS) dist \
+ && rm -rf $(DIST_ARCHIVES) \
+ && $(MAKE) $(AM_MAKEFLAGS) distcleancheck
+ $(am__remove_distdir)
+ @(echo "$(distdir) archives ready for distribution: "; \
+ list='$(DIST_ARCHIVES)'; for i in $$list; do echo $$i; done) | \
+ sed -e '1{h;s/./=/g;p;x;}' -e '$${p;x;}'
+distuninstallcheck:
+ @cd $(distuninstallcheck_dir) \
+ && test `$(distuninstallcheck_listfiles) | wc -l` -le 1 \
+ || { echo "ERROR: files left after uninstall:" ; \
+ if test -n "$(DESTDIR)"; then \
+ echo " (check DESTDIR support)"; \
+ fi ; \
+ $(distuninstallcheck_listfiles) ; \
+ exit 1; } >&2
+distcleancheck: distclean
+ @if test '$(srcdir)' = . ; then \
+ echo "ERROR: distcleancheck can only run from a VPATH build" ; \
+ exit 1 ; \
+ fi
+ @test `$(distcleancheck_listfiles) | wc -l` -eq 0 \
+ || { echo "ERROR: files left in build directory after distclean:" ; \
+ $(distcleancheck_listfiles) ; \
+ exit 1; } >&2
+check-am: all-am
+check: check-recursive
+all-am: Makefile
+installdirs: installdirs-recursive
+installdirs-am:
+install: install-recursive
+install-exec: install-exec-recursive
+install-data: install-data-recursive
+uninstall: uninstall-recursive
+
+install-am: all-am
+ @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-recursive
+install-strip:
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ `test -z '$(STRIP)' || \
+ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+mostlyclean-generic:
+
+clean-generic:
+
+distclean-generic:
+ -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+
+maintainer-clean-generic:
+ @echo "This command is intended for maintainers to use"
+ @echo "it deletes files that may require special tools to rebuild."
+clean: clean-recursive
+
+clean-am: clean-generic mostlyclean-am
+
+distclean: distclean-recursive
+ -rm -f $(am__CONFIG_DISTCLEAN_FILES)
+ -rm -f Makefile
+distclean-am: clean-am distclean-generic distclean-hdr distclean-tags
+
+dvi: dvi-recursive
+
+dvi-am:
+
+html: html-recursive
+
+info: info-recursive
+
+info-am:
+
+install-data-am:
+
+install-exec-am:
+
+install-info: install-info-recursive
+
+install-man:
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-recursive
+ -rm -f $(am__CONFIG_DISTCLEAN_FILES)
+ -rm -rf $(top_srcdir)/autom4te.cache
+ -rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-recursive
+
+mostlyclean-am: mostlyclean-generic
+
+pdf: pdf-recursive
+
+pdf-am:
+
+ps: ps-recursive
+
+ps-am:
+
+uninstall-am: uninstall-info-am
+
+uninstall-info: uninstall-info-recursive
+
+.PHONY: $(RECURSIVE_TARGETS) CTAGS GTAGS all all-am am--refresh check \
+ check-am clean clean-generic clean-recursive ctags \
+ ctags-recursive dist dist-all dist-bzip2 dist-gzip dist-shar \
+ dist-tarZ dist-zip distcheck distclean distclean-generic \
+ distclean-hdr distclean-recursive distclean-tags \
+ distcleancheck distdir distuninstallcheck dvi dvi-am html \
+ html-am info info-am install install-am install-data \
+ install-data-am install-exec install-exec-am install-info \
+ install-info-am install-man install-strip installcheck \
+ installcheck-am installdirs installdirs-am maintainer-clean \
+ maintainer-clean-generic maintainer-clean-recursive \
+ mostlyclean mostlyclean-generic mostlyclean-recursive pdf \
+ pdf-am ps ps-am tags tags-recursive uninstall uninstall-am \
+ uninstall-info-am
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
--- /dev/null
+#
+# Makefile.incl -- shared defines between makefiles
+# Copyright (C) 2005 Erik van Konijnenburg
+#
+# 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#
+# - auxdir contains package specific executables that may be included
+# in the generated image
+# - perldir contains perl modules to be included by the main program
+#
+# This cannot be simply passed from the master makefile; that would
+# be invisible to automake.
+
+auxdir = $(pkglibdir)/exec
+perldir = $(pkglibdir)/perl
+
--- /dev/null
+Version 0.0.5, 2005-03-21
+ * change installation directory from /usr/local/share/yaird/
+ to /usr/local/lib/yaird/, since there are executables included now.
+ * add run_init: executable to make the move to the real root
+ device in initramfs context.
+ * README: new section on (optional) use of klibc,
+ new section on replacing mkinitrd during kernel install.
+ * more reliable shared library detection: works with glibc and
+ klibc; if other C libraries use shared libraries, an error
+ message results.
+ * adapt Debian template to use initramfs rather than initrd.
+ The old initrd template is available as Debian-initrd.
+ * add command line option --root=/dev/hdb, to simplify testing.
+ * allow template to see requested kernel version,
+ and to copy a complete tree to the image. This makes it
+ possible to put /lib/modules/2.6.10-smp on the image and do hotplug.
+ * Documentation: writeup on initramfs, notes on shared libraries.
+
+Version 0.0.4, 2005-02-23
+ * Process kernel command line options: init=, ro, rw.
+ * Boot into single user mode supported
+ * Support modules outside /lib/modules
+ * Support modules with extension other than .ko
+ * Warn about duplicates in modules.dep
+ * Generated image now waits for device to become visible in /sys,
+ and gives error message if it doesn't
+ * Support 2.6.10 sysfs layout: SCSI now has a
+ new subdirectory 'target'.
+ * Warn about unrecognised paths in /sys
+ * Allow empty lines in /etc/fstab.
+ * Empty lines in /etc/fstab are valid.
+ (Patch Goffredo Baroncelli)
+
+Version 0.0.3, 2005-02-16
+ * First public release.
--- /dev/null
+
+YAIRD -- Yet Another MkInitRd
+=============================
+
+This is a proof of concept rewrite of mkinitrd, intended to test the
+idea that we can get a more accurate picture of the modules needed
+to boot a linux system by fully utilizing the information in sysfs.
+It comes with templates that make it possible to generate different
+initrd images for different distributions.
+
+Proof of concept means this software is barely tested: it may
+produce a working initrd image, or it may eat your disk. This
+is a good moment to re-read the "NO WARRANTY" part of the licence,
+and decide whether you want to test this software.
+
+
+Installation
+============
+
+You'll need HTML::Template to run the application; a standard package
+under Debian, in Fedora FC3 available via extras.
+
+Unpack, then configure and install:
+
+ $ ./configure --prefix=$HOME/local --enable-template=Debian
+ $ make install
+
+The --enable-template option is required; it picks one of the templates
+from the template directory to install.
+
+If you want to regenerate the html documentation, you need the xmlto
+package.
+
+If you're installing from version control rather than a tarball,
+you'll also need to have autmake and autoconf available, and
+need to run bootstrap.sh before doing 'configure; make'.
+
+
+Installing with klibc
+=====================
+
+Yaird comes with a small C program to manage the transfer from the initial
+root file system to the real root. To avoid the overhead of the GNU
+C library, you may want to compile this with klibc. Note however that
+this is only effective if every other program that is copied to the
+initial root filesystem (such as mount, mknod and a shell) is compiled
+in the same manner.
+
+Recent versions of klibc provide klcc, a wrapper around gcc that makes
+it easier to port programs to klibc. Installation is faily simple;
+the most important point is to make a symlink to a configured linux
+source tree. The SHLIBDIR determines where the shared library version
+ends up. If you want to use klibc for programs used early in the
+boot process it makes sense to put it on the root file system.
+
+ $ cd klibc-0.207
+ $ ln -s /usr/src/linux... linux
+ $ make bindir=$HOME/local/bin \
+ mandir=$HOME/local/man \
+ INSTALLDIR=$HOME/local \
+ SHLIBDIR=$HOME/local/shlib \
+ install
+ $
+
+Once you have klibc, you can configure yaird to make use of it
+as follows:
+
+ $ ./configure CFLAGS=-static CC=$HOME/local/bin/klcc \
+ --prefix=$HOME/local --enable-template=Debian
+ ...
+ $ make install
+
+The use of CFLAGS=-shared is optional.
+
+
+Using the application
+=====================
+
+To make a new initrd image for the current kernel:
+
+ # yaird --format directory --output initrd.d
+
+This creates a directory initrd.d to look at or to package
+manually to a form suitable for booting.
+
+To get an image suitable for use under debian:
+
+ # yaird --format cramfs --output /boot/initrd.img
+
+For Fedora, a cpio file is needed:
+
+ # yaird --format cpio --output /boot/initrd.img
+
+Note that there is no strong relation between distribution
+and image format: nothing stops you from building a template
+that uses initramfs and cpio under Debian. However, the template
+and the image format do have to match.
+
+To produce a boot image for another kernel:
+
+ # yaird --format directory --output initrd.d 2.6.10-1-686-smp
+
+There is also a '--test' option that will produce an overview
+of block special files, devices, modules etc that may be helpful
+in debugging boot problems.
+
+If you want the generated image to boot into something other than
+the current root, use the --root option. The block device specified
+must occur in /etc/fstab to allow yaird to find the required file system
+type.
+
+ # yaird --format cramfs --output /boot/tst.img --root /dev/hdb7
+
+Use '--help' for an overview of other command line options.
+
+
+Using yaird as a replacement for mkinitrd
+=========================================
+
+If you install a new kernel from your distribution, that means
+making a new initial boot image. The postinstall script that
+comes with the kernel will normally do this using mkinitrd;
+if you want yaird to be used instead, some tweaking is necessary.
+
+In Debian, there are a lot of configuration options for the kernel
+installation, but replacing mkinitrd is not among them, so you'll
+have to replace /usr/sbin/mkinitrd with a wrapper around yaird.
+The following worked with debian 2.6.10-1-686:
+
+ #!/bin/sh
+ #
+ # mkinitrd - emulate mkinitrd with yaird for kernel-image installs.
+ #
+ # Copyright (C) 2001-2003 Herbert Xu <herbert@debian.org>
+ #
+ # 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ #
+ # $Id$
+
+ PROG=mkinitrd-shimmy
+ outfile=''
+
+ while getopts "d:km:o:r:" flag; do
+ case $flag in
+ d)
+ echo "$PROG: -d unsupported"
+ exit 1
+ ;;
+ k)
+ echo "$PROG: -k unsupported"
+ exit 1
+ ;;
+ m)
+ # ignore
+ ;;
+ o)
+ outfile="$OPTARG"
+ ;;
+ r)
+ echo "$PROG: -d unsupported"
+ exit 1
+ ;;
+ *)
+ echo "$PROG: unknown option $flag"
+ exit 1
+ ;;
+ esac
+ done
+ shift $(($OPTIND - 1))
+
+ if [ "$outfile" = "" ]; then
+ echo "$PROG: no output file specified"
+ exit 1
+ fi
+ if [ $# -gt 1 ]; then
+ echo "$PROG: extra arguments found"
+ exit 1
+ fi
+
+ # Note that version may be a pathname;
+ # this is used by the installer for Debian kernel image packages.
+ VERSION=$1
+ [ $# -gt 0 ] || unset VERSION
+ case $VERSION in
+ /lib/modules/*/[!/]*)
+ ;;
+ /lib/modules/[!/]*)
+ VERSION=${VERSION#/lib/modules/}
+ VERSION=${VERSION%%/*}
+ ;;
+ esac
+
+ case $VERSION in
+ */*)
+ echo $PROG: $VERSION is not a valid kernel version >&2
+ exit 1
+ ;;
+ esac
+
+ VERSION="${VERSION-$(uname -r)}"
+
+ exec $HOME/local/sbin/yaird \
+ --verbose --format cpio --output "$outfile" "$VERSION"
+
+For Fedora, you'll have to modify /sbin/new-kernel-package;
+not tested yet.
--- /dev/null
+Todo:
+ - support modprobe.conf
+ - support dm_crypt
+ - support loopback devices as root
+ - add manual page
+ - kernel command line processing: root=,
+ - support multipath
+ - define option to load extra modules?
+ - read config file
+ - ext2 migration, still necessary?
+ - software suspend support
+ - add debian packaging, spec file?
--- /dev/null
+# generated automatically by aclocal 1.9.5 -*- Autoconf -*-
+
+# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004,
+# 2005 Free Software Foundation, Inc.
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+# Copyright (C) 2002, 2003, 2005 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# AM_AUTOMAKE_VERSION(VERSION)
+# ----------------------------
+# Automake X.Y traces this macro to ensure aclocal.m4 has been
+# generated from the m4 files accompanying Automake X.Y.
+AC_DEFUN([AM_AUTOMAKE_VERSION], [am__api_version="1.9"])
+
+# AM_SET_CURRENT_AUTOMAKE_VERSION
+# -------------------------------
+# Call AM_AUTOMAKE_VERSION so it can be traced.
+# This function is AC_REQUIREd by AC_INIT_AUTOMAKE.
+AC_DEFUN([AM_SET_CURRENT_AUTOMAKE_VERSION],
+ [AM_AUTOMAKE_VERSION([1.9.5])])
+
+# AM_AUX_DIR_EXPAND -*- Autoconf -*-
+
+# Copyright (C) 2001, 2003, 2005 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# For projects using AC_CONFIG_AUX_DIR([foo]), Autoconf sets
+# $ac_aux_dir to `$srcdir/foo'. In other projects, it is set to
+# `$srcdir', `$srcdir/..', or `$srcdir/../..'.
+#
+# Of course, Automake must honor this variable whenever it calls a
+# tool from the auxiliary directory. The problem is that $srcdir (and
+# therefore $ac_aux_dir as well) can be either absolute or relative,
+# depending on how configure is run. This is pretty annoying, since
+# it makes $ac_aux_dir quite unusable in subdirectories: in the top
+# source directory, any form will work fine, but in subdirectories a
+# relative path needs to be adjusted first.
+#
+# $ac_aux_dir/missing
+# fails when called from a subdirectory if $ac_aux_dir is relative
+# $top_srcdir/$ac_aux_dir/missing
+# fails if $ac_aux_dir is absolute,
+# fails when called from a subdirectory in a VPATH build with
+# a relative $ac_aux_dir
+#
+# The reason of the latter failure is that $top_srcdir and $ac_aux_dir
+# are both prefixed by $srcdir. In an in-source build this is usually
+# harmless because $srcdir is `.', but things will broke when you
+# start a VPATH build or use an absolute $srcdir.
+#
+# So we could use something similar to $top_srcdir/$ac_aux_dir/missing,
+# iff we strip the leading $srcdir from $ac_aux_dir. That would be:
+# am_aux_dir='\$(top_srcdir)/'`expr "$ac_aux_dir" : "$srcdir//*\(.*\)"`
+# and then we would define $MISSING as
+# MISSING="\${SHELL} $am_aux_dir/missing"
+# This will work as long as MISSING is not called from configure, because
+# unfortunately $(top_srcdir) has no meaning in configure.
+# However there are other variables, like CC, which are often used in
+# configure, and could therefore not use this "fixed" $ac_aux_dir.
+#
+# Another solution, used here, is to always expand $ac_aux_dir to an
+# absolute PATH. The drawback is that using absolute paths prevent a
+# configured tree to be moved without reconfiguration.
+
+AC_DEFUN([AM_AUX_DIR_EXPAND],
+[dnl Rely on autoconf to set up CDPATH properly.
+AC_PREREQ([2.50])dnl
+# expand $ac_aux_dir to an absolute path
+am_aux_dir=`cd $ac_aux_dir && pwd`
+])
+
+# AM_CONDITIONAL -*- Autoconf -*-
+
+# Copyright (C) 1997, 2000, 2001, 2003, 2004, 2005
+# Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# serial 7
+
+# AM_CONDITIONAL(NAME, SHELL-CONDITION)
+# -------------------------------------
+# Define a conditional.
+AC_DEFUN([AM_CONDITIONAL],
+[AC_PREREQ(2.52)dnl
+ ifelse([$1], [TRUE], [AC_FATAL([$0: invalid condition: $1])],
+ [$1], [FALSE], [AC_FATAL([$0: invalid condition: $1])])dnl
+AC_SUBST([$1_TRUE])
+AC_SUBST([$1_FALSE])
+if $2; then
+ $1_TRUE=
+ $1_FALSE='#'
+else
+ $1_TRUE='#'
+ $1_FALSE=
+fi
+AC_CONFIG_COMMANDS_PRE(
+[if test -z "${$1_TRUE}" && test -z "${$1_FALSE}"; then
+ AC_MSG_ERROR([[conditional "$1" was never defined.
+Usually this means the macro was only invoked conditionally.]])
+fi])])
+
+
+# Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005
+# Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# serial 8
+
+# There are a few dirty hacks below to avoid letting `AC_PROG_CC' be
+# written in clear, in which case automake, when reading aclocal.m4,
+# will think it sees a *use*, and therefore will trigger all it's
+# C support machinery. Also note that it means that autoscan, seeing
+# CC etc. in the Makefile, will ask for an AC_PROG_CC use...
+
+
+# _AM_DEPENDENCIES(NAME)
+# ----------------------
+# See how the compiler implements dependency checking.
+# NAME is "CC", "CXX", "GCJ", or "OBJC".
+# We try a few techniques and use that to set a single cache variable.
+#
+# We don't AC_REQUIRE the corresponding AC_PROG_CC since the latter was
+# modified to invoke _AM_DEPENDENCIES(CC); we would have a circular
+# dependency, and given that the user is not expected to run this macro,
+# just rely on AC_PROG_CC.
+AC_DEFUN([_AM_DEPENDENCIES],
+[AC_REQUIRE([AM_SET_DEPDIR])dnl
+AC_REQUIRE([AM_OUTPUT_DEPENDENCY_COMMANDS])dnl
+AC_REQUIRE([AM_MAKE_INCLUDE])dnl
+AC_REQUIRE([AM_DEP_TRACK])dnl
+
+ifelse([$1], CC, [depcc="$CC" am_compiler_list=],
+ [$1], CXX, [depcc="$CXX" am_compiler_list=],
+ [$1], OBJC, [depcc="$OBJC" am_compiler_list='gcc3 gcc'],
+ [$1], GCJ, [depcc="$GCJ" am_compiler_list='gcc3 gcc'],
+ [depcc="$$1" am_compiler_list=])
+
+AC_CACHE_CHECK([dependency style of $depcc],
+ [am_cv_$1_dependencies_compiler_type],
+[if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then
+ # We make a subdir and do the tests there. Otherwise we can end up
+ # making bogus files that we don't know about and never remove. For
+ # instance it was reported that on HP-UX the gcc test will end up
+ # making a dummy file named `D' -- because `-MD' means `put the output
+ # in D'.
+ mkdir conftest.dir
+ # Copy depcomp to subdir because otherwise we won't find it if we're
+ # using a relative directory.
+ cp "$am_depcomp" conftest.dir
+ cd conftest.dir
+ # We will build objects and dependencies in a subdirectory because
+ # it helps to detect inapplicable dependency modes. For instance
+ # both Tru64's cc and ICC support -MD to output dependencies as a
+ # side effect of compilation, but ICC will put the dependencies in
+ # the current directory while Tru64 will put them in the object
+ # directory.
+ mkdir sub
+
+ am_cv_$1_dependencies_compiler_type=none
+ if test "$am_compiler_list" = ""; then
+ am_compiler_list=`sed -n ['s/^#*\([a-zA-Z0-9]*\))$/\1/p'] < ./depcomp`
+ fi
+ for depmode in $am_compiler_list; do
+ # Setup a source with many dependencies, because some compilers
+ # like to wrap large dependency lists on column 80 (with \), and
+ # we should not choose a depcomp mode which is confused by this.
+ #
+ # We need to recreate these files for each test, as the compiler may
+ # overwrite some of them when testing with obscure command lines.
+ # This happens at least with the AIX C compiler.
+ : > sub/conftest.c
+ for i in 1 2 3 4 5 6; do
+ echo '#include "conftst'$i'.h"' >> sub/conftest.c
+ # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with
+ # Solaris 8's {/usr,}/bin/sh.
+ touch sub/conftst$i.h
+ done
+ echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf
+
+ case $depmode in
+ nosideeffect)
+ # after this tag, mechanisms are not by side-effect, so they'll
+ # only be used when explicitly requested
+ if test "x$enable_dependency_tracking" = xyes; then
+ continue
+ else
+ break
+ fi
+ ;;
+ none) break ;;
+ esac
+ # We check with `-c' and `-o' for the sake of the "dashmstdout"
+ # mode. It turns out that the SunPro C++ compiler does not properly
+ # handle `-M -o', and we need to detect this.
+ if depmode=$depmode \
+ source=sub/conftest.c object=sub/conftest.${OBJEXT-o} \
+ depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \
+ $SHELL ./depcomp $depcc -c -o sub/conftest.${OBJEXT-o} sub/conftest.c \
+ >/dev/null 2>conftest.err &&
+ grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 &&
+ grep sub/conftest.${OBJEXT-o} sub/conftest.Po > /dev/null 2>&1 &&
+ ${MAKE-make} -s -f confmf > /dev/null 2>&1; then
+ # icc doesn't choke on unknown options, it will just issue warnings
+ # or remarks (even with -Werror). So we grep stderr for any message
+ # that says an option was ignored or not supported.
+ # When given -MP, icc 7.0 and 7.1 complain thusly:
+ # icc: Command line warning: ignoring option '-M'; no argument required
+ # The diagnosis changed in icc 8.0:
+ # icc: Command line remark: option '-MP' not supported
+ if (grep 'ignoring option' conftest.err ||
+ grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else
+ am_cv_$1_dependencies_compiler_type=$depmode
+ break
+ fi
+ fi
+ done
+
+ cd ..
+ rm -rf conftest.dir
+else
+ am_cv_$1_dependencies_compiler_type=none
+fi
+])
+AC_SUBST([$1DEPMODE], [depmode=$am_cv_$1_dependencies_compiler_type])
+AM_CONDITIONAL([am__fastdep$1], [
+ test "x$enable_dependency_tracking" != xno \
+ && test "$am_cv_$1_dependencies_compiler_type" = gcc3])
+])
+
+
+# AM_SET_DEPDIR
+# -------------
+# Choose a directory name for dependency files.
+# This macro is AC_REQUIREd in _AM_DEPENDENCIES
+AC_DEFUN([AM_SET_DEPDIR],
+[AC_REQUIRE([AM_SET_LEADING_DOT])dnl
+AC_SUBST([DEPDIR], ["${am__leading_dot}deps"])dnl
+])
+
+
+# AM_DEP_TRACK
+# ------------
+AC_DEFUN([AM_DEP_TRACK],
+[AC_ARG_ENABLE(dependency-tracking,
+[ --disable-dependency-tracking speeds up one-time build
+ --enable-dependency-tracking do not reject slow dependency extractors])
+if test "x$enable_dependency_tracking" != xno; then
+ am_depcomp="$ac_aux_dir/depcomp"
+ AMDEPBACKSLASH='\'
+fi
+AM_CONDITIONAL([AMDEP], [test "x$enable_dependency_tracking" != xno])
+AC_SUBST([AMDEPBACKSLASH])
+])
+
+# Generate code to set up dependency tracking. -*- Autoconf -*-
+
+# Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005
+# Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+#serial 3
+
+# _AM_OUTPUT_DEPENDENCY_COMMANDS
+# ------------------------------
+AC_DEFUN([_AM_OUTPUT_DEPENDENCY_COMMANDS],
+[for mf in $CONFIG_FILES; do
+ # Strip MF so we end up with the name of the file.
+ mf=`echo "$mf" | sed -e 's/:.*$//'`
+ # Check whether this is an Automake generated Makefile or not.
+ # We used to match only the files named `Makefile.in', but
+ # some people rename them; so instead we look at the file content.
+ # Grep'ing the first line is not enough: some people post-process
+ # each Makefile.in and add a new line on top of each file to say so.
+ # So let's grep whole file.
+ if grep '^#.*generated by automake' $mf > /dev/null 2>&1; then
+ dirpart=`AS_DIRNAME("$mf")`
+ else
+ continue
+ fi
+ # Extract the definition of DEPDIR, am__include, and am__quote
+ # from the Makefile without running `make'.
+ DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"`
+ test -z "$DEPDIR" && continue
+ am__include=`sed -n 's/^am__include = //p' < "$mf"`
+ test -z "am__include" && continue
+ am__quote=`sed -n 's/^am__quote = //p' < "$mf"`
+ # When using ansi2knr, U may be empty or an underscore; expand it
+ U=`sed -n 's/^U = //p' < "$mf"`
+ # Find all dependency output files, they are included files with
+ # $(DEPDIR) in their names. We invoke sed twice because it is the
+ # simplest approach to changing $(DEPDIR) to its actual value in the
+ # expansion.
+ for file in `sed -n "
+ s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \
+ sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g' -e 's/\$U/'"$U"'/g'`; do
+ # Make sure the directory exists.
+ test -f "$dirpart/$file" && continue
+ fdir=`AS_DIRNAME(["$file"])`
+ AS_MKDIR_P([$dirpart/$fdir])
+ # echo "creating $dirpart/$file"
+ echo '# dummy' > "$dirpart/$file"
+ done
+done
+])# _AM_OUTPUT_DEPENDENCY_COMMANDS
+
+
+# AM_OUTPUT_DEPENDENCY_COMMANDS
+# -----------------------------
+# This macro should only be invoked once -- use via AC_REQUIRE.
+#
+# This code is only required when automatic dependency tracking
+# is enabled. FIXME. This creates each `.P' file that we will
+# need in order to bootstrap the dependency handling code.
+AC_DEFUN([AM_OUTPUT_DEPENDENCY_COMMANDS],
+[AC_CONFIG_COMMANDS([depfiles],
+ [test x"$AMDEP_TRUE" != x"" || _AM_OUTPUT_DEPENDENCY_COMMANDS],
+ [AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir"])
+])
+
+# Copyright (C) 1996, 1997, 2000, 2001, 2003, 2005
+# Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# serial 8
+
+# AM_CONFIG_HEADER is obsolete. It has been replaced by AC_CONFIG_HEADERS.
+AU_DEFUN([AM_CONFIG_HEADER], [AC_CONFIG_HEADERS($@)])
+
+# Do all the work for Automake. -*- Autoconf -*-
+
+# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005
+# Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# serial 12
+
+# This macro actually does too much. Some checks are only needed if
+# your package does certain things. But this isn't really a big deal.
+
+# AM_INIT_AUTOMAKE(PACKAGE, VERSION, [NO-DEFINE])
+# AM_INIT_AUTOMAKE([OPTIONS])
+# -----------------------------------------------
+# The call with PACKAGE and VERSION arguments is the old style
+# call (pre autoconf-2.50), which is being phased out. PACKAGE
+# and VERSION should now be passed to AC_INIT and removed from
+# the call to AM_INIT_AUTOMAKE.
+# We support both call styles for the transition. After
+# the next Automake release, Autoconf can make the AC_INIT
+# arguments mandatory, and then we can depend on a new Autoconf
+# release and drop the old call support.
+AC_DEFUN([AM_INIT_AUTOMAKE],
+[AC_PREREQ([2.58])dnl
+dnl Autoconf wants to disallow AM_ names. We explicitly allow
+dnl the ones we care about.
+m4_pattern_allow([^AM_[A-Z]+FLAGS$])dnl
+AC_REQUIRE([AM_SET_CURRENT_AUTOMAKE_VERSION])dnl
+AC_REQUIRE([AC_PROG_INSTALL])dnl
+# test to see if srcdir already configured
+if test "`cd $srcdir && pwd`" != "`pwd`" &&
+ test -f $srcdir/config.status; then
+ AC_MSG_ERROR([source directory already configured; run "make distclean" there first])
+fi
+
+# test whether we have cygpath
+if test -z "$CYGPATH_W"; then
+ if (cygpath --version) >/dev/null 2>/dev/null; then
+ CYGPATH_W='cygpath -w'
+ else
+ CYGPATH_W=echo
+ fi
+fi
+AC_SUBST([CYGPATH_W])
+
+# Define the identity of the package.
+dnl Distinguish between old-style and new-style calls.
+m4_ifval([$2],
+[m4_ifval([$3], [_AM_SET_OPTION([no-define])])dnl
+ AC_SUBST([PACKAGE], [$1])dnl
+ AC_SUBST([VERSION], [$2])],
+[_AM_SET_OPTIONS([$1])dnl
+ AC_SUBST([PACKAGE], ['AC_PACKAGE_TARNAME'])dnl
+ AC_SUBST([VERSION], ['AC_PACKAGE_VERSION'])])dnl
+
+_AM_IF_OPTION([no-define],,
+[AC_DEFINE_UNQUOTED(PACKAGE, "$PACKAGE", [Name of package])
+ AC_DEFINE_UNQUOTED(VERSION, "$VERSION", [Version number of package])])dnl
+
+# Some tools Automake needs.
+AC_REQUIRE([AM_SANITY_CHECK])dnl
+AC_REQUIRE([AC_ARG_PROGRAM])dnl
+AM_MISSING_PROG(ACLOCAL, aclocal-${am__api_version})
+AM_MISSING_PROG(AUTOCONF, autoconf)
+AM_MISSING_PROG(AUTOMAKE, automake-${am__api_version})
+AM_MISSING_PROG(AUTOHEADER, autoheader)
+AM_MISSING_PROG(MAKEINFO, makeinfo)
+AM_PROG_INSTALL_SH
+AM_PROG_INSTALL_STRIP
+AC_REQUIRE([AM_PROG_MKDIR_P])dnl
+# We need awk for the "check" target. The system "awk" is bad on
+# some platforms.
+AC_REQUIRE([AC_PROG_AWK])dnl
+AC_REQUIRE([AC_PROG_MAKE_SET])dnl
+AC_REQUIRE([AM_SET_LEADING_DOT])dnl
+_AM_IF_OPTION([tar-ustar], [_AM_PROG_TAR([ustar])],
+ [_AM_IF_OPTION([tar-pax], [_AM_PROG_TAR([pax])],
+ [_AM_PROG_TAR([v7])])])
+_AM_IF_OPTION([no-dependencies],,
+[AC_PROVIDE_IFELSE([AC_PROG_CC],
+ [_AM_DEPENDENCIES(CC)],
+ [define([AC_PROG_CC],
+ defn([AC_PROG_CC])[_AM_DEPENDENCIES(CC)])])dnl
+AC_PROVIDE_IFELSE([AC_PROG_CXX],
+ [_AM_DEPENDENCIES(CXX)],
+ [define([AC_PROG_CXX],
+ defn([AC_PROG_CXX])[_AM_DEPENDENCIES(CXX)])])dnl
+])
+])
+
+
+# When config.status generates a header, we must update the stamp-h file.
+# This file resides in the same directory as the config header
+# that is generated. The stamp files are numbered to have different names.
+
+# Autoconf calls _AC_AM_CONFIG_HEADER_HOOK (when defined) in the
+# loop where config.status creates the headers, so we can generate
+# our stamp files there.
+AC_DEFUN([_AC_AM_CONFIG_HEADER_HOOK],
+[# Compute $1's index in $config_headers.
+_am_stamp_count=1
+for _am_header in $config_headers :; do
+ case $_am_header in
+ $1 | $1:* )
+ break ;;
+ * )
+ _am_stamp_count=`expr $_am_stamp_count + 1` ;;
+ esac
+done
+echo "timestamp for $1" >`AS_DIRNAME([$1])`/stamp-h[]$_am_stamp_count])
+
+# Copyright (C) 2001, 2003, 2005 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# AM_PROG_INSTALL_SH
+# ------------------
+# Define $install_sh.
+AC_DEFUN([AM_PROG_INSTALL_SH],
+[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl
+install_sh=${install_sh-"$am_aux_dir/install-sh"}
+AC_SUBST(install_sh)])
+
+# Copyright (C) 2003, 2005 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# serial 2
+
+# Check whether the underlying file-system supports filenames
+# with a leading dot. For instance MS-DOS doesn't.
+AC_DEFUN([AM_SET_LEADING_DOT],
+[rm -rf .tst 2>/dev/null
+mkdir .tst 2>/dev/null
+if test -d .tst; then
+ am__leading_dot=.
+else
+ am__leading_dot=_
+fi
+rmdir .tst 2>/dev/null
+AC_SUBST([am__leading_dot])])
+
+# Check to see how 'make' treats includes. -*- Autoconf -*-
+
+# Copyright (C) 2001, 2002, 2003, 2005 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# serial 3
+
+# AM_MAKE_INCLUDE()
+# -----------------
+# Check to see how make treats includes.
+AC_DEFUN([AM_MAKE_INCLUDE],
+[am_make=${MAKE-make}
+cat > confinc << 'END'
+am__doit:
+ @echo done
+.PHONY: am__doit
+END
+# If we don't find an include directive, just comment out the code.
+AC_MSG_CHECKING([for style of include used by $am_make])
+am__include="#"
+am__quote=
+_am_result=none
+# First try GNU make style include.
+echo "include confinc" > confmf
+# We grep out `Entering directory' and `Leaving directory'
+# messages which can occur if `w' ends up in MAKEFLAGS.
+# In particular we don't look at `^make:' because GNU make might
+# be invoked under some other name (usually "gmake"), in which
+# case it prints its new name instead of `make'.
+if test "`$am_make -s -f confmf 2> /dev/null | grep -v 'ing directory'`" = "done"; then
+ am__include=include
+ am__quote=
+ _am_result=GNU
+fi
+# Now try BSD make style include.
+if test "$am__include" = "#"; then
+ echo '.include "confinc"' > confmf
+ if test "`$am_make -s -f confmf 2> /dev/null`" = "done"; then
+ am__include=.include
+ am__quote="\""
+ _am_result=BSD
+ fi
+fi
+AC_SUBST([am__include])
+AC_SUBST([am__quote])
+AC_MSG_RESULT([$_am_result])
+rm -f confinc confmf
+])
+
+# Fake the existence of programs that GNU maintainers use. -*- Autoconf -*-
+
+# Copyright (C) 1997, 1999, 2000, 2001, 2003, 2005
+# Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# serial 4
+
+# AM_MISSING_PROG(NAME, PROGRAM)
+# ------------------------------
+AC_DEFUN([AM_MISSING_PROG],
+[AC_REQUIRE([AM_MISSING_HAS_RUN])
+$1=${$1-"${am_missing_run}$2"}
+AC_SUBST($1)])
+
+
+# AM_MISSING_HAS_RUN
+# ------------------
+# Define MISSING if not defined so far and test if it supports --run.
+# If it does, set am_missing_run to use it, otherwise, to nothing.
+AC_DEFUN([AM_MISSING_HAS_RUN],
+[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl
+test x"${MISSING+set}" = xset || MISSING="\${SHELL} $am_aux_dir/missing"
+# Use eval to expand $SHELL
+if eval "$MISSING --run true"; then
+ am_missing_run="$MISSING --run "
+else
+ am_missing_run=
+ AC_MSG_WARN([`missing' script is too old or missing])
+fi
+])
+
+# Copyright (C) 2003, 2004, 2005 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# AM_PROG_MKDIR_P
+# ---------------
+# Check whether `mkdir -p' is supported, fallback to mkinstalldirs otherwise.
+#
+# Automake 1.8 used `mkdir -m 0755 -p --' to ensure that directories
+# created by `make install' are always world readable, even if the
+# installer happens to have an overly restrictive umask (e.g. 077).
+# This was a mistake. There are at least two reasons why we must not
+# use `-m 0755':
+# - it causes special bits like SGID to be ignored,
+# - it may be too restrictive (some setups expect 775 directories).
+#
+# Do not use -m 0755 and let people choose whatever they expect by
+# setting umask.
+#
+# We cannot accept any implementation of `mkdir' that recognizes `-p'.
+# Some implementations (such as Solaris 8's) are not thread-safe: if a
+# parallel make tries to run `mkdir -p a/b' and `mkdir -p a/c'
+# concurrently, both version can detect that a/ is missing, but only
+# one can create it and the other will error out. Consequently we
+# restrict ourselves to GNU make (using the --version option ensures
+# this.)
+AC_DEFUN([AM_PROG_MKDIR_P],
+[if mkdir -p --version . >/dev/null 2>&1 && test ! -d ./--version; then
+ # We used to keeping the `.' as first argument, in order to
+ # allow $(mkdir_p) to be used without argument. As in
+ # $(mkdir_p) $(somedir)
+ # where $(somedir) is conditionally defined. However this is wrong
+ # for two reasons:
+ # 1. if the package is installed by a user who cannot write `.'
+ # make install will fail,
+ # 2. the above comment should most certainly read
+ # $(mkdir_p) $(DESTDIR)$(somedir)
+ # so it does not work when $(somedir) is undefined and
+ # $(DESTDIR) is not.
+ # To support the latter case, we have to write
+ # test -z "$(somedir)" || $(mkdir_p) $(DESTDIR)$(somedir),
+ # so the `.' trick is pointless.
+ mkdir_p='mkdir -p --'
+else
+ # On NextStep and OpenStep, the `mkdir' command does not
+ # recognize any option. It will interpret all options as
+ # directories to create, and then abort because `.' already
+ # exists.
+ for d in ./-p ./--version;
+ do
+ test -d $d && rmdir $d
+ done
+ # $(mkinstalldirs) is defined by Automake if mkinstalldirs exists.
+ if test -f "$ac_aux_dir/mkinstalldirs"; then
+ mkdir_p='$(mkinstalldirs)'
+ else
+ mkdir_p='$(install_sh) -d'
+ fi
+fi
+AC_SUBST([mkdir_p])])
+
+# Helper functions for option handling. -*- Autoconf -*-
+
+# Copyright (C) 2001, 2002, 2003, 2005 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# serial 3
+
+# _AM_MANGLE_OPTION(NAME)
+# -----------------------
+AC_DEFUN([_AM_MANGLE_OPTION],
+[[_AM_OPTION_]m4_bpatsubst($1, [[^a-zA-Z0-9_]], [_])])
+
+# _AM_SET_OPTION(NAME)
+# ------------------------------
+# Set option NAME. Presently that only means defining a flag for this option.
+AC_DEFUN([_AM_SET_OPTION],
+[m4_define(_AM_MANGLE_OPTION([$1]), 1)])
+
+# _AM_SET_OPTIONS(OPTIONS)
+# ----------------------------------
+# OPTIONS is a space-separated list of Automake options.
+AC_DEFUN([_AM_SET_OPTIONS],
+[AC_FOREACH([_AM_Option], [$1], [_AM_SET_OPTION(_AM_Option)])])
+
+# _AM_IF_OPTION(OPTION, IF-SET, [IF-NOT-SET])
+# -------------------------------------------
+# Execute IF-SET if OPTION is set, IF-NOT-SET otherwise.
+AC_DEFUN([_AM_IF_OPTION],
+[m4_ifset(_AM_MANGLE_OPTION([$1]), [$2], [$3])])
+
+# Check to make sure that the build environment is sane. -*- Autoconf -*-
+
+# Copyright (C) 1996, 1997, 2000, 2001, 2003, 2005
+# Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# serial 4
+
+# AM_SANITY_CHECK
+# ---------------
+AC_DEFUN([AM_SANITY_CHECK],
+[AC_MSG_CHECKING([whether build environment is sane])
+# Just in case
+sleep 1
+echo timestamp > conftest.file
+# Do `set' in a subshell so we don't clobber the current shell's
+# arguments. Must try -L first in case configure is actually a
+# symlink; some systems play weird games with the mod time of symlinks
+# (eg FreeBSD returns the mod time of the symlink's containing
+# directory).
+if (
+ set X `ls -Lt $srcdir/configure conftest.file 2> /dev/null`
+ if test "$[*]" = "X"; then
+ # -L didn't work.
+ set X `ls -t $srcdir/configure conftest.file`
+ fi
+ rm -f conftest.file
+ if test "$[*]" != "X $srcdir/configure conftest.file" \
+ && test "$[*]" != "X conftest.file $srcdir/configure"; then
+
+ # If neither matched, then we have a broken ls. This can happen
+ # if, for instance, CONFIG_SHELL is bash and it inherits a
+ # broken ls alias from the environment. This has actually
+ # happened. Such a system could not be considered "sane".
+ AC_MSG_ERROR([ls -t appears to fail. Make sure there is not a broken
+alias in your environment])
+ fi
+
+ test "$[2]" = conftest.file
+ )
+then
+ # Ok.
+ :
+else
+ AC_MSG_ERROR([newly created file is older than distributed files!
+Check your system clock])
+fi
+AC_MSG_RESULT(yes)])
+
+# Copyright (C) 2001, 2003, 2005 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# AM_PROG_INSTALL_STRIP
+# ---------------------
+# One issue with vendor `install' (even GNU) is that you can't
+# specify the program used to strip binaries. This is especially
+# annoying in cross-compiling environments, where the build's strip
+# is unlikely to handle the host's binaries.
+# Fortunately install-sh will honor a STRIPPROG variable, so we
+# always use install-sh in `make install-strip', and initialize
+# STRIPPROG with the value of the STRIP variable (set by the user).
+AC_DEFUN([AM_PROG_INSTALL_STRIP],
+[AC_REQUIRE([AM_PROG_INSTALL_SH])dnl
+# Installed binaries are usually stripped using `strip' when the user
+# run `make install-strip'. However `strip' might not be the right
+# tool to use in cross-compilation environments, therefore Automake
+# will honor the `STRIP' environment variable to overrule this program.
+dnl Don't test for $cross_compiling = yes, because it might be `maybe'.
+if test "$cross_compiling" != no; then
+ AC_CHECK_TOOL([STRIP], [strip], :)
+fi
+INSTALL_STRIP_PROGRAM="\${SHELL} \$(install_sh) -c -s"
+AC_SUBST([INSTALL_STRIP_PROGRAM])])
+
+# Check how to create a tarball. -*- Autoconf -*-
+
+# Copyright (C) 2004, 2005 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# serial 2
+
+# _AM_PROG_TAR(FORMAT)
+# --------------------
+# Check how to create a tarball in format FORMAT.
+# FORMAT should be one of `v7', `ustar', or `pax'.
+#
+# Substitute a variable $(am__tar) that is a command
+# writing to stdout a FORMAT-tarball containing the directory
+# $tardir.
+# tardir=directory && $(am__tar) > result.tar
+#
+# Substitute a variable $(am__untar) that extract such
+# a tarball read from stdin.
+# $(am__untar) < result.tar
+AC_DEFUN([_AM_PROG_TAR],
+[# Always define AMTAR for backward compatibility.
+AM_MISSING_PROG([AMTAR], [tar])
+m4_if([$1], [v7],
+ [am__tar='${AMTAR} chof - "$$tardir"'; am__untar='${AMTAR} xf -'],
+ [m4_case([$1], [ustar],, [pax],,
+ [m4_fatal([Unknown tar format])])
+AC_MSG_CHECKING([how to create a $1 tar archive])
+# Loop over all known methods to create a tar archive until one works.
+_am_tools='gnutar m4_if([$1], [ustar], [plaintar]) pax cpio none'
+_am_tools=${am_cv_prog_tar_$1-$_am_tools}
+# Do not fold the above two line into one, because Tru64 sh and
+# Solaris sh will not grok spaces in the rhs of `-'.
+for _am_tool in $_am_tools
+do
+ case $_am_tool in
+ gnutar)
+ for _am_tar in tar gnutar gtar;
+ do
+ AM_RUN_LOG([$_am_tar --version]) && break
+ done
+ am__tar="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$$tardir"'
+ am__tar_="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$tardir"'
+ am__untar="$_am_tar -xf -"
+ ;;
+ plaintar)
+ # Must skip GNU tar: if it does not support --format= it doesn't create
+ # ustar tarball either.
+ (tar --version) >/dev/null 2>&1 && continue
+ am__tar='tar chf - "$$tardir"'
+ am__tar_='tar chf - "$tardir"'
+ am__untar='tar xf -'
+ ;;
+ pax)
+ am__tar='pax -L -x $1 -w "$$tardir"'
+ am__tar_='pax -L -x $1 -w "$tardir"'
+ am__untar='pax -r'
+ ;;
+ cpio)
+ am__tar='find "$$tardir" -print | cpio -o -H $1 -L'
+ am__tar_='find "$tardir" -print | cpio -o -H $1 -L'
+ am__untar='cpio -i -H $1 -d'
+ ;;
+ none)
+ am__tar=false
+ am__tar_=false
+ am__untar=false
+ ;;
+ esac
+
+ # If the value was cached, stop now. We just wanted to have am__tar
+ # and am__untar set.
+ test -n "${am_cv_prog_tar_$1}" && break
+
+ # tar/untar a dummy directory, and stop if the command works
+ rm -rf conftest.dir
+ mkdir conftest.dir
+ echo GrepMe > conftest.dir/file
+ AM_RUN_LOG([tardir=conftest.dir && eval $am__tar_ >conftest.tar])
+ rm -rf conftest.dir
+ if test -s conftest.tar; then
+ AM_RUN_LOG([$am__untar <conftest.tar])
+ grep GrepMe conftest.dir/file >/dev/null 2>&1 && break
+ fi
+done
+rm -rf conftest.dir
+
+AC_CACHE_VAL([am_cv_prog_tar_$1], [am_cv_prog_tar_$1=$_am_tool])
+AC_MSG_RESULT([$am_cv_prog_tar_$1])])
+AC_SUBST([am__tar])
+AC_SUBST([am__untar])
+]) # _AM_PROG_TAR
+
--- /dev/null
+#
+# Bootstrap.sh
+#
+# Use this if you got yaird from version control and need
+# to generate the configure scripts that come with the tarball.
+#
+# See http://sources.redhat.com/autobook/.
+# See http://www.gnu.org/software/autoconf/manual/autoconf-2.57/
+#
+# V=--verbose
+# Q=--quiet
+# set -x
+
+# to build makefiles for shared libraries
+# libtoolize --force || exit 1
+
+# copy definitions from /usr/share to ./aclocal.m4
+# for macros that are used in configure.in
+aclocal $V || exit 1
+
+# use aclocal.m4 to create a configure file from configure.in
+autoconf $V || exit 1
+
+# Build config.h.in, needed if you have C code.
+autoheader || exit 1
+
+# transform makefile.am to makefile.in;
+# copy helpful scripts such as install-sh from /usr/share to here.
+automake $V --add-missing || exit 1
+
+# At this point, the tree can be tarred, transplanted to the target
+# system and installed with:
+# configure --prefix=/home/santaclaus/testing --enable-template=Debian
+# make install
--- /dev/null
+This file contains any messages produced by compilers while
+running configure, to aid debugging if configure makes a mistake.
+
+It was created by configure, which was
+generated by GNU Autoconf 2.59. Invocation command line was
+
+ $ ./configure --enable-template=Fedora
+
+## --------- ##
+## Platform. ##
+## --------- ##
+
+hostname = rufus.sibbald.com
+uname -m = i686
+uname -r = 2.6.10-1.770_FC3smp
+uname -s = Linux
+uname -v = #1 SMP Thu Feb 24 14:20:06 EST 2005
+
+/usr/bin/uname -p = unknown
+/bin/uname -X = unknown
+
+/bin/arch = i686
+/usr/bin/arch -k = unknown
+/usr/convex/getsysinfo = unknown
+hostinfo = unknown
+/bin/machine = unknown
+/usr/bin/oslevel = unknown
+/bin/universe = unknown
+
+PATH: /usr/kerberos/bin
+PATH: /usr/local/bin
+PATH: /usr/bin
+PATH: /bin
+PATH: /usr/X11R6/bin
+PATH: /usr/sbin
+PATH: /sbin
+PATH: /home/kern/bin
+PATH: /usr/sbin
+PATH: /sbin
+
+
+## ----------- ##
+## Core tests. ##
+## ----------- ##
+
+configure:1300: checking for a BSD-compatible install
+configure:1355: result: /usr/bin/install -c
+configure:1366: checking whether build environment is sane
+configure:1409: result: yes
+configure:1474: checking for gawk
+configure:1490: found /usr/bin/gawk
+configure:1500: result: gawk
+configure:1510: checking whether make sets $(MAKE)
+configure:1530: result: yes
+configure:1753: checking for perl
+configure:1771: found /usr/bin/perl
+configure:1783: result: /usr/bin/perl
+configure:1836: checking for gcc
+configure:1852: found /usr/bin/gcc
+configure:1862: result: gcc
+configure:2106: checking for C compiler version
+configure:2109: gcc --version </dev/null >&5
+gcc (GCC) 3.4.2 20041017 (Red Hat 3.4.2-6.fc3)
+Copyright (C) 2004 Free Software Foundation, Inc.
+This is free software; see the source for copying conditions. There is NO
+warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+
+configure:2112: $? = 0
+configure:2114: gcc -v </dev/null >&5
+Reading specs from /usr/lib/gcc/i386-redhat-linux/3.4.2/specs
+Configured with: ../configure --prefix=/usr --mandir=/usr/share/man --infodir=/usr/share/info --enable-shared --enable-threads=posix --disable-checking --with-system-zlib --enable-__cxa_atexit --disable-libunwind-exceptions --enable-java-awt=gtk --host=i386-redhat-linux
+Thread model: posix
+gcc version 3.4.2 20041017 (Red Hat 3.4.2-6.fc3)
+configure:2117: $? = 0
+configure:2119: gcc -V </dev/null >&5
+gcc: `-V' option must have argument
+configure:2122: $? = 1
+configure:2145: checking for C compiler default output file name
+configure:2148: gcc conftest.c >&5
+configure:2151: $? = 0
+configure:2197: result: a.out
+configure:2202: checking whether the C compiler works
+configure:2208: ./a.out
+configure:2211: $? = 0
+configure:2228: result: yes
+configure:2235: checking whether we are cross compiling
+configure:2237: result: no
+configure:2240: checking for suffix of executables
+configure:2242: gcc -o conftest conftest.c >&5
+configure:2245: $? = 0
+configure:2270: result:
+configure:2276: checking for suffix of object files
+configure:2297: gcc -c conftest.c >&5
+configure:2300: $? = 0
+configure:2322: result: o
+configure:2326: checking whether we are using the GNU C compiler
+configure:2350: gcc -c conftest.c >&5
+configure:2356: $? = 0
+configure:2359: test -z || test ! -s conftest.err
+configure:2362: $? = 0
+configure:2365: test -s conftest.o
+configure:2368: $? = 0
+configure:2381: result: yes
+configure:2387: checking whether gcc accepts -g
+configure:2408: gcc -c -g conftest.c >&5
+configure:2414: $? = 0
+configure:2417: test -z || test ! -s conftest.err
+configure:2420: $? = 0
+configure:2423: test -s conftest.o
+configure:2426: $? = 0
+configure:2437: result: yes
+configure:2454: checking for gcc option to accept ANSI C
+configure:2524: gcc -c -g -O2 conftest.c >&5
+configure:2530: $? = 0
+configure:2533: test -z || test ! -s conftest.err
+configure:2536: $? = 0
+configure:2539: test -s conftest.o
+configure:2542: $? = 0
+configure:2560: result: none needed
+configure:2578: gcc -c -g -O2 conftest.c >&5
+conftest.c:2: error: syntax error before "me"
+configure:2584: $? = 1
+configure: failed program was:
+| #ifndef __cplusplus
+| choke me
+| #endif
+configure:2725: checking for style of include used by make
+configure:2753: result: GNU
+configure:2781: checking dependency style of gcc
+configure:2871: result: gcc3
+configure:2894: checking for xmlto
+configure:2912: found /usr/bin/xmlto
+configure:2925: result: /usr/bin/xmlto
+configure:3053: creating ./config.status
+
+## ---------------------- ##
+## Running config.status. ##
+## ---------------------- ##
+
+This file was extended by config.status, which was
+generated by GNU Autoconf 2.59. Invocation command line was
+
+ CONFIG_FILES =
+ CONFIG_HEADERS =
+ CONFIG_LINKS =
+ CONFIG_COMMANDS =
+ $ ./config.status
+
+on rufus.sibbald.com
+
+config.status:734: creating Makefile
+config.status:734: creating templates/Makefile
+config.status:734: creating perl/Makefile
+config.status:734: creating doc/Makefile
+config.status:734: creating exec/Makefile
+config.status:734: creating doc/yaird.xml
+config.status:800: creating include/config.h
+config.status:1066: executing depfiles commands
+
+## ---------------- ##
+## Cache variables. ##
+## ---------------- ##
+
+ac_cv_c_compiler_gnu=yes
+ac_cv_env_CC_set=
+ac_cv_env_CC_value=
+ac_cv_env_CFLAGS_set=
+ac_cv_env_CFLAGS_value=
+ac_cv_env_CPPFLAGS_set=
+ac_cv_env_CPPFLAGS_value=
+ac_cv_env_LDFLAGS_set=
+ac_cv_env_LDFLAGS_value=
+ac_cv_env_build_alias_set=
+ac_cv_env_build_alias_value=
+ac_cv_env_host_alias_set=
+ac_cv_env_host_alias_value=
+ac_cv_env_target_alias_set=
+ac_cv_env_target_alias_value=
+ac_cv_exeext=
+ac_cv_objext=o
+ac_cv_path_PERL=/usr/bin/perl
+ac_cv_path_XMLTO=/usr/bin/xmlto
+ac_cv_path_install='/usr/bin/install -c'
+ac_cv_prog_AWK=gawk
+ac_cv_prog_ac_ct_CC=gcc
+ac_cv_prog_cc_g=yes
+ac_cv_prog_cc_stdc=
+ac_cv_prog_make_make_set=yes
+am_cv_CC_dependencies_compiler_type=gcc3
+
+## ----------------- ##
+## Output variables. ##
+## ----------------- ##
+
+ACLOCAL='${SHELL} /home/kern/bacula/k/rescue/linux/cdrom/yaird-0.0.5/missing --run aclocal-1.9'
+AMDEPBACKSLASH='\'
+AMDEP_FALSE='#'
+AMDEP_TRUE=''
+AMTAR='${SHELL} /home/kern/bacula/k/rescue/linux/cdrom/yaird-0.0.5/missing --run tar'
+AUTOCONF='${SHELL} /home/kern/bacula/k/rescue/linux/cdrom/yaird-0.0.5/missing --run autoconf'
+AUTOHEADER='${SHELL} /home/kern/bacula/k/rescue/linux/cdrom/yaird-0.0.5/missing --run autoheader'
+AUTOMAKE='${SHELL} /home/kern/bacula/k/rescue/linux/cdrom/yaird-0.0.5/missing --run automake-1.9'
+AWK='gawk'
+CC='gcc'
+CCDEPMODE='depmode=gcc3'
+CFLAGS='-g -O2'
+CPPFLAGS=''
+CYGPATH_W='echo'
+DEFS='-DHAVE_CONFIG_H'
+DEPDIR='.deps'
+ECHO_C=''
+ECHO_N='-n'
+ECHO_T=''
+EXEEXT=''
+INITRD_TEMPLATE='Fedora'
+INSTALL_DATA='${INSTALL} -m 644'
+INSTALL_PROGRAM='${INSTALL}'
+INSTALL_SCRIPT='${INSTALL}'
+INSTALL_STRIP_PROGRAM='${SHELL} $(install_sh) -c -s'
+LDFLAGS=''
+LIBOBJS=''
+LIBS=''
+LTLIBOBJS=''
+MAKEINFO='${SHELL} /home/kern/bacula/k/rescue/linux/cdrom/yaird-0.0.5/missing --run makeinfo'
+OBJEXT='o'
+PACKAGE='yaird'
+PACKAGE_BUGREPORT=''
+PACKAGE_NAME=''
+PACKAGE_STRING=''
+PACKAGE_TARNAME=''
+PACKAGE_VERSION=''
+PATH_SEPARATOR=':'
+PERL='/usr/bin/perl'
+SET_MAKE=''
+SHELL='/bin/sh'
+STRIP=''
+VERSION='0.0.5'
+XMLTO='/usr/bin/xmlto'
+ac_ct_CC='gcc'
+ac_ct_STRIP=''
+am__fastdepCC_FALSE='#'
+am__fastdepCC_TRUE=''
+am__include='include'
+am__leading_dot='.'
+am__quote=''
+am__tar='${AMTAR} chof - "$$tardir"'
+am__untar='${AMTAR} xf -'
+bindir='${exec_prefix}/bin'
+build_alias=''
+datadir='${prefix}/share'
+exec_prefix='${prefix}'
+host_alias=''
+includedir='${prefix}/include'
+infodir='${prefix}/info'
+install_sh='/home/kern/bacula/k/rescue/linux/cdrom/yaird-0.0.5/install-sh'
+libdir='${exec_prefix}/lib'
+libexecdir='${exec_prefix}/libexec'
+localstatedir='${prefix}/var'
+mandir='${prefix}/man'
+mkdir_p='mkdir -p --'
+oldincludedir='/usr/include'
+prefix='/usr/local'
+program_transform_name='s,x,x,'
+sbindir='${exec_prefix}/sbin'
+sharedstatedir='${prefix}/com'
+sysconfdir='${prefix}/etc'
+target_alias=''
+
+## ----------- ##
+## confdefs.h. ##
+## ----------- ##
+
+#define PACKAGE "yaird"
+#define PACKAGE_BUGREPORT ""
+#define PACKAGE_NAME ""
+#define PACKAGE_STRING ""
+#define PACKAGE_TARNAME ""
+#define PACKAGE_VERSION ""
+#define VERSION "0.0.5"
+
+configure: exit 0
--- /dev/null
+#! /bin/sh
+# Generated by configure.
+# Run this file to recreate the current configuration.
+# Compiler output produced by configure, useful for debugging
+# configure, is in config.log if it exists.
+
+debug=false
+ac_cs_recheck=false
+ac_cs_silent=false
+SHELL=${CONFIG_SHELL-/bin/sh}
+## --------------------- ##
+## M4sh Initialization. ##
+## --------------------- ##
+
+# Be Bourne compatible
+if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then
+ emulate sh
+ NULLCMD=:
+ # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which
+ # is contrary to our usage. Disable this feature.
+ alias -g '${1+"$@"}'='"$@"'
+elif test -n "${BASH_VERSION+set}" && (set -o posix) >/dev/null 2>&1; then
+ set -o posix
+fi
+DUALCASE=1; export DUALCASE # for MKS sh
+
+# Support unset when possible.
+if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then
+ as_unset=unset
+else
+ as_unset=false
+fi
+
+
+# Work around bugs in pre-3.0 UWIN ksh.
+$as_unset ENV MAIL MAILPATH
+PS1='$ '
+PS2='> '
+PS4='+ '
+
+# NLS nuisances.
+for as_var in \
+ LANG LANGUAGE LC_ADDRESS LC_ALL LC_COLLATE LC_CTYPE LC_IDENTIFICATION \
+ LC_MEASUREMENT LC_MESSAGES LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER \
+ LC_TELEPHONE LC_TIME
+do
+ if (set +x; test -z "`(eval $as_var=C; export $as_var) 2>&1`"); then
+ eval $as_var=C; export $as_var
+ else
+ $as_unset $as_var
+ fi
+done
+
+# Required to use basename.
+if expr a : '\(a\)' >/dev/null 2>&1; then
+ as_expr=expr
+else
+ as_expr=false
+fi
+
+if (basename /) >/dev/null 2>&1 && test "X`basename / 2>&1`" = "X/"; then
+ as_basename=basename
+else
+ as_basename=false
+fi
+
+
+# Name of the executable.
+as_me=`$as_basename "$0" ||
+$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \
+ X"$0" : 'X\(//\)$' \| \
+ X"$0" : 'X\(/\)$' \| \
+ . : '\(.\)' 2>/dev/null ||
+echo X/"$0" |
+ sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/; q; }
+ /^X\/\(\/\/\)$/{ s//\1/; q; }
+ /^X\/\(\/\).*/{ s//\1/; q; }
+ s/.*/./; q'`
+
+
+# PATH needs CR, and LINENO needs CR and PATH.
+# Avoid depending upon Character Ranges.
+as_cr_letters='abcdefghijklmnopqrstuvwxyz'
+as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ'
+as_cr_Letters=$as_cr_letters$as_cr_LETTERS
+as_cr_digits='0123456789'
+as_cr_alnum=$as_cr_Letters$as_cr_digits
+
+# The user is always right.
+if test "${PATH_SEPARATOR+set}" != set; then
+ echo "#! /bin/sh" >conf$$.sh
+ echo "exit 0" >>conf$$.sh
+ chmod +x conf$$.sh
+ if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then
+ PATH_SEPARATOR=';'
+ else
+ PATH_SEPARATOR=:
+ fi
+ rm -f conf$$.sh
+fi
+
+
+ as_lineno_1=$LINENO
+ as_lineno_2=$LINENO
+ as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null`
+ test "x$as_lineno_1" != "x$as_lineno_2" &&
+ test "x$as_lineno_3" = "x$as_lineno_2" || {
+ # Find who we are. Look in the path if we contain no path at all
+ # relative or not.
+ case $0 in
+ *[\\/]* ) as_myself=$0 ;;
+ *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break
+done
+
+ ;;
+ esac
+ # We did not find ourselves, most probably we were run as `sh COMMAND'
+ # in which case we are not to be found in the path.
+ if test "x$as_myself" = x; then
+ as_myself=$0
+ fi
+ if test ! -f "$as_myself"; then
+ { { echo "$as_me:$LINENO: error: cannot find myself; rerun with an absolute path" >&5
+echo "$as_me: error: cannot find myself; rerun with an absolute path" >&2;}
+ { (exit 1); exit 1; }; }
+ fi
+ case $CONFIG_SHELL in
+ '')
+ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for as_base in sh bash ksh sh5; do
+ case $as_dir in
+ /*)
+ if ("$as_dir/$as_base" -c '
+ as_lineno_1=$LINENO
+ as_lineno_2=$LINENO
+ as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null`
+ test "x$as_lineno_1" != "x$as_lineno_2" &&
+ test "x$as_lineno_3" = "x$as_lineno_2" ') 2>/dev/null; then
+ $as_unset BASH_ENV || test "${BASH_ENV+set}" != set || { BASH_ENV=; export BASH_ENV; }
+ $as_unset ENV || test "${ENV+set}" != set || { ENV=; export ENV; }
+ CONFIG_SHELL=$as_dir/$as_base
+ export CONFIG_SHELL
+ exec "$CONFIG_SHELL" "$0" ${1+"$@"}
+ fi;;
+ esac
+ done
+done
+;;
+ esac
+
+ # Create $as_me.lineno as a copy of $as_myself, but with $LINENO
+ # uniformly replaced by the line number. The first 'sed' inserts a
+ # line-number line before each line; the second 'sed' does the real
+ # work. The second script uses 'N' to pair each line-number line
+ # with the numbered line, and appends trailing '-' during
+ # substitution so that $LINENO is not a special case at line end.
+ # (Raja R Harinath suggested sed '=', and Paul Eggert wrote the
+ # second 'sed' script. Blame Lee E. McMahon for sed's syntax. :-)
+ sed '=' <$as_myself |
+ sed '
+ N
+ s,$,-,
+ : loop
+ s,^\(['$as_cr_digits']*\)\(.*\)[$]LINENO\([^'$as_cr_alnum'_]\),\1\2\1\3,
+ t loop
+ s,-$,,
+ s,^['$as_cr_digits']*\n,,
+ ' >$as_me.lineno &&
+ chmod +x $as_me.lineno ||
+ { { echo "$as_me:$LINENO: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&5
+echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2;}
+ { (exit 1); exit 1; }; }
+
+ # Don't try to exec as it changes $[0], causing all sort of problems
+ # (the dirname of $[0] is not the place where we might find the
+ # original and so on. Autoconf is especially sensible to this).
+ . ./$as_me.lineno
+ # Exit status is that of the last command.
+ exit
+}
+
+
+case `echo "testing\c"; echo 1,2,3`,`echo -n testing; echo 1,2,3` in
+ *c*,-n*) ECHO_N= ECHO_C='
+' ECHO_T=' ' ;;
+ *c*,* ) ECHO_N=-n ECHO_C= ECHO_T= ;;
+ *) ECHO_N= ECHO_C='\c' ECHO_T= ;;
+esac
+
+if expr a : '\(a\)' >/dev/null 2>&1; then
+ as_expr=expr
+else
+ as_expr=false
+fi
+
+rm -f conf$$ conf$$.exe conf$$.file
+echo >conf$$.file
+if ln -s conf$$.file conf$$ 2>/dev/null; then
+ # We could just check for DJGPP; but this test a) works b) is more generic
+ # and c) will remain valid once DJGPP supports symlinks (DJGPP 2.04).
+ if test -f conf$$.exe; then
+ # Don't use ln at all; we don't have any links
+ as_ln_s='cp -p'
+ else
+ as_ln_s='ln -s'
+ fi
+elif ln conf$$.file conf$$ 2>/dev/null; then
+ as_ln_s=ln
+else
+ as_ln_s='cp -p'
+fi
+rm -f conf$$ conf$$.exe conf$$.file
+
+if mkdir -p . 2>/dev/null; then
+ as_mkdir_p=:
+else
+ test -d ./-p && rmdir ./-p
+ as_mkdir_p=false
+fi
+
+as_executable_p="test -f"
+
+# Sed expression to map a string onto a valid CPP name.
+as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'"
+
+# Sed expression to map a string onto a valid variable name.
+as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'"
+
+
+# IFS
+# We need space, tab and new line, in precisely that order.
+as_nl='
+'
+IFS=" $as_nl"
+
+# CDPATH.
+$as_unset CDPATH
+
+exec 6>&1
+
+# Open the log real soon, to keep \$[0] and so on meaningful, and to
+# report actual input values of CONFIG_FILES etc. instead of their
+# values after options handling. Logging --version etc. is OK.
+exec 5>>config.log
+{
+ echo
+ sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX
+## Running $as_me. ##
+_ASBOX
+} >&5
+cat >&5 <<_CSEOF
+
+This file was extended by $as_me, which was
+generated by GNU Autoconf 2.59. Invocation command line was
+
+ CONFIG_FILES = $CONFIG_FILES
+ CONFIG_HEADERS = $CONFIG_HEADERS
+ CONFIG_LINKS = $CONFIG_LINKS
+ CONFIG_COMMANDS = $CONFIG_COMMANDS
+ $ $0 $@
+
+_CSEOF
+echo "on `(hostname || uname -n) 2>/dev/null | sed 1q`" >&5
+echo >&5
+config_files=" Makefile templates/Makefile perl/Makefile doc/Makefile exec/Makefile doc/yaird.xml"
+config_headers=" include/config.h"
+config_commands=" depfiles"
+
+ac_cs_usage="\
+\`$as_me' instantiates files from templates according to the
+current configuration.
+
+Usage: $0 [OPTIONS] [FILE]...
+
+ -h, --help print this help, then exit
+ -V, --version print version number, then exit
+ -q, --quiet do not print progress messages
+ -d, --debug don't remove temporary files
+ --recheck update $as_me by reconfiguring in the same conditions
+ --file=FILE[:TEMPLATE]
+ instantiate the configuration file FILE
+ --header=FILE[:TEMPLATE]
+ instantiate the configuration header FILE
+
+Configuration files:
+$config_files
+
+Configuration headers:
+$config_headers
+
+Configuration commands:
+$config_commands
+
+Report bugs to <bug-autoconf@gnu.org>."
+ac_cs_version="\
+config.status
+configured by ./configure, generated by GNU Autoconf 2.59,
+ with options \"'--enable-template=Fedora'\"
+
+Copyright (C) 2003 Free Software Foundation, Inc.
+This config.status script is free software; the Free Software Foundation
+gives unlimited permission to copy, distribute and modify it."
+srcdir=.
+INSTALL="/usr/bin/install -c"
+# If no file are specified by the user, then we need to provide default
+# value. By we need to know if files were specified by the user.
+ac_need_defaults=:
+while test $# != 0
+do
+ case $1 in
+ --*=*)
+ ac_option=`expr "x$1" : 'x\([^=]*\)='`
+ ac_optarg=`expr "x$1" : 'x[^=]*=\(.*\)'`
+ ac_shift=:
+ ;;
+ -*)
+ ac_option=$1
+ ac_optarg=$2
+ ac_shift=shift
+ ;;
+ *) # This is not an option, so the user has probably given explicit
+ # arguments.
+ ac_option=$1
+ ac_need_defaults=false;;
+ esac
+
+ case $ac_option in
+ # Handling of the options.
+ -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r)
+ ac_cs_recheck=: ;;
+ --version | --vers* | -V )
+ echo "$ac_cs_version"; exit 0 ;;
+ --he | --h)
+ # Conflict between --help and --header
+ { { echo "$as_me:$LINENO: error: ambiguous option: $1
+Try \`$0 --help' for more information." >&5
+echo "$as_me: error: ambiguous option: $1
+Try \`$0 --help' for more information." >&2;}
+ { (exit 1); exit 1; }; };;
+ --help | --hel | -h )
+ echo "$ac_cs_usage"; exit 0 ;;
+ --debug | --d* | -d )
+ debug=: ;;
+ --file | --fil | --fi | --f )
+ $ac_shift
+ CONFIG_FILES="$CONFIG_FILES $ac_optarg"
+ ac_need_defaults=false;;
+ --header | --heade | --head | --hea )
+ $ac_shift
+ CONFIG_HEADERS="$CONFIG_HEADERS $ac_optarg"
+ ac_need_defaults=false;;
+ -q | -quiet | --quiet | --quie | --qui | --qu | --q \
+ | -silent | --silent | --silen | --sile | --sil | --si | --s)
+ ac_cs_silent=: ;;
+
+ # This is an error.
+ -*) { { echo "$as_me:$LINENO: error: unrecognized option: $1
+Try \`$0 --help' for more information." >&5
+echo "$as_me: error: unrecognized option: $1
+Try \`$0 --help' for more information." >&2;}
+ { (exit 1); exit 1; }; } ;;
+
+ *) ac_config_targets="$ac_config_targets $1" ;;
+
+ esac
+ shift
+done
+
+ac_configure_extra_args=
+
+if $ac_cs_silent; then
+ exec 6>/dev/null
+ ac_configure_extra_args="$ac_configure_extra_args --silent"
+fi
+
+if $ac_cs_recheck; then
+ echo "running /bin/sh ./configure " '--enable-template=Fedora' $ac_configure_extra_args " --no-create --no-recursion" >&6
+ exec /bin/sh ./configure '--enable-template=Fedora' $ac_configure_extra_args --no-create --no-recursion
+fi
+
+#
+# INIT-COMMANDS section.
+#
+
+AMDEP_TRUE="" ac_aux_dir="."
+
+for ac_config_target in $ac_config_targets
+do
+ case "$ac_config_target" in
+ # Handling of arguments.
+ "Makefile" ) CONFIG_FILES="$CONFIG_FILES Makefile" ;;
+ "templates/Makefile" ) CONFIG_FILES="$CONFIG_FILES templates/Makefile" ;;
+ "perl/Makefile" ) CONFIG_FILES="$CONFIG_FILES perl/Makefile" ;;
+ "doc/Makefile" ) CONFIG_FILES="$CONFIG_FILES doc/Makefile" ;;
+ "exec/Makefile" ) CONFIG_FILES="$CONFIG_FILES exec/Makefile" ;;
+ "doc/yaird.xml" ) CONFIG_FILES="$CONFIG_FILES doc/yaird.xml" ;;
+ "depfiles" ) CONFIG_COMMANDS="$CONFIG_COMMANDS depfiles" ;;
+ "include/config.h" ) CONFIG_HEADERS="$CONFIG_HEADERS include/config.h" ;;
+ *) { { echo "$as_me:$LINENO: error: invalid argument: $ac_config_target" >&5
+echo "$as_me: error: invalid argument: $ac_config_target" >&2;}
+ { (exit 1); exit 1; }; };;
+ esac
+done
+
+# If the user did not use the arguments to specify the items to instantiate,
+# then the envvar interface is used. Set only those that are not.
+# We use the long form for the default assignment because of an extremely
+# bizarre bug on SunOS 4.1.3.
+if $ac_need_defaults; then
+ test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files
+ test "${CONFIG_HEADERS+set}" = set || CONFIG_HEADERS=$config_headers
+ test "${CONFIG_COMMANDS+set}" = set || CONFIG_COMMANDS=$config_commands
+fi
+
+# Have a temporary directory for convenience. Make it in the build tree
+# simply because there is no reason to put it here, and in addition,
+# creating and moving files from /tmp can sometimes cause problems.
+# Create a temporary directory, and hook for its removal unless debugging.
+$debug ||
+{
+ trap 'exit_status=$?; rm -rf $tmp && exit $exit_status' 0
+ trap '{ (exit 1); exit 1; }' 1 2 13 15
+}
+
+# Create a (secure) tmp directory for tmp files.
+
+{
+ tmp=`(umask 077 && mktemp -d -q "./confstatXXXXXX") 2>/dev/null` &&
+ test -n "$tmp" && test -d "$tmp"
+} ||
+{
+ tmp=./confstat$$-$RANDOM
+ (umask 077 && mkdir $tmp)
+} ||
+{
+ echo "$me: cannot create a temporary directory in ." >&2
+ { (exit 1); exit 1; }
+}
+
+
+#
+# CONFIG_FILES section.
+#
+
+# No need to generate the scripts if there are no CONFIG_FILES.
+# This happens for instance when ./config.status config.h
+if test -n "$CONFIG_FILES"; then
+ # Protect against being on the right side of a sed subst in config.status.
+ sed 's/,@/@@/; s/@,/@@/; s/,;t t$/@;t t/; /@;t t$/s/[\\&,]/\\&/g;
+ s/@@/,@/; s/@@/@,/; s/@;t t$/,;t t/' >$tmp/subs.sed <<\CEOF
+s,@SHELL@,/bin/sh,;t t
+s,@PATH_SEPARATOR@,:,;t t
+s,@PACKAGE_NAME@,,;t t
+s,@PACKAGE_TARNAME@,,;t t
+s,@PACKAGE_VERSION@,,;t t
+s,@PACKAGE_STRING@,,;t t
+s,@PACKAGE_BUGREPORT@,,;t t
+s,@exec_prefix@,${prefix},;t t
+s,@prefix@,/usr/local,;t t
+s,@program_transform_name@,s,x,x,,;t t
+s,@bindir@,${exec_prefix}/bin,;t t
+s,@sbindir@,${exec_prefix}/sbin,;t t
+s,@libexecdir@,${exec_prefix}/libexec,;t t
+s,@datadir@,${prefix}/share,;t t
+s,@sysconfdir@,${prefix}/etc,;t t
+s,@sharedstatedir@,${prefix}/com,;t t
+s,@localstatedir@,${prefix}/var,;t t
+s,@libdir@,${exec_prefix}/lib,;t t
+s,@includedir@,${prefix}/include,;t t
+s,@oldincludedir@,/usr/include,;t t
+s,@infodir@,${prefix}/info,;t t
+s,@mandir@,${prefix}/man,;t t
+s,@build_alias@,,;t t
+s,@host_alias@,,;t t
+s,@target_alias@,,;t t
+s,@DEFS@,-DHAVE_CONFIG_H,;t t
+s,@ECHO_C@,,;t t
+s,@ECHO_N@,-n,;t t
+s,@ECHO_T@,,;t t
+s,@LIBS@,,;t t
+s,@INSTALL_PROGRAM@,${INSTALL},;t t
+s,@INSTALL_SCRIPT@,${INSTALL},;t t
+s,@INSTALL_DATA@,${INSTALL} -m 644,;t t
+s,@CYGPATH_W@,echo,;t t
+s,@PACKAGE@,yaird,;t t
+s,@VERSION@,0.0.5,;t t
+s,@ACLOCAL@,${SHELL} /home/kern/bacula/k/rescue/linux/cdrom/yaird-0.0.5/missing --run aclocal-1.9,;t t
+s,@AUTOCONF@,${SHELL} /home/kern/bacula/k/rescue/linux/cdrom/yaird-0.0.5/missing --run autoconf,;t t
+s,@AUTOMAKE@,${SHELL} /home/kern/bacula/k/rescue/linux/cdrom/yaird-0.0.5/missing --run automake-1.9,;t t
+s,@AUTOHEADER@,${SHELL} /home/kern/bacula/k/rescue/linux/cdrom/yaird-0.0.5/missing --run autoheader,;t t
+s,@MAKEINFO@,${SHELL} /home/kern/bacula/k/rescue/linux/cdrom/yaird-0.0.5/missing --run makeinfo,;t t
+s,@install_sh@,/home/kern/bacula/k/rescue/linux/cdrom/yaird-0.0.5/install-sh,;t t
+s,@STRIP@,,;t t
+s,@ac_ct_STRIP@,,;t t
+s,@INSTALL_STRIP_PROGRAM@,${SHELL} $(install_sh) -c -s,;t t
+s,@mkdir_p@,mkdir -p --,;t t
+s,@AWK@,gawk,;t t
+s,@SET_MAKE@,,;t t
+s,@am__leading_dot@,.,;t t
+s,@AMTAR@,${SHELL} /home/kern/bacula/k/rescue/linux/cdrom/yaird-0.0.5/missing --run tar,;t t
+s,@am__tar@,${AMTAR} chof - "$$tardir",;t t
+s,@am__untar@,${AMTAR} xf -,;t t
+s,@INITRD_TEMPLATE@,Fedora,;t t
+s,@PERL@,/usr/bin/perl,;t t
+s,@CC@,gcc,;t t
+s,@CFLAGS@,-g -O2,;t t
+s,@LDFLAGS@,,;t t
+s,@CPPFLAGS@,,;t t
+s,@ac_ct_CC@,gcc,;t t
+s,@EXEEXT@,,;t t
+s,@OBJEXT@,o,;t t
+s,@DEPDIR@,.deps,;t t
+s,@am__include@,include,;t t
+s,@am__quote@,,;t t
+s,@AMDEP_TRUE@,,;t t
+s,@AMDEP_FALSE@,#,;t t
+s,@AMDEPBACKSLASH@,\,;t t
+s,@CCDEPMODE@,depmode=gcc3,;t t
+s,@am__fastdepCC_TRUE@,,;t t
+s,@am__fastdepCC_FALSE@,#,;t t
+s,@XMLTO@,/usr/bin/xmlto,;t t
+s,@LIBOBJS@,,;t t
+s,@LTLIBOBJS@,,;t t
+CEOF
+
+ # Split the substitutions into bite-sized pieces for seds with
+ # small command number limits, like on Digital OSF/1 and HP-UX.
+ ac_max_sed_lines=48
+ ac_sed_frag=1 # Number of current file.
+ ac_beg=1 # First line for current file.
+ ac_end=$ac_max_sed_lines # Line after last line for current file.
+ ac_more_lines=:
+ ac_sed_cmds=
+ while $ac_more_lines; do
+ if test $ac_beg -gt 1; then
+ sed "1,${ac_beg}d; ${ac_end}q" $tmp/subs.sed >$tmp/subs.frag
+ else
+ sed "${ac_end}q" $tmp/subs.sed >$tmp/subs.frag
+ fi
+ if test ! -s $tmp/subs.frag; then
+ ac_more_lines=false
+ else
+ # The purpose of the label and of the branching condition is to
+ # speed up the sed processing (if there are no `@' at all, there
+ # is no need to browse any of the substitutions).
+ # These are the two extra sed commands mentioned above.
+ (echo ':t
+ /@[a-zA-Z_][a-zA-Z_0-9]*@/!b' && cat $tmp/subs.frag) >$tmp/subs-$ac_sed_frag.sed
+ if test -z "$ac_sed_cmds"; then
+ ac_sed_cmds="sed -f $tmp/subs-$ac_sed_frag.sed"
+ else
+ ac_sed_cmds="$ac_sed_cmds | sed -f $tmp/subs-$ac_sed_frag.sed"
+ fi
+ ac_sed_frag=`expr $ac_sed_frag + 1`
+ ac_beg=$ac_end
+ ac_end=`expr $ac_end + $ac_max_sed_lines`
+ fi
+ done
+ if test -z "$ac_sed_cmds"; then
+ ac_sed_cmds=cat
+ fi
+fi # test -n "$CONFIG_FILES"
+
+for ac_file in : $CONFIG_FILES; do test "x$ac_file" = x: && continue
+ # Support "outfile[:infile[:infile...]]", defaulting infile="outfile.in".
+ case $ac_file in
+ - | *:- | *:-:* ) # input from stdin
+ cat >$tmp/stdin
+ ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'`
+ ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;;
+ *:* ) ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'`
+ ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;;
+ * ) ac_file_in=$ac_file.in ;;
+ esac
+
+ # Compute @srcdir@, @top_srcdir@, and @INSTALL@ for subdirectories.
+ ac_dir=`(dirname "$ac_file") 2>/dev/null ||
+$as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+ X"$ac_file" : 'X\(//\)[^/]' \| \
+ X"$ac_file" : 'X\(//\)$' \| \
+ X"$ac_file" : 'X\(/\)' \| \
+ . : '\(.\)' 2>/dev/null ||
+echo X"$ac_file" |
+ sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; }
+ /^X\(\/\/\)[^/].*/{ s//\1/; q; }
+ /^X\(\/\/\)$/{ s//\1/; q; }
+ /^X\(\/\).*/{ s//\1/; q; }
+ s/.*/./; q'`
+ { if $as_mkdir_p; then
+ mkdir -p "$ac_dir"
+ else
+ as_dir="$ac_dir"
+ as_dirs=
+ while test ! -d "$as_dir"; do
+ as_dirs="$as_dir $as_dirs"
+ as_dir=`(dirname "$as_dir") 2>/dev/null ||
+$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+ X"$as_dir" : 'X\(//\)[^/]' \| \
+ X"$as_dir" : 'X\(//\)$' \| \
+ X"$as_dir" : 'X\(/\)' \| \
+ . : '\(.\)' 2>/dev/null ||
+echo X"$as_dir" |
+ sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; }
+ /^X\(\/\/\)[^/].*/{ s//\1/; q; }
+ /^X\(\/\/\)$/{ s//\1/; q; }
+ /^X\(\/\).*/{ s//\1/; q; }
+ s/.*/./; q'`
+ done
+ test ! -n "$as_dirs" || mkdir $as_dirs
+ fi || { { echo "$as_me:$LINENO: error: cannot create directory \"$ac_dir\"" >&5
+echo "$as_me: error: cannot create directory \"$ac_dir\"" >&2;}
+ { (exit 1); exit 1; }; }; }
+
+ ac_builddir=.
+
+if test "$ac_dir" != .; then
+ ac_dir_suffix=/`echo "$ac_dir" | sed 's,^\.[\\/],,'`
+ # A "../" for each directory in $ac_dir_suffix.
+ ac_top_builddir=`echo "$ac_dir_suffix" | sed 's,/[^\\/]*,../,g'`
+else
+ ac_dir_suffix= ac_top_builddir=
+fi
+
+case $srcdir in
+ .) # No --srcdir option. We are building in place.
+ ac_srcdir=.
+ if test -z "$ac_top_builddir"; then
+ ac_top_srcdir=.
+ else
+ ac_top_srcdir=`echo $ac_top_builddir | sed 's,/$,,'`
+ fi ;;
+ [\\/]* | ?:[\\/]* ) # Absolute path.
+ ac_srcdir=$srcdir$ac_dir_suffix;
+ ac_top_srcdir=$srcdir ;;
+ *) # Relative path.
+ ac_srcdir=$ac_top_builddir$srcdir$ac_dir_suffix
+ ac_top_srcdir=$ac_top_builddir$srcdir ;;
+esac
+
+# Do not use `cd foo && pwd` to compute absolute paths, because
+# the directories may not exist.
+case `pwd` in
+.) ac_abs_builddir="$ac_dir";;
+*)
+ case "$ac_dir" in
+ .) ac_abs_builddir=`pwd`;;
+ [\\/]* | ?:[\\/]* ) ac_abs_builddir="$ac_dir";;
+ *) ac_abs_builddir=`pwd`/"$ac_dir";;
+ esac;;
+esac
+case $ac_abs_builddir in
+.) ac_abs_top_builddir=${ac_top_builddir}.;;
+*)
+ case ${ac_top_builddir}. in
+ .) ac_abs_top_builddir=$ac_abs_builddir;;
+ [\\/]* | ?:[\\/]* ) ac_abs_top_builddir=${ac_top_builddir}.;;
+ *) ac_abs_top_builddir=$ac_abs_builddir/${ac_top_builddir}.;;
+ esac;;
+esac
+case $ac_abs_builddir in
+.) ac_abs_srcdir=$ac_srcdir;;
+*)
+ case $ac_srcdir in
+ .) ac_abs_srcdir=$ac_abs_builddir;;
+ [\\/]* | ?:[\\/]* ) ac_abs_srcdir=$ac_srcdir;;
+ *) ac_abs_srcdir=$ac_abs_builddir/$ac_srcdir;;
+ esac;;
+esac
+case $ac_abs_builddir in
+.) ac_abs_top_srcdir=$ac_top_srcdir;;
+*)
+ case $ac_top_srcdir in
+ .) ac_abs_top_srcdir=$ac_abs_builddir;;
+ [\\/]* | ?:[\\/]* ) ac_abs_top_srcdir=$ac_top_srcdir;;
+ *) ac_abs_top_srcdir=$ac_abs_builddir/$ac_top_srcdir;;
+ esac;;
+esac
+
+
+ case $INSTALL in
+ [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;;
+ *) ac_INSTALL=$ac_top_builddir$INSTALL ;;
+ esac
+
+ # Let's still pretend it is `configure' which instantiates (i.e., don't
+ # use $as_me), people would be surprised to read:
+ # /* config.h. Generated by config.status. */
+ if test x"$ac_file" = x-; then
+ configure_input=
+ else
+ configure_input="$ac_file. "
+ fi
+ configure_input=$configure_input"Generated from `echo $ac_file_in |
+ sed 's,.*/,,'` by configure."
+
+ # First look for the input files in the build tree, otherwise in the
+ # src tree.
+ ac_file_inputs=`IFS=:
+ for f in $ac_file_in; do
+ case $f in
+ -) echo $tmp/stdin ;;
+ [\\/$]*)
+ # Absolute (can't be DOS-style, as IFS=:)
+ test -f "$f" || { { echo "$as_me:$LINENO: error: cannot find input file: $f" >&5
+echo "$as_me: error: cannot find input file: $f" >&2;}
+ { (exit 1); exit 1; }; }
+ echo "$f";;
+ *) # Relative
+ if test -f "$f"; then
+ # Build tree
+ echo "$f"
+ elif test -f "$srcdir/$f"; then
+ # Source tree
+ echo "$srcdir/$f"
+ else
+ # /dev/null tree
+ { { echo "$as_me:$LINENO: error: cannot find input file: $f" >&5
+echo "$as_me: error: cannot find input file: $f" >&2;}
+ { (exit 1); exit 1; }; }
+ fi;;
+ esac
+ done` || { (exit 1); exit 1; }
+
+ if test x"$ac_file" != x-; then
+ { echo "$as_me:$LINENO: creating $ac_file" >&5
+echo "$as_me: creating $ac_file" >&6;}
+ rm -f "$ac_file"
+ fi
+ sed "/^[ ]*VPATH[ ]*=/{
+s/:*\$(srcdir):*/:/;
+s/:*\${srcdir}:*/:/;
+s/:*@srcdir@:*/:/;
+s/^\([^=]*=[ ]*\):*/\1/;
+s/:*$//;
+s/^[^=]*=[ ]*$//;
+}
+
+:t
+/@[a-zA-Z_][a-zA-Z_0-9]*@/!b
+s,@configure_input@,$configure_input,;t t
+s,@srcdir@,$ac_srcdir,;t t
+s,@abs_srcdir@,$ac_abs_srcdir,;t t
+s,@top_srcdir@,$ac_top_srcdir,;t t
+s,@abs_top_srcdir@,$ac_abs_top_srcdir,;t t
+s,@builddir@,$ac_builddir,;t t
+s,@abs_builddir@,$ac_abs_builddir,;t t
+s,@top_builddir@,$ac_top_builddir,;t t
+s,@abs_top_builddir@,$ac_abs_top_builddir,;t t
+s,@INSTALL@,$ac_INSTALL,;t t
+" $ac_file_inputs | (eval "$ac_sed_cmds") >$tmp/out
+ rm -f $tmp/stdin
+ if test x"$ac_file" != x-; then
+ mv $tmp/out $ac_file
+ else
+ cat $tmp/out
+ rm -f $tmp/out
+ fi
+
+done
+
+#
+# CONFIG_HEADER section.
+#
+
+# These sed commands are passed to sed as "A NAME B NAME C VALUE D", where
+# NAME is the cpp macro being defined and VALUE is the value it is being given.
+#
+# ac_d sets the value in "#define NAME VALUE" lines.
+ac_dA='s,^\([ ]*\)#\([ ]*define[ ][ ]*\)'
+ac_dB='[ ].*$,\1#\2'
+ac_dC=' '
+ac_dD=',;t'
+# ac_u turns "#undef NAME" without trailing blanks into "#define NAME VALUE".
+ac_uA='s,^\([ ]*\)#\([ ]*\)undef\([ ][ ]*\)'
+ac_uB='$,\1#\2define\3'
+ac_uC=' '
+ac_uD=',;t'
+
+for ac_file in : $CONFIG_HEADERS; do test "x$ac_file" = x: && continue
+ # Support "outfile[:infile[:infile...]]", defaulting infile="outfile.in".
+ case $ac_file in
+ - | *:- | *:-:* ) # input from stdin
+ cat >$tmp/stdin
+ ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'`
+ ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;;
+ *:* ) ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'`
+ ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;;
+ * ) ac_file_in=$ac_file.in ;;
+ esac
+
+ test x"$ac_file" != x- && { echo "$as_me:$LINENO: creating $ac_file" >&5
+echo "$as_me: creating $ac_file" >&6;}
+
+ # First look for the input files in the build tree, otherwise in the
+ # src tree.
+ ac_file_inputs=`IFS=:
+ for f in $ac_file_in; do
+ case $f in
+ -) echo $tmp/stdin ;;
+ [\\/$]*)
+ # Absolute (can't be DOS-style, as IFS=:)
+ test -f "$f" || { { echo "$as_me:$LINENO: error: cannot find input file: $f" >&5
+echo "$as_me: error: cannot find input file: $f" >&2;}
+ { (exit 1); exit 1; }; }
+ # Do quote $f, to prevent DOS paths from being IFS'd.
+ echo "$f";;
+ *) # Relative
+ if test -f "$f"; then
+ # Build tree
+ echo "$f"
+ elif test -f "$srcdir/$f"; then
+ # Source tree
+ echo "$srcdir/$f"
+ else
+ # /dev/null tree
+ { { echo "$as_me:$LINENO: error: cannot find input file: $f" >&5
+echo "$as_me: error: cannot find input file: $f" >&2;}
+ { (exit 1); exit 1; }; }
+ fi;;
+ esac
+ done` || { (exit 1); exit 1; }
+ # Remove the trailing spaces.
+ sed 's/[ ]*$//' $ac_file_inputs >$tmp/in
+
+ # Handle all the #define templates only if necessary.
+ if grep "^[ ]*#[ ]*define" $tmp/in >/dev/null; then
+ # If there are no defines, we may have an empty if/fi
+ :
+ cat >$tmp/defines.sed <<CEOF
+/^[ ]*#[ ]*define/!b
+t clr
+: clr
+${ac_dA}PACKAGE_NAME${ac_dB}PACKAGE_NAME${ac_dC}""${ac_dD}
+${ac_dA}PACKAGE_TARNAME${ac_dB}PACKAGE_TARNAME${ac_dC}""${ac_dD}
+${ac_dA}PACKAGE_VERSION${ac_dB}PACKAGE_VERSION${ac_dC}""${ac_dD}
+${ac_dA}PACKAGE_STRING${ac_dB}PACKAGE_STRING${ac_dC}""${ac_dD}
+${ac_dA}PACKAGE_BUGREPORT${ac_dB}PACKAGE_BUGREPORT${ac_dC}""${ac_dD}
+${ac_dA}PACKAGE${ac_dB}PACKAGE${ac_dC}"yaird"${ac_dD}
+${ac_dA}VERSION${ac_dB}VERSION${ac_dC}"0.0.5"${ac_dD}
+CEOF
+ sed -f $tmp/defines.sed $tmp/in >$tmp/out
+ rm -f $tmp/in
+ mv $tmp/out $tmp/in
+
+ fi # grep
+
+ # Handle all the #undef templates
+ cat >$tmp/undefs.sed <<CEOF
+/^[ ]*#[ ]*undef/!b
+t clr
+: clr
+${ac_uA}PACKAGE_NAME${ac_uB}PACKAGE_NAME${ac_uC}""${ac_uD}
+${ac_uA}PACKAGE_TARNAME${ac_uB}PACKAGE_TARNAME${ac_uC}""${ac_uD}
+${ac_uA}PACKAGE_VERSION${ac_uB}PACKAGE_VERSION${ac_uC}""${ac_uD}
+${ac_uA}PACKAGE_STRING${ac_uB}PACKAGE_STRING${ac_uC}""${ac_uD}
+${ac_uA}PACKAGE_BUGREPORT${ac_uB}PACKAGE_BUGREPORT${ac_uC}""${ac_uD}
+${ac_uA}PACKAGE${ac_uB}PACKAGE${ac_uC}"yaird"${ac_uD}
+${ac_uA}VERSION${ac_uB}VERSION${ac_uC}"0.0.5"${ac_uD}
+s,^[ ]*#[ ]*undef[ ][ ]*[a-zA-Z_][a-zA-Z_0-9]*,/* & */,
+CEOF
+ sed -f $tmp/undefs.sed $tmp/in >$tmp/out
+ rm -f $tmp/in
+ mv $tmp/out $tmp/in
+
+ # Let's still pretend it is `configure' which instantiates (i.e., don't
+ # use $as_me), people would be surprised to read:
+ # /* config.h. Generated by config.status. */
+ if test x"$ac_file" = x-; then
+ echo "/* Generated by configure. */" >$tmp/config.h
+ else
+ echo "/* $ac_file. Generated by configure. */" >$tmp/config.h
+ fi
+ cat $tmp/in >>$tmp/config.h
+ rm -f $tmp/in
+ if test x"$ac_file" != x-; then
+ if diff $ac_file $tmp/config.h >/dev/null 2>&1; then
+ { echo "$as_me:$LINENO: $ac_file is unchanged" >&5
+echo "$as_me: $ac_file is unchanged" >&6;}
+ else
+ ac_dir=`(dirname "$ac_file") 2>/dev/null ||
+$as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+ X"$ac_file" : 'X\(//\)[^/]' \| \
+ X"$ac_file" : 'X\(//\)$' \| \
+ X"$ac_file" : 'X\(/\)' \| \
+ . : '\(.\)' 2>/dev/null ||
+echo X"$ac_file" |
+ sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; }
+ /^X\(\/\/\)[^/].*/{ s//\1/; q; }
+ /^X\(\/\/\)$/{ s//\1/; q; }
+ /^X\(\/\).*/{ s//\1/; q; }
+ s/.*/./; q'`
+ { if $as_mkdir_p; then
+ mkdir -p "$ac_dir"
+ else
+ as_dir="$ac_dir"
+ as_dirs=
+ while test ! -d "$as_dir"; do
+ as_dirs="$as_dir $as_dirs"
+ as_dir=`(dirname "$as_dir") 2>/dev/null ||
+$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+ X"$as_dir" : 'X\(//\)[^/]' \| \
+ X"$as_dir" : 'X\(//\)$' \| \
+ X"$as_dir" : 'X\(/\)' \| \
+ . : '\(.\)' 2>/dev/null ||
+echo X"$as_dir" |
+ sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; }
+ /^X\(\/\/\)[^/].*/{ s//\1/; q; }
+ /^X\(\/\/\)$/{ s//\1/; q; }
+ /^X\(\/\).*/{ s//\1/; q; }
+ s/.*/./; q'`
+ done
+ test ! -n "$as_dirs" || mkdir $as_dirs
+ fi || { { echo "$as_me:$LINENO: error: cannot create directory \"$ac_dir\"" >&5
+echo "$as_me: error: cannot create directory \"$ac_dir\"" >&2;}
+ { (exit 1); exit 1; }; }; }
+
+ rm -f $ac_file
+ mv $tmp/config.h $ac_file
+ fi
+ else
+ cat $tmp/config.h
+ rm -f $tmp/config.h
+ fi
+# Compute $ac_file's index in $config_headers.
+_am_stamp_count=1
+for _am_header in $config_headers :; do
+ case $_am_header in
+ $ac_file | $ac_file:* )
+ break ;;
+ * )
+ _am_stamp_count=`expr $_am_stamp_count + 1` ;;
+ esac
+done
+echo "timestamp for $ac_file" >`(dirname $ac_file) 2>/dev/null ||
+$as_expr X$ac_file : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+ X$ac_file : 'X\(//\)[^/]' \| \
+ X$ac_file : 'X\(//\)$' \| \
+ X$ac_file : 'X\(/\)' \| \
+ . : '\(.\)' 2>/dev/null ||
+echo X$ac_file |
+ sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; }
+ /^X\(\/\/\)[^/].*/{ s//\1/; q; }
+ /^X\(\/\/\)$/{ s//\1/; q; }
+ /^X\(\/\).*/{ s//\1/; q; }
+ s/.*/./; q'`/stamp-h$_am_stamp_count
+done
+
+#
+# CONFIG_COMMANDS section.
+#
+for ac_file in : $CONFIG_COMMANDS; do test "x$ac_file" = x: && continue
+ ac_dest=`echo "$ac_file" | sed 's,:.*,,'`
+ ac_source=`echo "$ac_file" | sed 's,[^:]*:,,'`
+ ac_dir=`(dirname "$ac_dest") 2>/dev/null ||
+$as_expr X"$ac_dest" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+ X"$ac_dest" : 'X\(//\)[^/]' \| \
+ X"$ac_dest" : 'X\(//\)$' \| \
+ X"$ac_dest" : 'X\(/\)' \| \
+ . : '\(.\)' 2>/dev/null ||
+echo X"$ac_dest" |
+ sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; }
+ /^X\(\/\/\)[^/].*/{ s//\1/; q; }
+ /^X\(\/\/\)$/{ s//\1/; q; }
+ /^X\(\/\).*/{ s//\1/; q; }
+ s/.*/./; q'`
+ { if $as_mkdir_p; then
+ mkdir -p "$ac_dir"
+ else
+ as_dir="$ac_dir"
+ as_dirs=
+ while test ! -d "$as_dir"; do
+ as_dirs="$as_dir $as_dirs"
+ as_dir=`(dirname "$as_dir") 2>/dev/null ||
+$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+ X"$as_dir" : 'X\(//\)[^/]' \| \
+ X"$as_dir" : 'X\(//\)$' \| \
+ X"$as_dir" : 'X\(/\)' \| \
+ . : '\(.\)' 2>/dev/null ||
+echo X"$as_dir" |
+ sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; }
+ /^X\(\/\/\)[^/].*/{ s//\1/; q; }
+ /^X\(\/\/\)$/{ s//\1/; q; }
+ /^X\(\/\).*/{ s//\1/; q; }
+ s/.*/./; q'`
+ done
+ test ! -n "$as_dirs" || mkdir $as_dirs
+ fi || { { echo "$as_me:$LINENO: error: cannot create directory \"$ac_dir\"" >&5
+echo "$as_me: error: cannot create directory \"$ac_dir\"" >&2;}
+ { (exit 1); exit 1; }; }; }
+
+ ac_builddir=.
+
+if test "$ac_dir" != .; then
+ ac_dir_suffix=/`echo "$ac_dir" | sed 's,^\.[\\/],,'`
+ # A "../" for each directory in $ac_dir_suffix.
+ ac_top_builddir=`echo "$ac_dir_suffix" | sed 's,/[^\\/]*,../,g'`
+else
+ ac_dir_suffix= ac_top_builddir=
+fi
+
+case $srcdir in
+ .) # No --srcdir option. We are building in place.
+ ac_srcdir=.
+ if test -z "$ac_top_builddir"; then
+ ac_top_srcdir=.
+ else
+ ac_top_srcdir=`echo $ac_top_builddir | sed 's,/$,,'`
+ fi ;;
+ [\\/]* | ?:[\\/]* ) # Absolute path.
+ ac_srcdir=$srcdir$ac_dir_suffix;
+ ac_top_srcdir=$srcdir ;;
+ *) # Relative path.
+ ac_srcdir=$ac_top_builddir$srcdir$ac_dir_suffix
+ ac_top_srcdir=$ac_top_builddir$srcdir ;;
+esac
+
+# Do not use `cd foo && pwd` to compute absolute paths, because
+# the directories may not exist.
+case `pwd` in
+.) ac_abs_builddir="$ac_dir";;
+*)
+ case "$ac_dir" in
+ .) ac_abs_builddir=`pwd`;;
+ [\\/]* | ?:[\\/]* ) ac_abs_builddir="$ac_dir";;
+ *) ac_abs_builddir=`pwd`/"$ac_dir";;
+ esac;;
+esac
+case $ac_abs_builddir in
+.) ac_abs_top_builddir=${ac_top_builddir}.;;
+*)
+ case ${ac_top_builddir}. in
+ .) ac_abs_top_builddir=$ac_abs_builddir;;
+ [\\/]* | ?:[\\/]* ) ac_abs_top_builddir=${ac_top_builddir}.;;
+ *) ac_abs_top_builddir=$ac_abs_builddir/${ac_top_builddir}.;;
+ esac;;
+esac
+case $ac_abs_builddir in
+.) ac_abs_srcdir=$ac_srcdir;;
+*)
+ case $ac_srcdir in
+ .) ac_abs_srcdir=$ac_abs_builddir;;
+ [\\/]* | ?:[\\/]* ) ac_abs_srcdir=$ac_srcdir;;
+ *) ac_abs_srcdir=$ac_abs_builddir/$ac_srcdir;;
+ esac;;
+esac
+case $ac_abs_builddir in
+.) ac_abs_top_srcdir=$ac_top_srcdir;;
+*)
+ case $ac_top_srcdir in
+ .) ac_abs_top_srcdir=$ac_abs_builddir;;
+ [\\/]* | ?:[\\/]* ) ac_abs_top_srcdir=$ac_top_srcdir;;
+ *) ac_abs_top_srcdir=$ac_abs_builddir/$ac_top_srcdir;;
+ esac;;
+esac
+
+
+ { echo "$as_me:$LINENO: executing $ac_dest commands" >&5
+echo "$as_me: executing $ac_dest commands" >&6;}
+ case $ac_dest in
+ depfiles ) test x"$AMDEP_TRUE" != x"" || for mf in $CONFIG_FILES; do
+ # Strip MF so we end up with the name of the file.
+ mf=`echo "$mf" | sed -e 's/:.*$//'`
+ # Check whether this is an Automake generated Makefile or not.
+ # We used to match only the files named `Makefile.in', but
+ # some people rename them; so instead we look at the file content.
+ # Grep'ing the first line is not enough: some people post-process
+ # each Makefile.in and add a new line on top of each file to say so.
+ # So let's grep whole file.
+ if grep '^#.*generated by automake' $mf > /dev/null 2>&1; then
+ dirpart=`(dirname "$mf") 2>/dev/null ||
+$as_expr X"$mf" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+ X"$mf" : 'X\(//\)[^/]' \| \
+ X"$mf" : 'X\(//\)$' \| \
+ X"$mf" : 'X\(/\)' \| \
+ . : '\(.\)' 2>/dev/null ||
+echo X"$mf" |
+ sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; }
+ /^X\(\/\/\)[^/].*/{ s//\1/; q; }
+ /^X\(\/\/\)$/{ s//\1/; q; }
+ /^X\(\/\).*/{ s//\1/; q; }
+ s/.*/./; q'`
+ else
+ continue
+ fi
+ # Extract the definition of DEPDIR, am__include, and am__quote
+ # from the Makefile without running `make'.
+ DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"`
+ test -z "$DEPDIR" && continue
+ am__include=`sed -n 's/^am__include = //p' < "$mf"`
+ test -z "am__include" && continue
+ am__quote=`sed -n 's/^am__quote = //p' < "$mf"`
+ # When using ansi2knr, U may be empty or an underscore; expand it
+ U=`sed -n 's/^U = //p' < "$mf"`
+ # Find all dependency output files, they are included files with
+ # $(DEPDIR) in their names. We invoke sed twice because it is the
+ # simplest approach to changing $(DEPDIR) to its actual value in the
+ # expansion.
+ for file in `sed -n "
+ s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \
+ sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g' -e 's/\$U/'"$U"'/g'`; do
+ # Make sure the directory exists.
+ test -f "$dirpart/$file" && continue
+ fdir=`(dirname "$file") 2>/dev/null ||
+$as_expr X"$file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+ X"$file" : 'X\(//\)[^/]' \| \
+ X"$file" : 'X\(//\)$' \| \
+ X"$file" : 'X\(/\)' \| \
+ . : '\(.\)' 2>/dev/null ||
+echo X"$file" |
+ sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; }
+ /^X\(\/\/\)[^/].*/{ s//\1/; q; }
+ /^X\(\/\/\)$/{ s//\1/; q; }
+ /^X\(\/\).*/{ s//\1/; q; }
+ s/.*/./; q'`
+ { if $as_mkdir_p; then
+ mkdir -p $dirpart/$fdir
+ else
+ as_dir=$dirpart/$fdir
+ as_dirs=
+ while test ! -d "$as_dir"; do
+ as_dirs="$as_dir $as_dirs"
+ as_dir=`(dirname "$as_dir") 2>/dev/null ||
+$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+ X"$as_dir" : 'X\(//\)[^/]' \| \
+ X"$as_dir" : 'X\(//\)$' \| \
+ X"$as_dir" : 'X\(/\)' \| \
+ . : '\(.\)' 2>/dev/null ||
+echo X"$as_dir" |
+ sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; }
+ /^X\(\/\/\)[^/].*/{ s//\1/; q; }
+ /^X\(\/\/\)$/{ s//\1/; q; }
+ /^X\(\/\).*/{ s//\1/; q; }
+ s/.*/./; q'`
+ done
+ test ! -n "$as_dirs" || mkdir $as_dirs
+ fi || { { echo "$as_me:$LINENO: error: cannot create directory $dirpart/$fdir" >&5
+echo "$as_me: error: cannot create directory $dirpart/$fdir" >&2;}
+ { (exit 1); exit 1; }; }; }
+
+ # echo "creating $dirpart/$file"
+ echo '# dummy' > "$dirpart/$file"
+ done
+done
+ ;;
+ esac
+done
+
+{ (exit 0); exit 0; }
--- /dev/null
+#! /bin/sh
+# Guess values for system-dependent variables and create Makefiles.
+# Generated by GNU Autoconf 2.59.
+#
+# Copyright (C) 2003 Free Software Foundation, Inc.
+# This configure script is free software; the Free Software Foundation
+# gives unlimited permission to copy, distribute and modify it.
+## --------------------- ##
+## M4sh Initialization. ##
+## --------------------- ##
+
+# Be Bourne compatible
+if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then
+ emulate sh
+ NULLCMD=:
+ # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which
+ # is contrary to our usage. Disable this feature.
+ alias -g '${1+"$@"}'='"$@"'
+elif test -n "${BASH_VERSION+set}" && (set -o posix) >/dev/null 2>&1; then
+ set -o posix
+fi
+DUALCASE=1; export DUALCASE # for MKS sh
+
+# Support unset when possible.
+if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then
+ as_unset=unset
+else
+ as_unset=false
+fi
+
+
+# Work around bugs in pre-3.0 UWIN ksh.
+$as_unset ENV MAIL MAILPATH
+PS1='$ '
+PS2='> '
+PS4='+ '
+
+# NLS nuisances.
+for as_var in \
+ LANG LANGUAGE LC_ADDRESS LC_ALL LC_COLLATE LC_CTYPE LC_IDENTIFICATION \
+ LC_MEASUREMENT LC_MESSAGES LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER \
+ LC_TELEPHONE LC_TIME
+do
+ if (set +x; test -z "`(eval $as_var=C; export $as_var) 2>&1`"); then
+ eval $as_var=C; export $as_var
+ else
+ $as_unset $as_var
+ fi
+done
+
+# Required to use basename.
+if expr a : '\(a\)' >/dev/null 2>&1; then
+ as_expr=expr
+else
+ as_expr=false
+fi
+
+if (basename /) >/dev/null 2>&1 && test "X`basename / 2>&1`" = "X/"; then
+ as_basename=basename
+else
+ as_basename=false
+fi
+
+
+# Name of the executable.
+as_me=`$as_basename "$0" ||
+$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \
+ X"$0" : 'X\(//\)$' \| \
+ X"$0" : 'X\(/\)$' \| \
+ . : '\(.\)' 2>/dev/null ||
+echo X/"$0" |
+ sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/; q; }
+ /^X\/\(\/\/\)$/{ s//\1/; q; }
+ /^X\/\(\/\).*/{ s//\1/; q; }
+ s/.*/./; q'`
+
+
+# PATH needs CR, and LINENO needs CR and PATH.
+# Avoid depending upon Character Ranges.
+as_cr_letters='abcdefghijklmnopqrstuvwxyz'
+as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ'
+as_cr_Letters=$as_cr_letters$as_cr_LETTERS
+as_cr_digits='0123456789'
+as_cr_alnum=$as_cr_Letters$as_cr_digits
+
+# The user is always right.
+if test "${PATH_SEPARATOR+set}" != set; then
+ echo "#! /bin/sh" >conf$$.sh
+ echo "exit 0" >>conf$$.sh
+ chmod +x conf$$.sh
+ if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then
+ PATH_SEPARATOR=';'
+ else
+ PATH_SEPARATOR=:
+ fi
+ rm -f conf$$.sh
+fi
+
+
+ as_lineno_1=$LINENO
+ as_lineno_2=$LINENO
+ as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null`
+ test "x$as_lineno_1" != "x$as_lineno_2" &&
+ test "x$as_lineno_3" = "x$as_lineno_2" || {
+ # Find who we are. Look in the path if we contain no path at all
+ # relative or not.
+ case $0 in
+ *[\\/]* ) as_myself=$0 ;;
+ *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break
+done
+
+ ;;
+ esac
+ # We did not find ourselves, most probably we were run as `sh COMMAND'
+ # in which case we are not to be found in the path.
+ if test "x$as_myself" = x; then
+ as_myself=$0
+ fi
+ if test ! -f "$as_myself"; then
+ { echo "$as_me: error: cannot find myself; rerun with an absolute path" >&2
+ { (exit 1); exit 1; }; }
+ fi
+ case $CONFIG_SHELL in
+ '')
+ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for as_base in sh bash ksh sh5; do
+ case $as_dir in
+ /*)
+ if ("$as_dir/$as_base" -c '
+ as_lineno_1=$LINENO
+ as_lineno_2=$LINENO
+ as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null`
+ test "x$as_lineno_1" != "x$as_lineno_2" &&
+ test "x$as_lineno_3" = "x$as_lineno_2" ') 2>/dev/null; then
+ $as_unset BASH_ENV || test "${BASH_ENV+set}" != set || { BASH_ENV=; export BASH_ENV; }
+ $as_unset ENV || test "${ENV+set}" != set || { ENV=; export ENV; }
+ CONFIG_SHELL=$as_dir/$as_base
+ export CONFIG_SHELL
+ exec "$CONFIG_SHELL" "$0" ${1+"$@"}
+ fi;;
+ esac
+ done
+done
+;;
+ esac
+
+ # Create $as_me.lineno as a copy of $as_myself, but with $LINENO
+ # uniformly replaced by the line number. The first 'sed' inserts a
+ # line-number line before each line; the second 'sed' does the real
+ # work. The second script uses 'N' to pair each line-number line
+ # with the numbered line, and appends trailing '-' during
+ # substitution so that $LINENO is not a special case at line end.
+ # (Raja R Harinath suggested sed '=', and Paul Eggert wrote the
+ # second 'sed' script. Blame Lee E. McMahon for sed's syntax. :-)
+ sed '=' <$as_myself |
+ sed '
+ N
+ s,$,-,
+ : loop
+ s,^\(['$as_cr_digits']*\)\(.*\)[$]LINENO\([^'$as_cr_alnum'_]\),\1\2\1\3,
+ t loop
+ s,-$,,
+ s,^['$as_cr_digits']*\n,,
+ ' >$as_me.lineno &&
+ chmod +x $as_me.lineno ||
+ { echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2
+ { (exit 1); exit 1; }; }
+
+ # Don't try to exec as it changes $[0], causing all sort of problems
+ # (the dirname of $[0] is not the place where we might find the
+ # original and so on. Autoconf is especially sensible to this).
+ . ./$as_me.lineno
+ # Exit status is that of the last command.
+ exit
+}
+
+
+case `echo "testing\c"; echo 1,2,3`,`echo -n testing; echo 1,2,3` in
+ *c*,-n*) ECHO_N= ECHO_C='
+' ECHO_T=' ' ;;
+ *c*,* ) ECHO_N=-n ECHO_C= ECHO_T= ;;
+ *) ECHO_N= ECHO_C='\c' ECHO_T= ;;
+esac
+
+if expr a : '\(a\)' >/dev/null 2>&1; then
+ as_expr=expr
+else
+ as_expr=false
+fi
+
+rm -f conf$$ conf$$.exe conf$$.file
+echo >conf$$.file
+if ln -s conf$$.file conf$$ 2>/dev/null; then
+ # We could just check for DJGPP; but this test a) works b) is more generic
+ # and c) will remain valid once DJGPP supports symlinks (DJGPP 2.04).
+ if test -f conf$$.exe; then
+ # Don't use ln at all; we don't have any links
+ as_ln_s='cp -p'
+ else
+ as_ln_s='ln -s'
+ fi
+elif ln conf$$.file conf$$ 2>/dev/null; then
+ as_ln_s=ln
+else
+ as_ln_s='cp -p'
+fi
+rm -f conf$$ conf$$.exe conf$$.file
+
+if mkdir -p . 2>/dev/null; then
+ as_mkdir_p=:
+else
+ test -d ./-p && rmdir ./-p
+ as_mkdir_p=false
+fi
+
+as_executable_p="test -f"
+
+# Sed expression to map a string onto a valid CPP name.
+as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'"
+
+# Sed expression to map a string onto a valid variable name.
+as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'"
+
+
+# IFS
+# We need space, tab and new line, in precisely that order.
+as_nl='
+'
+IFS=" $as_nl"
+
+# CDPATH.
+$as_unset CDPATH
+
+
+# Name of the host.
+# hostname on some systems (SVR3.2, Linux) returns a bogus exit status,
+# so uname gets run too.
+ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q`
+
+exec 6>&1
+
+#
+# Initializations.
+#
+ac_default_prefix=/usr/local
+ac_config_libobj_dir=.
+cross_compiling=no
+subdirs=
+MFLAGS=
+MAKEFLAGS=
+SHELL=${CONFIG_SHELL-/bin/sh}
+
+# Maximum number of lines to put in a shell here document.
+# This variable seems obsolete. It should probably be removed, and
+# only ac_max_sed_lines should be used.
+: ${ac_max_here_lines=38}
+
+# Identity of this package.
+PACKAGE_NAME=
+PACKAGE_TARNAME=
+PACKAGE_VERSION=
+PACKAGE_STRING=
+PACKAGE_BUGREPORT=
+
+ac_unique_file="perl/main.pl"
+ac_subst_vars='SHELL PATH_SEPARATOR PACKAGE_NAME PACKAGE_TARNAME PACKAGE_VERSION PACKAGE_STRING PACKAGE_BUGREPORT exec_prefix prefix program_transform_name bindir sbindir libexecdir datadir sysconfdir sharedstatedir localstatedir libdir includedir oldincludedir infodir mandir build_alias host_alias target_alias DEFS ECHO_C ECHO_N ECHO_T LIBS INSTALL_PROGRAM INSTALL_SCRIPT INSTALL_DATA CYGPATH_W PACKAGE VERSION ACLOCAL AUTOCONF AUTOMAKE AUTOHEADER MAKEINFO install_sh STRIP ac_ct_STRIP INSTALL_STRIP_PROGRAM mkdir_p AWK SET_MAKE am__leading_dot AMTAR am__tar am__untar INITRD_TEMPLATE PERL CC CFLAGS LDFLAGS CPPFLAGS ac_ct_CC EXEEXT OBJEXT DEPDIR am__include am__quote AMDEP_TRUE AMDEP_FALSE AMDEPBACKSLASH CCDEPMODE am__fastdepCC_TRUE am__fastdepCC_FALSE XMLTO LIBOBJS LTLIBOBJS'
+ac_subst_files=''
+
+# Initialize some variables set by options.
+ac_init_help=
+ac_init_version=false
+# The variables have the same names as the options, with
+# dashes changed to underlines.
+cache_file=/dev/null
+exec_prefix=NONE
+no_create=
+no_recursion=
+prefix=NONE
+program_prefix=NONE
+program_suffix=NONE
+program_transform_name=s,x,x,
+silent=
+site=
+srcdir=
+verbose=
+x_includes=NONE
+x_libraries=NONE
+
+# Installation directory options.
+# These are left unexpanded so users can "make install exec_prefix=/foo"
+# and all the variables that are supposed to be based on exec_prefix
+# by default will actually change.
+# Use braces instead of parens because sh, perl, etc. also accept them.
+bindir='${exec_prefix}/bin'
+sbindir='${exec_prefix}/sbin'
+libexecdir='${exec_prefix}/libexec'
+datadir='${prefix}/share'
+sysconfdir='${prefix}/etc'
+sharedstatedir='${prefix}/com'
+localstatedir='${prefix}/var'
+libdir='${exec_prefix}/lib'
+includedir='${prefix}/include'
+oldincludedir='/usr/include'
+infodir='${prefix}/info'
+mandir='${prefix}/man'
+
+ac_prev=
+for ac_option
+do
+ # If the previous option needs an argument, assign it.
+ if test -n "$ac_prev"; then
+ eval "$ac_prev=\$ac_option"
+ ac_prev=
+ continue
+ fi
+
+ ac_optarg=`expr "x$ac_option" : 'x[^=]*=\(.*\)'`
+
+ # Accept the important Cygnus configure options, so we can diagnose typos.
+
+ case $ac_option in
+
+ -bindir | --bindir | --bindi | --bind | --bin | --bi)
+ ac_prev=bindir ;;
+ -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*)
+ bindir=$ac_optarg ;;
+
+ -build | --build | --buil | --bui | --bu)
+ ac_prev=build_alias ;;
+ -build=* | --build=* | --buil=* | --bui=* | --bu=*)
+ build_alias=$ac_optarg ;;
+
+ -cache-file | --cache-file | --cache-fil | --cache-fi \
+ | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c)
+ ac_prev=cache_file ;;
+ -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \
+ | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*)
+ cache_file=$ac_optarg ;;
+
+ --config-cache | -C)
+ cache_file=config.cache ;;
+
+ -datadir | --datadir | --datadi | --datad | --data | --dat | --da)
+ ac_prev=datadir ;;
+ -datadir=* | --datadir=* | --datadi=* | --datad=* | --data=* | --dat=* \
+ | --da=*)
+ datadir=$ac_optarg ;;
+
+ -disable-* | --disable-*)
+ ac_feature=`expr "x$ac_option" : 'x-*disable-\(.*\)'`
+ # Reject names that are not valid shell variable names.
+ expr "x$ac_feature" : ".*[^-_$as_cr_alnum]" >/dev/null &&
+ { echo "$as_me: error: invalid feature name: $ac_feature" >&2
+ { (exit 1); exit 1; }; }
+ ac_feature=`echo $ac_feature | sed 's/-/_/g'`
+ eval "enable_$ac_feature=no" ;;
+
+ -enable-* | --enable-*)
+ ac_feature=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'`
+ # Reject names that are not valid shell variable names.
+ expr "x$ac_feature" : ".*[^-_$as_cr_alnum]" >/dev/null &&
+ { echo "$as_me: error: invalid feature name: $ac_feature" >&2
+ { (exit 1); exit 1; }; }
+ ac_feature=`echo $ac_feature | sed 's/-/_/g'`
+ case $ac_option in
+ *=*) ac_optarg=`echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"`;;
+ *) ac_optarg=yes ;;
+ esac
+ eval "enable_$ac_feature='$ac_optarg'" ;;
+
+ -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \
+ | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \
+ | --exec | --exe | --ex)
+ ac_prev=exec_prefix ;;
+ -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \
+ | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \
+ | --exec=* | --exe=* | --ex=*)
+ exec_prefix=$ac_optarg ;;
+
+ -gas | --gas | --ga | --g)
+ # Obsolete; use --with-gas.
+ with_gas=yes ;;
+
+ -help | --help | --hel | --he | -h)
+ ac_init_help=long ;;
+ -help=r* | --help=r* | --hel=r* | --he=r* | -hr*)
+ ac_init_help=recursive ;;
+ -help=s* | --help=s* | --hel=s* | --he=s* | -hs*)
+ ac_init_help=short ;;
+
+ -host | --host | --hos | --ho)
+ ac_prev=host_alias ;;
+ -host=* | --host=* | --hos=* | --ho=*)
+ host_alias=$ac_optarg ;;
+
+ -includedir | --includedir | --includedi | --included | --include \
+ | --includ | --inclu | --incl | --inc)
+ ac_prev=includedir ;;
+ -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \
+ | --includ=* | --inclu=* | --incl=* | --inc=*)
+ includedir=$ac_optarg ;;
+
+ -infodir | --infodir | --infodi | --infod | --info | --inf)
+ ac_prev=infodir ;;
+ -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*)
+ infodir=$ac_optarg ;;
+
+ -libdir | --libdir | --libdi | --libd)
+ ac_prev=libdir ;;
+ -libdir=* | --libdir=* | --libdi=* | --libd=*)
+ libdir=$ac_optarg ;;
+
+ -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \
+ | --libexe | --libex | --libe)
+ ac_prev=libexecdir ;;
+ -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \
+ | --libexe=* | --libex=* | --libe=*)
+ libexecdir=$ac_optarg ;;
+
+ -localstatedir | --localstatedir | --localstatedi | --localstated \
+ | --localstate | --localstat | --localsta | --localst \
+ | --locals | --local | --loca | --loc | --lo)
+ ac_prev=localstatedir ;;
+ -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \
+ | --localstate=* | --localstat=* | --localsta=* | --localst=* \
+ | --locals=* | --local=* | --loca=* | --loc=* | --lo=*)
+ localstatedir=$ac_optarg ;;
+
+ -mandir | --mandir | --mandi | --mand | --man | --ma | --m)
+ ac_prev=mandir ;;
+ -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*)
+ mandir=$ac_optarg ;;
+
+ -nfp | --nfp | --nf)
+ # Obsolete; use --without-fp.
+ with_fp=no ;;
+
+ -no-create | --no-create | --no-creat | --no-crea | --no-cre \
+ | --no-cr | --no-c | -n)
+ no_create=yes ;;
+
+ -no-recursion | --no-recursion | --no-recursio | --no-recursi \
+ | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r)
+ no_recursion=yes ;;
+
+ -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \
+ | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \
+ | --oldin | --oldi | --old | --ol | --o)
+ ac_prev=oldincludedir ;;
+ -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \
+ | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \
+ | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*)
+ oldincludedir=$ac_optarg ;;
+
+ -prefix | --prefix | --prefi | --pref | --pre | --pr | --p)
+ ac_prev=prefix ;;
+ -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*)
+ prefix=$ac_optarg ;;
+
+ -program-prefix | --program-prefix | --program-prefi | --program-pref \
+ | --program-pre | --program-pr | --program-p)
+ ac_prev=program_prefix ;;
+ -program-prefix=* | --program-prefix=* | --program-prefi=* \
+ | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*)
+ program_prefix=$ac_optarg ;;
+
+ -program-suffix | --program-suffix | --program-suffi | --program-suff \
+ | --program-suf | --program-su | --program-s)
+ ac_prev=program_suffix ;;
+ -program-suffix=* | --program-suffix=* | --program-suffi=* \
+ | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*)
+ program_suffix=$ac_optarg ;;
+
+ -program-transform-name | --program-transform-name \
+ | --program-transform-nam | --program-transform-na \
+ | --program-transform-n | --program-transform- \
+ | --program-transform | --program-transfor \
+ | --program-transfo | --program-transf \
+ | --program-trans | --program-tran \
+ | --progr-tra | --program-tr | --program-t)
+ ac_prev=program_transform_name ;;
+ -program-transform-name=* | --program-transform-name=* \
+ | --program-transform-nam=* | --program-transform-na=* \
+ | --program-transform-n=* | --program-transform-=* \
+ | --program-transform=* | --program-transfor=* \
+ | --program-transfo=* | --program-transf=* \
+ | --program-trans=* | --program-tran=* \
+ | --progr-tra=* | --program-tr=* | --program-t=*)
+ program_transform_name=$ac_optarg ;;
+
+ -q | -quiet | --quiet | --quie | --qui | --qu | --q \
+ | -silent | --silent | --silen | --sile | --sil)
+ silent=yes ;;
+
+ -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb)
+ ac_prev=sbindir ;;
+ -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \
+ | --sbi=* | --sb=*)
+ sbindir=$ac_optarg ;;
+
+ -sharedstatedir | --sharedstatedir | --sharedstatedi \
+ | --sharedstated | --sharedstate | --sharedstat | --sharedsta \
+ | --sharedst | --shareds | --shared | --share | --shar \
+ | --sha | --sh)
+ ac_prev=sharedstatedir ;;
+ -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \
+ | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \
+ | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \
+ | --sha=* | --sh=*)
+ sharedstatedir=$ac_optarg ;;
+
+ -site | --site | --sit)
+ ac_prev=site ;;
+ -site=* | --site=* | --sit=*)
+ site=$ac_optarg ;;
+
+ -srcdir | --srcdir | --srcdi | --srcd | --src | --sr)
+ ac_prev=srcdir ;;
+ -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*)
+ srcdir=$ac_optarg ;;
+
+ -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \
+ | --syscon | --sysco | --sysc | --sys | --sy)
+ ac_prev=sysconfdir ;;
+ -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \
+ | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*)
+ sysconfdir=$ac_optarg ;;
+
+ -target | --target | --targe | --targ | --tar | --ta | --t)
+ ac_prev=target_alias ;;
+ -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*)
+ target_alias=$ac_optarg ;;
+
+ -v | -verbose | --verbose | --verbos | --verbo | --verb)
+ verbose=yes ;;
+
+ -version | --version | --versio | --versi | --vers | -V)
+ ac_init_version=: ;;
+
+ -with-* | --with-*)
+ ac_package=`expr "x$ac_option" : 'x-*with-\([^=]*\)'`
+ # Reject names that are not valid shell variable names.
+ expr "x$ac_package" : ".*[^-_$as_cr_alnum]" >/dev/null &&
+ { echo "$as_me: error: invalid package name: $ac_package" >&2
+ { (exit 1); exit 1; }; }
+ ac_package=`echo $ac_package| sed 's/-/_/g'`
+ case $ac_option in
+ *=*) ac_optarg=`echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"`;;
+ *) ac_optarg=yes ;;
+ esac
+ eval "with_$ac_package='$ac_optarg'" ;;
+
+ -without-* | --without-*)
+ ac_package=`expr "x$ac_option" : 'x-*without-\(.*\)'`
+ # Reject names that are not valid shell variable names.
+ expr "x$ac_package" : ".*[^-_$as_cr_alnum]" >/dev/null &&
+ { echo "$as_me: error: invalid package name: $ac_package" >&2
+ { (exit 1); exit 1; }; }
+ ac_package=`echo $ac_package | sed 's/-/_/g'`
+ eval "with_$ac_package=no" ;;
+
+ --x)
+ # Obsolete; use --with-x.
+ with_x=yes ;;
+
+ -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \
+ | --x-incl | --x-inc | --x-in | --x-i)
+ ac_prev=x_includes ;;
+ -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \
+ | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*)
+ x_includes=$ac_optarg ;;
+
+ -x-libraries | --x-libraries | --x-librarie | --x-librari \
+ | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l)
+ ac_prev=x_libraries ;;
+ -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \
+ | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*)
+ x_libraries=$ac_optarg ;;
+
+ -*) { echo "$as_me: error: unrecognized option: $ac_option
+Try \`$0 --help' for more information." >&2
+ { (exit 1); exit 1; }; }
+ ;;
+
+ *=*)
+ ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='`
+ # Reject names that are not valid shell variable names.
+ expr "x$ac_envvar" : ".*[^_$as_cr_alnum]" >/dev/null &&
+ { echo "$as_me: error: invalid variable name: $ac_envvar" >&2
+ { (exit 1); exit 1; }; }
+ ac_optarg=`echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"`
+ eval "$ac_envvar='$ac_optarg'"
+ export $ac_envvar ;;
+
+ *)
+ # FIXME: should be removed in autoconf 3.0.
+ echo "$as_me: WARNING: you should use --build, --host, --target" >&2
+ expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null &&
+ echo "$as_me: WARNING: invalid host type: $ac_option" >&2
+ : ${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option}
+ ;;
+
+ esac
+done
+
+if test -n "$ac_prev"; then
+ ac_option=--`echo $ac_prev | sed 's/_/-/g'`
+ { echo "$as_me: error: missing argument to $ac_option" >&2
+ { (exit 1); exit 1; }; }
+fi
+
+# Be sure to have absolute paths.
+for ac_var in exec_prefix prefix
+do
+ eval ac_val=$`echo $ac_var`
+ case $ac_val in
+ [\\/$]* | ?:[\\/]* | NONE | '' ) ;;
+ *) { echo "$as_me: error: expected an absolute directory name for --$ac_var: $ac_val" >&2
+ { (exit 1); exit 1; }; };;
+ esac
+done
+
+# Be sure to have absolute paths.
+for ac_var in bindir sbindir libexecdir datadir sysconfdir sharedstatedir \
+ localstatedir libdir includedir oldincludedir infodir mandir
+do
+ eval ac_val=$`echo $ac_var`
+ case $ac_val in
+ [\\/$]* | ?:[\\/]* ) ;;
+ *) { echo "$as_me: error: expected an absolute directory name for --$ac_var: $ac_val" >&2
+ { (exit 1); exit 1; }; };;
+ esac
+done
+
+# There might be people who depend on the old broken behavior: `$host'
+# used to hold the argument of --host etc.
+# FIXME: To remove some day.
+build=$build_alias
+host=$host_alias
+target=$target_alias
+
+# FIXME: To remove some day.
+if test "x$host_alias" != x; then
+ if test "x$build_alias" = x; then
+ cross_compiling=maybe
+ echo "$as_me: WARNING: If you wanted to set the --build type, don't use --host.
+ If a cross compiler is detected then cross compile mode will be used." >&2
+ elif test "x$build_alias" != "x$host_alias"; then
+ cross_compiling=yes
+ fi
+fi
+
+ac_tool_prefix=
+test -n "$host_alias" && ac_tool_prefix=$host_alias-
+
+test "$silent" = yes && exec 6>/dev/null
+
+
+# Find the source files, if location was not specified.
+if test -z "$srcdir"; then
+ ac_srcdir_defaulted=yes
+ # Try the directory containing this script, then its parent.
+ ac_confdir=`(dirname "$0") 2>/dev/null ||
+$as_expr X"$0" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+ X"$0" : 'X\(//\)[^/]' \| \
+ X"$0" : 'X\(//\)$' \| \
+ X"$0" : 'X\(/\)' \| \
+ . : '\(.\)' 2>/dev/null ||
+echo X"$0" |
+ sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; }
+ /^X\(\/\/\)[^/].*/{ s//\1/; q; }
+ /^X\(\/\/\)$/{ s//\1/; q; }
+ /^X\(\/\).*/{ s//\1/; q; }
+ s/.*/./; q'`
+ srcdir=$ac_confdir
+ if test ! -r $srcdir/$ac_unique_file; then
+ srcdir=..
+ fi
+else
+ ac_srcdir_defaulted=no
+fi
+if test ! -r $srcdir/$ac_unique_file; then
+ if test "$ac_srcdir_defaulted" = yes; then
+ { echo "$as_me: error: cannot find sources ($ac_unique_file) in $ac_confdir or .." >&2
+ { (exit 1); exit 1; }; }
+ else
+ { echo "$as_me: error: cannot find sources ($ac_unique_file) in $srcdir" >&2
+ { (exit 1); exit 1; }; }
+ fi
+fi
+(cd $srcdir && test -r ./$ac_unique_file) 2>/dev/null ||
+ { echo "$as_me: error: sources are in $srcdir, but \`cd $srcdir' does not work" >&2
+ { (exit 1); exit 1; }; }
+srcdir=`echo "$srcdir" | sed 's%\([^\\/]\)[\\/]*$%\1%'`
+ac_env_build_alias_set=${build_alias+set}
+ac_env_build_alias_value=$build_alias
+ac_cv_env_build_alias_set=${build_alias+set}
+ac_cv_env_build_alias_value=$build_alias
+ac_env_host_alias_set=${host_alias+set}
+ac_env_host_alias_value=$host_alias
+ac_cv_env_host_alias_set=${host_alias+set}
+ac_cv_env_host_alias_value=$host_alias
+ac_env_target_alias_set=${target_alias+set}
+ac_env_target_alias_value=$target_alias
+ac_cv_env_target_alias_set=${target_alias+set}
+ac_cv_env_target_alias_value=$target_alias
+ac_env_CC_set=${CC+set}
+ac_env_CC_value=$CC
+ac_cv_env_CC_set=${CC+set}
+ac_cv_env_CC_value=$CC
+ac_env_CFLAGS_set=${CFLAGS+set}
+ac_env_CFLAGS_value=$CFLAGS
+ac_cv_env_CFLAGS_set=${CFLAGS+set}
+ac_cv_env_CFLAGS_value=$CFLAGS
+ac_env_LDFLAGS_set=${LDFLAGS+set}
+ac_env_LDFLAGS_value=$LDFLAGS
+ac_cv_env_LDFLAGS_set=${LDFLAGS+set}
+ac_cv_env_LDFLAGS_value=$LDFLAGS
+ac_env_CPPFLAGS_set=${CPPFLAGS+set}
+ac_env_CPPFLAGS_value=$CPPFLAGS
+ac_cv_env_CPPFLAGS_set=${CPPFLAGS+set}
+ac_cv_env_CPPFLAGS_value=$CPPFLAGS
+
+#
+# Report the --help message.
+#
+if test "$ac_init_help" = "long"; then
+ # Omit some internal or obsolete options to make the list less imposing.
+ # This message is too long to be a string in the A/UX 3.1 sh.
+ cat <<_ACEOF
+\`configure' configures this package to adapt to many kinds of systems.
+
+Usage: $0 [OPTION]... [VAR=VALUE]...
+
+To assign environment variables (e.g., CC, CFLAGS...), specify them as
+VAR=VALUE. See below for descriptions of some of the useful variables.
+
+Defaults for the options are specified in brackets.
+
+Configuration:
+ -h, --help display this help and exit
+ --help=short display options specific to this package
+ --help=recursive display the short help of all the included packages
+ -V, --version display version information and exit
+ -q, --quiet, --silent do not print \`checking...' messages
+ --cache-file=FILE cache test results in FILE [disabled]
+ -C, --config-cache alias for \`--cache-file=config.cache'
+ -n, --no-create do not create output files
+ --srcdir=DIR find the sources in DIR [configure dir or \`..']
+
+_ACEOF
+
+ cat <<_ACEOF
+Installation directories:
+ --prefix=PREFIX install architecture-independent files in PREFIX
+ [$ac_default_prefix]
+ --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX
+ [PREFIX]
+
+By default, \`make install' will install all the files in
+\`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc. You can specify
+an installation prefix other than \`$ac_default_prefix' using \`--prefix',
+for instance \`--prefix=\$HOME'.
+
+For better control, use the options below.
+
+Fine tuning of the installation directories:
+ --bindir=DIR user executables [EPREFIX/bin]
+ --sbindir=DIR system admin executables [EPREFIX/sbin]
+ --libexecdir=DIR program executables [EPREFIX/libexec]
+ --datadir=DIR read-only architecture-independent data [PREFIX/share]
+ --sysconfdir=DIR read-only single-machine data [PREFIX/etc]
+ --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com]
+ --localstatedir=DIR modifiable single-machine data [PREFIX/var]
+ --libdir=DIR object code libraries [EPREFIX/lib]
+ --includedir=DIR C header files [PREFIX/include]
+ --oldincludedir=DIR C header files for non-gcc [/usr/include]
+ --infodir=DIR info documentation [PREFIX/info]
+ --mandir=DIR man documentation [PREFIX/man]
+_ACEOF
+
+ cat <<\_ACEOF
+
+Program names:
+ --program-prefix=PREFIX prepend PREFIX to installed program names
+ --program-suffix=SUFFIX append SUFFIX to installed program names
+ --program-transform-name=PROGRAM run sed PROGRAM on installed program names
+_ACEOF
+fi
+
+if test -n "$ac_init_help"; then
+
+ cat <<\_ACEOF
+
+Optional Features:
+ --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no)
+ --enable-FEATURE[=ARG] include FEATURE [ARG=yes]
+ --enable-template=name install templates/name.pm as initrd template (no
+ default)
+ --enable-nuke Nuke initramfs before moving to real root
+ --disable-dependency-tracking speeds up one-time build
+ --enable-dependency-tracking do not reject slow dependency extractors
+
+Some influential environment variables:
+ CC C compiler command
+ CFLAGS C compiler flags
+ LDFLAGS linker flags, e.g. -L<lib dir> if you have libraries in a
+ nonstandard directory <lib dir>
+ CPPFLAGS C/C++ preprocessor flags, e.g. -I<include dir> if you have
+ headers in a nonstandard directory <include dir>
+
+Use these variables to override the choices made by `configure' or to help
+it to find libraries and programs with nonstandard names/locations.
+
+_ACEOF
+fi
+
+if test "$ac_init_help" = "recursive"; then
+ # If there are subdirs, report their specific --help.
+ ac_popdir=`pwd`
+ for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue
+ test -d $ac_dir || continue
+ ac_builddir=.
+
+if test "$ac_dir" != .; then
+ ac_dir_suffix=/`echo "$ac_dir" | sed 's,^\.[\\/],,'`
+ # A "../" for each directory in $ac_dir_suffix.
+ ac_top_builddir=`echo "$ac_dir_suffix" | sed 's,/[^\\/]*,../,g'`
+else
+ ac_dir_suffix= ac_top_builddir=
+fi
+
+case $srcdir in
+ .) # No --srcdir option. We are building in place.
+ ac_srcdir=.
+ if test -z "$ac_top_builddir"; then
+ ac_top_srcdir=.
+ else
+ ac_top_srcdir=`echo $ac_top_builddir | sed 's,/$,,'`
+ fi ;;
+ [\\/]* | ?:[\\/]* ) # Absolute path.
+ ac_srcdir=$srcdir$ac_dir_suffix;
+ ac_top_srcdir=$srcdir ;;
+ *) # Relative path.
+ ac_srcdir=$ac_top_builddir$srcdir$ac_dir_suffix
+ ac_top_srcdir=$ac_top_builddir$srcdir ;;
+esac
+
+# Do not use `cd foo && pwd` to compute absolute paths, because
+# the directories may not exist.
+case `pwd` in
+.) ac_abs_builddir="$ac_dir";;
+*)
+ case "$ac_dir" in
+ .) ac_abs_builddir=`pwd`;;
+ [\\/]* | ?:[\\/]* ) ac_abs_builddir="$ac_dir";;
+ *) ac_abs_builddir=`pwd`/"$ac_dir";;
+ esac;;
+esac
+case $ac_abs_builddir in
+.) ac_abs_top_builddir=${ac_top_builddir}.;;
+*)
+ case ${ac_top_builddir}. in
+ .) ac_abs_top_builddir=$ac_abs_builddir;;
+ [\\/]* | ?:[\\/]* ) ac_abs_top_builddir=${ac_top_builddir}.;;
+ *) ac_abs_top_builddir=$ac_abs_builddir/${ac_top_builddir}.;;
+ esac;;
+esac
+case $ac_abs_builddir in
+.) ac_abs_srcdir=$ac_srcdir;;
+*)
+ case $ac_srcdir in
+ .) ac_abs_srcdir=$ac_abs_builddir;;
+ [\\/]* | ?:[\\/]* ) ac_abs_srcdir=$ac_srcdir;;
+ *) ac_abs_srcdir=$ac_abs_builddir/$ac_srcdir;;
+ esac;;
+esac
+case $ac_abs_builddir in
+.) ac_abs_top_srcdir=$ac_top_srcdir;;
+*)
+ case $ac_top_srcdir in
+ .) ac_abs_top_srcdir=$ac_abs_builddir;;
+ [\\/]* | ?:[\\/]* ) ac_abs_top_srcdir=$ac_top_srcdir;;
+ *) ac_abs_top_srcdir=$ac_abs_builddir/$ac_top_srcdir;;
+ esac;;
+esac
+
+ cd $ac_dir
+ # Check for guested configure; otherwise get Cygnus style configure.
+ if test -f $ac_srcdir/configure.gnu; then
+ echo
+ $SHELL $ac_srcdir/configure.gnu --help=recursive
+ elif test -f $ac_srcdir/configure; then
+ echo
+ $SHELL $ac_srcdir/configure --help=recursive
+ elif test -f $ac_srcdir/configure.ac ||
+ test -f $ac_srcdir/configure.in; then
+ echo
+ $ac_configure --help
+ else
+ echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2
+ fi
+ cd "$ac_popdir"
+ done
+fi
+
+test -n "$ac_init_help" && exit 0
+if $ac_init_version; then
+ cat <<\_ACEOF
+
+Copyright (C) 2003 Free Software Foundation, Inc.
+This configure script is free software; the Free Software Foundation
+gives unlimited permission to copy, distribute and modify it.
+_ACEOF
+ exit 0
+fi
+exec 5>config.log
+cat >&5 <<_ACEOF
+This file contains any messages produced by compilers while
+running configure, to aid debugging if configure makes a mistake.
+
+It was created by $as_me, which was
+generated by GNU Autoconf 2.59. Invocation command line was
+
+ $ $0 $@
+
+_ACEOF
+{
+cat <<_ASUNAME
+## --------- ##
+## Platform. ##
+## --------- ##
+
+hostname = `(hostname || uname -n) 2>/dev/null | sed 1q`
+uname -m = `(uname -m) 2>/dev/null || echo unknown`
+uname -r = `(uname -r) 2>/dev/null || echo unknown`
+uname -s = `(uname -s) 2>/dev/null || echo unknown`
+uname -v = `(uname -v) 2>/dev/null || echo unknown`
+
+/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown`
+/bin/uname -X = `(/bin/uname -X) 2>/dev/null || echo unknown`
+
+/bin/arch = `(/bin/arch) 2>/dev/null || echo unknown`
+/usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null || echo unknown`
+/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown`
+hostinfo = `(hostinfo) 2>/dev/null || echo unknown`
+/bin/machine = `(/bin/machine) 2>/dev/null || echo unknown`
+/usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null || echo unknown`
+/bin/universe = `(/bin/universe) 2>/dev/null || echo unknown`
+
+_ASUNAME
+
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ echo "PATH: $as_dir"
+done
+
+} >&5
+
+cat >&5 <<_ACEOF
+
+
+## ----------- ##
+## Core tests. ##
+## ----------- ##
+
+_ACEOF
+
+
+# Keep a trace of the command line.
+# Strip out --no-create and --no-recursion so they do not pile up.
+# Strip out --silent because we don't want to record it for future runs.
+# Also quote any args containing shell meta-characters.
+# Make two passes to allow for proper duplicate-argument suppression.
+ac_configure_args=
+ac_configure_args0=
+ac_configure_args1=
+ac_sep=
+ac_must_keep_next=false
+for ac_pass in 1 2
+do
+ for ac_arg
+ do
+ case $ac_arg in
+ -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;;
+ -q | -quiet | --quiet | --quie | --qui | --qu | --q \
+ | -silent | --silent | --silen | --sile | --sil)
+ continue ;;
+ *" "*|*" "*|*[\[\]\~\#\$\^\&\*\(\)\{\}\\\|\;\<\>\?\"\']*)
+ ac_arg=`echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;;
+ esac
+ case $ac_pass in
+ 1) ac_configure_args0="$ac_configure_args0 '$ac_arg'" ;;
+ 2)
+ ac_configure_args1="$ac_configure_args1 '$ac_arg'"
+ if test $ac_must_keep_next = true; then
+ ac_must_keep_next=false # Got value, back to normal.
+ else
+ case $ac_arg in
+ *=* | --config-cache | -C | -disable-* | --disable-* \
+ | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \
+ | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \
+ | -with-* | --with-* | -without-* | --without-* | --x)
+ case "$ac_configure_args0 " in
+ "$ac_configure_args1"*" '$ac_arg' "* ) continue ;;
+ esac
+ ;;
+ -* ) ac_must_keep_next=true ;;
+ esac
+ fi
+ ac_configure_args="$ac_configure_args$ac_sep'$ac_arg'"
+ # Get rid of the leading space.
+ ac_sep=" "
+ ;;
+ esac
+ done
+done
+$as_unset ac_configure_args0 || test "${ac_configure_args0+set}" != set || { ac_configure_args0=; export ac_configure_args0; }
+$as_unset ac_configure_args1 || test "${ac_configure_args1+set}" != set || { ac_configure_args1=; export ac_configure_args1; }
+
+# When interrupted or exit'd, cleanup temporary files, and complete
+# config.log. We remove comments because anyway the quotes in there
+# would cause problems or look ugly.
+# WARNING: Be sure not to use single quotes in there, as some shells,
+# such as our DU 5.0 friend, will then `close' the trap.
+trap 'exit_status=$?
+ # Save into config.log some information that might help in debugging.
+ {
+ echo
+
+ cat <<\_ASBOX
+## ---------------- ##
+## Cache variables. ##
+## ---------------- ##
+_ASBOX
+ echo
+ # The following way of writing the cache mishandles newlines in values,
+{
+ (set) 2>&1 |
+ case `(ac_space='"'"' '"'"'; set | grep ac_space) 2>&1` in
+ *ac_space=\ *)
+ sed -n \
+ "s/'"'"'/'"'"'\\\\'"'"''"'"'/g;
+ s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='"'"'\\2'"'"'/p"
+ ;;
+ *)
+ sed -n \
+ "s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1=\\2/p"
+ ;;
+ esac;
+}
+ echo
+
+ cat <<\_ASBOX
+## ----------------- ##
+## Output variables. ##
+## ----------------- ##
+_ASBOX
+ echo
+ for ac_var in $ac_subst_vars
+ do
+ eval ac_val=$`echo $ac_var`
+ echo "$ac_var='"'"'$ac_val'"'"'"
+ done | sort
+ echo
+
+ if test -n "$ac_subst_files"; then
+ cat <<\_ASBOX
+## ------------- ##
+## Output files. ##
+## ------------- ##
+_ASBOX
+ echo
+ for ac_var in $ac_subst_files
+ do
+ eval ac_val=$`echo $ac_var`
+ echo "$ac_var='"'"'$ac_val'"'"'"
+ done | sort
+ echo
+ fi
+
+ if test -s confdefs.h; then
+ cat <<\_ASBOX
+## ----------- ##
+## confdefs.h. ##
+## ----------- ##
+_ASBOX
+ echo
+ sed "/^$/d" confdefs.h | sort
+ echo
+ fi
+ test "$ac_signal" != 0 &&
+ echo "$as_me: caught signal $ac_signal"
+ echo "$as_me: exit $exit_status"
+ } >&5
+ rm -f core *.core &&
+ rm -rf conftest* confdefs* conf$$* $ac_clean_files &&
+ exit $exit_status
+ ' 0
+for ac_signal in 1 2 13 15; do
+ trap 'ac_signal='$ac_signal'; { (exit 1); exit 1; }' $ac_signal
+done
+ac_signal=0
+
+# confdefs.h avoids OS command line length limits that DEFS can exceed.
+rm -rf conftest* confdefs.h
+# AIX cpp loses on an empty file, so make sure it contains at least a newline.
+echo >confdefs.h
+
+# Predefined preprocessor variables.
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_NAME "$PACKAGE_NAME"
+_ACEOF
+
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_TARNAME "$PACKAGE_TARNAME"
+_ACEOF
+
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_VERSION "$PACKAGE_VERSION"
+_ACEOF
+
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_STRING "$PACKAGE_STRING"
+_ACEOF
+
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT"
+_ACEOF
+
+
+# Let the site file select an alternate cache file if it wants to.
+# Prefer explicitly selected file to automatically selected ones.
+if test -z "$CONFIG_SITE"; then
+ if test "x$prefix" != xNONE; then
+ CONFIG_SITE="$prefix/share/config.site $prefix/etc/config.site"
+ else
+ CONFIG_SITE="$ac_default_prefix/share/config.site $ac_default_prefix/etc/config.site"
+ fi
+fi
+for ac_site_file in $CONFIG_SITE; do
+ if test -r "$ac_site_file"; then
+ { echo "$as_me:$LINENO: loading site script $ac_site_file" >&5
+echo "$as_me: loading site script $ac_site_file" >&6;}
+ sed 's/^/| /' "$ac_site_file" >&5
+ . "$ac_site_file"
+ fi
+done
+
+if test -r "$cache_file"; then
+ # Some versions of bash will fail to source /dev/null (special
+ # files actually), so we avoid doing that.
+ if test -f "$cache_file"; then
+ { echo "$as_me:$LINENO: loading cache $cache_file" >&5
+echo "$as_me: loading cache $cache_file" >&6;}
+ case $cache_file in
+ [\\/]* | ?:[\\/]* ) . $cache_file;;
+ *) . ./$cache_file;;
+ esac
+ fi
+else
+ { echo "$as_me:$LINENO: creating cache $cache_file" >&5
+echo "$as_me: creating cache $cache_file" >&6;}
+ >$cache_file
+fi
+
+# Check that the precious variables saved in the cache have kept the same
+# value.
+ac_cache_corrupted=false
+for ac_var in `(set) 2>&1 |
+ sed -n 's/^ac_env_\([a-zA-Z_0-9]*\)_set=.*/\1/p'`; do
+ eval ac_old_set=\$ac_cv_env_${ac_var}_set
+ eval ac_new_set=\$ac_env_${ac_var}_set
+ eval ac_old_val="\$ac_cv_env_${ac_var}_value"
+ eval ac_new_val="\$ac_env_${ac_var}_value"
+ case $ac_old_set,$ac_new_set in
+ set,)
+ { echo "$as_me:$LINENO: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5
+echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;}
+ ac_cache_corrupted=: ;;
+ ,set)
+ { echo "$as_me:$LINENO: error: \`$ac_var' was not set in the previous run" >&5
+echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;}
+ ac_cache_corrupted=: ;;
+ ,);;
+ *)
+ if test "x$ac_old_val" != "x$ac_new_val"; then
+ { echo "$as_me:$LINENO: error: \`$ac_var' has changed since the previous run:" >&5
+echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;}
+ { echo "$as_me:$LINENO: former value: $ac_old_val" >&5
+echo "$as_me: former value: $ac_old_val" >&2;}
+ { echo "$as_me:$LINENO: current value: $ac_new_val" >&5
+echo "$as_me: current value: $ac_new_val" >&2;}
+ ac_cache_corrupted=:
+ fi;;
+ esac
+ # Pass precious variables to config.status.
+ if test "$ac_new_set" = set; then
+ case $ac_new_val in
+ *" "*|*" "*|*[\[\]\~\#\$\^\&\*\(\)\{\}\\\|\;\<\>\?\"\']*)
+ ac_arg=$ac_var=`echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;;
+ *) ac_arg=$ac_var=$ac_new_val ;;
+ esac
+ case " $ac_configure_args " in
+ *" '$ac_arg' "*) ;; # Avoid dups. Use of quotes ensures accuracy.
+ *) ac_configure_args="$ac_configure_args '$ac_arg'" ;;
+ esac
+ fi
+done
+if $ac_cache_corrupted; then
+ { echo "$as_me:$LINENO: error: changes in the environment can compromise the build" >&5
+echo "$as_me: error: changes in the environment can compromise the build" >&2;}
+ { { echo "$as_me:$LINENO: error: run \`make distclean' and/or \`rm $cache_file' and start over" >&5
+echo "$as_me: error: run \`make distclean' and/or \`rm $cache_file' and start over" >&2;}
+ { (exit 1); exit 1; }; }
+fi
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+YAIRD_VERSION=0.0.5
+am__api_version="1.9"
+ac_aux_dir=
+for ac_dir in $srcdir $srcdir/.. $srcdir/../..; do
+ if test -f $ac_dir/install-sh; then
+ ac_aux_dir=$ac_dir
+ ac_install_sh="$ac_aux_dir/install-sh -c"
+ break
+ elif test -f $ac_dir/install.sh; then
+ ac_aux_dir=$ac_dir
+ ac_install_sh="$ac_aux_dir/install.sh -c"
+ break
+ elif test -f $ac_dir/shtool; then
+ ac_aux_dir=$ac_dir
+ ac_install_sh="$ac_aux_dir/shtool install -c"
+ break
+ fi
+done
+if test -z "$ac_aux_dir"; then
+ { { echo "$as_me:$LINENO: error: cannot find install-sh or install.sh in $srcdir $srcdir/.. $srcdir/../.." >&5
+echo "$as_me: error: cannot find install-sh or install.sh in $srcdir $srcdir/.. $srcdir/../.." >&2;}
+ { (exit 1); exit 1; }; }
+fi
+ac_config_guess="$SHELL $ac_aux_dir/config.guess"
+ac_config_sub="$SHELL $ac_aux_dir/config.sub"
+ac_configure="$SHELL $ac_aux_dir/configure" # This should be Cygnus configure.
+
+# Find a good install program. We prefer a C program (faster),
+# so one script is as good as another. But avoid the broken or
+# incompatible versions:
+# SysV /etc/install, /usr/sbin/install
+# SunOS /usr/etc/install
+# IRIX /sbin/install
+# AIX /bin/install
+# AmigaOS /C/install, which installs bootblocks on floppy discs
+# AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag
+# AFS /usr/afsws/bin/install, which mishandles nonexistent args
+# SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff"
+# OS/2's system install, which has a completely different semantic
+# ./install, which can be erroneously created by make from ./install.sh.
+echo "$as_me:$LINENO: checking for a BSD-compatible install" >&5
+echo $ECHO_N "checking for a BSD-compatible install... $ECHO_C" >&6
+if test -z "$INSTALL"; then
+if test "${ac_cv_path_install+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ # Account for people who put trailing slashes in PATH elements.
+case $as_dir/ in
+ ./ | .// | /cC/* | \
+ /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \
+ ?:\\/os2\\/install\\/* | ?:\\/OS2\\/INSTALL\\/* | \
+ /usr/ucb/* ) ;;
+ *)
+ # OSF1 and SCO ODT 3.0 have their own names for install.
+ # Don't use installbsd from OSF since it installs stuff as root
+ # by default.
+ for ac_prog in ginstall scoinst install; do
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if $as_executable_p "$as_dir/$ac_prog$ac_exec_ext"; then
+ if test $ac_prog = install &&
+ grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then
+ # AIX install. It has an incompatible calling convention.
+ :
+ elif test $ac_prog = install &&
+ grep pwplus "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then
+ # program-specific install script used by HP pwplus--don't use.
+ :
+ else
+ ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c"
+ break 3
+ fi
+ fi
+ done
+ done
+ ;;
+esac
+done
+
+
+fi
+ if test "${ac_cv_path_install+set}" = set; then
+ INSTALL=$ac_cv_path_install
+ else
+ # As a last resort, use the slow shell script. We don't cache a
+ # path for INSTALL within a source directory, because that will
+ # break other packages using the cache if that directory is
+ # removed, or if the path is relative.
+ INSTALL=$ac_install_sh
+ fi
+fi
+echo "$as_me:$LINENO: result: $INSTALL" >&5
+echo "${ECHO_T}$INSTALL" >&6
+
+# Use test -z because SunOS4 sh mishandles braces in ${var-val}.
+# It thinks the first close brace ends the variable substitution.
+test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}'
+
+test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}'
+
+test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644'
+
+echo "$as_me:$LINENO: checking whether build environment is sane" >&5
+echo $ECHO_N "checking whether build environment is sane... $ECHO_C" >&6
+# Just in case
+sleep 1
+echo timestamp > conftest.file
+# Do `set' in a subshell so we don't clobber the current shell's
+# arguments. Must try -L first in case configure is actually a
+# symlink; some systems play weird games with the mod time of symlinks
+# (eg FreeBSD returns the mod time of the symlink's containing
+# directory).
+if (
+ set X `ls -Lt $srcdir/configure conftest.file 2> /dev/null`
+ if test "$*" = "X"; then
+ # -L didn't work.
+ set X `ls -t $srcdir/configure conftest.file`
+ fi
+ rm -f conftest.file
+ if test "$*" != "X $srcdir/configure conftest.file" \
+ && test "$*" != "X conftest.file $srcdir/configure"; then
+
+ # If neither matched, then we have a broken ls. This can happen
+ # if, for instance, CONFIG_SHELL is bash and it inherits a
+ # broken ls alias from the environment. This has actually
+ # happened. Such a system could not be considered "sane".
+ { { echo "$as_me:$LINENO: error: ls -t appears to fail. Make sure there is not a broken
+alias in your environment" >&5
+echo "$as_me: error: ls -t appears to fail. Make sure there is not a broken
+alias in your environment" >&2;}
+ { (exit 1); exit 1; }; }
+ fi
+
+ test "$2" = conftest.file
+ )
+then
+ # Ok.
+ :
+else
+ { { echo "$as_me:$LINENO: error: newly created file is older than distributed files!
+Check your system clock" >&5
+echo "$as_me: error: newly created file is older than distributed files!
+Check your system clock" >&2;}
+ { (exit 1); exit 1; }; }
+fi
+echo "$as_me:$LINENO: result: yes" >&5
+echo "${ECHO_T}yes" >&6
+test "$program_prefix" != NONE &&
+ program_transform_name="s,^,$program_prefix,;$program_transform_name"
+# Use a double $ so make ignores it.
+test "$program_suffix" != NONE &&
+ program_transform_name="s,\$,$program_suffix,;$program_transform_name"
+# Double any \ or $. echo might interpret backslashes.
+# By default was `s,x,x', remove it if useless.
+cat <<\_ACEOF >conftest.sed
+s/[\\$]/&&/g;s/;s,x,x,$//
+_ACEOF
+program_transform_name=`echo $program_transform_name | sed -f conftest.sed`
+rm conftest.sed
+
+# expand $ac_aux_dir to an absolute path
+am_aux_dir=`cd $ac_aux_dir && pwd`
+
+test x"${MISSING+set}" = xset || MISSING="\${SHELL} $am_aux_dir/missing"
+# Use eval to expand $SHELL
+if eval "$MISSING --run true"; then
+ am_missing_run="$MISSING --run "
+else
+ am_missing_run=
+ { echo "$as_me:$LINENO: WARNING: \`missing' script is too old or missing" >&5
+echo "$as_me: WARNING: \`missing' script is too old or missing" >&2;}
+fi
+
+if mkdir -p --version . >/dev/null 2>&1 && test ! -d ./--version; then
+ # We used to keeping the `.' as first argument, in order to
+ # allow $(mkdir_p) to be used without argument. As in
+ # $(mkdir_p) $(somedir)
+ # where $(somedir) is conditionally defined. However this is wrong
+ # for two reasons:
+ # 1. if the package is installed by a user who cannot write `.'
+ # make install will fail,
+ # 2. the above comment should most certainly read
+ # $(mkdir_p) $(DESTDIR)$(somedir)
+ # so it does not work when $(somedir) is undefined and
+ # $(DESTDIR) is not.
+ # To support the latter case, we have to write
+ # test -z "$(somedir)" || $(mkdir_p) $(DESTDIR)$(somedir),
+ # so the `.' trick is pointless.
+ mkdir_p='mkdir -p --'
+else
+ # On NextStep and OpenStep, the `mkdir' command does not
+ # recognize any option. It will interpret all options as
+ # directories to create, and then abort because `.' already
+ # exists.
+ for d in ./-p ./--version;
+ do
+ test -d $d && rmdir $d
+ done
+ # $(mkinstalldirs) is defined by Automake if mkinstalldirs exists.
+ if test -f "$ac_aux_dir/mkinstalldirs"; then
+ mkdir_p='$(mkinstalldirs)'
+ else
+ mkdir_p='$(install_sh) -d'
+ fi
+fi
+
+for ac_prog in gawk mawk nawk awk
+do
+ # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_AWK+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ if test -n "$AWK"; then
+ ac_cv_prog_AWK="$AWK" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_AWK="$ac_prog"
+ echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+done
+
+fi
+fi
+AWK=$ac_cv_prog_AWK
+if test -n "$AWK"; then
+ echo "$as_me:$LINENO: result: $AWK" >&5
+echo "${ECHO_T}$AWK" >&6
+else
+ echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+ test -n "$AWK" && break
+done
+
+echo "$as_me:$LINENO: checking whether ${MAKE-make} sets \$(MAKE)" >&5
+echo $ECHO_N "checking whether ${MAKE-make} sets \$(MAKE)... $ECHO_C" >&6
+set dummy ${MAKE-make}; ac_make=`echo "$2" | sed 'y,:./+-,___p_,'`
+if eval "test \"\${ac_cv_prog_make_${ac_make}_set+set}\" = set"; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.make <<\_ACEOF
+all:
+ @echo 'ac_maketemp="$(MAKE)"'
+_ACEOF
+# GNU make sometimes prints "make[1]: Entering...", which would confuse us.
+eval `${MAKE-make} -f conftest.make 2>/dev/null | grep temp=`
+if test -n "$ac_maketemp"; then
+ eval ac_cv_prog_make_${ac_make}_set=yes
+else
+ eval ac_cv_prog_make_${ac_make}_set=no
+fi
+rm -f conftest.make
+fi
+if eval "test \"`echo '$ac_cv_prog_make_'${ac_make}_set`\" = yes"; then
+ echo "$as_me:$LINENO: result: yes" >&5
+echo "${ECHO_T}yes" >&6
+ SET_MAKE=
+else
+ echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+ SET_MAKE="MAKE=${MAKE-make}"
+fi
+
+rm -rf .tst 2>/dev/null
+mkdir .tst 2>/dev/null
+if test -d .tst; then
+ am__leading_dot=.
+else
+ am__leading_dot=_
+fi
+rmdir .tst 2>/dev/null
+
+# test to see if srcdir already configured
+if test "`cd $srcdir && pwd`" != "`pwd`" &&
+ test -f $srcdir/config.status; then
+ { { echo "$as_me:$LINENO: error: source directory already configured; run \"make distclean\" there first" >&5
+echo "$as_me: error: source directory already configured; run \"make distclean\" there first" >&2;}
+ { (exit 1); exit 1; }; }
+fi
+
+# test whether we have cygpath
+if test -z "$CYGPATH_W"; then
+ if (cygpath --version) >/dev/null 2>/dev/null; then
+ CYGPATH_W='cygpath -w'
+ else
+ CYGPATH_W=echo
+ fi
+fi
+
+
+# Define the identity of the package.
+ PACKAGE=yaird
+ VERSION=${YAIRD_VERSION}
+
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE "$PACKAGE"
+_ACEOF
+
+
+cat >>confdefs.h <<_ACEOF
+#define VERSION "$VERSION"
+_ACEOF
+
+# Some tools Automake needs.
+
+ACLOCAL=${ACLOCAL-"${am_missing_run}aclocal-${am__api_version}"}
+
+
+AUTOCONF=${AUTOCONF-"${am_missing_run}autoconf"}
+
+
+AUTOMAKE=${AUTOMAKE-"${am_missing_run}automake-${am__api_version}"}
+
+
+AUTOHEADER=${AUTOHEADER-"${am_missing_run}autoheader"}
+
+
+MAKEINFO=${MAKEINFO-"${am_missing_run}makeinfo"}
+
+install_sh=${install_sh-"$am_aux_dir/install-sh"}
+
+# Installed binaries are usually stripped using `strip' when the user
+# run `make install-strip'. However `strip' might not be the right
+# tool to use in cross-compilation environments, therefore Automake
+# will honor the `STRIP' environment variable to overrule this program.
+if test "$cross_compiling" != no; then
+ if test -n "$ac_tool_prefix"; then
+ # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args.
+set dummy ${ac_tool_prefix}strip; ac_word=$2
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_STRIP+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ if test -n "$STRIP"; then
+ ac_cv_prog_STRIP="$STRIP" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_STRIP="${ac_tool_prefix}strip"
+ echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+done
+
+fi
+fi
+STRIP=$ac_cv_prog_STRIP
+if test -n "$STRIP"; then
+ echo "$as_me:$LINENO: result: $STRIP" >&5
+echo "${ECHO_T}$STRIP" >&6
+else
+ echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+fi
+if test -z "$ac_cv_prog_STRIP"; then
+ ac_ct_STRIP=$STRIP
+ # Extract the first word of "strip", so it can be a program name with args.
+set dummy strip; ac_word=$2
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_ac_ct_STRIP+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ if test -n "$ac_ct_STRIP"; then
+ ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_ac_ct_STRIP="strip"
+ echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+done
+
+ test -z "$ac_cv_prog_ac_ct_STRIP" && ac_cv_prog_ac_ct_STRIP=":"
+fi
+fi
+ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP
+if test -n "$ac_ct_STRIP"; then
+ echo "$as_me:$LINENO: result: $ac_ct_STRIP" >&5
+echo "${ECHO_T}$ac_ct_STRIP" >&6
+else
+ echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+ STRIP=$ac_ct_STRIP
+else
+ STRIP="$ac_cv_prog_STRIP"
+fi
+
+fi
+INSTALL_STRIP_PROGRAM="\${SHELL} \$(install_sh) -c -s"
+
+# We need awk for the "check" target. The system "awk" is bad on
+# some platforms.
+# Always define AMTAR for backward compatibility.
+
+AMTAR=${AMTAR-"${am_missing_run}tar"}
+
+am__tar='${AMTAR} chof - "$$tardir"'; am__untar='${AMTAR} xf -'
+
+
+
+
+
+
+#
+# Required optional feature to determine which template to install.
+# Packagers are expected to put their own template in ./templates
+# before configuring, so this should not get in their way.
+# This should go away once we have option file parsing.
+#
+# Check whether --enable-template or --disable-template was given.
+if test "${enable_template+set}" = set; then
+ enableval="$enable_template"
+
+ if test -f "templates/$enableval.pm"
+ then
+ INITRD_TEMPLATE="$enableval"
+
+ else
+ { { echo "$as_me:$LINENO: error: Template '$enableval' not found in ./templates" >&5
+echo "$as_me: error: Template '$enableval' not found in ./templates" >&2;}
+ { (exit 1); exit 1; }; }
+ fi
+
+else
+ { { echo "$as_me:$LINENO: error: required option --enable-template=xxx is missing" >&5
+echo "$as_me: error: required option --enable-template=xxx is missing" >&2;}
+ { (exit 1); exit 1; }; }
+fi;
+
+# Check whether --enable-nuke or --disable-nuke was given.
+if test "${enable_nuke+set}" = set; then
+ enableval="$enable_nuke"
+
+ case "${enableval}" in
+ yes) enable_nuke=true ;;
+ no) enable_nuke=false ;;
+ *) { { echo "$as_me:$LINENO: error: bad value ${enableval} for --enable-nuke" >&5
+echo "$as_me: error: bad value ${enableval} for --enable-nuke" >&2;}
+ { (exit 1); exit 1; }; } ;;
+ esac
+
+else
+
+ enable_nuke=false
+
+fi;
+if test "$enable_nuke" = true; then
+
+cat >>confdefs.h <<\_ACEOF
+#define ENABLE_NUKE 1
+_ACEOF
+
+fi
+
+# Checks for programs.
+# Extract the first word of "perl", so it can be a program name with args.
+set dummy perl; ac_word=$2
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_path_PERL+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ case $PERL in
+ [\\/]* | ?:[\\/]*)
+ ac_cv_path_PERL="$PERL" # Let the user override the test with a path.
+ ;;
+ *)
+ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_path_PERL="$as_dir/$ac_word$ac_exec_ext"
+ echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+done
+
+ ;;
+esac
+fi
+PERL=$ac_cv_path_PERL
+
+if test -n "$PERL"; then
+ echo "$as_me:$LINENO: result: $PERL" >&5
+echo "${ECHO_T}$PERL" >&6
+else
+ echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+if test -n "$ac_tool_prefix"; then
+ # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args.
+set dummy ${ac_tool_prefix}gcc; ac_word=$2
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_CC+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ if test -n "$CC"; then
+ ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_CC="${ac_tool_prefix}gcc"
+ echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+done
+
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+ echo "$as_me:$LINENO: result: $CC" >&5
+echo "${ECHO_T}$CC" >&6
+else
+ echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+fi
+if test -z "$ac_cv_prog_CC"; then
+ ac_ct_CC=$CC
+ # Extract the first word of "gcc", so it can be a program name with args.
+set dummy gcc; ac_word=$2
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_ac_ct_CC+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ if test -n "$ac_ct_CC"; then
+ ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_ac_ct_CC="gcc"
+ echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+done
+
+fi
+fi
+ac_ct_CC=$ac_cv_prog_ac_ct_CC
+if test -n "$ac_ct_CC"; then
+ echo "$as_me:$LINENO: result: $ac_ct_CC" >&5
+echo "${ECHO_T}$ac_ct_CC" >&6
+else
+ echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+ CC=$ac_ct_CC
+else
+ CC="$ac_cv_prog_CC"
+fi
+
+if test -z "$CC"; then
+ if test -n "$ac_tool_prefix"; then
+ # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args.
+set dummy ${ac_tool_prefix}cc; ac_word=$2
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_CC+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ if test -n "$CC"; then
+ ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_CC="${ac_tool_prefix}cc"
+ echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+done
+
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+ echo "$as_me:$LINENO: result: $CC" >&5
+echo "${ECHO_T}$CC" >&6
+else
+ echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+fi
+if test -z "$ac_cv_prog_CC"; then
+ ac_ct_CC=$CC
+ # Extract the first word of "cc", so it can be a program name with args.
+set dummy cc; ac_word=$2
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_ac_ct_CC+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ if test -n "$ac_ct_CC"; then
+ ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_ac_ct_CC="cc"
+ echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+done
+
+fi
+fi
+ac_ct_CC=$ac_cv_prog_ac_ct_CC
+if test -n "$ac_ct_CC"; then
+ echo "$as_me:$LINENO: result: $ac_ct_CC" >&5
+echo "${ECHO_T}$ac_ct_CC" >&6
+else
+ echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+ CC=$ac_ct_CC
+else
+ CC="$ac_cv_prog_CC"
+fi
+
+fi
+if test -z "$CC"; then
+ # Extract the first word of "cc", so it can be a program name with args.
+set dummy cc; ac_word=$2
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_CC+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ if test -n "$CC"; then
+ ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+ ac_prog_rejected=no
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then
+ ac_prog_rejected=yes
+ continue
+ fi
+ ac_cv_prog_CC="cc"
+ echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+done
+
+if test $ac_prog_rejected = yes; then
+ # We found a bogon in the path, so make sure we never use it.
+ set dummy $ac_cv_prog_CC
+ shift
+ if test $# != 0; then
+ # We chose a different compiler from the bogus one.
+ # However, it has the same basename, so the bogon will be chosen
+ # first if we set CC to just the basename; use the full file name.
+ shift
+ ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@"
+ fi
+fi
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+ echo "$as_me:$LINENO: result: $CC" >&5
+echo "${ECHO_T}$CC" >&6
+else
+ echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+fi
+if test -z "$CC"; then
+ if test -n "$ac_tool_prefix"; then
+ for ac_prog in cl
+ do
+ # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args.
+set dummy $ac_tool_prefix$ac_prog; ac_word=$2
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_CC+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ if test -n "$CC"; then
+ ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_CC="$ac_tool_prefix$ac_prog"
+ echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+done
+
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+ echo "$as_me:$LINENO: result: $CC" >&5
+echo "${ECHO_T}$CC" >&6
+else
+ echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+ test -n "$CC" && break
+ done
+fi
+if test -z "$CC"; then
+ ac_ct_CC=$CC
+ for ac_prog in cl
+do
+ # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_ac_ct_CC+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ if test -n "$ac_ct_CC"; then
+ ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_ac_ct_CC="$ac_prog"
+ echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+done
+
+fi
+fi
+ac_ct_CC=$ac_cv_prog_ac_ct_CC
+if test -n "$ac_ct_CC"; then
+ echo "$as_me:$LINENO: result: $ac_ct_CC" >&5
+echo "${ECHO_T}$ac_ct_CC" >&6
+else
+ echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+ test -n "$ac_ct_CC" && break
+done
+
+ CC=$ac_ct_CC
+fi
+
+fi
+
+
+test -z "$CC" && { { echo "$as_me:$LINENO: error: no acceptable C compiler found in \$PATH
+See \`config.log' for more details." >&5
+echo "$as_me: error: no acceptable C compiler found in \$PATH
+See \`config.log' for more details." >&2;}
+ { (exit 1); exit 1; }; }
+
+# Provide some information about the compiler.
+echo "$as_me:$LINENO:" \
+ "checking for C compiler version" >&5
+ac_compiler=`set X $ac_compile; echo $2`
+{ (eval echo "$as_me:$LINENO: \"$ac_compiler --version </dev/null >&5\"") >&5
+ (eval $ac_compiler --version </dev/null >&5) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }
+{ (eval echo "$as_me:$LINENO: \"$ac_compiler -v </dev/null >&5\"") >&5
+ (eval $ac_compiler -v </dev/null >&5) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }
+{ (eval echo "$as_me:$LINENO: \"$ac_compiler -V </dev/null >&5\"") >&5
+ (eval $ac_compiler -V </dev/null >&5) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }
+
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+
+int
+main ()
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+ac_clean_files_save=$ac_clean_files
+ac_clean_files="$ac_clean_files a.out a.exe b.out"
+# Try to create an executable without -o first, disregard a.out.
+# It will help us diagnose broken compilers, and finding out an intuition
+# of exeext.
+echo "$as_me:$LINENO: checking for C compiler default output file name" >&5
+echo $ECHO_N "checking for C compiler default output file name... $ECHO_C" >&6
+ac_link_default=`echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'`
+if { (eval echo "$as_me:$LINENO: \"$ac_link_default\"") >&5
+ (eval $ac_link_default) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; then
+ # Find the output, starting from the most likely. This scheme is
+# not robust to junk in `.', hence go to wildcards (a.*) only as a last
+# resort.
+
+# Be careful to initialize this variable, since it used to be cached.
+# Otherwise an old cache value of `no' led to `EXEEXT = no' in a Makefile.
+ac_cv_exeext=
+# b.out is created by i960 compilers.
+for ac_file in a_out.exe a.exe conftest.exe a.out conftest a.* conftest.* b.out
+do
+ test -f "$ac_file" || continue
+ case $ac_file in
+ *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.o | *.obj )
+ ;;
+ conftest.$ac_ext )
+ # This is the source file.
+ ;;
+ [ab].out )
+ # We found the default executable, but exeext='' is most
+ # certainly right.
+ break;;
+ *.* )
+ ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'`
+ # FIXME: I believe we export ac_cv_exeext for Libtool,
+ # but it would be cool to find out if it's true. Does anybody
+ # maintain Libtool? --akim.
+ export ac_cv_exeext
+ break;;
+ * )
+ break;;
+ esac
+done
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+{ { echo "$as_me:$LINENO: error: C compiler cannot create executables
+See \`config.log' for more details." >&5
+echo "$as_me: error: C compiler cannot create executables
+See \`config.log' for more details." >&2;}
+ { (exit 77); exit 77; }; }
+fi
+
+ac_exeext=$ac_cv_exeext
+echo "$as_me:$LINENO: result: $ac_file" >&5
+echo "${ECHO_T}$ac_file" >&6
+
+# Check the compiler produces executables we can run. If not, either
+# the compiler is broken, or we cross compile.
+echo "$as_me:$LINENO: checking whether the C compiler works" >&5
+echo $ECHO_N "checking whether the C compiler works... $ECHO_C" >&6
+# FIXME: These cross compiler hacks should be removed for Autoconf 3.0
+# If not cross compiling, check that we can run a simple program.
+if test "$cross_compiling" != yes; then
+ if { ac_try='./$ac_file'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ cross_compiling=no
+ else
+ if test "$cross_compiling" = maybe; then
+ cross_compiling=yes
+ else
+ { { echo "$as_me:$LINENO: error: cannot run C compiled programs.
+If you meant to cross compile, use \`--host'.
+See \`config.log' for more details." >&5
+echo "$as_me: error: cannot run C compiled programs.
+If you meant to cross compile, use \`--host'.
+See \`config.log' for more details." >&2;}
+ { (exit 1); exit 1; }; }
+ fi
+ fi
+fi
+echo "$as_me:$LINENO: result: yes" >&5
+echo "${ECHO_T}yes" >&6
+
+rm -f a.out a.exe conftest$ac_cv_exeext b.out
+ac_clean_files=$ac_clean_files_save
+# Check the compiler produces executables we can run. If not, either
+# the compiler is broken, or we cross compile.
+echo "$as_me:$LINENO: checking whether we are cross compiling" >&5
+echo $ECHO_N "checking whether we are cross compiling... $ECHO_C" >&6
+echo "$as_me:$LINENO: result: $cross_compiling" >&5
+echo "${ECHO_T}$cross_compiling" >&6
+
+echo "$as_me:$LINENO: checking for suffix of executables" >&5
+echo $ECHO_N "checking for suffix of executables... $ECHO_C" >&6
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; then
+ # If both `conftest.exe' and `conftest' are `present' (well, observable)
+# catch `conftest.exe'. For instance with Cygwin, `ls conftest' will
+# work properly (i.e., refer to `conftest.exe'), while it won't with
+# `rm'.
+for ac_file in conftest.exe conftest conftest.*; do
+ test -f "$ac_file" || continue
+ case $ac_file in
+ *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.o | *.obj ) ;;
+ *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'`
+ export ac_cv_exeext
+ break;;
+ * ) break;;
+ esac
+done
+else
+ { { echo "$as_me:$LINENO: error: cannot compute suffix of executables: cannot compile and link
+See \`config.log' for more details." >&5
+echo "$as_me: error: cannot compute suffix of executables: cannot compile and link
+See \`config.log' for more details." >&2;}
+ { (exit 1); exit 1; }; }
+fi
+
+rm -f conftest$ac_cv_exeext
+echo "$as_me:$LINENO: result: $ac_cv_exeext" >&5
+echo "${ECHO_T}$ac_cv_exeext" >&6
+
+rm -f conftest.$ac_ext
+EXEEXT=$ac_cv_exeext
+ac_exeext=$EXEEXT
+echo "$as_me:$LINENO: checking for suffix of object files" >&5
+echo $ECHO_N "checking for suffix of object files... $ECHO_C" >&6
+if test "${ac_cv_objext+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+
+int
+main ()
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.o conftest.obj
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; then
+ for ac_file in `(ls conftest.o conftest.obj; ls conftest.*) 2>/dev/null`; do
+ case $ac_file in
+ *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg ) ;;
+ *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'`
+ break;;
+ esac
+done
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+{ { echo "$as_me:$LINENO: error: cannot compute suffix of object files: cannot compile
+See \`config.log' for more details." >&5
+echo "$as_me: error: cannot compute suffix of object files: cannot compile
+See \`config.log' for more details." >&2;}
+ { (exit 1); exit 1; }; }
+fi
+
+rm -f conftest.$ac_cv_objext conftest.$ac_ext
+fi
+echo "$as_me:$LINENO: result: $ac_cv_objext" >&5
+echo "${ECHO_T}$ac_cv_objext" >&6
+OBJEXT=$ac_cv_objext
+ac_objext=$OBJEXT
+echo "$as_me:$LINENO: checking whether we are using the GNU C compiler" >&5
+echo $ECHO_N "checking whether we are using the GNU C compiler... $ECHO_C" >&6
+if test "${ac_cv_c_compiler_gnu+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+
+int
+main ()
+{
+#ifndef __GNUC__
+ choke me
+#endif
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_compiler_gnu=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_compiler_gnu=no
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+ac_cv_c_compiler_gnu=$ac_compiler_gnu
+
+fi
+echo "$as_me:$LINENO: result: $ac_cv_c_compiler_gnu" >&5
+echo "${ECHO_T}$ac_cv_c_compiler_gnu" >&6
+GCC=`test $ac_compiler_gnu = yes && echo yes`
+ac_test_CFLAGS=${CFLAGS+set}
+ac_save_CFLAGS=$CFLAGS
+CFLAGS="-g"
+echo "$as_me:$LINENO: checking whether $CC accepts -g" >&5
+echo $ECHO_N "checking whether $CC accepts -g... $ECHO_C" >&6
+if test "${ac_cv_prog_cc_g+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+
+int
+main ()
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_prog_cc_g=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_cv_prog_cc_g=no
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+echo "$as_me:$LINENO: result: $ac_cv_prog_cc_g" >&5
+echo "${ECHO_T}$ac_cv_prog_cc_g" >&6
+if test "$ac_test_CFLAGS" = set; then
+ CFLAGS=$ac_save_CFLAGS
+elif test $ac_cv_prog_cc_g = yes; then
+ if test "$GCC" = yes; then
+ CFLAGS="-g -O2"
+ else
+ CFLAGS="-g"
+ fi
+else
+ if test "$GCC" = yes; then
+ CFLAGS="-O2"
+ else
+ CFLAGS=
+ fi
+fi
+echo "$as_me:$LINENO: checking for $CC option to accept ANSI C" >&5
+echo $ECHO_N "checking for $CC option to accept ANSI C... $ECHO_C" >&6
+if test "${ac_cv_prog_cc_stdc+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ ac_cv_prog_cc_stdc=no
+ac_save_CC=$CC
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#include <stdarg.h>
+#include <stdio.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+/* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */
+struct buf { int x; };
+FILE * (*rcsopen) (struct buf *, struct stat *, int);
+static char *e (p, i)
+ char **p;
+ int i;
+{
+ return p[i];
+}
+static char *f (char * (*g) (char **, int), char **p, ...)
+{
+ char *s;
+ va_list v;
+ va_start (v,p);
+ s = g (p, va_arg (v,int));
+ va_end (v);
+ return s;
+}
+
+/* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has
+ function prototypes and stuff, but not '\xHH' hex character constants.
+ These don't provoke an error unfortunately, instead are silently treated
+ as 'x'. The following induces an error, until -std1 is added to get
+ proper ANSI mode. Curiously '\x00'!='x' always comes out true, for an
+ array size at least. It's necessary to write '\x00'==0 to get something
+ that's true only with -std1. */
+int osf4_cc_array ['\x00' == 0 ? 1 : -1];
+
+int test (int i, double x);
+struct s1 {int (*f) (int a);};
+struct s2 {int (*f) (double a);};
+int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int);
+int argc;
+char **argv;
+int
+main ()
+{
+return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1];
+ ;
+ return 0;
+}
+_ACEOF
+# Don't try gcc -ansi; that turns off useful extensions and
+# breaks some systems' header files.
+# AIX -qlanglvl=ansi
+# Ultrix and OSF/1 -std1
+# HP-UX 10.20 and later -Ae
+# HP-UX older versions -Aa -D_HPUX_SOURCE
+# SVR4 -Xc -D__EXTENSIONS__
+for ac_arg in "" -qlanglvl=ansi -std1 -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__"
+do
+ CC="$ac_save_CC $ac_arg"
+ rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_prog_cc_stdc=$ac_arg
+break
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+fi
+rm -f conftest.err conftest.$ac_objext
+done
+rm -f conftest.$ac_ext conftest.$ac_objext
+CC=$ac_save_CC
+
+fi
+
+case "x$ac_cv_prog_cc_stdc" in
+ x|xno)
+ echo "$as_me:$LINENO: result: none needed" >&5
+echo "${ECHO_T}none needed" >&6 ;;
+ *)
+ echo "$as_me:$LINENO: result: $ac_cv_prog_cc_stdc" >&5
+echo "${ECHO_T}$ac_cv_prog_cc_stdc" >&6
+ CC="$CC $ac_cv_prog_cc_stdc" ;;
+esac
+
+# Some people use a C++ compiler to compile C. Since we use `exit',
+# in C++ we need to declare it. In case someone uses the same compiler
+# for both compiling C and C++ we need to have the C++ compiler decide
+# the declaration of exit, since it's the most demanding environment.
+cat >conftest.$ac_ext <<_ACEOF
+#ifndef __cplusplus
+ choke me
+#endif
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ for ac_declaration in \
+ '' \
+ 'extern "C" void std::exit (int) throw (); using std::exit;' \
+ 'extern "C" void std::exit (int); using std::exit;' \
+ 'extern "C" void exit (int) throw ();' \
+ 'extern "C" void exit (int);' \
+ 'void exit (int);'
+do
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_declaration
+#include <stdlib.h>
+int
+main ()
+{
+exit (42);
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ :
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+continue
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_declaration
+int
+main ()
+{
+exit (42);
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ break
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+done
+rm -f conftest*
+if test -n "$ac_declaration"; then
+ echo '#ifdef __cplusplus' >>confdefs.h
+ echo $ac_declaration >>confdefs.h
+ echo '#endif' >>confdefs.h
+fi
+
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+DEPDIR="${am__leading_dot}deps"
+
+ ac_config_commands="$ac_config_commands depfiles"
+
+
+am_make=${MAKE-make}
+cat > confinc << 'END'
+am__doit:
+ @echo done
+.PHONY: am__doit
+END
+# If we don't find an include directive, just comment out the code.
+echo "$as_me:$LINENO: checking for style of include used by $am_make" >&5
+echo $ECHO_N "checking for style of include used by $am_make... $ECHO_C" >&6
+am__include="#"
+am__quote=
+_am_result=none
+# First try GNU make style include.
+echo "include confinc" > confmf
+# We grep out `Entering directory' and `Leaving directory'
+# messages which can occur if `w' ends up in MAKEFLAGS.
+# In particular we don't look at `^make:' because GNU make might
+# be invoked under some other name (usually "gmake"), in which
+# case it prints its new name instead of `make'.
+if test "`$am_make -s -f confmf 2> /dev/null | grep -v 'ing directory'`" = "done"; then
+ am__include=include
+ am__quote=
+ _am_result=GNU
+fi
+# Now try BSD make style include.
+if test "$am__include" = "#"; then
+ echo '.include "confinc"' > confmf
+ if test "`$am_make -s -f confmf 2> /dev/null`" = "done"; then
+ am__include=.include
+ am__quote="\""
+ _am_result=BSD
+ fi
+fi
+
+
+echo "$as_me:$LINENO: result: $_am_result" >&5
+echo "${ECHO_T}$_am_result" >&6
+rm -f confinc confmf
+
+# Check whether --enable-dependency-tracking or --disable-dependency-tracking was given.
+if test "${enable_dependency_tracking+set}" = set; then
+ enableval="$enable_dependency_tracking"
+
+fi;
+if test "x$enable_dependency_tracking" != xno; then
+ am_depcomp="$ac_aux_dir/depcomp"
+ AMDEPBACKSLASH='\'
+fi
+
+
+if test "x$enable_dependency_tracking" != xno; then
+ AMDEP_TRUE=
+ AMDEP_FALSE='#'
+else
+ AMDEP_TRUE='#'
+ AMDEP_FALSE=
+fi
+
+
+
+
+depcc="$CC" am_compiler_list=
+
+echo "$as_me:$LINENO: checking dependency style of $depcc" >&5
+echo $ECHO_N "checking dependency style of $depcc... $ECHO_C" >&6
+if test "${am_cv_CC_dependencies_compiler_type+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then
+ # We make a subdir and do the tests there. Otherwise we can end up
+ # making bogus files that we don't know about and never remove. For
+ # instance it was reported that on HP-UX the gcc test will end up
+ # making a dummy file named `D' -- because `-MD' means `put the output
+ # in D'.
+ mkdir conftest.dir
+ # Copy depcomp to subdir because otherwise we won't find it if we're
+ # using a relative directory.
+ cp "$am_depcomp" conftest.dir
+ cd conftest.dir
+ # We will build objects and dependencies in a subdirectory because
+ # it helps to detect inapplicable dependency modes. For instance
+ # both Tru64's cc and ICC support -MD to output dependencies as a
+ # side effect of compilation, but ICC will put the dependencies in
+ # the current directory while Tru64 will put them in the object
+ # directory.
+ mkdir sub
+
+ am_cv_CC_dependencies_compiler_type=none
+ if test "$am_compiler_list" = ""; then
+ am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp`
+ fi
+ for depmode in $am_compiler_list; do
+ # Setup a source with many dependencies, because some compilers
+ # like to wrap large dependency lists on column 80 (with \), and
+ # we should not choose a depcomp mode which is confused by this.
+ #
+ # We need to recreate these files for each test, as the compiler may
+ # overwrite some of them when testing with obscure command lines.
+ # This happens at least with the AIX C compiler.
+ : > sub/conftest.c
+ for i in 1 2 3 4 5 6; do
+ echo '#include "conftst'$i'.h"' >> sub/conftest.c
+ # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with
+ # Solaris 8's {/usr,}/bin/sh.
+ touch sub/conftst$i.h
+ done
+ echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf
+
+ case $depmode in
+ nosideeffect)
+ # after this tag, mechanisms are not by side-effect, so they'll
+ # only be used when explicitly requested
+ if test "x$enable_dependency_tracking" = xyes; then
+ continue
+ else
+ break
+ fi
+ ;;
+ none) break ;;
+ esac
+ # We check with `-c' and `-o' for the sake of the "dashmstdout"
+ # mode. It turns out that the SunPro C++ compiler does not properly
+ # handle `-M -o', and we need to detect this.
+ if depmode=$depmode \
+ source=sub/conftest.c object=sub/conftest.${OBJEXT-o} \
+ depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \
+ $SHELL ./depcomp $depcc -c -o sub/conftest.${OBJEXT-o} sub/conftest.c \
+ >/dev/null 2>conftest.err &&
+ grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 &&
+ grep sub/conftest.${OBJEXT-o} sub/conftest.Po > /dev/null 2>&1 &&
+ ${MAKE-make} -s -f confmf > /dev/null 2>&1; then
+ # icc doesn't choke on unknown options, it will just issue warnings
+ # or remarks (even with -Werror). So we grep stderr for any message
+ # that says an option was ignored or not supported.
+ # When given -MP, icc 7.0 and 7.1 complain thusly:
+ # icc: Command line warning: ignoring option '-M'; no argument required
+ # The diagnosis changed in icc 8.0:
+ # icc: Command line remark: option '-MP' not supported
+ if (grep 'ignoring option' conftest.err ||
+ grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else
+ am_cv_CC_dependencies_compiler_type=$depmode
+ break
+ fi
+ fi
+ done
+
+ cd ..
+ rm -rf conftest.dir
+else
+ am_cv_CC_dependencies_compiler_type=none
+fi
+
+fi
+echo "$as_me:$LINENO: result: $am_cv_CC_dependencies_compiler_type" >&5
+echo "${ECHO_T}$am_cv_CC_dependencies_compiler_type" >&6
+CCDEPMODE=depmode=$am_cv_CC_dependencies_compiler_type
+
+
+
+if
+ test "x$enable_dependency_tracking" != xno \
+ && test "$am_cv_CC_dependencies_compiler_type" = gcc3; then
+ am__fastdepCC_TRUE=
+ am__fastdepCC_FALSE='#'
+else
+ am__fastdepCC_TRUE='#'
+ am__fastdepCC_FALSE=
+fi
+
+
+
+#
+# XML formatting; unclear what processor is most widely available.
+#
+# Extract the first word of "xmlto", so it can be a program name with args.
+set dummy xmlto; ac_word=$2
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_path_XMLTO+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ case $XMLTO in
+ [\\/]* | ?:[\\/]*)
+ ac_cv_path_XMLTO="$XMLTO" # Let the user override the test with a path.
+ ;;
+ *)
+ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_path_XMLTO="$as_dir/$ac_word$ac_exec_ext"
+ echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+done
+
+ test -z "$ac_cv_path_XMLTO" && ac_cv_path_XMLTO=":"
+ ;;
+esac
+fi
+XMLTO=$ac_cv_path_XMLTO
+
+if test -n "$XMLTO"; then
+ echo "$as_me:$LINENO: result: $XMLTO" >&5
+echo "${ECHO_T}$XMLTO" >&6
+else
+ echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+
+# Checks for libraries.
+# Checks for header files.
+# Checks for typedefs, structures, and compiler characteristics.
+# Checks for library functions.
+
+# Use this when we need to compile C programs.
+ ac_config_headers="$ac_config_headers include/config.h"
+
+
+ ac_config_files="$ac_config_files Makefile templates/Makefile perl/Makefile doc/Makefile exec/Makefile doc/yaird.xml"
+
+cat >confcache <<\_ACEOF
+# This file is a shell script that caches the results of configure
+# tests run on this system so they can be shared between configure
+# scripts and configure runs, see configure's option --config-cache.
+# It is not useful on other systems. If it contains results you don't
+# want to keep, you may remove or edit it.
+#
+# config.status only pays attention to the cache file if you give it
+# the --recheck option to rerun configure.
+#
+# `ac_cv_env_foo' variables (set or unset) will be overridden when
+# loading this file, other *unset* `ac_cv_foo' will be assigned the
+# following values.
+
+_ACEOF
+
+# The following way of writing the cache mishandles newlines in values,
+# but we know of no workaround that is simple, portable, and efficient.
+# So, don't put newlines in cache variables' values.
+# Ultrix sh set writes to stderr and can't be redirected directly,
+# and sets the high bit in the cache file unless we assign to the vars.
+{
+ (set) 2>&1 |
+ case `(ac_space=' '; set | grep ac_space) 2>&1` in
+ *ac_space=\ *)
+ # `set' does not quote correctly, so add quotes (double-quote
+ # substitution turns \\\\ into \\, and sed turns \\ into \).
+ sed -n \
+ "s/'/'\\\\''/g;
+ s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p"
+ ;;
+ *)
+ # `set' quotes correctly as required by POSIX, so do not add quotes.
+ sed -n \
+ "s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1=\\2/p"
+ ;;
+ esac;
+} |
+ sed '
+ t clear
+ : clear
+ s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/
+ t end
+ /^ac_cv_env/!s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/
+ : end' >>confcache
+if diff $cache_file confcache >/dev/null 2>&1; then :; else
+ if test -w $cache_file; then
+ test "x$cache_file" != "x/dev/null" && echo "updating cache $cache_file"
+ cat confcache >$cache_file
+ else
+ echo "not updating unwritable cache $cache_file"
+ fi
+fi
+rm -f confcache
+
+test "x$prefix" = xNONE && prefix=$ac_default_prefix
+# Let make expand exec_prefix.
+test "x$exec_prefix" = xNONE && exec_prefix='${prefix}'
+
+# VPATH may cause trouble with some makes, so we remove $(srcdir),
+# ${srcdir} and @srcdir@ from VPATH if srcdir is ".", strip leading and
+# trailing colons and then remove the whole line if VPATH becomes empty
+# (actually we leave an empty line to preserve line numbers).
+if test "x$srcdir" = x.; then
+ ac_vpsub='/^[ ]*VPATH[ ]*=/{
+s/:*\$(srcdir):*/:/;
+s/:*\${srcdir}:*/:/;
+s/:*@srcdir@:*/:/;
+s/^\([^=]*=[ ]*\):*/\1/;
+s/:*$//;
+s/^[^=]*=[ ]*$//;
+}'
+fi
+
+DEFS=-DHAVE_CONFIG_H
+
+ac_libobjs=
+ac_ltlibobjs=
+for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue
+ # 1. Remove the extension, and $U if already installed.
+ ac_i=`echo "$ac_i" |
+ sed 's/\$U\././;s/\.o$//;s/\.obj$//'`
+ # 2. Add them.
+ ac_libobjs="$ac_libobjs $ac_i\$U.$ac_objext"
+ ac_ltlibobjs="$ac_ltlibobjs $ac_i"'$U.lo'
+done
+LIBOBJS=$ac_libobjs
+
+LTLIBOBJS=$ac_ltlibobjs
+
+
+if test -z "${AMDEP_TRUE}" && test -z "${AMDEP_FALSE}"; then
+ { { echo "$as_me:$LINENO: error: conditional \"AMDEP\" was never defined.
+Usually this means the macro was only invoked conditionally." >&5
+echo "$as_me: error: conditional \"AMDEP\" was never defined.
+Usually this means the macro was only invoked conditionally." >&2;}
+ { (exit 1); exit 1; }; }
+fi
+if test -z "${am__fastdepCC_TRUE}" && test -z "${am__fastdepCC_FALSE}"; then
+ { { echo "$as_me:$LINENO: error: conditional \"am__fastdepCC\" was never defined.
+Usually this means the macro was only invoked conditionally." >&5
+echo "$as_me: error: conditional \"am__fastdepCC\" was never defined.
+Usually this means the macro was only invoked conditionally." >&2;}
+ { (exit 1); exit 1; }; }
+fi
+
+: ${CONFIG_STATUS=./config.status}
+ac_clean_files_save=$ac_clean_files
+ac_clean_files="$ac_clean_files $CONFIG_STATUS"
+{ echo "$as_me:$LINENO: creating $CONFIG_STATUS" >&5
+echo "$as_me: creating $CONFIG_STATUS" >&6;}
+cat >$CONFIG_STATUS <<_ACEOF
+#! $SHELL
+# Generated by $as_me.
+# Run this file to recreate the current configuration.
+# Compiler output produced by configure, useful for debugging
+# configure, is in config.log if it exists.
+
+debug=false
+ac_cs_recheck=false
+ac_cs_silent=false
+SHELL=\${CONFIG_SHELL-$SHELL}
+_ACEOF
+
+cat >>$CONFIG_STATUS <<\_ACEOF
+## --------------------- ##
+## M4sh Initialization. ##
+## --------------------- ##
+
+# Be Bourne compatible
+if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then
+ emulate sh
+ NULLCMD=:
+ # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which
+ # is contrary to our usage. Disable this feature.
+ alias -g '${1+"$@"}'='"$@"'
+elif test -n "${BASH_VERSION+set}" && (set -o posix) >/dev/null 2>&1; then
+ set -o posix
+fi
+DUALCASE=1; export DUALCASE # for MKS sh
+
+# Support unset when possible.
+if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then
+ as_unset=unset
+else
+ as_unset=false
+fi
+
+
+# Work around bugs in pre-3.0 UWIN ksh.
+$as_unset ENV MAIL MAILPATH
+PS1='$ '
+PS2='> '
+PS4='+ '
+
+# NLS nuisances.
+for as_var in \
+ LANG LANGUAGE LC_ADDRESS LC_ALL LC_COLLATE LC_CTYPE LC_IDENTIFICATION \
+ LC_MEASUREMENT LC_MESSAGES LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER \
+ LC_TELEPHONE LC_TIME
+do
+ if (set +x; test -z "`(eval $as_var=C; export $as_var) 2>&1`"); then
+ eval $as_var=C; export $as_var
+ else
+ $as_unset $as_var
+ fi
+done
+
+# Required to use basename.
+if expr a : '\(a\)' >/dev/null 2>&1; then
+ as_expr=expr
+else
+ as_expr=false
+fi
+
+if (basename /) >/dev/null 2>&1 && test "X`basename / 2>&1`" = "X/"; then
+ as_basename=basename
+else
+ as_basename=false
+fi
+
+
+# Name of the executable.
+as_me=`$as_basename "$0" ||
+$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \
+ X"$0" : 'X\(//\)$' \| \
+ X"$0" : 'X\(/\)$' \| \
+ . : '\(.\)' 2>/dev/null ||
+echo X/"$0" |
+ sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/; q; }
+ /^X\/\(\/\/\)$/{ s//\1/; q; }
+ /^X\/\(\/\).*/{ s//\1/; q; }
+ s/.*/./; q'`
+
+
+# PATH needs CR, and LINENO needs CR and PATH.
+# Avoid depending upon Character Ranges.
+as_cr_letters='abcdefghijklmnopqrstuvwxyz'
+as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ'
+as_cr_Letters=$as_cr_letters$as_cr_LETTERS
+as_cr_digits='0123456789'
+as_cr_alnum=$as_cr_Letters$as_cr_digits
+
+# The user is always right.
+if test "${PATH_SEPARATOR+set}" != set; then
+ echo "#! /bin/sh" >conf$$.sh
+ echo "exit 0" >>conf$$.sh
+ chmod +x conf$$.sh
+ if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then
+ PATH_SEPARATOR=';'
+ else
+ PATH_SEPARATOR=:
+ fi
+ rm -f conf$$.sh
+fi
+
+
+ as_lineno_1=$LINENO
+ as_lineno_2=$LINENO
+ as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null`
+ test "x$as_lineno_1" != "x$as_lineno_2" &&
+ test "x$as_lineno_3" = "x$as_lineno_2" || {
+ # Find who we are. Look in the path if we contain no path at all
+ # relative or not.
+ case $0 in
+ *[\\/]* ) as_myself=$0 ;;
+ *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break
+done
+
+ ;;
+ esac
+ # We did not find ourselves, most probably we were run as `sh COMMAND'
+ # in which case we are not to be found in the path.
+ if test "x$as_myself" = x; then
+ as_myself=$0
+ fi
+ if test ! -f "$as_myself"; then
+ { { echo "$as_me:$LINENO: error: cannot find myself; rerun with an absolute path" >&5
+echo "$as_me: error: cannot find myself; rerun with an absolute path" >&2;}
+ { (exit 1); exit 1; }; }
+ fi
+ case $CONFIG_SHELL in
+ '')
+ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for as_base in sh bash ksh sh5; do
+ case $as_dir in
+ /*)
+ if ("$as_dir/$as_base" -c '
+ as_lineno_1=$LINENO
+ as_lineno_2=$LINENO
+ as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null`
+ test "x$as_lineno_1" != "x$as_lineno_2" &&
+ test "x$as_lineno_3" = "x$as_lineno_2" ') 2>/dev/null; then
+ $as_unset BASH_ENV || test "${BASH_ENV+set}" != set || { BASH_ENV=; export BASH_ENV; }
+ $as_unset ENV || test "${ENV+set}" != set || { ENV=; export ENV; }
+ CONFIG_SHELL=$as_dir/$as_base
+ export CONFIG_SHELL
+ exec "$CONFIG_SHELL" "$0" ${1+"$@"}
+ fi;;
+ esac
+ done
+done
+;;
+ esac
+
+ # Create $as_me.lineno as a copy of $as_myself, but with $LINENO
+ # uniformly replaced by the line number. The first 'sed' inserts a
+ # line-number line before each line; the second 'sed' does the real
+ # work. The second script uses 'N' to pair each line-number line
+ # with the numbered line, and appends trailing '-' during
+ # substitution so that $LINENO is not a special case at line end.
+ # (Raja R Harinath suggested sed '=', and Paul Eggert wrote the
+ # second 'sed' script. Blame Lee E. McMahon for sed's syntax. :-)
+ sed '=' <$as_myself |
+ sed '
+ N
+ s,$,-,
+ : loop
+ s,^\(['$as_cr_digits']*\)\(.*\)[$]LINENO\([^'$as_cr_alnum'_]\),\1\2\1\3,
+ t loop
+ s,-$,,
+ s,^['$as_cr_digits']*\n,,
+ ' >$as_me.lineno &&
+ chmod +x $as_me.lineno ||
+ { { echo "$as_me:$LINENO: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&5
+echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2;}
+ { (exit 1); exit 1; }; }
+
+ # Don't try to exec as it changes $[0], causing all sort of problems
+ # (the dirname of $[0] is not the place where we might find the
+ # original and so on. Autoconf is especially sensible to this).
+ . ./$as_me.lineno
+ # Exit status is that of the last command.
+ exit
+}
+
+
+case `echo "testing\c"; echo 1,2,3`,`echo -n testing; echo 1,2,3` in
+ *c*,-n*) ECHO_N= ECHO_C='
+' ECHO_T=' ' ;;
+ *c*,* ) ECHO_N=-n ECHO_C= ECHO_T= ;;
+ *) ECHO_N= ECHO_C='\c' ECHO_T= ;;
+esac
+
+if expr a : '\(a\)' >/dev/null 2>&1; then
+ as_expr=expr
+else
+ as_expr=false
+fi
+
+rm -f conf$$ conf$$.exe conf$$.file
+echo >conf$$.file
+if ln -s conf$$.file conf$$ 2>/dev/null; then
+ # We could just check for DJGPP; but this test a) works b) is more generic
+ # and c) will remain valid once DJGPP supports symlinks (DJGPP 2.04).
+ if test -f conf$$.exe; then
+ # Don't use ln at all; we don't have any links
+ as_ln_s='cp -p'
+ else
+ as_ln_s='ln -s'
+ fi
+elif ln conf$$.file conf$$ 2>/dev/null; then
+ as_ln_s=ln
+else
+ as_ln_s='cp -p'
+fi
+rm -f conf$$ conf$$.exe conf$$.file
+
+if mkdir -p . 2>/dev/null; then
+ as_mkdir_p=:
+else
+ test -d ./-p && rmdir ./-p
+ as_mkdir_p=false
+fi
+
+as_executable_p="test -f"
+
+# Sed expression to map a string onto a valid CPP name.
+as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'"
+
+# Sed expression to map a string onto a valid variable name.
+as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'"
+
+
+# IFS
+# We need space, tab and new line, in precisely that order.
+as_nl='
+'
+IFS=" $as_nl"
+
+# CDPATH.
+$as_unset CDPATH
+
+exec 6>&1
+
+# Open the log real soon, to keep \$[0] and so on meaningful, and to
+# report actual input values of CONFIG_FILES etc. instead of their
+# values after options handling. Logging --version etc. is OK.
+exec 5>>config.log
+{
+ echo
+ sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX
+## Running $as_me. ##
+_ASBOX
+} >&5
+cat >&5 <<_CSEOF
+
+This file was extended by $as_me, which was
+generated by GNU Autoconf 2.59. Invocation command line was
+
+ CONFIG_FILES = $CONFIG_FILES
+ CONFIG_HEADERS = $CONFIG_HEADERS
+ CONFIG_LINKS = $CONFIG_LINKS
+ CONFIG_COMMANDS = $CONFIG_COMMANDS
+ $ $0 $@
+
+_CSEOF
+echo "on `(hostname || uname -n) 2>/dev/null | sed 1q`" >&5
+echo >&5
+_ACEOF
+
+# Files that config.status was made for.
+if test -n "$ac_config_files"; then
+ echo "config_files=\"$ac_config_files\"" >>$CONFIG_STATUS
+fi
+
+if test -n "$ac_config_headers"; then
+ echo "config_headers=\"$ac_config_headers\"" >>$CONFIG_STATUS
+fi
+
+if test -n "$ac_config_links"; then
+ echo "config_links=\"$ac_config_links\"" >>$CONFIG_STATUS
+fi
+
+if test -n "$ac_config_commands"; then
+ echo "config_commands=\"$ac_config_commands\"" >>$CONFIG_STATUS
+fi
+
+cat >>$CONFIG_STATUS <<\_ACEOF
+
+ac_cs_usage="\
+\`$as_me' instantiates files from templates according to the
+current configuration.
+
+Usage: $0 [OPTIONS] [FILE]...
+
+ -h, --help print this help, then exit
+ -V, --version print version number, then exit
+ -q, --quiet do not print progress messages
+ -d, --debug don't remove temporary files
+ --recheck update $as_me by reconfiguring in the same conditions
+ --file=FILE[:TEMPLATE]
+ instantiate the configuration file FILE
+ --header=FILE[:TEMPLATE]
+ instantiate the configuration header FILE
+
+Configuration files:
+$config_files
+
+Configuration headers:
+$config_headers
+
+Configuration commands:
+$config_commands
+
+Report bugs to <bug-autoconf@gnu.org>."
+_ACEOF
+
+cat >>$CONFIG_STATUS <<_ACEOF
+ac_cs_version="\\
+config.status
+configured by $0, generated by GNU Autoconf 2.59,
+ with options \\"`echo "$ac_configure_args" | sed 's/[\\""\`\$]/\\\\&/g'`\\"
+
+Copyright (C) 2003 Free Software Foundation, Inc.
+This config.status script is free software; the Free Software Foundation
+gives unlimited permission to copy, distribute and modify it."
+srcdir=$srcdir
+INSTALL="$INSTALL"
+_ACEOF
+
+cat >>$CONFIG_STATUS <<\_ACEOF
+# If no file are specified by the user, then we need to provide default
+# value. By we need to know if files were specified by the user.
+ac_need_defaults=:
+while test $# != 0
+do
+ case $1 in
+ --*=*)
+ ac_option=`expr "x$1" : 'x\([^=]*\)='`
+ ac_optarg=`expr "x$1" : 'x[^=]*=\(.*\)'`
+ ac_shift=:
+ ;;
+ -*)
+ ac_option=$1
+ ac_optarg=$2
+ ac_shift=shift
+ ;;
+ *) # This is not an option, so the user has probably given explicit
+ # arguments.
+ ac_option=$1
+ ac_need_defaults=false;;
+ esac
+
+ case $ac_option in
+ # Handling of the options.
+_ACEOF
+cat >>$CONFIG_STATUS <<\_ACEOF
+ -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r)
+ ac_cs_recheck=: ;;
+ --version | --vers* | -V )
+ echo "$ac_cs_version"; exit 0 ;;
+ --he | --h)
+ # Conflict between --help and --header
+ { { echo "$as_me:$LINENO: error: ambiguous option: $1
+Try \`$0 --help' for more information." >&5
+echo "$as_me: error: ambiguous option: $1
+Try \`$0 --help' for more information." >&2;}
+ { (exit 1); exit 1; }; };;
+ --help | --hel | -h )
+ echo "$ac_cs_usage"; exit 0 ;;
+ --debug | --d* | -d )
+ debug=: ;;
+ --file | --fil | --fi | --f )
+ $ac_shift
+ CONFIG_FILES="$CONFIG_FILES $ac_optarg"
+ ac_need_defaults=false;;
+ --header | --heade | --head | --hea )
+ $ac_shift
+ CONFIG_HEADERS="$CONFIG_HEADERS $ac_optarg"
+ ac_need_defaults=false;;
+ -q | -quiet | --quiet | --quie | --qui | --qu | --q \
+ | -silent | --silent | --silen | --sile | --sil | --si | --s)
+ ac_cs_silent=: ;;
+
+ # This is an error.
+ -*) { { echo "$as_me:$LINENO: error: unrecognized option: $1
+Try \`$0 --help' for more information." >&5
+echo "$as_me: error: unrecognized option: $1
+Try \`$0 --help' for more information." >&2;}
+ { (exit 1); exit 1; }; } ;;
+
+ *) ac_config_targets="$ac_config_targets $1" ;;
+
+ esac
+ shift
+done
+
+ac_configure_extra_args=
+
+if $ac_cs_silent; then
+ exec 6>/dev/null
+ ac_configure_extra_args="$ac_configure_extra_args --silent"
+fi
+
+_ACEOF
+cat >>$CONFIG_STATUS <<_ACEOF
+if \$ac_cs_recheck; then
+ echo "running $SHELL $0 " $ac_configure_args \$ac_configure_extra_args " --no-create --no-recursion" >&6
+ exec $SHELL $0 $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion
+fi
+
+_ACEOF
+
+cat >>$CONFIG_STATUS <<_ACEOF
+#
+# INIT-COMMANDS section.
+#
+
+AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir"
+
+_ACEOF
+
+
+
+cat >>$CONFIG_STATUS <<\_ACEOF
+for ac_config_target in $ac_config_targets
+do
+ case "$ac_config_target" in
+ # Handling of arguments.
+ "Makefile" ) CONFIG_FILES="$CONFIG_FILES Makefile" ;;
+ "templates/Makefile" ) CONFIG_FILES="$CONFIG_FILES templates/Makefile" ;;
+ "perl/Makefile" ) CONFIG_FILES="$CONFIG_FILES perl/Makefile" ;;
+ "doc/Makefile" ) CONFIG_FILES="$CONFIG_FILES doc/Makefile" ;;
+ "exec/Makefile" ) CONFIG_FILES="$CONFIG_FILES exec/Makefile" ;;
+ "doc/yaird.xml" ) CONFIG_FILES="$CONFIG_FILES doc/yaird.xml" ;;
+ "depfiles" ) CONFIG_COMMANDS="$CONFIG_COMMANDS depfiles" ;;
+ "include/config.h" ) CONFIG_HEADERS="$CONFIG_HEADERS include/config.h" ;;
+ *) { { echo "$as_me:$LINENO: error: invalid argument: $ac_config_target" >&5
+echo "$as_me: error: invalid argument: $ac_config_target" >&2;}
+ { (exit 1); exit 1; }; };;
+ esac
+done
+
+# If the user did not use the arguments to specify the items to instantiate,
+# then the envvar interface is used. Set only those that are not.
+# We use the long form for the default assignment because of an extremely
+# bizarre bug on SunOS 4.1.3.
+if $ac_need_defaults; then
+ test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files
+ test "${CONFIG_HEADERS+set}" = set || CONFIG_HEADERS=$config_headers
+ test "${CONFIG_COMMANDS+set}" = set || CONFIG_COMMANDS=$config_commands
+fi
+
+# Have a temporary directory for convenience. Make it in the build tree
+# simply because there is no reason to put it here, and in addition,
+# creating and moving files from /tmp can sometimes cause problems.
+# Create a temporary directory, and hook for its removal unless debugging.
+$debug ||
+{
+ trap 'exit_status=$?; rm -rf $tmp && exit $exit_status' 0
+ trap '{ (exit 1); exit 1; }' 1 2 13 15
+}
+
+# Create a (secure) tmp directory for tmp files.
+
+{
+ tmp=`(umask 077 && mktemp -d -q "./confstatXXXXXX") 2>/dev/null` &&
+ test -n "$tmp" && test -d "$tmp"
+} ||
+{
+ tmp=./confstat$$-$RANDOM
+ (umask 077 && mkdir $tmp)
+} ||
+{
+ echo "$me: cannot create a temporary directory in ." >&2
+ { (exit 1); exit 1; }
+}
+
+_ACEOF
+
+cat >>$CONFIG_STATUS <<_ACEOF
+
+#
+# CONFIG_FILES section.
+#
+
+# No need to generate the scripts if there are no CONFIG_FILES.
+# This happens for instance when ./config.status config.h
+if test -n "\$CONFIG_FILES"; then
+ # Protect against being on the right side of a sed subst in config.status.
+ sed 's/,@/@@/; s/@,/@@/; s/,;t t\$/@;t t/; /@;t t\$/s/[\\\\&,]/\\\\&/g;
+ s/@@/,@/; s/@@/@,/; s/@;t t\$/,;t t/' >\$tmp/subs.sed <<\\CEOF
+s,@SHELL@,$SHELL,;t t
+s,@PATH_SEPARATOR@,$PATH_SEPARATOR,;t t
+s,@PACKAGE_NAME@,$PACKAGE_NAME,;t t
+s,@PACKAGE_TARNAME@,$PACKAGE_TARNAME,;t t
+s,@PACKAGE_VERSION@,$PACKAGE_VERSION,;t t
+s,@PACKAGE_STRING@,$PACKAGE_STRING,;t t
+s,@PACKAGE_BUGREPORT@,$PACKAGE_BUGREPORT,;t t
+s,@exec_prefix@,$exec_prefix,;t t
+s,@prefix@,$prefix,;t t
+s,@program_transform_name@,$program_transform_name,;t t
+s,@bindir@,$bindir,;t t
+s,@sbindir@,$sbindir,;t t
+s,@libexecdir@,$libexecdir,;t t
+s,@datadir@,$datadir,;t t
+s,@sysconfdir@,$sysconfdir,;t t
+s,@sharedstatedir@,$sharedstatedir,;t t
+s,@localstatedir@,$localstatedir,;t t
+s,@libdir@,$libdir,;t t
+s,@includedir@,$includedir,;t t
+s,@oldincludedir@,$oldincludedir,;t t
+s,@infodir@,$infodir,;t t
+s,@mandir@,$mandir,;t t
+s,@build_alias@,$build_alias,;t t
+s,@host_alias@,$host_alias,;t t
+s,@target_alias@,$target_alias,;t t
+s,@DEFS@,$DEFS,;t t
+s,@ECHO_C@,$ECHO_C,;t t
+s,@ECHO_N@,$ECHO_N,;t t
+s,@ECHO_T@,$ECHO_T,;t t
+s,@LIBS@,$LIBS,;t t
+s,@INSTALL_PROGRAM@,$INSTALL_PROGRAM,;t t
+s,@INSTALL_SCRIPT@,$INSTALL_SCRIPT,;t t
+s,@INSTALL_DATA@,$INSTALL_DATA,;t t
+s,@CYGPATH_W@,$CYGPATH_W,;t t
+s,@PACKAGE@,$PACKAGE,;t t
+s,@VERSION@,$VERSION,;t t
+s,@ACLOCAL@,$ACLOCAL,;t t
+s,@AUTOCONF@,$AUTOCONF,;t t
+s,@AUTOMAKE@,$AUTOMAKE,;t t
+s,@AUTOHEADER@,$AUTOHEADER,;t t
+s,@MAKEINFO@,$MAKEINFO,;t t
+s,@install_sh@,$install_sh,;t t
+s,@STRIP@,$STRIP,;t t
+s,@ac_ct_STRIP@,$ac_ct_STRIP,;t t
+s,@INSTALL_STRIP_PROGRAM@,$INSTALL_STRIP_PROGRAM,;t t
+s,@mkdir_p@,$mkdir_p,;t t
+s,@AWK@,$AWK,;t t
+s,@SET_MAKE@,$SET_MAKE,;t t
+s,@am__leading_dot@,$am__leading_dot,;t t
+s,@AMTAR@,$AMTAR,;t t
+s,@am__tar@,$am__tar,;t t
+s,@am__untar@,$am__untar,;t t
+s,@INITRD_TEMPLATE@,$INITRD_TEMPLATE,;t t
+s,@PERL@,$PERL,;t t
+s,@CC@,$CC,;t t
+s,@CFLAGS@,$CFLAGS,;t t
+s,@LDFLAGS@,$LDFLAGS,;t t
+s,@CPPFLAGS@,$CPPFLAGS,;t t
+s,@ac_ct_CC@,$ac_ct_CC,;t t
+s,@EXEEXT@,$EXEEXT,;t t
+s,@OBJEXT@,$OBJEXT,;t t
+s,@DEPDIR@,$DEPDIR,;t t
+s,@am__include@,$am__include,;t t
+s,@am__quote@,$am__quote,;t t
+s,@AMDEP_TRUE@,$AMDEP_TRUE,;t t
+s,@AMDEP_FALSE@,$AMDEP_FALSE,;t t
+s,@AMDEPBACKSLASH@,$AMDEPBACKSLASH,;t t
+s,@CCDEPMODE@,$CCDEPMODE,;t t
+s,@am__fastdepCC_TRUE@,$am__fastdepCC_TRUE,;t t
+s,@am__fastdepCC_FALSE@,$am__fastdepCC_FALSE,;t t
+s,@XMLTO@,$XMLTO,;t t
+s,@LIBOBJS@,$LIBOBJS,;t t
+s,@LTLIBOBJS@,$LTLIBOBJS,;t t
+CEOF
+
+_ACEOF
+
+ cat >>$CONFIG_STATUS <<\_ACEOF
+ # Split the substitutions into bite-sized pieces for seds with
+ # small command number limits, like on Digital OSF/1 and HP-UX.
+ ac_max_sed_lines=48
+ ac_sed_frag=1 # Number of current file.
+ ac_beg=1 # First line for current file.
+ ac_end=$ac_max_sed_lines # Line after last line for current file.
+ ac_more_lines=:
+ ac_sed_cmds=
+ while $ac_more_lines; do
+ if test $ac_beg -gt 1; then
+ sed "1,${ac_beg}d; ${ac_end}q" $tmp/subs.sed >$tmp/subs.frag
+ else
+ sed "${ac_end}q" $tmp/subs.sed >$tmp/subs.frag
+ fi
+ if test ! -s $tmp/subs.frag; then
+ ac_more_lines=false
+ else
+ # The purpose of the label and of the branching condition is to
+ # speed up the sed processing (if there are no `@' at all, there
+ # is no need to browse any of the substitutions).
+ # These are the two extra sed commands mentioned above.
+ (echo ':t
+ /@[a-zA-Z_][a-zA-Z_0-9]*@/!b' && cat $tmp/subs.frag) >$tmp/subs-$ac_sed_frag.sed
+ if test -z "$ac_sed_cmds"; then
+ ac_sed_cmds="sed -f $tmp/subs-$ac_sed_frag.sed"
+ else
+ ac_sed_cmds="$ac_sed_cmds | sed -f $tmp/subs-$ac_sed_frag.sed"
+ fi
+ ac_sed_frag=`expr $ac_sed_frag + 1`
+ ac_beg=$ac_end
+ ac_end=`expr $ac_end + $ac_max_sed_lines`
+ fi
+ done
+ if test -z "$ac_sed_cmds"; then
+ ac_sed_cmds=cat
+ fi
+fi # test -n "$CONFIG_FILES"
+
+_ACEOF
+cat >>$CONFIG_STATUS <<\_ACEOF
+for ac_file in : $CONFIG_FILES; do test "x$ac_file" = x: && continue
+ # Support "outfile[:infile[:infile...]]", defaulting infile="outfile.in".
+ case $ac_file in
+ - | *:- | *:-:* ) # input from stdin
+ cat >$tmp/stdin
+ ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'`
+ ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;;
+ *:* ) ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'`
+ ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;;
+ * ) ac_file_in=$ac_file.in ;;
+ esac
+
+ # Compute @srcdir@, @top_srcdir@, and @INSTALL@ for subdirectories.
+ ac_dir=`(dirname "$ac_file") 2>/dev/null ||
+$as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+ X"$ac_file" : 'X\(//\)[^/]' \| \
+ X"$ac_file" : 'X\(//\)$' \| \
+ X"$ac_file" : 'X\(/\)' \| \
+ . : '\(.\)' 2>/dev/null ||
+echo X"$ac_file" |
+ sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; }
+ /^X\(\/\/\)[^/].*/{ s//\1/; q; }
+ /^X\(\/\/\)$/{ s//\1/; q; }
+ /^X\(\/\).*/{ s//\1/; q; }
+ s/.*/./; q'`
+ { if $as_mkdir_p; then
+ mkdir -p "$ac_dir"
+ else
+ as_dir="$ac_dir"
+ as_dirs=
+ while test ! -d "$as_dir"; do
+ as_dirs="$as_dir $as_dirs"
+ as_dir=`(dirname "$as_dir") 2>/dev/null ||
+$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+ X"$as_dir" : 'X\(//\)[^/]' \| \
+ X"$as_dir" : 'X\(//\)$' \| \
+ X"$as_dir" : 'X\(/\)' \| \
+ . : '\(.\)' 2>/dev/null ||
+echo X"$as_dir" |
+ sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; }
+ /^X\(\/\/\)[^/].*/{ s//\1/; q; }
+ /^X\(\/\/\)$/{ s//\1/; q; }
+ /^X\(\/\).*/{ s//\1/; q; }
+ s/.*/./; q'`
+ done
+ test ! -n "$as_dirs" || mkdir $as_dirs
+ fi || { { echo "$as_me:$LINENO: error: cannot create directory \"$ac_dir\"" >&5
+echo "$as_me: error: cannot create directory \"$ac_dir\"" >&2;}
+ { (exit 1); exit 1; }; }; }
+
+ ac_builddir=.
+
+if test "$ac_dir" != .; then
+ ac_dir_suffix=/`echo "$ac_dir" | sed 's,^\.[\\/],,'`
+ # A "../" for each directory in $ac_dir_suffix.
+ ac_top_builddir=`echo "$ac_dir_suffix" | sed 's,/[^\\/]*,../,g'`
+else
+ ac_dir_suffix= ac_top_builddir=
+fi
+
+case $srcdir in
+ .) # No --srcdir option. We are building in place.
+ ac_srcdir=.
+ if test -z "$ac_top_builddir"; then
+ ac_top_srcdir=.
+ else
+ ac_top_srcdir=`echo $ac_top_builddir | sed 's,/$,,'`
+ fi ;;
+ [\\/]* | ?:[\\/]* ) # Absolute path.
+ ac_srcdir=$srcdir$ac_dir_suffix;
+ ac_top_srcdir=$srcdir ;;
+ *) # Relative path.
+ ac_srcdir=$ac_top_builddir$srcdir$ac_dir_suffix
+ ac_top_srcdir=$ac_top_builddir$srcdir ;;
+esac
+
+# Do not use `cd foo && pwd` to compute absolute paths, because
+# the directories may not exist.
+case `pwd` in
+.) ac_abs_builddir="$ac_dir";;
+*)
+ case "$ac_dir" in
+ .) ac_abs_builddir=`pwd`;;
+ [\\/]* | ?:[\\/]* ) ac_abs_builddir="$ac_dir";;
+ *) ac_abs_builddir=`pwd`/"$ac_dir";;
+ esac;;
+esac
+case $ac_abs_builddir in
+.) ac_abs_top_builddir=${ac_top_builddir}.;;
+*)
+ case ${ac_top_builddir}. in
+ .) ac_abs_top_builddir=$ac_abs_builddir;;
+ [\\/]* | ?:[\\/]* ) ac_abs_top_builddir=${ac_top_builddir}.;;
+ *) ac_abs_top_builddir=$ac_abs_builddir/${ac_top_builddir}.;;
+ esac;;
+esac
+case $ac_abs_builddir in
+.) ac_abs_srcdir=$ac_srcdir;;
+*)
+ case $ac_srcdir in
+ .) ac_abs_srcdir=$ac_abs_builddir;;
+ [\\/]* | ?:[\\/]* ) ac_abs_srcdir=$ac_srcdir;;
+ *) ac_abs_srcdir=$ac_abs_builddir/$ac_srcdir;;
+ esac;;
+esac
+case $ac_abs_builddir in
+.) ac_abs_top_srcdir=$ac_top_srcdir;;
+*)
+ case $ac_top_srcdir in
+ .) ac_abs_top_srcdir=$ac_abs_builddir;;
+ [\\/]* | ?:[\\/]* ) ac_abs_top_srcdir=$ac_top_srcdir;;
+ *) ac_abs_top_srcdir=$ac_abs_builddir/$ac_top_srcdir;;
+ esac;;
+esac
+
+
+ case $INSTALL in
+ [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;;
+ *) ac_INSTALL=$ac_top_builddir$INSTALL ;;
+ esac
+
+ # Let's still pretend it is `configure' which instantiates (i.e., don't
+ # use $as_me), people would be surprised to read:
+ # /* config.h. Generated by config.status. */
+ if test x"$ac_file" = x-; then
+ configure_input=
+ else
+ configure_input="$ac_file. "
+ fi
+ configure_input=$configure_input"Generated from `echo $ac_file_in |
+ sed 's,.*/,,'` by configure."
+
+ # First look for the input files in the build tree, otherwise in the
+ # src tree.
+ ac_file_inputs=`IFS=:
+ for f in $ac_file_in; do
+ case $f in
+ -) echo $tmp/stdin ;;
+ [\\/$]*)
+ # Absolute (can't be DOS-style, as IFS=:)
+ test -f "$f" || { { echo "$as_me:$LINENO: error: cannot find input file: $f" >&5
+echo "$as_me: error: cannot find input file: $f" >&2;}
+ { (exit 1); exit 1; }; }
+ echo "$f";;
+ *) # Relative
+ if test -f "$f"; then
+ # Build tree
+ echo "$f"
+ elif test -f "$srcdir/$f"; then
+ # Source tree
+ echo "$srcdir/$f"
+ else
+ # /dev/null tree
+ { { echo "$as_me:$LINENO: error: cannot find input file: $f" >&5
+echo "$as_me: error: cannot find input file: $f" >&2;}
+ { (exit 1); exit 1; }; }
+ fi;;
+ esac
+ done` || { (exit 1); exit 1; }
+
+ if test x"$ac_file" != x-; then
+ { echo "$as_me:$LINENO: creating $ac_file" >&5
+echo "$as_me: creating $ac_file" >&6;}
+ rm -f "$ac_file"
+ fi
+_ACEOF
+cat >>$CONFIG_STATUS <<_ACEOF
+ sed "$ac_vpsub
+$extrasub
+_ACEOF
+cat >>$CONFIG_STATUS <<\_ACEOF
+:t
+/@[a-zA-Z_][a-zA-Z_0-9]*@/!b
+s,@configure_input@,$configure_input,;t t
+s,@srcdir@,$ac_srcdir,;t t
+s,@abs_srcdir@,$ac_abs_srcdir,;t t
+s,@top_srcdir@,$ac_top_srcdir,;t t
+s,@abs_top_srcdir@,$ac_abs_top_srcdir,;t t
+s,@builddir@,$ac_builddir,;t t
+s,@abs_builddir@,$ac_abs_builddir,;t t
+s,@top_builddir@,$ac_top_builddir,;t t
+s,@abs_top_builddir@,$ac_abs_top_builddir,;t t
+s,@INSTALL@,$ac_INSTALL,;t t
+" $ac_file_inputs | (eval "$ac_sed_cmds") >$tmp/out
+ rm -f $tmp/stdin
+ if test x"$ac_file" != x-; then
+ mv $tmp/out $ac_file
+ else
+ cat $tmp/out
+ rm -f $tmp/out
+ fi
+
+done
+_ACEOF
+cat >>$CONFIG_STATUS <<\_ACEOF
+
+#
+# CONFIG_HEADER section.
+#
+
+# These sed commands are passed to sed as "A NAME B NAME C VALUE D", where
+# NAME is the cpp macro being defined and VALUE is the value it is being given.
+#
+# ac_d sets the value in "#define NAME VALUE" lines.
+ac_dA='s,^\([ ]*\)#\([ ]*define[ ][ ]*\)'
+ac_dB='[ ].*$,\1#\2'
+ac_dC=' '
+ac_dD=',;t'
+# ac_u turns "#undef NAME" without trailing blanks into "#define NAME VALUE".
+ac_uA='s,^\([ ]*\)#\([ ]*\)undef\([ ][ ]*\)'
+ac_uB='$,\1#\2define\3'
+ac_uC=' '
+ac_uD=',;t'
+
+for ac_file in : $CONFIG_HEADERS; do test "x$ac_file" = x: && continue
+ # Support "outfile[:infile[:infile...]]", defaulting infile="outfile.in".
+ case $ac_file in
+ - | *:- | *:-:* ) # input from stdin
+ cat >$tmp/stdin
+ ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'`
+ ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;;
+ *:* ) ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'`
+ ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;;
+ * ) ac_file_in=$ac_file.in ;;
+ esac
+
+ test x"$ac_file" != x- && { echo "$as_me:$LINENO: creating $ac_file" >&5
+echo "$as_me: creating $ac_file" >&6;}
+
+ # First look for the input files in the build tree, otherwise in the
+ # src tree.
+ ac_file_inputs=`IFS=:
+ for f in $ac_file_in; do
+ case $f in
+ -) echo $tmp/stdin ;;
+ [\\/$]*)
+ # Absolute (can't be DOS-style, as IFS=:)
+ test -f "$f" || { { echo "$as_me:$LINENO: error: cannot find input file: $f" >&5
+echo "$as_me: error: cannot find input file: $f" >&2;}
+ { (exit 1); exit 1; }; }
+ # Do quote $f, to prevent DOS paths from being IFS'd.
+ echo "$f";;
+ *) # Relative
+ if test -f "$f"; then
+ # Build tree
+ echo "$f"
+ elif test -f "$srcdir/$f"; then
+ # Source tree
+ echo "$srcdir/$f"
+ else
+ # /dev/null tree
+ { { echo "$as_me:$LINENO: error: cannot find input file: $f" >&5
+echo "$as_me: error: cannot find input file: $f" >&2;}
+ { (exit 1); exit 1; }; }
+ fi;;
+ esac
+ done` || { (exit 1); exit 1; }
+ # Remove the trailing spaces.
+ sed 's/[ ]*$//' $ac_file_inputs >$tmp/in
+
+_ACEOF
+
+# Transform confdefs.h into two sed scripts, `conftest.defines' and
+# `conftest.undefs', that substitutes the proper values into
+# config.h.in to produce config.h. The first handles `#define'
+# templates, and the second `#undef' templates.
+# And first: Protect against being on the right side of a sed subst in
+# config.status. Protect against being in an unquoted here document
+# in config.status.
+rm -f conftest.defines conftest.undefs
+# Using a here document instead of a string reduces the quoting nightmare.
+# Putting comments in sed scripts is not portable.
+#
+# `end' is used to avoid that the second main sed command (meant for
+# 0-ary CPP macros) applies to n-ary macro definitions.
+# See the Autoconf documentation for `clear'.
+cat >confdef2sed.sed <<\_ACEOF
+s/[\\&,]/\\&/g
+s,[\\$`],\\&,g
+t clear
+: clear
+s,^[ ]*#[ ]*define[ ][ ]*\([^ (][^ (]*\)\(([^)]*)\)[ ]*\(.*\)$,${ac_dA}\1${ac_dB}\1\2${ac_dC}\3${ac_dD},gp
+t end
+s,^[ ]*#[ ]*define[ ][ ]*\([^ ][^ ]*\)[ ]*\(.*\)$,${ac_dA}\1${ac_dB}\1${ac_dC}\2${ac_dD},gp
+: end
+_ACEOF
+# If some macros were called several times there might be several times
+# the same #defines, which is useless. Nevertheless, we may not want to
+# sort them, since we want the *last* AC-DEFINE to be honored.
+uniq confdefs.h | sed -n -f confdef2sed.sed >conftest.defines
+sed 's/ac_d/ac_u/g' conftest.defines >conftest.undefs
+rm -f confdef2sed.sed
+
+# This sed command replaces #undef with comments. This is necessary, for
+# example, in the case of _POSIX_SOURCE, which is predefined and required
+# on some systems where configure will not decide to define it.
+cat >>conftest.undefs <<\_ACEOF
+s,^[ ]*#[ ]*undef[ ][ ]*[a-zA-Z_][a-zA-Z_0-9]*,/* & */,
+_ACEOF
+
+# Break up conftest.defines because some shells have a limit on the size
+# of here documents, and old seds have small limits too (100 cmds).
+echo ' # Handle all the #define templates only if necessary.' >>$CONFIG_STATUS
+echo ' if grep "^[ ]*#[ ]*define" $tmp/in >/dev/null; then' >>$CONFIG_STATUS
+echo ' # If there are no defines, we may have an empty if/fi' >>$CONFIG_STATUS
+echo ' :' >>$CONFIG_STATUS
+rm -f conftest.tail
+while grep . conftest.defines >/dev/null
+do
+ # Write a limited-size here document to $tmp/defines.sed.
+ echo ' cat >$tmp/defines.sed <<CEOF' >>$CONFIG_STATUS
+ # Speed up: don't consider the non `#define' lines.
+ echo '/^[ ]*#[ ]*define/!b' >>$CONFIG_STATUS
+ # Work around the forget-to-reset-the-flag bug.
+ echo 't clr' >>$CONFIG_STATUS
+ echo ': clr' >>$CONFIG_STATUS
+ sed ${ac_max_here_lines}q conftest.defines >>$CONFIG_STATUS
+ echo 'CEOF
+ sed -f $tmp/defines.sed $tmp/in >$tmp/out
+ rm -f $tmp/in
+ mv $tmp/out $tmp/in
+' >>$CONFIG_STATUS
+ sed 1,${ac_max_here_lines}d conftest.defines >conftest.tail
+ rm -f conftest.defines
+ mv conftest.tail conftest.defines
+done
+rm -f conftest.defines
+echo ' fi # grep' >>$CONFIG_STATUS
+echo >>$CONFIG_STATUS
+
+# Break up conftest.undefs because some shells have a limit on the size
+# of here documents, and old seds have small limits too (100 cmds).
+echo ' # Handle all the #undef templates' >>$CONFIG_STATUS
+rm -f conftest.tail
+while grep . conftest.undefs >/dev/null
+do
+ # Write a limited-size here document to $tmp/undefs.sed.
+ echo ' cat >$tmp/undefs.sed <<CEOF' >>$CONFIG_STATUS
+ # Speed up: don't consider the non `#undef'
+ echo '/^[ ]*#[ ]*undef/!b' >>$CONFIG_STATUS
+ # Work around the forget-to-reset-the-flag bug.
+ echo 't clr' >>$CONFIG_STATUS
+ echo ': clr' >>$CONFIG_STATUS
+ sed ${ac_max_here_lines}q conftest.undefs >>$CONFIG_STATUS
+ echo 'CEOF
+ sed -f $tmp/undefs.sed $tmp/in >$tmp/out
+ rm -f $tmp/in
+ mv $tmp/out $tmp/in
+' >>$CONFIG_STATUS
+ sed 1,${ac_max_here_lines}d conftest.undefs >conftest.tail
+ rm -f conftest.undefs
+ mv conftest.tail conftest.undefs
+done
+rm -f conftest.undefs
+
+cat >>$CONFIG_STATUS <<\_ACEOF
+ # Let's still pretend it is `configure' which instantiates (i.e., don't
+ # use $as_me), people would be surprised to read:
+ # /* config.h. Generated by config.status. */
+ if test x"$ac_file" = x-; then
+ echo "/* Generated by configure. */" >$tmp/config.h
+ else
+ echo "/* $ac_file. Generated by configure. */" >$tmp/config.h
+ fi
+ cat $tmp/in >>$tmp/config.h
+ rm -f $tmp/in
+ if test x"$ac_file" != x-; then
+ if diff $ac_file $tmp/config.h >/dev/null 2>&1; then
+ { echo "$as_me:$LINENO: $ac_file is unchanged" >&5
+echo "$as_me: $ac_file is unchanged" >&6;}
+ else
+ ac_dir=`(dirname "$ac_file") 2>/dev/null ||
+$as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+ X"$ac_file" : 'X\(//\)[^/]' \| \
+ X"$ac_file" : 'X\(//\)$' \| \
+ X"$ac_file" : 'X\(/\)' \| \
+ . : '\(.\)' 2>/dev/null ||
+echo X"$ac_file" |
+ sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; }
+ /^X\(\/\/\)[^/].*/{ s//\1/; q; }
+ /^X\(\/\/\)$/{ s//\1/; q; }
+ /^X\(\/\).*/{ s//\1/; q; }
+ s/.*/./; q'`
+ { if $as_mkdir_p; then
+ mkdir -p "$ac_dir"
+ else
+ as_dir="$ac_dir"
+ as_dirs=
+ while test ! -d "$as_dir"; do
+ as_dirs="$as_dir $as_dirs"
+ as_dir=`(dirname "$as_dir") 2>/dev/null ||
+$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+ X"$as_dir" : 'X\(//\)[^/]' \| \
+ X"$as_dir" : 'X\(//\)$' \| \
+ X"$as_dir" : 'X\(/\)' \| \
+ . : '\(.\)' 2>/dev/null ||
+echo X"$as_dir" |
+ sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; }
+ /^X\(\/\/\)[^/].*/{ s//\1/; q; }
+ /^X\(\/\/\)$/{ s//\1/; q; }
+ /^X\(\/\).*/{ s//\1/; q; }
+ s/.*/./; q'`
+ done
+ test ! -n "$as_dirs" || mkdir $as_dirs
+ fi || { { echo "$as_me:$LINENO: error: cannot create directory \"$ac_dir\"" >&5
+echo "$as_me: error: cannot create directory \"$ac_dir\"" >&2;}
+ { (exit 1); exit 1; }; }; }
+
+ rm -f $ac_file
+ mv $tmp/config.h $ac_file
+ fi
+ else
+ cat $tmp/config.h
+ rm -f $tmp/config.h
+ fi
+# Compute $ac_file's index in $config_headers.
+_am_stamp_count=1
+for _am_header in $config_headers :; do
+ case $_am_header in
+ $ac_file | $ac_file:* )
+ break ;;
+ * )
+ _am_stamp_count=`expr $_am_stamp_count + 1` ;;
+ esac
+done
+echo "timestamp for $ac_file" >`(dirname $ac_file) 2>/dev/null ||
+$as_expr X$ac_file : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+ X$ac_file : 'X\(//\)[^/]' \| \
+ X$ac_file : 'X\(//\)$' \| \
+ X$ac_file : 'X\(/\)' \| \
+ . : '\(.\)' 2>/dev/null ||
+echo X$ac_file |
+ sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; }
+ /^X\(\/\/\)[^/].*/{ s//\1/; q; }
+ /^X\(\/\/\)$/{ s//\1/; q; }
+ /^X\(\/\).*/{ s//\1/; q; }
+ s/.*/./; q'`/stamp-h$_am_stamp_count
+done
+_ACEOF
+cat >>$CONFIG_STATUS <<\_ACEOF
+
+#
+# CONFIG_COMMANDS section.
+#
+for ac_file in : $CONFIG_COMMANDS; do test "x$ac_file" = x: && continue
+ ac_dest=`echo "$ac_file" | sed 's,:.*,,'`
+ ac_source=`echo "$ac_file" | sed 's,[^:]*:,,'`
+ ac_dir=`(dirname "$ac_dest") 2>/dev/null ||
+$as_expr X"$ac_dest" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+ X"$ac_dest" : 'X\(//\)[^/]' \| \
+ X"$ac_dest" : 'X\(//\)$' \| \
+ X"$ac_dest" : 'X\(/\)' \| \
+ . : '\(.\)' 2>/dev/null ||
+echo X"$ac_dest" |
+ sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; }
+ /^X\(\/\/\)[^/].*/{ s//\1/; q; }
+ /^X\(\/\/\)$/{ s//\1/; q; }
+ /^X\(\/\).*/{ s//\1/; q; }
+ s/.*/./; q'`
+ { if $as_mkdir_p; then
+ mkdir -p "$ac_dir"
+ else
+ as_dir="$ac_dir"
+ as_dirs=
+ while test ! -d "$as_dir"; do
+ as_dirs="$as_dir $as_dirs"
+ as_dir=`(dirname "$as_dir") 2>/dev/null ||
+$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+ X"$as_dir" : 'X\(//\)[^/]' \| \
+ X"$as_dir" : 'X\(//\)$' \| \
+ X"$as_dir" : 'X\(/\)' \| \
+ . : '\(.\)' 2>/dev/null ||
+echo X"$as_dir" |
+ sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; }
+ /^X\(\/\/\)[^/].*/{ s//\1/; q; }
+ /^X\(\/\/\)$/{ s//\1/; q; }
+ /^X\(\/\).*/{ s//\1/; q; }
+ s/.*/./; q'`
+ done
+ test ! -n "$as_dirs" || mkdir $as_dirs
+ fi || { { echo "$as_me:$LINENO: error: cannot create directory \"$ac_dir\"" >&5
+echo "$as_me: error: cannot create directory \"$ac_dir\"" >&2;}
+ { (exit 1); exit 1; }; }; }
+
+ ac_builddir=.
+
+if test "$ac_dir" != .; then
+ ac_dir_suffix=/`echo "$ac_dir" | sed 's,^\.[\\/],,'`
+ # A "../" for each directory in $ac_dir_suffix.
+ ac_top_builddir=`echo "$ac_dir_suffix" | sed 's,/[^\\/]*,../,g'`
+else
+ ac_dir_suffix= ac_top_builddir=
+fi
+
+case $srcdir in
+ .) # No --srcdir option. We are building in place.
+ ac_srcdir=.
+ if test -z "$ac_top_builddir"; then
+ ac_top_srcdir=.
+ else
+ ac_top_srcdir=`echo $ac_top_builddir | sed 's,/$,,'`
+ fi ;;
+ [\\/]* | ?:[\\/]* ) # Absolute path.
+ ac_srcdir=$srcdir$ac_dir_suffix;
+ ac_top_srcdir=$srcdir ;;
+ *) # Relative path.
+ ac_srcdir=$ac_top_builddir$srcdir$ac_dir_suffix
+ ac_top_srcdir=$ac_top_builddir$srcdir ;;
+esac
+
+# Do not use `cd foo && pwd` to compute absolute paths, because
+# the directories may not exist.
+case `pwd` in
+.) ac_abs_builddir="$ac_dir";;
+*)
+ case "$ac_dir" in
+ .) ac_abs_builddir=`pwd`;;
+ [\\/]* | ?:[\\/]* ) ac_abs_builddir="$ac_dir";;
+ *) ac_abs_builddir=`pwd`/"$ac_dir";;
+ esac;;
+esac
+case $ac_abs_builddir in
+.) ac_abs_top_builddir=${ac_top_builddir}.;;
+*)
+ case ${ac_top_builddir}. in
+ .) ac_abs_top_builddir=$ac_abs_builddir;;
+ [\\/]* | ?:[\\/]* ) ac_abs_top_builddir=${ac_top_builddir}.;;
+ *) ac_abs_top_builddir=$ac_abs_builddir/${ac_top_builddir}.;;
+ esac;;
+esac
+case $ac_abs_builddir in
+.) ac_abs_srcdir=$ac_srcdir;;
+*)
+ case $ac_srcdir in
+ .) ac_abs_srcdir=$ac_abs_builddir;;
+ [\\/]* | ?:[\\/]* ) ac_abs_srcdir=$ac_srcdir;;
+ *) ac_abs_srcdir=$ac_abs_builddir/$ac_srcdir;;
+ esac;;
+esac
+case $ac_abs_builddir in
+.) ac_abs_top_srcdir=$ac_top_srcdir;;
+*)
+ case $ac_top_srcdir in
+ .) ac_abs_top_srcdir=$ac_abs_builddir;;
+ [\\/]* | ?:[\\/]* ) ac_abs_top_srcdir=$ac_top_srcdir;;
+ *) ac_abs_top_srcdir=$ac_abs_builddir/$ac_top_srcdir;;
+ esac;;
+esac
+
+
+ { echo "$as_me:$LINENO: executing $ac_dest commands" >&5
+echo "$as_me: executing $ac_dest commands" >&6;}
+ case $ac_dest in
+ depfiles ) test x"$AMDEP_TRUE" != x"" || for mf in $CONFIG_FILES; do
+ # Strip MF so we end up with the name of the file.
+ mf=`echo "$mf" | sed -e 's/:.*$//'`
+ # Check whether this is an Automake generated Makefile or not.
+ # We used to match only the files named `Makefile.in', but
+ # some people rename them; so instead we look at the file content.
+ # Grep'ing the first line is not enough: some people post-process
+ # each Makefile.in and add a new line on top of each file to say so.
+ # So let's grep whole file.
+ if grep '^#.*generated by automake' $mf > /dev/null 2>&1; then
+ dirpart=`(dirname "$mf") 2>/dev/null ||
+$as_expr X"$mf" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+ X"$mf" : 'X\(//\)[^/]' \| \
+ X"$mf" : 'X\(//\)$' \| \
+ X"$mf" : 'X\(/\)' \| \
+ . : '\(.\)' 2>/dev/null ||
+echo X"$mf" |
+ sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; }
+ /^X\(\/\/\)[^/].*/{ s//\1/; q; }
+ /^X\(\/\/\)$/{ s//\1/; q; }
+ /^X\(\/\).*/{ s//\1/; q; }
+ s/.*/./; q'`
+ else
+ continue
+ fi
+ # Extract the definition of DEPDIR, am__include, and am__quote
+ # from the Makefile without running `make'.
+ DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"`
+ test -z "$DEPDIR" && continue
+ am__include=`sed -n 's/^am__include = //p' < "$mf"`
+ test -z "am__include" && continue
+ am__quote=`sed -n 's/^am__quote = //p' < "$mf"`
+ # When using ansi2knr, U may be empty or an underscore; expand it
+ U=`sed -n 's/^U = //p' < "$mf"`
+ # Find all dependency output files, they are included files with
+ # $(DEPDIR) in their names. We invoke sed twice because it is the
+ # simplest approach to changing $(DEPDIR) to its actual value in the
+ # expansion.
+ for file in `sed -n "
+ s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \
+ sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g' -e 's/\$U/'"$U"'/g'`; do
+ # Make sure the directory exists.
+ test -f "$dirpart/$file" && continue
+ fdir=`(dirname "$file") 2>/dev/null ||
+$as_expr X"$file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+ X"$file" : 'X\(//\)[^/]' \| \
+ X"$file" : 'X\(//\)$' \| \
+ X"$file" : 'X\(/\)' \| \
+ . : '\(.\)' 2>/dev/null ||
+echo X"$file" |
+ sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; }
+ /^X\(\/\/\)[^/].*/{ s//\1/; q; }
+ /^X\(\/\/\)$/{ s//\1/; q; }
+ /^X\(\/\).*/{ s//\1/; q; }
+ s/.*/./; q'`
+ { if $as_mkdir_p; then
+ mkdir -p $dirpart/$fdir
+ else
+ as_dir=$dirpart/$fdir
+ as_dirs=
+ while test ! -d "$as_dir"; do
+ as_dirs="$as_dir $as_dirs"
+ as_dir=`(dirname "$as_dir") 2>/dev/null ||
+$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+ X"$as_dir" : 'X\(//\)[^/]' \| \
+ X"$as_dir" : 'X\(//\)$' \| \
+ X"$as_dir" : 'X\(/\)' \| \
+ . : '\(.\)' 2>/dev/null ||
+echo X"$as_dir" |
+ sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; }
+ /^X\(\/\/\)[^/].*/{ s//\1/; q; }
+ /^X\(\/\/\)$/{ s//\1/; q; }
+ /^X\(\/\).*/{ s//\1/; q; }
+ s/.*/./; q'`
+ done
+ test ! -n "$as_dirs" || mkdir $as_dirs
+ fi || { { echo "$as_me:$LINENO: error: cannot create directory $dirpart/$fdir" >&5
+echo "$as_me: error: cannot create directory $dirpart/$fdir" >&2;}
+ { (exit 1); exit 1; }; }; }
+
+ # echo "creating $dirpart/$file"
+ echo '# dummy' > "$dirpart/$file"
+ done
+done
+ ;;
+ esac
+done
+_ACEOF
+
+cat >>$CONFIG_STATUS <<\_ACEOF
+
+{ (exit 0); exit 0; }
+_ACEOF
+chmod +x $CONFIG_STATUS
+ac_clean_files=$ac_clean_files_save
+
+
+# configure is writing to config.log, and then calls config.status.
+# config.status does its own redirection, appending to config.log.
+# Unfortunately, on DOS this fails, as config.log is still kept open
+# by configure, so config.status won't be able to write to it; its
+# output is simply discarded. So we exec the FD to /dev/null,
+# effectively closing config.log, so it can be properly (re)opened and
+# appended to by config.status. When coming back to configure, we
+# need to make the FD available again.
+if test "$no_create" != yes; then
+ ac_cs_success=:
+ ac_config_status_args=
+ test "$silent" = yes &&
+ ac_config_status_args="$ac_config_status_args --quiet"
+ exec 5>/dev/null
+ $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false
+ exec 5>>config.log
+ # Use ||, not &&, to avoid exiting from the if with $? = 1, which
+ # would make configure fail if this is the last instruction.
+ $ac_cs_success || { (exit 1); exit 1; }
+fi
+
+
--- /dev/null
+#
+# Process this file with autoconf to produce a configure script.
+#
+
+# autoconf claims that this should be package name;
+# but it seems that the name of a randomly choosen but
+# existing file is required.
+AC_INIT(perl/main.pl)
+
+YAIRD_VERSION=0.0.5
+AM_INIT_AUTOMAKE(yaird,${YAIRD_VERSION})
+
+#
+# Required optional feature to determine which template to install.
+# Packagers are expected to put their own template in ./templates
+# before configuring, so this should not get in their way.
+# This should go away once we have option file parsing.
+#
+AC_ARG_ENABLE(template,
+ AC_HELP_STRING([--enable-template=name],[install templates/name.pm as initrd template (no default)]),
+ [
+ if test -f "templates/$enableval.pm"
+ then
+ INITRD_TEMPLATE="$enableval"
+ AC_SUBST(INITRD_TEMPLATE)
+ else
+ AC_MSG_ERROR(Template '$enableval' not found in ./templates)
+ fi
+ ],
+ [ AC_MSG_ERROR(required option --enable-template=xxx is missing) ])
+
+AC_ARG_ENABLE(nuke,
+ AC_HELP_STRING([--enable-nuke],
+ [Nuke initramfs before moving to real root]),
+ [
+ case "${enableval}" in
+ yes) enable_nuke=true ;;
+ no) enable_nuke=false ;;
+ *) AC_MSG_ERROR(bad value ${enableval} for --enable-nuke) ;;
+ esac
+ ],[
+ enable_nuke=false
+ ])
+if test "$enable_nuke" = true; then
+ AC_DEFINE(ENABLE_NUKE,1,
+ [Define to nuke initramfs before moving to real root])
+fi
+
+# Checks for programs.
+AC_PATH_PROG(PERL,perl)
+AC_PROG_CC
+
+#
+# XML formatting; unclear what processor is most widely available.
+#
+AC_PATH_PROG(XMLTO,xmlto,:)
+
+# Checks for libraries.
+# Checks for header files.
+# Checks for typedefs, structures, and compiler characteristics.
+# Checks for library functions.
+
+# Use this when we need to compile C programs.
+AM_CONFIG_HEADER(include/config.h)
+
+AC_CONFIG_FILES([
+ Makefile
+ templates/Makefile
+ perl/Makefile
+ doc/Makefile
+ exec/Makefile
+ doc/yaird.xml
+ ])
+AC_OUTPUT()
+
--- /dev/null
+#! /bin/sh
+# depcomp - compile a program generating dependencies as side-effects
+
+scriptversion=2005-02-09.22
+
+# Copyright (C) 1999, 2000, 2003, 2004, 2005 Free Software Foundation, Inc.
+
+# 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, 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., 59 Temple Place - Suite 330, Boston, MA
+# 02111-1307, USA.
+
+# As a special exception to the GNU General Public License, if you
+# distribute this file as part of a program that contains a
+# configuration script generated by Autoconf, you may include it under
+# the same distribution terms that you use for the rest of that program.
+
+# Originally written by Alexandre Oliva <oliva@dcc.unicamp.br>.
+
+case $1 in
+ '')
+ echo "$0: No command. Try \`$0 --help' for more information." 1>&2
+ exit 1;
+ ;;
+ -h | --h*)
+ cat <<\EOF
+Usage: depcomp [--help] [--version] PROGRAM [ARGS]
+
+Run PROGRAMS ARGS to compile a file, generating dependencies
+as side-effects.
+
+Environment variables:
+ depmode Dependency tracking mode.
+ source Source file read by `PROGRAMS ARGS'.
+ object Object file output by `PROGRAMS ARGS'.
+ DEPDIR directory where to store dependencies.
+ depfile Dependency file to output.
+ tmpdepfile Temporary file to use when outputing dependencies.
+ libtool Whether libtool is used (yes/no).
+
+Report bugs to <bug-automake@gnu.org>.
+EOF
+ exit $?
+ ;;
+ -v | --v*)
+ echo "depcomp $scriptversion"
+ exit $?
+ ;;
+esac
+
+if test -z "$depmode" || test -z "$source" || test -z "$object"; then
+ echo "depcomp: Variables source, object and depmode must be set" 1>&2
+ exit 1
+fi
+
+# Dependencies for sub/bar.o or sub/bar.obj go into sub/.deps/bar.Po.
+depfile=${depfile-`echo "$object" |
+ sed 's|[^\\/]*$|'${DEPDIR-.deps}'/&|;s|\.\([^.]*\)$|.P\1|;s|Pobj$|Po|'`}
+tmpdepfile=${tmpdepfile-`echo "$depfile" | sed 's/\.\([^.]*\)$/.T\1/'`}
+
+rm -f "$tmpdepfile"
+
+# Some modes work just like other modes, but use different flags. We
+# parameterize here, but still list the modes in the big case below,
+# to make depend.m4 easier to write. Note that we *cannot* use a case
+# here, because this file can only contain one case statement.
+if test "$depmode" = hp; then
+ # HP compiler uses -M and no extra arg.
+ gccflag=-M
+ depmode=gcc
+fi
+
+if test "$depmode" = dashXmstdout; then
+ # This is just like dashmstdout with a different argument.
+ dashmflag=-xM
+ depmode=dashmstdout
+fi
+
+case "$depmode" in
+gcc3)
+## gcc 3 implements dependency tracking that does exactly what
+## we want. Yay! Note: for some reason libtool 1.4 doesn't like
+## it if -MD -MP comes after the -MF stuff. Hmm.
+ "$@" -MT "$object" -MD -MP -MF "$tmpdepfile"
+ stat=$?
+ if test $stat -eq 0; then :
+ else
+ rm -f "$tmpdepfile"
+ exit $stat
+ fi
+ mv "$tmpdepfile" "$depfile"
+ ;;
+
+gcc)
+## There are various ways to get dependency output from gcc. Here's
+## why we pick this rather obscure method:
+## - Don't want to use -MD because we'd like the dependencies to end
+## up in a subdir. Having to rename by hand is ugly.
+## (We might end up doing this anyway to support other compilers.)
+## - The DEPENDENCIES_OUTPUT environment variable makes gcc act like
+## -MM, not -M (despite what the docs say).
+## - Using -M directly means running the compiler twice (even worse
+## than renaming).
+ if test -z "$gccflag"; then
+ gccflag=-MD,
+ fi
+ "$@" -Wp,"$gccflag$tmpdepfile"
+ stat=$?
+ if test $stat -eq 0; then :
+ else
+ rm -f "$tmpdepfile"
+ exit $stat
+ fi
+ rm -f "$depfile"
+ echo "$object : \\" > "$depfile"
+ alpha=ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz
+## The second -e expression handles DOS-style file names with drive letters.
+ sed -e 's/^[^:]*: / /' \
+ -e 's/^['$alpha']:\/[^:]*: / /' < "$tmpdepfile" >> "$depfile"
+## This next piece of magic avoids the `deleted header file' problem.
+## The problem is that when a header file which appears in a .P file
+## is deleted, the dependency causes make to die (because there is
+## typically no way to rebuild the header). We avoid this by adding
+## dummy dependencies for each header file. Too bad gcc doesn't do
+## this for us directly.
+ tr ' ' '
+' < "$tmpdepfile" |
+## Some versions of gcc put a space before the `:'. On the theory
+## that the space means something, we add a space to the output as
+## well.
+## Some versions of the HPUX 10.20 sed can't process this invocation
+## correctly. Breaking it into two sed invocations is a workaround.
+ sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile"
+ rm -f "$tmpdepfile"
+ ;;
+
+hp)
+ # This case exists only to let depend.m4 do its work. It works by
+ # looking at the text of this script. This case will never be run,
+ # since it is checked for above.
+ exit 1
+ ;;
+
+sgi)
+ if test "$libtool" = yes; then
+ "$@" "-Wp,-MDupdate,$tmpdepfile"
+ else
+ "$@" -MDupdate "$tmpdepfile"
+ fi
+ stat=$?
+ if test $stat -eq 0; then :
+ else
+ rm -f "$tmpdepfile"
+ exit $stat
+ fi
+ rm -f "$depfile"
+
+ if test -f "$tmpdepfile"; then # yes, the sourcefile depend on other files
+ echo "$object : \\" > "$depfile"
+
+ # Clip off the initial element (the dependent). Don't try to be
+ # clever and replace this with sed code, as IRIX sed won't handle
+ # lines with more than a fixed number of characters (4096 in
+ # IRIX 6.2 sed, 8192 in IRIX 6.5). We also remove comment lines;
+ # the IRIX cc adds comments like `#:fec' to the end of the
+ # dependency line.
+ tr ' ' '
+' < "$tmpdepfile" \
+ | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' | \
+ tr '
+' ' ' >> $depfile
+ echo >> $depfile
+
+ # The second pass generates a dummy entry for each header file.
+ tr ' ' '
+' < "$tmpdepfile" \
+ | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' -e 's/$/:/' \
+ >> $depfile
+ else
+ # The sourcefile does not contain any dependencies, so just
+ # store a dummy comment line, to avoid errors with the Makefile
+ # "include basename.Plo" scheme.
+ echo "#dummy" > "$depfile"
+ fi
+ rm -f "$tmpdepfile"
+ ;;
+
+aix)
+ # The C for AIX Compiler uses -M and outputs the dependencies
+ # in a .u file. In older versions, this file always lives in the
+ # current directory. Also, the AIX compiler puts `$object:' at the
+ # start of each line; $object doesn't have directory information.
+ # Version 6 uses the directory in both cases.
+ stripped=`echo "$object" | sed 's/\(.*\)\..*$/\1/'`
+ tmpdepfile="$stripped.u"
+ if test "$libtool" = yes; then
+ "$@" -Wc,-M
+ else
+ "$@" -M
+ fi
+ stat=$?
+
+ if test -f "$tmpdepfile"; then :
+ else
+ stripped=`echo "$stripped" | sed 's,^.*/,,'`
+ tmpdepfile="$stripped.u"
+ fi
+
+ if test $stat -eq 0; then :
+ else
+ rm -f "$tmpdepfile"
+ exit $stat
+ fi
+
+ if test -f "$tmpdepfile"; then
+ outname="$stripped.o"
+ # Each line is of the form `foo.o: dependent.h'.
+ # Do two passes, one to just change these to
+ # `$object: dependent.h' and one to simply `dependent.h:'.
+ sed -e "s,^$outname:,$object :," < "$tmpdepfile" > "$depfile"
+ sed -e "s,^$outname: \(.*\)$,\1:," < "$tmpdepfile" >> "$depfile"
+ else
+ # The sourcefile does not contain any dependencies, so just
+ # store a dummy comment line, to avoid errors with the Makefile
+ # "include basename.Plo" scheme.
+ echo "#dummy" > "$depfile"
+ fi
+ rm -f "$tmpdepfile"
+ ;;
+
+icc)
+ # Intel's C compiler understands `-MD -MF file'. However on
+ # icc -MD -MF foo.d -c -o sub/foo.o sub/foo.c
+ # ICC 7.0 will fill foo.d with something like
+ # foo.o: sub/foo.c
+ # foo.o: sub/foo.h
+ # which is wrong. We want:
+ # sub/foo.o: sub/foo.c
+ # sub/foo.o: sub/foo.h
+ # sub/foo.c:
+ # sub/foo.h:
+ # ICC 7.1 will output
+ # foo.o: sub/foo.c sub/foo.h
+ # and will wrap long lines using \ :
+ # foo.o: sub/foo.c ... \
+ # sub/foo.h ... \
+ # ...
+
+ "$@" -MD -MF "$tmpdepfile"
+ stat=$?
+ if test $stat -eq 0; then :
+ else
+ rm -f "$tmpdepfile"
+ exit $stat
+ fi
+ rm -f "$depfile"
+ # Each line is of the form `foo.o: dependent.h',
+ # or `foo.o: dep1.h dep2.h \', or ` dep3.h dep4.h \'.
+ # Do two passes, one to just change these to
+ # `$object: dependent.h' and one to simply `dependent.h:'.
+ sed "s,^[^:]*:,$object :," < "$tmpdepfile" > "$depfile"
+ # Some versions of the HPUX 10.20 sed can't process this invocation
+ # correctly. Breaking it into two sed invocations is a workaround.
+ sed 's,^[^:]*: \(.*\)$,\1,;s/^\\$//;/^$/d;/:$/d' < "$tmpdepfile" |
+ sed -e 's/$/ :/' >> "$depfile"
+ rm -f "$tmpdepfile"
+ ;;
+
+tru64)
+ # The Tru64 compiler uses -MD to generate dependencies as a side
+ # effect. `cc -MD -o foo.o ...' puts the dependencies into `foo.o.d'.
+ # At least on Alpha/Redhat 6.1, Compaq CCC V6.2-504 seems to put
+ # dependencies in `foo.d' instead, so we check for that too.
+ # Subdirectories are respected.
+ dir=`echo "$object" | sed -e 's|/[^/]*$|/|'`
+ test "x$dir" = "x$object" && dir=
+ base=`echo "$object" | sed -e 's|^.*/||' -e 's/\.o$//' -e 's/\.lo$//'`
+
+ if test "$libtool" = yes; then
+ # With Tru64 cc, shared objects can also be used to make a
+ # static library. This mecanism is used in libtool 1.4 series to
+ # handle both shared and static libraries in a single compilation.
+ # With libtool 1.4, dependencies were output in $dir.libs/$base.lo.d.
+ #
+ # With libtool 1.5 this exception was removed, and libtool now
+ # generates 2 separate objects for the 2 libraries. These two
+ # compilations output dependencies in in $dir.libs/$base.o.d and
+ # in $dir$base.o.d. We have to check for both files, because
+ # one of the two compilations can be disabled. We should prefer
+ # $dir$base.o.d over $dir.libs/$base.o.d because the latter is
+ # automatically cleaned when .libs/ is deleted, while ignoring
+ # the former would cause a distcleancheck panic.
+ tmpdepfile1=$dir.libs/$base.lo.d # libtool 1.4
+ tmpdepfile2=$dir$base.o.d # libtool 1.5
+ tmpdepfile3=$dir.libs/$base.o.d # libtool 1.5
+ tmpdepfile4=$dir.libs/$base.d # Compaq CCC V6.2-504
+ "$@" -Wc,-MD
+ else
+ tmpdepfile1=$dir$base.o.d
+ tmpdepfile2=$dir$base.d
+ tmpdepfile3=$dir$base.d
+ tmpdepfile4=$dir$base.d
+ "$@" -MD
+ fi
+
+ stat=$?
+ if test $stat -eq 0; then :
+ else
+ rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" "$tmpdepfile4"
+ exit $stat
+ fi
+
+ for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" "$tmpdepfile4"
+ do
+ test -f "$tmpdepfile" && break
+ done
+ if test -f "$tmpdepfile"; then
+ sed -e "s,^.*\.[a-z]*:,$object:," < "$tmpdepfile" > "$depfile"
+ # That's a tab and a space in the [].
+ sed -e 's,^.*\.[a-z]*:[ ]*,,' -e 's,$,:,' < "$tmpdepfile" >> "$depfile"
+ else
+ echo "#dummy" > "$depfile"
+ fi
+ rm -f "$tmpdepfile"
+ ;;
+
+#nosideeffect)
+ # This comment above is used by automake to tell side-effect
+ # dependency tracking mechanisms from slower ones.
+
+dashmstdout)
+ # Important note: in order to support this mode, a compiler *must*
+ # always write the preprocessed file to stdout, regardless of -o.
+ "$@" || exit $?
+
+ # Remove the call to Libtool.
+ if test "$libtool" = yes; then
+ while test $1 != '--mode=compile'; do
+ shift
+ done
+ shift
+ fi
+
+ # Remove `-o $object'.
+ IFS=" "
+ for arg
+ do
+ case $arg in
+ -o)
+ shift
+ ;;
+ $object)
+ shift
+ ;;
+ *)
+ set fnord "$@" "$arg"
+ shift # fnord
+ shift # $arg
+ ;;
+ esac
+ done
+
+ test -z "$dashmflag" && dashmflag=-M
+ # Require at least two characters before searching for `:'
+ # in the target name. This is to cope with DOS-style filenames:
+ # a dependency such as `c:/foo/bar' could be seen as target `c' otherwise.
+ "$@" $dashmflag |
+ sed 's:^[ ]*[^: ][^:][^:]*\:[ ]*:'"$object"'\: :' > "$tmpdepfile"
+ rm -f "$depfile"
+ cat < "$tmpdepfile" > "$depfile"
+ tr ' ' '
+' < "$tmpdepfile" | \
+## Some versions of the HPUX 10.20 sed can't process this invocation
+## correctly. Breaking it into two sed invocations is a workaround.
+ sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile"
+ rm -f "$tmpdepfile"
+ ;;
+
+dashXmstdout)
+ # This case only exists to satisfy depend.m4. It is never actually
+ # run, as this mode is specially recognized in the preamble.
+ exit 1
+ ;;
+
+makedepend)
+ "$@" || exit $?
+ # Remove any Libtool call
+ if test "$libtool" = yes; then
+ while test $1 != '--mode=compile'; do
+ shift
+ done
+ shift
+ fi
+ # X makedepend
+ shift
+ cleared=no
+ for arg in "$@"; do
+ case $cleared in
+ no)
+ set ""; shift
+ cleared=yes ;;
+ esac
+ case "$arg" in
+ -D*|-I*)
+ set fnord "$@" "$arg"; shift ;;
+ # Strip any option that makedepend may not understand. Remove
+ # the object too, otherwise makedepend will parse it as a source file.
+ -*|$object)
+ ;;
+ *)
+ set fnord "$@" "$arg"; shift ;;
+ esac
+ done
+ obj_suffix="`echo $object | sed 's/^.*\././'`"
+ touch "$tmpdepfile"
+ ${MAKEDEPEND-makedepend} -o"$obj_suffix" -f"$tmpdepfile" "$@"
+ rm -f "$depfile"
+ cat < "$tmpdepfile" > "$depfile"
+ sed '1,2d' "$tmpdepfile" | tr ' ' '
+' | \
+## Some versions of the HPUX 10.20 sed can't process this invocation
+## correctly. Breaking it into two sed invocations is a workaround.
+ sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile"
+ rm -f "$tmpdepfile" "$tmpdepfile".bak
+ ;;
+
+cpp)
+ # Important note: in order to support this mode, a compiler *must*
+ # always write the preprocessed file to stdout.
+ "$@" || exit $?
+
+ # Remove the call to Libtool.
+ if test "$libtool" = yes; then
+ while test $1 != '--mode=compile'; do
+ shift
+ done
+ shift
+ fi
+
+ # Remove `-o $object'.
+ IFS=" "
+ for arg
+ do
+ case $arg in
+ -o)
+ shift
+ ;;
+ $object)
+ shift
+ ;;
+ *)
+ set fnord "$@" "$arg"
+ shift # fnord
+ shift # $arg
+ ;;
+ esac
+ done
+
+ "$@" -E |
+ sed -n '/^# [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' |
+ sed '$ s: \\$::' > "$tmpdepfile"
+ rm -f "$depfile"
+ echo "$object : \\" > "$depfile"
+ cat < "$tmpdepfile" >> "$depfile"
+ sed < "$tmpdepfile" '/^$/d;s/^ //;s/ \\$//;s/$/ :/' >> "$depfile"
+ rm -f "$tmpdepfile"
+ ;;
+
+msvisualcpp)
+ # Important note: in order to support this mode, a compiler *must*
+ # always write the preprocessed file to stdout, regardless of -o,
+ # because we must use -o when running libtool.
+ "$@" || exit $?
+ IFS=" "
+ for arg
+ do
+ case "$arg" in
+ "-Gm"|"/Gm"|"-Gi"|"/Gi"|"-ZI"|"/ZI")
+ set fnord "$@"
+ shift
+ shift
+ ;;
+ *)
+ set fnord "$@" "$arg"
+ shift
+ shift
+ ;;
+ esac
+ done
+ "$@" -E |
+ sed -n '/^#line [0-9][0-9]* "\([^"]*\)"/ s::echo "`cygpath -u \\"\1\\"`":p' | sort | uniq > "$tmpdepfile"
+ rm -f "$depfile"
+ echo "$object : \\" > "$depfile"
+ . "$tmpdepfile" | sed 's% %\\ %g' | sed -n '/^\(.*\)$/ s:: \1 \\:p' >> "$depfile"
+ echo " " >> "$depfile"
+ . "$tmpdepfile" | sed 's% %\\ %g' | sed -n '/^\(.*\)$/ s::\1\::p' >> "$depfile"
+ rm -f "$tmpdepfile"
+ ;;
+
+none)
+ exec "$@"
+ ;;
+
+*)
+ echo "Unknown depmode $depmode" 1>&2
+ exit 1
+ ;;
+esac
+
+exit 0
+
+# Local Variables:
+# mode: shell-script
+# sh-indentation: 2
+# eval: (add-hook 'write-file-hooks 'time-stamp)
+# time-stamp-start: "scriptversion="
+# time-stamp-format: "%:y-%02m-%02d.%02H"
+# time-stamp-end: "$"
+# End:
--- /dev/null
+# Makefile.in generated by automake 1.9.5 from Makefile.am.
+# doc/Makefile. Generated from Makefile.in by configure.
+
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004, 2005 Free Software Foundation, Inc.
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+
+
+#
+# Makefile.am -- installation and packaging instructions
+# Copyright (C) 2005 Erik van Konijnenburg
+#
+# 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#
+# Quick hack of a makefile, based on dia xml documentation.
+# using the XSL sheets with xsltproc is a lot quicker than
+# using jade via db2html; the generated html also is a lot more
+# readable. On the other hand, jade's validation looks more robust.
+#
+
+srcdir = .
+top_srcdir = ..
+
+pkgdatadir = $(datadir)/yaird
+pkglibdir = $(libdir)/yaird
+pkgincludedir = $(includedir)/yaird
+top_builddir = ..
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+INSTALL = /usr/bin/install -c
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+subdir = doc
+DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in \
+ $(srcdir)/yaird.xml.in
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/configure.in
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+ $(ACLOCAL_M4)
+mkinstalldirs = $(install_sh) -d
+CONFIG_HEADER = $(top_builddir)/include/config.h
+CONFIG_CLEAN_FILES = yaird.xml
+SOURCES =
+DIST_SOURCES =
+DATA = $(noinst_DATA)
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = ${SHELL} /home/kern/bacula/k/rescue/linux/cdrom/yaird-0.0.5/missing --run aclocal-1.9
+AMDEP_FALSE = #
+AMDEP_TRUE =
+AMTAR = ${SHELL} /home/kern/bacula/k/rescue/linux/cdrom/yaird-0.0.5/missing --run tar
+AUTOCONF = ${SHELL} /home/kern/bacula/k/rescue/linux/cdrom/yaird-0.0.5/missing --run autoconf
+AUTOHEADER = ${SHELL} /home/kern/bacula/k/rescue/linux/cdrom/yaird-0.0.5/missing --run autoheader
+AUTOMAKE = ${SHELL} /home/kern/bacula/k/rescue/linux/cdrom/yaird-0.0.5/missing --run automake-1.9
+AWK = gawk
+CC = gcc
+CCDEPMODE = depmode=gcc3
+CFLAGS = -g -O2
+CPPFLAGS =
+CYGPATH_W = echo
+DEFS = -DHAVE_CONFIG_H
+DEPDIR = .deps
+ECHO_C =
+ECHO_N = -n
+ECHO_T =
+EXEEXT =
+INITRD_TEMPLATE = Fedora
+INSTALL_DATA = ${INSTALL} -m 644
+INSTALL_PROGRAM = ${INSTALL}
+INSTALL_SCRIPT = ${INSTALL}
+INSTALL_STRIP_PROGRAM = ${SHELL} $(install_sh) -c -s
+LDFLAGS =
+LIBOBJS =
+LIBS =
+LTLIBOBJS =
+MAKEINFO = ${SHELL} /home/kern/bacula/k/rescue/linux/cdrom/yaird-0.0.5/missing --run makeinfo
+OBJEXT = o
+PACKAGE = yaird
+PACKAGE_BUGREPORT =
+PACKAGE_NAME =
+PACKAGE_STRING =
+PACKAGE_TARNAME =
+PACKAGE_VERSION =
+PATH_SEPARATOR = :
+PERL = /usr/bin/perl
+SET_MAKE =
+SHELL = /bin/sh
+STRIP =
+VERSION = 0.0.5
+XMLTO = /usr/bin/xmlto
+ac_ct_CC = gcc
+ac_ct_STRIP =
+am__fastdepCC_FALSE = #
+am__fastdepCC_TRUE =
+am__include = include
+am__leading_dot = .
+am__quote =
+am__tar = ${AMTAR} chof - "$$tardir"
+am__untar = ${AMTAR} xf -
+bindir = ${exec_prefix}/bin
+build_alias =
+datadir = ${prefix}/share
+exec_prefix = ${prefix}
+host_alias =
+includedir = ${prefix}/include
+infodir = ${prefix}/info
+install_sh = /home/kern/bacula/k/rescue/linux/cdrom/yaird-0.0.5/install-sh
+libdir = ${exec_prefix}/lib
+libexecdir = ${exec_prefix}/libexec
+localstatedir = ${prefix}/var
+mandir = ${prefix}/man
+mkdir_p = mkdir -p --
+oldincludedir = /usr/include
+prefix = /usr/local
+program_transform_name = s,x,x,
+sbindir = ${exec_prefix}/sbin
+sharedstatedir = ${prefix}/com
+sysconfdir = ${prefix}/etc
+target_alias =
+noinst_DATA = yaird.html
+CLEANFILES = $(noinst_DATA)
+
+# not compiled, but must go in the tarball.
+EXTRA_DIST = \
+ authors.xml \
+ concepts.xml \
+ figures/console.dia \
+ figures/console.png \
+ input.xml \
+ intro.xml \
+ kernel.xml \
+ license.xml \
+ raid.xml \
+ security.xml \
+ shlibs.xml \
+ spec.xml \
+ tools.xml \
+ yaird.xml
+
+all: all-am
+
+.SUFFIXES:
+$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps)
+ @for dep in $?; do \
+ case '$(am__configure_deps)' in \
+ *$$dep*) \
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \
+ && exit 0; \
+ exit 1;; \
+ esac; \
+ done; \
+ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu doc/Makefile'; \
+ cd $(top_srcdir) && \
+ $(AUTOMAKE) --gnu doc/Makefile
+.PRECIOUS: Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+ @case '$?' in \
+ *config.status*) \
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+ *) \
+ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
+ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+ esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure: $(am__configure_deps)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4): $(am__aclocal_m4_deps)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+yaird.xml: $(top_builddir)/config.status $(srcdir)/yaird.xml.in
+ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@
+uninstall-info-am:
+tags: TAGS
+TAGS:
+
+ctags: CTAGS
+CTAGS:
+
+
+distdir: $(DISTFILES)
+ $(mkdir_p) $(distdir)/figures
+ @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \
+ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \
+ list='$(DISTFILES)'; for file in $$list; do \
+ case $$file in \
+ $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \
+ $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \
+ esac; \
+ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+ dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \
+ if test "$$dir" != "$$file" && test "$$dir" != "."; then \
+ dir="/$$dir"; \
+ $(mkdir_p) "$(distdir)$$dir"; \
+ else \
+ dir=''; \
+ fi; \
+ if test -d $$d/$$file; then \
+ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+ cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
+ fi; \
+ cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
+ else \
+ test -f $(distdir)/$$file \
+ || cp -p $$d/$$file $(distdir)/$$file \
+ || exit 1; \
+ fi; \
+ done
+check-am: all-am
+check: check-am
+all-am: Makefile $(DATA)
+installdirs:
+install: install-am
+install-exec: install-exec-am
+install-data: install-data-am
+uninstall: uninstall-am
+
+install-am: all-am
+ @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-am
+install-strip:
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ `test -z '$(STRIP)' || \
+ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+mostlyclean-generic:
+
+clean-generic:
+ -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES)
+
+distclean-generic:
+ -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+
+maintainer-clean-generic:
+ @echo "This command is intended for maintainers to use"
+ @echo "it deletes files that may require special tools to rebuild."
+clean: clean-am
+
+clean-am: clean-generic mostlyclean-am
+
+distclean: distclean-am
+ -rm -f Makefile
+distclean-am: clean-am distclean-generic
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+info: info-am
+
+info-am:
+
+install-data-am:
+
+install-exec-am:
+
+install-info: install-info-am
+
+install-man:
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-am
+ -rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-generic
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am: uninstall-info-am
+
+.PHONY: all all-am check check-am clean clean-generic distclean \
+ distclean-generic distdir dvi dvi-am html html-am info info-am \
+ install install-am install-data install-data-am install-exec \
+ install-exec-am install-info install-info-am install-man \
+ install-strip installcheck installcheck-am installdirs \
+ maintainer-clean maintainer-clean-generic mostlyclean \
+ mostlyclean-generic pdf pdf-am ps ps-am uninstall uninstall-am \
+ uninstall-info-am
+
+
+yaird.html: $(EXTRA_DIST)
+ $(XMLTO) xhtml-nochunks yaird.xml
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
--- /dev/null
+#
+# Makefile.am -- installation and packaging instructions
+# Copyright (C) 2005 Erik van Konijnenburg
+#
+# 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#
+# Quick hack of a makefile, based on dia xml documentation.
+# using the XSL sheets with xsltproc is a lot quicker than
+# using jade via db2html; the generated html also is a lot more
+# readable. On the other hand, jade's validation looks more robust.
+#
+
+noinst_DATA = yaird.html
+CLEANFILES = $(noinst_DATA)
+
+yaird.html: $(EXTRA_DIST)
+ $(XMLTO) xhtml-nochunks yaird.xml
+
+
+
+# not compiled, but must go in the tarball.
+EXTRA_DIST = \
+ authors.xml \
+ concepts.xml \
+ figures/console.dia \
+ figures/console.png \
+ input.xml \
+ intro.xml \
+ kernel.xml \
+ license.xml \
+ raid.xml \
+ security.xml \
+ shlibs.xml \
+ spec.xml \
+ tools.xml \
+ yaird.xml
--- /dev/null
+# Makefile.in generated by automake 1.9.5 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004, 2005 Free Software Foundation, Inc.
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+@SET_MAKE@
+
+#
+# Makefile.am -- installation and packaging instructions
+# Copyright (C) 2005 Erik van Konijnenburg
+#
+# 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#
+# Quick hack of a makefile, based on dia xml documentation.
+# using the XSL sheets with xsltproc is a lot quicker than
+# using jade via db2html; the generated html also is a lot more
+# readable. On the other hand, jade's validation looks more robust.
+#
+
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH = @srcdir@
+pkgdatadir = $(datadir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+top_builddir = ..
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+INSTALL = @INSTALL@
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+subdir = doc
+DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in \
+ $(srcdir)/yaird.xml.in
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/configure.in
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+ $(ACLOCAL_M4)
+mkinstalldirs = $(install_sh) -d
+CONFIG_HEADER = $(top_builddir)/include/config.h
+CONFIG_CLEAN_FILES = yaird.xml
+SOURCES =
+DIST_SOURCES =
+DATA = $(noinst_DATA)
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+AMDEP_FALSE = @AMDEP_FALSE@
+AMDEP_TRUE = @AMDEP_TRUE@
+AMTAR = @AMTAR@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CPPFLAGS = @CPPFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EXEEXT = @EXEEXT@
+INITRD_TEMPLATE = @INITRD_TEMPLATE@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+LDFLAGS = @LDFLAGS@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LTLIBOBJS = @LTLIBOBJS@
+MAKEINFO = @MAKEINFO@
+OBJEXT = @OBJEXT@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PERL = @PERL@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+VERSION = @VERSION@
+XMLTO = @XMLTO@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_STRIP = @ac_ct_STRIP@
+am__fastdepCC_FALSE = @am__fastdepCC_FALSE@
+am__fastdepCC_TRUE = @am__fastdepCC_TRUE@
+am__include = @am__include@
+am__leading_dot = @am__leading_dot@
+am__quote = @am__quote@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build_alias = @build_alias@
+datadir = @datadir@
+exec_prefix = @exec_prefix@
+host_alias = @host_alias@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+oldincludedir = @oldincludedir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+noinst_DATA = yaird.html
+CLEANFILES = $(noinst_DATA)
+
+# not compiled, but must go in the tarball.
+EXTRA_DIST = \
+ authors.xml \
+ concepts.xml \
+ figures/console.dia \
+ figures/console.png \
+ input.xml \
+ intro.xml \
+ kernel.xml \
+ license.xml \
+ raid.xml \
+ security.xml \
+ shlibs.xml \
+ spec.xml \
+ tools.xml \
+ yaird.xml
+
+all: all-am
+
+.SUFFIXES:
+$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps)
+ @for dep in $?; do \
+ case '$(am__configure_deps)' in \
+ *$$dep*) \
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \
+ && exit 0; \
+ exit 1;; \
+ esac; \
+ done; \
+ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu doc/Makefile'; \
+ cd $(top_srcdir) && \
+ $(AUTOMAKE) --gnu doc/Makefile
+.PRECIOUS: Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+ @case '$?' in \
+ *config.status*) \
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+ *) \
+ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
+ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+ esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure: $(am__configure_deps)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4): $(am__aclocal_m4_deps)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+yaird.xml: $(top_builddir)/config.status $(srcdir)/yaird.xml.in
+ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@
+uninstall-info-am:
+tags: TAGS
+TAGS:
+
+ctags: CTAGS
+CTAGS:
+
+
+distdir: $(DISTFILES)
+ $(mkdir_p) $(distdir)/figures
+ @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \
+ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \
+ list='$(DISTFILES)'; for file in $$list; do \
+ case $$file in \
+ $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \
+ $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \
+ esac; \
+ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+ dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \
+ if test "$$dir" != "$$file" && test "$$dir" != "."; then \
+ dir="/$$dir"; \
+ $(mkdir_p) "$(distdir)$$dir"; \
+ else \
+ dir=''; \
+ fi; \
+ if test -d $$d/$$file; then \
+ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+ cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
+ fi; \
+ cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
+ else \
+ test -f $(distdir)/$$file \
+ || cp -p $$d/$$file $(distdir)/$$file \
+ || exit 1; \
+ fi; \
+ done
+check-am: all-am
+check: check-am
+all-am: Makefile $(DATA)
+installdirs:
+install: install-am
+install-exec: install-exec-am
+install-data: install-data-am
+uninstall: uninstall-am
+
+install-am: all-am
+ @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-am
+install-strip:
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ `test -z '$(STRIP)' || \
+ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+mostlyclean-generic:
+
+clean-generic:
+ -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES)
+
+distclean-generic:
+ -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+
+maintainer-clean-generic:
+ @echo "This command is intended for maintainers to use"
+ @echo "it deletes files that may require special tools to rebuild."
+clean: clean-am
+
+clean-am: clean-generic mostlyclean-am
+
+distclean: distclean-am
+ -rm -f Makefile
+distclean-am: clean-am distclean-generic
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+info: info-am
+
+info-am:
+
+install-data-am:
+
+install-exec-am:
+
+install-info: install-info-am
+
+install-man:
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-am
+ -rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-generic
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am: uninstall-info-am
+
+.PHONY: all all-am check check-am clean clean-generic distclean \
+ distclean-generic distdir dvi dvi-am html html-am info info-am \
+ install install-am install-data install-data-am install-exec \
+ install-exec-am install-info install-info-am install-man \
+ install-strip installcheck installcheck-am installdirs \
+ maintainer-clean maintainer-clean-generic mostlyclean \
+ mostlyclean-generic pdf pdf-am ps ps-am uninstall uninstall-am \
+ uninstall-info-am
+
+
+yaird.html: $(EXTRA_DIST)
+ $(XMLTO) xhtml-nochunks yaird.xml
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
--- /dev/null
+<section id="authors-chap">
+ <title>Authors</title>
+ <para>
+ This is a place holder section.
+ <application>Yaird</application> was written by ...
+ website here ... comments to ... bug reports ...
+ </para>
+
+</section>
--- /dev/null
+<section id="concepts">
+ <title>Concepts</title>
+ <para>
+ This section discusses the basic concepts underlying
+ <application>yaird</application>.
+ </para>
+
+ <para>
+ The basic operation is simple:
+ <orderedlist>
+
+ <listitem>
+ <para>
+ make a plan to build an image,
+ </para>
+ </listitem>
+
+ <listitem>
+ <para>
+ transform the plan to a detailed description of the image,
+ </para>
+ </listitem>
+
+ <listitem>
+ <para>
+ build and pack the image.
+ </para>
+ </listitem>
+
+ </orderedlist>
+
+ </para>
+
+ <para>
+ The plan consists of a number of goals to be achieved: a loaded
+ device driver, a block special file created, a device mounted.
+ The plan does not specify details such as the exact path of the
+ <application>mknod</application> executable or the shared libraries
+ needed to run that executable.
+ </para>
+
+ <simplesect>
+ <title>Making the Plan</title>
+
+ <para>
+ The most interesting part is making the plan. At the top level,
+ the plan is governed by some ultimate goals. For now, the only
+ goal is to get a working keyboard and to mount the root file system,
+ but if we're going to support swsusp, the swap devices also need to
+ be activated. To realise the goal, subgoals need to be realised.
+ As an example, before mounting a file system, the modules containing
+ the implementation of the file system need to be loaded.
+ </para>
+
+ <para>
+ To refine the goal of loading a kernel module,
+ the <code>ModDepTab</code> module interprets
+ <filename>modules.dep</filename> for the new kernel. Given a
+ module name, this will return a list of required modules with all
+ dependencies recursively resolved. It knows about the equivalence
+ between hyphen and underscore in module names, it also knows how
+ to search for modules in the <filename>/lib/modules</filename>
+ directory.
+ </para>
+
+ <para>
+ The <code>KConfig</code> module determines if loading a
+ module can be omitted because the module is hardcoded into the
+ kernel. As an example, it is aware of the fact that the module
+ <code>ext3</code> is not needed if the new kernel configuration
+ contains <code>CONFIG_EXT3_FS=y</code>.<footnote>
+ <para>
+ Having knowledge of the relation between module names and
+ kernel defines hardcoded into <application>yaird</application>
+ is hardly elegant. Perhaps it is possible to generate this
+ mapping based on the kernel Makefiles when building the
+ kernel, but that's too complex just now.
+ </para>
+ </footnote>
+ Only a few modules are known: <application>yaird</application>
+ looks for modules such as <code>ext3</code> when that filesystem
+ is used, so it makes sense to check whether a missing module
+ is compiled in. On the other hand, hardware modules that are
+ compiled in never show up in <filename>modules.pcimap</filename>
+ and friends, so they remain completely outside the view of
+ <application>yaird</application>.
+ </para>
+
+ <para>
+ Module aliases and options as supported by
+ <application>modprobe</application> are unsupported for the moment.
+ </para>
+
+ <para>
+ Before a device as listed in <filename>/etc/fstab</filename> can be
+ mounted, that device needs to be enabled. That device could be an
+ NFS mount, a loopback mount or it could be a block device. The NFS
+ and loopback cases are not supported yet, but block devices are.
+ This support is based on a number of sources of information:
+ <orderedlist>
+
+ <listitem>
+ <para>
+ Scanning the <filename>/dev</filename> directory gives us the
+ relation between all block special files and major/minor
+ numbers.
+ </para>
+ </listitem>
+
+ <listitem>
+ <para>
+ Scanning the <filename>/sys/block</filename> directory gives us the
+ relation between all major/minor numbers and kernel names
+ such as <code>dm-0</code> or <code>sda1</code>; it
+ also gives the relation between partitions and complete
+ devices.
+ </para>
+ </listitem>
+
+ <listitem>
+ <para>
+ If there is a symlink in a <filename>/sys/block</filename>
+ subdirectory to the <filename>/sys/devices</filename>
+ directory, it also gives is the relation between a block
+ device and the underlying hardware.
+ </para>
+ </listitem>
+
+ </orderedlist>
+ </para>
+
+ <para>
+ Based on the kernel name and partition relationships of the device,
+ we determine the steps needed to activate the device. As an example,
+ to activate <code>sda1</code>, we need to activate <code>sda</code>,
+ then create a block special file for <code>sda1</code>. As
+ another example, to activate <code>dm-0</code>, our first bet is
+ to check whether this is an LVM logical
+ volume,<footnote>
+ <para>
+ It could also be an encrypted device; this case is not handled
+ yet.
+ </para>
+ </footnote> and if so activate the
+ physical volumes underlying the volume group, and finally running
+ <code>vgchange -a y</code>.
+ </para>
+ </simplesect>
+
+ <simplesect>
+ <title>Hardware Planning</title>
+
+ <para>
+ Some devices, such as <code>sdx</code> or <code>hdy</code>, are
+ expected to have underlying hardware; as an example, <code>sda</code>
+ may be backed by <code>pci0000:00/0000:00:1f.2/host0/0:0:0:0</code>.
+ This represents a hardware path, in this case a controller on the PCI
+ bus that connects to a SCSI device. In order to use the device,
+ every component on the path needs to be activated, the component
+ closest to the CPU first.
+ Based on the pathname in <filename>/sys/devices</filename> and on
+ files within the directory for the component, we can determine
+ what kind of component we're dealing with, and how to find the
+ required modules.
+ </para>
+
+ <para>
+ Finding modules closely follows the methods used in the
+ <application>hotplug</application> package, and the
+ <application>hotplug</application> approach in turn is an almost
+ literal translation of the code that the kernel uses to find a
+ driver for a newly detected piece of hardware.
+ </para>
+
+ <para>
+ For components that talk some protocol over a bus, like SCSI or
+ IDE disks or CDROMs, this is a simple hard coded selection; as an
+ example, the <code>ScsiDev</code> module knows that a SCSI device
+ with a <filename>type</filename> file containing "5" is a CDROM,
+ and that <code>sr-mod</code> is the appropriate driver.
+ </para>
+
+ <para>
+ Devices such as PCI or USB devices cannot be classified into
+ a few simple categories. These devices have properties such
+ as "Vendor", "Device" and "Class" that are visible in sysfs.
+ The source code of kernel driver modules for these devices
+ contains a table listing which combination of properties mark a
+ device that the driver is prepared to handle. When the kernel
+ is compiled, these tables are summarised in a text file such
+ as <filename>modules.pcimap</filename>. Based on this table,
+ we find a driver module needed for the device and mark it for
+ inclusion on the image.
+ </para>
+
+ <para>
+ Multiple modules can match the same hardware: as an example,
+ <code>usb-storage</code> and <code>ub</code> both match an USB
+ stick. In such cases, we load all matching modules into the
+ kernel and leave it to kernel to decide who gets to manage the
+ device. There's one complication: some modules, such as
+ <code>usb-core</code>, match any device (probably to maintain some
+ administration of their own, or to provide an ultra-generic
+ interface), but do not actually provide access to the device.
+ Such devices are weeded out by the <code>Blacklist</code> module,
+ based on information in
+ <filename>/etc/hotplug/blacklist</filename> and
+ <filename>/etc/hotplug/blacklist.d</filename>.
+ </para>
+
+ <para>
+ It turns out that the "load modules for every component in the sysfs
+ path" approach is not always sufficient: sometimes you have to load
+ siblings as well. As an example, consider a combined EHCI/UHCI
+ USB controller on a single chip. The same ports can show up as EHCI
+ or UHCI devices, different PCI functions in the same PCI slot, with
+ different sysfs directories, depending on what kind of hardware is
+ connected. Purely following the sysfs path, we would only need to load
+ the EHCI driver, but it appears that on this kind of chip, EHCI devices
+ are not reliably detected unless the UHCI driver is loaded as well.
+ For this reason, we extend the algorithm with a rule: "for PCI devices,
+ load modules for every function in the PCI slot".
+ </para>
+
+ <para>
+ That's actually a bit much: it would load all of ALSA if you have a
+ combined ISA/IDE/USB/Multimedia chipset. So we limit the above
+ to those PCI functions that provide USB ports.
+ </para>
+
+ </simplesect>
+
+ <simplesect>
+ <title>Plan Transformation</title>
+
+ <para>
+ The plan generated in the first phase is a collection of general
+ intentions, stuff like 'load this module', but it does not
+ specify exactly what files must be placed on the image and what
+ lines are to be added to the initialisation scripts.
+ </para>
+
+ <para>
+ The module <code>ActionList</code> represents this plan with a
+ list of hashes; every hash contains at least 'action' and
+ 'target', with other keys added to provide extra information
+ as needed. If two steps in the plan have identical action and
+ target, the last one is considered redundant and silently omitted.
+ </para>
+
+ <para>
+ This plan is transformed to an exact image description with
+ the help of templates. The module <code>Template</code>
+ contains a hash with for every type of action:
+ <itemizedlist>
+ <listitem>
+ <para>
+ a list of files to be copied from the mother system to the
+ image;
+ </para>
+ </listitem>
+
+ <listitem>
+ <para>
+ a list of directories to be created on the image; these do
+ not have to exist on the mother system;
+ </para>
+ </listitem>
+
+ <listitem>
+ <para>
+ a list of trees to be copied recursively from the mother
+ system to the image;
+ </para>
+ </listitem>
+
+ <listitem>
+ <para>
+ a hash, with as key the name of a script to be appended to
+ and as value that which is to be appended.
+ </para>
+ </listitem>
+ </itemizedlist>
+ All of the above are fed through HTML-Template, with the hash
+ describing this step as parameters. In practice, this looks
+ like so:
+ <programlisting>
+ insmod => {
+ files => [
+ '<TMPL_VAR NAME=target>',
+ '/sbin/insmod',
+ ],
+ directories => [],
+ trees => [],
+ scripts => {
+ '/init' => <<'//',
+ /sbin/insmod '<TMPL_VAR NAME=target>'
+//
+ },
+ },
+ </programlisting>
+ </para>
+
+ <para>
+ There are a few attributes that are available to every template:
+ <variablelist>
+
+ <varlistentry>
+ <term>
+ version
+ </term>
+ <listitem>
+ <para>
+ The kernel version we're generating an image for.
+ Useful if you want your image to include a complete copy
+ of <filename>/lib/modules/(version)/kernel</filename>.
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>
+ appVersion
+ </term>
+ <listitem>
+ <para>
+ The version of <application>yaird</application> used to
+ build the image.
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>
+ auxDir
+ </term>
+ <listitem>
+ <para>
+ The directory where <application>yaird</application>
+ keeps executables intended to go on the image, such as
+ <application>run_init</application>.
+ </para>
+ </listitem>
+ </varlistentry>
+
+ </variablelist>
+ </para>
+
+ <para>
+ Currently, there are templates for Debian and for Fedora, plus
+ a template showing how to use the older initrd approach.
+ </para>
+
+ </simplesect>
+
+ <simplesect>
+ <title>Image Generation</title>
+ <para>
+ The detailed image description consists of a collection of names of
+ files, directories, symbolic links and block or character devices,
+ plus a number of lines of shell script. The image description does
+ not contain permission or ownership information: files always have
+ mode 444, executables and directories always 555, devices always
+ mode 600,<footnote>
+ <para>
+ Having device files on the image is wrong: it will
+ break if the new kernel uses different device numbers. Mostly
+ this can be avoided by using the <filename>dev</filename>
+ files provided by sysfs, but there is a bootstrap problem:
+ the <application>mount</application> command needed to
+ access sysfs assumes <filename>/dev/null</filename> and
+ <filename>/dev/console</filename> are available.
+ </para>
+ </footnote> and everything is owned by root.
+ </para>
+
+ <para>
+ The <code>Image</code> module contains the image description and
+ can write the image to a directory. It understands about symlinks:
+ if <filename>/sbin/vgscan</filename> is added to the image and it
+ happens to be a symlink to <filename>lvmiopversion</filename>, both
+ <filename>vgscan</filename> and <filename>lvmiopversion</filename>
+ will be added to the image. Shared libraries are supported
+ via the <code>SharedLibraries</code> module, as discussed in
+ <xref linkend="shlibs"/>. Invocations of other executables are not
+ recognised automatically: if <filename>lvmiopversion</filename> executes
+ <filename>/etc/lvm-200/vgscan</filename>, the latter needs to be
+ added explicitly to the image.
+ </para>
+
+ <para>
+ The copying of complete trees to the image is influenced by the
+ copying for executables: if there is a symlink in the tree, it's
+ target is also included on the image, but if the target is a
+ directory, its contents are not copied recursively. This
+ approach avoids loops in image generation.
+ Note that the target of a symlink must exist:
+ <application>yaird</application> refuses to copy dangling links.
+ </para>
+ </simplesect>
+
+ <simplesect>
+ <title>Packing the Image</title>
+ <para>
+ The final step is packing the image in a format that the
+ bootloader can process; this is handled by the module
+ <code>Pack</code>. The following formats are supported:
+ <variablelist>
+
+ <varlistentry>
+ <term>
+ cpio
+ </term>
+ <listitem>
+ <para>
+ A zipped cpio file (new ASCII format), required for the
+ initramfs model as used in the templates for Debian and
+ Fedora.
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>
+ directory
+ </term>
+ <listitem>
+ <para>
+ An unpacked directory, good for debugging or manually
+ creating odd formats.
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>
+ cramfs
+ </term>
+ <listitem>
+ <para>
+ A cramfs filesystem, used for Debian initrd images.
+ </para>
+ </listitem>
+ </varlistentry>
+
+ </variablelist>
+ </para>
+ </simplesect>
+
+</section>
--- /dev/null
+<section id="input">
+ <title>Supporting Input Devices</title>
+
+ <para>
+ A working console and keyboard during the initial boot image execution
+ is needed to enter a password for encrypted file systems; it also
+ helps while debugging. This section discusses the kernel input
+ layer and how it can be supported during image generation.
+ </para>
+
+ <para>
+ The console is a designated terminal, where kernel output goes, and that
+ is the initial I/O device for <filename>/sbin/init</filename>. Like all
+ terminal devices, it provides a number of functions: you can read
+ and write to it, plus it has a number of <code>ioctl()</code>
+ functions to manage line buffering, interrupt characters and
+ baudrate or parity where applicable.
+ </para>
+
+ <para>
+ Terminals come in different types: it can be a VT100 or terminal
+ emulator connected via an RS232 cable, or it can be a combination
+ of a CRT and a keyboard. The keyboard can be connected via
+ USB or it can talk a byte oriented protocol via a legacy UART
+ chip.
+ </para>
+
+ <para>
+ The CRT is managed in two layers. The top layer, "virtual
+ terminal", manages a two dimensional array describing which letter
+ should go in which position of the screen. In fact, there are a
+ number of different arrays, and which one is actually visible on
+ the screen is selected by a keyboard combination.
+ Below the virtual terminals is a layer that actually places the
+ letters on the screen. This can be done a letter at a time,
+ using a VGA interface, or the letters can be painted pixel by
+ pixel, using a frame buffer.
+ </para>
+
+ <para>
+ Below the terminal concept we find the input layer. This provides a
+ unified interface to the various user input devices: mouse, keyboard,
+ PC speaker, joystick, tablet. These input devices not only
+ generate data, they can also receive input from the computer. As
+ an example, the keyboard needs computer input to operate the NUM
+ LOCK indicator. Hardware devices such as keyboards register
+ themselves with the input layer, describing their capabilities
+ (I can send relative position, have two buttons and no LEDs),
+ and the input layer assigns a handler to the hardware device.
+ The handler presents the device to upper layers, either as a char
+ special file or as the input part of a terminal device.
+ This is not a one-to-one mapping: every mouse gets its own
+ handler, but keyboard and PC speaker share a handler, so it looks
+ to userland like you have a keyboard that can do "beep".
+ </para>
+
+ <para>
+ In addition to handlers for specific type of upper layers (mouse,
+ joystick, touch screen) there is a generic handler that provides a
+ character device file such as <filename>/dev/input/event0</filename>
+ for every input device detected; input events are presented through
+ these devices in a unified format. The input layer generates
+ hotplug events for these generic event handlers; hotplug uses
+ <filename>modules.inputmap</filename> to load a module containing a
+ suitable upper layer event handler. The keyboard handler is a special
+ case that does not occur in this map, so for image generation there
+ is little to be learned from hotplug input support.
+ </para>
+
+ <para>
+ To guarantee a working console, <application>yaird</application>
+ should examine <filename>/dev/console</filename>, determine
+ whether it's RS232 or hardware directly connected to the computer,
+ and then load modules for either serial port, or for virtual
+ terminals, the input layer and any hardware underlying it.
+ Unfortunately, <filename>/dev/console</filename> does not give
+ a hint what is below the terminal interface, and unfortunately,
+ lots of input devices are legacy hardware that is hard to probe
+ and only sketchily described by sysfs in kernel 2.6.10.
+ </para>
+
+ <para>
+ This means that a guarantee for a working console cannot be made,
+ which is why distribution kernels come with components such as the
+ keyboard and serial port driver compiled into the kernel. We can
+ do something else though: provide modules for keyboard devices
+ provided the kernel provides correct information. That covers the
+ case of USB keyboards, and that's something that's not compiled
+ into distribution kernels, so that the administrator has to add
+ modules explictly in order to get the keyboard working in
+ the initial boot image.
+ </para>
+
+ <para>
+ Lets examine the sources of information we have to find which input
+ hardware we have to support.
+ <itemizedlist>
+
+ <listitem>
+ <para>
+ In <filename>/sys/class/input</filename>, all input devices
+ are enumerated. Mostly, these only contain a
+ <filename>dev</filename> file containing major/minor number,
+ but USB devices also have a <filename>device</filename>
+ symlink into <filename>/sys/devices</filename> identifying
+ the underlying hardware.
+ </para>
+ </listitem>
+
+ <listitem>
+ <para>
+ In <filename>/boot/menu/grub.lst</filename>, kernel options
+ can be defined that determine whether to use a serial line as
+ console and whether to use a frame buffer. The consequence
+ is that it is fundamentally impossible to determine by looking
+ at the hardware alone what's needed to get an image that will
+ boot without problems. This probably means we'll have to consider
+ supplying some modules in the image that will only get loaded
+ depending on kernel options.
+ </para>
+ </listitem>
+
+ <listitem>
+ <para>
+ The file <filename>/proc/bus/input/devices</filename> gives
+ a formatted overview of all known input devices; entries look
+ like this:
+ <programlisting>
+ I: Bus=0003 Vendor=413c Product=2003 Version=0100
+ N: Name="DELL DELL USB Keyboard"
+ P: Phys=usb-0000:00:1d.7-4.1/input1
+ H: Handlers=kbd event2
+ B: EV=100003
+ B: KEY=7f f0000 0 3878 d801d101 1e0000 0 0 0
+ </programlisting>
+ Here the "I" line shows identification information passed to
+ the input layer by the hardware driver that is used to look
+ up the appropiate handler. "N" is a printable name provided
+ by the hardware driver. "P" is a hint at location in a bus
+ of the device; note how this line is completely unrelated to
+ the location of the hardware in
+ <filename>/sys/devices</filename>.
+ The H (Handlers) line is obvious; The B lines specify
+ capabilities of the device, plus extra information for each
+ capability. Known capabilities include:
+ <informaltable frame='topbot'>
+ <tgroup cols='2' align='left'>
+ <thead>
+ <row>
+ <entry>Capability</entry>
+ <entry>Description</entry>
+ </row>
+ </thead>
+ <tbody>
+ <row>
+ <entry>SYN</entry>
+ <entry>Input event is completed</entry>
+ </row>
+ <row>
+ <entry>KEY</entry>
+ <entry>Key press/release event</entry>
+ </row>
+ <row>
+ <entry>REL</entry>
+ <entry>Relative measure, as in mouse movement</entry>
+ </row>
+ <row>
+ <entry>ABS</entry>
+ <entry>Absolute position, as in graphics
+ tablet</entry>
+ </row>
+ <row>
+ <entry>MSC</entry>
+ <entry>Miscelanious</entry>
+ </row>
+ <row>
+ <entry>SND</entry>
+ <entry>Beep</entry>
+ </row>
+ <row>
+ <entry>REP</entry>
+ <entry>Set hardware repeat</entry>
+ </row>
+ <row>
+ <entry>FF</entry>
+ <entry>Don't know</entry>
+ </row>
+ <row>
+ <entry>PWR</entry>
+ <entry>Power event: on/off switch pressed.</entry>
+ </row>
+ <row>
+ <entry>FF_STATUS</entry>
+ <entry>Don't know.</entry>
+ </row>
+ </tbody>
+ </tgroup>
+ </informaltable>
+ </para>
+ </listitem>
+ </itemizedlist>
+ </para>
+
+ <para>
+ Finally, let's consider some kernel configuration defines, the
+ corresponding modules and their function. This could be used as a
+ start to check whether all components required to make an
+ operational console are available on the generated image:
+ <informaltable frame='topbot'>
+ <tgroup cols='3' align='left'>
+ <thead>
+ <row>
+ <entry>Define</entry>
+ <entry>Module</entry>
+ <entry>Description</entry>
+ </row>
+ </thead>
+ <tbody valign='top'>
+
+ <row>
+ <entry>VT</entry>
+ <entry>(bool)</entry>
+ <entry>
+ Support multiple virtual terminals, irrespective of what
+ hardware is used to display letters from the virtual
+ terminal on the CRT.
+ </entry>
+ </row>
+
+ <row>
+ <entry>VT_CONSOLE</entry>
+ <entry>(bool)</entry>
+ <entry>
+ Make the VT a candidate for console output. The alternative
+ is a serial line to a VT100 or terminal emulator
+ </entry>
+ </row>
+
+ <row>
+ <entry>VGA_CONSOLE</entry>
+ <entry>(bool)</entry>
+ <entry>
+ Display a terminal on CRT using the VGA interface.
+ </entry>
+ </row>
+
+ <row>
+ <entry>FRAMEBUFFER_CONSOLE</entry>
+ <entry>fbcon</entry>
+ <entry>
+ Display a terminal on a framebuffer, painting letters a
+ pixel at a time. This has to know about fonts.
+ </entry>
+ </row>
+
+ <row>
+ <entry>FB_VESA</entry>
+ <entry>vesafb</entry>
+ <entry>
+ Implement a framebuffer based on VESA (a common standard
+ for PC graphic cards), a place where an X server or
+ the framebuffer console can write pixels to be displayed
+ on CRT.
+ There are many different framebuffer modules that
+ optimise for different graphics cards.
+ Note that while vesafb and other drivers such as intelfb
+ can be built as a module, they only function correctly
+ when built into the kernel. Most framebuffer modules
+ depend on three other modules to function correctly:
+ cfbfillrect, cfbcopyarea, cfbimgblt.
+ </entry>
+ </row>
+
+ <row>
+ <entry>ATKBD</entry>
+ <entry>atkbd</entry>
+ <entry>
+ Interpret input from a standard AT or PS/2 keyboard.
+ Other keyboards use other byte codes, see for example
+ the Acorn keyboard (rpckbd).
+ </entry>
+ </row>
+
+ <row>
+ <entry>SERIO</entry>
+ <entry>serio</entry>
+ <entry>
+ Module that manages a stream of bytes from and to an IO port.
+ It includes a kernel thread (kseriod) that handles the queue
+ needed to talk to slow ports. It is normally used for
+ dedicated IO ports talking to PS/2 mouse and keyboard,
+ but can also be interfaced to serial ports (COM1, COM2).
+ The atkbd driver uses a serio driver to communicate with
+ the keyboard.
+ </entry>
+ </row>
+
+ <row>
+ <entry>SERIO_I8042</entry>
+ <entry>i8042</entry>
+ <entry>
+ Implement a serio stream on top of the i8042 chip, the chip
+ that connects the standard AT keyboard and PS/2 mouse to
+ the computer.
+ This is legacy hardware: it's not connected via PCI but
+ directly to the 'platform bus'.
+ When a chip such as i8042 that implements
+ serio is detected, it registers itself with the input
+ layer. The input layer then lets drivers that use serio
+ (such as atkbd and psmouse) probe whether a known device
+ is connected via the chip; if such a device is found,
+ it is registered as a new input device.
+ </entry>
+ </row>
+
+ <row>
+ <entry>SERIAL_8250</entry>
+ <entry>serial</entry>
+ <entry>
+ Support for serial ports (COM1, COM2) on PC hardware.
+ Lots of other configuration options exist to support
+ multiple cards and fiddle with interrupts.
+ If compiled in rather than modular, a further option,
+ SERIAL_8250_CONSOLE, allows using the serial port as a
+ console.
+ </entry>
+ </row>
+
+ <row>
+ <entry>USB_HID</entry>
+ <entry>usbhid</entry>
+ <entry>
+ Driver for USB keyboards and mice.
+ Another define, USB_HIDINPUT, needs to be true for
+ these devices to actually work.
+ </entry>
+ </row>
+
+ <row>
+ <entry>USB_KBD</entry>
+ <entry>usbkbd</entry>
+ <entry>
+ Severely limited form of USB keyboard; uses the "boot
+ protocol". This conflicts with the complete driver.
+ </entry>
+ </row>
+
+ </tbody>
+ </tgroup>
+
+ </informaltable>
+ </para>
+
+ <para>
+ The following figure gives an example of how the various modules
+ can fit together.
+ </para>
+
+ <figure id="console-module-flow">
+ <title>
+ Module relation for common console setup
+ </title>
+ <mediaobject>
+ <imageobject>
+ <imagedata fileref="figures/console.png" format="PNG"/>
+ </imageobject>
+ </mediaobject>
+ </figure>
+
+ <para>
+ In practical terms, a first step toward a more robust boot image
+ is to support new keyboard types, such as USB keyboards.
+ The following algorithm should do that.
+
+ <orderedlist>
+
+ <listitem>
+ <para>
+ Interpret <filename>/proc/bus/input/devices</filename>.
+ </para>
+ </listitem>
+
+ <listitem>
+ <para>
+ Look for devices that have handler kbd <emphasis>and</emphasis>
+ that have buttons. Mice and the PC speaker don't match that
+ criterium, keyboards do.
+ </para>
+ </listitem>
+
+ <listitem>
+ <para>
+ You could interpret the name field of such devices if you're
+ interested in supporting legacy keyboards.
+ </para>
+ </listitem>
+
+ <listitem>
+ <para>
+ The devices that have handler 'kbd' also have a handler 'event\d',
+ where input is presented in a generalised event format;
+ look up this device in /sys/class/input/event\d/.
+ </para>
+ </listitem>
+
+ <listitem>
+ <para>
+ If it's got a device symlink, load the hardware drivers for that
+ hardware device (most likely it's usbhid plus a usb core driver).
+ </para>
+ </listitem>
+
+ <listitem>
+ <para>
+ Don't bother with a mknod, the input is handled via
+ <filename>/dev/console</filename>.
+ </para>
+ </listitem>
+
+ <listitem>
+ <para>
+ Otherwise it's presumable a legacy device; you could check for
+ the existence of
+ <filename>/sys/devices/platform/i8042/serio\d/</filename>,
+ or you could just assume the appropriate driver to be compiled in.
+ </para>
+ </listitem>
+
+ <listitem>
+ <para>
+ Implement support for
+ <filename>/etc/hotplug/blacklist</filename>,
+ since some USB keyboards publish two interfaces (full HID
+ and the limited boot protocol), the input layer makes both
+ visible in <filename>/proc/bus/input/devices</filename> and
+ the corresponding modules are mutually conflicting.
+ The blacklist is used to filter out one of these modules.
+ </para>
+ </listitem>
+
+ </orderedlist>
+ </para>
+</section>
--- /dev/null
+<section id="intro-chapter">
+ <title>Introduction</title>
+ <para>
+ <application>Yaird</application> (Yet Another mkInitRD) is an
+ application to create an initial boot image, a minimal filesystem used
+ to bring a booting Linux kernel to a level where it can access
+ the root file system and use startup scripts to bring the system
+ to the normal run level.
+ </para>
+
+ <para>
+ It differs from earlier <application>mkinitrd</application>
+ implementations in that it attempts to leverage the information in
+ sysfs to minimise the number of special cases that the application
+ has to know about, and in that it uses a template system to separate
+ the analysis of the system from the building of the image.
+ </para>
+
+ <para>
+ This document gives an overview of the design and implementation
+ of <application>Yaird</application>; see the README file for
+ usage information. This text assumes familiarity with Linux
+ system administration and the basics of hotplug and sysfs.
+ </para>
+
+ <para>
+ This document describes version &VERSION;
+ of <application>Yaird</application>.
+ This is a very rough, proof of concept, version.
+ </para>
+</section>
--- /dev/null
+<section id="kernel">
+ <title>The interface between kernel and image</title>
+
+ <para>
+ The initial boot image is supposed to load enough modules to let
+ the real root device be mounted cleanly. It starts up in a
+ <emphasis>very</emphasis> bare environment and it has to do tricky
+ stuff like juggling root filesystems; to pull that off successfully
+ it makes sense to take a close look at the environment that the
+ kernel creates for the image and what the kernel expects it to do.
+ This section contains raw design notes based on kernel 2.6.8.
+ </para>
+
+ <para>
+ The processing of the image starts even before the kernel is
+ activated. The bootloader, grub or lilo for example, reads two
+ files from the boot file system into ram: the kernel and image.
+ The bootloader somehow manages to set two variables in the kernel:
+ <code>initrd_start</code> and <code>initrd_end</code>; these variables
+ point to the copy of the image in ram. The bootloader now
+ hands over control to the kernel.
+ </para>
+
+ <para>
+ During setup, the kernel creates a special file system, rootfs.
+ This mostly reuses ramfs code, but there are a few twists: it can
+ never be mounted from userspace, there's only one copy, and it's not
+ mounted on top of anything else. The existence of rootfs means that
+ the rest of the kernel always can assume there's a place to mount
+ other file systems. It also is a place where temporary files can
+ be created during the boot sequence.
+ </para>
+
+ <para>
+ In <code>initramfs.c:populate_rootfs()</code>, there are two
+ possibilities. If the image looks like a cpio.gz file, it is
+ unpacked into rootfs. If the file <filename>/init</filename> is
+ among the files unpacked from the cpio file, the initramfs model
+ is used; otherwise we get a more complex interaction between kernel
+ and initrd, discussed in <xref linkend="initrd"/>.
+ </para>
+
+ <simplesect>
+ <title>Booting with Initramfs</title>
+ <para>
+ If the image was a cpio file, and it contains a file
+ <filename>/init</filename>, the initram model is used.
+ The kernel does some basic setup and hands over control to
+ <filename>/init</filename>; it is then up to
+ <filename>/init</filename> to make a real root available and to
+ transfer control to the <filename>/sbin/init</filename> command
+ on the real root.
+ </para>
+
+ <para>
+ The tricky part is to do that in such a way that there
+ is no way for user processes to gain access to the rootfs
+ filesystem; and in such a way that rootfs remains empty and
+ hidden under the user root file system. This is best done
+ using some C code; <application>yaird</application> uses
+ <application>run_init</application>, a small tool based on
+ <application>klibc</application>.
+ <programlisting>
+ # invoked as last command in /init, with no other processes running,
+ # as follows:
+ # exec run_init /newroot /sbin/init "$@"
+ - chdir /newroot
+ # following after lots of sanity checks and not across mounts:
+ - rm -rf /*
+ - mount --move . /
+ - chroot .
+ - chdir /
+ - open /dev/console
+ - exec /sbin/init "$@"
+ </programlisting>
+ </para>
+
+ </simplesect>
+
+ <simplesect id="initrd">
+ <title>Booting with initrd</title>
+ <para>
+ If the image was not a cpio file, the kernel copies the
+ initrd image from where ever the boot loader left it to
+ <filename>rootfs:/initrd.image</filename>, and frees the ram used
+ by the bootloader for the initrd image.
+ </para>
+
+ <para>
+ After reading initrd, the kernel does more setup to the point where
+ we have:
+ <itemizedlist>
+
+ <listitem>
+ <para>
+ working CPU and memory management
+ </para>
+ </listitem>
+
+ <listitem>
+ <para>
+ working process management
+ </para>
+ </listitem>
+
+ <listitem>
+ <para>
+ compiled in drivers activated
+ </para>
+ </listitem>
+
+ <listitem>
+ <para>
+ a number of support processes such as ksoftirqd are created.
+ (These processes have the rootfs as root; they can get a new
+ root when the <code>pivot_root()</code> system call is used.)
+ </para>
+ </listitem>
+
+ <listitem>
+ <para>
+ something like a console. <code>Console_init()</code> is
+ called before PCI or USB probes, so expect only compiled in
+ console devices to work.
+ </para>
+ </listitem>
+
+ </itemizedlist>
+ </para>
+
+ <para>
+ At this point, in <code>do_mounts.c:prepare_namespace()</code>,
+ the kernel looks for a root filesystem to mount. That root file
+ system can come from a number of places: NFS, a raid device, a plain
+ disk or an initrd. If it's an initrd, the sequence is as follows
+ (where devfs can fail if it's not compiled into the kernel)
+
+ <programlisting>
+ - mount -t devfs devfs /dev
+ - md_run_setup()
+ - process initrd
+ - umount /dev
+ - mount --move . /
+ - chroot .
+ - mount -t devfs devfs /dev
+ </programlisting>
+
+ </para>
+
+ <para>
+ Once that returns, in <code>init/main.c:init()</code>,
+ initialisation memory is freed and <filename>/sbin/init</filename>
+ is executed with <code>/dev/console</code> as file descriptor 0, 1
+ and 2. <filename>/sbin/init</filename> can be overruled with
+ an <code>init=/usr/bin/firefox</code> parameter passed to the
+ boot loader; if <filename>/sbin/init</filename> is not found,
+ <filename>/etc/init</filename> and a number of other fallbacks
+ are tried. We're in business.
+ </para>
+
+ <para>
+ The processing of initrd starts in
+ <code>do_mounts_initrd.c:initrd_load()</code>. It creates
+ <filename>rootfs:/dev/ram</filename>, then copies
+ <filename>rootfs:/initrd.image</filename> there and unlinks
+ <filename>rootfs:/initrd.image</filename>. Now we have the initrd
+ image in a block device, which is good for mounting. It calls
+ <code>handle_initrd()</code>, which does:
+
+ <programlisting>
+ # make another block special file for ram0
+ - mknod /dev/root.old b 1 0
+ # try mounting initrd with all known file systems,
+ # optionally read-only
+ - mount -t xxx /dev/root.old /root
+ - mkdir rootfs:/old
+ - cd /root
+ - mount --move . /
+ - chroot .
+ - mount -t devfs devfs /dev
+ - system ("/linuxrc");
+ - cd rootfs:/old
+ - mount --move / .
+ - cd rootfs:/
+ - chroot .
+ - umount rootfs:/old/dev
+ - ... more ...
+ </programlisting>
+
+ </para>
+
+ <para>
+ So <filename>initrd:/linuxrc</filename> runs in an environment where
+ initrd is the root, with devfs mounted if available, and rootfs is
+ invisible (except that there are open file handles to directories
+ in rootfs, needed to change back to the old environment).
+ </para>
+
+ <para>
+ Now the idea seems to have been that <filename>/linuxrc</filename>
+ would mount the real root and <code>pivot_root</code> into it, then start
+ <filename>/sbin/init</filename>. Thus, linuxrc would never return.
+ However, <code>main.c:init()</code> does some usefull stuff only
+ after linuxrc returns: freeing init memory segments and starting numa
+ policy, so in eg Debian and Fedora, <filename>/linuxrc</filename>
+ will end, and <filename>/sbin/init</filename>
+ is started by <code>main.c:init()</code>.
+ </para>
+
+ <para>
+ After linuxrc returns, the variable <code>real_root_dev</code>
+ determines what happens. This variable can be read and written
+ via <filename>/proc/sys/kernel/real-root-dev</filename>. If it
+ is 0x0100 (the device number of <filename>/dev/ram0</filename>)
+ or something equivalent, <code>handle_initrd()</code> will change
+ directory to <filename>/old</filename> and return. If it is
+ something else, <code>handle_initrd()</code> will decode it, mount
+ it as root, mount initrd as <filename>/root/initrd</filename>,
+ and again start <filename>/sbin/init</filename>. (if mounting as
+ <filename>/root/initrd</filename> fails, the block device is freed.)
+ </para>
+
+ <para>
+ Remember <code>handle_initrd()</code> was called via
+ <code>load_initrd()</code> from <code>prepare_namespace()</code>,
+ and <code>prepare_namespace()</code> ends by chrooting into the
+ current directory: <filename>rootfs:/old</filename>.
+ </para>
+
+ <para>
+ Note that <filename>rootfs:/old</filename> was move-mounted
+ from '/' after <filename>/linuxrc</filename> returned.
+ When <filename>/linuxrc</filename> started, the root was
+ initrd, but <filename>/linuxrc</filename> may have done a
+ <code>pivot_root()</code>, replacing the root with a real root,
+ say <filename>/dev/hda1</filename>.
+ </para>
+
+ <para>
+ Thus:
+ <itemizedlist>
+
+ <listitem>
+ <para>
+ <filename>/linuxrc</filename> is started with initrd
+ mounted as root.
+ </para>
+ </listitem>
+
+ <listitem>
+ <para>
+ There is working memory management, processes, compiled
+ in drivers, and stdin/out/err are connected to a console,
+ if the relevant drivers are compiled in.
+ </para>
+ </listitem>
+
+ <listitem>
+ <para>
+ Devfs may be mounted on <filename>/dev</filename>.
+ </para>
+ </listitem>
+
+ <listitem>
+ <para>
+ <filename>/linuxrc</filename> can <code>pivot_root</code>.
+ </para>
+ </listitem>
+
+ <listitem>
+ <para>
+ If you echo 0x0100 to
+ <filename>/proc/sys/kernel/real-root-dev</filename>,
+ the <code>pivot_root</code> will remain in effect after
+ <filename>/linuxrc</filename> ends.
+ </para>
+ </listitem>
+
+ <listitem>
+ <para>
+ After <filename>/linuxrc</filename> returns,
+ <filename>/dev</filename> may be unmounted and replaced
+ with devfs.
+ </para>
+ </listitem>
+
+ </itemizedlist>
+ </para>
+
+ <para>
+ Thus a good strategy for <filename>/linuxrc</filename> is to
+ do as little as possible, and defer the real initialisation
+ to <filename>/sbin/init</filename> on the initrd; this
+ <filename>/sbin/init</filename> can then <code>pivot_root</code>
+ into the real root device.
+ <programlisting>
+ #!/bin/dash
+ set -x
+ mount -nt proc proc /proc
+ # root=$(cat proc/sys/kernel/real-root-dev)
+ echo 256 > proc/sys/kernel/real-root-dev
+ umount -n /proc
+ </programlisting>
+ </para>
+
+ </simplesect>
+
+ <simplesect>
+ <title>Kernel command line parameters</title>
+ <para>
+ The kernel passes more information than just an initial file system
+ to the initrd or initramfs image; there also are the kernel boot
+ parameters. The bootloader passes these to the kernel, and the kernel
+ in turn passes them on via <filename>/proc/cmdline</filename>.
+ </para>
+
+ <para>
+ An old version of these parameters is documented in the
+ <citerefentry>
+ <!-- Sometimes I think docbook is overdoing this markup thing -->
+ <refentrytitle>bootparam</refentrytitle>
+ <manvolnum>7</manvolnum>
+ </citerefentry> manual page; more recent information is in the kernel
+ documentation file <citetitle>kernel-parameters.txt</citetitle>.
+ Mostly, these parameters are used to configure non-modular drivers,
+ and thus not very interesting to <application>yaird</application>.
+ Then there are parameters such as <code>noapic</code>, which are
+ interpreted by the kernel core and also irrelevant to
+ <application>yaird</application>.
+ Finally there are a few parameters which are used by the kernel
+ to determine how to mount the root file system.
+ </para>
+
+ <para>
+ Whether the initial image should emulate these options or ignore them
+ is open to discussion; you can make a case that the flexibility these
+ options offer has become irrelevant now that initrd/initramfs offers
+ far more fine grained control over the way in which the system
+ is booted.
+ Support for these options is mostly a matter of tuning the
+ distribution specific templates, but it is possible that the
+ templates need an occassional hint from the planner.
+ To find out just how much "mostly" is, we'll try to implement
+ full support for these options and see where we run into
+ limitations.
+ An inventarisation of relevant options.
+ <variablelist>
+
+ <varlistentry>
+ <term>
+ ide
+ </term>
+ <listitem>
+ <para>
+ These are options for the modular ide-core driver.
+ This could be supported by adding an attribute
+ "isIdeCore" to insmod actions, and expanding the ide
+ kernel options only for insmod actions where that
+ attribute is true.
+ It seems cleaner to support the options from
+ <filename>/etc/modprobe.conf</filename>.
+ Unsupported for now.
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>
+ init
+ </term>
+ <listitem>
+ <para>
+ The first program to be started on the definitive root device,
+ default <filename>/sbin/init</filename>. Supported.
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>
+ ro
+ </term>
+ <listitem>
+ <para>
+ Mount the definitive root device read only,
+ so that it can be submitted to <application>fsck</application>.
+ Supported; this is the default behaviour.
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>
+ rw
+ </term>
+ <listitem>
+ <para>
+ Three guesses. Supported.
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>
+ resume, noresume
+ </term>
+ <listitem>
+ <para>
+ Which device (not) to use for software suspend.
+ To be done.
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>
+ root
+ </term>
+ <listitem>
+ <para>
+ The device to mount as root. This is a nasty one:
+ the planner by default only creates device nodes
+ that are needed to mount the root device, and even
+ if you were to put hotplug on the inital image
+ to create all possible device nodes, there's still
+ the matter of putting support for the proper file system
+ on the initial image.
+ We could make an option to
+ <application>yaird</application> to specify a list
+ of possible root devices and load the necessary
+ modules for all of them.
+ Unsupported until there's a clear need for it.
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>
+ rootflags
+ </term>
+ <listitem>
+ <para>
+ Flags to use while mounting root file system.
+ Implement together with root option.
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>
+ rootfstype
+ </term>
+ <listitem>
+ <para>
+ File system type for root file system.
+ Implement together with root option.
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>
+ nfsaddrs
+ </term>
+ <listitem>
+ <para>
+ For diskless booting.
+ Unclear whether we need this. NFS booting is desirable,
+ but I guess that will mostly be done under control of
+ DHCP. Unsupported for now.
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>
+ nfsroot
+ </term>
+ <listitem>
+ <para>
+ More diskless booting.
+ Unsupported for now.
+ </para>
+ </listitem>
+ </varlistentry>
+
+ </variablelist>
+
+ </para>
+ </simplesect>
+</section>
--- /dev/null
+<section id="license-chapter">
+ <title>License</title>
+ <para>
+ This program is free software; you can redistribute it and/or
+ modify it under the terms of the <citetitle>GNU General Public
+ License</citetitle> as published by the Free Software Foundation;
+ either version 2 of the License, or (at your option) any later
+ version.
+ </para>
+ <para>
+ 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
+ <citetitle>GNU General Public License</citetitle> for more details.
+ </para>
+ <para>
+ You should have received a copy of the <citetitle>GNU General Public
+ License</citetitle> along with this program; you may also obtain
+ a copy of the <citetitle>GNU General Public License</citetitle>
+ from the Free Software Foundation by visiting <ulink type="http"
+ url="http://www.fsf.org">their Web site</ulink> or by writing to
+ <address>
+ Free Software Foundation, Inc.
+ <street>59 Temple Place</street> - Suite 330
+ <city>Boston</city>, <state>MA</state> <postcode>02111-1307</postcode>
+ <country>USA</country>
+ </address>
+ </para>
+ <simplesect>
+ <title>Klibc code</title>
+ <para>
+ Yaird contains code based on klibc; this code is made available
+ by the author under the following licence. The relevant source
+ files have this copyright notice included.
+ <programlisting>
+/* ----------------------------------------------------------------------- *
+ *
+ * Copyright 2004 H. Peter Anvin - All Rights Reserved
+ *
+ * Permission is hereby granted, free of charge, to any person
+ * obtaining a copy of this software and associated documentation
+ * files (the "Software"), to deal in the Software without
+ * restriction, including without limitation the rights to use,
+ * copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom
+ * the Software is furnished to do so, subject to the following
+ * conditions:
+ *
+ * The above copyright notice and this permission notice shall
+ * be included in all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
+ * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
+ * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+ * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+ * OTHER DEALINGS IN THE SOFTWARE.
+ *
+ * ----------------------------------------------------------------------- */
+ </programlisting>
+ </para>
+ </simplesect>
+</section>
--- /dev/null
+<section id="raid">
+ <title>Supporting Raid Devices</title>
+
+ <para>
+ This section discusses software raid devices from an initial boot
+ image perspective: how to get the root device up and running.
+ There are other aspects to consider, the bootloader for example:
+ if your root device is on a mirror for reliability, it would be
+ a disappointment if after the crash you still had a long downtime
+ because the MBR was only available on the crashed disk. Then there's
+ the issue of managing raid devices in combination with hotplugging:
+ once the system is operational, how should the raid devices that
+ the initial image left untouched be brought online?
+ </para>
+
+ <para>
+ Raid devices are managed via ioctls (mostly; there is something
+ called "autorun" in the kernel)
+ The interface from userland is simple: mknod a block device file,
+ send an ioctl to it specifying the devnos of the underlying block
+ devices and whether you'd like mirroring or striping, then send
+ a final ioctl to activate the device. This leaves the managing
+ application free to pick any unused device (minor) number and
+ has no assumptions about device file names.
+ </para>
+
+ <para>
+ Devices that take part in a raid set also have a "superblock",
+ a header at the end of the device that contains a uuid and indicates
+ how many drives and spares are supposed to take part in the raid set.
+ This can be used be the kernel to do consistency checking, it can also
+ be used by applications to scan for all disks belonging in a raid set,
+ even if one of the component drives is moved to another disk controller.
+ </para>
+
+ <para>
+ The fact that the superblock is at the end of a device has an obvious
+ advantage: if you somehow loose your raid software, the device
+ underlying a mirror can be mounted directly as a fallback measure.
+ </para>
+
+ <para>
+ If raid is compiled into the kernel rather than provided as a module,
+ the kernel uses superblocks at boot time to find raid sets and make
+ them available without user interaction. In this case the filename of
+ the created blockdevice is hardcoded: <filename>/dev/md\d</filename>.
+ This feature is intended for machines with root on a raid device
+ that don't use an initial boot image. This autorun feature is
+ also accessible via an ioctl, but it's not used in management
+ applications, since it won't work with an initial boot image and
+ it can be a nuisance if some daemon brought a raid set online just
+ after the administator took it off line for replacement.
+ </para>
+
+ <para>
+ Finally, by picking a different major device number for the raid device,
+ the raid device can be made partitionable without use of LVM.
+ </para>
+
+ <para>
+ There are at least three different raid management applications
+ for Linux: raidtools, the oldest; mdadm, more modern; and EVMS, a
+ suite of graphical and command line tools that manages not only raid
+ but also LVM, partitioning and file system formating. We'll only
+ consider mdadm for now. The use of mdadm is simple:
+ </para>
+
+ <para>
+ <itemizedlist>
+ <listitem>
+ <para>
+ There's an option to create a new device from components,
+ building the superblock.
+ </para>
+ </listitem>
+
+ <listitem>
+ <para>
+ Another option assembles a raid device from components,
+ assuming the superblocks are already available.
+ </para>
+ </listitem>
+
+ <listitem>
+ <para>
+ Optionally, a configuration file can be used, specifying which
+ components make up a device, whether a device file should
+ be created or it is assumed to exist, whether it's stripe or
+ mirror, and the uuid. Also, a wildcard pattern can be given:
+ disks matching this pattern will be searched for superblocks.
+ </para>
+ </listitem>
+
+ <listitem>
+ <para>
+ Information given in the configuration file can be omitted
+ on the command line. If there's a wildcard, you don't even
+ have to specify the component devices of the raid device.
+ A typical command is <code>mdadm --assemble /dev/md-root
+ auto=md uuid=...</code>, which translates to "create
+ <filename>/dev/md-root</filename> with some unused minor number,
+ and put the components with matching uuid in it."
+ </para>
+ </listitem>
+
+ </itemizedlist>
+ </para>
+
+ <para>
+ So far, raid devices look fairly simple to use; the complications
+ arise when you have to play nicely with all the other software
+ on the box. It turns out there are quite a lot of packages that
+ interact with raid devices:
+ </para>
+
+ <para>
+ <itemizedlist>
+
+ <listitem>
+ <para>
+ When the md module is loaded, it registers 256 block devices
+ with <application>devfs</application>. These devices
+ are not actually allocated, they're just names set up to
+ allocate the underlying device when opened. These names in
+ <application>devfs</application> have no counterpart in sysfs.
+ </para>
+ </listitem>
+
+ <listitem>
+ <para>
+ When the LVM <application>vgchange</application> is started,
+ it opens all md devices to scan for headers, only to find the
+ raid devices have no underlying components and will return
+ no data. In this process, all these stillborn md devices get
+ registered with sysfs.
+ </para>
+ </listitem>
+
+ <listitem>
+ <para>
+ When <application>udevstart</application> is executed
+ at boot time, it walks over the sysfs tree and lets
+ <application>udev</application> create block devices files for
+ every block device it finds in sysfs. The name and permissions
+ of the created file are configurable, and there is a hook to
+ initialise SELinux access controls.
+ </para>
+ </listitem>
+
+ <listitem>
+ <para>
+ When <application>mdadm</application> is invoked with the auto
+ option, it will create a block device file with an unused
+ device number and put the requested raid volume under it.
+ The created device file is owned by whoever executed the
+ <application>mdadm</application> command, permissions are 0600
+ and there are no hooks for SELinux.
+ </para>
+ </listitem>
+
+ <listitem>
+ <para>
+ When the Debian installer builds a system with LVM and raid, the
+ raid volumes have names such as <filename>/dev/md0</filename>,
+ where there is an assumption about the device minor number in
+ the name of the file.
+ </para>
+ </listitem>
+
+ </itemizedlist>
+ </para>
+
+ <para>
+ For the current Debian mkinitrd, this all works together in
+ a wonderful manner: devfs creates file names for raid devices,
+ LVM scans them with as side effect entering the devices in sysfs,
+ and after pivotroot <application>udevstart</application> triggers
+ udev into creating block device files with proper permissions and
+ SELinux hooks. Later in the processing of <filename>rcS.d</filename>,
+ <application>mdadm</application> will put a raid device under the
+ created special file. Convoluted but correct, except for the fact
+ that out of 256 generated raid device files, up to 255 are unused.
+ </para>
+
+ <para>
+ In <application>yaird</application>, we do not use devfs.
+ Instead, we do a <application>mknod</application> before the
+ <application>mdadm</application>, taking care to use the same
+ device number that's in use in the running kernel. We expect
+ <filename>mdadm.conf</filename> to contain an <code>auto=md</code>
+ option for any raid device files that need to be created.
+ This approach should work regardless of whether the fstab uses
+ <filename>/dev/md\d</filename> or a device number independent name.
+ </para>
+
+</section>
--- /dev/null
+<section id="security">
+ <title>Security</title>
+
+ <para>
+ This section discusses security: avoiding downtime, avoiding revealing
+ sensitive information, avoiding unwanted modifications to the data;
+ either through accident or malice.
+ A good introduction to secure programming can be found in
+ <ulink url="http://www.dwheeler.com/secure-programs/Secure-Programs-HOWTO/">
+ <citetitle>
+ Secure Programming for Linux and Unix HOWTO</citetitle></ulink>.
+ </para>
+
+ <para>
+ For <application>yaird</application>, security is not very
+ complicated: although it runs with root privileges, the program is
+ not setuid, and all external input comes from files or programs
+ installed by the admnistrator, so our main focus is on avoiding
+ downtime caused by ignored error codes.
+ A full blown risk assessment would be overkill, so we'll just use
+ the HOWTO as a checklist to verify that the basic precautions are
+ in place.
+ </para>
+
+ <para>
+ <informaltable frame='topbot'>
+ <tgroup cols='3' align='left'>
+ <thead>
+ <row>
+ <entry>Group</entry>
+ <entry>Mitigation</entry>
+ <entry>Status</entry>
+ </row>
+ </thead>
+ <tbody valign='top'>
+
+ <row>
+ <entry>Bad input</entry>
+ <entry>Verify command line</entry>
+ <entry>
+ Yes.
+ </entry>
+ </row>
+
+ <row>
+ <entry>Bad input</entry>
+ <entry>Verify and clean up environment</entry>
+ <entry>
+ Complete environment is reset at start of program.
+ </entry>
+ </row>
+
+ <row>
+ <entry>Bad input</entry>
+ <entry>Avoid assumptions about file descriptors</entry>
+ <entry>
+ Handled by perl.
+ </entry>
+ </row>
+
+ <row>
+ <entry>Bad input</entry>
+ <entry>Verify file names</entry>
+ <entry>
+ Perl taint check shows filenames are verified for
+ absence of odd characters before passing to
+ subprocesses.
+ TODO: examine UTF-8 impact.
+ </entry>
+ </row>
+
+ <row>
+ <entry>Bad input</entry>
+ <entry>Verify file content</entry>
+ <entry>
+ File contents in sysfs verified.
+ Fstab entries properly quoted.
+ TODO: check for spaces in names of LVM volume or of
+ modules; could end up in generated /sbin/init.
+ </entry>
+ </row>
+
+ <row>
+ <entry>Bad input</entry>
+ <entry>Verify locale settings</entry>
+ <entry>
+ All locale related environment variables are wiped at
+ program startup.
+ </entry>
+ </row>
+
+ <row>
+ <entry>Bad input</entry>
+ <entry>Verify character encoding</entry>
+ <entry>
+ All IO is byte oriented.
+ </entry>
+ </row>
+
+ <row>
+ <entry>Bad input</entry>
+ <entry>Buffer overflow</entry>
+ <entry>
+ In perl?
+ </entry>
+ </row>
+
+ <row>
+ <entry>Program structure</entry>
+ <entry>Separate data and control</entry>
+ <entry>
+ Under this heading, the HOWTO discusses the dangers of
+ auto-executing macros in data files. The closest thing we
+ have to a data file are the templates that tune the image
+ to the distribution. We use a templating language that
+ does not allow code embedding, and the image generation
+ module does not make it possible for template output to
+ end up outside of the image. Conclusion: broken templates
+ can produce a broken image, but cannot affect the running
+ system.
+ </entry>
+ </row>
+
+ <row>
+ <entry>Program structure</entry>
+ <entry>Minimize privileges</entry>
+ <entry>
+ The user is supposed to bring his own root privileges to
+ the party, not much to be done here. A related issue
+ is the minimizing of privileges in the system that is
+ started with the generated image. This would include
+ starting SELinux at the earliest possible moment.
+ At least in Fedora, that earliest possible moment is
+ in <filename>rc.sysinit</filename>, well past the moment
+ where the initial boot image hands over control to the newly
+ mount root file system. No <application>yaird</application>
+ support needed.
+ </entry>
+ </row>
+
+ <row>
+ <entry>Program structure</entry>
+ <entry>Safe defaults</entry>
+ <entry>
+ Configuration only specifies sources of information,
+ like /etc/hotplug, not much can go wrong here.
+ </entry>
+ </row>
+
+ <row>
+ <entry>Program structure</entry>
+ <entry>Safe configuration</entry>
+ <entry>
+ No configuration file is used yet, so it's not read from
+ current directory either.
+ </entry>
+ </row>
+
+ <row>
+ <entry>Program structure</entry>
+ <entry>Fail safe</entry>
+ <entry>
+ Planning and writing the image is separated;
+ writing only starts after planning is succesfully completed.
+ Todo: consider backout on write failure.
+ </entry>
+ </row>
+
+ <row>
+ <entry>Program structure</entry>
+ <entry>Avoid race conditions</entry>
+ <entry>
+ Temporary files and directories are created
+ with the <code>File::Temp</code> module, which is
+ resistant to name guessing attacks.
+ The completed image is installed with <code>rename</code>
+ rather than <code>link</code>; if an existing file is
+ overwritten, this guarantees there's no race where the
+ old image has been deleted bu the new one is not yet in
+ place. (Note that there is no option in place yet which
+ allows overwriting of existing files.)
+ To do: examine File::Temp safe_level=HIGH.
+ </entry>
+ </row>
+
+ <row>
+ <entry>Underlying resources</entry>
+ <entry>Handle meta characters</entry>
+ <entry>
+ Protection against terminal escape sequences in output
+ is not yet in place.
+ </entry>
+ </row>
+
+ <row>
+ <entry>Underlying resources</entry>
+ <entry>Check system call results</entry>
+ <entry>
+ Yes.
+ </entry>
+ </row>
+
+ <row>
+ <entry>Language specific</entry>
+ <entry>Verify perl behaviour with taint.</entry>
+ <entry>
+ Yes.
+ </entry>
+ </row>
+
+ <row>
+ <entry>Language specific</entry>
+ <entry>Avoid perl open magic with 3rd argument.</entry>
+ <entry>
+ Yes.
+ </entry>
+ </row>
+
+ </tbody>
+ </tgroup>
+ </informaltable>
+ </para>
+
+</section>
--- /dev/null
+<section id="shlibs">
+ <title>Supporting Shared Libraries</title>
+
+ <para>
+ When an executable is added to the image, we want any required shared
+ libraries to be added automatically. The <code>SharedLibraries</code>
+ module determines which files are required. This section discusses
+ the features of kernel and compiler we need to be aware of in order
+ to do this reliably.
+ </para>
+
+ <para>
+ Linux executables today are in ELF format; it is defined in
+ <ulink url="http://www.linuxbase.org/spec/book/ELF-generic/ELF-generic.html">
+ <citetitle>
+ Generic ELF Specification ELFVERSION</citetitle></ulink>,
+ part of the Linux Standard Base. This is based on part of the System
+ V ABI: Tool Interface Standard (TIS), Executable and Linking Format
+ (ELF) Sepcification
+ </para>
+
+ <para>
+ ELF has consequences in different parts of the system: in
+ the link-editor, that needs to merge ELF object files into ELF
+ executables; in the kernel (<filename>fs/binfmt_elf.c</filename>),
+ that has to place the executable in RAM and transfer control to it,
+ and in the runtime loader, that is invoked when starting the
+ application to load the necessary shared libraries into RAM.
+ The idea is as follows.
+ </para>
+
+ <itemizedlist>
+ <listitem>
+ <para>
+ Executables are in ELF format, with a type of either
+ <code>ET_EXEC</code> (executable) or <code>ET_DYN</code> (shared
+ library; yes, you can execute those.) There are other types of
+ ELF file (core files for example) but you can't execute them.
+ </para>
+ </listitem>
+
+ <listitem>
+ <para>
+ These files contain two kind of headers: program headers and
+ section headers. Program headers define segments of the file that
+ the kernel should store consequetively in RAM; section headers define
+ parts of the file that should be treated by the link editor
+ as a single unit. Program headers normally point to a group
+ of adjacent sections.
+ </para>
+ </listitem>
+
+ <listitem>
+ <para>
+ The program may be statically linked or dynamically (with shared
+ libraries).
+ If it's statically linked, the kernel loads relevant segments,
+ then transfers control to main() in userland.
+ </para>
+ </listitem>
+
+ <listitem>
+ <para>
+ If it's dynamically linked, one of the program headers has type
+ <code>PT_INTERP</code>. It points to a segment that contains
+ the name of a (static) executable; this executable is loaded in
+ RAM together with the segments of the dynamic executable.
+ </para>
+ </listitem>
+
+ <listitem>
+ <para>
+ The kernel then transfers control to the userland
+ interpreter, passing program headers and related info in a
+ fourth argument to <code>main()</code>, after <code>envp</code>.
+ </para>
+ </listitem>
+
+ <listitem>
+ <para>
+ There's one interesting twist: one of the segments loaded
+ into RAM (<filename>linux-gate.so</filename>) does not
+ come from the executable, but is a piece of kernel mapped
+ into user space. It contains a subroutine that the kernel
+ provides to do a system call; the idea is that this way,
+ the C library does not have to know which calling convention
+ for system calls is supported by the kernel and optimal for
+ the current hardware. The link editor knows nothing about
+ this, only the interpreter knows that the kernel can pass the
+ address of this subroutine together with the program headers.
+ <footnote>
+ <para>
+ For more info on the kernel-supplied shared library for
+ system calls, see
+
+ <ulink url="http://lwn.net/Articles/18411/">
+ <citetitle>LWN: How to speed up system calls</citetitle></ulink>,
+ <ulink url="http://lwn.net/Articles/30258/">
+ <citetitle>LWN: Patch: i386 vsyscall DSO implementation</citetitle></ulink>,
+ <ulink url="http://www.uwsg.iu.edu/hypermail/linux/kernel/0306.2/0674.html">
+ <citetitle>LKML: common name for the kernel DSO</citetitle></ulink>.
+ </para>
+ </footnote>
+ </para>
+ </listitem>
+
+ <listitem>
+ <para>
+ The interpreter interprets the <code>.dynamic</code> section of
+ the dynamic executable. This is a table containing various types
+ of info; if the type is <code>DT_NEEDED</code>, the info is the
+ name of a shared library that is needed to run the executable.
+ Normally, it's the basename.
+ </para>
+ </listitem>
+
+ <listitem>
+ <para>
+ The interpreter searches <code>LD_LIBARY_PATH</code> for the
+ library and loads the first working version it finds, using a
+ breath-first search. Once everything is loaded, the interpreter
+ hands over control to main in the executable.
+ </para>
+ </listitem>
+
+ <listitem>
+ <para>
+ Except that that's not how it really works: the path that glibc
+ uses depends on whether threads are supported, and klibc can
+ function as a <code>PT_INTERP</code> but will not load additional
+ libraries.
+ </para>
+ </listitem>
+ </itemizedlist>
+
+ <para>
+ The <application>ldd</application> command finds the pathnames
+ of shared libraries used by an executable. This works
+ <emphasis>only</emphasis> for glibc: it invokes the interpreter
+ with the executable as argument plus an environment variable that
+ tells it to print the pathnames rather than load them. For other
+ C libraries, there's no guaranteed correct way to find the path of
+ shared libraries.
+ </para>
+
+ <para>
+ Thus, to figure out what goes on the initial ram image, first try
+ <application>ldd</application>. If that gives an answer, good.
+ Otherwise, use a helper program to find <code>PT_INTERP</code> and
+ <code>DT_NEEDED</code>. If there's only <code>PT_INTERP</code>, good,
+ add it to the image. If there are <code>DT_NEEDED</code> libraries
+ as well, and they have relative rather than absolute pathnames,
+ we can't determine the full path, so don't generate an image.
+ </para>
+
+ <para>
+ There are a number of options to build a helper to extract the relevant
+ information from the executable:
+ <itemizedlist>
+ <listitem>
+ <para>
+ Build it in perl. The problem here is that unpacking 64-bit
+ integers is an optional part of the language.
+ </para>
+ </listitem>
+
+ <listitem>
+ <para>
+ Build a wrapper around <application>objdump</application> or
+ <application>readelf</application>. The drawback is that
+ there programs are not part of a minimal Linux distribution:
+ depending on them in <application>yaird</application> would
+ increase the footprint.
+ </para>
+ </listitem>
+
+ <listitem>
+ <para>
+ Building a C program using libbdf. This is a library
+ intended to simplify working with object files. Drawbacks
+ are that it adds complexity that is not necessary in our
+ context since it supports multiple executable formats;
+ furthermore, at least in Debian it is treated as internal
+ to the gcc tool chain, complicating packaging the tool.
+ </para>
+ </listitem>
+
+ <listitem>
+ <para>
+ Building a C program based on <filename>elf.h</filename>.
+ This turns out to be easy to do.
+ </para>
+ </listitem>
+
+ </itemizedlist>
+ </para>
+
+ <para>
+ <application>Yaird</application> uses the last appraoch listed.
+ </para>
+</section>
--- /dev/null
+<section id="spec">
+ <title>Goals, features, to do</title>
+ <para>
+ The purpose in life of a tool like <application>Yaird</application>
+ is to produce an initial boot image that loads the required modules
+ to allow a booting kernel to access the root file system and from
+ there use the startup scripts to get to the default run level.
+ This means that hardly any drivers need to be compiled into the kernel
+ itself, so a distribution can produce a kernel with a large amount of
+ modules that will run unchanged on practically any hardware, without
+ introducing a large number of unused drivers that would waste RAM.
+ In a sense, the initial boot image customises the kernel to the hardware
+ it happens to be running on.
+ </para>
+
+ <para>
+ That purpose still leaves a lot of room to optimise for different
+ goals: as an example, you could attempt to make the generated
+ image as small as possible, or you could attempt to make the
+ generated image so flexible that it will boot on any hardware.
+ This chapter discusses the goals that determined the design, the
+ resulting features, and what's still left to do.
+ </para>
+
+ <para>
+ The goals<footnote>
+ <para>
+ Well, not really. I started this thingy to show off a small
+ algorithm to find required modules based on sysfs information.
+ To make that a credible demonstration, the small algorithm
+ turned out to need a lot of scaffolding to turn it into a
+ working program ...
+ </para>
+ </footnote>
+ of <application>Yaird</application> are as follows:
+ <itemizedlist>
+
+ <listitem>
+ <para>
+ Be free, as in GPL.
+ </para>
+ </listitem>
+
+ <listitem>
+ <para>
+ Be maintainable. Small functions with documented arguments
+ and result are better than a shell script full of constructs
+ like <code>eval "awk | bash | tac 3>&7"</code>.
+ </para>
+ </listitem>
+
+ <listitem>
+ <para>
+ Be secure and reliable. The application should stop with an error
+ message at the slightest provocation, rather than run the
+ risk of producing a non-booting initrd image.
+ The application should not open loopholes that allow the 'bad
+ guys' to modify the image, gain access to raw devices or
+ overwrite system files.
+ </para>
+ </listitem>
+
+ <listitem>
+ <para>
+ Be distribution agnostic. Fedora and Debian run similar
+ kernels and similar startup scripts, so there's little
+ reason why the glue between the two levels should be
+ completely different.
+ </para>
+ </listitem>
+
+ <listitem>
+ <para>
+ Have limited footprint. The tools needed to build and run
+ the application should be few and widely available, with a
+ preference for tools that are installed anyway.
+ </para>
+ </listitem>
+
+ <listitem>
+ <para>
+ Be future proof. Future kernels may use different modules
+ and may change device numbers; the application should need
+ no changes to cope with such migrations.
+ </para>
+ </listitem>
+
+ <listitem>
+ <para>
+ Promote code reuse. Make functions side-effect free and
+ independent of context, so that it's easy to package the
+ core as a library that can be reused in other applications.
+ </para>
+ </listitem>
+
+ <listitem>
+ <para>
+ Generate small images. The application should accurately
+ detect what modules are needed to get the root file system
+ running and include only those modules on the generated
+ image.<footnote>
+ <para>
+ An alternative and equally interesting exercise would be
+ an attempt to generate a universal initrd that could be
+ distributed together with the kernel. Such an image
+ would most likely be based on udev/hotplug.
+ </para>
+ </footnote>
+ </para>
+ </listitem>
+
+ </itemizedlist>
+ </para>
+
+ <para>
+ Requirements:
+ <itemizedlist>
+
+ <listitem>
+ <para>
+ Linux 2.6.8 or later, both when running
+ <application>yaird</application> and when running the generated
+ image. By limiting the goal to support only recent kernels,
+ we can drastically reduce the number of special cases and
+ knowledge about modules in the application.
+ </para>
+ </listitem>
+
+ <listitem>
+ <para>
+ Sysfs and procfs, both on the old and on the
+ new kernel.
+ </para>
+ </listitem>
+
+ <listitem>
+ <para>
+ Perl and the HTML-Template module.
+ </para>
+ </listitem>
+
+ </itemizedlist>
+ </para>
+
+ <para>
+ To achieve these goals, the following features are implemented:
+ <itemizedlist>
+
+ <listitem>
+ <para>
+ Templating system to tune the generated image to a
+ given distribution; templates for Debian and Fedora FC3
+ included.
+ </para>
+ </listitem>
+
+ <listitem>
+ <para>
+ Interprets <filename>/etc/fstab</filename>, including
+ details such as octal escapes, <code>ignore</code> and
+ <code>noauto</code> keywords, and — for ext3 and reiser
+ file systems — label and uuid detection.
+ Where applicable, options in <filename>/etc/fstab</filename>
+ are used in the generated image.
+ </para>
+ </listitem>
+
+ <listitem>
+ <para>
+ Supports volume management via LVM2; activates only the volume
+ group required for the root file system.
+ </para>
+ </listitem>
+
+ <listitem>
+ <para>
+ Supports software RAID via mdadm; activates only required
+ devices.
+ </para>
+ </listitem>
+
+ <listitem>
+ <para>
+ Understands SATA, IDE devices.
+ </para>
+ </listitem>
+
+ <listitem>
+ <para>
+ Generated image does not use hard coded device
+ numbers.<footnote>
+ <para>
+ Except where the distribution depends on it;
+ there are some issues with mdadm in Debian.
+ </para>
+ </footnote>
+ </para>
+ </listitem>
+
+ <listitem>
+ <para>
+ Image generation understands how included executables may
+ depend on symbolic links and shared libraries. Shared libraries
+ work for both glibc and klibc.
+ </para>
+ </listitem>
+
+ <listitem>
+ <para>
+ Support input devices such as USB keyboard, if the input
+ device supports sysfs.
+ Input devices are needed in the initial image to supply
+ a password for encrypted root disk and to do debugging.
+ </para>
+ </listitem>
+
+ <listitem>
+ <para>
+ Basic support for kernel command line as passed by the boot
+ loader. Interprets init=, ro, rw.
+ </para>
+ </listitem>
+
+ <listitem>
+ <para>
+ Interprets the blacklist information from hotplug.
+ </para>
+ </listitem>
+
+ <listitem>
+ <para>
+ Interprets the kernel configuration file that defines whether a
+ component is built in, available as a module or unavailable.
+ By maintaining a mapping between module name and config
+ parameter for selected modules, we avoid error messages if
+ for instance a required file system is built into the kernel.
+ </para>
+ </listitem>
+
+ <listitem>
+ <para>
+ Supports initramfs, both in Debian and Fedora versions.
+ An example template using the older initrd model
+ is included for Debian.
+ </para>
+ </listitem>
+
+ <listitem>
+ <para>
+ Does not require devfs in either the old or the new kernel.
+ </para>
+ </listitem>
+
+ </itemizedlist>
+ </para>
+
+ <para>
+ Obviously, this tool is far from complete. Here's a list of
+ features that still need to be implemented:
+ <itemizedlist>
+
+ <listitem>
+ <para>
+ Understands USB and SCSI storage, no special provisions
+ are needed for code generation, but it's not tested yet.
+ </para>
+ </listitem>
+
+ <listitem>
+ <para>
+ EVMS, an alternative user level interface to LVM2 and MD,
+ is not supported yet.
+ </para>
+ </listitem>
+
+ <listitem>
+ <para>
+ Swsusp is not supported yet.
+ </para>
+ </listitem>
+
+ <listitem>
+ <para>
+ Module aliases and options as specified in
+ <filename>/etc/modprobe.d</filename> are not supported yet.
+ </para>
+ </listitem>
+
+ <listitem>
+ <para>
+ Firewire and DASD are not supported.
+ </para>
+ </listitem>
+
+ <listitem>
+ <para>
+ NFS, loopback and encrypted file systems are not supported.
+ </para>
+ </listitem>
+
+ <listitem>
+ <para>
+ Configuration info is hard coded in a module; it should be
+ possible to read this from a file.
+ </para>
+ </listitem>
+
+ </itemizedlist>
+ </para>
+
+</section>
--- /dev/null
+<section id="tools">
+ <title>Tool Chain</title>
+ <para>
+ This section discusses which tools are used in implementing
+ <application>yaird</application> and why.
+ </para>
+
+ <para>
+ The application is built as a collection of perl modules.
+ The use of a scripting language makes consistent error checking
+ and building sane data structures a lot easier than shell
+ scripting; using perl rather than python is mainly because in
+ Debian perl has 'required' status while python is only 'standard'.
+ The code follows some conventions:
+ </para>
+
+ <para>
+ <itemizedlist>
+ <listitem>
+ <para>
+ Where there are multiple items of a kind, say fstab entries,
+ the perl module implements a class for individual items.
+ All classes share a common base class, <code>Obj</code>,
+ that handles constructor argument validation and that offers
+ a place to plug in debugging code.
+ </para>
+ </listitem>
+
+ <listitem>
+ <para>
+ Object attributes are used via accessor methods to catch
+ typos in attribute names.
+ </para>
+ </listitem>
+
+ <listitem>
+ <para>
+ Objects have a <code>string</code> method, that returns
+ a string version of the object. Binary data is not
+ guaranteed to be absent from the string version.
+ </para>
+ </listitem>
+
+ <listitem>
+ <para>
+ Where there are multiple items of a kind, say fstab entries,
+ the collection is implemented as a module that is not a
+ class. There is a function <code>all</code> that returns a
+ list of all known items, and functions <code>findByXxx</code>
+ to retrieve an item where the Xxx attribute has a given
+ value. There is an <code>init</code> function that
+ initializes the collection; this is called automatically
+ upon first invocation of <code>all</code> or
+ <code>findByXxx</code>.
+ Collections may have convenience functions
+ <code>findXxxByYyy</code>: return attribute Xxx, given a
+ value for attribute Yyy.
+ </para>
+ </listitem>
+
+ </itemizedlist>
+ </para>
+
+ <para>
+ The generated initrd image needs a command interpreter;
+ the choice of command interpreter is exclusively determined
+ by the image generation template.
+ At this point, both Debian and Fedora templates use the
+ <application>dash</application> shell, for historical reasons only.
+ Presumably <application>busybox</application> could be used to build a
+ smaller image. However, support for initramfs requires a complicated
+ construction involving a combination of mount, chroot and chdir;
+ to do that reliably, <application>nash</application> as used in Fedora
+ seems a more attractive option.
+ </para>
+
+ <para>
+ Documentation is in docbook format, since it's widely supported,
+ supports numerous output formats, has better separation between
+ content and layout than texinfo, and provides better guarantees
+ against malformed HTML than texinfo.
+ </para>
+
+ <simplesect>
+ <title>Autoconf</title>
+ <para>
+ GNU automake is used to build and install the application,
+ where 'building' is perhaps too big a word adding the location
+ of the underlying modules to the wrapper script.
+ The reasons for using automake: it provides packagers with a
+ well known mechanism for changing installation directories,
+ and it makes it easy for developers to produce a cruft-free
+ and reproducible tarball based on the tree extracted from
+ version control.
+ </para>
+ </simplesect>
+
+ <simplesect>
+ <title>C Library</title>
+ <para>
+ The standard C library under linux is glibc. This is big:
+ 1.2Mb, where an alternative implementation, klibc, is only 28Kb.
+ The reason klibc can be so much smaller than glibc is that a
+ lot of features of glibc, like NIS support, are not relevant for
+ applications that need to do basic stuff like loading an IDE driver.
+ </para>
+
+ <para>
+ There are other small libc implementations: in the embedded world,
+ dietlibc and uClibc are popular. However, klibc was specifically
+ developed to support the initial image: it's intended to be included
+ with the mainline kernel and allow moving a lot of startup magic out
+ of the kernel into the initial image. See
+ <ulink url="http://marc.theaimsgroup.com/?m=101070502919547">
+ <citetitle>
+ LKML: [RFC] klibc requirements, round 2</citetitle></ulink>
+ for requirements on klibc; the
+ <ulink url="http://www.zytor.com/mailman/listinfo/klibc">
+ <citetitle>mailing list</citetitle></ulink> is the most current
+ source of information.
+ </para>
+
+ <para>
+ Recent versions of klibc (1.0 and later) include a wrapper around
+ gcc, named klcc, that will compile a program with klibc. This means
+ <application>yaird</application> does not need to include klibc,
+ but can easily be configured to use klibc rather than glibc.
+ Of course this will only pay off if <emphasis>every</emphasis>
+ executable on the initial image uses klibc.
+ </para>
+
+ <para>
+ <application>Yaird</application> does not have to be extended in
+ order to support klibc, but it is necessary to avoid assumptions
+ about which shared libraries are used. This is discussed in
+ <xref linkend="shlibs"/>.
+ </para>
+ </simplesect>
+
+ <simplesect>
+ <title>Template Processing</title>
+ <para>
+ This section discusses the templates used to transform
+ high-level actions to lines of script in the generated image.
+ These templates are intended to cope with small differences
+ between distributions: a shell that is named
+ <application>dash</application> in Debian and
+ <application>ash</application> in Fedora for example.
+ By processing the output of <application>yaird</application>
+ through a template, we can confine the tuning of
+ <application>yaird</application> for a specific distribution
+ to the template, without having to touch the core code.
+ </para>
+
+ <para>
+ One important function of a template library is to enforce
+ a clear separation between progam logic and output formatting:
+ there should be no way to put perl fragments inside a template.
+ See <ulink url="http://www.stringtemplate.org/">StringTemplate</ulink>
+ for a discussion of what is needed in a templating system, plus
+ a Java implementation.
+ </para>
+
+ <para>
+ Lets consider a number of possible templating solutions:
+ <itemizedlist>
+
+ <listitem>
+ <para>
+ <ulink url="http://www.template-toolkit.org/">
+ Template Toolkit</ulink>:
+ widely used, not in perl core distribution, does not
+ prevent mixing of code and templates.
+ </para>
+ </listitem>
+
+ <listitem>
+ <para>
+ <ulink url="http://search.cpan.org/dist/Text-Template/lib/Text/Template.pm">
+ Text::Template</ulink>:
+ not in perl core distribution, does not
+ prevent mixing of code and templates.
+ </para>
+ </listitem>
+
+ <listitem>
+ <para>
+ Some XSLT processor. Not in core distribution,
+ more suitable for file-to-file transformations
+ than for expanding in-process data; overkill.
+ </para>
+ </listitem>
+
+ <listitem>
+ <para>
+ <ulink url="http://search.cpan.org/~samtregar/HTML-Template-2.7/Template.pm">
+ HTML-Template</ulink>:
+ not in perl core distribution,
+ prevents mixing of code and templates,
+ simple, no dependencies, dual GPL/Artistic license.
+ Available in Debian as
+ <application>libhtml-template-perl</application>,
+ in Fedora 2 as perl-HTML-Template, dropped from Fedora 3,
+ but available via
+ <ulink url="http://download.fedora.redhat.com/pub/fedora/linux/extras/">
+ Fedora Extras</ulink>.
+ </para>
+ </listitem>
+
+ <listitem>
+ <para>
+ A home grown templating system: a simple system such as the
+ HTML-Template module is over 100Kb. We can cut down on that
+ by dropping functions we don't immediately need, but the effort
+ to get a tested and documented implementation remains substantial.
+ </para>
+ </listitem>
+
+ </itemizedlist>
+ </para>
+
+ <para>
+ The HTML-Template approach is the best match for our
+ requirements, so used in <application>yaird</application>.
+ </para>
+
+ </simplesect>
+
+</section>
--- /dev/null
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml"><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /><title>Yaird — Yet Another Mkinitrd</title><meta name="generator" content="DocBook XSL Stylesheets V1.65.1" /><meta name="description" content=" This memo discusses the design goals and implementation of Yaird (Yet Another mkInitRD), a proof-of-concept application to create an initial boot image, a minimal filesystem used to bring a booting Linux kernel to a level where it can access the root file system and use startup scripts to bring the system to the normal run level. It differs from earlier mkinitrd implementations in that it leverages the information in sysfs to minimise the number of special cases that the application has to know about, and in that it uses a template system to separate the analysis of the system from the building of the image. " /></head><body><div class="article" lang="en" xml:lang="en"><div class="titlepage"><div><div><h1 class="title"><a id="index"></a>Yaird — Yet Another Mkinitrd</h1></div><div><div class="author"><h3 class="author"><span class="firstname">Erik</span> <span class="surname">van Konijnenburg</span></h3><tt class="email"><<a href="mailto:ekonijn@xs4all.nl">ekonijn@xs4all.nl</a>></tt></div></div><div><p class="copyright">Copyright © 2005 Erik van Konijnenburg</p></div><div><div class="legalnotice"><p>
+ Permission is granted to copy, distribute and/or modify this
+ document under the terms of the <i class="citetitle">GNU Free Documentation
+ License</i>, Version 1.1 or any later version published
+ by the Free Software Foundation with no Invariant Sections, no
+ Front-Cover Texts, and no Back-Cover Texts. You may obtain a copy
+ of the <i class="citetitle">GNU Free Documentation License</i> from
+ the Free Software Foundation by visiting <a href="http://www.fsf.org" target="_top">their Web site</a> or by writing to:
+ Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ Boston, MA 02111-1307, USA.
+ </p></div></div><div><p class="pubdate">2005-02-09</p></div><div><div class="abstract"><p class="title"><b>Abstract</b></p><p>
+ This memo discusses the design goals and implementation of
+ <span class="application">Yaird</span> (Yet Another mkInitRD),
+ a proof-of-concept application to create an initial boot image,
+ a minimal filesystem used to bring a booting Linux kernel to a
+ level where it can access the root file system and use startup
+ scripts to bring the system to the normal run level. It differs
+ from earlier <span class="application">mkinitrd</span> implementations in
+ that it leverages the information in sysfs to minimise the number
+ of special cases that the application has to know about, and in
+ that it uses a template system to separate the analysis of the
+ system from the building of the image.
+ </p></div></div></div><div></div><hr /></div><div class="toc"><p><b>Table of Contents</b></p><dl><dt><span class="section"><a href="#intro-chapter">Introduction</a></span></dt><dt><span class="section"><a href="#spec">Goals, features, to do</a></span></dt><dt><span class="section"><a href="#concepts">Concepts</a></span></dt><dt><span class="section"><a href="#kernel">The interface between kernel and image</a></span></dt><dt><span class="section"><a href="#raid">Supporting Raid Devices</a></span></dt><dt><span class="section"><a href="#input">Supporting Input Devices</a></span></dt><dt><span class="section"><a href="#shlibs">Supporting Shared Libraries</a></span></dt><dt><span class="section"><a href="#security">Security</a></span></dt><dt><span class="section"><a href="#tools">Tool Chain</a></span></dt><dt><span class="section"><a href="#authors-chap">Authors</a></span></dt><dt><span class="section"><a href="#license-chapter">License</a></span></dt></dl></div><div class="section" lang="en" xml:lang="en"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a id="intro-chapter"></a>Introduction</h2></div></div><div></div></div><p>
+ <span class="application">Yaird</span> (Yet Another mkInitRD) is an
+ application to create an initial boot image, a minimal filesystem used
+ to bring a booting Linux kernel to a level where it can access
+ the root file system and use startup scripts to bring the system
+ to the normal run level.
+ </p><p>
+ It differs from earlier <span class="application">mkinitrd</span>
+ implementations in that it attempts to leverage the information in
+ sysfs to minimise the number of special cases that the application
+ has to know about, and in that it uses a template system to separate
+ the analysis of the system from the building of the image.
+ </p><p>
+ This document gives an overview of the design and implementation
+ of <span class="application">Yaird</span>; see the README file for
+ usage information. This text assumes familiarity with Linux
+ system administration and the basics of hotplug and sysfs.
+ </p><p>
+ This document describes version 0.0.5
+ of <span class="application">Yaird</span>.
+ This is a very rough, proof of concept, version.
+ </p></div><div class="section" lang="en" xml:lang="en"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a id="spec"></a>Goals, features, to do</h2></div></div><div></div></div><p>
+ The purpose in life of a tool like <span class="application">Yaird</span>
+ is to produce an initial boot image that loads the required modules
+ to allow a booting kernel to access the root file system and from
+ there use the startup scripts to get to the default run level.
+ This means that hardly any drivers need to be compiled into the kernel
+ itself, so a distribution can produce a kernel with a large amount of
+ modules that will run unchanged on practically any hardware, without
+ introducing a large number of unused drivers that would waste RAM.
+ In a sense, the initial boot image customises the kernel to the hardware
+ it happens to be running on.
+ </p><p>
+ That purpose still leaves a lot of room to optimise for different
+ goals: as an example, you could attempt to make the generated
+ image as small as possible, or you could attempt to make the
+ generated image so flexible that it will boot on any hardware.
+ This chapter discusses the goals that determined the design, the
+ resulting features, and what's still left to do.
+ </p><p>
+ The goals<sup>[<a id="id2667183" href="#ftn.id2667183">1</a>]</sup>
+ of <span class="application">Yaird</span> are as follows:
+ </p><div class="itemizedlist"><ul type="disc"><li><p>
+ Be free, as in GPL.
+ </p></li><li><p>
+ Be maintainable. Small functions with documented arguments
+ and result are better than a shell script full of constructs
+ like <tt class="code">eval "awk | bash | tac 3>&7"</tt>.
+ </p></li><li><p>
+ Be secure and reliable. The application should stop with an error
+ message at the slightest provocation, rather than run the
+ risk of producing a non-booting initrd image.
+ The application should not open loopholes that allow the 'bad
+ guys' to modify the image, gain access to raw devices or
+ overwrite system files.
+ </p></li><li><p>
+ Be distribution agnostic. Fedora and Debian run similar
+ kernels and similar startup scripts, so there's little
+ reason why the glue between the two levels should be
+ completely different.
+ </p></li><li><p>
+ Have limited footprint. The tools needed to build and run
+ the application should be few and widely available, with a
+ preference for tools that are installed anyway.
+ </p></li><li><p>
+ Be future proof. Future kernels may use different modules
+ and may change device numbers; the application should need
+ no changes to cope with such migrations.
+ </p></li><li><p>
+ Promote code reuse. Make functions side-effect free and
+ independent of context, so that it's easy to package the
+ core as a library that can be reused in other applications.
+ </p></li><li><p>
+ Generate small images. The application should accurately
+ detect what modules are needed to get the root file system
+ running and include only those modules on the generated
+ image.<sup>[<a id="id2735423" href="#ftn.id2735423">2</a>]</sup>
+ </p></li></ul></div><p>
+ </p><p>
+ Requirements:
+ </p><div class="itemizedlist"><ul type="disc"><li><p>
+ Linux 2.6.8 or later, both when running
+ <span class="application">yaird</span> and when running the generated
+ image. By limiting the goal to support only recent kernels,
+ we can drastically reduce the number of special cases and
+ knowledge about modules in the application.
+ </p></li><li><p>
+ Sysfs and procfs, both on the old and on the
+ new kernel.
+ </p></li><li><p>
+ Perl and the HTML-Template module.
+ </p></li></ul></div><p>
+ </p><p>
+ To achieve these goals, the following features are implemented:
+ </p><div class="itemizedlist"><ul type="disc"><li><p>
+ Templating system to tune the generated image to a
+ given distribution; templates for Debian and Fedora FC3
+ included.
+ </p></li><li><p>
+ Interprets <tt class="filename">/etc/fstab</tt>, including
+ details such as octal escapes, <tt class="code">ignore</tt> and
+ <tt class="code">noauto</tt> keywords, and — for ext3 and reiser
+ file systems — label and uuid detection.
+ Where applicable, options in <tt class="filename">/etc/fstab</tt>
+ are used in the generated image.
+ </p></li><li><p>
+ Supports volume management via LVM2; activates only the volume
+ group required for the root file system.
+ </p></li><li><p>
+ Supports software RAID via mdadm; activates only required
+ devices.
+ </p></li><li><p>
+ Understands SATA, IDE devices.
+ </p></li><li><p>
+ Generated image does not use hard coded device
+ numbers.<sup>[<a id="id2735548" href="#ftn.id2735548">3</a>]</sup>
+ </p></li><li><p>
+ Image generation understands how included executables may
+ depend on symbolic links and shared libraries. Shared libraries
+ work for both glibc and klibc.
+ </p></li><li><p>
+ Support input devices such as USB keyboard, if the input
+ device supports sysfs.
+ Input devices are needed in the initial image to supply
+ a password for encrypted root disk and to do debugging.
+ </p></li><li><p>
+ Basic support for kernel command line as passed by the boot
+ loader. Interprets init=, ro, rw.
+ </p></li><li><p>
+ Interprets the blacklist information from hotplug.
+ </p></li><li><p>
+ Interprets the kernel configuration file that defines whether a
+ component is built in, available as a module or unavailable.
+ By maintaining a mapping between module name and config
+ parameter for selected modules, we avoid error messages if
+ for instance a required file system is built into the kernel.
+ </p></li><li><p>
+ Supports initramfs, both in Debian and Fedora versions.
+ An example template using the older initrd model
+ is included for Debian.
+ </p></li><li><p>
+ Does not require devfs in either the old or the new kernel.
+ </p></li></ul></div><p>
+ </p><p>
+ Obviously, this tool is far from complete. Here's a list of
+ features that still need to be implemented:
+ </p><div class="itemizedlist"><ul type="disc"><li><p>
+ Understands USB and SCSI storage, no special provisions
+ are needed for code generation, but it's not tested yet.
+ </p></li><li><p>
+ EVMS, an alternative user level interface to LVM2 and MD,
+ is not supported yet.
+ </p></li><li><p>
+ Swsusp is not supported yet.
+ </p></li><li><p>
+ Module aliases and options as specified in
+ <tt class="filename">/etc/modprobe.d</tt> are not supported yet.
+ </p></li><li><p>
+ Firewire and DASD are not supported.
+ </p></li><li><p>
+ NFS, loopback and encrypted file systems are not supported.
+ </p></li><li><p>
+ Configuration info is hard coded in a module; it should be
+ possible to read this from a file.
+ </p></li></ul></div><p>
+ </p></div><div class="section" lang="en" xml:lang="en"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a id="concepts"></a>Concepts</h2></div></div><div></div></div><p>
+ This section discusses the basic concepts underlying
+ <span class="application">yaird</span>.
+ </p><p>
+ The basic operation is simple:
+ </p><div class="orderedlist"><ol type="1"><li><p>
+ make a plan to build an image,
+ </p></li><li><p>
+ transform the plan to a detailed description of the image,
+ </p></li><li><p>
+ build and pack the image.
+ </p></li></ol></div><p>
+
+ </p><p>
+ The plan consists of a number of goals to be achieved: a loaded
+ device driver, a block special file created, a device mounted.
+ The plan does not specify details such as the exact path of the
+ <span class="application">mknod</span> executable or the shared libraries
+ needed to run that executable.
+ </p><div class="simplesect" lang="en" xml:lang="en"><div class="titlepage"><div><div><h3 class="title"><a id="id2695566"></a>Making the Plan</h3></div></div><div></div></div><p>
+ The most interesting part is making the plan. At the top level,
+ the plan is governed by some ultimate goals. For now, the only
+ goal is to get a working keyboard and to mount the root file system,
+ but if we're going to support swsusp, the swap devices also need to
+ be activated. To realise the goal, subgoals need to be realised.
+ As an example, before mounting a file system, the modules containing
+ the implementation of the file system need to be loaded.
+ </p><p>
+ To refine the goal of loading a kernel module,
+ the <tt class="code">ModDepTab</tt> module interprets
+ <tt class="filename">modules.dep</tt> for the new kernel. Given a
+ module name, this will return a list of required modules with all
+ dependencies recursively resolved. It knows about the equivalence
+ between hyphen and underscore in module names, it also knows how
+ to search for modules in the <tt class="filename">/lib/modules</tt>
+ directory.
+ </p><p>
+ The <tt class="code">KConfig</tt> module determines if loading a
+ module can be omitted because the module is hardcoded into the
+ kernel. As an example, it is aware of the fact that the module
+ <tt class="code">ext3</tt> is not needed if the new kernel configuration
+ contains <tt class="code">CONFIG_EXT3_FS=y</tt>.<sup>[<a id="id2736265" href="#ftn.id2736265">4</a>]</sup>
+ Only a few modules are known: <span class="application">yaird</span>
+ looks for modules such as <tt class="code">ext3</tt> when that filesystem
+ is used, so it makes sense to check whether a missing module
+ is compiled in. On the other hand, hardware modules that are
+ compiled in never show up in <tt class="filename">modules.pcimap</tt>
+ and friends, so they remain completely outside the view of
+ <span class="application">yaird</span>.
+ </p><p>
+ Module aliases and options as supported by
+ <span class="application">modprobe</span> are unsupported for the moment.
+ </p><p>
+ Before a device as listed in <tt class="filename">/etc/fstab</tt> can be
+ mounted, that device needs to be enabled. That device could be an
+ NFS mount, a loopback mount or it could be a block device. The NFS
+ and loopback cases are not supported yet, but block devices are.
+ This support is based on a number of sources of information:
+ </p><div class="orderedlist"><ol type="1"><li><p>
+ Scanning the <tt class="filename">/dev</tt> directory gives us the
+ relation between all block special files and major/minor
+ numbers.
+ </p></li><li><p>
+ Scanning the <tt class="filename">/sys/block</tt> directory gives us the
+ relation between all major/minor numbers and kernel names
+ such as <tt class="code">dm-0</tt> or <tt class="code">sda1</tt>; it
+ also gives the relation between partitions and complete
+ devices.
+ </p></li><li><p>
+ If there is a symlink in a <tt class="filename">/sys/block</tt>
+ subdirectory to the <tt class="filename">/sys/devices</tt>
+ directory, it also gives is the relation between a block
+ device and the underlying hardware.
+ </p></li></ol></div><p>
+ </p><p>
+ Based on the kernel name and partition relationships of the device,
+ we determine the steps needed to activate the device. As an example,
+ to activate <tt class="code">sda1</tt>, we need to activate <tt class="code">sda</tt>,
+ then create a block special file for <tt class="code">sda1</tt>. As
+ another example, to activate <tt class="code">dm-0</tt>, our first bet is
+ to check whether this is an LVM logical
+ volume,<sup>[<a id="id2736425" href="#ftn.id2736425">5</a>]</sup> and if so activate the
+ physical volumes underlying the volume group, and finally running
+ <tt class="code">vgchange -a y</tt>.
+ </p></div><div class="simplesect" lang="en" xml:lang="en"><div class="titlepage"><div><div><h3 class="title"><a id="id2736440"></a>Hardware Planning</h3></div></div><div></div></div><p>
+ Some devices, such as <tt class="code">sdx</tt> or <tt class="code">hdy</tt>, are
+ expected to have underlying hardware; as an example, <tt class="code">sda</tt>
+ may be backed by <tt class="code">pci0000:00/0000:00:1f.2/host0/0:0:0:0</tt>.
+ This represents a hardware path, in this case a controller on the PCI
+ bus that connects to a SCSI device. In order to use the device,
+ every component on the path needs to be activated, the component
+ closest to the CPU first.
+ Based on the pathname in <tt class="filename">/sys/devices</tt> and on
+ files within the directory for the component, we can determine
+ what kind of component we're dealing with, and how to find the
+ required modules.
+ </p><p>
+ Finding modules closely follows the methods used in the
+ <span class="application">hotplug</span> package, and the
+ <span class="application">hotplug</span> approach in turn is an almost
+ literal translation of the code that the kernel uses to find a
+ driver for a newly detected piece of hardware.
+ </p><p>
+ For components that talk some protocol over a bus, like SCSI or
+ IDE disks or CDROMs, this is a simple hard coded selection; as an
+ example, the <tt class="code">ScsiDev</tt> module knows that a SCSI device
+ with a <tt class="filename">type</tt> file containing "5" is a CDROM,
+ and that <tt class="code">sr-mod</tt> is the appropriate driver.
+ </p><p>
+ Devices such as PCI or USB devices cannot be classified into
+ a few simple categories. These devices have properties such
+ as "Vendor", "Device" and "Class" that are visible in sysfs.
+ The source code of kernel driver modules for these devices
+ contains a table listing which combination of properties mark a
+ device that the driver is prepared to handle. When the kernel
+ is compiled, these tables are summarised in a text file such
+ as <tt class="filename">modules.pcimap</tt>. Based on this table,
+ we find a driver module needed for the device and mark it for
+ inclusion on the image.
+ </p><p>
+ Multiple modules can match the same hardware: as an example,
+ <tt class="code">usb-storage</tt> and <tt class="code">ub</tt> both match an USB
+ stick. In such cases, we load all matching modules into the
+ kernel and leave it to kernel to decide who gets to manage the
+ device. There's one complication: some modules, such as
+ <tt class="code">usb-core</tt>, match any device (probably to maintain some
+ administration of their own, or to provide an ultra-generic
+ interface), but do not actually provide access to the device.
+ Such devices are weeded out by the <tt class="code">Blacklist</tt> module,
+ based on information in
+ <tt class="filename">/etc/hotplug/blacklist</tt> and
+ <tt class="filename">/etc/hotplug/blacklist.d</tt>.
+ </p><p>
+ It turns out that the "load modules for every component in the sysfs
+ path" approach is not always sufficient: sometimes you have to load
+ siblings as well. As an example, consider a combined EHCI/UHCI
+ USB controller on a single chip. The same ports can show up as EHCI
+ or UHCI devices, different PCI functions in the same PCI slot, with
+ different sysfs directories, depending on what kind of hardware is
+ connected. Purely following the sysfs path, we would only need to load
+ the EHCI driver, but it appears that on this kind of chip, EHCI devices
+ are not reliably detected unless the UHCI driver is loaded as well.
+ For this reason, we extend the algorithm with a rule: "for PCI devices,
+ load modules for every function in the PCI slot".
+ </p><p>
+ That's actually a bit much: it would load all of ALSA if you have a
+ combined ISA/IDE/USB/Multimedia chipset. So we limit the above
+ to those PCI functions that provide USB ports.
+ </p></div><div class="simplesect" lang="en" xml:lang="en"><div class="titlepage"><div><div><h3 class="title"><a id="id2736605"></a>Plan Transformation</h3></div></div><div></div></div><p>
+ The plan generated in the first phase is a collection of general
+ intentions, stuff like 'load this module', but it does not
+ specify exactly what files must be placed on the image and what
+ lines are to be added to the initialisation scripts.
+ </p><p>
+ The module <tt class="code">ActionList</tt> represents this plan with a
+ list of hashes; every hash contains at least 'action' and
+ 'target', with other keys added to provide extra information
+ as needed. If two steps in the plan have identical action and
+ target, the last one is considered redundant and silently omitted.
+ </p><p>
+ This plan is transformed to an exact image description with
+ the help of templates. The module <tt class="code">Template</tt>
+ contains a hash with for every type of action:
+ </p><div class="itemizedlist"><ul type="disc"><li><p>
+ a list of files to be copied from the mother system to the
+ image;
+ </p></li><li><p>
+ a list of directories to be created on the image; these do
+ not have to exist on the mother system;
+ </p></li><li><p>
+ a list of trees to be copied recursively from the mother
+ system to the image;
+ </p></li><li><p>
+ a hash, with as key the name of a script to be appended to
+ and as value that which is to be appended.
+ </p></li></ul></div><p>
+ All of the above are fed through HTML-Template, with the hash
+ describing this step as parameters. In practice, this looks
+ like so:
+ </p><pre class="programlisting">
+ insmod => {
+ files => [
+ '<TMPL_VAR NAME=target>',
+ '/sbin/insmod',
+ ],
+ directories => [],
+ trees => [],
+ scripts => {
+ '/init' => <<'//',
+ /sbin/insmod '<TMPL_VAR NAME=target>'
+//
+ },
+ },
+ </pre><p>
+ </p><p>
+ There are a few attributes that are available to every template:
+ </p><div class="variablelist"><dl><dt><span class="term">
+ version
+ </span></dt><dd><p>
+ The kernel version we're generating an image for.
+ Useful if you want your image to include a complete copy
+ of <tt class="filename">/lib/modules/(version)/kernel</tt>.
+ </p></dd><dt><span class="term">
+ appVersion
+ </span></dt><dd><p>
+ The version of <span class="application">yaird</span> used to
+ build the image.
+ </p></dd><dt><span class="term">
+ auxDir
+ </span></dt><dd><p>
+ The directory where <span class="application">yaird</span>
+ keeps executables intended to go on the image, such as
+ <span class="application">run_init</span>.
+ </p></dd></dl></div><p>
+ </p><p>
+ Currently, there are templates for Debian and for Fedora, plus
+ a template showing how to use the older initrd approach.
+ </p></div><div class="simplesect" lang="en" xml:lang="en"><div class="titlepage"><div><div><h3 class="title"><a id="id2736780"></a>Image Generation</h3></div></div><div></div></div><p>
+ The detailed image description consists of a collection of names of
+ files, directories, symbolic links and block or character devices,
+ plus a number of lines of shell script. The image description does
+ not contain permission or ownership information: files always have
+ mode 444, executables and directories always 555, devices always
+ mode 600,<sup>[<a id="id2736794" href="#ftn.id2736794">6</a>]</sup> and everything is owned by root.
+ </p><p>
+ The <tt class="code">Image</tt> module contains the image description and
+ can write the image to a directory. It understands about symlinks:
+ if <tt class="filename">/sbin/vgscan</tt> is added to the image and it
+ happens to be a symlink to <tt class="filename">lvmiopversion</tt>, both
+ <tt class="filename">vgscan</tt> and <tt class="filename">lvmiopversion</tt>
+ will be added to the image. Shared libraries are supported
+ via the <tt class="code">SharedLibraries</tt> module, as discussed in
+ <a href="#shlibs" title="Supporting Shared Libraries">the section called “Supporting Shared Libraries”</a>. Invocations of other executables are not
+ recognised automatically: if <tt class="filename">lvmiopversion</tt> executes
+ <tt class="filename">/etc/lvm-200/vgscan</tt>, the latter needs to be
+ added explicitly to the image.
+ </p><p>
+ The copying of complete trees to the image is influenced by the
+ copying for executables: if there is a symlink in the tree, it's
+ target is also included on the image, but if the target is a
+ directory, its contents are not copied recursively. This
+ approach avoids loops in image generation.
+ Note that the target of a symlink must exist:
+ <span class="application">yaird</span> refuses to copy dangling links.
+ </p></div><div class="simplesect" lang="en" xml:lang="en"><div class="titlepage"><div><div><h3 class="title"><a id="id2737013"></a>Packing the Image</h3></div></div><div></div></div><p>
+ The final step is packing the image in a format that the
+ bootloader can process; this is handled by the module
+ <tt class="code">Pack</tt>. The following formats are supported:
+ </p><div class="variablelist"><dl><dt><span class="term">
+ cpio
+ </span></dt><dd><p>
+ A zipped cpio file (new ASCII format), required for the
+ initramfs model as used in the templates for Debian and
+ Fedora.
+ </p></dd><dt><span class="term">
+ directory
+ </span></dt><dd><p>
+ An unpacked directory, good for debugging or manually
+ creating odd formats.
+ </p></dd><dt><span class="term">
+ cramfs
+ </span></dt><dd><p>
+ A cramfs filesystem, used for Debian initrd images.
+ </p></dd></dl></div><p>
+ </p></div></div><div class="section" lang="en" xml:lang="en"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a id="kernel"></a>The interface between kernel and image</h2></div></div><div></div></div><p>
+ The initial boot image is supposed to load enough modules to let
+ the real root device be mounted cleanly. It starts up in a
+ <span class="emphasis"><em>very</em></span> bare environment and it has to do tricky
+ stuff like juggling root filesystems; to pull that off successfully
+ it makes sense to take a close look at the environment that the
+ kernel creates for the image and what the kernel expects it to do.
+ This section contains raw design notes based on kernel 2.6.8.
+ </p><p>
+ The processing of the image starts even before the kernel is
+ activated. The bootloader, grub or lilo for example, reads two
+ files from the boot file system into ram: the kernel and image.
+ The bootloader somehow manages to set two variables in the kernel:
+ <tt class="code">initrd_start</tt> and <tt class="code">initrd_end</tt>; these variables
+ point to the copy of the image in ram. The bootloader now
+ hands over control to the kernel.
+ </p><p>
+ During setup, the kernel creates a special file system, rootfs.
+ This mostly reuses ramfs code, but there are a few twists: it can
+ never be mounted from userspace, there's only one copy, and it's not
+ mounted on top of anything else. The existence of rootfs means that
+ the rest of the kernel always can assume there's a place to mount
+ other file systems. It also is a place where temporary files can
+ be created during the boot sequence.
+ </p><p>
+ In <tt class="code">initramfs.c:populate_rootfs()</tt>, there are two
+ possibilities. If the image looks like a cpio.gz file, it is
+ unpacked into rootfs. If the file <tt class="filename">/init</tt> is
+ among the files unpacked from the cpio file, the initramfs model
+ is used; otherwise we get a more complex interaction between kernel
+ and initrd, discussed in <a href="#initrd" title="Booting with initrd">the section called “Booting with initrd”</a>.
+ </p><div class="simplesect" lang="en" xml:lang="en"><div class="titlepage"><div><div><h3 class="title"><a id="id2738021"></a>Booting with Initramfs</h3></div></div><div></div></div><p>
+ If the image was a cpio file, and it contains a file
+ <tt class="filename">/init</tt>, the initram model is used.
+ The kernel does some basic setup and hands over control to
+ <tt class="filename">/init</tt>; it is then up to
+ <tt class="filename">/init</tt> to make a real root available and to
+ transfer control to the <tt class="filename">/sbin/init</tt> command
+ on the real root.
+ </p><p>
+ The tricky part is to do that in such a way that there
+ is no way for user processes to gain access to the rootfs
+ filesystem; and in such a way that rootfs remains empty and
+ hidden under the user root file system. This is best done
+ using some C code; <span class="application">yaird</span> uses
+ <span class="application">run_init</span>, a small tool based on
+ <span class="application">klibc</span>.
+ </p><pre class="programlisting">
+ # invoked as last command in /init, with no other processes running,
+ # as follows:
+ # exec run_init /newroot /sbin/init "$@"
+ - chdir /newroot
+ # following after lots of sanity checks and not across mounts:
+ - rm -rf /*
+ - mount --move . /
+ - chroot .
+ - chdir /
+ - open /dev/console
+ - exec /sbin/init "$@"
+ </pre><p>
+ </p></div><div class="simplesect" lang="en" xml:lang="en"><div class="titlepage"><div><div><h3 class="title"><a id="initrd"></a>Booting with initrd</h3></div></div><div></div></div><p>
+ If the image was not a cpio file, the kernel copies the
+ initrd image from where ever the boot loader left it to
+ <tt class="filename">rootfs:/initrd.image</tt>, and frees the ram used
+ by the bootloader for the initrd image.
+ </p><p>
+ After reading initrd, the kernel does more setup to the point where
+ we have:
+ </p><div class="itemizedlist"><ul type="disc"><li><p>
+ working CPU and memory management
+ </p></li><li><p>
+ working process management
+ </p></li><li><p>
+ compiled in drivers activated
+ </p></li><li><p>
+ a number of support processes such as ksoftirqd are created.
+ (These processes have the rootfs as root; they can get a new
+ root when the <tt class="code">pivot_root()</tt> system call is used.)
+ </p></li><li><p>
+ something like a console. <tt class="code">Console_init()</tt> is
+ called before PCI or USB probes, so expect only compiled in
+ console devices to work.
+ </p></li></ul></div><p>
+ </p><p>
+ At this point, in <tt class="code">do_mounts.c:prepare_namespace()</tt>,
+ the kernel looks for a root filesystem to mount. That root file
+ system can come from a number of places: NFS, a raid device, a plain
+ disk or an initrd. If it's an initrd, the sequence is as follows
+ (where devfs can fail if it's not compiled into the kernel)
+
+ </p><pre class="programlisting">
+ - mount -t devfs devfs /dev
+ - md_run_setup()
+ - process initrd
+ - umount /dev
+ - mount --move . /
+ - chroot .
+ - mount -t devfs devfs /dev
+ </pre><p>
+
+ </p><p>
+ Once that returns, in <tt class="code">init/main.c:init()</tt>,
+ initialisation memory is freed and <tt class="filename">/sbin/init</tt>
+ is executed with <tt class="code">/dev/console</tt> as file descriptor 0, 1
+ and 2. <tt class="filename">/sbin/init</tt> can be overruled with
+ an <tt class="code">init=/usr/bin/firefox</tt> parameter passed to the
+ boot loader; if <tt class="filename">/sbin/init</tt> is not found,
+ <tt class="filename">/etc/init</tt> and a number of other fallbacks
+ are tried. We're in business.
+ </p><p>
+ The processing of initrd starts in
+ <tt class="code">do_mounts_initrd.c:initrd_load()</tt>. It creates
+ <tt class="filename">rootfs:/dev/ram</tt>, then copies
+ <tt class="filename">rootfs:/initrd.image</tt> there and unlinks
+ <tt class="filename">rootfs:/initrd.image</tt>. Now we have the initrd
+ image in a block device, which is good for mounting. It calls
+ <tt class="code">handle_initrd()</tt>, which does:
+
+ </p><pre class="programlisting">
+ # make another block special file for ram0
+ - mknod /dev/root.old b 1 0
+ # try mounting initrd with all known file systems,
+ # optionally read-only
+ - mount -t xxx /dev/root.old /root
+ - mkdir rootfs:/old
+ - cd /root
+ - mount --move . /
+ - chroot .
+ - mount -t devfs devfs /dev
+ - system ("/linuxrc");
+ - cd rootfs:/old
+ - mount --move / .
+ - cd rootfs:/
+ - chroot .
+ - umount rootfs:/old/dev
+ - ... more ...
+ </pre><p>
+
+ </p><p>
+ So <tt class="filename">initrd:/linuxrc</tt> runs in an environment where
+ initrd is the root, with devfs mounted if available, and rootfs is
+ invisible (except that there are open file handles to directories
+ in rootfs, needed to change back to the old environment).
+ </p><p>
+ Now the idea seems to have been that <tt class="filename">/linuxrc</tt>
+ would mount the real root and <tt class="code">pivot_root</tt> into it, then start
+ <tt class="filename">/sbin/init</tt>. Thus, linuxrc would never return.
+ However, <tt class="code">main.c:init()</tt> does some usefull stuff only
+ after linuxrc returns: freeing init memory segments and starting numa
+ policy, so in eg Debian and Fedora, <tt class="filename">/linuxrc</tt>
+ will end, and <tt class="filename">/sbin/init</tt>
+ is started by <tt class="code">main.c:init()</tt>.
+ </p><p>
+ After linuxrc returns, the variable <tt class="code">real_root_dev</tt>
+ determines what happens. This variable can be read and written
+ via <tt class="filename">/proc/sys/kernel/real-root-dev</tt>. If it
+ is 0x0100 (the device number of <tt class="filename">/dev/ram0</tt>)
+ or something equivalent, <tt class="code">handle_initrd()</tt> will change
+ directory to <tt class="filename">/old</tt> and return. If it is
+ something else, <tt class="code">handle_initrd()</tt> will decode it, mount
+ it as root, mount initrd as <tt class="filename">/root/initrd</tt>,
+ and again start <tt class="filename">/sbin/init</tt>. (if mounting as
+ <tt class="filename">/root/initrd</tt> fails, the block device is freed.)
+ </p><p>
+ Remember <tt class="code">handle_initrd()</tt> was called via
+ <tt class="code">load_initrd()</tt> from <tt class="code">prepare_namespace()</tt>,
+ and <tt class="code">prepare_namespace()</tt> ends by chrooting into the
+ current directory: <tt class="filename">rootfs:/old</tt>.
+ </p><p>
+ Note that <tt class="filename">rootfs:/old</tt> was move-mounted
+ from '/' after <tt class="filename">/linuxrc</tt> returned.
+ When <tt class="filename">/linuxrc</tt> started, the root was
+ initrd, but <tt class="filename">/linuxrc</tt> may have done a
+ <tt class="code">pivot_root()</tt>, replacing the root with a real root,
+ say <tt class="filename">/dev/hda1</tt>.
+ </p><p>
+ Thus:
+ </p><div class="itemizedlist"><ul type="disc"><li><p>
+ <tt class="filename">/linuxrc</tt> is started with initrd
+ mounted as root.
+ </p></li><li><p>
+ There is working memory management, processes, compiled
+ in drivers, and stdin/out/err are connected to a console,
+ if the relevant drivers are compiled in.
+ </p></li><li><p>
+ Devfs may be mounted on <tt class="filename">/dev</tt>.
+ </p></li><li><p>
+ <tt class="filename">/linuxrc</tt> can <tt class="code">pivot_root</tt>.
+ </p></li><li><p>
+ If you echo 0x0100 to
+ <tt class="filename">/proc/sys/kernel/real-root-dev</tt>,
+ the <tt class="code">pivot_root</tt> will remain in effect after
+ <tt class="filename">/linuxrc</tt> ends.
+ </p></li><li><p>
+ After <tt class="filename">/linuxrc</tt> returns,
+ <tt class="filename">/dev</tt> may be unmounted and replaced
+ with devfs.
+ </p></li></ul></div><p>
+ </p><p>
+ Thus a good strategy for <tt class="filename">/linuxrc</tt> is to
+ do as little as possible, and defer the real initialisation
+ to <tt class="filename">/sbin/init</tt> on the initrd; this
+ <tt class="filename">/sbin/init</tt> can then <tt class="code">pivot_root</tt>
+ into the real root device.
+ </p><pre class="programlisting">
+ #!/bin/dash
+ set -x
+ mount -nt proc proc /proc
+ # root=$(cat proc/sys/kernel/real-root-dev)
+ echo 256 > proc/sys/kernel/real-root-dev
+ umount -n /proc
+ </pre><p>
+ </p></div><div class="simplesect" lang="en" xml:lang="en"><div class="titlepage"><div><div><h3 class="title"><a id="id2738608"></a>Kernel command line parameters</h3></div></div><div></div></div><p>
+ The kernel passes more information than just an initial file system
+ to the initrd or initramfs image; there also are the kernel boot
+ parameters. The bootloader passes these to the kernel, and the kernel
+ in turn passes them on via <tt class="filename">/proc/cmdline</tt>.
+ </p><p>
+ An old version of these parameters is documented in the
+ <span class="citerefentry"><span class="refentrytitle">bootparam</span>(7)</span> manual page; more recent information is in the kernel
+ documentation file <i class="citetitle">kernel-parameters.txt</i>.
+ Mostly, these parameters are used to configure non-modular drivers,
+ and thus not very interesting to <span class="application">yaird</span>.
+ Then there are parameters such as <tt class="code">noapic</tt>, which are
+ interpreted by the kernel core and also irrelevant to
+ <span class="application">yaird</span>.
+ Finally there are a few parameters which are used by the kernel
+ to determine how to mount the root file system.
+ </p><p>
+ Whether the initial image should emulate these options or ignore them
+ is open to discussion; you can make a case that the flexibility these
+ options offer has become irrelevant now that initrd/initramfs offers
+ far more fine grained control over the way in which the system
+ is booted.
+ Support for these options is mostly a matter of tuning the
+ distribution specific templates, but it is possible that the
+ templates need an occassional hint from the planner.
+ To find out just how much "mostly" is, we'll try to implement
+ full support for these options and see where we run into
+ limitations.
+ An inventarisation of relevant options.
+ </p><div class="variablelist"><dl><dt><span class="term">
+ ide
+ </span></dt><dd><p>
+ These are options for the modular ide-core driver.
+ This could be supported by adding an attribute
+ "isIdeCore" to insmod actions, and expanding the ide
+ kernel options only for insmod actions where that
+ attribute is true.
+ It seems cleaner to support the options from
+ <tt class="filename">/etc/modprobe.conf</tt>.
+ Unsupported for now.
+ </p></dd><dt><span class="term">
+ init
+ </span></dt><dd><p>
+ The first program to be started on the definitive root device,
+ default <tt class="filename">/sbin/init</tt>. Supported.
+ </p></dd><dt><span class="term">
+ ro
+ </span></dt><dd><p>
+ Mount the definitive root device read only,
+ so that it can be submitted to <span class="application">fsck</span>.
+ Supported; this is the default behaviour.
+ </p></dd><dt><span class="term">
+ rw
+ </span></dt><dd><p>
+ Three guesses. Supported.
+ </p></dd><dt><span class="term">
+ resume, noresume
+ </span></dt><dd><p>
+ Which device (not) to use for software suspend.
+ To be done.
+ </p></dd><dt><span class="term">
+ root
+ </span></dt><dd><p>
+ The device to mount as root. This is a nasty one:
+ the planner by default only creates device nodes
+ that are needed to mount the root device, and even
+ if you were to put hotplug on the inital image
+ to create all possible device nodes, there's still
+ the matter of putting support for the proper file system
+ on the initial image.
+ We could make an option to
+ <span class="application">yaird</span> to specify a list
+ of possible root devices and load the necessary
+ modules for all of them.
+ Unsupported until there's a clear need for it.
+ </p></dd><dt><span class="term">
+ rootflags
+ </span></dt><dd><p>
+ Flags to use while mounting root file system.
+ Implement together with root option.
+ </p></dd><dt><span class="term">
+ rootfstype
+ </span></dt><dd><p>
+ File system type for root file system.
+ Implement together with root option.
+ </p></dd><dt><span class="term">
+ nfsaddrs
+ </span></dt><dd><p>
+ For diskless booting.
+ Unclear whether we need this. NFS booting is desirable,
+ but I guess that will mostly be done under control of
+ DHCP. Unsupported for now.
+ </p></dd><dt><span class="term">
+ nfsroot
+ </span></dt><dd><p>
+ More diskless booting.
+ Unsupported for now.
+ </p></dd></dl></div><p>
+
+ </p></div></div><div class="section" lang="en" xml:lang="en"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a id="raid"></a>Supporting Raid Devices</h2></div></div><div></div></div><p>
+ This section discusses software raid devices from an initial boot
+ image perspective: how to get the root device up and running.
+ There are other aspects to consider, the bootloader for example:
+ if your root device is on a mirror for reliability, it would be
+ a disappointment if after the crash you still had a long downtime
+ because the MBR was only available on the crashed disk. Then there's
+ the issue of managing raid devices in combination with hotplugging:
+ once the system is operational, how should the raid devices that
+ the initial image left untouched be brought online?
+ </p><p>
+ Raid devices are managed via ioctls (mostly; there is something
+ called "autorun" in the kernel)
+ The interface from userland is simple: mknod a block device file,
+ send an ioctl to it specifying the devnos of the underlying block
+ devices and whether you'd like mirroring or striping, then send
+ a final ioctl to activate the device. This leaves the managing
+ application free to pick any unused device (minor) number and
+ has no assumptions about device file names.
+ </p><p>
+ Devices that take part in a raid set also have a "superblock",
+ a header at the end of the device that contains a uuid and indicates
+ how many drives and spares are supposed to take part in the raid set.
+ This can be used be the kernel to do consistency checking, it can also
+ be used by applications to scan for all disks belonging in a raid set,
+ even if one of the component drives is moved to another disk controller.
+ </p><p>
+ The fact that the superblock is at the end of a device has an obvious
+ advantage: if you somehow loose your raid software, the device
+ underlying a mirror can be mounted directly as a fallback measure.
+ </p><p>
+ If raid is compiled into the kernel rather than provided as a module,
+ the kernel uses superblocks at boot time to find raid sets and make
+ them available without user interaction. In this case the filename of
+ the created blockdevice is hardcoded: <tt class="filename">/dev/md\d</tt>.
+ This feature is intended for machines with root on a raid device
+ that don't use an initial boot image. This autorun feature is
+ also accessible via an ioctl, but it's not used in management
+ applications, since it won't work with an initial boot image and
+ it can be a nuisance if some daemon brought a raid set online just
+ after the administator took it off line for replacement.
+ </p><p>
+ Finally, by picking a different major device number for the raid device,
+ the raid device can be made partitionable without use of LVM.
+ </p><p>
+ There are at least three different raid management applications
+ for Linux: raidtools, the oldest; mdadm, more modern; and EVMS, a
+ suite of graphical and command line tools that manages not only raid
+ but also LVM, partitioning and file system formating. We'll only
+ consider mdadm for now. The use of mdadm is simple:
+ </p><p>
+ </p><div class="itemizedlist"><ul type="disc"><li><p>
+ There's an option to create a new device from components,
+ building the superblock.
+ </p></li><li><p>
+ Another option assembles a raid device from components,
+ assuming the superblocks are already available.
+ </p></li><li><p>
+ Optionally, a configuration file can be used, specifying which
+ components make up a device, whether a device file should
+ be created or it is assumed to exist, whether it's stripe or
+ mirror, and the uuid. Also, a wildcard pattern can be given:
+ disks matching this pattern will be searched for superblocks.
+ </p></li><li><p>
+ Information given in the configuration file can be omitted
+ on the command line. If there's a wildcard, you don't even
+ have to specify the component devices of the raid device.
+ A typical command is <tt class="code">mdadm --assemble /dev/md-root
+ auto=md uuid=...</tt>, which translates to "create
+ <tt class="filename">/dev/md-root</tt> with some unused minor number,
+ and put the components with matching uuid in it."
+ </p></li></ul></div><p>
+ </p><p>
+ So far, raid devices look fairly simple to use; the complications
+ arise when you have to play nicely with all the other software
+ on the box. It turns out there are quite a lot of packages that
+ interact with raid devices:
+ </p><p>
+ </p><div class="itemizedlist"><ul type="disc"><li><p>
+ When the md module is loaded, it registers 256 block devices
+ with <span class="application">devfs</span>. These devices
+ are not actually allocated, they're just names set up to
+ allocate the underlying device when opened. These names in
+ <span class="application">devfs</span> have no counterpart in sysfs.
+ </p></li><li><p>
+ When the LVM <span class="application">vgchange</span> is started,
+ it opens all md devices to scan for headers, only to find the
+ raid devices have no underlying components and will return
+ no data. In this process, all these stillborn md devices get
+ registered with sysfs.
+ </p></li><li><p>
+ When <span class="application">udevstart</span> is executed
+ at boot time, it walks over the sysfs tree and lets
+ <span class="application">udev</span> create block devices files for
+ every block device it finds in sysfs. The name and permissions
+ of the created file are configurable, and there is a hook to
+ initialise SELinux access controls.
+ </p></li><li><p>
+ When <span class="application">mdadm</span> is invoked with the auto
+ option, it will create a block device file with an unused
+ device number and put the requested raid volume under it.
+ The created device file is owned by whoever executed the
+ <span class="application">mdadm</span> command, permissions are 0600
+ and there are no hooks for SELinux.
+ </p></li><li><p>
+ When the Debian installer builds a system with LVM and raid, the
+ raid volumes have names such as <tt class="filename">/dev/md0</tt>,
+ where there is an assumption about the device minor number in
+ the name of the file.
+ </p></li></ul></div><p>
+ </p><p>
+ For the current Debian mkinitrd, this all works together in
+ a wonderful manner: devfs creates file names for raid devices,
+ LVM scans them with as side effect entering the devices in sysfs,
+ and after pivotroot <span class="application">udevstart</span> triggers
+ udev into creating block device files with proper permissions and
+ SELinux hooks. Later in the processing of <tt class="filename">rcS.d</tt>,
+ <span class="application">mdadm</span> will put a raid device under the
+ created special file. Convoluted but correct, except for the fact
+ that out of 256 generated raid device files, up to 255 are unused.
+ </p><p>
+ In <span class="application">yaird</span>, we do not use devfs.
+ Instead, we do a <span class="application">mknod</span> before the
+ <span class="application">mdadm</span>, taking care to use the same
+ device number that's in use in the running kernel. We expect
+ <tt class="filename">mdadm.conf</tt> to contain an <tt class="code">auto=md</tt>
+ option for any raid device files that need to be created.
+ This approach should work regardless of whether the fstab uses
+ <tt class="filename">/dev/md\d</tt> or a device number independent name.
+ </p></div><div class="section" lang="en" xml:lang="en"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a id="input"></a>Supporting Input Devices</h2></div></div><div></div></div><p>
+ A working console and keyboard during the initial boot image execution
+ is needed to enter a password for encrypted file systems; it also
+ helps while debugging. This section discusses the kernel input
+ layer and how it can be supported during image generation.
+ </p><p>
+ The console is a designated terminal, where kernel output goes, and that
+ is the initial I/O device for <tt class="filename">/sbin/init</tt>. Like all
+ terminal devices, it provides a number of functions: you can read
+ and write to it, plus it has a number of <tt class="code">ioctl()</tt>
+ functions to manage line buffering, interrupt characters and
+ baudrate or parity where applicable.
+ </p><p>
+ Terminals come in different types: it can be a VT100 or terminal
+ emulator connected via an RS232 cable, or it can be a combination
+ of a CRT and a keyboard. The keyboard can be connected via
+ USB or it can talk a byte oriented protocol via a legacy UART
+ chip.
+ </p><p>
+ The CRT is managed in two layers. The top layer, "virtual
+ terminal", manages a two dimensional array describing which letter
+ should go in which position of the screen. In fact, there are a
+ number of different arrays, and which one is actually visible on
+ the screen is selected by a keyboard combination.
+ Below the virtual terminals is a layer that actually places the
+ letters on the screen. This can be done a letter at a time,
+ using a VGA interface, or the letters can be painted pixel by
+ pixel, using a frame buffer.
+ </p><p>
+ Below the terminal concept we find the input layer. This provides a
+ unified interface to the various user input devices: mouse, keyboard,
+ PC speaker, joystick, tablet. These input devices not only
+ generate data, they can also receive input from the computer. As
+ an example, the keyboard needs computer input to operate the NUM
+ LOCK indicator. Hardware devices such as keyboards register
+ themselves with the input layer, describing their capabilities
+ (I can send relative position, have two buttons and no LEDs),
+ and the input layer assigns a handler to the hardware device.
+ The handler presents the device to upper layers, either as a char
+ special file or as the input part of a terminal device.
+ This is not a one-to-one mapping: every mouse gets its own
+ handler, but keyboard and PC speaker share a handler, so it looks
+ to userland like you have a keyboard that can do "beep".
+ </p><p>
+ In addition to handlers for specific type of upper layers (mouse,
+ joystick, touch screen) there is a generic handler that provides a
+ character device file such as <tt class="filename">/dev/input/event0</tt>
+ for every input device detected; input events are presented through
+ these devices in a unified format. The input layer generates
+ hotplug events for these generic event handlers; hotplug uses
+ <tt class="filename">modules.inputmap</tt> to load a module containing a
+ suitable upper layer event handler. The keyboard handler is a special
+ case that does not occur in this map, so for image generation there
+ is little to be learned from hotplug input support.
+ </p><p>
+ To guarantee a working console, <span class="application">yaird</span>
+ should examine <tt class="filename">/dev/console</tt>, determine
+ whether it's RS232 or hardware directly connected to the computer,
+ and then load modules for either serial port, or for virtual
+ terminals, the input layer and any hardware underlying it.
+ Unfortunately, <tt class="filename">/dev/console</tt> does not give
+ a hint what is below the terminal interface, and unfortunately,
+ lots of input devices are legacy hardware that is hard to probe
+ and only sketchily described by sysfs in kernel 2.6.10.
+ </p><p>
+ This means that a guarantee for a working console cannot be made,
+ which is why distribution kernels come with components such as the
+ keyboard and serial port driver compiled into the kernel. We can
+ do something else though: provide modules for keyboard devices
+ provided the kernel provides correct information. That covers the
+ case of USB keyboards, and that's something that's not compiled
+ into distribution kernels, so that the administrator has to add
+ modules explictly in order to get the keyboard working in
+ the initial boot image.
+ </p><p>
+ Lets examine the sources of information we have to find which input
+ hardware we have to support.
+ </p><div class="itemizedlist"><ul type="disc"><li><p>
+ In <tt class="filename">/sys/class/input</tt>, all input devices
+ are enumerated. Mostly, these only contain a
+ <tt class="filename">dev</tt> file containing major/minor number,
+ but USB devices also have a <tt class="filename">device</tt>
+ symlink into <tt class="filename">/sys/devices</tt> identifying
+ the underlying hardware.
+ </p></li><li><p>
+ In <tt class="filename">/boot/menu/grub.lst</tt>, kernel options
+ can be defined that determine whether to use a serial line as
+ console and whether to use a frame buffer. The consequence
+ is that it is fundamentally impossible to determine by looking
+ at the hardware alone what's needed to get an image that will
+ boot without problems. This probably means we'll have to consider
+ supplying some modules in the image that will only get loaded
+ depending on kernel options.
+ </p></li><li><p>
+ The file <tt class="filename">/proc/bus/input/devices</tt> gives
+ a formatted overview of all known input devices; entries look
+ like this:
+ </p><pre class="programlisting">
+ I: Bus=0003 Vendor=413c Product=2003 Version=0100
+ N: Name="DELL DELL USB Keyboard"
+ P: Phys=usb-0000:00:1d.7-4.1/input1
+ H: Handlers=kbd event2
+ B: EV=100003
+ B: KEY=7f f0000 0 3878 d801d101 1e0000 0 0 0
+ </pre><p>
+ Here the "I" line shows identification information passed to
+ the input layer by the hardware driver that is used to look
+ up the appropiate handler. "N" is a printable name provided
+ by the hardware driver. "P" is a hint at location in a bus
+ of the device; note how this line is completely unrelated to
+ the location of the hardware in
+ <tt class="filename">/sys/devices</tt>.
+ The H (Handlers) line is obvious; The B lines specify
+ capabilities of the device, plus extra information for each
+ capability. Known capabilities include:
+ </p><div class="informaltable"><table border="1"><colgroup><col /><col /></colgroup><thead><tr><th align="left">Capability</th><th align="left">Description</th></tr></thead><tbody><tr><td align="left">SYN</td><td align="left">Input event is completed</td></tr><tr><td align="left">KEY</td><td align="left">Key press/release event</td></tr><tr><td align="left">REL</td><td align="left">Relative measure, as in mouse movement</td></tr><tr><td align="left">ABS</td><td align="left">Absolute position, as in graphics
+ tablet</td></tr><tr><td align="left">MSC</td><td align="left">Miscelanious</td></tr><tr><td align="left">SND</td><td align="left">Beep</td></tr><tr><td align="left">REP</td><td align="left">Set hardware repeat</td></tr><tr><td align="left">FF</td><td align="left">Don't know</td></tr><tr><td align="left">PWR</td><td align="left">Power event: on/off switch pressed.</td></tr><tr><td align="left">FF_STATUS</td><td align="left">Don't know.</td></tr></tbody></table></div><p>
+ </p></li></ul></div><p>
+ </p><p>
+ Finally, let's consider some kernel configuration defines, the
+ corresponding modules and their function. This could be used as a
+ start to check whether all components required to make an
+ operational console are available on the generated image:
+ </p><div class="informaltable"><table border="1"><colgroup><col /><col /><col /></colgroup><thead><tr><th align="left">Define</th><th align="left">Module</th><th align="left">Description</th></tr></thead><tbody valign="top"><tr><td align="left">VT</td><td align="left">(bool)</td><td align="left">
+ Support multiple virtual terminals, irrespective of what
+ hardware is used to display letters from the virtual
+ terminal on the CRT.
+ </td></tr><tr><td align="left">VT_CONSOLE</td><td align="left">(bool)</td><td align="left">
+ Make the VT a candidate for console output. The alternative
+ is a serial line to a VT100 or terminal emulator
+ </td></tr><tr><td align="left">VGA_CONSOLE</td><td align="left">(bool)</td><td align="left">
+ Display a terminal on CRT using the VGA interface.
+ </td></tr><tr><td align="left">FRAMEBUFFER_CONSOLE</td><td align="left">fbcon</td><td align="left">
+ Display a terminal on a framebuffer, painting letters a
+ pixel at a time. This has to know about fonts.
+ </td></tr><tr><td align="left">FB_VESA</td><td align="left">vesafb</td><td align="left">
+ Implement a framebuffer based on VESA (a common standard
+ for PC graphic cards), a place where an X server or
+ the framebuffer console can write pixels to be displayed
+ on CRT.
+ There are many different framebuffer modules that
+ optimise for different graphics cards.
+ Note that while vesafb and other drivers such as intelfb
+ can be built as a module, they only function correctly
+ when built into the kernel. Most framebuffer modules
+ depend on three other modules to function correctly:
+ cfbfillrect, cfbcopyarea, cfbimgblt.
+ </td></tr><tr><td align="left">ATKBD</td><td align="left">atkbd</td><td align="left">
+ Interpret input from a standard AT or PS/2 keyboard.
+ Other keyboards use other byte codes, see for example
+ the Acorn keyboard (rpckbd).
+ </td></tr><tr><td align="left">SERIO</td><td align="left">serio</td><td align="left">
+ Module that manages a stream of bytes from and to an IO port.
+ It includes a kernel thread (kseriod) that handles the queue
+ needed to talk to slow ports. It is normally used for
+ dedicated IO ports talking to PS/2 mouse and keyboard,
+ but can also be interfaced to serial ports (COM1, COM2).
+ The atkbd driver uses a serio driver to communicate with
+ the keyboard.
+ </td></tr><tr><td align="left">SERIO_I8042</td><td align="left">i8042</td><td align="left">
+ Implement a serio stream on top of the i8042 chip, the chip
+ that connects the standard AT keyboard and PS/2 mouse to
+ the computer.
+ This is legacy hardware: it's not connected via PCI but
+ directly to the 'platform bus'.
+ When a chip such as i8042 that implements
+ serio is detected, it registers itself with the input
+ layer. The input layer then lets drivers that use serio
+ (such as atkbd and psmouse) probe whether a known device
+ is connected via the chip; if such a device is found,
+ it is registered as a new input device.
+ </td></tr><tr><td align="left">SERIAL_8250</td><td align="left">serial</td><td align="left">
+ Support for serial ports (COM1, COM2) on PC hardware.
+ Lots of other configuration options exist to support
+ multiple cards and fiddle with interrupts.
+ If compiled in rather than modular, a further option,
+ SERIAL_8250_CONSOLE, allows using the serial port as a
+ console.
+ </td></tr><tr><td align="left">USB_HID</td><td align="left">usbhid</td><td align="left">
+ Driver for USB keyboards and mice.
+ Another define, USB_HIDINPUT, needs to be true for
+ these devices to actually work.
+ </td></tr><tr><td align="left">USB_KBD</td><td align="left">usbkbd</td><td align="left">
+ Severely limited form of USB keyboard; uses the "boot
+ protocol". This conflicts with the complete driver.
+ </td></tr></tbody></table></div><p>
+ </p><p>
+ The following figure gives an example of how the various modules
+ can fit together.
+ </p><div class="figure"><a id="console-module-flow"></a><p class="title"><b>Figure 1.
+ Module relation for common console setup
+ </b></p><div class="mediaobject"><img src="figures/console.png" alt="Module relation for common console setup" /></div></div><p>
+ In practical terms, a first step toward a more robust boot image
+ is to support new keyboard types, such as USB keyboards.
+ The following algorithm should do that.
+
+ </p><div class="orderedlist"><ol type="1"><li><p>
+ Interpret <tt class="filename">/proc/bus/input/devices</tt>.
+ </p></li><li><p>
+ Look for devices that have handler kbd <span class="emphasis"><em>and</em></span>
+ that have buttons. Mice and the PC speaker don't match that
+ criterium, keyboards do.
+ </p></li><li><p>
+ You could interpret the name field of such devices if you're
+ interested in supporting legacy keyboards.
+ </p></li><li><p>
+ The devices that have handler 'kbd' also have a handler 'event\d',
+ where input is presented in a generalised event format;
+ look up this device in /sys/class/input/event\d/.
+ </p></li><li><p>
+ If it's got a device symlink, load the hardware drivers for that
+ hardware device (most likely it's usbhid plus a usb core driver).
+ </p></li><li><p>
+ Don't bother with a mknod, the input is handled via
+ <tt class="filename">/dev/console</tt>.
+ </p></li><li><p>
+ Otherwise it's presumable a legacy device; you could check for
+ the existence of
+ <tt class="filename">/sys/devices/platform/i8042/serio\d/</tt>,
+ or you could just assume the appropriate driver to be compiled in.
+ </p></li><li><p>
+ Implement support for
+ <tt class="filename">/etc/hotplug/blacklist</tt>,
+ since some USB keyboards publish two interfaces (full HID
+ and the limited boot protocol), the input layer makes both
+ visible in <tt class="filename">/proc/bus/input/devices</tt> and
+ the corresponding modules are mutually conflicting.
+ The blacklist is used to filter out one of these modules.
+ </p></li></ol></div><p>
+ </p></div><div class="section" lang="en" xml:lang="en"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a id="shlibs"></a>Supporting Shared Libraries</h2></div></div><div></div></div><p>
+ When an executable is added to the image, we want any required shared
+ libraries to be added automatically. The <tt class="code">SharedLibraries</tt>
+ module determines which files are required. This section discusses
+ the features of kernel and compiler we need to be aware of in order
+ to do this reliably.
+ </p><p>
+ Linux executables today are in ELF format; it is defined in
+ <a href="http://www.linuxbase.org/spec/book/ELF-generic/ELF-generic.html" target="_top">
+ <i class="citetitle">
+ Generic ELF Specification ELFVERSION</i></a>,
+ part of the Linux Standard Base. This is based on part of the System
+ V ABI: Tool Interface Standard (TIS), Executable and Linking Format
+ (ELF) Sepcification
+ </p><p>
+ ELF has consequences in different parts of the system: in
+ the link-editor, that needs to merge ELF object files into ELF
+ executables; in the kernel (<tt class="filename">fs/binfmt_elf.c</tt>),
+ that has to place the executable in RAM and transfer control to it,
+ and in the runtime loader, that is invoked when starting the
+ application to load the necessary shared libraries into RAM.
+ The idea is as follows.
+ </p><div class="itemizedlist"><ul type="disc"><li><p>
+ Executables are in ELF format, with a type of either
+ <tt class="code">ET_EXEC</tt> (executable) or <tt class="code">ET_DYN</tt> (shared
+ library; yes, you can execute those.) There are other types of
+ ELF file (core files for example) but you can't execute them.
+ </p></li><li><p>
+ These files contain two kind of headers: program headers and
+ section headers. Program headers define segments of the file that
+ the kernel should store consequetively in RAM; section headers define
+ parts of the file that should be treated by the link editor
+ as a single unit. Program headers normally point to a group
+ of adjacent sections.
+ </p></li><li><p>
+ The program may be statically linked or dynamically (with shared
+ libraries).
+ If it's statically linked, the kernel loads relevant segments,
+ then transfers control to main() in userland.
+ </p></li><li><p>
+ If it's dynamically linked, one of the program headers has type
+ <tt class="code">PT_INTERP</tt>. It points to a segment that contains
+ the name of a (static) executable; this executable is loaded in
+ RAM together with the segments of the dynamic executable.
+ </p></li><li><p>
+ The kernel then transfers control to the userland
+ interpreter, passing program headers and related info in a
+ fourth argument to <tt class="code">main()</tt>, after <tt class="code">envp</tt>.
+ </p></li><li><p>
+ There's one interesting twist: one of the segments loaded
+ into RAM (<tt class="filename">linux-gate.so</tt>) does not
+ come from the executable, but is a piece of kernel mapped
+ into user space. It contains a subroutine that the kernel
+ provides to do a system call; the idea is that this way,
+ the C library does not have to know which calling convention
+ for system calls is supported by the kernel and optimal for
+ the current hardware. The link editor knows nothing about
+ this, only the interpreter knows that the kernel can pass the
+ address of this subroutine together with the program headers.
+ <sup>[<a id="id2742268" href="#ftn.id2742268">7</a>]</sup>
+ </p></li><li><p>
+ The interpreter interprets the <tt class="code">.dynamic</tt> section of
+ the dynamic executable. This is a table containing various types
+ of info; if the type is <tt class="code">DT_NEEDED</tt>, the info is the
+ name of a shared library that is needed to run the executable.
+ Normally, it's the basename.
+ </p></li><li><p>
+ The interpreter searches <tt class="code">LD_LIBARY_PATH</tt> for the
+ library and loads the first working version it finds, using a
+ breath-first search. Once everything is loaded, the interpreter
+ hands over control to main in the executable.
+ </p></li><li><p>
+ Except that that's not how it really works: the path that glibc
+ uses depends on whether threads are supported, and klibc can
+ function as a <tt class="code">PT_INTERP</tt> but will not load additional
+ libraries.
+ </p></li></ul></div><p>
+ The <span class="application">ldd</span> command finds the pathnames
+ of shared libraries used by an executable. This works
+ <span class="emphasis"><em>only</em></span> for glibc: it invokes the interpreter
+ with the executable as argument plus an environment variable that
+ tells it to print the pathnames rather than load them. For other
+ C libraries, there's no guaranteed correct way to find the path of
+ shared libraries.
+ </p><p>
+ Thus, to figure out what goes on the initial ram image, first try
+ <span class="application">ldd</span>. If that gives an answer, good.
+ Otherwise, use a helper program to find <tt class="code">PT_INTERP</tt> and
+ <tt class="code">DT_NEEDED</tt>. If there's only <tt class="code">PT_INTERP</tt>, good,
+ add it to the image. If there are <tt class="code">DT_NEEDED</tt> libraries
+ as well, and they have relative rather than absolute pathnames,
+ we can't determine the full path, so don't generate an image.
+ </p><p>
+ There are a number of options to build a helper to extract the relevant
+ information from the executable:
+ </p><div class="itemizedlist"><ul type="disc"><li><p>
+ Build it in perl. The problem here is that unpacking 64-bit
+ integers is an optional part of the language.
+ </p></li><li><p>
+ Build a wrapper around <span class="application">objdump</span> or
+ <span class="application">readelf</span>. The drawback is that
+ there programs are not part of a minimal Linux distribution:
+ depending on them in <span class="application">yaird</span> would
+ increase the footprint.
+ </p></li><li><p>
+ Building a C program using libbdf. This is a library
+ intended to simplify working with object files. Drawbacks
+ are that it adds complexity that is not necessary in our
+ context since it supports multiple executable formats;
+ furthermore, at least in Debian it is treated as internal
+ to the gcc tool chain, complicating packaging the tool.
+ </p></li><li><p>
+ Building a C program based on <tt class="filename">elf.h</tt>.
+ This turns out to be easy to do.
+ </p></li></ul></div><p>
+ </p><p>
+ <span class="application">Yaird</span> uses the last appraoch listed.
+ </p></div><div class="section" lang="en" xml:lang="en"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a id="security"></a>Security</h2></div></div><div></div></div><p>
+ This section discusses security: avoiding downtime, avoiding revealing
+ sensitive information, avoiding unwanted modifications to the data;
+ either through accident or malice.
+ A good introduction to secure programming can be found in
+ <a href="http://www.dwheeler.com/secure-programs/Secure-Programs-HOWTO/" target="_top">
+ <i class="citetitle">
+ Secure Programming for Linux and Unix HOWTO</i></a>.
+ </p><p>
+ For <span class="application">yaird</span>, security is not very
+ complicated: although it runs with root privileges, the program is
+ not setuid, and all external input comes from files or programs
+ installed by the admnistrator, so our main focus is on avoiding
+ downtime caused by ignored error codes.
+ A full blown risk assessment would be overkill, so we'll just use
+ the HOWTO as a checklist to verify that the basic precautions are
+ in place.
+ </p><p>
+ </p><div class="informaltable"><table border="1"><colgroup><col /><col /><col /></colgroup><thead><tr><th align="left">Group</th><th align="left">Mitigation</th><th align="left">Status</th></tr></thead><tbody valign="top"><tr><td align="left">Bad input</td><td align="left">Verify command line</td><td align="left">
+ Yes.
+ </td></tr><tr><td align="left">Bad input</td><td align="left">Verify and clean up environment</td><td align="left">
+ Complete environment is reset at start of program.
+ </td></tr><tr><td align="left">Bad input</td><td align="left">Avoid assumptions about file descriptors</td><td align="left">
+ Handled by perl.
+ </td></tr><tr><td align="left">Bad input</td><td align="left">Verify file names</td><td align="left">
+ Perl taint check shows filenames are verified for
+ absence of odd characters before passing to
+ subprocesses.
+ TODO: examine UTF-8 impact.
+ </td></tr><tr><td align="left">Bad input</td><td align="left">Verify file content</td><td align="left">
+ File contents in sysfs verified.
+ Fstab entries properly quoted.
+ TODO: check for spaces in names of LVM volume or of
+ modules; could end up in generated /sbin/init.
+ </td></tr><tr><td align="left">Bad input</td><td align="left">Verify locale settings</td><td align="left">
+ All locale related environment variables are wiped at
+ program startup.
+ </td></tr><tr><td align="left">Bad input</td><td align="left">Verify character encoding</td><td align="left">
+ All IO is byte oriented.
+ </td></tr><tr><td align="left">Bad input</td><td align="left">Buffer overflow</td><td align="left">
+ In perl?
+ </td></tr><tr><td align="left">Program structure</td><td align="left">Separate data and control</td><td align="left">
+ Under this heading, the HOWTO discusses the dangers of
+ auto-executing macros in data files. The closest thing we
+ have to a data file are the templates that tune the image
+ to the distribution. We use a templating language that
+ does not allow code embedding, and the image generation
+ module does not make it possible for template output to
+ end up outside of the image. Conclusion: broken templates
+ can produce a broken image, but cannot affect the running
+ system.
+ </td></tr><tr><td align="left">Program structure</td><td align="left">Minimize privileges</td><td align="left">
+ The user is supposed to bring his own root privileges to
+ the party, not much to be done here. A related issue
+ is the minimizing of privileges in the system that is
+ started with the generated image. This would include
+ starting SELinux at the earliest possible moment.
+ At least in Fedora, that earliest possible moment is
+ in <tt class="filename">rc.sysinit</tt>, well past the moment
+ where the initial boot image hands over control to the newly
+ mount root file system. No <span class="application">yaird</span>
+ support needed.
+ </td></tr><tr><td align="left">Program structure</td><td align="left">Safe defaults</td><td align="left">
+ Configuration only specifies sources of information,
+ like /etc/hotplug, not much can go wrong here.
+ </td></tr><tr><td align="left">Program structure</td><td align="left">Safe configuration</td><td align="left">
+ No configuration file is used yet, so it's not read from
+ current directory either.
+ </td></tr><tr><td align="left">Program structure</td><td align="left">Fail safe</td><td align="left">
+ Planning and writing the image is separated;
+ writing only starts after planning is succesfully completed.
+ Todo: consider backout on write failure.
+ </td></tr><tr><td align="left">Program structure</td><td align="left">Avoid race conditions</td><td align="left">
+ Temporary files and directories are created
+ with the <tt class="code">File::Temp</tt> module, which is
+ resistant to name guessing attacks.
+ The completed image is installed with <tt class="code">rename</tt>
+ rather than <tt class="code">link</tt>; if an existing file is
+ overwritten, this guarantees there's no race where the
+ old image has been deleted bu the new one is not yet in
+ place. (Note that there is no option in place yet which
+ allows overwriting of existing files.)
+ To do: examine File::Temp safe_level=HIGH.
+ </td></tr><tr><td align="left">Underlying resources</td><td align="left">Handle meta characters</td><td align="left">
+ Protection against terminal escape sequences in output
+ is not yet in place.
+ </td></tr><tr><td align="left">Underlying resources</td><td align="left">Check system call results</td><td align="left">
+ Yes.
+ </td></tr><tr><td align="left">Language specific</td><td align="left">Verify perl behaviour with taint.</td><td align="left">
+ Yes.
+ </td></tr><tr><td align="left">Language specific</td><td align="left">Avoid perl open magic with 3rd argument.</td><td align="left">
+ Yes.
+ </td></tr></tbody></table></div><p>
+ </p></div><div class="section" lang="en" xml:lang="en"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a id="tools"></a>Tool Chain</h2></div></div><div></div></div><p>
+ This section discusses which tools are used in implementing
+ <span class="application">yaird</span> and why.
+ </p><p>
+ The application is built as a collection of perl modules.
+ The use of a scripting language makes consistent error checking
+ and building sane data structures a lot easier than shell
+ scripting; using perl rather than python is mainly because in
+ Debian perl has 'required' status while python is only 'standard'.
+ The code follows some conventions:
+ </p><p>
+ </p><div class="itemizedlist"><ul type="disc"><li><p>
+ Where there are multiple items of a kind, say fstab entries,
+ the perl module implements a class for individual items.
+ All classes share a common base class, <tt class="code">Obj</tt>,
+ that handles constructor argument validation and that offers
+ a place to plug in debugging code.
+ </p></li><li><p>
+ Object attributes are used via accessor methods to catch
+ typos in attribute names.
+ </p></li><li><p>
+ Objects have a <tt class="code">string</tt> method, that returns
+ a string version of the object. Binary data is not
+ guaranteed to be absent from the string version.
+ </p></li><li><p>
+ Where there are multiple items of a kind, say fstab entries,
+ the collection is implemented as a module that is not a
+ class. There is a function <tt class="code">all</tt> that returns a
+ list of all known items, and functions <tt class="code">findByXxx</tt>
+ to retrieve an item where the Xxx attribute has a given
+ value. There is an <tt class="code">init</tt> function that
+ initializes the collection; this is called automatically
+ upon first invocation of <tt class="code">all</tt> or
+ <tt class="code">findByXxx</tt>.
+ Collections may have convenience functions
+ <tt class="code">findXxxByYyy</tt>: return attribute Xxx, given a
+ value for attribute Yyy.
+ </p></li></ul></div><p>
+ </p><p>
+ The generated initrd image needs a command interpreter;
+ the choice of command interpreter is exclusively determined
+ by the image generation template.
+ At this point, both Debian and Fedora templates use the
+ <span class="application">dash</span> shell, for historical reasons only.
+ Presumably <span class="application">busybox</span> could be used to build a
+ smaller image. However, support for initramfs requires a complicated
+ construction involving a combination of mount, chroot and chdir;
+ to do that reliably, <span class="application">nash</span> as used in Fedora
+ seems a more attractive option.
+ </p><p>
+ Documentation is in docbook format, since it's widely supported,
+ supports numerous output formats, has better separation between
+ content and layout than texinfo, and provides better guarantees
+ against malformed HTML than texinfo.
+ </p><div class="simplesect" lang="en" xml:lang="en"><div class="titlepage"><div><div><h3 class="title"><a id="id2743831"></a>Autoconf</h3></div></div><div></div></div><p>
+ GNU automake is used to build and install the application,
+ where 'building' is perhaps too big a word adding the location
+ of the underlying modules to the wrapper script.
+ The reasons for using automake: it provides packagers with a
+ well known mechanism for changing installation directories,
+ and it makes it easy for developers to produce a cruft-free
+ and reproducible tarball based on the tree extracted from
+ version control.
+ </p></div><div class="simplesect" lang="en" xml:lang="en"><div class="titlepage"><div><div><h3 class="title"><a id="id2743849"></a>C Library</h3></div></div><div></div></div><p>
+ The standard C library under linux is glibc. This is big:
+ 1.2Mb, where an alternative implementation, klibc, is only 28Kb.
+ The reason klibc can be so much smaller than glibc is that a
+ lot of features of glibc, like NIS support, are not relevant for
+ applications that need to do basic stuff like loading an IDE driver.
+ </p><p>
+ There are other small libc implementations: in the embedded world,
+ dietlibc and uClibc are popular. However, klibc was specifically
+ developed to support the initial image: it's intended to be included
+ with the mainline kernel and allow moving a lot of startup magic out
+ of the kernel into the initial image. See
+ <a href="http://marc.theaimsgroup.com/?m=101070502919547" target="_top">
+ <i class="citetitle">
+ LKML: [RFC] klibc requirements, round 2</i></a>
+ for requirements on klibc; the
+ <a href="http://www.zytor.com/mailman/listinfo/klibc" target="_top">
+ <i class="citetitle">mailing list</i></a> is the most current
+ source of information.
+ </p><p>
+ Recent versions of klibc (1.0 and later) include a wrapper around
+ gcc, named klcc, that will compile a program with klibc. This means
+ <span class="application">yaird</span> does not need to include klibc,
+ but can easily be configured to use klibc rather than glibc.
+ Of course this will only pay off if <span class="emphasis"><em>every</em></span>
+ executable on the initial image uses klibc.
+ </p><p>
+ <span class="application">Yaird</span> does not have to be extended in
+ order to support klibc, but it is necessary to avoid assumptions
+ about which shared libraries are used. This is discussed in
+ <a href="#shlibs" title="Supporting Shared Libraries">the section called “Supporting Shared Libraries”</a>.
+ </p></div><div class="simplesect" lang="en" xml:lang="en"><div class="titlepage"><div><div><h3 class="title"><a id="id2743930"></a>Template Processing</h3></div></div><div></div></div><p>
+ This section discusses the templates used to transform
+ high-level actions to lines of script in the generated image.
+ These templates are intended to cope with small differences
+ between distributions: a shell that is named
+ <span class="application">dash</span> in Debian and
+ <span class="application">ash</span> in Fedora for example.
+ By processing the output of <span class="application">yaird</span>
+ through a template, we can confine the tuning of
+ <span class="application">yaird</span> for a specific distribution
+ to the template, without having to touch the core code.
+ </p><p>
+ One important function of a template library is to enforce
+ a clear separation between progam logic and output formatting:
+ there should be no way to put perl fragments inside a template.
+ See <a href="http://www.stringtemplate.org/" target="_top">StringTemplate</a>
+ for a discussion of what is needed in a templating system, plus
+ a Java implementation.
+ </p><p>
+ Lets consider a number of possible templating solutions:
+ </p><div class="itemizedlist"><ul type="disc"><li><p>
+ <a href="http://www.template-toolkit.org/" target="_top">
+ Template Toolkit</a>:
+ widely used, not in perl core distribution, does not
+ prevent mixing of code and templates.
+ </p></li><li><p>
+ <a href="http://search.cpan.org/dist/Text-Template/lib/Text/Template.pm" target="_top">
+ Text::Template</a>:
+ not in perl core distribution, does not
+ prevent mixing of code and templates.
+ </p></li><li><p>
+ Some XSLT processor. Not in core distribution,
+ more suitable for file-to-file transformations
+ than for expanding in-process data; overkill.
+ </p></li><li><p>
+ <a href="http://search.cpan.org/~samtregar/HTML-Template-2.7/Template.pm" target="_top">
+ HTML-Template</a>:
+ not in perl core distribution,
+ prevents mixing of code and templates,
+ simple, no dependencies, dual GPL/Artistic license.
+ Available in Debian as
+ <span class="application">libhtml-template-perl</span>,
+ in Fedora 2 as perl-HTML-Template, dropped from Fedora 3,
+ but available via
+ <a href="http://download.fedora.redhat.com/pub/fedora/linux/extras/" target="_top">
+ Fedora Extras</a>.
+ </p></li><li><p>
+ A home grown templating system: a simple system such as the
+ HTML-Template module is over 100Kb. We can cut down on that
+ by dropping functions we don't immediately need, but the effort
+ to get a tested and documented implementation remains substantial.
+ </p></li></ul></div><p>
+ </p><p>
+ The HTML-Template approach is the best match for our
+ requirements, so used in <span class="application">yaird</span>.
+ </p></div></div><div class="section" lang="en" xml:lang="en"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a id="authors-chap"></a>Authors</h2></div></div><div></div></div><p>
+ This is a place holder section.
+ <span class="application">Yaird</span> was written by ...
+ website here ... comments to ... bug reports ...
+ </p></div><div class="section" lang="en" xml:lang="en"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a id="license-chapter"></a>License</h2></div></div><div></div></div><p>
+ This program is free software; you can redistribute it and/or
+ modify it under the terms of the <i class="citetitle">GNU General Public
+ License</i> as published by the Free Software Foundation;
+ either version 2 of the License, or (at your option) any later
+ version.
+ </p><p>
+ 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
+ <i class="citetitle">GNU General Public License</i> for more details.
+ </p><p>
+ You should have received a copy of the <i class="citetitle">GNU General Public
+ License</i> along with this program; you may also obtain
+ a copy of the <i class="citetitle">GNU General Public License</i>
+ from the Free Software Foundation by visiting <a href="http://www.fsf.org" target="_top">their Web site</a> or by writing to
+ </p><div class="address"><p><br />
+ Free Software Foundation, Inc.<br />
+ <span class="street">59 Temple Place</span> - Suite 330<br />
+ <span class="city">Boston</span>, <span class="state">MA</span> <span class="postcode">02111-1307</span><br />
+ <span class="country">USA</span><br />
+ </p></div><p>
+ </p><div class="simplesect" lang="en" xml:lang="en"><div class="titlepage"><div><div><h3 class="title"><a id="id2744626"></a>Klibc code</h3></div></div><div></div></div><p>
+ Yaird contains code based on klibc; this code is made available
+ by the author under the following licence. The relevant source
+ files have this copyright notice included.
+ </p><pre class="programlisting">
+/* ----------------------------------------------------------------------- *
+ *
+ * Copyright 2004 H. Peter Anvin - All Rights Reserved
+ *
+ * Permission is hereby granted, free of charge, to any person
+ * obtaining a copy of this software and associated documentation
+ * files (the "Software"), to deal in the Software without
+ * restriction, including without limitation the rights to use,
+ * copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom
+ * the Software is furnished to do so, subject to the following
+ * conditions:
+ *
+ * The above copyright notice and this permission notice shall
+ * be included in all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
+ * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
+ * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+ * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+ * OTHER DEALINGS IN THE SOFTWARE.
+ *
+ * ----------------------------------------------------------------------- */
+ </pre><p>
+ </p></div></div><div class="footnotes"><br /><hr width="100" align="left" /><div class="footnote"><p><sup>[<a id="ftn.id2667183" href="#id2667183">1</a>] </sup>
+ Well, not really. I started this thingy to show off a small
+ algorithm to find required modules based on sysfs information.
+ To make that a credible demonstration, the small algorithm
+ turned out to need a lot of scaffolding to turn it into a
+ working program ...
+ </p></div><div class="footnote"><p><sup>[<a id="ftn.id2735423" href="#id2735423">2</a>] </sup>
+ An alternative and equally interesting exercise would be
+ an attempt to generate a universal initrd that could be
+ distributed together with the kernel. Such an image
+ would most likely be based on udev/hotplug.
+ </p></div><div class="footnote"><p><sup>[<a id="ftn.id2735548" href="#id2735548">3</a>] </sup>
+ Except where the distribution depends on it;
+ there are some issues with mdadm in Debian.
+ </p></div><div class="footnote"><p><sup>[<a id="ftn.id2736265" href="#id2736265">4</a>] </sup>
+ Having knowledge of the relation between module names and
+ kernel defines hardcoded into <span class="application">yaird</span>
+ is hardly elegant. Perhaps it is possible to generate this
+ mapping based on the kernel Makefiles when building the
+ kernel, but that's too complex just now.
+ </p></div><div class="footnote"><p><sup>[<a id="ftn.id2736425" href="#id2736425">5</a>] </sup>
+ It could also be an encrypted device; this case is not handled
+ yet.
+ </p></div><div class="footnote"><p><sup>[<a id="ftn.id2736794" href="#id2736794">6</a>] </sup>
+ Having device files on the image is wrong: it will
+ break if the new kernel uses different device numbers. Mostly
+ this can be avoided by using the <tt class="filename">dev</tt>
+ files provided by sysfs, but there is a bootstrap problem:
+ the <span class="application">mount</span> command needed to
+ access sysfs assumes <tt class="filename">/dev/null</tt> and
+ <tt class="filename">/dev/console</tt> are available.
+ </p></div><div class="footnote"><p><sup>[<a id="ftn.id2742268" href="#id2742268">7</a>] </sup>
+ For more info on the kernel-supplied shared library for
+ system calls, see
+
+ <a href="http://lwn.net/Articles/18411/" target="_top">
+ <i class="citetitle">LWN: How to speed up system calls</i></a>,
+ <a href="http://lwn.net/Articles/30258/" target="_top">
+ <i class="citetitle">LWN: Patch: i386 vsyscall DSO implementation</i></a>,
+ <a href="http://www.uwsg.iu.edu/hypermail/linux/kernel/0306.2/0674.html" target="_top">
+ <i class="citetitle">LKML: common name for the kernel DSO</i></a>.
+ </p></div></div></div></body></html>
--- /dev/null
+<?xml version="1.0" encoding="utf-8"?>
+
+
+
+<!DOCTYPE article
+
+ PUBLIC "-//OASIS//DTD DocBook XML V4.3//EN" "docbookx.dtd"
+
+ [
+ <!ENTITY VERSION "0.0.5">
+
+ <!ENTITY INTRODUCTION SYSTEM "intro.xml">
+ <!ENTITY SPEC SYSTEM "spec.xml">
+ <!ENTITY CONCEPTS SYSTEM "concepts.xml">
+ <!ENTITY KERNEL SYSTEM "kernel.xml">
+ <!ENTITY RAID SYSTEM "raid.xml">
+ <!ENTITY INPUT SYSTEM "input.xml">
+ <!ENTITY SHLIBS SYSTEM "shlibs.xml">
+ <!ENTITY SECURITY SYSTEM "security.xml">
+ <!ENTITY TOOLS SYSTEM "tools.xml">
+ <!ENTITY AUTHORS SYSTEM "authors.xml">
+ <!ENTITY LICENSE SYSTEM "license.xml">
+ ]
+
+>
+
+<article id="index" lang="en">
+
+ <articleinfo>
+ <title>Yaird — Yet Another Mkinitrd</title>
+ <pubdate>2005-02-09</pubdate>
+ <author>
+ <firstname>Erik</firstname>
+ <surname>van Konijnenburg</surname>
+ <email>ekonijn@xs4all.nl</email>
+ </author>
+
+ <abstract>
+ <para>
+ This memo discusses the design goals and implementation of
+ <application>Yaird</application> (Yet Another mkInitRD),
+ a proof-of-concept application to create an initial boot image,
+ a minimal filesystem used to bring a booting Linux kernel to a
+ level where it can access the root file system and use startup
+ scripts to bring the system to the normal run level. It differs
+ from earlier <application>mkinitrd</application> implementations in
+ that it leverages the information in sysfs to minimise the number
+ of special cases that the application has to know about, and in
+ that it uses a template system to separate the analysis of the
+ system from the building of the image.
+ </para>
+ </abstract>
+
+ <copyright>
+ <year>2005</year>
+ <holder>Erik van Konijnenburg</holder>
+ </copyright>
+
+ <legalnotice id="legal-notice">
+ <para>
+ Permission is granted to copy, distribute and/or modify this
+ document under the terms of the <citetitle>GNU Free Documentation
+ License</citetitle>, Version 1.1 or any later version published
+ by the Free Software Foundation with no Invariant Sections, no
+ Front-Cover Texts, and no Back-Cover Texts. You may obtain a copy
+ of the <citetitle>GNU Free Documentation License</citetitle> from
+ the Free Software Foundation by visiting <ulink type="http"
+ url="http://www.fsf.org">their Web site</ulink> or by writing to:
+ Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ Boston, MA 02111-1307, USA.
+ </para>
+ </legalnotice>
+
+ <!--
+ <releaseinfo>
+ This is version &VERSION; of the Yaird manual.
+ </releaseinfo>
+ -->
+
+ </articleinfo>
+
+&INTRODUCTION;
+&SPEC;
+&CONCEPTS;
+&KERNEL;
+&RAID;
+&INPUT;
+&SHLIBS;
+&SECURITY;
+&TOOLS;
+&AUTHORS;
+&LICENSE;
+
+</article>
--- /dev/null
+<?xml version="1.0" encoding="utf-8"?>
+
+
+
+<!DOCTYPE article
+
+ PUBLIC "-//OASIS//DTD DocBook XML V4.3//EN" "docbookx.dtd"
+
+ [
+ <!ENTITY VERSION "@VERSION@">
+
+ <!ENTITY INTRODUCTION SYSTEM "intro.xml">
+ <!ENTITY SPEC SYSTEM "spec.xml">
+ <!ENTITY CONCEPTS SYSTEM "concepts.xml">
+ <!ENTITY KERNEL SYSTEM "kernel.xml">
+ <!ENTITY RAID SYSTEM "raid.xml">
+ <!ENTITY INPUT SYSTEM "input.xml">
+ <!ENTITY SHLIBS SYSTEM "shlibs.xml">
+ <!ENTITY SECURITY SYSTEM "security.xml">
+ <!ENTITY TOOLS SYSTEM "tools.xml">
+ <!ENTITY AUTHORS SYSTEM "authors.xml">
+ <!ENTITY LICENSE SYSTEM "license.xml">
+ ]
+
+>
+
+<article id="index" lang="en">
+
+ <articleinfo>
+ <title>Yaird — Yet Another Mkinitrd</title>
+ <pubdate>2005-02-09</pubdate>
+ <author>
+ <firstname>Erik</firstname>
+ <surname>van Konijnenburg</surname>
+ <email>ekonijn@xs4all.nl</email>
+ </author>
+
+ <abstract>
+ <para>
+ This memo discusses the design goals and implementation of
+ <application>Yaird</application> (Yet Another mkInitRD),
+ a proof-of-concept application to create an initial boot image,
+ a minimal filesystem used to bring a booting Linux kernel to a
+ level where it can access the root file system and use startup
+ scripts to bring the system to the normal run level. It differs
+ from earlier <application>mkinitrd</application> implementations in
+ that it leverages the information in sysfs to minimise the number
+ of special cases that the application has to know about, and in
+ that it uses a template system to separate the analysis of the
+ system from the building of the image.
+ </para>
+ </abstract>
+
+ <copyright>
+ <year>2005</year>
+ <holder>Erik van Konijnenburg</holder>
+ </copyright>
+
+ <legalnotice id="legal-notice">
+ <para>
+ Permission is granted to copy, distribute and/or modify this
+ document under the terms of the <citetitle>GNU Free Documentation
+ License</citetitle>, Version 1.1 or any later version published
+ by the Free Software Foundation with no Invariant Sections, no
+ Front-Cover Texts, and no Back-Cover Texts. You may obtain a copy
+ of the <citetitle>GNU Free Documentation License</citetitle> from
+ the Free Software Foundation by visiting <ulink type="http"
+ url="http://www.fsf.org">their Web site</ulink> or by writing to:
+ Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ Boston, MA 02111-1307, USA.
+ </para>
+ </legalnotice>
+
+ <!--
+ <releaseinfo>
+ This is version &VERSION; of the Yaird manual.
+ </releaseinfo>
+ -->
+
+ </articleinfo>
+
+&INTRODUCTION;
+&SPEC;
+&CONCEPTS;
+&KERNEL;
+&RAID;
+&INPUT;
+&SHLIBS;
+&SECURITY;
+&TOOLS;
+&AUTHORS;
+&LICENSE;
+
+</article>
--- /dev/null
+findlibs.o findlibs.o: findlibs.c /usr/include/stdio.h \
+ /usr/include/features.h /usr/include/sys/cdefs.h \
+ /usr/include/gnu/stubs.h \
+ /usr/lib/gcc/i386-redhat-linux/3.4.2/include/stddef.h \
+ /usr/include/bits/types.h /usr/include/bits/wordsize.h \
+ /usr/include/bits/typesizes.h /usr/include/libio.h \
+ /usr/include/_G_config.h /usr/include/wchar.h /usr/include/bits/wchar.h \
+ /usr/include/gconv.h \
+ /usr/lib/gcc/i386-redhat-linux/3.4.2/include/stdarg.h \
+ /usr/include/bits/stdio_lim.h /usr/include/bits/sys_errlist.h \
+ /usr/include/bits/stdio.h /usr/include/stdlib.h \
+ /usr/include/sys/types.h /usr/include/time.h /usr/include/endian.h \
+ /usr/include/bits/endian.h /usr/include/sys/select.h \
+ /usr/include/bits/select.h /usr/include/bits/sigset.h \
+ /usr/include/bits/time.h /usr/include/sys/sysmacros.h \
+ /usr/include/bits/pthreadtypes.h /usr/include/bits/sched.h \
+ /usr/include/alloca.h /usr/include/unistd.h \
+ /usr/include/bits/posix_opt.h /usr/include/bits/confname.h \
+ /usr/include/getopt.h /usr/include/string.h /usr/include/bits/string.h \
+ /usr/include/bits/string2.h \
+ /usr/lib/gcc/i386-redhat-linux/3.4.2/include/limits.h \
+ /usr/lib/gcc/i386-redhat-linux/3.4.2/include/syslimits.h \
+ /usr/include/limits.h /usr/include/bits/posix1_lim.h \
+ /usr/include/bits/local_lim.h /usr/include/linux/limits.h \
+ /usr/include/bits/posix2_lim.h /usr/include/elf.h /usr/include/stdint.h \
+ ../include/config.h
+
+/usr/include/stdio.h:
+
+/usr/include/features.h:
+
+/usr/include/sys/cdefs.h:
+
+/usr/include/gnu/stubs.h:
+
+/usr/lib/gcc/i386-redhat-linux/3.4.2/include/stddef.h:
+
+/usr/include/bits/types.h:
+
+/usr/include/bits/wordsize.h:
+
+/usr/include/bits/typesizes.h:
+
+/usr/include/libio.h:
+
+/usr/include/_G_config.h:
+
+/usr/include/wchar.h:
+
+/usr/include/bits/wchar.h:
+
+/usr/include/gconv.h:
+
+/usr/lib/gcc/i386-redhat-linux/3.4.2/include/stdarg.h:
+
+/usr/include/bits/stdio_lim.h:
+
+/usr/include/bits/sys_errlist.h:
+
+/usr/include/bits/stdio.h:
+
+/usr/include/stdlib.h:
+
+/usr/include/sys/types.h:
+
+/usr/include/time.h:
+
+/usr/include/endian.h:
+
+/usr/include/bits/endian.h:
+
+/usr/include/sys/select.h:
+
+/usr/include/bits/select.h:
+
+/usr/include/bits/sigset.h:
+
+/usr/include/bits/time.h:
+
+/usr/include/sys/sysmacros.h:
+
+/usr/include/bits/pthreadtypes.h:
+
+/usr/include/bits/sched.h:
+
+/usr/include/alloca.h:
+
+/usr/include/unistd.h:
+
+/usr/include/bits/posix_opt.h:
+
+/usr/include/bits/confname.h:
+
+/usr/include/getopt.h:
+
+/usr/include/string.h:
+
+/usr/include/bits/string.h:
+
+/usr/include/bits/string2.h:
+
+/usr/lib/gcc/i386-redhat-linux/3.4.2/include/limits.h:
+
+/usr/lib/gcc/i386-redhat-linux/3.4.2/include/syslimits.h:
+
+/usr/include/limits.h:
+
+/usr/include/bits/posix1_lim.h:
+
+/usr/include/bits/local_lim.h:
+
+/usr/include/linux/limits.h:
+
+/usr/include/bits/posix2_lim.h:
+
+/usr/include/elf.h:
+
+/usr/include/stdint.h:
+
+../include/config.h:
--- /dev/null
+run_init.o run_init.o: run_init.c /usr/include/alloca.h \
+ /usr/include/features.h /usr/include/sys/cdefs.h \
+ /usr/include/gnu/stubs.h \
+ /usr/lib/gcc/i386-redhat-linux/3.4.2/include/stddef.h \
+ /usr/include/assert.h /usr/include/dirent.h /usr/include/bits/types.h \
+ /usr/include/bits/wordsize.h /usr/include/bits/typesizes.h \
+ /usr/include/bits/dirent.h /usr/include/bits/posix1_lim.h \
+ /usr/include/bits/local_lim.h /usr/include/linux/limits.h \
+ /usr/include/errno.h /usr/include/bits/errno.h \
+ /usr/include/linux/errno.h /usr/include/asm/errno.h \
+ /usr/include/fcntl.h /usr/include/bits/fcntl.h /usr/include/sys/types.h \
+ /usr/include/time.h /usr/include/endian.h /usr/include/bits/endian.h \
+ /usr/include/sys/select.h /usr/include/bits/select.h \
+ /usr/include/bits/sigset.h /usr/include/bits/time.h \
+ /usr/include/sys/sysmacros.h /usr/include/bits/pthreadtypes.h \
+ /usr/include/bits/sched.h /usr/include/string.h \
+ /usr/include/bits/string.h /usr/include/bits/string2.h \
+ /usr/include/stdlib.h /usr/include/stdio.h /usr/include/libio.h \
+ /usr/include/_G_config.h /usr/include/wchar.h /usr/include/bits/wchar.h \
+ /usr/include/gconv.h \
+ /usr/lib/gcc/i386-redhat-linux/3.4.2/include/stdarg.h \
+ /usr/include/bits/stdio_lim.h /usr/include/bits/sys_errlist.h \
+ /usr/include/bits/stdio.h /usr/include/unistd.h \
+ /usr/include/bits/posix_opt.h /usr/include/bits/confname.h \
+ /usr/include/getopt.h /usr/include/sys/mount.h /usr/include/sys/ioctl.h \
+ /usr/include/bits/ioctls.h /usr/include/asm/ioctls.h \
+ /usr/include/asm/ioctl.h /usr/include/bits/ioctl-types.h \
+ /usr/include/sys/ttydefaults.h /usr/include/sys/stat.h \
+ /usr/include/bits/stat.h /usr/include/sys/vfs.h \
+ /usr/include/sys/statfs.h /usr/include/bits/statfs.h \
+ ../include/config.h
+
+/usr/include/alloca.h:
+
+/usr/include/features.h:
+
+/usr/include/sys/cdefs.h:
+
+/usr/include/gnu/stubs.h:
+
+/usr/lib/gcc/i386-redhat-linux/3.4.2/include/stddef.h:
+
+/usr/include/assert.h:
+
+/usr/include/dirent.h:
+
+/usr/include/bits/types.h:
+
+/usr/include/bits/wordsize.h:
+
+/usr/include/bits/typesizes.h:
+
+/usr/include/bits/dirent.h:
+
+/usr/include/bits/posix1_lim.h:
+
+/usr/include/bits/local_lim.h:
+
+/usr/include/linux/limits.h:
+
+/usr/include/errno.h:
+
+/usr/include/bits/errno.h:
+
+/usr/include/linux/errno.h:
+
+/usr/include/asm/errno.h:
+
+/usr/include/fcntl.h:
+
+/usr/include/bits/fcntl.h:
+
+/usr/include/sys/types.h:
+
+/usr/include/time.h:
+
+/usr/include/endian.h:
+
+/usr/include/bits/endian.h:
+
+/usr/include/sys/select.h:
+
+/usr/include/bits/select.h:
+
+/usr/include/bits/sigset.h:
+
+/usr/include/bits/time.h:
+
+/usr/include/sys/sysmacros.h:
+
+/usr/include/bits/pthreadtypes.h:
+
+/usr/include/bits/sched.h:
+
+/usr/include/string.h:
+
+/usr/include/bits/string.h:
+
+/usr/include/bits/string2.h:
+
+/usr/include/stdlib.h:
+
+/usr/include/stdio.h:
+
+/usr/include/libio.h:
+
+/usr/include/_G_config.h:
+
+/usr/include/wchar.h:
+
+/usr/include/bits/wchar.h:
+
+/usr/include/gconv.h:
+
+/usr/lib/gcc/i386-redhat-linux/3.4.2/include/stdarg.h:
+
+/usr/include/bits/stdio_lim.h:
+
+/usr/include/bits/sys_errlist.h:
+
+/usr/include/bits/stdio.h:
+
+/usr/include/unistd.h:
+
+/usr/include/bits/posix_opt.h:
+
+/usr/include/bits/confname.h:
+
+/usr/include/getopt.h:
+
+/usr/include/sys/mount.h:
+
+/usr/include/sys/ioctl.h:
+
+/usr/include/bits/ioctls.h:
+
+/usr/include/asm/ioctls.h:
+
+/usr/include/asm/ioctl.h:
+
+/usr/include/bits/ioctl-types.h:
+
+/usr/include/sys/ttydefaults.h:
+
+/usr/include/sys/stat.h:
+
+/usr/include/bits/stat.h:
+
+/usr/include/sys/vfs.h:
+
+/usr/include/sys/statfs.h:
+
+/usr/include/bits/statfs.h:
+
+../include/config.h:
--- /dev/null
+# Makefile.in generated by automake 1.9.5 from Makefile.am.
+# exec/Makefile. Generated from Makefile.in by configure.
+
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004, 2005 Free Software Foundation, Inc.
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+
+
+#
+# Makefile.am -- compiling executables to be included in generated image
+# Copyright (C) 2005 Erik van Konijnenburg
+#
+# 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#
+#
+# The interesting part here is integration with klibc: it's absent.
+# The hope is that by specifying -I and -l flags to configure, an external
+# klibc build can be used. This is untested.
+#
+
+#
+# Makefile.incl -- shared defines between makefiles
+# Copyright (C) 2005 Erik van Konijnenburg
+#
+# 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#
+# - auxdir contains package specific executables that may be included
+# in the generated image
+# - perldir contains perl modules to be included by the main program
+#
+# This cannot be simply passed from the master makefile; that would
+# be invisible to automake.
+
+SOURCES = $(findlibs_SOURCES) $(run_init_SOURCES)
+
+srcdir = .
+top_srcdir = ..
+
+pkgdatadir = $(datadir)/yaird
+pkglibdir = $(libdir)/yaird
+pkgincludedir = $(includedir)/yaird
+top_builddir = ..
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+INSTALL = /usr/bin/install -c
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+aux_PROGRAMS = run_init$(EXEEXT) findlibs$(EXEEXT)
+DIST_COMMON = $(srcdir)/../Makefile.incl $(srcdir)/Makefile.am \
+ $(srcdir)/Makefile.in
+subdir = exec
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/configure.in
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+ $(ACLOCAL_M4)
+mkinstalldirs = $(install_sh) -d
+CONFIG_HEADER = $(top_builddir)/include/config.h
+CONFIG_CLEAN_FILES =
+am__installdirs = "$(DESTDIR)$(auxdir)"
+auxPROGRAMS_INSTALL = $(INSTALL_PROGRAM)
+PROGRAMS = $(aux_PROGRAMS)
+am_findlibs_OBJECTS = findlibs.$(OBJEXT)
+findlibs_OBJECTS = $(am_findlibs_OBJECTS)
+findlibs_LDADD = $(LDADD)
+am_run_init_OBJECTS = run_init.$(OBJEXT)
+run_init_OBJECTS = $(am_run_init_OBJECTS)
+run_init_LDADD = $(LDADD)
+DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir)/include
+depcomp = $(SHELL) $(top_srcdir)/depcomp
+am__depfiles_maybe = depfiles
+COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
+ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
+CCLD = $(CC)
+LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@
+SOURCES = $(findlibs_SOURCES) $(run_init_SOURCES)
+DIST_SOURCES = $(findlibs_SOURCES) $(run_init_SOURCES)
+ETAGS = etags
+CTAGS = ctags
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = ${SHELL} /home/kern/bacula/k/rescue/linux/cdrom/yaird-0.0.5/missing --run aclocal-1.9
+AMDEP_FALSE = #
+AMDEP_TRUE =
+AMTAR = ${SHELL} /home/kern/bacula/k/rescue/linux/cdrom/yaird-0.0.5/missing --run tar
+AUTOCONF = ${SHELL} /home/kern/bacula/k/rescue/linux/cdrom/yaird-0.0.5/missing --run autoconf
+AUTOHEADER = ${SHELL} /home/kern/bacula/k/rescue/linux/cdrom/yaird-0.0.5/missing --run autoheader
+AUTOMAKE = ${SHELL} /home/kern/bacula/k/rescue/linux/cdrom/yaird-0.0.5/missing --run automake-1.9
+AWK = gawk
+CC = gcc
+CCDEPMODE = depmode=gcc3
+CFLAGS = -g -O2
+CPPFLAGS =
+CYGPATH_W = echo
+DEFS = -DHAVE_CONFIG_H
+DEPDIR = .deps
+ECHO_C =
+ECHO_N = -n
+ECHO_T =
+EXEEXT =
+INITRD_TEMPLATE = Fedora
+INSTALL_DATA = ${INSTALL} -m 644
+INSTALL_PROGRAM = ${INSTALL}
+INSTALL_SCRIPT = ${INSTALL}
+INSTALL_STRIP_PROGRAM = ${SHELL} $(install_sh) -c -s
+LDFLAGS =
+LIBOBJS =
+LIBS =
+LTLIBOBJS =
+MAKEINFO = ${SHELL} /home/kern/bacula/k/rescue/linux/cdrom/yaird-0.0.5/missing --run makeinfo
+OBJEXT = o
+PACKAGE = yaird
+PACKAGE_BUGREPORT =
+PACKAGE_NAME =
+PACKAGE_STRING =
+PACKAGE_TARNAME =
+PACKAGE_VERSION =
+PATH_SEPARATOR = :
+PERL = /usr/bin/perl
+SET_MAKE =
+SHELL = /bin/sh
+STRIP =
+VERSION = 0.0.5
+XMLTO = /usr/bin/xmlto
+ac_ct_CC = gcc
+ac_ct_STRIP =
+am__fastdepCC_FALSE = #
+am__fastdepCC_TRUE =
+am__include = include
+am__leading_dot = .
+am__quote =
+am__tar = ${AMTAR} chof - "$$tardir"
+am__untar = ${AMTAR} xf -
+bindir = ${exec_prefix}/bin
+build_alias =
+datadir = ${prefix}/share
+exec_prefix = ${prefix}
+host_alias =
+includedir = ${prefix}/include
+infodir = ${prefix}/info
+install_sh = /home/kern/bacula/k/rescue/linux/cdrom/yaird-0.0.5/install-sh
+libdir = ${exec_prefix}/lib
+libexecdir = ${exec_prefix}/libexec
+localstatedir = ${prefix}/var
+mandir = ${prefix}/man
+mkdir_p = mkdir -p --
+oldincludedir = /usr/include
+prefix = /usr/local
+program_transform_name = s,x,x,
+sbindir = ${exec_prefix}/sbin
+sharedstatedir = ${prefix}/com
+sysconfdir = ${prefix}/etc
+target_alias =
+auxdir = $(pkglibdir)/exec
+perldir = $(pkglibdir)/perl
+run_init_SOURCES = run_init.c
+findlibs_SOURCES = findlibs.c
+all: all-am
+
+.SUFFIXES:
+.SUFFIXES: .c .o .obj
+$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(srcdir)/../Makefile.incl $(am__configure_deps)
+ @for dep in $?; do \
+ case '$(am__configure_deps)' in \
+ *$$dep*) \
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \
+ && exit 0; \
+ exit 1;; \
+ esac; \
+ done; \
+ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu exec/Makefile'; \
+ cd $(top_srcdir) && \
+ $(AUTOMAKE) --gnu exec/Makefile
+.PRECIOUS: Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+ @case '$?' in \
+ *config.status*) \
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+ *) \
+ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
+ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+ esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure: $(am__configure_deps)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4): $(am__aclocal_m4_deps)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+install-auxPROGRAMS: $(aux_PROGRAMS)
+ @$(NORMAL_INSTALL)
+ test -z "$(auxdir)" || $(mkdir_p) "$(DESTDIR)$(auxdir)"
+ @list='$(aux_PROGRAMS)'; for p in $$list; do \
+ p1=`echo $$p|sed 's/$(EXEEXT)$$//'`; \
+ if test -f $$p \
+ ; then \
+ f=`echo "$$p1" | sed 's,^.*/,,;$(transform);s/$$/$(EXEEXT)/'`; \
+ echo " $(INSTALL_PROGRAM_ENV) $(auxPROGRAMS_INSTALL) '$$p' '$(DESTDIR)$(auxdir)/$$f'"; \
+ $(INSTALL_PROGRAM_ENV) $(auxPROGRAMS_INSTALL) "$$p" "$(DESTDIR)$(auxdir)/$$f" || exit 1; \
+ else :; fi; \
+ done
+
+uninstall-auxPROGRAMS:
+ @$(NORMAL_UNINSTALL)
+ @list='$(aux_PROGRAMS)'; for p in $$list; do \
+ f=`echo "$$p" | sed 's,^.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/'`; \
+ echo " rm -f '$(DESTDIR)$(auxdir)/$$f'"; \
+ rm -f "$(DESTDIR)$(auxdir)/$$f"; \
+ done
+
+clean-auxPROGRAMS:
+ -test -z "$(aux_PROGRAMS)" || rm -f $(aux_PROGRAMS)
+findlibs$(EXEEXT): $(findlibs_OBJECTS) $(findlibs_DEPENDENCIES)
+ @rm -f findlibs$(EXEEXT)
+ $(LINK) $(findlibs_LDFLAGS) $(findlibs_OBJECTS) $(findlibs_LDADD) $(LIBS)
+run_init$(EXEEXT): $(run_init_OBJECTS) $(run_init_DEPENDENCIES)
+ @rm -f run_init$(EXEEXT)
+ $(LINK) $(run_init_LDFLAGS) $(run_init_OBJECTS) $(run_init_LDADD) $(LIBS)
+
+mostlyclean-compile:
+ -rm -f *.$(OBJEXT)
+
+distclean-compile:
+ -rm -f *.tab.c
+
+include ./$(DEPDIR)/findlibs.Po
+include ./$(DEPDIR)/run_init.Po
+
+.c.o:
+ if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \
+ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi
+# source='$<' object='$@' libtool=no \
+# DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) \
+# $(COMPILE) -c $<
+
+.c.obj:
+ if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ `$(CYGPATH_W) '$<'`; \
+ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi
+# source='$<' object='$@' libtool=no \
+# DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) \
+# $(COMPILE) -c `$(CYGPATH_W) '$<'`
+uninstall-info-am:
+
+ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
+ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | \
+ $(AWK) ' { files[$$0] = 1; } \
+ END { for (i in files) print i; }'`; \
+ mkid -fID $$unique
+tags: TAGS
+
+TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
+ $(TAGS_FILES) $(LISP)
+ tags=; \
+ here=`pwd`; \
+ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | \
+ $(AWK) ' { files[$$0] = 1; } \
+ END { for (i in files) print i; }'`; \
+ if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \
+ test -n "$$unique" || unique=$$empty_fix; \
+ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+ $$tags $$unique; \
+ fi
+ctags: CTAGS
+CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
+ $(TAGS_FILES) $(LISP)
+ tags=; \
+ here=`pwd`; \
+ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | \
+ $(AWK) ' { files[$$0] = 1; } \
+ END { for (i in files) print i; }'`; \
+ test -z "$(CTAGS_ARGS)$$tags$$unique" \
+ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
+ $$tags $$unique
+
+GTAGS:
+ here=`$(am__cd) $(top_builddir) && pwd` \
+ && cd $(top_srcdir) \
+ && gtags -i $(GTAGS_ARGS) $$here
+
+distclean-tags:
+ -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
+
+distdir: $(DISTFILES)
+ $(mkdir_p) $(distdir)/..
+ @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \
+ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \
+ list='$(DISTFILES)'; for file in $$list; do \
+ case $$file in \
+ $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \
+ $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \
+ esac; \
+ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+ dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \
+ if test "$$dir" != "$$file" && test "$$dir" != "."; then \
+ dir="/$$dir"; \
+ $(mkdir_p) "$(distdir)$$dir"; \
+ else \
+ dir=''; \
+ fi; \
+ if test -d $$d/$$file; then \
+ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+ cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
+ fi; \
+ cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
+ else \
+ test -f $(distdir)/$$file \
+ || cp -p $$d/$$file $(distdir)/$$file \
+ || exit 1; \
+ fi; \
+ done
+check-am: all-am
+check: check-am
+all-am: Makefile $(PROGRAMS)
+installdirs:
+ for dir in "$(DESTDIR)$(auxdir)"; do \
+ test -z "$$dir" || $(mkdir_p) "$$dir"; \
+ done
+install: install-am
+install-exec: install-exec-am
+install-data: install-data-am
+uninstall: uninstall-am
+
+install-am: all-am
+ @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-am
+install-strip:
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ `test -z '$(STRIP)' || \
+ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+mostlyclean-generic:
+
+clean-generic:
+
+distclean-generic:
+ -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+
+maintainer-clean-generic:
+ @echo "This command is intended for maintainers to use"
+ @echo "it deletes files that may require special tools to rebuild."
+clean: clean-am
+
+clean-am: clean-auxPROGRAMS clean-generic mostlyclean-am
+
+distclean: distclean-am
+ -rm -rf ./$(DEPDIR)
+ -rm -f Makefile
+distclean-am: clean-am distclean-compile distclean-generic \
+ distclean-tags
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+info: info-am
+
+info-am:
+
+install-data-am: install-auxPROGRAMS
+
+install-exec-am:
+
+install-info: install-info-am
+
+install-man:
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-am
+ -rm -rf ./$(DEPDIR)
+ -rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-compile mostlyclean-generic
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am: uninstall-auxPROGRAMS uninstall-info-am
+
+.PHONY: CTAGS GTAGS all all-am check check-am clean clean-auxPROGRAMS \
+ clean-generic ctags distclean distclean-compile \
+ distclean-generic distclean-tags distdir dvi dvi-am html \
+ html-am info info-am install install-am install-auxPROGRAMS \
+ install-data install-data-am install-exec install-exec-am \
+ install-info install-info-am install-man install-strip \
+ installcheck installcheck-am installdirs maintainer-clean \
+ maintainer-clean-generic mostlyclean mostlyclean-compile \
+ mostlyclean-generic pdf pdf-am ps ps-am tags uninstall \
+ uninstall-am uninstall-auxPROGRAMS uninstall-info-am
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
--- /dev/null
+#
+# Makefile.am -- compiling executables to be included in generated image
+# Copyright (C) 2005 Erik van Konijnenburg
+#
+# 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#
+#
+# The interesting part here is integration with klibc: it's absent.
+# The hope is that by specifying -I and -l flags to configure, an external
+# klibc build can be used. This is untested.
+#
+
+# place package-specific executables that may go on the image in
+# this directory.
+# Must be consistent with ../src
+#auxdir = $(pkglibdir)/exec
+aux_PROGRAMS = run_init findlibs
+
+include ../Makefile.incl
+
+run_init_SOURCES = run_init.c
+findlibs_SOURCES = findlibs.c
--- /dev/null
+# Makefile.in generated by automake 1.9.5 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004, 2005 Free Software Foundation, Inc.
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+@SET_MAKE@
+
+#
+# Makefile.am -- compiling executables to be included in generated image
+# Copyright (C) 2005 Erik van Konijnenburg
+#
+# 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#
+#
+# The interesting part here is integration with klibc: it's absent.
+# The hope is that by specifying -I and -l flags to configure, an external
+# klibc build can be used. This is untested.
+#
+
+#
+# Makefile.incl -- shared defines between makefiles
+# Copyright (C) 2005 Erik van Konijnenburg
+#
+# 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#
+# - auxdir contains package specific executables that may be included
+# in the generated image
+# - perldir contains perl modules to be included by the main program
+#
+# This cannot be simply passed from the master makefile; that would
+# be invisible to automake.
+
+SOURCES = $(findlibs_SOURCES) $(run_init_SOURCES)
+
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH = @srcdir@
+pkgdatadir = $(datadir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+top_builddir = ..
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+INSTALL = @INSTALL@
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+aux_PROGRAMS = run_init$(EXEEXT) findlibs$(EXEEXT)
+DIST_COMMON = $(srcdir)/../Makefile.incl $(srcdir)/Makefile.am \
+ $(srcdir)/Makefile.in
+subdir = exec
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/configure.in
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+ $(ACLOCAL_M4)
+mkinstalldirs = $(install_sh) -d
+CONFIG_HEADER = $(top_builddir)/include/config.h
+CONFIG_CLEAN_FILES =
+am__installdirs = "$(DESTDIR)$(auxdir)"
+auxPROGRAMS_INSTALL = $(INSTALL_PROGRAM)
+PROGRAMS = $(aux_PROGRAMS)
+am_findlibs_OBJECTS = findlibs.$(OBJEXT)
+findlibs_OBJECTS = $(am_findlibs_OBJECTS)
+findlibs_LDADD = $(LDADD)
+am_run_init_OBJECTS = run_init.$(OBJEXT)
+run_init_OBJECTS = $(am_run_init_OBJECTS)
+run_init_LDADD = $(LDADD)
+DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir)/include
+depcomp = $(SHELL) $(top_srcdir)/depcomp
+am__depfiles_maybe = depfiles
+COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
+ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
+CCLD = $(CC)
+LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@
+SOURCES = $(findlibs_SOURCES) $(run_init_SOURCES)
+DIST_SOURCES = $(findlibs_SOURCES) $(run_init_SOURCES)
+ETAGS = etags
+CTAGS = ctags
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+AMDEP_FALSE = @AMDEP_FALSE@
+AMDEP_TRUE = @AMDEP_TRUE@
+AMTAR = @AMTAR@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CPPFLAGS = @CPPFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EXEEXT = @EXEEXT@
+INITRD_TEMPLATE = @INITRD_TEMPLATE@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+LDFLAGS = @LDFLAGS@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LTLIBOBJS = @LTLIBOBJS@
+MAKEINFO = @MAKEINFO@
+OBJEXT = @OBJEXT@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PERL = @PERL@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+VERSION = @VERSION@
+XMLTO = @XMLTO@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_STRIP = @ac_ct_STRIP@
+am__fastdepCC_FALSE = @am__fastdepCC_FALSE@
+am__fastdepCC_TRUE = @am__fastdepCC_TRUE@
+am__include = @am__include@
+am__leading_dot = @am__leading_dot@
+am__quote = @am__quote@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build_alias = @build_alias@
+datadir = @datadir@
+exec_prefix = @exec_prefix@
+host_alias = @host_alias@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+oldincludedir = @oldincludedir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+auxdir = $(pkglibdir)/exec
+perldir = $(pkglibdir)/perl
+run_init_SOURCES = run_init.c
+findlibs_SOURCES = findlibs.c
+all: all-am
+
+.SUFFIXES:
+.SUFFIXES: .c .o .obj
+$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(srcdir)/../Makefile.incl $(am__configure_deps)
+ @for dep in $?; do \
+ case '$(am__configure_deps)' in \
+ *$$dep*) \
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \
+ && exit 0; \
+ exit 1;; \
+ esac; \
+ done; \
+ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu exec/Makefile'; \
+ cd $(top_srcdir) && \
+ $(AUTOMAKE) --gnu exec/Makefile
+.PRECIOUS: Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+ @case '$?' in \
+ *config.status*) \
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+ *) \
+ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
+ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+ esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure: $(am__configure_deps)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4): $(am__aclocal_m4_deps)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+install-auxPROGRAMS: $(aux_PROGRAMS)
+ @$(NORMAL_INSTALL)
+ test -z "$(auxdir)" || $(mkdir_p) "$(DESTDIR)$(auxdir)"
+ @list='$(aux_PROGRAMS)'; for p in $$list; do \
+ p1=`echo $$p|sed 's/$(EXEEXT)$$//'`; \
+ if test -f $$p \
+ ; then \
+ f=`echo "$$p1" | sed 's,^.*/,,;$(transform);s/$$/$(EXEEXT)/'`; \
+ echo " $(INSTALL_PROGRAM_ENV) $(auxPROGRAMS_INSTALL) '$$p' '$(DESTDIR)$(auxdir)/$$f'"; \
+ $(INSTALL_PROGRAM_ENV) $(auxPROGRAMS_INSTALL) "$$p" "$(DESTDIR)$(auxdir)/$$f" || exit 1; \
+ else :; fi; \
+ done
+
+uninstall-auxPROGRAMS:
+ @$(NORMAL_UNINSTALL)
+ @list='$(aux_PROGRAMS)'; for p in $$list; do \
+ f=`echo "$$p" | sed 's,^.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/'`; \
+ echo " rm -f '$(DESTDIR)$(auxdir)/$$f'"; \
+ rm -f "$(DESTDIR)$(auxdir)/$$f"; \
+ done
+
+clean-auxPROGRAMS:
+ -test -z "$(aux_PROGRAMS)" || rm -f $(aux_PROGRAMS)
+findlibs$(EXEEXT): $(findlibs_OBJECTS) $(findlibs_DEPENDENCIES)
+ @rm -f findlibs$(EXEEXT)
+ $(LINK) $(findlibs_LDFLAGS) $(findlibs_OBJECTS) $(findlibs_LDADD) $(LIBS)
+run_init$(EXEEXT): $(run_init_OBJECTS) $(run_init_DEPENDENCIES)
+ @rm -f run_init$(EXEEXT)
+ $(LINK) $(run_init_LDFLAGS) $(run_init_OBJECTS) $(run_init_LDADD) $(LIBS)
+
+mostlyclean-compile:
+ -rm -f *.$(OBJEXT)
+
+distclean-compile:
+ -rm -f *.tab.c
+
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/findlibs.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/run_init.Po@am__quote@
+
+.c.o:
+@am__fastdepCC_TRUE@ if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \
+@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(COMPILE) -c $<
+
+.c.obj:
+@am__fastdepCC_TRUE@ if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ `$(CYGPATH_W) '$<'`; \
+@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'`
+uninstall-info-am:
+
+ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
+ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | \
+ $(AWK) ' { files[$$0] = 1; } \
+ END { for (i in files) print i; }'`; \
+ mkid -fID $$unique
+tags: TAGS
+
+TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
+ $(TAGS_FILES) $(LISP)
+ tags=; \
+ here=`pwd`; \
+ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | \
+ $(AWK) ' { files[$$0] = 1; } \
+ END { for (i in files) print i; }'`; \
+ if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \
+ test -n "$$unique" || unique=$$empty_fix; \
+ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+ $$tags $$unique; \
+ fi
+ctags: CTAGS
+CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
+ $(TAGS_FILES) $(LISP)
+ tags=; \
+ here=`pwd`; \
+ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | \
+ $(AWK) ' { files[$$0] = 1; } \
+ END { for (i in files) print i; }'`; \
+ test -z "$(CTAGS_ARGS)$$tags$$unique" \
+ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
+ $$tags $$unique
+
+GTAGS:
+ here=`$(am__cd) $(top_builddir) && pwd` \
+ && cd $(top_srcdir) \
+ && gtags -i $(GTAGS_ARGS) $$here
+
+distclean-tags:
+ -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
+
+distdir: $(DISTFILES)
+ $(mkdir_p) $(distdir)/..
+ @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \
+ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \
+ list='$(DISTFILES)'; for file in $$list; do \
+ case $$file in \
+ $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \
+ $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \
+ esac; \
+ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+ dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \
+ if test "$$dir" != "$$file" && test "$$dir" != "."; then \
+ dir="/$$dir"; \
+ $(mkdir_p) "$(distdir)$$dir"; \
+ else \
+ dir=''; \
+ fi; \
+ if test -d $$d/$$file; then \
+ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+ cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
+ fi; \
+ cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
+ else \
+ test -f $(distdir)/$$file \
+ || cp -p $$d/$$file $(distdir)/$$file \
+ || exit 1; \
+ fi; \
+ done
+check-am: all-am
+check: check-am
+all-am: Makefile $(PROGRAMS)
+installdirs:
+ for dir in "$(DESTDIR)$(auxdir)"; do \
+ test -z "$$dir" || $(mkdir_p) "$$dir"; \
+ done
+install: install-am
+install-exec: install-exec-am
+install-data: install-data-am
+uninstall: uninstall-am
+
+install-am: all-am
+ @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-am
+install-strip:
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ `test -z '$(STRIP)' || \
+ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+mostlyclean-generic:
+
+clean-generic:
+
+distclean-generic:
+ -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+
+maintainer-clean-generic:
+ @echo "This command is intended for maintainers to use"
+ @echo "it deletes files that may require special tools to rebuild."
+clean: clean-am
+
+clean-am: clean-auxPROGRAMS clean-generic mostlyclean-am
+
+distclean: distclean-am
+ -rm -rf ./$(DEPDIR)
+ -rm -f Makefile
+distclean-am: clean-am distclean-compile distclean-generic \
+ distclean-tags
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+info: info-am
+
+info-am:
+
+install-data-am: install-auxPROGRAMS
+
+install-exec-am:
+
+install-info: install-info-am
+
+install-man:
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-am
+ -rm -rf ./$(DEPDIR)
+ -rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-compile mostlyclean-generic
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am: uninstall-auxPROGRAMS uninstall-info-am
+
+.PHONY: CTAGS GTAGS all all-am check check-am clean clean-auxPROGRAMS \
+ clean-generic ctags distclean distclean-compile \
+ distclean-generic distclean-tags distdir dvi dvi-am html \
+ html-am info info-am install install-am install-auxPROGRAMS \
+ install-data install-data-am install-exec install-exec-am \
+ install-info install-info-am install-man install-strip \
+ installcheck installcheck-am installdirs maintainer-clean \
+ maintainer-clean-generic mostlyclean mostlyclean-compile \
+ mostlyclean-generic pdf pdf-am ps ps-am tags uninstall \
+ uninstall-am uninstall-auxPROGRAMS uninstall-info-am
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
--- /dev/null
+/* findlibs.c: find libraries used by an ELF executable.
+
+ Copyright (C) 2005, Erik van Konijnenburg
+
+ 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+*/
+#include <stdio.h>
+#include <stdarg.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <string.h>
+#include <limits.h>
+#include <elf.h>
+
+#include <config.h>
+
+extern int optint;
+extern int opterr;
+extern int optopt;
+extern char * optarg;
+
+static int silent = 0; /* dont do error messages */
+static char * progname = "findlibs";
+static char * version = VERSION;
+
+void
+message (char *fmt, ...)
+{
+ va_list ap;
+ if (! silent) {
+ va_start (ap, fmt);
+ fprintf (stderr, "%s: ", progname);
+ vfprintf (stderr, fmt, ap);
+ fprintf (stderr, "\n");
+ va_end (ap);
+ }
+}
+
+void
+fatal (char *fmt, ...)
+{
+ va_list ap;
+ if (! silent) {
+ va_start (ap, fmt);
+ fprintf (stderr, "%s: ", progname);
+ vfprintf (stderr, fmt, ap);
+ fprintf (stderr, " (fatal)\n");
+ va_end (ap);
+ }
+ exit (1);
+}
+
+void
+usage (void)
+{
+ printf ("\
+ %s [ -qhv ] executable\n\
+ print dynamic loader and basenames of shared libraries for executable\n\
+ -q: do not print error messages, just give exit code\n\
+ -h: this help text\n\
+ -v: version\n\
+ corrupt ELF files cause an error exit status, non ELF-files\n\
+ or non-executable ELF files do not.\n\
+",
+ progname);
+}
+
+void *
+getStuff (FILE *fp, Elf32_Off offset, Elf32_Word size)
+{
+ int rc;
+ size_t rc2;
+ void * ptr = NULL;
+
+ ptr = malloc(size);
+ if (! ptr) {
+ fatal ("could not allocate memory");
+ }
+
+ rc = fseek (fp, offset, SEEK_SET);
+ if (rc != 0) {
+ fatal ("could not seek");
+ }
+ rc2 = fread (ptr, size, 1, fp);
+ if (rc2 != 1) {
+ fatal ("could not read");
+ }
+ return ptr;
+}
+
+void
+doOne32 (char *filename, FILE *fp)
+{
+ int i;
+ Elf32_Ehdr * ehdr = NULL;
+ Elf32_Phdr * phdr = NULL;
+ int interpIndex = -1; /* prog hdr with interp. */
+ Elf32_Shdr * shdrs = NULL;
+ int dynamicIndex = -1; /* section named .dynamic */
+ Elf32_Dyn * dynamic = NULL;
+ int dynstrIndex = -1; /* section named .dynstr */
+ char * dynstr = NULL;
+ char * sectionNames = NULL;
+
+
+ ehdr = getStuff (fp, 0, sizeof(*ehdr));
+
+ if (ehdr->e_ehsize != sizeof(*ehdr)) {
+ fatal ("bad size ehdr %s", filename);
+ }
+
+ if (! (ehdr->e_type == ET_EXEC || ehdr->e_type == ET_DYN)) {
+ message ("bad type ehdr %s", filename);
+ goto out;
+ }
+
+ if (ehdr->e_phentsize != sizeof (*phdr)) {
+ fatal ("bad size phdr %s", filename);
+ }
+
+ if (ehdr->e_phnum < 1 || ehdr->e_phnum > (65336/sizeof(*phdr))) {
+ fatal ("bad count phdr %s", filename);
+ }
+
+ phdr = getStuff (fp, ehdr->e_phoff, ehdr->e_phnum * sizeof(*phdr));
+
+ for (i = 0; i < ehdr->e_phnum; i++) {
+ if (phdr[i].p_type == PT_INTERP) {
+ if (interpIndex >= 0) {
+ fatal ("corrupt image, interp %s", filename);
+ }
+ interpIndex = i;
+ }
+ }
+
+ /*
+ * Print interpreter.
+ * Note you can have files with DT_NEEDED without interp;
+ * shared libraries are an example.
+ */
+ if (interpIndex >= 0) {
+ Elf32_Off offset = phdr[interpIndex].p_offset;
+ Elf32_Word size = phdr[interpIndex].p_filesz;
+ char * interpreter = NULL;
+
+ if (size < 2 || size > PATH_MAX) {
+ fatal ("funny interpreter %s", filename);
+ }
+
+ interpreter = getStuff (fp, offset, size);
+ if (interpreter[size - 1] != '\0') {
+ fatal ("broken interpreter %s", filename);
+ }
+
+ printf ("interpreter: %s\n", interpreter);
+
+ free (interpreter);
+ }
+
+ /*
+ * read section headers
+ */
+ if (ehdr->e_shentsize != sizeof (Elf32_Shdr)) {
+ fatal ("bad section header size %s", filename);
+ }
+ shdrs = getStuff (fp, ehdr->e_shoff, sizeof(*shdrs) * ehdr->e_shnum);
+
+ /*
+ * read section header names
+ */
+ if (ehdr->e_shstrndx >= ehdr->e_shnum) {
+ fatal ("no section names in %s", filename);
+ }
+ sectionNames = getStuff (fp, shdrs[ehdr->e_shstrndx].sh_offset,
+ shdrs[ehdr->e_shstrndx].sh_size);
+
+
+ /*
+ * Find .dynamic section and corresponding strings.
+ */
+ for (i = 0; i < ehdr->e_shnum; i++) {
+ char * name = §ionNames[shdrs[i].sh_name];
+ if (strcmp (name, ".dynamic") == 0) {
+ dynamicIndex = i;
+ }
+ else if (strcmp (name, ".dynstr") == 0) {
+ dynstrIndex = i;
+ }
+ }
+
+ if (dynamicIndex < 0) {
+ goto out;
+ }
+
+ if (dynamicIndex >= 0 && dynstrIndex < 0) {
+ fatal ("corrupt dynamic without dynstr %s", filename);
+ }
+ if (dynamicIndex > ehdr->e_shnum) {
+ fatal ("dynamic out of range %s", filename);
+ }
+ if (dynstrIndex > ehdr->e_shnum) {
+ fatal ("dynamic out of range %s", filename);
+ }
+ dynamic = getStuff (fp, shdrs[dynamicIndex].sh_offset,
+ shdrs[dynamicIndex].sh_size);
+ dynstr = getStuff (fp, shdrs[dynstrIndex].sh_offset,
+ shdrs[dynstrIndex].sh_size);
+
+ for (i = 0;; i++) {
+ if (dynamic[i].d_tag == DT_NEEDED) {
+ Elf32_Word offset = dynamic[i].d_un.d_val;
+ char *name = &dynstr[offset];
+
+ printf ("needed: %s\n", name);
+ }
+ if (dynamic[i].d_tag == DT_NULL) {
+ break;
+ }
+ }
+
+out:
+ if (dynstr) free (dynstr);
+ if (dynamic) free (dynamic);
+ if (ehdr) free (ehdr);
+ if (phdr) free (phdr);
+ if (shdrs) free (shdrs);
+ if (sectionNames) free (sectionNames);
+}
+
+
+void
+doOne64 (char *filename, FILE *fp)
+{
+ int i;
+ Elf64_Ehdr * ehdr = NULL;
+ Elf64_Phdr * phdr = NULL;
+ int interpIndex = -1; /* proghdr has interp. */
+ Elf64_Shdr * shdrs = NULL;
+ int dynamicIndex = -1; /* section named .dynamic */
+ Elf64_Dyn * dynamic = NULL;
+ int dynstrIndex = -1; /* section named .dynstr */
+ char * dynstr = NULL;
+ char * sectionNames = NULL;
+
+
+ ehdr = getStuff (fp, 0, sizeof(*ehdr));
+
+ if (ehdr->e_ehsize != sizeof(*ehdr)) {
+ fatal ("bad size ehdr %s", filename);
+ }
+
+ if (! (ehdr->e_type == ET_EXEC || ehdr->e_type == ET_DYN)) {
+ message ("bad type ehdr %s", filename);
+ goto out;
+ }
+
+ if (ehdr->e_phentsize != sizeof (*phdr)) {
+ fatal ("bad size phdr %s", filename);
+ }
+
+ if (ehdr->e_phnum < 1 || ehdr->e_phnum > (65336/sizeof(*phdr))) {
+ fatal ("bad count phdr %s", filename);
+ }
+
+ phdr = getStuff (fp, ehdr->e_phoff, ehdr->e_phnum * sizeof(*phdr));
+
+ for (i = 0; i < ehdr->e_phnum; i++) {
+ if (phdr[i].p_type == PT_INTERP) {
+ if (interpIndex >= 0) {
+ fatal ("corrupt image, interp %s", filename);
+ }
+ interpIndex = i;
+ }
+ }
+
+ /*
+ * Print interpreter.
+ * Note you can have files with DT_NEEDED without interp;
+ * shared libraries are an example.
+ */
+ if (interpIndex >= 0) {
+ Elf64_Off offset = phdr[interpIndex].p_offset;
+ Elf64_Xword size = phdr[interpIndex].p_filesz;
+ char * interpreter = NULL;
+
+ if (size < 2 || size > PATH_MAX) {
+ fatal ("funny interpreter %s", filename);
+ }
+
+ interpreter = getStuff (fp, offset, size);
+ if (interpreter[size - 1] != '\0') {
+ fatal ("broken interpreter %s", filename);
+ }
+
+ printf ("interpreter: %s\n", interpreter);
+
+ free (interpreter);
+ }
+
+ /*
+ * read section headers
+ */
+ if (ehdr->e_shentsize != sizeof (Elf64_Shdr)) {
+ fatal ("bad section header size %s", filename);
+ }
+ shdrs = getStuff (fp, ehdr->e_shoff, sizeof(*shdrs) * ehdr->e_shnum);
+
+ /*
+ * read section header names
+ */
+ if (ehdr->e_shstrndx >= ehdr->e_shnum) {
+ fatal ("no section names in %s", filename);
+ }
+ sectionNames = getStuff (fp, shdrs[ehdr->e_shstrndx].sh_offset,
+ shdrs[ehdr->e_shstrndx].sh_size);
+
+ for (i = 0; i < ehdr->e_shnum; i++) {
+ char * name = §ionNames[shdrs[i].sh_name];
+ if (strcmp (name, ".dynamic") == 0) {
+ dynamicIndex = i;
+ }
+ else if (strcmp (name, ".dynstr") == 0) {
+ dynstrIndex = i;
+ }
+ }
+
+ if (dynamicIndex < 0) {
+ goto out;
+ }
+
+ if (dynamicIndex >= 0 && dynstrIndex < 0) {
+ fatal ("corrupt dynamic without dynstr %s", filename);
+ }
+ if (dynamicIndex > ehdr->e_shnum) {
+ fatal ("dynamic out of range %s", filename);
+ }
+ if (dynstrIndex > ehdr->e_shnum) {
+ fatal ("dynamic out of range %s", filename);
+ }
+ dynamic = getStuff (fp, shdrs[dynamicIndex].sh_offset,
+ shdrs[dynamicIndex].sh_size);
+ dynstr = getStuff (fp, shdrs[dynstrIndex].sh_offset,
+ shdrs[dynstrIndex].sh_size);
+
+ for (i = 0;; i++) {
+ if (dynamic[i].d_tag == DT_NEEDED) {
+ Elf64_Xword offset = dynamic[i].d_un.d_val;
+ char *name = &dynstr[offset];
+
+ printf ("needed: %s\n", name);
+ }
+ if (dynamic[i].d_tag == DT_NULL) {
+ break;
+ }
+ }
+
+out:
+ if (dynstr) free (dynstr);
+ if (dynamic) free (dynamic);
+ if (ehdr) free (ehdr);
+ if (phdr) free (phdr);
+ if (shdrs) free (shdrs);
+ if (sectionNames) free (sectionNames);
+}
+
+
+void
+doOne (char *filename)
+{
+ FILE * fp;
+ size_t rc;
+ unsigned char magic[EI_NIDENT];
+
+ fp = fopen (filename, "r");
+ if (! fp) {
+ fatal ("could not open %s", filename);
+ }
+
+ rc = fread (magic, 1, EI_NIDENT, fp);
+ if (rc < EI_NIDENT) {
+ message ("not an ELF file: %s", filename);
+ return;
+ }
+
+ if (strncmp (magic, ELFMAG, SELFMAG) != 0) {
+ message ("not an ELF file: bad magic in %s", filename);
+ return;
+ }
+
+ switch (magic[EI_CLASS]) {
+ case ELFCLASS32:
+ doOne32 (filename, fp);
+ break;
+ case ELFCLASS64:
+ doOne64 (filename, fp);
+ break;
+ default:
+ fatal ("bad class %s", filename);
+ }
+
+ if (fclose (fp)) {
+ fatal ("could not close %s", filename);
+ }
+}
+
+int
+main (int argc, char *argv[])
+{
+ int i;
+ while ((i = getopt (argc, argv, "hvq")) >= 0) {
+ switch (i) {
+ case 'h':
+ usage ();
+ return 0;
+ case 'v':
+ message ("version %s", version);
+ return 0;
+ case 'q':
+ silent = 1;
+ break;
+ default:
+ fatal ("bad argument %c, -h for help", optopt);
+ }
+ }
+ if (optind != argc -1) {
+ fatal ("too many arguments");
+ }
+
+ doOne (argv[optind]);
+ return 0;
+}
--- /dev/null
+#ident "$Id$"
+/* ----------------------------------------------------------------------- *
+ *
+ * Copyright 2004 H. Peter Anvin - All Rights Reserved
+ *
+ * Permission is hereby granted, free of charge, to any person
+ * obtaining a copy of this software and associated documentation
+ * files (the "Software"), to deal in the Software without
+ * restriction, including without limitation the rights to use,
+ * copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom
+ * the Software is furnished to do so, subject to the following
+ * conditions:
+ *
+ * The above copyright notice and this permission notice shall
+ * be included in all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
+ * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
+ * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+ * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+ * OTHER DEALINGS IN THE SOFTWARE.
+ *
+ * ----------------------------------------------------------------------- */
+
+/*
+ * run-init.c
+ *
+ * Usage: exec run-init [-c /dev/console] /real-root /sbin/init "$@"
+ *
+ * This program should be called as the last thing in a shell script
+ * acting as /init in an initramfs; it does the following:
+ *
+ * - Delete all files in the initramfs;
+ * - Remounts /real-root onto the root filesystem;
+ * - Chroots;
+ * - Opens /dev/console;
+ * - Spawns the specified init program (with arguments.)
+ */
+
+#include <alloca.h>
+#include <assert.h>
+#include <dirent.h>
+#include <errno.h>
+#include <fcntl.h>
+#include <string.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <unistd.h>
+#include <sys/mount.h>
+#include <sys/stat.h>
+#include <sys/types.h>
+#include <sys/vfs.h>
+
+#include <config.h>
+
+
+/* Make it possible to compile on glibc by including constants that the
+ always-behind shipped glibc headers may not include. Classic example
+ on why the lack of ABI headers screw us up. */
+#ifndef TMPFS_MAGIC
+# define TMPFS_MAGIC 0x01021994
+#endif
+#ifndef RAMFS_MAGIC
+# define RAMFS_MAGIC 0x858458f6
+#endif
+#ifndef MS_MOVE
+# define MS_MOVE 8192
+#endif
+
+static const char *program;
+
+static void __attribute__((noreturn)) die(const char *msg)
+{
+ fprintf(stderr, "%s: %s: %s\n", program, msg, strerror(errno));
+ exit(1);
+}
+
+
+#ifdef ENABLE_NUKE
+static int nuke(const char *what);
+
+static int nuke_dirent(int len, const char *dir, const char *name, dev_t me)
+{
+ int bytes = len+strlen(name)+2;
+ char path[bytes];
+ int xlen;
+ struct stat st;
+
+ xlen = snprintf(path, bytes, "%s/%s", dir, name);
+ assert(xlen < bytes);
+
+ if ( lstat(path, &st) )
+ return ENOENT; /* Return 0 since already gone? */
+
+ if ( st.st_dev != me )
+ return 0; /* DO NOT recurse down mount points!!!!! */
+
+ return nuke(path);
+}
+
+/* Wipe the contents of a directory, but not the directory itself */
+static int nuke_dir(const char *what)
+{
+ int len = strlen(what);
+ DIR *dir;
+ struct dirent *d;
+ int err = 0;
+ struct stat st;
+
+ if ( lstat(what, &st) )
+ return errno;
+
+ if ( !S_ISDIR(st.st_mode) )
+ return ENOTDIR;
+
+ if ( !(dir = opendir(what)) ) {
+ /* EACCES means we can't read it. Might be empty and removable;
+ if not, the rmdir() in nuke() will trigger an error. */
+ return (errno == EACCES) ? 0 : errno;
+ }
+
+ while ( (d = readdir(dir)) ) {
+ /* Skip . and .. */
+ if ( d->d_name[0] == '.' &&
+ (d->d_name[1] == '\0' ||
+ (d->d_name[1] == '.' && d->d_name[2] == '\0')) )
+ continue;
+
+ err = nuke_dirent(len, what, d->d_name, st.st_dev);
+ if ( err ) {
+ closedir(dir);
+ return err;
+ }
+ }
+
+ closedir(dir);
+
+ return 0;
+}
+
+static int nuke(const char *what)
+{
+ int rv;
+ int err = 0;
+
+ rv = unlink(what);
+ if ( rv < 0 ) {
+ if ( errno == EISDIR ) {
+ /* It's a directory. */
+ err = nuke_dir(what);
+ if ( !err ) err = rmdir(what) ? errno : err;
+ } else {
+ err = errno;
+ }
+ }
+
+ if ( err ) {
+ errno = err;
+ die(what);
+ } else {
+ return 0;
+ }
+}
+#else /* no ENABLE_NUKE */
+static inline int
+nuke_dir(const char *what)
+{
+ return 0;
+}
+#endif /* ENABLE_NUKE */
+
+static void __attribute__((noreturn)) usage(void)
+{
+ fprintf(stderr, "Usage: exec %s [-c consoledev] /real-root /sbin/init [args]\n", program);
+ exit(1);
+}
+
+
+int main(int argc, char *argv[])
+{
+ struct stat rst, cst, ist;
+ struct statfs sfs;
+ int o;
+ int confd;
+
+ /* Command-line options and defaults */
+ const char *console = "/dev/console";
+ const char *realroot;
+ const char *init;
+ char **initargs;
+
+ /* First, parse the command line */
+ program = argv[0];
+
+ while ( (o = getopt(argc, argv, "c:")) != -1 ) {
+ if ( o == 'c' ) {
+ console = optarg;
+ } else {
+ usage();
+ }
+ }
+
+ if ( argc-optind < 2 )
+ usage();
+
+ realroot = argv[optind];
+ init = argv[optind+1];
+ initargs = argv+optind+1;
+
+ /* First, change to the new root directory */
+ if ( chdir(realroot) )
+ die("chdir to new root");
+
+ /* This is a potentially highly destructive program. Take some
+ extra precautions. */
+
+ /* Make sure the current directory is not on the same filesystem
+ as the root directory */
+ if ( stat("/", &rst) || stat(".", &cst) )
+ die("stat");
+
+ if ( rst.st_dev == cst.st_dev )
+ die("current directory on the same filesystem as the root");
+
+ /* The initramfs should have /init */
+ if ( stat("/init", &ist) || !S_ISREG(ist.st_mode) )
+ die("can't find /init on initramfs");
+
+ /* Make sure we're on a ramfs */
+ if ( statfs("/", &sfs) )
+ die("statfs /");
+ if ( sfs.f_type != RAMFS_MAGIC && sfs.f_type != TMPFS_MAGIC )
+ die("rootfs not a ramfs or tmpfs");
+
+ /* Okay, I think we should be safe... */
+
+ /* Delete rootfs contents */
+ if ( nuke_dir("/") )
+ die("nuking initramfs contents");
+
+ /* Overmount the root */
+ if ( mount(".", "/", NULL, MS_MOVE, NULL) )
+ die("overmounting root");
+
+ /* chroot, chdir */
+ if ( chroot(".") || chdir("/") )
+ die("chroot");
+
+ /* Open /dev/console */
+ if ( (confd = open(console, O_RDWR)) < 0 )
+ die("opening console");
+ dup2(confd, 0);
+ dup2(confd, 1);
+ dup2(confd, 2);
+ close(confd);
+
+ /* Spawn init */
+ execv(init, initargs);
+ die(init); /* Failed to spawn init */
+}
--- /dev/null
+/* include/config.h. Generated by configure. */
+/* include/config.h.in. Generated from configure.in by autoheader. */
+
+/* Define to nuke initramfs before moving to real root */
+/* #undef ENABLE_NUKE */
+
+/* Name of package */
+#define PACKAGE "yaird"
+
+/* Define to the address where bug reports for this package should be sent. */
+#define PACKAGE_BUGREPORT ""
+
+/* Define to the full name of this package. */
+#define PACKAGE_NAME ""
+
+/* Define to the full name and version of this package. */
+#define PACKAGE_STRING ""
+
+/* Define to the one symbol short name of this package. */
+#define PACKAGE_TARNAME ""
+
+/* Define to the version of this package. */
+#define PACKAGE_VERSION ""
+
+/* Version number of package */
+#define VERSION "0.0.5"
--- /dev/null
+/* include/config.h.in. Generated from configure.in by autoheader. */
+
+/* Define to nuke initramfs before moving to real root */
+#undef ENABLE_NUKE
+
+/* Name of package */
+#undef PACKAGE
+
+/* Define to the address where bug reports for this package should be sent. */
+#undef PACKAGE_BUGREPORT
+
+/* Define to the full name of this package. */
+#undef PACKAGE_NAME
+
+/* Define to the full name and version of this package. */
+#undef PACKAGE_STRING
+
+/* Define to the one symbol short name of this package. */
+#undef PACKAGE_TARNAME
+
+/* Define to the version of this package. */
+#undef PACKAGE_VERSION
+
+/* Version number of package */
+#undef VERSION
--- /dev/null
+timestamp for include/config.h
--- /dev/null
+#!/bin/sh
+# install - install a program, script, or datafile
+
+scriptversion=2005-02-02.21
+
+# This originates from X11R5 (mit/util/scripts/install.sh), which was
+# later released in X11R6 (xc/config/util/install.sh) with the
+# following copyright and license.
+#
+# Copyright (C) 1994 X Consortium
+#
+# Permission is hereby granted, free of charge, to any person obtaining a copy
+# of this software and associated documentation files (the "Software"), to
+# deal in the Software without restriction, including without limitation the
+# rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+# sell copies of the Software, and to permit persons to whom the Software is
+# furnished to do so, subject to the following conditions:
+#
+# The above copyright notice and this permission notice shall be included in
+# all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+# X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
+# AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNEC-
+# TION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+# Except as contained in this notice, the name of the X Consortium shall not
+# be used in advertising or otherwise to promote the sale, use or other deal-
+# ings in this Software without prior written authorization from the X Consor-
+# tium.
+#
+#
+# FSF changes to this file are in the public domain.
+#
+# Calling this script install-sh is preferred over install.sh, to prevent
+# `make' implicit rules from creating a file called install from it
+# when there is no Makefile.
+#
+# This script is compatible with the BSD install script, but was written
+# from scratch. It can only install one file at a time, a restriction
+# shared with many OS's install programs.
+
+# set DOITPROG to echo to test this script
+
+# Don't use :- since 4.3BSD and earlier shells don't like it.
+doit="${DOITPROG-}"
+
+# put in absolute paths if you don't have them in your path; or use env. vars.
+
+mvprog="${MVPROG-mv}"
+cpprog="${CPPROG-cp}"
+chmodprog="${CHMODPROG-chmod}"
+chownprog="${CHOWNPROG-chown}"
+chgrpprog="${CHGRPPROG-chgrp}"
+stripprog="${STRIPPROG-strip}"
+rmprog="${RMPROG-rm}"
+mkdirprog="${MKDIRPROG-mkdir}"
+
+chmodcmd="$chmodprog 0755"
+chowncmd=
+chgrpcmd=
+stripcmd=
+rmcmd="$rmprog -f"
+mvcmd="$mvprog"
+src=
+dst=
+dir_arg=
+dstarg=
+no_target_directory=
+
+usage="Usage: $0 [OPTION]... [-T] SRCFILE DSTFILE
+ or: $0 [OPTION]... SRCFILES... DIRECTORY
+ or: $0 [OPTION]... -t DIRECTORY SRCFILES...
+ or: $0 [OPTION]... -d DIRECTORIES...
+
+In the 1st form, copy SRCFILE to DSTFILE.
+In the 2nd and 3rd, copy all SRCFILES to DIRECTORY.
+In the 4th, create DIRECTORIES.
+
+Options:
+-c (ignored)
+-d create directories instead of installing files.
+-g GROUP $chgrpprog installed files to GROUP.
+-m MODE $chmodprog installed files to MODE.
+-o USER $chownprog installed files to USER.
+-s $stripprog installed files.
+-t DIRECTORY install into DIRECTORY.
+-T report an error if DSTFILE is a directory.
+--help display this help and exit.
+--version display version info and exit.
+
+Environment variables override the default commands:
+ CHGRPPROG CHMODPROG CHOWNPROG CPPROG MKDIRPROG MVPROG RMPROG STRIPPROG
+"
+
+while test -n "$1"; do
+ case $1 in
+ -c) shift
+ continue;;
+
+ -d) dir_arg=true
+ shift
+ continue;;
+
+ -g) chgrpcmd="$chgrpprog $2"
+ shift
+ shift
+ continue;;
+
+ --help) echo "$usage"; exit $?;;
+
+ -m) chmodcmd="$chmodprog $2"
+ shift
+ shift
+ continue;;
+
+ -o) chowncmd="$chownprog $2"
+ shift
+ shift
+ continue;;
+
+ -s) stripcmd=$stripprog
+ shift
+ continue;;
+
+ -t) dstarg=$2
+ shift
+ shift
+ continue;;
+
+ -T) no_target_directory=true
+ shift
+ continue;;
+
+ --version) echo "$0 $scriptversion"; exit $?;;
+
+ *) # When -d is used, all remaining arguments are directories to create.
+ # When -t is used, the destination is already specified.
+ test -n "$dir_arg$dstarg" && break
+ # Otherwise, the last argument is the destination. Remove it from $@.
+ for arg
+ do
+ if test -n "$dstarg"; then
+ # $@ is not empty: it contains at least $arg.
+ set fnord "$@" "$dstarg"
+ shift # fnord
+ fi
+ shift # arg
+ dstarg=$arg
+ done
+ break;;
+ esac
+done
+
+if test -z "$1"; then
+ if test -z "$dir_arg"; then
+ echo "$0: no input file specified." >&2
+ exit 1
+ fi
+ # It's OK to call `install-sh -d' without argument.
+ # This can happen when creating conditional directories.
+ exit 0
+fi
+
+for src
+do
+ # Protect names starting with `-'.
+ case $src in
+ -*) src=./$src ;;
+ esac
+
+ if test -n "$dir_arg"; then
+ dst=$src
+ src=
+
+ if test -d "$dst"; then
+ mkdircmd=:
+ chmodcmd=
+ else
+ mkdircmd=$mkdirprog
+ fi
+ else
+ # Waiting for this to be detected by the "$cpprog $src $dsttmp" command
+ # might cause directories to be created, which would be especially bad
+ # if $src (and thus $dsttmp) contains '*'.
+ if test ! -f "$src" && test ! -d "$src"; then
+ echo "$0: $src does not exist." >&2
+ exit 1
+ fi
+
+ if test -z "$dstarg"; then
+ echo "$0: no destination specified." >&2
+ exit 1
+ fi
+
+ dst=$dstarg
+ # Protect names starting with `-'.
+ case $dst in
+ -*) dst=./$dst ;;
+ esac
+
+ # If destination is a directory, append the input filename; won't work
+ # if double slashes aren't ignored.
+ if test -d "$dst"; then
+ if test -n "$no_target_directory"; then
+ echo "$0: $dstarg: Is a directory" >&2
+ exit 1
+ fi
+ dst=$dst/`basename "$src"`
+ fi
+ fi
+
+ # This sed command emulates the dirname command.
+ dstdir=`echo "$dst" | sed -e 's,/*$,,;s,[^/]*$,,;s,/*$,,;s,^$,.,'`
+
+ # Make sure that the destination directory exists.
+
+ # Skip lots of stat calls in the usual case.
+ if test ! -d "$dstdir"; then
+ defaultIFS='
+ '
+ IFS="${IFS-$defaultIFS}"
+
+ oIFS=$IFS
+ # Some sh's can't handle IFS=/ for some reason.
+ IFS='%'
+ set x `echo "$dstdir" | sed -e 's@/@%@g' -e 's@^%@/@'`
+ shift
+ IFS=$oIFS
+
+ pathcomp=
+
+ while test $# -ne 0 ; do
+ pathcomp=$pathcomp$1
+ shift
+ if test ! -d "$pathcomp"; then
+ $mkdirprog "$pathcomp"
+ # mkdir can fail with a `File exist' error in case several
+ # install-sh are creating the directory concurrently. This
+ # is OK.
+ test -d "$pathcomp" || exit
+ fi
+ pathcomp=$pathcomp/
+ done
+ fi
+
+ if test -n "$dir_arg"; then
+ $doit $mkdircmd "$dst" \
+ && { test -z "$chowncmd" || $doit $chowncmd "$dst"; } \
+ && { test -z "$chgrpcmd" || $doit $chgrpcmd "$dst"; } \
+ && { test -z "$stripcmd" || $doit $stripcmd "$dst"; } \
+ && { test -z "$chmodcmd" || $doit $chmodcmd "$dst"; }
+
+ else
+ dstfile=`basename "$dst"`
+
+ # Make a couple of temp file names in the proper directory.
+ dsttmp=$dstdir/_inst.$$_
+ rmtmp=$dstdir/_rm.$$_
+
+ # Trap to clean up those temp files at exit.
+ trap 'ret=$?; rm -f "$dsttmp" "$rmtmp" && exit $ret' 0
+ trap '(exit $?); exit' 1 2 13 15
+
+ # Copy the file name to the temp name.
+ $doit $cpprog "$src" "$dsttmp" &&
+
+ # and set any options; do chmod last to preserve setuid bits.
+ #
+ # If any of these fail, we abort the whole thing. If we want to
+ # ignore errors from any of these, just make sure not to ignore
+ # errors from the above "$doit $cpprog $src $dsttmp" command.
+ #
+ { test -z "$chowncmd" || $doit $chowncmd "$dsttmp"; } \
+ && { test -z "$chgrpcmd" || $doit $chgrpcmd "$dsttmp"; } \
+ && { test -z "$stripcmd" || $doit $stripcmd "$dsttmp"; } \
+ && { test -z "$chmodcmd" || $doit $chmodcmd "$dsttmp"; } &&
+
+ # Now rename the file to the real destination.
+ { $doit $mvcmd -f "$dsttmp" "$dstdir/$dstfile" 2>/dev/null \
+ || {
+ # The rename failed, perhaps because mv can't rename something else
+ # to itself, or perhaps because mv is so ancient that it does not
+ # support -f.
+
+ # Now remove or move aside any old file at destination location.
+ # We try this two ways since rm can't unlink itself on some
+ # systems and the destination file might be busy for other
+ # reasons. In this case, the final cleanup might fail but the new
+ # file should still install successfully.
+ {
+ if test -f "$dstdir/$dstfile"; then
+ $doit $rmcmd -f "$dstdir/$dstfile" 2>/dev/null \
+ || $doit $mvcmd -f "$dstdir/$dstfile" "$rmtmp" 2>/dev/null \
+ || {
+ echo "$0: cannot unlink or rename $dstdir/$dstfile" >&2
+ (exit 1); exit 1
+ }
+ else
+ :
+ fi
+ } &&
+
+ # Now rename the file to the real destination.
+ $doit $mvcmd "$dsttmp" "$dstdir/$dstfile"
+ }
+ }
+ fi || { (exit 1); exit 1; }
+done
+
+# The final little trick to "correctly" pass the exit status to the exit trap.
+{
+ (exit 0); exit 0
+}
+
+# Local variables:
+# eval: (add-hook 'write-file-hooks 'time-stamp)
+# time-stamp-start: "scriptversion="
+# time-stamp-format: "%:y-%02m-%02d.%02H"
+# time-stamp-end: "$"
+# End:
--- /dev/null
+#! /bin/sh
+# Common stub for a few missing GNU programs while installing.
+
+scriptversion=2005-02-08.22
+
+# Copyright (C) 1996, 1997, 1999, 2000, 2002, 2003, 2004, 2005
+# Free Software Foundation, Inc.
+# Originally by Fran,cois Pinard <pinard@iro.umontreal.ca>, 1996.
+
+# 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, 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., 59 Temple Place - Suite 330, Boston, MA
+# 02111-1307, USA.
+
+# As a special exception to the GNU General Public License, if you
+# distribute this file as part of a program that contains a
+# configuration script generated by Autoconf, you may include it under
+# the same distribution terms that you use for the rest of that program.
+
+if test $# -eq 0; then
+ echo 1>&2 "Try \`$0 --help' for more information"
+ exit 1
+fi
+
+run=:
+
+# In the cases where this matters, `missing' is being run in the
+# srcdir already.
+if test -f configure.ac; then
+ configure_ac=configure.ac
+else
+ configure_ac=configure.in
+fi
+
+msg="missing on your system"
+
+case "$1" in
+--run)
+ # Try to run requested program, and just exit if it succeeds.
+ run=
+ shift
+ "$@" && exit 0
+ # Exit code 63 means version mismatch. This often happens
+ # when the user try to use an ancient version of a tool on
+ # a file that requires a minimum version. In this case we
+ # we should proceed has if the program had been absent, or
+ # if --run hadn't been passed.
+ if test $? = 63; then
+ run=:
+ msg="probably too old"
+ fi
+ ;;
+
+ -h|--h|--he|--hel|--help)
+ echo "\
+$0 [OPTION]... PROGRAM [ARGUMENT]...
+
+Handle \`PROGRAM [ARGUMENT]...' for when PROGRAM is missing, or return an
+error status if there is no known handling for PROGRAM.
+
+Options:
+ -h, --help display this help and exit
+ -v, --version output version information and exit
+ --run try to run the given command, and emulate it if it fails
+
+Supported PROGRAM values:
+ aclocal touch file \`aclocal.m4'
+ autoconf touch file \`configure'
+ autoheader touch file \`config.h.in'
+ automake touch all \`Makefile.in' files
+ bison create \`y.tab.[ch]', if possible, from existing .[ch]
+ flex create \`lex.yy.c', if possible, from existing .c
+ help2man touch the output file
+ lex create \`lex.yy.c', if possible, from existing .c
+ makeinfo touch the output file
+ tar try tar, gnutar, gtar, then tar without non-portable flags
+ yacc create \`y.tab.[ch]', if possible, from existing .[ch]
+
+Send bug reports to <bug-automake@gnu.org>."
+ exit $?
+ ;;
+
+ -v|--v|--ve|--ver|--vers|--versi|--versio|--version)
+ echo "missing $scriptversion (GNU Automake)"
+ exit $?
+ ;;
+
+ -*)
+ echo 1>&2 "$0: Unknown \`$1' option"
+ echo 1>&2 "Try \`$0 --help' for more information"
+ exit 1
+ ;;
+
+esac
+
+# Now exit if we have it, but it failed. Also exit now if we
+# don't have it and --version was passed (most likely to detect
+# the program).
+case "$1" in
+ lex|yacc)
+ # Not GNU programs, they don't have --version.
+ ;;
+
+ tar)
+ if test -n "$run"; then
+ echo 1>&2 "ERROR: \`tar' requires --run"
+ exit 1
+ elif test "x$2" = "x--version" || test "x$2" = "x--help"; then
+ exit 1
+ fi
+ ;;
+
+ *)
+ if test -z "$run" && ($1 --version) > /dev/null 2>&1; then
+ # We have it, but it failed.
+ exit 1
+ elif test "x$2" = "x--version" || test "x$2" = "x--help"; then
+ # Could not run --version or --help. This is probably someone
+ # running `$TOOL --version' or `$TOOL --help' to check whether
+ # $TOOL exists and not knowing $TOOL uses missing.
+ exit 1
+ fi
+ ;;
+esac
+
+# If it does not exist, or fails to run (possibly an outdated version),
+# try to emulate it.
+case "$1" in
+ aclocal*)
+ echo 1>&2 "\
+WARNING: \`$1' is $msg. You should only need it if
+ you modified \`acinclude.m4' or \`${configure_ac}'. You might want
+ to install the \`Automake' and \`Perl' packages. Grab them from
+ any GNU archive site."
+ touch aclocal.m4
+ ;;
+
+ autoconf)
+ echo 1>&2 "\
+WARNING: \`$1' is $msg. You should only need it if
+ you modified \`${configure_ac}'. You might want to install the
+ \`Autoconf' and \`GNU m4' packages. Grab them from any GNU
+ archive site."
+ touch configure
+ ;;
+
+ autoheader)
+ echo 1>&2 "\
+WARNING: \`$1' is $msg. You should only need it if
+ you modified \`acconfig.h' or \`${configure_ac}'. You might want
+ to install the \`Autoconf' and \`GNU m4' packages. Grab them
+ from any GNU archive site."
+ files=`sed -n 's/^[ ]*A[CM]_CONFIG_HEADER(\([^)]*\)).*/\1/p' ${configure_ac}`
+ test -z "$files" && files="config.h"
+ touch_files=
+ for f in $files; do
+ case "$f" in
+ *:*) touch_files="$touch_files "`echo "$f" |
+ sed -e 's/^[^:]*://' -e 's/:.*//'`;;
+ *) touch_files="$touch_files $f.in";;
+ esac
+ done
+ touch $touch_files
+ ;;
+
+ automake*)
+ echo 1>&2 "\
+WARNING: \`$1' is $msg. You should only need it if
+ you modified \`Makefile.am', \`acinclude.m4' or \`${configure_ac}'.
+ You might want to install the \`Automake' and \`Perl' packages.
+ Grab them from any GNU archive site."
+ find . -type f -name Makefile.am -print |
+ sed 's/\.am$/.in/' |
+ while read f; do touch "$f"; done
+ ;;
+
+ autom4te)
+ echo 1>&2 "\
+WARNING: \`$1' is needed, but is $msg.
+ You might have modified some files without having the
+ proper tools for further handling them.
+ You can get \`$1' as part of \`Autoconf' from any GNU
+ archive site."
+
+ file=`echo "$*" | sed -n 's/.*--output[ =]*\([^ ]*\).*/\1/p'`
+ test -z "$file" && file=`echo "$*" | sed -n 's/.*-o[ ]*\([^ ]*\).*/\1/p'`
+ if test -f "$file"; then
+ touch $file
+ else
+ test -z "$file" || exec >$file
+ echo "#! /bin/sh"
+ echo "# Created by GNU Automake missing as a replacement of"
+ echo "# $ $@"
+ echo "exit 0"
+ chmod +x $file
+ exit 1
+ fi
+ ;;
+
+ bison|yacc)
+ echo 1>&2 "\
+WARNING: \`$1' $msg. You should only need it if
+ you modified a \`.y' file. You may need the \`Bison' package
+ in order for those modifications to take effect. You can get
+ \`Bison' from any GNU archive site."
+ rm -f y.tab.c y.tab.h
+ if [ $# -ne 1 ]; then
+ eval LASTARG="\${$#}"
+ case "$LASTARG" in
+ *.y)
+ SRCFILE=`echo "$LASTARG" | sed 's/y$/c/'`
+ if [ -f "$SRCFILE" ]; then
+ cp "$SRCFILE" y.tab.c
+ fi
+ SRCFILE=`echo "$LASTARG" | sed 's/y$/h/'`
+ if [ -f "$SRCFILE" ]; then
+ cp "$SRCFILE" y.tab.h
+ fi
+ ;;
+ esac
+ fi
+ if [ ! -f y.tab.h ]; then
+ echo >y.tab.h
+ fi
+ if [ ! -f y.tab.c ]; then
+ echo 'main() { return 0; }' >y.tab.c
+ fi
+ ;;
+
+ lex|flex)
+ echo 1>&2 "\
+WARNING: \`$1' is $msg. You should only need it if
+ you modified a \`.l' file. You may need the \`Flex' package
+ in order for those modifications to take effect. You can get
+ \`Flex' from any GNU archive site."
+ rm -f lex.yy.c
+ if [ $# -ne 1 ]; then
+ eval LASTARG="\${$#}"
+ case "$LASTARG" in
+ *.l)
+ SRCFILE=`echo "$LASTARG" | sed 's/l$/c/'`
+ if [ -f "$SRCFILE" ]; then
+ cp "$SRCFILE" lex.yy.c
+ fi
+ ;;
+ esac
+ fi
+ if [ ! -f lex.yy.c ]; then
+ echo 'main() { return 0; }' >lex.yy.c
+ fi
+ ;;
+
+ help2man)
+ echo 1>&2 "\
+WARNING: \`$1' is $msg. You should only need it if
+ you modified a dependency of a manual page. You may need the
+ \`Help2man' package in order for those modifications to take
+ effect. You can get \`Help2man' from any GNU archive site."
+
+ file=`echo "$*" | sed -n 's/.*-o \([^ ]*\).*/\1/p'`
+ if test -z "$file"; then
+ file=`echo "$*" | sed -n 's/.*--output=\([^ ]*\).*/\1/p'`
+ fi
+ if [ -f "$file" ]; then
+ touch $file
+ else
+ test -z "$file" || exec >$file
+ echo ".ab help2man is required to generate this page"
+ exit 1
+ fi
+ ;;
+
+ makeinfo)
+ echo 1>&2 "\
+WARNING: \`$1' is $msg. You should only need it if
+ you modified a \`.texi' or \`.texinfo' file, or any other file
+ indirectly affecting the aspect of the manual. The spurious
+ call might also be the consequence of using a buggy \`make' (AIX,
+ DU, IRIX). You might want to install the \`Texinfo' package or
+ the \`GNU make' package. Grab either from any GNU archive site."
+ # The file to touch is that specified with -o ...
+ file=`echo "$*" | sed -n 's/.*-o \([^ ]*\).*/\1/p'`
+ if test -z "$file"; then
+ # ... or it is the one specified with @setfilename ...
+ infile=`echo "$*" | sed 's/.* \([^ ]*\) *$/\1/'`
+ file=`sed -n '/^@setfilename/ { s/.* \([^ ]*\) *$/\1/; p; q; }' $infile`
+ # ... or it is derived from the source name (dir/f.texi becomes f.info)
+ test -z "$file" && file=`echo "$infile" | sed 's,.*/,,;s,.[^.]*$,,'`.info
+ fi
+ touch $file
+ ;;
+
+ tar)
+ shift
+
+ # We have already tried tar in the generic part.
+ # Look for gnutar/gtar before invocation to avoid ugly error
+ # messages.
+ if (gnutar --version > /dev/null 2>&1); then
+ gnutar "$@" && exit 0
+ fi
+ if (gtar --version > /dev/null 2>&1); then
+ gtar "$@" && exit 0
+ fi
+ firstarg="$1"
+ if shift; then
+ case "$firstarg" in
+ *o*)
+ firstarg=`echo "$firstarg" | sed s/o//`
+ tar "$firstarg" "$@" && exit 0
+ ;;
+ esac
+ case "$firstarg" in
+ *h*)
+ firstarg=`echo "$firstarg" | sed s/h//`
+ tar "$firstarg" "$@" && exit 0
+ ;;
+ esac
+ fi
+
+ echo 1>&2 "\
+WARNING: I can't seem to be able to run \`tar' with the given arguments.
+ You may want to install GNU tar or Free paxutils, or check the
+ command line arguments."
+ exit 1
+ ;;
+
+ *)
+ echo 1>&2 "\
+WARNING: \`$1' is needed, and is $msg.
+ You might have modified some files without having the
+ proper tools for further handling them. Check the \`README' file,
+ it often tells you about the needed prerequisites for installing
+ this package. You may also peek at any GNU archive site, in case
+ some other package would contain this missing \`$1' program."
+ exit 1
+ ;;
+esac
+
+exit 0
+
+# Local variables:
+# eval: (add-hook 'write-file-hooks 'time-stamp)
+# time-stamp-start: "scriptversion="
+# time-stamp-format: "%:y-%02m-%02d.%02H"
+# time-stamp-end: "$"
+# End:
--- /dev/null
+#!perl -w
+#
+# ActionList -- record and expand actions to be performed by the initrd image
+# Copyright (C) 2005 Erik van Konijnenburg
+#
+# 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#
+# Actions are represented by a hash, containing at least:
+# - action
+# - target
+#
+# Actions are added to the end of the list, but if an action
+# with same name and target already exists, the later action
+# is considered redundant and silently omited.
+#
+# The point of an action list is that it can be expanded to an Image,
+# an exact description of every file, directory and script that should
+# go on the initrd image.
+#
+# This expansion is driven by templates, where attributes from the
+# hash may be inserted in file names or script fragments.
+# There are attributes that are added automatically to every action:
+# - version, the required kernel version.
+#
+
+use strict;
+use warnings;
+use Base;
+use Conf;
+use Template;
+use HTML::Template;
+
+package ActionList;
+use base 'Obj';
+
+
+sub fill {
+ my $self = shift;
+ $self->SUPER::fill();
+ $self->{actions} = [];
+}
+
+
+#
+# add -- add an action to the plan.
+#
+sub add {
+ my ($self, $action, $target, %hash ) = @_;
+
+ for my $a (@{$self->{actions}}) {
+ if ($a->{action} eq $action && $a->{target} eq $target) {
+ Base::debug ("redundant action: $action, $target");
+ return;
+ }
+ }
+
+ my $pairs = "";
+ for my $key (sort keys %hash) {
+ my $val = $hash{$key};
+ $pairs .= "$key=$val ";
+ }
+ Base::info ("action: $action, $target {$pairs}");
+
+ push @{$self->{actions}}, {
+ action => $action,
+ target => $target,
+ version => Conf::get('version'),
+ appVersion => Conf::get('appVersion'),
+ auxDir => Conf::get('auxDir'),
+ %hash
+ };
+}
+
+
+#
+# string -- render an action list.
+#
+sub string {
+ my $self = shift;
+ my $result = "";
+ for my $a (@{$self->{actions}}) {
+ my $action = $a->{action};
+ my $target = $a->{target};
+ my $pairs = "";
+ for my $key (sort keys %{$a}) {
+ next if $key eq "action";
+ next if $key eq "target";
+ next if $key eq "version";
+ next if $key eq "appVersion";
+ next if $key eq "auxDir";
+ my $val = $a->{$key};
+ my $pairs .= "$key=$val ";
+ }
+ $result .= "\t\t$action $target {$pairs}\n";
+ }
+ return $result;
+}
+
+#
+# filter -- helper function to get rid of leading whitespace
+# in template lines. Needed because of '#!/bin/dash' lines
+# in prologue.
+#
+my $filter = sub {
+ my $textref = shift;
+ $$textref =~ s/^\s+//mg;
+};
+
+
+#
+# expandFragment -- given a fragment of text, and a hash
+# of parameter settings, return the fragment with HTML::Template
+# expansion applied.
+# Don't die on bad parameters: caller cannot know which parameters
+# the template is willing to use.
+#
+sub expandFragment ($$) {
+ my ($fragment, $params) = @_;
+ my $htempl = HTML::Template->new (
+ scalarref => \$fragment,
+ die_on_bad_params => 0,
+ filter => $filter);
+ $htempl->param ($params);
+ my $result = $htempl->output();
+ return $result;
+}
+
+
+#
+# expand -- given an overall plan, return an initrd image specification.
+#
+sub expand {
+ my $self = shift;
+ my $image = Image->new();
+
+ for my $a (@{$self->{actions}}) {
+ my $action = $a->{action};
+ my $template = Template::template ($action);
+ Base::assert (defined ($template));
+
+ for my $file (@{$template->{files}}) {
+ my $fileName = expandFragment ($file, $a);
+ $image->addFile ($fileName);
+ }
+
+ for my $dir (@{$template->{directories}}) {
+ my $dirName = expandFragment ($dir, $a);
+ $image->addDirectory ($dirName);
+ }
+
+ for my $tree (@{$template->{trees}}) {
+ my $treeName = expandFragment ($tree, $a);
+ $image->addTree ($treeName);
+ }
+
+ for my $scriptTName (sort keys %{$template->{scripts}}) {
+ my $scriptName = expandFragment ($scriptTName, $a);
+ my $tContent = $template->{scripts}{$scriptTName};
+ my $content = expandFragment ($tContent, $a);
+ $image->addScriptLine ($scriptName, $content);
+ }
+
+ }
+
+ return $image;
+}
+
+1;
--- /dev/null
+#!perl -w
+#
+# ActiveBlockDev -- a single blockdev, as found in /sys
+# Copyright (C) 2005 Erik van Konijnenburg
+#
+# 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#
+# The blockdev can be a whole device or a partition.
+# descriptors contain:
+# - name, path as found in /sys (sda, sda/sda1)
+# - devno, as found in /sys (8:1)
+# - parent, undef for whole device, maj:minor of parent otherwise
+# - hw, path to underlying hardware device,
+# eg an ide controller somewhere on a PCI bus.
+# this is a path relative to /sys/devices,
+# and can be undef (eg for ram disk)
+# - special, a block special file giving access to the device
+# in the currently running kernel, or undef.
+# - yspecial, a block special file giving access to the device
+# in the generated initrd image. This often needs
+# a mknod on the generated image. It's not convenient
+# to use the previous special, since that may be in
+# a subdirectory unavailable on the initrd image.
+# It's also not exactly /dev/$name, since LVM logical
+# volumes follow another convention.
+# - partitions, list of partitions contained in the device.
+# these partitions are also ActiveBlockDevs.
+#
+# NOTE: the partition list relies on ActiveBlockDevTab making
+# a complete scan of all block devices, each partition registering
+# itself as partition with the parent device.
+#
+use strict;
+use warnings;
+use BlockSpecialFileTab;
+use LvmTab;
+package ActiveBlockDev;
+use base 'Obj';
+
+
+sub fill {
+ my $self = shift;
+ $self->SUPER::fill();
+ $self->takeArgs ('name', 'devno', 'parent', 'hw');
+ $self->{partitions} = [];
+ if (defined ($self->parent)) {
+ push @{$self->parent->partitions}, $self;
+ }
+
+ my $bfs = BlockSpecialFileTab::findByDevno($self->devno);
+ if (defined ($bfs)) {
+ $self->{special} = $bfs->path;
+ }
+ else {
+ $self->{special} = undef;
+ }
+}
+
+sub name { return $_[0]->{name}; }
+sub devno { return $_[0]->{devno}; }
+sub parent { return $_[0]->{parent}; }
+sub hw { return $_[0]->{hw}; }
+sub special { return $_[0]->{special}; }
+sub partitions { return $_[0]->{partitions}; }
+
+sub string {
+ my $self = shift;
+ my $name = $self->name;
+ my $devno = $self->devno;
+ my $parent = (defined($self->parent) ? $self->parent->name : "--");
+ my $hw = ($self->hw or "--");
+ my $special = ($self->special or "--");
+ my $yspecial = ($self->yspecial or "--");
+ return "$name($devno) in $parent at $hw via $special becomes $yspecial";
+}
+
+sub yspecial {
+ my $self = shift;
+ my $name = $self->name;
+ my $devno = $self->devno;
+ my $yspecial = "/dev/$name";
+ my $lv = LvmTab::findLVByDevno ($devno);
+ if (defined ($lv)) {
+ $yspecial = $lv->lvnam;
+ }
+ return $yspecial;
+}
+
+sub hasPartitions {
+ my $self = shift;
+ return ($#{$self->partitions} >= 0);
+}
+
+1;
--- /dev/null
+#!perl -w
+#
+# ActiveBlockDevTab -- descriptors of all block devices in /sys
+# Copyright (C) 2005 Erik van Konijnenburg
+#
+# 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#
+use strict;
+use warnings;
+use Base;
+use Conf;
+use ActiveBlockDev;
+package ActiveBlockDevTab;
+
+
+my $abdTab = undef;
+my $abdList = undef;
+
+
+sub init () {
+ if (defined ($abdTab)) {
+ return;
+ }
+ $abdTab = {};
+
+ my $blockdir;
+ my $blockPath = Conf::get('sysFs') . "/block";
+ if (! opendir ($blockdir, "$blockPath")) {
+ Base::fatal ("can't open directory $blockPath");
+ }
+ while (defined (my $entry = readdir ($blockdir))) {
+ next if $entry eq ".";
+ next if $entry eq "..";
+ oneBlockDev($blockPath, $entry);
+ }
+ if (! closedir ($blockdir)) {
+ Base::fatal ("could not read directory $blockPath");
+ }
+
+ $abdList = [values %{$abdTab}];
+}
+
+sub oneBlockDev ($$) {
+ my ($blockPath, $entry) = @_;
+ my $devno = Base::getStringFile("$blockPath/$entry/dev");
+ if (exists ($abdTab->{$devno})) {
+ Base::fatal ("found duplicate devno in $blockPath/$entry");
+ }
+ my $hw = readlink("$blockPath/$entry/device");
+ # failure results in undef, which is exactly how
+ # we want to represent absence of a hw device.
+ if (defined ($hw)) {
+ unless ($hw =~ s!^(\.\./)+devices/!!) {
+ # imagine localised linux (/sys/geraete ...)
+ Base::fatal ("bad device link in $blockPath/$entry");
+ }
+ }
+ my $descr = ActiveBlockDev->new (
+ name => $entry,
+ devno => $devno,
+ parent => undef,
+ hw => $hw,
+ );
+ $abdTab->{$devno} = $descr;
+
+ #
+ # Scan partitions.
+ # Note that these are only visible after someone
+ # read the a block from the device.
+ #
+ my $devdir;
+ if (! opendir ($devdir, "$blockPath/$entry")) {
+ Base::fatal ("can't open directory $blockPath/$entry");
+ }
+ while (defined (my $partition = readdir ($devdir))) {
+ next if $partition eq ".";
+ next if $partition eq "..";
+ next unless -d "$blockPath/$entry/$partition";
+
+ # there can be subdirectories in a blockdev
+ # other than partitions; eg /sys/block/sda/queue.
+ # a partition has major:minor, so has a dev file.
+ next unless -f "$blockPath/$entry/$partition/dev";
+
+ onePartition($blockPath, $entry, $partition, $descr);
+ }
+ if (! closedir ($devdir)) {
+ Base::fatal ("could not read directory $blockPath/$entry");
+ }
+}
+
+sub onePartition ($$$$) {
+ my ($blockPath, $entry, $partition, $parent) = @_;
+ my $dev = Base::getStringFile("$blockPath/$entry/$partition/dev");
+ if (exists ($abdTab->{$dev})) {
+ Base::fatal ("found duplicate devno in $blockPath/$entry/$partition");
+ }
+ $abdTab->{$dev} = ActiveBlockDev->new (
+ name => $partition,
+ devno => $dev,
+ parent => $parent,
+ hw => undef,
+ );
+}
+
+#
+# all -- return list of all known active block devices.
+#
+sub all () {
+ init;
+ return $abdList;
+}
+
+#
+# findByDevno -- given devno in format maj:min,
+# return corresponding descriptor or undef.
+#
+sub findByDevno ($) {
+ my ($devno) = @_;
+ init;
+ return $abdTab->{$devno};
+}
+
+#
+# findByPath -- given path to block device file in /dev,
+# return corresponding descriptor or undef.
+#
+sub findByPath ($) {
+ my ($path) = @_;
+ my $devno = Base::devno ($path);
+ if (! defined ($devno)) {
+ return undef;
+ }
+ return findByDevno ($devno);
+}
+
+1;
--- /dev/null
+#!perl -w
+#
+# Base -- support stuff
+# Copyright (C) 2005 Erik van Konijnenburg
+#
+# 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#
+# setProgName -- what label to use in further messages.
+# setVerbose -- if true, print info
+# setDebug -- if true, print info and debug
+# setQuiet -- if true, don't print warnings
+#
+# debug -- irritating noise
+# info -- reassuring noise
+# warning -- not good, but processing continues, exit status unaffected
+# error -- not good, processing continues, exit status non-zero,
+# program should not make changes to environment
+# such as writing output files.
+# fatal -- not good, exit immediately with non-zero status.
+# bug -- fatal error in the program, not environment.
+# assert -- if condition not met, it's a bug.
+# bye -- exit now.
+#
+# Also routines to
+# - read content of one-line files
+# - get device number from block or character device files
+# - interpret symbolic links
+# - interpret pathnames
+#
+use strict;
+use warnings;
+package Base;
+
+
+my $progName = "[app]";
+sub setProgName ($) { $progName = $_[0]; }
+
+my $verbose = 0;
+sub setVerbose ($) { $verbose = $_[0]; }
+
+my $debug = 0;
+sub setDebug ($) { $debug = $_[0]; }
+
+my $quiet = 0;
+sub setQuiet ($) { $quiet = $_[0]; }
+
+
+my $exitCode = 0;
+
+
+sub debug ($) {
+ my $msg = shift;
+ if ($debug) {
+ print "$progName:D: $msg\n";
+ }
+}
+
+sub info ($) {
+ my $msg = shift;
+ if ($verbose || $debug) {
+ print "$progName: $msg\n";
+ }
+}
+
+sub warning ($) {
+ my $msg = shift;
+ if (! $quiet) {
+ print STDERR "$progName warning: $msg\n";
+ }
+}
+
+sub error ($) {
+ my $msg = shift;
+ print STDERR "$progName error: $msg\n";
+ $exitCode = 1;
+
+}
+
+sub fatal ($) {
+ my $msg = shift;
+ error ($msg . " (fatal)");
+ bye();
+}
+
+sub bug ($) {
+ my $msg = shift;
+ my ($package, $file, $line) = caller;
+ fatal ($msg . " (internal $file:$line)");
+}
+
+sub assert ($) {
+ my $cond = shift;
+ my ($package, $file, $line) = caller;
+ if (! $cond) {
+ fatal ("assert failed (internal $file:$line)");
+ }
+}
+
+sub bye () {
+ exit ($exitCode);
+}
+
+
+#
+# getStringFile -- return contents of a file that must contain
+# a single line, dropping optional trailing space, or die.
+#
+sub getStringFile ($) {
+ my ($filename) = @_;
+ if (! open (F, "<", "$filename")) {
+ Base::fatal ("can't open $filename");
+ }
+ my $line = <F>;
+ if (! defined ($line)) {
+ Base::fatal ("empty file $filename");
+ }
+ chomp $line;
+ if (defined (<F>)) {
+ Base::fatal ("extra lines in $filename");
+ }
+ if (! close (F)) {
+ Base::fatal ("could not read $filename");
+ }
+ return $line;
+}
+
+
+#
+# getHexFile -- given path to file, return content interpreted as hex number.
+#
+sub getHexFile ($) {
+ my ($filename) = @_;
+ my $content = getStringFile ($filename);
+ if ($content !~ /^(0x)?[0-9a-fA-F]+$/) {
+ fatal ("not a hex file: $filename");
+ }
+ return hex($content);
+}
+
+
+#
+# devno -- given pathname to a device, return "maj:min" or undef.
+# symlinks are resolved implicitly.
+#
+sub devno ($) {
+ my ($path) = @_;
+ if ( ! (-b $path || -c _)) {
+ return undef;
+ }
+
+ my @fields = stat _;
+ if ($#fields != 12) {
+ Base::fatal ("stat failed on device $path");
+ }
+ # from 2.6.10-rc2, kdev.h, backward compatible.
+ my $devno = $fields[6];
+ my $major = ($devno & 0xfff00) >> 8;
+ my $minor = ($devno & 0xff) | (($devno >> 12) & 0xfff00);
+ return "$major:$minor";
+}
+
+
+#
+# expandLink -- given a path to a symlink file,
+# return a path to what it points to.
+#
+sub expandLink ($) {
+ my ($path) = @_;
+ Base::assert (-l $path);
+ my $target = readlink("$path");
+
+ if (isAbsolute ($target)) {
+ return canon ($target);
+ }
+ my $base = dirname ($path);
+ return canon ("$base/$target");
+}
+
+
+#
+# isAbsolute -- given a path, return true iff it starts at root.
+#
+sub isAbsolute ($) {
+ my ($path) = @_;
+ return $path =~ /^\//;
+}
+
+
+#
+# canon -- given path, return copy with redundant stuff removed.
+#
+sub canon ($) {
+ my ($path) = @_;
+
+ if ($path eq '') {
+ $path = '.';
+ }
+ if ($path =~ m![^/]/+$!) {
+ # drop trailing slashes, except in path like ////
+ $path =~ s!/+$!!;
+ }
+
+ # iterate over components (ignoring duplicate slashes)
+ # interpret a null list as 'current directory'
+ # interpret a leading '' in list as absolute path
+ # . can be dropped
+ # .. causes dropping of last element of list, but:
+ # (1) /.. => /
+ # (2) ../.. is not dropped.
+ # (3) ./.. => ..
+ my @result = ();
+ for my $component (split (/\/+/, $path)) {
+ if ($component eq '.') {
+ next;
+ }
+ elsif ($component eq '..') {
+ if ($#result == -1) {
+ push @result, '..';
+ }
+ elsif ($#result == 0 && $result[0] eq '') {
+ next;
+ }
+ elsif ($result[$#result] eq '..') {
+ push @result, '..';
+ }
+ else {
+ pop @result;
+ }
+ }
+ else {
+ push @result, $component;
+ }
+ }
+ if ($#result == -1) {
+ return ".";
+ }
+ elsif ($#result == 0 && $result[0] eq '') {
+ return '/';
+ }
+ else {
+ return join ('/', @result);
+ }
+}
+
+
+#
+# basename -- given path, return final component of canonified path
+#
+sub basename ($) {
+ my ($path) = @_;
+ my $t = canon ($path);
+ if ($t =~ m!.*/([^/]+)$!) {
+ # something is after the slash,
+ # the simple case
+ return $1;
+ }
+ elsif ($t !~ m!/!) {
+ # basename aap => aap
+ return $t;
+ }
+ else {
+ return '/';
+ }
+}
+
+
+#
+# dirname -- given path, return all but final component of canonified path
+#
+sub dirname ($) {
+ my ($path) = @_;
+ my $t = canon ($path);
+ if ($t =~ m!(.+)/[^/]+$!) {
+ # something before and after the slash
+ return $1;
+ }
+ elsif ($t !~ m!/!) {
+ # dirname aap => .
+ # but also dirname .. => .
+ return '.';
+ }
+ else {
+ return '/';
+ }
+}
+
+1;
--- /dev/null
+#!perl -w
+#
+# Blacklist -- encapsulate /etc/hotplug/blacklist
+# Copyright (C) 2005 Erik van Konijnenburg
+#
+# 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#
+# isBlacklisted -- module occurs in one of the hotplug blacklists.
+# normalise underscore to hyhpen before comparing.
+#
+
+use strict;
+use warnings;
+use Base;
+use Conf;
+package Blacklist;
+
+my $blackMap = undef;
+my $blackList = undef;
+
+sub init () {
+ if (defined ($blackList)) {
+ return;
+ }
+ my $blackMap = {};
+ my $hotplugDir = Conf::get ('hotplug');
+ parseBlackList ("$hotplugDir/blacklist");
+
+ my $dir;
+ my $dirName = "$hotplugDir/blacklist.d";
+ if (-d $dirName) {
+ # blacklist.d does not have to exist (Debian
+ # has it, Fedora not), but if it exists,
+ # it must be readable.
+ if (! opendir ($dir, $dirName)) {
+ Base::fatal ("can't open directory $dirName");
+ }
+ while (defined(my $entry = readdir($dir))) {
+ if ( -f "$dirName/$entry" ) {
+ parseBlackList ("$dirName/$entry");
+ }
+ }
+ if (! closedir ($dir)) {
+ Base::fatal ("could not read directory $dirName");
+ }
+ }
+
+ my $blackList = [ keys %{$blackMap} ];
+}
+
+sub parseBlackList ($) {
+ my ($fileName) = @_;
+ if (! open (IN, "<", "$fileName")) {
+ Base::fatal ("can't open blacklist $fileName");
+ }
+ while (defined (my $line = <IN>)) {
+ chomp $line;
+ $line =~ s/#.*//;
+ $line =~ s/^\s+//;
+ $line =~ s/\s+$//;
+ $line =~ s/_/-/g;
+ if ($line eq "") {
+ next;
+ }
+ if ($line !~ /^[a-zA-Z0-9-]+$/) {
+ Base::fatal ("bad line in blacklist $fileName: $line");
+ }
+ $blackMap->{$line}++;
+ }
+ if (! close (IN)) {
+ Base::fatal ("could not read blacklist $fileName");
+ }
+}
+
+sub all () {
+ init;
+ return $blackList;
+}
+
+sub isBlacklisted ($) {
+ my ($module) = @_;
+ init;
+ $module =~ s/_/-/g;
+ return exists ($blackMap->{$module});
+}
+
+
+1;
--- /dev/null
+#!perl -w
+#
+# BlockSpecialFile -- descriptor for single block special file found in /dev
+# Copyright (C) 2005 Erik van Konijnenburg
+#
+# 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#
+# this can be a whole device or a partition. Descriptors contain:
+# - path, path as found in /dev
+# - devno, eg 8:1
+#
+use strict;
+use warnings;
+package BlockSpecialFile;
+use base 'Obj';
+
+sub fill {
+ my $self = shift;
+ $self->SUPER::fill();
+ $self->takeArgs ('path', 'devno');
+}
+
+sub devno { return $_[0]->{devno}; }
+sub path { return $_[0]->{path}; }
+
+sub string {
+ my $self = shift;
+ my $path = $self->path;
+ my $devno = $self->devno;
+ return "$path($devno)";
+}
+
+1;
--- /dev/null
+#!perl -w
+#
+# BlockSpecialFileTab -- block special files found in /dev
+# Copyright (C) 2005 Erik van Konijnenburg
+#
+# 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#
+# This provides access to a table of descriptors, each containing
+# path and devno.
+#
+# findByDevno -- find a descriptor with devno (there may be others)
+# all -- list of all descriptors (may have duplicate devnos)
+#
+use strict;
+use warnings;
+use Conf;
+use BlockSpecialFile;
+package BlockSpecialFileTab;
+
+
+my $bsfTab = undef;
+my $bsfList = undef;
+
+
+sub walkBlockSpecialFiles ($);
+
+sub init () {
+ if (defined ($bsfTab)) {
+ return;
+ }
+ $bsfTab = {};
+ my $devDir = Conf::get('dev');
+ walkBlockSpecialFiles ($devDir);
+ $bsfList = [ values %{$bsfTab} ];
+}
+
+sub walkBlockSpecialFiles ($) {
+ my ($dirName) = @_;
+ my $dir;
+ if (! opendir ($dir, $dirName)) {
+ Base::fatal ("can't open directory $dirName");
+ }
+ while (defined(my $entry = readdir($dir))) {
+ next if $entry eq ".";
+ next if $entry eq "..";
+ my $path = "$dirName/$entry";
+ if (-l $path) {
+ next;
+ }
+ elsif (-b _) {
+ my $devno = Base::devno ($path);
+
+ # this may overwrite earlier entries;
+ # unimportant since both pathnames
+ # access the same device.
+ $bsfTab->{$devno} = BlockSpecialFile->new(
+ path => $path,
+ devno => $devno);
+ }
+ elsif (-d _) {
+ walkBlockSpecialFiles ($path);
+ }
+ }
+ if (! closedir ($dir)) {
+ Base::fatal ("could not read directory $dirName");
+ }
+}
+
+
+#
+# findByDevno -- return a working path given major:minor or undef.
+# Note that there may be other files accessing the same device.
+#
+sub findByDevno ($) {
+ my ($devno) = @_;
+ init;
+ return $bsfTab->{$devno};
+}
+
+#
+# all -- return list of all descriptors.
+#
+sub all () {
+ init;
+ return $bsfList;
+}
+
+
+1;
--- /dev/null
+#!perl -w
+#
+# Conf -- configured path names and such.
+# Copyright (C) 2005 Erik van Konijnenburg
+#
+# 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#
+# You can get and set configuration items by name,
+# with the following restrictions:
+# - only get and set known keys
+# - after first get, no further set is allowed.
+#
+# Defaults are packaged as subs, so that you can change
+# one setting and have the change ripple through in other
+# settings.
+#
+use strict;
+use warnings;
+use Base;
+package Conf;
+
+sub get($);
+
+#
+# Default values for configuration; if there is no default,
+# it's not a known parameter, and you cannot modify it.
+#
+my $defaults = {
+ version => sub { my $v = `uname -r`; chomp $v; $v; },
+ libModules => sub { "/lib/modules"; },
+ kernConf => sub { "/boot/config-"
+ . get('version'); },
+ modDep => sub { get('libModules')
+ . '/' . get('version')
+ . '/modules.dep'; },
+ usbMap => sub { get('libModules')
+ . '/' . get('version')
+ . '/modules.usbmap'; },
+ pciMap => sub { get('libModules')
+ . '/' . get('version')
+ . '/modules.pcimap'; },
+ modDir => sub { get('libModules')
+ . '/' . get('version')
+ . '/kernel'; },
+ sysFs => sub { "/sys"; },
+ procFs => sub { "/proc"; },
+ #delete next 2?
+ sysBlock => sub { get ('sysFs') . "/block"; },
+ sysDevices => sub { get ('sysFs') . "/devices"; },
+ dev => sub { "/dev"; },
+ fstab => sub { "/etc/fstab"; },
+ hotplug => sub { "/etc/hotplug"; },
+ appVersion => sub { "0.0.5"; },
+ auxDir => sub { "/usr/local/lib/yaird/exec"; },
+};
+
+
+my $overrides = {}; # config values where default is overridden,
+ # presumably via command line.
+my $used = {}; # if a key exists, the config value has
+ # been used, and it no longer can be changed.
+
+sub get ($) {
+ my ($key) = @_;
+ my $dflt = $defaults->{$key};
+ Base::assert (defined ($dflt));
+ $used->{$key}++;
+ my $ovr = $overrides->{$key};
+ if (defined ($ovr)) {
+ return $ovr;
+ }
+ return &{$dflt}();
+}
+
+sub set ($$) {
+ my ($key, $value) = @_;
+ my $dflt = $defaults->{$key};
+ Base::assert (defined ($dflt));
+ Base::assert (! defined ($used->{$key}));
+ $overrides->{$key} = $value;
+}
+
+1;
--- /dev/null
+#!perl -w
+#
+# Conf -- configured path names and such.
+# Copyright (C) 2005 Erik van Konijnenburg
+#
+# 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#
+# You can get and set configuration items by name,
+# with the following restrictions:
+# - only get and set known keys
+# - after first get, no further set is allowed.
+#
+# Defaults are packaged as subs, so that you can change
+# one setting and have the change ripple through in other
+# settings.
+#
+use strict;
+use warnings;
+use Base;
+package Conf;
+
+sub get($);
+
+#
+# Default values for configuration; if there is no default,
+# it's not a known parameter, and you cannot modify it.
+#
+my $defaults = {
+ version => sub { my $v = `uname -r`; chomp $v; $v; },
+ libModules => sub { "/lib/modules"; },
+ kernConf => sub { "/boot/config-"
+ . get('version'); },
+ modDep => sub { get('libModules')
+ . '/' . get('version')
+ . '/modules.dep'; },
+ usbMap => sub { get('libModules')
+ . '/' . get('version')
+ . '/modules.usbmap'; },
+ pciMap => sub { get('libModules')
+ . '/' . get('version')
+ . '/modules.pcimap'; },
+ modDir => sub { get('libModules')
+ . '/' . get('version')
+ . '/kernel'; },
+ sysFs => sub { "/sys"; },
+ procFs => sub { "/proc"; },
+ #delete next 2?
+ sysBlock => sub { get ('sysFs') . "/block"; },
+ sysDevices => sub { get ('sysFs') . "/devices"; },
+ dev => sub { "/dev"; },
+ fstab => sub { "/etc/fstab"; },
+ hotplug => sub { "/etc/hotplug"; },
+ appVersion => sub { "@VERSION@"; },
+ auxDir => sub { "@AUXDIR@"; },
+};
+
+
+my $overrides = {}; # config values where default is overridden,
+ # presumably via command line.
+my $used = {}; # if a key exists, the config value has
+ # been used, and it no longer can be changed.
+
+sub get ($) {
+ my ($key) = @_;
+ my $dflt = $defaults->{$key};
+ Base::assert (defined ($dflt));
+ $used->{$key}++;
+ my $ovr = $overrides->{$key};
+ if (defined ($ovr)) {
+ return $ovr;
+ }
+ return &{$dflt}();
+}
+
+sub set ($$) {
+ my ($key, $value) = @_;
+ my $dflt = $defaults->{$key};
+ Base::assert (defined ($dflt));
+ Base::assert (! defined ($used->{$key}));
+ $overrides->{$key} = $value;
+}
+
+1;
--- /dev/null
+#!perl -w
+#
+# FsEntry -- encapsulate a single entry in /etc/fstab
+# Copyright (C) 2005 Erik van Konijnenburg
+#
+# 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#
+use strict;
+use warnings;
+use LabeledPartitionTab;
+package FsEntry;
+use base 'Obj';
+
+sub fill {
+ my $self = shift;
+ $self->SUPER::fill();
+ $self->takeArgs ('dev', 'mnt', 'type', 'opts');
+}
+
+sub dev { return $_[0]->{dev}; }
+sub mnt { return $_[0]->{mnt}; }
+sub type { return $_[0]->{type}; }
+sub opts { return $_[0]->{opts}; }
+
+sub string {
+ my $self = shift;
+ my $dev = $self->dev();
+ my $mnt = $self->mnt();
+ my $type = $self->type();
+ my $opts = $self->opts()->string();
+ return "$mnt at $dev ($type) with $opts";
+}
+
+
+#
+# isRequiredAtBoot -- To be mounted at boot time with mount -a.
+# This does not imply the initrd should already mount it.
+#
+sub isRequiredAtBoot {
+ my $self = shift;
+ return 0 if ($self->type eq "ignore");
+ return 0 if ($self->opts->exists("noauto"));
+ return 1;
+}
+
+
+#
+# blockDevPath -- return blockdev pathname for an fstab entry.
+# must resolve LABEL= and UUID=. Note that LVM and raid devices
+# may be implemented on top of multiple other devices; this returns
+# only the top device.
+#
+# Returns undef if first field of fstab entry does not point to
+# an existing block device. Possible reasons:
+# - filesystem does not have underlying device, such as /proc.
+# - filesystem has a non-file underlying resource, such as NFS
+# - garbage line with missing blockdev
+# - filesystem has a plain file as underlying resource;
+# this can be a loopback file system, or swap to plain file.
+#
+# NOTE: We should support the last case, but for now that's too difficult:
+# imagine /a/b/c, where /a is reiserfs, b is a symlink to /d (an NFS
+# filesystem), and /d/c is a symlink to /e/f, where /e is a ramdisk.)
+#
+sub blockDevPath {
+ my $self = shift;
+ my $dev = $self->dev();
+ if ($dev =~ /^\//) {
+ if (-f $dev && $self->opts->exists('loop')) {
+ return undef;
+ }
+ if (-f $dev && $self->type eq "swap") {
+ return undef;
+ }
+ if (-b $dev) {
+ return $dev;
+ }
+ }
+ elsif ($dev =~ /^LABEL=(.*)/) {
+ return LabeledPartitionTab::findPathByLabel ($1);
+ }
+ elsif ($dev =~ /^UUID=(.*)/) {
+ return LabeledPartitionTab::findPathByUuid ($1);
+ }
+ return undef;
+}
+
+
+1;
--- /dev/null
+#!perl -w
+#
+# FsOpts -- encapsulate the options in an FsEntry
+# Copyright (C) 2005 Erik van Konijnenburg
+#
+# 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#
+use strict;
+use warnings;
+package FsOpts;
+use base 'Obj';
+
+
+sub fill {
+ my $self = shift;
+ $self->SUPER::fill();
+
+ $self->takeArgs ('string');
+ my @optlist = split (/,/, $self->{string});
+ my $opthash = {};
+ for my $opt (@optlist) {
+ if ($opt =~ /^(.*)=(.*)$/) {
+ $opthash->{$1} = $2;
+ }
+ else {
+ $opthash->{$opt} = undef;
+ }
+ }
+ $self->{optsHash} = $opthash;
+}
+
+#
+# exists -- the option occurs, possibly with undef value.
+#
+sub exists {
+ my ($self, $optnam) = @_;
+ return exists ($self->{optsHash}{$optnam});
+}
+
+sub get {
+ my ($self, $optnam) = @_;
+ return $self->{optsHash}{$optnam};
+}
+
+sub string {
+ my $self = shift;
+ my $opts = $self->{optsHash};
+ my @optlist = ();
+ for my $key (sort keys %{$opts}) {
+ push @optlist, ("$key=" . ($opts->{$key} or "-"));
+ }
+ return join (',', @optlist);
+}
+
+
+#
+# cmdLineVersion -- return a version of all options suitable for
+# a mount command line.
+# Note that some options in fstab can only be used in fstab,
+# not in scripts.
+#
+sub cmdLineVersion {
+ my $self = shift;
+ my $opts = $self->{optsHash};
+
+ my @cmdLine = ();
+ for my $key (sort keys %{$opts}) {
+ next if $key eq 'auto';
+ next if $key eq 'noauto';
+ next if $key eq 'nouser';
+ next if $key eq 'owner';
+ next if $key eq 'user';
+ next if $key eq 'users';
+ next if $key eq 'defaults';
+ my $val = $opts->{$key};
+ if (defined ($val)) {
+ push @cmdLine, "$key=$val";
+ }
+ else {
+ push @cmdLine, "$key";
+ }
+ }
+ if ($#cmdLine == -1) {
+ return "";
+ }
+ else {
+ # protect against logdev=John's disk.
+ my $cmdLine = join (',', @cmdLine);
+ $cmdLine =~ s/(['\\])/\\$1/g;
+ return "-o '$cmdLine'";
+ }
+}
+
+1;
+
--- /dev/null
+#!perl -w
+#
+# FsTab -- encapsulate /etc/fstab.
+# Copyright (C) 2005 Erik van Konijnenburg
+#
+# 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#
+use strict;
+use warnings;
+use Base;
+use Conf;
+use FsOpts;
+use FsEntry;
+package FsTab;
+
+
+my $fsTab = undef;
+
+
+sub init () {
+ if (defined ($fsTab)) {
+ return;
+ }
+ $fsTab = [];
+ my $name = Conf::get('fstab');
+ if (! open (IN, "<", "$name")) {
+ Base::fatal ("can't read $name");
+ }
+ while (defined (my $line = <IN>)) {
+ $line =~ s/^\s+//;
+ next if $line =~ /^#/; # comment line
+ next if $line eq ""; # empty line
+ my @fields = split (/\s+/, $line, 999);
+ if ($#fields < 6) {
+ # no test for extra fields;
+ # the mount command allows that.
+ Base::fatal ("malformed line in $name");
+ }
+ if ($fields[2] eq "swap") {
+ if (($fields[1] ne "none") &&($fields[1] ne "swap")) {
+ Base::fatal ("bad swap entry in $name");
+ }
+ }
+
+ my $opts = FsOpts->new (
+ string => unmangle($fields[3]));
+
+ my $descr = FsEntry->new(
+ dev => unmangle($fields[0]),
+ mnt => unmangle($fields[1]),
+ type => unmangle($fields[2]),
+ opts => $opts,
+ );
+ push @{$fsTab}, $descr;
+ }
+ if (! close (IN)) {
+ Base::fatal ("could not read $name");
+ }
+}
+
+sub all () {
+ init;
+ return $fsTab;
+}
+
+sub findByMountPoint ($) {
+ my ($mnt) = @_;
+ my $result;
+ for my $entry (@{FsTab::all()}) {
+ if ($entry->mnt() eq $mnt) {
+ if (defined ($result)) {
+ Base::fatal ("duplicate mount point in fstab $mnt");
+ }
+ $result = $entry;
+ }
+ }
+ if (! defined ($result)) {
+ Base::fatal ("mount point not in fstab: $mnt");
+ }
+ return $result;
+}
+
+sub findByDevName ($) {
+ my ($dev) = @_;
+ my $result;
+ for my $entry (@{FsTab::all()}) {
+ if ($entry->dev() eq $dev) {
+ if (defined ($result)) {
+ Base::fatal ("duplicate device name in fstab: $dev");
+ }
+ $result = $entry;
+ }
+ }
+ if (! defined ($result)) {
+ Base::fatal ("device name not in fstab: $dev");
+ }
+ return $result;
+}
+
+# replace octal escapes
+sub unmangle ($) {
+ my ($string) = @_;
+ while ($string =~ /\\([0-7]{3})/) {
+ $string = $` . chr (oct ($1)) . $';
+ }
+ return $string;
+}
+
+1;
--- /dev/null
+#!perl -w
+#
+# Hardware -- find modules for a thingy in /devices.
+# Copyright (C) 2005 Erik van Konijnenburg
+#
+# 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#
+#
+# Method: walk up the path, and for everything you recognise,
+# prepend the appropriate module.
+# As an example, for a usb-stick connected via a hub to a pci card,
+# you'l need usb-storage, a usb protocol driver, and some usb module.
+#
+use strict;
+use warnings;
+use Conf;
+use IdeDev;
+use ScsiDev;
+use PciDev;
+use PciTab;
+use UsbDev;
+use UsbTab;
+package Hardware;
+
+
+sub moduleList ($) {
+ my ($path) = @_;
+ my $result = [];
+ my @components = split (/\/+/, $path);
+ my $devicesPath = Conf::get ('sysDevices');
+ for my $i (0 .. $#components) {
+ my $abspath = $devicesPath
+ . "/" . join ('/', @components[0 .. $i]);
+ my $modules = undef;
+ if ($abspath =~ m!/pci[0-9a-f]{4}:[0-9a-f]{2}$!) {
+ # PCI bus; harmless
+ }
+ elsif (-f "$abspath/subsystem_vendor") {
+ # PCI function on a slot.
+ my $dev = PciDev->new (path => $abspath);
+ $modules = PciTab::find ($dev);
+ push @{$modules}, @{addPciSiblings ($abspath)};
+ }
+
+ elsif (-f "$abspath/bDeviceClass"
+ || -f "$abspath/bInterfaceClass")
+ {
+ #
+ # USB. Every component in the path
+ # "usb1/1-4/1-4.4/1-4.4:1.0" has either
+ # a deviceClass or interfaceClass attribute.
+ #
+ my $dev = UsbDev->new (path => $abspath);
+ $modules = UsbTab::find ($dev);
+ }
+
+ elsif ($abspath =~ m!/ide\d+$!) {
+ # IDE bus; harmless
+ }
+ elsif ($abspath =~ m!/ide\d+/\d+\.\d+$!) {
+ # IDE device
+ my $dev = IdeDev->new (path => $abspath);
+ $modules = IdeDev::findModuleByIdeDev ($dev);
+ }
+
+ elsif ($abspath =~ m!/host\d+$!) {
+ # grouping of SCSI devices; harmless.
+ }
+ elsif ($abspath =~ m!/target\d+:\d+:\d+$!) {
+ # grouping of SCSI devices within a host
+ # (2.6.10 and later); harmless.
+ }
+ elsif ($abspath =~ m!/\d+:\d+:\d+:\d+$!
+ && -f "$abspath/scsi_level")
+ {
+ my $dev = ScsiDev->new (path => $abspath);
+ $modules = ScsiDev::findModuleByScsiDev ($dev);
+ }
+
+ else {
+ # NOTE: We may want to avoid duplicate messages
+ Base::warning ("unrecognised device: $abspath");
+ }
+
+ if (defined ($modules)) {
+ push @{$result}, @{$modules};
+ }
+ }
+ return $result;
+}
+
+
+#
+# addPciSiblings -- probably a bug.
+#
+# Here's something odd: my test machine has an USB keyboard, connected
+# via PCI. The same 8 ports are visible both as one 8-port EHCI
+# controller and four 2-port UHCI controllers. The difference is not
+# in the hardware, only in the protocol used to talk to the remote device.
+# These are different PCI functions (0..7) in the same PCI slot (1d):
+# 0000:00:1d.0 USB Controller: Intel ... USB UHCI #1 (rev 03)
+# 0000:00:1d.1 USB Controller: Intel ... USB UHCI #2 (rev 03)
+# 0000:00:1d.2 USB Controller: Intel ... USB UHCI #3 (rev 03)
+# 0000:00:1d.3 USB Controller: Intel ... USB UHCI #4 (rev 03)
+# 0000:00:1d.7 USB Controller: Intel ... USB2 EHCI Controller (rev 03)
+#
+# The keyboard shows up under the EHCI controller, a printer shows up
+# under one of the UHCI controllers.
+# If we load only the EHCI module, the UHCI-only printer causes some
+# complaints, and the keyboard is not detected (unless you try to
+# debug this via a serial line ...)
+# If you load UHCI as well, the keyboard is detected flawlessly.
+#
+# We could interpret this as a bug in EHCI, and claim that a non-EHCI
+# device on one of the ports should not interfere with detecting devices
+# on other ports, but it's more productive to see this as an example of
+# how some PCI devices work better if there's a driver for every
+# function in the slot.
+#
+# (Or you could just add a special case to always add an UHCI driver
+# after EHCI, but then you would have to consider OHCI as well, plus
+# think about blacklisting and competing USB driver implementations.
+# I'd rather not go there.)
+#
+# The kernel function pci_setup_device() uses the following format
+# for PCI function directories in sysfs:
+# "%04x:%02x:%02x.%d", domain, bus, slot, function.
+#
+# Given an absolute path to a PCI function directory, return a list
+# of modules needed for all USB functions *except* the one specified by
+# the path, but only if the path refers to a USB function.
+#
+# Limiting this behaviour to USB functions alone is desirable, given
+# the existence of chips such as VT8366/A/7, that combine ISA, IDE,
+# USB and multimedia in a single PCI slot.
+#
+sub addPciSiblings ($) {
+ my ($abspath) = @_;
+ my $modules = [];
+ if (! isUsb ($abspath)) {
+ return $modules;
+ }
+
+ my $dirName = Base::dirname ($abspath);
+ my $cur = Base::basename ($abspath);
+
+ if ($cur !~ /^([0-9a-f]{4}):([0-9a-f]{2}):([0-9a-f]{2})\.(\d)$/) {
+ Base::fatal ("Odd PCI directory in sysfs: $abspath");
+ }
+ my $domain = $1;
+ my $bus = $2;
+ my $slot = $3;
+ my $function = $4;
+
+ #print "D $dirName, B $cur, d $domain b $bus s $slot f $function\n";
+ my $dir;
+ if (! opendir ($dir, $dirName)) {
+ Base::fatal ("can't open directory $dirName");
+ }
+ while (defined(my $entry = readdir($dir))) {
+ if ($entry !~ /^([0-9a-f]{4}):([0-9a-f]{2}):([0-9a-f]{2})\.(\d+)$/) {
+ next;
+ }
+ if (! ($1 eq $domain && $2 eq $bus && $3 eq $slot
+ && $4 ne $function))
+ {
+ next;
+ }
+
+ # OK, it's in my slot, and it isn't me.
+ # Add required modules if it's USB.
+ my $sibling = "$dirName/$entry";
+ if (isUsb ($sibling)) {
+ my $dev = PciDev->new (path => $sibling);
+ push @{$modules}, @{PciTab::find ($dev)};
+ }
+ }
+ if (! closedir ($dir)) {
+ Base::fatal ("could not read directory $dirName");
+ }
+ return $modules;
+}
+
+#
+# isUsb -- given an absolute path into sysfs, true iff it controls a usb port.
+#
+sub isUsb ($) {
+ my ($abspath) = @_;
+ my $dir;
+ my $result = 0;
+ if (! opendir ($dir, $abspath)) {
+ Base::fatal ("can't open directory $abspath");
+ }
+ while (defined(my $entry = readdir($dir))) {
+ if ($entry =~ /^usb\d+$/) {
+ $result = 1;
+ }
+ }
+ if (! closedir ($dir)) {
+ Base::fatal ("could not read directory $abspath");
+ }
+ return $result;
+}
+
+1;
+
--- /dev/null
+#!perl -w
+#
+# IdeDev -- probed values for an IDE device as found in /proc/ide
+# Copyright (C) 2005 Erik van Konijnenburg
+#
+# 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#
+#
+# The probed values for an IDE device as found in /proc/ide,
+# based on the name in /sys/devices/.../ideX/X.X/block.
+#
+# path - location in sysfs
+# name - descriptive string, retrieved from device
+# media - type of device: disk, tape, ...
+# model - descriptive string, retrieved from device
+#
+# Background: hotplug is triggered when an IDE controller is
+# found on for instance the PCI bus. The loaded module should
+# be good enough to talk to the hardware, but that does not
+# mean you can actually use it: you will also need something
+# to use the hardware driver to send IDE commands over the
+# IDE cable to the controller on the other end of the cable.
+# Those commands also have to make sense: a disk controller
+# uses a different set of IDE commands than an IDE tape controller.
+# The ide-disk, ide-cdrom etc modules are the protocol drivers
+# that handle this.
+#
+# The following detection is based on an ide.rc script by Marco d'Itri
+# that was not included in hotplug. Note that some CDROMs may need
+# ide-generic in addition to ide-cdrom to work; that can be considered
+# a driver bug rather than a valid dependency. Note that there is discussion
+# over whether ide-generic should grab otherwise unhandled IDE devices.
+# - http://thread.gmane.org/gmane.linux.hotplug.devel/6003
+# - http://lists.debian.org/debian-kernel/2004/11/msg00218.html
+# - http://www.ussg.iu.edu/hypermail/linux/kernel/0410.1/1452.html
+#
+# Hmm, via82cxxx (2.6.8) also needs ide-generic to load it seems. That could
+# be because ide-generic contains a call to ide_probe_init() which is in
+# the ide-core module. We'll add ide-generic as an extra with all IDE
+# protocol modules.
+#
+use strict;
+use warnings;
+use Base;
+use Conf;
+package IdeDev;
+use base 'Obj';
+
+sub fill {
+ my $self = shift;
+ $self->SUPER::fill();
+ $self->takeArgs ('path');
+ my $path = $self->path;
+ my $link = readlink ("$path/block");
+ if (! defined ($link)) {
+ Base::fatal ("no link to block device in $path");
+ }
+ if ($link !~ m!.*/([^/]+)!) {
+ Base::fatal ("malformed link to block device in $path");
+ }
+ my $name = $1;
+ my $ideDir = Conf::get('procFs') . "/ide";
+ $self->{name} = $name;
+ $self->{media} = Base::getStringFile ("$ideDir/$name/media");
+ $self->{model} = Base::getStringFile ("$ideDir/$name/model");
+}
+
+sub path { return $_[0]->{path}; }
+sub name { return $_[0]->{name}; }
+sub media { return $_[0]->{media}; }
+sub model { return $_[0]->{model}; }
+
+sub string {
+ my $self = shift;
+ my $path = $self->path();
+ my $name = $self->name();
+ my $media = $self->media();
+ my $model = $self->model();
+ return "$name ($media) = $model at $path";
+}
+
+
+#
+# findModuleByIdeDev -- list of suitable IDE drivers;
+# you need all of them.
+#
+sub findModuleByIdeDev ($) {
+ my ($ideDev) = @_;
+ my $media = $ideDev->media();
+ my $driver;
+ $driver = "ide-disk" if ($media eq "disk");
+ $driver = "ide-tape" if ($media eq "tape");
+ $driver = "ide-cd" if ($media eq "cdrom");
+ $driver = "ide-floppy" if ($media eq "floppy");
+ my $result;
+ if (defined ($driver)) {
+ $result = [ "ide-generic", $driver ];
+ }
+ else {
+ $result = [ "ide-generic" ];
+ }
+ return $result;
+}
+
+
+1;
+
--- /dev/null
+#!perl -w
+#
+# Image -- what should go on the initrd image
+# Copyright (C) 2005 Erik van Konijnenburg
+#
+# 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#
+use strict;
+use warnings;
+use SharedLibraries;
+use File::Copy;
+use Base;
+package Image;
+use base 'Obj';
+
+sub fill {
+ my $self = shift;
+ $self->SUPER::fill();
+ $self->{directories} = {};
+ $self->{files} = {};
+ $self->{devices} = {};
+ $self->{symlinks} = {};
+ $self->{scripts} = {};
+}
+
+#
+# addFile -- mark listed file, it should be copied to image.
+# If we add a symlink, make sure it stays a symlink in the target
+# image, and that both link and target are included. This matters
+# eg for LVM, that has lots of symlinks to a single executable,
+# with behaviour determined by the name of the link.
+#
+sub addFile {
+ my ($self, $file) = @_;
+ Base::assert (Base::isAbsolute ($file));
+
+ # avoid problems with adding /lib/modules/. or
+ # distinguishing between /bin and //bin.
+ $file = Base::canon($file);
+
+ $self->addParents ($file);
+ if (-l $file) {
+ if (! exists ($self->{symlinks}{$file})) {
+ # careful: in order to break loops, we must
+ # first mark the symlink, *then* follow it.
+ # We cannot warn, since we do not know whether
+ # the symlink was found in the course of symlink
+ # resolution, or whether multiple executables
+ # have the same symlink as a shared library.
+ #
+ # NOTE: Perhaps maintain an explicit stack of
+ # symlinks being resolved in order to be able
+ # to warn about loops?
+ #
+ my $link = readlink ($file);
+ if (! defined ($link)) {
+ Base::fatal ("could not follow symlink $file");
+ }
+ if ($link !~ m!^([\w./-]+)$!) {
+ # taint check.
+ Base::fatal ("Strange character in symlink target for $file");
+ }
+ $link = $1;
+
+ Base::debug ("to image: $file (symlink)");
+ $self->{symlinks}{$file} = $link;
+ my $target = Base::expandLink ($file);
+ $self->addFile ($target);
+ }
+ }
+ elsif (-b $file) {
+ my $devno = Base::devno ($file);
+ Base::debug ("to image: $file (blockdev)");
+ $self->{devices}{$file} = "b:$devno";
+ }
+ elsif (-c $file) {
+ my $devno = Base::devno ($file);
+ Base::debug ("to image: $file (chardev)");
+ $self->{devices}{$file} = "c:$devno";
+ }
+ elsif (-d $file) {
+ $self->addDirectory ($file);
+ }
+ elsif (-f $file) {
+ Base::debug ("to image: $file");
+ $self->{files}{$file}++;
+ if (-x $file) {
+ $self->addLibraries ($file);
+ }
+ }
+ elsif (! -e $file) {
+ Base::fatal ("missing file requested for image: $file");
+ }
+ else {
+ Base::fatal ("odd file mode: $file");
+ }
+}
+
+
+#
+# addDirectory -- add a directory to the image
+# the difference with addFile ($dir) is that the directory
+# does not have to exist on the mother system.
+#
+sub addDirectory {
+ my ($self, $directory) = @_;
+ Base::assert (Base::isAbsolute ($directory));
+
+ $self->addParents ($directory);
+ Base::debug ("to image: $directory (directory)");
+ $self->{directories}{$directory}++;
+}
+
+
+#
+# addParents -- given a pathname to be included on
+# initrd image, ensure that parent directories are also created.
+#
+sub addParents {
+ my ($self, $path) = @_;
+ Base::assert (Base::isAbsolute ($path));
+
+ my @components = split (/\/+/, $path);
+ for my $idx (1 .. ($#components -1)) {
+ my $dir = join ('/', @components[0 .. $idx]);
+ $self->{directories}{$dir}++;
+ }
+}
+
+#
+# addTree -- add a tree to the image
+# this is an existing file or directory with everything in it.
+# NOTE: There's a trade-off here: it would be faster to defer walking
+# the tree to the actual writing of the tree, but that would require
+# duplicating the addFile checks on file type. 2.6.10 has 1700 files
+# in /lib/modules; I expect the overhead to be acceptable.
+#
+sub addTree {
+ my ($self, $treeName) = @_;
+
+ $self->addFile ($treeName);
+ if (-d $treeName && ! -l $treeName) {
+ my $dir;
+ if (! opendir ($dir, $treeName)) {
+ Base::fatal ("can't open directory $treeName");
+ }
+ while (defined(my $entry = readdir($dir))) {
+ next if $entry eq ".";
+ next if $entry eq "..";
+ my $path = "$treeName/$entry";
+ $self->addTree ($path);
+ }
+ if (! closedir ($dir)) {
+ Base::fatal ("could not read directory $treeName");
+ }
+ }
+}
+
+
+#
+# addLibraries -- given an executable to be included on
+# initrd image, ensure that shared libraries are also included.
+# If the executable is a shell script or statically linked,
+# nothing needs to be done.
+#
+sub addLibraries {
+ my ($self, $executable) = @_;
+ my $in;
+
+ for my $lib (@{SharedLibraries::find ($executable)}) {
+ $self->addFile ($lib);
+ }
+}
+
+#
+# addScriptLine -- given scriptname and text, append text to the
+# text to be included in script.
+#
+sub addScriptLine {
+ my ($self, $scriptname, $text) = @_;
+ Base::assert (Base::isAbsolute ($scriptname));
+
+ $self->addParents ($scriptname);
+ $self->{scripts}{$scriptname} .= "$text";
+}
+
+
+#
+# buildHere -- given pathname of a destination directory,
+# create that directory, with all files and scripts prescribed
+# by self in it.
+# The top directory is expected to be created by File::Temp::tempfile.
+#
+sub buildHere {
+ my ($self, $dest) = @_;
+
+ if (! -d $dest) {
+ Base::fatal ("Build directory not found: $dest");
+ }
+ if (! chmod (0755, $dest)) {
+ Base::fatal ("Could not chmod $dest");
+ }
+
+ for my $d (sort keys %{$self->{directories}}) {
+ if (! mkdir ("$dest$d")) {
+ Base::fatal ("Could not mkdir $dest$d");
+ }
+ if (! chmod (0755, "$dest$d")) {
+ Base::fatal ("Could not chmod $dest$d");
+ }
+ }
+
+ for my $f (sort keys %{$self->{files}}) {
+ if (! File::Copy::copy ($f, "$dest$f")) {
+ Base::fatal ("Could not copy $f to $dest$f");
+ }
+ if (-x $f) {
+ if (! chmod (0555, "$dest$f")) {
+ Base::fatal ("Could not chmod 0555 $dest$f");
+ }
+ }
+ else {
+ if (! chmod (0444, "$dest$f")) {
+ Base::fatal ("Could not chmod 0444 $dest$f");
+ }
+ }
+ }
+
+ for my $d (sort keys %{$self->{devices}}) {
+ my $typDevno = $self->{devices}{$d};
+ if ($typDevno =~ /^(b|c):(\d+):(\d+)$/) {
+ #
+ # permission 0600 is restrictive but sufficient:
+ # the devices created here are used only by root
+ # on a temporary root, so we can get away with
+ # /dev/null mode 0600. More permissive modes
+ # risk ending up with a /dev/hda1 0666 somewhere
+ # in a temporary directory.
+ #
+ if (system ("/bin/mknod -m 0600 '$dest$d' $1 $2 $3") != 0) {
+ Base::fatal ("Could not mknod $dest$d $1 $2 $3");
+ }
+ }
+ else {
+ Base::bug ("bad devno $typDevno for $d");
+ }
+ }
+
+ for my $l (sort keys %{$self->{symlinks}}) {
+ my $target = $self->{symlinks}{$l};
+ if (! symlink ($target, "$dest/$l")) {
+ Base::fatal ("Could symlink $target $dest$l");
+ }
+ }
+
+ for my $scriptname (sort keys %{$self->{scripts}}) {
+ my $script = $self->{scripts}{$scriptname};
+ if (!open (OUT, ">", "$dest$scriptname")) {
+ Base::fatal ("Can't create $dest$scriptname");
+ }
+ print OUT "$script";
+ if (!close (OUT)) {
+ Base::fatal ("Could not write $dest$scriptname");
+ }
+ if (! chmod (0555, "$dest$scriptname")) {
+ Base::fatal ("Couldn't chmod 0555 $dest$scriptname");
+ }
+ }
+}
+
+1;
--- /dev/null
+#!perl -w
+#
+# Input - a single device from the input layer
+# Copyright (C) 2005 Erik van Konijnenburg
+#
+# 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#
+# info - info provided by low level driver for module matching
+# name - provided by driver
+# phys - provided by driver, no relation to sysfs location
+# handlers - input layer handlers
+# capabilities - kind of events that can be generated
+# hw - ...
+#
+# Handler 'kbd' indicates the device is used for console;
+# there is also a generic handler for each device, event\d+,
+# that may have a link to underlying sysfs device.
+# Capability KEY indicates there are buttons, this includes
+# both qwerty keys and the fire button on a joystick.
+#
+
+use strict;
+use warnings;
+use Base;
+use Conf;
+package Input;
+use base 'Obj';
+
+sub fill {
+ my $self = shift;
+ $self->SUPER::fill();
+ $self->takeArgs ('info', 'name', 'phys', 'handlers', 'capabilities');
+
+ #
+ # Find hardware link, if any.
+ #
+ $self->{hw} = undef;
+ for my $handler (keys %{$self->handlers}) {
+ if ($handler !~ /^event\d+$/) {
+ next;
+ }
+ my $devLink = Conf::get('sysFs')
+ . "/class/input/$handler/device";
+ my $hw = readlink ($devLink);
+ if (defined ($hw)) {
+ unless ($hw =~ s!^(\.\./)+devices/!!) {
+ # imagine localised linux (/sys/geraete ...)
+ Base::fatal ("bad device link in $devLink");
+ }
+ $self->{hw} = $hw;
+ }
+ }
+}
+
+sub info { return $_[0]->{info}; }
+sub name { return $_[0]->{name}; }
+sub phys { return $_[0]->{phys}; }
+sub handlers { return $_[0]->{handlers}; }
+sub capabilities { return $_[0]->{capabilities}; }
+sub hw { return $_[0]->{hw}; }
+
+sub string {
+ my $self = shift;
+ my $name = $self->name;
+ my $phys = $self->phys;
+ my $hw = $self->hw;
+ $hw = "--" unless defined $hw;
+ my $h = join (",", keys %{$self->handlers});
+ my $c = join (",", keys %{$self->capabilities});
+ my $kbd = $self->isKbd ? " (KBD)" : "";
+ my $str = "$name is $phys at $hw [$h] [$c]$kbd";
+ return $str;
+}
+
+#
+# isKbd -- device may be useful to get an operational keyboard.
+# This is conservative: there are two input devices for a DELL USB
+# keyboard for example, and we make no effort to determine if
+# we can leave one of them out.
+#
+sub isKbd {
+ my $self = shift;
+ if (! exists ($self->capabilities->{KEY})) {
+ return 0;
+ }
+ if (! exists ($self->handlers->{kbd})) {
+ return 0;
+ }
+ return 1;
+}
+
+1;
--- /dev/null
+#!perl -w
+#
+# InputTab -- encapsulate /proc/bus/input/devices
+# Copyright (C) 2005 Erik van Konijnenburg
+#
+# 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#
+#
+
+use strict;
+use warnings;
+use Base;
+use Conf;
+use Input;
+
+package InputTab;
+
+my $inputList = undef;
+
+sub init () {
+ if (defined ($inputList)) {
+ return;
+ }
+ $inputList = [];
+ my $name = Conf::get('procFs') . '/bus/input/devices';
+ if (! open (IN, "<", "$name")) {
+ Base::fatal ("can't open $name");
+ }
+ my $work = {
+ capabilities => {},
+ };
+ while (defined (my $line = <IN>)) {
+ chomp $line;
+ if ($line =~ /^I: (.*)$/) {
+ $work->{info} = $1;
+ }
+ elsif ($line =~ /^N: Name="(.*)"$/) {
+ $work->{name} = $1;
+ }
+ elsif ($line =~ /^P: Phys=(.*)$/) {
+ $work->{phys} = $1;
+ }
+ elsif ($line =~ /^H: Handlers=(.*)$/) {
+ my @handlers = split (/\s+/, $1);
+ $work->{handlers} = {};
+ for my $h (@handlers) {
+ $work->{handlers}{$h}++;
+ }
+ }
+ elsif ($line =~ /^B: ([A-Z]+)=(.*)$/) {
+ $work->{capabilities}{$1} = $2;
+ }
+ elsif ($line =~ /^$/) {
+ if (! exists ($work->{info})) {
+ Base::fatal ("missing I: in $name");
+ }
+ if (! exists ($work->{name})) {
+ Base::fatal ("missing N: in $name");
+ }
+ if (! exists ($work->{phys})) {
+ Base::fatal ("missing P: in $name");
+ }
+ if (! exists ($work->{handlers})) {
+ Base::fatal ("missing H: in $name");
+ }
+ push @{$inputList}, Input->new (%{$work});
+ $work = {
+ capabilities => {},
+ };
+ }
+ else {
+ Base::fatal ("unrecognised line in $name: $line");
+ }
+
+ }
+ if (! close (IN)) {
+ Base::fatal ("could not read $name");
+ }
+}
+
+sub all () {
+ init;
+ return $inputList;
+}
+
+
+1;
--- /dev/null
+#!perl -w
+#
+# KConfig -- encapsulate kernel configuration file and builtin modules
+# Copyright (C) 2005 Erik van Konijnenburg
+#
+# 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#
+#
+# KConfig is a mapping from kernel define symbol to value.
+# Common values are 'y' (compiled in), 'm' modular.
+# The "no" choice in kernel configuration is represented by absence of the
+# symbol. Other values (for example decimal or hex numbers) also occur.
+#
+# We also maintain a list of known modules and corresponding kernel define.
+# If the define is 'y', we need not load the corresponding module.
+# This is not relevant to hardware (if a PCI controller is builtin,
+# it will not occur in modules.pcimap, so no loading is attempted),
+# but it does help with filesystems, where an 'ext3' line in /etc/fstab
+# means the ext3 module needs to be loaded unless its compiled in.
+#
+
+use strict;
+use warnings;
+use Base;
+use Conf;
+package KConfig;
+
+my $kConfMap = undef;
+my $kConfList = undef;
+
+sub init () {
+ if (defined ($kConfMap)) {
+ return;
+ }
+ $kConfMap = {};
+ my $name = Conf::get('kernConf');
+ if (! open (IN, "<", "$name")) {
+ Base::fatal ("can't open kernel config file $name");
+ }
+ while (defined (my $line = <IN>)) {
+ chomp $line;
+ $line =~ s/^\s+//;
+ $line =~ s/\s+$//;
+ $line =~ s/#.*//;
+ next if ($line eq "");
+
+ if ($line !~ /^([A-Z][A-Za-z0-9_]+)=(.+)$/) {
+ # lowercase is uncommon, but: CONFIG_SCx200=m
+ Base::fatal "bad line in $name: $line";
+ }
+ my $key = $1;
+ my $value = $2;
+ if ($value eq 'y'
+ || $value eq 'm'
+ || $value =~ /^\d+$/
+ || $value =~ /^0x[0-9a-f]+$/
+ || $value =~ /^"[-a-z0-9._\/]*"$/
+ ) {
+ $kConfMap->{$key} = $value;
+ }
+ else {
+ Base::fatal "bad value in $name: $line";
+ }
+ }
+ if (! close (IN)) {
+ Base::fatal "could not read kernel config file $name";
+ }
+ $kConfList = [ sort keys %{$kConfMap} ];
+}
+
+#
+# Map module name to kernel define. Module names here
+# must use hyphen, not underscore.
+#
+my $moduleMap = {
+ # user interface devices
+ fbcon => 'FRAMEBUFFER_CONSOLE',
+ vesafb => 'FB_VESA',
+ serio => 'SERIO',
+ i8042 => 'SERIO_I8042',
+ usbhid => 'USB_HID',
+
+ # file systems
+ ext2 => 'EXT2_FS',
+ ext3 => 'EXT3_FS',
+ jbd => 'JBD',
+ reiserfs => 'REISERFS_FS',
+ jfs => 'JFS_FS',
+ xfs => 'XFS_FS',
+ minix => 'MINIX_FS',
+ romfs => 'ROMFS_FS',
+ isofs => 'ISO9660_FS',
+ udf => 'UDF_FS',
+ fat => 'FAT_FS',
+ msdos => 'MSDOS_FS',
+ vfat => 'VFAT_FS',
+ # broken, and nonmodular: umsdos => 'UMSDOS_FS',
+ ntfs => 'NTFS_FS',
+ adfs => 'ADFS_FS',
+ affs => 'AFFS_FS',
+ hfs => 'HFS_FS',
+ hfsplus => 'HFSPLUS_FS',
+ befs => 'BEFS_FS',
+ bfs => 'BFS_FS',
+ efs => 'EFS_FS',
+ jffs => 'JFFS_FS',
+ jffs2 => 'JFFS2_FS',
+ cramfs => 'CRAMFS',
+ freevxfs => 'VXFS_FS',
+ hpfs => 'HPFS_FS',
+ qnx4 => 'QNX4FS_FS',
+ sysv => 'SYSV_FS',
+ ufs => 'UFS_FS',
+ nfs => 'NFS_FS',
+ smbfs => 'SMB_FS',
+ cifs => 'CIFS',
+ ncpfs => 'NCP_FS',
+ coda => 'CODA_FS',
+ kafs => 'AFS_FS',
+
+ # device mapper: raid and lvm.
+ linear => 'MD_LINEAR',
+ raid0 => 'MD_RAID0',
+ raid1 => 'MD_RAID1',
+ raid10 => 'MD_RAID10',
+ raid5 => 'MD_RAID5',
+ raid6 => 'MD_RAID6',
+ multipath => 'MD_MULTIPATH',
+ faulty => 'MD_FAULTY',
+ md => 'BLK_DEV_MD',
+ 'dm-mod' => 'BLK_DEV_DM',
+ 'dm-crypt' => 'DM_CRYPT',
+ 'dm-snapshot' => 'DM_SNAPSHOT',
+ 'dm-mirror' => 'DM_MIRROR',
+ 'dm-zero' => 'DM_ZERO',
+
+ # crypto
+ hmac => 'CRYPTO_HMAC',
+ 'crypto-null' => 'CRYPTO_NULL',
+ md4 => 'CRYPTO_MD4',
+ md5 => 'CRYPTO_MD5',
+ sha1 => 'CRYPTO_SHA1',
+ sha256 => 'CRYPTO_SHA256',
+ sha512 => 'CRYPTO_SHA512',
+ wp512 => 'CRYPTO_WP512',
+ des => 'CRYPTO_DES',
+ blowfish => 'CRYPTO_BLOWFISH',
+ twofish => 'CRYPTO_TWOFISH',
+ serpent => 'CRYPTO_SERPENT',
+ aes => 'CRYPTO_AES',
+ cast5 => 'CRYPTO_CAST5',
+ cast6 => 'CRYPTO_CAST6',
+ arc4 => 'CRYPTO_ARC4',
+ tea => 'CRYPTO_TEA',
+ khazad => 'CRYPTO_KHAZAD',
+ anubis => 'CRYPTO_ANUBIS',
+ deflate => 'CRYPTO_DEFLATE',
+ 'michael-mic' => 'CRYPTO_MICHAEL_MIC',
+ crc32c => 'CRYPTO_CRC32C',
+ tcrypt => 'CRYPTO_TEST',
+
+ # IDE
+ 'ide-generic' => 'IDE_GENERIC',
+ 'ide-disk' => 'BLK_DEV_IDEDISK',
+ 'ide-cd' => 'BLK_DEV_IDECD',
+ 'ide-tape' => 'BLK_DEV_IDETAPE',
+ 'ide-floppy' => 'BLK_DEV_IDEFLOPPY',
+
+ # SCSI
+ 'sd-mod' => 'BLK_DEV_SD',
+ 'st' => 'CHR_DEV_ST',
+ 'sr-mod' => 'BLK_DEV_SR',
+ 'sg' => 'CHR_DEV_SG',
+};
+
+
+#
+# all -- return a list of all known configuration defines
+#
+sub all () {
+ init;
+ return $kConfList;
+}
+
+#
+# allKnownModules -- return list of all module names for
+# which a corresponding kernel define is known.
+#
+sub allKnownModules () {
+ init;
+ return [ sort keys %{$moduleMap} ];
+}
+
+#
+# isBuiltIn -- true if the module is known to be compiled
+# into the kernel.
+#
+sub isBuiltIn ($) {
+ my ($module) = @_;
+ init;
+ $module =~ s!_!-!g;
+ my $confKey = $moduleMap->{$module};
+ if (! defined ($confKey)) {
+ return 0;
+ }
+ my $confVal = $kConfMap->{"CONFIG_$confKey"};
+ if (! defined ($confVal)) {
+ return 0;
+ }
+ return ($confVal eq 'y');
+}
+
+1;
+
--- /dev/null
+#!perl -w
+#
+# LabeledPartition -- a partition with ext2 or other label.
+# Copyright (C) 2005 Erik van Konijnenburg
+#
+# 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#
+# descriptors contain:
+# - label - string such as volume name for matching in /etc/fstab
+# - uuid - similar but hex
+# - path - the block special file where the label was found
+# - type - what kind of superblock the label was found in.
+#
+# NOTE: consider delegating this whole mess to findfs from the
+# e2fsprogs package. That package can probe for an extensive
+# set of superblocks, knows about LVM, but does not make fs type
+# information available via the command line.
+#
+use strict;
+use warnings;
+package LabeledPartition;
+use base 'Obj';
+
+
+sub fill {
+ my $self = shift;
+ $self->SUPER::fill();
+ $self->takeArgs ('label', 'uuid', 'path', 'type');
+}
+
+sub label { return $_[0]->{label}; }
+sub uuid { return $_[0]->{uuid}; }
+sub type { return $_[0]->{type}; }
+sub path { return $_[0]->{path}; }
+
+sub string {
+ my $self = shift;
+ my $label = ($self->label or '-');
+ my $uuid = ($self->uuid or '-');
+ my $type = $self->type;
+ my $path = $self->path;
+ return "labeled($type) $label, $uuid at $path";
+}
+
+
+#
+# try -- return descriptor for labeled fs, or undef,
+# trying a number of formats for superblock.
+#
+sub try ($) {
+ my ($path) = @_;
+ my $result = undef;
+ my $fh;
+ if (! open ($fh, "<", "$path")) {
+ return $result;
+ }
+ binmode ($fh);
+ $result = tryExt2 ($fh, $path) unless defined $result;
+ $result = tryReiser ($fh, $path) unless defined $result;
+
+ # ignore errors, could not have been very wrong
+ # if a working superblock came out of it.
+ close ($fh);
+ return $result;
+}
+
+
+#
+# lets hope the sysadm labeled it in ascii not utf8.
+# based on util-linux-2.12h mount; they have lots of other
+# superblocks to match. Later.
+#
+sub tryExt2 ($$) {
+ my ($fh, $path) = @_;
+ my $result = undef;
+
+ if (! seek ($fh, 1024, 0)) {
+ return $result;
+ }
+ # undef on read error - is this worth a warning?
+ my $superBlock;
+ my $rc = read ($fh, $superBlock, 1024);
+ if (! defined ($rc) || $rc != 1024) {
+ return $result;
+ }
+ my ($magic, $uuid, $label) =
+ unpack
+ "x[56] v x[34] x[VVV] H[32] Z[16]",
+ $superBlock;
+
+ if ($magic == 0xEF53) {
+ $uuid = fancyUuid ($uuid);
+ $result = LabeledPartition->new (
+ type => "ext2",
+ label => $label,
+ uuid => $uuid,
+ path => $path,
+ );
+ }
+ return $result;
+}
+
+# fancyUuid - given a hex uuid, add hyphens at conventional place.
+sub fancyUuid ($) {
+ my ($uuid) = @_;
+ $uuid =~ s/^(.{8})(.{4})(.{4})(.{4})(.{12})$/$1-$2-$3-$4-$5/;
+ return lc ($uuid);
+}
+
+sub tryReiser ($$) {
+ my ($fh, $path) = @_;
+ my $result = undef;
+ # offset in reisser 3.6 (3.5-3.5.10 had 8k)
+ if (! seek ($fh, (64*1024), 0)) {
+ return $result;
+ }
+ # undef on read error - is this worth a warning?
+ my $superBlock;
+ my $rc = read ($fh, $superBlock, 1024);
+ if (! defined ($rc) || $rc != 1024) {
+ return $result;
+ }
+ my ($magic, $uuid, $label) =
+ unpack
+ "x[52] Z[10] x[22] a[16] Z[16]",
+ $superBlock;
+ my $t = join ("", map { sprintf "%02x", ord($_) } split(//, $uuid));
+ if ($magic eq "ReIsEr2Fs" || $magic eq "ReIsEr3Fs") {
+ $uuid = fancyUuid ($uuid);
+ $result = LabeledPartition->new (
+ type => "reiserfs",
+ label => $label,
+ uuid => fancyUuid($t),
+ path => $path,
+ );
+ }
+ return $result;
+}
+
+1;
--- /dev/null
+#!perl -w
+#
+# LabeledPartitionTab -- all partitions with a label or uuid.
+# Copyright (C) 2005 Erik van Konijnenburg
+#
+# 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#
+# Found by looking at partitions of block devices in /sys that
+# - have hardware backing them
+# - are accessible via a block special file in /dev.
+# - like mount(8), scan in two passes: raid devices first,
+# ignore known uuids in second scan on underlying devices.
+#
+#
+
+use strict;
+use warnings;
+use Base;
+use LabeledPartition;
+package LabeledPartitionTab;
+
+my $lpTab = undef;
+my $lpList = [];
+
+
+sub init () {
+ if (defined ($lpTab)) {
+ return;
+ }
+
+ $lpTab = {};
+ for my $pass (0, 1) {
+ for my $abd (@{ActiveBlockDevTab::all()}) {
+ my $name = $abd->name();
+ # must be accessible via special file ...
+ my $special = $abd->special;
+ next unless defined ($special);
+ next if $abd->hasPartitions();
+
+ # let's not look for labels on floppy,
+ # tends to hang.
+ # NOTE: perhaps not look for labels on any
+ # removable device, as marked by /sys?
+ next if ($name =~ /^fd\d+$/);
+
+ if (($pass == 0) == ($name =~ /^md\d+$/)) {
+ my $descr = LabeledPartition::try ($special);
+ if (defined ($descr)) {
+ #
+ # Using a partially completed
+ # data structure. In first pass,
+ # the list empty, so nothing found.
+ # In second pass, we look at non-raid
+ # devices, and only raid devices
+ # are in the list.
+ # The tricky part is that the list
+ # used to find existing devices
+ # is updated only at the end of the
+ # pass, so that different devices
+ # with same uuid are entered in the
+ # table and will cause a proper error
+ # message if the uuid is later used
+ # to find a device.
+ #
+ if (! findByUuid ($descr->uuid)) {
+ my $devno = $abd->devno;
+ $lpTab->{$devno} = $descr;
+ }
+ }
+ }
+ }
+ $lpList = [ values %{$lpTab} ];
+ }
+
+}
+
+sub all () {
+ init;
+ return $lpList;
+}
+
+sub findByLabel ($) {
+ my ($label) = @_;
+ my $result = undef;
+ for my $lp (@{LabeledPartitionTab::all()}) {
+ if ($lp->label() eq $label) {
+ if (defined ($result)) {
+ Base::fatal ("duplicate file system label $label");
+ }
+ $result = $lp;
+ }
+ }
+ return $result;
+}
+
+sub findPathByLabel ($) {
+ my ($label) = @_;
+ my $lp = findByLabel ($label);
+ return $lp->path() if $lp;
+ return undef;
+}
+
+sub findByUuid ($) {
+ my ($uuid) = @_;
+ my $result = undef;
+ $uuid = lc ($uuid);
+ for my $lp (@{LabeledPartitionTab::all()}) {
+ if ($lp->uuid() eq $uuid) {
+ if (defined ($result)) {
+ Base::fatal ("duplicate file system uuid $uuid");
+ }
+ $result = $lp;
+ }
+ }
+ return $result;
+}
+
+sub findPathByUuid ($) {
+ my ($uuid) = @_;
+ my $lp = findByUuid ($uuid);
+ return $lp->path() if $lp;
+ return undef;
+}
+
+1;
+
--- /dev/null
+#!perl -w
+#
+# LogicalVolume -- Logical Volume Descriptor
+# Copyright (C) 2005 Erik van Konijnenburg
+#
+# 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#
+#
+# lvnam - logical volume name
+# vgnam - volume group name
+# devno - "major:minor"
+#
+
+use strict;
+use warnings;
+package LogicalVolume;
+use base 'Obj';
+
+sub fill {
+ my $self = shift;
+ $self->SUPER::fill();
+ $self->takeArgs ('lvnam', 'vgnam', 'devno');
+}
+
+sub lvnam { return $_[0]->{lvnam}; }
+sub vgnam { return $_[0]->{vgnam}; }
+sub devno { return $_[0]->{devno}; }
+
+sub string {
+ my $self = shift;
+ my $lvnam = $self->lvnam;
+ my $vgnam = $self->vgnam;
+ my $devno = $self->devno;
+ my $str = "$lvnam in $vgnam at $devno";
+ return $str;
+}
+
+1;
--- /dev/null
+#!perl -w
+#
+# LvmTab -- encapsulate LVM output
+# Copyright (C) 2005 Erik van Konijnenburg
+#
+# 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#
+# The trick here is to find all block devices that back a physical
+# volume that is part of a volume group, where in that volume group
+# there is a logical volume with maj:min that contains a filesystem
+# to be mounted at boot time. In particular, if there are two
+# volume groups, one for OS and one for database, you don't want
+# the modules for the database drives on your initrd image.
+#
+# NOTE: There seem to be newer reporting tools (vgs, lvs, pvs)
+# that produce more flexible reports for easier grepping than with
+# the commands used here.
+#
+use strict;
+use warnings;
+use Base;
+use LogicalVolume;
+use VolumeGroup;
+use PhysicalVolume;
+package LvmTab;
+
+
+my $lvMap = undef;
+my $vgMap = undef;
+my $pvMap = undef;
+my $lvList = undef;
+my $vgList = undef;
+my $pvList = undef;
+
+sub init () {
+ if (defined ($lvMap)) {
+ return;
+ }
+ initLvMap ();
+ initVgMap ();
+ initPvMap ();
+ $lvList = [ values %{$lvMap} ];
+ $vgList = [ values %{$vgMap} ];
+ $pvList = [ values %{$pvMap} ];
+}
+
+sub allLogicalVolumes () {
+ init;
+ return $lvList;
+}
+
+sub allVolumeGroups () {
+ init;
+ return $vgList;
+}
+
+sub allPhysicalVolumes () {
+ init;
+ return $pvList;
+}
+
+sub findLVByDevno ($) {
+ init;
+ return $lvMap->{$_[0]};
+}
+
+sub findVGByVgnam ($) {
+ init;
+ return $vgMap->{$_[0]};
+}
+
+sub findPVsByVgnam ($) {
+ my ($vgnam) = @_;
+ my $result = [];
+ for my $pv (@{allPhysicalVolumes()}) {
+ if ($pv->vgnam() eq $vgnam) {
+ push @{$result}, $pv;
+ }
+ }
+ return $result;
+}
+
+#
+# findPhysicalVolumePathsByLVDevno -- return a list of special file names
+# that make up the physical volumes underlying a logical volume
+# identified by maj:min, or undef if the devno seems not to be
+# implemented by lvm.
+#
+sub findPVPathsByLVDevno ($) {
+ my ($devno) = @_;
+ my $lv = LvmTab::findLVByDevno ($devno);
+ if (! defined ($lv)) {
+ return undef;
+ }
+ my $vgnam = $lv->vgnam();
+ if (! defined (LvmTab::findVGByVgnam($vgnam))) {
+ Base::fatal ("unknown LVM volume group $vgnam for Logical Volume $devno");
+ }
+ my $result = [];
+ for my $pv (@{LvmTab::findPVsByVgnam ($vgnam)}) {
+ push @{$result}, $pv->pvnam();
+ }
+ return $result;
+}
+
+
+# build map from devno to logical volume descriptor,
+# built on lvdisplay.
+#
+# /dev/vg0/root:vg0:3:1:-1:1:2097152:256:-1:0:0:254:0
+#
+sub initLvMap () {
+ $lvMap = {};
+ if (! open (IN, "-|", "lvdisplay -c 2> /dev/null")) {
+ Base::fatal ("can't run lvdisplay");
+ }
+ while (defined (my $line = <IN>)) {
+ chomp $line;
+ $line =~ s/^\s*//;
+ my @fields = split (/:/, $line, 500);
+ if ($#fields != 12) {
+ Base::fatal ("malformed output from lvdisplay");
+ }
+ my $lvnam = $fields[0];
+ my $vgnam = $fields[1];
+ # Hide this, since lvdisplay output is inconsistent with docs.
+ my $lvsiz = $fields[6];
+ my $major = $fields[11];
+ my $minor = $fields[12];
+ if ($major !~ /^\d+$/) {
+ Base::fatal ("malformed output (major) from lvdisplay");
+ }
+ if ($minor !~ /^\d+$/) {
+ Base::fatal ("malformed output (minor) from lvdisplay");
+ }
+ my $devno = "$major:$minor";
+ if (exists ($lvMap->{$devno})) {
+ Base::fatal ("duplicate output ($devno) from lvdisplay");
+ }
+ $lvMap->{$devno} = LogicalVolume->new (
+ lvnam => $lvnam,
+ vgnam => $vgnam,
+ devno => $devno,
+ );
+ }
+ if (! close (IN)) {
+ Base::fatal ("error running lvdisplay");
+ }
+}
+
+# build map from vgnam to volume group descriptor,
+# built on vgdisplay.
+#
+# vg0:r/w:772:-1:0:7:6:-1:0:1:1:77799424:4096: \
+# 18994:6912:12082:MO1svc-uvVC-TFCL-qvrB-29wD-bh9K-V2e3U2
+#
+sub initVgMap () {
+ $vgMap = {};
+ if (! open (IN, "-|", "vgdisplay -c 2> /dev/null")) {
+ Base::fatal ("can't run vgdisplay");
+ }
+ while (defined (my $line = <IN>)) {
+ chomp $line;
+ $line =~ s/^\s*//;
+ my @fields = split (/:/, $line, 500);
+ if ($#fields != 16) {
+ Base::fatal ("malformed output from vgdisplay");
+ }
+ my ($vgnam, $vgacc, $vgstat,
+ $vgnum, $maxlv, $curlv, $openlv,
+ $maxlvsiz, $maxpvcnt, $curpvcnt, $actpvcnt,
+ $vgsiz, $extsiz, $extcnt, $extalloc, $extfree,
+ $uuid)
+ = @fields;
+
+ if (exists ($vgMap->{$vgnam})) {
+ Base::fatal ("duplicate output ($vgnam) from vgdisplay");
+ }
+ $vgMap->{$vgnam} = VolumeGroup->new (
+ vgnam => $vgnam,
+ uuid => $uuid,
+ );
+ }
+ if (! close (IN)) {
+ Base::fatal ("error running vgdisplay");
+ }
+}
+
+# build map from pvnam to physical volume descriptor,
+# built on pvdisplay.
+#
+# /dev/sda3:vg0:155598848:-1:8:8:-1:4096:18994: \
+# 12082:6912:X5hDer-dYpy-jpAB-IhXQ-44j4-kyj0-cOQkyE
+#
+sub initPvMap () {
+ $pvMap = {};
+ if (! open (IN, "-|", "pvdisplay -c 2> /dev/null")) {
+ Base::fatal ("can't run pvdisplay");
+ }
+ while (defined (my $line = <IN>)) {
+ chomp $line;
+ $line =~ s/^\s*//;
+ my @fields = split (/:/, $line, 500);
+ if ($#fields != 11) {
+ Base::fatal ("malformed output from pvdisplay");
+ }
+ my ($pvnam,$vgnam,$pvsiz,$pvnum,$pvstat,
+ $pvalloc,$lvcnt,$extsiz,$extcnt,
+ $extfree,$extalloc,$uuid)
+ = @fields;
+
+ if (exists ($pvMap->{$pvnam})) {
+ Base::fatal ("duplicate output ($pvnam) from vgdisplay");
+ }
+ $pvMap->{$pvnam} = PhysicalVolume->new (
+ pvnam => $pvnam,
+ vgnam => $vgnam,
+ uuid => $uuid,
+ );
+ }
+ if (! close (IN)) {
+ Base::fatal ("error running pvdisplay");
+ }
+}
+
+1;
+
+
--- /dev/null
+# Makefile.in generated by automake 1.9.5 from Makefile.am.
+# perl/Makefile. Generated from Makefile.in by configure.
+
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004, 2005 Free Software Foundation, Inc.
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+
+
+#
+# Makefile.am -- installation and packaging instructions
+# Copyright (C) 2005 Erik van Konijnenburg
+#
+# 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#
+
+#
+# Makefile.incl -- shared defines between makefiles
+# Copyright (C) 2005 Erik van Konijnenburg
+#
+# 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#
+# - auxdir contains package specific executables that may be included
+# in the generated image
+# - perldir contains perl modules to be included by the main program
+#
+# This cannot be simply passed from the master makefile; that would
+# be invisible to automake.
+
+
+srcdir = .
+top_srcdir = ..
+
+pkgdatadir = $(datadir)/yaird
+pkglibdir = $(libdir)/yaird
+pkgincludedir = $(includedir)/yaird
+top_builddir = ..
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+INSTALL = /usr/bin/install -c
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+DIST_COMMON = $(dist_perl_DATA) $(srcdir)/../Makefile.incl \
+ $(srcdir)/Makefile.am $(srcdir)/Makefile.in
+subdir = perl
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/configure.in
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+ $(ACLOCAL_M4)
+mkinstalldirs = $(install_sh) -d
+CONFIG_HEADER = $(top_builddir)/include/config.h
+CONFIG_CLEAN_FILES =
+am__installdirs = "$(DESTDIR)$(sbindir)" "$(DESTDIR)$(perldir)" \
+ "$(DESTDIR)$(perldir)"
+sbinSCRIPT_INSTALL = $(INSTALL_SCRIPT)
+SCRIPTS = $(sbin_SCRIPTS)
+SOURCES =
+DIST_SOURCES =
+am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
+am__vpath_adj = case $$p in \
+ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
+ *) f=$$p;; \
+ esac;
+am__strip_dir = `echo $$p | sed -e 's|^.*/||'`;
+dist_perlDATA_INSTALL = $(INSTALL_DATA)
+nodist_perlDATA_INSTALL = $(INSTALL_DATA)
+DATA = $(dist_perl_DATA) $(nodist_perl_DATA)
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = ${SHELL} /home/kern/bacula/k/rescue/linux/cdrom/yaird-0.0.5/missing --run aclocal-1.9
+AMDEP_FALSE = #
+AMDEP_TRUE =
+AMTAR = ${SHELL} /home/kern/bacula/k/rescue/linux/cdrom/yaird-0.0.5/missing --run tar
+AUTOCONF = ${SHELL} /home/kern/bacula/k/rescue/linux/cdrom/yaird-0.0.5/missing --run autoconf
+AUTOHEADER = ${SHELL} /home/kern/bacula/k/rescue/linux/cdrom/yaird-0.0.5/missing --run autoheader
+AUTOMAKE = ${SHELL} /home/kern/bacula/k/rescue/linux/cdrom/yaird-0.0.5/missing --run automake-1.9
+AWK = gawk
+CC = gcc
+CCDEPMODE = depmode=gcc3
+CFLAGS = -g -O2
+CPPFLAGS =
+CYGPATH_W = echo
+DEFS = -DHAVE_CONFIG_H
+DEPDIR = .deps
+ECHO_C =
+ECHO_N = -n
+ECHO_T =
+EXEEXT =
+INITRD_TEMPLATE = Fedora
+INSTALL_DATA = ${INSTALL} -m 644
+INSTALL_PROGRAM = ${INSTALL}
+INSTALL_SCRIPT = ${INSTALL}
+INSTALL_STRIP_PROGRAM = ${SHELL} $(install_sh) -c -s
+LDFLAGS =
+LIBOBJS =
+LIBS =
+LTLIBOBJS =
+MAKEINFO = ${SHELL} /home/kern/bacula/k/rescue/linux/cdrom/yaird-0.0.5/missing --run makeinfo
+OBJEXT = o
+PACKAGE = yaird
+PACKAGE_BUGREPORT =
+PACKAGE_NAME =
+PACKAGE_STRING =
+PACKAGE_TARNAME =
+PACKAGE_VERSION =
+PATH_SEPARATOR = :
+PERL = /usr/bin/perl
+SET_MAKE =
+SHELL = /bin/sh
+STRIP =
+VERSION = 0.0.5
+XMLTO = /usr/bin/xmlto
+ac_ct_CC = gcc
+ac_ct_STRIP =
+am__fastdepCC_FALSE = #
+am__fastdepCC_TRUE =
+am__include = include
+am__leading_dot = .
+am__quote =
+am__tar = ${AMTAR} chof - "$$tardir"
+am__untar = ${AMTAR} xf -
+bindir = ${exec_prefix}/bin
+build_alias =
+datadir = ${prefix}/share
+exec_prefix = ${prefix}
+host_alias =
+includedir = ${prefix}/include
+infodir = ${prefix}/info
+install_sh = /home/kern/bacula/k/rescue/linux/cdrom/yaird-0.0.5/install-sh
+libdir = ${exec_prefix}/lib
+libexecdir = ${exec_prefix}/libexec
+localstatedir = ${prefix}/var
+mandir = ${prefix}/man
+mkdir_p = mkdir -p --
+oldincludedir = /usr/include
+prefix = /usr/local
+program_transform_name = s,x,x,
+sbindir = ${exec_prefix}/sbin
+sharedstatedir = ${prefix}/com
+sysconfdir = ${prefix}/etc
+target_alias =
+auxdir = $(pkglibdir)/exec
+perldir = $(pkglibdir)/perl
+sbin_SCRIPTS = yaird
+CLEANFILES = $(sbin_SCRIPTS) Conf.pm
+edit = sed \
+ -e 's!@PERL\@!$(PERL)!' \
+ -e 's!@PACKAGE\@!$(PACKAGE)!' \
+ -e 's!@VERSION\@!$(VERSION)!' \
+ -e 's!@AUXDIR\@!$(auxdir)!' \
+ -e 's!@PERLDIR\@!$(perldir)!'
+
+
+# not compiled, but must go in the tarball.
+EXTRA_DIST = \
+ main.pl \
+ Conf.pm.in
+
+nodist_perl_DATA = \
+ Conf.pm
+
+dist_perl_DATA = \
+ ActionList.pm \
+ ActiveBlockDev.pm \
+ ActiveBlockDevTab.pm \
+ Base.pm \
+ Blacklist.pm \
+ BlockSpecialFile.pm \
+ BlockSpecialFileTab.pm \
+ FsEntry.pm \
+ FsOpts.pm \
+ FsTab.pm \
+ Hardware.pm \
+ IdeDev.pm \
+ Image.pm \
+ Input.pm \
+ InputTab.pm \
+ KConfig.pm \
+ LabeledPartition.pm \
+ LabeledPartitionTab.pm \
+ LogicalVolume.pm \
+ LvmTab.pm \
+ ModDep.pm \
+ ModDepTab.pm \
+ Obj.pm \
+ Pack.pm \
+ PciDev.pm \
+ PciMapEntry.pm \
+ PciTab.pm \
+ PhysicalVolume.pm \
+ Plan.pm \
+ RaidDev.pm \
+ RaidTab.pm \
+ ScsiDev.pm \
+ SharedLibraries.pm \
+ TestSet.pm \
+ UsbDev.pm \
+ UsbMapEntry.pm \
+ UsbTab.pm \
+ VolumeGroup.pm
+
+all: all-am
+
+.SUFFIXES:
+$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(srcdir)/../Makefile.incl $(am__configure_deps)
+ @for dep in $?; do \
+ case '$(am__configure_deps)' in \
+ *$$dep*) \
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \
+ && exit 0; \
+ exit 1;; \
+ esac; \
+ done; \
+ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu perl/Makefile'; \
+ cd $(top_srcdir) && \
+ $(AUTOMAKE) --gnu perl/Makefile
+.PRECIOUS: Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+ @case '$?' in \
+ *config.status*) \
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+ *) \
+ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
+ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+ esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure: $(am__configure_deps)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4): $(am__aclocal_m4_deps)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+install-sbinSCRIPTS: $(sbin_SCRIPTS)
+ @$(NORMAL_INSTALL)
+ test -z "$(sbindir)" || $(mkdir_p) "$(DESTDIR)$(sbindir)"
+ @list='$(sbin_SCRIPTS)'; for p in $$list; do \
+ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+ if test -f $$d$$p; then \
+ f=`echo "$$p" | sed 's|^.*/||;$(transform)'`; \
+ echo " $(sbinSCRIPT_INSTALL) '$$d$$p' '$(DESTDIR)$(sbindir)/$$f'"; \
+ $(sbinSCRIPT_INSTALL) "$$d$$p" "$(DESTDIR)$(sbindir)/$$f"; \
+ else :; fi; \
+ done
+
+uninstall-sbinSCRIPTS:
+ @$(NORMAL_UNINSTALL)
+ @list='$(sbin_SCRIPTS)'; for p in $$list; do \
+ f=`echo "$$p" | sed 's|^.*/||;$(transform)'`; \
+ echo " rm -f '$(DESTDIR)$(sbindir)/$$f'"; \
+ rm -f "$(DESTDIR)$(sbindir)/$$f"; \
+ done
+uninstall-info-am:
+install-dist_perlDATA: $(dist_perl_DATA)
+ @$(NORMAL_INSTALL)
+ test -z "$(perldir)" || $(mkdir_p) "$(DESTDIR)$(perldir)"
+ @list='$(dist_perl_DATA)'; for p in $$list; do \
+ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+ f=$(am__strip_dir) \
+ echo " $(dist_perlDATA_INSTALL) '$$d$$p' '$(DESTDIR)$(perldir)/$$f'"; \
+ $(dist_perlDATA_INSTALL) "$$d$$p" "$(DESTDIR)$(perldir)/$$f"; \
+ done
+
+uninstall-dist_perlDATA:
+ @$(NORMAL_UNINSTALL)
+ @list='$(dist_perl_DATA)'; for p in $$list; do \
+ f=$(am__strip_dir) \
+ echo " rm -f '$(DESTDIR)$(perldir)/$$f'"; \
+ rm -f "$(DESTDIR)$(perldir)/$$f"; \
+ done
+install-nodist_perlDATA: $(nodist_perl_DATA)
+ @$(NORMAL_INSTALL)
+ test -z "$(perldir)" || $(mkdir_p) "$(DESTDIR)$(perldir)"
+ @list='$(nodist_perl_DATA)'; for p in $$list; do \
+ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+ f=$(am__strip_dir) \
+ echo " $(nodist_perlDATA_INSTALL) '$$d$$p' '$(DESTDIR)$(perldir)/$$f'"; \
+ $(nodist_perlDATA_INSTALL) "$$d$$p" "$(DESTDIR)$(perldir)/$$f"; \
+ done
+
+uninstall-nodist_perlDATA:
+ @$(NORMAL_UNINSTALL)
+ @list='$(nodist_perl_DATA)'; for p in $$list; do \
+ f=$(am__strip_dir) \
+ echo " rm -f '$(DESTDIR)$(perldir)/$$f'"; \
+ rm -f "$(DESTDIR)$(perldir)/$$f"; \
+ done
+tags: TAGS
+TAGS:
+
+ctags: CTAGS
+CTAGS:
+
+
+distdir: $(DISTFILES)
+ $(mkdir_p) $(distdir)/..
+ @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \
+ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \
+ list='$(DISTFILES)'; for file in $$list; do \
+ case $$file in \
+ $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \
+ $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \
+ esac; \
+ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+ dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \
+ if test "$$dir" != "$$file" && test "$$dir" != "."; then \
+ dir="/$$dir"; \
+ $(mkdir_p) "$(distdir)$$dir"; \
+ else \
+ dir=''; \
+ fi; \
+ if test -d $$d/$$file; then \
+ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+ cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
+ fi; \
+ cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
+ else \
+ test -f $(distdir)/$$file \
+ || cp -p $$d/$$file $(distdir)/$$file \
+ || exit 1; \
+ fi; \
+ done
+check-am: all-am
+check: check-am
+all-am: Makefile $(SCRIPTS) $(DATA)
+installdirs:
+ for dir in "$(DESTDIR)$(sbindir)" "$(DESTDIR)$(perldir)" "$(DESTDIR)$(perldir)"; do \
+ test -z "$$dir" || $(mkdir_p) "$$dir"; \
+ done
+install: install-am
+install-exec: install-exec-am
+install-data: install-data-am
+uninstall: uninstall-am
+
+install-am: all-am
+ @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-am
+install-strip:
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ `test -z '$(STRIP)' || \
+ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+mostlyclean-generic:
+
+clean-generic:
+ -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES)
+
+distclean-generic:
+ -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+
+maintainer-clean-generic:
+ @echo "This command is intended for maintainers to use"
+ @echo "it deletes files that may require special tools to rebuild."
+clean: clean-am
+
+clean-am: clean-generic mostlyclean-am
+
+distclean: distclean-am
+ -rm -f Makefile
+distclean-am: clean-am distclean-generic
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+info: info-am
+
+info-am:
+
+install-data-am: install-dist_perlDATA install-nodist_perlDATA
+
+install-exec-am: install-sbinSCRIPTS
+
+install-info: install-info-am
+
+install-man:
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-am
+ -rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-generic
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am: uninstall-dist_perlDATA uninstall-info-am \
+ uninstall-nodist_perlDATA uninstall-sbinSCRIPTS
+
+.PHONY: all all-am check check-am clean clean-generic distclean \
+ distclean-generic distdir dvi dvi-am html html-am info info-am \
+ install install-am install-data install-data-am \
+ install-dist_perlDATA install-exec install-exec-am \
+ install-info install-info-am install-man \
+ install-nodist_perlDATA install-sbinSCRIPTS install-strip \
+ installcheck installcheck-am installdirs maintainer-clean \
+ maintainer-clean-generic mostlyclean mostlyclean-generic pdf \
+ pdf-am ps ps-am uninstall uninstall-am uninstall-dist_perlDATA \
+ uninstall-info-am uninstall-nodist_perlDATA \
+ uninstall-sbinSCRIPTS
+
+
+yaird: main.pl
+ $(edit) < $< > $@
+ chmod ugo+x $@
+
+Conf.pm: Conf.pm.in
+ $(edit) < $< > $@
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
--- /dev/null
+#
+# Makefile.am -- installation and packaging instructions
+# Copyright (C) 2005 Erik van Konijnenburg
+#
+# 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#
+
+include ../Makefile.incl
+
+sbin_SCRIPTS = yaird
+CLEANFILES = $(sbin_SCRIPTS) Conf.pm
+
+edit = sed \
+ -e 's!@PERL\@!$(PERL)!' \
+ -e 's!@PACKAGE\@!$(PACKAGE)!' \
+ -e 's!@VERSION\@!$(VERSION)!' \
+ -e 's!@AUXDIR\@!$(auxdir)!' \
+ -e 's!@PERLDIR\@!$(perldir)!'
+
+yaird: main.pl
+ $(edit) < $< > $@
+ chmod ugo+x $@
+
+Conf.pm: Conf.pm.in
+ $(edit) < $< > $@
+
+# not compiled, but must go in the tarball.
+EXTRA_DIST = \
+ main.pl \
+ Conf.pm.in
+
+nodist_perl_DATA = \
+ Conf.pm
+
+dist_perl_DATA = \
+ ActionList.pm \
+ ActiveBlockDev.pm \
+ ActiveBlockDevTab.pm \
+ Base.pm \
+ Blacklist.pm \
+ BlockSpecialFile.pm \
+ BlockSpecialFileTab.pm \
+ FsEntry.pm \
+ FsOpts.pm \
+ FsTab.pm \
+ Hardware.pm \
+ IdeDev.pm \
+ Image.pm \
+ Input.pm \
+ InputTab.pm \
+ KConfig.pm \
+ LabeledPartition.pm \
+ LabeledPartitionTab.pm \
+ LogicalVolume.pm \
+ LvmTab.pm \
+ ModDep.pm \
+ ModDepTab.pm \
+ Obj.pm \
+ Pack.pm \
+ PciDev.pm \
+ PciMapEntry.pm \
+ PciTab.pm \
+ PhysicalVolume.pm \
+ Plan.pm \
+ RaidDev.pm \
+ RaidTab.pm \
+ ScsiDev.pm \
+ SharedLibraries.pm \
+ TestSet.pm \
+ UsbDev.pm \
+ UsbMapEntry.pm \
+ UsbTab.pm \
+ VolumeGroup.pm
+
--- /dev/null
+# Makefile.in generated by automake 1.9.5 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004, 2005 Free Software Foundation, Inc.
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+@SET_MAKE@
+
+#
+# Makefile.am -- installation and packaging instructions
+# Copyright (C) 2005 Erik van Konijnenburg
+#
+# 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#
+
+#
+# Makefile.incl -- shared defines between makefiles
+# Copyright (C) 2005 Erik van Konijnenburg
+#
+# 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#
+# - auxdir contains package specific executables that may be included
+# in the generated image
+# - perldir contains perl modules to be included by the main program
+#
+# This cannot be simply passed from the master makefile; that would
+# be invisible to automake.
+
+
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH = @srcdir@
+pkgdatadir = $(datadir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+top_builddir = ..
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+INSTALL = @INSTALL@
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+DIST_COMMON = $(dist_perl_DATA) $(srcdir)/../Makefile.incl \
+ $(srcdir)/Makefile.am $(srcdir)/Makefile.in
+subdir = perl
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/configure.in
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+ $(ACLOCAL_M4)
+mkinstalldirs = $(install_sh) -d
+CONFIG_HEADER = $(top_builddir)/include/config.h
+CONFIG_CLEAN_FILES =
+am__installdirs = "$(DESTDIR)$(sbindir)" "$(DESTDIR)$(perldir)" \
+ "$(DESTDIR)$(perldir)"
+sbinSCRIPT_INSTALL = $(INSTALL_SCRIPT)
+SCRIPTS = $(sbin_SCRIPTS)
+SOURCES =
+DIST_SOURCES =
+am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
+am__vpath_adj = case $$p in \
+ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
+ *) f=$$p;; \
+ esac;
+am__strip_dir = `echo $$p | sed -e 's|^.*/||'`;
+dist_perlDATA_INSTALL = $(INSTALL_DATA)
+nodist_perlDATA_INSTALL = $(INSTALL_DATA)
+DATA = $(dist_perl_DATA) $(nodist_perl_DATA)
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+AMDEP_FALSE = @AMDEP_FALSE@
+AMDEP_TRUE = @AMDEP_TRUE@
+AMTAR = @AMTAR@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CPPFLAGS = @CPPFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EXEEXT = @EXEEXT@
+INITRD_TEMPLATE = @INITRD_TEMPLATE@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+LDFLAGS = @LDFLAGS@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LTLIBOBJS = @LTLIBOBJS@
+MAKEINFO = @MAKEINFO@
+OBJEXT = @OBJEXT@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PERL = @PERL@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+VERSION = @VERSION@
+XMLTO = @XMLTO@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_STRIP = @ac_ct_STRIP@
+am__fastdepCC_FALSE = @am__fastdepCC_FALSE@
+am__fastdepCC_TRUE = @am__fastdepCC_TRUE@
+am__include = @am__include@
+am__leading_dot = @am__leading_dot@
+am__quote = @am__quote@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build_alias = @build_alias@
+datadir = @datadir@
+exec_prefix = @exec_prefix@
+host_alias = @host_alias@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+oldincludedir = @oldincludedir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+auxdir = $(pkglibdir)/exec
+perldir = $(pkglibdir)/perl
+sbin_SCRIPTS = yaird
+CLEANFILES = $(sbin_SCRIPTS) Conf.pm
+edit = sed \
+ -e 's!@PERL\@!$(PERL)!' \
+ -e 's!@PACKAGE\@!$(PACKAGE)!' \
+ -e 's!@VERSION\@!$(VERSION)!' \
+ -e 's!@AUXDIR\@!$(auxdir)!' \
+ -e 's!@PERLDIR\@!$(perldir)!'
+
+
+# not compiled, but must go in the tarball.
+EXTRA_DIST = \
+ main.pl \
+ Conf.pm.in
+
+nodist_perl_DATA = \
+ Conf.pm
+
+dist_perl_DATA = \
+ ActionList.pm \
+ ActiveBlockDev.pm \
+ ActiveBlockDevTab.pm \
+ Base.pm \
+ Blacklist.pm \
+ BlockSpecialFile.pm \
+ BlockSpecialFileTab.pm \
+ FsEntry.pm \
+ FsOpts.pm \
+ FsTab.pm \
+ Hardware.pm \
+ IdeDev.pm \
+ Image.pm \
+ Input.pm \
+ InputTab.pm \
+ KConfig.pm \
+ LabeledPartition.pm \
+ LabeledPartitionTab.pm \
+ LogicalVolume.pm \
+ LvmTab.pm \
+ ModDep.pm \
+ ModDepTab.pm \
+ Obj.pm \
+ Pack.pm \
+ PciDev.pm \
+ PciMapEntry.pm \
+ PciTab.pm \
+ PhysicalVolume.pm \
+ Plan.pm \
+ RaidDev.pm \
+ RaidTab.pm \
+ ScsiDev.pm \
+ SharedLibraries.pm \
+ TestSet.pm \
+ UsbDev.pm \
+ UsbMapEntry.pm \
+ UsbTab.pm \
+ VolumeGroup.pm
+
+all: all-am
+
+.SUFFIXES:
+$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(srcdir)/../Makefile.incl $(am__configure_deps)
+ @for dep in $?; do \
+ case '$(am__configure_deps)' in \
+ *$$dep*) \
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \
+ && exit 0; \
+ exit 1;; \
+ esac; \
+ done; \
+ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu perl/Makefile'; \
+ cd $(top_srcdir) && \
+ $(AUTOMAKE) --gnu perl/Makefile
+.PRECIOUS: Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+ @case '$?' in \
+ *config.status*) \
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+ *) \
+ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
+ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+ esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure: $(am__configure_deps)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4): $(am__aclocal_m4_deps)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+install-sbinSCRIPTS: $(sbin_SCRIPTS)
+ @$(NORMAL_INSTALL)
+ test -z "$(sbindir)" || $(mkdir_p) "$(DESTDIR)$(sbindir)"
+ @list='$(sbin_SCRIPTS)'; for p in $$list; do \
+ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+ if test -f $$d$$p; then \
+ f=`echo "$$p" | sed 's|^.*/||;$(transform)'`; \
+ echo " $(sbinSCRIPT_INSTALL) '$$d$$p' '$(DESTDIR)$(sbindir)/$$f'"; \
+ $(sbinSCRIPT_INSTALL) "$$d$$p" "$(DESTDIR)$(sbindir)/$$f"; \
+ else :; fi; \
+ done
+
+uninstall-sbinSCRIPTS:
+ @$(NORMAL_UNINSTALL)
+ @list='$(sbin_SCRIPTS)'; for p in $$list; do \
+ f=`echo "$$p" | sed 's|^.*/||;$(transform)'`; \
+ echo " rm -f '$(DESTDIR)$(sbindir)/$$f'"; \
+ rm -f "$(DESTDIR)$(sbindir)/$$f"; \
+ done
+uninstall-info-am:
+install-dist_perlDATA: $(dist_perl_DATA)
+ @$(NORMAL_INSTALL)
+ test -z "$(perldir)" || $(mkdir_p) "$(DESTDIR)$(perldir)"
+ @list='$(dist_perl_DATA)'; for p in $$list; do \
+ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+ f=$(am__strip_dir) \
+ echo " $(dist_perlDATA_INSTALL) '$$d$$p' '$(DESTDIR)$(perldir)/$$f'"; \
+ $(dist_perlDATA_INSTALL) "$$d$$p" "$(DESTDIR)$(perldir)/$$f"; \
+ done
+
+uninstall-dist_perlDATA:
+ @$(NORMAL_UNINSTALL)
+ @list='$(dist_perl_DATA)'; for p in $$list; do \
+ f=$(am__strip_dir) \
+ echo " rm -f '$(DESTDIR)$(perldir)/$$f'"; \
+ rm -f "$(DESTDIR)$(perldir)/$$f"; \
+ done
+install-nodist_perlDATA: $(nodist_perl_DATA)
+ @$(NORMAL_INSTALL)
+ test -z "$(perldir)" || $(mkdir_p) "$(DESTDIR)$(perldir)"
+ @list='$(nodist_perl_DATA)'; for p in $$list; do \
+ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+ f=$(am__strip_dir) \
+ echo " $(nodist_perlDATA_INSTALL) '$$d$$p' '$(DESTDIR)$(perldir)/$$f'"; \
+ $(nodist_perlDATA_INSTALL) "$$d$$p" "$(DESTDIR)$(perldir)/$$f"; \
+ done
+
+uninstall-nodist_perlDATA:
+ @$(NORMAL_UNINSTALL)
+ @list='$(nodist_perl_DATA)'; for p in $$list; do \
+ f=$(am__strip_dir) \
+ echo " rm -f '$(DESTDIR)$(perldir)/$$f'"; \
+ rm -f "$(DESTDIR)$(perldir)/$$f"; \
+ done
+tags: TAGS
+TAGS:
+
+ctags: CTAGS
+CTAGS:
+
+
+distdir: $(DISTFILES)
+ $(mkdir_p) $(distdir)/..
+ @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \
+ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \
+ list='$(DISTFILES)'; for file in $$list; do \
+ case $$file in \
+ $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \
+ $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \
+ esac; \
+ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+ dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \
+ if test "$$dir" != "$$file" && test "$$dir" != "."; then \
+ dir="/$$dir"; \
+ $(mkdir_p) "$(distdir)$$dir"; \
+ else \
+ dir=''; \
+ fi; \
+ if test -d $$d/$$file; then \
+ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+ cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
+ fi; \
+ cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
+ else \
+ test -f $(distdir)/$$file \
+ || cp -p $$d/$$file $(distdir)/$$file \
+ || exit 1; \
+ fi; \
+ done
+check-am: all-am
+check: check-am
+all-am: Makefile $(SCRIPTS) $(DATA)
+installdirs:
+ for dir in "$(DESTDIR)$(sbindir)" "$(DESTDIR)$(perldir)" "$(DESTDIR)$(perldir)"; do \
+ test -z "$$dir" || $(mkdir_p) "$$dir"; \
+ done
+install: install-am
+install-exec: install-exec-am
+install-data: install-data-am
+uninstall: uninstall-am
+
+install-am: all-am
+ @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-am
+install-strip:
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ `test -z '$(STRIP)' || \
+ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+mostlyclean-generic:
+
+clean-generic:
+ -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES)
+
+distclean-generic:
+ -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+
+maintainer-clean-generic:
+ @echo "This command is intended for maintainers to use"
+ @echo "it deletes files that may require special tools to rebuild."
+clean: clean-am
+
+clean-am: clean-generic mostlyclean-am
+
+distclean: distclean-am
+ -rm -f Makefile
+distclean-am: clean-am distclean-generic
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+info: info-am
+
+info-am:
+
+install-data-am: install-dist_perlDATA install-nodist_perlDATA
+
+install-exec-am: install-sbinSCRIPTS
+
+install-info: install-info-am
+
+install-man:
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-am
+ -rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-generic
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am: uninstall-dist_perlDATA uninstall-info-am \
+ uninstall-nodist_perlDATA uninstall-sbinSCRIPTS
+
+.PHONY: all all-am check check-am clean clean-generic distclean \
+ distclean-generic distdir dvi dvi-am html html-am info info-am \
+ install install-am install-data install-data-am \
+ install-dist_perlDATA install-exec install-exec-am \
+ install-info install-info-am install-man \
+ install-nodist_perlDATA install-sbinSCRIPTS install-strip \
+ installcheck installcheck-am installdirs maintainer-clean \
+ maintainer-clean-generic mostlyclean mostlyclean-generic pdf \
+ pdf-am ps ps-am uninstall uninstall-am uninstall-dist_perlDATA \
+ uninstall-info-am uninstall-nodist_perlDATA \
+ uninstall-sbinSCRIPTS
+
+
+yaird: main.pl
+ $(edit) < $< > $@
+ chmod ugo+x $@
+
+Conf.pm: Conf.pm.in
+ $(edit) < $< > $@
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
--- /dev/null
+#!perl -w
+#
+# ModDep -- encapsulate single line from modules.dep.
+# Copyright (C) 2005 Erik van Konijnenburg
+#
+# 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#
+# name - normalised name of the module.
+# file - the file to load for this kernel module
+# origin - file:line where this was defined
+# deps - list of names of modules this module depends on.
+#
+use strict;
+use warnings;
+use Base;
+package ModDep;
+use base 'Obj';
+
+
+sub fill {
+ my $self = shift;
+ $self->SUPER::fill();
+ $self->takeArgs ('name', 'file', 'origin', 'deps');
+}
+
+sub name { return $_[0]->{name}; }
+sub file { return $_[0]->{file}; }
+sub origin { return $_[0]->{origin}; }
+sub deps { return $_[0]->{deps}; }
+
+sub string {
+ my $self = shift;
+ my $name = $self->name;
+ my $file = $self->file;
+ my $origin = $self->origin;
+ my $deps = join (",", @{$self->deps});
+
+ return "$name($origin) at $file need $deps."
+}
+
+
+
+1;
--- /dev/null
+#!perl -w
+#
+# ModDepTab -- encapsulate modprobe(8)
+# Copyright (C) 2005 Erik van Konijnenburg
+#
+# 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#
+# Most important routine is resolve(), which returns a list of
+# modules with dependencies resolved.
+#
+# For every module, we have a list of prerequisite modules;
+# these prerequisites are in no particular order: the prerequisites
+# may have dependencies among themselves that are not satisfied
+# by the order in the list.
+#
+# This emulates modprobe(8) by interpreting /lib/modules/2.6.x/modules.dep.
+# Input format:
+# - characters are bytes, no messing with utf-8.
+# - backslash at end of line merges lines
+# - other \x get replaced by x
+# - ^\s*# lines are ignored
+# - lines without : are ignored.
+# This means "aap: noot.#7" is a valid dependency.
+# The backslash interpretation is mostly for modprobe.conf;
+# depmod does not generate it.
+#
+# Modprobe determines module name by dropping everything after dot:
+# "/lib/noot.#7" is module "noot". We'll adopt the same policy.
+#
+# Note that depmod only grabs modules ending in .ko or .ko.gz;
+# we'll issue a warning if a module has a different suffix.
+#
+# Note that modprobe does not discriminate against modules outside
+# /lib/modules: if it's listed in modules.dep, it's a valid module.
+#
+# Note that redhat has a convention that modules in .../update take
+# precedence over other modules with the same name. Depmod implements
+# this by not putting modules that are overridden in modules.dep.
+# Thus modprobe and yaird need no special action to support that convention.
+#
+# The logic modprobe uses to determine which modules to load:
+# - replace hyphens with underscore
+# - read config specified on command line,
+# OR modprobe.conf OR modprobe.d, only first one found.
+# Remember all "install" and "option" directives,
+# rewrite module name if an alias matches
+# - if no alias found and the name is of the form 'symbol:xxx':
+# look in modules.symbols to resolve to a module name
+# - if alias found:
+# make a list of modules to load, based on modules.dep
+# - else:
+# make a list of modules to load, based on modules.dep
+# if that turned up no modules AND there was no install cmd:
+# - look in modules.aliases to resolve to modulename
+# - make a list of modules to load, based on modules.dep
+# - if the list to load is empty AND there was no install command:
+# - complain.
+# # in insmod():
+# - recurse over the module list, most basic stuff first, doing:
+# - if there is a command for this module name:
+# execute it
+# - else:
+# load the module
+#
+# We probably should replace this perl module with parsing the
+# output of modprobe --verbose --dry-run --show-depends --set-version,
+# but that requires changes in the calling modules, and there's discussion
+# of adding blacklist support to modprobe, so for now, let's not.
+#
+
+use strict;
+use warnings;
+use Base;
+use Conf;
+use ModDep;
+use KConfig;
+
+package ModDepTab;
+
+my $modDepTab = undef;
+my $modDepList = undef;
+
+sub init () {
+ if (defined ($modDepTab)) {
+ return;
+ }
+ $modDepTab = {};
+ my $name = Conf::get('modDep');
+ if (! open (IN, "<", "$name")) {
+ Base::fatal ("can't open $name");
+ }
+ my $lineNo = 0;
+ while (defined (my $line = <IN>)) {
+ $lineNo++;
+ chomp $line;
+
+ # it would be nice to ignore leading and trailing
+ # space, and to allow # comment at end of line.
+ # however, that's not how modprobe does it,
+ # so we shouldn't either.
+ next if $line =~ /^\s*#/;
+
+ if ($line =~ /^(.*):\s*(.*)$/) {
+ my $file = $1;
+ my $val = $2;
+ my $key = $file;
+
+ if ($key !~ /\.ko$/ && $key !~ /\.ko\.gz/) {
+ Base::warning ("$name:$lineNo: odd module name: $key");
+ }
+ $key =~ s!.*/!!;
+ $key =~ s!\..*$!!;
+ $key =~ s!_!-!g;
+
+ my @fields = split (/\s+/, $val);
+ for my $i (0 .. $#fields) {
+ # strip pathname and extension from
+ # required modules, normalise underscore.
+ # dont complain about odd suffix.
+ $fields[$i] =~ s!.*/!!;
+ $fields[$i] =~ s!\..*$!!;
+ $fields[$i] =~ s!_!-!g;
+ }
+
+ my $conflict = $modDepTab->{$key};
+ if (defined ($conflict)) {
+ my $origin = $conflict->origin();
+ Base::warning ("$name:$lineNo: $key overrules earlier definition at $origin");
+ }
+
+ $modDepTab->{$key} = ModDep->new (
+ name => $key,
+ file => $file,
+ origin => "$name:$lineNo",
+ deps => [ @fields ],
+ );
+ }
+ else {
+ Base::warning ("$name:$lineNo: malformed line ignored");
+ }
+
+ }
+ if (! close (IN)) {
+ Base::fatal ("could not read $name");
+ }
+ $modDepList = [ sort keys %{$modDepTab} ];
+}
+
+sub all () {
+ init;
+ return $modDepList;
+}
+
+sub findByModnam ($) {
+ my ($module) = @_;
+ init;
+ $module =~ s!_!-!g;
+ my $result = $modDepTab->{$module};
+ if (! defined ($result)) {
+ Base::fatal ("can't find dependencies for $module");
+ }
+ return $result;
+}
+
+
+# return a copy of the list with prerequisite modules inserted
+sub resolve ($) {
+ my ($modList) = @_;
+ Base::debug ("resolving: " . join (',', @{$modList}) . '.');
+ my $result = [];
+ resolve2 ($modList, $result);
+ Base::debug ("resolved to: " . join (',', @{$result}) . '.');
+ return $result;
+}
+
+#
+# resolve2 -- given a list of modules, that may have dependencies
+# (even among themselves) and a list of modules that is in proper order
+# to be loaded without unresolved dependencies,
+# add everything from the first list (plus their dependencies)
+# to the second list, without introducing duplicates.
+#
+sub resolve2 ($$);
+sub resolve2 ($$) {
+ my ($modList, $done) = @_;
+OUTER: for my $module (@{$modList}) {
+ #
+ # Stuff that is compiled into the kernel cannot
+ # add or resolve dependencies, and obviously don't
+ # need to be loaded. Drop them from the list.
+ #
+ if (KConfig::isBuiltIn ($module)) {
+ next OUTER;
+ }
+ #
+ # if the module is already there, don't add again
+ #
+ for my $d (@{$done}) {
+ if ($d eq $module) {
+ next OUTER;
+ }
+ }
+ #
+ # recursively add prerequisites
+ #
+ my $deps = ModDepTab::findByModnam($module);
+ if (! defined ($deps)) {
+ Base::fatal ("can't find dependencies for $module");
+ }
+ resolve2 ($deps->deps, $done);
+ #
+ # and module itself
+ #
+ push @{$done}, $module;
+ }
+}
+
+1;
--- /dev/null
+#!perl -w
+#
+# Obj -- basic object stuff
+# Copyright (C) 2005 Erik van Konijnenburg
+#
+# 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#
+# The new() function takes a hash as argument, used to do object
+# initialisation. Initialisation is delegated to fill() in derived
+# classes. Fill() is expected to use takeArgs() to claim those
+# initialisation args it's interested in; other args are left for
+# fill() functions further down the inheritance chain. Arguments
+# may have undef as value.
+#
+
+use strict;
+use warnings;
+use Base;
+package Obj;
+
+sub new {
+ my $class = shift;
+ my $self = {};
+ $self->{'_args'} = { @_ };
+ bless ($self, $class);
+ $self->fill();
+ my $bad = join (', ', keys %{$self->{'_args'}});
+ if ($bad ne '') {
+ Base::bug "Unknown constructor args: $bad";
+ }
+ return $self;
+}
+
+sub fill {
+ my $self = shift;
+ # Derived classes can claim arguments like so:
+ # self->SUPER::fill();
+ # $self->takeArg ('a');
+}
+
+sub takeArgs {
+ my ($self, @fields) = @_;
+ for my $field (@fields) {
+ Base::assert (exists ($self->{'_args'}{$field}));
+ $self->{$field} = delete $self->{'_args'}{$field};
+ }
+}
+
+1;
--- /dev/null
+#!perl -w
+#
+# Pack -- create an image and pack in suitable format.
+# Copyright (C) 2005 Erik van Konijnenburg
+#
+# 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#
+# knownFormat -- true if it's a known format
+# package -- given format, image descriptor and destination,
+# put the image in the destination in requested format.
+#
+# Supported formats:
+# -- directory, for debugging
+# -- cramfs, as used in Debian initrd
+# -- cpio, actually cpio.gz, as used in Fedora initramfs.
+#
+# This module takes care not to leave a partially completed destination
+# on error.
+#
+
+use strict;
+use warnings;
+use File::Temp;
+use Base;
+use Image;
+
+package Pack;
+
+sub packDirectory ($$);
+sub packCramfs ($$);
+sub packCpio ($$);
+
+my $packagers = {
+ directory => \&packDirectory,
+ cramfs => \&packCramfs,
+ cpio => \&packCpio,
+};
+
+sub knownFormat ($) {
+ return exists ($packagers->{$_[0]});
+}
+
+sub package ($$$) {
+ my ($image, $format, $destination) = @_;
+ Base::assert (knownFormat ($format));
+
+ #
+ # Temp based on destination,to increase likelyhood
+ # of rename being atomic.
+ #
+ my $template = "$destination.XXXXXXXXXXXXXXXX";
+ my $tempdir = File::Temp::tempdir ($template, CLEANUP => 1);
+ $image->buildHere ($tempdir);
+
+ $packagers->{$format}($tempdir, $destination);
+}
+
+
+
+sub packDirectory ($$) {
+ my ($tempdir, $destination) = @_;
+
+ if (! rename ($tempdir, $destination)) {
+ Base::fatal ("could not move $tempdir to $destination");
+ }
+}
+
+
+
+sub packCramfs ($$) {
+ my ($tempdir, $destination) = @_;
+
+ my $template = "$destination.XXXXXXXXXXXXXXXX";
+ my ($fh, $tempfile) = File::Temp::tempfile ($template, UNLINK => 1);
+ if (system ("/usr/sbin/mkcramfs -E '$tempdir' '$tempfile' > /dev/null") != 0) {
+ Base::fatal ("mkcramfs $tempdir failed");
+ }
+ if (! rename ($tempfile, $destination)) {
+ Base::fatal ("could not move $tempfile to $destination");
+ }
+}
+
+
+
+sub packCpio ($$) {
+ my ($tempdir, $destination) = @_;
+
+ #
+ # Note how the tempfile can be a relative path, and how cpio
+ # depends on a chdir into tempdir. Thus, cpio output tempfile
+ # should *not* be based on a template.
+ #
+
+ my $template = "$destination.XXXXXXXXXXXXXXXX";
+ my ($fh, $fromCpio) = File::Temp::tempfile (UNLINK => 1);
+ my ($fh2, $fromGzip) = File::Temp::tempfile ($template, UNLINK => 1);
+
+ #
+ # There are multiple universal unique portable archive formats,
+ # each with the same magic number.
+ # cpio(1) mentions newc and odc; these differ in size of
+ # fields of header. Whether -oc generates newc or odc depends
+ # on a define in cpio, with Fedora picking a different default
+ # than Debian. The kernel accepts only newc format (see initramfs.c).
+ # Use the -H newc option to get the right format, regardless
+ # of which default the distro chooses for -c.
+ #
+ if (system ("cd '$tempdir' && find . | cpio --quiet -o -H newc > $fromCpio")) {
+ # $! is useless here: inappropriate ioctl for device ...
+ Base::fatal ("cpio $tempdir failed");
+ }
+ if (system ("gzip -9 < $fromCpio > $fromGzip")) {
+ Base::fatal ("gzip $tempdir failed");
+ }
+
+ if (! rename ($fromGzip, $destination)) {
+ Base::fatal ("could not move $fromGzip to $destination");
+ }
+}
+
+1;
--- /dev/null
+#!perl -w
+#
+# PciDev -- the probed values for a PCI device, as found in /sys.
+# Copyright (C) 2005 Erik van Konijnenburg
+#
+# 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#
+use strict;
+use warnings;
+use Base;
+package PciDev;
+use base 'Obj';
+
+sub fill {
+ my $self = shift;
+ $self->SUPER::fill();
+ $self->takeArgs ('path');
+ my $path = $self->path;
+ $self->{vendor} = Base::getHexFile ("$path/vendor");
+ $self->{device} = Base::getHexFile ("$path/device");
+ $self->{subvendor} = Base::getHexFile ("$path/subsystem_vendor");
+ $self->{subdevice} = Base::getHexFile ("$path/subsystem_device");
+ $self->{class} = Base::getHexFile ("$path/class");
+}
+
+sub path { return $_[0]->{path}; }
+sub vendor { return $_[0]->{vendor}; }
+sub device { return $_[0]->{device}; }
+sub subvendor { return $_[0]->{subvendor}; }
+sub subdevice { return $_[0]->{subdevice}; }
+sub class { return $_[0]->{class}; }
+
+
+1;
--- /dev/null
+#!perl -w
+#
+# PciMapEntry - iencapsulate a line form modules.pcimap.
+# Copyright (C) 2005 Erik van Konijnenburg
+#
+# 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#
+#
+# Knows how to match, can return module name.
+#
+
+use strict;
+use warnings;
+use Base;
+package PciMapEntry;
+use base 'Obj';
+
+sub fill {
+ my $self = shift;
+ $self->SUPER::fill();
+ $self->takeArgs ('module', 'vendor', 'device', 'subvendor',
+ 'subdevice', 'class', 'classmask', 'driver_data');
+}
+
+sub module { return $_[0]->{module}; }
+
+# we could do the PCI_ANY processing in init,
+# if it turns out to be time critical.
+my $PCI_ANY = 0xffffffff;
+sub matches {
+ my ($self, $dev) = @_;
+ if ($self->{vendor} != $PCI_ANY && $self->{vendor} != $dev->vendor) {
+ return 0;
+ }
+ if ($self->{device} != $PCI_ANY && $self->{device} != $dev->device) {
+ return 0;
+ }
+ if ($self->{subvendor} != $PCI_ANY
+ && $self->{subvendor} != $dev->subvendor) {
+ return 0;
+ }
+ if ($self->{subdevice} != $PCI_ANY
+ && $self->{subdevice} != $dev->subdevice) {
+ return 0;
+ }
+ if ($self->{class} == ($dev->class & $self->{classmask})) {
+ return 1;
+ }
+ return 0;
+}
+
+1;
+
--- /dev/null
+#!perl -w
+#
+# PciTab -- encapsulate modules.pcimap
+# Copyright (C) 2005 Erik van Konijnenburg
+#
+# 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#
+
+use strict;
+use warnings;
+use Base;
+use Conf;
+use PciMapEntry;
+package PciTab;
+
+my $pciList = undef;
+
+# Parse this:
+# # pci module vendor device subvendor subdevice class class_mask driver_data
+# parport_pc 0x00001106 0x00000686 0xffffffff 0xffffffff 0x00000000 0x00000000 0x0
+# parport_pc 0x00001106 0x00008231 0xffffffff 0xffffffff 0x00000000 0x00000000 0x0
+
+sub init () {
+ if (defined ($pciList)) {
+ return;
+ }
+ $pciList = [];
+ my $name = Conf::get('pciMap');
+ if (! open (IN, "<", "$name")) {
+ Base::fatal ("can't open pci module list $name");
+ }
+ while (defined (my $line = <IN>)) {
+ chomp $line;
+ $line =~ s/#.*//;
+ $line =~ s/^\s+//;
+ $line =~ s/\s+$//;
+ next if ($line eq "");
+ my @fields = split (/\s+/, $line, 999);
+ if ($#fields != 7) {
+ Base::fatal "malformed line in pci module list $name";
+ }
+ push @{$pciList}, PciMapEntry->new (
+ module => $fields[0],
+ vendor => hex ($fields[1]),
+ device => hex ($fields[2]),
+ subvendor => hex ($fields[3]),
+ subdevice => hex ($fields[4]),
+ class => hex ($fields[5]),
+ classmask => hex ($fields[6]),
+ driver_data => hex ($fields[7]),
+ );
+ }
+ if (! close (IN)) {
+ Base::fatal "could not read pci module list $name";
+ }
+}
+
+sub all () {
+ init;
+ return $pciList;
+}
+
+# given pathname in devices tree, find module name in PCI map as a list.
+sub find ($) {
+ my ($dev) = @_;
+ my @result = ();
+ for my $pme (@{PciTab::all()}) {
+ if ($pme->matches ($dev)) {
+ push @result, $pme->module;
+ }
+ }
+ return [@result];
+}
+
+
+1;
+
--- /dev/null
+#!perl -w
+#
+# PhysicalVolume -- Physical Volume Descriptor
+# Copyright (C) 2005 Erik van Konijnenburg
+#
+# 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#
+# pvnam - physical volume name
+# vgnam - volume group name
+# devno - "major:minor"
+#
+
+use strict;
+use warnings;
+package PhysicalVolume;
+use base 'Obj';
+
+sub fill {
+ my $self = shift;
+ $self->SUPER::fill();
+ $self->takeArgs ('pvnam', 'vgnam', 'uuid');
+}
+
+sub pvnam { return $_[0]->{pvnam}; }
+sub vgnam { return $_[0]->{vgnam}; }
+sub uuid { return $_[0]->{uuid}; }
+
+sub string {
+ my $self = shift;
+ my $pvnam = $self->pvnam;
+ my $vgnam = $self->vgnam;
+ my $uuid = $self->uuid;
+ my $str = "$pvnam in $vgnam, $uuid";
+ return $str;
+}
+
+1;
--- /dev/null
+#!perl -w
+#
+# Plan -- plan what to put on the initrd image
+# Copyright (C) 2005 Erik van Konijnenburg
+#
+# 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#
+#
+#
+use strict;
+use warnings;
+use Base;
+use FsTab;
+use ActiveBlockDevTab;
+use LvmTab;
+use Hardware;
+use ModDepTab;
+use RaidTab;
+use Image;
+use Blacklist;
+use ActionList;
+
+package Plan;
+
+
+
+#
+# modulesExpand -- given a list of modules, return an ordered
+# list of modules, with blacklisted items deleted,
+# compiled in modules deleted, and any dependencies resolved.
+# A module found by eg PCI matching and dropped because of blacklisting
+# may be added later to resolve a dependency.
+#
+sub modulesExpand ($) {
+ my ($modlist) = (@_);
+
+ my $ml = [];
+ for my $moduleName (@{$modlist}) {
+ if (Blacklist::isBlacklisted ($moduleName)) {
+ next;
+ }
+ push @{$ml}, $moduleName;
+ }
+
+ # resolve drops compiled-in stuff.
+ my $fullModList = ModDepTab::resolve ($ml);
+
+ return $fullModList;
+}
+
+
+
+#
+# addModules -- given an actionList and list of modules,
+# add actions to load them all, unless blacklisted or compiled in.
+#
+sub addModules ($$) {
+ my ($actionList, $modList) = @_;
+
+ my $fullModList = modulesExpand ($modList);
+ for my $moduleName (@{$fullModList}) {
+ my $modDep = ModDepTab::findByModnam ($moduleName);
+ Base::assert (defined ($modDep));
+ $actionList->add ("insmod", $modDep->file);
+ }
+}
+
+
+#
+# addHardware -- given hardware path, potentially undef,
+# add required actions to the action list.
+#
+sub addHardware ($$) {
+ my ($actionList, $hardware) = @_;
+ if (defined ($hardware)) {
+ my $modList = Hardware::moduleList ($hardware);
+ addModules ($actionList, $modList);
+ Base::info ("hardware: completed $hardware");
+ }
+}
+
+
+#
+# addDevicePlan -- given an active block device, add to actionList
+# a sequence to make it into a working device file, suitable for mounting.
+# For eg LVM modules this means loading dm-mod, but also it
+# means recursively making the underlying devices available.
+# There is a possibility of loops here (consider an fstab
+# where /a is a loopback mount of /a/disk.img); we want do
+# detect these loops and produce an error. Also, we want to
+# avoid double work: if five lvm logical volumes use the same
+# underlying raid device, there's not much point in running
+# mdadm five times.
+# There are some contraints on the name of the device file;
+# see yspecial in ActiveBlockDev.
+#
+# actionList - add actions here
+# device - the active block device to be made available.
+# done - list of devices that can be assumed to be available;
+# updated in place.
+# working - list of devices we're working on, excluding path.
+#
+sub addDevicePlan ($$$$);
+sub addDevicePlan ($$$$) {
+ my ($actionList, $device, $done, $working) = @_;
+
+ for my $w (@{$working}) {
+ if ($w eq $device) {
+ Base::fatal ("loop detected: $device\n");
+ }
+ }
+ for my $w (@{$done}) {
+ if ($w eq $device) {
+ return;
+ }
+ }
+
+ my $name = $device->name;
+ my $parent = $device->parent;
+ my $devno = $device->devno;
+ my $hardware = $device->hw;
+ my $yspecial = $device->yspecial;
+
+ if (defined ($parent)) {
+ #
+ # It's a partition. To make it available, do the whole
+ # device, then make a special file for the partition.
+ #
+ addDevicePlan($actionList,$parent,$done,[$device,@{$working}]);
+ my $pname = $parent->name;
+ $actionList->add ("mkbdev", $yspecial,
+ sysname => "$pname/$name");
+ }
+ elsif ($name =~ /^dm-\d+$/) {
+ #
+ # To start an LVM device, make available the underlying
+ # physical volumes, then start the volume group.
+ # creating the block special file is a side effect of
+ # starting the volume group.
+ # The activeBlockDev->yspecial() method is choosen such
+ # that the name returned matches the name of the block special
+ # file generated by vgchange.
+ # Physical volumes are named by the block
+ # special file that gives access to it.
+ #
+ my $lv = LvmTab::findLVByDevno ($devno);
+ if (! defined ($lv)) {
+ Base::fatal ("Can't find LVM info for $name");
+ }
+ my $vgnam = $lv->vgnam;
+ for my $physVol (@{LvmTab::findPVsByVgnam($vgnam)})
+ {
+ my $pdev = ActiveBlockDevTab::findByPath
+ ($physVol->pvnam);
+ addDevicePlan ($actionList, $pdev, $done,
+ [$device,@{$working}]);
+ }
+ addModules ($actionList, [ "dm-mod" ]);
+ $actionList->add ("vgchange", $vgnam);
+ }
+ elsif ($name =~ /^md\d+$/) {
+ #
+ # To start an md raid device, start the underlying hardware,
+ # load raid module, then do mdadm --assemble.
+ #
+ my $rd = RaidTab::findByDevno ($devno);
+ if (! defined ($rd)) {
+ Base::fatal ("Can't find Raid info for $name");
+ }
+ my $components = [];
+ for my $subDiskPath (@{$rd->devices()}) {
+ my $subDisk = ActiveBlockDevTab::findByPath
+ ($subDiskPath);
+ addDevicePlan ($actionList, $subDisk,
+ $done,[$device,@{$working}]);
+ my $subName = $subDisk->yspecial;
+ push @{$components}, {dev => $subName};
+ }
+ addModules ($actionList, [ $rd->level ]);
+
+ my $uuid = $rd->uuid;
+ my ($major, $minor) = ($devno =~ /(\d+):(\d+)/);
+
+ $actionList->add ("mdadm", $yspecial,
+ major => $major,
+ minor => $minor,
+ uuid => $uuid,
+ components => $components,
+ );
+ }
+ elsif ($name =~ /^hd[a-z]$/
+ || $name =~ /^sd[a-z]$/)
+ {
+ # IDE or SCSI.
+ addHardware ($actionList, $hardware);
+ $actionList->add ("mkbdev", $yspecial, sysname => "$name");
+ }
+ elsif ($name =~ /^fd\d+$/) {
+ addModules ($actionList, [ "floppy" ]);
+ $actionList->add ("mkbdev", $yspecial, sysname => "$name");
+ }
+ else {
+ Base::fatal ("unsupported device required: $name");
+ }
+
+ push @{$done}, $device;
+}
+
+
+#
+# addInputPlan -- list of actions to activate console,
+# for now only keyboard, no framebuffer.
+#
+sub addInputPlan ($) {
+ my ($actionList) = @_;
+ for my $input (@{InputTab::all()}) {
+ if (! $input->isKbd()) {
+ next;
+ }
+ addHardware ($actionList, $input->hw);
+ }
+}
+
+
+#
+# makePlan -- return a list of actions to mount root.
+# if rootDevName is defined, use that instead of the
+# device mounted as / in current fstab.
+#
+sub makePlan ($) {
+ my ($rootDevName) = @_;
+ my $actionList = ActionList->new();
+
+ my $root;
+ if (defined ($rootDevName)) {
+ $root = FsTab::findByDevName($rootDevName);
+ if (! defined ($root)) {
+ fatal ("alternate root $rootDevName not in fstab");
+ }
+ }
+ else {
+ $root = FsTab::findByMountPoint('/');
+ if (! defined ($root)) {
+ fatal ("no root in fstab");
+ }
+ }
+
+ $actionList->add ("prologue", "");
+
+ addInputPlan($actionList);
+
+ # swap space is needed for soft suspend,
+ # computed like so, but unused for now.
+ my @swapEntries = ();
+ for my $entry (@{FsTab->all}) {
+ if (! $entry->isRequiredAtBoot()) {
+ next;
+ }
+ if ($entry->type eq "swap") {
+ push @swapEntries, $entry;
+ }
+ }
+
+ my $devicesDone = [];
+ # for swsusp, use ($root, @swapEntries)
+ for my $fsTabEntry ($root) {
+ my $path = $fsTabEntry->blockDevPath();
+ if (! defined ($path)) {
+ my $str = $fsTabEntry->string;
+ Base::fatal ("unsupported block device specification in $str");
+ }
+ my $abd = ActiveBlockDevTab::findByPath($path);
+ if (! defined ($abd)) {
+ my $str = $fsTabEntry->string;
+ Base::fatal ("block device $path for $str unavailable");
+ }
+ addDevicePlan ($actionList, $abd, $devicesDone, []);
+ }
+
+ my $fsType = $root->type;
+ addModules ($actionList, [ $fsType ]);
+
+ my $path = $root->blockDevPath();
+ my $yspecial = ActiveBlockDevTab::findByPath($path)->yspecial();
+ my $opts = $root->opts->cmdLineVersion();
+
+ $actionList->add ("mount", "/mnt",
+ options => $opts,
+ fsType => $fsType,
+ isRoot => 1,
+ device => $yspecial);
+
+ $actionList->add ("postlude", "");
+
+ return $actionList;
+}
+
+
+1;
--- /dev/null
+#!perl -w
+#
+# RaidDev -- the probed values for a raid device, as found by mdadm.
+# Copyright (C) 2005 Erik van Konijnenburg
+#
+# 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#
+use strict;
+use warnings;
+package RaidDev;
+use base 'Obj';
+
+sub fill {
+ my $self = shift;
+ $self->SUPER::fill();
+ $self->takeArgs ('path', 'uuid', 'level', 'devices');
+}
+
+sub path { return $_[0]->{path}; }
+sub uuid { return $_[0]->{uuid}; }
+sub level { return $_[0]->{level}; }
+sub devices { return $_[0]->{devices}; }
+
+sub string {
+ my $self = shift;
+ my $path = $self->path;
+ my $uuid = $self->uuid;
+ my $level = $self->level;
+ my $devices = join (',', @{$self->devices});
+ return "$path($level) = $uuid at $devices";
+}
+
+
+1;
--- /dev/null
+#!perl -w
+#
+# RaidTab -- encapsulate mdadm output
+# Copyright (C) 2005 Erik van Konijnenburg
+#
+# 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#
+# NOTE: The mdadm --detail shows only devices that are running,
+# and does not distinguish between partitionable and non-partitionable
+# devices.
+#
+use strict;
+use warnings;
+use Base;
+use Conf;
+use RaidDev;
+package RaidTab;
+
+
+my $raidTab = undef;
+
+
+sub init () {
+ if (defined ($raidTab)) {
+ return;
+ }
+
+ # my $name = Conf::get('fstab');
+ $raidTab = [];
+ my $in;
+ if (! open ($in, "-|", "/sbin/mdadm --detail --scan")) {
+ Base::fatal ("Can't read mdadm output");
+ }
+ my @lines = <$in>;
+ if (! close ($in)) {
+ Base::fatal ("Could not read mdadm output");
+ }
+ my $buf;
+ for my $line (@lines) {
+ chomp $line;
+ if ($line =~ /^\s+/) {
+ $buf = $buf . $line;
+ }
+ else {
+ if (defined ($buf)) {
+ processLine ($buf);
+ }
+ $buf = $line;
+ }
+ }
+ if (defined ($buf)) {
+ processLine ($buf);
+ }
+}
+
+sub processLine ($) {
+ my ($line) = @_;
+ my @fields = split (/\s+/, $line);
+ if ($fields[0] ne "ARRAY") {
+ Base::fatal ("Expected ARRAY keyword in mdadm output");
+ }
+ my $path = $fields[1];
+ my $uuid;
+ my $level;
+ my $devices;
+ for my $i (2 .. $#fields) {
+ if ($fields[$i] =~ /^uuid=(.+)$/i) {
+ if (defined ($uuid)) {
+ Base::fatal ("duplicate uuid attribute in mdadm output");
+ }
+ $uuid = $1;
+ }
+ elsif ($fields[$i] =~ /^super-minor=(\d+)$/i) {
+ # nothing
+ }
+ elsif ($fields[$i] =~ /^devices=(.+)$/i) {
+ if (defined ($devices)) {
+ Base::fatal ("duplicate devices attribute in mdadm output");
+ }
+ $devices = $1;
+ }
+ elsif ($fields[$i] =~ /^level=(.+)$/i) {
+ if (defined ($level)) {
+ Base::fatal ("duplicate level attribute in mdadm output");
+ }
+ $level = $1;
+ }
+ elsif ($fields[$i] =~ /^num-devices=(\d+)$/i) {
+ # nothing
+ }
+ elsif ($fields[$i] =~ /^spare-group=(.+)$/i) {
+ # nothing
+ }
+ elsif ($fields[$i] =~ /^auto=(.+)$/i) {
+ # nothing
+ }
+ elsif ($fields[$i] =~ /^spares=(\d+)$/i) {
+ # nothing
+ }
+ else {
+ my $pair = $fields[$i];
+ Base::fatal ("Unknown attribute $pair in mdadm output");
+ }
+ }
+ if (! defined($path)) {
+ Base::fatal ("Missing device field in mdadm output");
+ }
+ if (! defined($uuid)) {
+ Base::fatal ("Missing uuid attribute in mdadm output");
+ }
+ if (! defined($level)) {
+ Base::fatal ("Missing level attribute in mdadm output");
+ }
+ if (! defined($devices)) {
+ Base::fatal ("Missing devices attribute in mdadm output");
+ }
+
+ my $descr = RaidDev->new (
+ path => $path,
+ uuid => $uuid,
+ level => $level,
+ devices => [split (/,/, $devices)],
+ );
+ push @{$raidTab}, $descr;
+}
+
+
+sub all () {
+ init;
+ return $raidTab;
+}
+
+sub findByPath ($) {
+ my ($path) = @_;
+ for my $rd (@{all()}) {
+ if ($rd->path() eq $path) {
+ return $rd;
+ }
+ }
+ return undef;
+}
+
+sub findByDevno ($) {
+ my ($devno) = @_;
+ #
+ # NOTE: following does not cover the case where multiple
+ # block special files refer to the same md device.
+ # We need a find function that retrieves all descriptors
+ # matching a devno.
+ #
+ my $bsf = BlockSpecialFileTab::findByDevno ($devno);
+ if (! defined ($bsf)) {
+ return undef;
+ }
+ return findByPath ($bsf->path);
+}
+
+1;
--- /dev/null
+#!perl -w
+#
+# ScsiDev -- the probed values for a SCSI device, as found in /sys.
+# Copyright (C) 2005 Erik van Konijnenburg
+#
+# 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#
+# Like IDE devices, SCSI devices need a protocol driver, based
+# on device type, without hardware probing and matching against
+# a kernel generated table.
+#
+# The type and module knowledge is based in /etc/hotplug/scsi.agent,
+# that attributes scsi/scsi.h.
+#
+use strict;
+use warnings;
+use Base;
+package ScsiDev;
+use base 'Obj';
+
+sub fill {
+ my $self = shift;
+ $self->SUPER::fill();
+ $self->takeArgs ('path');
+ my $path = $self->path;
+ my $name = readlink ("$path/block");
+ if (defined ($name)) {
+ $name = Base::basename ($name);
+ $self->{name} = $name;
+ }
+ else {
+ $self->{name} = undef;
+ }
+ $self->{vendor} = Base::getStringFile ("$path/vendor");
+ $self->{model} = Base::getStringFile ("$path/model");
+
+ my $type = Base::getStringFile ("$path/type");
+ $self->{type} = "disk" if $type eq '0';
+ $self->{type} = "tape" if $type eq '1';
+ $self->{type} = "printer" if $type eq '2';
+ $self->{type} = "processor" if $type eq '3';
+ $self->{type} = "worm" if $type eq '4';
+ $self->{type} = "cdrom" if $type eq '5';
+ $self->{type} = "scanner" if $type eq '6';
+ $self->{type} = "mod" if $type eq '7';
+ $self->{type} = "changer" if $type eq '8';
+ $self->{type} = "comm" if $type eq '9';
+ $self->{type} = "enclosure" if $type eq '14';
+ $self->{type} = "type$type" if (!defined ($self->{type}));
+}
+
+sub path { return $_[0]->{path}; }
+sub name { return $_[0]->{name}; }
+sub vendor { return $_[0]->{vendor}; }
+sub model { return $_[0]->{model}; }
+sub type { return $_[0]->{type}; }
+
+sub string {
+ my $self = shift;
+ my $path = $self->path();
+ my $name = $self->name();
+ my $vendor = $self->vendor();
+ my $model = $self->model();
+ my $type = $self->type();
+ $name = "---" if (! defined ($name));
+ return "$name ($type) = $vendor, $model at $path";
+}
+
+
+#
+# findModuleByScsiDev -- list of required SCSI drivers
+#
+sub findModuleByScsiDev ($) {
+ my ($scsiDev) = @_;
+ my $type = $scsiDev->type();
+ my $driver;
+ $driver = "sd-mod" if $type eq "disk";
+ # "FIXME some tapes use 'osst'"
+ $driver = "st" if $type eq "tape";
+ # if $type eq "printer";
+ # if $type eq "processor";
+ $driver = "sr-mod" if $type eq "worm";
+ $driver = "sr-mod" if $type eq "cdrom";
+ # if $type eq "scanner";
+ $driver = "sd-mod" if $type eq "mod";
+ # if $type eq "changer";
+ # if $type eq "comm";
+ # if $type eq "enclosure";
+ $driver = "sg" if (! defined ($driver));
+ return [ $driver ];
+}
+
+1;
+
+
--- /dev/null
+#!perl -w
+#
+# SharedLibraries -- what shared libraries an object needs.
+# Copyright (C) 2005 Erik van Konijnenburg
+#
+# 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#
+use strict;
+use warnings;
+use Base;
+use Conf;
+package SharedLibraries;
+
+
+#
+# find -- find the shared libraries that are needed by an executable.
+# Try to find libraries with ldd first. That works only with executables
+# linked with glibc, so if ldd finds nothing, we look for traces of klibc.
+#
+sub find ($) {
+ my ($executable) = @_;
+ my $in;
+ my $result = [];
+
+ if ($executable !~ m!^([.\w/-]+)$!) {
+ # taint check.
+ Base::fatal ("odd characters in executable name: $executable");
+ }
+ $executable = $1;
+
+ if (! open ($in, "-|", "/usr/bin/ldd $executable")) {
+ Base::fatal ("can't read ldd for $executable");
+ }
+ while (defined (my $line = <$in>)) {
+ chomp $line;
+ last if ($line =~ /statically linked/);
+ if ($line =~ /not a dynamic executable/) {
+ #
+ # Happens when doing ldd on a shell script
+ # or kernel module (these have x-bit on in FC3,
+ # no idea why they would do that). Ldd exit status
+ # will be non-zero.
+ # Ldd only understands executables compiled with
+ # glibc; try to find use of other libraries.
+ #
+ return findLibr ($executable);
+ }
+ elsif ($line =~ m!.* => (/.+) \(0x[0-9a-fA-F]+\)$!) {
+ #
+ # in ldd 2.3.2 (Debian) output looks like this:
+ # /lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0xb7fea000)
+ #
+ push @{$result}, $1;
+ }
+ elsif ($line =~ m!^\s*(/[^\s]+) \(0x[0-9a-fA-F]+\)$!) {
+ #
+ # But ldd 2.3.3 (FC3) has this:
+ # /lib/ld-linux.so.2 (0x0056f000)
+ #
+ push @{$result}, $1;
+ }
+ elsif ($line =~ m!.* => \(0x[0-9a-fA-F]+\)$!) {
+ #
+ # And eg amd64 also has this:
+ # linux-gate.so.1 => (0x00000000)
+ #
+ # note the double space. This is a section not
+ # loaded from a file but mapped in by the kernel.
+ # The kernel puts some code with proper syscall
+ # linkage here.
+ # See http://lkml.org/lkml/2003/6/18/156
+ #
+ next;
+ }
+ else {
+ Base::fatal ("unexpected ldd output for $executable: $line");
+ }
+ }
+ if (! close ($in)) {
+ Base::fatal ("could not read ldd for $executable");
+ }
+ return $result;
+}
+
+
+#
+# findLibr -- given a filename, return name of dynamic loader.
+# non-ELF files or non-executable ELF files return empty list,
+# corrupt ELF files are fatal error.
+# If there are shared libraries without absolute path,
+# fatal error, since we don't know how the path the library uses
+# to look up the shared library.
+#
+sub findLibr ($) {
+ my ($executable) = @_;
+ my $in;
+ my $result = [];
+ my $auxDir = Conf::get ('auxDir');
+
+ if (! open ($in, "-|", "$auxDir/findlibs -q $executable")) {
+ Base::fatal ("can't run findlibr for $executable");
+ }
+
+ while (defined (my $line = <$in>)) {
+ chomp $line;
+ if ($line =~ /^interpreter: ([\w.\/-]+)$/) {
+ push @{$result}, $1;
+ }
+ elsif ($line =~ /^needed: ([\w.\/-]+)$/) {
+ if (Base::isAbsolute ($1)) {
+ push @{$result}, $1;
+ }
+ else {
+ fatal ("shared library without glibc: $1 in $executable");
+ }
+ }
+ else {
+ bug ("odd output for findlibs");
+ }
+ }
+
+ if (! close ($in)) {
+ Base::fatal ("could not run findlibr for $executable");
+ }
+ return $result;
+}
+
+1;
--- /dev/null
+#!perl -w
+#
+# Test -- test routines, mostly printing hw inventory.
+# Copyright (C) 2005 Erik van Konijnenburg
+#
+# 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#
+#
+#
+use strict;
+use warnings;
+use Base;
+use FsTab;
+use ActiveBlockDevTab;
+use BlockSpecialFileTab;
+use LabeledPartitionTab;
+use LvmTab;
+use Hardware;
+use ModDepTab;
+use RaidTab;
+use InputTab;
+use Image;
+use Plan;
+use KConfig;
+
+package TestSet;
+
+
+sub testGetFsTab () {
+ print "Entries in fstab:\n";
+ for my $entry (@{FsTab->all}) {
+ my $str = $entry->string;
+ my $cmd = $entry->opts->cmdLineVersion;
+ print "\t$str\n";
+ print "\t\t$cmd\n";
+ }
+}
+
+
+sub testActiveBlockDevs () {
+ print "Block devices in /sys:\n";
+ for my $abd (@{ActiveBlockDevTab::all()}) {
+ my $str = $abd->string;
+ print "\t$str\n";
+ }
+}
+
+sub testActiveBlockDevPartitions () {
+ print "Partitions for block devices in /sys:\n";
+ for my $abd (@{ActiveBlockDevTab::all()}) {
+ my $str = $abd->string;
+ my $hp = $abd->hasPartitions() ? "yes" : "no";
+ my $partitions = $abd->partitions();
+ my $partList = '['
+ . join (',', (map {$_->name} @{$partitions})) . ']';
+ print "\t$str\n";
+ print "\t\tpartitioned:\t$hp\n";
+ print "\t\tpartitions:\t$partList\n";
+ }
+}
+
+
+sub testBlockSpecialFiles () {
+ print "Block special files /dev:\n";
+ for my $bsf (@{BlockSpecialFileTab::all()}) {
+ my $str = $bsf->string;
+ print "\t$str\n";
+ }
+}
+
+
+sub testLabeledPartitions () {
+ print "Labeled partitions detected:\n";
+ for my $lp (@{LabeledPartitionTab::all()}) {
+ my $str = $lp->string;
+ print "\t$str\n";
+ }
+}
+
+
+sub testLvm () {
+ print "LVM Logical Volumes:\n";
+ for my $lv (@{LvmTab::allLogicalVolumes()}) {
+ my $str = $lv->string;
+ print "\t$str\n";
+ }
+
+ print "LVM Volume Groups:\n";
+ for my $vg (@{LvmTab::allVolumeGroups()}) {
+ my $str = $vg->string;
+ print "\t$str\n";
+ }
+
+ print "LVM Physical Volumes:\n";
+ for my $pv (@{LvmTab::allPhysicalVolumes()}) {
+ my $str = $pv->string;
+ print "\t$str\n";
+ }
+}
+
+
+sub testHardware () {
+ print "Hardware modules needed for devices in /sys:\n";
+ for my $abd (@{ActiveBlockDevTab::all()}) {
+ my $str = $abd->string;
+ my $hw = $abd->hw;
+ next unless defined ($hw);
+ print "\t$str\n";
+ my $moduleList = Hardware::moduleList ($hw);
+ print "\t\t[" . join(',', @{$moduleList}) . "]\n";
+ }
+}
+
+sub testModDep () {
+ print "Module dependencies:\n";
+ for my $modDep (@{ModDepTab::all()}) {
+ my $str = ModDepTab::findByModnam($modDep)->string;
+ print "\t$str\n";
+ }
+}
+
+sub testModResolve () {
+ print "Hardware modules with resolved dependencies:\n";
+ for my $abd (@{ActiveBlockDevTab::all()}) {
+ my $str = $abd->string;
+ my $hw = $abd->hw;
+ next unless defined ($hw);
+ print "\t$str\n";
+ my $moduleList = Hardware::moduleList ($hw);
+ print "\t\t[" . join(',', @{$moduleList}) . "]\n";
+ my $resolveList = ModDepTab::resolve ($moduleList);
+ print "\t\t[" . join(',', @{$resolveList}) . "]\n";
+ }
+}
+
+sub testRaidDevices () {
+ print "Raid devices:\n";
+ for my $rd (@{RaidTab::all()}) {
+ my $str = $rd->string;
+ print "\t$str\n";
+ }
+}
+
+sub testInput () {
+ print "Input devices:\n";
+ for my $inp (@{InputTab::all()}) {
+ my $str = $inp->string;
+ print "\t$str\n";
+ }
+}
+
+sub testInterpretation () {
+ print "Interpreted Fstab Entries:\n";
+ for my $fse (@{FsTab->all}) {
+ my $fseStr = $fse->string;
+ my $active = $fse->isRequiredAtBoot ? "yes": "no";
+ my $path = $fse->blockDevPath();
+ my $lvmStr = "--";
+ my $devno = "--";
+ my $hardware;
+ my $name = "--";
+ my $modules;
+ my $resolved;
+ if (defined ($path) && -b $path) {
+ $devno = Base::devno ($path);
+ my $lvmFiles = LvmTab::findPVPathsByLVDevno ($devno);
+ if (defined ($lvmFiles)) {
+ $lvmStr = '[' . join (',', @{$lvmFiles}) . ']';
+ }
+
+ my $abd = ActiveBlockDevTab::findByDevno($devno);
+ if (defined ($abd)) {
+ $name = $abd->name();
+ my $parent = $abd->parent();
+ if (defined ($parent)) {
+ $hardware = $parent->hw();
+ }
+ else {
+ $hardware = $abd->hw();
+ }
+ }
+ }
+ if (defined ($hardware)) {
+ my $moduleList = Hardware::moduleList ($hardware);
+ $modules = "[" . join(',', @{$moduleList}) . "]";
+ my $resolveList = ModDepTab::resolve ($moduleList);
+ $resolved = "[" . join(',', @{$resolveList}) . "]";
+ }
+
+ $hardware = "--" unless defined ($hardware);
+ $modules = "--" unless defined ($modules);
+ $resolved = "--" unless defined ($resolved);
+ $path = "--" unless defined ($path);
+ print "\t$fseStr\n";
+ print "\t\tactive:\t$active\n";
+ print "\t\tdevno:\t$devno\n";
+ print "\t\tpath:\t$path\n";
+ print "\t\tname:\t$name\n";
+ print "\t\thw:\t$hardware\n";
+ print "\t\tmods:\t$modules\n";
+ print "\t\tresolv:\t$resolved\n";
+ print "\t\tlvm:\t$lvmStr\n";
+
+ if (defined ($path)) {
+ my $abd = ActiveBlockDevTab::findByPath($path);
+ if (defined ($abd)) {
+ my $list = ActionList->new();
+ Plan::addDevicePlan ($list, $abd, [], []);
+ # the output provided by addDevicePlan
+ # is enough.
+ # print $list->string();
+ }
+ }
+ }
+}
+
+sub testKconfig () {
+ print "Kernel Builtin Modules:\n";
+ for my $module (@{KConfig::allKnownModules()}) {
+ my $builtIn = KConfig::isBuiltIn($module) ? "BUILTIN" : "--";
+ print "\t$module:\t$builtIn\n";
+ }
+}
+
+#
+# testAll -- run various interesting subroutines
+# that may trigger errors.
+#
+sub testAll ()
+{
+ testGetFsTab ();
+ testBlockSpecialFiles ();
+ testLabeledPartitions ();
+ testActiveBlockDevs ();
+ testActiveBlockDevPartitions ();
+ testLvm ();
+ testHardware ();
+ testModDep ();
+ testModResolve ();
+ testRaidDevices();
+ testInterpretation ();
+ testInput ();
+ testKconfig ();
+ Base::bye ();
+}
+
+
+1;
--- /dev/null
+#!perl -w
+#
+# UsbDev -- the probed values for a USB device, as found in /sys.
+# Copyright (C) 2005 Erik van Konijnenburg
+#
+# 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#
+#
+# The information passed to the matcher should correspond to what
+# is passed by hotplug.
+#
+# For devices:
+# vendor, product, bcdDevice = 0, 0, 0
+# deviceClass, subClass, protocol = from /sys
+# interfaceClass, subClass, protocol = 1000,1000,1000
+# For interfaces:
+# vendor, product, bcdDevice = from /sys in parent device
+# deviceClass, subClass, protocol = 1000,1000,1000
+# interfaceClass, subClass, protocol = from /sys
+#
+# Note that somewhere in 2.5, the hotplug events for USB
+# changed: old kernels only had an event for the first interface,
+# with no distinction between interface and device.
+#
+use strict;
+use warnings;
+use Base;
+package UsbDev;
+use base 'Obj';
+
+
+sub fill {
+ my $self = shift;
+ $self->SUPER::fill();
+ $self->takeArgs ('path');
+ my $path = $self->{path};
+ if (-f "$path/bDeviceClass") {
+ $self->{idVendor} = 0;
+ $self->{idProduct} = 0;
+ $self->{bcdDevice} = 0;
+ $self->{bDeviceClass} = Base::getHexFile ("$path/bDeviceClass");
+ $self->{bDeviceSubClass} = Base::getHexFile ("$path/bDeviceSubClass");
+ $self->{bDeviceProtocol} = Base::getHexFile ("$path/bDeviceProtocol");
+ $self->{bInterfaceClass} = 1000;
+ $self->{bInterfaceSubClass} = 1000;
+ $self->{bInterfaceProtocol} = 1000;
+ }
+ elsif (-f "$path/bInterfaceClass") {
+ $self->{idVendor} = Base::getHexFile ("$path/../idVendor");
+ $self->{idProduct} = Base::getHexFile ("$path/../idProduct");
+ $self->{bcdDevice} = Base::getHexFile ("$path/../bcdDevice");
+ $self->{bDeviceClass} = 1000;
+ $self->{bDeviceSubClass} = 1000;
+ $self->{bDeviceProtocol} = 1000;
+ $self->{bInterfaceClass} = Base::getHexFile ("$path/bInterfaceClass");
+ $self->{bInterfaceSubClass} = Base::getHexFile ("$path/bInterfaceSubClass");
+ $self->{bInterfaceProtocol} = Base::getHexFile ("$path/bInterfaceProtocol");
+ }
+ else {
+ Base::fatal "trying to interpret $path as /sys USB devive";
+ }
+}
+
+sub idVendor { return $_[0]->{idVendor}; }
+sub idProduct { return $_[0]->{idProduct}; }
+sub bcdDevice { return $_[0]->{bcdDevice}; }
+sub bDeviceClass { return $_[0]->{bDeviceClass}; }
+sub bDeviceSubClass { return $_[0]->{bDeviceSubClass}; }
+sub bDeviceProtocol { return $_[0]->{bDeviceProtocol}; }
+sub bInterfaceClass { return $_[0]->{bInterfaceClass}; }
+sub bInterfaceSubClass { return $_[0]->{bInterfaceSubClass}; }
+sub bInterfaceProtocol { return $_[0]->{bInterfaceProtocol}; }
+
+
+
+1;
--- /dev/null
+#!perl -w
+#
+# UsbMapEntry -- encapsulate single line from modules.usbmap
+# Copyright (C) 2005 Erik van Konijnenburg
+#
+# 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#
+#
+# Knows how to match, can return module name.
+#
+# The ultimate authority on matching is
+# linux/drivers/usb/core/usb.c:usb_match_id(),
+# the routine where the kernel determines whether to let a particular
+# driver probe an interface. Both the hotplug usb.agent and this
+# script mimic the behaviour of that function.
+# AFAICS, usb_match_id is only invoked on interfaces, not on the devices
+# these interfaces are part of.
+# However, driver/usb/core/hub.c:usb_new_device() invokes device_add()
+# for both the device and (via usb_set_configuration()) for the interfaces;
+# this in turn will produce hotplut events (in the case of interfaces with
+# a callback to usb_hotplug(), which puts product information in the hotplug
+# environment), and the hotplug scripts will do matching for both devices
+# and interfaces. The coldplug script usb.rc emulates this kernel behaviour.
+#
+# Thus, there seems to be a discrepancy between what gets matched in the
+# kernel and what gets matched in hotplug; we follow hotplug behaviour.
+#
+# Note that hotplug uses this matching algorithm not only on the module
+# map provided by the kernel, but also on /etc/hotplug/usb/*.usermap;
+# the latter results not in loading of a module but in execution of a script.
+# This can be used to start gphoto, or it can be used to push firmware
+# to a device. Question: what should mkinitrd know about this?
+#
+use strict;
+use warnings;
+package UsbMapEntry;
+use base 'Obj';
+
+
+sub fill {
+ my $self = shift;
+ $self->SUPER::fill();
+ $self->takeArgs ('module', 'match_flags', 'idVendor',
+ 'idProduct', 'bcdDevice_lo', 'bcdDevice_hi',
+ 'bDeviceClass', 'bDeviceSubClass', 'bDeviceProtocol',
+ 'bInterfaceClass', 'bInterfaceSubClass',
+ 'bInterfaceProtocol', 'driver_info');
+}
+
+sub module { return $_[0]->{module}; }
+sub match_flags { return $_[0]->{match_flags}; }
+sub idVendor { return $_[0]->{idVendor}; }
+sub idProduct { return $_[0]->{idProduct}; }
+sub bcdDevice_lo { return $_[0]->{bcdDevice_lo}; }
+sub bcdDevice_hi { return $_[0]->{bcdDevice_hi}; }
+sub bDeviceClass { return $_[0]->{bDeviceClass}; }
+sub bDeviceSubClass { return $_[0]->{bDeviceSubClass}; }
+sub bDeviceProtocol { return $_[0]->{bDeviceProtocol}; }
+sub bInterfaceClass { return $_[0]->{bInterfaceClass}; }
+sub bInterfaceSubClass { return $_[0]->{bInterfaceSubClass}; }
+sub bInterfaceProtocol { return $_[0]->{bInterfaceProtocol}; }
+sub driver_info { return $_[0]->{driver_info}; }
+
+# we could do the USB_MATCH_XXX processing in init,
+# if it turns out to be time critical.
+my $USB_MATCH_VENDOR = 0x0001;
+my $USB_MATCH_PRODUCT = 0x0002;
+my $USB_MATCH_DEV_LO = 0x0004;
+my $USB_MATCH_DEV_HI = 0x0008;
+my $USB_MATCH_DEV_CLASS = 0x0010;
+my $USB_MATCH_DEV_SUBCLASS = 0x0020;
+my $USB_MATCH_DEV_PROTOCOL = 0x0040;
+my $USB_MATCH_INT_CLASS = 0x0080;
+my $USB_MATCH_INT_SUBCLASS = 0x0100;
+my $USB_MATCH_INT_PROTOCOL = 0x0200;
+
+
+sub matches {
+ my ($self, $dev) = @_;
+ my $match = $self->match_flags;
+
+ if ($match & $USB_MATCH_VENDOR && $self->idVendor != $dev->idVendor) {
+ return 0;
+ }
+ if ($match & $USB_MATCH_PRODUCT && $self->idProduct != $dev->idProduct) {
+ return 0;
+ }
+ if ($match & $USB_MATCH_DEV_LO && $self->bcdDevice_lo > $dev->bcdDevice) {
+ return 0;
+ }
+ if ($match & $USB_MATCH_DEV_HI && $self->bcdDevice_hi < $dev->bcdDevice) {
+ return 0;
+ }
+ if ($match & $USB_MATCH_DEV_CLASS && $self->bDeviceClass != $dev->bDeviceClass) {
+ return 0;
+ }
+ if ($match & $USB_MATCH_DEV_SUBCLASS && $self->bDeviceSubClass != $dev->bDeviceSubClass) {
+ return 0;
+ }
+ if ($match & $USB_MATCH_DEV_PROTOCOL && $self->bDeviceProtocol != $dev->bDeviceProtocol) {
+ return 0;
+ }
+
+ # Quoting usb.agent:
+ # for now, this only checks the first of perhaps
+ # several interfaces for this device.
+ if ($match & $USB_MATCH_INT_CLASS && $self->bInterfaceClass != $dev->bInterfaceClass) {
+ return 0;
+ }
+ if ($match & $USB_MATCH_INT_SUBCLASS && $self->bInterfaceSubClass != $dev->bInterfaceSubClass) {
+ return 0;
+ }
+ if ($match & $USB_MATCH_INT_PROTOCOL && $self->bInterfaceProtocol != $dev->bInterfaceProtocol) {
+ return 0;
+ }
+
+ return 1;
+}
+
+1;
+
--- /dev/null
+#!perl -w
+#
+# UsbTab -- encapsulate modules.usbmap
+# Copyright (C) 2005 Erik van Konijnenburg
+#
+# 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#
+
+use strict;
+use warnings;
+use Base;
+use UsbMapEntry;
+package UsbTab;
+
+my $usbList = undef;
+
+# Parse this:
+# # usb module match_flags idVendor idProduct bcdDevice_lo bcdDevice_hi bDeviceClass bDeviceSubClass bDeviceProtocol bInterfaceClass bInterfaceSubClass bInterfaceProtocol driver_info
+# bfusb 0x0003 0x057c 0x2200 0x0000 0x0000 0x00 0x00 0x00 0x00 0x00 0x00 0x0
+# bcm203x 0x0003 0x0a5c 0x2033 0x0000 0x0000 0x00 0x00 0x00 0x00 0x00 0x00 0x0
+
+sub init () {
+ if (defined ($usbList)) {
+ return;
+ }
+ $usbList = [];
+ my $name = Conf::get('usbMap');
+ if (! open (IN, "<", "$name")) {
+ Base::fatal ("can't open usb module list $name");
+ }
+ while (defined (my $line = <IN>)) {
+ chomp $line;
+ $line =~ s/#.*//;
+ $line =~ s/^\s+//;
+ $line =~ s/\s+$//;
+ next if ($line eq "");
+ my @fields = split (/\s+/, $line, 999);
+ if ($#fields != 12) {
+ Base::fatal ("malformed line in usb module list $name");
+ }
+ push @{$usbList}, UsbMapEntry->new (
+ module => $fields[0],
+ match_flags => hex ($fields[1]),
+ idVendor => hex ($fields[2]),
+ idProduct => hex ($fields[3]),
+ bcdDevice_lo => hex ($fields[4]),
+ bcdDevice_hi => hex ($fields[5]),
+ bDeviceClass => hex ($fields[6]),
+ bDeviceSubClass => hex ($fields[7]),
+ bDeviceProtocol => hex ($fields[8]),
+ bInterfaceClass => hex ($fields[9]),
+ bInterfaceSubClass => hex ($fields[10]),
+ bInterfaceProtocol => hex ($fields[11]),
+ driver_info => hex ($fields[12]),
+ );
+ }
+ if (! close (IN)) {
+ Base::fatal ("could not read usb module list $name");
+ }
+}
+
+sub all () {
+ init;
+ return $usbList;
+}
+
+# given pathname in devices tree, return list of matching modules.
+sub find ($) {
+ my ($dev) = @_;
+ my @result = ();
+ for my $ume (@{UsbTab::all()}) {
+ if ($ume->matches ($dev)) {
+ push @result, $ume->module;
+ }
+ }
+ return [@result];
+}
+
+
+1;
--- /dev/null
+#!perl -w
+#
+# VolumeGroup -- Volume Group Descriptor
+# Copyright (C) 2005 Erik van Konijnenburg
+#
+# 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#
+# vgnam - volume group name
+# uuid - uuid
+#
+use strict;
+use warnings;
+package VolumeGroup;
+use base 'Obj';
+
+sub fill {
+ my $self = shift;
+ $self->SUPER::fill();
+ $self->takeArgs ('vgnam', 'uuid');
+}
+
+sub vgnam { return $_[0]->{vgnam}; }
+sub uuid { return $_[0]->{uuid}; }
+
+sub string {
+ my $self = shift;
+ my $vgnam = $self->vgnam;
+ my $uuid = $self->uuid;
+ my $str = "$vgnam, $uuid";
+ return $str;
+}
+
+1;
--- /dev/null
+#!@PERL@
+#
+# Main -- an exercise in initrd building
+# Copyright (C) 2005 Erik van Konijnenburg
+#
+# 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#
+#
+#
+use strict;
+use warnings;
+use lib '@PERLDIR@';
+
+use Getopt::Long;
+use Plan;
+use TestSet;
+use Pack;
+
+my $appName = "@PACKAGE@";
+my $appVersion = "@VERSION@";
+
+
+#
+# go -- main program:
+# write an image to destination in specified format.
+# destination must not exist yet.
+# root is the blockdev to use as root after reboot, or undef for default.
+#
+sub go ($$$) {
+ my ($format, $destination, $root) = @_;
+ my $masterPlan = Plan::makePlan ($root);
+ my $image = $masterPlan->expand ();
+ Pack::package ($image, $format, $destination);
+}
+
+
+#
+# paranoia -- Random bits of -
+#
+sub paranoia {
+ umask 077;
+
+ #
+ # Perlsec(1) identifies the following as risky:
+ #
+ # delete @ENV{qw(IFS CDPATH ENV BASH_ENV)};
+ #
+ # but just scrapping the complete environment
+ # seems to work nicely.
+ #
+ delete @ENV{keys %ENV};
+ $ENV{'PATH'} = '/bin:/sbin:/usr/bin:/usr/sbin';
+}
+
+
+#
+# usage -- print invocation patterns of the application
+#
+sub usage {
+ print <<"//";
+
+$appName generates initrd images.
+
+$appName --test [ version ]
+ print an overview of system data, without writing anything to disk.
+
+$appName --output dest --format format [ version ]
+ generate an initrd image in 'dest', in the format 'format'.
+
+Options:
+ -h, -?, --help print this help text and exit
+ -V, --version print version and exit (don't bother: $appVersion)
+ -v, --verbose print progress messages
+ -d, --debug detailed output
+ -q, --quiet don't print warning messages
+ -o, --output dest place result here
+ -f, --format form produce the image in this format,
+ valid values: directory, cramfs, cpio
+ -r, --root blockdev let initrd boot another block device as root
+ the blockdev must occur in fstab somewhere.
+ -t, --test print overview of system data,
+ used as basis for debugging.
+
+//
+}
+
+
+#
+# main -- main program, argument processing
+#
+sub main {
+ my ($opt_help, $opt_version,
+ $opt_verbose, $opt_quiet, $opt_debug,
+ $opt_format, $opt_output, $opt_root, $opt_test);
+
+ paranoia ();
+ Base::setProgName ($appName);
+
+ my @warnings = ();
+ {
+ #
+ # catch warnings during getopt, but not elsewhere.
+ # The idea is to let -? produce help without complaint,
+ # even if other args are broken.
+ #
+ local $SIG{__WARN__} = sub { push @warnings, $_[0]; };
+
+ Getopt::Long::Configure ("bundling");
+ my $result = GetOptions (
+ "h|help|?" => \$opt_help,
+ "V|version" => \$opt_version,
+ "v|verbose" => \$opt_verbose,
+ "q|quiet" => \$opt_quiet,
+ "d|debug" => \$opt_debug,
+ "f|format=s" => \$opt_format,
+ "o|output=s" => \$opt_output,
+ "r|root=s" => \$opt_root,
+ "t|test" => \$opt_test,
+ );
+ }
+
+ #
+ # --help and --version processed without regard to other options,
+ # exit without side effect.
+ #
+ if (defined ($opt_help)) {
+ usage ();
+ Base::bye();
+ }
+ if (defined ($opt_version)) {
+ Base::setVerbose (1);
+ Base::info ("version $appVersion");
+ Base::bye();
+ }
+
+ #
+ # Argument validation
+ #
+ for my $w (@warnings) {
+ # lazy: perhaps we could provide more info here?
+ Base::fatal ("$w");
+ }
+ if (defined ($opt_output) && defined ($opt_test)) {
+ Base::fatal "conflicting options --output and --test";
+ }
+ if (! defined ($opt_output) && ! defined ($opt_test)) {
+ Base::fatal "one of --output and --test must be given";
+ }
+ if (defined ($opt_output)) {
+ if (-e $opt_output) {
+ Base::fatal "destination $opt_output already exists";
+ }
+ if (! defined ($opt_format)) {
+ Base::fatal "option --output requires --format option";
+ }
+ if (! Pack::knownFormat ($opt_format)) {
+ Base::fatal "unknown --format argument: $opt_format";
+ }
+
+ #
+ # Untaint -- is there a need for 'output' with an umlaut?
+ #
+ if ($opt_output !~ m!^([-_./[a-zA-Z0-9]+)$!) {
+ Base::fatal ("illegal character in output file name");
+ }
+ $opt_output = $1;
+
+ if (defined ($opt_root)) {
+ # Untaint
+ if ($opt_root !~ m!^([-_./[a-zA-Z0-9]+)$!) {
+ Base::fatal ("illegal character in root device name");
+ }
+ $opt_root = $1;
+ }
+ }
+ if (defined ($opt_test)) {
+ if (defined ($opt_format)) {
+ Base::fatal "conflicting options --test and --format";
+ }
+ if (defined ($opt_root)) {
+ Base::fatal "conflicting options --test and --root";
+ }
+ }
+ if ($#ARGV > 0) {
+ my $valid = $ARGV[0];
+ Base::fatal "extra arguments after $valid";
+ }
+
+ #
+ # All arguments validated; start processing.
+ #
+ if ($#ARGV == 0) {
+ Conf::set ("version", $ARGV[0]);
+ }
+ if ($opt_verbose) {
+ Base::setVerbose (1);
+ }
+ if ($opt_debug) {
+ Base::setDebug (1);
+ }
+ if ($opt_quiet) {
+ Base::setQuiet (1);
+ }
+
+ # avoid silly messages with an early test
+ my $v = Conf::get("version");
+ my $mdir = Conf::get("libModules") . "/$v";
+ if (! -d $mdir) {
+ Base::fatal ("unknown kernel version: $v");
+ }
+
+ # go for it.
+ if (defined ($opt_test)) {
+ TestSet::testAll();
+ }
+ elsif (defined ($opt_output)) {
+ go ($opt_format, $opt_output, $opt_root);
+ }
+ Base::bye;
+}
+
+main ();
--- /dev/null
+#!/usr/bin/perl
+#
+# Main -- an exercise in initrd building
+# Copyright (C) 2005 Erik van Konijnenburg
+#
+# 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#
+#
+#
+use strict;
+use warnings;
+use lib '/usr/local/lib/yaird/perl';
+
+use Getopt::Long;
+use Plan;
+use TestSet;
+use Pack;
+
+my $appName = "yaird";
+my $appVersion = "0.0.5";
+
+
+#
+# go -- main program:
+# write an image to destination in specified format.
+# destination must not exist yet.
+# root is the blockdev to use as root after reboot, or undef for default.
+#
+sub go ($$$) {
+ my ($format, $destination, $root) = @_;
+ my $masterPlan = Plan::makePlan ($root);
+ my $image = $masterPlan->expand ();
+ Pack::package ($image, $format, $destination);
+}
+
+
+#
+# paranoia -- Random bits of -
+#
+sub paranoia {
+ umask 077;
+
+ #
+ # Perlsec(1) identifies the following as risky:
+ #
+ # delete @ENV{qw(IFS CDPATH ENV BASH_ENV)};
+ #
+ # but just scrapping the complete environment
+ # seems to work nicely.
+ #
+ delete @ENV{keys %ENV};
+ $ENV{'PATH'} = '/bin:/sbin:/usr/bin:/usr/sbin';
+}
+
+
+#
+# usage -- print invocation patterns of the application
+#
+sub usage {
+ print <<"//";
+
+$appName generates initrd images.
+
+$appName --test [ version ]
+ print an overview of system data, without writing anything to disk.
+
+$appName --output dest --format format [ version ]
+ generate an initrd image in 'dest', in the format 'format'.
+
+Options:
+ -h, -?, --help print this help text and exit
+ -V, --version print version and exit (don't bother: $appVersion)
+ -v, --verbose print progress messages
+ -d, --debug detailed output
+ -q, --quiet don't print warning messages
+ -o, --output dest place result here
+ -f, --format form produce the image in this format,
+ valid values: directory, cramfs, cpio
+ -r, --root blockdev let initrd boot another block device as root
+ the blockdev must occur in fstab somewhere.
+ -t, --test print overview of system data,
+ used as basis for debugging.
+
+//
+}
+
+
+#
+# main -- main program, argument processing
+#
+sub main {
+ my ($opt_help, $opt_version,
+ $opt_verbose, $opt_quiet, $opt_debug,
+ $opt_format, $opt_output, $opt_root, $opt_test);
+
+ paranoia ();
+ Base::setProgName ($appName);
+
+ my @warnings = ();
+ {
+ #
+ # catch warnings during getopt, but not elsewhere.
+ # The idea is to let -? produce help without complaint,
+ # even if other args are broken.
+ #
+ local $SIG{__WARN__} = sub { push @warnings, $_[0]; };
+
+ Getopt::Long::Configure ("bundling");
+ my $result = GetOptions (
+ "h|help|?" => \$opt_help,
+ "V|version" => \$opt_version,
+ "v|verbose" => \$opt_verbose,
+ "q|quiet" => \$opt_quiet,
+ "d|debug" => \$opt_debug,
+ "f|format=s" => \$opt_format,
+ "o|output=s" => \$opt_output,
+ "r|root=s" => \$opt_root,
+ "t|test" => \$opt_test,
+ );
+ }
+
+ #
+ # --help and --version processed without regard to other options,
+ # exit without side effect.
+ #
+ if (defined ($opt_help)) {
+ usage ();
+ Base::bye();
+ }
+ if (defined ($opt_version)) {
+ Base::setVerbose (1);
+ Base::info ("version $appVersion");
+ Base::bye();
+ }
+
+ #
+ # Argument validation
+ #
+ for my $w (@warnings) {
+ # lazy: perhaps we could provide more info here?
+ Base::fatal ("$w");
+ }
+ if (defined ($opt_output) && defined ($opt_test)) {
+ Base::fatal "conflicting options --output and --test";
+ }
+ if (! defined ($opt_output) && ! defined ($opt_test)) {
+ Base::fatal "one of --output and --test must be given";
+ }
+ if (defined ($opt_output)) {
+ if (-e $opt_output) {
+ Base::fatal "destination $opt_output already exists";
+ }
+ if (! defined ($opt_format)) {
+ Base::fatal "option --output requires --format option";
+ }
+ if (! Pack::knownFormat ($opt_format)) {
+ Base::fatal "unknown --format argument: $opt_format";
+ }
+
+ #
+ # Untaint -- is there a need for 'output' with an umlaut?
+ #
+ if ($opt_output !~ m!^([-_./[a-zA-Z0-9]+)$!) {
+ Base::fatal ("illegal character in output file name");
+ }
+ $opt_output = $1;
+
+ if (defined ($opt_root)) {
+ # Untaint
+ if ($opt_root !~ m!^([-_./[a-zA-Z0-9]+)$!) {
+ Base::fatal ("illegal character in root device name");
+ }
+ $opt_root = $1;
+ }
+ }
+ if (defined ($opt_test)) {
+ if (defined ($opt_format)) {
+ Base::fatal "conflicting options --test and --format";
+ }
+ if (defined ($opt_root)) {
+ Base::fatal "conflicting options --test and --root";
+ }
+ }
+ if ($#ARGV > 0) {
+ my $valid = $ARGV[0];
+ Base::fatal "extra arguments after $valid";
+ }
+
+ #
+ # All arguments validated; start processing.
+ #
+ if ($#ARGV == 0) {
+ Conf::set ("version", $ARGV[0]);
+ }
+ if ($opt_verbose) {
+ Base::setVerbose (1);
+ }
+ if ($opt_debug) {
+ Base::setDebug (1);
+ }
+ if ($opt_quiet) {
+ Base::setQuiet (1);
+ }
+
+ # avoid silly messages with an early test
+ my $v = Conf::get("version");
+ my $mdir = Conf::get("libModules") . "/$v";
+ if (! -d $mdir) {
+ Base::fatal ("unknown kernel version: $v");
+ }
+
+ # go for it.
+ if (defined ($opt_test)) {
+ TestSet::testAll();
+ }
+ elsif (defined ($opt_output)) {
+ go ($opt_format, $opt_output, $opt_root);
+ }
+ Base::bye;
+}
+
+main ();
--- /dev/null
+#!/usr/bin/perl
+#
+# Template -- for translation general intentions to exact initrd layout
+# Copyright (C) 2005 Erik van Konijnenburg
+#
+# 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#
+# These templates define the translation from general intentions in the
+# plan to exact lists of files and script fragments to be included
+# on the initrd image. Templates are indexed by an action name, and include:
+# - files to be copied from current system to initrd;
+# often executables.
+# - directories to be created
+# - fragments to be appended to scripts on the image,
+# these are in a hash from script name to script content.
+#
+# Everything is processed by HTML::Template before being added to the
+# image: script fragments, but also file names and script names.
+# Leading spaces are dropped from template lines.
+#
+# If you want to implement busybox support, this is the place to do it.
+#
+# Obviously, the template names and the attributes used in the template
+# should match what is provided by the planner.
+#
+#
+
+use strict;
+package Template;
+
+
+my $templates = {
+ prologue => {
+ # In principle, we don't want device files on the initrd
+ # image: device numbers can change between kernels.
+ # Instead, create device files at boot time based on info
+ # in sysfs. However, /dev/null and /dev/console are needed
+ # to mount sysfs.
+ files => [
+ '/dev/null',
+ '/dev/console',
+ '/bin/dash',
+ '/bin/cat',
+ '/bin/mkdir',
+ '/bin/mount',
+ '/bin/umount',
+ '/bin/mknod',
+ '/bin/sleep',
+ ],
+ directories => [
+ '/mnt', '/proc', '/sys', '/dev', '/etc', '/var',
+ ],
+ trees => [],
+ scripts => {
+ '/init' => <<'//',
+ #!/bin/dash
+ #
+ # Generator version: yaird <TMPL_VAR NAME=appVersion>.
+ #
+ set -x
+ #
+ # Utility functions
+ #
+ mksymdev () {
+ devfile="$1"
+ sysfile="$2"
+ cb="$3"
+ devpair=$(/bin/cat "$sysfile")
+ for delay in 1 2 4 8 16
+ do
+ if [ "$devpair" = "" ]
+ then
+ echo "Waiting $delay seconds for $sysfile to show up"
+ sleep $delay
+ fi
+ devpair=$(/bin/cat "$sysfile")
+ done
+
+ if [ "$devpair" = "" ]
+ then
+ echo "Device $sysfile seems to be down."
+ echo "Debugging opportunity, type ^D to continue."
+ /bin/dash
+ fi
+
+ maj=${devpair%:*}
+ min=${devpair#*:}
+ /bin/mknod "$devfile" $cb $maj $min
+ }
+ mkcdev () {
+ mksymdev "$1" "/sys/class/$2/dev" c
+ }
+ mkbdev () {
+ mksymdev "$1" "/sys/block/$2/dev" b
+ }
+
+
+ #
+ # Setting up mounts
+ #
+ mount -nt sysfs sysfs /sys
+ mount -nt proc proc /proc
+ # In Fedora FC3, tmpfs *must* have the name
+ # 'none', otherwise start_udev, called from
+ # rc.sysinit will mount a new tmpfs over it,
+ # and you loose access to nodes such as
+ # /dev/vg0/root, expected to be created by
+ # LVM in initramfs.
+ mount -nt tmpfs none /dev
+
+ #
+ #
+ # Command line processing
+ # init - first proc to start on next root
+ # root - to be done: how should it relate
+ # to file system selection?
+ # ro,rw - mount root read-only or read-write.
+ # This is like a mount -r; it overrules
+ # a -o rw.
+ # noresume, resume - to be done
+ # ide - options for module ide_core.
+ # need a way to append these to proper
+ # module. do a check on module name
+ # in insmod template?
+ #
+ ro=-r
+ init=/sbin/init
+ for i in $(cat /proc/cmdline)
+ do
+ case "$i" in
+ init=*)
+ init=${i#init=}
+ ;;
+ ro)
+ ro=-r
+ ;;
+ rw)
+ ro=
+ esac
+ done
+//
+ },
+ },
+
+ insmod => {
+ files => [
+ '<TMPL_VAR NAME=target>',
+ '/sbin/insmod',
+ ],
+ directories => [],
+ trees => [],
+ scripts => {
+ '/init' => <<'//',
+ /sbin/insmod '<TMPL_VAR NAME=target>'
+//
+ },
+
+ },
+
+ mkbdev => {
+ files => [],
+ directories => [],
+ trees => [],
+ scripts => {
+ '/init' => <<'//',
+ mkbdev '<TMPL_VAR NAME=target>' '<TMPL_VAR NAME=sysname>'
+//
+ },
+ },
+
+ vgchange => {
+ files => [
+ '/lib/lvm-200/vgchange',
+ '/sbin/vgchange',
+ ],
+ directories => [],
+ trees => [],
+ scripts => {
+ # We cannot make mapper/control any earlier,
+ # since dm-mod needs to be loaded to be able
+ # to determine devno.
+ '/init' => <<'//',
+ if [ ! -c /dev/mapper/control ]
+ then
+ /bin/mkdir /dev/mapper
+ mkcdev /dev/mapper/control misc/device-mapper
+ fi
+ /bin/mount -nt tmpfs tmpfs /etc
+ /bin/mount -nt tmpfs tmpfs /var
+ /sbin/vgchange -a y '<TMPL_VAR NAME=target>'
+ /bin/umount -n /var
+ /bin/umount -n /etc
+//
+ },
+ },
+
+ mdadm => {
+ files => [
+ '/sbin/mdadm',
+ ],
+ directories => [],
+ trees => [],
+ scripts => {
+ #
+ # NOTE: mdadm can operate without knowledge
+ # of device numbers; it will assign an unused
+ # one to the new device. Thus you could have
+ # device name /dev/md/boot that is stable,
+ # regardless of which other raid devices are
+ # operational. However, debian installer
+ # consistently uses device names like /dev/md0,
+ # where the name depends on earlier minors
+ # that happen to have been assigned.
+ # To work around this problem, we forego
+ # the --auto option, and mknod the device
+ # before putting an md under it. Better hope
+ # the major number is not going to change ...
+ #
+ '/init' => <<'//',
+ mknod <TMPL_VAR NAME=target> b <TMPL_VAR NAME=major> <TMPL_VAR NAME=minor>
+ mdadm --assemble <TMPL_VAR NAME=target> --uuid <TMPL_VAR NAME=uuid> \
+ <TMPL_LOOP NAME=components> <TMPL_VAR NAME=dev></TMPL_LOOP>
+//
+ }
+ },
+
+ mount => {
+ files => [],
+ directories => [],
+ trees => [],
+ scripts => {
+ #
+ # NOTE: honouring the kernel cmdline option ro,rw
+ # is very nice, but... If you have an ext3 in a
+ # file loopback-mounted from vfat, it's unlikely
+ # that a remount rw of root will also make the
+ # underlying vfat read-write. Underlying filesystems
+ # should ignore the kernel ro/rw option; we
+ # have an attribute isRoot that's defined iff
+ # this is the real root.
+ #
+ # always -n, since we dont have writable /etc/mtab.
+ #
+ '/init' => <<'//',
+ mount -n \
+ <TMPL_IF NAME=isRoot>$ro</TMPL_IF> \
+ -t <TMPL_VAR NAME=fsType> \
+ <TMPL_VAR NAME=options> \
+ <TMPL_VAR NAME=device> \
+ <TMPL_VAR NAME=target>
+//
+ }
+ },
+
+ postlude => {
+ files => [
+ '<TMPL_VAR NAME=auxDir>/run_init',
+ ],
+ directories => [],
+ trees => [],
+ scripts => {
+ #
+ # Do *not* do a pivot_root here. We're
+ # working from rootfs; a pivotroot would
+ # make that end up in /initrd, which gets
+ # unmounted by rc.sysinit, and without rootfs,
+ # too much is broken to even do a panic.
+ #
+ # Instead use run_init from klibc, which uses
+ # a magical combination of mount --move /mnt /,
+ # chdir and chroot.
+ #
+
+ '/init' => <<'//',
+ echo "Debugging opportunity, ^D to continue."
+ /bin/dash
+
+ echo "Switching root ..."
+ /bin/umount -n /sys
+ /bin/umount -n /proc
+ exec <TMPL_VAR NAME=auxDir>/run_init \
+ /mnt $init "$@"
+//
+ }
+ },
+};
+
+sub template ($) { return $templates->{$_[0]}; }
+
+
+1;
--- /dev/null
+#!/usr/bin/perl
+#
+# Template -- for translation general intentions to exact initrd layout
+# Copyright (C) 2005 Erik van Konijnenburg
+#
+# 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#
+# These templates define the translation from general intentions in the
+# plan to exact lists of files and script fragments to be included
+# on the initrd image. Templates are indexed by an action name, and include:
+# - files to be copied from current system to initrd;
+# often executables.
+# - directories to be created
+# - fragments to be appended to scripts on the image,
+# these are in a hash from script name to script content.
+#
+# Everything is processed by HTML::Template before being added to the
+# image: script fragments, but also file names and script names.
+# Leading spaces are dropped from template lines.
+#
+# If you want to implement busybox support, this is the place to do it.
+#
+# Obviously, the template names and the attributes used in the template
+# should match what is provided by the planner.
+#
+#
+
+use strict;
+package Template;
+
+
+my $templates = {
+ prologue => {
+ # In principle, we don't want device files on the initrd
+ # image: device numbers can change between kernels.
+ # Instead, create device files at boot time based on info
+ # in sysfs. However, /dev/null and /dev/console are needed
+ # to mount sysfs.
+ files => [
+ '/dev/null',
+ '/dev/console',
+ '/bin/ash',
+ '/bin/cat',
+ '/bin/mkdir',
+ '/bin/mount',
+ '/bin/umount',
+ '/bin/mknod',
+ '/bin/sleep',
+ ],
+ directories => [
+ '/mnt', '/proc', '/sys', '/dev', '/etc', '/var',
+ ],
+ trees => [],
+ scripts => {
+ '/init' => <<'//',
+ #!/bin/ash
+
+ # Generator version: yaird <TMPL_VAR NAME=appVersion>.
+ #
+ set -x
+ #
+ # Utility functions
+ #
+ mksymdev () {
+ devfile="$1"
+ sysfile="$2"
+ cb="$3"
+ devpair=$(/bin/cat "$sysfile")
+ for delay in 1 2 4 8 16
+ do
+ if [ "$devpair" = "" ]
+ then
+ echo "Waiting $delay seconds for $sysfile to show up"
+ sleep $delay
+ fi
+ devpair=$(/bin/cat "$sysfile")
+ done
+
+ if [ "$devpair" = "" ]
+ then
+ echo "Device $sysfile seems to be down."
+ echo "Debugging opportunity, type ^D to continue."
+ /bin/dash
+ fi
+
+ maj=${devpair%:*}
+ min=${devpair#*:}
+ /bin/mknod "$devfile" $cb $maj $min
+ }
+ mkcdev () {
+ mksymdev "$1" "/sys/class/$2/dev" c
+ }
+ mkbdev () {
+ mksymdev "$1" "/sys/block/$2/dev" b
+ }
+
+
+ #
+ # Setting up mounts
+ #
+ mount -nt sysfs sysfs /sys
+ mount -nt proc proc /proc
+ # In Fedora FC3, tmpfs *must* have the name
+ # 'none', otherwise start_udev, called from
+ # rc.sysinit will mount a new tmpfs over it,
+ # and you loose access to nodes such as
+ # /dev/vg0/root, expected to be created by
+ # LVM in initramfs.
+ mount -nt tmpfs none /dev
+
+ #
+ #
+ # Command line processing
+ # init - first proc to start on next root
+ # root - to be done: how should it relate
+ # to file system selection?
+ # ro,rw - mount root read-only or read-write.
+ # This is like a mount -r; it overrules
+ # a -o rw.
+ # noresume, resume - to be done
+ # ide - options for module ide_core.
+ # need a way to append these to proper
+ # module. do a check on module name
+ # in insmod template?
+ #
+ ro=-r
+ init=/sbin/init
+ for i in $(cat /proc/cmdline)
+ do
+ case "$i" in
+ init=*)
+ init=${i#init=}
+ ;;
+ ro)
+ ro=-r
+ ;;
+ rw)
+ ro=
+ esac
+ done
+//
+ },
+ },
+
+ insmod => {
+ files => [
+ '<TMPL_VAR NAME=target>',
+ '/sbin/insmod',
+ ],
+ directories => [],
+ trees => [],
+ scripts => {
+ '/init' => <<'//',
+ /sbin/insmod '<TMPL_VAR NAME=target>'
+//
+ },
+
+ },
+
+ mkbdev => {
+ files => [],
+ directories => [],
+ trees => [],
+ scripts => {
+ '/init' => <<'//',
+ mkbdev '<TMPL_VAR NAME=target>' '<TMPL_VAR NAME=sysname>'
+//
+ },
+ },
+
+ vgchange => {
+ #
+ # Use static version. Note that fedora starts with
+ # empty /dev, so we must make device nodes explicitly.
+ #
+ files => [
+ '/sbin/lvm',
+ ],
+ directories => [],
+ trees => [],
+ scripts => {
+ # We cannot make mapper/control any earlier,
+ # since dm-mod needs to be loaded to be able
+ # to determine devno.
+ '/init' => <<'//',
+ if [ ! -c /dev/mapper/control ]
+ then
+ /bin/mkdir /dev/mapper
+ mkcdev /dev/mapper/control misc/device-mapper
+ fi
+ /bin/mount -nt tmpfs tmpfs /etc
+ /bin/mount -nt tmpfs tmpfs /var
+ /sbin/lvm vgchange -a y '<TMPL_VAR NAME=target>'
+ /sbin/lvm vgmknodes
+ /bin/umount -n /var
+ /bin/umount -n /etc
+//
+ },
+ },
+
+ mdadm => {
+ files => [
+ '/sbin/mdadm',
+ ],
+ directories => [],
+ trees => [],
+ scripts => {
+ #
+ # NOTE: mdadm can operate without knowledge
+ # of device numbers; it will assign an unused
+ # one to the new device. Thus you could have
+ # device name /dev/md/boot that is stable,
+ # regardless of which other raid devices are
+ # operational. However, debian installer
+ # consistently uses device names like /dev/md0,
+ # where the name depends on earlier minors
+ # that happen to have been assigned.
+ # To work around this problem, we forego
+ # the --auto option, and mknod the device
+ # before putting an md under it. Better hope
+ # the major number is not going to change ...
+ #
+ '/init' => <<'//',
+ mknod <TMPL_VAR NAME=target> b <TMPL_VAR NAME=major> <TMPL_VAR NAME=minor>
+ mdadm --assemble <TMPL_VAR NAME=target> --uuid <TMPL_VAR NAME=uuid> \
+ <TMPL_LOOP NAME=components> <TMPL_VAR NAME=dev></TMPL_LOOP>
+//
+ }
+ },
+
+ mount => {
+ files => [],
+ directories => [],
+ trees => [],
+ scripts => {
+ #
+ # NOTE: honouring the kernel cmdline option ro,rw
+ # is very nice, but... If you have an ext3 in a
+ # file loopback-mounted from vfat, it's unlikely
+ # that a remount rw of root will also make the
+ # underlying vfat read-write. Underlying filesystems
+ # should ignore the kernel ro/rw option; we
+ # have an attribute isRoot that's defined iff
+ # this is the real root.
+ #
+ # always -n, since we dont have writable /etc/mtab.
+ #
+ '/init' => <<'//',
+ mount -n \
+ <TMPL_IF NAME=isRoot>$ro</TMPL_IF> \
+ -t <TMPL_VAR NAME=fsType> \
+ <TMPL_VAR NAME=options> \
+ <TMPL_VAR NAME=device> \
+ <TMPL_VAR NAME=target>
+//
+ }
+ },
+
+ postlude => {
+ files => [
+ '<TMPL_VAR NAME=auxDir>/run_init',
+ ],
+ directories => [],
+ trees => [],
+ scripts => {
+ #
+ # fedora does not come with populated /dev
+ # on root and needs at least /dev/console.
+ # Pass them via tmpfs.
+ #
+ # Do *not* do a pivot_root here. We're
+ # working from rootfs; a pivotroot would
+ # make that end up in /initrd, which gets
+ # unmounted by rc.sysinit, and without rootfs,
+ # too much is broken to even do a panic.
+ #
+ # Instead use run_init from klibc, which uses
+ # a magical combination of mount --move /mnt /,
+ # chdir and chroot.
+ #
+
+ '/init' => <<'//',
+ echo "Debugging opportunity, ^D to continue."
+ /bin/ash
+
+ echo "Switching root ..."
+ cd /mnt
+ mkcdev /dev/null mem/null
+ mkcdev /dev/zero mem/zero
+ mkcdev /dev/console tty/console
+ mkdir /dev/pts
+ mkdir /dev/shm
+ mount -n -t tmpfs --bind /dev /mnt/dev
+ /bin/umount -n /sys
+ /bin/umount -n /proc
+ exec <TMPL_VAR NAME=auxDir>/run_init \
+ /mnt $init "$@"
+//
+ }
+ },
+};
+
+sub template ($) { return $templates->{$_[0]}; }
+
+
+1;
--- /dev/null
+# Makefile.in generated by automake 1.9.5 from Makefile.am.
+# templates/Makefile. Generated from Makefile.in by configure.
+
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004, 2005 Free Software Foundation, Inc.
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+
+
+#
+# Makefile.incl -- shared defines between makefiles
+# Copyright (C) 2005 Erik van Konijnenburg
+#
+# 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#
+# - auxdir contains package specific executables that may be included
+# in the generated image
+# - perldir contains perl modules to be included by the main program
+#
+# This cannot be simply passed from the master makefile; that would
+# be invisible to automake.
+
+srcdir = .
+top_srcdir = ..
+
+pkgdatadir = $(datadir)/yaird
+pkglibdir = $(libdir)/yaird
+pkgincludedir = $(includedir)/yaird
+top_builddir = ..
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+INSTALL = /usr/bin/install -c
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+DIST_COMMON = $(srcdir)/../Makefile.incl $(srcdir)/Makefile.am \
+ $(srcdir)/Makefile.in
+subdir = templates
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/configure.in
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+ $(ACLOCAL_M4)
+mkinstalldirs = $(install_sh) -d
+CONFIG_HEADER = $(top_builddir)/include/config.h
+CONFIG_CLEAN_FILES =
+SOURCES =
+DIST_SOURCES =
+am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
+am__vpath_adj = case $$p in \
+ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
+ *) f=$$p;; \
+ esac;
+am__strip_dir = `echo $$p | sed -e 's|^.*/||'`;
+am__installdirs = "$(DESTDIR)$(perldir)"
+nodist_perlDATA_INSTALL = $(INSTALL_DATA)
+DATA = $(nodist_perl_DATA)
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = ${SHELL} /home/kern/bacula/k/rescue/linux/cdrom/yaird-0.0.5/missing --run aclocal-1.9
+AMDEP_FALSE = #
+AMDEP_TRUE =
+AMTAR = ${SHELL} /home/kern/bacula/k/rescue/linux/cdrom/yaird-0.0.5/missing --run tar
+AUTOCONF = ${SHELL} /home/kern/bacula/k/rescue/linux/cdrom/yaird-0.0.5/missing --run autoconf
+AUTOHEADER = ${SHELL} /home/kern/bacula/k/rescue/linux/cdrom/yaird-0.0.5/missing --run autoheader
+AUTOMAKE = ${SHELL} /home/kern/bacula/k/rescue/linux/cdrom/yaird-0.0.5/missing --run automake-1.9
+AWK = gawk
+CC = gcc
+CCDEPMODE = depmode=gcc3
+CFLAGS = -g -O2
+CPPFLAGS =
+CYGPATH_W = echo
+DEFS = -DHAVE_CONFIG_H
+DEPDIR = .deps
+ECHO_C =
+ECHO_N = -n
+ECHO_T =
+EXEEXT =
+INITRD_TEMPLATE = Fedora
+INSTALL_DATA = ${INSTALL} -m 644
+INSTALL_PROGRAM = ${INSTALL}
+INSTALL_SCRIPT = ${INSTALL}
+INSTALL_STRIP_PROGRAM = ${SHELL} $(install_sh) -c -s
+LDFLAGS =
+LIBOBJS =
+LIBS =
+LTLIBOBJS =
+MAKEINFO = ${SHELL} /home/kern/bacula/k/rescue/linux/cdrom/yaird-0.0.5/missing --run makeinfo
+OBJEXT = o
+PACKAGE = yaird
+PACKAGE_BUGREPORT =
+PACKAGE_NAME =
+PACKAGE_STRING =
+PACKAGE_TARNAME =
+PACKAGE_VERSION =
+PATH_SEPARATOR = :
+PERL = /usr/bin/perl
+SET_MAKE =
+SHELL = /bin/sh
+STRIP =
+VERSION = 0.0.5
+XMLTO = /usr/bin/xmlto
+ac_ct_CC = gcc
+ac_ct_STRIP =
+am__fastdepCC_FALSE = #
+am__fastdepCC_TRUE =
+am__include = include
+am__leading_dot = .
+am__quote =
+am__tar = ${AMTAR} chof - "$$tardir"
+am__untar = ${AMTAR} xf -
+bindir = ${exec_prefix}/bin
+build_alias =
+datadir = ${prefix}/share
+exec_prefix = ${prefix}
+host_alias =
+includedir = ${prefix}/include
+infodir = ${prefix}/info
+install_sh = /home/kern/bacula/k/rescue/linux/cdrom/yaird-0.0.5/install-sh
+libdir = ${exec_prefix}/lib
+libexecdir = ${exec_prefix}/libexec
+localstatedir = ${prefix}/var
+mandir = ${prefix}/man
+mkdir_p = mkdir -p --
+oldincludedir = /usr/include
+prefix = /usr/local
+program_transform_name = s,x,x,
+sbindir = ${exec_prefix}/sbin
+sharedstatedir = ${prefix}/com
+sysconfdir = ${prefix}/etc
+target_alias =
+auxdir = $(pkglibdir)/exec
+perldir = $(pkglibdir)/perl
+
+#
+# Makefile.am -- installation and packaging instructions
+#
+CLEANFILES = $(nodist_perl_DATA)
+nodist_perl_DATA = \
+ Template.pm
+
+
+# not compiled, but must go in the tarball.
+EXTRA_DIST = \
+ Fedora.pm \
+ Debian.pm
+
+all: all-am
+
+.SUFFIXES:
+$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(srcdir)/../Makefile.incl $(am__configure_deps)
+ @for dep in $?; do \
+ case '$(am__configure_deps)' in \
+ *$$dep*) \
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \
+ && exit 0; \
+ exit 1;; \
+ esac; \
+ done; \
+ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu templates/Makefile'; \
+ cd $(top_srcdir) && \
+ $(AUTOMAKE) --gnu templates/Makefile
+.PRECIOUS: Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+ @case '$?' in \
+ *config.status*) \
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+ *) \
+ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
+ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+ esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure: $(am__configure_deps)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4): $(am__aclocal_m4_deps)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+uninstall-info-am:
+install-nodist_perlDATA: $(nodist_perl_DATA)
+ @$(NORMAL_INSTALL)
+ test -z "$(perldir)" || $(mkdir_p) "$(DESTDIR)$(perldir)"
+ @list='$(nodist_perl_DATA)'; for p in $$list; do \
+ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+ f=$(am__strip_dir) \
+ echo " $(nodist_perlDATA_INSTALL) '$$d$$p' '$(DESTDIR)$(perldir)/$$f'"; \
+ $(nodist_perlDATA_INSTALL) "$$d$$p" "$(DESTDIR)$(perldir)/$$f"; \
+ done
+
+uninstall-nodist_perlDATA:
+ @$(NORMAL_UNINSTALL)
+ @list='$(nodist_perl_DATA)'; for p in $$list; do \
+ f=$(am__strip_dir) \
+ echo " rm -f '$(DESTDIR)$(perldir)/$$f'"; \
+ rm -f "$(DESTDIR)$(perldir)/$$f"; \
+ done
+tags: TAGS
+TAGS:
+
+ctags: CTAGS
+CTAGS:
+
+
+distdir: $(DISTFILES)
+ $(mkdir_p) $(distdir)/..
+ @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \
+ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \
+ list='$(DISTFILES)'; for file in $$list; do \
+ case $$file in \
+ $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \
+ $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \
+ esac; \
+ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+ dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \
+ if test "$$dir" != "$$file" && test "$$dir" != "."; then \
+ dir="/$$dir"; \
+ $(mkdir_p) "$(distdir)$$dir"; \
+ else \
+ dir=''; \
+ fi; \
+ if test -d $$d/$$file; then \
+ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+ cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
+ fi; \
+ cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
+ else \
+ test -f $(distdir)/$$file \
+ || cp -p $$d/$$file $(distdir)/$$file \
+ || exit 1; \
+ fi; \
+ done
+check-am: all-am
+check: check-am
+all-am: Makefile $(DATA)
+installdirs:
+ for dir in "$(DESTDIR)$(perldir)"; do \
+ test -z "$$dir" || $(mkdir_p) "$$dir"; \
+ done
+install: install-am
+install-exec: install-exec-am
+install-data: install-data-am
+uninstall: uninstall-am
+
+install-am: all-am
+ @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-am
+install-strip:
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ `test -z '$(STRIP)' || \
+ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+mostlyclean-generic:
+
+clean-generic:
+ -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES)
+
+distclean-generic:
+ -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+
+maintainer-clean-generic:
+ @echo "This command is intended for maintainers to use"
+ @echo "it deletes files that may require special tools to rebuild."
+clean: clean-am
+
+clean-am: clean-generic mostlyclean-am
+
+distclean: distclean-am
+ -rm -f Makefile
+distclean-am: clean-am distclean-generic
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+info: info-am
+
+info-am:
+
+install-data-am: install-nodist_perlDATA
+
+install-exec-am:
+
+install-info: install-info-am
+
+install-man:
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-am
+ -rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-generic
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am: uninstall-info-am uninstall-nodist_perlDATA
+
+.PHONY: all all-am check check-am clean clean-generic distclean \
+ distclean-generic distdir dvi dvi-am html html-am info info-am \
+ install install-am install-data install-data-am install-exec \
+ install-exec-am install-info install-info-am install-man \
+ install-nodist_perlDATA install-strip installcheck \
+ installcheck-am installdirs maintainer-clean \
+ maintainer-clean-generic mostlyclean mostlyclean-generic pdf \
+ pdf-am ps ps-am uninstall uninstall-am uninstall-info-am \
+ uninstall-nodist_perlDATA
+
+
+Template.pm: $(INITRD_TEMPLATE).pm
+ cp $< $@
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
--- /dev/null
+#
+# Makefile.am -- installation and packaging instructions
+#
+include ../Makefile.incl
+
+CLEANFILES = $(nodist_perl_DATA)
+
+Template.pm: $(INITRD_TEMPLATE).pm
+ cp $< $@
+
+nodist_perl_DATA = \
+ Template.pm
+
+# not compiled, but must go in the tarball.
+EXTRA_DIST = \
+ Fedora.pm \
+ Debian.pm
--- /dev/null
+# Makefile.in generated by automake 1.9.5 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004, 2005 Free Software Foundation, Inc.
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+@SET_MAKE@
+
+#
+# Makefile.incl -- shared defines between makefiles
+# Copyright (C) 2005 Erik van Konijnenburg
+#
+# 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#
+# - auxdir contains package specific executables that may be included
+# in the generated image
+# - perldir contains perl modules to be included by the main program
+#
+# This cannot be simply passed from the master makefile; that would
+# be invisible to automake.
+
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH = @srcdir@
+pkgdatadir = $(datadir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+top_builddir = ..
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+INSTALL = @INSTALL@
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+DIST_COMMON = $(srcdir)/../Makefile.incl $(srcdir)/Makefile.am \
+ $(srcdir)/Makefile.in
+subdir = templates
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/configure.in
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+ $(ACLOCAL_M4)
+mkinstalldirs = $(install_sh) -d
+CONFIG_HEADER = $(top_builddir)/include/config.h
+CONFIG_CLEAN_FILES =
+SOURCES =
+DIST_SOURCES =
+am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
+am__vpath_adj = case $$p in \
+ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
+ *) f=$$p;; \
+ esac;
+am__strip_dir = `echo $$p | sed -e 's|^.*/||'`;
+am__installdirs = "$(DESTDIR)$(perldir)"
+nodist_perlDATA_INSTALL = $(INSTALL_DATA)
+DATA = $(nodist_perl_DATA)
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+AMDEP_FALSE = @AMDEP_FALSE@
+AMDEP_TRUE = @AMDEP_TRUE@
+AMTAR = @AMTAR@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CPPFLAGS = @CPPFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EXEEXT = @EXEEXT@
+INITRD_TEMPLATE = @INITRD_TEMPLATE@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+LDFLAGS = @LDFLAGS@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LTLIBOBJS = @LTLIBOBJS@
+MAKEINFO = @MAKEINFO@
+OBJEXT = @OBJEXT@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PERL = @PERL@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+VERSION = @VERSION@
+XMLTO = @XMLTO@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_STRIP = @ac_ct_STRIP@
+am__fastdepCC_FALSE = @am__fastdepCC_FALSE@
+am__fastdepCC_TRUE = @am__fastdepCC_TRUE@
+am__include = @am__include@
+am__leading_dot = @am__leading_dot@
+am__quote = @am__quote@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build_alias = @build_alias@
+datadir = @datadir@
+exec_prefix = @exec_prefix@
+host_alias = @host_alias@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+oldincludedir = @oldincludedir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+auxdir = $(pkglibdir)/exec
+perldir = $(pkglibdir)/perl
+
+#
+# Makefile.am -- installation and packaging instructions
+#
+CLEANFILES = $(nodist_perl_DATA)
+nodist_perl_DATA = \
+ Template.pm
+
+
+# not compiled, but must go in the tarball.
+EXTRA_DIST = \
+ Fedora.pm \
+ Debian.pm
+
+all: all-am
+
+.SUFFIXES:
+$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(srcdir)/../Makefile.incl $(am__configure_deps)
+ @for dep in $?; do \
+ case '$(am__configure_deps)' in \
+ *$$dep*) \
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \
+ && exit 0; \
+ exit 1;; \
+ esac; \
+ done; \
+ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu templates/Makefile'; \
+ cd $(top_srcdir) && \
+ $(AUTOMAKE) --gnu templates/Makefile
+.PRECIOUS: Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+ @case '$?' in \
+ *config.status*) \
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+ *) \
+ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
+ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+ esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure: $(am__configure_deps)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4): $(am__aclocal_m4_deps)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+uninstall-info-am:
+install-nodist_perlDATA: $(nodist_perl_DATA)
+ @$(NORMAL_INSTALL)
+ test -z "$(perldir)" || $(mkdir_p) "$(DESTDIR)$(perldir)"
+ @list='$(nodist_perl_DATA)'; for p in $$list; do \
+ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+ f=$(am__strip_dir) \
+ echo " $(nodist_perlDATA_INSTALL) '$$d$$p' '$(DESTDIR)$(perldir)/$$f'"; \
+ $(nodist_perlDATA_INSTALL) "$$d$$p" "$(DESTDIR)$(perldir)/$$f"; \
+ done
+
+uninstall-nodist_perlDATA:
+ @$(NORMAL_UNINSTALL)
+ @list='$(nodist_perl_DATA)'; for p in $$list; do \
+ f=$(am__strip_dir) \
+ echo " rm -f '$(DESTDIR)$(perldir)/$$f'"; \
+ rm -f "$(DESTDIR)$(perldir)/$$f"; \
+ done
+tags: TAGS
+TAGS:
+
+ctags: CTAGS
+CTAGS:
+
+
+distdir: $(DISTFILES)
+ $(mkdir_p) $(distdir)/..
+ @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \
+ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \
+ list='$(DISTFILES)'; for file in $$list; do \
+ case $$file in \
+ $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \
+ $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \
+ esac; \
+ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+ dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \
+ if test "$$dir" != "$$file" && test "$$dir" != "."; then \
+ dir="/$$dir"; \
+ $(mkdir_p) "$(distdir)$$dir"; \
+ else \
+ dir=''; \
+ fi; \
+ if test -d $$d/$$file; then \
+ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+ cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
+ fi; \
+ cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
+ else \
+ test -f $(distdir)/$$file \
+ || cp -p $$d/$$file $(distdir)/$$file \
+ || exit 1; \
+ fi; \
+ done
+check-am: all-am
+check: check-am
+all-am: Makefile $(DATA)
+installdirs:
+ for dir in "$(DESTDIR)$(perldir)"; do \
+ test -z "$$dir" || $(mkdir_p) "$$dir"; \
+ done
+install: install-am
+install-exec: install-exec-am
+install-data: install-data-am
+uninstall: uninstall-am
+
+install-am: all-am
+ @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-am
+install-strip:
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ `test -z '$(STRIP)' || \
+ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+mostlyclean-generic:
+
+clean-generic:
+ -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES)
+
+distclean-generic:
+ -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+
+maintainer-clean-generic:
+ @echo "This command is intended for maintainers to use"
+ @echo "it deletes files that may require special tools to rebuild."
+clean: clean-am
+
+clean-am: clean-generic mostlyclean-am
+
+distclean: distclean-am
+ -rm -f Makefile
+distclean-am: clean-am distclean-generic
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+info: info-am
+
+info-am:
+
+install-data-am: install-nodist_perlDATA
+
+install-exec-am:
+
+install-info: install-info-am
+
+install-man:
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-am
+ -rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-generic
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am: uninstall-info-am uninstall-nodist_perlDATA
+
+.PHONY: all all-am check check-am clean clean-generic distclean \
+ distclean-generic distdir dvi dvi-am html html-am info info-am \
+ install install-am install-data install-data-am install-exec \
+ install-exec-am install-info install-info-am install-man \
+ install-nodist_perlDATA install-strip installcheck \
+ installcheck-am installdirs maintainer-clean \
+ maintainer-clean-generic mostlyclean mostlyclean-generic pdf \
+ pdf-am ps ps-am uninstall uninstall-am uninstall-info-am \
+ uninstall-nodist_perlDATA
+
+
+Template.pm: $(INITRD_TEMPLATE).pm
+ cp $< $@
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
--- /dev/null
+#!/usr/bin/perl
+#
+# Template -- for translation general intentions to exact initrd layout
+# Copyright (C) 2005 Erik van Konijnenburg
+#
+# 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#
+# These templates define the translation from general intentions in the
+# plan to exact lists of files and script fragments to be included
+# on the initrd image. Templates are indexed by an action name, and include:
+# - files to be copied from current system to initrd;
+# often executables.
+# - directories to be created
+# - fragments to be appended to scripts on the image,
+# these are in a hash from script name to script content.
+#
+# Everything is processed by HTML::Template before being added to the
+# image: script fragments, but also file names and script names.
+# Leading spaces are dropped from template lines.
+#
+# If you want to implement busybox support, this is the place to do it.
+#
+# Obviously, the template names and the attributes used in the template
+# should match what is provided by the planner.
+#
+#
+
+use strict;
+package Template;
+
+
+my $templates = {
+ prologue => {
+ # In principle, we don't want device files on the initrd
+ # image: device numbers can change between kernels.
+ # Instead, create device files at boot time based on info
+ # in sysfs. However, /dev/null and /dev/console are needed
+ # to mount sysfs.
+ files => [
+ '/dev/null',
+ '/dev/console',
+ '/bin/ash',
+ '/bin/cat',
+ '/bin/mkdir',
+ '/bin/mount',
+ '/bin/umount',
+ '/bin/mknod',
+ '/bin/sleep',
+ ],
+ directories => [
+ '/mnt', '/proc', '/sys', '/dev', '/etc', '/var',
+ ],
+ trees => [],
+ scripts => {
+ '/init' => <<'//',
+ #!/bin/ash
+
+ # Generator version: yaird <TMPL_VAR NAME=appVersion>.
+ #
+ set -x
+ #
+ # Utility functions
+ #
+ mksymdev () {
+ devfile="$1"
+ sysfile="$2"
+ cb="$3"
+ devpair=$(/bin/cat "$sysfile")
+ for delay in 1 2 4 8 16
+ do
+ if [ "$devpair" = "" ]
+ then
+ echo "Waiting $delay seconds for $sysfile to show up"
+ sleep $delay
+ fi
+ devpair=$(/bin/cat "$sysfile")
+ done
+
+ if [ "$devpair" = "" ]
+ then
+ echo "Device $sysfile seems to be down."
+ echo "Debugging opportunity, type ^D to continue."
+ /bin/dash
+ fi
+
+ maj=${devpair%:*}
+ min=${devpair#*:}
+ /bin/mknod "$devfile" $cb $maj $min
+ }
+ mkcdev () {
+ mksymdev "$1" "/sys/class/$2/dev" c
+ }
+ mkbdev () {
+ mksymdev "$1" "/sys/block/$2/dev" b
+ }
+
+
+ #
+ # Setting up mounts
+ #
+ mount -nt sysfs sysfs /sys
+ mount -nt proc proc /proc
+ # In Fedora FC3, tmpfs *must* have the name
+ # 'none', otherwise start_udev, called from
+ # rc.sysinit will mount a new tmpfs over it,
+ # and you loose access to nodes such as
+ # /dev/vg0/root, expected to be created by
+ # LVM in initramfs.
+ mount -nt tmpfs none /dev
+
+ #
+ #
+ # Command line processing
+ # init - first proc to start on next root
+ # root - to be done: how should it relate
+ # to file system selection?
+ # ro,rw - mount root read-only or read-write.
+ # This is like a mount -r; it overrules
+ # a -o rw.
+ # noresume, resume - to be done
+ # ide - options for module ide_core.
+ # need a way to append these to proper
+ # module. do a check on module name
+ # in insmod template?
+ #
+ ro=-r
+ init=/sbin/init
+ for i in $(cat /proc/cmdline)
+ do
+ case "$i" in
+ init=*)
+ init=${i#init=}
+ ;;
+ ro)
+ ro=-r
+ ;;
+ rw)
+ ro=
+ esac
+ done
+//
+ },
+ },
+
+ insmod => {
+ files => [
+ '<TMPL_VAR NAME=target>',
+ '/sbin/insmod',
+ ],
+ directories => [],
+ trees => [],
+ scripts => {
+ '/init' => <<'//',
+ /sbin/insmod '<TMPL_VAR NAME=target>'
+//
+ },
+
+ },
+
+ mkbdev => {
+ files => [],
+ directories => [],
+ trees => [],
+ scripts => {
+ '/init' => <<'//',
+ mkbdev '<TMPL_VAR NAME=target>' '<TMPL_VAR NAME=sysname>'
+//
+ },
+ },
+
+ vgchange => {
+ #
+ # Use static version. Note that fedora starts with
+ # empty /dev, so we must make device nodes explicitly.
+ #
+ files => [
+ '/sbin/lvm',
+ ],
+ directories => [],
+ trees => [],
+ scripts => {
+ # We cannot make mapper/control any earlier,
+ # since dm-mod needs to be loaded to be able
+ # to determine devno.
+ '/init' => <<'//',
+ if [ ! -c /dev/mapper/control ]
+ then
+ /bin/mkdir /dev/mapper
+ mkcdev /dev/mapper/control misc/device-mapper
+ fi
+ /bin/mount -nt tmpfs tmpfs /etc
+ /bin/mount -nt tmpfs tmpfs /var
+ /sbin/lvm vgchange -a y '<TMPL_VAR NAME=target>'
+ /sbin/lvm vgmknodes
+ /bin/umount -n /var
+ /bin/umount -n /etc
+//
+ },
+ },
+
+ mdadm => {
+ files => [
+ '/sbin/mdadm',
+ ],
+ directories => [],
+ trees => [],
+ scripts => {
+ #
+ # NOTE: mdadm can operate without knowledge
+ # of device numbers; it will assign an unused
+ # one to the new device. Thus you could have
+ # device name /dev/md/boot that is stable,
+ # regardless of which other raid devices are
+ # operational. However, debian installer
+ # consistently uses device names like /dev/md0,
+ # where the name depends on earlier minors
+ # that happen to have been assigned.
+ # To work around this problem, we forego
+ # the --auto option, and mknod the device
+ # before putting an md under it. Better hope
+ # the major number is not going to change ...
+ #
+ '/init' => <<'//',
+ mknod <TMPL_VAR NAME=target> b <TMPL_VAR NAME=major> <TMPL_VAR NAME=minor>
+ mdadm --assemble <TMPL_VAR NAME=target> --uuid <TMPL_VAR NAME=uuid> \
+ <TMPL_LOOP NAME=components> <TMPL_VAR NAME=dev></TMPL_LOOP>
+//
+ }
+ },
+
+ mount => {
+ files => [],
+ directories => [],
+ trees => [],
+ scripts => {
+ #
+ # NOTE: honouring the kernel cmdline option ro,rw
+ # is very nice, but... If you have an ext3 in a
+ # file loopback-mounted from vfat, it's unlikely
+ # that a remount rw of root will also make the
+ # underlying vfat read-write. Underlying filesystems
+ # should ignore the kernel ro/rw option; we
+ # have an attribute isRoot that's defined iff
+ # this is the real root.
+ #
+ # always -n, since we dont have writable /etc/mtab.
+ #
+ '/init' => <<'//',
+ mount -n \
+ <TMPL_IF NAME=isRoot>$ro</TMPL_IF> \
+ -t <TMPL_VAR NAME=fsType> \
+ <TMPL_VAR NAME=options> \
+ <TMPL_VAR NAME=device> \
+ <TMPL_VAR NAME=target>
+//
+ }
+ },
+
+ postlude => {
+ files => [
+ '<TMPL_VAR NAME=auxDir>/run_init',
+ ],
+ directories => [],
+ trees => [],
+ scripts => {
+ #
+ # fedora does not come with populated /dev
+ # on root and needs at least /dev/console.
+ # Pass them via tmpfs.
+ #
+ # Do *not* do a pivot_root here. We're
+ # working from rootfs; a pivotroot would
+ # make that end up in /initrd, which gets
+ # unmounted by rc.sysinit, and without rootfs,
+ # too much is broken to even do a panic.
+ #
+ # Instead use run_init from klibc, which uses
+ # a magical combination of mount --move /mnt /,
+ # chdir and chroot.
+ #
+
+ '/init' => <<'//',
+ echo "Debugging opportunity, ^D to continue."
+ /bin/ash
+
+ echo "Switching root ..."
+ cd /mnt
+ mkcdev /dev/null mem/null
+ mkcdev /dev/zero mem/zero
+ mkcdev /dev/console tty/console
+ mkdir /dev/pts
+ mkdir /dev/shm
+ mount -n -t tmpfs --bind /dev /mnt/dev
+ /bin/umount -n /sys
+ /bin/umount -n /proc
+ exec <TMPL_VAR NAME=auxDir>/run_init \
+ /mnt $init "$@"
+//
+ }
+ },
+};
+
+sub template ($) { return $templates->{$_[0]}; }
+
+
+1;
--- /dev/null
+Makefile
+diskinfo
+format.hda
+mount_drives
+partition.hda
+sfdisk
+start_network
+1
+bacula-fd
+bacula-fd.conf
--- /dev/null
+#
+# bootstrap/linux Makefile.in
+#
+# Version $Id$
+#
+@MCOMMON@
+
+working_dir=@working_dir@
+
+srcdir = @srcdir@
+VPATH = @srcdir@
+.PATH: @srcdir@
+topdir = ../..
+thisdir = linux
+
+
+first_rule: all
+dummy:
+
+MKDIR = $(topdir)/autoconf/mkinstalldirs
+
+#-------------------------------------------------------------------------
+
+all: Makefile
+
+depend:
+
+
+#-------------------------------------------------------------------------
+
+
+install:
+
+uninstall:
+
+Makefile: Makefile.in
+ cd $(topdir) \
+ && CONFIG_FILES=$(thisdir)/$@ CONFIG_HEADERS= $(SHELL) ./config.status
+
+Makefiles:
+ $(SHELL) config.status
+
+clean:
+ @$(RMF) *~ 1 2 3
+ @$(RMF) format.* partition.* start_network mount_drives
+ @$(RMF) sfdisk bacula-fd bacula-fd.gz bacula-fd.conf
+ @$(RMF) -r diskinfo
+
+# clean for distribution
+distclean: clean
+ @$(RMF) Makefile
+ @$(RMF) -r CVS
+
+devclean: clean
+ @$(RMF) Makefile
+
+# ------------------------------------------------------------------------
--- /dev/null
+/etc/exports
+/etc/fstab
+/etc/group
+/etc/gshadow
+/etc/host.conf
+/etc/hosts
+/etc/hosts.allow
+/etc/hosts.deny
+/etc/modules.conf
+/etc/passwd
+/etc/resolv.conf
+/etc/shadow
+/etc/sysconfig
--- /dev/null
+#!/bin/sh
+#
+# Format Floppy
+#
+export LANG=C
+echo ""
+echo "This script will format your floppy"
+echo ""
+echo "IT WILL DESTROY ALL DATA ON THE FLOPPY !!!!"
+echo ""
+echo -n "Are you sure you want to continue? (yes/no): "
+read a
+if [ x$a != xyes ] ; then
+ exit 1
+fi
+echo -n "Do you want to do a block check (takes time)? (yes/no): "
+read a
+if [ x$a = xyes ] ; then
+ check="-c"
+else
+ check=
+fi
+echo ""
+echo "Formating /dev/fd0 -- ext2 partition"
+mke2fs -v $check /dev/fd0
+echo ""
--- /dev/null
+#!/bin/sh
+#
+# Create bootstrap information files -- prelude to creating a
+# Bacula Rescue Disk
+#
+# Kern Sibbald, December MMII
+# This source distributed under the GPL
+#
+export LANG=C
+di=diskinfo
+cwd=`pwd`
+host=`uname -s`
+
+case $host in
+ Linux)
+ ;;
+ FreeBSD | SunOS | IRIX)
+ echo ""
+ echo "This code is not yet adapted to this OS"
+ exit 1
+ ;;
+ *)
+ echo ""
+ echo "Unknown operating system type: $host"
+ exit 1
+ ;;
+esac
+if [ ! `whoami` = "root" ] ; then
+ echo ""
+ echo "You need to be root to run this, otherwise"
+ echo "sfdisk produces no output. Continuing anyway ..."
+ echo ""
+fi
+
+#
+# First collect information
+#
+rm -rf format.* partition.* $di
+echo "Begin collecting system info ..."
+mkdir -p $di
+cd $di
+mount -l >mount.bsi
+mount -l -t ext2 >mount.ext2.bsi
+mount -l -t ext3 >mount.ext3.bsi
+cp /etc/fstab fstab.bsi
+cp /etc/mtab mtab.bsi
+df -Tl >df.bsi
+sfdisk -s >sfdisk.disks.bsi
+grep "^/dev/" sfdisk.disks.bsi | sed -n 's%\(^/dev/[A-Za-z]*\):.*$%\1%p' >disks.bsi
+for i in `cat disks.bsi`; do
+ j=`echo $i | cut -c6-`
+ sfdisk -l $i >sfdisk.$j.bsi
+ sfdisk -d $i >sfdisk.make.$j.bsi
+done
+route -n >route.bsi
+ifconfig >ifconfig.bsi
+echo "Done collecting info."
+
+#
+# Done collecting information
+#
+
+
+echo "Begin creating scripts ..."
+#
+# First create partitioning script(s)
+#
+for i in `cat disks.bsi`; do
+ j=`echo $i | cut -c6-`
+ cat >$cwd/partition.$j <<END_OF_DATA
+#!/bin/sh
+#
+# Partition disk $i -- created by getdiskinfo
+echo ""
+echo "This script will repartition disk $i."
+echo ""
+echo "IT WILL DESTROY ALL DATA ON DISK $i !!!!"
+echo ""
+echo -n "Are you sure you want to continue? yes/no: "
+read a
+if [ x\$a != xyes ] ; then
+ exit 1
+fi
+echo "Partitioning disk $i"
+# zap partition info
+dd if=/dev/zero of=$i bs=512 count=2
+# repartition
+sfdisk $i <$di/sfdisk.make.$j.bsi | less
+echo ""
+echo "The previous partitioning was:"
+cat $di/sfdisk.$j.bsi
+#
+echo ""
+echo "The new partitioning is:"
+sfdisk -l $i
+echo ""
+echo "If the disk is correctly partitioned, you should"
+echo "now run the \"format.$j\" script."
+echo ""
+END_OF_DATA
+
+ chmod 755 $cwd/partition.$j
+done
+echo "Done making partitioning scripts"
+
+#
+# Create formatting script(s)
+#
+echo "Begin making formatting script(s) ..."
+for i in `cat disks.bsi`; do
+ j=`echo $i | cut -c6-`
+ cat >$cwd/format.$j <<END_OF_DATA
+#!/bin/sh
+#
+# Format all partitions on disk $i -- created by getdiskinfo
+#
+echo ""
+echo "This script will format all partitions on disk $i."
+echo ""
+echo "IT WILL DESTROY ALL DATA ON DISK $i !!!!"
+echo ""
+echo -n "Are you sure you want to continue? yes/no: "
+read a
+if [ x\$a != xyes ] ; then
+ exit 1
+fi
+echo "Do you want to do a disk check for bad blocks?"
+echo -n "It is recommended, but takes time. yes/no: "
+read a
+if [ x\$a = xyes ] ; then
+ check="-c"
+else
+ check=
+fi
+END_OF_DATA
+
+ # Find swap partitions in output from sfdisk
+ k=`grep "^$i.*82 Linux swap" sfdisk.$j.bsi | cut -d ' ' -f 1`
+ for disk in $k; do
+ echo "echo \"Formatting $disk -- swap partition\"" >>$cwd/format.$j
+ echo "mkswap $check $disk" >>$cwd/format.$j
+ echo "echo \"\"" >>$cwd/format.$j
+ done
+ # Find ext2 partitions in mount output
+ k=`grep "^$i" mount.ext2.bsi | cut -d ' ' -f 1`
+ for disk in $k; do
+ echo "echo \"Formating $disk -- ext2 partition\"" >>$cwd/format.$j
+ label=`grep "^$disk" mount.ext2.bsi | cut -d ' ' -f 7 | cut -c2- | cut -d ] -f 1`
+ if [ x$label = x ] ; then
+ echo "mke2fs -v \$check $disk" >>$cwd/format.$j
+ else
+ echo "mke2fs -v \$check -L $label $disk" >>$cwd/format.$j
+ fi
+ echo "echo \"\"" >>$cwd/format.$j
+ done
+ # Find ext3 partitions in mount output
+ k=`grep "^$i" mount.ext3.bsi | cut -d ' ' -f 1`
+ for disk in $k; do
+ echo "echo \"Formating $disk -- ext3 partition\"" >>$cwd/format.$j
+ label=`grep "^$disk" mount.ext3.bsi | cut -d ' ' -f 7 | cut -c2- | cut -d ] -f 1`
+ if [ x$label = x ] ; then
+ echo "mke2fs -v -j \$check $disk" >>$cwd/format.$j
+ else
+ echo "mke2fs -v -j \$check -L $label $disk" >>$cwd/format.$j
+ fi
+ echo "echo \"\"" >>$cwd/format.$j
+ done
+ chmod 755 $cwd/format.$j
+done
+
+cd $cwd
+
+#
+# Create network start script
+#
+host=`hostname`
+ip=`host $host | cut -d ' ' -f 4`
+if [ $ip = "out;" ] ; then
+ ip=`ifconfig | grep inet | head -1 | sed -n 's/\ \+inet addr:\([0-9]\+\(\.[0-9]\+\)\{3\}\).*/\1/p'`
+fi
+cat >start_network <<END_OF_DATA
+#!/bin/sh
+#
+# Start network -- created by getdiskinfo
+#
+ip=$ip
+dev=eth0
+ifconfig lo up
+ifconfig \$dev up \$ip
+route add default gw \$ip dev \$dev
+END_OF_DATA
+
+chmod 755 start_network
+
+cat >mount_drives <<END_OF_DATA
+#!/bin/sh
+#
+# Mount disk drives -- created by getdiskinfo
+#
+END_OF_DATA
+sed -n 's/\(^.*\)\ on\ \(.*\)\ type.*$/\1 \/mnt\/disk\2/p' $di/mount.ext2.bsi >/tmp/1$$
+sed -n 's/\(^.*\)\ on\ \(.*\)\ type.*$/\1 \/mnt\/disk\2/p' $di/mount.ext3.bsi >>/tmp/1$$
+sed -n 's/\(^.*\)\ on\ \(.*\)\ type.*$/\1 \/mnt\/disk\2/p' $di/mount.rei.bsi >>/tmp/1$$
+# sort so that / is first
+sort -k 2 </tmp/1$$ >/tmp/2$$
+# output mkdir followed by its mount
+sed -n 's/\(^.*\)\ \(.*$\)/mkdir -p \2\nmount \1 \2/p' /tmp/2$$ >>mount_drives
+rm -f /tmp/1$$ /tmp/2$$
+rm -f /tmp/1$$
+
+chmod 755 mount_drives
+
+# copy sfdisk so we will have it
+cp -f /sbin/sfdisk .
+echo "Done building scripts."
+echo " "
+echo "You might want to do a:"
+echo " "
+echo "chown -R uuuu:gggg *"
+echo " "
+echo "where uuuu is your userid and gggg is your group"
+echo "so that you can access all the files as non-root"
+echo " "
--- /dev/null
+#!/bin/sh
+#
+# Script to make a Bacula "rescue" disk
+#
+export LANG=C
+device=/mnt/floppy
+dev=/dev/fd0
+
+# Print Usage message
+usage () {
+ cat <<END_OF_DATA
+Usage: make_rescue_disk
+ -h, --help print this message
+ --make-static-bacula make static File daemon and add to diskette
+ --copy-static-bacula copy static File daemon to diskette
+ --copy-etc-files copy files in etc list to diskette
+END_OF_DATA
+}
+
+# defaults
+make_bacula=no
+copy_bacula=no
+copy_etc=no
+
+#
+# Process command line options
+#
+for option in "$@" ; do
+ case "$option" in
+ -h | --help)
+ usage
+ exit 0
+ ;;
+ --make-static-bacula)
+ make_bacula=yes
+ copy_bacula=yes
+ ;;
+ --copy-static-bacula)
+ copy_bacula=yes
+ ;;
+ --copy-etc-files)
+ copy_etc=yes
+ ;;
+ *)
+ echo "Unknown option specified: $option"
+ usage
+ exit 1
+ ;;
+ esac
+done
+
+echo ""
+echo "Place a blank diskette in your floppy drive."
+echo "It will be formatted and all data will be lost."
+echo ""
+echo -n "Press return when ready: "
+read a
+umount $device 2>&1 >/dev/null
+if [ $? = 0 ] ; then
+ mounted=1
+else
+ mounted=0
+fi
+mke2fs $dev
+mount $dev $device 2>&1 >/dev/null
+
+if [ x$make_bacula = "xyes" ] ; then
+ ./make_static_bacula
+fi
+
+if [ x$copy_bacula = "xyes" -a ! -e bacula-fd ] ; then
+ echo " "
+ echo "bacula-fd not found. If you want Bacula on this"
+ echo "rescue disk please run \"make_static_bacula\" first."
+ echo "Continuing anyway ..."
+ echo " "
+ exit 1
+ have_bacula=no
+else
+ echo "Stripping and compressing Bacula"
+ strip bacula-fd
+ gzip bacula-fd
+ have_bacula=yes
+fi
+
+echo "Copying files to $device"
+cp -a . $device
+
+if [ x$copy_etc = "xyes" ] ; then
+ echo "Tarring /etc files to $device"
+ tar --create --gzip --file $device/etc.gz --files-from backup.etc.list
+fi
+
+if [ x$have_bacula = "xyes" ] ; then
+ rm -f bacula-fd.gz bacula-fd.conf
+fi
+sync
+if [ $mounted = 0 ] ; then
+ umount $device
+fi
--- /dev/null
+#!/bin/sh
+#
+# Note, this creates the directory etc, so if you want
+# the files to go into the real /etc, you must be one
+# level up when executing it. Otherwise you end up with
+# a /etc/etc directory.
+#
+export LANG=C
+device=/mnt/floppy
+tar -v -z -f $device/etc.gz
--- /dev/null
+#!/bin/sh
+#
+# Script to run grub to recreate the MBR
+#
+export LANG=C
+# Find boot partition if any
+bootp=`grep "^/dev/.*\ on\ /boot" diskinfo/mount.bsi | cut -d ' ' -f 1`
+# find boot device
+if [ x$bootp != x ] ; then
+ bootdev=`echo $bootp | cut -c1-8`
+else
+ bootdev=`grep "^/dev/.*\ on\ /" diskinfo/mount.bsi | cut -c1-8`
+fi
+echo "Boot device is $bootdev"
+echo " "
+echo "To manually install grub, enter:"
+echo "chroot /mnt/disk"
+echo "/sbin/grub-install $bootdev"
+echo " "
+echo "Attempting to install grub ..."
+echo " "
+chroot /mnt/disk /sbin/grub-install $bootdev
+sync
--- /dev/null
+#!/bin/sh
+#
+# Script to run lilo and re-create the MBR
+#
+export LANG=C
+chroot /mnt/disk /sbin/lilo -v -C /etc/lilo.conf
+sync
--- /dev/null
+Makefile
+diskinfo
+format.hda
+mount_drives
+partition.hda
+sfdisk
+start_network
+1
+bacula-fd
+bacula-fd.conf
--- /dev/null
+#
+# bootstrap/solaris Makefile.in
+#
+# Version $Id$
+#
+@MCOMMON@
+
+working_dir=@working_dir@
+
+srcdir = @srcdir@
+VPATH = @srcdir@
+.PATH: @srcdir@
+topdir = ../..
+thisdir = solaris
+
+
+first_rule: all
+dummy:
+
+MKDIR = $(topdir)/autoconf/mkinstalldirs
+
+#-------------------------------------------------------------------------
+
+all: Makefile
+
+depend:
+
+
+#-------------------------------------------------------------------------
+
+
+install:
+
+uninstall:
+
+Makefile: Makefile.in
+ cd $(topdir) \
+ && CONFIG_FILES=$(thisdir)/$@ CONFIG_HEADERS= $(SHELL) ./config.status
+
+Makefiles:
+ $(SHELL) config.status
+
+clean:
+ @$(RMF) *~ 1 2 3
+ @$(RMF) format.* partition.* start_network mount_drives
+ @$(RMF) sfdisk bacula-fd bacula-fd.gz bacula-fd.conf
+ @$(RMF) -r diskinfo
+
+# clean for distribution
+distclean: clean
+ @$(RMF) Makefile
+ @$(RMF) -r CVS
+
+devclean: clean
+ @$(RMF) Makefile
+
+# ------------------------------------------------------------------------
--- /dev/null
+#!/bin/sh -- # -*- shell-script -*-
+#
+# SysAudit/SysConfig -- Capture UNIX machine information
+# Copyright (C) 1997 David J. Young <davidy@pencom.com>
+#
+# 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.
+#
+# $Author$
+VERSION='$Revision$'
+#
+# Modification History
+# 1.0 ??-???-96 Robert Ess <ress@spdmail.spd.dsccc.com> - Created.
+# 2.0 15-Aug-96 David J. Young <davidy@psa.pencom.com> - Modified.
+# Added/modified code in the Solaris section:
+# - Extracted IP address, MacAddr, C compiler and other information
+# from more reliable sources.
+# - Added dump of information for the Veritas Volume Manager.
+# - Calculate and report total swap space
+# - Report if the machine is acting as a NFS and/or NIS Server or Client
+# - Added counters for number of patches, printers and packages
+# - Fix a small bug you had with the previous file (*.bl).
+# 3.0 4-Sep-96 David E. Nelson <dnelson@psa.pencom.com> - Modified.
+# Added/modified code in the SunOS section:
+# - Added code operate in either an "audit" or "check" mode.
+# - Added SWAPSPACE and KERNEL info.
+# - Also added MACADDR, since you must be root to obtain this info using ifconfig.
+# - Made sure the script would work on an Auspex
+# 3.1 10-Sep-96 David J. Young <davidy@psa.pencom.com> - Modified.
+# Added/modified code to complete the HPUX section.
+# Added Modification History and Description.
+#
+# 3.2 12-Sep-96 David E. Nelson <dnelson@psa.pencom.com> - Modified.
+# The vast majority of the changed/additons are for SunOS 4.1.x/3.5 and
+# auspex.
+# Added support for SunOs 3.5. Yes, 3.5! That's NOT a typo!
+# Modified Auspex and added auspex specific commands
+# Added Notification of vars that didn't get set.
+# Added exported filesystems in output.
+# Fixed bug in SysConfig|SysAudit name determination.
+# Added gated detection.
+# 3.3 10-Oct-96 David E. Nelson <dnelson@psa.pencom.com> - Modified.
+# Added support for Solaris 2.5.1
+# 3.4 09-Jan-97 David J. Young <davidy@Psa.pencom.com> - Modified.
+# Fixed small problems when running on HP-UX.
+#
+# Description:
+# The original philosophy of the script that Robert Ess wrote was to run
+# every day as a cron job. If there were *any* machine configuration
+# changes, those changes (differences) would be mailed back to the
+# administrator to make him aware that something changed.
+#
+# David Young took the original script and modified it to perform a
+# "snapshot" report of a system it was run on. His goal at the time was
+# to perform an audit and needed a report that was a "baseline" for each
+# system he ran it on. The script was modified to collect as much
+# information about the machine as possible.
+#
+# These two goals were then merged by David J. Young & David E. Nelson.
+# Small changes here and there made it so that the script can perform
+# either function. This file should be name "SysAudit" or "SysConfig".
+# If the name is SysConfig, it can be run out of cron and will send
+# E-mail to "SysConfigReport". If the script is called SysAudit, it will
+# collect information and send it to standard output as a report.
+#
+# Most sites will problably want to hard link SysConfig and SysAudit, so
+# that the script can be executed either way.
+#
+# set -x
+#
+# Usage
+#
+Usage(){
+ echo "Usage: SysConfig|SysAudit"
+ echo " SysConfig: Generates system info that is static."
+ echo " SysAudit: Generates system info that is dynamic."
+ exit 0
+}
+
+#
+# Parse the command line args
+#
+NOPRINTER=0; export NOPRINTER
+NOPATCHES=0; export NOPATCHES
+NOPKGS=0; export NOPKGS
+TMPFILE=/tmp/SysAudit.$$
+trap 'rm -f $TMPFILE 2>/dev/null' EXIT
+loop=true
+while ($loop); do
+ case $1 in
+ -h*) Usage;;
+ -lp) NOPRINTER=1
+ shift
+ ;;
+ -pkg) NOPKGS=1
+ shift
+ ;;
+ -patch) NOPATCHES=1
+ shift
+ ;;
+ *) loop=false
+ ;;
+ esac
+done
+
+
+# =============================================================================
+# BEGIN FUNCTION DEFINITIONS
+# =============================================================================
+
+#
+#
+#
+Get_Prog_Name(){
+ case $0 in
+ *SysAudit) AUDIT=1;;
+ *SysConfig) AUDIT=0;;
+ *) AUDIT=1;; # The default behavior is to do an audit.
+ esac
+return
+}
+
+#
+# Are we root?
+#
+Check_User(){
+UID=`id | cut -d'(' -f1 | cut -d'=' -f2`
+if [ "$UID" -ne "0" ]; then
+ echo ""
+ echo "***************************************************"
+ echo "** WARNING: You are not root. **"
+ echo "** Running as root will give you better results. **"
+# echo "** Especially for the remark command: rm -rf .* **"
+ echo "***************************************************"
+ echo ""
+ NOTROOT=1
+ sleep 3
+else
+ NOTROOT=0
+fi
+
+return
+}
+
+
+#
+# Determine system type
+#
+Get_Arch(){
+#set -x
+if [ -f /bin/arch ]; then
+ if [ `/bin/arch -k` = "sun3" ]; then
+ ARCH='sun3'
+ else
+ ARCH=`uname`
+ fi
+else
+ ARCH=`uname`
+fi
+
+case $ARCH in
+ HP-UX) REV=`uname -r|cut -d. -f2`
+ if [ $REV = "09" ]; then
+ SYSTYPE=HPUX09
+ elif [ $REV = "10" ]; then
+ SYSTYPE=HPUX10
+ fi;;
+
+ SunOS) REV=`uname -r|cut -d. -f1`
+ if [ $REV = 5 ]; then
+ SYSTYPE=Solaris
+ elif [ $REV = 4 ]; then
+ SYSTYPE=SunOS
+ fi;;
+
+ sun3) SYSTYPE=SunOS3;;
+
+ IRIX) REV=`uname -r|cut -d. -f1`
+ if [ $REV = 6 ]; then
+ SYSTYPE=IRIX6
+ elif [ $REV = 5 ]; then
+ SYSTYPE=IRIX5
+ fi;;
+
+ *) echo "System type unsupported"
+ exit 1;;
+esac
+return
+}
+
+#
+# Setup variables for system specific syntax of common commands
+#
+Define_Vars(){
+#set -x
+HOSTNAME=`hostname`
+
+case $SYSTYPE in
+
+ HPUX*) PATH=/bin:/usr/bin:/sbin:/usr/sbin:/etc
+ if [ $NOTROOT -eq "0" ]; then
+ SWAPFILE=`swapinfo | egrep "dsk|lvol" | awk '{print $9}'`
+ DEVSWAP=`swapinfo | grep dev | awk '{print $2}'`
+ FILESWAP=`swapinfo | grep fs | awk '{print $2}'`
+ SWAPSPACE=`swapinfo -t | grep tot | awk '{print $2}'`
+ else
+ SWAPFILE="<Must run swapinfo(1) as root>"
+ DEVSWAP=$SWAPFILE
+ FILESWAP=$SWAPFILE
+ SWAPSPACE=$SWAPFILE
+ fi
+ MACADDR=`lanscan | grep x | awk '{print $2}'`
+ KERNEL="<Unknown>"
+ HOSTID=`uname -i`
+ MODEL=`model`
+ MEMORY=`dmesg | grep Phys | awk '{print $2}'`K
+ if [ $MEMORY = 'K' ]; then
+ if [ $NOTROOT -eq "1" ]; then
+ MEMORY="<Must be root to read /dev/mem>"
+ else
+ MEMORY=`wc /dev/mem`
+ fi
+ fi
+ DISKCMD='bdf -t hfs'
+ CCOMP=`what /bin/cc | grep HP | cut -d' ' -f2`
+ ETHERIF=lan0
+ MAILCMD=mailx
+ PRTCMD=lp
+ PSCMD='ps -ef'
+ ;;
+
+ Solar*) PATH=/bin:/sbin:/usr/sbin:/usr/ucb
+ PATH=$PATH:/usr/ccs/bin:/usr/bin
+ SWAPFILE=`swap -l | grep dsk | awk '{print $1}'`
+ DEVSWAP=`swap -l | grep dsk | awk '{print $4}'`
+ MODEL=`prtconf -vp | grep banner-name | awk -F\' '{print $2}'`
+# MEMORY=`dmesg | grep '^mem' | tail -1 | awk '{print $3}'` #'
+ MEMORY=`prtconf | grep '^Memory size' | sed 's/Memory size: //'`
+ KERNEL=`sysdef | grep Generic | awk '{print $1}'`
+ DISKCMD='df -tkFufs'
+ NFSFS='df -tkFnfs'
+ EXPORTFS='showmount -e '$HOSTNAME
+ HOSTID=`sysdef -h | tail -1 | awk '{print $1}'`
+ if [ -x /usr/ccs/bin/what ]; then
+ if [ -d /opt/SUNWspro ]; then
+ CCOMP=`what /opt/SUNWspro/bin/cc | grep RELEASE | \
+ sed 's/.*RELEASE VERSION //'`
+ else
+ CCOMP=`what /usr/ucb/cc | grep SMI | awk '{print $2}'`
+ CCOMP="$CCOMP (bundled)"
+ fi
+ else
+ CCOMP="<No Compiler>"
+ fi
+# ETHERIF=le0
+ ETHERIF=`ifconfig -a|grep BROADCAST | awk -F: '{print $1}'| head -1 `
+ IPADDR=`ifconfig $ETHERIF | grep inet | awk '{print $2}'`
+# MACADDR=`dmesg | grep Ether | tail -1 | awk '{print $4}'`
+# MACADDR=`arp -a | grep $HOSTNAME | sed 's/.*\(08:00.*\) .*/\1/'`
+ MACADDR=`arp $IPADDR | awk '{print $4}'`
+ MAILCMD=mailx
+ PRTCMD=lp
+ PSCMD='ps -ef'
+ SWAPSPACE=`swap -s | awk '
+ {
+ swapused = $9
+ swapavail = $11
+ swapusedlen = length(swapused) - 1
+ swapavailen = length(swapavail) - 1
+ usedk = substr(swapused,1,swapusedlen)
+ availk = substr(swapavail,1,swapavailen)
+ total = (availk + usedk)/1000
+ printf("%2.0f Megabytes\n", total)
+ }'`
+ ;;
+
+ SunOS) PATH=/bin:/usr/bin:/usr/ucb:/etc:/usr/etc
+ SWAPFILE='/dev/'`dmesg | grep swap | tail -1 | awk '{print $3}'`
+ DEVSWAP=`pstat -T | grep swap | awk '{print $1}' \
+ | cut -d'/' -f2`
+
+ if [ `arch -k` = "aushp" ]; then
+ AUSPEX=1
+ ETHERIF=ae0
+ else
+ ETHERIF=le0
+ fi
+
+ if [ "$NOTROOT" = "1" ]; then
+ MACADDR=`dmesg | grep -i "ethernet address" | awk '{ print $4 }' | tail -1`
+ else
+ MACADDR=`ifconfig $ETHERIF | grep ether | tail -1 | awk '{print $2}'`
+ fi
+ if [ -z "$MACADDR" ]; then
+ MACADDR="Root access required."
+ fi
+
+ MODEL=`dmesg | egrep "LX|SPARC|4/75|4/50"| tail -1 \
+ | awk '{print $3, $4}'`
+
+ if [ -z "$MODEL" ]; then
+ MODEL=`mach`
+ fi
+
+ MEMORY=`dmesg | grep '^mem' | tail -1 | awk '{print $3}'`
+
+ if [ -z "$MEMORY" ]; then
+ MEMORY="Unknown"
+ fi
+
+ DISKCMD='df -t 4.2'
+ CCOMP="Unknown"
+ MAILCMD=/bin/mail
+ PRTCMD=lpr
+ PSCMD='ps aux'
+ SWAPSPACE=`pstat -T | grep "swap" | awk '{print $1}' | \
+ awk -F/ '{print $2}'`'K'
+ KERNEL=`uname -v`
+ HOSTID=`hostid`
+ EXPORTFS='showmount -e '$HOSTNAME
+ ;;
+
+ SunOS3) PATH=/bin:/usr/bin:/usr/ucb:/etc:/usr/etc:/usr/5bin
+ SWAPFILE='/dev/'`dmesg | grep swap | tail -1 | awk '{print $3}'`
+ DEVSWAP=`pstat -T | grep swap | awk '{print $1}' \
+ | cut -d'/' -f2`
+ if [ "$NOTROOT" = "1" ]; then
+ MACADDR=`dmesg | grep -i "ethernet address" | awk '{ print $4 }' | tail -1`
+ else
+ MACADDR=`ifconfig ie0 | grep ether | tail -1 | awk '{print $2}'`
+ fi
+
+ if [ -z "$MACADDR" ]; then
+ MACADDR="Root access required."
+ fi
+
+ MODEL=`dmesg | egrep "LX|SPARC|4/75|4/50"| tail -1 \
+ | awk '{print $3, $4}'`
+
+ if [ -z "$MODEL" ]; then
+ MODEL=`mach`
+ fi
+
+ MEMORY=`dmesg | grep '^mem' | tail -1 | awk '{print $3}'`
+
+ if [ -z "$MEMORY" ]; then
+ MEMORY="Unknown"
+ fi
+
+ DISKCMD='df -t 4.2'
+ CCOMP="Unknown"
+ ETHERIF=ie0
+ MAILCMD=/bin/mail
+ PRTCMD=lpr
+ PSCMD='ps aux'
+ SWAPSPACE=`pstat -T | grep "swap" | awk '{print $1}' | \
+ awk -F/ '{print $2}'`'K'
+ KERNEL=`strings /vmunix | grep UNIX | awk '{ print $7 }' | \
+ sed 's/#//; s/://'`
+ HOSTID=`hostid`
+ EXPORTFS='showmount -e '$HOSTNAME
+ ;;
+esac
+
+UPTIME=`uptime | sed 's/.*\(up.*\)/\1/' | sed 's/\(.*user[s]*\),.*/\1/'`
+LOADNOW=`uptime | sed 's/.*load average: \(.*\)/\1/'`
+ADMIN=`whoami`
+TIMESTAMP=`date +%m%d%y`
+
+SNFILE=/usr/tmp/`hostname`.sn
+if [ -f "$SNFILE" ]; then
+ SERIALNO=`cat $SNFILE`
+else
+ SERIALNO="Unknown"
+fi
+
+return
+}
+
+
+#
+# To keep from identifying server machines as
+# belonging to an individual, the 'case' statement
+# makes a check and changes LASTLOGIN to "Server"
+# Otherwise, check the first non-root|daemon|lp|UID
+# user of the box. Not failsafe, but as close as
+# I can get.
+#
+Machine_Data(){
+#set -x
+MACHINE=`uname -m`
+OSREV=`uname -r`
+
+case `hostname` in
+ serv01|serv02|serv03|serv04) LASTLOGIN="Server";;
+ *) LASTLOGIN=`$PSCMD | egrep -v "lp|daemon|root|UID" | \
+ awk '{print $1}' | head -1`;;
+esac
+
+#
+# If no one is logged in, check wtmp
+#
+if [ -z "$LASTLOGIN" ]; then
+ LASTLOGIN=`last | grep console | \
+ grep -v "root" | head -1 | awk '{print $1}'`
+fi
+
+#
+# If that fails, see if we have recorded it before
+#
+if [ -z "$LASTLOGIN" ]; then
+ LASTLOGIN=`grep Login /usr/tmp/*.bl | awk '{print $4}'`
+fi
+
+#
+# Alas, we are clueless...
+#
+if [ -z "$LASTLOGIN" ]; then
+ LASTLOGIN="Unknown.."
+fi
+
+if [ "$AUDIT" -eq "1" ]; then
+ DATE=`date`
+else
+ DATE="Dynamic parameter not reported."
+ UPTIME="Dynamic parameter not reported."
+ LOADNOW="Dynamic parameter not reported."
+fi
+
+cat << __EOF__
+
+=======================================
+System Configuration report for `hostname`
+=======================================
+
+Report data
+===========
+Date : $DATE
+Version : $VERSION
+
+Machine data
+============
+Uptime : $UPTIME
+Current load avg : $LOADNOW
+Machine : $MACHINE
+Serial number : $SERIALNO
+HostID : $HOSTID
+Model : $MODEL
+O.S. revision : $OSREV
+Kernel : $KERNEL
+C Compiler revision : $CCOMP
+Memory : $MEMORY
+Swap space : $SWAPSPACE
+Last Login : $LASTLOGIN
+
+__EOF__
+return
+}
+
+
+#
+# NetworkData
+#
+Network_Data(){
+if [ "$AUSPEX" -eq "1" ]; then
+ NOETHERIF=`ax_netstat -i | egrep -v "127.0.0.1|Address|localhost|ni.\*" | \
+ wc | awk '{print $1}'`
+else
+ NOETHERIF=`netstat -i | egrep -v "127.0.0.1|Address|localhost|ni.\*" | wc | \
+ awk '{print $1}'`
+fi
+
+if [ "$SYSTYPE" = "SunOS3" ]; then
+ IPADDR=`ifconfig $ETHERIF | awk '{print $2}'`
+ NETMASK=`ifconfig $ETHERIF | grep inet | awk '{print $4}'`
+ BROADCAST=`ifconfig $ETHERIF | grep broad | awk '{print $6}'`
+ NETMASKCK="255.255.255.0"
+ BROADCASTCK="255"
+
+else
+ IPADDR=`ifconfig $ETHERIF | grep inet | awk '{print $2}'`
+ NETMASK=`ifconfig $ETHERIF | grep inet | awk '{print $4}'`
+ BROADCAST=`ifconfig $ETHERIF | grep broad | awk '{print $6}'`
+ NETMASKCK="255.255.255.0"
+ BROADCASTCK="255"
+fi
+
+$PSCMD | egrep "routed|gated" | grep -v grep > /dev/null
+if [ "$?" -eq "0" ]; then
+ DEFROUTER='<routed|gated running>'
+else
+ DEFROUTER=`netstat -rn | grep default | awk '{print $2}'`
+fi
+$PSCMD | grep ypbind | grep -v grep > /dev/null
+if [ "$?" -eq "0" ]; then
+ YPCLIENT="True"
+else
+ YPCLIENT="False"
+fi
+
+$PSCMD | grep ypserv | grep -v grep > /dev/null
+if [ "$?" -eq "0" ]; then
+ YPSERVER="True"
+else
+ YPSERVER="False"
+fi
+
+NFSMNTS=`$NFSFS | wc | awk '{print $1}'`
+if [ "$NFSMNTS" -gt "0" ]; then
+ NFSCLIENT="True"
+else
+ NFSCLIENT="False"
+fi
+
+EXPORTCNT=`$EXPORTFS 2>&1 | grep -v RPC | wc | awk '{print $1}'`
+if [ "$EXPORTCNT" -gt "0" ]; then
+ NFSSERVER="True"
+else
+ NFSSERVER="False"
+fi
+
+cat << __EOF__
+Network data
+============
+NIS domain : `domainname`
+NIS client : $YPCLIENT
+NIS server : $YPSERVER
+
+NFS client : $NFSCLIENT
+NFS server : $NFSSERVER
+
+ethernet interfaces : $NOETHERIF
+__EOF__
+
+if [ "$NOETHERIF" -gt "1" ]; then
+
+ echo "Name Address Broadcast Netmask"
+ echo "============================================="
+
+ if [ `arch -k` = "aushp" ]; then
+ NSTATCMD='ax_netstat -i'
+ else
+ NSTATCMD='netstat -i'
+ fi
+
+ eval $NSTATCMD | egrep -v "lo0|ni|Ipkts" | while read line
+ do
+ set -f $line
+ IFNAME=`echo $1`
+ IFHOST=`echo $4`
+
+ if [ "$IFHOST" = "none" ]; then
+ IFIPAD="Not_Set"
+ IFMSK="Not_Set"
+ IFBRD="Not_Set"
+ else
+ IFIPAD=`ifconfig $1 | grep inet | awk '{print $2}'`
+ IFMSK=`ifconfig $IFNAME | grep inet | awk '{print $4}'`
+ IFBRD=`ifconfig $IFNAME | grep inet | awk '{print $6}'`
+ fi
+
+ [ -z "$IFIPAD" ] && IFIPAD="Unknown"
+ [ -z "$IFMSK" ] && IFMSK="Unknown"
+ [ -z "$IFBRD" ] && IFBRD="Unknown"
+
+ echo $IFNAME $IFIPAD $IFBRD $IFMSK | \
+ awk '{printf"%-6s %-15s %-15s %-15s\n",$1,$2,$3,$4}'
+ done
+else
+ echo "IP Address : " $IPADDR
+ echo "MAC Address : " $MACADDR
+ echo "Netmask : " $NETMASK
+ echo "Broadcast : " $BROADCAST
+ echo "Default router : " $DEFROUTER
+fi
+echo ""
+
+if [ "$NFSSERVER" = "True" ]; then
+ echo ""
+ echo "============================================="
+ echo "Exported Filesystems"
+ echo "============================================="
+ eval $EXPORTFS
+ echo ""
+fi
+
+return
+}
+
+
+#
+# DiskData
+#
+Disk_Data(){
+
+echo "Disk data:"
+
+echo "================================================================"
+
+if [ "$AUDIT" -eq "1" ]; then
+ echo "Filesystem kbytes used avail capacity Mounted on"
+else
+ echo "Device-File" "Cap." "Mount-Point" | \
+ awk '{printf"%-20s %35s %-20s\n", $1,$2,$3}'
+fi
+
+echo "================================================================"
+
+#
+# Setup a special case for Journal File Systems at HP-UX 10.10
+#
+case $SYSTYPE in
+ HPUX10) bdf -t hfs | grep -v Mounted | \
+ awk '{printf"%-40s %14d %-20s\n", $1,$2,$6}'
+ bdf -t vxfs | grep -v Mounted | \
+ awk '{printf"%-40s %14d %-20s\n", $1,$2,$6}';;
+ *) if [ "$AUDIT" = "1" ]; then
+ $DISKCMD | grep -v Mounted
+ else
+ $DISKCMD | grep -v Mounted | \
+ awk '{printf"%-40s %14d %-20s\n", $1,$2,$6}'
+ fi;;
+esac
+
+case $SYSTYPE in
+ HPUX*) if [ $NOTROOT -eq 0 ]; then
+ swapinfo | grep dev | while [ 1 ]; do
+ read line
+ RC=$?
+ if [ "$RC" != "0" ]; then
+ break
+ fi
+ SWAPFILE=`echo $line | egrep "dsk|lvol" | awk '{print $9}'`
+ DEVSWAP=`echo $line | grep dev | awk '{print $2}'`
+ echo $SWAPFILE $DEVSWAP "swap" | \
+ awk '{printf"%-40s %14s %-20s\n", $1,$2,$3}'
+ done
+ else
+ SWAPFILE="<Must run swapinfo(1) as root>"
+ DEVSWAP=$SWAPFILE
+ fi
+ ;;
+
+ Solar*) swap -l | grep -v swapfile |
+ while [ 1 ];
+ do
+ read line
+ RC=$?
+ if [ "$RC" != "0" ]; then
+ break
+ fi
+ SWAPFILE=`echo $line| grep dsk| awk '{print $1}'`
+ DEVSWAP=`echo $line | grep dev| awk '{print $4}'`
+ echo $SWAPFILE $DEVSWAP "swap" | \
+ awk '{printf"%-40s %14s %-20s\n", $1,$2,$3}'
+ done;;
+
+ SunOS*) echo $SWAPFILE $DEVSWAP "swap" | \
+ awk '{printf"%-40s %14s %-20s\n", $1,$2,$3}';;
+
+ *);;
+esac
+return
+}
+
+#
+# HPUX09_Func
+#
+HPUX09_Func(){
+cat << __EOF__
+
+IOSCAN output data
+==================
+__EOF__
+
+/etc/ioscan -f -b
+patchnum=`ls -1d /system/PH* | wc -l`
+
+cat << __EOF__
+
+Patch Data
+====================================================
+$patchnum Installed patches (from /system/PH*/index)
+====================================================
+__EOF__
+
+
+cd /system
+for PATCH in `ls -1d PH* 2>/dev/null`; do
+ DESC=`grep "fd:" $PATCH/index | cut -d':' -f2`
+ echo $PATCH ":" $DESC
+done
+
+printers=`lpstat -a | grep "accepting" | sort | uniq | wc -l`
+
+cat << __EOF__
+
+==================================================
+$printers Installed printers (from lpstat)
+==================================================
+__EOF__
+
+lpstat -a | grep "accepting" | sort | uniq | awk '{print $1}'
+
+filesets=`ls /etc/filesets | wc -l`
+
+cat << __EOF__
+
+==================================================
+$filesets Installed filesets (from /etc/filesets)
+==================================================
+__EOF__
+ls -C /etc/filesets
+
+echo
+return
+}
+
+
+#
+# HPUX10_Func
+#
+HPUX10_Func(){
+cat << __EOF__
+
+IOSCAN output data
+==================
+__EOF__
+
+/etc/ioscan -f
+
+printers=`lpstat -a | grep "accepting" | sort | uniq | wc -l`
+cat << __EOF__
+
+==================================================
+$printers Installed printers (from lpstat)
+==================================================
+
+__EOF__
+
+lpstat -a | grep "accepting" | sort | uniq | awk '{print $1}'
+
+filesets=`swlist -x one_liner="name revision title" -l product | grep -v "#" | wc -l`
+
+cat << __EOF__
+
+
+==================================================
+$filesets Installed filesets (from swlist -l product )
+==================================================
+__EOF__
+swlist -x one_liner="name revision title" -l product | \
+grep -v "#" | cut -c1-60
+
+return
+}
+
+
+#
+# SOLARIS_Func
+#
+SOLARIS_Func(){
+
+SARSTAT="<NOT Running>"
+if [ -d /var/sadm/sa ]; then
+ logs=`find /var/sadm/sa -mtime -1 -print | wc | awk '{print $1}'`
+ if [ "$logs" -gt "0" ]; then
+ SARSTAT="<Running>"
+ fi
+fi
+VXSTAT="<NOT Running>"
+PSOUT=`$PSCMD | grep vxconfigd | grep -v grep | wc | awk '{print $1}'`
+if [ "$PSOUT" -gt "0" ]; then
+ VXSTAT="<Running>"
+fi
+
+
+cat << __EOF__
+
+Solaris data
+============
+sar(1M) status : $SARSTAT
+Veritas Volume Mgr : $VXSTAT
+
+__EOF__
+
+if [ -x /usr/sbin/vxdg ]; then
+ echo "List Disk Groups"
+ echo "================"
+ vxdg list 2>&1
+fi
+if [ -x /usr/sbin/vxprint ]; then
+ echo
+ echo "Display Configuration Summary"
+ echo "============================="
+ vxprint -S 2>&1
+fi
+if [ -x /usr/sbin/vxstat ]; then
+ echo
+ echo "Volume Statistics"
+ echo "================="
+ vxstat 2>&1 | tail +3 | awk '
+ BEGIN {
+ printf (" OPERATIONS BLOCKS AVG TIME(ms)\n");
+ printf ("TYP NAME READ WRITE READ WRITE READ WRITE\n");
+ }
+ {
+ v = $1
+ n = $2
+ or = $3
+ ow = $4
+ br = $5
+ bw = $6
+ ar = $7
+ aw = $8
+ printf ("%s %-20s %9s %9s %10s %10s %5.1f %5.1f\n", v,n,or,ow,br,bw,ar,aw)
+ }'
+fi
+if [ -x /usr/sbin/vxprint ]; then
+ echo
+ echo "Configuration Details"
+ echo "====================="
+ vxprint -tvh 2>&1
+fi
+
+showrev -p 2>&1 | grep -v 'No patches' | awk '{print $2}' >$TMPFILE
+patchnum=`cat $TMPFILE | wc | awk '{print $1}'`
+
+cat << __EOF__
+
+==================================================
+$patchnum Installed patches (from 'showrev -p')
+==================================================
+__EOF__
+
+if [ $NOPATCHES -eq 0 ]; then
+ cat $TMPFILE
+fi
+
+lpstat -a | grep "accepting" | sort | uniq | awk '{print $1}' >$TMPFILE
+lpnum=`cat $TMPFILE | wc | awk '{print $1}'`
+
+cat << __EOF__
+
+==================================================
+$lpnum Installed printers (from lpstat)
+==================================================
+__EOF__
+
+if [ $NOPRINTER -eq 0 ]; then
+ cat $TMPFILE
+fi
+
+
+pkginfo | sort -b +1 >$TMPFILE
+pkgnum=`cat $TMPFILE | wc | awk '{print $1}'`
+
+cat << __EOF__
+
+==================================================
+$pkgnum Installed packages (from pkginfo)
+==================================================
+__EOF__
+
+if [ $NOPKGS -eq 0 ]; then
+ cat $TMPFILE
+fi
+return
+}
+
+
+#
+# SUNOS_Func
+#
+SUNOS_Func() {
+cat << __EOF__
+
+==================================================
+Installed printers (from lpc stat)
+==================================================
+__EOF__
+
+lpc stat | grep : | cut -d':' -f1
+return
+}
+
+
+# =============================================================================
+# END OF FUNCTION DEFINITIONS
+# =============================================================================
+
+#
+# system-independant functions
+#
+Get_Prog_Name
+
+if [ "$AUDIT" = "0" ]; then
+ exec > /usr/tmp/`hostname`.SysConfig
+fi
+
+Check_User
+Get_Arch
+Define_Vars
+Machine_Data
+Network_Data
+Disk_Data
+
+
+#
+# system-dependant functions
+#
+case $SYSTYPE in
+ HPUX09) HPUX09_Func;;
+ HPUX10) HPUX10_Func;;
+ Solaris) SOLARIS_Func;;
+ SunOS) SUNOS_Func;;
+ SunOS3) SUNOS_Func;;
+ *) ;;
+esac
+
--- /dev/null
+/etc/exports
+/etc/fstab
+/etc/group
+/etc/gshadow
+/etc/host.conf
+/etc/hosts
+/etc/hosts.allow
+/etc/hosts.deny
+/etc/modules.conf
+/etc/passwd
+/etc/resolv.conf
+/etc/shadow
+/etc/sysconfig
--- /dev/null
+#!/bin/sh
+#
+# Create bootstrap information files -- prelude to creating a
+# Bacula Rescue Disk
+#
+# Solaris version
+#
+# Kern Sibbald, December MMII
+# This source distributed under the GPL
+#
+di=diskinfo
+cwd=`pwd`
+host=`uname -s`
+case $host in
+ Linux)
+ echo ""
+ echo "This is the Solaris script. Please use the Linux version."
+ echo ""
+ exit 1
+ ;;
+ SunOS)
+ echo ""
+ echo "This is preliminary code and not yet"
+ echo "tested or guaranteed to work ..."
+ echo ""
+ ;;
+ FreeBSD | IRIX)
+ echo ""
+ echo "This code is not yet adapted to this OS"
+ exit 1
+ ;;
+ *)
+ echo ""
+ echo "Unknown operating system type: $host"
+ exit 1
+ ;;
+esac
+uid=`id | cut -d'(' -f1 | cut -d'=' -f2`
+if [ "$uid" -ne "0" ]; then
+ echo ""
+ echo "You need to be root to run this, otherwise"
+ echo "the results are not optimal. Continuing anyway ..."
+ echo ""
+fi
+
+#
+# First collect information
+#
+echo "Begin collecting system info"
+mkdir -p $di
+cd $di
+mount -p >mount.bsi
+if [ -e /etc/fstab ] ; then
+ cp /etc/fstab fstab.bsi
+fi
+if [ -e /etc/vfstab ] ; then
+ cp /etc/vfstab vfstab.bsi
+fi
+df -tkFnfs >df.bsi
+df -l >dflocal.bsi
+../SysAudit >sysaudit.bsi
+route -n >route.bsi
+ifconfig -a >ifconfig.bsi
+
+
+echo "Done collecting info. Building scripts ..."
+
+#
+# Done collecting information
+#
+
+
+cd $cwd
+
+#
+# Create network start script
+#
+dev=`cat $di/ifconfig.bsi | grep BROADCAST | awk -F: '{print $1}' | head -1`
+ip=`ifconfig $dev | grep inet | awk '{print $2}'`
+cat >start_network <<END_OF_DATA
+#!/bin/sh
+#
+# Start network -- created by getdiskinfo
+#
+ip=$ip
+dev=$dev
+ifconfig leo up
+ifconfig \$dev up \$ip
+route add default gw \$ip dev \$dev
+END_OF_DATA
+
+chmod 755 start_network
--- /dev/null
+#!/bin/sh
+#
+# Script to make a Bacula "rescue" disk
+#
+device=/mnt/floppy
+dev=/dev/fd0
+
+# Print Usage message
+usage () {
+ cat <<END_OF_DATA
+Usage: make_rescue_disk
+ -h, --help print this message
+ --make-static-bacula make static File daemon and add to diskette
+ --copy-static-bacula copy static File daemon to diskette
+ --copy-etc-files copy files in etc list to diskette
+END_OF_DATA
+}
+
+# defaults
+make_bacula=no
+copy_bacula=no
+copy_etc=no
+
+#
+# Process command line options
+#
+for option in "$@" ; do
+ case "$option" in
+ -h | --help)
+ usage
+ exit 0
+ ;;
+ --make-static-bacula)
+ make_bacula=yes
+ copy_bacula=yes
+ ;;
+ --copy-static-bacula)
+ copy_bacula=yes
+ ;;
+ --copy-etc-files)
+ copy_etc=yes
+ ;;
+ *)
+ echo "Unknown option specified: $option"
+ usage
+ exit 1
+ ;;
+ esac
+done
+
+echo ""
+echo "Place a blank diskette in your floppy drive."
+echo "It will be formatted and all data will be lost."
+echo ""
+echo -n "Press return when ready: "
+read a
+umount $device 2>&1 >/dev/null
+if [ $? = 0 ] ; then
+ mounted=1
+else
+ mounted=0
+fi
+mke2fs $dev
+mount $dev $device 2>&1 >/dev/null
+
+if [ x$make_bacula = "xyes" ] ; then
+ ./make_static_bacula
+fi
+
+if [ x$copy_bacula = "xyes" -a ! -e bacula-fd ] ; then
+ echo " "
+ echo "bacula-fd not found. If you want Bacula on this"
+ echo "rescue disk please run \"make_static_bacula\" first."
+ echo "Continuing anyway ..."
+ echo " "
+ exit 1
+ have_bacula=no
+else
+ echo "Stripping and compressing Bacula"
+ strip bacula-fd
+ gzip bacula-fd
+ have_bacula=yes
+fi
+
+echo "Copying files to $device"
+cp -a . $device
+
+if [ x$copy_etc = "xyes" ] ; then
+ echo "Tarring /etc files to $device"
+ tar --create --gzip --file $device/etc.gz --files-from backup.etc.list
+fi
+
+if [ x$have_bacula = "xyes" ] ; then
+ rm -f bacula-fd.gz bacula-fd.conf
+fi
+sync
+if [ $mounted = 0 ] ; then
+ umount $device
+fi