New option for ln, firmlinks!

2004-01-24 Thread Alfred M. Szmidt
Howdy,

The following hack implements the --firm/-m option for ln so that it
will create firm links.  Now, most GNU/Linux people won't be familiar
with the concept, and I'm not really sure how to explain it either.
The best example I can think of that explains the difference between
symlinks and firmlinks is the following:

hurd:/home/ams/coreutils/coreutils/src# ./ln -s /ams/foo symlink
hurd:/home/ams/coreutils/coreutils/src# ./ln -m /ams/foo firmlink
hurd:/home/ams/coreutils/coreutils/src# cd symlink
hurd:/home/ams/coreutils/coreutils/src/symlink# ls ..
foo  hurd.obj  lost+found  oskit.obj  sub-hurd
hurd:/home/ams/coreutils/coreutils/src/symlink# cd ../firmlink 
hurd:/home/ams/coreutils/coreutils/src/firmlink# ls ..
CVS
Makefile
Makefile.am
[..snip...]
hurd:/home/ams/coreutils/coreutils/src/firmlink# ls
hurd:/home/ams/coreutils/coreutils/src/firmlink# ls /ams/foo
hurd:/home/ams/coreutils/coreutils/src/firmlink# touch foo
hurd:/home/ams/coreutils/coreutils/src/firmlink# ls -l
total 0
-rw-r--r--1 root root0 Jan 25 02:48 foo
hurd:/home/ams/coreutils/coreutils/src/firmlink# ls -l /ams/foo
total 0
-rw-r--r--1 root root0 Jan 25 02:48 foo
hurd:/home/ams/coreutils/coreutils/src/firmlink# 

As you see, a firmlink is more or less a "real" link, and doesn't
exhibit the sometimes awkward behaviour of symbolic links (`ls ..' is
one such example).

Note that I didn't bother in creating a NEWS entry, or updating the
manual.  This is mostly a hack that I just wanted to share and get
some comments about.  For example, firmlink() should be moved into
libc, _HURD_FIRMLINK should be defined in , propor
autoconf checks should be created so that ln will compile on system
that don't support firmlinks, etc.

2004-01-24  Alfred M. Szmidt  <[EMAIL PROTECTED]>

Added new option for `ln', --firm.

* src/ln.c (firm_link): New variable.
(long_options): Support new option `--firm'.
(_HURD_FIRMLINK): New macro.
(hurd_fail, firmlink): New functions.
(do_link, usage, main): Support new option `--firm'.
(do_link): Allow the creation of firmlinks for directories.

*** src/ln.c.~1.132.~   Sat Oct 18 03:05:47 2003
--- src/ln.cSun Jan 25 02:32:05 2004
***
*** 96,107 
  enum backup_type backup_type;
  
  /* A pointer to the function used to make links.  This will point to either
!`link' or `symlink'. */
  static int (*linkfunc) ();
  
  /* If nonzero, make symbolic links; otherwise, make hard links.  */
  static int symbolic_link;
  
  /* If nonzero, ask the user before removing existing files.  */
  static int interactive;
  
--- 96,110 
  enum backup_type backup_type;
  
  /* A pointer to the function used to make links.  This will point to either
!`link', `symlink' or `firmlink'. */
  static int (*linkfunc) ();
  
  /* If nonzero, make symbolic links; otherwise, make hard links.  */
  static int symbolic_link;
  
+ /* If nonzero, make firm links; otherwise make hard links.  */
+ static int firm_link;
+ 
  /* If nonzero, ask the user before removing existing files.  */
  static int interactive;
  
***
*** 133,138 
--- 136,142 
{"suffix", required_argument, NULL, 'S'},
{"target-directory", required_argument, NULL, TARGET_DIRECTORY_OPTION},
{"symbolic", no_argument, NULL, 's'},
+   {"firm", no_argument, NULL, 'm'},
{"verbose", no_argument, NULL, 'v'},
{"version-control", required_argument, NULL, 'V'}, /* Deprecated. FIXME. */
{GETOPT_HELP_OPTION_DECL},
***
*** 140,145 
--- 144,234 
{NULL, 0, NULL, 0}
  };
  
