More 2¢ Tips!

Send Linux Tips and Tricks to

Fvwm Buttons

Tue, 18 Jun 2002 15:11:23 +0100 (BST)
Thomas Adam (The LG Weekend Mechanic)
Question by Hans Borg
This is in reply to Help Wanted #5, in issue 79. Thomas replied via the FVWM mailing list. More details about that can be found at: -- Heather


In answer to your question as to why when you press a button on your panel, it stays depessed is to do with the way in which FVWM handles exec() a program via the $SHELL of the $USER.

If command is an fvwm Exec command, then the button will remain pushed in until a window whose name or class matches the quoted portion of the command is encountered. This is intended to provide visual feedback to the user that the action he has requested will be performed. If the quoted portion contains no characters, then the button will pop out immediately.

Note that users can continue pressing the button, and re-executing the command, even when it looks "pressed in."

There is a way around this, and I have found that if you append a "&" character at the end of your command that is bound to the button, then that sometimes solves your problem -- but not always.

Hope I have helped, Kind Regards,

Thomas Adam

-- "The Linux Weekend Mechanic" --


Thanks a lot for taking the time to answer my Q. I actually managed to sort it out some time ago, but you are right. I had some fiddle with the window name.

Best regards
Hans Borg.

Creating WAN "LAN' with one IP Address

Mon, 17 Jun 2002 13:11:03 -0700
Heather Stern (LG Technical Editor)

If I'm given a network address 192.168.7 (Class C) and have to create a WAN with 5 routers, how do I do it?

I can Subnett but the 3rd router keep saying the Network address is already used, when i try to put the subnet address there.

How do i do it.

We have a very good piece on that sort of thing in the back issues. It's called "Routing and Subnetting 101" and is one of the longest postings ever written by Jim Dennis. Several professors have used it in their coursework and even though Linux was much younger then the principles are still valid.

It's in issue 36. A professor asked about it in issue 37's mailbag, and some followups appeared in issues 51 and 59. Of course you could have learned this by typing "Routing and Subnetting" into the Linux Gazette search page:

...and you can easily get to those articles by visiting the Answer Gang Knowledge Base:

customized linux install cd?

