diff options
Diffstat (limited to 'print-contact.c')
-rw-r--r-- | print-contact.c | 55 |
1 files changed, 55 insertions, 0 deletions
diff --git a/print-contact.c b/print-contact.c new file mode 100644 index 0000000..7a9b92e --- /dev/null +++ b/print-contact.c @@ -0,0 +1,55 @@ +/* See LICENSE file for copyright and license details. */ +#include "common.h" + +USAGE("contact-id"); + + +int +main(int argc, char *argv[]) +{ + char buf[BUFSIZ]; + struct passwd *user; + char *path; + ssize_t r; + size_t n, p; + int fd; + + NOFLAGS(argc != 1); + + if (!*argv[0] || strchr(argv[0], '/')) + usage(); + + errno = 0; + user = getpwuid(getuid()); + if (!user) + eprintf("getpwuid: %s\n", errno ? strerror(errno) : "user does not exist"); + + path = libcontacts_get_path(argv[0], user); + if (!path) + eprintf("libcontacts_get_path %s:", argv[0]); + + fd = open(path, O_RDONLY); + if (fd < 0) + eprintf("open %s O_RDONLY:", path); + + for (;;) { + r = read(fd, buf, sizeof(buf)); + if (r <= 0) { + if (!r) + break; + eprintf("read %s:", path); + } + n = (size_t)r; + for (p = 0; p < n; p += (size_t)r) { + r = write(STDOUT_FILENO, &buf[p], n - p); + if (r <= 0) + eprintf("write <stdout>:"); + } + } + + if (fflush(stdout) || ferror(stdout) || fclose(stdout)) + eprintf("printf:"); + close(fd); + free(path); + return 0; +} |