cvs-cvs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Cvs-cvs] ccvs/src ChangeLog admin.c client.c gpg.c gpg.h... [signed-com


From: Derek Robert Price
Subject: [Cvs-cvs] ccvs/src ChangeLog admin.c client.c gpg.c gpg.h... [signed-commits3]
Date: Wed, 11 Jan 2006 04:37:09 +0000

CVSROOT:        /cvsroot/cvs
Module name:    ccvs
Branch:         signed-commits3
Changes by:     Derek Robert Price <address@hidden>     06/01/11 04:37:08

Modified files:
        src            : ChangeLog admin.c client.c gpg.c gpg.h log.c 
                         rcs.c rcs.h sanity.sh server.c sign.c verify.c 
                         vers_ts.c vers_ts.h 

Log message:
        * admin.c: Use "wrapper.h".
        * client.c (client_base_signatures): Allow removal of signature files.
        (handle_base_signature): Support new clear argument for
        client_base_signatures.
        (handle_base_clear_signature): New file.
        (responses): Add Base-clear-signatures.
        * gpg.c (parse_signature): Preserve raw signature.
        * gpg.h (struct openpgp_signature): Add storage for raw signature.
        * log.c (log_version): Display only low 32 bits of key IDs to users,
        mimicing GnuPG.
        * rcs.c: Use stricter include formatting.
        (RCS_add_openpgp_signature): Use xalloc_die for memory errors.
        (RCS_delete_openpgp_signatures): New function.
        * rcs.h (RCS_delete_openpgp_signatures): Add proto.
        * server.c (server_base_signatures): Send clear when there are no
        signatures.
        * sign.c (struct sign_args): Caller data for sign_fileproc.
        (sign_fileproc, sign): Handle key deletion.
        * verify.c (verify_fileproc): Match warning messages in local and
        client/server mode.  Don't treat lack of signatures as an error.
        * vers_ts.c (Version_TS), vers_ts.h (Version_TS): Make args const.
        
        * sanity.sh (openpgp): Add signature deletion tests.

CVSWeb URLs:
http://cvs.savannah.gnu.org/viewcvs/cvs/ccvs/src/ChangeLog.diff?only_with_tag=signed-commits3&tr1=1.3328.2.21&tr2=1.3328.2.22&r1=text&r2=text
http://cvs.savannah.gnu.org/viewcvs/cvs/ccvs/src/admin.c.diff?only_with_tag=signed-commits3&tr1=1.111.2.3&tr2=1.111.2.4&r1=text&r2=text
http://cvs.savannah.gnu.org/viewcvs/cvs/ccvs/src/client.c.diff?only_with_tag=signed-commits3&tr1=1.438.2.7&tr2=1.438.2.8&r1=text&r2=text
http://cvs.savannah.gnu.org/viewcvs/cvs/ccvs/src/gpg.c.diff?only_with_tag=signed-commits3&tr1=1.1.6.7&tr2=1.1.6.8&r1=text&r2=text
http://cvs.savannah.gnu.org/viewcvs/cvs/ccvs/src/gpg.h.diff?only_with_tag=signed-commits3&tr1=1.1.6.2&tr2=1.1.6.3&r1=text&r2=text
http://cvs.savannah.gnu.org/viewcvs/cvs/ccvs/src/log.c.diff?only_with_tag=signed-commits3&tr1=1.103.6.4&tr2=1.103.6.5&r1=text&r2=text
http://cvs.savannah.gnu.org/viewcvs/cvs/ccvs/src/rcs.c.diff?only_with_tag=signed-commits3&tr1=1.356.6.5&tr2=1.356.6.6&r1=text&r2=text
http://cvs.savannah.gnu.org/viewcvs/cvs/ccvs/src/rcs.h.diff?only_with_tag=signed-commits3&tr1=1.82.8.3&tr2=1.82.8.4&r1=text&r2=text
http://cvs.savannah.gnu.org/viewcvs/cvs/ccvs/src/sanity.sh.diff?only_with_tag=signed-commits3&tr1=1.1105.2.8&tr2=1.1105.2.9&r1=text&r2=text
http://cvs.savannah.gnu.org/viewcvs/cvs/ccvs/src/server.c.diff?only_with_tag=signed-commits3&tr1=1.453.2.5&tr2=1.453.2.6&r1=text&r2=text
http://cvs.savannah.gnu.org/viewcvs/cvs/ccvs/src/sign.c.diff?only_with_tag=signed-commits3&tr1=1.1.6.6&tr2=1.1.6.7&r1=text&r2=text
http://cvs.savannah.gnu.org/viewcvs/cvs/ccvs/src/verify.c.diff?only_with_tag=signed-commits3&tr1=1.1.2.6&tr2=1.1.2.7&r1=text&r2=text
http://cvs.savannah.gnu.org/viewcvs/cvs/ccvs/src/vers_ts.c.diff?only_with_tag=signed-commits3&tr1=1.65.6.1&tr2=1.65.6.2&r1=text&r2=text
http://cvs.savannah.gnu.org/viewcvs/cvs/ccvs/src/vers_ts.h.diff?only_with_tag=signed-commits3&tr1=1.1.4.2&tr2=1.1.4.3&r1=text&r2=text

Patches:
Index: ccvs/src/ChangeLog
diff -u ccvs/src/ChangeLog:1.3328.2.21 ccvs/src/ChangeLog:1.3328.2.22
--- ccvs/src/ChangeLog:1.3328.2.21      Tue Jan 10 18:49:34 2006
+++ ccvs/src/ChangeLog  Wed Jan 11 04:37:07 2006
@@ -1,5 +1,29 @@
 2006-01-10  Derek Price  <address@hidden>
 
+       * admin.c: Use "wrapper.h".
+       * client.c (client_base_signatures): Allow removal of signature files.
+       (handle_base_signature): Support new clear argument for
+       client_base_signatures.
+       (handle_base_clear_signature): New file.
+       (responses): Add Base-clear-signatures.
+       * gpg.c (parse_signature): Preserve raw signature.
+       * gpg.h (struct openpgp_signature): Add storage for raw signature.
+       * log.c (log_version): Display only low 32 bits of key IDs to users,
+       mimicing GnuPG.
+       * rcs.c: Use stricter include formatting.
+       (RCS_add_openpgp_signature): Use xalloc_die for memory errors.
+       (RCS_delete_openpgp_signatures): New function.
+       * rcs.h (RCS_delete_openpgp_signatures): Add proto.
+       * server.c (server_base_signatures): Send clear when there are no
+       signatures.
+       * sign.c (struct sign_args): Caller data for sign_fileproc.
+       (sign_fileproc, sign): Handle key deletion.
+       * verify.c (verify_fileproc): Match warning messages in local and
+       client/server mode.  Don't treat lack of signatures as an error.
+       * vers_ts.c (Version_TS), vers_ts.h (Version_TS): Make args const.
+
+       * sanity.sh (openpgp): Add signature deletion tests.
+
        * client.c (send_fileproc): Compare files to base revision when
        available.
        (send_files): Accept FORCE_SIGNATURE flag.
Index: ccvs/src/admin.c
diff -u ccvs/src/admin.c:1.111.2.3 ccvs/src/admin.c:1.111.2.4
--- ccvs/src/admin.c:1.111.2.3  Fri Jan  6 20:37:13 2006
+++ ccvs/src/admin.c    Wed Jan 11 04:37:08 2006
@@ -26,6 +26,7 @@
 /* CVS headers.  */
 #include "ignore.h"
 #include "recurse.h"
+#include "wrapper.h"
 
 #include "cvs.h"
 
Index: ccvs/src/client.c
diff -u ccvs/src/client.c:1.438.2.7 ccvs/src/client.c:1.438.2.8
--- ccvs/src/client.c:1.438.2.7 Tue Jan 10 18:49:34 2006
+++ ccvs/src/client.c   Wed Jan 11 04:37:08 2006
@@ -2423,20 +2423,28 @@
     char *rev;
     char *basefile;
     char *sigfile;
+    bool *clear = data_arg;
 
     TRACE (TRACE_FUNCTION, "client_base_signatures (%s)", short_pathname);
 
-    if (!stored_signatures)
+    if (!stored_signatures && !*clear)
        error (1, 0,
               "Server sent `Base-signatures' response without signature.");
 
-    /* Read OPTIONS, PREV, and REV from the server.  */
+    /* Read REV from the server.  */
     read_line (&rev);
 
     basefile = make_base_file_name (filename, rev);
     sigfile = Xasprintf ("%s.sig", basefile);
 
-    client_write_sigfile (sigfile, false);
+    if (*clear)
+    {
+       if (unlink_file (sigfile) < 0 && !existence_error (errno))
+           error (0, 0, "Failed to delete signature file `%s'",
+                  sigfile);
+    }
+    else
+       client_write_sigfile (sigfile, false);
 
     free (rev);
     free (basefile);
@@ -2448,9 +2456,21 @@
 static void
 handle_base_signatures (char *args, size_t len)
 {
+    bool clear = false;
+    if (suppress_bases)
+       error (1, 0, "Server sent Base-* response when asked not to.");
+    call_in_directory (args, client_base_signatures, &clear);
+}
+
+
+
+static void
+handle_base_clear_signatures (char *args, size_t len)
+{
+    bool clear = true;
     if (suppress_bases)
        error (1, 0, "Server sent Base-* response when asked not to.");
-    call_in_directory (args, client_base_signatures, NULL);
+    call_in_directory (args, client_base_signatures, &clear);
 }
 
 
@@ -3815,6 +3835,8 @@
 
     RSP_LINE("Base-signatures", handle_base_signatures, response_type_normal,
             rs_optional),
+    RSP_LINE("Base-clear-signatures", handle_base_clear_signatures,
+            response_type_normal, rs_optional),
     RSP_LINE("OpenPGP-signatures", handle_openpgp_signatures,
             response_type_normal, rs_optional),
 
Index: ccvs/src/gpg.c
diff -u ccvs/src/gpg.c:1.1.6.7 ccvs/src/gpg.c:1.1.6.8
--- ccvs/src/gpg.c:1.1.6.7      Fri Dec 30 23:26:32 2005
+++ ccvs/src/gpg.c      Wed Jan 11 04:37:08 2006
@@ -1,5 +1,5 @@
 /* gpgsplit.c - An OpenPGP signature packet splitting tool
- * Copyright (C) 2001, 2002, 2003 Free Software Foundation, Inc.
+ * Copyright (C) 2001, 2002, 2003, 2006 Free Software Foundation, Inc.
  *
  * This file is part of of CVS
  * (derived from gpgsplit.c distributed with GnuPG).
@@ -34,6 +34,7 @@
 
 /* GNULIB Headers.  */
 #include "error.h"
+#include "xalloc.h"
 
 
 
@@ -385,6 +386,7 @@
   int rc;
   uint8_t c;
   uint32_t tmp32;
+  size_t raw_idx = 0;
 
   if ((rc = parse_header (bpin, &pkttype, &pktlen, &partial, header,
                          &header_len)))
@@ -396,11 +398,16 @@
     error (1, 0, "Unhandled OpenPGP packet type (%s)",
           pkttype_to_string (pkttype));
 
+  spout->raw = xmalloc (header_len + pktlen);
+  memcpy (spout->raw + raw_idx, header, header_len);
+  raw_idx += header_len;
+
   if (pktlen < 19)
     error (1, 0, "Malformed OpenPGP signature packet (too short)");
 
   if ((rc = read_u8 (bpin, &c)))
     return rc;
+  spout->raw[raw_idx++] = c;
   pktlen -= 1;
 
   if (c != 3)
@@ -408,6 +415,7 @@
 
   if ((rc = read_u8 (bpin, &c)))
     return rc;
+  spout->raw[raw_idx++] = c;
   pktlen -= 1;
 
   if (c != 5)
@@ -415,6 +423,7 @@
 
   if ((rc = read_u8 (bpin, &c)))
     return rc;
+  spout->raw[raw_idx++] = c;
   pktlen -= 1;
 
   if (c & 0xF0)
@@ -424,11 +433,23 @@
   if ((rc = read_u32 (bpin, &tmp32)))
     return rc;
   spout->ctime = tmp32;
+  spout->raw[raw_idx++] = (tmp32 >> 24) & 0xFF;
+  spout->raw[raw_idx++] = (tmp32 >> 16) & 0xFF;
+  spout->raw[raw_idx++] = (tmp32 >> 8) & 0xFF;
+  spout->raw[raw_idx++] = tmp32 & 0xFF;
   pktlen -= 4;
 
   /* Read the key ID.  */
   if ((rc = read_u64 (bpin, &spout->keyid)))
     return rc;
+  spout->raw[raw_idx++] = (spout->keyid >> 56) & 0xFF;
+  spout->raw[raw_idx++] = (spout->keyid >> 48) & 0xFF;
+  spout->raw[raw_idx++] = (spout->keyid >> 40) & 0xFF;
+  spout->raw[raw_idx++] = (spout->keyid >> 32) & 0xFF;
+  spout->raw[raw_idx++] = (spout->keyid >> 24) & 0xFF;
+  spout->raw[raw_idx++] = (spout->keyid >> 16) & 0xFF;
+  spout->raw[raw_idx++] = (spout->keyid >> 8) & 0xFF;
+  spout->raw[raw_idx++] = spout->keyid & 0xFF;
   pktlen -= 8;
 
   /* Don't need the rest of the packet yet.  */
@@ -439,8 +460,11 @@
       if ((rc = buf_read_data (bpin, pktlen, &tmp, &got)) < 0)
        return rc;
       assert (got);  /* Blocking buffers cannot return 0 bytes.  */
+      memcpy (spout->raw + raw_idx, tmp, got);
+      raw_idx += got;
       pktlen -= got;
     }
 
