/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/mandos-client.c

  • Committer: Teddy Hogeborn
  • Date: 2011-12-31 20:07:11 UTC
  • mfrom: (535.1.9 wireless-network-hook)
  • Revision ID: teddy@recompile.se-20111231200711-6dli3r8drftem57r
Merge new wireless network hook.  Fix bridge network hook to use
hardware addresses instead of interface names.  Implement and document
new "CONNECT" environment variable for network hooks.

Show diffs side-by-side

added added

removed removed

Lines of Context:
170
170
 
171
171
/* Function to use when printing errors */
172
172
void perror_plus(const char *print_text){
 
173
  int e = errno;
173
174
  fprintf(stderr, "Mandos plugin %s: ",
174
175
          program_invocation_short_name);
 
176
  errno = e;
175
177
  perror(print_text);
176
178
}
177
179
 
 
180
__attribute__((format (gnu_printf, 2, 3)))
178
181
int fprintf_plus(FILE *stream, const char *format, ...){
179
182
  va_list ap;
180
183
  va_start (ap, format);
202
205
}
203
206
 
204
207
/* Add server to set of servers to retry periodically */
205
 
int add_server(const char *ip, uint16_t port, AvahiIfIndex if_index,
206
 
               int af){
 
208
bool add_server(const char *ip, uint16_t port, AvahiIfIndex if_index,
 
209
                int af){
207
210
  int ret;
208
211
  server *new_server = malloc(sizeof(server));
209
212
  if(new_server == NULL){
210
213
    perror_plus("malloc");
211
 
    return -1;
 
214
    return false;
212
215
  }
213
216
  *new_server = (server){ .ip = strdup(ip),
214
217
                          .port = port,
216
219
                          .af = af };
217
220
  if(new_server->ip == NULL){
218
221
    perror_plus("strdup");
219
 
    return -1;
 
222
    return false;
220
223
  }
221
224
  /* Special case of first server */
222
225
  if (mc.current_server == NULL){
233
236
  ret = clock_gettime(CLOCK_MONOTONIC, &mc.current_server->last_seen);
234
237
  if(ret == -1){
235
238
    perror_plus("clock_gettime");
236
 
    return -1;
 
239
    return false;
237
240
  }
238
 
  return 0;
 
241
  return true;
239
242
}
240
243
 
241
244
/* 
1030
1033
      if(ret == 0){
1031
1034
        avahi_simple_poll_quit(mc.simple_poll);
1032
1035
      } else {
1033
 
        ret = add_server(ip, port, interface,
1034
 
                         avahi_proto_to_af(proto));
 
1036
        if(not add_server(ip, port, interface,
 
1037
                          avahi_proto_to_af(proto))){
 
1038
          fprintf_plus(stderr, "Failed to add server \"%s\" to server"
 
1039
                       " list\n", name);
 
1040
        }
1035
1041
      }
1036
1042
    }
1037
1043
  }
1431
1437
        if(ret == -1){
1432
1438
          perror_plus("setgroups");
1433
1439
        }
1434
 
        fprintf_plus(stderr, "Child: getuid() = %d\n", getuid());
1435
 
        fprintf_plus(stderr, "Child: geteuid() = %d\n", geteuid());
1436
1440
        dup2(devnull, STDIN_FILENO);
1437
1441
        close(devnull);
1438
1442
        dup2(STDERR_FILENO, STDOUT_FILENO);
1446
1450
          perror_plus("setenv");
1447
1451
          _exit(EX_OSERR);
1448
1452
        }
1449
 
        ret = setenv("VERBOSE", debug ? "1" : "0", 1);
 
1453
        ret = setenv("VERBOSITY", debug ? "1" : "0", 1);
1450
1454
        if(ret == -1){
1451
1455
          perror_plus("setenv");
1452
1456
          _exit(EX_OSERR);
1469
1473
          _exit(EX_OSERR);
1470
1474
        }
1471
1475
        free(delaystring);
1472
 
        ret = execl(fullname, direntry->d_name, mode, NULL);
1473
 
        perror_plus("execl");
 
1476
        if(connect_to != NULL){
 
1477
          ret = setenv("CONNECT", connect_to, 1);
 
1478
          if(ret == -1){
 
1479
            perror_plus("setenv");
 
1480
            _exit(EX_OSERR);
 
1481
          }
 
1482
        }
 
1483
        if(execl(fullname, direntry->d_name, mode, NULL) == -1){
 
1484
          perror_plus("execl");
 
1485
          _exit(EXIT_FAILURE);
 
1486
        }
1474
1487
      } else {
1475
1488
        int status;
1476
1489
        if(TEMP_FAILURE_RETRY(waitpid(hook_pid, &status, 0)) == -1){
1595
1608
        .group = 2 },
1596
1609
      { .name = "retry", .key = 132,
1597
1610
        .arg = "SECONDS",
1598
 
        .doc = "Retry interval used when denied by the mandos server",
 
1611
        .doc = "Retry interval used when denied by the Mandos server",
1599
1612
        .group = 2 },
1600
1613
      { .name = "network-hook-dir", .key = 133,
1601
1614
        .arg = "DIR",
1673
1686
        argp_state_help(state, state->out_stream,
1674
1687
                        ARGP_HELP_USAGE | ARGP_HELP_EXIT_ERR);
1675
1688
      case 'V':                 /* --version */
1676
 
        fprintf_plus(state->out_stream,
1677
 
                     "Mandos plugin mandos-client: ");
1678
1689
        fprintf_plus(state->out_stream, "%s\n", argp_program_version);
1679
1690
        exit(argp_err_exit_status);
1680
1691
        break;