+ /* Snatched from glibc; and modified for firm links and some sort of
+stand-aloneness.  Should really be moved back into libc as a real
+call. */
+ 
+ #include 
+ #include 
+ #include 
+ #include 
+ #include 
+ 
+ #define _HURD_FIRMLINK  _HURD "firmlink"
+ 
+ int
+ hurd_fail (error_t err)
+ {
+   switch (err)
+ {
+ case EMACH_SEND_INVALID_DEST:
+ case EMIG_SERVER_DIED:
+   /* The server has disappeared!  */
+   err = EIEIO;
+   break;
+   
+ case KERN_NO_SPACE:
+   err = ENOMEM;
+   break;
+   
+ case KERN_INVALID_ARGUMENT:
+   err = EINVAL;
+   break;
+ 
+ case 0:
+   return 0;
+ 
+ default:
+   break;
+ }
+ 
+   errno = err;
+   return -1;
+ }
+ 
+ int
+ firmlink (const char *from, const char *to)
+ {
+   error_t err;
+   file_t dir, node;
+   char *name;
+   const size_t len = strlen (from) + 1;
+   char buf[sizeof (_HURD_FIRMLINK) + len];
+   mode_t umask = getumask ();  
+ 
+   /* A firmlink is a file whose translator is "/hurd/firmlink\0target\0".  */
+   
+   memcpy (buf, _HURD_FIRMLINK, sizeof (_HURD_FIRMLINK));
+   memcpy (&buf[sizeof (_HURD_FIRMLINK)], from, len);
+   
+   dir = file_name_split (to, &name);
+   if (dir == MACH_PORT_NULL)
+ return -1;
+   
+   /* Create a new, unlinked node in the target directory.  */
+   err = d

Re: New option for ln, firmlinks!

2004-01-24 Thread Andreas Schwab
"Alfred M. Szmidt" <[EMAIL PROTECTED]> writes:

> Howdy,
>
> The following hack implements the --firm/-m option for ln so that it
> will create firm links.  Now, most GNU/Linux people won't be familiar
> with the concept, and I'm not really sure how to explain it either.
> The best example I can think of that explains the difference between
> symlinks and firmlinks is the following:
>
> hurd:/home/ams/coreutils/coreutils/src# ./ln -s /ams/foo symlink
> hurd:/home/ams/coreutils/coreutils/src# ./ln -m /ams/foo firmlink
> hurd:/home/ams/coreutils/coreutils/src# cd symlink
> hurd:/home/ams/coreutils/coreutils/src/symlink# ls ..
> foo  hurd.obj  lost+found  oskit.obj  sub-hurd
> hurd:/home/ams/coreutils/coreutils/src/symlink# cd ../firmlink 
> hurd:/home/ams/coreutils/coreutils/src/firmlink# ls ..
> CVS
> Makefile
> Makefile.am
> [..snip...]

This looks similar to bind mounts in Linux.

Andreas.

-- 
Andreas Schwab, SuSE Labs, [EMAIL PROTECTED]
SuSE Linux AG, Maxfeldstraße 5, 90409 Nürnberg, Germany
Key fingerprint = 58CA 54C7 6D53 942B 1756  01D3 44D5 214B 8276 4ED5
"And now for something completely different."


___
Bug-coreutils mailing list
[EMAIL PROTECTED]
http://mail.gnu.org/mailman/listinfo/bug-coreutils


Re: New option for ln, firmlinks!

2004-01-24 Thread Alfred M. Szmidt
   > hurd:/home/ams/coreutils/coreutils/src# ./ln -s /ams/foo symlink
   > hurd:/home/ams/coreutils/coreutils/src# ./ln -m /ams/foo firmlink
   > hurd:/home/ams/coreutils/coreutils/src# cd symlink
   > hurd:/home/ams/coreutils/coreutils/src/symlink# ls ..
   > foo  hurd.obj  lost+found  oskit.obj  sub-hurd
   > hurd:/home/ams/coreutils/coreutils/src/symlink# cd ../firmlink 
   > hurd:/home/ams/coreutils/coreutils/src/firmlink# ls ..
   > CVS
   > Makefile
   > Makefile.am
   > [..snip...]

   This looks similar to bind mounts in Linux.

Are those the same thing as union file-systems (BSD has them, and the
Hurd has a alpha translator for it written by Moritz Schulte; it was
called shadow file-systems before)?

Cheers.


___
Bug-coreutils mailing list
[EMAIL PROTECTED]
http://mail.gnu.org/mailman/listinfo/bug-coreutils


Re: ls --color feature request: ordinary files uncoloured

2004-01-24 Thread Ed Avis
Jim Meyering <[EMAIL PROTECTED]> wrote:

>>I think it would be better for plain files to not have any ANSI
>>escape sequences around them, and for colouring to apply only to
>>directories, *.gz and so on.

>>Shall I send a patch for this?
>
>Please do.

diff -ru coreutils-5.0.91/src/ls.c coreutils-5.0.91.new/src/ls.c
--- coreutils-5.0.91/src/ls.c   2003-07-27 07:33:36.0 +0100
+++ coreutils-5.0.91.new/src/ls.c   2004-01-24 18:13:49.334955240 +
@@ -253,7 +253,7 @@
 static int file_interesting (const struct dirent *next);
 static uintmax_t gobble_file (const char *name, enum filetype type,
  int explicit_arg, const char *dirname);
-static void print_color_indicator (const char *name, mode_t mode, int linkok);
+static bool print_color_indicator (const char *name, mode_t mode, int linkok);
 static void put_indicator (const struct bin_str *ind);
 static int put_indicator_direct (const struct bin_str *ind);
 static int length_of_file_name_and_frills (const struct fileinfo *f);
@@ -499,6 +499,13 @@
 
 static int print_with_color;
 
+/* Whether we used any colors in the output so far.  If so, we will
+   need to restore the default color later.  If not, we will need to
+   print some stuff (prep_non_filename_text ()) before using color for
+   the first time. */
+
+static bool used_color = false;
+
 enum color_type
   {
 color_never,   /* 0: default or --color=never */
@@ -517,13 +524,13 @@
 
 enum indicator_no
   {
-C_LEFT, C_RIGHT, C_END, C_NORM, C_FILE, C_DIR, C_LINK, C_FIFO, C_SOCK,
+C_LEFT, C_RIGHT, C_END, C_RESET, C_NORM, C_FILE, C_DIR, C_LINK, C_FIFO, C_SOCK,
 C_BLK, C_CHR, C_MISSING, C_ORPHAN, C_EXEC, C_DOOR
   };
 
 static const char *const indicator_name[]=
   {
-"lc", "rc", "ec", "no", "fi", "di", "ln", "pi", "so",
+"lc", "rc", "ec", "rs", "no", "fi", "di", "ln", "pi", "so",
 "bd", "cd", "mi", "or", "ex", "do", NULL
   };
 
@@ -539,8 +546,9 @@
 { LEN_STR_PAIR ("\033[") },/* lc: Left of color sequence */
 { LEN_STR_PAIR ("m") },/* rc: Right of color sequence */
 { 0, NULL },   /* ec: End color (replaces lc+no+rc) */
-{ LEN_STR_PAIR ("0") },/* no: Normal */
-{ LEN_STR_PAIR ("0") },/* fi: File: default */
+{ LEN_STR_PAIR ("0") },/* rs: Reset to ordinary colors */
+{ 0, NULL },   /* no: Normal */
+{ 0, NULL },   /* fi: File: default */
 { LEN_STR_PAIR ("01;34") },/* di: Directory: bright blue */
 { LEN_STR_PAIR ("01;36") },/* ln: Symlink: bright cyan */
 { LEN_STR_PAIR ("33") },   /* pi: Pipe: yellow/brown */
@@ -993,7 +1001,8 @@
   signal (sig, SIG_IGN);
 #endif
 
-  restore_default_color ();
+  if (used_color)
+restore_default_color ();
 
   /* SIGTSTP is special, since the application can receive that signal more
  than once.  In this case, don't set the signal handler to the default.
@@ -1051,7 +1060,6 @@
  may have just reset it -- e.g., if LS_COLORS is invalid.  */
   if (print_with_color)
 {
-  prep_non_filename_text ();
   /* Avoid following symbolic links when possible.  */
   if (color_indicator[C_ORPHAN].string != NULL
  || (color_indicator[C_MISSING].string != NULL
@@ -1208,7 +1216,7 @@
 }
 
   /* Restore default color before exiting */
-  if (print_with_color)
+  if (used_color)
 {
   put_indicator (&color_indicator[C_LEFT]);
   put_indicator (&color_indicator[C_RIGHT]);
@@ -3271,8 +3279,8 @@
 print_name_with_quoting (const char *p, mode_t mode, int linkok,
 struct obstack *stack)
 {
-  if (print_with_color)
-print_color_indicator (p, mode, linkok);
+  const bool used_color_this_time
+= print_with_color && print_color_indicator (p, mode, linkok);
 
   if (stack)
 PUSH_CURRENT_DIRED_POS (stack);
@@ -3282,7 +3290,7 @@
   if (stack)
 PUSH_CURRENT_DIRED_POS (stack);
 
-  if (print_with_color)
+  if (used_color_this_time)
 prep_non_filename_text ();
 }
 
@@ -3294,7 +3302,7 @@
   else
 {
   put_indicator (&color_indicator[C_LEFT]);
-  put_indicator (&color_indicator[C_NORM]);
+  put_indicator (&color_indicator[C_RESET]);
   put_indicator (&color_indicator[C_RIGHT]);
 }
 }
@@ -3354,7 +3362,8 @@
 DIRED_PUTCHAR (c);
 }
 
-static void
+/* Returns whether any color sequence was printed. */
+static bool
 print_color_indicator (const char *name, mode_t mode, int linkok)
 {
   int type = C_FILE;
@@ -3406,16 +3415,32 @@
}
}
 }
-
-  put_indicator (&color_indicator[C_LEFT]);
-  put_indicator (ext ? &(ext->seq) : &color_indicator[type]);
-  put_indicator (&color_indicator[C_RIGHT]);
+  
+  {
+const struct bin_str *const s
+  = ext ? &(ext->seq) : &color_indicator[type];
+if (s->string != NULL)
+  {
+   put_indicator (&color_indicator[C_LEFT]);
+   put_indica

Re: bug in hostname

2004-01-24 Thread Bob Proulx
Paul Jarc wrote:
> A hostname program does not need to talk to the network at all.  The
> kernel keeps exactly one hostname in memory, and the hostname program
> gets/sets it via gethostname()/sethostname().  It's fine to also
> provide access to any names found in DNS, but that isn't central.

Partially agree.  I agree with the first part.  But the -f, --fqdn in
particular must use DNS if the real hostname is not already fully
qualified.  The lack of that functionality is one things that started
a previous thread recently.  If hostname is getting redone then it
would be best to handle this case.

> When it comes to DNS, there can be multiple names, but there need not
> be any "primary" name among them.  There can be, and often is, but
> it's also possible that all may have equal standing.  If all you have
> to start with is an IP address, though, then you're probably only
> going to find one name from there anyway.

This is one of the reasons that personally I prefer setting the
hostname to the fully qualifed domain name.  It just seems cleaner.
There is no ambiguity.  Others disagree and try to do the reverse DNS
mappings to find the fqdn.  But that can be incorrect in a number of
ways as you imply.

> >>   - why some programs expect IP addresses with brackets and some don't?
> 
> Unless both kinds of programs invoke "hostname -i", we don't need to
> care about that.

It would seem to be easier to add the brackets than to remove them.

I personally can't think of any case of a program using 'hostname -i'
which would be correct.  Or that 127.0.0.1 would not always be just as
correct.  What is returned if the machine has multiple network
addresses?  How would returning the first IP address always be correct
in the presence of multiple network devices?  I would deprecate that
option.  Or at least warn against it strongly.

Bob


___
Bug-coreutils mailing list
[EMAIL PROTECTED]
http://mail.gnu.org/mailman/listinfo/bug-coreutils


Re: New option for ln, firmlinks!

2004-01-24 Thread Andreas Schwab
"Alfred M. Szmidt" <[EMAIL PROTECTED]> writes:

>> hurd:/home/ams/coreutils/coreutils/src# ./ln -s /ams/foo symlink
>> hurd:/home/ams/coreutils/coreutils/src# ./ln -m /ams/foo firmlink
>> hurd:/home/ams/coreutils/coreutils/src# cd symlink
>> hurd:/home/ams/coreutils/coreutils/src/symlink# ls ..
>> foo  hurd.obj  lost+found  oskit.obj  sub-hurd
>> hurd:/home/ams/coreutils/coreutils/src/symlink# cd ../firmlink 
>> hurd:/home/ams/coreutils/coreutils/src/firmlink# ls ..
>> CVS
>> Makefile
>> Makefile.am
>> [..snip...]
>
>This looks similar to bind mounts in Linux.
>
> Are those the same thing as union file-systems

I don't know much about union file-systems, but AFAIK they are different
from bind mounts.  A bind mount is created by "mount -o bind /foo /bar"
and causes the tree under /foo to be overlayed over /bar, with the former
contents of /bar being hidden.  It's like a regular mount, except that the
source is not (a filesystem on) a block device, but a directory.

Andreas.

-- 
Andreas Schwab, SuSE Labs, [EMAIL PROTECTED]
SuSE Linux AG, Maxfeldstraße 5, 90409 Nürnberg, Germany
Key fingerprint = 58CA 54C7 6D53 942B 1756  01D3 44D5 214B 8276 4ED5
"And now for something completely different."


___
Bug-coreutils mailing list
[EMAIL PROTECTED]
http://mail.gnu.org/mailman/listinfo/bug-coreutils


Re: New option for ln, firmlinks!

2004-01-24 Thread Alfred M. Szmidt
   I don't know much about union file-systems, but AFAIK they are
   different from bind mounts.  A bind mount is created by "mount -o
   bind /foo /bar" and causes the tree under /foo to be overlayed over
   /bar, with the former contents of /bar being hidden.  It's like a
   regular mount, except that the source is not (a filesystem on) a
   block device, but a directory.

It does sound a bit similar to firmlinks.  But firmlinks work on any
kind of type of file (directories, symlinks, ...).  I don't know if
this bind file-system can be used across chroots, but firmlinks can.

Cheers.


___
Bug-coreutils mailing list
[EMAIL PROTECTED]
http://mail.gnu.org/mailman/listinfo/bug-coreutils


Re: New option for ln, firmlinks!

2004-01-24 Thread Andreas Schwab
"Alfred M. Szmidt" <[EMAIL PROTECTED]> writes:

>I don't know much about union file-systems, but AFAIK they are
>different from bind mounts.  A bind mount is created by "mount -o
>bind /foo /bar" and causes the tree under /foo to be overlayed over
>/bar, with the former contents of /bar being hidden.  It's like a
>regular mount, except that the source is not (a filesystem on) a
>block device, but a directory.
>
> It does sound a bit similar to firmlinks.  But firmlinks work on any
> kind of type of file (directories, symlinks, ...).  I don't know if
> this bind file-system can be used across chroots, but firmlinks can.

You can also bind-mount a regular file (and probably other types, I didn't
try yet).  The only difference to firmlinks is, at it seems, that the
destination must already exist and it must be of the same type as the
source.

Andreas.

-- 
Andreas Schwab, SuSE Labs, [EMAIL PROTECTED]
SuSE Linux AG, Maxfeldstraße 5, 90409 Nürnberg, Germany
Key fingerprint = 58CA 54C7 6D53 942B 1756  01D3 44D5 214B 8276 4ED5
"And now for something completely different."


___
Bug-coreutils mailing list
[EMAIL PROTECTED]
http://mail.gnu.org/mailman/listinfo/bug-coreutils


Re: New option for ln, firmlinks!

2004-01-24 Thread Alfred M. Szmidt
   You can also bind-mount a regular file (and probably other types, I
   didn't try yet).  The only difference to firmlinks is, at it seems,
   that the destination must already exist and it must be of the same
   type as the source.

Not entirerly true, the source and destination aren't the same in any
way, the source just has a translator attached to it that transmits
all file-system calls to the destination.  But other than that, it
does seem that they are quite the same.  Was it possible to jump out
of a chroot with bind's?


I might note that `ln --firm TARGET LINK_NAME' is sugar for `settrans
-cp TARGET /hurd/firmlink LINK_NAME`.  The same really goes when using
--symbolic; but with s/firm/sym/.  But symbolic links are optimised a
bit in the file-system, i.e. they aren't treated as "real"
translators.

Cheers.


___
Bug-coreutils mailing list
[EMAIL PROTECTED]
http://mail.gnu.org/mailman/listinfo/bug-coreutils


Re: New option for ln, firmlinks!

2004-01-24 Thread Andreas Schwab
"Alfred M. Szmidt" <[EMAIL PROTECTED]> writes:

>You can also bind-mount a regular file (and probably other types, I
>didn't try yet).  The only difference to firmlinks is, at it seems,
>that the destination must already exist and it must be of the same
>type as the source.
>
> Not entirerly true, the source and destination aren't the same in any
> way,

The last sentence above was attributed to bind mounts, not to firmlinks.

> Was it possible to jump out of a chroot with bind's?

Not sure what you mean.  A bind-mountpoint behaves like any other
mountpoint.

Andreas.

-- 
Andreas Schwab, SuSE Labs, [EMAIL PROTECTED]
SuSE Linux AG, Maxfeldstraße 5, 90409 Nürnberg, Germany
Key fingerprint = 58CA 54C7 6D53 942B 1756  01D3 44D5 214B 8276 4ED5
"And now for something completely different."


___
Bug-coreutils mailing list
[EMAIL PROTECTED]
http://mail.gnu.org/mailman/listinfo/bug-coreutils


Re: New option for ln, firmlinks!

2004-01-24 Thread Alfred M. Szmidt
   > Was it possible to jump out of a chroot with bind's?

   Not sure what you mean.  A bind-mountpoint behaves like any other
   mountpoint.

Well, can you do the something along the following with
bind-mountpoints (using settrans to be clear):

$ settrans -ac /new-root/etc /hurd/firmlink /etc
$ chroot /new-root
$ cat /etc/passwd

And get the content of REAL-ROOT/etc/passwd for example?

Cheers.


___
Bug-coreutils mailing list
[EMAIL PROTECTED]
http://mail.gnu.org/mailman/listinfo/bug-coreutils


Re: New option for ln, firmlinks!

2004-01-24 Thread Andreas Schwab
"Alfred M. Szmidt" <[EMAIL PROTECTED]> writes:

> Well, can you do the something along the following with
> bind-mountpoints (using settrans to be clear):
>
> $ settrans -ac /new-root/etc /hurd/firmlink /etc
> $ chroot /new-root
> $ cat /etc/passwd
>
> And get the content of REAL-ROOT/etc/passwd for example?

Yes.  The binding is evaluated at mount-time.

Andreas.

-- 
Andreas Schwab, SuSE Labs, [EMAIL PROTECTED]
SuSE Linux AG, Maxfeldstraße 5, 90409 Nürnberg, Germany
Key fingerprint = 58CA 54C7 6D53 942B 1756  01D3 44D5 214B 8276 4ED5
"And now for something completely different."


___
Bug-coreutils mailing list
[EMAIL PROTECTED]
http://mail.gnu.org/mailman/listinfo/bug-coreutils


Re: New option for ln, firmlinks!

2004-01-24 Thread Alfred M. Szmidt
   > Well, can you do the something along the following with
   > bind-mountpoints (using settrans to be clear):
   >
   > $ settrans -ac /new-root/etc /hurd/firmlink /etc
   > $ chroot /new-root
   > $ cat /etc/passwd
   >
   > And get the content of REAL-ROOT/etc/passwd for example?

   Yes.  The binding is evaluated at mount-time.

Corking, maybe something like this could be added to libc when/if
firmlink() moves there and then make --firm work with that too.

Cheers!


___
Bug-coreutils mailing list
[EMAIL PROTECTED]
http://mail.gnu.org/mailman/listinfo/bug-coreutils


Re: bug in hostname

2004-01-24 Thread Paul Jarc
[EMAIL PROTECTED] (Bob Proulx) wrote:
> But the -f, --fqdn in particular must use DNS if the real hostname
> is not already fully qualified.

Well, that's one way it can try to go about it.  There's also
getdomainname(), on systems that have it, or uname().  One might also
argue that it would be reasonable to just fail or give the short name
- i.e., it's the admin's responsibility to make "hostname -f" work, by
setting the kernel's hostname to the fqdn.

> This is one of the reasons that personally I prefer setting the
> hostname to the fully qualifed domain name.  It just seems cleaner.
> There is no ambiguity.

Yep.


paul


___
Bug-coreutils mailing list
[EMAIL PROTECTED]
http://mail.gnu.org/mailman/listinfo/bug-coreutils


coreutils-5.1.2 released

2004-01-24 Thread Jim Meyering

This is a bug-fix-only release.
I hope to make a `stable' release pretty soon, so if you know
of any outstanding bugs, please report (or re-report) them ASAP.

Here are the compressed sources:
  ftp://alpha.gnu.org/gnu/coreutils/coreutils-5.1.2.tar.gz   (6.2MB)
  ftp://alpha.gnu.org/gnu/coreutils/coreutils-5.1.2.tar.bz2  (4.1MB)
  http://fetish.sf.net/coreutils-5.1.2.tar.gz   (6.2MB)
  http://fetish.sf.net/coreutils-5.1.2.tar.bz2  (4.1MB)

And here are xdelta-style diffs:
  ftp://alpha.gnu.org/gnu/coreutils/coreutils-5.1.1-5.1.2.xdelta   (256KB)
  http://fetish.sf.net/coreutils-5.1.1-5.1.2.xdelta   (256KB)

Here are GPG detached signatures:
  ftp://alpha.gnu.org/gnu/coreutils/coreutils-5.1.2.tar.gz.sig
  ftp://alpha.gnu.org/gnu/coreutils/coreutils-5.1.2.tar.bz2.sig
  http://fetish.sf.net/coreutils-5.1.2.tar.gz.sig
  http://fetish.sf.net/coreutils-5.1.2.tar.bz2.sig

Here are the MD5 and SHA1 signatures:

742002ec256aa47e67614425f9914bba  coreutils-5.1.2.tar.gz
91a983a0f45d290f1a9ec00f51c58e4c  coreutils-5.1.2.tar.bz2
a2d8e59ce28b9ed9102ea4a76afd580c  coreutils-5.1.1-5.1.2.xdelta
0c9fd272547b441ba3b823495bbf88861a281d0f  coreutils-5.1.2.tar.gz
bab590c6daebbd27e0aa25a22213a332fc9bb3f5  coreutils-5.1.2.tar.bz2
f9223b17c4774c54040c6eb10ba83c31731cd91f  coreutils-5.1.1-5.1.2.xdelta

NEWS

* Major changes in release 5.1.2 (2004-01-25):

** Bug fixes

  rmdir -p exits with status 1 on error; formerly it sometimes exited
  with status 0 when given more than one argument.

  nohup now always exits with status 127 when it finds an error,
  as POSIX requires; formerly it sometimes exited with status 1.

  Several programs (including cut, date, dd, env, hostname, nl, pr,
  stty, and tr) now always exit with status 1 when they find an error;
  formerly they sometimes exited with status 2.

  factor no longer reports a usage error if stdin has the wrong format.

  paste no longer infloops on ppc systems (bug introduced in 5.1.1)



ChangeLog entries:

**
ChangeLog
**
2004-01-25  Jim Meyering  <[EMAIL PROTECTED]>

* Version 5.1.2.

* Makefile.maint (signatures): Comment out definition.

2004-01-23  Jim Meyering  <[EMAIL PROTECTED]>

* Makefile.maint (header_regexp): Add exitfail.

* man/Makefile.am (EXTRA_DIST): Add help2man.
Reported by Nelson H. F. Beebe.

* man/Makefile.am (.x.1): Prefix help2man invocation with `$(PERL) --'
so it works on systems with Perl installed somewhere other than in
/usr/bin.

* src/paste.c (paste_parallel): Declare local, chr, to be of type
`int', not `char', since it must hold EOF.  This bug would make
paste infloop on some systems.  Test failures reported by
Nelson H. F. Beebe and Christian Krackowizer.

2004-01-22  Jim Meyering  <[EMAIL PROTECTED]>

* tests/rmdir/fail-perm: New file.  Test for just-fixed rmdir bug.
* tests/rmdir/Makefile.am (TESTS): Add fail-perm.

* man/help2man: Fix it so using --info-page='coreutils PROG' works.
* man/Makefile.am (.x.1): Invoke our own (tweaked) copy of help2man.
Use --info-page='coreutils PROG' option.
Now, readlink.1 refers the user to `info coreutils readlink'
rather than to `info readlink'.  Reported by Matt Swift.

2004-01-21  Paul Eggert  <[EMAIL PROTECTED]>

Exit status cleanup.

* src/basename.c (usage): Use EXIT_SUCCESS, not 0, for clarity.
* src/cat.c, src/chgrp.c, src/chmod.c, src/chown.c, src/chroot.c,
* src/cksum.c, src/comm.c, src/cp.c, src/csplit.c, src/cut.c,
* src/date.c, src/dd.c, src/df.c, src/dircolors.c, src/dirname.c,
* src/du.c, src/echo.c, src/env.c, src/expand.c, src/expr.c,
* src/factor.c, src/fmt.c, src/fold.c, src/head.c, src/hostid.c,
* src/hostname.c, src/id.c, src/install.c, src/join.c, src/kill.c,
* src/link.c, src/ln.c, src/logname.c, src/ls.c, src/md5sum.c,
* src/mkdir.c, src/mkfifo.c, src/mknod.c, src/mv.c, src/nice.c,
* src/nl.c, src/nohup.c, src/od.c, src/paste.c, src/pathchk.c,
* src/pinky.c, src/pr.c, src/printenv.c, src/printf.c, src/pwd.c,
* src/rm.c, src/rmdir.c, src/seq.c, src/setuidgid.c, src/shred.c,
* src/sleep.c, src/sort.c, src/split.c, src/stat.c, src/stty.c,
* src/su.c, src/sum.c, src/sync.c, src/tac.c, src/tail.c, src/tee.c,
* src/test.c, src/touch.c, src/tr.c, src/tsort.c, src/tty.c,
* src/uname.c, src/unexpand.c, src/uniq.c, src/unlink.c, src/uptime.c,
* src/users.c, src/wc.c, src/who.c, src/whoami.c, src/yes.c: Likewise.

* src/cat.c (usage): Don't bother normalizing exit status
since the arg is already the correct exit status now.
* src/cksum.c, src/comm.c, src/csplit.c, src/cut.c,
* src/dircolors.c, src/expand.c, src/fmt.c, src/fold.c, src/hea