/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: 2009-10-03 13:04:42 UTC
  • Revision ID: teddy@fukt.bsnet.se-20091003130442-yd715ir0lbiac1fr
* mandos (daemon): Use "os.path.devnull" in the error message.

Show diffs side-by-side

added added

removed removed

Lines of Context:
40
40
                                   getopt_long, getenv() */
41
41
#include <stdio.h>              /* fprintf(), stderr, getline(),
42
42
                                   stdin, feof(), perror(), fputc(),
43
 
                                   getopt_long */
44
 
#include <errno.h>              /* errno, EBADF, ENOTTY, EINVAL,
45
 
                                   EFAULT, EFBIG, EIO, ENOSPC, EINTR
46
 
                                */
 
43
                                   stdout, getopt_long */
 
44
#include <errno.h>              /* errno, EINVAL */
47
45
#include <iso646.h>             /* or, not */
48
46
#include <stdbool.h>            /* bool, false, true */
49
47
#include <string.h>             /* strlen, rindex, strncmp, strcmp */
52
50
                                   argp_parse(), error_t,
53
51
                                   ARGP_KEY_ARG, ARGP_KEY_END,
54
52
                                   ARGP_ERR_UNKNOWN */
55
 
#include <sysexits.h>           /* EX_SOFTWARE, EX_OSERR,
56
 
                                   EX_UNAVAILABLE, EX_IOERR, EX_OK */
57
53
 
58
54
volatile sig_atomic_t quit_now = 0;
59
55
int signal_received;
115
111
    ret = argp_parse(&argp, argc, argv, 0, 0, NULL);
116
112
    if(ret == ARGP_ERR_UNKNOWN){
117
113
      fprintf(stderr, "Unknown error while parsing arguments\n");
118
 
      return EX_SOFTWARE;
 
114
      return EXIT_FAILURE;
119
115
    }
120
116
  }
121
117
  
127
123
  }
128
124
  
129
125
  if(tcgetattr(STDIN_FILENO, &t_old) != 0){
130
 
    int e = errno;
131
126
    perror("tcgetattr");
132
 
    switch(e){
133
 
    case EBADF:
134
 
    case ENOTTY:
135
 
      return EX_UNAVAILABLE;
136
 
    default:
137
 
      return EX_OSERR;
138
 
    }
 
127
    return EXIT_FAILURE;
139
128
  }
140
129
  
141
130
  sigemptyset(&new_action.sa_mask);
142
131
  ret = sigaddset(&new_action.sa_mask, SIGINT);
143
132
  if(ret == -1){
144
133
    perror("sigaddset");
145
 
    return EX_OSERR;
 
134
    return EXIT_FAILURE;
146
135
  }
147
136
  ret = sigaddset(&new_action.sa_mask, SIGHUP);
148
137
  if(ret == -1){
149
138
    perror("sigaddset");
150
 
    return EX_OSERR;
 
139
    return EXIT_FAILURE;
151
140
  }
152
141
  ret = sigaddset(&new_action.sa_mask, SIGTERM);
153
142
  if(ret == -1){
154
143
    perror("sigaddset");
155
 
    return EX_OSERR;
 
144
    return EXIT_FAILURE;
156
145
  }
