/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/passprompt.c

  • Committer: Teddy Hogeborn
  • Date: 2008-08-02 10:48:24 UTC
  • Revision ID: teddy@fukt.bsnet.se-20080802104824-fx0miwp9o4g9r31e
* plugbasedclient.c (struct process): New fields "eof", "completed",
                                      and "status".
  (handle_sigchld): New function.
  (main): Initialize "dir" to NULL to only closedir() it if necessary.
          Move "process_list" to be a global variable to be accessible
          by "handle_sigchld".  Make "handle_sigchld" handle SIGCHLD.
          Remove redundant check for NULL "dir".  Free "filename" when
          no longer used.  Block SIGCHLD around fork()/exec().
          Restore normal signals in child.  Only loop while running
          processes exist.  Print process buffer when the process is
          done and it has emitted EOF, not when it only emits EOF.
          Remove processes from list which exit non-cleanly.  In
          cleaning up, closedir() if necessary.  Bug fix: set next
          pointer correctly when freeing process list.

* plugins.d/passprompt.c (main): Do not ignore SIGQUIT.

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
/*  -*- coding: utf-8 -*- */
 
2
/*
 
3
 * Passprompt - Read a password from the terminal and print it
 
4
 *
 
5
 * Copyright © 2007-2008 Teddy Hogeborn & Björn Påhlsson
 
6
 * 
 
7
 * This program is free software: you can redistribute it and/or
 
8
 * modify it under the terms of the GNU General Public License as
 
9
 * published by the Free Software Foundation, either version 3 of the
 
10
 * License, or (at your option) any later version.
 
11
 * 
 
12
 * This program is distributed in the hope that it will be useful, but
 
13
 * WITHOUT ANY WARRANTY; without even the implied warranty of
 
14
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 
15
 * General Public License for more details.
 
16
 * 
 
17
 * You should have received a copy of the GNU General Public License
 
18
 * along with this program.  If not, see
 
19
 * <http://www.gnu.org/licenses/>.
 
20
 * 
 
21
 * Contact the authors at <https://www.fukt.bsnet.se/~belorn/> and
 
22
 * <https://www.fukt.bsnet.se/~teddy/>.
 
23
 */
 
24
 
1
25
#define _GNU_SOURCE             /* getline() */
2
 
#define _FORTIFY_SOURCE 2
 
26
 
3
27
#include <termios.h>            /* struct termios, tcsetattr(),
4
28
                                   TCSAFLUSH, tcgetattr(), ECHO */
5
29
#include <unistd.h>             /* struct termios, tcsetattr(),
11
35
                                   SIGQUIT, SIGHUP, SIGTERM */
12
36
#include <stddef.h>             /* NULL, size_t */
13
37
#include <sys/types.h>          /* ssize_t */
14
 
#include <stdlib.h>             /* EXIT_SUCCESS, EXIT_FAILURE */
 
38
#include <stdlib.h>             /* EXIT_SUCCESS, EXIT_FAILURE,
 
39
                                   getopt_long */
15
40
#include <stdio.h>              /* fprintf(), stderr, getline(),
16
41
                                   stdin, feof(), perror(), fputc(),
17
 
                                   stdout */
 
42
                                   stdout, getopt_long */
18
43
#include <errno.h>              /* errno, EINVAL */
19
44
#include <iso646.h>             /* or, not */
20
45
#include <stdbool.h>            /* bool, false, true */
 
46
#include <string.h>             /* strlen, rindex, strncmp, strcmp */
 
47
#include <getopt.h>             /* getopt_long */
21
48
 
22
49
volatile bool quit_now = false;
 
50
bool debug = false;
23
51
 
24
 
