/mandos/trunk

To get this branch, use:
bzr branch http://bzr.recompile.se/loggerhead/mandos/trunk

« back to all changes in this revision

Viewing changes to plugins.d/askpass-fifo.c

  • Committer: Björn Påhlsson
  • Date: 2008-07-20 02:52:20 UTC
  • Revision ID: belorn@braxen-20080720025220-r5u0388uy9iu23h6
Added following support:
Pluginbased client handler
rewritten Mandos client
       Avahi instead of udp server discovery
       openpgp encrypted key support
Passprompt stand alone application for direct console input
Added logging for Mandos server

Show diffs side-by-side

added added

removed removed

Lines of Context:
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
 
}