Linux-Development-Sys Digest #766, Volume #7     Thu, 13 Apr 00 12:13:21 EDT

Contents:
  Re: BDF File Format (Alan Donovan)
  Re: device driver development (Alan Donovan)
  Re: replacing printk() in kernel module ("V.Vijay Kumar")
  how to link to a module? (Eli Cohen)
  Re: Kernel development (Kristian S�derblom)
  Re: Bootdisks, rdev, and root filesystems...aargh! (Martin Kahlert)
  Re: Idea !!! ("Larry Ebbitt ")
  Add to System services list ("V.Vijay Kumar")
  Re: Random system hangs on Compaq P166/2.2.14 (Nix)
  Re: Disableing NCURSES Input ("T.E.Dickey")
  Re: how to link to a module? (Josef Moellers)
  Re: How compatible is Linux with .. Linux (Nick Andrew)
  Re: Getting IP address of self in C? (Nick Andrew)
  Re: device driver development ("Long")
  Re: Bootdisks, rdev, and root filesystems...aargh! ("Viktor Shamov")
  Re: Add to System services list (Alan Donovan)
  Hardware handshaking not working on serial port (Angel Rosario)
  Characterizing the memory usage of a process ([EMAIL PROTECTED])

----------------------------------------------------------------------------

From: Alan Donovan <[EMAIL PROTECTED]>
Subject: Re: BDF File Format
Date: Thu, 13 Apr 2000 10:11:26 +0100

Michael Schoettner wrote:

> I'm searching source code for handling the BDF file 

Try http://www.wotsit.org -- for all your file format needs.


> An e-mail would be great.

But would also suggest you couldn't be bothered to come back here to see
if anyone had replied.


alan


-- 
========================================================================
  Alan Donovan     [EMAIL PROTECTED]    http://www.imerge.co.uk
  Imerge Ltd.      +44 1223 875265

------------------------------

From: Alan Donovan <[EMAIL PROTECTED]>
Subject: Re: device driver development
Date: Thu, 13 Apr 2000 10:14:01 +0100

Long wrote:
> 
> Please help... anyone,
> 
> I am developing a device driver.  Everytime after loading using insmod
> driver.o and it has an error in the driver.  I am forced to reboot the
> system to reload the driver. Otherwise it says "driver.o: a module named
> driver already exists."  Is there anyway that I can undo the loading so that
> I can reload the driver without having to reboot the system.  I try rmmod
> but it says: "rmmod: module driver.o not loaded".  Any suggestion is
> appreciated.

As others have pointed out, rmmod should not be given ".o".

However Rubini advises that you create an ioctl that resets the usage
count so that you can always unload if necessary (with a little custom
code).   Sometimes rmmod will fail even if used properly.

alan


-- 
========================================================================
  Alan Donovan     [EMAIL PROTECTED]    http://www.imerge.co.uk
  Imerge Ltd.      +44 1223 875265

------------------------------

From: "V.Vijay Kumar" <[EMAIL PROTECTED]>
Subject: Re: replacing printk() in kernel module
Date: Thu, 13 Apr 2000 14:50:34 +0530

"Jerome Corre" <[EMAIL PROTECTED]> wrote in message
news:8csc1n$il8$[EMAIL PROTECTED]...
> hi,
>
> I wrote a kernel module in which I use printk to display debug/error
> message. however if while the module is linked to the kernel I change
> the console, (e.g I linked the module from tty3 logged as root, and then
> work on tty 1) the messages appears in the wrong place.
> Is it possible to replace/modify printk so that message appear only on
> tty3? or in a file?
>
> also, is it possible to write at a particular position on the screen,
> (i.e. change the cursor position) from a kernel module
>
> thanks in advance for any help
>
> Jerome


The way this is done is by using current, a pointer to the currently running
task, to get the current task's tty structure. Then, we look inside that tty
structure to find a pointer to a string write function, which we use to
write a string to the tty.

/* printk.c - send textual output to the tty you're
 * running on, regardless of whether it's passed
 * through X11, telnet, etc. */

/* The necessary header files */

/* Standard in kernel modules */
#include <linux/kernel.h>   /* We're doing kernel work */
#include <linux/module.h>   /* Specifically, a module */

/* Deal with CONFIG_MODVERSIONS */
#if CONFIG_MODVERSIONS==1
#define MODVERSIONS
#include <linux/modversions.h>
#endif

