Commit Graph

425 Commits

Author SHA1 Message Date
thorpej
b221909e32 Sprinkle some const. 2000-07-14 07:21:50 +00:00
mycroft
caf07dfa04 When unmounting, make sure to free the syncer vnode so that it can be reused. 2000-07-09 00:59:03 +00:00
mrg
20515f2854 <vm/vm.h> -> <uvm/uvm_extern.h> 2000-06-28 02:44:06 +00:00
mrg
e185413725 remove redudant <vm/pmap.h> includes. <vm/pmap.h> -> <uvm/uvm_pmap.h> 2000-06-27 04:18:48 +00:00
mrg
2f159a1bac remove/move more mach vm header files:
<vm/pglist.h> -> <uvm/uvm_pglist.h>
	<vm/vm_inherit.h> -> <uvm/uvm_inherit.h>
	<vm/vm_kern.h> -> into <uvm/uvm_extern.h>
	<vm/vm_object.h> -> nothing
	<vm/vm_pager.h> -> into <uvm/uvm_pager.h>

also includes a bunch of <vm/vm_page.h> include removals (due to redudancy
with <vm/vm.h>), and a scattering of other similar headers.
2000-06-26 14:20:25 +00:00
mrg
c543a66253 remove some redundant <vm/vm_xxx.h> includes 2000-06-25 13:26:19 +00:00
assar
6c734cd283 make vfs_getnewfsid only take one argument and fetch the name of the
filesystem from the supplied mount argument.  also make makefstype
take a const parameter.  update all the callers.
2000-06-10 18:27:01 +00:00
thorpej
a804b492ac Use CMSG_*() properly. 2000-06-05 17:21:38 +00:00
simonb
ab92666f6b Fix a possible kernel memory leak - if the cmdline of a process was
requested after it had started to exit but before it became a zombie
a page of kernel memory wouldn't be free'd.
2000-06-01 13:43:08 +00:00
mycroft
7385963fc9 Stylistic change. 2000-05-29 18:59:51 +00:00
thorpej
21fc65e1a8 sleep() -> tsleep() 2000-05-27 04:52:27 +00:00
simonb
0c59b3c325 Apply patch from Robert Elz in PR kern/10113. This fixes two problems
with procfs's cmdline - from the PR:

	The cmdline implementation in procfs is bogus.  It's possible that
	part of the fix is a workaround of a UVM problem - that is, when
	(internally) accessing the top of the process VM (the end of the
	args) a request for I/0 of a PAGE_SIZE'd block starting at less
	than a PAGE_SIZE from the end of the mem space returns EINVAL
	rather than the data that is available.  Whether this is a bug
	in UVM or not depends upon how it is defined to work, and I was
	unable to determine that.   (Simon Burge found that problem, and
	provided the basis of the workaround/fix).

	Then, the cmdline function is unable to read more than one
	page of args, and a good thing too, as the way it is written
	attempting to get more than that would reference into lala land.

	And, on an attempt to read a lot of data when the above is
	fixed, most of the data won't be returned, only the final block
	of any read.

Tested on alpha, pmax, i386 and sparc.
2000-05-16 13:45:25 +00:00
perseant
f0728fdce1 Change the sementics of the last parameter from a boolean ("waitfor") to
a set of flags ("flags").  Two flags are defined, UPDATE_WAIT and
UPDATE_DIROP.

Under the old semantics, VOP_UPDATE would block if waitfor were set,
under the assumption that directory operations should be done
synchronously.  At least LFS and FFS+softdep do not make this
assumption; FFS+softdep got around the problem by enclosing all relevant
calls to VOP_UPDATE in a "if(!DOINGSOFTDEP(vp))", while LFS simply
ignored waitfor, one of the reasons why NFS-serving an LFS filesystem
did not work properly.

Under the new semantics, the UPDATE_DIROP flag is a hint to the
fs-specific update routine that the call comes from a dirop routine, and
should be wait for, or not, accordingly.

