2005-10-01 Marcus Brinkmann <marcus@g10code.de>
[gpgme.git] / gpgme / sig-notation.c
1 /* sig-notation.c - Signature notation data support.
2    Copyright (C) 2005 g10 Code GmbH
3
4    This file is part of GPGME.
5  
6    GPGME is free software; you can redistribute it and/or modify it
7    under the terms of the GNU Lesser General Public License as
8    published by the Free Software Foundation; either version 2.1 of
9    the License, or (at your option) any later version.
10    
11    GPGME is distributed in the hope that it will be useful, but
12    WITHOUT ANY WARRANTY; without even the implied warranty of
13    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14    Lesser General Public License for more details.
15    
16    You should have received a copy of the GNU Lesser General Public
17    License along with this program; if not, write to the Free Software
18    Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
19    02111-1307, USA.  */
20
21 #if HAVE_CONFIG_H
22 #include <config.h>
23 #endif
24 #include <stdlib.h>
25 #include <string.h>
26 #include <errno.h>
27 #include <assert.h>
28
29 #include "gpgme.h"
30 #include "util.h"
31 #include "context.h"
32 #include "ops.h"
33
34 \f
35 /* Free the signature notation object and all associated resources.
36    The object must already be removed from any linked list as the next
37    pointer is ignored.  */
38 void
39 _gpgme_sig_notation_free (gpgme_sig_notation_t notation)
40 {
41   if (notation->name)
42     free (notation->name);
43
44   if (notation->value)
45     free (notation->value);
46
47   free (notation);
48 }
49
50 \f
51 /* Set the flags of NOTATION to FLAGS.  */
52 static void
53 sig_notation_set_flags (gpgme_sig_notation_t notation,
54                         gpgme_sig_notation_flags_t flags)
55 {
56   /* We copy the flags into individual bits to make them easier
57      accessible individually for the user.  */
58   notation->human_readable = flags & GPGME_SIG_NOTATION_HUMAN_READABLE ? 1 : 0;
59   notation->critical = flags & GPGME_SIG_NOTATION_CRITICAL ? 1 : 0; 
60
61   notation->flags = flags;
62 }
63
64
65 /* Create a new, empty signature notation data object.  */
66 gpgme_error_t
67 _gpgme_sig_notation_create (gpgme_sig_notation_t *notationp,
68                             const char *name, int name_len,
69                             const char *value, int value_len,
70                             gpgme_sig_notation_flags_t flags)
71 {
72   gpgme_error_t err = 0;
73   gpgme_sig_notation_t notation;
74
75   /* Currently, we require all notations to be human-readable.  */
76   if (name && !(flags & GPGME_SIG_NOTATION_HUMAN_READABLE))
77     return gpg_error (GPG_ERR_INV_VALUE);
78
79   notation = calloc (1, sizeof (*notation));
80   if (!notation)
81     return gpg_error_from_errno (errno);
82
83   if (name_len)
84     {
85       /* We add a trailing '\0' for stringification in the good
86          case.  */
87       notation->name = malloc (name_len + 1);
88       if (!notation->name)
89         {
90           err = gpg_error_from_errno (errno);
91           goto err;
92         }
93
94       memcpy (notation->name, name, name_len);
95       notation->name[name_len] = '\0';
96       notation->name_len = name_len;
97     }
98
99   if (value_len)
100     {
101       /* We add a trailing '\0' for stringification in the good
102          case.  */
103       notation->value = malloc (value_len + 1);
104       if (!notation->value)
105         {
106           err = gpg_error_from_errno (errno);
107           goto err;
108         }
109
110       memcpy (notation->value, value, value_len);
111       notation->value[value_len] = '\0';
112       notation->value_len = value_len;
113     }
114
115   sig_notation_set_flags (notation, flags);
116
117   *notationp = notation;
118   return 0;
119
120  err:
121   _gpgme_sig_notation_free (notation);
122   return err;
123 }