/mandos/trunk

To get this branch, use:
bzr branch http://bzr.recompile.se/loggerhead/mandos/trunk
356 by Teddy Hogeborn
* plugin-runner.c (main): When a plugin is killed by a signal, show
1
/*  -*- coding: utf-8; mode: c; mode: orgtbl -*- */
21 by Teddy Hogeborn
* Makefile (CFLAGS): Changed to use $(WARN), $(DEBUG), $(COVERAGE) and
2
/*
261 by Teddy Hogeborn
* plugins.d/askpass-fifo.c: Fix name in header.
3
 * Password-prompt - Read a password from the terminal and print it
237.1.2 by Teddy Hogeborn
Further steps towards a D-Bus server interface, plus minor syntax
4
 * 
1259 by Teddy Hogeborn
Update copyright year
5
 * Copyright © 2008-2019, 2021-2022 Teddy Hogeborn
6
 * Copyright © 2008-2019, 2021-2022 Björn Påhlsson
21 by Teddy Hogeborn
* Makefile (CFLAGS): Changed to use $(WARN), $(DEBUG), $(COVERAGE) and
7
 * 
907 by Teddy Hogeborn
Alter copyright notices slightly. Actual license is unchanged!
8
 * This file is part of Mandos.
9
 * 
10
 * Mandos is free software: you can redistribute it and/or modify it
11
 * under the terms of the GNU General Public License as published by
12
 * the Free Software Foundation, either version 3 of the License, or
13
 * (at your option) any later version.
14
 * 
15
 * Mandos is distributed in the hope that it will be useful, but
21 by Teddy Hogeborn
* Makefile (CFLAGS): Changed to use $(WARN), $(DEBUG), $(COVERAGE) and
16
 * WITHOUT ANY WARRANTY; without even the implied warranty of
17
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
18
 * General Public License for more details.
19
 * 
20
 * You should have received a copy of the GNU General Public License
907 by Teddy Hogeborn
Alter copyright notices slightly. Actual license is unchanged!
21
 * along with Mandos.  If not, see <http://www.gnu.org/licenses/>.
21 by Teddy Hogeborn
* Makefile (CFLAGS): Changed to use $(WARN), $(DEBUG), $(COVERAGE) and
22
 * 
505.1.2 by Teddy Hogeborn
Change "fukt.bsnet.se" to "recompile.se" throughout.
23
 * Contact the authors at <mandos@recompile.se>.
21 by Teddy Hogeborn
* Makefile (CFLAGS): Changed to use $(WARN), $(DEBUG), $(COVERAGE) and
24
 */
25
1233 by Teddy Hogeborn
Fix #include headers
26
#define _GNU_SOURCE		/* vasprintf(),
27
				   program_invocation_short_name,
28
				   asprintf(), getline() */
29
#include <sys/types.h>		/* sig_atomic_t, pid_t */
30
#include <stdbool.h>		/* bool, false, true */
31
#include <argp.h>		/* argp_program_version,
32
				   argp_program_bug_address,
33
				   struct argp_option,
34
				   struct argp_state, argp_state_help,
35
				   ARGP_HELP_STD_HELP,
36
				   ARGP_HELP_EXIT_ERR,
37
				   ARGP_HELP_EXIT_OK, ARGP_HELP_USAGE,
38
				   argp_err_exit_status,
39
				   ARGP_ERR_UNKNOWN, argp_parse(),
40
				   ARGP_IN_ORDER, ARGP_NO_HELP */
41
#include <stdarg.h>		/* va_list, va_start(), vfprintf() */
42
#include <stdio.h>		/* vasprintf(), fprintf(), stderr,
43
				   vfprintf(), asprintf(), getline(),
44
				   stdin, feof(), clearerr(),
45
				   fputc() */
46
#include <errno.h>		/* program_invocation_short_name,
47
				   errno, ENOENT, error_t, ENOMEM,
48
				   EINVAL, EBADF, ENOTTY, EFAULT,
49
				   EFBIG, EIO, ENOSPC, EINTR */
50
#include <string.h>		/* strerror(), strrchr(), strcmp() */
51
#include <error.h>		/* error() */
52
#include <stdlib.h>		/* free(), realloc(), EXIT_SUCCESS,
53
				   EXIT_FAILURE, getenv() */
54
#include <unistd.h>		/* access(), R_OK, ssize_t, close(),
55
				   read(), STDIN_FILENO, write(),
56
				   STDOUT_FILENO */
57
#include <dirent.h>		/* struct dirent, scandir(),
58
				   alphasort() */
59
#include <inttypes.h>		/* uintmax_t, strtoumax() */
60
#include <iso646.h>		/* or, and, not */
61
#include <fcntl.h>		/* open(), O_RDONLY */
62
#include <stddef.h>		/* NULL, size_t */
63
#include <termios.h>		/* struct termios, tcgetattr(),
64
				   tcflag_t, ECHO, tcsetattr(),
65
				   TCSAFLUSH */
66
#include <signal.h>		/* struct sigaction, sigemptyset(),
67
				   sigaddset(), SIGINT, SIGHUP,
68
				   SIGTERM, SIG_IGN, SIG_DFL,
356 by Teddy Hogeborn
* plugin-runner.c (main): When a plugin is killed by a signal, show
69
				   raise() */
1233 by Teddy Hogeborn
Fix #include headers
70
#include <sysexits.h>		/* EX_OSERR, EX_USAGE, EX_UNAVAILABLE,
71
				   EX_IOERR, EX_OSFILE, EX_OK */