Closes PR#8996.
2000-05-13 23:43:06 +00:00
augustss
bd842961d4 Register, begone! 2000-03-30 12:22:12 +00:00
simonb
45171aaef9 Delete redundant decls of vn_syncer_add_to_worklist(), syncdelay,
filedelay, dirdelay and metadelay - they're in <sys/vnode.h>.
2000-03-30 02:21:49 +00:00
simonb
92701d715c Delete duplicate declaration of atopid(). 2000-03-30 02:20:14 +00:00
simonb
08312317e7 Delete redundant decl of layer_node_create(), it's in layer_extern.h. 2000-03-30 02:19:16 +00:00
simonb
0177c68ba1 Delete redundant decl of fdesc_root, it's in fdesc.h. 2000-03-30 02:16:22 +00:00
jdolecek
88b591be30 Adapt to last VFS changes - add appropriate vfs_done routine. 2000-03-16 19:00:26 +00:00
jdolecek
89015c4648 Add new VFS op routine - vfs_done and call it on filesystem detach
in vfs_detach(). vfs_done may free global filesystem's resources,
typically those allocated in respective filesystem's init function.
Needed so those filesystems which went in via LKM have a chance to
clean after themselves before unloading. This fixes random panics
when LKM for filesystem using pools was loaded and unloaded several
times.

For each leaf filesystem, add appropriate vfs_done routine.
2000-03-16 18:08:17 +00:00
soren
95054da1a1 Fix doubled 'the's in comments. 2000-03-13 23:52:25 +00:00
fvdl
bb4e324508 Fix pasto: some lines of the procfs hash code were copied from the
UFS code, and I forgot to rename the "ihash" variable, causing
weird effects, because 3/4th of the UFS hash table would become
unreachable after procfs was loaded as an LKM.
2000-02-25 22:33:43 +00:00
fvdl
15bb1bd145 At mount/unmount time, add an exec hook to revoke all vnodes iff the
process is about to exec a sugid binary.

To speed up things, use hashing for vnode allocation, like other filesystems
do. This avoids walking the whole procfs node list in the revoke case too.
2000-01-25 21:52:04 +00:00
wrstuden
fab192f2d2 Add overlay, a layered file system which overlays itself on
the underlying fs, rather than exporting it to another part of the
directory name space.
2000-01-20 19:06:13 +00:00
sommerfeld
530432986b Actually nullop is a better idea here 1999-12-12 00:56:29 +00:00
sommerfeld
c7ed8ada64 one more tweak: placebo for VOP_LEASE 1999-12-08 20:05:19 +00:00
sommerfeld
a51f685d41 Add appropriate VOP_FCNTL handlers to deadfs and specfs ops vectors. 1999-12-08 19:16:51 +00:00
sommerfeld
f0cc7a5815 Change to comment (only) indicating what the specfs ops vector is used for. 1999-12-08 18:57:07 +00:00
fvdl
d901f6eae0 Be more careful to block bio interrupts for some data structures. There
were at least a few missed cases where vp->v_{clean,dirty}blkhd were
unprotected since the softdep/trickle sync merge.
1999-11-23 23:52:40 +00:00
fvdl
0b1963121a Add Kirk McKusick's soft updates code to the trunk. Not enabled by
default, as the copyright on the main file (ffs_softdep.c) is such
that is has been put into gnusrc. options SOFTDEP will pull this
in. This code also contains the trickle syncer.

Bump version number to 1.4O
1999-11-15 18:49:07 +00:00
wrstuden
092a6ee985 Since we don't put layered device nodes in the spechash hash chains,
initialize vp->v_hashchain to NULL.
1999-10-25 23:34:31 +00:00
fvdl
d369311766 Remove some mentioned members in the vop {un}lock args struct that we
do not actually have.
1999-10-23 19:34:50 +00:00
wrstuden
e682a080e9 In spec_close(), if we're not doing a non-blocking close and VXLOCK is
not set, unlock the vnode before calling the device's close routine and
relock it after it returns. tty close routines will sleep waiting for
buffers to drain, which won't happen often times as the other side needs
to grab the vnode lock first.

Make all unmount routines lock the device vnode before calling VOP_CLOSE().
1999-10-16 23:53:26 +00:00
thorpej
8772062270 Make /proc/self a symlink to /proc/curproc. I've observed Linux programs
that expect /proc/self/cmdline to exist.
1999-09-02 23:33:45 +00:00
sommerfeld
197579af47 Change variable used for directory offset from "int" to "off_t".
Overkill, but avoids a host of truncation problems.
1999-08-25 14:42:35 +00:00
sommerfeld
2e649e46d3 Fix PR8270:
Problem turned out to be due to improper handling of reads beyond EOF:
they should just return without error with the uio unchanged, and the
caller will recognize this as a zero-byte return (EOF).

