/mandos/trunk

To get this branch, use:
bzr branch http://bzr.recompile.se/loggerhead/mandos/trunk
21 by Teddy Hogeborn
* Makefile (CFLAGS): Changed to use $(WARN), $(DEBUG), $(COVERAGE) and
1
/*  -*- coding: utf-8 -*- */
2
/*
261 by Teddy Hogeborn
* plugins.d/askpass-fifo.c: Fix name in header.
3
 * Mandos-client - get and decrypt data from a Mandos server
21 by Teddy Hogeborn
* Makefile (CFLAGS): Changed to use $(WARN), $(DEBUG), $(COVERAGE) and
4
 *
5
 * This program is partly derived from an example program for an Avahi
6
 * service browser, downloaded from
7
 * <http://avahi.org/browser/examples/core-browse-services.c>.  This
8
 * includes the following functions: "resolve_callback",
9
 * "browse_callback", and parts of "main".
10
 * 
28 by Teddy Hogeborn
* server.conf: New file.
11
 * Everything else is
466 by Teddy Hogeborn
Update copyright year to "2011" wherever appropriate.
12
 * Copyright © 2008-2011 Teddy Hogeborn
13
 * Copyright © 2008-2011 Björn Påhlsson
21 by Teddy Hogeborn
* Makefile (CFLAGS): Changed to use $(WARN), $(DEBUG), $(COVERAGE) and
14
 * 
15
 * This program is free software: you can redistribute it and/or
16
 * modify it under the terms of the GNU General Public License as
17
 * published by the Free Software Foundation, either version 3 of the
18
 * License, or (at your option) any later version.
19
 * 
20
 * This program is distributed in the hope that it will be useful, but
21
 * WITHOUT ANY WARRANTY; without even the implied warranty of
22
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
23
 * General Public License for more details.
24
 * 
25
 * You should have received a copy of the GNU General Public License
26
 * along with this program.  If not, see
27
 * <http://www.gnu.org/licenses/>.
28
 * 
505.1.2 by Teddy Hogeborn
Change "fukt.bsnet.se" to "recompile.se" throughout.
29
 * Contact the authors at <mandos@recompile.se>.
21 by Teddy Hogeborn
* Makefile (CFLAGS): Changed to use $(WARN), $(DEBUG), $(COVERAGE) and
30
 */
31
28 by Teddy Hogeborn
* server.conf: New file.
32
/* Needed by GPGME, specifically gpgme_data_seek() */
317 by Teddy Hogeborn
Use "getconf" to get correct LFS compile and link flags.
33
#ifndef _LARGEFILE_SOURCE
13 by Björn Påhlsson
Added following support:
34
#define _LARGEFILE_SOURCE
317 by Teddy Hogeborn
Use "getconf" to get correct LFS compile and link flags.
35
#endif
36
#ifndef _FILE_OFFSET_BITS
13 by Björn Påhlsson
Added following support:
37
#define _FILE_OFFSET_BITS 64
317 by Teddy Hogeborn
Use "getconf" to get correct LFS compile and link flags.
38
#endif
13 by Björn Påhlsson
Added following support:
39
76 by Teddy Hogeborn
* plugins.d/password-request.c (init_gnutls_global): Renamed
40
#define _GNU_SOURCE		/* TEMP_FAILURE_RETRY(), asprintf() */
24.1.10 by Björn Påhlsson
merge commit
41
76 by Teddy Hogeborn
* plugins.d/password-request.c (init_gnutls_global): Renamed
42
#include <stdio.h>		/* fprintf(), stderr, fwrite(),
311 by Teddy Hogeborn
Overflows are not detected by sscanf(), so stop using it:
43
				   stdout, ferror(), remove() */
24.1.26 by Björn Påhlsson
tally count of used symbols
44
#include <stdint.h> 		/* uint16_t, uint32_t */
45
#include <stddef.h>		/* NULL, size_t, ssize_t */
399 by Teddy Hogeborn
* Makefile (BROKEN_PIE): Add comment.
46
#include <stdlib.h> 		/* free(), EXIT_SUCCESS, srand(),
47
				   strtof(), abort() */
304 by Teddy Hogeborn
Four new interrelated features:
48
#include <stdbool.h>		/* bool, false, true */
24.1.29 by Björn Påhlsson
Added more header file comments
49
#include <string.h>		/* memset(), strcmp(), strlen(),
76 by Teddy Hogeborn
* plugins.d/password-request.c (init_gnutls_global): Renamed
50
				   strerror(), asprintf(), strcpy() */
304 by Teddy Hogeborn
Four new interrelated features:
51
#include <sys/ioctl.h>		/* ioctl */
24.1.26 by Björn Påhlsson
tally count of used symbols
52
#include <sys/types.h>		/* socket(), inet_pton(), sockaddr,
24.1.29 by Björn Påhlsson
Added more header file comments
53
				   sockaddr_in6, PF_INET6,
304 by Teddy Hogeborn
Four new interrelated features:
54
				   SOCK_STREAM, uid_t, gid_t, open(),
55
				   opendir(), DIR */
505.3.1 by teddy at bsnet
* plugins.d/mandos-client.c (good_interface): Add error message.
56
#include <sys/stat.h>		/* open(), S_ISREG */
24.1.26 by Björn Påhlsson
tally count of used symbols
57
#include <sys/socket.h>		/* socket(), struct sockaddr_in6,
304 by Teddy Hogeborn
Four new interrelated features:
58
				   inet_pton(), connect() */
24.1.81 by Björn Påhlsson
removed keyring pre-requirement for starting password-request.
59
#include <fcntl.h>		/* open() */
266 by Teddy Hogeborn
* plugin-runner.c: Only space changes.
60
#include <dirent.h>		/* opendir(), struct dirent, readdir()
61
				 */
311 by Teddy Hogeborn
Overflows are not detected by sscanf(), so stop using it:
62
#include <inttypes.h>		/* PRIu16, PRIdMAX, intmax_t,
63
				   strtoimax() */
24.1.29 by Björn Påhlsson
Added more header file comments
64
#include <assert.h>		/* assert() */
485 by Teddy Hogeborn
Merge from Björn.
65
#include <errno.h>		/* perror(), errno,
66
				   program_invocation_short_name */
24.1.163 by Björn Påhlsson
mandos-client: Added never ending loop for --connect
67
#include <time.h>		/* nanosleep(), time(), sleep() */
39 by Teddy Hogeborn
* plugins.d/mandosclient.c (pgp_packet_decrypt): Renamed variables.
68
#include <net/if.h>		/* ioctl, ifreq, SIOCGIFFLAGS, IFF_UP,
24.1.26 by Björn Påhlsson
tally count of used symbols
69
				   SIOCSIFFLAGS, if_indextoname(),
70
				   if_nametoindex(), IF_NAMESIZE */
304 by Teddy Hogeborn
Four new interrelated features:
71
#include <netinet/in.h>		/* IN6_IS_ADDR_LINKLOCAL,
72
				   INET_ADDRSTRLEN, INET6_ADDRSTRLEN
73
				*/
24.1.29 by Björn Påhlsson
Added more header file comments
74
#include <unistd.h>		/* close(), SEEK_SET, off_t, write(),
365 by Teddy Hogeborn
* plugins.d/mandos-client.c (main): Bug fix: Check result of setgid().
75
				   getuid(), getgid(), seteuid(),
374 by Teddy Hogeborn
* plugins.d/mandos-client.c (main): Try harder to raise signal on
76
				   setgid(), pause() */
484 by Teddy Hogeborn
* Makefile (plugins.d/mandos-client): Bug fix: Put $^ before all
77
#include <arpa/inet.h>		/* inet_pton(), htons, inet_ntop() */
304 by Teddy Hogeborn
Four new interrelated features:
78
#include <iso646.h>		/* not, or, and */
24.1.29 by Björn Påhlsson
Added more header file comments
79
#include <argp.h>		/* struct argp_option, error_t, struct
80
				   argp_state, struct argp,
81
				   argp_parse(), ARGP_KEY_ARG,
82
				   ARGP_KEY_END, ARGP_ERR_UNKNOWN */
307 by Teddy Hogeborn
Merge from Björn:
83
#include <signal.h>		/* sigemptyset(), sigaddset(),
354 by Teddy Hogeborn
* plugins.d/mandos-client.c (signal_received): New.
84
				   sigaction(), SIGTERM, sig_atomic_t,
85
				   raise() */
399 by Teddy Hogeborn
* Makefile (BROKEN_PIE): Add comment.
86
#include <sysexits.h>		/* EX_OSERR, EX_USAGE, EX_UNAVAILABLE,
87
				   EX_NOHOST, EX_IOERR, EX_PROTOCOL */
505.3.3 by teddy at bsnet
* plugins.d/mandos-client.c: Prefix all printouts with "Mandos plugin
88
#include <sys/wait.h>		/* waitpid(), WIFEXITED(),
89
				   WEXITSTATUS(), WTERMSIG() */
307 by Teddy Hogeborn
Merge from Björn:
90
293 by Teddy Hogeborn
* plugin-runner.c: Whitespace changes only.
91
#ifdef __linux__
24.1.124 by Björn Påhlsson
Added lower kernel loglevel to reduce clutter on system console.
92
#include <sys/klog.h> 		/* klogctl() */
308 by Teddy Hogeborn
* plugin-runner.c: Comment change.
93
#endif	/* __linux__ */
24.1.26 by Björn Påhlsson
tally count of used symbols
94
95
/* Avahi */
24.1.29 by Björn Påhlsson
Added more header file comments
96
/* All Avahi types, constants and functions
97
 Avahi*, avahi_*,
98
 AVAHI_* */
99
#include <avahi-core/core.h>
24.1.26 by Björn Påhlsson
tally count of used symbols
100
#include <avahi-core/lookup.h>
24.1.29 by Björn Påhlsson
Added more header file comments
101
#include <avahi-core/log.h>
24.1.26 by Björn Påhlsson
tally count of used symbols
102
#include <avahi-common/simple-watch.h>
103
#include <avahi-common/malloc.h>
104
#include <avahi-common/error.h>
105
106
/* GnuTLS */
76 by Teddy Hogeborn
* plugins.d/password-request.c (init_gnutls_global): Renamed
107
#include <gnutls/gnutls.h>	/* All GnuTLS types, constants and
108
				   functions:
24.1.29 by Björn Påhlsson
Added more header file comments
109
				   gnutls_*
24.1.26 by Björn Påhlsson
tally count of used symbols
110
				   init_gnutls_session(),
24.1.29 by Björn Påhlsson
Added more header file comments
111
				   GNUTLS_* */
266 by Teddy Hogeborn
* plugin-runner.c: Only space changes.
112
#include <gnutls/openpgp.h>
505.3.6 by teddy at bsnet
* plugins.d/mandos-client.c: Some white space fixes.
113
			 /* gnutls_certificate_set_openpgp_key_file(),
114
			    GNUTLS_OPENPGP_FMT_BASE64 */
24.1.26 by Björn Påhlsson
tally count of used symbols
115
40 by Teddy Hogeborn
* plugins.d/mandosclient.c (initgnutls): Moved "err" variable into its
116
/* GPGME */
76 by Teddy Hogeborn
* plugins.d/password-request.c (init_gnutls_global): Renamed
117
#include <gpgme.h> 		/* All GPGME types, constants and
118
				   functions:
24.1.29 by Björn Påhlsson
Added more header file comments
119
				   gpgme_*
24.1.26 by Björn Påhlsson
tally count of used symbols
120
				   GPGME_PROTOCOL_OpenPGP,
24.1.29 by Björn Påhlsson
Added more header file comments
121
				   GPG_ERR_NO_* */
13 by Björn Påhlsson
Added following support:
122
123
#define BUFFER_SIZE 256
37 by Teddy Hogeborn
Non-tested commit for merge purposes.
124
24.1.81 by Björn Påhlsson
removed keyring pre-requirement for starting password-request.
125
#define PATHDIR "/conf/conf.d/mandos"
126
#define SECKEY "seckey.txt"
168 by Teddy Hogeborn
* initramfs-tools-hook: Use long options where available. Use only
127
#define PUBKEY "pubkey.txt"
505.2.3 by Teddy Hogeborn
Intermediate commit - this does *not* work yet.
128
#define HOOKDIR "/lib/mandos/network-hooks.d"
24.1.81 by Björn Påhlsson
removed keyring pre-requirement for starting password-request.
129
15.1.2 by Björn Påhlsson
Added debug options from passprompt as --debug and --debug=passprompt
130
bool debug = false;
43 by Teddy Hogeborn
* plugins.d/mandosclient.c: Cosmetic changes.
131
static const char mandos_protocol_version[] = "1";
217 by Teddy Hogeborn
* .bzrignore: Added "man" directory (created by "make install-html").
132
const char *argp_program_version = "mandos-client " VERSION;
505.1.2 by Teddy Hogeborn
Change "fukt.bsnet.se" to "recompile.se" throughout.
133
const char *argp_program_bug_address = "<mandos@recompile.se>";
237.2.33 by teddy at bsnet
* plugins.d/mandos-client.c: An empty interface name now means to
134
static const char sys_class_net[] = "/sys/class/net";
135
char *connect_to = NULL;
505.3.4 by teddy at bsnet
* plugins.d/mandos-client.c (runnable_hook): Bug fix: stat using the
136
const char *hookdir = HOOKDIR;
24.1.10 by Björn Påhlsson
merge commit
137
485 by Teddy Hogeborn
Merge from Björn.
138
/* Doubly linked list that need to be circularly linked when used */
24.1.174 by Björn Påhlsson
* Makefile (CFLAGS): Added "-lrt" to include real time library.
139
typedef struct server{
140
  const char *ip;
141
  uint16_t port;
142
  AvahiIfIndex if_index;
143
  int af;
144
  struct timespec last_seen;
145
  struct server *next;
146
  struct server *prev;
147
} server;
148
42 by Teddy Hogeborn
* plugins.d/mandosclient.c (start_mandos_communication): Change "to"
149
/* Used for passing in values through the Avahi callback functions */
13 by Björn Påhlsson
Added following support:
150
typedef struct {
24.1.9 by Björn Påhlsson
not working midwork...
151
  AvahiSimplePoll *simple_poll;
152
  AvahiServer *server;
13 by Björn Påhlsson
Added following support:
153
  gnutls_certificate_credentials_t cred;
24.1.9 by Björn Påhlsson
not working midwork...
154
  unsigned int dh_bits;
24.1.13 by Björn Påhlsson
mandosclient
155
  gnutls_dh_params_t dh_params;
24.1.9 by Björn Påhlsson
not working midwork...
156
  const char *priority;
24.1.81 by Björn Påhlsson
removed keyring pre-requirement for starting password-request.
157
  gpgme_ctx_t ctx;
24.1.174 by Björn Påhlsson
* Makefile (CFLAGS): Added "-lrt" to include real time library.
158
  server *current_server;
24.1.9 by Björn Påhlsson
not working midwork...
159
} mandos_context;
13 by Björn Påhlsson
Added following support:
160
24.1.134 by Björn Påhlsson
plugin-runner: Added support for empty string arguments
161
/* global context so signal handler can reach it*/
24.1.135 by Björn Påhlsson
Earlier signal handling
162
mandos_context mc = { .simple_poll = NULL, .server = NULL,
163
		      .dh_bits = 1024, .priority = "SECURE256"
485 by Teddy Hogeborn
Merge from Björn.
164
		      ":!CTYPE-X.509:+CTYPE-OPENPGP",
165
		      .current_server = NULL };
24.1.134 by Björn Påhlsson
plugin-runner: Added support for empty string arguments
166
371 by Teddy Hogeborn
* plugins.d/mandos-client.c (init_gnutls_session): Always fail and
167
sig_atomic_t quit_now = 0;
168
int signal_received = 0;
169
24.1.174 by Björn Påhlsson
* Makefile (CFLAGS): Added "-lrt" to include real time library.
170
/* Function to use when printing errors */
171
void perror_plus(const char *print_text){
485 by Teddy Hogeborn
Merge from Björn.
172
  fprintf(stderr, "Mandos plugin %s: ",
173
	  program_invocation_short_name);
24.1.174 by Björn Påhlsson
* Makefile (CFLAGS): Added "-lrt" to include real time library.
174
  perror(print_text);
175
}
176
43 by Teddy Hogeborn
* plugins.d/mandosclient.c: Cosmetic changes.
177
/*
308 by Teddy Hogeborn
* plugin-runner.c: Comment change.
178
 * Make additional room in "buffer" for at least BUFFER_SIZE more
179
 * bytes. "buffer_capacity" is how much is currently allocated,
180
 * "buffer_length" is how much is already used.
43 by Teddy Hogeborn
* plugins.d/mandosclient.c: Cosmetic changes.
181
 */
24.1.132 by Björn Påhlsson
Fixed a bug in fallback handling
182
size_t incbuffer(char **buffer, size_t buffer_length,
505.3.6 by teddy at bsnet
* plugins.d/mandos-client.c: Some white space fixes.
183
		 size_t buffer_capacity){
266 by Teddy Hogeborn
* plugin-runner.c: Only space changes.
184
  if(buffer_length + BUFFER_SIZE > buffer_capacity){
24.1.12 by Björn Påhlsson
merge +
185
    *buffer = realloc(*buffer, buffer_capacity + BUFFER_SIZE);
266 by Teddy Hogeborn
* plugin-runner.c: Only space changes.
186
    if(buffer == NULL){
24.1.10 by Björn Påhlsson
merge commit
187
      return 0;
188
    }
189
    buffer_capacity += BUFFER_SIZE;
190
  }
191
  return buffer_capacity;
192
}
193
491 by teddy at bsnet
* plugins.d/mandos-client.c (avahi_loop_with_timeout): Fix warning.
194
/* Add server to set of servers to retry periodically */
505.3.6 by teddy at bsnet
* plugins.d/mandos-client.c: Some white space fixes.
195
int add_server(const char *ip, uint16_t port, AvahiIfIndex if_index,
196
	       int af){
24.1.174 by Björn Påhlsson
* Makefile (CFLAGS): Added "-lrt" to include real time library.
197
  int ret;
198
  server *new_server = malloc(sizeof(server));
199
  if(new_server == NULL){
200
    perror_plus("malloc");
201
    return -1;
202
  }
203
  *new_server = (server){ .ip = strdup(ip),
505.3.6 by teddy at bsnet
* plugins.d/mandos-client.c: Some white space fixes.
204
			  .port = port,
205
			  .if_index = if_index,
206
			  .af = af };
24.1.174 by Björn Påhlsson
* Makefile (CFLAGS): Added "-lrt" to include real time library.
207
  if(new_server->ip == NULL){
208
    perror_plus("strdup");
485 by Teddy Hogeborn
Merge from Björn.
209
    return -1;
24.1.174 by Björn Påhlsson
* Makefile (CFLAGS): Added "-lrt" to include real time library.
210
  }
491 by teddy at bsnet
* plugins.d/mandos-client.c (avahi_loop_with_timeout): Fix warning.
211
  /* Special case of first server */
24.1.174 by Björn Påhlsson
* Makefile (CFLAGS): Added "-lrt" to include real time library.
212
  if (mc.current_server == NULL){
213
    new_server->next = new_server;
214
    new_server->prev = new_server;
215
    mc.current_server = new_server;
491 by teddy at bsnet
* plugins.d/mandos-client.c (avahi_loop_with_timeout): Fix warning.
216
  /* Place the new server last in the list */
24.1.174 by Björn Påhlsson
* Makefile (CFLAGS): Added "-lrt" to include real time library.
217
  } else {
218
    new_server->next = mc.current_server;
219
    new_server->prev = mc.current_server->prev;
220
    new_server->prev->next = new_server;
221
    mc.current_server->prev = new_server;
222
  }
223
  ret = clock_gettime(CLOCK_MONOTONIC, &mc.current_server->last_seen);
224
  if(ret == -1){
225
    perror_plus("clock_gettime");
226
    return -1;
227
  }
228
  return 0;
229
}
230
39 by Teddy Hogeborn
* plugins.d/mandosclient.c (pgp_packet_decrypt): Renamed variables.
231
/* 
24.1.81 by Björn Påhlsson
removed keyring pre-requirement for starting password-request.
232
 * Initialize GPGME.
39 by Teddy Hogeborn
* plugins.d/mandosclient.c (pgp_packet_decrypt): Renamed variables.
233
 */
