aboutsummaryrefslogtreecommitdiffstats
path: root/set-contact-pgpkeys.c
diff options
context:
space:
mode:
Diffstat (limited to 'set-contact-pgpkeys.c')
-rw-r--r--set-contact-pgpkeys.c118
1 files changed, 6 insertions, 112 deletions
diff --git a/set-contact-pgpkeys.c b/set-contact-pgpkeys.c
index 93ad0ab..a221561 100644
--- a/set-contact-pgpkeys.c
+++ b/set-contact-pgpkeys.c
@@ -1,115 +1,9 @@
/* See LICENSE file for copyright and license details. */
-#include "common.h"
-
-USAGE("[-C old-context] [-F old-fingerprint] ([-c new-context] [-f new-fingerprint] | -u) contact-id");
-
-
-int
-main(int argc, char *argv[])
-{
- int add = 1, edit = 0, remove = 0;
- char *id = NULL, *context = NULL;
- char *lookup_id = NULL, *lookup_context = NULL;
- char *old_id = NULL, *old_context = NULL;
- struct passwd *user;
- struct libcontacts_contact contact;
- struct libcontacts_pgpkey **r, **w;
- size_t i;
-
- ARGBEGIN {
- case 'C':
- add = 0;
- if (lookup_context)
- usage();
- lookup_context = ARG();
- break;
- case 'c':
- edit = 0;
- if (context)
- usage();
- context = ARG();
- break;
- case 'F':
- add = 1;
- if (lookup_id)
- usage();
- lookup_id = ARG();
- break;
- case 'f':
- edit = 1;
- if (id)
- usage();
- id = ARG();
- break;
- case 'u':
- remove = 1;
- break;
- default:
- usage();
- } ARGEND;
-
- if (remove == edit) {
- if (edit)
- usage();
- eprintf("at least one of -cfu is required\n");
- }
-
- if (add)
- edit = 0;
+#define CATEGORY pgpkeys
- if (argc != 1 || !*argv[0] || strchr(argv[0], '/'))
- usage();
+#define LIST_PARAMS(X)\
+ X('C', "C", 'c', "c", context, "context")\
+ X('F', "F", 'f', "f", id, "fingerprint")
- errno = 0;
- user = getpwuid(getuid());
- if (!user)
- eprintf("getpwuid: %s\n", errno ? strerror(errno) : "user does not exist");
-
- if (libcontacts_load_contact(argv[0], &contact, user))
- eprintf("libcontacts_load_contact %s: %s\n", argv[0], errno ? strerror(errno) : "contact file is malformatted");
-
- i = 0;
- if ((edit || remove) && contact.pgpkeys) {
- for (r = contact.pgpkeys; *r; r++) {
- if (lookup_context && strcmpnul((*r)->context, lookup_context))
- continue;
- if (lookup_id && strcmpnul((*r)->context, lookup_id))
- continue;
- break;
- }
- if (!edit) {
- libcontacts_pgpkey_destroy(*r);
- free(*r);
- for (w = r++; (*w++ = *r++););
- } else if (*r) {
- if (context) {
- old_context = contact.pgpkeys[i]->context;
- contact.pgpkeys[i]->context = context;
- }
- if (id) {
- old_id = contact.pgpkeys[i]->id;
- contact.pgpkeys[i]->id = id;
- }
- } else {
- libcontacts_contact_destroy(&contact);
- return 0;
- }
- } else if (!edit && !remove) {
- if (contact.pgpkeys)
- for (i = 0; contact.pgpkeys[i]; i++);
- contact.pgpkeys = erealloc(contact.pgpkeys, (i + 2) * sizeof(*contact.pgpkeys));
- contact.pgpkeys[i + 1] = NULL;
- contact.pgpkeys[i] = ecalloc(1, sizeof(**contact.pgpkeys));
- contact.pgpkeys[i]->context = context;
- contact.pgpkeys[i]->id = id;
- }
-
- if (libcontacts_save_contact(&contact, user))
- eprintf("libcontacts_save_contact %s:", argv[0]);
-
- contact.pgpkeys[i]->context = old_context;
- contact.pgpkeys[i]->id = old_id;
- libcontacts_contact_destroy(&contact);
-
- return 0;
-}
+#include "common.h"
+IMPLEMENT_SET_ON_LIST(pgpkey)