The previous fix to protect directory reads against bogus uio_offset
values returned EINVAL, which broke mount -o union, which only
union'ed in the lower directory if the upper directory cleanly
returned EOF.

While we're here, protect kernfs as well.
1999-08-24 23:29:08 +00:00
wrstuden
e4a256cf0c Fin uninitialized variable use noted by Simon Burge. 1999-08-16 21:24:53 +00:00
christos
582a6def8b protect against large uio_offset 1999-08-14 02:20:19 +00:00
christos
063e3b9f0f protect against large uio_offsets 1999-08-14 02:17:17 +00:00
wrstuden
3bf14d81e9 Add support for fcntl(2) to generate VOP_FCNTL calls. Any fcntl
call with F_FSCTL set and F_SETFL calls generate calls to a new
fileop fo_fcntl. Add genfs_fcntl() and soo_fcntl() which return 0
for F_SETFL and EOPNOTSUPP otherwise. Have all leaf filesystems
use genfs_fcntl().

Reviewed by: thorpej
Tested by: wrstuden
1999-08-03 20:19:16 +00:00
sommerfeld
d96e35f23c Fix PR4439: directory link count in unions where only upper directory
exists is bogus.  The goal here is to produce a synthetic link count
which won't confuse fts and similar routines which "know" that
directories with a link count of 2 don't have subdirectories (and
thus, they can avoid having to stat every entry in the directory
looking for subdirectories which aren't there).

We know that non-UNIX filesystem implementations may return a link
count of `1' for directories with an indeterminate number of
subdirectories; if either the upper or lower layer returns a link
count of `1', return a link count of 1.  If both layers return a link
count of 2, return a link count of 2; otherwise, return the sum of the
link count of both layers.

Also, fix PR7430: unionfs ignores read-only mounts.  Check for
MNT_RDONLY in union_lookup (more-or-less as in layer_lookup) as well
as union_access() and union_setattr().

Note that a read-only union layer may still cause side effects on the
underlying filesystems...  Most notably, we'll still attempt to create
shadow directories in the upper layer.  Also, of course, we'll
side-effect atimes in the lower layer.
1999-08-01 23:16:34 +00:00
sommerfeld
cb448a064d Fix PR5146: reboot with working directory in unionfs causes
"panic: lockmgr: using decommisioned lock"
(only if DIAGNOSTIC)

