doc: Fix documentation of struct data types
[gpgme.git] / src / sign.c
index c66f06a..e910799 100644 (file)
@@ -3,17 +3,17 @@
    Copyright (C) 2001, 2002, 2003, 2004, 2007 g10 Code GmbH
 
    This file is part of GPGME.
+
    GPGME is free software; you can redistribute it and/or modify it
    under the terms of the GNU Lesser General Public License as
    published by the Free Software Foundation; either version 2.1 of
    the License, or (at your option) any later version.
-   
+
    GPGME is distributed in the hope that it will be useful, but
    WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
    Lesser General Public License for more details.
-   
+
    You should have received a copy of the GNU Lesser General Public
    License along with this program; if not, write to the Free Software
    Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
@@ -149,7 +149,7 @@ parse_sig_created (char *args, gpgme_new_signature_t *sigp)
 
   sig = malloc (sizeof (*sig));
   if (!sig)
-    return gpg_error_from_errno (errno);
+    return gpg_error_from_syserror ();
 
   sig->next = NULL;
   switch (*args)
@@ -169,23 +169,23 @@ parse_sig_created (char *args, gpgme_new_signature_t *sigp)
     default:
       /* The backend engine is not behaving.  */
       free (sig);
-      return gpg_error (GPG_ERR_INV_ENGINE);
+      return trace_gpg_error (GPG_ERR_INV_ENGINE);
     }
 
   args++;
   if (*args != ' ')
     {
       free (sig);
-      return gpg_error (GPG_ERR_INV_ENGINE);
+      return trace_gpg_error (GPG_ERR_INV_ENGINE);
     }
 
-  errno = 0;
+  gpg_err_set_errno (0);
   sig->pubkey_algo = strtol (args, &tail, 0);
   if (errno || args == tail || *tail != ' ')
     {
       /* The crypto backend does not behave.  */
       free (sig);
-      return gpg_error (GPG_ERR_INV_ENGINE);
+      return trace_gpg_error (GPG_ERR_INV_ENGINE);
     }
   args = tail;
 
@@ -194,7 +194,7 @@ parse_sig_created (char *args, gpgme_new_signature_t *sigp)
     {
       /* The crypto backend does not behave.  */
       free (sig);
-      return gpg_error (GPG_ERR_INV_ENGINE);
+      return trace_gpg_error (GPG_ERR_INV_ENGINE);
     }
   args = tail;
 
@@ -205,7 +205,7 @@ parse_sig_created (char *args, gpgme_new_signature_t *sigp)
     {
       /* The crypto backend does not behave.  */
       free (sig);
-      return gpg_error (GPG_ERR_INV_ENGINE);
+      return trace_gpg_error (GPG_ERR_INV_ENGINE);
     }
   args = tail;
 
@@ -214,7 +214,7 @@ parse_sig_created (char *args, gpgme_new_signature_t *sigp)
     {
       /* The crypto backend does not behave.  */
       free (sig);
-      return gpg_error (GPG_ERR_INV_ENGINE);
+      return trace_gpg_error (GPG_ERR_INV_ENGINE);
     }
   args = tail;
   while (*args == ' ')
@@ -224,7 +224,7 @@ parse_sig_created (char *args, gpgme_new_signature_t *sigp)
     {
       /* The crypto backend does not behave.  */
       free (sig);
-      return gpg_error (GPG_ERR_INV_ENGINE);
+      return trace_gpg_error (GPG_ERR_INV_ENGINE);
     }
 
   tail = strchr (args, ' ');
@@ -234,9 +234,8 @@ parse_sig_created (char *args, gpgme_new_signature_t *sigp)
   sig->fpr = strdup (args);
   if (!sig->fpr)
     {
-      int saved_errno = errno;
       free (sig);
-      return gpg_error_from_errno (saved_errno);
+      return gpg_error_from_syserror ();
     }
   *sigp = sig;
   return 0;
@@ -273,7 +272,7 @@ _gpgme_sign_status_handler (void *priv, gpgme_status_code_t code, char *args)
 
     case GPGME_STATUS_INV_RECP:
       if (opd->inv_sgnr_seen && opd->ignore_inv_recp)
-        break; 
+        break;
       /* FALLTROUGH */
     case GPGME_STATUS_INV_SGNR:
       if (code == GPGME_STATUS_INV_SGNR)
@@ -286,9 +285,13 @@ _gpgme_sign_status_handler (void *priv, gpgme_status_code_t code, char *args)
       break;
 
     case GPGME_STATUS_EOF:
+      /* The UI server does not send information about the created
+         signature.  This is irrelevant for this protocol and thus we
+         should not check for that.  */
       if (opd->result.invalid_signers)
        err = gpg_error (GPG_ERR_UNUSABLE_SECKEY);
-      else if (!opd->sig_created_seen)
+      else if (!opd->sig_created_seen
+               && ctx->protocol != GPGME_PROTOCOL_UISERVER)
        err = gpg_error (GPG_ERR_GENERAL);
       break;
 
@@ -389,6 +392,10 @@ gpgme_op_sign_start (gpgme_ctx_t ctx, gpgme_data_t plain, gpgme_data_t sig,
   gpg_error_t err;
   TRACE_BEG3 (DEBUG_CTX, "gpgme_op_sign_start", ctx,
              "plain=%p, sig=%p, mode=%i", plain, sig, mode);
+
+  if (!ctx)
+    return TRACE_ERR (gpg_error (GPG_ERR_INV_VALUE));
+
   err = sign_start (ctx, 0, plain, sig, mode);
   return TRACE_ERR (err);
 }
@@ -403,6 +410,10 @@ gpgme_op_sign (gpgme_ctx_t ctx, gpgme_data_t plain, gpgme_data_t sig,
 
   TRACE_BEG3 (DEBUG_CTX, "gpgme_op_sign", ctx,
              "plain=%p, sig=%p, mode=%i", plain, sig, mode);
+
+  if (!ctx)
+    return TRACE_ERR (gpg_error (GPG_ERR_INV_VALUE));
+
   err = sign_start (ctx, 1, plain, sig, mode);
   if (!err)
     err = _gpgme_wait_one (ctx);