/* Necessary here */
#include <linux/sched.h>    /* For current */
#include <linux/tty.h>      /* For the tty declarations */


/* Print the string to the appropriate tty, the one
 * the current task uses */
void print_string(char *str)
{
  struct tty_struct *my_tty;

  /* The tty for the current task */
  my_tty = current->tty;

  /* If my_tty is NULL, it means that the current task
   * has no tty you can print to (this is possible, for
   * example, if it's a daemon). In this case, there's
   * nothing we can do. */
  if (my_tty != NULL)


    /* my_tty->driver is a struct which holds the tty's
     * functions, one of which (write) is used to
     * write strings to the tty. It can be used to take
     * a string either from the user's memory segment
     * or the kernel's memory segment.
     *
     * The function's first parameter is the tty to
     * write to, because the  same function would
     * normally be used for all tty's of a certain type.
     * The second parameter controls whether the
     * function receives a string from kernel memory
     * (false, 0) or from user memory (true, non zero).
     * The third parameter is a pointer to a string,
     * and the fourth parameter is the length of
     * the string.
     */
    (*(my_tty->driver).write)(
        my_tty, /* The tty itself */
        0, /* We don't take the string from user space */
 str, /* String */
 strlen(str));  /* Length */

    /* ttys were originally hardware devices, which
     * (usually) adhered strictly to the ASCII standard.
     * According to ASCII, to move to a new line you
     * need two characters, a carriage return and a
     * line feed. In Unix, on the other hand, the
     * ASCII line feed is used for both purposes - so
     * we can't just use \n, because it wouldn't have
     * a carriage return and the next line will
     * start at the column right
     *                          after the line feed.
     *
     * BTW, this is the reason why the text file
     *  is different between Unix and Windows.
     * In CP/M and its derivatives, such as MS-DOS and
     * Windows, the ASCII standard was strictly
     * adhered to, and therefore a new line requires
     * both a line feed and a carriage return.
     */
    (*(my_tty->driver).write)(
      my_tty,
      0,
      "\015\012",
      2);
  }
}


/* Module initialization and cleanup ****************** */


/* Initialize the module - register the proc file */
int init_module()
{
  print_string("Module Inserted");

  return 0;
}


/* Cleanup - unregister our file from /proc */
void cleanup_module()
{
  print_string("Module Removed");
}

---
I dont know abt writing to a particular position on the screen.

Vijay






------------------------------

From: Eli Cohen <[EMAIL PROTECTED]>
Subject: how to link to a module?
Date: Thu, 13 Apr 2000 11:11:09 +0200

I am writing a module which has a few global functions. How do I link
application code to it?

------------------------------

From: [EMAIL PROTECTED] (Kristian S�derblom)
Subject: Re: Kernel development
Date: 13 Apr 2000 13:05:40 +0300

"Ivan  Van den Bossche" <[EMAIL PROTECTED]> writes:

> 
> Hello everybody,
> 
> Where can I find the right documentation on the WEB to get started with
> Kernel development?  What do I need to know?
> 
> Thanks
> Ivan
> 
> [EMAIL PROTECTED]
> 
> 
> 

Hi!

        I'd like to recommend the Linux Device Drivers book written by
Alessandro Rubini. It's about writing kernel modules (device drivers)
and reading it and trying out the examples will probably give you some
idea about the kernel. Some info about it can be found at

http://www.oreilly.com/catalog/linuxdrive/

kps


------------------------------

From: [EMAIL PROTECTED] (Martin Kahlert)
Crossposted-To: alt.os.linux,comp.os.linux.misc
Subject: Re: Bootdisks, rdev, and root filesystems...aargh!
Date: 13 Apr 2000 10:30:53 GMT
Reply-To: [EMAIL PROTECTED]

In article <[EMAIL PROTECTED]>,
        Anders Larsen <[EMAIL PROTECTED]> writes:
> bob smith wrote:
>> 
>> Take a look at this how-to, linux from scratch how-to, found at:
>> http://www.linuxdocs.org/LDP/LGissue49/misc/beekmans/LFS-HOWTO.html
>> Really great.

Use this instead:
http://www.linuxdoc.org/HOWTO/Linux-From-Scratch-HOWTO.html
Bye,
Martin.

-- 
The early bird gets the worm. If you want something else for       
breakfast, get up later.

------------------------------

Crossposted-To: comp.os.linux.hardware
From: "Larry Ebbitt " <[EMAIL PROTECTED]>
Date: Thu, 13 Apr 2000 07:20:54 -0400 (EDT)
Reply-To: "Larry Ebbitt" <[EMAIL PROTECTED]>
Subject: Re: Idea !!!

