/mandos/trunk

To get this branch, use:
bzr branch http://bzr.recompile.se/loggerhead/mandos/trunk
237.1.2 by Teddy Hogeborn
Further steps towards a D-Bus server interface, plus minor syntax
1
/*  -*- coding: utf-8 -*- */
2
/*
261 by Teddy Hogeborn
* plugins.d/askpass-fifo.c: Fix name in header.
3
 * Askpass-FIFO - Read a password from a FIFO and output it
237.1.2 by Teddy Hogeborn
Further steps towards a D-Bus server interface, plus minor syntax
4
 * 
246 by Teddy Hogeborn
* README: Update copyright year; add "2009".
5
 * Copyright © 2008,2009 Teddy Hogeborn
6
 * Copyright © 2008,2009 Björn Påhlsson
237.1.2 by Teddy Hogeborn
Further steps towards a D-Bus server interface, plus minor syntax
7
 * 
8
 * This program is free software: you can redistribute it and/or
9
 * modify it under the terms of the GNU General Public License as
10
 * published by the Free Software Foundation, either version 3 of the
11
 * License, or (at your option) any later version.
12
 * 
13
 * This program is distributed in the hope that it will be useful, but
14
 * WITHOUT ANY WARRANTY; without even the implied warranty of
15
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
16
 * General Public License for more details.
17
 * 
18
 * You should have received a copy of the GNU General Public License
19
 * along with this program.  If not, see
20
 * <http://www.gnu.org/licenses/>.
21
 * 
363 by Teddy Hogeborn
* plugin-runner.c: Minor stylistic changes.
22
 * Contact the authors at <mandos@fukt.bsnet.se>.
237.1.2 by Teddy Hogeborn
Further steps towards a D-Bus server interface, plus minor syntax
23
 */
24
214 by Teddy Hogeborn
* Makefile (PLUGINS): Added "plugins.d/askpass-fifo".
25
#define _GNU_SOURCE		/* TEMP_FAILURE_RETRY() */
26
#include <sys/types.h>		/* ssize_t */
27
#include <sys/stat.h>		/* mkfifo(), S_IRUSR, S_IWUSR */
28
#include <iso646.h>		/* and */
29
#include <errno.h>		/* errno, EEXIST */
30
#include <stdio.h>		/* perror() */
355 by Teddy Hogeborn
* mandos: White-space fixes only.
31
#include <stdlib.h>		/* EXIT_FAILURE, NULL, size_t, free(),
214 by Teddy Hogeborn
* Makefile (PLUGINS): Added "plugins.d/askpass-fifo".
32
				   realloc(), EXIT_SUCCESS */
33
#include <fcntl.h>		/* open(), O_RDONLY */
34
#include <unistd.h>		/* read(), close(), write(),
35
				   STDOUT_FILENO */
36
37
38
int main(__attribute__((unused))int argc,
39
	 __attribute__((unused))char **argv){
40
  int ret = 0;
41
  ssize_t sret;
42
  
43
  /* Create FIFO */
44
  const char passfifo[] = "/lib/cryptsetup/passfifo";
257.1.2 by Mooie
Fixed warnings in the 64 bit build. Added explicit cast to int for
45
  ret = (int)TEMP_FAILURE_RETRY(mkfifo(passfifo, S_IRUSR | S_IWUSR));
214 by Teddy Hogeborn
* Makefile (PLUGINS): Added "plugins.d/askpass-fifo".
46
  if(ret == -1 and errno != EEXIST){
47
    perror("mkfifo");
48
    return EXIT_FAILURE;
49
  }
50
  
51
  /* Open FIFO */
257.1.2 by Mooie
Fixed warnings in the 64 bit build. Added explicit cast to int for
52
  int fifo_fd = (int)TEMP_FAILURE_RETRY(open(passfifo, O_RDONLY));
214 by Teddy Hogeborn
* Makefile (PLUGINS): Added "plugins.d/askpass-fifo".
53
  if(fifo_fd == -1){
54
    perror("open");
55
    return EXIT_FAILURE;
56
  }
57
  
58
  /* Read from FIFO */
59
  char *buf = NULL;
60
  size_t buf_len = 0;
61
  {
62
    size_t buf_allocated = 0;
63
    const size_t blocksize = 1024;
363 by Teddy Hogeborn
* plugin-runner.c: Minor stylistic changes.
64
    do {
214 by Teddy Hogeborn
* Makefile (PLUGINS): Added "plugins.d/askpass-fifo".
65
      if(buf_len + blocksize > buf_allocated){
66
	char *tmp = realloc(buf, buf_allocated + blocksize);
67
	if(tmp == NULL){
68
	  perror("realloc");
69
	  free(buf);
70
	  return EXIT_FAILURE;
71
	}
72
	buf = tmp;
73
	buf_allocated += blocksize;
74
      }
75
      sret = TEMP_FAILURE_RETRY(read(fifo_fd, buf + buf_len,
76
				     buf_allocated - buf_len));
77
      if(sret == -1){
78
	perror("read");
79
	free(buf);
80
	return EXIT_FAILURE;
81
      }
82
      buf_len += (size_t)sret;
363 by Teddy Hogeborn
* plugin-runner.c: Minor stylistic changes.
83
    } while(sret != 0);
214 by Teddy Hogeborn
* Makefile (PLUGINS): Added "plugins.d/askpass-fifo".
84
  }
85
  
86
  /* Close FIFO */
87
  TEMP_FAILURE_RETRY(close(fifo_fd));
88
  
89
  /* Print password to stdout */
90
  size_t written = 0;
91
  while(written < buf_len){
92
    sret = TEMP_FAILURE_RETRY(write(STDOUT_FILENO, buf + written,
93
				    buf_len - written));
94
    if(sret == -1){
95
      perror("write");
96
      free(buf);
97
      return EXIT_FAILURE;
98
    }
99
    written += (size_t)sret;
100
  }
101
  free(buf);
102
  
103
  return EXIT_SUCCESS;
104
}