<?xml version="1.0" encoding="UTF-8"?>
<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns="http://purl.org/rss/1.0/" xmlns:taxo="http://purl.org/rss/1.0/modules/taxonomy/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:syn="http://purl.org/rss/1.0/modules/syndication/" xmlns:admin="http://webns.net/mvcb/">
  <channel about="http://blog.gmane.org/gmane.comp.gnu.core-utils.bugs">
    <title>gmane.comp.gnu.core-utils.bugs</title>
    <link>http://blog.gmane.org/gmane.comp.gnu.core-utils.bugs</link>
    <description/>
    <syn:updatePeriod>hourly</syn:updatePeriod>
    <syn:updateFrequency>1</syn:updateFrequency>
    <syn:updateBase>1901-01-01T00:00+00:00</syn:updateBase>
    <items>
      <rdf:Seq>
        <rdf:li rdf:resource="http://permalink.gmane.org/gmane.comp.gnu.core-utils.bugs/15239"/>
        <rdf:li rdf:resource="http://permalink.gmane.org/gmane.comp.gnu.core-utils.bugs/15238"/>
        <rdf:li rdf:resource="http://permalink.gmane.org/gmane.comp.gnu.core-utils.bugs/15237"/>
        <rdf:li rdf:resource="http://permalink.gmane.org/gmane.comp.gnu.core-utils.bugs/15236"/>
        <rdf:li rdf:resource="http://permalink.gmane.org/gmane.comp.gnu.core-utils.bugs/15235"/>
        <rdf:li rdf:resource="http://permalink.gmane.org/gmane.comp.gnu.core-utils.bugs/15234"/>
        <rdf:li rdf:resource="http://permalink.gmane.org/gmane.comp.gnu.core-utils.bugs/15233"/>
        <rdf:li rdf:resource="http://permalink.gmane.org/gmane.comp.gnu.core-utils.bugs/15232"/>
        <rdf:li rdf:resource="http://permalink.gmane.org/gmane.comp.gnu.core-utils.bugs/15231"/>
        <rdf:li rdf:resource="http://permalink.gmane.org/gmane.comp.gnu.core-utils.bugs/15230"/>
        <rdf:li rdf:resource="http://permalink.gmane.org/gmane.comp.gnu.core-utils.bugs/15229"/>
        <rdf:li rdf:resource="http://permalink.gmane.org/gmane.comp.gnu.core-utils.bugs/15228"/>
        <rdf:li rdf:resource="http://permalink.gmane.org/gmane.comp.gnu.core-utils.bugs/15227"/>
        <rdf:li rdf:resource="http://permalink.gmane.org/gmane.comp.gnu.core-utils.bugs/15226"/>
        <rdf:li rdf:resource="http://permalink.gmane.org/gmane.comp.gnu.core-utils.bugs/15225"/>
        <rdf:li rdf:resource="http://permalink.gmane.org/gmane.comp.gnu.core-utils.bugs/15224"/>
        <rdf:li rdf:resource="http://permalink.gmane.org/gmane.comp.gnu.core-utils.bugs/15223"/>
        <rdf:li rdf:resource="http://permalink.gmane.org/gmane.comp.gnu.core-utils.bugs/15222"/>
        <rdf:li rdf:resource="http://permalink.gmane.org/gmane.comp.gnu.core-utils.bugs/15221"/>
        <rdf:li rdf:resource="http://permalink.gmane.org/gmane.comp.gnu.core-utils.bugs/15220"/>
      </rdf:Seq>
    </items>
    <image rdf:resource="http://gmane.org/img/gmane-25t.png"/>
    <textinput rdf:resource=""/>
  </channel>
  <image rdf:about="http://gmane.org/img/gmane-25t.png">
    <title>Gmane</title>
    <url>http://gmane.org/img/gmane-25t.png</url>
    <link>http://gmane.org</link>
  </image>
  <item rdf:about="http://permalink.gmane.org/gmane.comp.gnu.core-utils.bugs/15239">
    <title>Re: [PATCH] avoid warnings about initialization of automaticaggregates</title>
    <link>http://permalink.gmane.org/gmane.comp.gnu.core-utils.bugs/15239</link>
    <description>
Some notes on this issue:
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=36750
So the warning can be suppressed in gcc with
-Wno-missing-field-initializers

I must dust off and split up my patch
to allow us to use -Wsign-compare

cheers,
Pádraig
</description>
    <dc:creator>Pádraig Brady</dc:creator>
    <dc:date>2008-12-01T23:46:55</dc:date>
  </item>
  <item rdf:about="http://permalink.gmane.org/gmane.comp.gnu.core-utils.bugs/15238">
    <title>Re: fix du and wc wrt --files0-from=F</title>
    <link>http://permalink.gmane.org/gmane.comp.gnu.core-utils.bugs/15238</link>
    <description>      ^^^

I'd also mention why wc tries to read the whole list into RAM
if there's place (so that it can auto align the numbers outputted).
I'm not sure number alignment is worth this extra code/complexity,
but it's written now :)

I presume you're not forgetting sort --files0-from as
you've previously mentioned it.

cheers,
Pádraig.
</description>
    <dc:creator>Pádraig Brady</dc:creator>
    <dc:date>2008-12-01T23:23:10</dc:date>
  </item>
  <item rdf:about="http://permalink.gmane.org/gmane.comp.gnu.core-utils.bugs/15237">
    <title>Re: [PATCH] seq: plug a leak</title>
    <link>http://permalink.gmane.org/gmane.comp.gnu.core-utils.bugs/15237</link>
    <description>
I presume you meant "factor: plug a leak" ?
</description>
    <dc:creator>Pádraig Brady</dc:creator>
    <dc:date>2008-12-01T23:00:14</dc:date>
  </item>
  <item rdf:about="http://permalink.gmane.org/gmane.comp.gnu.core-utils.bugs/15236">
    <title>[PATCH] seq: plug a leak</title>
    <link>http://permalink.gmane.org/gmane.comp.gnu.core-utils.bugs/15236</link>
    <description>I've just pushed this:

From 9461c4d8e58f080a6b27caa923820a4ac8eea6d5 Mon Sep 17 00:00:00 2001
From: Jim Meyering &lt;meyering&lt; at &gt;redhat.com&gt;
Date: Mon, 1 Dec 2008 22:39:58 +0100
Subject: [PATCH] seq: plug a leak