The problem turned out to be due to the way LK_DRAIN was (not) handled
in union_lock; it just got passed through to the lock on the upper
vnode (which got marked as decommissioned, instead of that happening
to the union vnode.  When the upper vnode was next locked (typically
when it was released), it went kaboom.
1999-08-01 00:00:57 +00:00
sommerfeld
29469abdbd On forced unmount, do a few passes of non-forced cleanups and then do
a single forced pass.  Along for the ride with PR5146 fix.
1999-07-31 23:56:15 +00:00
thorpej
fc04cf9982 Add calls to lock the proclist as appropriate. 1999-07-25 18:33:47 +00:00
thorpej
2715b812d1 Rework the process exit path, in preparation for making process exit
and PID allocation MP-safe.  A new process state is added: SDEAD.  This
state indicates that a process is dead, but not yet a zombie (has not
yet been processed by the process reaper).

SDEAD processes exist on both the zombproc list (via p_list) and deadproc
(via p_hash; the proc has been removed from the pidhash earlier in the exit
path).  When the reaper deals with a process, it changes the state to
SZOMB, so that wait4 can process it.

Add a P_ZOMBIE() macro, which treats a proc in SZOMB or SDEAD as a zombie,
and update various parts of the kernel to reflect the new state.
1999-07-22 18:13:36 +00:00
thorpej
7f53187a85 From Bill Studenmund: unlock the fdescfs "/dev/tty" vnode before calling
cttyread()/cttywrite(), and lock it again when it returns.

Squashes the somewhat bizarre lossage I was observing w/ more(1), sudo(1),
etc.
1999-07-19 23:00:47 +00:00
wrstuden
a0f2937049 Define VLAYER and make layered fs's set this flag when creating their vnodes.
getnewvnode now checks this bit, and it if's set makes sure a vnode's not
locked before removing it from the free list.

Closes PR 7954 by Alan Barrett <apb@iafrica.com>.
1999-07-15 21:30:31 +00:00
thorpej
f9b0db3013 Fix a paste-o in procfs_lookup() introduced with the vnode locking changes.
Fixes PR #7961, Mario Kemper <magick@bundy.lip.owl.de>.
1999-07-14 23:52:22 +00:00
wrstuden
b7f5310486 Fix tyop pointed out by Chuck Silvers <chuq@chuq.com>. 1999-07-12 16:37:03 +00:00
wrstuden
9fc36d6807 Bump osrelease to 1.4E. Add layerfs files, remove null_subr.c.
Update coda to new struct lock in struct vnode.

make fdescfs, kernfs, portalfs, and procfs actually lock their vnodes.
It's not that hard.

Make unionfs set v_vnlock = NULL so any overlayed fs will call its
VOP_LOCK.
1999-07-08 01:26:21 +00:00
wrstuden
9866514df5 Introduce layer library in genfs. This set of files abstracts most of
the functionality of nullfs. The latter is now just a mount & unmount
routine, and a few tables. umapfs borrow most of this infrastructure.

Both fs's are now nfs-exportable.

All layered fs's share a common format to private mount & private
vnode structs (which a particular fs can extend).

Also add genfs_noerr_rele(), a vnode op which will vrele/vput
operand vnodes appropriately.
1999-07-08 01:18:59 +00:00
perseant
c951c272b0 Fixes PR #1206, by setting va_mode and va_flags in the copied-up vnode's
attributes.
1999-06-25 19:05:49 +00:00
wrstuden
96321000fc Remove explicit references to null_bypass (used in umap_lock() and
umap_unlock()) so as to not explicitly depend on nullfs being compiled
into the kernel.

umap_bypass won't be too slow as there are no credentials in these two ops
to need mapping.
1999-05-17 20:29:05 +00:00
thorpej
e3669c3393 Add "use counting" to file entries. When closing a file, and it's reference
count is 0, wait for use count to drain before finishing the close.

This is necessary in order for multiple processes to safely share file
descriptor tables.
1999-05-05 20:01:01 +00:00
thorpej
e9d133eb3b Adjust for cwdinfo changes. Pointed out by Bernd Ernesti. 1999-05-02 00:18:31 +00:00
thorpej
ce5ede558e Fix excessive memory usage, and fix handling of SZOMB processes. PR #7164,
Jaromir Dolecek.
1999-04-27 06:02:09 +00:00
drochner
10bc77390d remove unneeded <vm/vm_object.h> 1999-04-10 14:00:38 +00:00
wrstuden
636995172d Make message about not loking a vnode in nullfs_create a little quieter -
now only enabled if NULLFS_DIAGNOSTIC and no longer if DEBUG or DIAGNOSTIC.
1999-04-09 17:27:38 +00:00
bouyer
e045fbf363 We must handle MNT_NODEV at open time, so add an open op for null and union,
and do proper checks in union_open(). Fix to nullfs from OpenBSD, extended
to umap and union by me.
1999-03-25 13:05:41 +00:00
sommerfe
ef07055d58 Disallow tracing of processes unless tracer's root directory is at or
above tracee's root directory.
1999-03-25 04:45:56 +00:00
sommerfe
b6c36d0fe4 fix union node lock to sleep on something it'll be woken on.. 1999-03-24 05:53:59 +00:00
mrg
d2397ac5f7 completely remove Mach VM support. all that is left is the all the
header files as UVM still uses (most of) these.
1999-03-24 05:50:49 +00:00
sommerfe
36dc99adac vinvalbuf, called from vclean, could cause a locking-against-self
deadlock in VOP_FSYNC() if the unreferenced vnode picked for
reclamation happened to be stacked on top of a vnode the process
already had locked.  This could happen if the same filesystem was
accessed both through a union mount and directly; it seemed to happen
most frequently when the direct access was through NFS.

Avoid this deadlock by changing vinvalbuf to pass a new FSYNC_RECLAIM
flag bit to VOP_FSYNC() to indicate that a reclaim is in progress and
only a `shallow' fsync is necessary.

Do nothing in *_fsync() in umapfs, nullfs, and unionfs when
FSYNC_RECLAIM is set; the underlying vnodes will shortly be released
in *_reclaim and may be reclaimed (and fsync'ed) later.
1999-03-22 17:24:19 +00:00
perseant
247156f4d2 Apply patch from kern/5538:
Fix group mapping so members of group 0 get other group-ids mapped as well.
Avoid rename panic by checking (*this_vp_p) against NULLVP before
dereferencing it (same change as to NULLFS some time ago).
1999-03-19 21:46:25 +00:00
thorpej
195403fe38 malloc the arg temporary buffer, rather than declaring it as an automatic
array of ARG_MAX size.  ARG_MAX is currently 256k, which causes a rather
serious stack overflow (kernel stacks are not very large, usually 8k).

Fixes memory corruption problems observed after accessig /proc/1/cmdline
during tests.  Problem in my case manifested itself as massive lossage
in ffs_sync(), resulting in a crash, and sometimes, pooched file systems.

XXX This could, and probably should, be rewritten to use a much smaller
temporary buffer, and a loop around uiomove().
1999-03-13 22:26:48 +00:00
thorpej
4865d6ff88 Some changes to `cmdline' to make it work properly:
- Don't error out on P_SYSTEM or SZOMB processes; instead, do what ps(1)
  would do, i.e. the p_comm in parenthesis.
- Use uvm_io() (or procfs_rwmem() if !UVM) to read the target process's
  psstrings and argument vector.  Using copyin() is problematic, because
  it operates on the current processes!  That is, the old code would
  always get the `cmdline' of the process reading the file, not that of
  the target process.
1999-03-13 01:01:30 +00:00
thorpej
5e7b128211 Expose procfs_rwmem(). (This function will go away entirely when we
delete Mach VM.)
1999-03-13 00:57:13 +00:00
christos
8aa2fc5ab8 PR/7143: Jaromir Docelek: Add procfs/cmdline from Linux emulation 1999-03-12 18:45:40 +00:00
bouyer
0a2d2af9e0 Restrict umap mounts to root. Letting any user use this has security
implications.
1999-03-12 18:16:44 +00:00
mycroft
b174019ccc Pass null pointers to VOP_UPDATE rather than having all the callers fetch the
current time themselves.
1999-03-05 21:09:48 +00:00
wrstuden
862a56e88b Modify vfsops to seperate vfs_fhtovp() into two routines. vfs_fhtovp() now
only handles the file handle to vnode conversion, and a new call,
vfs_checkexp(), performs the export verification.
1999-02-26 23:44:43 +00:00
wrstuden
0078fc50dc Modify VOP_CLOSE vnode op to always take a locked vnode. Change vn_close
to pass down a locked node. Modify union_copyup() to call VOP_CLOSE
locked nodes.

Also fix a bug in union_copyup() where a lock on the lower vnode would
only be released if VOP_OPEN didn't fail.
1999-02-26 23:38:55 +00:00
is
fde637530e Machine independent part of fix for PR 6152 (gdb doesn't work on machines
with UVM and seperate I&D-Cache). Mostly by Michael Hitch, but pass struct
proc * instead of the pmap. Reason: said machine will need a method to do
the syncing operation for "curproc", too; this way more code can be shared.
1999-02-25 21:54:53 +00:00
msaitoh
1f5b9b4d63 sprintf->snprintf 1999-02-03 05:05:03 +00:00
drochner
7847c0f52e make it compile with !UVM 1999-01-28 21:18:00 +00:00
msaitoh
ea669760d6 Add /proc/#/map. From FreeBSD. 1999-01-25 02:20:08 +00:00
wrstuden
c7fc6c74ca Oops. That extra "*" doesn't need to be there. 1999-01-15 22:04:44 +00:00
wrstuden
872d72e705 In nullfs_mount, we need to check if error before VOP_UNLOCK(vp,0) as
vp is initialized iff error==0 in null_node_create.
1999-01-13 01:51:37 +00:00
matt
32a315ff7c Use the so_send and so_receive funcptrs in the socket instead of calling
sosend/soreceive directly.  [I've been meaning to commit these for months.]
1998-10-31 01:18:41 +00:00
ross
e1b25b7bd6 Make spec_write() process errors and return them, otherwise we don't even
notice things like hitting the end of a partition or device.  (To be sure,
writes to block special files are rare, but as long as we support them...)
1998-10-02 00:21:39 +00:00
jonathan
fcf7a78c02 Workaropund fix for PR #5239 from <minoura@kw.netlaputa.ne.jp>:
stop  null_node_create() from locking the nullfs mountpoint  multiple
  times. Avoids a guaranteed, repeatably "locking against myself" panic
  during mount of a nullfs filesystem.  nullfs filesystems are still as
  buggy as ever (e.g., see PR# 4907) but this you at least mount them.
1998-09-30 06:50:10 +00:00
thorpej
970e60efb8 - Use proclists[], rather than checking allproc and zombproc explicitly.
- Add some comments about locking.
1998-09-08 23:50:13 +00:00
thorpej
7cc905f5c8 Add some braces to make egcs happy (ambiguous else warning). 1998-08-18 06:27:01 +00:00
kleink
5350df2953 Per POSIX, fail with EINVAL if advisory locking is attempted on a file type
that doesn't support it, rather than using a homegrown EBADF or EOPNOTSUPP.
1998-08-13 10:06:31 +00:00
kleink
bf1863d17b Add genfs_einval(), which does the obvious thing. 1998-08-13 09:59:52 +00:00
eeh
a2dd74ed79 Merge paddr_t changes into the main branch. 1998-08-13 02:10:37 +00:00
matthias
574106c52b create miscfs/genfs/genfs_vnops.c:genfs_enoioctl and make all the other
filesystems use it instead of a private version.
1998-08-10 08:11:10 +00:00
perry
4522c799a1 bzero->memset, bcopy->memcpy, bcmp->memcmp 1998-08-09 20:51:08 +00:00
kleink
12a866151b Recognize _PC_SYNC_IO. 1998-08-03 14:19:57 +00:00
lukem
786b86d71b use AF_LOCAL instead of AF_UNIX 1998-07-18 05:04:35 +00:00
jonathan
d275e56dee * defopt COMPAT_{09,10,11,12,13} and COMPAT_NOMID.
TODO: revisit interaction between native compat and emul compat usage.
1998-07-05 08:49:30 +00:00
thorpej
961f0708b1 - Rename nqnfs_vop_lease_check() to genfs_lease_check(). If NFSSERVER is
not in the kernel, genfs_lease_check() is simply a no-op.  This allows
  LKM'd file systems to be exported (previously did not work properly
  due to a compile-time decision based on -DNFSSERVER).
- defopt NFSSERVER
1998-06-25 22:15:28 +00:00
sommerfe
7ba7fbbb23 Always include fifos; "not an option any more". 1998-06-24 20:58:44 +00:00
sommerfe
becaafeea0 defopt for options FIFO 1998-06-22 22:00:59 +00:00
cgd
651b44e211 Rework the way kernel include files are installed. In the new method,
as with user-land programs, include files are installed by each directory
in the tree that has includes to install.  (This allows more flexibility
as to what gets installed, makes 'partial installs' easier, and gives us
more options as to which machines' includes get installed at any given
time.)  The old SYS_INCLUDES={symlinks,copies} behaviours are _both_
still supported, though at least one bug in the 'symlinks' case is
fixed by this change.  Include files can't be build before installation,
so directories that have includes as targets (e.g. dev/pci) have to move
those targets into a different Makefile.
1998-06-12 23:22:30 +00:00
kleink
382743ada3 Convert fsync vnode operator implementations and usage from the old `waitfor'
argument and MNT_WAIT/MNT_NOWAIT to `flags' and FSYNC_WAIT.
1998-06-05 19:53:00 +00:00
kleink
a32a338757 * Convert fsync vnode operator implementations and usage from the old
waitfor argument and MNT_WAIT/MNT_NOWAIT to flags and FSYNC_WAIT.
* In genfs_fsync(), honor the FSYNC_NODATA flag.
1998-06-05 19:52:59 +00:00
fvdl
8ccdc78ffc Since the interlock has been unlocked, also clear LK_INTERLOCK from
a_flags in order to not confuse the layer that is called through
the following VCALL.
1998-05-18 16:47:37 +00:00
pk
097731676e dead_lock() must unlock `v_interlock'. 1998-05-18 14:36:46 +00:00
fvdl
811dba68c1 procfs_readdir: in case of error, check if cookies actually have
been allocated before freeing them. From Wolfgang Solfrank.
1998-04-21 16:36:37 +00:00