157
146
  /* Need to check if the handler is SIG_IGN before handling:
158
147
     | [[info:libc:Initial Signal Actions]] |
161
150
  ret = sigaction(SIGINT, NULL, &old_action);
162
151
  if(ret == -1){
163
152
    perror("sigaction");
164
 
    return EX_OSERR;
 
153
    return EXIT_FAILURE;
165
154
  }
166
155
  if(old_action.sa_handler != SIG_IGN){
167
156
    ret = sigaction(SIGINT, &new_action, NULL);
168
157
    if(ret == -1){
169
158
      perror("sigaction");
170
 
      return EX_OSERR;
 
159
      return EXIT_FAILURE;
171
160
    }
172
161
  }
173
162
  ret = sigaction(SIGHUP, NULL, &old_action);
174
163
  if(ret == -1){
175
164
    perror("sigaction");
176
 
    return EX_OSERR;
 
165
    return EXIT_FAILURE;
177
166
  }
178
167
  if(old_action.sa_handler != SIG_IGN){
179
168
    ret = sigaction(SIGHUP, &new_action, NULL);
180
169
    if(ret == -1){
181
170
      perror("sigaction");
182
 
      return EX_OSERR;
 
171
      return EXIT_FAILURE;
183
172
    }
184
173
  }
185
174
  ret = sigaction(SIGTERM, NULL, &old_action);
186
175
  if(ret == -1){
187
176
    perror("sigaction");
188
 
    return EX_OSERR;
 
177
    return EXIT_FAILURE;
189
178
  }
190
179
  if(old_action.sa_handler != SIG_IGN){
191
180
    ret = sigaction(SIGTERM, &new_action, NULL);
192
181
    if(ret == -1){
193
182
      perror("sigaction");
194
 
      return EX_OSERR;
 
183
      return EXIT_FAILURE;
195
184
    }
196
185
  }
197
186
  
203
192
  t_new = t_old;
204
193
  t_new.c_lflag &= ~(tcflag_t)ECHO;
205
194
  if(tcsetattr(STDIN_FILENO, TCSAFLUSH, &t_new) != 0){
206
 
    int e = errno;
207
195
    perror("tcsetattr-echo");
208
 
    switch(e){
209
 
    case EBADF:
210
 
    case ENOTTY:
211
 
      return EX_UNAVAILABLE;
212
 
    case EINVAL:
213
 
    default:
214
 
      return EX_OSERR;
215
 
    }
 
196
    return EXIT_FAILURE;
216
197
  }
217
 
  
 
198
 
218
199
  if(debug){
219
200
    fprintf(stderr, "Waiting for input from stdin \n");
220
201
  }
256
237
      /* Make n = data size instead of allocated buffer size */
257
238
      n = (size_t)ret;
258
239
      /* Strip final newline */
259
 
      if(n > 0 and buffer[n-1] == '\n'){
 
240
      if(n>0 and buffer[n-1] == '\n'){
260
241
        buffer[n-1] = '\0';     /* not strictly necessary */
261
242
        n--;
262
243
      }
264
245
      while(written < n){
265
246
        ret = write(STDOUT_FILENO, buffer + written, n - written);
266
247
        if(ret < 0){
267
 
          int e = errno;
268
248
          perror("write");
269
 
          switch(e){
270
 
          case EBADF:
271
 
          case EFAULT:
272
 
          case EINVAL:
273
 
          case EFBIG:
274
 
          case EIO:
275
 
          case ENOSPC:
276
 
          default:
277
 
            status = EX_IOERR;
278
 
            break;
279
 
          case EINTR:
280
 
            status = EXIT_FAILURE;
281
 
            break;
282
 
          }
 
249
          status = EXIT_FAILURE;
283
250
          break;
284
251
        }
285
252
        written += (size_t)ret;
286
253
      }
287
 
      ret = close(STDOUT_FILENO);
288
 
      if(ret == -1){
289
 
        int e = errno;
290
 
        perror("close");
291
 
        switch(e){
292
 
        case EBADF:
293
 
          status = EX_OSFILE;
294
 
          break;
295
 
        case EIO:
296
 
        default:
297
 
          status = EX_IOERR;
298
 
          break;
299
 
        }
300
 
      }
301
254
      break;
302
255
    }
303
256
    if(ret < 0){
304
 
      int e = errno;
305
257
      if(errno != EINTR and not feof(stdin)){
306
258
        perror("getline");
307
 
        switch(e){
308
 
        case EBADF:
309
 
          status = EX_UNAVAILABLE;
310
 
        case EIO:
311
 
        case EINVAL:
312
 
        default:
313
 
          status = EX_IOERR;
314
 
          break;
315
 
        }
 
259
        status = EXIT_FAILURE;
316
260
        break;
317
261
      }
318
262
    }
349
293
    fprintf(stderr, "%s is exiting with status %d\n", argv[0],
350
294
            status);
351
295
  }
352
 
  if(status == EXIT_SUCCESS or status == EX_OK){
 
296
  if(status == EXIT_SUCCESS){
353
297
    fputc('\n', stderr);
354
298
  }
355
299