/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";
369 by Teddy Hogeborn
* init.d-mandos (Required-Start, Required-Stop): Bug fix: Added
45
  ret = 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 */
369 by Teddy Hogeborn
* init.d-mandos (Required-Start, Required-Stop): Bug fix: Added
52
  int fifo_fd = 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
      }
369 by Teddy Hogeborn
* init.d-mandos (Required-Start, Required-Stop): Bug fix: Added
75
      sret = read(fifo_fd, buf + buf_len, buf_allocated - buf_len);
214 by Teddy Hogeborn
* Makefile (PLUGINS): Added "plugins.d/askpass-fifo".
76
      if(sret == -1){
77
	perror("read");
78
	free(buf);
79
	return EXIT_FAILURE;
80
      }
81
      buf_len += (size_t)sret;
363 by Teddy Hogeborn
* plugin-runner.c: Minor stylistic changes.
82
    } while(sret != 0);
214 by Teddy Hogeborn
* Makefile (PLUGINS): Added "plugins.d/askpass-fifo".
83
  }
84
  
85
  /* Close FIFO */
369 by Teddy Hogeborn
* init.d-mandos (Required-Start, Required-Stop): Bug fix: Added
86
  close(fifo_fd);
214 by Teddy Hogeborn
* Makefile (PLUGINS): Added "plugins.d/askpass-fifo".
87
  
88
  /* Print password to stdout */
89
  size_t written = 0;
90
  while(written < buf_len){
369 by Teddy Hogeborn
* init.d-mandos (Required-Start, Required-Stop): Bug fix: Added
91
    sret = write(STDOUT_FILENO, buf + written, buf_len - written);
214 by Teddy Hogeborn
* Makefile (PLUGINS): Added "plugins.d/askpass-fifo".
92
    if(sret == -1){
93
      perror("write");
94
      free(buf);
95
      return EXIT_FAILURE;
96
    }
97
    written += (size_t)sret;
98
  }
99
  free(buf);
100
  
101
  return EXIT_SUCCESS;
102
}