* src/factor.c (emit_ul_factor): Call mpz_clear.
---
 src/factor.c |    1 +
 1 files changed, 1 insertions(+), 0 deletions(-)

diff --git a/src/factor.c b/src/factor.c
index 187143a..83cd0a8 100644
--- a/src/factor.c
+++ b/src/factor.c
&lt; at &gt;&lt; at &gt; -82,6 +82,7 &lt; at &gt;&lt; at &gt; emit_ul_factor (unsigned long int i)
   mpz_init (t);
   mpz_set_ui (t, i);
   emit_factor (t);
+  mpz_clear (t);
 }

 static void
--
1.6.0.4.1101.g642f8
</description>
    <dc:creator>Jim Meyering</dc:creator>
    <dc:date>2008-12-01T21:44:44</dc:date>
  </item>
  <item rdf:about="http://permalink.gmane.org/gmane.comp.gnu.core-utils.bugs/15235">
    <title>Re: [bug #24974] Document that comm's option "-1","-2" and "-3"can be combined</title>
    <link>http://permalink.gmane.org/gmane.comp.gnu.core-utils.bugs/15235</link>
    <description>
Actually, this one deserves an example too. I've probably read that
manpage 50+ times, And i never understood what "-m" meant.

Thanks,

Franklin
</description>
    <dc:creator>Frank Lin PIAT</dc:creator>
    <dc:date>2008-12-01T21:12:37</dc:date>
  </item>
  <item rdf:about="http://permalink.gmane.org/gmane.comp.gnu.core-utils.bugs/15234">
    <title>Re: [bug #24974] Document that comm's option "-1","-2" and "-3" can be combined</title>
    <link>http://permalink.gmane.org/gmane.comp.gnu.core-utils.bugs/15234</link>
    <description>

That only works when no data line begins with a TAB.  sort -m does not
have this problem.


sort -u file1 file2

Andreas.

</description>
    <dc:creator>Andreas Schwab</dc:creator>
    <dc:date>2008-12-01T21:00:56</dc:date>
  </item>
  <item rdf:about="http://permalink.gmane.org/gmane.comp.gnu.core-utils.bugs/15233">
    <title>[PATCH] avoid warnings about initialization of automatic aggregates</title>
    <link>http://permalink.gmane.org/gmane.comp.gnu.core-utils.bugs/15233</link>
    <description>Finally getting serious about avoiding warnings,
I've just eliminated this batch:

From c58b5daa337b16416be50adfeb3e99e3c009c891 Mon Sep 17 00:00:00 2001
From: Jim Meyering &lt;meyering&lt; at &gt;redhat.com&gt;
Date: Sun, 30 Nov 2008 22:37:42 +0100
Subject: [PATCH] avoid warnings about initialization of automatic aggregates

* src/system.h (DZA_CONCAT0, DZA_CONCAT): New macros.
(DECLARE_ZEROED_AGGREGATE): New macro.
* src/ls.c (quote_name): Use it.
* src/pathchk.c (portable_chars_only): Use it.
* src/shred.c (main): Use it.
* src/stty.c (main): Use it.
* src/wc.c (SUPPORT_OLD_MBRTOWC): Use it.
---
 src/ls.c      |    2 +-
 src/pathchk.c |    2 +-
 src/shred.c   |    2 +-
 src/stty.c    |    4 ++--
 src/system.h  |   13 +++++++++++++
 src/wc.c      |    2 +-
 6 files changed, 19 insertions(+), 6 deletions(-)

diff --git a/src/ls.c b/src/ls.c
index 7619ceb..0081865 100644
--- a/src/ls.c
+++ b/src/ls.c
&lt; at &gt;&lt; at &gt; -3721,7 +3721,7 &lt; at &gt;&lt; at &gt; quote_name (FILE *out, const char *name, struct quoting_options const *options,
      reach its end, replacing each non-printable multibyte
      character with a single question mark.  */
   {
-    mbstate_t mbstate = { 0, };
+    DECLARE_ZEROED_AGGREGATE (mbstate_t, mbstate);
     do
       {
 wchar_t wc;
diff --git a/src/pathchk.c b/src/pathchk.c
index 48001fc..3b2bd46 100644
--- a/src/pathchk.c
+++ b/src/pathchk.c
&lt; at &gt;&lt; at &gt; -198,7 +198,7 &lt; at &gt;&lt; at &gt; portable_chars_only (char const *file, size_t filelen)

   if (*invalid)
     {
-      mbstate_t mbstate = { 0, };
+      DECLARE_ZEROED_AGGREGATE (mbstate_t, mbstate);
       size_t charlen = mbrlen (invalid, filelen - validlen, &amp;mbstate);
       error (0, 0,
      _("nonportable character %s in file name %s"),
diff --git a/src/shred.c b/src/shred.c
index 6b7d901..1e7bffb 100644
--- a/src/shred.c
+++ b/src/shred.c
&lt; at &gt;&lt; at &gt; -1099,7 +1099,7 &lt; at &gt;&lt; at &gt; int
 main (int argc, char **argv)
 {
   bool ok = true;
-  struct Options flags = { 0, };
+  DECLARE_ZEROED_AGGREGATE (struct Options, flags);
   char **file;
   int n_files;
   int c;
diff --git a/src/stty.c b/src/stty.c
index 8eeaa2f..eb4f30f 100644
--- a/src/stty.c
+++ b/src/stty.c
&lt; at &gt;&lt; at &gt; -726,7 +726,7 &lt; at &gt;&lt; at &gt; main (int argc, char **argv)
 {
   /* Initialize to all zeroes so there is no risk memcmp will report a
      spurious difference in an uninitialized portion of the structure.  */
-  struct termios mode = { 0, };
+  DECLARE_ZEROED_AGGREGATE (struct termios, mode);

   enum output_type output_type;
   int optc;
&lt; at &gt;&lt; at &gt; -999,7 +999,7 &lt; at &gt;&lt; at &gt; main (int argc, char **argv)
     {
       /* Initialize to all zeroes so there is no risk memcmp will report a
  spurious difference in an uninitialized portion of the structure.  */
-      struct termios new_mode = { 0, };
+      DECLARE_ZEROED_AGGREGATE (struct termios, new_mode);

       if (tcsetattr (STDIN_FILENO, TCSADRAIN, &amp;mode))
 error (EXIT_FAILURE, errno, "%s", device_name);
diff --git a/src/system.h b/src/system.h
index d51caed..21182a4 100644
--- a/src/system.h
+++ b/src/system.h
&lt; at &gt;&lt; at &gt; -513,6 +513,19 &lt; at &gt;&lt; at &gt; enum
 # define IF_LINT(Code) /* empty */
 #endif

+/* With -Dlint, avoid warnings from gcc about code like mbstate_t m = {0,};
+   by wasting space on a static variable of the same type, that is thus
+   guaranteed to be initialized to 0, and use that on the RHS.  */
+#define DZA_CONCAT0(x,y) x ## y
+#define DZA_CONCAT(x,y) DZA_CONCAT0 (x, y)
+#ifdef lint
+# define DECLARE_ZEROED_AGGREGATE(Type, Var) \
+   static Type DZA_CONCAT (s0_, __LINE__); Type Var = DZA_CONCAT (s0_, __LINE__)
+#else
+# define DECLARE_ZEROED_AGGREGATE(Type, Var) \
+  Type Var = { 0, }
+#endif
+
 #ifndef __attribute__
 # if __GNUC__ &lt; 2 || (__GNUC__ == 2 &amp;&amp; __GNUC_MINOR__ &lt; 8)
 #  define __attribute__(x) /* empty */
diff --git a/src/wc.c b/src/wc.c
index 8cfd974..ad25ed8 100644
--- a/src/wc.c
+++ b/src/wc.c
&lt; at &gt;&lt; at &gt; -275,7 +275,7 &lt; at &gt;&lt; at &gt; wc (int fd, char const *file_x, struct fstatus *fstatus)
     {
       bool in_word = false;
       uintmax_t linepos = 0;
-      mbstate_t state = { 0, };
+      DECLARE_ZEROED_AGGREGATE (mbstate_t, state);
       bool in_shift = false;
 # if SUPPORT_OLD_MBRTOWC
       /* Back-up the state before each multibyte character conversion and
--
1.6.0.4.1101.g642f8
</description>
    <dc:creator>Jim Meyering</dc:creator>
    <dc:date>2008-12-01T20:21:13</dc:date>
  </item>
  <item rdf:about="http://permalink.gmane.org/gmane.comp.gnu.core-utils.bugs/15232">
    <title>Re: [bug #24974] Document that comm's option "-1","-2" and "-3"can be combined</title>
    <link>http://permalink.gmane.org/gmane.comp.gnu.core-utils.bugs/15232</link>
    <description>
Actually, I think both information are useful... Maybe something like:
 "suppress lines unique to FILE1 (suppress output of column 1)"
but that's 79 character long... not really nice.
So maybe:
 "suppress lines unique to FILE1 (i.e don't output column 1)"


Yes, I love examples in manpages.


Maybe just focus on what each command does very well.


"Print lines present in both file1 and file2 (Intersection)."
comm -12 file1 file2 

"Print lines not in the other file, both way (Symmetric Difference)"
comm -3 file1 file2 | sed 's/^\t*//'



Note: This only works if the input files don't contain duplicated lines.


"Print lines in file2 not present in file1 (Difference / Substraction):"
 grep -Fv -f file1 file2

"Print all distinct lines in file1 or file2 (Union):"
 sort -u file1 file 2
 

That feature is great.
Actually, it's worth emphasizing that files should be sorted in the
manpage: the sentence "Compare sorted files FILE1 and FILE2 line by
line." is quite clear... for those who read it carefully. may be :
"Compare two files FILE1 and FILE2 line by line. Each file must be
already sorted."

Thanks,

Franklin
</description>
    <dc:creator>Frank Lin PIAT</dc:creator>
    <dc:date>2008-12-01T19:44:45</dc:date>
  </item>
  <item rdf:about="http://permalink.gmane.org/gmane.comp.gnu.core-utils.bugs/15231">
    <title>Re: [bug #24974] Document that comm's option "-1","-2" and "-3" can be combined</title>
    <link>http://permalink.gmane.org/gmane.comp.gnu.core-utils.bugs/15231</link>
    <description>-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

According to Pádraig Brady on 12/1/2008 10:15 AM:

I like that proposal.


I could go either way, but agree that --nocheck-order is probably a
new-enough invention that we can remove it altogether.

- --
Don't work too hard, make some time for fun as well!

Eric Blake             ebb9&lt; at &gt;byu.net
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.9 (Cygwin)
Comment: Public key at home.comcast.net/~ericblake/eblake.gpg
Comment: Using GnuPG with Mozilla - http://enigmail.mozdev.org

iEYEARECAAYFAkk0RMcACgkQ84KuGfSFAYBaTQCeM+m6Jz33BdzDXoNnCdEipZpe
jPUAmQFSs5D7aVtwu0vK0hVeUDVrWxq2
=e4FZ
-----END PGP SIGNATURE-----
</description>
    <dc:creator>Eric Blake</dc:creator>
    <dc:date>2008-12-01T20:10:47</dc:date>
  </item>
  <item rdf:about="http://permalink.gmane.org/gmane.comp.gnu.core-utils.bugs/15230">
    <title>fix du and wc wrt --files0-from=F</title>
    <link>http://permalink.gmane.org/gmane.comp.gnu.core-utils.bugs/15230</link>
    <description>Here are the two patches I expect to push:
[as I write this I realize that while there was already very good
test coverage of most of the modified code, I should write a test that
exercises the bug in question, at least for du: read a large list from
a file and ensure that it no longer fails in a memory-limited environment. ]

From b1f67649bfa3c4b2c5c3b584799e49284d0ee4c1 Mon Sep 17 00:00:00 2001
From: Jim Meyering &lt;meyering&lt; at &gt;redhat.com&gt;
Date: Mon, 24 Nov 2008 09:55:55 +0100
Subject: [PATCH 1/2] du: read and process --files0-from= input a name at a time,

rather than by reading the entire input into RAM and *then*
processing each file name.
* src/du.c: Include "argv-iter.h", not "readtokens0.h".
(main): Rewrite to use argv-iter.
Call xfts_open on each argument, rather than on the entire
argv list at once.
Call print_size here, not from du_files.
Diagnose read failure.
* NEWS (Bug fixes): Mention it.
* THANKS: update.
Reported by Barry Kelly.  More details in
http://article.gmane.org/gmane.comp.gnu.core-utils.bugs/15159/
---
 NEWS     |    3 +
 THANKS   |    1 +
 src/du.c |  140 ++++++++++++++++++++++++++++++++++----------------------------
 3 files changed, 81 insertions(+), 63 deletions(-)

diff --git a/NEWS b/NEWS
index f0c5550..158b089 100644
--- a/NEWS
+++ b/NEWS
&lt; at &gt;&lt; at &gt; -12,6 +12,9 &lt; at &gt;&lt; at &gt; GNU coreutils NEWS                                    -*- outline -*-

   cp uses much less memory in some situations

+  du --files0-from=FILE no longer reads all of FILE into RAM before
+  processing the first file name
+
   seq 9223372036854775807 9223372036854775808 now prints only two numbers
   on systems with extended long double support and good library support.
   Even with this patch, on some systems, it still produces invalid output,
diff --git a/THANKS b/THANKS
index d06f755..f74d4fb 100644
--- a/THANKS
+++ b/THANKS
&lt; at &gt;&lt; at &gt; -58,6 +58,7 &lt; at &gt;&lt; at &gt; Augey Mikus                         mikus&lt; at &gt;dqc.org
 Aurelien Jarno                      aurel32&lt; at &gt;debian.org
 Austin Donnelly                     Austin.Donnelly&lt; at &gt;cl.cam.ac.uk
 Axel Kittenberger                   Anshil&lt; at &gt;gmx.net
+Barry Kelly                         http://barrkel.blogspot.com/
 Bauke Jan Douma                     bjdouma&lt; at &gt;xs4all.nl
 Ben Elliston                        bje&lt; at &gt;air.net.au
 Ben Harris                          bjh21&lt; at &gt;netbsd.org
diff --git a/src/du.c b/src/du.c
index e566978..6e4d28b 100644
--- a/src/du.c
+++ b/src/du.c
&lt; at &gt;&lt; at &gt; -30,6 +30,7 &lt; at &gt;&lt; at &gt;
 #include &lt;assert.h&gt;
 #include "system.h"
 #include "argmatch.h"
+#include "argv-iter.h"
 #include "error.h"
 #include "exclude.h"
 #include "fprintftime.h"
&lt; at &gt;&lt; at &gt; -37,7 +38,6 &lt; at &gt;&lt; at &gt;
 #include "human.h"
 #include "quote.h"
 #include "quotearg.h"
-#include "readtokens0.h"
 #include "same.h"
 #include "stat-time.h"
 #include "xfts.h"
&lt; at &gt;&lt; at &gt; -649,9 +649,6 &lt; at &gt;&lt; at &gt; du_files (char **files, int bit_flags)
       fts_close (fts);
     }

-  if (print_grand_total)
-    print_size (&amp;tot_dui, _("total"));
-
   return ok;
 }

&lt; at &gt;&lt; at &gt; -660,10 +657,8 &lt; at &gt;&lt; at &gt; main (int argc, char **argv)
 {
   char *cwd_only[2];
   bool max_depth_specified = false;
-  char **files;
   bool ok = true;
   char *files_from = NULL;
-  struct Tokens tok;

   /* Bit flags that control how fts works.  */
   int bit_flags = FTS_TIGHT_CYCLE_CHECK;
&lt; at &gt;&lt; at &gt; -926,6 +921,7 &lt; at &gt;&lt; at &gt; main (int argc, char **argv)
         }
     }

+  struct argv_iterator *ai;
   if (files_from)
     {
       /* When using --files0-from=F, you may not specify any files
&lt; at &gt;&lt; at &gt; -942,78 +938,96 &lt; at &gt;&lt; at &gt; main (int argc, char **argv)
 error (EXIT_FAILURE, errno, _("cannot open %s for reading"),
        quote (files_from));

-      readtokens0_init (&amp;tok);
-
-      if (! readtokens0 (stdin, &amp;tok) || fclose (stdin) != 0)
-error (EXIT_FAILURE, 0, _("cannot read file names from %s"),
-       quote (files_from));
-
-      files = tok.tok;
+      ai = argv_iter_init_stream (stdin);
     }
   else
     {
-      files = (optind &lt; argc ? argv + optind : cwd_only);
+      char **files = (optind &lt; argc ? argv + optind : cwd_only);
+      ai = argv_iter_init_argv (files);
     }

+  if (!ai)
+    xalloc_die ();
+
   /* Initialize the hash structure for inode numbers.  */
   hash_init ();

-  /* Report and filter out any empty file names before invoking fts.
-     This works around a glitch in fts, which fails immediately
-     (without looking at the other file names) when given an empty
-     file name.  */
-  {
-    size_t i = 0;
-    size_t j;
+  bit_flags |= symlink_deref_bits;
+  static char *temp_argv[] = { NULL, NULL };

-    for (j = 0; ; j++)
-      {
-if (i != j)
-  files[i] = files[j];
+  while (true)
+    {
+      bool skip_file = false;
+      enum argv_iter_err ai_err;
+      char *file_name = argv_iter (ai, &amp;ai_err);
+      if (ai_err == AI_ERR_EOF)
+break;
+      if (!file_name)
+{
+  switch (ai_err)
+    {
+    case AI_ERR_READ:
+      error (0, errno, _("%s: read error"), quote (files_from));
+      skip_file = true;
+      continue;

-if ( ! files[i])
-  break;
+    case AI_ERR_MEM:
+      xalloc_die ();

-if (files_from &amp;&amp; STREQ (files_from, "-") &amp;&amp; STREQ (files[i], "-"))
-  {
-    /* Give a better diagnostic in an unusual case:
-       printf - | du --files0-from=- */
-    error (0, 0, _("when reading file names from stdin, "
-   "no file name of %s allowed"),
-   quote ("-"));
-    continue;
-  }
+    default:
+      assert (!"unexpected error code from argv_iter");
+    }
+}
+      if (files_from &amp;&amp; STREQ (files_from, "-") &amp;&amp; STREQ (file_name, "-"))
+{
+  /* Give a better diagnostic in an unusual case:
+     printf - | du --files0-from=- */
+  error (0, 0, _("when reading file names from stdin, "
+ "no file name of %s allowed"),
+ quote (file_name));
+  skip_file = true;
+}

-if (files[i][0])
-  i++;
-else
-  {
-    /* Diagnose a zero-length file name.  When it's one
-       among many, knowing the record number may help.  */
-    if (files_from)
-      {
-/* Using the standard `filename:line-number:' prefix here is
-   not totally appropriate, since NUL is the separator, not NL,
-   but it might be better than nothing.  */
-unsigned long int file_number = j + 1;
-error (0, 0, "%s:%lu: %s", quotearg_colon (files_from),
-       file_number, _("invalid zero-length file name"));
-      }
-    else
-      error (0, 0, "%s", _("invalid zero-length file name"));
-  }
-      }
+      /* Report and skip any empty file names before invoking fts.
+ This works around a glitch in fts, which fails immediately
+ (without looking at the other file names) when given an empty
+ file name.  */
+      if (!file_name[0])
+{
+  /* Diagnose a zero-length file name.  When it's one
+     among many, knowing the record number may help.
+     FIXME: currently print the record number only with
+     --files0-from=FILE.  Maybe do it for argv, too?  */
+  if (files_from == NULL)
+    error (0, 0, "%s", _("invalid zero-length file name"));
+  else
+    {
+      /* Using the standard `filename:line-number:' prefix here is
+ not totally appropriate, since NUL is the separator, not NL,
+ but it might be better than nothing.  */
+      unsigned long int file_number = argv_iter_n_args (ai);
+      error (0, 0, "%s:%lu: %s", quotearg_colon (files_from),
+     file_number, _("invalid zero-length file name"));
+    }
+  skip_file = true;
+}
+
+      if (skip_file)
+ok = false;
+      else
+{
+  temp_argv[0] = file_name;
+  ok &amp;= du_files (temp_argv, bit_flags);
+}
+    }

-    ok = (i == j);
-  }
+  argv_iter_free (ai);

-  bit_flags |= symlink_deref_bits;
-  ok &amp;= du_files (files, bit_flags);
+  if (files_from &amp;&amp; (ferror (stdin) || fclose (stdin) != 0))
+    error (EXIT_FAILURE, 0, _("error reading %s"), quote (files_from));

-  /* This isn't really necessary, but it does ensure we
-     exercise this function.  */
-  if (files_from)
-    readtokens0_free (&amp;tok);
+  if (print_grand_total)
+    print_size (&amp;tot_dui, _("total"));

   hash_free (htab);

--
1.6.0.4.1101.g642f8


From 622f12ed8fd799ad83546233a60655a6a0d2a4b6 Mon Sep 17 00:00:00 2001
From: Jim Meyering &lt;meyering&lt; at &gt;redhat.com&gt;
Date: Tue, 25 Nov 2008 18:38:26 +0100
Subject: [PATCH 2/2] wc: read and process --files0-from= input a name at a time,

when the file name list is not too large.  Before, wc would always
reading the entire file name list into RAM and *then* process each
file name.
* src/wc.c: Include "argv-iter.h".
(main): Rewrite to use argv-iter when the input file name list
is known to be too large.
* NEWS (Bug fixes): Mention it.
---
 NEWS     |    4 ++
 src/wc.c |  139 ++++++++++++++++++++++++++++++++++++++++++--------------------
 2 files changed, 99 insertions(+), 44 deletions(-)

diff --git a/NEWS b/NEWS
index 158b089..6a85dd7 100644
--- a/NEWS
+++ b/NEWS
&lt; at &gt;&lt; at &gt; -20,6 +20,10 &lt; at &gt;&lt; at &gt; GNU coreutils NEWS                                    -*- outline -*-
   Even with this patch, on some systems, it still produces invalid output,
   from 3 to at least 1026 lines long. [bug introduced in coreutils-6.11]

+  wc --files0-from=FILE no longer reads all of FILE into RAM, before
+  processing the first file name, unless the list of names is known
+  to be small enough.
+
 ** Changes in behavior

   cp and mv: the --reply={yes,no,query} option has been removed.
diff --git a/src/wc.c b/src/wc.c
index 8cfd974..25494d6 100644
--- a/src/wc.c
+++ b/src/wc.c
&lt; at &gt;&lt; at &gt; -20,14 +20,17 &lt; at &gt;&lt; at &gt;
 #include &lt;config.h&gt;

 #include &lt;stdio.h&gt;
+#include &lt;assert.h&gt;
 #include &lt;getopt.h&gt;
 #include &lt;sys/types.h&gt;
 #include &lt;wchar.h&gt;
 #include &lt;wctype.h&gt;

 #include "system.h"
+#include "argv-iter.h"
 #include "error.h"
 #include "mbchar.h"
+#include "physmem.h"
 #include "quote.h"
 #include "quotearg.h"
 #include "readtokens0.h"
&lt; at &gt;&lt; at &gt; -515,17 +518,19 &lt; at &gt;&lt; at &gt; wc_file (char const *file, struct fstatus *fstatus)
 /* Return the file status for the NFILES files addressed by FILE.
    Optimize the case where only one number is printed, for just one
    file; in that case we can use a print width of 1, so we don't need
-   to stat the file.  */
+   to stat the file.  Handle the case of (nfiles == 0) in the same way;
+   that happens when we don't know how long the list of file names will be.  */

 static struct fstatus *
-get_input_fstatus (int nfiles, char * const *file)
+get_input_fstatus (int nfiles, char *const *file)
 {
-  struct fstatus *fstatus = xnmalloc (nfiles, sizeof *fstatus);
+  struct fstatus *fstatus = xnmalloc (nfiles ? nfiles : 1, sizeof *fstatus);

-  if (nfiles == 1
-      &amp;&amp; ((print_lines + print_words + print_chars
-   + print_bytes + print_linelength)
-  == 1))
+  if (nfiles == 0
+      || (nfiles == 1
+  &amp;&amp; ((print_lines + print_words + print_chars
+       + print_bytes + print_linelength)
+      == 1)))
     fstatus[0].failed = 1;
   else
     {
&lt; at &gt;&lt; at &gt; -577,7 +582,6 &lt; at &gt;&lt; at &gt; compute_number_width (int nfiles, struct fstatus const *fstatus)
 int
 main (int argc, char **argv)
 {
-  int i;
   bool ok;
   int optc;
   int nfiles;
&lt; at &gt;&lt; at &gt; -637,6 +641,8 &lt; at &gt;&lt; at &gt; main (int argc, char **argv)
  | print_linelength))
     print_lines = print_words = print_bytes = true;

+  bool read_tokens = false;
+  struct argv_iterator *ai;
   if (files_from)
     {
       FILE *stream;
&lt; at &gt;&lt; at &gt; -661,69 +667,114 &lt; at &gt;&lt; at &gt; main (int argc, char **argv)
    quote (files_from));
 }

-      readtokens0_init (&amp;tok);
-
-      if (! readtokens0 (stream, &amp;tok) || fclose (stream) != 0)
-error (EXIT_FAILURE, 0, _("cannot read file names from %s"),
-       quote (files_from));
-
-      files = tok.tok;
-      nfiles = tok.n_tok;
+      /* Read the file list into RAM if we can detect its size and that
+ size is reasonable.  Otherwise, we'll read a name at a time.  */
+      struct stat st;
+      if (fstat (fileno (stream), &amp;st) == 0
+  &amp;&amp; S_ISREG (st.st_mode)
+  &amp;&amp; st.st_size &lt;= MIN (10 * 1024 * 1024, physmem_available () / 2))
+{
+  read_tokens = true;
+  readtokens0_init (&amp;tok);
+  if (! readtokens0 (stream, &amp;tok) || fclose (stream) != 0)
+    error (EXIT_FAILURE, 0, _("cannot read file names from %s"),
+   quote (files_from));
+  files = tok.tok;
+  nfiles = tok.n_tok;
+  ai = argv_iter_init_argv (files);
+}
+      else
+{
+  files = NULL;
+  nfiles = 0;
+  ai = argv_iter_init_stream (stream);
+}
     }
   else
     {
-      static char *stdin_only[2];
+      static char *stdin_only[] = { NULL };
       files = (optind &lt; argc ? argv + optind : stdin_only);
       nfiles = (optind &lt; argc ? argc - optind : 1);
-      stdin_only[0] = NULL;
+      ai = argv_iter_init_argv (files);
     }

   fstatus = get_input_fstatus (nfiles, files);
   number_width = compute_number_width (nfiles, fstatus);

+  int i;
   ok = true;
-  for (i = 0; i &lt; nfiles; i++)
+  for (i = 0; /* */; i++)
     {
-      if (files[i])
+      bool skip_file = false;
+      enum argv_iter_err ai_err;
+      char *file_name = argv_iter (ai, &amp;ai_err);
+      if (ai_err == AI_ERR_EOF)
+break;
+      if (!file_name)
 {
-  if (files_from &amp;&amp; STREQ (files_from, "-") &amp;&amp; STREQ (files[i], "-"))
+  switch (ai_err)
     {
-      ok = false;
-      /* Give a better diagnostic in an unusual case:
- printf - | wc --files0-from=- */
-      error (0, 0, _("when reading file names from stdin, "
-     "no file name of %s allowed"),
-     quote ("-"));
+    case AI_ERR_READ:
+      error (0, errno, _("%s: read error"), quote (files_from));
+      skip_file = true;
       continue;
+    case AI_ERR_MEM:
+      xalloc_die ();
+    default:
+      assert (!"unexpected error code from argv_iter");
     }
+}
+      if (files_from &amp;&amp; STREQ (files_from, "-") &amp;&amp; STREQ (file_name, "-"))
+{
+  /* Give a better diagnostic in an unusual case:
+     printf - | wc --files0-from=- */
+  error (0, 0, _("when reading file names from stdin, "
+ "no file name of %s allowed"),
+ quote (file_name));
+  skip_file = true;
+}

+      if (!file_name[0])
+{
   /* Diagnose a zero-length file name.  When it's one
-     among many, knowing the record number may help.  */
-  if (files[i][0] == '\0')
+     among many, knowing the record number may help.
+     FIXME: currently print the record number only with
+     --files0-from=FILE.  Maybe do it for argv, too?  */
+  if (files_from == NULL)
+    error (0, 0, "%s", _("invalid zero-length file name"));
+  else
     {
-      ok = false;
-      if (files_from)
-{
-  /* Using the standard `filename:line-number:' prefix here is
-     not totally appropriate, since NUL is the separator, not NL,
-     but it might be better than nothing.  */
-  unsigned long int file_number = i + 1;
-  error (0, 0, "%s:%lu: %s", quotearg_colon (files_from),
- file_number, _("invalid zero-length file name"));
-}
-      else
-error (0, 0, "%s", _("invalid zero-length file name"));
-      continue;
+      /* Using the standard `filename:line-number:' prefix here is
+ not totally appropriate, since NUL is the separator, not NL,
+ but it might be better than nothing.  */
+      unsigned long int file_number = argv_iter_n_args (ai);
+      error (0, 0, "%s:%lu: %s", quotearg_colon (files_from),
+     file_number, _("invalid zero-length file name"));
     }
+  skip_file = true;
 }

-      ok &amp;= wc_file (files[i], &amp;fstatus[i]);
+      if (skip_file)
+ok = false;
+      else
+ok &amp;= wc_file (file_name, &amp;fstatus[nfiles ? i : 0]);
     }

-  if (1 &lt; nfiles)
+  /* No arguments on the command line is fine.  That means read from stdin.
+     However, no arguments on the --files0-from input stream is an error
+     means don't read anything.  */
+  if (ok &amp;&amp; !files_from &amp;&amp; argv_iter_n_args (ai) == 0)
+    ok &amp;= wc_file (NULL, &amp;fstatus[0]);
+
+  if (read_tokens)
+    readtokens0_free (&amp;tok);
+
+  if (1 &lt; argv_iter_n_args (ai))
     write_counts (total_lines, total_words, total_chars, total_bytes,
   max_line_length, _("total"));

+  argv_iter_free (ai);
+
   free (fstatus);

   if (have_read_stdin &amp;&amp; close (STDIN_FILENO) != 0)
--
1.6.0.4.1101.g642f8
</description>
    <dc:creator>Jim Meyering</dc:creator>
    <dc:date>2008-12-01T19:23:23</dc:date>
  </item>
  <item rdf:about="http://permalink.gmane.org/gmane.comp.gnu.core-utils.bugs/15229">
    <title>Re: [bug #24974] Document that comm's option "-1","-2" and "-3" can be combined</title>
    <link>http://permalink.gmane.org/gmane.comp.gnu.core-utils.bugs/15229</link>
    <description>
Ha, I actually tried to infer the meaning from the existing docs
and got more confused. Having a quick look at the code suggests
that {none, warning, fatal} are in fact the 3 modes of operation,
and so --check-order={none,warning,fatal} is best as you suggest.

If we were going to change it I would not support both.
I.E. I would not support the --nocheck-order option.
I guess very few scripts actually use the --nocheck-order option.

I'll think about some doc changes at least to make it clearer.

cheers,
Pádraig.
</description>
    <dc:creator>Pádraig Brady</dc:creator>
    <dc:date>2008-12-01T17:15:36</dc:date>
  </item>
  <item rdf:about="http://permalink.gmane.org/gmane.comp.gnu.core-utils.bugs/15228">
    <title>avoid a warning in hostname.c</title>
    <link>http://permalink.gmane.org/gmane.comp.gnu.core-utils.bugs/15228</link>
    <description>I also pushed another little change:

http://git.savannah.gnu.org/gitweb/?p=coreutils.git;a=commitdiff;h=21eb87e6eafee9111ac2da32cfbfb9ee34a4b465

commit 21eb87e6eafee9111ac2da32cfbfb9ee34a4b465
Author: Jim Meyering &lt;meyering&lt; at &gt;redhat.com&gt;
Date:   Mon Dec 1 07:27:55 2008 +0100

    * src/hostname.c (sethostname) [!HAVE_SETHOSTNAME]: Remove declaration.

diff --git a/src/hostname.c b/src/hostname.c
index b325c27..89cc568 100644
--- a/src/hostname.c
+++ b/src/hostname.c
&lt; at &gt;&lt; at &gt; -32,15 +32,11 &lt; at &gt;&lt; at &gt;

 #define AUTHORS proper_name ("Jim Meyering")

-#if HAVE_SETHOSTNAME &amp;&amp; !defined sethostname
-int sethostname ();
-#endif
-
 #if !defined HAVE_SETHOSTNAME &amp;&amp; defined HAVE_SYSINFO &amp;&amp; \
      defined HAVE_SYS_SYSTEMINFO_H
 # include &lt;sys/systeminfo.h&gt;

-int
+static int
 sethostname (char *name, size_t namelen)
 {
   /* Using sysinfo() is the SVR4 mechanism to set a hostname. */
</description>
    <dc:creator>Jim Meyering</dc:creator>
    <dc:date>2008-12-01T17:09:49</dc:date>
  </item>
  <item rdf:about="http://permalink.gmane.org/gmane.comp.gnu.core-utils.bugs/15227">
    <title>FYI: argv-iter: new module</title>
    <link>http://permalink.gmane.org/gmane.comp.gnu.core-utils.bugs/15227</link>
    <description>I've just pushed the argv-iter module:
(with a few tweaks since the initial discussion),

  http://git.savannah.gnu.org/gitweb/?p=coreutils.git;a=commitdiff;h=ca738e4414

along with a test module:

  http://git.savannah.gnu.org/gitweb/?p=coreutils.git;a=commitdiff;h=d3b5555f10

and code to make coreutils use the new module:

  http://git.savannah.gnu.org/gitweb/?p=coreutils.git;a=commitdiff;h=80325aca2d

This is all in preparation for the fix for
the bug in du's --files0-from=F implementation,
which will follow soon.

wc needs a similar fix, but can benefit from having
the entire list of file names up front (alignment),
so there's a twist.
</description>
    <dc:creator>Jim Meyering</dc:creator>
    <dc:date>2008-12-01T17:08:03</dc:date>
  </item>
  <item rdf:about="http://permalink.gmane.org/gmane.comp.gnu.core-utils.bugs/15226">
    <title>Re: [bug #24974] Document that comm's option "-1","-2" and "-3" can be combined</title>
    <link>http://permalink.gmane.org/gmane.comp.gnu.core-utils.bugs/15226</link>
    <description>
Hi Pádraig,

If I remember correctly the three possibilities are effectively severity
levels for an 'out-of-order' exception:

--nocheck-order =&gt; SILENT (don't actually check)
  [DEFAULT]     =&gt; WARNING
--check-order   =&gt; FATAL

For me "mismatch" and "unsorted" aren't obvious keywords, but I can see
how an argument to the --check-order option could be clearer than the
current interface.

Would an _optional_ argument using a scheme like the one you suggested
above be worth providing?  I suspect it might actually add to confusion
due to the need for continued support for the current scheme as well,
but it should be possible to allow both:

--nocheck-order =&gt; --check-order=none
  [DEFAULT]     =&gt; --check-order=warning
--check-order   =&gt; --check-order=fatal

Thanks,

Bo
</description>
    <dc:creator>Bo Borgerson</dc:creator>
    <dc:date>2008-12-01T16:45:13</dc:date>
  </item>
  <item rdf:about="http://permalink.gmane.org/gmane.comp.gnu.core-utils.bugs/15225">
    <title>[bug #1212] wishlist: ls sort case insensitive option</title>
    <link>http://permalink.gmane.org/gmane.comp.gnu.core-utils.bugs/15225</link>
    <description>
Follow-up Comment #8, bug #1212 (project coreutils):

http://sexintheshower.sensualwriter.com/ sex in the shower
http://sexintheshower.sensualwriter.com/2008/12/01/teen-girl-fingering-and-masturbating-in-the-shower-video/
Teen girl fingering and masturbating in the shower video


    _______________________________________________________

Reply to this item at:

  &lt;http://savannah.gnu.org/bugs/?1212&gt;

_______________________________________________
  Message sent via/by Savannah
  http://savannah.gnu.org/
</description>
    <dc:creator>alez</dc:creator>
    <dc:date>2008-12-01T14:26:13</dc:date>
  </item>
  <item rdf:about="http://permalink.gmane.org/gmane.comp.gnu.core-utils.bugs/15224">
    <title>Re: du --files-from feature request</title>
    <link>http://permalink.gmane.org/gmane.comp.gnu.core-utils.bugs/15224</link>
    <description>
OK I've just pushed this as it's a net reduction of 18 lines
in the info doc, and I think it makes it more consistent:

http://git.savannah.gnu.org/gitweb/?p=coreutils.git;a=commitdiff;h=aa2617b9086ca7ffaf49fd22c0b54ab58c2107fd

cheers,
Pádraig.
</description>
    <dc:creator>Pádraig Brady</dc:creator>
    <dc:date>2008-12-01T14:13:15</dc:date>
  </item>
  <item rdf:about="http://permalink.gmane.org/gmane.comp.gnu.core-utils.bugs/15223">
    <title>Failure to compile latest coreutils-6.12</title>
    <link>http://permalink.gmane.org/gmane.comp.gnu.core-utils.bugs/15223</link>
    <description>Hello guys,

I am using 2.6.21.5 kernel (gcc 4.3.2, ld 2.17.50.0.17*). I've tried
compiling the latest coreutils
that I downloaded from the official website and I keep getting the same
error message.

mv unistd.h-t unistd.h
make  all-am
make[3]: Entering directory `/mnt/lfs/tmp/coreutils-6.12/lib'
depbase=`echo set-mode-acl.o | sed 's|[^/]*$|.deps/&amp;|;s|\.o$||'`;\
        gcc -std=gnu99  -I.      -g -O2 -MT set-mode-acl.o -MD -MP -MF
$depbase.Tpo -c -o set-mode-acl.o set-mode-acl.c &amp;&amp;\
        mv -f $depbase.Tpo $depbase.Po
In file included from acl.h:20,
                 from set-mode-acl.c:22:
/usr/include/sys/types.h:52: error: two or more data types in declaration
specifiers
/usr/include/sys/types.h:52: error: two or more data types in declaration
specifiers
/usr/include/sys/types.h:52: error: two or more data types in declaration
specifiers
/usr/include/sys/types.h:72: error: two or more data types in declaration
specifiers
/usr/include/sys/types.h:77: error: two or more data types in declaration
specifiers
/usr/include/sys/types.h:100: error: two or more data types in declaration
specifiers
In file included from gettext.h:169,
                 from acl-internal.h:49,
                 from set-mode-acl.c:24:
./string.h:214: error: expected identifier or '(' before '__extension__'


Also during configure process I've noticed this message.

configure: WARNING: sys/sysmacros.h: present but cannot be compiled
configure: WARNING: sys/sysmacros.h:     check for missing prerequisite
headers?
configure: WARNING: sys/sysmacros.h: see the Autoconf documentation
configure: WARNING: sys/sysmacros.h:     section "Present But Cannot Be
Compiled"
configure: WARNING: sys/sysmacros.h: proceeding with the preprocessor's
result
configure: WARNING: sys/sysmacros.h: in the future, the compiler will take
precedence
configure: WARNING:     ## ------------------------------------ ##
configure: WARNING:     ## Report this to bug-coreutils&lt; at &gt;gnu.org ##
configure: WARNING:     ## ------------------------------------ ##


Looks like there is a confusion with the data types &lt;sys/types.h&gt; file which
is followed by the parse error
at the end. Hope this info helps. I'll try editing sys/types.h tomorrow and
see where I can get. I also have applied 2 patches

../coreutils-6.12-i18n-2.patch
../utils/coreutils-6.12-uname-1.patch

It seems to be a bug. Please help me resolve this one.
Thanks for your support, it is greatly appreciated.

Best Regards,
Andrew
</description>
    <dc:creator>EA Games</dc:creator>
    <dc:date>2008-12-01T13:49:57</dc:date>
  </item>
  <item rdf:about="http://permalink.gmane.org/gmane.comp.gnu.core-utils.bugs/15222">
    <title>Re: [bug #24949] coreutils pwd not implementing latest POSIXfeatures</title>
    <link>http://permalink.gmane.org/gmane.comp.gnu.core-utils.bugs/15222</link>
    <description>
We're just waiting for someone to write the patch.
If you can spare the time to do the complete job, please let us know.
</description>
    <dc:creator>Jim Meyering</dc:creator>
    <dc:date>2008-12-01T13:40:40</dc:date>
  </item>
  <item rdf:about="http://permalink.gmane.org/gmane.comp.gnu.core-utils.bugs/15221">
    <title>Re: [bug #24949] coreutils pwd not implementing latest POSIXfeatures</title>
    <link>http://permalink.gmane.org/gmane.comp.gnu.core-utils.bugs/15221</link>
    <description>
On some embedded systems where the rootfs is in a ramdisk I use, for
example, microperl.  This is an amazingly flexible and powerful
scripting language with a very small footprint, BUT it contains no Perl
modules whatsoever.  Some of these systems use busybox pwd but not all.

And of course there are other scripting languages that would like to
invoke pwd that don't have their own built-in modules.  Even just
writing a portable sh script isn't easy since POSIX-compliant sh's are
not required to have a built-in pwd.


I should admit that regardless of how this turns out I'll have to take
defensive measures since any change in coreutils, even if made today,
can't be relied upon "in the wild" for many years to come.  Still, we
should DTRT where possible.

</description>
    <dc:creator>Paul Smith</dc:creator>
    <dc:date>2008-12-01T13:13:32</dc:date>
  </item>
  <item rdf:about="http://permalink.gmane.org/gmane.comp.gnu.core-utils.bugs/15220">
    <title>Re: du --files-from feature request</title>
    <link>http://permalink.gmane.org/gmane.comp.gnu.core-utils.bugs/15220</link>
    <description>
Noticed that, thanks.

On a related note, would the attached patch be useful,
as I found inconsistent descriptions of ASCII NUL
throughout the info doc.

cheers,
Pádraig.
_______________________________________________
Bug-coreutils mailing list
Bug-coreutils&lt; at &gt;gnu.org
http://lists.gnu.org/mailman/listinfo/bug-coreutils
</description>
    <dc:creator>Pádraig Brady</dc:creator>
    <dc:date>2008-12-01T10:53:49</dc:date>
  </item>
  <item rdf:about="http://permalink.gmane.org/gmane.comp.gnu.core-utils.bugs/15219">
    <title>Re: [bug #24949] coreutils pwd not implementing latest POSIXfeatures</title>
    <link>http://permalink.gmane.org/gmane.comp.gnu.core-utils.bugs/15219</link>
    <description>
If you can rely enough on the platform being POSIX-conforming for -P
to work, then why not just use Perl's POSIX module?   It seems to me
that that would be more portable still.

~$ cat  pwd.pl
#! /usr/bin/perl

use POSIX qw(getcwd);
print "1: " . POSIX::getcwd() . "\n";

my $pwd = `pwd`; chop($pwd);
print "2: " . $pwd . "\n";

my $pwd = `pwd -P 2&gt;/dev/null || pwd`; chop($pwd);
print "3: " . $pwd . "\n";

~$ perl pwd.pl
1: /home/james
2: /home/james
3: /home/james


James.
</description>
    <dc:creator>James Youngman</dc:creator>
    <dc:date>2008-12-01T10:33:47</dc:date>
  </item>
  <textinput about="http://search.gmane.org/?group=$group=gmane.comp.gnu.core-utils.bugs">
    <title>Search Engine</title>
    <description>Search the mailing list at Gmane</description>
    <name>query</name>
    <link>http://search.gmane.org/?group=$group=gmane.comp.gnu.core-utils.bugs</link>
  </textinput>
</rdf:RDF>
