/mandos/release

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

« 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
  • mto: This revision was merged to the branch mainline in revision 384.
  • 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
         */
427
439
    if(prefix){
428
440
      fprintf(stderr, "%s ", prefix);
429
441
    }
430
 
    {
 
442
    if(prompt != NULL){
 
443
      fprintf(stderr, "%s: ", prompt);
 
444
    } else {
431
445
      const char *cryptsource = getenv("CRYPTTAB_SOURCE");
432
446
      const char *crypttarget = getenv("CRYPTTAB_NAME");
433
447
      /* Before cryptsetup 1.1.0~rc2 */
508
522
    }
509
523
    if(sret < 0){
510
524
      int e = errno;
511
 
      if(errno != EINTR and not feof(stdin)){
512
 
        error_plus(0, errno, "getline");
513
 
        switch(e){
514
 
        case EBADF:
515
 
          status = EX_UNAVAILABLE;
516
 
          break;
517
 
        case EIO:
518
 
        case EINVAL:
519
 
        default:
520
 
          status = EX_IOERR;
521
 
          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);
522
541
        }
523
 
        break;
524
542
      }
525
543
    }
526
544
    /* if(sret == 0), then the only sensible thing to do is to retry