-*- Mode: Outline -*-

Things to be done on Hurd, that we should probably not punt to a volunteer.

Priorities:
  Check the end of this file for a task list referring to the next
  public release.

  Reported bugs generally have top priority.
  Non-reported and non-encountered bugs (things we know don't work,
    but don't really impede things) have lower priority.
  Things in this file are ranked with one to three !; the more, the
  higher priority.

See `tasks', the exported task list.

* RMS dictates:
** O_RDONLY==0
** "user-friendly" naming scheme for /dev

* Settle termcap v. curses with rms et. al.
* Contents of =pending-changes.
* Make sure all the pieces of the Hurd have adequate version stuff. !
* syslogify everything !
* fix root dependencies in filesystem, network, etc. !
* Profile things !!
* Make for easier installation !
* Write coding standards suggestions for Hurd
* Implement file_fetch_dir
* Conform to coding standards (esp. CFLAGS setting)
* Internationalization !
* Use hostid in /etc/rc and mention it in installation instructions,
  when suitable sh-utils is released.

* Fix emacs/src/unexelf.c to deal with occasional lack of mmap !

* Libraries

** general:
*** implement all the pathconf things from Posix.1 right.

** libmom work:
*** Hack interface definitions so that args are mom-ish
*** Change libports and libpager to be mom-ish
*** Change servers to be mom-ish

** libc:
*** convert to use libio (note exec needs conversion too) !!!
*** Version of tmpfile that takes a directory
*** Hurd versions of tmpfile that don't create transient files !
*** flink
*** make sure profiling works !!
*** implement revoke once io_revoke is added. !!
*** add chflags flags to appropriate header(s)
*** declare reboot() somewhere.
*** extra commas in enums in socket.h and errnos.h.
*** emacs, on standalone system, with no nsswitch.conf, crashes.

** libports:
*** Get rid of general `uninibited-rpcs' mechanism in libports, & just
    special-case interrupt_operation. !

** libstore:
*** Add lock protocol for mutable stores.

** libfsserver/libnetfs:
*** convert libnetfs to libfsserver

** libnetfs
*** Support --readonly, --writable, and --update !
*** Implement dir_reparent.

** libpager:
*** Put user-defined fns into a callback struct passed to pager_create. !
*** Make libpager paging interface able to read/write multiple pages at once.
*** Remove pagers from portset if there are too many incoming requests to
    avoid forking too many threads. !
*** flush functions don't actually force pending delayed copies. (and in
    fact, they seem to block if a delayed copy is wired down) !

** libshouldbeinlibc:
*** Merge contents of libshouldbeinlibc that belong there into libc.
   Rename the rest to libhurdutil or somesuch.
*** argp: find some way to flag certain long options as only matching
   exactly (add this as OPT_EXACT); use this on the built in option
   --program-name.
*** Rewrite argp to do its own parsing.  Preferably, split up libc's
   getopt into more primitive functions, which both argp and getopt
   can call.

** libdiskfs
*** file_chflags does not do proper permission checking (non-root isn't
    supposed to be able to change the low bits)
*** Add the short-circuited-but-not-builtin translator startup code from
    dir-lookup to fsys_getroot.  Compare and match carefully these two
    routines and then share common code. !!
*** Implement Posix O_SYNC, O_DSYNC, and O_RSYNC under the right
    names; change libc header to match current Posix.
*** Handle dead name notifications on execserver ports. !
*** Deal correctly with setting the translators on /servers/exec.
*** Implement file_notice_changes.
*** Implement async I/O. !
*** Think of a way to have when-to-sync-nodes be more flexible so it can
    be done right for each format.
*** Check when-to-sync-nodes carefully against BSD 4.4 ufs implementation. !
*** Provide for MNT_NODEV, etc. !
*** Implement io_restrict_auth correctly. !
*** Use off_t correctly. !!
*** Add a consistent message printing facility for filesystems to use
    (syslog, but takes special care when the root file system?). !!
*** Some of diskfs_readonly_changed in ufs/ext2fs should be in generic
    routines. !


** libfshelp
*** Put functions here to deal with directory and file change notifications !!!
*** Translator startup should provide a more useful stdin/stdout than nothing !

** libtrivfs
*** Allow for read/write/exec to be passed down.
*** Implement file_exec when appropriate. !!
*** Provide for the visible owner, etc., to be held in command-line args
    instead of the underlying node, when it's important. !!

** libps
*** Add option to print values times with a delay,
    and to print values relative to last printing.
*** Whizzier columnation (autosizing?)
*** Make getters more robust.

* Servers
** write default pager !!
** Implement goaway in all the servers that don't already have it. !!
** (init) sleep on spinning gettys !
** Add calls to various servers to return interesting statistical information.
** Test new-fifo & make it fifo. !
** Login/utmp?
** fifos are flaky.  ?? Details ??
** pflocal: make peer addresses work?
** term: find a way to reduce duplicate signals from repeated VINTR input
** magic: `ls -ld /dev/fd' and `test -d /dev/fd' should work.

** exec:
*** convert stdio magic to use libio (when libc converts) !!!