13 by Björn Påhlsson
Added following support:
72
294 by Teddy Hogeborn
* plugins.d/password-prompt.c (quit_now): Changed type to "volatile
73
volatile sig_atomic_t quit_now = 0;
356 by Teddy Hogeborn
* plugin-runner.c (main): When a plugin is killed by a signal, show
74
int signal_received;
15.1.2 by Björn Påhlsson
Added debug options from passprompt as --debug and --debug=passprompt
75
bool debug = false;
217 by Teddy Hogeborn
* .bzrignore: Added "man" directory (created by "make install-html").
76
const char *argp_program_version = "password-prompt " VERSION;
505.1.2 by Teddy Hogeborn
Change "fukt.bsnet.se" to "recompile.se" throughout.
77
const char *argp_program_bug_address = "<mandos@recompile.se>";
13 by Björn Påhlsson
Added following support:
78
469 by Teddy Hogeborn
* plugins.d/password-prompt.c (conflict_detection): Check for both
79
/* Needed for conflict resolution */
80
const char plymouth_name[] = "plymouthd";
237.5.1 by Björn Påhlsson
password-prompt: added conflic handling with plymouth daemon.
81
24.1.173 by Björn Påhlsson
prepended mandos plugin to error messages in each plugin. Added a better way in TODO.
82
/* Function to use when printing errors */
533 by teddy at bsnet
* plugins.d/splashy.c (error_plus): Check format string.
83
__attribute__((format (gnu_printf, 3, 4)))
485 by Teddy Hogeborn
Merge from Björn.
84
void error_plus(int status, int errnum, const char *formatstring,
85
		...){
24.1.173 by Björn Påhlsson
prepended mandos plugin to error messages in each plugin. Added a better way in TODO.
86
  va_list ap;
87
  char *text;
88
  int ret;
89
  
90
  va_start(ap, formatstring);
91
  ret = vasprintf(&text, formatstring, ap);
670 by Teddy Hogeborn
White space fix: change "if (" to "if(" in C code.
92
  if(ret == -1){
485 by Teddy Hogeborn
Merge from Björn.
93
    fprintf(stderr, "Mandos plugin %s: ",
94
	    program_invocation_short_name);
24.1.173 by Björn Påhlsson
prepended mandos plugin to error messages in each plugin. Added a better way in TODO.
95
    vfprintf(stderr, formatstring, ap);
534 by teddy at bsnet
* plugin-runner.c (add_to_char_array): Added "nonnull" attribute.
96
    fprintf(stderr, ": %s\n", strerror(errnum));
24.1.173 by Björn Påhlsson
prepended mandos plugin to error messages in each plugin. Added a better way in TODO.
97
    error(status, errno, "vasprintf while printing error");
98
    return;
99
  }
100
  fprintf(stderr, "Mandos plugin ");
101
  error(status, errnum, "%s", text);
102
  free(text);
103
}
104
356 by Teddy Hogeborn
* plugin-runner.c (main): When a plugin is killed by a signal, show
105
static void termination_handler(int signum){
106
  if(quit_now){
107
    return;
108
  }
294 by Teddy Hogeborn
* plugins.d/password-prompt.c (quit_now): Changed type to "volatile
109
  quit_now = 1;
356 by Teddy Hogeborn
* plugin-runner.c (main): When a plugin is killed by a signal, show
110
  signal_received = signum;
13 by Björn Påhlsson
Added following support:
111
}
112
237.5.1 by Björn Påhlsson
password-prompt: added conflic handling with plymouth daemon.
113
bool conflict_detection(void){
114
237.5.2 by Björn Påhlsson
fixed bug with conflict detection between plymouthd and password-prompt
115
  /* plymouth conflicts with password-prompt since both want to read
116
     from the terminal.  Password-prompt will exit if it detects
117
     plymouth since plymouth performs the same functionality.
237.5.1 by Björn Påhlsson
password-prompt: added conflic handling with plymouth daemon.
118
   */
1127 by Teddy Hogeborn
Add dracut(8) support
119
  if(access("/run/plymouth/pid", R_OK) == 0){
120
    return true;
121
  }
122
  
534 by teddy at bsnet
* plugin-runner.c (add_to_char_array): Added "nonnull" attribute.
123
  __attribute__((nonnull))
237.5.1 by Björn Påhlsson
password-prompt: added conflic handling with plymouth daemon.
124
  int is_plymouth(const struct dirent *proc_entry){
125
    int ret;
237.5.2 by Björn Påhlsson
fixed bug with conflict detection between plymouthd and password-prompt
126
    int cl_fd;
237.5.1 by Björn Påhlsson
password-prompt: added conflic handling with plymouth daemon.
127
    {
536 by Björn Påhlsson
renamed some foomax values to what they actually represent
128
      uintmax_t proc_id;
237.5.1 by Björn Påhlsson
password-prompt: added conflic handling with plymouth daemon.
129
      char *tmp;
130
      errno = 0;
536 by Björn Påhlsson
renamed some foomax values to what they actually represent
131
      proc_id = strtoumax(proc_entry->d_name, &tmp, 10);
237.5.1 by Björn Påhlsson
password-prompt: added conflic handling with plymouth daemon.
132
      
133
      if(errno != 0 or *tmp != '\0'
536 by Björn Påhlsson
renamed some foomax values to what they actually represent
134
	 or proc_id != (uintmax_t)((pid_t)proc_id)){
237.5.1 by Björn Påhlsson
password-prompt: added conflic handling with plymouth daemon.
135
	return 0;
136
      }
137
    }
237.5.2 by Björn Påhlsson
fixed bug with conflict detection between plymouthd and password-prompt
138
    
139
    char *cmdline_filename;
469.1.1 by teddy at bsnet
* plugins.d/password-prompt.c: Some white space fixes. Break some
140
    ret = asprintf(&cmdline_filename, "/proc/%s/cmdline",
141
		   proc_entry->d_name);
237.5.1 by Björn Påhlsson
password-prompt: added conflic handling with plymouth daemon.
142
    if(ret == -1){
534 by teddy at bsnet
* plugin-runner.c (add_to_char_array): Added "nonnull" attribute.
143
      error_plus(0, errno, "asprintf");
237.5.1 by Björn Påhlsson
password-prompt: added conflic handling with plymouth daemon.
144
      return 0;
145
    }
237.5.2 by Björn Påhlsson
fixed bug with conflict detection between plymouthd and password-prompt
146
    
469.1.1 by teddy at bsnet
* plugins.d/password-prompt.c: Some white space fixes. Break some
147
    /* Open /proc/<pid>/cmdline */
237.5.2 by Björn Påhlsson
fixed bug with conflict detection between plymouthd and password-prompt
148
    cl_fd = open(cmdline_filename, O_RDONLY);
149
    free(cmdline_filename);
150
    if(cl_fd == -1){
478 by Teddy Hogeborn
* plugins.d/password-prompt.c (conflict_detection): Don't print error
151
      if(errno != ENOENT){
534 by teddy at bsnet
* plugin-runner.c (add_to_char_array): Added "nonnull" attribute.
152
	error_plus(0, errno, "open");
478 by Teddy Hogeborn
* plugins.d/password-prompt.c (conflict_detection): Don't print error
153
      }
237.5.2 by Björn Påhlsson
fixed bug with conflict detection between plymouthd and password-prompt
154
      return 0;
155
    }
156
    
157
    char *cmdline = NULL;
158
    {
159
      size_t cmdline_len = 0;
160
      size_t cmdline_allocated = 0;
161
      char *tmp;
162
      const size_t blocksize = 1024;
163
      ssize_t sret;
164
      do {
165
	/* Allocate more space? */
166
	if(cmdline_len + blocksize + 1 > cmdline_allocated){
167
	  tmp = realloc(cmdline, cmdline_allocated + blocksize + 1);
168
	  if(tmp == NULL){
534 by teddy at bsnet
* plugin-runner.c (add_to_char_array): Added "nonnull" attribute.
169
	    error_plus(0, errno, "realloc");
237.5.2 by Björn Påhlsson
fixed bug with conflict detection between plymouthd and password-prompt
170
	    free(cmdline);
171
	    close(cl_fd);
172
	    return 0;
173
	  }
174
	  cmdline = tmp;
175
	  cmdline_allocated += blocksize;
176
	}
177
	
178
	/* Read data */
179
	sret = read(cl_fd, cmdline + cmdline_len,
180
		    cmdline_allocated - cmdline_len);
181
	if(sret == -1){
534 by teddy at bsnet
* plugin-runner.c (add_to_char_array): Added "nonnull" attribute.
182
	  error_plus(0, errno, "read");
237.5.2 by Björn Påhlsson
fixed bug with conflict detection between plymouthd and password-prompt
183
	  free(cmdline);
184
	  close(cl_fd);
185
	  return 0;
186
	}
187
	cmdline_len += (size_t)sret;
188
      } while(sret != 0);
189
      ret = close(cl_fd);
190
      if(ret == -1){
534 by teddy at bsnet
* plugin-runner.c (add_to_char_array): Added "nonnull" attribute.
191
	error_plus(0, errno, "close");
237.5.2 by Björn Påhlsson
fixed bug with conflict detection between plymouthd and password-prompt
192
	free(cmdline);
193
	return 0;
237.5.1 by Björn Påhlsson
password-prompt: added conflic handling with plymouth daemon.
194
      }
237.5.2 by Björn Påhlsson
fixed bug with conflict detection between plymouthd and password-prompt
195
      cmdline[cmdline_len] = '\0'; /* Make sure it is terminated */
196
    }
197
    /* we now have cmdline */
198
    
199
    /* get basename */
200
    char *cmdline_base = strrchr(cmdline, '/');
201
    if(cmdline_base != NULL){
202
      cmdline_base += 1;		/* skip the slash */
203
    } else {
204
      cmdline_base = cmdline;
205
    }
206
    
471 by Teddy Hogeborn
* plugins.d/password-prompt.c (conflict_detection): Check for both
207
    if(strcmp(cmdline_base, plymouth_name) != 0){
469.1.1 by teddy at bsnet
* plugins.d/password-prompt.c: Some white space fixes. Break some
208
      if(debug){
471 by Teddy Hogeborn
* plugins.d/password-prompt.c (conflict_detection): Check for both
209
	fprintf(stderr, "\"%s\" is not \"%s\"\n", cmdline_base,
210
		plymouth_name);
469.1.1 by teddy at bsnet
* plugins.d/password-prompt.c: Some white space fixes. Break some
211
      }
237.5.2 by Björn Påhlsson
fixed bug with conflict detection between plymouthd and password-prompt
212
      free(cmdline);
213
      return 0;
214
    }
471 by Teddy Hogeborn
* plugins.d/password-prompt.c (conflict_detection): Check for both
215
    if(debug){
216
      fprintf(stderr, "\"%s\" equals \"%s\"\n", cmdline_base,
217
	      plymouth_name);
218
    }
237.5.2 by Björn Påhlsson
fixed bug with conflict detection between plymouthd and password-prompt
219
    free(cmdline);
237.5.1 by Björn Påhlsson
password-prompt: added conflic handling with plymouth daemon.
220
    return 1;
221
  }
469.1.1 by teddy at bsnet
* plugins.d/password-prompt.c: Some white space fixes. Break some
222
  
24.1.176 by Björn Påhlsson
free dirents in password-prompt
223
  struct dirent **direntries = NULL;
237.5.1 by Björn Påhlsson
password-prompt: added conflic handling with plymouth daemon.
224
  int ret;
225
  ret = scandir("/proc", &direntries, is_plymouth, alphasort);
670 by Teddy Hogeborn
White space fix: change "if (" to "if(" in C code.
226
  if(ret == -1){
534 by teddy at bsnet
* plugin-runner.c (add_to_char_array): Added "nonnull" attribute.
227
    error_plus(1, errno, "scandir");
237.5.1 by Björn Påhlsson
password-prompt: added conflic handling with plymouth daemon.
228
  }
901 by Teddy Hogeborn
Fix memory leak in password-prompt
229
  {
230
    int i = ret;
231
    while(i--){
232
      free(direntries[i]);
233
    }
234
  }
237.4.16 by Teddy Hogeborn
* Makefile (version): Changed to "1.3.1".
235
  free(direntries);
467 by Teddy Hogeborn
Merge fix for password-prompt/plymouth conflict from Björn.
236
  return ret > 0;
237.5.1 by Björn Påhlsson
password-prompt: added conflic handling with plymouth daemon.
237
}
238
239
13 by Björn Påhlsson
Added following support:
240
int main(int argc, char **argv){
24.1.155 by Björn Påhlsson
mandos server: Added debuglevel that adjust at what level information
241
  ssize_t sret;
242
  int ret;
13 by Björn Påhlsson
Added following support:
243
  size_t n;
244
  struct termios t_new, t_old;
245
  char *buffer = NULL;
15.1.3 by Björn Påhlsson
Added getopt_long support for mandosclient and passprompt
246
  char *prefix = NULL;
1127 by Teddy Hogeborn
Add dracut(8) support
247
  char *prompt = NULL;
13 by Björn Påhlsson
Added following support:
248
  int status = EXIT_SUCCESS;
249
  struct sigaction old_action,
250
    new_action = { .sa_handler = termination_handler,
251
		   .sa_flags = 0 };
24.1.17 by Björn Påhlsson
passprompt
252
  {
253
    struct argp_option options[] = {
254
      { .name = "prefix", .key = 'p',
255
	.arg = "PREFIX", .flags = 0,
110 by Teddy Hogeborn
* mandos.xml (EXAMPLE): Replaced all occurences of command name with
256
	.doc = "Prefix shown before the prompt", .group = 2 },
1127 by Teddy Hogeborn
Add dracut(8) support
257
      { .name = "prompt", .key = 129,
258
	.arg = "PROMPT", .flags = 0,
259
	.doc = "The prompt to show", .group = 2 },
24.1.17 by Björn Påhlsson
passprompt
260
      { .name = "debug", .key = 128,
261
	.doc = "Debug mode", .group = 3 },
394 by Teddy Hogeborn
Convert some programs to use the exit codes from <sysexits.h>. Change
262
      /*
263
       * These reproduce what we would get without ARGP_NO_HELP
264
       */
265
      { .name = "help", .key = '?',
266
	.doc = "Give this help list", .group = -1 },
267
      { .name = "usage", .key = -3,
268
	.doc = "Give a short usage message", .group = -1 },
269
      { .name = "version", .key = 'V',
270
	.doc = "Print program version", .group = -1 },
24.1.17 by Björn Påhlsson
passprompt
271
      { .name = NULL }
272
    };
257 by Teddy Hogeborn
Change the default value of the "checker" option command to make the
273
    
534 by teddy at bsnet
* plugin-runner.c (add_to_char_array): Added "nonnull" attribute.
274
    __attribute__((nonnull(3)))
293 by Teddy Hogeborn
* plugin-runner.c: Whitespace changes only.
275
    error_t parse_opt (int key, char *arg, struct argp_state *state){
394 by Teddy Hogeborn
Convert some programs to use the exit codes from <sysexits.h>. Change
276
      errno = 0;
293 by Teddy Hogeborn
* plugin-runner.c: Whitespace changes only.
277
      switch (key){
1127 by Teddy Hogeborn
Add dracut(8) support
278
      case 'p':			/* --prefix */
24.1.17 by Björn Påhlsson
passprompt
279
	prefix = arg;
280
	break;
1127 by Teddy Hogeborn
Add dracut(8) support
281
      case 128:			/* --debug */
24.1.17 by Björn Påhlsson
passprompt
282
	debug = true;
283
	break;
1127 by Teddy Hogeborn
Add dracut(8) support
284
      case 129:			/* --prompt */
285
	prompt = arg;
286
	break;
394 by Teddy Hogeborn
Convert some programs to use the exit codes from <sysexits.h>. Change
287
	/*
288
	 * These reproduce what we would get without ARGP_NO_HELP
289
	 */
290
      case '?':			/* --help */
291
	argp_state_help(state, state->out_stream,
292
			(ARGP_HELP_STD_HELP | ARGP_HELP_EXIT_ERR)
293
			& ~(unsigned int)ARGP_HELP_EXIT_OK);
975 by Teddy Hogeborn
Fix warnings from -Wimplicit-fallthrough
294
	__builtin_unreachable();
394 by Teddy Hogeborn
Convert some programs to use the exit codes from <sysexits.h>. Change
295
      case -3:			/* --usage */
296
	argp_state_help(state, state->out_stream,
297
			ARGP_HELP_USAGE | ARGP_HELP_EXIT_ERR);
975 by Teddy Hogeborn
Fix warnings from -Wimplicit-fallthrough
298
	__builtin_unreachable();
394 by Teddy Hogeborn
Convert some programs to use the exit codes from <sysexits.h>. Change
299
      case 'V':			/* --version */
300
	fprintf(state->out_stream, "%s\n", argp_program_version);
301
	exit(argp_err_exit_status);
24.1.17 by Björn Påhlsson
passprompt
302
	break;
303
      default:
304
	return ARGP_ERR_UNKNOWN;
305
      }
394 by Teddy Hogeborn
Convert some programs to use the exit codes from <sysexits.h>. Change
306
      return errno;
24.1.17 by Björn Påhlsson
passprompt
307
    }
257 by Teddy Hogeborn
Change the default value of the "checker" option command to make the
308
    
24.1.17 by Björn Påhlsson
passprompt
309
    struct argp argp = { .options = options, .parser = parse_opt,
310
			 .args_doc = "",
110 by Teddy Hogeborn
* mandos.xml (EXAMPLE): Replaced all occurences of command name with
311
			 .doc = "Mandos password-prompt -- Read and"
312
			 " output a password" };
394 by Teddy Hogeborn
Convert some programs to use the exit codes from <sysexits.h>. Change
313
    ret = argp_parse(&argp, argc, argv,
314
		     ARGP_IN_ORDER | ARGP_NO_HELP, NULL, NULL);
315
    switch(ret){
316
    case 0:
317
      break;
318
    case ENOMEM:
319
    default:
320
      errno = ret;
534 by teddy at bsnet
* plugin-runner.c (add_to_char_array): Added "nonnull" attribute.
321
      error_plus(0, errno, "argp_parse");
394 by Teddy Hogeborn
Convert some programs to use the exit codes from <sysexits.h>. Change
322
      return EX_OSERR;
323
    case EINVAL:
324
      return EX_USAGE;
24.1.26 by Björn Påhlsson
tally count of used symbols
325
    }
15.1.3 by Björn Påhlsson
Added getopt_long support for mandosclient and passprompt
326
  }
257 by Teddy Hogeborn
Change the default value of the "checker" option command to make the
327
  
266 by Teddy Hogeborn
* plugin-runner.c: Only space changes.
328
  if(debug){
15.1.2 by Björn Påhlsson
Added debug options from passprompt as --debug and --debug=passprompt
329
    fprintf(stderr, "Starting %s\n", argv[0]);
330
  }
237.5.1 by Björn Påhlsson
password-prompt: added conflic handling with plymouth daemon.
331
670 by Teddy Hogeborn
White space fix: change "if (" to "if(" in C code.
332
  if(conflict_detection()){
237.5.1 by Björn Påhlsson
password-prompt: added conflic handling with plymouth daemon.
333
    if(debug){
469.1.1 by teddy at bsnet
* plugins.d/password-prompt.c: Some white space fixes. Break some
334
      fprintf(stderr, "Stopping %s because of conflict\n", argv[0]);
237.5.1 by Björn Påhlsson
password-prompt: added conflic handling with plymouth daemon.
335
    }
336
    return EXIT_FAILURE;
337
  }
338
  
266 by Teddy Hogeborn
* plugin-runner.c: Only space changes.
339
  if(debug){
15.1.2 by Björn Påhlsson
Added debug options from passprompt as --debug and --debug=passprompt
340
    fprintf(stderr, "Storing current terminal attributes\n");
341
  }
13 by Björn Påhlsson
Added following support:
342
  
266 by Teddy Hogeborn
* plugin-runner.c: Only space changes.
343
  if(tcgetattr(STDIN_FILENO, &t_old) != 0){
391 by Teddy Hogeborn
* plugins.d/password-prompt.c: Use exit codes from <sysexits.h>. Do
344
    int e = errno;
534 by teddy at bsnet
* plugin-runner.c (add_to_char_array): Added "nonnull" attribute.
345
    error_plus(0, errno, "tcgetattr");
391 by Teddy Hogeborn
* plugins.d/password-prompt.c: Use exit codes from <sysexits.h>. Do
346
    switch(e){
347
    case EBADF:
348
    case ENOTTY:
349
      return EX_UNAVAILABLE;
350
    default:
351
      return EX_OSERR;
352
    }
13 by Björn Påhlsson
Added following support:
353
  }
354
  
355
  sigemptyset(&new_action.sa_mask);
357 by Teddy Hogeborn
* plugins.d/mandos-client.c (main): Do not handle ignored signals.
356
  ret = sigaddset(&new_action.sa_mask, SIGINT);
357
  if(ret == -1){
534 by teddy at bsnet
* plugin-runner.c (add_to_char_array): Added "nonnull" attribute.
358
    error_plus(0, errno, "sigaddset");
391 by Teddy Hogeborn
* plugins.d/password-prompt.c: Use exit codes from <sysexits.h>. Do
359
    return EX_OSERR;
357 by Teddy Hogeborn
* plugins.d/mandos-client.c (main): Do not handle ignored signals.
360
  }
361
  ret = sigaddset(&new_action.sa_mask, SIGHUP);
362
  if(ret == -1){
534 by teddy at bsnet
* plugin-runner.c (add_to_char_array): Added "nonnull" attribute.
363
    error_plus(0, errno, "sigaddset");
391 by Teddy Hogeborn
* plugins.d/password-prompt.c: Use exit codes from <sysexits.h>. Do
364
    return EX_OSERR;
357 by Teddy Hogeborn
* plugins.d/mandos-client.c (main): Do not handle ignored signals.
365
  }
366
  ret = sigaddset(&new_action.sa_mask, SIGTERM);
367
  if(ret == -1){
534 by teddy at bsnet
* plugin-runner.c (add_to_char_array): Added "nonnull" attribute.
368
    error_plus(0, errno, "sigaddset");
391 by Teddy Hogeborn
* plugins.d/password-prompt.c: Use exit codes from <sysexits.h>. Do
369
    return EX_OSERR;
24.1.26 by Björn Påhlsson
tally count of used symbols
370
  }
356 by Teddy Hogeborn
* plugin-runner.c (main): When a plugin is killed by a signal, show
371
  /* Need to check if the handler is SIG_IGN before handling:
372
     | [[info:libc:Initial Signal Actions]] |
373
     | [[info:libc:Basic Signal Handling]]  |
374
  */
357 by Teddy Hogeborn
* plugins.d/mandos-client.c (main): Do not handle ignored signals.
375
  ret = sigaction(SIGINT, NULL, &old_action);
376
  if(ret == -1){
534 by teddy at bsnet
* plugin-runner.c (add_to_char_array): Added "nonnull" attribute.
377
    error_plus(0, errno, "sigaction");
391 by Teddy Hogeborn
* plugins.d/password-prompt.c: Use exit codes from <sysexits.h>. Do
378
    return EX_OSERR;
357 by Teddy Hogeborn
* plugins.d/mandos-client.c (main): Do not handle ignored signals.
379
  }
266 by Teddy Hogeborn
* plugin-runner.c: Only space changes.
380
  if(old_action.sa_handler != SIG_IGN){
24.1.26 by Björn Påhlsson
tally count of used symbols
381
    ret = sigaction(SIGINT, &new_action, NULL);
382
    if(ret == -1){
534 by teddy at bsnet
* plugin-runner.c (add_to_char_array): Added "nonnull" attribute.
383
      error_plus(0, errno, "sigaction");
391 by Teddy Hogeborn
* plugins.d/password-prompt.c: Use exit codes from <sysexits.h>. Do
384
      return EX_OSERR;
24.1.26 by Björn Påhlsson
tally count of used symbols
385
    }
386
  }
387
  ret = sigaction(SIGHUP, NULL, &old_action);
388
  if(ret == -1){
534 by teddy at bsnet
* plugin-runner.c (add_to_char_array): Added "nonnull" attribute.
389
    error_plus(0, errno, "sigaction");
391 by Teddy Hogeborn
* plugins.d/password-prompt.c: Use exit codes from <sysexits.h>. Do
390
    return EX_OSERR;
24.1.26 by Björn Påhlsson
tally count of used symbols
391
  }
266 by Teddy Hogeborn
* plugin-runner.c: Only space changes.
392
  if(old_action.sa_handler != SIG_IGN){
24.1.26 by Björn Påhlsson
tally count of used symbols
393
    ret = sigaction(SIGHUP, &new_action, NULL);
394
    if(ret == -1){
534 by teddy at bsnet
* plugin-runner.c (add_to_char_array): Added "nonnull" attribute.
395
      error_plus(0, errno, "sigaction");
391 by Teddy Hogeborn
* plugins.d/password-prompt.c: Use exit codes from <sysexits.h>. Do
396
      return EX_OSERR;
24.1.26 by Björn Påhlsson
tally count of used symbols
397
    }
398
  }
399
  ret = sigaction(SIGTERM, NULL, &old_action);
400
  if(ret == -1){
534 by teddy at bsnet
* plugin-runner.c (add_to_char_array): Added "nonnull" attribute.
401
    error_plus(0, errno, "sigaction");
391 by Teddy Hogeborn
* plugins.d/password-prompt.c: Use exit codes from <sysexits.h>. Do
402
    return EX_OSERR;
24.1.26 by Björn Påhlsson
tally count of used symbols
403
  }
266 by Teddy Hogeborn
* plugin-runner.c: Only space changes.
404
  if(old_action.sa_handler != SIG_IGN){
24.1.26 by Björn Påhlsson
tally count of used symbols
405
    ret = sigaction(SIGTERM, &new_action, NULL);
406
    if(ret == -1){
534 by teddy at bsnet
* plugin-runner.c (add_to_char_array): Added "nonnull" attribute.
407
      error_plus(0, errno, "sigaction");
391 by Teddy Hogeborn
* plugins.d/password-prompt.c: Use exit codes from <sysexits.h>. Do
408
      return EX_OSERR;
24.1.26 by Björn Påhlsson
tally count of used symbols
409
    }
410
  }
411
  
15.1.2 by Björn Påhlsson
Added debug options from passprompt as --debug and --debug=passprompt
412
  
266 by Teddy Hogeborn
* plugin-runner.c: Only space changes.
413
  if(debug){
15.1.2 by Björn Påhlsson
Added debug options from passprompt as --debug and --debug=passprompt
414
    fprintf(stderr, "Removing echo flag from terminal attributes\n");
415
  }
13 by Björn Påhlsson
Added following support:
416
  
417
  t_new = t_old;
377 by Teddy Hogeborn
* plugins.d/password-prompt.c (main): Fix "-Wconversion" warning.
418
  t_new.c_lflag &= ~(tcflag_t)ECHO;
266 by Teddy Hogeborn
* plugin-runner.c: Only space changes.
419
  if(tcsetattr(STDIN_FILENO, TCSAFLUSH, &t_new) != 0){
391 by Teddy Hogeborn
* plugins.d/password-prompt.c: Use exit codes from <sysexits.h>. Do
420
    int e = errno;
534 by teddy at bsnet
* plugin-runner.c (add_to_char_array): Added "nonnull" attribute.
421
    error_plus(0, errno, "tcsetattr-echo");
391 by Teddy Hogeborn
* plugins.d/password-prompt.c: Use exit codes from <sysexits.h>. Do
422
    switch(e){
423
    case EBADF:
424
    case ENOTTY:
425
      return EX_UNAVAILABLE;
426
    case EINVAL:
427
    default:
428
      return EX_OSERR;
429
    }
13 by Björn Påhlsson
Added following support:
430
  }
391 by Teddy Hogeborn
* plugins.d/password-prompt.c: Use exit codes from <sysexits.h>. Do
431
  
266 by Teddy Hogeborn
* plugin-runner.c: Only space changes.
432
  if(debug){
15.1.2 by Björn Påhlsson
Added debug options from passprompt as --debug and --debug=passprompt
433
    fprintf(stderr, "Waiting for input from stdin \n");
434
  }
13 by Björn Påhlsson
Added following support:
435
  while(true){
266 by Teddy Hogeborn
* plugin-runner.c: Only space changes.
436
    if(quit_now){
110 by Teddy Hogeborn
* mandos.xml (EXAMPLE): Replaced all occurences of command name with
437
      if(debug){
438
	fprintf(stderr, "Interrupted by signal, exiting.\n");
439
      }
13 by Björn Påhlsson
Added following support:
440
      status = EXIT_FAILURE;
441
      break;
442
    }
15.1.3 by Björn Påhlsson
Added getopt_long support for mandosclient and passprompt
443
444
    if(prefix){
79 by Teddy Hogeborn
* plugins.d/password-request.c (main): Include environment variables
445
      fprintf(stderr, "%s ", prefix);
446
    }
1127 by Teddy Hogeborn
Add dracut(8) support
447
    if(prompt != NULL){
448
      fprintf(stderr, "%s: ", prompt);
449
    } else {
397 by Teddy Hogeborn
* plugins.d/password-prompt.c: Use environment variables and prompt
450
      const char *cryptsource = getenv("CRYPTTAB_SOURCE");
451
      const char *crypttarget = getenv("CRYPTTAB_NAME");
452
      /* Before cryptsetup 1.1.0~rc2 */
453
      if(cryptsource == NULL){
454
	cryptsource = getenv("cryptsource");
455
      }
456
      if(crypttarget == NULL){
457
	crypttarget = getenv("crypttarget");
458
      }
459
      const char *const prompt1 = "Unlocking the disk";
460
      const char *const prompt2 = "Enter passphrase";
79 by Teddy Hogeborn
* plugins.d/password-request.c (main): Include environment variables
461
      if(cryptsource == NULL){
462
	if(crypttarget == NULL){
397 by Teddy Hogeborn
* plugins.d/password-prompt.c: Use environment variables and prompt
463
	  fprintf(stderr, "%s to unlock the disk: ", prompt2);
79 by Teddy Hogeborn
* plugins.d/password-request.c (main): Include environment variables
464
	} else {
397 by Teddy Hogeborn
* plugins.d/password-prompt.c: Use environment variables and prompt
465
	  fprintf(stderr, "%s (%s)\n%s: ", prompt1, crypttarget,
466
		  prompt2);
79 by Teddy Hogeborn
* plugins.d/password-request.c (main): Include environment variables
467
	}
468
      } else {
469
	if(crypttarget == NULL){
397 by Teddy Hogeborn
* plugins.d/password-prompt.c: Use environment variables and prompt
470
	  fprintf(stderr, "%s %s\n%s: ", prompt1, cryptsource,
471
		  prompt2);
79 by Teddy Hogeborn
* plugins.d/password-request.c (main): Include environment variables
472
	} else {
397 by Teddy Hogeborn
* plugins.d/password-prompt.c: Use environment variables and prompt
473
	  fprintf(stderr, "%s %s (%s)\n%s: ", prompt1, cryptsource,
474
		  crypttarget, prompt2);
79 by Teddy Hogeborn
* plugins.d/password-request.c (main): Include environment variables
475
	}
476
      }
477
    }
24.1.155 by Björn Påhlsson
mandos server: Added debuglevel that adjust at what level information
478
    sret = getline(&buffer, &n, stdin);
479
    if(sret > 0){
13 by Björn Påhlsson
Added following support:
480
      status = EXIT_SUCCESS;
110 by Teddy Hogeborn
* mandos.xml (EXAMPLE): Replaced all occurences of command name with
481
      /* Make n = data size instead of allocated buffer size */
24.1.155 by Björn Påhlsson
mandos server: Added debuglevel that adjust at what level information
482
      n = (size_t)sret;
168 by Teddy Hogeborn
* initramfs-tools-hook: Use long options where available. Use only
483
      /* Strip final newline */
391 by Teddy Hogeborn
* plugins.d/password-prompt.c: Use exit codes from <sysexits.h>. Do
484
      if(n > 0 and buffer[n-1] == '\n'){
168 by Teddy Hogeborn
* initramfs-tools-hook: Use long options where available. Use only
485
	buffer[n-1] = '\0';	/* not strictly necessary */
486
	n--;
487
      }
110 by Teddy Hogeborn
* mandos.xml (EXAMPLE): Replaced all occurences of command name with
488
      size_t written = 0;
489
      while(written < n){
24.1.155 by Björn Påhlsson
mandos server: Added debuglevel that adjust at what level information
490
	sret = write(STDOUT_FILENO, buffer + written, n - written);
491
	if(sret < 0){
391 by Teddy Hogeborn
* plugins.d/password-prompt.c: Use exit codes from <sysexits.h>. Do
492
	  int e = errno;
534 by teddy at bsnet
* plugin-runner.c (add_to_char_array): Added "nonnull" attribute.
493
	  error_plus(0, errno, "write");
391 by Teddy Hogeborn
* plugins.d/password-prompt.c: Use exit codes from <sysexits.h>. Do
494
	  switch(e){
495
	  case EBADF:
496
	  case EFAULT:
497
	  case EINVAL:
498
	  case EFBIG:
499
	  case EIO:
500
	  case ENOSPC:
501
	  default:
502
	    status = EX_IOERR;
503
	    break;
504
	  case EINTR:
505
	    status = EXIT_FAILURE;
506
	    break;
507
	  }
110 by Teddy Hogeborn
* mandos.xml (EXAMPLE): Replaced all occurences of command name with
508
	  break;
509
	}
24.1.155 by Björn Påhlsson
mandos server: Added debuglevel that adjust at what level information
510
	written += (size_t)sret;
110 by Teddy Hogeborn
* mandos.xml (EXAMPLE): Replaced all occurences of command name with
511
      }
24.1.155 by Björn Påhlsson
mandos server: Added debuglevel that adjust at what level information
512
      sret = close(STDOUT_FILENO);
513
      if(sret == -1){
391 by Teddy Hogeborn
* plugins.d/password-prompt.c: Use exit codes from <sysexits.h>. Do
514
	int e = errno;
534 by teddy at bsnet
* plugin-runner.c (add_to_char_array): Added "nonnull" attribute.
515
	error_plus(0, errno, "close");
391 by Teddy Hogeborn
* plugins.d/password-prompt.c: Use exit codes from <sysexits.h>. Do
516
	switch(e){
517
	case EBADF:
518
	  status = EX_OSFILE;
519
	  break;
520
	case EIO:
521
	default:
522
	  status = EX_IOERR;
523
	  break;
524
	}
525
      }
13 by Björn Påhlsson
Added following support:
526
      break;
527
    }
24.1.155 by Björn Påhlsson
mandos server: Added debuglevel that adjust at what level information
528
    if(sret < 0){
391 by Teddy Hogeborn
* plugins.d/password-prompt.c: Use exit codes from <sysexits.h>. Do
529
      int e = errno;
1110 by Teddy Hogeborn
plugins.d/password-prompt.c: Clear EOF from stdin
530
      if(errno != EINTR){
531
	if(not feof(stdin)){
532
	  error_plus(0, errno, "getline");
533
	  switch(e){
534
	  case EBADF:
535
	    status = EX_UNAVAILABLE;
536
	    break;
537
	  case EIO:
538
	  case EINVAL:
539
	  default:
540
	    status = EX_IOERR;
541
	    break;
542
	  }
543
	  break;
544
	} else {
545
	  clearerr(stdin);
391 by Teddy Hogeborn
* plugins.d/password-prompt.c: Use exit codes from <sysexits.h>. Do
546
	}
13 by Björn Påhlsson
Added following support:
547
      }
548
    }
469.1.1 by teddy at bsnet
* plugins.d/password-prompt.c: Some white space fixes. Break some
549
    /* if(sret == 0), then the only sensible thing to do is to retry
550
       to read from stdin */
13 by Björn Påhlsson
Added following support:
551
    fputc('\n', stderr);
356 by Teddy Hogeborn
* plugin-runner.c (main): When a plugin is killed by a signal, show
552
    if(debug and not quit_now){
294 by Teddy Hogeborn
* plugins.d/password-prompt.c (quit_now): Changed type to "volatile
553
      /* If quit_now is nonzero, we were interrupted by a signal, and
110 by Teddy Hogeborn
* mandos.xml (EXAMPLE): Replaced all occurences of command name with
554
	 will print that later, so no need to show this too. */
555
      fprintf(stderr, "getline() returned 0, retrying.\n");
556
    }
13 by Björn Påhlsson
Added following support:
557
  }
257 by Teddy Hogeborn
Change the default value of the "checker" option command to make the
558
  
24.1.92 by Björn Påhlsson
Several memory leaks detected by valgrind fixed
559
  free(buffer);
41 by Teddy Hogeborn
Merge.
560
  
266 by Teddy Hogeborn
* plugin-runner.c: Only space changes.
561
  if(debug){
15.1.2 by Björn Påhlsson
Added debug options from passprompt as --debug and --debug=passprompt
562
    fprintf(stderr, "Restoring terminal attributes\n");
563
  }
266 by Teddy Hogeborn
* plugin-runner.c: Only space changes.
564
  if(tcsetattr(STDIN_FILENO, TCSAFLUSH, &t_old) != 0){
534 by teddy at bsnet
* plugin-runner.c (add_to_char_array): Added "nonnull" attribute.
565
    error_plus(0, errno, "tcsetattr+echo");
13 by Björn Påhlsson
Added following support:
566
  }
41 by Teddy Hogeborn
Merge.
567
  
356 by Teddy Hogeborn
* plugin-runner.c (main): When a plugin is killed by a signal, show
568
  if(quit_now){
569
    sigemptyset(&old_action.sa_mask);
570
    old_action.sa_handler = SIG_DFL;
571
    ret = sigaction(signal_received, &old_action, NULL);
572
    if(ret == -1){
534 by teddy at bsnet
* plugin-runner.c (add_to_char_array): Added "nonnull" attribute.
573
      error_plus(0, errno, "sigaction");
356 by Teddy Hogeborn
* plugin-runner.c (main): When a plugin is killed by a signal, show
574
    }
575
    raise(signal_received);
576
  }
577
  
266 by Teddy Hogeborn
* plugin-runner.c: Only space changes.
578
  if(debug){
110 by Teddy Hogeborn
* mandos.xml (EXAMPLE): Replaced all occurences of command name with
579
    fprintf(stderr, "%s is exiting with status %d\n", argv[0],
580
	    status);
15.1.2 by Björn Påhlsson
Added debug options from passprompt as --debug and --debug=passprompt
581
  }
391 by Teddy Hogeborn
* plugins.d/password-prompt.c: Use exit codes from <sysexits.h>. Do
582
  if(status == EXIT_SUCCESS or status == EX_OK){
167 by Teddy Hogeborn
* plugins.d/password-prompt.c (main): If successful, output an extra
583
    fputc('\n', stderr);
584
  }
13 by Björn Påhlsson
Added following support:
585
  
586
  return status;
587
}