505.3.6 by teddy at bsnet
* plugins.d/mandos-client.c: Some white space fixes.
234
static bool init_gpgme(const char *seckey, const char *pubkey,
235
		       const char *tempdir){
13 by Björn Påhlsson
Added following support:
236
  gpgme_error_t rc;
237
  gpgme_engine_info_t engine_info;
168 by Teddy Hogeborn
* initramfs-tools-hook: Use long options where available. Use only
238
  
24.1.81 by Björn Påhlsson
removed keyring pre-requirement for starting password-request.
239
  
240
  /*
288 by Teddy Hogeborn
* plugins.d/mandos-client.c (main): Use separate bool variable instead
241
   * Helper function to insert pub and seckey to the engine keyring.
24.1.81 by Björn Påhlsson
removed keyring pre-requirement for starting password-request.
242
   */
243
  bool import_key(const char *filename){
361 by Teddy Hogeborn
* plugins.d/mandos-client.c (init_gpgme): Move variable "ret" into the
244
    int ret;
24.1.81 by Björn Påhlsson
removed keyring pre-requirement for starting password-request.
245
    int fd;
246
    gpgme_data_t pgp_data;
247
    
257.1.2 by Mooie
Fixed warnings in the 64 bit build. Added explicit cast to int for
248
    fd = (int)TEMP_FAILURE_RETRY(open(filename, O_RDONLY));
24.1.81 by Björn Påhlsson
removed keyring pre-requirement for starting password-request.
249
    if(fd == -1){
24.1.174 by Björn Påhlsson
* Makefile (CFLAGS): Added "-lrt" to include real time library.
250
      perror_plus("open");
24.1.81 by Björn Påhlsson
removed keyring pre-requirement for starting password-request.
251
      return false;
252
    }
253
    
254
    rc = gpgme_data_new_from_fd(&pgp_data, fd);
266 by Teddy Hogeborn
* plugin-runner.c: Only space changes.
255
    if(rc != GPG_ERR_NO_ERROR){
505.3.3 by teddy at bsnet
* plugins.d/mandos-client.c: Prefix all printouts with "Mandos plugin
256
      fprintf(stderr, "Mandos plugin mandos-client: "
257
	      "bad gpgme_data_new_from_fd: %s: %s\n",
24.1.81 by Björn Påhlsson
removed keyring pre-requirement for starting password-request.
258
	      gpgme_strsource(rc), gpgme_strerror(rc));
259
      return false;
260
    }
168 by Teddy Hogeborn
* initramfs-tools-hook: Use long options where available. Use only
261
    
24.1.134 by Björn Påhlsson
plugin-runner: Added support for empty string arguments
262
    rc = gpgme_op_import(mc.ctx, pgp_data);
266 by Teddy Hogeborn
* plugin-runner.c: Only space changes.
263
    if(rc != GPG_ERR_NO_ERROR){
505.3.3 by teddy at bsnet
* plugins.d/mandos-client.c: Prefix all printouts with "Mandos plugin
264
      fprintf(stderr, "Mandos plugin mandos-client: "
265
	      "bad gpgme_op_import: %s: %s\n",
24.1.81 by Björn Påhlsson
removed keyring pre-requirement for starting password-request.
266
	      gpgme_strsource(rc), gpgme_strerror(rc));
267
      return false;
268
    }
168 by Teddy Hogeborn
* initramfs-tools-hook: Use long options where available. Use only
269
    
257.1.2 by Mooie
Fixed warnings in the 64 bit build. Added explicit cast to int for
270
    ret = (int)TEMP_FAILURE_RETRY(close(fd));
24.1.81 by Björn Påhlsson
removed keyring pre-requirement for starting password-request.
271
    if(ret == -1){
24.1.174 by Björn Påhlsson
* Makefile (CFLAGS): Added "-lrt" to include real time library.
272
      perror_plus("close");
24.1.81 by Björn Påhlsson
removed keyring pre-requirement for starting password-request.
273
    }
274
    gpgme_data_release(pgp_data);
275
    return true;
276
  }
39 by Teddy Hogeborn
* plugins.d/mandosclient.c (pgp_packet_decrypt): Renamed variables.
277
  
266 by Teddy Hogeborn
* plugin-runner.c: Only space changes.
278
  if(debug){
505.3.3 by teddy at bsnet
* plugins.d/mandos-client.c: Prefix all printouts with "Mandos plugin
279
    fprintf(stderr, "Mandos plugin mandos-client: "
280
	    "Initializing GPGME\n");
15.1.1 by Björn Påhlsson
Added debugg support in form off --debug and --debug=mandosclient
281
  }
168 by Teddy Hogeborn
* initramfs-tools-hook: Use long options where available. Use only
282
  
13 by Björn Påhlsson
Added following support:
283
  /* Init GPGME */
284
  gpgme_check_version(NULL);
24.1.4 by Björn Påhlsson
Added optional parameters certdir, certkey and certfile that can be iven at start in the command line.
285
  rc = gpgme_engine_check_version(GPGME_PROTOCOL_OpenPGP);
266 by Teddy Hogeborn
* plugin-runner.c: Only space changes.
286
  if(rc != GPG_ERR_NO_ERROR){
505.3.3 by teddy at bsnet
* plugins.d/mandos-client.c: Prefix all printouts with "Mandos plugin
287
    fprintf(stderr, "Mandos plugin mandos-client: "
288
	    "bad gpgme_engine_check_version: %s: %s\n",
24.1.4 by Björn Påhlsson
Added optional parameters certdir, certkey and certfile that can be iven at start in the command line.
289
	    gpgme_strsource(rc), gpgme_strerror(rc));
24.1.81 by Björn Påhlsson
removed keyring pre-requirement for starting password-request.
290
    return false;
24.1.4 by Björn Påhlsson
Added optional parameters certdir, certkey and certfile that can be iven at start in the command line.
291
  }
168 by Teddy Hogeborn
* initramfs-tools-hook: Use long options where available. Use only
292
  
492 by Teddy Hogeborn
* plugins.d/mandos-client.c (main): Do not even try to work around
293
  /* Set GPGME home directory for the OpenPGP engine only */
266 by Teddy Hogeborn
* plugin-runner.c: Only space changes.
294
  rc = gpgme_get_engine_info(&engine_info);
295
  if(rc != GPG_ERR_NO_ERROR){
505.3.3 by teddy at bsnet
* plugins.d/mandos-client.c: Prefix all printouts with "Mandos plugin
296
    fprintf(stderr, "Mandos plugin mandos-client: "
297
	    "bad gpgme_get_engine_info: %s: %s\n",
13 by Björn Påhlsson
Added following support:
298
	    gpgme_strsource(rc), gpgme_strerror(rc));
24.1.81 by Björn Påhlsson
removed keyring pre-requirement for starting password-request.
299
    return false;
13 by Björn Påhlsson
Added following support:
300
  }
301
  while(engine_info != NULL){
302
    if(engine_info->protocol == GPGME_PROTOCOL_OpenPGP){
303
      gpgme_set_engine_info(GPGME_PROTOCOL_OpenPGP,
24.1.81 by Björn Påhlsson
removed keyring pre-requirement for starting password-request.
304
			    engine_info->file_name, tempdir);
13 by Björn Påhlsson
Added following support:
305
      break;
306
    }
307
    engine_info = engine_info->next;
308
  }
309
  if(engine_info == NULL){
505.3.3 by teddy at bsnet
* plugins.d/mandos-client.c: Prefix all printouts with "Mandos plugin
310
    fprintf(stderr, "Mandos plugin mandos-client: "
311
	    "Could not set GPGME home dir to %s\n", tempdir);
24.1.81 by Björn Påhlsson
removed keyring pre-requirement for starting password-request.
312
    return false;
313
  }
168 by Teddy Hogeborn
* initramfs-tools-hook: Use long options where available. Use only
314
  
24.1.81 by Björn Påhlsson
removed keyring pre-requirement for starting password-request.
315
  /* Create new GPGME "context" */
24.1.134 by Björn Påhlsson
plugin-runner: Added support for empty string arguments
316
  rc = gpgme_new(&(mc.ctx));
266 by Teddy Hogeborn
* plugin-runner.c: Only space changes.
317
  if(rc != GPG_ERR_NO_ERROR){
505.3.3 by teddy at bsnet
* plugins.d/mandos-client.c: Prefix all printouts with "Mandos plugin
318
    fprintf(stderr, "Mandos plugin mandos-client: "
319
	    "bad gpgme_new: %s: %s\n", gpgme_strsource(rc),
320
	    gpgme_strerror(rc));
24.1.81 by Björn Påhlsson
removed keyring pre-requirement for starting password-request.
321
    return false;
322
  }
323
  
266 by Teddy Hogeborn
* plugin-runner.c: Only space changes.
324
  if(not import_key(pubkey) or not import_key(seckey)){
24.1.81 by Björn Påhlsson
removed keyring pre-requirement for starting password-request.
325
    return false;
326
  }
327
  
355 by Teddy Hogeborn
* mandos: White-space fixes only.
328
  return true;
24.1.81 by Björn Påhlsson
removed keyring pre-requirement for starting password-request.
329
}
330
331
/* 
332
 * Decrypt OpenPGP data.
333
 * Returns -1 on error
334
 */
24.1.134 by Björn Påhlsson
plugin-runner: Added support for empty string arguments
335
static ssize_t pgp_packet_decrypt(const char *cryptotext,
266 by Teddy Hogeborn
* plugin-runner.c: Only space changes.
336
				  size_t crypto_size,
337
				  char **plaintext){
24.1.81 by Björn Påhlsson
removed keyring pre-requirement for starting password-request.
338
  gpgme_data_t dh_crypto, dh_plain;
339
  gpgme_error_t rc;
340
  ssize_t ret;
341
  size_t plaintext_capacity = 0;
342
  ssize_t plaintext_length = 0;
343
  
266 by Teddy Hogeborn
* plugin-runner.c: Only space changes.
344
  if(debug){
505.3.3 by teddy at bsnet
* plugins.d/mandos-client.c: Prefix all printouts with "Mandos plugin
345
    fprintf(stderr, "Mandos plugin mandos-client: "
346
	    "Trying to decrypt OpenPGP data\n");
13 by Björn Påhlsson
Added following support:
347
  }
348
  
39 by Teddy Hogeborn
* plugins.d/mandosclient.c (pgp_packet_decrypt): Renamed variables.
349
  /* Create new GPGME data buffer from memory cryptotext */
350
  rc = gpgme_data_new_from_mem(&dh_crypto, cryptotext, crypto_size,
351
			       0);
266 by Teddy Hogeborn
* plugin-runner.c: Only space changes.
352
  if(rc != GPG_ERR_NO_ERROR){
505.3.3 by teddy at bsnet
* plugins.d/mandos-client.c: Prefix all printouts with "Mandos plugin
353
    fprintf(stderr, "Mandos plugin mandos-client: "
354
	    "bad gpgme_data_new_from_mem: %s: %s\n",
13 by Björn Påhlsson
Added following support:
355
	    gpgme_strsource(rc), gpgme_strerror(rc));
356
    return -1;
357
  }
358
  
359
  /* Create new empty GPGME data buffer for the plaintext */
360
  rc = gpgme_data_new(&dh_plain);
266 by Teddy Hogeborn
* plugin-runner.c: Only space changes.
361
  if(rc != GPG_ERR_NO_ERROR){
505.3.3 by teddy at bsnet
* plugins.d/mandos-client.c: Prefix all printouts with "Mandos plugin
362
    fprintf(stderr, "Mandos plugin mandos-client: "
363
	    "bad gpgme_data_new: %s: %s\n",
13 by Björn Påhlsson
Added following support:
364
	    gpgme_strsource(rc), gpgme_strerror(rc));
39 by Teddy Hogeborn
* plugins.d/mandosclient.c (pgp_packet_decrypt): Renamed variables.
365
    gpgme_data_release(dh_crypto);
13 by Björn Påhlsson
Added following support:
366
    return -1;
367
  }
368
  
39 by Teddy Hogeborn
* plugins.d/mandosclient.c (pgp_packet_decrypt): Renamed variables.
369
  /* Decrypt data from the cryptotext data buffer to the plaintext
370
     data buffer */
24.1.134 by Björn Påhlsson
plugin-runner: Added support for empty string arguments
371
  rc = gpgme_op_decrypt(mc.ctx, dh_crypto, dh_plain);
266 by Teddy Hogeborn
* plugin-runner.c: Only space changes.
372
  if(rc != GPG_ERR_NO_ERROR){
505.3.3 by teddy at bsnet
* plugins.d/mandos-client.c: Prefix all printouts with "Mandos plugin
373
    fprintf(stderr, "Mandos plugin mandos-client: "
374
	    "bad gpgme_op_decrypt: %s: %s\n",
13 by Björn Påhlsson
Added following support:
375
	    gpgme_strsource(rc), gpgme_strerror(rc));
39 by Teddy Hogeborn
* plugins.d/mandosclient.c (pgp_packet_decrypt): Renamed variables.
376
    plaintext_length = -1;
266 by Teddy Hogeborn
* plugin-runner.c: Only space changes.
377
    if(debug){
99 by Teddy Hogeborn
* mandos (fingerprint): Bug fix: Check crtverify.value, not crtverify.
378
      gpgme_decrypt_result_t result;
24.1.134 by Björn Påhlsson
plugin-runner: Added support for empty string arguments
379
      result = gpgme_op_decrypt_result(mc.ctx);
266 by Teddy Hogeborn
* plugin-runner.c: Only space changes.
380
      if(result == NULL){
505.3.3 by teddy at bsnet
* plugins.d/mandos-client.c: Prefix all printouts with "Mandos plugin
381
	fprintf(stderr, "Mandos plugin mandos-client: "
382
		"gpgme_op_decrypt_result failed\n");
99 by Teddy Hogeborn
* mandos (fingerprint): Bug fix: Check crtverify.value, not crtverify.
383
      } else {
505.3.3 by teddy at bsnet
* plugins.d/mandos-client.c: Prefix all printouts with "Mandos plugin
384
	fprintf(stderr, "Mandos plugin mandos-client: "
385
		"Unsupported algorithm: %s\n",
99 by Teddy Hogeborn
* mandos (fingerprint): Bug fix: Check crtverify.value, not crtverify.
386
		result->unsupported_algorithm);
505.3.3 by teddy at bsnet
* plugins.d/mandos-client.c: Prefix all printouts with "Mandos plugin
387
	fprintf(stderr, "Mandos plugin mandos-client: "
388
		"Wrong key usage: %u\n",
99 by Teddy Hogeborn
* mandos (fingerprint): Bug fix: Check crtverify.value, not crtverify.
389
		result->wrong_key_usage);
390
	if(result->file_name != NULL){
505.3.3 by teddy at bsnet
* plugins.d/mandos-client.c: Prefix all printouts with "Mandos plugin
391
	  fprintf(stderr, "Mandos plugin mandos-client: "
392
		  "File name: %s\n", result->file_name);
99 by Teddy Hogeborn
* mandos (fingerprint): Bug fix: Check crtverify.value, not crtverify.
393
	}
394
	gpgme_recipient_t recipient;
395
	recipient = result->recipients;
349 by Teddy Hogeborn
* plugins.d/mandos-client.c (pgp_packet_decrypt): Remove redundant
396
	while(recipient != NULL){
505.3.3 by teddy at bsnet
* plugins.d/mandos-client.c: Prefix all printouts with "Mandos plugin
397
	  fprintf(stderr, "Mandos plugin mandos-client: "
398
		  "Public key algorithm: %s\n",
349 by Teddy Hogeborn
* plugins.d/mandos-client.c (pgp_packet_decrypt): Remove redundant
399
		  gpgme_pubkey_algo_name(recipient->pubkey_algo));
505.3.3 by teddy at bsnet
* plugins.d/mandos-client.c: Prefix all printouts with "Mandos plugin
400
	  fprintf(stderr, "Mandos plugin mandos-client: "
401
		  "Key ID: %s\n", recipient->keyid);
402
	  fprintf(stderr, "Mandos plugin mandos-client: "
403
		  "Secret key available: %s\n",
349 by Teddy Hogeborn
* plugins.d/mandos-client.c (pgp_packet_decrypt): Remove redundant
404
		  recipient->status == GPG_ERR_NO_SECKEY
405
		  ? "No" : "Yes");
406
	  recipient = recipient->next;
99 by Teddy Hogeborn
* mandos (fingerprint): Bug fix: Check crtverify.value, not crtverify.
407
	}
408
      }
409
    }
39 by Teddy Hogeborn
* plugins.d/mandosclient.c (pgp_packet_decrypt): Renamed variables.
410
    goto decrypt_end;
13 by Björn Påhlsson
Added following support:
411
  }
39 by Teddy Hogeborn
* plugins.d/mandosclient.c (pgp_packet_decrypt): Renamed variables.
412
  
15.1.1 by Björn Påhlsson
Added debugg support in form off --debug and --debug=mandosclient
413
  if(debug){
505.3.3 by teddy at bsnet
* plugins.d/mandos-client.c: Prefix all printouts with "Mandos plugin
414
    fprintf(stderr, "Mandos plugin mandos-client: "
415
	    "Decryption of OpenPGP data succeeded\n");
15.1.1 by Björn Påhlsson
Added debugg support in form off --debug and --debug=mandosclient
416
  }
39 by Teddy Hogeborn
* plugins.d/mandosclient.c (pgp_packet_decrypt): Renamed variables.
417
  
13 by Björn Påhlsson
Added following support:
418
  /* Seek back to the beginning of the GPGME plaintext data buffer */
266 by Teddy Hogeborn
* plugin-runner.c: Only space changes.
419
  if(gpgme_data_seek(dh_plain, (off_t)0, SEEK_SET) == -1){
24.1.174 by Björn Påhlsson
* Makefile (CFLAGS): Added "-lrt" to include real time library.
420
    perror_plus("gpgme_data_seek");
39 by Teddy Hogeborn
* plugins.d/mandosclient.c (pgp_packet_decrypt): Renamed variables.
421
    plaintext_length = -1;
422
    goto decrypt_end;
24.1.5 by Björn Påhlsson
plugbasedclient:
423
  }
424
  
39 by Teddy Hogeborn
* plugins.d/mandosclient.c (pgp_packet_decrypt): Renamed variables.
425
  *plaintext = NULL;
13 by Björn Påhlsson
Added following support:
426
  while(true){
24.1.132 by Björn Påhlsson
Fixed a bug in fallback handling
427
    plaintext_capacity = incbuffer(plaintext,
505.3.6 by teddy at bsnet
* plugins.d/mandos-client.c: Some white space fixes.
428
				   (size_t)plaintext_length,
429
				   plaintext_capacity);
266 by Teddy Hogeborn
* plugin-runner.c: Only space changes.
430
    if(plaintext_capacity == 0){
505.3.6 by teddy at bsnet
* plugins.d/mandos-client.c: Some white space fixes.
431
      perror_plus("incbuffer");
432
      plaintext_length = -1;
433
      goto decrypt_end;
13 by Björn Påhlsson
Added following support:
434
    }
435
    
39 by Teddy Hogeborn
* plugins.d/mandosclient.c (pgp_packet_decrypt): Renamed variables.
436
    ret = gpgme_data_read(dh_plain, *plaintext + plaintext_length,
21 by Teddy Hogeborn
* Makefile (CFLAGS): Changed to use $(WARN), $(DEBUG), $(COVERAGE) and
437
			  BUFFER_SIZE);
13 by Björn Påhlsson
Added following support:
438
    /* Print the data, if any */
266 by Teddy Hogeborn
* plugin-runner.c: Only space changes.
439
    if(ret == 0){
39 by Teddy Hogeborn
* plugins.d/mandosclient.c (pgp_packet_decrypt): Renamed variables.
440
      /* EOF */
13 by Björn Påhlsson
Added following support:
441
      break;
442
    }
443
    if(ret < 0){
24.1.174 by Björn Påhlsson
* Makefile (CFLAGS): Added "-lrt" to include real time library.
444
      perror_plus("gpgme_data_read");
39 by Teddy Hogeborn
* plugins.d/mandosclient.c (pgp_packet_decrypt): Renamed variables.
445
      plaintext_length = -1;
446
      goto decrypt_end;
13 by Björn Påhlsson
Added following support:
447
    }
39 by Teddy Hogeborn
* plugins.d/mandosclient.c (pgp_packet_decrypt): Renamed variables.
448
    plaintext_length += ret;
13 by Björn Påhlsson
Added following support:
449
  }
143 by Teddy Hogeborn
* Makefile (mandos.8): Add dependency on "overview.xml" and
450
  
39 by Teddy Hogeborn
* plugins.d/mandosclient.c (pgp_packet_decrypt): Renamed variables.
451
  if(debug){
505.3.3 by teddy at bsnet
* plugins.d/mandos-client.c: Prefix all printouts with "Mandos plugin
452
    fprintf(stderr, "Mandos plugin mandos-client: "
453
	    "Decrypted password is: ");
40 by Teddy Hogeborn
* plugins.d/mandosclient.c (initgnutls): Moved "err" variable into its
454
    for(ssize_t i = 0; i < plaintext_length; i++){
39 by Teddy Hogeborn
* plugins.d/mandosclient.c (pgp_packet_decrypt): Renamed variables.
455
      fprintf(stderr, "%02hhX ", (*plaintext)[i]);
456
    }
457
    fprintf(stderr, "\n");
458
  }
459
  
460
 decrypt_end:
461
  
462
  /* Delete the GPGME cryptotext data buffer */
463
  gpgme_data_release(dh_crypto);
15.1.3 by Björn Påhlsson
Added getopt_long support for mandosclient and passprompt
464
  
465
  /* Delete the GPGME plaintext data buffer */
13 by Björn Påhlsson
Added following support:
466
  gpgme_data_release(dh_plain);
39 by Teddy Hogeborn
* plugins.d/mandosclient.c (pgp_packet_decrypt): Renamed variables.
467
  return plaintext_length;
13 by Björn Påhlsson
Added following support:
468
}
469
293 by Teddy Hogeborn
* plugin-runner.c: Whitespace changes only.
470
static const char * safer_gnutls_strerror(int value){
267 by Teddy Hogeborn
* plugins.d/mandos-client.c: Only comment changes.
471
  const char *ret = gnutls_strerror(value); /* Spurious warning from
472
					       -Wunreachable-code */
266 by Teddy Hogeborn
* plugin-runner.c: Only space changes.
473
  if(ret == NULL)
13 by Björn Påhlsson
Added following support:
474
    ret = "(unknown)";
475
  return ret;
476
}
477
40 by Teddy Hogeborn
* plugins.d/mandosclient.c (initgnutls): Moved "err" variable into its
478
/* GnuTLS log function callback */
36 by Teddy Hogeborn
* TODO: Converted to org-mode style
479
static void debuggnutls(__attribute__((unused)) int level,
480
			const char* string){
505.3.3 by teddy at bsnet
* plugins.d/mandos-client.c: Prefix all printouts with "Mandos plugin
481
  fprintf(stderr, "Mandos plugin mandos-client: GnuTLS: %s", string);
13 by Björn Påhlsson
Added following support:
482
}
483
24.1.134 by Björn Påhlsson
plugin-runner: Added support for empty string arguments
484
static int init_gnutls_global(const char *pubkeyfilename,
76 by Teddy Hogeborn
* plugins.d/password-request.c (init_gnutls_global): Renamed
485
			      const char *seckeyfilename){
13 by Björn Påhlsson
Added following support:
486
  int ret;
21 by Teddy Hogeborn
* Makefile (CFLAGS): Changed to use $(WARN), $(DEBUG), $(COVERAGE) and
487
  
15.1.1 by Björn Påhlsson
Added debugg support in form off --debug and --debug=mandosclient
488
  if(debug){
505.3.3 by teddy at bsnet
* plugins.d/mandos-client.c: Prefix all printouts with "Mandos plugin
489
    fprintf(stderr, "Mandos plugin mandos-client: "
490
	    "Initializing GnuTLS\n");
15.1.1 by Björn Påhlsson
Added debugg support in form off --debug and --debug=mandosclient
491
  }
24.1.29 by Björn Påhlsson
Added more header file comments
492
  
493
  ret = gnutls_global_init();
293 by Teddy Hogeborn
* plugin-runner.c: Whitespace changes only.
494
  if(ret != GNUTLS_E_SUCCESS){
505.3.3 by teddy at bsnet
* plugins.d/mandos-client.c: Prefix all printouts with "Mandos plugin
495
    fprintf(stderr, "Mandos plugin mandos-client: "
496
	    "GnuTLS global_init: %s\n", safer_gnutls_strerror(ret));
13 by Björn Påhlsson
Added following support:
497
    return -1;
498
  }
38 by Teddy Hogeborn
* plugbasedclient.c (main): New "--userid" and "--groupid" options.
499
  
266 by Teddy Hogeborn
* plugin-runner.c: Only space changes.
500
  if(debug){
40 by Teddy Hogeborn
* plugins.d/mandosclient.c (initgnutls): Moved "err" variable into its
501
    /* "Use a log level over 10 to enable all debugging options."
502
     * - GnuTLS manual
503
     */
15.1.1 by Björn Påhlsson
Added debugg support in form off --debug and --debug=mandosclient
504
    gnutls_global_set_log_level(11);
505
    gnutls_global_set_log_function(debuggnutls);
506
  }
507
  
40 by Teddy Hogeborn
* plugins.d/mandosclient.c (initgnutls): Moved "err" variable into its
508
  /* OpenPGP credentials */
484 by Teddy Hogeborn
* Makefile (plugins.d/mandos-client): Bug fix: Put $^ before all
509
  ret = gnutls_certificate_allocate_credentials(&mc.cred);
266 by Teddy Hogeborn
* plugin-runner.c: Only space changes.
510
  if(ret != GNUTLS_E_SUCCESS){
505.3.3 by teddy at bsnet
* plugins.d/mandos-client.c: Prefix all printouts with "Mandos plugin
511
    fprintf(stderr, "Mandos plugin mandos-client: "
512
	    "GnuTLS memory error: %s\n", safer_gnutls_strerror(ret));
266 by Teddy Hogeborn
* plugin-runner.c: Only space changes.
513
    gnutls_global_deinit();
13 by Björn Påhlsson
Added following support:
514
    return -1;
515
  }
21 by Teddy Hogeborn
* Makefile (CFLAGS): Changed to use $(WARN), $(DEBUG), $(COVERAGE) and
516
  
15.1.1 by Björn Påhlsson
Added debugg support in form off --debug and --debug=mandosclient
517
  if(debug){
505.3.3 by teddy at bsnet
* plugins.d/mandos-client.c: Prefix all printouts with "Mandos plugin
518
    fprintf(stderr, "Mandos plugin mandos-client: "
519
	    "Attempting to use OpenPGP public key %s and"
147 by Teddy Hogeborn
* plugins.d/password-request.c (init_gnutls_global): Improved wording
520
	    " secret key %s as GnuTLS credentials\n", pubkeyfilename,
76 by Teddy Hogeborn
* plugins.d/password-request.c (init_gnutls_global): Renamed
521
	    seckeyfilename);
15.1.1 by Björn Påhlsson
Added debugg support in form off --debug and --debug=mandosclient
522
  }
21 by Teddy Hogeborn
* Makefile (CFLAGS): Changed to use $(WARN), $(DEBUG), $(COVERAGE) and
523
  
13 by Björn Påhlsson
Added following support:
524
  ret = gnutls_certificate_set_openpgp_key_file
24.1.134 by Björn Påhlsson
plugin-runner: Added support for empty string arguments
525
    (mc.cred, pubkeyfilename, seckeyfilename,
76 by Teddy Hogeborn
* plugins.d/password-request.c (init_gnutls_global): Renamed
526
     GNUTLS_OPENPGP_FMT_BASE64);
293 by Teddy Hogeborn
* plugin-runner.c: Whitespace changes only.
527
  if(ret != GNUTLS_E_SUCCESS){
40 by Teddy Hogeborn
* plugins.d/mandosclient.c (initgnutls): Moved "err" variable into its
528
    fprintf(stderr,
505.3.3 by teddy at bsnet
* plugins.d/mandos-client.c: Prefix all printouts with "Mandos plugin
529
	    "Mandos plugin mandos-client: "
40 by Teddy Hogeborn
* plugins.d/mandosclient.c (initgnutls): Moved "err" variable into its
530
	    "Error[%d] while reading the OpenPGP key pair ('%s',"
76 by Teddy Hogeborn
* plugins.d/password-request.c (init_gnutls_global): Renamed
531
	    " '%s')\n", ret, pubkeyfilename, seckeyfilename);
505.3.3 by teddy at bsnet
* plugins.d/mandos-client.c: Prefix all printouts with "Mandos plugin
532
    fprintf(stderr, "Mandos plugin mandos-client: "
533
	    "The GnuTLS error is: %s\n", safer_gnutls_strerror(ret));
24.1.20 by Björn Påhlsson
mandosclient
534
    goto globalfail;
13 by Björn Påhlsson
Added following support:
535
  }
21 by Teddy Hogeborn
* Makefile (CFLAGS): Changed to use $(WARN), $(DEBUG), $(COVERAGE) and
536
  
40 by Teddy Hogeborn
* plugins.d/mandosclient.c (initgnutls): Moved "err" variable into its
537
  /* GnuTLS server initialization */
24.1.134 by Björn Påhlsson
plugin-runner: Added support for empty string arguments
538
  ret = gnutls_dh_params_init(&mc.dh_params);
293 by Teddy Hogeborn
* plugin-runner.c: Whitespace changes only.
539
  if(ret != GNUTLS_E_SUCCESS){
505.3.3 by teddy at bsnet
* plugins.d/mandos-client.c: Prefix all printouts with "Mandos plugin
540
    fprintf(stderr, "Mandos plugin mandos-client: "
541
	    "Error in GnuTLS DH parameter initialization:"
266 by Teddy Hogeborn
* plugin-runner.c: Only space changes.
542
	    " %s\n", safer_gnutls_strerror(ret));
24.1.20 by Björn Påhlsson
mandosclient
543
    goto globalfail;
13 by Björn Påhlsson
Added following support:
544
  }
24.1.134 by Björn Påhlsson
plugin-runner: Added support for empty string arguments
545
  ret = gnutls_dh_params_generate2(mc.dh_params, mc.dh_bits);
293 by Teddy Hogeborn
* plugin-runner.c: Whitespace changes only.
546
  if(ret != GNUTLS_E_SUCCESS){
505.3.3 by teddy at bsnet
* plugins.d/mandos-client.c: Prefix all printouts with "Mandos plugin
547
    fprintf(stderr, "Mandos plugin mandos-client: "
548
	    "Error in GnuTLS prime generation: %s\n",
266 by Teddy Hogeborn
* plugin-runner.c: Only space changes.
549
	    safer_gnutls_strerror(ret));
24.1.20 by Björn Påhlsson
mandosclient
550
    goto globalfail;
13 by Björn Påhlsson
Added following support:
551
  }
21 by Teddy Hogeborn
* Makefile (CFLAGS): Changed to use $(WARN), $(DEBUG), $(COVERAGE) and
552
  
24.1.134 by Björn Påhlsson
plugin-runner: Added support for empty string arguments
553
  gnutls_certificate_set_dh_params(mc.cred, mc.dh_params);
143 by Teddy Hogeborn
* Makefile (mandos.8): Add dependency on "overview.xml" and
554
  
24.1.13 by Björn Påhlsson
mandosclient
555
  return 0;
143 by Teddy Hogeborn
* Makefile (mandos.8): Add dependency on "overview.xml" and
556
  
24.1.20 by Björn Påhlsson
mandosclient
557
 globalfail:
143 by Teddy Hogeborn
* Makefile (mandos.8): Add dependency on "overview.xml" and
558
  
24.1.134 by Björn Påhlsson
plugin-runner: Added support for empty string arguments
559
  gnutls_certificate_free_credentials(mc.cred);
24.1.26 by Björn Påhlsson
tally count of used symbols
560
  gnutls_global_deinit();
24.1.134 by Björn Påhlsson
plugin-runner: Added support for empty string arguments
561
  gnutls_dh_params_deinit(mc.dh_params);
24.1.20 by Björn Påhlsson
mandosclient
562
  return -1;
24.1.13 by Björn Påhlsson
mandosclient
563
}
564
24.1.134 by Björn Påhlsson
plugin-runner: Added support for empty string arguments
565
static int init_gnutls_session(gnutls_session_t *session){
24.1.13 by Björn Påhlsson
mandosclient
566
  int ret;
40 by Teddy Hogeborn
* plugins.d/mandosclient.c (initgnutls): Moved "err" variable into its
567
  /* GnuTLS session creation */
368 by Teddy Hogeborn
* plugins.d/mandos-client.c (init_gnutls_session): Retry interrupted
568
  do {
569
    ret = gnutls_init(session, GNUTLS_SERVER);
371 by Teddy Hogeborn
* plugins.d/mandos-client.c (init_gnutls_session): Always fail and
570
    if(quit_now){
571
      return -1;
572
    }
368 by Teddy Hogeborn
* plugins.d/mandos-client.c (init_gnutls_session): Retry interrupted
573
  } while(ret == GNUTLS_E_INTERRUPTED or ret == GNUTLS_E_AGAIN);
266 by Teddy Hogeborn
* plugin-runner.c: Only space changes.
574
  if(ret != GNUTLS_E_SUCCESS){
505.3.3 by teddy at bsnet
* plugins.d/mandos-client.c: Prefix all printouts with "Mandos plugin
575
    fprintf(stderr, "Mandos plugin mandos-client: "
576
	    "Error in GnuTLS session initialization: %s\n",
13 by Björn Påhlsson
Added following support:
577
	    safer_gnutls_strerror(ret));
578
  }
21 by Teddy Hogeborn
* Makefile (CFLAGS): Changed to use $(WARN), $(DEBUG), $(COVERAGE) and
579
  
40 by Teddy Hogeborn
* plugins.d/mandosclient.c (initgnutls): Moved "err" variable into its
580
  {
581
    const char *err;
368 by Teddy Hogeborn
* plugins.d/mandos-client.c (init_gnutls_session): Retry interrupted
582
    do {
583
      ret = gnutls_priority_set_direct(*session, mc.priority, &err);
371 by Teddy Hogeborn
* plugins.d/mandos-client.c (init_gnutls_session): Always fail and
584
      if(quit_now){
585
	gnutls_deinit(*session);
586
	return -1;
587
      }
368 by Teddy Hogeborn
* plugins.d/mandos-client.c (init_gnutls_session): Retry interrupted
588
    } while(ret == GNUTLS_E_INTERRUPTED or ret == GNUTLS_E_AGAIN);
293 by Teddy Hogeborn
* plugin-runner.c: Whitespace changes only.
589
    if(ret != GNUTLS_E_SUCCESS){
505.3.3 by teddy at bsnet
* plugins.d/mandos-client.c: Prefix all printouts with "Mandos plugin
590
      fprintf(stderr, "Mandos plugin mandos-client: "
591
	      "Syntax error at: %s\n", err);
592
      fprintf(stderr, "Mandos plugin mandos-client: "
593
	      "GnuTLS error: %s\n", safer_gnutls_strerror(ret));
266 by Teddy Hogeborn
* plugin-runner.c: Only space changes.
594
      gnutls_deinit(*session);
40 by Teddy Hogeborn
* plugins.d/mandosclient.c (initgnutls): Moved "err" variable into its
595
      return -1;
596
    }
13 by Björn Påhlsson
Added following support:
597
  }
21 by Teddy Hogeborn
* Makefile (CFLAGS): Changed to use $(WARN), $(DEBUG), $(COVERAGE) and
598
  
368 by Teddy Hogeborn
* plugins.d/mandos-client.c (init_gnutls_session): Retry interrupted
599
  do {
600
    ret = gnutls_credentials_set(*session, GNUTLS_CRD_CERTIFICATE,
601
				 mc.cred);
371 by Teddy Hogeborn
* plugins.d/mandos-client.c (init_gnutls_session): Always fail and
602
    if(quit_now){
603
      gnutls_deinit(*session);
604
      return -1;
605
    }
368 by Teddy Hogeborn
* plugins.d/mandos-client.c (init_gnutls_session): Retry interrupted
606
  } while(ret == GNUTLS_E_INTERRUPTED or ret == GNUTLS_E_AGAIN);
293 by Teddy Hogeborn
* plugin-runner.c: Whitespace changes only.
607
  if(ret != GNUTLS_E_SUCCESS){
505.3.3 by teddy at bsnet
* plugins.d/mandos-client.c: Prefix all printouts with "Mandos plugin
608
    fprintf(stderr, "Mandos plugin mandos-client: "
609
	    "Error setting GnuTLS credentials: %s\n",
13 by Björn Påhlsson
Added following support:
610
	    safer_gnutls_strerror(ret));
266 by Teddy Hogeborn
* plugin-runner.c: Only space changes.
611
    gnutls_deinit(*session);
13 by Björn Påhlsson
Added following support:
612
    return -1;
613
  }
21 by Teddy Hogeborn
* Makefile (CFLAGS): Changed to use $(WARN), $(DEBUG), $(COVERAGE) and
614
  
13 by Björn Påhlsson
Added following support:
615
  /* ignore client certificate if any. */
368 by Teddy Hogeborn
* plugins.d/mandos-client.c (init_gnutls_session): Retry interrupted
616
  gnutls_certificate_server_set_request(*session, GNUTLS_CERT_IGNORE);
13 by Björn Påhlsson
Added following support:
617
  
24.1.134 by Björn Påhlsson
plugin-runner: Added support for empty string arguments
618
  gnutls_dh_set_prime_bits(*session, mc.dh_bits);
13 by Björn Påhlsson
Added following support:
619
  
620
  return 0;
621
}
622
40 by Teddy Hogeborn
* plugins.d/mandosclient.c (initgnutls): Moved "err" variable into its
623
/* Avahi log function callback */
36 by Teddy Hogeborn
* TODO: Converted to org-mode style
624
static void empty_log(__attribute__((unused)) AvahiLogLevel level,
625
		      __attribute__((unused)) const char *txt){}