+  spout->rawlen = raw_idx;
   return 0;
 }
Index: ccvs/src/gpg.h
diff -u ccvs/src/gpg.h:1.1.6.2 ccvs/src/gpg.h:1.1.6.3
--- ccvs/src/gpg.h:1.1.6.2      Fri Dec 30 23:26:32 2005
+++ ccvs/src/gpg.h      Wed Jan 11 04:37:08 2006
@@ -34,6 +34,8 @@
 {
   time_t ctime;
   uint64_t keyid;
+  uint8_t *raw;
+  size_t rawlen;
 };
 
 
Index: ccvs/src/log.c
diff -u ccvs/src/log.c:1.103.6.4 ccvs/src/log.c:1.103.6.5
--- ccvs/src/log.c:1.103.6.4    Tue Jan 10 18:42:38 2006
+++ ccvs/src/log.c      Wed Jan 11 04:37:08 2006
@@ -1705,7 +1705,8 @@
 
        while (!(rc = parse_signature (membuf, &sig)))
        {
-           unsigned long long printablesig = sig.keyid;
+           /* GnuPG truncates this too.  */
+           unsigned long long printablesig = sig.keyid & 0xFFFFFFFF;
            char *hexsig;
            cvs_output_tagged ("openpgp-keyid-header",
                               "OpenPGP signature using key ID 0x");
Index: ccvs/src/rcs.c
diff -u ccvs/src/rcs.c:1.356.6.5 ccvs/src/rcs.c:1.356.6.6
--- ccvs/src/rcs.c:1.356.6.5    Tue Jan 10 02:27:46 2006
+++ ccvs/src/rcs.c      Wed Jan 11 04:37:08 2006
@@ -21,14 +21,16 @@
 /* Verify interface.  */
 #include "rcs.h"
 
+/* GNULIB headers.  */
+#include "base64.h"
+
 /* CVS headers.  */
-#include "cvs.h"
 #include "edit.h"
-#include "hardlink.h"
+#include "gpg.h"
 #include "sign.h"
 
-/* GNULIB headers.  */
-#include "base64.h"
+#include "cvs.h"
+#include "hardlink.h"
 
 /* These need to be source after cvs.h or HAVE_MMAP won't be set... */
 #ifdef HAVE_MMAP
@@ -4835,7 +4837,7 @@
            error (1, 0, "Invalid binhex data in signature (`%s', rev %s)",
                   finfo->rcs->print_path, rev);
        if (!oldsigs)
-           error (1, errno, "Memory allocation error");
+           xalloc_die ();
        free (n->data);
     }
 
