diff options
Diffstat (limited to '')
-rw-r--r-- | set-contact-notes.c | 25 |
1 files changed, 19 insertions, 6 deletions
diff --git a/set-contact-notes.c b/set-contact-notes.c index 6fde429..d2f636d 100644 --- a/set-contact-notes.c +++ b/set-contact-notes.c @@ -1,19 +1,22 @@ /* See LICENSE file for copyright and license details. */ #include "common.h" -USAGE("[-u] contact-id"); /* TODO add -a (append) */ +USAGE("[-a | -u] contact-id"); int main(int argc, char *argv[]) { - int unset = 0; + int append = 0, unset = 0; struct passwd *user; struct libcontacts_contact contact; size_t size = 0, len = 0; ssize_t r; ARGBEGIN { + case 'a': + append = 1; + break; case 'u': unset = 1; break; @@ -21,7 +24,7 @@ main(int argc, char *argv[]) usage(); } ARGEND; - if (argc != 1) + if (argc != 1 || (append && unset)) usage(); if (!*argv[0] || strchr(argv[0], '/')) @@ -35,8 +38,15 @@ main(int argc, char *argv[]) if (libcontacts_load_contact(argv[0], &contact, user)) eprintf("libcontacts_load_contact %s: %s\n", argv[0], errno ? strerror(errno) : "contact file is malformatted"); - free(contact.notes); - contact.notes = NULL; + if (contact.notes) { + if (append) { + len = strlen(contact.notes); + size = len + 1; + } else { + free(contact.notes); + contact.notes = NULL; + } + } if (!unset) { for (;;) { if (len == size) @@ -49,8 +59,11 @@ main(int argc, char *argv[]) } len += (size_t)r; } - if (size) + if (size) { + if (len == size) + contact.notes = erealloc(contact.notes, size += 1); contact.notes[len] = '\0'; + } } if (libcontacts_save_contact(&contact, user)) |