13 by Björn Påhlsson
Added following support:
626
40 by Teddy Hogeborn
* plugins.d/mandosclient.c (initgnutls): Moved "err" variable into its
627
/* Called when a Mandos server is found */
36 by Teddy Hogeborn
* TODO: Converted to org-mode style
628
static int start_mandos_communication(const char *ip, uint16_t port,
24.1.9 by Björn Påhlsson
not working midwork...
629
				      AvahiIfIndex if_index,
24.1.134 by Björn Påhlsson
plugin-runner: Added support for empty string arguments
630
				      int af){
358 by Teddy Hogeborn
* plugins.d/mandos-client.c (start_mandos_communication): Check
631
  int ret, tcp_sd = -1;
257.1.2 by Mooie
Fixed warnings in the 64 bit build. Added explicit cast to int for
632
  ssize_t sret;
304 by Teddy Hogeborn
Four new interrelated features:
633
  union {
634
    struct sockaddr_in in;
635
    struct sockaddr_in6 in6;
636
  } to;
13 by Björn Påhlsson
Added following support:
637
  char *buffer = NULL;
372 by Teddy Hogeborn
* plugins.d/mandos-client.c (start_mandos_communication): Bug fix:
638
  char *decrypted_buffer = NULL;
13 by Björn Påhlsson
Added following support:
639
  size_t buffer_length = 0;
640
  size_t buffer_capacity = 0;
24.1.10 by Björn Påhlsson
merge commit
641
  size_t written;
372 by Teddy Hogeborn
* plugins.d/mandos-client.c (start_mandos_communication): Bug fix:
642
  int retval = -1;
38 by Teddy Hogeborn
* plugbasedclient.c (main): New "--userid" and "--groupid" options.
643
  gnutls_session_t session;
304 by Teddy Hogeborn
Four new interrelated features:
644
  int pf;			/* Protocol family */
645
  
399 by Teddy Hogeborn
* Makefile (BROKEN_PIE): Add comment.
646
  errno = 0;
647
  
358 by Teddy Hogeborn
* plugins.d/mandos-client.c (start_mandos_communication): Check
648
  if(quit_now){
399 by Teddy Hogeborn
* Makefile (BROKEN_PIE): Add comment.
649
    errno = EINTR;
358 by Teddy Hogeborn
* plugins.d/mandos-client.c (start_mandos_communication): Check
650
    return -1;
651
  }
652
  
304 by Teddy Hogeborn
Four new interrelated features:
653
  switch(af){
654
  case AF_INET6:
655
    pf = PF_INET6;
656
    break;
657
  case AF_INET:
658
    pf = PF_INET;
659
    break;
660
  default:
505.3.3 by teddy at bsnet
* plugins.d/mandos-client.c: Prefix all printouts with "Mandos plugin
661
    fprintf(stderr, "Mandos plugin mandos-client: "
662
	    "Bad address family: %d\n", af);
399 by Teddy Hogeborn
* Makefile (BROKEN_PIE): Add comment.
663
    errno = EINVAL;
304 by Teddy Hogeborn
Four new interrelated features:
664
    return -1;
665
  }
21 by Teddy Hogeborn
* Makefile (CFLAGS): Changed to use $(WARN), $(DEBUG), $(COVERAGE) and
666
  
24.1.134 by Björn Påhlsson
plugin-runner: Added support for empty string arguments
667
  ret = init_gnutls_session(&session);
266 by Teddy Hogeborn
* plugin-runner.c: Only space changes.
668
  if(ret != 0){
40 by Teddy Hogeborn
* plugins.d/mandosclient.c (initgnutls): Moved "err" variable into its
669
    return -1;
670
  }
671
  
15.1.1 by Björn Påhlsson
Added debugg support in form off --debug and --debug=mandosclient
672
  if(debug){
505.3.3 by teddy at bsnet
* plugins.d/mandos-client.c: Prefix all printouts with "Mandos plugin
673
    fprintf(stderr, "Mandos plugin mandos-client: "
674
	    "Setting up a TCP connection to %s, port %" PRIu16
60 by Teddy Hogeborn
* mandos-client.c (main): Cast pid_t to unsigned int before printing.
675
	    "\n", ip, port);
15.1.1 by Björn Påhlsson
Added debugg support in form off --debug and --debug=mandosclient
676
  }
13 by Björn Påhlsson
Added following support:
677
  
304 by Teddy Hogeborn
Four new interrelated features:
678
  tcp_sd = socket(pf, SOCK_STREAM, 0);
293 by Teddy Hogeborn
* plugin-runner.c: Whitespace changes only.
679
  if(tcp_sd < 0){
399 by Teddy Hogeborn
* Makefile (BROKEN_PIE): Add comment.
680
    int e = errno;
24.1.174 by Björn Påhlsson
* Makefile (CFLAGS): Added "-lrt" to include real time library.
681
    perror_plus("socket");
399 by Teddy Hogeborn
* Makefile (BROKEN_PIE): Add comment.
682
    errno = e;
358 by Teddy Hogeborn
* plugins.d/mandos-client.c (start_mandos_communication): Check
683
    goto mandos_end;
684
  }
685
  
686
  if(quit_now){
399 by Teddy Hogeborn
* Makefile (BROKEN_PIE): Add comment.
687
    errno = EINTR;
358 by Teddy Hogeborn
* plugins.d/mandos-client.c (start_mandos_communication): Check
688
    goto mandos_end;
13 by Björn Påhlsson
Added following support:
689
  }
143 by Teddy Hogeborn
* Makefile (mandos.8): Add dependency on "overview.xml" and
690
  
84 by Teddy Hogeborn
* Makefile (DOCBOOKTOMAN): Use the local manpages/docbook.xsl file, do
691
  memset(&to, 0, sizeof(to));
304 by Teddy Hogeborn
Four new interrelated features:
692
  if(af == AF_INET6){
325 by Teddy Hogeborn
* plugins.d/mandos-client.c (start_mandos_communication): "sin6_family"
693
    to.in6.sin6_family = (sa_family_t)af;
304 by Teddy Hogeborn
Four new interrelated features:
694
    ret = inet_pton(af, ip, &to.in6.sin6_addr);
695
  } else {			/* IPv4 */
696
    to.in.sin_family = (sa_family_t)af;
697
    ret = inet_pton(af, ip, &to.in.sin_addr);
698
  }
266 by Teddy Hogeborn
* plugin-runner.c: Only space changes.
699
  if(ret < 0 ){
399 by Teddy Hogeborn
* Makefile (BROKEN_PIE): Add comment.
700
    int e = errno;
24.1.174 by Björn Påhlsson
* Makefile (CFLAGS): Added "-lrt" to include real time library.
701
    perror_plus("inet_pton");
399 by Teddy Hogeborn
* Makefile (BROKEN_PIE): Add comment.
702
    errno = e;
358 by Teddy Hogeborn
* plugins.d/mandos-client.c (start_mandos_communication): Check
703
    goto mandos_end;
38 by Teddy Hogeborn
* plugbasedclient.c (main): New "--userid" and "--groupid" options.
704
  }
13 by Björn Påhlsson
Added following support:
705
  if(ret == 0){
399 by Teddy Hogeborn
* Makefile (BROKEN_PIE): Add comment.
706
    int e = errno;
505.3.3 by teddy at bsnet
* plugins.d/mandos-client.c: Prefix all printouts with "Mandos plugin
707
    fprintf(stderr, "Mandos plugin mandos-client: "
708
	    "Bad address: %s\n", ip);
399 by Teddy Hogeborn
* Makefile (BROKEN_PIE): Add comment.
709
    errno = e;
358 by Teddy Hogeborn
* plugins.d/mandos-client.c (start_mandos_communication): Check
710
    goto mandos_end;
13 by Björn Påhlsson
Added following support:
711
  }
304 by Teddy Hogeborn
Four new interrelated features:
712
  if(af == AF_INET6){
713
    to.in6.sin6_port = htons(port); /* Spurious warnings from
714
				       -Wconversion and
715
				       -Wunreachable-code */
716
    
717
    if(IN6_IS_ADDR_LINKLOCAL /* Spurious warnings from */
718
       (&to.in6.sin6_addr)){ /* -Wstrict-aliasing=2 or lower and
505.3.6 by teddy at bsnet
* plugins.d/mandos-client.c: Some white space fixes.
719
				-Wunreachable-code*/
304 by Teddy Hogeborn
Four new interrelated features:
720
      if(if_index == AVAHI_IF_UNSPEC){
505.3.3 by teddy at bsnet
* plugins.d/mandos-client.c: Prefix all printouts with "Mandos plugin
721
	fprintf(stderr, "Mandos plugin mandos-client: "
722
		"An IPv6 link-local address is incomplete"
304 by Teddy Hogeborn
Four new interrelated features:
723
		" without a network interface\n");
399 by Teddy Hogeborn
* Makefile (BROKEN_PIE): Add comment.
724
	errno = EINVAL;
358 by Teddy Hogeborn
* plugins.d/mandos-client.c (start_mandos_communication): Check
725
	goto mandos_end;
304 by Teddy Hogeborn
Four new interrelated features:
726
      }
727
      /* Set the network interface number as scope */
728
      to.in6.sin6_scope_id = (uint32_t)if_index;
729
    }
730
  } else {
731
    to.in.sin_port = htons(port); /* Spurious warnings from
267 by Teddy Hogeborn
* plugins.d/mandos-client.c: Only comment changes.
732
				     -Wconversion and
733
				     -Wunreachable-code */
304 by Teddy Hogeborn
Four new interrelated features:
734
  }
21 by Teddy Hogeborn
* Makefile (CFLAGS): Changed to use $(WARN), $(DEBUG), $(COVERAGE) and
735
  
358 by Teddy Hogeborn
* plugins.d/mandos-client.c (start_mandos_communication): Check
736
  if(quit_now){
399 by Teddy Hogeborn
* Makefile (BROKEN_PIE): Add comment.
737
    errno = EINTR;
358 by Teddy Hogeborn
* plugins.d/mandos-client.c (start_mandos_communication): Check
738
    goto mandos_end;
739
  }
740
  
15.1.1 by Björn Påhlsson
Added debugg support in form off --debug and --debug=mandosclient
741
  if(debug){
304 by Teddy Hogeborn
Four new interrelated features:
742
    if(af == AF_INET6 and if_index != AVAHI_IF_UNSPEC){
743
      char interface[IF_NAMESIZE];
744
      if(if_indextoname((unsigned int)if_index, interface) == NULL){
24.1.174 by Björn Påhlsson
* Makefile (CFLAGS): Added "-lrt" to include real time library.
745
	perror_plus("if_indextoname");
304 by Teddy Hogeborn
Four new interrelated features:
746
      } else {
505.3.3 by teddy at bsnet
* plugins.d/mandos-client.c: Prefix all printouts with "Mandos plugin
747
	fprintf(stderr, "Mandos plugin mandos-client: "
748
		"Connection to: %s%%%s, port %" PRIu16 "\n",
304 by Teddy Hogeborn
Four new interrelated features:
749
		ip, interface, port);
750
      }
751
    } else {
505.3.3 by teddy at bsnet
* plugins.d/mandos-client.c: Prefix all printouts with "Mandos plugin
752
      fprintf(stderr, "Mandos plugin mandos-client: "
753
	      "Connection to: %s, port %" PRIu16 "\n", ip, port);
304 by Teddy Hogeborn
Four new interrelated features:
754
    }
755
    char addrstr[(INET_ADDRSTRLEN > INET6_ADDRSTRLEN) ?
756
		 INET_ADDRSTRLEN : INET6_ADDRSTRLEN] = "";
757
    const char *pcret;
758
    if(af == AF_INET6){
759
      pcret = inet_ntop(af, &(to.in6.sin6_addr), addrstr,
760
			sizeof(addrstr));
761
    } else {
762
      pcret = inet_ntop(af, &(to.in.sin_addr), addrstr,
763
			sizeof(addrstr));
764
    }
765
    if(pcret == NULL){
24.1.174 by Björn Påhlsson
* Makefile (CFLAGS): Added "-lrt" to include real time library.
766
      perror_plus("inet_ntop");
37 by Teddy Hogeborn
Non-tested commit for merge purposes.
767
    } else {
768
      if(strcmp(addrstr, ip) != 0){
505.3.3 by teddy at bsnet
* plugins.d/mandos-client.c: Prefix all printouts with "Mandos plugin
769
	fprintf(stderr, "Mandos plugin mandos-client: "
770
		"Canonical address form: %s\n", addrstr);
37 by Teddy Hogeborn
Non-tested commit for merge purposes.
771
      }
772
    }
15.1.1 by Björn Påhlsson
Added debugg support in form off --debug and --debug=mandosclient
773
  }
13 by Björn Påhlsson
Added following support:
774
  
358 by Teddy Hogeborn
* plugins.d/mandos-client.c (start_mandos_communication): Check
775
  if(quit_now){
399 by Teddy Hogeborn
* Makefile (BROKEN_PIE): Add comment.
776
    errno = EINTR;
358 by Teddy Hogeborn
* plugins.d/mandos-client.c (start_mandos_communication): Check
777
    goto mandos_end;
778
  }
779
  
304 by Teddy Hogeborn
Four new interrelated features:
780
  if(af == AF_INET6){
781
    ret = connect(tcp_sd, &to.in6, sizeof(to));
782
  } else {
783
    ret = connect(tcp_sd, &to.in, sizeof(to)); /* IPv4 */
784
  }
266 by Teddy Hogeborn
* plugin-runner.c: Only space changes.
785
  if(ret < 0){
24.1.163 by Björn Påhlsson
mandos-client: Added never ending loop for --connect
786
    if ((errno != ECONNREFUSED and errno != ENETUNREACH) or debug){
787
      int e = errno;
24.1.174 by Björn Påhlsson
* Makefile (CFLAGS): Added "-lrt" to include real time library.
788
      perror_plus("connect");
24.1.163 by Björn Påhlsson
mandos-client: Added never ending loop for --connect
789
      errno = e;
790
    }
358 by Teddy Hogeborn
* plugins.d/mandos-client.c (start_mandos_communication): Check
791
    goto mandos_end;
792
  }
793
  
794
  if(quit_now){
399 by Teddy Hogeborn
* Makefile (BROKEN_PIE): Add comment.
795
    errno = EINTR;
358 by Teddy Hogeborn
* plugins.d/mandos-client.c (start_mandos_communication): Check
796
    goto mandos_end;
13 by Björn Påhlsson
Added following support:
797
  }
143 by Teddy Hogeborn
* Makefile (mandos.8): Add dependency on "overview.xml" and
798
  
24.1.12 by Björn Påhlsson
merge +
799
  const char *out = mandos_protocol_version;
24.1.10 by Björn Påhlsson
merge commit
800
  written = 0;
266 by Teddy Hogeborn
* plugin-runner.c: Only space changes.
801
  while(true){
24.1.10 by Björn Påhlsson
merge commit
802
    size_t out_size = strlen(out);
257.1.2 by Mooie
Fixed warnings in the 64 bit build. Added explicit cast to int for
803
    ret = (int)TEMP_FAILURE_RETRY(write(tcp_sd, out + written,
505.3.6 by teddy at bsnet
* plugins.d/mandos-client.c: Some white space fixes.
804
					out_size - written));
266 by Teddy Hogeborn
* plugin-runner.c: Only space changes.
805
    if(ret == -1){
399 by Teddy Hogeborn
* Makefile (BROKEN_PIE): Add comment.
806
      int e = errno;
24.1.174 by Björn Påhlsson
* Makefile (CFLAGS): Added "-lrt" to include real time library.
807
      perror_plus("write");
399 by Teddy Hogeborn
* Makefile (BROKEN_PIE): Add comment.
808
      errno = e;
24.1.12 by Björn Påhlsson
merge +
809
      goto mandos_end;
24.1.10 by Björn Påhlsson
merge commit
810
    }
24.1.12 by Björn Påhlsson
merge +
811
    written += (size_t)ret;
24.1.10 by Björn Påhlsson
merge commit
812
    if(written < out_size){
813
      continue;
814
    } else {
266 by Teddy Hogeborn
* plugin-runner.c: Only space changes.
815
      if(out == mandos_protocol_version){
24.1.10 by Björn Påhlsson
merge commit
816
	written = 0;
817
	out = "\r\n";
818
      } else {
819
	break;
820
      }
821
    }
358 by Teddy Hogeborn
* plugins.d/mandos-client.c (start_mandos_communication): Check
822
  
823
    if(quit_now){
399 by Teddy Hogeborn
* Makefile (BROKEN_PIE): Add comment.
824
      errno = EINTR;
358 by Teddy Hogeborn
* plugins.d/mandos-client.c (start_mandos_communication): Check
825
      goto mandos_end;
826
    }
24.1.10 by Björn Påhlsson
merge commit
827
  }
143 by Teddy Hogeborn
* Makefile (mandos.8): Add dependency on "overview.xml" and
828
  
40 by Teddy Hogeborn
* plugins.d/mandosclient.c (initgnutls): Moved "err" variable into its
829
  if(debug){
505.3.3 by teddy at bsnet
* plugins.d/mandos-client.c: Prefix all printouts with "Mandos plugin
830
    fprintf(stderr, "Mandos plugin mandos-client: "
831
	    "Establishing TLS session with %s\n", ip);
15.1.1 by Björn Påhlsson
Added debugg support in form off --debug and --debug=mandosclient
832
  }
21 by Teddy Hogeborn
* Makefile (CFLAGS): Changed to use $(WARN), $(DEBUG), $(COVERAGE) and
833
  
358 by Teddy Hogeborn
* plugins.d/mandos-client.c (start_mandos_communication): Check
834
  if(quit_now){
399 by Teddy Hogeborn
* Makefile (BROKEN_PIE): Add comment.
835
    errno = EINTR;
358 by Teddy Hogeborn
* plugins.d/mandos-client.c (start_mandos_communication): Check
836
    goto mandos_end;
837
  }
838
  
485 by Teddy Hogeborn
Merge from Björn.
839
  /* Spurious warning from -Wint-to-pointer-cast */
266 by Teddy Hogeborn
* plugin-runner.c: Only space changes.
840
  gnutls_transport_set_ptr(session, (gnutls_transport_ptr_t) tcp_sd);
143 by Teddy Hogeborn
* Makefile (mandos.8): Add dependency on "overview.xml" and
841
  
358 by Teddy Hogeborn
* plugins.d/mandos-client.c (start_mandos_communication): Check
842
  if(quit_now){
399 by Teddy Hogeborn
* Makefile (BROKEN_PIE): Add comment.
843
    errno = EINTR;
358 by Teddy Hogeborn
* plugins.d/mandos-client.c (start_mandos_communication): Check
844
    goto mandos_end;
845
  }
846
  
363 by Teddy Hogeborn
* plugin-runner.c: Minor stylistic changes.
847
  do {
266 by Teddy Hogeborn
* plugin-runner.c: Only space changes.
848
    ret = gnutls_handshake(session);
358 by Teddy Hogeborn
* plugins.d/mandos-client.c (start_mandos_communication): Check
849
    if(quit_now){
399 by Teddy Hogeborn
* Makefile (BROKEN_PIE): Add comment.
850
      errno = EINTR;
358 by Teddy Hogeborn
* plugins.d/mandos-client.c (start_mandos_communication): Check
851
      goto mandos_end;
852
    }
24.1.29 by Björn Påhlsson
Added more header file comments
853
  } while(ret == GNUTLS_E_AGAIN or ret == GNUTLS_E_INTERRUPTED);
13 by Björn Påhlsson
Added following support:
854
  
266 by Teddy Hogeborn
* plugin-runner.c: Only space changes.
855
  if(ret != GNUTLS_E_SUCCESS){
25 by Teddy Hogeborn
* mandos-clients.conf ([DEFAULT]): New section.
856
    if(debug){
505.3.3 by teddy at bsnet
* plugins.d/mandos-client.c: Prefix all printouts with "Mandos plugin
857
      fprintf(stderr, "Mandos plugin mandos-client: "
858
	      "*** GnuTLS Handshake failed ***\n");
266 by Teddy Hogeborn
* plugin-runner.c: Only space changes.
859
      gnutls_perror(ret);
25 by Teddy Hogeborn
* mandos-clients.conf ([DEFAULT]): New section.
860
    }
399 by Teddy Hogeborn
* Makefile (BROKEN_PIE): Add comment.
861
    errno = EPROTO;
40 by Teddy Hogeborn
* plugins.d/mandosclient.c (initgnutls): Moved "err" variable into its
862
    goto mandos_end;
13 by Björn Påhlsson
Added following support:
863
  }
21 by Teddy Hogeborn
* Makefile (CFLAGS): Changed to use $(WARN), $(DEBUG), $(COVERAGE) and
864
  
40 by Teddy Hogeborn
* plugins.d/mandosclient.c (initgnutls): Moved "err" variable into its
865
  /* Read OpenPGP packet that contains the wanted password */
21 by Teddy Hogeborn
* Makefile (CFLAGS): Changed to use $(WARN), $(DEBUG), $(COVERAGE) and
866
  
15.1.1 by Björn Påhlsson
Added debugg support in form off --debug and --debug=mandosclient
867
  if(debug){
505.3.3 by teddy at bsnet
* plugins.d/mandos-client.c: Prefix all printouts with "Mandos plugin
868
    fprintf(stderr, "Mandos plugin mandos-client: "
869
	    "Retrieving OpenPGP encrypted password from %s\n", ip);
15.1.1 by Björn Påhlsson
Added debugg support in form off --debug and --debug=mandosclient
870
  }
143 by Teddy Hogeborn
* Makefile (mandos.8): Add dependency on "overview.xml" and
871
  
13 by Björn Påhlsson
Added following support:
872
  while(true){
358 by Teddy Hogeborn
* plugins.d/mandos-client.c (start_mandos_communication): Check
873
    
874
    if(quit_now){
399 by Teddy Hogeborn
* Makefile (BROKEN_PIE): Add comment.
875
      errno = EINTR;
358 by Teddy Hogeborn
* plugins.d/mandos-client.c (start_mandos_communication): Check
876
      goto mandos_end;
877
    }
878
    
24.1.132 by Björn Påhlsson
Fixed a bug in fallback handling
879
    buffer_capacity = incbuffer(&buffer, buffer_length,
505.3.6 by teddy at bsnet
* plugins.d/mandos-client.c: Some white space fixes.
880
				buffer_capacity);
266 by Teddy Hogeborn
* plugin-runner.c: Only space changes.
881
    if(buffer_capacity == 0){
399 by Teddy Hogeborn
* Makefile (BROKEN_PIE): Add comment.
882
      int e = errno;
24.1.174 by Björn Påhlsson
* Makefile (CFLAGS): Added "-lrt" to include real time library.
883
      perror_plus("incbuffer");
399 by Teddy Hogeborn
* Makefile (BROKEN_PIE): Add comment.
884
      errno = e;
24.1.12 by Björn Påhlsson
merge +
885
      goto mandos_end;
13 by Björn Påhlsson
Added following support:
886
    }
887
    
358 by Teddy Hogeborn
* plugins.d/mandos-client.c (start_mandos_communication): Check
888
    if(quit_now){
399 by Teddy Hogeborn
* Makefile (BROKEN_PIE): Add comment.
889
      errno = EINTR;
358 by Teddy Hogeborn
* plugins.d/mandos-client.c (start_mandos_communication): Check
890
      goto mandos_end;
891
    }
892
    
257.1.2 by Mooie
Fixed warnings in the 64 bit build. Added explicit cast to int for
893
    sret = gnutls_record_recv(session, buffer+buffer_length,
894
			      BUFFER_SIZE);
266 by Teddy Hogeborn
* plugin-runner.c: Only space changes.
895
    if(sret == 0){
13 by Björn Påhlsson
Added following support:
896
      break;
897
    }
266 by Teddy Hogeborn
* plugin-runner.c: Only space changes.
898
    if(sret < 0){
257.1.2 by Mooie
Fixed warnings in the 64 bit build. Added explicit cast to int for
899
      switch(sret){
13 by Björn Påhlsson
Added following support:
900
      case GNUTLS_E_INTERRUPTED:
901
      case GNUTLS_E_AGAIN:
902
	break;
903
      case GNUTLS_E_REHANDSHAKE:
363 by Teddy Hogeborn
* plugin-runner.c: Minor stylistic changes.
904
	do {
266 by Teddy Hogeborn
* plugin-runner.c: Only space changes.
905
	  ret = gnutls_handshake(session);
358 by Teddy Hogeborn
* plugins.d/mandos-client.c (start_mandos_communication): Check
906
	  
907
	  if(quit_now){
399 by Teddy Hogeborn
* Makefile (BROKEN_PIE): Add comment.
908
	    errno = EINTR;
358 by Teddy Hogeborn
* plugins.d/mandos-client.c (start_mandos_communication): Check
909
	    goto mandos_end;
910
	  }
24.1.29 by Björn Påhlsson
Added more header file comments
911
	} while(ret == GNUTLS_E_AGAIN or ret == GNUTLS_E_INTERRUPTED);
266 by Teddy Hogeborn
* plugin-runner.c: Only space changes.
912
	if(ret < 0){
505.3.3 by teddy at bsnet
* plugins.d/mandos-client.c: Prefix all printouts with "Mandos plugin
913
	  fprintf(stderr, "Mandos plugin mandos-client: "
914
		  "*** GnuTLS Re-handshake failed ***\n");
266 by Teddy Hogeborn
* plugin-runner.c: Only space changes.
915
	  gnutls_perror(ret);
399 by Teddy Hogeborn
* Makefile (BROKEN_PIE): Add comment.
916
	  errno = EPROTO;
40 by Teddy Hogeborn
* plugins.d/mandosclient.c (initgnutls): Moved "err" variable into its
917
	  goto mandos_end;
13 by Björn Påhlsson
Added following support:
918
	}
919
	break;
920
      default:
505.3.3 by teddy at bsnet
* plugins.d/mandos-client.c: Prefix all printouts with "Mandos plugin
921
	fprintf(stderr, "Mandos plugin mandos-client: "
922
		"Unknown error while reading data from"
40 by Teddy Hogeborn
* plugins.d/mandosclient.c (initgnutls): Moved "err" variable into its
923
		" encrypted session with Mandos server\n");
266 by Teddy Hogeborn
* plugin-runner.c: Only space changes.
924
	gnutls_bye(session, GNUTLS_SHUT_RDWR);
399 by Teddy Hogeborn
* Makefile (BROKEN_PIE): Add comment.
925
	errno = EIO;
40 by Teddy Hogeborn
* plugins.d/mandosclient.c (initgnutls): Moved "err" variable into its
926
	goto mandos_end;
13 by Björn Påhlsson
Added following support:
927
      }
928
    } else {
257.1.2 by Mooie
Fixed warnings in the 64 bit build. Added explicit cast to int for
929
      buffer_length += (size_t) sret;
13 by Björn Påhlsson
Added following support:
930
    }
931
  }
15.1.1 by Björn Påhlsson
Added debugg support in form off --debug and --debug=mandosclient
932
  
40 by Teddy Hogeborn
* plugins.d/mandosclient.c (initgnutls): Moved "err" variable into its
933
  if(debug){
505.3.3 by teddy at bsnet
* plugins.d/mandos-client.c: Prefix all printouts with "Mandos plugin
934
    fprintf(stderr, "Mandos plugin mandos-client: "
935
	    "Closing TLS session\n");
40 by Teddy Hogeborn
* plugins.d/mandosclient.c (initgnutls): Moved "err" variable into its
936
  }
937
  
358 by Teddy Hogeborn
* plugins.d/mandos-client.c (start_mandos_communication): Check
938
  if(quit_now){
399 by Teddy Hogeborn
* Makefile (BROKEN_PIE): Add comment.
939
    errno = EINTR;
371 by Teddy Hogeborn
* plugins.d/mandos-client.c (init_gnutls_session): Always fail and
940
    goto mandos_end;
941
  }
942
  
943
  do {
944
    ret = gnutls_bye(session, GNUTLS_SHUT_RDWR);
945
    if(quit_now){
399 by Teddy Hogeborn
* Makefile (BROKEN_PIE): Add comment.
946
      errno = EINTR;
371 by Teddy Hogeborn
* plugins.d/mandos-client.c (init_gnutls_session): Always fail and
947
      goto mandos_end;
948
    }
949
  } while(ret == GNUTLS_E_AGAIN or ret == GNUTLS_E_INTERRUPTED);
358 by Teddy Hogeborn
* plugins.d/mandos-client.c (start_mandos_communication): Check
950
  
266 by Teddy Hogeborn
* plugin-runner.c: Only space changes.
951
  if(buffer_length > 0){
362 by Teddy Hogeborn
* plugin-runner.c (getplugin, add_environment, main): Handle EINTR
952
    ssize_t decrypted_buffer_size;
505.3.6 by teddy at bsnet
* plugins.d/mandos-client.c: Some white space fixes.
953
    decrypted_buffer_size = pgp_packet_decrypt(buffer, buffer_length,
24.1.81 by Björn Påhlsson
removed keyring pre-requirement for starting password-request.
954
					       &decrypted_buffer);
266 by Teddy Hogeborn
* plugin-runner.c: Only space changes.
955
    if(decrypted_buffer_size >= 0){
361 by Teddy Hogeborn
* plugins.d/mandos-client.c (init_gpgme): Move variable "ret" into the
956
      
24.1.10 by Björn Påhlsson
merge commit
957
      written = 0;
28 by Teddy Hogeborn
* server.conf: New file.
958
      while(written < (size_t) decrypted_buffer_size){
358 by Teddy Hogeborn
* plugins.d/mandos-client.c (start_mandos_communication): Check
959
	if(quit_now){
399 by Teddy Hogeborn
* Makefile (BROKEN_PIE): Add comment.
960
	  errno = EINTR;
358 by Teddy Hogeborn
* plugins.d/mandos-client.c (start_mandos_communication): Check
961
	  goto mandos_end;
962
	}
963
	
266 by Teddy Hogeborn
* plugin-runner.c: Only space changes.
964
	ret = (int)fwrite(decrypted_buffer + written, 1,
965
			  (size_t)decrypted_buffer_size - written,
966
			  stdout);
21 by Teddy Hogeborn
* Makefile (CFLAGS): Changed to use $(WARN), $(DEBUG), $(COVERAGE) and
967
	if(ret == 0 and ferror(stdout)){
399 by Teddy Hogeborn
* Makefile (BROKEN_PIE): Add comment.
968
	  int e = errno;
21 by Teddy Hogeborn
* Makefile (CFLAGS): Changed to use $(WARN), $(DEBUG), $(COVERAGE) and
969
	  if(debug){
505.3.3 by teddy at bsnet
* plugins.d/mandos-client.c: Prefix all printouts with "Mandos plugin
970
	    fprintf(stderr, "Mandos plugin mandos-client: "
971
		    "Error writing encrypted data: %s\n",
21 by Teddy Hogeborn
* Makefile (CFLAGS): Changed to use $(WARN), $(DEBUG), $(COVERAGE) and
972
		    strerror(errno));
973
	  }
399 by Teddy Hogeborn
* Makefile (BROKEN_PIE): Add comment.
974
	  errno = e;
372 by Teddy Hogeborn
* plugins.d/mandos-client.c (start_mandos_communication): Bug fix:
975
	  goto mandos_end;
21 by Teddy Hogeborn
* Makefile (CFLAGS): Changed to use $(WARN), $(DEBUG), $(COVERAGE) and
976
	}
22 by Teddy Hogeborn
* plugins.d/mandosclient.c (pgp_packet_decrypt): Cast "0" argument to
977
	written += (size_t)ret;
21 by Teddy Hogeborn
* Makefile (CFLAGS): Changed to use $(WARN), $(DEBUG), $(COVERAGE) and
978
      }
372 by Teddy Hogeborn
* plugins.d/mandos-client.c (start_mandos_communication): Bug fix:
979
      retval = 0;
13 by Björn Påhlsson
Added following support:
980
    }
981
  }
40 by Teddy Hogeborn
* plugins.d/mandosclient.c (initgnutls): Moved "err" variable into its
982
  
983
  /* Shutdown procedure */
984
  
985
 mandos_end:
399 by Teddy Hogeborn
* Makefile (BROKEN_PIE): Add comment.
986
  {
987
    int e = errno;
988
    free(decrypted_buffer);
989
    free(buffer);
990
    if(tcp_sd >= 0){
991
      ret = (int)TEMP_FAILURE_RETRY(close(tcp_sd));
992
    }
993
    if(ret == -1){
994
      if(e == 0){
995
	e = errno;
996
      }
24.1.174 by Björn Påhlsson
* Makefile (CFLAGS): Added "-lrt" to include real time library.
997
      perror_plus("close");
399 by Teddy Hogeborn
* Makefile (BROKEN_PIE): Add comment.
998
    }
999
    gnutls_deinit(session);
24.1.174 by Björn Påhlsson
* Makefile (CFLAGS): Added "-lrt" to include real time library.
1000
    errno = e;
399 by Teddy Hogeborn
* Makefile (BROKEN_PIE): Add comment.
1001
    if(quit_now){
24.1.174 by Björn Påhlsson
* Makefile (CFLAGS): Added "-lrt" to include real time library.
1002
      errno = EINTR;
399 by Teddy Hogeborn
* Makefile (BROKEN_PIE): Add comment.
1003
      retval = -1;
1004
    }
358 by Teddy Hogeborn
* plugins.d/mandos-client.c (start_mandos_communication): Check
1005
  }
13 by Björn Påhlsson
Added following support:
1006
  return retval;
1007
}
1008
39 by Teddy Hogeborn
* plugins.d/mandosclient.c (pgp_packet_decrypt): Renamed variables.
1009
static void resolve_callback(AvahiSServiceResolver *r,
1010
			     AvahiIfIndex interface,
304 by Teddy Hogeborn
Four new interrelated features:
1011
			     AvahiProtocol proto,
39 by Teddy Hogeborn
* plugins.d/mandosclient.c (pgp_packet_decrypt): Renamed variables.
1012
			     AvahiResolverEvent event,
1013
			     const char *name,
1014
			     const char *type,
1015
			     const char *domain,
1016
			     const char *host_name,
1017
			     const AvahiAddress *address,
1018
			     uint16_t port,
1019
			     AVAHI_GCC_UNUSED AvahiStringList *txt,
1020
			     AVAHI_GCC_UNUSED AvahiLookupResultFlags
1021
			     flags,
307 by Teddy Hogeborn
Merge from Björn:
1022
			     AVAHI_GCC_UNUSED void* userdata){
84 by Teddy Hogeborn
* Makefile (DOCBOOKTOMAN): Use the local manpages/docbook.xsl file, do
1023
  assert(r);
22 by Teddy Hogeborn
* plugins.d/mandosclient.c (pgp_packet_decrypt): Cast "0" argument to
1024
  
21 by Teddy Hogeborn
* Makefile (CFLAGS): Changed to use $(WARN), $(DEBUG), $(COVERAGE) and
1025
  /* Called whenever a service has been resolved successfully or
1026
     timed out */
22 by Teddy Hogeborn
* plugins.d/mandosclient.c (pgp_packet_decrypt): Cast "0" argument to
1027
  
353 by Teddy Hogeborn
* plugins.d/mandos-client.c (quit_now): Move up declaration before
1028
  if(quit_now){
1029
    return;
1030
  }
1031
  
293 by Teddy Hogeborn
* plugin-runner.c: Whitespace changes only.
1032
  switch(event){
21 by Teddy Hogeborn
* Makefile (CFLAGS): Changed to use $(WARN), $(DEBUG), $(COVERAGE) and
1033
  default:
1034
  case AVAHI_RESOLVER_FAILURE:
505.3.3 by teddy at bsnet
* plugins.d/mandos-client.c: Prefix all printouts with "Mandos plugin
1035
    fprintf(stderr, "Mandos plugin mandos-client: "
1036
	    "(Avahi Resolver) Failed to resolve service '%s'"
40 by Teddy Hogeborn
* plugins.d/mandosclient.c (initgnutls): Moved "err" variable into its
1037
	    " of type '%s' in domain '%s': %s\n", name, type, domain,
24.1.134 by Björn Påhlsson
plugin-runner: Added support for empty string arguments
1038
	    avahi_strerror(avahi_server_errno(mc.server)));
21 by Teddy Hogeborn
* Makefile (CFLAGS): Changed to use $(WARN), $(DEBUG), $(COVERAGE) and
1039
    break;
22 by Teddy Hogeborn
* plugins.d/mandosclient.c (pgp_packet_decrypt): Cast "0" argument to
1040
    
21 by Teddy Hogeborn
* Makefile (CFLAGS): Changed to use $(WARN), $(DEBUG), $(COVERAGE) and
1041
  case AVAHI_RESOLVER_FOUND:
1042
    {
1043
      char ip[AVAHI_ADDRESS_STR_MAX];
1044
      avahi_address_snprint(ip, sizeof(ip), address);
1045
      if(debug){
505.3.3 by teddy at bsnet
* plugins.d/mandos-client.c: Prefix all printouts with "Mandos plugin
1046
	fprintf(stderr, "Mandos plugin mandos-client: "
1047
		"Mandos server \"%s\" found on %s (%s, %"
268 by Teddy Hogeborn
Fixes for sscanf usage:
1048
		PRIdMAX ") on port %" PRIu16 "\n", name, host_name,
1049
		ip, (intmax_t)interface, port);
21 by Teddy Hogeborn
* Makefile (CFLAGS): Changed to use $(WARN), $(DEBUG), $(COVERAGE) and
1050
      }
24.1.134 by Björn Påhlsson
plugin-runner: Added support for empty string arguments
1051
      int ret = start_mandos_communication(ip, port, interface,
304 by Teddy Hogeborn
Four new interrelated features:
1052
					   avahi_proto_to_af(proto));
266 by Teddy Hogeborn
* plugin-runner.c: Only space changes.
1053
      if(ret == 0){
24.1.134 by Björn Påhlsson
plugin-runner: Added support for empty string arguments
1054
	avahi_simple_poll_quit(mc.simple_poll);
24.1.174 by Björn Påhlsson
* Makefile (CFLAGS): Added "-lrt" to include real time library.
1055
      } else {
1056
	ret = add_server(ip, port, interface,
1057
			 avahi_proto_to_af(proto));
21 by Teddy Hogeborn
* Makefile (CFLAGS): Changed to use $(WARN), $(DEBUG), $(COVERAGE) and
1058
      }
13 by Björn Påhlsson
Added following support:
1059
    }
21 by Teddy Hogeborn
* Makefile (CFLAGS): Changed to use $(WARN), $(DEBUG), $(COVERAGE) and
1060
  }
1061
  avahi_s_service_resolver_free(r);
13 by Björn Påhlsson
Added following support:
1062
}
1063
293 by Teddy Hogeborn
* plugin-runner.c: Whitespace changes only.
1064
static void browse_callback(AvahiSServiceBrowser *b,
1065
			    AvahiIfIndex interface,
1066
			    AvahiProtocol protocol,
1067
			    AvahiBrowserEvent event,
1068
			    const char *name,
1069
			    const char *type,
1070
			    const char *domain,
1071
			    AVAHI_GCC_UNUSED AvahiLookupResultFlags
1072
			    flags,
307 by Teddy Hogeborn
Merge from Björn:
1073
			    AVAHI_GCC_UNUSED void* userdata){
84 by Teddy Hogeborn
* Makefile (DOCBOOKTOMAN): Use the local manpages/docbook.xsl file, do
1074
  assert(b);
24.1.9 by Björn Påhlsson
not working midwork...
1075
  
1076
  /* Called whenever a new services becomes available on the LAN or
1077
     is removed from the LAN */
1078
  
358 by Teddy Hogeborn
* plugins.d/mandos-client.c (start_mandos_communication): Check
1079
  if(quit_now){
1080
    return;
1081
  }
1082
  
293 by Teddy Hogeborn
* plugin-runner.c: Whitespace changes only.
1083
  switch(event){
24.1.9 by Björn Påhlsson
not working midwork...
1084
  default:
1085
  case AVAHI_BROWSER_FAILURE:
38 by Teddy Hogeborn
* plugbasedclient.c (main): New "--userid" and "--groupid" options.
1086
    
505.3.3 by teddy at bsnet
* plugins.d/mandos-client.c: Prefix all printouts with "Mandos plugin
1087
    fprintf(stderr, "Mandos plugin mandos-client: "
1088
	    "(Avahi browser) %s\n",
24.1.134 by Björn Påhlsson
plugin-runner: Added support for empty string arguments
1089
	    avahi_strerror(avahi_server_errno(mc.server)));
1090
    avahi_simple_poll_quit(mc.simple_poll);
24.1.9 by Björn Påhlsson
not working midwork...
1091
    return;
38 by Teddy Hogeborn
* plugbasedclient.c (main): New "--userid" and "--groupid" options.
1092
    
24.1.9 by Björn Påhlsson
not working midwork...
1093
  case AVAHI_BROWSER_NEW:
40 by Teddy Hogeborn
* plugins.d/mandosclient.c (initgnutls): Moved "err" variable into its
1094
    /* We ignore the returned Avahi resolver object. In the callback
1095
       function we free it. If the Avahi server is terminated before
1096
       the callback function is called the Avahi server will free the
1097
       resolver for us. */
38 by Teddy Hogeborn
* plugbasedclient.c (main): New "--userid" and "--groupid" options.
1098
    
313 by Teddy Hogeborn
* plugins.d/mandos-client.c (browse_callback, main): Do not require
1099
    if(avahi_s_service_resolver_new(mc.server, interface, protocol,
1100
				    name, type, domain, protocol, 0,
1101
				    resolve_callback, NULL) == NULL)
505.3.3 by teddy at bsnet
* plugins.d/mandos-client.c: Prefix all printouts with "Mandos plugin
1102
      fprintf(stderr, "Mandos plugin mandos-client: "
1103
	      "Avahi: Failed to resolve service '%s': %s\n",
24.1.134 by Björn Påhlsson
plugin-runner: Added support for empty string arguments
1104
	      name, avahi_strerror(avahi_server_errno(mc.server)));
24.1.9 by Björn Påhlsson
not working midwork...
1105
    break;
38 by Teddy Hogeborn
* plugbasedclient.c (main): New "--userid" and "--groupid" options.
1106
    
24.1.9 by Björn Påhlsson
not working midwork...
1107
  case AVAHI_BROWSER_REMOVE:
1108
    break;
38 by Teddy Hogeborn
* plugbasedclient.c (main): New "--userid" and "--groupid" options.
1109
    
24.1.9 by Björn Påhlsson
not working midwork...
1110
  case AVAHI_BROWSER_ALL_FOR_NOW:
1111
  case AVAHI_BROWSER_CACHE_EXHAUSTED:
40 by Teddy Hogeborn
* plugins.d/mandosclient.c (initgnutls): Moved "err" variable into its
1112
    if(debug){
505.3.3 by teddy at bsnet
* plugins.d/mandos-client.c: Prefix all printouts with "Mandos plugin
1113
      fprintf(stderr, "Mandos plugin mandos-client: "
1114
	      "No Mandos server found, still searching...\n");
40 by Teddy Hogeborn
* plugins.d/mandosclient.c (initgnutls): Moved "err" variable into its
1115
    }
24.1.9 by Björn Påhlsson
not working midwork...
1116
    break;
1117
  }
13 by Björn Påhlsson
Added following support:
1118
}
1119
485 by Teddy Hogeborn
Merge from Björn.
1120
/* Signal handler that stops main loop after SIGTERM */
354 by Teddy Hogeborn
* plugins.d/mandos-client.c (signal_received): New.
1121
static void handle_sigterm(int sig){
308 by Teddy Hogeborn
* plugin-runner.c: Comment change.
1122
  if(quit_now){
1123
    return;
1124
  }
1125
  quit_now = 1;
354 by Teddy Hogeborn
* plugins.d/mandos-client.c (signal_received): New.
1126
  signal_received = sig;
24.1.134 by Björn Påhlsson
plugin-runner: Added support for empty string arguments
1127
  int old_errno = errno;
24.1.174 by Björn Påhlsson
* Makefile (CFLAGS): Added "-lrt" to include real time library.
1128
  /* set main loop to exit */
308 by Teddy Hogeborn
* plugin-runner.c: Comment change.
1129
  if(mc.simple_poll != NULL){
1130
    avahi_simple_poll_quit(mc.simple_poll);
1131
  }
24.1.134 by Björn Påhlsson
plugin-runner: Added support for empty string arguments
1132
  errno = old_errno;
1133
}
1134
505.2.2 by teddy at bsnet
* plugins.d/mandos-client.c (good_interface): Use SIOCGIFFLAGS instead
1135
bool get_flags(const char *ifname, struct ifreq *ifr){
505.2.1 by teddy at bsnet
* plugins.d/mandos-client.c (good_interface): Use SIOCGIFFLAGS instead
1136
  int ret;
505.2.2 by teddy at bsnet
* plugins.d/mandos-client.c (good_interface): Use SIOCGIFFLAGS instead
1137
  
505.2.1 by teddy at bsnet
* plugins.d/mandos-client.c (good_interface): Use SIOCGIFFLAGS instead
1138
  int s = socket(PF_INET6, SOCK_DGRAM, IPPROTO_IP);
1139
  if(s < 0){
1140
    perror_plus("socket");
505.2.2 by teddy at bsnet
* plugins.d/mandos-client.c (good_interface): Use SIOCGIFFLAGS instead
1141
    return false;
505.2.1 by teddy at bsnet
* plugins.d/mandos-client.c (good_interface): Use SIOCGIFFLAGS instead
1142
  }
505.2.2 by teddy at bsnet
* plugins.d/mandos-client.c (good_interface): Use SIOCGIFFLAGS instead
1143
  strcpy(ifr->ifr_name, ifname);
1144
  ret = ioctl(s, SIOCGIFFLAGS, ifr);
505.2.1 by teddy at bsnet
* plugins.d/mandos-client.c (good_interface): Use SIOCGIFFLAGS instead
1145
  if(ret == -1){
237.2.34 by teddy at bsnet
* plugins.d/mandos-client.c: Added debug output.
1146
    if(debug){
505.2.1 by teddy at bsnet
* plugins.d/mandos-client.c (good_interface): Use SIOCGIFFLAGS instead
1147
      perror_plus("ioctl SIOCGIFFLAGS");
237.2.34 by teddy at bsnet
* plugins.d/mandos-client.c: Added debug output.
1148
    }
505.2.2 by teddy at bsnet
* plugins.d/mandos-client.c (good_interface): Use SIOCGIFFLAGS instead
1149
    return false;
237.2.33 by teddy at bsnet
* plugins.d/mandos-client.c: An empty interface name now means to
1150
  }
505.2.2 by teddy at bsnet
* plugins.d/mandos-client.c (good_interface): Use SIOCGIFFLAGS instead
1151
  return true;
1152
}
1153
1154
bool good_flags(const char *ifname, const struct ifreq *ifr){
1155
  
237.2.33 by teddy at bsnet
* plugins.d/mandos-client.c: An empty interface name now means to
1156
  /* Reject the loopback device */
505.2.2 by teddy at bsnet
* plugins.d/mandos-client.c (good_interface): Use SIOCGIFFLAGS instead
1157
  if(ifr->ifr_flags & IFF_LOOPBACK){
237.2.34 by teddy at bsnet
* plugins.d/mandos-client.c: Added debug output.
1158
    if(debug){
505.3.3 by teddy at bsnet
* plugins.d/mandos-client.c: Prefix all printouts with "Mandos plugin
1159
      fprintf(stderr, "Mandos plugin mandos-client: "
1160
	      "Rejecting loopback interface \"%s\"\n", ifname);
237.2.34 by teddy at bsnet
* plugins.d/mandos-client.c: Added debug output.
1161
    }
505.2.2 by teddy at bsnet
* plugins.d/mandos-client.c (good_interface): Use SIOCGIFFLAGS instead
1162
    return false;
237.2.33 by teddy at bsnet
* plugins.d/mandos-client.c: An empty interface name now means to
1163
  }
1164
  /* Accept point-to-point devices only if connect_to is specified */
505.2.2 by teddy at bsnet
* plugins.d/mandos-client.c (good_interface): Use SIOCGIFFLAGS instead
1165
  if(connect_to != NULL and (ifr->ifr_flags & IFF_POINTOPOINT)){
237.2.34 by teddy at bsnet
* plugins.d/mandos-client.c: Added debug output.
1166
    if(debug){
505.3.3 by teddy at bsnet
* plugins.d/mandos-client.c: Prefix all printouts with "Mandos plugin
1167
      fprintf(stderr, "Mandos plugin mandos-client: "
1168
	      "Accepting point-to-point interface \"%s\"\n", ifname);
237.2.34 by teddy at bsnet
* plugins.d/mandos-client.c: Added debug output.
1169
    }
505.2.2 by teddy at bsnet
* plugins.d/mandos-client.c (good_interface): Use SIOCGIFFLAGS instead
1170
    return true;
237.2.33 by teddy at bsnet
* plugins.d/mandos-client.c: An empty interface name now means to
1171
  }
1172
  /* Otherwise, reject non-broadcast-capable devices */
505.2.2 by teddy at bsnet
* plugins.d/mandos-client.c (good_interface): Use SIOCGIFFLAGS instead
1173
  if(not (ifr->ifr_flags & IFF_BROADCAST)){
237.2.34 by teddy at bsnet
* plugins.d/mandos-client.c: Added debug output.
1174
    if(debug){
505.3.3 by teddy at bsnet
* plugins.d/mandos-client.c: Prefix all printouts with "Mandos plugin
1175
      fprintf(stderr, "Mandos plugin mandos-client: "
1176
	      "Rejecting non-broadcast interface \"%s\"\n", ifname);
237.2.34 by teddy at bsnet
* plugins.d/mandos-client.c: Added debug output.
1177
    }
505.2.2 by teddy at bsnet
* plugins.d/mandos-client.c (good_interface): Use SIOCGIFFLAGS instead
1178
    return false;
237.2.33 by teddy at bsnet
* plugins.d/mandos-client.c: An empty interface name now means to
1179
  }
481 by teddy at bsnet
* plugins.d/mandos-client.c (good_interface): Reject non-ARP
1180
  /* Reject non-ARP interfaces (including dummy interfaces) */
505.2.2 by teddy at bsnet
* plugins.d/mandos-client.c (good_interface): Use SIOCGIFFLAGS instead
1181
  if(ifr->ifr_flags & IFF_NOARP){
481 by teddy at bsnet
* plugins.d/mandos-client.c (good_interface): Reject non-ARP
1182
    if(debug){
505.3.3 by teddy at bsnet
* plugins.d/mandos-client.c: Prefix all printouts with "Mandos plugin
1183
      fprintf(stderr, "Mandos plugin mandos-client: "
1184
	      "Rejecting non-ARP interface \"%s\"\n", ifname);
481 by teddy at bsnet
* plugins.d/mandos-client.c (good_interface): Reject non-ARP
1185
    }
505.2.2 by teddy at bsnet
* plugins.d/mandos-client.c (good_interface): Use SIOCGIFFLAGS instead
1186
    return false;
481 by teddy at bsnet
* plugins.d/mandos-client.c (good_interface): Reject non-ARP
1187
  }
505.2.2 by teddy at bsnet
* plugins.d/mandos-client.c (good_interface): Use SIOCGIFFLAGS instead
1188
  
237.2.33 by teddy at bsnet
* plugins.d/mandos-client.c: An empty interface name now means to
1189
  /* Accept this device */
237.2.34 by teddy at bsnet
* plugins.d/mandos-client.c: Added debug output.
1190
  if(debug){
505.3.3 by teddy at bsnet
* plugins.d/mandos-client.c: Prefix all printouts with "Mandos plugin
1191
    fprintf(stderr, "Mandos plugin mandos-client: "
1192
	    "Interface \"%s\" is good\n", ifname);
505.2.2 by teddy at bsnet
* plugins.d/mandos-client.c (good_interface): Use SIOCGIFFLAGS instead
1193
  }
1194
  return true;
1195
}
1196
1197
/* 
1198
 * This function determines if a directory entry in /sys/class/net
1199
 * corresponds to an acceptable network device.
1200
 * (This function is passed to scandir(3) as a filter function.)
1201
 */