@@ -4861,6 +4863,106 @@
 
 
 
+int
+RCS_delete_openpgp_signatures (struct file_info *finfo, const char *rev,
+                              uint32_t keyid)
+{
+    RCSVers *vers;
+    Node *n;
+    char *oldsigs;
+    size_t oldlen;
+    struct buffer *membuf;
+    struct openpgp_signature sig;
+    char *newsigs = NULL;
+    size_t newlen = 0;
+    bool found = false;
+    int rc;
+
+    TRACE (TRACE_FUNCTION, "RCS_delete_openpgp_signatures (%s, %s, %llx)",
+          finfo->fullname, rev, (unsigned long long)keyid);
+
+    if (finfo->rcs->flags & PARTIAL)
+       RCS_reparsercsfile (finfo->rcs, NULL, NULL);
+
+    n = findnode (finfo->rcs->versions, rev);
+    if (!n)
+       error (1, 0, "internal error: no revision information for %s", rev);
+    vers = n->data;
+
+    n = findnode (vers->other_delta, "openpgp-signatures");
+    if (!n)
+    {
+       error (0, 0, "No signatures attached to revision %s of `%s'",
+              rev, finfo->fullname);
+       return 1;
+    }
+
+    TRACE (TRACE_DATA,
+          "RCS_delete_openpgp_signatures: found oldsigs = %s, len = %u",
+          (char *)n->data, (unsigned int)n->len);
+
+    if (!base64_decode_alloc (n->data, n->len, &oldsigs, &oldlen))
+       error (1, 0, "Invalid binhex data in signature (`%s', rev %s)",
+              finfo->rcs->print_path, rev);
+    if (!oldsigs)
+       xalloc_die ();
+    free (n->data);
+
+    membuf = buf_nonio_initialize (NULL);
+    buf_output (membuf, oldsigs, oldlen);
+
+    while (!(rc = parse_signature (membuf, &sig)))
+    {
+       char *hexid1 = Xasprintf ("0x%llx", (unsigned long long) keyid);
+       char *hexid2 = Xasprintf ("0x%llx", (unsigned long long) sig.keyid);
+       if ((sig.keyid & 0xFFFFFFFF) == keyid)
+       {
+           TRACE (TRACE_DATA, "%s is a match for %s", hexid1, hexid2);
+           found = true;
+       }
+       else
+       {
+           TRACE (TRACE_DATA, "%s is not a match for %s", hexid1, hexid2);
+           newsigs = xrealloc (newsigs, newlen + sig.rawlen);
+           memcpy (newsigs + newlen, sig.raw, sig.rawlen);
+           newlen += sig.rawlen;
+       }
+       free (hexid1);
+       free (hexid2);
+       free (sig.raw);
+    }
+
+    if (!found)
+    {
+       char *hexid = Xasprintf ("0x%llx", (unsigned long long) keyid);
+       error (0, 0,
+              "No signatures with key ID %s found in revision %s of `%s'",
+              hexid, rev, finfo->fullname);
+       free (hexid);
+       if (newsigs) free (newsigs);
+       return 1;
+    }
+
+    if (newsigs)
+    {
+       n->len = base64_encode_alloc (newsigs, newlen, (char **)&n->data);
+       free (newsigs);
+    }
+    else
+       delnode (n);
+
+
+    TRACE (TRACE_DATA,
+          "RCS_add_openpgp_signature: found oldsigs = %s, len = %u",
+          (char *)n->data, (unsigned int)n->len);
+
+    RCS_rewrite (finfo->rcs, NULL, NULL);
+
+    return 0;
+}
+
+
+
 /* Find the delta currently locked by the user.  From the `ci' man page:
 
        "If rev is omitted, ci tries to  derive  the  new  revision
Index: ccvs/src/rcs.h
diff -u ccvs/src/rcs.h:1.82.8.3 ccvs/src/rcs.h:1.82.8.4
--- ccvs/src/rcs.h:1.82.8.3     Tue Jan 10 02:27:46 2006
+++ ccvs/src/rcs.h      Wed Jan 11 04:37:08 2006
@@ -17,6 +17,7 @@
 #define RCS_H
 
 #include <stdbool.h>
+#include <stdint.h>
 #include <stdio.h>
 #include <sys/types.h>
 
@@ -277,6 +278,8 @@
 const char *RCS_get_openpgp_signatures (RCSNode *rcs, const char *rev,
                                        size_t *len);
 void RCS_add_openpgp_signature (struct file_info *finfo, const char *rev);
+int RCS_delete_openpgp_signatures (struct file_info *finfo, const char *rev,
+                                  uint32_t keyid);
 int RCS_checkin (RCSNode *rcs, const char *update_dir, const char *workfile,
                 const char *message, const char *rev, time_t citime,
                 int flags);
Index: ccvs/src/sanity.sh
diff -u ccvs/src/sanity.sh:1.1105.2.8 ccvs/src/sanity.sh:1.1105.2.9
--- ccvs/src/sanity.sh:1.1105.2.8       Tue Jan 10 02:27:46 2006
+++ ccvs/src/sanity.sh  Wed Jan 11 04:37:08 2006
@@ -32753,6 +32753,10 @@
 "$DOTSTAR Good signature from \"CVS Test Script $DOTSTAR
 $DOTSTAR Good signature from \"CVS Test Script $DOTSTAR"
 
+         dotest openpgp-6 "$testcvs sign -d0xF133BDE9 file1"
+         dotest_fail openpgp-7 "$testcvs verify file1" \
+"$SPROG verify: No signature available for \`file1'"
+
          dokeep
          cd ../..
          rm -rf openpgp
Index: ccvs/src/server.c
diff -u ccvs/src/server.c:1.453.2.5 ccvs/src/server.c:1.453.2.6
--- ccvs/src/server.c:1.453.2.5 Tue Jan 10 18:42:38 2006
+++ ccvs/src/server.c   Wed Jan 11 04:37:08 2006
@@ -8445,12 +8445,17 @@
 void
 server_base_signatures (struct file_info *finfo, const char *rev)
 {
-    if (!supported_response ("Base-signatures"))
+    if (!supported_response ("Base-signatures")
+       || !supported_response ("Base-clear-signatures"))
        return;
 
     server_send_signatures (finfo->rcs, rev);
 
-    buf_output0 (protocol, "Base-signatures ");
+    if (RCS_get_openpgp_signatures (finfo->rcs, rev, NULL))
+       buf_output0 (protocol, "Base-signatures ");
+    else
+       buf_output0 (protocol, "Base-clear-signatures ");
+
     output_dir (finfo->update_dir, finfo->repository);
     buf_output0 (protocol, finfo->file);
     buf_output (protocol, "\n", 1);
Index: ccvs/src/sign.c
diff -u ccvs/src/sign.c:1.1.6.6 ccvs/src/sign.c:1.1.6.7
--- ccvs/src/sign.c:1.1.6.6     Tue Jan 10 18:49:34 2006
+++ ccvs/src/sign.c     Wed Jan 11 04:37:08 2006
@@ -434,16 +434,34 @@
 
 
 
+struct sign_args
+{
+    uint32_t keyid;
+    const char *tag;
+};
+
 static int
 sign_fileproc (void *callerdat, struct file_info *finfo)
 {
     Vers_TS *vers;
     int err = 0;
     Ctype status;
-    const char *delkey = callerdat;
+    struct sign_args *args = callerdat;
 
     TRACE (TRACE_FUNCTION, "sign_fileproc (%s)", finfo->fullname);
 
+    if (args->keyid)
+    {
+       vers = Version_TS (finfo, NULL, args->tag, NULL, true, 0);
+       err = RCS_delete_openpgp_signatures (finfo,
+                                            vers->vn_rcs
+                                            ? vers->vn_rcs : vers->vn_user,
+                                            args->keyid);
+       if (server_active)
+           server_base_signatures (finfo, vers->vn_user);
+       return err;
+    }
+
     status = Classify_File (finfo, NULL, NULL, NULL, true,
                            false, &vers, false);
 
@@ -526,12 +544,14 @@
     int err = 0;
     bool local = false;
     char *delkey = NULL;
+    char *tag = NULL;
+    struct sign_args args;
 
     if (argc == -1)
        usage (sign_usage);
 
     optind = 0;
-    while ((c = getopt (argc, argv, "+d:lR")) != -1)
+    while ((c = getopt (argc, argv, "+d:lr:R")) != -1)
     {
        switch (c)
        {
@@ -542,6 +562,10 @@
            case 'l':
                local = 1;
                break;
+           case 'r':
+               if (tag) free (tag);
+               tag = xstrdup (optarg);
+               break;
            case 'R':
                local = 0;
                break;
@@ -554,6 +578,13 @@
     argc -= optind;
     argv += optind;
 
+    if (tag && !delkey)
+    {
+       error (0, 0,
+"`cvs sign' may only be used to sign unmodified files in the current sandbox");
+       error (1, 0, "(`-r' option to `cvs sign' is valid only with `-d')");
+    }
+
     if (!delkey)
        err = start_recursion
            (sign_check_fileproc, NULL, NULL, NULL, NULL,
@@ -569,13 +600,18 @@
 
        ign_setup ();
 
-       if (local)
-           send_arg ("-l");
        if (delkey)
        {
            send_arg ("-d");
            send_arg (delkey);
        }
+       if (local)
+           send_arg ("-l");
+       if (tag)
+       {
+           send_arg ("-r");
+           send_arg (tag);
+       }
        send_arg ("--");
 
        /* Full file contents need to be sent to the server when signing since
@@ -592,10 +628,35 @@
     }
 #endif
 
+    if (delkey)
+    {
+       char *n;
+       long long tmp;
+
+       tmp = strtoull (delkey, &n, 0);
+       if (n == delkey || *n != '\0' || tmp == 0)
+       {
+           error (0, 0, "invalid key ID `%s'", delkey);
+           return 1;
+       }
+       if (tmp > UINT32_MAX)
+       {
+           error (0, 0, "invalid key ID `%s'", delkey);
+           return 1;
+       }
+       args.keyid = (uint32_t) tmp;
+    }
+    else
+       args.keyid = 0;
+
     /* start the recursion processor */
