/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/password-prompt.c

  • Committer: Teddy Hogeborn
  • Date: 2019-07-29 16:35:53 UTC
  • Revision ID: teddy@recompile.se-20190729163553-1i442i2cbx64c537
Make tests and man page examples match

Make the tests test_manual_page_example[1-5] match exactly what is
written in the manual page, and add comments to manual page as
reminders to keep tests and manual page examples in sync.

* mandos-ctl (Test_commands_from_options.test_manual_page_example_1):
  Remove "--verbose" option, since the manual does not have it as the
  first example, and change assertion to match.
* mandos-ctl.xml (EXAMPLE): Add comments to all examples documenting
  which test function they correspond to.  Also remove unnecessary
  quotes from option arguments in fourth example, and clarify language
  slightly in fifth example.

Show diffs side-by-side

added added

removed removed

Lines of Context:
2
2
/*
3
3
 * Password-prompt - Read a password from the terminal and print it
4
4
 * 
5
 
 * Copyright © 2008-2018 Teddy Hogeborn
6
 
 * Copyright © 2008-2018 Björn Påhlsson
 
5
 * Copyright © 2008-2019 Teddy Hogeborn
 
6
 * Copyright © 2008-2019 Björn Påhlsson
7
7
 * 
8
8
 * This file is part of Mandos.
9
9
 * 
27
27
 
28
28
#include <termios.h>            /* struct termios, tcsetattr(),
29
29
                                   TCSAFLUSH, tcgetattr(), ECHO */
30
 
#include <unistd.h>             /* struct termios, tcsetattr(),
31
 
                                   STDIN_FILENO, TCSAFLUSH,
32
 
                                   tcgetattr(), ECHO, readlink() */
 
30
#include <unistd.h>             /* access(), struct termios,
 
31
                                   tcsetattr(), STDIN_FILENO,
 
32
                                   TCSAFLUSH, tcgetattr(), ECHO,
 
33
                                   readlink() */
33
34
#include <signal.h>             /* sig_atomic_t, raise(), struct
34
35
                                   sigaction, sigemptyset(),
35
36
                                   sigaction(), sigaddset(), SIGINT,
110
111
     from the terminal.  Password-prompt will exit if it detects
111
112
     plymouth since plymouth performs the same functionality.
112
113
   */
 
114
  if(access("/run/plymouth/pid", R_OK) == 0){
 
115
    return true;
 
116
  }
 
117
  
113
118
  __attribute__((nonnull))
114
119
  int is_plymouth(const struct dirent *proc_entry){
115
120
    int ret;
234
239
  struct termios t_new, t_old;
235
240
  char *buffer = NULL;
236
241
  char *prefix = NULL;
 
242
  char *prompt = NULL;
237
243
  int status = EXIT_SUCCESS;
238
244
  struct sigaction old_action,
239
245
    new_action = { .sa_handler = termination_handler,
243
249
      { .name = "prefix", .key = 'p',
244
250
        .arg = "PREFIX", .flags = 0,
245
251
        .doc = "Prefix shown before the prompt", .group = 2 },
 
252
      { .name = "prompt", .key = 129,
 
253
        .arg = "PROMPT", .flags = 0,
 
254
        .doc = "The prompt to show", .group = 2 },
246
255
      { .name = "debug", .key = 128,
247
256
        .doc = "Debug mode", .group = 3 },
248
257
      /*
261
270
    error_t parse_opt (int key, char *arg, struct argp_state *state){
262
271
      errno = 0;
263
272
      switch (key){
264
 
      case 'p':
 
273
      case 'p':                 /* --prefix */
265
274
        prefix = arg;
266
275
        break;
267
 
      case 128:
 
276
      case 128:                 /* --debug */
268
277
        debug = true;
269
278
        break;
 
279
      case 129:                 /* --prompt */
 
280
        prompt = arg;
 
281
        break;
270
282
        /*
271
283
         * These reproduce what we would get without ARGP_NO_HELP
272
284
         */
274
286
        argp_state_help(state, state->out_stream,
275
287
                        (ARGP_HELP_STD_HELP | ARGP_HELP_EXIT_ERR)
276
288
                        & ~(unsigned int)ARGP_HELP_EXIT_OK);
 
289
        __builtin_unreachable();
277
290
      case -3:                  /* --usage */
278
291
        argp_state_help(state, state->out_stream,
279
292
                        ARGP_HELP_USAGE | ARGP_HELP_EXIT_ERR);
 
293
        __builtin_unreachable();
280
294
      case 'V':                 /* --version */
281
295
        fprintf(state->out_stream, "%s\n", argp_program_version);
282
296
        exit(argp_err_exit_status);
425
439
    if(prefix){
426
440
      fprintf(stderr, "%s ", prefix);
427
441
    }
428
 
    {
 
442
    if(prompt != NULL){
 
443
      fprintf(stderr, "%s: ", prompt);
 
444
    } else {
429
445
      const char *cryptsource = getenv("CRYPTTAB_SOURCE");
430
446
      const char *crypttarget = getenv("CRYPTTAB_NAME");
431
447
      /* Before cryptsetup 1.1.0~rc2 */
506
522
    }
507
523
    if(sret < 0){
508
524
      int e = errno;
509
 
      if(errno != EINTR and not feof(stdin)){
510
 
        error_plus(0, errno, "getline");
511
 
        switch(e){
512
 
        case EBADF:
513
 
          status = EX_UNAVAILABLE;
514
 
          break;
515
 
        case EIO:
516
 
        case EINVAL:
517
 
        default:
518
 
          status = EX_IOERR;
519
 
          break;
 
525
      if(errno != EINTR){
 
526
        if(not feof(stdin)){
 
527
          error_plus(0, errno, "getline");
 
528
          switch(e){
 
529
          case EBADF:
 
530
            status = EX_UNAVAILABLE;
 
531
            break;
 
532
          case EIO:
 
533
          case EINVAL:
 
534
          default:
 
535
            status = EX_IOERR;
 
536
            break;
 
537
          }
 
538
          break;
 
539
        } else {
 
540
          clearerr(stdin);
520
541
        }
521
 
        break;
522
542
      }
523
543
    }
524
544
    /* if(sret == 0), then the only sensible thing to do is to retry