bzr branch
http://bzr.recompile.se/loggerhead/mandos/trunk
| 214
by Teddy Hogeborn * Makefile (PLUGINS): Added "plugins.d/askpass-fifo". | 1 | #define _GNU_SOURCE /* TEMP_FAILURE_RETRY() */ | 
| 2 | #include <sys/types.h> /* ssize_t */ | |
| 3 | #include <sys/stat.h> /* mkfifo(), S_IRUSR, S_IWUSR */ | |
| 4 | #include <iso646.h> /* and */ | |
| 5 | #include <errno.h> /* errno, EEXIST */ | |
| 6 | #include <stdio.h> /* perror() */ | |
| 7 | #include <stdlib.h> /* EXIT_FAILURE, NULL, size_t, free(), | |
| 8 | realloc(), EXIT_SUCCESS */ | |
| 9 | #include <fcntl.h> /* open(), O_RDONLY */ | |
| 10 | #include <unistd.h> /* read(), close(), write(), | |
| 11 | STDOUT_FILENO */ | |
| 12 | ||
| 13 | ||
| 14 | int main(__attribute__((unused))int argc, | |
| 15 | __attribute__((unused))char **argv){ | |
| 16 | int ret = 0; | |
| 17 | ssize_t sret; | |
| 18 |   
 | |
| 19 | /* Create FIFO */ | |
| 20 | const char passfifo[] = "/lib/cryptsetup/passfifo"; | |
| 21 | ret = TEMP_FAILURE_RETRY(mkfifo(passfifo, S_IRUSR | S_IWUSR)); | |
| 22 | if(ret == -1 and errno != EEXIST){ | |
| 23 | perror("mkfifo"); | |
| 24 | return EXIT_FAILURE; | |
| 25 | } | |
| 26 |   
 | |
| 27 | /* Open FIFO */ | |
| 28 | int fifo_fd = TEMP_FAILURE_RETRY(open(passfifo, O_RDONLY)); | |
| 29 | if(fifo_fd == -1){ | |
| 30 | perror("open"); | |
| 31 | return EXIT_FAILURE; | |
| 32 | } | |
| 33 |   
 | |
| 34 | /* Read from FIFO */ | |
| 35 | char *buf = NULL; | |
| 36 | size_t buf_len = 0; | |
| 37 | { | |
| 38 | size_t buf_allocated = 0; | |
| 39 | const size_t blocksize = 1024; | |
| 40 | do{ | |
| 41 | if(buf_len + blocksize > buf_allocated){ | |
| 42 | char *tmp = realloc(buf, buf_allocated + blocksize); | |
| 43 | if(tmp == NULL){ | |
| 44 | perror("realloc"); | |
| 45 | free(buf); | |
| 46 | return EXIT_FAILURE; | |
| 47 | } | |
| 48 | buf = tmp; | |
| 49 | buf_allocated += blocksize; | |
| 50 | } | |
| 51 | sret = TEMP_FAILURE_RETRY(read(fifo_fd, buf + buf_len, | |
| 52 | buf_allocated - buf_len)); | |
| 53 | if(sret == -1){ | |
| 54 | perror("read"); | |
| 55 | free(buf); | |
| 56 | return EXIT_FAILURE; | |
| 57 | } | |
| 58 | buf_len += (size_t)sret; | |
| 59 | }while(sret != 0); | |
| 60 | } | |
| 61 |   
 | |
| 62 | /* Close FIFO */ | |
| 63 | TEMP_FAILURE_RETRY(close(fifo_fd)); | |
| 64 |   
 | |
| 65 | /* Print password to stdout */ | |
| 66 | size_t written = 0; | |
| 67 | while(written < buf_len){ | |
| 68 | sret = TEMP_FAILURE_RETRY(write(STDOUT_FILENO, buf + written, | |
| 69 | buf_len - written)); | |
| 70 | if(sret == -1){ | |
| 71 | perror("write"); | |
| 72 | free(buf); | |
| 73 | return EXIT_FAILURE; | |
| 74 | } | |
| 75 | written += (size_t)sret; | |
| 76 | } | |
| 77 | free(buf); | |
| 78 |   
 | |
| 79 | return EXIT_SUCCESS; | |
| 80 | }
 |