On Tue, 11 Apr 2000 12:44:32 -0500, Akbar Avliyaev wrote:

>I'm thinking about making a way to use windows drivers in Linux.
>Have anyone thought about it?
>Is it reasonable/possible?

The programming interfaces are quite different.  They would have
to be rewritten.  If the hardware manufacturer will give you specs,
that's quite reasonable, if not, you would have to reverse-
engineer them and that is probably not legal.

You might want to get in contact with folks who work on Linux
drivers and offer to lend a hand.





Larry - Atlanta - IBM Global Services



------------------------------

From: "V.Vijay Kumar" <[EMAIL PROTECTED]>
Subject: Add to System services list
Date: Thu, 13 Apr 2000 17:24:53 +0530

I want to place my executable file in the system services list. (invoked
thru setup or ntsysv) and control its loading/unloading thru this list. I
tried to place the file in /etc/rc.d/init.d  dir but it didnt showup in the
list. How do I do it?

--
Vijay



------------------------------

From: Nix <$}xinix{[email protected]>
Crossposted-To: uk.comp.os.linux
Subject: Re: Random system hangs on Compaq P166/2.2.14
Date: 12 Apr 2000 22:57:44 +0100

Bill Hayles <[EMAIL PROTECTED]> writes:

> On 11 Apr 2000 13:20:27 +0100, Nix <$}xinix{[email protected]> wrote:
> 
> >It crashes every so often, and a memtest86 soon reveals the problem; if
> >you write 0xFFFFFFF8 to a RAM chip, you should get that back, not
> >0xFFFFFFFF. Every single-flipped-bit surrounded by 1-bits or 0-bits
> >flipped state.
> 
> All I can think of is that this is some sort of parity problem, but I'm

Non-parity RAM :(

> Since this no longer appears to be a Linux specific problem, maybe one
> of the gurus in alt.sys.pc-clone.compaq might be able to help.

It's a no-name, not a Compaq. How much money do you think I've got? ;)

-- 
`ndbm on Linux is an emulation, not the original. It comes in several
 flavours; `slightly broken', `moderately broken', and `totally and
 utterly broken'.' --- Nick Kew

------------------------------

From: "T.E.Dickey" <[EMAIL PROTECTED]>
Subject: Re: Disableing NCURSES Input
Crossposted-To: 
comp.os.linux.development,comp.os.linux.development.apps,linux.dev.c-programming,linux.redhat.development
Date: Thu, 13 Apr 2000 13:07:38 GMT

In comp.os.linux.development.apps Daniel Beer <[EMAIL PROTECTED]> wrote:

> NCurses doesn't take input unless you ask it to, by way of getch() or
> similar.  If it's screwed up your terminal, you can reset it using
> tcgetattr() and tcsetattr().

actually it buffers input, expecting it to be used (though I recall fixing
something in this context a while back - it might have already been fixed
in 5.0)

-- 
Thomas E. Dickey
[EMAIL PROTECTED]
http://www.clark.net/pub/dickey

------------------------------

From: Josef Moellers <[EMAIL PROTECTED]>
Subject: Re: how to link to a module?
Date: Thu, 13 Apr 2000 15:28:34 +0200

Eli Cohen wrote:
> =

> I am writing a module which has a few global functions. How do I link
> application code to it?

A module will become part of the kernel, once it is loaded. There are
only two ways an application can call functions inside such a module:
1) the module supports the standard access methods of drivers, i.e.
read/write/ioctl, or
2) the module has an interface through /proc.
Other than that ... no chance.

-- =

Josef M=F6llers
Fujitsu Siemens Computers
SHV Server DS 1

------------------------------

From: [EMAIL PROTECTED] (Nick Andrew)
Crossposted-To: comp.os.linux.development.apps
Subject: Re: How compatible is Linux with .. Linux
Date: 14 Apr 2000 00:52:32 +1000

In <[EMAIL PROTECTED]> aflinsch <[EMAIL PROTECTED]> writes:
>"Peter T. Breuer" wrote:
>> Possibly. JCL was inflexible gobbledegook.

>gobbledegook perhaps, but very flexible, IF you understand it. Main
>purpose was to seperate ties to i/o from the program, and provide a
>consistrent method to bind files to a program symbolically. Once one
>understands the basic concepts of it, it becomes rather simple.

I think the basic concepts are flawed. It is good to be able to
bind a file to a symbolic name which the program uses, but this
is needed only because the language lacked command-line arguments.

        my-program.pl data/*.txt
        du | sort -n | less
        my-program.pl 6 < infile > outfile  6> otheroutfile

is vastly more flexible than anything JCL has to offer, (except perhaps
//SYSIN DD *) and more concise to boot.

I still laugh at JCL and COBOL for providing weak, flawed flow-of-control
mechanisms. JCL is top-to-bottom with the ability to skip a step
depending on the return value from the last executed step (whichever
one it was!). COBOL falls over because of the '.' used as a statement
terminator and its lack of an ENDIF to provide rudimentary block
structure. My knowledge of COBOL comes from the late '80s and so it is
likely that some extension or revision has been implemented to mitigate
this utter disaster of a language. I never had to write COBOL outside
Uni and I'm sure I'll never have to touch either that or JCL again.

Oh yes, and I have read Brian Kernighan's paper on "Why Pascal Is Not
My Favourite Language" :-) it contains some howlers ...

Nick.
-- 
Pacific Internet                  SP4   Fax: +61-2-9233-6545 Voice: 9253-5762
G.P.O. Box 3400, Sydney NSW 1043        http://www.zeta.org.au/

------------------------------

From: [EMAIL PROTECTED] (Nick Andrew)
Subject: Re: Getting IP address of self in C?
Date: 14 Apr 2000 00:58:15 +1000

In <8cvq82$17$[EMAIL PROTECTED]> "Akbar Avliyaev" <[EMAIL PROTECTED]> writes:
>create a socket, and read ip from socket structure

>[EMAIL PROTECTED] wrote in message ...
>>> How can I get my IP address from C?

Have you tried this, top-poster? You'd have to bind the socket to an
address first; the machine may have several interfaces with different
IP addresses. When you bind the socket to an address the local address
becomes bound to the IP address of the interface through which the
packets will travel (it's probably more complicated inside, but
that's the principle anyway).

Nick.
-- 
Pacific Internet                  SP4   Fax: +61-2-9233-6545 Voice: 9253-5762
G.P.O. Box 3400, Sydney NSW 1043        http://www.zeta.org.au/

------------------------------

From: "Long" <[EMAIL PROTECTED]>
Subject: Re: device driver development
Date: Thu, 13 Apr 2000 08:01:36 -0700

I even tried that (without the .o) and still does not work.  I know that my
driver probably has problem and I believe that that is why rmmod does not
work.  If there is anyway to force rmmod or change any system file to remove
the module w/o having to reboot, I would be happy.


Manoj Patil <[EMAIL PROTECTED]> wrote in message
news:[EMAIL PROTECTED]...
> You must not give the .o extension while removing the loaded kernel module
>
> Florian Heinz wrote:
>
> > Long wrote:
> > >
> > > Please help... anyone,
> > >
> > > I am developing a device driver.  Everytime after loading using insmod
> > > driver.o and it has an error in the driver.  I am forced to reboot the
> > > system to reload the driver. Otherwise it says "driver.o: a module
named
> > > driver already exists."  Is there anyway that I can undo the loading
so that
> > > I can reload the driver without having to reboot the system.  I try
rmmod
> > > but it says: "rmmod: module driver.o not loaded".  Any suggestion is
> > > appreciated.
> >
> > perhaps you should use the name which lsmod shows you as argument for
> > rmmod...
> > e.G. not "rmmod driver.o" but "rmmod driver"...
>



------------------------------

From: "Viktor Shamov" <[EMAIL PROTECTED]>
Crossposted-To: alt.os.linux,comp.os.linux.misc
Subject: Re: Bootdisks, rdev, and root filesystems...aargh!
Date: Thu, 13 Apr 2000 19:25:57 +0400


Anders Larsen ����� � ��������� <[EMAIL PROTECTED]> ...
>bob smith wrote:
>>
>> Take a look at this how-to, linux from scratch how-to, found at:
>> http://www.linuxdocs.org/LDP/LGissue49/misc/beekmans/LFS-HOWTO.html
>> Really great.
>
>Not that great, after all.
>"DNS: Domain 'www.linuxdocs.org' is invalid: Host not found
(authoritative)."
>
ftp://ftp.chg.ru/.5/Linux/redhat/redhat-6.2/doc/HOWTOS/other-formats/html/LF
S-HOWTO-html/LFS-HOWTO.html



------------------------------

From: Alan Donovan <[EMAIL PROTECTED]>
Subject: Re: Add to System services list
Date: Thu, 13 Apr 2000 16:36:05 +0100

"V.Vijay Kumar" wrote:
> 
> I want to place my executable file in the system services list. (invoked
> thru setup or ntsysv) and control its loading/unloading thru this list. I
> tried to place the file in /etc/rc.d/init.d  dir but it didnt showup in the
> list. How do I do it?

man chkconfig.

Write an rc script for it (copy one of those in the init.d directory).
It should support start, stop, status and restart methods. Make sure you
set up the chkconfig line in the initial comment. This determines which
runlevel it will be started in and what order w.r.t other services.

Then run "chkconfig --add myservice" and "chkconfig --list myservice" to
ensure it is linked in. Then change the runlevel.

alan

-- 
========================================================================
  Alan Donovan     [EMAIL PROTECTED]    http://www.imerge.co.uk
  Imerge Ltd.      +44 1223 875265

------------------------------

From: Angel Rosario <[EMAIL PROTECTED]>
Crossposted-To: comp.os.linux.hardware
Subject: Hardware handshaking not working on serial port
Date: Thu, 13 Apr 2000 11:23:06 -0400

I have written a program to redirect output received on ttyS0 into an
internal device. The system sending the serial data sends the data
much faster than my system can process it. This is needed to test
performance, so I can't slow down the other system. I have setup the
serial port to enable CTSRTS and disable XON/XOFF. However, when
looking at a line analyzer connected to the serial port, I see that
the hardware handshaking signals are always on and never change. This
makes us loose data and fail the test.

This is the output of stty on /dev/ttyS0:

     speed 115200 baud; rows 0; columns 0; line = 0;
     intr = ^C; quit = ^\; erase = ^?; kill = ^U; eof = ^D; eol =
     <undef>; eol2 = <undef>; start = ^Q; stop = ^S;
     susp = ^Z; rprnt = ^R; werase = ^W; lnext = ^V; flush = ^O;
     min = 1; time = 0;
     -parenb -parodd cs8 hupcl -cstopb cread clocal crtscts
     -ignbrk -brkint -ignpar -parmrk -inpck -istrip -inlcr -igncr
     -icrnl -ixon -ixoff -iuclc -ixany -imaxbel
     opost -olcuc -ocrnl -onlcr -onocr -onlret -ofill -ofdel nl0
     cr0 tab0 bs0 vt0 ff0
     isig -icanon iexten -echo echoe echok -echonl -noflsh -xcase
     -tostop -echoprt -echoctl echoke

I am under the impression that the hardware handshaking is controlled
by the serial driver and the UART, but I could be wrong. I have looked
at the serial driver and there are two functions throttle and
unthrottle which toggle CTS, but I can't figure out how or who calls
them. Does my application need to get involved in the hardware
handshaking? I looked at tcflow(), but is seems to send ^S and ^Q
characters for software handshaking.

Has anyone experience this? Any information is greatly appreciated!

--
o
Angel
"Those who are possessed by nothing possess everything."




------------------------------

From: [EMAIL PROTECTED]
Subject: Characterizing the memory usage of a process
Date: Thu, 13 Apr 2000 16:03:01 +0100

Hi:

I'm trying to work out where the memory used by a process is
actually going. So far I've got a little Perl script (attached
so you can play with it if interested) which dumps the contents
of /proc/<pid>/maps in a nicer format.

However, some info seems to be missing from /proc/<pid>/maps,
and I can't find it in the kernel ...

Does the kernel keep track of how many pages are actually
*used* in a private mapping (ie. how many pages have been
allocated by a copy on write to the process)?

This looks like a pretty obvious thing to collect, but I
can't find it in the kernel source ... so can anyone help?

Rich.


#-----------------------------------------------------------------------
#!/usr/bin/perl -w

# $Id: mem_breakdown.pl,v 1.1 2000/04/13 12:30:16 rich Exp $

# This little Perl script produces a breakdown of where memory
# is being used by a process.
#
# Usage: mem_breakdown.pl <pid>
#
# Written by Richard W.M. Jones <[EMAIL PROTECTED]> in an attempt
# to find out WTF KDE takes 10 MB to start up.

use Data::Dumper;

die "mem_breakdown.pl <pid>" if @ARGV != 1;

my @maps = ();

open MAPS, "</proc/" . $ARGV[0] . "/maps"
  or die "/proc/" . $ARGV[0] . "/maps: $!";

while (<MAPS>)
  {
    s/[\n\r]+$//;

    if (m/^([0-9a-fA-F]{8})-([0-9a-fA-F]{8}) ([r-])([w-])([x-])([ps]) ([0-9a-fA-F]{8}) 
([0-9a-fA-F]{2}):([0-9a-fA-F]{2}) ([0-9]+)(.*)$/)
      {
        my %hash = (
                    vm_start_hex => $1,
                    vm_end_hex => $2,
                    vm_start => hex($1),
                    vm_end => hex($2),
                    vm_size => hex($2) - hex($1),
                    vm_flags => $3 . $4 . $5 . $6,
                    read => ($3 eq 'r'),
                    write => ($4 eq 'w'),
                    exec => ($5 eq 'x'),
                    shared => ($6 eq 's'),
                    private => ($6 eq 'p'),
                    vm_offset => $7,
                    dev_major_hex => $8,
                    dev_major => hex($8),
                    dev_minor_hex => $9,
                    dev_minor => hex($9),
                    dev_inode => $10
                   );
        if ($11 =~ m,^[ \t]+(/.*)$,)
          {
            $hash{file} = $1;
          }

        push @maps, \%hash;
      }
    else
      {
        die "unrecognized format: $_";
      }
  }

close MAPS;

#print Dumper(@maps);

print "Memory breakdown for process ID ", $ARGV[0], " (", 0+@maps, " maps)\n";
print "----------------------------------------------------------------\n";

# Find the amount of read-only (purely shared) text and data.

my @readonly_maps = sort reverse_vm_size grep { not $_->{write} } @maps;
print "Read-only (purely shared) mappings (", 0+@readonly_maps, " maps):\n";

foreach (@readonly_maps)
  {
    printf ("  %8d bytes @ %08x %s %02x:%02x %-8d %s\n",
            $_->{vm_size}, $_->{vm_start}, $_->{vm_flags},
            $_->{dev_major}, $_->{dev_minor}, $_->{dev_inode},
            exists $_->{file} ? $_->{file} : "(no file)");
  }

# Find the amount of writable (not shared) text and data.

my @private_writable_maps = sort reverse_vm_size grep { $_->{write} && $_->{private} } 
@maps;
print "Private writable mappings (", 0+@private_writable_maps, " maps):\n";

foreach (@private_writable_maps)
  {
    printf ("  %8d bytes @ %08x %s %02x:%02x %-8d %s\n",
            $_->{vm_size}, $_->{vm_start}, $_->{vm_flags},
            $_->{dev_major}, $_->{dev_minor}, $_->{dev_inode},
            exists $_->{file} ? $_->{file} : "(no file)");
  }

# Find the amount of writable (shared) text and data.

my @shared_writable_maps = sort reverse_vm_size grep { $_->{write} && $_->{shared} } 
@maps;
print "Shared writable mappings (", 0+@shared_writable_maps, " maps):\n";

foreach (@shared_writable_maps)
  {
    printf ("  %8d bytes @ %08x %s %02x:%02x %-8d %s\n",
            $_->{vm_size}, $_->{vm_start}, $_->{vm_flags},
            $_->{dev_major}, $_->{dev_minor}, $_->{dev_inode},
            exists $_->{file} ? $_->{file} : "(no file)");
  }

exit 0;

sub reverse_vm_size
  {
    return $b->{vm_size} <=> $a->{vm_size};
  }


-- 
[EMAIL PROTECTED] | Free email for life at: http://www.postmaster.co.uk/
BiblioTech Ltd, Unit 2 Piper Centre, 50 Carnwath Road, London, SW6 3EG.
+44 171 384 6917 | Click here to play XRacer: http://xracer.annexia.org/
--- Original message content Copyright � 2000 Richard Jones ---

------------------------------


** FOR YOUR REFERENCE **

The service address, to which questions about the list itself and requests
to be added to or deleted from it should be directed, is:

    Internet: [EMAIL PROTECTED]

You can send mail to the entire list (and comp.os.linux.development.system) via:

    Internet: [EMAIL PROTECTED]

Linux may be obtained via one of these FTP sites:
    ftp.funet.fi                                pub/Linux
    tsx-11.mit.edu                              pub/linux
    sunsite.unc.edu                             pub/Linux

End of Linux-Development-System Digest
******************************

Reply via email to