/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-03-18 22:29:25 UTC
  • mto: This revision was merged to the branch mainline in revision 382.
  • Revision ID: teddy@recompile.se-20190318222925-jvhek84dgcfgj6g3
mandos-ctl: Refactor tests

* mandos-ctl: Where the clients names "foo" and "barbar" do not refer
              to the actual mock clients in the TestCommand class,
              change all occurrences of these names to "client1" and
              "client2" (or just "client" when only one is used) .
              Also change all test doubles to use correct terminology;
              some things called mocks are actually stubs or spies,
              and rename all true mocks to have "mock" in their names.
              Also eliminate duplicate values in tests; derive values
              from previously defined values whenever possible.

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-2011 Teddy Hogeborn
6
 
 * Copyright © 2008-2011 Björn Påhlsson
7
 
 * 
8
 
 * This program is free software: you can redistribute it and/or
9
 
 * modify it under the terms of the GNU General Public License as
10
 
 * published by the Free Software Foundation, either version 3 of the
11
 
 * License, or (at your option) any later version.
12
 
 * 
13
 
 * This program is distributed in the hope that it will be useful, but
 
5
 * Copyright © 2008-2019 Teddy Hogeborn
 
6
 * Copyright © 2008-2019 Björn Påhlsson
 
7
 * 
 
8
 * This file is part of Mandos.
 
9
 * 
 
10
 * Mandos is free software: you can redistribute it and/or modify it
 
11
 * under the terms of the GNU General Public License as published by
 
12
 * the Free Software Foundation, either version 3 of the License, or
 
13
 * (at your option) any later version.
 
14
 * 
 
15
 * Mandos is distributed in the hope that it will be useful, but
14
16
 * WITHOUT ANY WARRANTY; without even the implied warranty of
15
17
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
16
18
 * General Public License for more details.
17
19
 * 
18
20
 * You should have received a copy of the GNU General Public License
19
 
 * along with this program.  If not, see
20
 
 * <http://www.gnu.org/licenses/>.
 
21
 * along with Mandos.  If not, see <http://www.gnu.org/licenses/>.
21
22
 * 
22
23
 * Contact the authors at <mandos@recompile.se>.
23
24
 */
72
73
/* Needed for conflict resolution */
73
74
const char plymouth_name[] = "plymouthd";
74
75
 
75
 
__attribute__((format (gnu_printf, 2, 3), nonnull(1)))
76
 
int fprintf_plus(FILE *stream, const char *format, ...){
77
 
  va_list ap;
78
 
  va_start (ap, format);
79
 
  
80
 
  TEMP_FAILURE_RETRY(fprintf(stream, "Mandos plugin %s: ",
81
 
                             program_invocation_short_name));
82
 
  return TEMP_FAILURE_RETRY(vfprintf(stream, format, ap));
83
 
}
84
 
 
85
76
/* Function to use when printing errors */
86
77
__attribute__((format (gnu_printf, 3, 4)))
87
78
void error_plus(int status, int errnum, const char *formatstring,
92
83
  
93
84
  va_start(ap, formatstring);
94
85
  ret = vasprintf(&text, formatstring, ap);
95
 
  if (ret == -1){
 
86
  if(ret == -1){
96
87
    fprintf(stderr, "Mandos plugin %s: ",
97
88
            program_invocation_short_name);
98
89
    vfprintf(stderr, formatstring, ap);
124
115
    int ret;
125
116
    int cl_fd;
126
117
    {
127
 
      uintmax_t maxvalue;
 
118
      uintmax_t proc_id;
128
119
      char *tmp;
129
120
      errno = 0;
130
 
      maxvalue = strtoumax(proc_entry->d_name, &tmp, 10);
 
121
      proc_id = strtoumax(proc_entry->d_name, &tmp, 10);
131
122
      
132
123
      if(errno != 0 or *tmp != '\0'
133
 
         or maxvalue != (uintmax_t)((pid_t)maxvalue)){
 
124
         or proc_id != (uintmax_t)((pid_t)proc_id)){
134
125
        return 0;
135
126
      }
136
127
    }
222
213
  struct dirent **direntries = NULL;
223
214
  int ret;
224
215
  ret = scandir("/proc", &direntries, is_plymouth, alphasort);
225
 
  if (ret == -1){
 
216
  if(ret == -1){
226
217
    error_plus(1, errno, "scandir");
227
218
  }
 
219
  {
 
220
    int i = ret;
 
221
    while(i--){
 
222
      free(direntries[i]);
 
223
    }
 
224
  }
228
225
  free(direntries);
229
226
  return ret > 0;
230
227
}
277
274
        argp_state_help(state, state->out_stream,
278
275
                        (ARGP_HELP_STD_HELP | ARGP_HELP_EXIT_ERR)
279
276
                        & ~(unsigned int)ARGP_HELP_EXIT_OK);
 
277
        __builtin_unreachable();
280
278
      case -3:                  /* --usage */
281
279
        argp_state_help(state, state->out_stream,
282
280
                        ARGP_HELP_USAGE | ARGP_HELP_EXIT_ERR);
 
281
        __builtin_unreachable();
283
282
      case 'V':                 /* --version */
284
283
        fprintf(state->out_stream, "%s\n", argp_program_version);
285
284
        exit(argp_err_exit_status);
313
312
    fprintf(stderr, "Starting %s\n", argv[0]);
314
313
  }
315
314
 
316
 
  if (conflict_detection()){
 
315
  if(conflict_detection()){
317
316
    if(debug){
318
317
      fprintf(stderr, "Stopping %s because of conflict\n", argv[0]);
319
318
    }
514
513
        switch(e){
515
514
        case EBADF:
516
515
          status = EX_UNAVAILABLE;
 
516
          break;
517
517
        case EIO:
518
518
        case EINVAL:
519
519
        default: