diff options
Diffstat (limited to '')
-rw-r--r-- | find-contact-by-number.c | 104 |
1 files changed, 104 insertions, 0 deletions
diff --git a/find-contact-by-number.c b/find-contact-by-number.c new file mode 100644 index 0000000..e426c57 --- /dev/null +++ b/find-contact-by-number.c @@ -0,0 +1,104 @@ +/* See LICENSE file for copyright and license details. */ +#include "common.h" + +USAGE("[-c context] [-C local-country-calling-code] [-D address-book-country-calling-code] [-F | -f] [-M | -m] [-t] (-L | number)"); + + +int +main(int argc, char *argv[]) +{ + int list = 0, require_mobile = -1, require_fax = -1, display_type = 0; + struct passwd *user; + struct libcontacts_contact **contacts; + struct libcontacts_number **numbers, *number; + char *context = NULL, *cc_contacts = NULL, *cc_location = NULL; + size_t i; + + ARGBEGIN { + case 'c': + if (context) + usage(); + context = ARG(); + break; + case 'C': + if (cc_location) + usage(); + cc_location = ARG(); + break; + case 'D': + if (cc_contacts) + usage(); + cc_contacts = ARG(); + break; + case 'F': + if (require_fax >= 0) + usage(); + require_fax = 0; + break; + case 'f': + if (require_fax >= 0) + usage(); + require_fax = 1; + break; + case 'M': + if (require_mobile >= 0) + usage(); + require_mobile = 0; + break; + case 'm': + if (require_mobile >= 0) + usage(); + require_mobile = 1; + break; + case 'L': + list = 1; + break; + case 't': + display_type = 1; + break; + default: + usage(); + } ARGEND; + + if (argc != 1 - list) + usage(); + + errno = 0; + user = getpwuid(getuid()); + if (!user) + eprintf("getpwuid: %s\n", errno ? strerror(errno) : "user does not exist"); + + if (libcontacts_load_contacts(&contacts, user)) + eprintf("libcontacts_load_contacts:"); + for (i = 0; contacts[i]; i++) { + if ((numbers = contacts[i]->numbers)) { + for (; (number = *numbers); numbers++) { + if (!number->number) + continue; + if (require_mobile >= 0 && number->is_mobile != require_mobile) + continue; + if (require_fax >= 0 && number->is_facsimile != require_fax) + continue; + if (context && strcmpnul(number->context, context)) + continue; + if (list) { + if (display_type) + printf("%c%c ", "-m"[number->is_mobile], "-f"[number->is_facsimile]); + printf("%s (%s)\n", contacts[i]->id, number->number); + } else if (libcontacts_same_number(number->number, cc_contacts, argv[0], cc_location)) { + if (display_type) + printf("%c%c ", "-m"[number->is_mobile], "-f"[number->is_facsimile]); + printf("%s\n", contacts[i]->id); + } + } + } + libcontacts_contact_destroy(contacts[i]); + free(contacts[i]); + } + free(contacts); + + if (fflush(stdout) || ferror(stdout) || fclose(stdout)) + eprintf("printf:"); + + return 0; +} |