void termination_handler(int signum){
 
52
void termination_handler(__attribute__((unused))int signum){
25
53
  quit_now = true;
26
54
}
27
55
 
28
56
int main(int argc, char **argv){
29
 
  ssize_t ret = -1;
 
57
  ssize_t ret;
30
58
  size_t n;
31
59
  struct termios t_new, t_old;
32
60
  char *buffer = NULL;
 
61
  char *prefix = NULL;
33
62
  int status = EXIT_SUCCESS;
34
63
  struct sigaction old_action,
35
64
    new_action = { .sa_handler = termination_handler,
36
65
                   .sa_flags = 0 };
 
66
 
 
67
  while (true){
 
68
    static struct option long_options[] = {
 
69
      {"debug", no_argument, (int *)&debug, 1},
 
70
      {"prefix", required_argument, 0, 'p'},
 
71
      {0, 0, 0, 0} };
 
72
 
 
73
    int option_index = 0;
 
74
    ret = getopt_long (argc, argv, "p:", long_options, &option_index);
 
75
 
 
76
    if (ret == -1){
 
77
      break;
 
78
    }
 
79
      
 
80
    switch(ret){
 
81
    case 0:
 
82
      break;
 
83
    case 'p':
 
84
      prefix = optarg;
 
85
      break;
 
86
    default:
 
87
      fprintf(stderr, "bad arguments\n");
 
88
      exit(EXIT_FAILURE);
 
89
    }
 
90
  }
 
91
      
 
92
  if (debug){
 
93
    fprintf(stderr, "Starting %s\n", argv[0]);
 
94
  }
 
95
  if (debug){
 
96
    fprintf(stderr, "Storing current terminal attributes\n");
 
97
  }
37
98
  
38
99
  if (tcgetattr(STDIN_FILENO, &t_old) != 0){
39
100
    return EXIT_FAILURE;
41
102
  
42
103
  sigemptyset(&new_action.sa_mask);
43
104
  sigaddset(&new_action.sa_mask, SIGINT);
44
 
  sigaddset(&new_action.sa_mask, SIGQUIT);
45
105
  sigaddset(&new_action.sa_mask, SIGHUP);
46
106
  sigaddset(&new_action.sa_mask, SIGTERM);
47
107
  sigaction(SIGINT, NULL, &old_action);
48
108
  if (old_action.sa_handler != SIG_IGN)
49
109
    sigaction(SIGINT, &new_action, NULL);
50
 
  sigaction(SIGQUIT, NULL, &old_action);
51
 
  if (old_action.sa_handler != SIG_IGN)
52
 
    sigaction(SIGQUIT, &new_action, NULL);
53
110
  sigaction(SIGHUP, NULL, &old_action);
54
111
  if (old_action.sa_handler != SIG_IGN)
55
112
    sigaction(SIGHUP, &new_action, NULL);
56
113
  sigaction(SIGTERM, NULL, &old_action);
57
114
  if (old_action.sa_handler != SIG_IGN)
58
115
    sigaction(SIGTERM, &new_action, NULL);
 
116
 
 
117
  
 
118
  if (debug){
 
119
    fprintf(stderr, "Removing echo flag from terminal attributes\n");
 
120
  }
59
121
  
60
122
  t_new = t_old;
61
123
  t_new.c_lflag &= ~ECHO;
63
125
    perror("tcsetattr-echo");
64
126
    return EXIT_FAILURE;
65
127
  }
66
 
  
 
128
 
 
129
  if (debug){
 
130
    fprintf(stderr, "Waiting for input from stdin \n");
 
131
  }
67
132
  while(true){
68
133
    if (quit_now){
69
134
      status = EXIT_FAILURE;
70
135
      break;
71
136
    }
72
 
    fprintf(stderr, "Password: ");
 
137
 
 
138
    if(prefix){
 
139
      fprintf(stderr, "%s Password: ", prefix);
 
140
    } else {
 
141
      fprintf(stderr, "Password: ");
 
142
    }      
73
143
    ret = getline(&buffer, &n, stdin);
74
144
    if (ret > 0){
75
145
      fprintf(stdout, "%s", buffer);
87
157
    fputc('\n', stderr);
88
158
  }
89
159
 
 
160
  if (debug){
 
161
    fprintf(stderr, "Restoring terminal attributes\n");
 
162
  }
90
163
  if (tcsetattr(STDIN_FILENO, TCSAFLUSH, &t_old) != 0){
91
164
    perror("tcsetattr+echo");
92
165
  }
 
166
 
 
167
  if (debug){
 
168
    fprintf(stderr, "%s is exiting\n", argv[0]);
 
169
  }
93
170
  
94
171
  return status;
95
172
}