Wed, 5 Jun 2002 14:01:28 +0000
linus gasser (ineiti from
Question by simkin1
These are in reply to Help Wanted #1, Issue 79. -- Heather

Hi, I did about this on a RH7.2 but I don't think it'll change this drastically under RH 7.3. You can point your browser to

(sorry for the space in the url...) it even describes how you can add a kernel on your own and get it to run...


Sun, 9 Jun 2002 23:23:44 -0700
Peter Tootill (ptootill from

The easiest way to customise the install is with Kickstart. We have done it (and learned a few things on the way).

Haven't time for a comprehensive reply at present but, if kicksatart hasn't been covered, I could put something together.



Ghostscript fails after printer driver install

Tue, 11 Jun 2002 20:16:54 -0700
Matthew Easton (matthew from
This is in reply to LG 79, Two Cent Tip #4. -- Heather


Rich Price may want to try a Laserjet 4 driver instead of trying to figure out the Xt dependency.

I have the Samsung ML-1450 and it's quite happy pretending to be an HP Laserjet 4.

Matt Easton

quick disaster recovery

Fri, 7 Jun 2002 17:43:22 +0100 (BST)
Mike Martin (the LG Answer Gang)

I may expand this into an article, but for the very common scenario of "no init found" "unable to open an initial console" (usually after hard crash) a couple of possible causes which I have not seen anywhere else

There is a fair chance that files on / have been corrupted wiped including /dev.

Solution (very Rpm specific)

So mount rescue media, check for files on /

if missing mount cdrom from install and do:

rpm -Uvh dev-<version>-rpm

to re-instate dev files

then progressively force re-install rpms until you can boot

Then when you have managed to boot do this:

rpm -Va|grep missing>filename

This will print to a file all the files that are missing from your system according to your rpm database.

Then for all the files given do rpm -qf <filename> which will give you the name of the rpm

Then re-install the rpms in turn.

This is best done manually so you can check whats missing.

Should only take around an hour in total at most.

Certainly preferable to doing a re-install.

I came across this on my own box a while ago after multiple power cuts in succession (I'm poor so no UPS)

The advantage is that your modifications are far less likely to be hosed as in a re-install.


Thu, 30 May 2002 20:12:00 +0200
Robos (the LG Answer Gang)
Question by RosePetal103

To Whom It May Concern:

I went to ebay and found all these used laptops/notebook puters, but I

have no clue which one to select. For example, "Intel Pentium II=AE 366Mhz 290MB RAM 6.1GB HDD CDROM Sound Windows 98 Office 2000 ..."

What does all that mean? And how I go about finding a good, used laptop, like what trait(s) do I search for?

-Thanks ,
Desperately needing laptop

If your question aims at running linux on that thing, compare what has to say to the model you like.


Thu, 30 May 2002 13:48:04 +0100 (BST)
Mike Martin (the LG Answer Gang)

I dont know whether anyone else on the list has used the utility checkinstall available at:

What it is the solution to the problem of maintaining a rpm/deb based system with compiling programs from source

Basically what it does is runs make install and then makes a functional rpm and installs it.

It is not perfect but certainly works well enough to continued use

I regard it now as pretty much indispensible when | am following a project (eg: gnome2)

My feeling is that it ives the flexibilty of using source packages without losing package management


Well, there was some coverage of that utility here in germany in the magazine (print) "linux-user". Seems to be quite nice, I've used it several times and it worked most of the times. Not always, but when it doesn't work you can still fall back to

make install


'crypt' error !!

Wed, 05 Jun 2002 18:16:40 +0530 (IST)
Karl-Heinz Herrman (the LG Answer Gang)
Question by sibabrata

I have got a peculiar problem in hand. Got this code compiled properly in red hat Linux 6.1(g++ compiler version 2.91.66 ) but giving error in red hat 7.1(g++ compiler version 2.96).But if compiled with red hat 7.1(gcc compiler version 2.96) , it is doing perfectly fine.

why this in-consistency ?

Source code: Server.c


g++ -lcrypt server.c

Error: 'crypt' undeclared

Since it seems nobody tried an answer yet I try to add some cents:

You do the right includes (whatever they are, crypt.h problaby), do you? There might be a difference where crypt is stored for gcc and for g++ -- so gcc and g++ might behave differently. Also g++ might might have changed in default location or default behaviour of including C headers. Try to locate crypt.h (or wherever crypt is defined). Is there a g++ version of it? What happens if you put -I ad -L explicitly to the gcc crypt path?

Then crypt is probably compiled by gcc -- this has a different routine name mangling then g++, so you might have to call not crypt but '_crypt' or 'crypt_' or something like that (speaking from very little experience with how to use fortran subroutines in C -- and a peculiar problem lately: if I compiled a subroutine with gcc I got a "..." undefined from the linker. If I compile it with g++ everzthing works.

I would have expected "better" integration with gnu c and c++ -- but there you go.


demand dialing

Sun, 02 Jun 2002 21:30:51 -0500
Jim Bradley (jebradl from
This is in reply to LG 79, help wanted #7. -- Heather

There are two linux versions that I've used as a server for demand dialout for internet access, and both worked well. One is Coyote linux, which is a floppy disk boot version, and can be run on a 386 with numeric coprocessor or a true 486 (or 486sx with numeric coprocessor). I don't recall it's memory requirements. The other version that is good is the mitel (formerly e-smith) at It requires a 586 class processor, but also setsup DNS, and other server functions.

Modem speed and diald

Sun, 9 Jun 2002 17:54:10 -0400
Ben Okopnik (the LG Answer Gang)
Question by Neil Youngman

I've mainly been connecting to the internet using diald, but I've noticed that I'm only getting about 3.5 KBps , whereas on W98 I get about 5KBps. A little experimentation shows that dialling with kppp gives about 5KBps as well.

kppp seems to use an initialisation string of ATM1L1, but changing MODEM_INIT to "ATM1L1" in /etc/diald/connect, didn't improve the performance.

MODEM_INIT started out as "ATZ&C1&D2%C0". I changed "%C0" to "%C3" to ensure that compression was enabled, but this made no difference. I can't find an option in diald to log exactly what's sent to the modem and I can't see any conflicting options in the configuration for pppd.

Any suggestions for how to track down why kppp gets better performance than diald would be appreciated.

The modem is an MRI 56K internal modem.

I'm not sure how you would test this, but I suspect that it's not your PPP connection that's slowing you down - "diald" uses SLIP as a "fake interface" that's always up, which is why you don't get error messages from Netscape and such when you try to connect. It listens for requests, then makes the PPP connection "behind your back". It's been a long time since I've used it, and I'm rather fuzzy on the details, but ISTR that "diald" let you play around with SLIP settings... sorry I can't be of any more help, but that's pretty much the extent of what I remember. I also STR that "diald" had a good set of documents with it which I found very helpful in working around a problem that I had with it. Good luck.

Exchange with Linux

Tue, 4 Jun 2002 11:11:44 -0700
John Helms (jhelms from

Hope this is the right address for answers as well as questions. Regarding Linux Exchange In my quest to use Linux without having to use Windows in our network I discovered a couple of simple solutions.

1. Most any email client will work with a default install of exchange if you enter your login as in the following:


Of course all the group features will not work with this solution but simple email is no problem.

2. You can use a browser with a default install of exchange since it also installs IIS as a webserver. Various browsers will have different degrees of success since of course IE is the "prefered" browser. Type the following in your browser substituting your exchange servers correct IP address:


This will give you access to all the group features if your browser will render the Microsoft proprietary technology. Thanks for reading

John Helms

Grub vs LILO

Wed, 12 Jun 2002 12:55:23 -0500 (COT)
John Karns (the LG Answer Gang)
Question by William J. Terry

Does anyone know what the Grub command is that replaces the LILO command append="hdb=ide-scsi"

It would be the same syntax, minus the "append=".

The append="" stuff is part of the Lilo syntax. Your grub.conf file should look something like:

title Example
        root (hd0,0)
        kernel /vmlinuz ro root=/dev/hda3 hdc=ide-scsi vga=1 console=/dev/tty2 CONSOLE=/dev/tty2
        initrd /initrd-2.4.18-whatever

where you are allowed to use "\" and the end of a line, to mean line continuation.

Email Linux To Windows - a simple solution for reference

Wed, 5 Jun 2002 14:59:05 +0100 (BST)
Mike Martin (the LG Answer Gang)
  1. Set up mail server on Linux with user ids as applicable (exim reads userids from linux box)
  2. Set up fetchmail to poll server at isp
  3. install and activate pop3 server on linux box
  4. poll for mail by pop3 to the linux box account

a more detailed example is at:

linuxconf setup

Sat, 22 Jun 2002 02:37:33 +1000
Serkan Akdag (serkanakdag from
This is in reply to LG 79 help wanted #3. Our reader wondered about setting up ACLs so he could access his Linuxconf remotely without letting everyone else in. -- Heather

That should help you :) Good luck

Kernel Message: VM: Killing resource foo (bar)....

Sat, 08 Jun 2002 17:57:13 +0200
Didier Heyden (the LG Answer Gang)
Question by Thomas Adams, the LG Weekend Mechanic

Hi Gang,

Hello Thomas!

I am wondering if someone would be so kind as to expain to me why I get the following error messgae:

Grangedairy: kernel: VM: killing resource acroread

[ quickly find-grepping that in the kernel source tree ]

Ok, it's in "arch/i386/mm/fault.c". (Actually for 2.4.17 it's "killing process xxx" but I presume it doesn't really matter). It seems to occur whenever a process tries to read something from a memory page which is not accessible because of an out-of-memory condition.

The above message is brought about, by an abnormal exit of the adobe acrobat reader. For some reason, my computer will slow down to a snails pace when I am reading a pdf document,

That's when the system starts swapping out madly. Does it happen with any PDF document, or only really big ones? What if you disable "Use Page Cache" and/or "Allow Background Download of Entire File" in your Acroread preferences (assuming those are currently turned on)?

and then X will kill acroread without any warning.

X itself has nothing to do with the actual killing. It's the way the kernel preserves your system from a total crash. What amount of RAM do you have?

When I check my /var/log/messages file, I get the above message.

What causes this, and what does it mean???

OOM. :) Virtual memory exhausted.

I tried running "strace" on the "acroread" process, but the file ended up being 38.2MB, despite me telling it only to display a certain number of lines :-(

So maybe your PDF document is a resource hog. Or there is some incompatibility between the version of Acrobat Reader installed on your system and your current set of libraries (even Acrobat 5 is dynamically linked, mmph... this has obvious advantages but since their reader is only distributed in binary form...) or some bug in Adobe's product turns it into an self-destructing madsoft.

It yeilded nothing useful, anyway from what I could see.

The kernel's divine intervention in such cases is kinda brutal. Expect the same sort of things as those resulting from a SIGKILL: perhaps the process was "innocently" trying to read() something then it just vaporized into limbo.


Well I hope this'll help you somewhat. :)

-- Didier Heyden.

Parsing Strings To Equations

Fri, 14 Jun 2002 11:19:13 +0200
Didier Heyden (the LG Answer Gang)
Question by V Sreejith

Can anybody in this list suggest a method to parse a string into a mathematical equation and then compute the values according to the equation.I have to do this in C in Linux. Is there any such code available in C.

Is there a similar command in Linux.

I have tried myself a lot.It is getting more and more complex.This is going to the level of a compiler,the task is similar to "how a compiler reads the source code and manipulates it", i also have to do a somewhat similar task.

Yes. Maybe not as complex as a C parser, because the corresponding grammar will probably be much cleaner; but the part of the program which will be dedicated to the symbolic computation won't be easy to write. But if you try with tools such as `flex' and `yacc' (or `bison') the parser itself can be implemented in a relatively short time, at least once you have read enough documentation about those development tools, and thoroughly understood the basic concepts. The related `info' pages are most useful, and finding tutorials and likewise on the net is fairly trivial.

What's interesting with `bison'-based parsers is that one can more easily split such tasks into smaller, independent parts, i.e. separate completely the syntactical analysis of the source code from the rest. For the parser itself, the work essentially consists in writing a correct grammar for the corresponding developed language.

Then I tried google search but didn't find any useful links in C.I haven't done an extensive search.

For symbolic computation LISP-like languages may prove more adequate than C.

Then I contacted you,the answer gang. I thought if somebody here has previously done a similar would be helpful for me if they share it.. or just give me some links to some resources on the net having information about this...

Well, what I'm saying here is nothing more than one possibility among others. Keep in mind that whatever solution you choose, you'll have to invest a good deal of time to fully work it out.

regards sree


-- Didier Heyden.

lpd/lpr problems with serial printer

Tue, 4 Jun 2002 03:25:56 EDT
Doug (Grohne from
Question by Mark Gorat
This is in reply to LG 79, help wanted #6. Rather than solving the problem as asked, Doug suggests a different approach. -- Heather

I have only used lpr over a TCP/IP network. Would it be possible to connect the printer to a serial to ethernet print server (Intel and HP work with Linux)? Then network to the Linux box. And then have all devices/terminals use lpr/lpd.


Mon, 24 Jun 2002 12:20:26 -0300
Raul Dias (raul from
Raul knows which software he should be using instead. -- Heather


From the article:

I am using Mandrake 8.2. I have recently installed a serial printer using a Digi Classic-8 ISA card. . . . I can print to this printer by using 'cat {filename} > /dev/ttyS11' and this works just fine, however I cannot get lpr to print to this printer.

AFAIK, lpd does not come with mdk 8.2. IIRC, no up to date distribution ships lpd anymore. At least they have replaced it with LPRng or CUPS.

I don't use MDK, but I do use Cups which is the default printer system in MDK.

I have two serial printers (ttyS0 and ttyS1) working fine.

All you got to do is to log into http://localhost:631 and add a new printer. Select the proper Serial Port and the most important, set the correct values to the printer. My printers works at 9600 and 4800 only.

This should be more than fine to live test.

If you will keep with lpd, the /etc/printcap is the place to go. The man page for printcap will provide the right arguments for setting the ttyS printer.


Raul Dias

Getting files out of a .rpm file without installing it

Sat, 8 Jun 2002 20:54:01 -0400
Ashwin N (ashwin_n from

Ever wanted to get those files out of a .rpm without installing it? Ofcourse it's easier to just install it, but sometimes it is not possible because a newer version may already be present on the system.

In such cases, the utility "rpm2cpio" can be used to extract the files of the RPM into a cpio archive.

For example:

$ rpm2cpio < xmms-2.4.rpm > xmms.cpio

The files can then be extracted from the cpio file using the "cpio" command. For example:

$ cpio -i -d < xmms.cpio

In this case the files will be extracted with absolute paths into the present directory.

Ben Okopnik (the LG Answer Gang)

A good 2-cents' worth, Ashwin. However, you can do this even easier by selecting the RPM and pressing 'Enter' in Midnight Commander; all the files are under "CONTENTS.cpio", and you can explore the rest of the RPM structure at will. There are also two executable metafiles called "INSTALL" and "UPGRADE"; if you're viewing the file as root, you can do either one simply by scrolling down to them and pressing 'Enter'. The above functionality also applies to Debian's DEB files.

ramdisk and initrd fundamentals?

Wed, 5 Jun 2002 00:59:06 -0700 (PDT)
James Stewart (wartstew from
Question by Steven J. Hathaway
This is in reply to Issue 79, Help Wanted #4 -- Heather

{1st time at this, let's see what happens}

What documentation is available for ramdisk and initrd fundamentals?

When "initrd" is specified in "lilo.conf" and the Linux kernel is configured for ramdisk support, and the system is booted, what ramdisk image is loaded first or at all?

You also need to configure the kernel to do an "initrd" as well as a "Ramdisk" if this is what you wish to do.

The "initrd" image or the kernel ramdisk image?

"initrd" loads first. It loads from the bootloader (LiLo, Loadlin, etc.) while still in "real" mode using the PC's BIOS calls, and loads before the kernel loads. The purpose of the initrd is to provide what ever support files that the kernel might need to find its root file system. Typically people wishing to have a generic boot disk that will boot just about anything can put disk controller drivers, various filesystems, PC-Card drivers and even networking drivers in here. Then the kernel is set to attempt to load all of them, but of course only the ones that match existing hardware will actually load. After this process, the initrd can be destroyed to free up the memory (but I don't know how this is done) as the boot process continues to find the real root filesystem to boot from. This file system can reside on anything the kernel has a driver loaded for, which includes a "ramdisk". I'm not sure if something in initrd may be needed to set up the "ramdisk". After the kernel finishes booting, control is handed off to /sbin/init which then begins executing things in /linuxrc.

In summery: the initrd is loaded using only BIOS and simply saves you from having to compile all these drivers into the kernel, only to have many of them unused and take up memory in the running system. It also the only way to deal with PC-Card devices that might be needed to boot that are only availble as external modules

What programs are responsible for the loading the "initrd" and "ramdisk" root images (kernel or LILO boot.d).

"initrd": is loaded with the bootloader. For the ramdisk, I'm not sure if the kernel can do this automatically, I expect you have to wait until an "init" "rc" script residing in initrd can do it

Note that the Linux kernel does not need LILO in order to load a ramdisk from a second floppy using the same drive.

Right, LiLo is completely out of the picture by this time.

When is "pivot_root" an implicit process, and when must it be explicitly invoked?

Don't know

What is the difference between a LILO specified "initrd" and the kernel specified ramdisk loaded as root?

See the above lengthy paragraph

I have a fundamental problem understanding the relationships between an "initrd" image, ramdisk root image, and the use of /initrd, /linuxrc, and swap-root.

Sorry that I don't have all the answers. In fact I may be wrong in places since I have never really done this sort of thing before.


Linux is the one competitor Microsoft
can't buy,
can't intimidate, and
can't stop.
If Linux were an "it" I might agree with the "one" part, but if you just take Linux as the kernel, it's like saying rotary engines (the natural competitor to the cylinder style) are competing with Ford, and if you don't, then there are a lot of different brand name Linuxen (Linuces?) out here to choose from. Plus I don't think it's fair to forget all the freely usable BSD variants out there. They could make something with a BSD core but they can't force "customer lock-in".
They could "buy" Linux - in the sense of using it commercially - but they wouldn't pay the price we charge (freedom for derivitive works).
Of course since we have so many varieties - and any effort to mention how un-glitzy and unready that Linux thingy is just causes more people to notice it as a possibility - plus the fact that many Linux distros are non commercial and all the parts and then some are easier to get than your average blinkylight at Radio Shack, I have to agree with the last. Look out for that "Palladium" chip trick they're trying to pull though. It sounds just like the Clipper Chip of yesteryear. -- Heather

Mon, 3 Jun 2002 21:10:50 +0200
Lennart Benschop (l.benschop2 from

Did you look at the files ramdisk.txt and initrd.txt in the Documentation subdirectory of the kernel source itself? It may be obvious, but many of your questions seem to be answered here.

The Slackware-style ramdisk at startup (see file ramdisk.txt) is loaded by the kernel from a device (almost always a floppy) where the offset can be specified. This ramdisk remains the root file system throughout the lifetime of the kernel. You can boot the kernel directly from a floppy (just dd the image to /dev/fd0) without a boot loader and still use this type of ramdisk.

The initrd ramdisk is much more flexible, but you do need a real boot loader to use it. It is loaded into memory by a boot loader. All Linux boot loaders (LILO, LOADLIN, SYSLINUX and GRUB) can use this type of ramdisk. The file /linuxrc inside the initrd ramdisk is the first program to be executed. Linuxrc can do any of the following things:

When linuxrc terminates, the real root device (possibly a different ramdisk on /dev/ram2) will be mounted as root and /sbin/init will be run as usual. So the initrd ramdisk will be the root file system only as long as /linuxrc is running. Using this approach you can forget about the older type of startup ramdisk.

Because it is loaded by the boot loader, an initrd ramdisk can be loaded from the floppy image on an El Torrito bootable CD-ROM, while the older type of startup ramdisk can't.

The kernel command line is passed to the kernel by the boot loader (e.g. LILO) as a pointer to a string in memory. The kernel parses various arguments on that command line for itself and can pass the rest as a command line to init.

Just some minor additions:

Further reading: kernel source tree:

-- Lennart

Re: Making executables smaller

Mon, 3 Jun 2002 15:31:16 -0700
John M. Fisk (John.Fisk from

Hello Gals and Guys,

I enjoyed reading the latest batch of 2 cent tips and thought I'd pass along one more small bit of information:

Besides using "strip" to reduce the size of an executable, if you're into compiling from source you can use the "-Os" optimization, which will optimize for size (should work with an respectably recent version of GCC). For the ultimate in downsizing, you can also link your apps against any of a number of libc derivatives. Check for the latest versions of:

Several other similar projects are out there; these were the first to come to mind. Thanks so much.


Linux Journal Weekly News Notes Tech Tips

sending Microsoft Word documents

If someone asks you for a file in Microsoft Word format, don't panic or start to do something dumb, like dual-booting. Just convert the file to HTML, do a cp file.html file.doc and send the ".doc" file. Microsoft Word will automatically import it.

Keeping a persistent session as you log in and out from different terminals

Here's the Ten-Second Guide to screen for people who just don't want to type stuff over when they lose their net connection.

  1. ssh to the server you need to work on.
  2. Type screen.
  3. Do what you need to do. It will be inside a screen session.

When your connection fails:

  1. ssh to the server.
  2. Run screen -r to resume your session where you got cut off.


Outlook to Evolution

Upgrading from Microsoft Outlook to Evolution? To free your address book from Microsoft's proprietary format, just sync it to a Palm Pilot then sync it back into Evolution. (If you have to borrow a friend's Palm Pilot to do this, back it up first with pilot-xfer, then restore when you're done.)

Source: Ari Jort, New York Linux Users Group

Mozilla port paranoia

You've just hooked up a cool web-administered device; you type in the device's IP address and port number, and Mozilla says, "Access to the port number given has been disabled for security reasons." What?

Fix it in Mozilla's all.js configuration file, which probably lives in usr/lib/mozilla/defaults/pref/all.js or somewhere like that. If the banned devices are on ports 1080 and 31337, add the line:

pref("", "1080,31337");

to the all.js file.

Renaming a file that has a special character in the name

Help! I can't rename a file with a special character in its name!

If you have a file called important?file, and the ? is really some character you can't figure out how to type, try this:

ls | grep important?file

Make the pattern after grep long enough that it matches only one file. Then, when the above command matches only one file, go back up and edit the command:

mv `ls | grep important?file` important-file

And you've renamed the file without ever figuring out its true name.

Have Ethernet cables, will travel

The lightest, most compact way to be prepared to hook up to whatever Ethernet connection you find is to carry one regular cable, one crossover adapter and one RJ45 coupler.

             Plug                           Jack

Straight     none, or coupler +             straight cable
             straight cable

Crossover    coupler +                      crossover adapter +
             crossover adapter +            straight cable
             straight cable

This page edited and maintained by the Editors of Linux Gazette Copyright © 2002
Published in issue 80 of Linux Gazette July 2002
HTML script maintained by Heather Stern of Starshine Technical Services,