-    err = start_recursion (sign_fileproc, NULL, NULL, NULL, delkey, argc, argv,
+    args.tag = tag;
+    err = start_recursion (sign_fileproc, NULL, NULL, NULL, &args, argc, argv,
                           local, W_LOCAL, false, CVS_LOCK_WRITE, NULL, true,
                           NULL);
 
+    if (delkey) free (delkey);
+    if (tag) free (tag);
+
     return err;
 }
Index: ccvs/src/verify.c
diff -u ccvs/src/verify.c:1.1.2.6 ccvs/src/verify.c:1.1.2.7
--- ccvs/src/verify.c:1.1.2.6   Tue Jan 10 02:27:47 2006
+++ ccvs/src/verify.c   Wed Jan 11 04:37:08 2006
@@ -402,27 +402,36 @@
 
     if (current_parsed_root->isremote)
     {
-       char *updateprefix = finfo->update_dir
-                            ? Xasprintf ("%s/", finfo->update_dir) : "";
+       char *updateprefix = finfo->update_dir && *finfo->update_dir
+                            ? Xasprintf ("%s/", finfo->update_dir)
+                            : xstrdup ("");
        char *fullbasefn = Xasprintf ("%s%s", updateprefix, basefn);
        char *fullsigfn = Xasprintf ("%s%s", updateprefix, basesigfn);
 
-       /* FIXME: These errors should refetch instead.  */
+       /* FIXME: These errors should attempt a refetch instead.  */
        if (!isfile (basefn))
            error (1, 0, "Base file missing `%s'", fullbasefn);
+
        if (!isfile (basesigfn))
-           error (1, 0, "Signature file missing `%s'", fullsigfn);
+       {
+           error (0, 0, "No signature available for `%s'", finfo->fullname);
+           errors = true;
+       }
 
        /* FIXME: Once a "soft" connect to the server is possible, then when
         * the server is available, the signatures should be updated here.
         */
 
-       if (userargs->pipeout)
-           get_file (basesigfn, fullsigfn, "rb", &sigdata, &buflen, &siglen);
-       else
+       if (!errors)
        {
-           signedfn = basefn;
-           sigfn = basesigfn;
+           if (userargs->pipeout)
+               get_file (basesigfn, fullsigfn, "rb",
+                         &sigdata, &buflen, &siglen);
+           else
+           {
+               signedfn = basefn;
+               sigfn = basesigfn;
+           }
        }
 
        free (updateprefix);
@@ -446,10 +455,10 @@
                       finfo->fullname);
                errors = true;
            }