** proc:
*** Add a version of proc_wait usable by non-parent processes, and use it in
    gdb; maybe just a flag WNOREAP to proc_wait that doesn't reap and allows
   anyone to use it.  !!
*** Add proc_get_tty() [returns tty opened with no flags], so that ps can be
    non-suid. !
*** add timeouts to all the msg_* calls proc makes. !
*** proc seems to acquire three dead-names per fork/exec/exit cycle !!!

** pfinet
*** Allow multiple pfinets to arp on the same ethernet interface for different
    IP addresses. !!
*** Diagnose why shutdown doesn't close TCP channels properly or reliably. !
*** select for read on a UDP socket seems never to return. !!!
*** Undefined functions at the end of pfinet/io-ops.c. !!

** nfs
*** Implement async I/O !!
*** Finish work to turn on paging. !!
*** Implement TCP nfs. !
*** Implement V3 nfs.
*** Implement nqnfs. !
*** Add Hurd-specific calls. !!
*** errors in mount_root should get reflected more usefully to users. !

** storeio:
*** Make a server (/servers/storeio?) to share multiple storeio nodes
*** Get rid of global DEVICE variable and use the trivfs control hack
*** Serverify, ala new-fifo.

** ufs:
*** Implement clustering, a la 4.4-lite sys/kern/vfs_cluster.c.
*** Make file_get_storage_info work for files with indirect blocks. !!
*** Optimizations:
    pager.c/inode.c/libdiskfs count pager refs separately and then save
      mappings in _diskfs_rdwr_internal and dir.c  !
*** Problems with DT_* hack: !
****   Fix multiple-links DT_* bug.
****   Deal with change of type which should update directory.
****   Type is also wrong for translated nodes...
*** Roland sez: ENOSPC detection flaky in ufs.  Try write of >page,
    non-page-multiple, when free space allows write size but not
    round_page (write size).

** ext2fs
*** Try to write directories with 512-byte record boundaries. !!
*** Maybe file_pager_write_page should be able to accurately reproduce holes
*** Add byte-swapping. !!
*** If the target of a symlink is the empty string, stat seems to spin forever !!!

** crash
*** Write core files. !!


* Utilities
** Write a real mount program. !!
** Make id, et. al. work with no/multiple uids. !!!
** Make things work with the `nobody' mode bits: chmod, ls, ... !
** Make things work with filesystem extensions (author, etc.): ls!!!
** Make things work better with translators, e.g., tar... !!!
** Fix bash to turn on interrupts around syscalls more generally,
    especially chdir. !!
** talk doesn't work !!
** login: Make --retry work correctly when invoked via a suid shell
    script by other than root (it doesn't now if the script specifies
    --retry="$0" because the exec server will use /dev/fd/N for name,
    and child_lookup() doesn't supply more than fds 0-2). !!
** Grub doesn't deal with symlinks properly. !!!
** Make w use utmp's tty instead of the process's
** Write passwd.

** fsck:
*** fsck should use fsys_get_options returned device instead of /etc/fstab !!

** settrans:
*** needs an option to make the active go away without using goaway. !
*** -P should print the pid of the translator before pausing !

** ps:
*** ps should timeout quickly (one second?) on non-responsive message ports. !
*** help displays for: stat letters, format specs.
*** --match option?
*** fetch and print task (and thread?) startup times.

** gdb:
*** Add various mach convenience features (vminfo, &c). !!
*** Be even more vigilant about noticing new threads.  In particular:
**** For mach-indep thread commands, before validating against
     internal thread list. !!!
*** read core files !!
*** Gdb doesn't work right if it doesn't have permission to frob the
    inferior process (for instance, if it's a set[ug]id program), but
    doesn't give a meaningful error message.  Try `break main' in /bin/login.

** nfsd
*** Implement TCP nfs. !
*** Implement V3 nfs. !
*** Implement nqnfs. !
*** Add Hurd-specific calls. !!
*** writes don't seem to work properly !!!
*** Report statfs correctly. !!

** telnetd
*** doesn't fill in the utmp host field !!
*** telnet -l root hurd-machine works without any authorization checks at all !!!

* Mach:
** Have some analogue of /dev/klog that syslogd can get kernel messages from
    (maybe there is already?); the boot file system, and other people
deeming
    it too risk to attempt to contact syslogd can use it too? !

======

???
  [I'm not sure of the preconditions for this; it usually seems to happen to
   new login shells (but not often enough to really get a handle on it).
   If the command is repeated, then it usually works correctly.]
  login> ps aux|head
  bash: /bin/head: (ipc/send) invalid msg-header
  Broken pipe
  [bash only seems to print error messages in this particular format if an
   execve fails]

  I've also had it happen in shells that have been around a while.  -thomas

  I just saw it happen in make output; there the particular error
  happens only when execvp fails.  -thomas
???

* Next release:
** transparent FTP working
** our own bootable floppies
** fdisk
** cdrom with extensions working
** libc 2.1
** Have floppy nsswitch.conf use default feature when glibc 2.1 is in use.
** proc leaks dead names massively.
** something is still soaking up wired pages on lengthy compiles
** password server; eliminate other checkers of passwords