1202
int good_interface(const struct dirent *if_entry){
1203
  if(if_entry->d_name[0] == '.'){
1204
    return 0;
1205
  }
505.3.1 by teddy at bsnet
* plugins.d/mandos-client.c (good_interface): Add error message.
1206
  
505.2.2 by teddy at bsnet
* plugins.d/mandos-client.c (good_interface): Use SIOCGIFFLAGS instead
1207
  struct ifreq ifr;
1208
  if(not get_flags(if_entry->d_name, &ifr)){
505.3.1 by teddy at bsnet
* plugins.d/mandos-client.c (good_interface): Add error message.
1209
    if(debug){
505.3.3 by teddy at bsnet
* plugins.d/mandos-client.c: Prefix all printouts with "Mandos plugin
1210
      fprintf(stderr, "Mandos plugin mandos-client: "
1211
	      "Failed to get flags for interface \"%s\"\n",
505.3.1 by teddy at bsnet
* plugins.d/mandos-client.c (good_interface): Add error message.
1212
	      if_entry->d_name);
1213
    }
505.2.2 by teddy at bsnet
* plugins.d/mandos-client.c (good_interface): Use SIOCGIFFLAGS instead
1214
    return 0;
1215
  }
1216
  
1217
  if(not good_flags(if_entry->d_name, &ifr)){
1218
    return 0;
237.2.34 by teddy at bsnet
* plugins.d/mandos-client.c: Added debug output.
1219
  }
237.2.33 by teddy at bsnet
* plugins.d/mandos-client.c: An empty interface name now means to
1220
  return 1;
1221
}
1222
505.2.3 by Teddy Hogeborn
Intermediate commit - this does *not* work yet.
1223
/* 
1224
 * This function determines if a directory entry in /sys/class/net
1225
 * corresponds to an acceptable network device which is up.
1226
 * (This function is passed to scandir(3) as a filter function.)
1227
 */
