GNU bug report logs - #23324
shell-resync-dirs does not handle dirs with whitespace

Please note: This is a static page, with minimal formatting, updated once a day.
Click here to see this page with the latest information and nicer formatting.

Package: emacs; Severity: minor; Reported by: Noah Friedman <friedman@HIDDEN>; Keywords: patch; merged with #9379, #11608, #23326; dated Thu, 21 Apr 2016 03:38:02 UTC; Maintainer for emacs is bug-gnu-emacs@HIDDEN.

Message received at 23324 <at> debbugs.gnu.org:


Received: (at 23324) by debbugs.gnu.org; 3 Sep 2018 17:09:02 +0000
From debbugs-submit-bounces <at> debbugs.gnu.org Mon Sep 03 13:09:02 2018
Received: from localhost ([127.0.0.1]:44555 helo=debbugs.gnu.org)
	by debbugs.gnu.org with esmtp (Exim 4.84_2)
	(envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>)
	id 1fwsLV-00083L-Qq
	for submit <at> debbugs.gnu.org; Mon, 03 Sep 2018 13:09:02 -0400
Received: from mail-io0-f174.google.com ([209.85.223.174]:43742)
 by debbugs.gnu.org with esmtp (Exim 4.84_2)
 (envelope-from <npostavs@HIDDEN>)
 id 1fwsLS-00082p-0p; Mon, 03 Sep 2018 13:08:58 -0400
Received: by mail-io0-f174.google.com with SMTP id y10-v6so861007ioa.10;
 Mon, 03 Sep 2018 10:08:58 -0700 (PDT)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025;
 h=from:to:cc:subject:references:date:in-reply-to:message-id
 :user-agent:mime-version;
 bh=T6qj1C40tG4OdcLoUDc+gRpO48rv0znfcvT57bb+VxY=;
 b=TJI8MOTCX6bPAfUHldsuQBkI5CX9W6IztLQrBQ8nKDtNntVq57XjbgbRgLctHWr1x3
 rBfFrxoSNDEsk0kAJaLzIGS/1dgqSfnPTtKH497jSq3zadTVbjVbMjKJWgXDVR2xHUev
 rbiOlFhKGK+fx8co7N8cLlnp7QF1ZL8pNejMfm/Ag6foc/vLP7OTrh3U2eXe9RSkeKlb
 OSi4b170NDIAyBtXMCuE20XUtwaOwoVs+gTuFDNuII9m5UCVSa3adkk3jABCOi5BguRJ
 LbxHT/opS6tFqMVOuiRFZBNWW4b7snS7ctcnYNGFMlU8TMpLsAk+fcr0p4FLTFUXsnUZ
 9LMQ==
X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed;
 d=1e100.net; s=20161025;
 h=x-gm-message-state:from:to:cc:subject:references:date:in-reply-to
 :message-id:user-agent:mime-version;
 bh=T6qj1C40tG4OdcLoUDc+gRpO48rv0znfcvT57bb+VxY=;
 b=QtgfoljrkFL3+6gMPOhy5joYk96H6LsEz0Q2Xl+ZE2kxVKmamhQUyALicListOteCb
 LT9fnL3McYiXbe/kFXOAYEQ6Ai1LdVICLxACx0YB316guFf4I4nhdrxFmp32qYU2/Ymg
 N0lX1HCbVZJXp5w5ry2SlbpgMJbVmljafa/NK8SXjhk63c32rPCtdjOjTGZuNlRdOTvd
 JBzhvXecnDavZEIq/hIxKl+LF72UBtDDTMacjxbOZEbpksFcT6+JSol9OKOvYNXsQeOq
 36pbfNRW+AWJPEKQJYkWTHdcPyqB6LTBrq6MB0vi0ta9cEDRJ2Y1QhMxKpUnkgMI/RBB
 WbPw==
