/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-03-12 20:13:34 UTC
  • Revision ID: teddy@recompile.se-20190312201334-my3htrprewjosuw5
mandos-ctl: Refactor

* mandos-ctl: Reorder everything into logical order; put main() first,
              and put every subsequent definition as soon as possible
              after its first use, except superclasses which need to
              be placed before the classes inheriting from them.
              Reorder all tests to match.

Show diffs side-by-side

added added

removed removed

Lines of Context:
27
27
 
28
28
#include <termios.h>            /* struct termios, tcsetattr(),
29
29
                                   TCSAFLUSH, tcgetattr(), ECHO */
30
 
#include <unistd.h>             /* access(), struct termios,
31
 
                                   tcsetattr(), STDIN_FILENO,
32
 
                                   TCSAFLUSH, tcgetattr(), ECHO,
33
 
                                   readlink() */
 
30
#include <unistd.h>             /* struct termios, tcsetattr(),
 
31
                                   STDIN_FILENO, TCSAFLUSH,
 
32
                                   tcgetattr(), ECHO, readlink() */
34
33
#include <signal.h>             /* sig_atomic_t, raise(), struct
35
34
                                   sigaction, sigemptyset(),
36
35
                                   sigaction(), sigaddset(), SIGINT,
111
110
     from the terminal.  Password-prompt will exit if it detects
112
111
     plymouth since plymouth performs the same functionality.
113
112
   */
114
 
  if(access("/run/plymouth/pid", R_OK) == 0){
115
 
    return true;
116
 
  }
117
 
  
118
113
  __attribute__((nonnull))
119
114
  int is_plymouth(const struct dirent *proc_entry){
120
115
    int ret;
239
234
  struct termios t_new, t_old;
240
235
  char *buffer = NULL;
241
236
  char *prefix = NULL;
242
 
  char *prompt = NULL;
243
237
  int status = EXIT_SUCCESS;
244
238
  struct sigaction old_action,
245
239
    new_action = { .sa_handler = termination_handler,
249
243
      { .name = "prefix", .key = 'p',
250
244
        .arg = "PREFIX", .flags = 0,
251
245
        .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 },
255
246
      { .name = "debug", .key = 128,
256
247
        .doc = "Debug mode", .group = 3 },
257
248
      /*
270
261
    error_t parse_opt (int key, char *arg, struct argp_state *state){
271
262
      errno = 0;
272
263
      switch (key){
273
 
      case 'p':                 /* --prefix */
 
264
      case 'p':
274
265
        prefix = arg;
275
266
        break;
276
 
      case 128:                 /* --debug */
 
267
      case 128:
277
268
        debug = true;
278
269
        break;
279
 
      case 129:                 /* --prompt */
280
 
        prompt = arg;
281
 
        break;
282
270
        /*
283
271
         * These reproduce what we would get without ARGP_NO_HELP
284
272
         */
439
427
    if(prefix){
440
428
      fprintf(stderr, "%s ", prefix);
441
429
    }
442
 
    if(prompt != NULL){
443
 
      fprintf(stderr, "%s: ", prompt);
444
 
    } else {
 
430
    {
445
431
      const char *cryptsource = getenv("CRYPTTAB_SOURCE");
446
432
      const char *crypttarget = getenv("CRYPTTAB_NAME");
447
433
      /* Before cryptsetup 1.1.0~rc2 */
522
508
    }
523
509
    if(sret < 0){
524
510
      int e = errno;
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);
 
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;
541
522
        }
 
523
        break;
542
524
      }
543
525
    }
544
526
    /* if(sret == 0), then the only sensible thing to do is to retry