1228
int up_interface(const struct dirent *if_entry){
1229
  if(if_entry->d_name[0] == '.'){
1230
    return 0;
1231
  }
505.3.1 by teddy at bsnet
* plugins.d/mandos-client.c (good_interface): Add error message.
1232
  
1233
  struct ifreq ifr;
1234
  if(not get_flags(if_entry->d_name, &ifr)){
1235
    if(debug){
505.3.3 by teddy at bsnet
* plugins.d/mandos-client.c: Prefix all printouts with "Mandos plugin
1236
      fprintf(stderr, "Mandos plugin mandos-client: "
1237
	      "Failed to get flags for interface \"%s\"\n",
505.2.3 by Teddy Hogeborn
Intermediate commit - this does *not* work yet.
1238
	      if_entry->d_name);
1239
    }
1240
    return 0;
1241
  }
505.3.1 by teddy at bsnet
* plugins.d/mandos-client.c (good_interface): Add error message.
1242
  
505.2.3 by Teddy Hogeborn
Intermediate commit - this does *not* work yet.
1243
  /* Reject down interfaces */
505.3.1 by teddy at bsnet
* plugins.d/mandos-client.c (good_interface): Add error message.
1244
  if(not (ifr.ifr_flags & IFF_UP)){
1245
    if(debug){
505.3.3 by teddy at bsnet
* plugins.d/mandos-client.c: Prefix all printouts with "Mandos plugin
1246
      fprintf(stderr, "Mandos plugin mandos-client: "
1247
	      "Rejecting down interface \"%s\"\n",
505.3.1 by teddy at bsnet
* plugins.d/mandos-client.c (good_interface): Add error message.
1248
	      if_entry->d_name);
1249
    }
1250
    return 0;
1251
  }
1252
  
1253
  /* Reject non-running interfaces */
1254
  if(not (ifr.ifr_flags & IFF_RUNNING)){
1255
    if(debug){
505.3.3 by teddy at bsnet
* plugins.d/mandos-client.c: Prefix all printouts with "Mandos plugin
1256
      fprintf(stderr, "Mandos plugin mandos-client: "
1257
	      "Rejecting non-running interface \"%s\"\n",
505.3.1 by teddy at bsnet
* plugins.d/mandos-client.c (good_interface): Add error message.
1258
	      if_entry->d_name);
1259
    }
1260
    return 0;
1261
  }
1262
  
1263
  if(not good_flags(if_entry->d_name, &ifr)){
1264
    return 0;
505.2.3 by Teddy Hogeborn
Intermediate commit - this does *not* work yet.
1265
  }
1266
  return 1;
1267
}
1268
24.1.172 by Björn Påhlsson
using scandir instead of readdir
1269
int notdotentries(const struct dirent *direntry){
1270
  /* Skip "." and ".." */
1271
  if(direntry->d_name[0] == '.'
1272
     and (direntry->d_name[1] == '\0'
1273
	  or (direntry->d_name[1] == '.'
1274
	      and direntry->d_name[2] == '\0'))){
1275
    return 0;
1276
  }
1277
  return 1;
1278
}
1279
505.2.3 by Teddy Hogeborn
Intermediate commit - this does *not* work yet.
1280
/* Is this directory entry a runnable program? */
1281
int runnable_hook(const struct dirent *direntry){
1282
  int ret;
505.3.6 by teddy at bsnet
* plugins.d/mandos-client.c: Some white space fixes.
1283
  size_t sret;
505.2.3 by Teddy Hogeborn
Intermediate commit - this does *not* work yet.
1284
  struct stat st;
1285
  
1286
  if((direntry->d_name)[0] == '\0'){
1287
    /* Empty name? */
1288
    return 0;
1289
  }
1290
  
505.3.6 by teddy at bsnet
* plugins.d/mandos-client.c: Some white space fixes.
1291
  sret = strspn(direntry->d_name, "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
1292
		"abcdefghijklmnopqrstuvwxyz"
1293
		"0123456789"
1294
		"_-");
1295
  if((direntry->d_name)[sret] != '\0'){
1296
    /* Contains non-allowed characters */
1297
    if(debug){
1298
      fprintf(stderr, "Mandos plugin mandos-client: "
1299
	      "Ignoring hook \"%s\" with bad name\n",
1300
	      direntry->d_name);
1301
    }
1302
    return 0;
1303
  }
505.2.3 by Teddy Hogeborn
Intermediate commit - this does *not* work yet.
1304
  
505.3.4 by teddy at bsnet
* plugins.d/mandos-client.c (runnable_hook): Bug fix: stat using the
1305
  char *fullname = NULL;
505.3.6 by teddy at bsnet
* plugins.d/mandos-client.c: Some white space fixes.
1306
  ret = asprintf(&fullname, "%s/%s", hookdir, direntry->d_name);
505.3.4 by teddy at bsnet
* plugins.d/mandos-client.c (runnable_hook): Bug fix: stat using the
1307
  if(ret < 0){
1308
    perror_plus("asprintf");
1309
    return 0;
1310
  }
1311
  
1312
  ret = stat(fullname, &st);
505.2.3 by Teddy Hogeborn
Intermediate commit - this does *not* work yet.
1313
  if(ret == -1){
1314
    if(debug){
505.3.6 by teddy at bsnet
* plugins.d/mandos-client.c: Some white space fixes.
1315
      perror_plus("Could not stat hook");
505.2.3 by Teddy Hogeborn
Intermediate commit - this does *not* work yet.
1316
    }
1317
    return 0;
1318
  }
505.3.1 by teddy at bsnet
* plugins.d/mandos-client.c (good_interface): Add error message.
1319
  if(not (S_ISREG(st.st_mode))){
505.2.3 by Teddy Hogeborn
Intermediate commit - this does *not* work yet.
1320
    /* Not a regular file */
505.3.6 by teddy at bsnet
* plugins.d/mandos-client.c: Some white space fixes.
1321
    if(debug){
1322
      fprintf(stderr, "Mandos plugin mandos-client: "
1323
	      "Ignoring hook \"%s\" - not a file\n",
1324
	      direntry->d_name);
1325
    }
505.2.3 by Teddy Hogeborn
Intermediate commit - this does *not* work yet.
1326
    return 0;
1327
  }
1328
  if(not (st.st_mode & (S_IXUSR | S_IXGRP | S_IXOTH))){
1329
    /* Not executable */
505.3.6 by teddy at bsnet
* plugins.d/mandos-client.c: Some white space fixes.
1330
    if(debug){
1331
      fprintf(stderr, "Mandos plugin mandos-client: "
1332
	      "Ignoring hook \"%s\" - not executable\n",
1333
	      direntry->d_name);
1334
    }
505.2.3 by Teddy Hogeborn
Intermediate commit - this does *not* work yet.
1335
    return 0;
1336
  }
1337
  return 1;
1338
}
1339
24.1.174 by Björn Påhlsson
* Makefile (CFLAGS): Added "-lrt" to include real time library.
1340
int avahi_loop_with_timeout(AvahiSimplePoll *s, int retry_interval){
1341
  int ret;
1342
  struct timespec now;
1343
  struct timespec waited_time;
1344
  intmax_t block_time;
491 by teddy at bsnet
* plugins.d/mandos-client.c (avahi_loop_with_timeout): Fix warning.
1345
  
24.1.174 by Björn Påhlsson
* Makefile (CFLAGS): Added "-lrt" to include real time library.
1346
  while(true){
1347
    if(mc.current_server == NULL){
1348
      if (debug){
505.3.3 by teddy at bsnet
* plugins.d/mandos-client.c: Prefix all printouts with "Mandos plugin
1349
	fprintf(stderr, "Mandos plugin mandos-client: "
485 by Teddy Hogeborn
Merge from Björn.
1350
		"Wait until first server is found. No timeout!\n");
24.1.174 by Björn Påhlsson
* Makefile (CFLAGS): Added "-lrt" to include real time library.
1351
      }
1352
      ret = avahi_simple_poll_iterate(s, -1);
1353
    } else {
1354
      if (debug){
505.3.3 by teddy at bsnet
* plugins.d/mandos-client.c: Prefix all printouts with "Mandos plugin
1355
	fprintf(stderr, "Mandos plugin mandos-client: "
1356
		"Check current_server if we should run it,"
485 by Teddy Hogeborn
Merge from Björn.
1357
		" or wait\n");
24.1.174 by Björn Påhlsson
* Makefile (CFLAGS): Added "-lrt" to include real time library.
1358
      }
1359
      /* the current time */
1360
      ret = clock_gettime(CLOCK_MONOTONIC, &now);
1361
      if(ret == -1){
1362
	perror_plus("clock_gettime");
1363
	return -1;
1364
      }
1365
      /* Calculating in ms how long time between now and server
1366
	 who we visted longest time ago. Now - last seen.  */
485 by Teddy Hogeborn
Merge from Björn.
1367
      waited_time.tv_sec = (now.tv_sec
1368
			    - mc.current_server->last_seen.tv_sec);
1369
      waited_time.tv_nsec = (now.tv_nsec
1370
			     - mc.current_server->last_seen.tv_nsec);
1371
      /* total time is 10s/10,000ms.
1372
	 Converting to s from ms by dividing by 1,000,
1373
	 and ns to ms by dividing by 1,000,000. */
1374
      block_time = ((retry_interval
1375
		     - ((intmax_t)waited_time.tv_sec * 1000))
1376
		    - ((intmax_t)waited_time.tv_nsec / 1000000));
491 by teddy at bsnet
* plugins.d/mandos-client.c (avahi_loop_with_timeout): Fix warning.
1377
      
24.1.174 by Björn Påhlsson
* Makefile (CFLAGS): Added "-lrt" to include real time library.
1378
      if (debug){
505.3.3 by teddy at bsnet
* plugins.d/mandos-client.c: Prefix all printouts with "Mandos plugin
1379
	fprintf(stderr, "Mandos plugin mandos-client: "
1380
		"Blocking for %" PRIdMAX " ms\n", block_time);
24.1.174 by Björn Påhlsson
* Makefile (CFLAGS): Added "-lrt" to include real time library.
1381
      }
491 by teddy at bsnet
* plugins.d/mandos-client.c (avahi_loop_with_timeout): Fix warning.
1382
      
24.1.174 by Björn Påhlsson
* Makefile (CFLAGS): Added "-lrt" to include real time library.
1383
      if(block_time <= 0){
1384
	ret = start_mandos_communication(mc.current_server->ip,
485 by Teddy Hogeborn
Merge from Björn.
1385
					 mc.current_server->port,
1386
					 mc.current_server->if_index,
1387
					 mc.current_server->af);
24.1.174 by Björn Påhlsson
* Makefile (CFLAGS): Added "-lrt" to include real time library.
1388
	if(ret == 0){
1389
	  avahi_simple_poll_quit(mc.simple_poll);
1390
	  return 0;
1391
	}
485 by Teddy Hogeborn
Merge from Björn.
1392
	ret = clock_gettime(CLOCK_MONOTONIC,
1393
			    &mc.current_server->last_seen);
24.1.174 by Björn Påhlsson
* Makefile (CFLAGS): Added "-lrt" to include real time library.
1394
	if(ret == -1){
1395
	  perror_plus("clock_gettime");
1396
	  return -1;
1397
	}
1398
	mc.current_server = mc.current_server->next;
485 by Teddy Hogeborn
Merge from Björn.
1399
	block_time = 0; 	/* Call avahi to find new Mandos
1400
				   servers, but don't block */
24.1.174 by Björn Påhlsson
* Makefile (CFLAGS): Added "-lrt" to include real time library.
1401
      }
1402
      
1403
      ret = avahi_simple_poll_iterate(s, (int)block_time);
1404
    }
1405
    if(ret != 0){
505.3.3 by teddy at bsnet
* plugins.d/mandos-client.c: Prefix all printouts with "Mandos plugin
1406
      if (ret > 0 or errno != EINTR){
24.1.174 by Björn Påhlsson
* Makefile (CFLAGS): Added "-lrt" to include real time library.
1407
	return (ret != 1) ? ret : 0;
1408
      }
1409
    }
1410
  }
1411
}
1412
40 by Teddy Hogeborn
* plugins.d/mandosclient.c (initgnutls): Moved "err" variable into its
1413
int main(int argc, char *argv[]){
293 by Teddy Hogeborn
* plugin-runner.c: Whitespace changes only.
1414
  AvahiSServiceBrowser *sb = NULL;
1415
  int error;
1416
  int ret;
1417
  intmax_t tmpmax;
311 by Teddy Hogeborn
Overflows are not detected by sscanf(), so stop using it:
1418
  char *tmp;
293 by Teddy Hogeborn
* plugin-runner.c: Whitespace changes only.
1419
  int exitcode = EXIT_SUCCESS;
237.2.33 by teddy at bsnet
* plugins.d/mandos-client.c: An empty interface name now means to
1420
  const char *interface = "";
293 by Teddy Hogeborn
* plugin-runner.c: Whitespace changes only.
1421
  struct ifreq network;
350 by Teddy Hogeborn
* plugins.d/mandos-client.c (main): Take down network interface on
1422
  int sd = -1;
353 by Teddy Hogeborn
* plugins.d/mandos-client.c (quit_now): Move up declaration before
1423
  bool take_down_interface = false;
293 by Teddy Hogeborn
* plugin-runner.c: Whitespace changes only.
1424
  uid_t uid;
1425
  gid_t gid;
1426
  char tempdir[] = "/tmp/mandosXXXXXX";
1427
  bool tempdir_created = false;
1428
  AvahiIfIndex if_index = AVAHI_IF_UNSPEC;
1429
  const char *seckey = PATHDIR "/" SECKEY;
1430
  const char *pubkey = PATHDIR "/" PUBKEY;
1431
  
1432
  bool gnutls_initialized = false;
1433
  bool gpgme_initialized = false;
311 by Teddy Hogeborn
Overflows are not detected by sscanf(), so stop using it:
1434
  float delay = 2.5f;
485 by Teddy Hogeborn
Merge from Björn.
1435
  double retry_interval = 10; /* 10s between trying a server and
1436
				 retrying the same server again */
311 by Teddy Hogeborn
Overflows are not detected by sscanf(), so stop using it:
1437
  
369 by Teddy Hogeborn
* init.d-mandos (Required-Start, Required-Stop): Bug fix: Added
1438
  struct sigaction old_sigterm_action = { .sa_handler = SIG_DFL };
24.1.134 by Björn Påhlsson
plugin-runner: Added support for empty string arguments
1439
  struct sigaction sigterm_action = { .sa_handler = handle_sigterm };
293 by Teddy Hogeborn
* plugin-runner.c: Whitespace changes only.
1440
  
368 by Teddy Hogeborn
* plugins.d/mandos-client.c (init_gnutls_session): Retry interrupted
1441
  uid = getuid();
1442
  gid = getgid();
1443
  
1444
  /* Lower any group privileges we might have, just to be safe */
1445
  errno = 0;
1446
  ret = setgid(gid);
1447
  if(ret == -1){
24.1.174 by Björn Påhlsson
* Makefile (CFLAGS): Added "-lrt" to include real time library.
1448
    perror_plus("setgid");
368 by Teddy Hogeborn
* plugins.d/mandos-client.c (init_gnutls_session): Retry interrupted
1449
  }
1450
  
1451
  /* Lower user privileges (temporarily) */
1452
  errno = 0;
1453
  ret = seteuid(uid);
1454
  if(ret == -1){
24.1.174 by Björn Påhlsson
* Makefile (CFLAGS): Added "-lrt" to include real time library.
1455
    perror_plus("seteuid");
368 by Teddy Hogeborn
* plugins.d/mandos-client.c (init_gnutls_session): Retry interrupted
1456
  }
1457
  
1458
  if(quit_now){
1459
    goto end;
1460
  }
1461
  
293 by Teddy Hogeborn
* plugin-runner.c: Whitespace changes only.
1462
  {
1463
    struct argp_option options[] = {
1464
      { .name = "debug", .key = 128,
1465
	.doc = "Debug mode", .group = 3 },
1466
      { .name = "connect", .key = 'c',
1467
	.arg = "ADDRESS:PORT",
1468
	.doc = "Connect directly to a specific Mandos server",
1469
	.group = 1 },
1470
      { .name = "interface", .key = 'i',
1471
	.arg = "NAME",
304 by Teddy Hogeborn
Four new interrelated features:
1472
	.doc = "Network interface that will be used to search for"
1473
	" Mandos servers",
293 by Teddy Hogeborn
* plugin-runner.c: Whitespace changes only.
1474
	.group = 1 },
1475
      { .name = "seckey", .key = 's',
1476
	.arg = "FILE",
1477
	.doc = "OpenPGP secret key file base name",
1478
	.group = 1 },
1479
      { .name = "pubkey", .key = 'p',
1480
	.arg = "FILE",
1481
	.doc = "OpenPGP public key file base name",
1482
	.group = 2 },
1483
      { .name = "dh-bits", .key = 129,
1484
	.arg = "BITS",
1485
	.doc = "Bit length of the prime number used in the"
1486
	" Diffie-Hellman key exchange",
1487
	.group = 2 },
1488
      { .name = "priority", .key = 130,
1489
	.arg = "STRING",
1490
	.doc = "GnuTLS priority string for the TLS handshake",
1491
	.group = 1 },
1492
      { .name = "delay", .key = 131,
1493
	.arg = "SECONDS",
1494
	.doc = "Maximum delay to wait for interface startup",
1495
	.group = 2 },
24.1.174 by Björn Påhlsson
* Makefile (CFLAGS): Added "-lrt" to include real time library.
1496
      { .name = "retry", .key = 132,
1497
	.arg = "SECONDS",
1498
	.doc = "Retry interval used when denied by the mandos server",
1499
	.group = 2 },
505.3.4 by teddy at bsnet
* plugins.d/mandos-client.c (runnable_hook): Bug fix: stat using the
1500
      { .name = "network-hook-dir", .key = 133,
1501
	.arg = "DIR",
1502
	.doc = "Directory where network hooks are located",
1503
	.group = 2 },
394 by Teddy Hogeborn
Convert some programs to use the exit codes from <sysexits.h>. Change
1504
      /*
1505
       * These reproduce what we would get without ARGP_NO_HELP
1506
       */
1507
      { .name = "help", .key = '?',
1508
	.doc = "Give this help list", .group = -1 },
1509
      { .name = "usage", .key = -3,
1510
	.doc = "Give a short usage message", .group = -1 },
1511
      { .name = "version", .key = 'V',
1512
	.doc = "Print program version", .group = -1 },
293 by Teddy Hogeborn
* plugin-runner.c: Whitespace changes only.
1513
      { .name = NULL }
1514
    };
1515
    
1516
    error_t parse_opt(int key, char *arg,
1517
		      struct argp_state *state){
394 by Teddy Hogeborn
Convert some programs to use the exit codes from <sysexits.h>. Change
1518
      errno = 0;
293 by Teddy Hogeborn
* plugin-runner.c: Whitespace changes only.
1519
      switch(key){
1520
      case 128:			/* --debug */
1521
	debug = true;
1522
	break;
1523
      case 'c':			/* --connect */
1524
	connect_to = arg;
1525
	break;
1526
      case 'i':			/* --interface */
1527
	interface = arg;
1528
	break;
1529
      case 's':			/* --seckey */
1530
	seckey = arg;
1531
	break;
1532
      case 'p':			/* --pubkey */
1533
	pubkey = arg;
1534
	break;
1535
      case 129:			/* --dh-bits */
311 by Teddy Hogeborn
Overflows are not detected by sscanf(), so stop using it:
1536
	errno = 0;
1537
	tmpmax = strtoimax(arg, &tmp, 10);
1538
	if(errno != 0 or tmp == arg or *tmp != '\0'
1539
	   or tmpmax != (typeof(mc.dh_bits))tmpmax){
394 by Teddy Hogeborn
Convert some programs to use the exit codes from <sysexits.h>. Change
1540
	  argp_error(state, "Bad number of DH bits");
293 by Teddy Hogeborn
* plugin-runner.c: Whitespace changes only.
1541
	}
1542
	mc.dh_bits = (typeof(mc.dh_bits))tmpmax;
1543
	break;
1544
      case 130:			/* --priority */
1545
	mc.priority = arg;
1546
	break;
1547
      case 131:			/* --delay */
311 by Teddy Hogeborn
Overflows are not detected by sscanf(), so stop using it:
1548
	errno = 0;
1549
	delay = strtof(arg, &tmp);
1550
	if(errno != 0 or tmp == arg or *tmp != '\0'){
394 by Teddy Hogeborn
Convert some programs to use the exit codes from <sysexits.h>. Change
1551
	  argp_error(state, "Bad delay");
293 by Teddy Hogeborn
* plugin-runner.c: Whitespace changes only.
1552
	}
24.1.174 by Björn Påhlsson
* Makefile (CFLAGS): Added "-lrt" to include real time library.
1553
      case 132:			/* --retry */
1554
	errno = 0;
1555
	retry_interval = strtod(arg, &tmp);
1556
	if(errno != 0 or tmp == arg or *tmp != '\0'
491 by teddy at bsnet
* plugins.d/mandos-client.c (avahi_loop_with_timeout): Fix warning.
1557
	   or (retry_interval * 1000) > INT_MAX
1558
	   or retry_interval < 0){
24.1.174 by Björn Påhlsson
* Makefile (CFLAGS): Added "-lrt" to include real time library.
1559
	  argp_error(state, "Bad retry interval");
1560
	}
293 by Teddy Hogeborn
* plugin-runner.c: Whitespace changes only.
1561
	break;
505.3.4 by teddy at bsnet
* plugins.d/mandos-client.c (runnable_hook): Bug fix: stat using the
1562
      case 133:			/* --network-hook-dir */
1563
	hookdir = arg;
1564
	break;
394 by Teddy Hogeborn
Convert some programs to use the exit codes from <sysexits.h>. Change
1565
	/*
1566
	 * These reproduce what we would get without ARGP_NO_HELP
1567
	 */
1568
      case '?':			/* --help */
1569
	argp_state_help(state, state->out_stream,
1570
			(ARGP_HELP_STD_HELP | ARGP_HELP_EXIT_ERR)
1571
			& ~(unsigned int)ARGP_HELP_EXIT_OK);
1572
      case -3:			/* --usage */
1573
	argp_state_help(state, state->out_stream,
1574
			ARGP_HELP_USAGE | ARGP_HELP_EXIT_ERR);
1575
      case 'V':			/* --version */
505.3.3 by teddy at bsnet
* plugins.d/mandos-client.c: Prefix all printouts with "Mandos plugin
1576
	fprintf(state->out_stream, "Mandos plugin mandos-client: ");
394 by Teddy Hogeborn
Convert some programs to use the exit codes from <sysexits.h>. Change
1577
	fprintf(state->out_stream, "%s\n", argp_program_version);
1578
	exit(argp_err_exit_status);
293 by Teddy Hogeborn
* plugin-runner.c: Whitespace changes only.
1579
	break;
1580
      default:
1581
	return ARGP_ERR_UNKNOWN;
1582
      }
394 by Teddy Hogeborn
Convert some programs to use the exit codes from <sysexits.h>. Change
1583
      return errno;
293 by Teddy Hogeborn
* plugin-runner.c: Whitespace changes only.
1584
    }
1585
    
1586
    struct argp argp = { .options = options, .parser = parse_opt,
1587
			 .args_doc = "",
1588
			 .doc = "Mandos client -- Get and decrypt"
1589
			 " passwords from a Mandos server" };
394 by Teddy Hogeborn
Convert some programs to use the exit codes from <sysexits.h>. Change
1590
    ret = argp_parse(&argp, argc, argv,
1591
		     ARGP_IN_ORDER | ARGP_NO_HELP, 0, NULL);
1592
    switch(ret){
1593
    case 0:
1594
      break;
1595
    case ENOMEM:
1596
    default:
1597
      errno = ret;
24.1.174 by Björn Påhlsson
* Makefile (CFLAGS): Added "-lrt" to include real time library.
1598
      perror_plus("argp_parse");
394 by Teddy Hogeborn
Convert some programs to use the exit codes from <sysexits.h>. Change
1599
      exitcode = EX_OSERR;
1600
      goto end;
1601
    case EINVAL:
1602
      exitcode = EX_USAGE;
293 by Teddy Hogeborn
* plugin-runner.c: Whitespace changes only.
1603
      goto end;
1604
    }
1605
  }
487 by Teddy Hogeborn
* initramfs-tools-script: Abort if plugin-runner is missing. Removed
1606
    
1607
  {
1608
    /* Work around Debian bug #633582:
1609
       <http://bugs.debian.org/633582> */
1610
    struct stat st;
1611
    
1612
    /* Re-raise priviliges */
1613
    errno = 0;
1614
    ret = seteuid(0);
1615
    if(ret == -1){
1616
      perror_plus("seteuid");
1617
    }
1618
    
492 by Teddy Hogeborn
* plugins.d/mandos-client.c (main): Do not even try to work around
1619
    if(strcmp(seckey, PATHDIR "/" SECKEY) == 0){
1620
      int seckey_fd = open(seckey, O_RDONLY);
1621
      if(seckey_fd == -1){
1622
	perror_plus("open");
487 by Teddy Hogeborn
* initramfs-tools-script: Abort if plugin-runner is missing. Removed
1623
      } else {
492 by Teddy Hogeborn
* plugins.d/mandos-client.c (main): Do not even try to work around
1624
	ret = (int)TEMP_FAILURE_RETRY(fstat(seckey_fd, &st));
1625
	if(ret == -1){
1626
	  perror_plus("fstat");
1627
	} else {
1628
	  if(S_ISREG(st.st_mode) and st.st_uid == 0 and st.st_gid == 0){
1629
	    ret = fchown(seckey_fd, uid, gid);
1630
	    if(ret == -1){
1631
	      perror_plus("fchown");
1632
	    }
487 by Teddy Hogeborn
* initramfs-tools-script: Abort if plugin-runner is missing. Removed
1633
	  }
1634
	}
492 by Teddy Hogeborn
* plugins.d/mandos-client.c (main): Do not even try to work around
1635
	TEMP_FAILURE_RETRY(close(seckey_fd));
487 by Teddy Hogeborn
* initramfs-tools-script: Abort if plugin-runner is missing. Removed
1636
      }
1637
    }
1638
    
492 by Teddy Hogeborn
* plugins.d/mandos-client.c (main): Do not even try to work around
1639
    if(strcmp(pubkey, PATHDIR "/" PUBKEY) == 0){
1640
      int pubkey_fd = open(pubkey, O_RDONLY);
1641
      if(pubkey_fd == -1){
1642
	perror_plus("open");
487 by Teddy Hogeborn
* initramfs-tools-script: Abort if plugin-runner is missing. Removed
1643
      } else {
492 by Teddy Hogeborn
* plugins.d/mandos-client.c (main): Do not even try to work around
1644
	ret = (int)TEMP_FAILURE_RETRY(fstat(pubkey_fd, &st));
1645
	if(ret == -1){
1646
	  perror_plus("fstat");
1647
	} else {
1648
	  if(S_ISREG(st.st_mode) and st.st_uid == 0 and st.st_gid == 0){
1649
	    ret = fchown(pubkey_fd, uid, gid);
1650
	    if(ret == -1){
1651
	      perror_plus("fchown");
1652
	    }
487 by Teddy Hogeborn
* initramfs-tools-script: Abort if plugin-runner is missing. Removed
1653
	  }
1654
	}
492 by Teddy Hogeborn
* plugins.d/mandos-client.c (main): Do not even try to work around
1655
	TEMP_FAILURE_RETRY(close(pubkey_fd));
487 by Teddy Hogeborn
* initramfs-tools-script: Abort if plugin-runner is missing. Removed
1656
      }
1657
    }
1658
    
1659
    /* Lower privileges */
1660
    errno = 0;
1661
    ret = seteuid(uid);
1662
    if(ret == -1){
1663
      perror_plus("seteuid");
1664
    }
1665
  }
293 by Teddy Hogeborn
* plugin-runner.c: Whitespace changes only.
1666
  
505.2.3 by Teddy Hogeborn
Intermediate commit - this does *not* work yet.
1667
  /* Find network hooks and run them */
1668
  {
1669
    struct dirent **direntries;
1670
    struct dirent *direntry;
505.3.4 by teddy at bsnet
* plugins.d/mandos-client.c (runnable_hook): Bug fix: stat using the
1671
    int numhooks = scandir(hookdir, &direntries, runnable_hook,
505.2.3 by Teddy Hogeborn
Intermediate commit - this does *not* work yet.
1672
			   alphasort);
505.3.3 by teddy at bsnet
* plugins.d/mandos-client.c: Prefix all printouts with "Mandos plugin
1673
    if(numhooks == -1){
1674
      perror_plus("scandir");
1675
    } else {
1676
      int devnull = open("/dev/null", O_RDONLY);
1677
      for(int i = 0; i < numhooks; i++){
1678
	direntry = direntries[0];
1679
	char *fullname = NULL;
505.3.4 by teddy at bsnet
* plugins.d/mandos-client.c (runnable_hook): Bug fix: stat using the
1680
	ret = asprintf(&fullname, "%s/%s", hookdir, direntry->d_name);
505.3.3 by teddy at bsnet
* plugins.d/mandos-client.c: Prefix all printouts with "Mandos plugin
1681
	if(ret < 0){
505.3.2 by teddy at bsnet
* plugins.d/mandos-client.c (main): Add "DELAY" environment variable.
1682
	  perror_plus("asprintf");
505.3.3 by teddy at bsnet
* plugins.d/mandos-client.c: Prefix all printouts with "Mandos plugin
1683
	  continue;
505.3.2 by teddy at bsnet
* plugins.d/mandos-client.c (main): Add "DELAY" environment variable.
1684
	}
505.3.3 by teddy at bsnet
* plugins.d/mandos-client.c: Prefix all printouts with "Mandos plugin
1685
	pid_t hook_pid = fork();
1686
	if(hook_pid == 0){
1687
	  /* Child */
1688
	  dup2(devnull, STDIN_FILENO);
1689
	  close(devnull);
1690
	  dup2(STDERR_FILENO, STDOUT_FILENO);
505.3.7 by teddy at bsnet
* initramfs-tools-hook: Install network hooks (and any required files)
1691
	  ret = setenv("MANDOSNETHOOKDIR", hookdir, 1);
1692
	  if(ret == -1){
1693
	    perror_plus("setenv");
1694
	    exit(1);
1695
	  }
505.3.3 by teddy at bsnet
* plugins.d/mandos-client.c: Prefix all printouts with "Mandos plugin
1696
	  ret = setenv("DEVICE", interface, 1);
1697
	  if(ret == -1){
1698
	    perror_plus("setenv");
1699
	    exit(1);
1700
	  }
1701
	  ret = setenv("VERBOSE", debug ? "1" : "0", 1);
1702
	  if(ret == -1){
1703
	    perror_plus("setenv");
1704
	    exit(1);
1705
	  }
1706
	  ret = setenv("MODE", "start", 1);
1707
	  if(ret == -1){
1708
	    perror_plus("setenv");
1709
	    exit(1);
1710
	  }
1711
	  char *delaystring;
1712
	  ret = asprintf(&delaystring, "%f", delay);
1713
	  if(ret == -1){
1714
	    perror_plus("asprintf");
1715
	    exit(1);
1716
	  }
1717
	  ret = setenv("DELAY", delaystring, 1);
1718
	  if(ret == -1){
1719
	    free(delaystring);
1720
	    perror_plus("setenv");
1721
	    exit(1);
1722
	  }
505.3.2 by teddy at bsnet
* plugins.d/mandos-client.c (main): Add "DELAY" environment variable.
1723
	  free(delaystring);
505.3.3 by teddy at bsnet
* plugins.d/mandos-client.c: Prefix all printouts with "Mandos plugin
1724
	  ret = execl(fullname, direntry->d_name, "start", NULL);
1725
	  perror_plus("execl");
1726
	} else {
1727
	  int status;
1728
	  if(TEMP_FAILURE_RETRY(waitpid(hook_pid, &status, 0)) == -1){
1729
	    perror_plus("waitpid");
1730
	    free(fullname);
1731
	    continue;
1732
	  }
1733
	  if(WIFEXITED(status)){
1734
	    if(WEXITSTATUS(status) != 0){
1735
	      fprintf(stderr, "Mandos plugin mandos-client: "
1736
		      "Warning: network hook \"%s\" exited"
1737
		      " with status %d\n", direntry->d_name,
1738
		      WEXITSTATUS(status));
1739
	      free(fullname);
1740
	      continue;
1741
	    }
1742
	  } else if(WIFSIGNALED(status)){
1743
	    fprintf(stderr, "Mandos plugin mandos-client: "
1744
		    "Warning: network hook \"%s\" died by"
1745
		    " signal %d\n", direntry->d_name,
1746
		    WTERMSIG(status));
1747
	    free(fullname);
1748
	    continue;
1749
	  } else {
1750
	    fprintf(stderr, "Mandos plugin mandos-client: "
1751
		    "Warning: network hook \"%s\" crashed\n",
1752
		    direntry->d_name);
1753
	    free(fullname);
1754
	    continue;
1755
	  }
1756
	}
1757
	free(fullname);
1758
	if(quit_now){
1759
	  goto end;
1760
	}
1761
      }
1762
      close(devnull);
505.2.3 by Teddy Hogeborn
Intermediate commit - this does *not* work yet.
1763
    }
1764
  }
1765
  
24.1.135 by Björn Påhlsson
Earlier signal handling
1766
  if(not debug){
1767
    avahi_set_log_function(empty_log);
1768
  }
505.2.3 by Teddy Hogeborn
Intermediate commit - this does *not* work yet.
1769
  
237.2.33 by teddy at bsnet
* plugins.d/mandos-client.c: An empty interface name now means to
1770
  if(interface[0] == '\0'){
1771
    struct dirent **direntries;
505.3.1 by teddy at bsnet
* plugins.d/mandos-client.c (good_interface): Add error message.
1772
    /* First look for interfaces that are up */
1773
    ret = scandir(sys_class_net, &direntries, up_interface,
237.2.33 by teddy at bsnet
* plugins.d/mandos-client.c: An empty interface name now means to
1774
		  alphasort);
505.3.1 by teddy at bsnet
* plugins.d/mandos-client.c (good_interface): Add error message.
1775
    if(ret == 0){
1776
      /* No up interfaces, look for any good interfaces */
1777
      free(direntries);
1778
      ret = scandir(sys_class_net, &direntries, good_interface,
1779
		    alphasort);
1780
    }
237.2.33 by teddy at bsnet
* plugins.d/mandos-client.c: An empty interface name now means to
1781
    if(ret >= 1){
505.3.1 by teddy at bsnet
* plugins.d/mandos-client.c (good_interface): Add error message.
1782
      /* Pick the first interface returned */
237.2.33 by teddy at bsnet
* plugins.d/mandos-client.c: An empty interface name now means to
1783
      interface = strdup(direntries[0]->d_name);
237.2.34 by teddy at bsnet
* plugins.d/mandos-client.c: Added debug output.
1784
      if(debug){
505.3.3 by teddy at bsnet
* plugins.d/mandos-client.c: Prefix all printouts with "Mandos plugin
1785
	fprintf(stderr, "Mandos plugin mandos-client: "
1786
		"Using interface \"%s\"\n", interface);
237.2.34 by teddy at bsnet
* plugins.d/mandos-client.c: Added debug output.
1787
      }
237.2.33 by teddy at bsnet
* plugins.d/mandos-client.c: An empty interface name now means to
1788
      if(interface == NULL){
24.1.174 by Björn Påhlsson
* Makefile (CFLAGS): Added "-lrt" to include real time library.
1789
	perror_plus("malloc");
237.2.33 by teddy at bsnet
* plugins.d/mandos-client.c: An empty interface name now means to
1790
	free(direntries);
1791
	exitcode = EXIT_FAILURE;
1792
	goto end;
1793
      }
1794
      free(direntries);
1795
    } else {
1796
      free(direntries);
505.3.3 by teddy at bsnet
* plugins.d/mandos-client.c: Prefix all printouts with "Mandos plugin
1797
      fprintf(stderr, "Mandos plugin mandos-client: "
1798
	      "Could not find a network interface\n");
237.2.33 by teddy at bsnet
* plugins.d/mandos-client.c: An empty interface name now means to
1799
      exitcode = EXIT_FAILURE;
1800
      goto end;
1801
    }
1802
  }
309 by Teddy Hogeborn
Merge from Björn:
1803
  
24.1.135 by Björn Påhlsson
Earlier signal handling
1804
  /* Initialize Avahi early so avahi_simple_poll_quit() can be called
1805
     from the signal handler */
1806
  /* Initialize the pseudo-RNG for Avahi */
1807
  srand((unsigned int) time(NULL));
1808
  mc.simple_poll = avahi_simple_poll_new();
1809
  if(mc.simple_poll == NULL){
505.3.3 by teddy at bsnet
* plugins.d/mandos-client.c: Prefix all printouts with "Mandos plugin
1810
    fprintf(stderr, "Mandos plugin mandos-client: "
1811
	    "Avahi: Failed to create simple poll object.\n");
399 by Teddy Hogeborn
* Makefile (BROKEN_PIE): Add comment.
1812
    exitcode = EX_UNAVAILABLE;
24.1.135 by Björn Påhlsson
Earlier signal handling
1813
    goto end;
1814
  }
309 by Teddy Hogeborn
Merge from Björn:
1815
  
24.1.135 by Björn Påhlsson
Earlier signal handling
1816
  sigemptyset(&sigterm_action.sa_mask);
309 by Teddy Hogeborn
Merge from Björn:
1817
  ret = sigaddset(&sigterm_action.sa_mask, SIGINT);
1818
  if(ret == -1){
24.1.174 by Björn Påhlsson
* Makefile (CFLAGS): Added "-lrt" to include real time library.
1819
    perror_plus("sigaddset");
399 by Teddy Hogeborn
* Makefile (BROKEN_PIE): Add comment.
1820
    exitcode = EX_OSERR;
309 by Teddy Hogeborn
Merge from Björn:
1821
    goto end;
1822
  }
1823
  ret = sigaddset(&sigterm_action.sa_mask, SIGHUP);
1824
  if(ret == -1){
24.1.174 by Björn Påhlsson
* Makefile (CFLAGS): Added "-lrt" to include real time library.
1825
    perror_plus("sigaddset");
399 by Teddy Hogeborn
* Makefile (BROKEN_PIE): Add comment.
1826
    exitcode = EX_OSERR;
309 by Teddy Hogeborn
Merge from Björn:
1827
    goto end;
1828
  }
24.1.135 by Björn Påhlsson
Earlier signal handling
1829
  ret = sigaddset(&sigterm_action.sa_mask, SIGTERM);
1830
  if(ret == -1){
24.1.174 by Björn Påhlsson
* Makefile (CFLAGS): Added "-lrt" to include real time library.
1831
    perror_plus("sigaddset");
399 by Teddy Hogeborn
* Makefile (BROKEN_PIE): Add comment.
1832
    exitcode = EX_OSERR;
24.1.135 by Björn Påhlsson
Earlier signal handling
1833
    goto end;
1834
  }
357 by Teddy Hogeborn
* plugins.d/mandos-client.c (main): Do not handle ignored signals.
1835
  /* Need to check if the handler is SIG_IGN before handling:
1836
     | [[info:libc:Initial Signal Actions]] |
1837
     | [[info:libc:Basic Signal Handling]]  |
1838
  */
1839
  ret = sigaction(SIGINT, NULL, &old_sigterm_action);
1840
  if(ret == -1){
24.1.174 by Björn Påhlsson
* Makefile (CFLAGS): Added "-lrt" to include real time library.
1841
    perror_plus("sigaction");
399 by Teddy Hogeborn
* Makefile (BROKEN_PIE): Add comment.
1842
    return EX_OSERR;
357 by Teddy Hogeborn
* plugins.d/mandos-client.c (main): Do not handle ignored signals.
1843
  }
1844
  if(old_sigterm_action.sa_handler != SIG_IGN){
1845
    ret = sigaction(SIGINT, &sigterm_action, NULL);
1846
    if(ret == -1){
24.1.174 by Björn Påhlsson
* Makefile (CFLAGS): Added "-lrt" to include real time library.
1847
      perror_plus("sigaction");
399 by Teddy Hogeborn
* Makefile (BROKEN_PIE): Add comment.
1848
      exitcode = EX_OSERR;
357 by Teddy Hogeborn
* plugins.d/mandos-client.c (main): Do not handle ignored signals.
1849
      goto end;
1850
    }
1851
  }
1852
  ret = sigaction(SIGHUP, NULL, &old_sigterm_action);
1853
  if(ret == -1){
24.1.174 by Björn Påhlsson
* Makefile (CFLAGS): Added "-lrt" to include real time library.
1854
    perror_plus("sigaction");
399 by Teddy Hogeborn
* Makefile (BROKEN_PIE): Add comment.
1855
    return EX_OSERR;
357 by Teddy Hogeborn
* plugins.d/mandos-client.c (main): Do not handle ignored signals.
1856
  }
1857
  if(old_sigterm_action.sa_handler != SIG_IGN){
1858
    ret = sigaction(SIGHUP, &sigterm_action, NULL);
1859
    if(ret == -1){
24.1.174 by Björn Påhlsson
* Makefile (CFLAGS): Added "-lrt" to include real time library.
1860
      perror_plus("sigaction");
399 by Teddy Hogeborn
* Makefile (BROKEN_PIE): Add comment.
1861
      exitcode = EX_OSERR;
357 by Teddy Hogeborn
* plugins.d/mandos-client.c (main): Do not handle ignored signals.
1862
      goto end;
1863
    }
1864
  }
1865
  ret = sigaction(SIGTERM, NULL, &old_sigterm_action);
1866
  if(ret == -1){
24.1.174 by Björn Påhlsson
* Makefile (CFLAGS): Added "-lrt" to include real time library.
1867
    perror_plus("sigaction");
399 by Teddy Hogeborn
* Makefile (BROKEN_PIE): Add comment.
1868
    return EX_OSERR;
357 by Teddy Hogeborn
* plugins.d/mandos-client.c (main): Do not handle ignored signals.
1869
  }
1870
  if(old_sigterm_action.sa_handler != SIG_IGN){
1871
    ret = sigaction(SIGTERM, &sigterm_action, NULL);
1872
    if(ret == -1){
24.1.174 by Björn Påhlsson
* Makefile (CFLAGS): Added "-lrt" to include real time library.
1873
      perror_plus("sigaction");
399 by Teddy Hogeborn
* Makefile (BROKEN_PIE): Add comment.
1874
      exitcode = EX_OSERR;
357 by Teddy Hogeborn
* plugins.d/mandos-client.c (main): Do not handle ignored signals.
1875
      goto end;
1876
    }
354 by Teddy Hogeborn
* plugins.d/mandos-client.c (signal_received): New.
1877
  }
293 by Teddy Hogeborn
* plugin-runner.c: Whitespace changes only.
1878
  
1879
  /* If the interface is down, bring it up */
237.2.33 by teddy at bsnet
* plugins.d/mandos-client.c: An empty interface name now means to
1880
  if(strcmp(interface, "none") != 0){
353 by Teddy Hogeborn
* plugins.d/mandos-client.c (quit_now): Move up declaration before
1881
    if_index = (AvahiIfIndex) if_nametoindex(interface);
1882
    if(if_index == 0){
505.3.3 by teddy at bsnet
* plugins.d/mandos-client.c: Prefix all printouts with "Mandos plugin
1883
      fprintf(stderr, "Mandos plugin mandos-client: "
1884
	      "No such interface: \"%s\"\n", interface);
399 by Teddy Hogeborn
* Makefile (BROKEN_PIE): Add comment.
1885
      exitcode = EX_UNAVAILABLE;
353 by Teddy Hogeborn
* plugins.d/mandos-client.c (quit_now): Move up declaration before
1886
      goto end;
1887
    }
1888
    
1889
    if(quit_now){
1890
      goto end;
1891
    }
1892
    
368 by Teddy Hogeborn
* plugins.d/mandos-client.c (init_gnutls_session): Retry interrupted
1893
    /* Re-raise priviliges */
1894
    errno = 0;
1895
    ret = seteuid(0);
1896
    if(ret == -1){
24.1.174 by Björn Påhlsson
* Makefile (CFLAGS): Added "-lrt" to include real time library.
1897
      perror_plus("seteuid");
368 by Teddy Hogeborn
* plugins.d/mandos-client.c (init_gnutls_session): Retry interrupted
1898
    }
1899
    
293 by Teddy Hogeborn
* plugin-runner.c: Whitespace changes only.
1900
#ifdef __linux__
1901
    /* Lower kernel loglevel to KERN_NOTICE to avoid KERN_INFO
394 by Teddy Hogeborn
Convert some programs to use the exit codes from <sysexits.h>. Change
1902
       messages about the network interface to mess up the prompt */
293 by Teddy Hogeborn
* plugin-runner.c: Whitespace changes only.
1903
    ret = klogctl(8, NULL, 5);
304 by Teddy Hogeborn
Four new interrelated features:
1904
    bool restore_loglevel = true;
293 by Teddy Hogeborn
* plugin-runner.c: Whitespace changes only.
1905
    if(ret == -1){
304 by Teddy Hogeborn
Four new interrelated features:
1906
      restore_loglevel = false;
24.1.174 by Björn Påhlsson
* Makefile (CFLAGS): Added "-lrt" to include real time library.
1907
      perror_plus("klogctl");
293 by Teddy Hogeborn
* plugin-runner.c: Whitespace changes only.
1908
    }
308 by Teddy Hogeborn
* plugin-runner.c: Comment change.
1909
#endif	/* __linux__ */
293 by Teddy Hogeborn
* plugin-runner.c: Whitespace changes only.
1910
    
1911
    sd = socket(PF_INET6, SOCK_DGRAM, IPPROTO_IP);
1912
    if(sd < 0){
24.1.174 by Björn Påhlsson
* Makefile (CFLAGS): Added "-lrt" to include real time library.
1913
      perror_plus("socket");
399 by Teddy Hogeborn
* Makefile (BROKEN_PIE): Add comment.
1914
      exitcode = EX_OSERR;
293 by Teddy Hogeborn
* plugin-runner.c: Whitespace changes only.
1915
#ifdef __linux__
304 by Teddy Hogeborn
Four new interrelated features:
1916
      if(restore_loglevel){
1917
	ret = klogctl(7, NULL, 0);
1918
	if(ret == -1){
24.1.174 by Björn Påhlsson
* Makefile (CFLAGS): Added "-lrt" to include real time library.
1919
	  perror_plus("klogctl");
304 by Teddy Hogeborn
Four new interrelated features:
1920
	}
293 by Teddy Hogeborn
* plugin-runner.c: Whitespace changes only.
1921
      }
308 by Teddy Hogeborn
* plugin-runner.c: Comment change.
1922
#endif	/* __linux__ */
368 by Teddy Hogeborn
* plugins.d/mandos-client.c (init_gnutls_session): Retry interrupted
1923
      /* Lower privileges */
1924
      errno = 0;
1925
      ret = seteuid(uid);
1926
      if(ret == -1){
24.1.174 by Björn Påhlsson
* Makefile (CFLAGS): Added "-lrt" to include real time library.
1927
	perror_plus("seteuid");
368 by Teddy Hogeborn
* plugins.d/mandos-client.c (init_gnutls_session): Retry interrupted
1928
      }
293 by Teddy Hogeborn
* plugin-runner.c: Whitespace changes only.
1929
      goto end;
1930
    }
1931
    strcpy(network.ifr_name, interface);
1932
    ret = ioctl(sd, SIOCGIFFLAGS, &network);
1933
    if(ret == -1){
24.1.174 by Björn Påhlsson
* Makefile (CFLAGS): Added "-lrt" to include real time library.
1934
      perror_plus("ioctl SIOCGIFFLAGS");
293 by Teddy Hogeborn
* plugin-runner.c: Whitespace changes only.
1935
#ifdef __linux__
304 by Teddy Hogeborn
Four new interrelated features:
1936
      if(restore_loglevel){
1937
	ret = klogctl(7, NULL, 0);
1938
	if(ret == -1){
24.1.174 by Björn Påhlsson
* Makefile (CFLAGS): Added "-lrt" to include real time library.
1939
	  perror_plus("klogctl");
304 by Teddy Hogeborn
Four new interrelated features:
1940
	}
293 by Teddy Hogeborn
* plugin-runner.c: Whitespace changes only.
1941
      }
308 by Teddy Hogeborn
* plugin-runner.c: Comment change.
1942
#endif	/* __linux__ */
399 by Teddy Hogeborn
* Makefile (BROKEN_PIE): Add comment.
1943
      exitcode = EX_OSERR;
368 by Teddy Hogeborn
* plugins.d/mandos-client.c (init_gnutls_session): Retry interrupted
1944
      /* Lower privileges */
1945
      errno = 0;
1946
      ret = seteuid(uid);
1947
      if(ret == -1){
24.1.174 by Björn Påhlsson
* Makefile (CFLAGS): Added "-lrt" to include real time library.
1948
	perror_plus("seteuid");
368 by Teddy Hogeborn
* plugins.d/mandos-client.c (init_gnutls_session): Retry interrupted
1949
      }
293 by Teddy Hogeborn
* plugin-runner.c: Whitespace changes only.
1950
      goto end;
1951
    }
1952
    if((network.ifr_flags & IFF_UP) == 0){
1953
      network.ifr_flags |= IFF_UP;
353 by Teddy Hogeborn
* plugins.d/mandos-client.c (quit_now): Move up declaration before
1954
      take_down_interface = true;
293 by Teddy Hogeborn
* plugin-runner.c: Whitespace changes only.
1955
      ret = ioctl(sd, SIOCSIFFLAGS, &network);
1956
      if(ret == -1){
353 by Teddy Hogeborn
* plugins.d/mandos-client.c (quit_now): Move up declaration before
1957
	take_down_interface = false;
24.1.174 by Björn Påhlsson
* Makefile (CFLAGS): Added "-lrt" to include real time library.
1958
	perror_plus("ioctl SIOCSIFFLAGS +IFF_UP");
399 by Teddy Hogeborn
* Makefile (BROKEN_PIE): Add comment.
1959
	exitcode = EX_OSERR;
293 by Teddy Hogeborn
* plugin-runner.c: Whitespace changes only.
1960
#ifdef __linux__
304 by Teddy Hogeborn
Four new interrelated features:
1961
	if(restore_loglevel){
1962
	  ret = klogctl(7, NULL, 0);
1963
	  if(ret == -1){
24.1.174 by Björn Påhlsson
* Makefile (CFLAGS): Added "-lrt" to include real time library.
1964
	    perror_plus("klogctl");
304 by Teddy Hogeborn
Four new interrelated features:
1965
	  }
24.1.124 by Björn Påhlsson
Added lower kernel loglevel to reduce clutter on system console.
1966
	}
308 by Teddy Hogeborn
* plugin-runner.c: Comment change.
1967
#endif	/* __linux__ */
368 by Teddy Hogeborn
* plugins.d/mandos-client.c (init_gnutls_session): Retry interrupted
1968
	/* Lower privileges */
1969
	errno = 0;
1970
	ret = seteuid(uid);
1971
	if(ret == -1){
24.1.174 by Björn Påhlsson
* Makefile (CFLAGS): Added "-lrt" to include real time library.
1972
	  perror_plus("seteuid");
368 by Teddy Hogeborn
* plugins.d/mandos-client.c (init_gnutls_session): Retry interrupted
1973
	}
65 by Teddy Hogeborn
* plugins.d/password-request.c (main): Bug fix: Bring up network
1974
	goto end;
1975
      }
293 by Teddy Hogeborn
* plugin-runner.c: Whitespace changes only.
1976
    }
485 by Teddy Hogeborn
Merge from Björn.
1977
    /* Sleep checking until interface is running.
1978
       Check every 0.25s, up to total time of delay */
293 by Teddy Hogeborn
* plugin-runner.c: Whitespace changes only.
1979
    for(int i=0; i < delay * 4; i++){
65 by Teddy Hogeborn
* plugins.d/password-request.c (main): Bug fix: Bring up network
1980
      ret = ioctl(sd, SIOCGIFFLAGS, &network);
1981
      if(ret == -1){
24.1.174 by Björn Påhlsson
* Makefile (CFLAGS): Added "-lrt" to include real time library.
1982
	perror_plus("ioctl SIOCGIFFLAGS");
293 by Teddy Hogeborn
* plugin-runner.c: Whitespace changes only.
1983
      } else if(network.ifr_flags & IFF_RUNNING){
1984
	break;
1985
      }
1986
      struct timespec sleeptime = { .tv_nsec = 250000000 };
1987
      ret = nanosleep(&sleeptime, NULL);
1988
      if(ret == -1 and errno != EINTR){
24.1.174 by Björn Påhlsson
* Makefile (CFLAGS): Added "-lrt" to include real time library.
1989
	perror_plus("nanosleep");
293 by Teddy Hogeborn
* plugin-runner.c: Whitespace changes only.
1990
      }
1991
    }
353 by Teddy Hogeborn
* plugins.d/mandos-client.c (quit_now): Move up declaration before
1992
    if(not take_down_interface){
1993
      /* We won't need the socket anymore */
350 by Teddy Hogeborn
* plugins.d/mandos-client.c (main): Take down network interface on
1994
      ret = (int)TEMP_FAILURE_RETRY(close(sd));
1995
      if(ret == -1){
24.1.174 by Björn Påhlsson
* Makefile (CFLAGS): Added "-lrt" to include real time library.
1996
	perror_plus("close");
350 by Teddy Hogeborn
* plugins.d/mandos-client.c (main): Take down network interface on
1997
      }
293 by Teddy Hogeborn
* plugin-runner.c: Whitespace changes only.
1998
    }
1999
#ifdef __linux__
304 by Teddy Hogeborn
Four new interrelated features:
2000
    if(restore_loglevel){
2001
      /* Restores kernel loglevel to default */
2002
      ret = klogctl(7, NULL, 0);
2003
      if(ret == -1){
24.1.174 by Björn Påhlsson
* Makefile (CFLAGS): Added "-lrt" to include real time library.
2004
	perror_plus("klogctl");
304 by Teddy Hogeborn
Four new interrelated features:
2005
      }
293 by Teddy Hogeborn
* plugin-runner.c: Whitespace changes only.
2006
    }
308 by Teddy Hogeborn
* plugin-runner.c: Comment change.
2007
#endif	/* __linux__ */
368 by Teddy Hogeborn
* plugins.d/mandos-client.c (init_gnutls_session): Retry interrupted
2008
    /* Lower privileges */
2009
    errno = 0;
2010
    if(take_down_interface){
2011
      /* Lower privileges */
2012
      ret = seteuid(uid);
2013
      if(ret == -1){
24.1.174 by Björn Påhlsson
* Makefile (CFLAGS): Added "-lrt" to include real time library.
2014
	perror_plus("seteuid");
368 by Teddy Hogeborn
* plugins.d/mandos-client.c (init_gnutls_session): Retry interrupted
2015
      }
2016
    } else {
2017
      /* Lower privileges permanently */
2018
      ret = setuid(uid);
2019
      if(ret == -1){
24.1.174 by Björn Påhlsson
* Makefile (CFLAGS): Added "-lrt" to include real time library.
2020
	perror_plus("setuid");
368 by Teddy Hogeborn
* plugins.d/mandos-client.c (init_gnutls_session): Retry interrupted
2021
      }
365 by Teddy Hogeborn
* plugins.d/mandos-client.c (main): Bug fix: Check result of setgid().
2022
    }
293 by Teddy Hogeborn
* plugin-runner.c: Whitespace changes only.
2023
  }
2024
  
353 by Teddy Hogeborn
* plugins.d/mandos-client.c (quit_now): Move up declaration before
2025
  if(quit_now){
2026
    goto end;
2027
  }
2028
  
24.1.134 by Björn Påhlsson
plugin-runner: Added support for empty string arguments
2029
  ret = init_gnutls_global(pubkey, seckey);
293 by Teddy Hogeborn
* plugin-runner.c: Whitespace changes only.
2030
  if(ret == -1){
505.3.3 by teddy at bsnet
* plugins.d/mandos-client.c: Prefix all printouts with "Mandos plugin
2031
    fprintf(stderr, "Mandos plugin mandos-client: "
2032
	    "init_gnutls_global failed\n");
399 by Teddy Hogeborn
* Makefile (BROKEN_PIE): Add comment.
2033
    exitcode = EX_UNAVAILABLE;
293 by Teddy Hogeborn
* plugin-runner.c: Whitespace changes only.
2034
    goto end;
2035
  } else {
2036
    gnutls_initialized = true;
2037
  }
2038
  
353 by Teddy Hogeborn
* plugins.d/mandos-client.c (quit_now): Move up declaration before
2039
  if(quit_now){
2040
    goto end;
2041
  }
2042
  
293 by Teddy Hogeborn
* plugin-runner.c: Whitespace changes only.
2043
  if(mkdtemp(tempdir) == NULL){
24.1.174 by Björn Påhlsson
* Makefile (CFLAGS): Added "-lrt" to include real time library.
2044
    perror_plus("mkdtemp");
293 by Teddy Hogeborn
* plugin-runner.c: Whitespace changes only.
2045
    goto end;
2046
  }
24.1.172 by Björn Påhlsson
using scandir instead of readdir
2047
  tempdir_created = true;
353 by Teddy Hogeborn
* plugins.d/mandos-client.c (quit_now): Move up declaration before
2048
  
2049
  if(quit_now){
2050
    goto end;
2051
  }
293 by Teddy Hogeborn
* plugin-runner.c: Whitespace changes only.
2052
  
24.1.134 by Björn Påhlsson
plugin-runner: Added support for empty string arguments
2053
  if(not init_gpgme(pubkey, seckey, tempdir)){
505.3.3 by teddy at bsnet
* plugins.d/mandos-client.c: Prefix all printouts with "Mandos plugin
2054
    fprintf(stderr, "Mandos plugin mandos-client: "
2055
	    "init_gpgme failed\n");
399 by Teddy Hogeborn
* Makefile (BROKEN_PIE): Add comment.
2056
    exitcode = EX_UNAVAILABLE;
293 by Teddy Hogeborn
* plugin-runner.c: Whitespace changes only.
2057
    goto end;
2058
  } else {
2059
    gpgme_initialized = true;
2060
  }
2061
  
353 by Teddy Hogeborn
* plugins.d/mandos-client.c (quit_now): Move up declaration before
2062
  if(quit_now){
2063
    goto end;
293 by Teddy Hogeborn
* plugin-runner.c: Whitespace changes only.
2064
  }
2065
  
2066
  if(connect_to != NULL){
2067
    /* Connect directly, do not use Zeroconf */
2068
    /* (Mainly meant for debugging) */
2069
    char *address = strrchr(connect_to, ':');
2070
    if(address == NULL){
505.3.3 by teddy at bsnet
* plugins.d/mandos-client.c: Prefix all printouts with "Mandos plugin
2071
      fprintf(stderr, "Mandos plugin mandos-client: "
2072
	      "No colon in address\n");
399 by Teddy Hogeborn
* Makefile (BROKEN_PIE): Add comment.
2073
      exitcode = EX_USAGE;
293 by Teddy Hogeborn
* plugin-runner.c: Whitespace changes only.
2074
      goto end;
2075
    }
353 by Teddy Hogeborn
* plugins.d/mandos-client.c (quit_now): Move up declaration before
2076
    
2077
    if(quit_now){
2078
      goto end;
2079
    }
2080
    
293 by Teddy Hogeborn
* plugin-runner.c: Whitespace changes only.
2081
    uint16_t port;
311 by Teddy Hogeborn
Overflows are not detected by sscanf(), so stop using it:
2082
    errno = 0;
2083
    tmpmax = strtoimax(address+1, &tmp, 10);
2084
    if(errno != 0 or tmp == address+1 or *tmp != '\0'
2085
       or tmpmax != (uint16_t)tmpmax){
505.3.3 by teddy at bsnet
* plugins.d/mandos-client.c: Prefix all printouts with "Mandos plugin
2086
      fprintf(stderr, "Mandos plugin mandos-client: "
2087
	      "Bad port number\n");
399 by Teddy Hogeborn
* Makefile (BROKEN_PIE): Add comment.
2088
      exitcode = EX_USAGE;
293 by Teddy Hogeborn
* plugin-runner.c: Whitespace changes only.
2089
      goto end;
2090
    }
353 by Teddy Hogeborn
* plugins.d/mandos-client.c (quit_now): Move up declaration before
2091
  
2092
    if(quit_now){
2093
      goto end;
2094
    }
2095
    
293 by Teddy Hogeborn
* plugin-runner.c: Whitespace changes only.
2096
    port = (uint16_t)tmpmax;
2097
    *address = '\0';
304 by Teddy Hogeborn
Four new interrelated features:
2098
    /* Colon in address indicates IPv6 */
2099
    int af;
491 by teddy at bsnet
* plugins.d/mandos-client.c (avahi_loop_with_timeout): Fix warning.
2100
    if(strchr(connect_to, ':') != NULL){
304 by Teddy Hogeborn
Four new interrelated features:
2101
      af = AF_INET6;
491 by teddy at bsnet
* plugins.d/mandos-client.c (avahi_loop_with_timeout): Fix warning.
2102
      /* Accept [] around IPv6 address - see RFC 5952 */
2103
      if(connect_to[0] == '[' and address[-1] == ']')
2104
	{
2105
	  connect_to++;
2106
	  address[-1] = '\0';
2107
	}
304 by Teddy Hogeborn
Four new interrelated features:
2108
    } else {
2109
      af = AF_INET;
2110
    }
491 by teddy at bsnet
* plugins.d/mandos-client.c (avahi_loop_with_timeout): Fix warning.
2111
    address = connect_to;
353 by Teddy Hogeborn
* plugins.d/mandos-client.c (quit_now): Move up declaration before
2112
    
2113
    if(quit_now){
2114
      goto end;
2115
    }
491 by teddy at bsnet
* plugins.d/mandos-client.c (avahi_loop_with_timeout): Fix warning.
2116
    
24.1.163 by Björn Påhlsson
mandos-client: Added never ending loop for --connect
2117
    while(not quit_now){
2118
      ret = start_mandos_communication(address, port, if_index, af);
2119
      if(quit_now or ret == 0){
399 by Teddy Hogeborn
* Makefile (BROKEN_PIE): Add comment.
2120
	break;
2121
      }
491 by teddy at bsnet
* plugins.d/mandos-client.c (avahi_loop_with_timeout): Fix warning.
2122
      if(debug){
505.3.3 by teddy at bsnet
* plugins.d/mandos-client.c: Prefix all printouts with "Mandos plugin
2123
	fprintf(stderr, "Mandos plugin mandos-client: "
2124
		"Retrying in %d seconds\n", (int)retry_interval);
491 by teddy at bsnet
* plugins.d/mandos-client.c (avahi_loop_with_timeout): Fix warning.
2125
      }
2126
      sleep((int)retry_interval);
492 by Teddy Hogeborn
* plugins.d/mandos-client.c (main): Do not even try to work around
2127
    }
2128
    
24.1.163 by Björn Påhlsson
mandos-client: Added never ending loop for --connect
2129
    if (not quit_now){
293 by Teddy Hogeborn
* plugin-runner.c: Whitespace changes only.
2130
      exitcode = EXIT_SUCCESS;
2131
    }
505.2.3 by Teddy Hogeborn
Intermediate commit - this does *not* work yet.
2132
    
293 by Teddy Hogeborn
* plugin-runner.c: Whitespace changes only.
2133
    goto end;
2134
  }
353 by Teddy Hogeborn
* plugins.d/mandos-client.c (quit_now): Move up declaration before
2135
  
2136
  if(quit_now){
2137
    goto end;
2138
  }
2139
  
293 by Teddy Hogeborn
* plugin-runner.c: Whitespace changes only.
2140
  {
2141
    AvahiServerConfig config;
2142
    /* Do not publish any local Zeroconf records */
2143
    avahi_server_config_init(&config);
2144
    config.publish_hinfo = 0;
2145
    config.publish_addresses = 0;
2146
    config.publish_workstation = 0;
2147
    config.publish_domain = 0;
2148
    
2149
    /* Allocate a new server */
2150
    mc.server = avahi_server_new(avahi_simple_poll_get
2151
				 (mc.simple_poll), &config, NULL,
2152
				 NULL, &error);
2153
    
2154
    /* Free the Avahi configuration data */
2155
    avahi_server_config_free(&config);
2156
  }
2157
  
2158
  /* Check if creating the Avahi server object succeeded */
2159
  if(mc.server == NULL){
505.3.3 by teddy at bsnet
* plugins.d/mandos-client.c: Prefix all printouts with "Mandos plugin
2160
    fprintf(stderr, "Mandos plugin mandos-client: "
2161
	    "Failed to create Avahi server: %s\n",
293 by Teddy Hogeborn
* plugin-runner.c: Whitespace changes only.
2162
	    avahi_strerror(error));
399 by Teddy Hogeborn
* Makefile (BROKEN_PIE): Add comment.
2163
    exitcode = EX_UNAVAILABLE;
293 by Teddy Hogeborn
* plugin-runner.c: Whitespace changes only.
2164
    goto end;
2165
  }
2166
  
353 by Teddy Hogeborn
* plugins.d/mandos-client.c (quit_now): Move up declaration before
2167
  if(quit_now){
2168
    goto end;
2169
  }
2170
  
293 by Teddy Hogeborn
* plugin-runner.c: Whitespace changes only.
2171
  /* Create the Avahi service browser */
2172
  sb = avahi_s_service_browser_new(mc.server, if_index,
313 by Teddy Hogeborn
* plugins.d/mandos-client.c (browse_callback, main): Do not require
2173
				   AVAHI_PROTO_UNSPEC, "_mandos._tcp",
24.1.134 by Björn Påhlsson
plugin-runner: Added support for empty string arguments
2174
				   NULL, 0, browse_callback, NULL);
293 by Teddy Hogeborn
* plugin-runner.c: Whitespace changes only.
2175
  if(sb == NULL){
505.3.3 by teddy at bsnet
* plugins.d/mandos-client.c: Prefix all printouts with "Mandos plugin
2176
    fprintf(stderr, "Mandos plugin mandos-client: "
2177
	    "Failed to create service browser: %s\n",
293 by Teddy Hogeborn
* plugin-runner.c: Whitespace changes only.
2178
	    avahi_strerror(avahi_server_errno(mc.server)));
399 by Teddy Hogeborn
* Makefile (BROKEN_PIE): Add comment.
2179
    exitcode = EX_UNAVAILABLE;
293 by Teddy Hogeborn
* plugin-runner.c: Whitespace changes only.
2180
    goto end;
2181
  }
307 by Teddy Hogeborn
Merge from Björn:
2182
  
353 by Teddy Hogeborn
* plugins.d/mandos-client.c (quit_now): Move up declaration before
2183
  if(quit_now){
2184
    goto end;
2185
  }
2186
  
293 by Teddy Hogeborn
* plugin-runner.c: Whitespace changes only.
2187
  /* Run the main loop */
2188
  
2189
  if(debug){
505.3.3 by teddy at bsnet
* plugins.d/mandos-client.c: Prefix all printouts with "Mandos plugin
2190
    fprintf(stderr, "Mandos plugin mandos-client: "
2191
	    "Starting Avahi loop search\n");
293 by Teddy Hogeborn
* plugin-runner.c: Whitespace changes only.
2192
  }
24.1.174 by Björn Påhlsson
* Makefile (CFLAGS): Added "-lrt" to include real time library.
2193
485 by Teddy Hogeborn
Merge from Björn.
2194
  ret = avahi_loop_with_timeout(mc.simple_poll,
2195
				(int)(retry_interval * 1000));
24.1.174 by Björn Påhlsson
* Makefile (CFLAGS): Added "-lrt" to include real time library.
2196
  if(debug){
505.3.3 by teddy at bsnet
* plugins.d/mandos-client.c: Prefix all printouts with "Mandos plugin
2197
    fprintf(stderr, "Mandos plugin mandos-client: "
2198
	    "avahi_loop_with_timeout exited %s\n",
24.1.174 by Björn Påhlsson
* Makefile (CFLAGS): Added "-lrt" to include real time library.
2199
	    (ret == 0) ? "successfully" : "with error");
2200
  }
293 by Teddy Hogeborn
* plugin-runner.c: Whitespace changes only.
2201
  
40 by Teddy Hogeborn
* plugins.d/mandosclient.c (initgnutls): Moved "err" variable into its
2202
 end:
293 by Teddy Hogeborn
* plugin-runner.c: Whitespace changes only.
2203
  
2204
  if(debug){
505.3.3 by teddy at bsnet
* plugins.d/mandos-client.c: Prefix all printouts with "Mandos plugin
2205
    fprintf(stderr, "Mandos plugin mandos-client: "
2206
	    "%s exiting\n", argv[0]);
293 by Teddy Hogeborn
* plugin-runner.c: Whitespace changes only.
2207
  }
2208
  
2209
  /* Cleanup things */
2210
  if(sb != NULL)
2211
    avahi_s_service_browser_free(sb);
2212
  
2213
  if(mc.server != NULL)
2214
    avahi_server_free(mc.server);
2215
  
2216
  if(mc.simple_poll != NULL)
2217
    avahi_simple_poll_free(mc.simple_poll);
2218
  
2219
  if(gnutls_initialized){
2220
    gnutls_certificate_free_credentials(mc.cred);
2221
    gnutls_global_deinit();
2222
    gnutls_dh_params_deinit(mc.dh_params);
2223
  }
2224
  
2225
  if(gpgme_initialized){
2226
    gpgme_release(mc.ctx);
2227
  }
24.1.174 by Björn Påhlsson
* Makefile (CFLAGS): Added "-lrt" to include real time library.
2228
485 by Teddy Hogeborn
Merge from Björn.
2229
  /* Cleans up the circular linked list of Mandos servers the client
2230
     has seen */
24.1.174 by Björn Påhlsson
* Makefile (CFLAGS): Added "-lrt" to include real time library.
2231
  if(mc.current_server != NULL){
2232
    mc.current_server->prev->next = NULL;
2233
    while(mc.current_server != NULL){
2234
      server *next = mc.current_server->next;
2235
      free(mc.current_server);
2236
      mc.current_server = next;
2237
    }
2238
  }
293 by Teddy Hogeborn
* plugin-runner.c: Whitespace changes only.
2239
  
505.2.3 by Teddy Hogeborn
Intermediate commit - this does *not* work yet.
2240
  /* XXX run network hooks "stop" here  */
2241
  
350 by Teddy Hogeborn
* plugins.d/mandos-client.c (main): Take down network interface on
2242
  /* Take down the network interface */
353 by Teddy Hogeborn
* plugins.d/mandos-client.c (quit_now): Move up declaration before
2243
  if(take_down_interface){
365 by Teddy Hogeborn
* plugins.d/mandos-client.c (main): Bug fix: Check result of setgid().
2244
    /* Re-raise priviliges */
2245
    errno = 0;
2246
    ret = seteuid(0);
350 by Teddy Hogeborn
* plugins.d/mandos-client.c (main): Take down network interface on
2247
    if(ret == -1){
24.1.174 by Björn Påhlsson
* Makefile (CFLAGS): Added "-lrt" to include real time library.
2248
      perror_plus("seteuid");
350 by Teddy Hogeborn
* plugins.d/mandos-client.c (main): Take down network interface on
2249
    }
365 by Teddy Hogeborn
* plugins.d/mandos-client.c (main): Bug fix: Check result of setgid().
2250
    if(geteuid() == 0){
2251
      ret = ioctl(sd, SIOCGIFFLAGS, &network);
2252
      if(ret == -1){
24.1.174 by Björn Påhlsson
* Makefile (CFLAGS): Added "-lrt" to include real time library.
2253
	perror_plus("ioctl SIOCGIFFLAGS");
505.3.3 by teddy at bsnet
* plugins.d/mandos-client.c: Prefix all printouts with "Mandos plugin
2254
      } else if(network.ifr_flags & IFF_UP){
394 by Teddy Hogeborn
Convert some programs to use the exit codes from <sysexits.h>. Change
2255
	network.ifr_flags &= ~(short)IFF_UP; /* clear flag */
365 by Teddy Hogeborn
* plugins.d/mandos-client.c (main): Bug fix: Check result of setgid().
2256
	ret = ioctl(sd, SIOCSIFFLAGS, &network);
2257
	if(ret == -1){
24.1.174 by Björn Påhlsson
* Makefile (CFLAGS): Added "-lrt" to include real time library.
2258
	  perror_plus("ioctl SIOCSIFFLAGS -IFF_UP");
365 by Teddy Hogeborn
* plugins.d/mandos-client.c (main): Bug fix: Check result of setgid().
2259
	}
2260
      }
2261
      ret = (int)TEMP_FAILURE_RETRY(close(sd));
2262
      if(ret == -1){
24.1.174 by Björn Påhlsson
* Makefile (CFLAGS): Added "-lrt" to include real time library.
2263
	perror_plus("close");
365 by Teddy Hogeborn
* plugins.d/mandos-client.c (main): Bug fix: Check result of setgid().
2264
      }
368 by Teddy Hogeborn
* plugins.d/mandos-client.c (init_gnutls_session): Retry interrupted
2265
      /* Lower privileges permanently */
365 by Teddy Hogeborn
* plugins.d/mandos-client.c (main): Bug fix: Check result of setgid().
2266
      errno = 0;
2267
      ret = setuid(uid);
2268
      if(ret == -1){
24.1.174 by Björn Påhlsson
* Makefile (CFLAGS): Added "-lrt" to include real time library.
2269
	perror_plus("setuid");
365 by Teddy Hogeborn
* plugins.d/mandos-client.c (main): Bug fix: Check result of setgid().
2270
      }
350 by Teddy Hogeborn
* plugins.d/mandos-client.c (main): Take down network interface on
2271
    }
2272
  }
2273
  
24.1.172 by Björn Påhlsson
using scandir instead of readdir
2274
  /* Removes the GPGME temp directory and all files inside */
293 by Teddy Hogeborn
* plugin-runner.c: Whitespace changes only.
2275
  if(tempdir_created){
24.1.172 by Björn Påhlsson
using scandir instead of readdir
2276
    struct dirent **direntries = NULL;
2277
    struct dirent *direntry = NULL;
492 by Teddy Hogeborn
* plugins.d/mandos-client.c (main): Do not even try to work around
2278
    int numentries = scandir(tempdir, &direntries, notdotentries,
2279
			     alphasort);
2280
    if (numentries > 0){
2281
      for(int i = 0; i < numentries; i++){
24.1.172 by Björn Påhlsson
using scandir instead of readdir
2282
	direntry = direntries[i];
293 by Teddy Hogeborn
* plugin-runner.c: Whitespace changes only.
2283
	char *fullname = NULL;
2284
	ret = asprintf(&fullname, "%s/%s", tempdir,
2285
		       direntry->d_name);
2286
	if(ret < 0){
24.1.174 by Björn Påhlsson
* Makefile (CFLAGS): Added "-lrt" to include real time library.
2287
	  perror_plus("asprintf");
293 by Teddy Hogeborn
* plugin-runner.c: Whitespace changes only.
2288
	  continue;
2289
	}
2290
	ret = remove(fullname);
2291
	if(ret == -1){
505.3.3 by teddy at bsnet
* plugins.d/mandos-client.c: Prefix all printouts with "Mandos plugin
2292
	  fprintf(stderr, "Mandos plugin mandos-client: "
2293
		  "remove(\"%s\"): %s\n", fullname, strerror(errno));
293 by Teddy Hogeborn
* plugin-runner.c: Whitespace changes only.
2294
	}
2295
	free(fullname);
2296
      }
24.1.172 by Björn Påhlsson
using scandir instead of readdir
2297
    }
2298
492 by Teddy Hogeborn
* plugins.d/mandos-client.c (main): Do not even try to work around
2299
    /* need to clean even if 0 because man page doesn't specify */
24.1.172 by Björn Påhlsson
using scandir instead of readdir
2300
    free(direntries);
492 by Teddy Hogeborn
* plugins.d/mandos-client.c (main): Do not even try to work around
2301
    if (numentries == -1){
24.1.174 by Björn Påhlsson
* Makefile (CFLAGS): Added "-lrt" to include real time library.
2302
      perror_plus("scandir");
293 by Teddy Hogeborn
* plugin-runner.c: Whitespace changes only.
2303
    }
2304
    ret = rmdir(tempdir);
2305
    if(ret == -1 and errno != ENOENT){
24.1.174 by Björn Påhlsson
* Makefile (CFLAGS): Added "-lrt" to include real time library.
2306
      perror_plus("rmdir");
293 by Teddy Hogeborn
* plugin-runner.c: Whitespace changes only.
2307
    }
2308
  }
2309
  
354 by Teddy Hogeborn
* plugins.d/mandos-client.c (signal_received): New.
2310
  if(quit_now){
357 by Teddy Hogeborn
* plugins.d/mandos-client.c (main): Do not handle ignored signals.
2311
    sigemptyset(&old_sigterm_action.sa_mask);
2312
    old_sigterm_action.sa_handler = SIG_DFL;
374 by Teddy Hogeborn
* plugins.d/mandos-client.c (main): Try harder to raise signal on
2313
    ret = (int)TEMP_FAILURE_RETRY(sigaction(signal_received,
2314
					    &old_sigterm_action,
2315
					    NULL));
354 by Teddy Hogeborn
* plugins.d/mandos-client.c (signal_received): New.
2316
    if(ret == -1){
24.1.174 by Björn Påhlsson
* Makefile (CFLAGS): Added "-lrt" to include real time library.
2317
      perror_plus("sigaction");
354 by Teddy Hogeborn
* plugins.d/mandos-client.c (signal_received): New.
2318
    }
374 by Teddy Hogeborn
* plugins.d/mandos-client.c (main): Try harder to raise signal on
2319
    do {
2320
      ret = raise(signal_received);
2321
    } while(ret != 0 and errno == EINTR);
2322
    if(ret != 0){
24.1.174 by Björn Påhlsson
* Makefile (CFLAGS): Added "-lrt" to include real time library.
2323
      perror_plus("raise");
374 by Teddy Hogeborn
* plugins.d/mandos-client.c (main): Try harder to raise signal on
2324
      abort();
2325
    }
2326
    TEMP_FAILURE_RETRY(pause());
354 by Teddy Hogeborn
* plugins.d/mandos-client.c (signal_received): New.
2327
  }
2328
  
293 by Teddy Hogeborn
* plugin-runner.c: Whitespace changes only.
2329
  return exitcode;
13 by Björn Påhlsson
Added following support:
2330
}