+           else if (!b64sig)
+               xalloc_die ();
            /* else, got usable signature data in SIGDATA... fall out.  */
        }
-       else if (!b64sig)
-           error (1, ENOMEM, "Memory allocation failed");
        else
        {
            error (0, 0, "No signature available for `%s'",
Index: ccvs/src/vers_ts.c
diff -u ccvs/src/vers_ts.c:1.65.6.1 ccvs/src/vers_ts.c:1.65.6.2
--- ccvs/src/vers_ts.c:1.65.6.1 Wed Dec 21 13:25:10 2005
+++ ccvs/src/vers_ts.c  Wed Jan 11 04:37:08 2006
@@ -38,8 +38,8 @@
  *   Vers_TS structure for FINFO.
  */
 Vers_TS *
-Version_TS (struct file_info *finfo, char *options, char *tag, char *date,
-            int force_tag_match, int set_time)
+Version_TS (struct file_info *finfo, const char *options, const char *tag,
+           const char *date, int force_tag_match, int set_time)
 {
     Node *p;
     RCSNode *rcsdata;
Index: ccvs/src/vers_ts.h
diff -u ccvs/src/vers_ts.h:1.1.4.2 ccvs/src/vers_ts.h:1.1.4.3
--- ccvs/src/vers_ts.h:1.1.4.2  Tue Jan 10 18:42:38 2006
+++ ccvs/src/vers_ts.h  Wed Jan 11 04:37:08 2006
@@ -92,8 +92,9 @@
 };
 typedef struct vers_ts Vers_TS;
 
-Vers_TS *Version_TS (struct file_info *finfo, char *options, char *tag,
-                    char *date, int force_tag_match, int set_time);
+Vers_TS *Version_TS (struct file_info *finfo, const char *options,
+                    const char *tag, const char *date, int force_tag_match,
+                    int set_time);
 void freevers_ts (Vers_TS **versp);
 char *time_stamp (const char *file);
 




reply via email to

[Prev in Thread] Current Thread [Next in Thread]