/mandos/trunk

To get this branch, use:
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
}