X-Gm-Message-State: APzg51DXSYepRB5R/T1RS6iacOJ/lNoSkD/mNfY/BvRUjyhqv2i717Ro
 TXSKggtV3+1sr/i0Nibji5ILq11W
X-Google-Smtp-Source: ANB0Vdbrq/+fVHnHIzeRx5WfwRaKY/akf1KQqWzffHtcz2d66MHwTPQNv/FnjgM3Mm7monp48C8WjQ==
X-Received: by 2002:a5e:890f:: with SMTP id k15-v6mr5801343ioj.9.1535994532237; 
 Mon, 03 Sep 2018 10:08:52 -0700 (PDT)
Received: from zebian (cbl-45-2-119-34.yyz.frontiernetworks.ca. [45.2.119.34])
 by smtp.googlemail.com with ESMTPSA id
 n140-v6sm6692198itb.37.2018.09.03.10.08.50
 (version=TLS1_2 cipher=ECDHE-RSA-CHACHA20-POLY1305 bits=256/256);
 Mon, 03 Sep 2018 10:08:51 -0700 (PDT)
From: Noam Postavsky <npostavs@HIDDEN>
To: Noah Friedman <friedman@HIDDEN>
Subject: Re: bug#23324: shell-resync-dirs does not handle dirs with whitespace
References: <20160420193843.651480.FMU1050@HIDDEN>
Date: Mon, 03 Sep 2018 13:08:42 -0400
In-Reply-To: <20160420193843.651480.FMU1050@HIDDEN>
 (Noah Friedman's message of "Wed, 20 Apr 2016 19:38:43 -0700 (PDT)")
Message-ID: <8736uqik4l.fsf@HIDDEN>
User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/26.1 (gnu/linux)
MIME-Version: 1.0
Content-Type: text/plain
X-Spam-Score: 0.0 (/)
X-Debbugs-Envelope-To: 23324
Cc: 23324 <at> debbugs.gnu.org
X-BeenThere: debbugs-submit <at> debbugs.gnu.org
X-Mailman-Version: 2.1.18
Precedence: list
List-Id: <debbugs-submit.debbugs.gnu.org>
List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe>
List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/>
List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org>
List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help>
List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe>
Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org
Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
X-Spam-Score: -1.0 (-)

forcemerge 23324 11608 9379
quit

Noah Friedman <friedman@HIDDEN> writes:

> I have a fix for this, but I'd like for someone else to look over it and
> perhaps sanity check it before I commit it.  Volunteers?

> This is a very old limitation.

By now this is a fairly old patch, but still in need of review it seems.

> +      (let* ((dls (buffer-substring-no-properties (match-beginning 0) (1- (match-end 0))))
> +             (dlsl '())
> +             (pos 0)
> +             (ds '()))
> +        ;; Split the dirlist into whitespace and non-whitespace chunks.
> +        ;; dlsl will be a reversed list of tokens.
> +        (while (string-match "\\(\\S-+\\|\\s-+\\)" dls pos)
> +          (push (match-string 1 dls) dlsl)
> +          (setq pos (match-end 1)))
> +
> +        ;; prepend trailing entries until they form an existing directory,
> +        ;; whitespace and all.  discard the next whitespace and repeat.

I think this loop is going in the wrong direction (i.e., it should
rather be appending leading entries).  Because of this, it can be fooled
by subdirectories with a name matching a substring of a dirs entry:

    ~$ mkdir -p 'foo bar/bar/'
    ~$ cd 'foo bar/'
    ~/foo bar$ command dirs # M-x dirs
    # infloops...

> +          (let ((newelt "")
> +                tem1 tem2)

I'm also not a fan of the somewhat inscrutable tem1 & tem2 names.





Information forwarded to bug-gnu-emacs@HIDDEN:
bug#23324; Package emacs. Full text available.
Forcibly Merged 9379 11608 23324 23326. Request was from Noam Postavsky <npostavs@HIDDEN> to control <at> debbugs.gnu.org. Full text available.
Added tag(s) patch. Request was from Lars Magne Ingebrigtsen <larsi@HIDDEN> to control <at> debbugs.gnu.org. Full text available.
Severity set to 'minor' from 'normal' Request was from Glenn Morris <rgm@HIDDEN> to control <at> debbugs.gnu.org. Full text available.
Merged 23324 23326. Request was from Glenn Morris <rgm@HIDDEN> to control <at> debbugs.gnu.org. Full text available.

Message received at submit <at> debbugs.gnu.org:


Received: (at submit) by debbugs.gnu.org; 21 Apr 2016 03:37:54 +0000
From debbugs-submit-bounces <at> debbugs.gnu.org Wed Apr 20 23:37:54 2016
Received: from localhost ([127.0.0.1]:41798 helo=debbugs.gnu.org)
	by debbugs.gnu.org with esmtp (Exim 4.84_2)
	(envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>)
	id 1at5RB-0008ES-Ku
	for submit <at> debbugs.gnu.org; Wed, 20 Apr 2016 23:37:53 -0400
Received: from eggs.gnu.org ([208.118.235.92]:54821)
 by debbugs.gnu.org with esmtp (Exim 4.84_2)
 (envelope-from <friedman@HIDDEN>) id 1at5RA-0008E9-Au
 for submit <at> debbugs.gnu.org; Wed, 20 Apr 2016 23:37:52 -0400
Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71)
 (envelope-from <friedman@HIDDEN>) id 1at5R3-0008FQ-VI
 for submit <at> debbugs.gnu.org; Wed, 20 Apr 2016 23:37:47 -0400
X-Spam-Checker-Version: SpamAssassin 3.3.2 (2011-06-06) on eggs.gnu.org
X-Spam-Level: 
X-Spam-Status: No, score=0.8 required=5.0 tests=BAYES_50,T_DKIM_INVALID
 autolearn=disabled version=3.3.2
Received: from lists.gnu.org ([2001:4830:134:3::11]:36504)
 by eggs.gnu.org with esmtp (Exim 4.71)
 (envelope-from <friedman@HIDDEN>) id 1at5R3-0008FM-Rk
 for submit <at> debbugs.gnu.org; Wed, 20 Apr 2016 23:37:45 -0400
Received: from eggs.gnu.org ([2001:4830:134:3::10]:45769)
 by lists.gnu.org with esmtp (Exim 4.71)
 (envelope-from <friedman@HIDDEN>) id 1at5R2-00072h-Ek
 for bug-gnu-emacs@HIDDEN; Wed, 20 Apr 2016 23:37:45 -0400
Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71)
 (envelope-from <friedman@HIDDEN>) id 1at5R0-0008Ej-5Y
 for bug-gnu-emacs@HIDDEN; Wed, 20 Apr 2016 23:37:44 -0400
Received: from bacon-event-horizon.splode.com
 ([2600:3c01::f03c:91ff:fe96:f92b]:54172 helo=splode.com)
 by eggs.gnu.org with esmtp (Exim 4.71)
 (envelope-from <friedman@HIDDEN>) id 1at5Qz-0008EA-Tn
 for bug-gnu-emacs@HIDDEN; Wed, 20 Apr 2016 23:37:42 -0400
Received: from unexploded-cow.prv.splode.com (prv.splode.com [173.8.128.9])
 (authenticated bits=0)
 by splode.com (8.15.2/8.15.2) with ESMTPSA id u3L2chKH026519
 (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO)
 for <bug-gnu-emacs@HIDDEN>; Wed, 20 Apr 2016 19:38:44 -0700
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=splode.com;
 s=splode-20130101; t=1461206324;
 bh=8j5sZbTnYbGEOSdsGZ8yDl6BNHAtMAFpCNsxQ3CP6SA=;
 h=From:To:Subject:Reply-To:Date:From;
 b=t4WqlZ6duX0ETLEi+v9WD9+bFww30WCSUbQuCAjTJzynvL9R0ZG/rWnoy+cny1Wzq
 zcwJ135xQHWcx16eg5gbUdRKRelubn9K5FmBPOBRtD+kQsTPUqxJycu3ZyfS0Q95we
 pCfjIvLF1D6Nsyc2cdJUPG7Xk/M58pjbchAk3Ufs=
MIME-Version: 1.0
Content-Type: multipart/mixed;
 boundary="Bridge/POCSAG/South-Africa/Hamas/anarchy/Cohiba/QXdD9TUv7D"
Content-Transfer-Encoding: 7bit
From: Noah Friedman <friedman@HIDDEN>
To: bug-gnu-emacs@HIDDEN
Subject: shell-resync-dirs does not handle dirs with whitespace
Date: Wed, 20 Apr 2016 19:38:43 -0700 (PDT)
Message-Id: <20160420193843.651480.FMU1050@HIDDEN>
X-detected-operating-system: by eggs.gnu.org: Genre and OS details not
 recognized.
X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.6.x
X-Received-From: 2001:4830:134:3::11
X-Spam-Score: -1.4 (-)
X-Debbugs-Envelope-To: submit
X-BeenThere: debbugs-submit <at> debbugs.gnu.org
X-Mailman-Version: 2.1.18
Precedence: list
List-Id: <debbugs-submit.debbugs.gnu.org>
List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe>
List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/>
List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org>
List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help>
List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe>
Reply-To: Noah Friedman <friedman@HIDDEN>
Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org
Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
X-Spam-Score: -1.4 (-)


--Bridge/POCSAG/South-Africa/Hamas/anarchy/Cohiba/QXdD9TUv7D
Content-Type: text/plain; charset=utf-8
Content-Description: message body text
Content-Transfer-Encoding: quoted-printable

I have a fix for this, but I'd like for someone else to look over it an=
d
perhaps sanity check it before I commit it.  Volunteers=3F

This is a very old limitation.

Let's say I have three directories in my shell buffer directory stack:

=09/s/software/wwwroot/Java Development Kit
=09/s/software/wwwroot/Perl Compatible Regular Expressions
=09~/src/build/depot/main/tools/build

If I run M-x shell-resync-dirs, I simply get the error:

=09Couldn=E2=80=99t cd: (error No such directory found via CDPATH envir=
onment variable)

because the directory "/s/software/wwwroot/Java" doesn't exist.  The pa=
rser
considers whitespace to be a separator between directory tokens.

This version handles that case.

Diff and full function attached below.


--Bridge/POCSAG/South-Africa/Hamas/anarchy/Cohiba/QXdD9TUv7D
Content-Type: text/plain; name="ChangeLog"
Content-Disposition: inline;
	filename="ChangeLog"
Content-Transfer-Encoding: 7bit

2016-04-21  Noah Friedman  <friedman@HIDDEN>

	* lisp/shell.el (shell-resync-dirs): Correctly handle
	whitespace in directory names.

--Bridge/POCSAG/South-Africa/Hamas/anarchy/Cohiba/QXdD9TUv7D
Content-Type: text/plain; name="shell.el.diff"
Content-Disposition: inline;
	filename="shell.el.diff"
Content-Transfer-Encoding: 7bit

--- 2016-04-20--18-08-56--0c9f35a/lisp/shell.el.~1~	2016-01-01 01:34:24.000000000 -0800
+++ 2016-04-20--18-08-56--0c9f35a/lisp/shell.el	2016-04-20 19:24:25.534756498 -0700
@@ -985,45 +985,62 @@
       ;; If the process echoes commands, don't insert a fake command in
       ;; the buffer or it will appear twice.
       (unless comint-process-echoes
-	(insert shell-dirstack-query) (insert "\n"))
+	(insert shell-dirstack-query "\n"))
       (sit-for 0)			; force redisplay
       (comint-send-string proc shell-dirstack-query)
       (comint-send-string proc "\n")
       (set-marker pmark (point))
       (let ((pt (point))
-	    (regexp
-	     (concat
-	      (if comint-process-echoes
-		  ;; Skip command echo if the process echoes
-		  (concat "\\(" (regexp-quote shell-dirstack-query) "\n\\)")
-		"\\(\\)")
-	      "\\(.+\n\\)")))
+	    (regexp (concat
+                     (if comint-process-echoes
+                         ;; Skip command echo if the process echoes
+                         (concat "\\(" (regexp-quote shell-dirstack-query) "\n\\)")
+                       "\\(\\)")
+                     "\\(.+\n\\)")))
 	;; This extra newline prevents the user's pending input from spoofing us.
-	(insert "\n") (backward-char 1)
+	(insert "\n")
+        (backward-char 1)
 	;; Wait for one line.
 	(while (not (looking-at regexp))
-	  (accept-process-output proc)
+	  (accept-process-output proc 1)
 	  (goto-char pt)))
-      (goto-char pmark) (delete-char 1) ; remove the extra newline
+      (goto-char pmark)
+      (delete-char 1) ; remove the extra newline
+
       ;; That's the dirlist. grab it & parse it.
-      (let* ((dl (buffer-substring (match-beginning 2) (1- (match-end 2))))
-	     (dl-len (length dl))
-	     (ds '())			; new dir stack
-	     (i 0))
-	(while (< i dl-len)
-	  ;; regexp = optional whitespace, (non-whitespace), optional whitespace
-	  (string-match "\\s *\\(\\S +\\)\\s *" dl i) ; pick off next dir
-	  (setq ds (cons (concat comint-file-name-prefix
-				 (substring dl (match-beginning 1)
-					    (match-end 1)))
-			 ds))
-	  (setq i (match-end 0)))
-	(let ((ds (nreverse ds)))
-	  (with-demoted-errors "Couldn't cd: %s"
-	    (shell-cd (car ds))
-	    (setq shell-dirstack (cdr ds)
-		  shell-last-dir (car shell-dirstack))
-	    (shell-dirstack-message)))))
+      (let* ((dls (buffer-substring-no-properties (match-beginning 0) (1- (match-end 0))))
+             (dlsl '())
+             (pos 0)
+             (ds '()))
+        ;; Split the dirlist into whitespace and non-whitespace chunks.
+        ;; dlsl will be a reversed list of tokens.
+        (while (string-match "\\(\\S-+\\|\\s-+\\)" dls pos)
+          (push (match-string 1 dls) dlsl)
+          (setq pos (match-end 1)))
+
+        ;; prepend trailing entries until they form an existing directory,
+        ;; whitespace and all.  discard the next whitespace and repeat.
+        (while dlsl
+          (let ((newelt "")
+                tem1 tem2)
+            (while newelt
+              ;; We need tem1 because we don't want to prepend
+              ;; comint-file-name-prefix repeatedly into newelt via tem2.
+              (setq tem1 (pop dlsl)
+                    tem2 (concat comint-file-name-prefix tem newelt))
+              (cond ((file-directory-p tem2)
+                     (push tem2 ds)
+                     (when (string= " " (car dlsl))
+                       (pop dlsl))
+                     (setq newelt nil))
+                    (t
+                     (setq newelt (concat tem1 newelt)))))))
+
+        (with-demoted-errors "Couldn't cd: %s"
+          (shell-cd (car ds))
+          (setq shell-dirstack (cdr ds)
+                shell-last-dir (car shell-dirstack))
+          (shell-dirstack-message))))
     (if started-at-pmark (goto-char (marker-position pmark)))))
 
 ;; For your typing convenience:

--Bridge/POCSAG/South-Africa/Hamas/anarchy/Cohiba/QXdD9TUv7D
Content-Type: text/plain; name="shell-resync-dirs.el"
Content-Disposition: inline;
	filename="shell-resync-dirs.el"
Content-Transfer-Encoding: 7bit

(defun shell-resync-dirs ()
  "Resync the buffer's idea of the current directory stack.
This command queries the shell with the command bound to
`shell-dirstack-query' (default \"dirs\"), reads the next
line output and parses it to form the new directory stack.
DON'T issue this command unless the buffer is at a shell prompt.
Also, note that if some other subprocess decides to do output
immediately after the query, its output will be taken as the
new directory stack -- you lose.  If this happens, just do the
command again."
  (interactive)
  (let* ((proc (get-buffer-process (current-buffer)))
	 (pmark (process-mark proc))
	 (started-at-pmark (= (point) (marker-position pmark))))
    (save-excursion
      (goto-char pmark)
      ;; If the process echoes commands, don't insert a fake command in
      ;; the buffer or it will appear twice.
      (unless comint-process-echoes
	(insert shell-dirstack-query "\n"))
      (sit-for 0)			; force redisplay
      (comint-send-string proc shell-dirstack-query)
      (comint-send-string proc "\n")
      (set-marker pmark (point))
      (let ((pt (point))
	    (regexp (concat
                     (if comint-process-echoes
                         ;; Skip command echo if the process echoes
                         (concat "\\(" (regexp-quote shell-dirstack-query) "\n\\)")
                       "\\(\\)")
                     "\\(.+\n\\)")))
	;; This extra newline prevents the user's pending input from spoofing us.
	(insert "\n")
        (backward-char 1)
	;; Wait for one line.
	(while (not (looking-at regexp))
	  (accept-process-output proc 1)
	  (goto-char pt)))
      (goto-char pmark)
      (delete-char 1) ; remove the extra newline

      ;; That's the dirlist. grab it & parse it.
      (let* ((dls (buffer-substring-no-properties (match-beginning 0) (1- (match-end 0))))
             (dlsl '())
             (pos 0)
             (ds '()))
        ;; Split the dirlist into whitespace and non-whitespace chunks.
        ;; dlsl will be a reversed list of tokens.
        (while (string-match "\\(\\S-+\\|\\s-+\\)" dls pos)
          (push (match-string 1 dls) dlsl)
          (setq pos (match-end 1)))

        ;; prepend trailing entries until they form an existing directory,
        ;; whitespace and all.  discard the next whitespace and repeat.
        (while dlsl
          (let ((newelt "")
                tem1 tem2)
            (while newelt
              ;; We need tem1 because we don't want to prepend
              ;; comint-file-name-prefix repeatedly into newelt via tem2.
              (setq tem1 (pop dlsl)
                    tem2 (concat comint-file-name-prefix tem newelt))
              (cond ((file-directory-p tem2)
                     (push tem2 ds)
                     (when (string= " " (car dlsl))
                       (pop dlsl))
                     (setq newelt nil))
                    (t
                     (setq newelt (concat tem1 newelt)))))))

        (with-demoted-errors "Couldn't cd: %s"
          (shell-cd (car ds))
          (setq shell-dirstack (cdr ds)
                shell-last-dir (car shell-dirstack))
          (shell-dirstack-message))))
    (if started-at-pmark (goto-char (marker-position pmark)))))

--Bridge/POCSAG/South-Africa/Hamas/anarchy/Cohiba/QXdD9TUv7D--




Acknowledgement sent to Noah Friedman <friedman@HIDDEN>:
New bug report received and forwarded. Copy sent to bug-gnu-emacs@HIDDEN. Full text available.
Report forwarded to bug-gnu-emacs@HIDDEN:
bug#23324; Package emacs. Full text available.
Please note: This is a static page, with minimal formatting, updated once a day.
Click here to see this page with the latest information and nicer formatting.
Last modified: Mon, 3 Sep 2018 17:15:03 UTC

GNU bug tracking system
Copyright (C) 1999 Darren O. Benham, 1997 nCipher Corporation Ltd, 1994-97 Ian Jackson.