/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-08-05 21:14:05 UTC
  • Revision ID: teddy@recompile.se-20190805211405-9m6hecekaihpttz9
Override lintian warnings about upgrading from old versions

There are some really things which are imperative that we fix in case
someone were to upgrade from a really old version.  We want to keep
these fixes in the postinst maintainer scripts, even though lintian
complains about such old upgrades not being supported by Debian in
general.  We prefer the code being there, for the sake of the users.

* debian/mandos-client.lintian-overrides
  (maintainer-script-supports-ancient-package-version): New.
  debian/mandos.lintian-overrides
  (maintainer-script-supports-ancient-package-version): - '' -

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>             /* 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