doc/
[gpgme.git] / gpgme / delete.c
1 /* delete.c - Delete a key.
2    Copyright (C) 2001, 2002, 2003, 2004 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 <errno.h>
26
27 #include "gpgme.h"
28 #include "context.h"
29 #include "ops.h"
30
31 \f
32 static gpgme_error_t
33 delete_status_handler (void *priv, gpgme_status_code_t code, char *args)
34 {
35   if (code == GPGME_STATUS_DELETE_PROBLEM)
36     {
37       enum delete_problem
38         {
39           DELETE_No_Problem = 0,
40           DELETE_No_Such_Key = 1,
41           DELETE_Must_Delete_Secret_Key = 2,
42           DELETE_Ambiguous_Specification = 3
43         };
44       long problem;
45       char *tail;
46
47       errno = 0;
48       problem = strtol (args, &tail, 0);
49       if (errno || (*tail && *tail != ' '))
50         return gpg_error (GPG_ERR_INV_ENGINE);
51
52       switch (problem)
53         {
54         case DELETE_No_Problem:
55           break;
56
57         case DELETE_No_Such_Key:
58           return gpg_error (GPG_ERR_NO_PUBKEY);
59
60         case DELETE_Must_Delete_Secret_Key:
61           return gpg_error (GPG_ERR_CONFLICT);
62
63         case DELETE_Ambiguous_Specification:
64           return gpg_error (GPG_ERR_AMBIGUOUS_NAME);
65
66         default:
67           return gpg_error (GPG_ERR_GENERAL);
68         }
69     }
70   return 0;
71 }
72
73
74 static gpgme_error_t
75 delete_start (gpgme_ctx_t ctx, int synchronous, const gpgme_key_t key,
76               int allow_secret)
77 {
78   gpgme_error_t err;
79
80   err = _gpgme_op_reset (ctx, synchronous);
81   if (err)
82     return err;
83
84   _gpgme_engine_set_status_handler (ctx->engine, delete_status_handler, ctx);
85
86   return _gpgme_engine_op_delete (ctx->engine, key, allow_secret);
87 }
88
89
90 /* Delete KEY from the keyring.  If ALLOW_SECRET is non-zero, secret
91    keys are also deleted.  */
92 gpgme_error_t
93 gpgme_op_delete_start (gpgme_ctx_t ctx, const gpgme_key_t key,
94                        int allow_secret)
95 {
96   return delete_start (ctx, 0, key, allow_secret);
97 }
98
99
100 /* Delete KEY from the keyring.  If ALLOW_SECRET is non-zero, secret
101    keys are also deleted.  */
102 gpgme_error_t
103 gpgme_op_delete (gpgme_ctx_t ctx, const gpgme_key_t key, int allow_secret)
104 {
105   gpgme_error_t err = delete_start (ctx, 1, key, allow_secret);
106   if (!err)
107     err = _gpgme_wait_one (ctx);
108   return err;
109 }