/mandos/release

To get this branch, use:
bzr branch http://bzr.recompile.se/loggerhead/mandos/release
21 by Teddy Hogeborn
* Makefile (CFLAGS): Changed to use $(WARN), $(DEBUG), $(COVERAGE) and
1
/*  -*- coding: utf-8 -*- */
2
/*
237.2.24 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
237.7.14 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
 * 
237.11.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() */
237.2.80 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
237.2.80 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
237.2.80 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(),
237.2.74 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 */
237.2.162 by Teddy Hogeborn
* Makefile (BROKEN_PIE): Add comment.
46
#include <stdlib.h> 		/* free(), EXIT_SUCCESS, srand(),
47
				   strtof(), abort() */
237.2.67 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() */
237.2.67 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,
237.2.67 by Teddy Hogeborn
Four new interrelated features:
54
				   SOCK_STREAM, uid_t, gid_t, open(),
55
				   opendir(), DIR */
237.16.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,
237.2.67 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() */
237.2.29 by Teddy Hogeborn
* plugin-runner.c: Only space changes.
60
#include <dirent.h>		/* opendir(), struct dirent, readdir()
61
				 */
237.2.74 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() */
237.7.33 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 */
237.2.67 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(),
237.2.128 by Teddy Hogeborn
* plugins.d/mandos-client.c (main): Bug fix: Check result of setgid().
75
				   getuid(), getgid(), seteuid(),
237.2.137 by Teddy Hogeborn
* plugins.d/mandos-client.c (main): Try harder to raise signal on
76
				   setgid(), pause() */
237.7.32 by Teddy Hogeborn
* Makefile (plugins.d/mandos-client): Bug fix: Put $^ before all
77
#include <arpa/inet.h>		/* inet_pton(), htons, inet_ntop() */
237.2.67 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 */
237.2.70 by Teddy Hogeborn
Merge from Björn:
83
#include <signal.h>		/* sigemptyset(), sigaddset(),
237.2.117 by Teddy Hogeborn
* plugins.d/mandos-client.c (signal_received): New.
84
				   sigaction(), SIGTERM, sig_atomic_t,
85
				   raise() */
237.2.162 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 */
237.16.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() */
237.2.70 by Teddy Hogeborn
Merge from Björn:
90
237.2.56 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() */
237.2.71 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_* */
237.2.29 by Teddy Hogeborn
* plugin-runner.c: Only space changes.
112
#include <gnutls/openpgp.h>
237.16.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"
237.15.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;
237.11.2 by Teddy Hogeborn
Change "fukt.bsnet.se" to "recompile.se" throughout.
133
const char *argp_program_bug_address = "<mandos@recompile.se>";
269.1.1 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;
237.16.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
237.7.33 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"
237.7.33 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
237.2.134 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){
237.7.33 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
/*
237.2.71 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,
237.16.6 by teddy at bsnet
* plugins.d/mandos-client.c: Some white space fixes.
183
		 size_t buffer_capacity){
237.2.29 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);
237.2.29 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
237.7.39 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 */
237.16.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),
237.16.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");
237.7.33 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
  }
237.7.39 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;
237.7.39 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
 */
237.16.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
  /*
237.2.51 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){
237.2.124 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
    
237.3.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);
237.2.29 by Teddy Hogeborn
* plugin-runner.c: Only space changes.
255
    if(rc != GPG_ERR_NO_ERROR){
237.16.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);
237.2.29 by Teddy Hogeborn
* plugin-runner.c: Only space changes.
263
    if(rc != GPG_ERR_NO_ERROR){
237.16.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
    
237.3.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
  
237.2.29 by Teddy Hogeborn
* plugin-runner.c: Only space changes.
278
  if(debug){
237.16.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);
237.2.29 by Teddy Hogeborn
* plugin-runner.c: Only space changes.
286
  if(rc != GPG_ERR_NO_ERROR){
237.16.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
  
237.7.40 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 */
237.2.29 by Teddy Hogeborn
* plugin-runner.c: Only space changes.
294
  rc = gpgme_get_engine_info(&engine_info);
295
  if(rc != GPG_ERR_NO_ERROR){
237.16.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){
237.16.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));
237.2.29 by Teddy Hogeborn
* plugin-runner.c: Only space changes.
317
  if(rc != GPG_ERR_NO_ERROR){
237.16.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
  
237.2.29 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
  
237.2.118 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,
237.2.29 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
  
237.2.29 by Teddy Hogeborn
* plugin-runner.c: Only space changes.
344
  if(debug){
237.16.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);
237.2.29 by Teddy Hogeborn
* plugin-runner.c: Only space changes.
352
  if(rc != GPG_ERR_NO_ERROR){
237.16.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);
237.2.29 by Teddy Hogeborn
* plugin-runner.c: Only space changes.
361
  if(rc != GPG_ERR_NO_ERROR){
237.16.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);
237.2.29 by Teddy Hogeborn
* plugin-runner.c: Only space changes.
372
  if(rc != GPG_ERR_NO_ERROR){
237.16.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;
237.2.29 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);
237.2.29 by Teddy Hogeborn
* plugin-runner.c: Only space changes.
380
      if(result == NULL){
237.16.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 {
237.16.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);
237.16.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){
237.16.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;
237.2.112 by Teddy Hogeborn
* plugins.d/mandos-client.c (pgp_packet_decrypt): Remove redundant
396
	while(recipient != NULL){
237.16.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",
237.2.112 by Teddy Hogeborn
* plugins.d/mandos-client.c (pgp_packet_decrypt): Remove redundant
399
		  gpgme_pubkey_algo_name(recipient->pubkey_algo));
237.16.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",
237.2.112 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){
237.16.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 */
237.2.29 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,
237.16.6 by teddy at bsnet
* plugins.d/mandos-client.c: Some white space fixes.
428
				   (size_t)plaintext_length,
429
				   plaintext_capacity);
237.2.29 by Teddy Hogeborn
* plugin-runner.c: Only space changes.
430
    if(plaintext_capacity == 0){
237.16.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 */
237.2.29 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){
237.16.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
237.2.56 by Teddy Hogeborn
* plugin-runner.c: Whitespace changes only.
470
static const char * safer_gnutls_strerror(int value){
237.2.30 by Teddy Hogeborn
* plugins.d/mandos-client.c: Only comment changes.
471
  const char *ret = gnutls_strerror(value); /* Spurious warning from
472
					       -Wunreachable-code */
237.2.29 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){
237.16.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){
237.16.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();
237.2.56 by Teddy Hogeborn
* plugin-runner.c: Whitespace changes only.
494
  if(ret != GNUTLS_E_SUCCESS){
237.16.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
  
237.2.29 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 */
237.7.32 by Teddy Hogeborn
* Makefile (plugins.d/mandos-client): Bug fix: Put $^ before all
509
  ret = gnutls_certificate_allocate_credentials(&mc.cred);
237.2.29 by Teddy Hogeborn
* plugin-runner.c: Only space changes.
510
  if(ret != GNUTLS_E_SUCCESS){
237.16.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));
237.2.29 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){
237.16.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);
237.2.56 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,
237.16.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);
237.16.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);
237.2.56 by Teddy Hogeborn
* plugin-runner.c: Whitespace changes only.
539
  if(ret != GNUTLS_E_SUCCESS){
237.16.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:"
237.2.29 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);
237.2.56 by Teddy Hogeborn
* plugin-runner.c: Whitespace changes only.
546
  if(ret != GNUTLS_E_SUCCESS){
237.16.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",
237.2.29 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 */
237.2.131 by Teddy Hogeborn
* plugins.d/mandos-client.c (init_gnutls_session): Retry interrupted
568
  do {
569
    ret = gnutls_init(session, GNUTLS_SERVER);
237.2.134 by Teddy Hogeborn
* plugins.d/mandos-client.c (init_gnutls_session): Always fail and
570
    if(quit_now){
571
      return -1;
572
    }
237.2.131 by Teddy Hogeborn
* plugins.d/mandos-client.c (init_gnutls_session): Retry interrupted
573
  } while(ret == GNUTLS_E_INTERRUPTED or ret == GNUTLS_E_AGAIN);
237.2.29 by Teddy Hogeborn
* plugin-runner.c: Only space changes.
574
  if(ret != GNUTLS_E_SUCCESS){
237.16.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;
237.2.131 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);
237.2.134 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
      }
237.2.131 by Teddy Hogeborn
* plugins.d/mandos-client.c (init_gnutls_session): Retry interrupted
588
    } while(ret == GNUTLS_E_INTERRUPTED or ret == GNUTLS_E_AGAIN);
237.2.56 by Teddy Hogeborn
* plugin-runner.c: Whitespace changes only.
589
    if(ret != GNUTLS_E_SUCCESS){
237.16.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));
237.2.29 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
  
237.2.131 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);
237.2.134 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
    }
237.2.131 by Teddy Hogeborn
* plugins.d/mandos-client.c (init_gnutls_session): Retry interrupted
606
  } while(ret == GNUTLS_E_INTERRUPTED or ret == GNUTLS_E_AGAIN);
237.2.56 by Teddy Hogeborn
* plugin-runner.c: Whitespace changes only.
607
  if(ret != GNUTLS_E_SUCCESS){
237.16.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));
237.2.29 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. */
237.2.131 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){
237.2.121 by Teddy Hogeborn
* plugins.d/mandos-client.c (start_mandos_communication): Check
631
  int ret, tcp_sd = -1;
237.3.2 by Mooie
Fixed warnings in the 64 bit build. Added explicit cast to int for
632
  ssize_t sret;
237.2.67 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;
237.2.135 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;
237.2.135 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;
237.2.67 by Teddy Hogeborn
Four new interrelated features:
644
  int pf;			/* Protocol family */
645
  
237.2.162 by Teddy Hogeborn
* Makefile (BROKEN_PIE): Add comment.
646
  errno = 0;
647
  
237.2.121 by Teddy Hogeborn
* plugins.d/mandos-client.c (start_mandos_communication): Check
648
  if(quit_now){
237.2.162 by Teddy Hogeborn
* Makefile (BROKEN_PIE): Add comment.
649
    errno = EINTR;
237.2.121 by Teddy Hogeborn
* plugins.d/mandos-client.c (start_mandos_communication): Check
650
    return -1;
651
  }
652
  
237.2.67 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:
237.16.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);
237.2.162 by Teddy Hogeborn
* Makefile (BROKEN_PIE): Add comment.
663
    errno = EINVAL;
237.2.67 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);
237.2.29 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){
237.16.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
  
237.2.67 by Teddy Hogeborn
Four new interrelated features:
678
  tcp_sd = socket(pf, SOCK_STREAM, 0);
237.2.56 by Teddy Hogeborn
* plugin-runner.c: Whitespace changes only.
679
  if(tcp_sd < 0){
237.2.162 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");
237.2.162 by Teddy Hogeborn
* Makefile (BROKEN_PIE): Add comment.
682
    errno = e;
237.2.121 by Teddy Hogeborn
* plugins.d/mandos-client.c (start_mandos_communication): Check
683
    goto mandos_end;
684
  }
685
  
686
  if(quit_now){
237.2.162 by Teddy Hogeborn
* Makefile (BROKEN_PIE): Add comment.
687
    errno = EINTR;
237.2.121 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));
237.2.67 by Teddy Hogeborn
Four new interrelated features:
692
  if(af == AF_INET6){
237.2.88 by Teddy Hogeborn
* plugins.d/mandos-client.c (start_mandos_communication): "sin6_family"
693
    to.in6.sin6_family = (sa_family_t)af;
237.2.67 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
  }
237.2.29 by Teddy Hogeborn
* plugin-runner.c: Only space changes.
699
  if(ret < 0 ){
237.2.162 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");
237.2.162 by Teddy Hogeborn
* Makefile (BROKEN_PIE): Add comment.
702
    errno = e;
237.2.121 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){
237.2.162 by Teddy Hogeborn
* Makefile (BROKEN_PIE): Add comment.
706
    int e = errno;
237.16.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);
237.2.162 by Teddy Hogeborn
* Makefile (BROKEN_PIE): Add comment.
709
    errno = e;
237.2.121 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
  }
237.2.67 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
237.16.6 by teddy at bsnet
* plugins.d/mandos-client.c: Some white space fixes.
719
				-Wunreachable-code*/
237.2.67 by Teddy Hogeborn
Four new interrelated features:
720
      if(if_index == AVAHI_IF_UNSPEC){
237.16.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"
237.2.67 by Teddy Hogeborn
Four new interrelated features:
723
		" without a network interface\n");
237.2.162 by Teddy Hogeborn
* Makefile (BROKEN_PIE): Add comment.
724
	errno = EINVAL;
237.2.121 by Teddy Hogeborn
* plugins.d/mandos-client.c (start_mandos_communication): Check
725
	goto mandos_end;
237.2.67 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
237.2.30 by Teddy Hogeborn
* plugins.d/mandos-client.c: Only comment changes.
732
				     -Wconversion and
733
				     -Wunreachable-code */
237.2.67 by Teddy Hogeborn
Four new interrelated features:
734
  }
21 by Teddy Hogeborn
* Makefile (CFLAGS): Changed to use $(WARN), $(DEBUG), $(COVERAGE) and
735
  
237.2.121 by Teddy Hogeborn
* plugins.d/mandos-client.c (start_mandos_communication): Check
736
  if(quit_now){
237.2.162 by Teddy Hogeborn
* Makefile (BROKEN_PIE): Add comment.
737
    errno = EINTR;
237.2.121 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){
237.2.67 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");
237.2.67 by Teddy Hogeborn
Four new interrelated features:
746
      } else {
237.16.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",
237.2.67 by Teddy Hogeborn
Four new interrelated features:
749
		ip, interface, port);
750
      }
751
    } else {
237.16.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);
237.2.67 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){
237.16.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
  
237.2.121 by Teddy Hogeborn
* plugins.d/mandos-client.c (start_mandos_communication): Check
775
  if(quit_now){
237.2.162 by Teddy Hogeborn
* Makefile (BROKEN_PIE): Add comment.
776
    errno = EINTR;
237.2.121 by Teddy Hogeborn
* plugins.d/mandos-client.c (start_mandos_communication): Check
777
    goto mandos_end;
778
  }
779
  
237.2.67 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
  }
237.2.29 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
    }
237.2.121 by Teddy Hogeborn
* plugins.d/mandos-client.c (start_mandos_communication): Check
791
    goto mandos_end;
792
  }
793
  
794
  if(quit_now){
237.2.162 by Teddy Hogeborn
* Makefile (BROKEN_PIE): Add comment.
795
    errno = EINTR;
237.2.121 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;
237.2.29 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);
237.3.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,
237.16.6 by teddy at bsnet
* plugins.d/mandos-client.c: Some white space fixes.
804
					out_size - written));
237.2.29 by Teddy Hogeborn
* plugin-runner.c: Only space changes.
805
    if(ret == -1){
237.2.162 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");
237.2.162 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 {
237.2.29 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
    }
237.2.121 by Teddy Hogeborn
* plugins.d/mandos-client.c (start_mandos_communication): Check
822
  
823
    if(quit_now){
237.2.162 by Teddy Hogeborn
* Makefile (BROKEN_PIE): Add comment.
824
      errno = EINTR;
237.2.121 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){
237.16.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
  
237.2.121 by Teddy Hogeborn
* plugins.d/mandos-client.c (start_mandos_communication): Check
834
  if(quit_now){
237.2.162 by Teddy Hogeborn
* Makefile (BROKEN_PIE): Add comment.
835
    errno = EINTR;
237.2.121 by Teddy Hogeborn
* plugins.d/mandos-client.c (start_mandos_communication): Check
836
    goto mandos_end;
837
  }
838
  
237.7.33 by Teddy Hogeborn
Merge from Björn.
839
  /* Spurious warning from -Wint-to-pointer-cast */
237.2.29 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
  
237.2.121 by Teddy Hogeborn
* plugins.d/mandos-client.c (start_mandos_communication): Check
842
  if(quit_now){
237.2.162 by Teddy Hogeborn
* Makefile (BROKEN_PIE): Add comment.
843
    errno = EINTR;
237.2.121 by Teddy Hogeborn
* plugins.d/mandos-client.c (start_mandos_communication): Check
844
    goto mandos_end;
845
  }
846
  
237.2.126 by Teddy Hogeborn
* plugin-runner.c: Minor stylistic changes.
847
  do {
237.2.29 by Teddy Hogeborn
* plugin-runner.c: Only space changes.
848
    ret = gnutls_handshake(session);
237.2.121 by Teddy Hogeborn
* plugins.d/mandos-client.c (start_mandos_communication): Check
849
    if(quit_now){
237.2.162 by Teddy Hogeborn
* Makefile (BROKEN_PIE): Add comment.
850
      errno = EINTR;
237.2.121 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
  
237.2.29 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){
237.16.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");
237.2.29 by Teddy Hogeborn
* plugin-runner.c: Only space changes.
859
      gnutls_perror(ret);
25 by Teddy Hogeborn
* mandos-clients.conf ([DEFAULT]): New section.
860
    }
237.2.162 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){
237.16.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){
237.2.121 by Teddy Hogeborn
* plugins.d/mandos-client.c (start_mandos_communication): Check
873
    
874
    if(quit_now){
237.2.162 by Teddy Hogeborn
* Makefile (BROKEN_PIE): Add comment.
875
      errno = EINTR;
237.2.121 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,
237.16.6 by teddy at bsnet
* plugins.d/mandos-client.c: Some white space fixes.
880
				buffer_capacity);
237.2.29 by Teddy Hogeborn
* plugin-runner.c: Only space changes.
881
    if(buffer_capacity == 0){
237.2.162 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");
237.2.162 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
    
237.2.121 by Teddy Hogeborn
* plugins.d/mandos-client.c (start_mandos_communication): Check
888
    if(quit_now){
237.2.162 by Teddy Hogeborn
* Makefile (BROKEN_PIE): Add comment.
889
      errno = EINTR;
237.2.121 by Teddy Hogeborn
* plugins.d/mandos-client.c (start_mandos_communication): Check
890
      goto mandos_end;
891
    }
892
    
237.3.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);
237.2.29 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
    }
237.2.29 by Teddy Hogeborn
* plugin-runner.c: Only space changes.
898
    if(sret < 0){
237.3.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:
237.2.126 by Teddy Hogeborn
* plugin-runner.c: Minor stylistic changes.
904
	do {
237.2.29 by Teddy Hogeborn
* plugin-runner.c: Only space changes.
905
	  ret = gnutls_handshake(session);
237.2.121 by Teddy Hogeborn
* plugins.d/mandos-client.c (start_mandos_communication): Check
906
	  
907
	  if(quit_now){
237.2.162 by Teddy Hogeborn
* Makefile (BROKEN_PIE): Add comment.
908
	    errno = EINTR;
237.2.121 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);
237.2.29 by Teddy Hogeborn
* plugin-runner.c: Only space changes.
912
	if(ret < 0){
237.16.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");
237.2.29 by Teddy Hogeborn
* plugin-runner.c: Only space changes.
915
	  gnutls_perror(ret);
237.2.162 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:
237.16.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");
237.2.29 by Teddy Hogeborn
* plugin-runner.c: Only space changes.
924
	gnutls_bye(session, GNUTLS_SHUT_RDWR);
237.2.162 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 {
237.3.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){
237.16.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
  
237.2.121 by Teddy Hogeborn
* plugins.d/mandos-client.c (start_mandos_communication): Check
938
  if(quit_now){
237.2.162 by Teddy Hogeborn
* Makefile (BROKEN_PIE): Add comment.
939
    errno = EINTR;
237.2.134 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){
237.2.162 by Teddy Hogeborn
* Makefile (BROKEN_PIE): Add comment.
946
      errno = EINTR;
237.2.134 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);
237.2.121 by Teddy Hogeborn
* plugins.d/mandos-client.c (start_mandos_communication): Check
950
  
237.2.29 by Teddy Hogeborn
* plugin-runner.c: Only space changes.
951
  if(buffer_length > 0){
237.2.125 by Teddy Hogeborn
* plugin-runner.c (getplugin, add_environment, main): Handle EINTR
952
    ssize_t decrypted_buffer_size;
237.16.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);
237.2.29 by Teddy Hogeborn
* plugin-runner.c: Only space changes.
955
    if(decrypted_buffer_size >= 0){
237.2.124 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){
237.2.121 by Teddy Hogeborn
* plugins.d/mandos-client.c (start_mandos_communication): Check
959
	if(quit_now){
237.2.162 by Teddy Hogeborn
* Makefile (BROKEN_PIE): Add comment.
960
	  errno = EINTR;
237.2.121 by Teddy Hogeborn
* plugins.d/mandos-client.c (start_mandos_communication): Check
961
	  goto mandos_end;
962
	}
963
	
237.2.29 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)){
237.2.162 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){
237.16.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
	  }
237.2.162 by Teddy Hogeborn
* Makefile (BROKEN_PIE): Add comment.
974
	  errno = e;
237.2.135 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
      }
237.2.135 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:
237.2.162 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");
237.2.162 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;
237.2.162 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;
237.2.162 by Teddy Hogeborn
* Makefile (BROKEN_PIE): Add comment.
1003
      retval = -1;
1004
    }
237.2.121 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,
237.2.67 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,
237.2.70 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
  
237.2.116 by Teddy Hogeborn
* plugins.d/mandos-client.c (quit_now): Move up declaration before
1028
  if(quit_now){
1029
    return;
1030
  }
1031
  
237.2.56 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:
237.16.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){
237.16.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, %"
237.2.31 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,
237.2.67 by Teddy Hogeborn
Four new interrelated features:
1052
					   avahi_proto_to_af(proto));
237.2.29 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
237.2.56 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,
237.2.70 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
  
237.2.121 by Teddy Hogeborn
* plugins.d/mandos-client.c (start_mandos_communication): Check
1079
  if(quit_now){
1080
    return;
1081
  }
1082
  
237.2.56 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
    
237.16.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
    
237.2.76 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)
237.16.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){
237.16.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
237.7.33 by Teddy Hogeborn
Merge from Björn.
1120
/* Signal handler that stops main loop after SIGTERM */
237.2.117 by Teddy Hogeborn
* plugins.d/mandos-client.c (signal_received): New.
1121
static void handle_sigterm(int sig){
237.2.71 by Teddy Hogeborn
* plugin-runner.c: Comment change.
1122
  if(quit_now){
1123
    return;
1124
  }
1125
  quit_now = 1;
237.2.117 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 */
237.2.71 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
237.15.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){
237.15.1 by teddy at bsnet
* plugins.d/mandos-client.c (good_interface): Use SIOCGIFFLAGS instead
1136
  int ret;
237.15.2 by teddy at bsnet
* plugins.d/mandos-client.c (good_interface): Use SIOCGIFFLAGS instead
1137
  
237.15.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");
237.15.2 by teddy at bsnet
* plugins.d/mandos-client.c (good_interface): Use SIOCGIFFLAGS instead
1141
    return false;
237.15.1 by teddy at bsnet
* plugins.d/mandos-client.c (good_interface): Use SIOCGIFFLAGS instead
1142
  }
237.15.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);
237.15.1 by teddy at bsnet
* plugins.d/mandos-client.c (good_interface): Use SIOCGIFFLAGS instead
1145
  if(ret == -1){
269.1.2 by teddy at bsnet
* plugins.d/mandos-client.c: Added debug output.
1146
    if(debug){
237.15.1 by teddy at bsnet
* plugins.d/mandos-client.c (good_interface): Use SIOCGIFFLAGS instead
1147
      perror_plus("ioctl SIOCGIFFLAGS");
269.1.2 by teddy at bsnet
* plugins.d/mandos-client.c: Added debug output.
1148
    }
237.15.2 by teddy at bsnet
* plugins.d/mandos-client.c (good_interface): Use SIOCGIFFLAGS instead
1149
    return false;
269.1.1 by teddy at bsnet
* plugins.d/mandos-client.c: An empty interface name now means to
1150
  }
237.15.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
  
269.1.1 by teddy at bsnet
* plugins.d/mandos-client.c: An empty interface name now means to
1156
  /* Reject the loopback device */
237.15.2 by teddy at bsnet
* plugins.d/mandos-client.c (good_interface): Use SIOCGIFFLAGS instead
1157
  if(ifr->ifr_flags & IFF_LOOPBACK){
269.1.2 by teddy at bsnet
* plugins.d/mandos-client.c: Added debug output.
1158
    if(debug){
237.16.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);
269.1.2 by teddy at bsnet
* plugins.d/mandos-client.c: Added debug output.
1161
    }
237.15.2 by teddy at bsnet
* plugins.d/mandos-client.c (good_interface): Use SIOCGIFFLAGS instead
1162
    return false;
269.1.1 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 */
237.15.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)){
269.1.2 by teddy at bsnet
* plugins.d/mandos-client.c: Added debug output.
1166
    if(debug){
237.16.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);
269.1.2 by teddy at bsnet
* plugins.d/mandos-client.c: Added debug output.
1169
    }
237.15.2 by teddy at bsnet
* plugins.d/mandos-client.c (good_interface): Use SIOCGIFFLAGS instead
1170
    return true;
269.1.1 by teddy at bsnet
* plugins.d/mandos-client.c: An empty interface name now means to
1171
  }
1172
  /* Otherwise, reject non-broadcast-capable devices */
237.15.2 by teddy at bsnet
* plugins.d/mandos-client.c (good_interface): Use SIOCGIFFLAGS instead
1173
  if(not (ifr->ifr_flags & IFF_BROADCAST)){
269.1.2 by teddy at bsnet
* plugins.d/mandos-client.c: Added debug output.
1174
    if(debug){
237.16.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);
269.1.2 by teddy at bsnet
* plugins.d/mandos-client.c: Added debug output.
1177
    }
237.15.2 by teddy at bsnet
* plugins.d/mandos-client.c (good_interface): Use SIOCGIFFLAGS instead
1178
    return false;
269.1.1 by teddy at bsnet
* plugins.d/mandos-client.c: An empty interface name now means to
1179
  }
237.7.29 by teddy at bsnet
* plugins.d/mandos-client.c (good_interface): Reject non-ARP
1180
  /* Reject non-ARP interfaces (including dummy interfaces) */
237.15.2 by teddy at bsnet
* plugins.d/mandos-client.c (good_interface): Use SIOCGIFFLAGS instead
1181
  if(ifr->ifr_flags & IFF_NOARP){
237.7.29 by teddy at bsnet
* plugins.d/mandos-client.c (good_interface): Reject non-ARP
1182
    if(debug){
237.16.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);
237.7.29 by teddy at bsnet
* plugins.d/mandos-client.c (good_interface): Reject non-ARP
1185
    }
237.15.2 by teddy at bsnet
* plugins.d/mandos-client.c (good_interface): Use SIOCGIFFLAGS instead
1186
    return false;
237.7.29 by teddy at bsnet
* plugins.d/mandos-client.c (good_interface): Reject non-ARP
1187
  }
237.15.2 by teddy at bsnet
* plugins.d/mandos-client.c (good_interface): Use SIOCGIFFLAGS instead
1188
  
269.1.1 by teddy at bsnet
* plugins.d/mandos-client.c: An empty interface name now means to
1189
  /* Accept this device */
269.1.2 by teddy at bsnet
* plugins.d/mandos-client.c: Added debug output.
1190
  if(debug){
237.16.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);
237.15.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
  }
237.16.1 by teddy at bsnet
* plugins.d/mandos-client.c (good_interface): Add error message.
1206
  
237.15.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)){
237.16.1 by teddy at bsnet
* plugins.d/mandos-client.c (good_interface): Add error message.
1209
    if(debug){
237.16.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",
237.16.1 by teddy at bsnet
* plugins.d/mandos-client.c (good_interface): Add error message.
1212
	      if_entry->d_name);
1213
    }
237.15.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;
269.1.2 by teddy at bsnet
* plugins.d/mandos-client.c: Added debug output.
1219
  }
269.1.1 by teddy at bsnet
* plugins.d/mandos-client.c: An empty interface name now means to
1220
  return 1;
1221
}
1222
237.15.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
  }
237.16.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){
237.16.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",
237.15.3 by Teddy Hogeborn
Intermediate commit - this does *not* work yet.
1238
	      if_entry->d_name);
1239
    }
1240
    return 0;
1241
  }
237.16.1 by teddy at bsnet
* plugins.d/mandos-client.c (good_interface): Add error message.
1242
  
237.15.3 by Teddy Hogeborn
Intermediate commit - this does *not* work yet.
1243
  /* Reject down interfaces */
237.16.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){
237.16.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",
237.16.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){
237.16.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",
237.16.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;
237.15.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
237.15.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;
237.16.6 by teddy at bsnet
* plugins.d/mandos-client.c: Some white space fixes.
1283
  size_t sret;
237.15.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
  
237.16.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
  }
237.15.3 by Teddy Hogeborn
Intermediate commit - this does *not* work yet.
1304
  
237.16.4 by teddy at bsnet
* plugins.d/mandos-client.c (runnable_hook): Bug fix: stat using the
1305
  char *fullname = NULL;
237.16.6 by teddy at bsnet
* plugins.d/mandos-client.c: Some white space fixes.
1306
  ret = asprintf(&fullname, "%s/%s", hookdir, direntry->d_name);
237.16.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);
237.15.3 by Teddy Hogeborn
Intermediate commit - this does *not* work yet.
1313
  if(ret == -1){
1314
    if(debug){
237.16.6 by teddy at bsnet
* plugins.d/mandos-client.c: Some white space fixes.
1315
      perror_plus("Could not stat hook");
237.15.3 by Teddy Hogeborn
Intermediate commit - this does *not* work yet.
1316
    }
1317
    return 0;
1318
  }
237.16.1 by teddy at bsnet
* plugins.d/mandos-client.c (good_interface): Add error message.
1319
  if(not (S_ISREG(st.st_mode))){
237.15.3 by Teddy Hogeborn
Intermediate commit - this does *not* work yet.
1320
    /* Not a regular file */
237.16.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
    }
237.15.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 */
237.16.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
    }
237.15.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;
237.7.39 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){
237.16.3 by teddy at bsnet
* plugins.d/mandos-client.c: Prefix all printouts with "Mandos plugin
1349
	fprintf(stderr, "Mandos plugin mandos-client: "
237.7.33 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){
237.16.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,"
237.7.33 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.  */
237.7.33 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));
237.7.39 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){
237.16.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
      }
237.7.39 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,
237.7.33 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
	}
237.7.33 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;
237.7.33 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){
237.16.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[]){
237.2.56 by Teddy Hogeborn
* plugin-runner.c: Whitespace changes only.
1414
  AvahiSServiceBrowser *sb = NULL;
1415
  int error;
1416
  int ret;
1417
  intmax_t tmpmax;
237.2.74 by Teddy Hogeborn
Overflows are not detected by sscanf(), so stop using it:
1418
  char *tmp;
237.2.56 by Teddy Hogeborn
* plugin-runner.c: Whitespace changes only.
1419
  int exitcode = EXIT_SUCCESS;
269.1.1 by teddy at bsnet
* plugins.d/mandos-client.c: An empty interface name now means to
1420
  const char *interface = "";
237.2.56 by Teddy Hogeborn
* plugin-runner.c: Whitespace changes only.
1421
  struct ifreq network;
237.2.113 by Teddy Hogeborn
* plugins.d/mandos-client.c (main): Take down network interface on
1422
  int sd = -1;
237.2.116 by Teddy Hogeborn
* plugins.d/mandos-client.c (quit_now): Move up declaration before
1423
  bool take_down_interface = false;
237.2.56 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;
237.2.74 by Teddy Hogeborn
Overflows are not detected by sscanf(), so stop using it:
1434
  float delay = 2.5f;
237.7.33 by Teddy Hogeborn
Merge from Björn.
1435
  double retry_interval = 10; /* 10s between trying a server and
1436
				 retrying the same server again */
237.2.74 by Teddy Hogeborn
Overflows are not detected by sscanf(), so stop using it:
1437
  
237.2.132 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 };
237.2.56 by Teddy Hogeborn
* plugin-runner.c: Whitespace changes only.
1440
  
237.2.131 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");
237.2.131 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");
237.2.131 by Teddy Hogeborn
* plugins.d/mandos-client.c (init_gnutls_session): Retry interrupted
1456
  }
1457
  
1458
  if(quit_now){
1459
    goto end;
1460
  }
1461
  
237.2.56 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",
237.2.67 by Teddy Hogeborn
Four new interrelated features:
1472
	.doc = "Network interface that will be used to search for"
1473
	" Mandos servers",
237.2.56 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 },
237.16.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 },
237.2.157 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 },
237.2.56 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){
237.2.157 by Teddy Hogeborn
Convert some programs to use the exit codes from <sysexits.h>. Change
1518
      errno = 0;
237.2.56 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 */
237.2.74 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){
237.2.157 by Teddy Hogeborn
Convert some programs to use the exit codes from <sysexits.h>. Change
1540
	  argp_error(state, "Bad number of DH bits");
237.2.56 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 */
237.2.74 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'){
237.2.157 by Teddy Hogeborn
Convert some programs to use the exit codes from <sysexits.h>. Change
1551
	  argp_error(state, "Bad delay");
237.2.56 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'
237.7.39 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
	}
237.2.56 by Teddy Hogeborn
* plugin-runner.c: Whitespace changes only.
1561
	break;
237.16.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;
237.2.157 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 */
237.16.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: ");
237.2.157 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);
237.2.56 by Teddy Hogeborn
* plugin-runner.c: Whitespace changes only.
1579
	break;
1580
      default:
1581
	return ARGP_ERR_UNKNOWN;
1582
      }
237.2.157 by Teddy Hogeborn
Convert some programs to use the exit codes from <sysexits.h>. Change
1583
      return errno;
237.2.56 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" };
237.2.157 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");
237.2.157 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;
237.2.56 by Teddy Hogeborn
* plugin-runner.c: Whitespace changes only.
1603
      goto end;
1604
    }
1605
  }
237.7.35 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
    
237.7.40 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");
237.7.35 by Teddy Hogeborn
* initramfs-tools-script: Abort if plugin-runner is missing. Removed
1623
      } else {
237.7.40 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
	    }
237.7.35 by Teddy Hogeborn
* initramfs-tools-script: Abort if plugin-runner is missing. Removed
1633
	  }
1634
	}
237.7.40 by Teddy Hogeborn
* plugins.d/mandos-client.c (main): Do not even try to work around
1635
	TEMP_FAILURE_RETRY(close(seckey_fd));
237.7.35 by Teddy Hogeborn
* initramfs-tools-script: Abort if plugin-runner is missing. Removed
1636
      }
1637
    }
1638
    
237.7.40 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");
237.7.35 by Teddy Hogeborn
* initramfs-tools-script: Abort if plugin-runner is missing. Removed
1643
      } else {
237.7.40 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
	    }
237.7.35 by Teddy Hogeborn
* initramfs-tools-script: Abort if plugin-runner is missing. Removed
1653
	  }
1654
	}
237.7.40 by Teddy Hogeborn
* plugins.d/mandos-client.c (main): Do not even try to work around
1655
	TEMP_FAILURE_RETRY(close(pubkey_fd));
237.7.35 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
  }
237.2.56 by Teddy Hogeborn
* plugin-runner.c: Whitespace changes only.
1666
  
237.15.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;
237.16.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,
237.15.3 by Teddy Hogeborn
Intermediate commit - this does *not* work yet.
1672
			   alphasort);
237.16.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;
237.16.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);
237.16.3 by teddy at bsnet
* plugins.d/mandos-client.c: Prefix all printouts with "Mandos plugin
1681
	if(ret < 0){
237.16.2 by teddy at bsnet
* plugins.d/mandos-client.c (main): Add "DELAY" environment variable.
1682
	  perror_plus("asprintf");
237.16.3 by teddy at bsnet
* plugins.d/mandos-client.c: Prefix all printouts with "Mandos plugin
1683
	  continue;
237.16.2 by teddy at bsnet
* plugins.d/mandos-client.c (main): Add "DELAY" environment variable.
1684
	}
237.16.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);
1691
	  ret = setenv("DEVICE", interface, 1);
1692
	  if(ret == -1){
1693
	    perror_plus("setenv");
1694
	    exit(1);
1695
	  }
1696
	  ret = setenv("VERBOSE", debug ? "1" : "0", 1);
1697
	  if(ret == -1){
1698
	    perror_plus("setenv");
1699
	    exit(1);
1700
	  }
1701
	  ret = setenv("MODE", "start", 1);
1702
	  if(ret == -1){
1703
	    perror_plus("setenv");
1704
	    exit(1);
1705
	  }
1706
	  char *delaystring;
1707
	  ret = asprintf(&delaystring, "%f", delay);
1708
	  if(ret == -1){
1709
	    perror_plus("asprintf");
1710
	    exit(1);
1711
	  }
1712
	  ret = setenv("DELAY", delaystring, 1);
1713
	  if(ret == -1){
1714
	    free(delaystring);
1715
	    perror_plus("setenv");
1716
	    exit(1);
1717
	  }
237.16.2 by teddy at bsnet
* plugins.d/mandos-client.c (main): Add "DELAY" environment variable.
1718
	  free(delaystring);
237.16.3 by teddy at bsnet
* plugins.d/mandos-client.c: Prefix all printouts with "Mandos plugin
1719
	  ret = execl(fullname, direntry->d_name, "start", NULL);
1720
	  perror_plus("execl");
1721
	} else {
1722
	  int status;
1723
	  if(TEMP_FAILURE_RETRY(waitpid(hook_pid, &status, 0)) == -1){
1724
	    perror_plus("waitpid");
1725
	    free(fullname);
1726
	    continue;
1727
	  }
1728
	  if(WIFEXITED(status)){
1729
	    if(WEXITSTATUS(status) != 0){
1730
	      fprintf(stderr, "Mandos plugin mandos-client: "
1731
		      "Warning: network hook \"%s\" exited"
1732
		      " with status %d\n", direntry->d_name,
1733
		      WEXITSTATUS(status));
1734
	      free(fullname);
1735
	      continue;
1736
	    }
1737
	  } else if(WIFSIGNALED(status)){
1738
	    fprintf(stderr, "Mandos plugin mandos-client: "
1739
		    "Warning: network hook \"%s\" died by"
1740
		    " signal %d\n", direntry->d_name,
1741
		    WTERMSIG(status));
1742
	    free(fullname);
1743
	    continue;
1744
	  } else {
1745
	    fprintf(stderr, "Mandos plugin mandos-client: "
1746
		    "Warning: network hook \"%s\" crashed\n",
1747
		    direntry->d_name);
1748
	    free(fullname);
1749
	    continue;
1750
	  }
1751
	}
1752
	free(fullname);
1753
	if(quit_now){
1754
	  goto end;
1755
	}
1756
      }
1757
      close(devnull);
237.15.3 by Teddy Hogeborn
Intermediate commit - this does *not* work yet.
1758
    }
1759
  }
1760
  
24.1.135 by Björn Påhlsson
Earlier signal handling
1761
  if(not debug){
1762
    avahi_set_log_function(empty_log);
1763
  }
237.15.3 by Teddy Hogeborn
Intermediate commit - this does *not* work yet.
1764
  
269.1.1 by teddy at bsnet
* plugins.d/mandos-client.c: An empty interface name now means to
1765
  if(interface[0] == '\0'){
1766
    struct dirent **direntries;
237.16.1 by teddy at bsnet
* plugins.d/mandos-client.c (good_interface): Add error message.
1767
    /* First look for interfaces that are up */
1768
    ret = scandir(sys_class_net, &direntries, up_interface,
269.1.1 by teddy at bsnet
* plugins.d/mandos-client.c: An empty interface name now means to
1769
		  alphasort);
237.16.1 by teddy at bsnet
* plugins.d/mandos-client.c (good_interface): Add error message.
1770
    if(ret == 0){
1771
      /* No up interfaces, look for any good interfaces */
1772
      free(direntries);
1773
      ret = scandir(sys_class_net, &direntries, good_interface,
1774
		    alphasort);
1775
    }
269.1.1 by teddy at bsnet
* plugins.d/mandos-client.c: An empty interface name now means to
1776
    if(ret >= 1){
237.16.1 by teddy at bsnet
* plugins.d/mandos-client.c (good_interface): Add error message.
1777
      /* Pick the first interface returned */
269.1.1 by teddy at bsnet
* plugins.d/mandos-client.c: An empty interface name now means to
1778
      interface = strdup(direntries[0]->d_name);
269.1.2 by teddy at bsnet
* plugins.d/mandos-client.c: Added debug output.
1779
      if(debug){
237.16.3 by teddy at bsnet
* plugins.d/mandos-client.c: Prefix all printouts with "Mandos plugin
1780
	fprintf(stderr, "Mandos plugin mandos-client: "
1781
		"Using interface \"%s\"\n", interface);
269.1.2 by teddy at bsnet
* plugins.d/mandos-client.c: Added debug output.
1782
      }
269.1.1 by teddy at bsnet
* plugins.d/mandos-client.c: An empty interface name now means to
1783
      if(interface == NULL){
24.1.174 by Björn Påhlsson
* Makefile (CFLAGS): Added "-lrt" to include real time library.
1784
	perror_plus("malloc");
269.1.1 by teddy at bsnet
* plugins.d/mandos-client.c: An empty interface name now means to
1785
	free(direntries);
1786
	exitcode = EXIT_FAILURE;
1787
	goto end;
1788
      }
1789
      free(direntries);
1790
    } else {
1791
      free(direntries);
237.16.3 by teddy at bsnet
* plugins.d/mandos-client.c: Prefix all printouts with "Mandos plugin
1792
      fprintf(stderr, "Mandos plugin mandos-client: "
1793
	      "Could not find a network interface\n");
269.1.1 by teddy at bsnet
* plugins.d/mandos-client.c: An empty interface name now means to
1794
      exitcode = EXIT_FAILURE;
1795
      goto end;
1796
    }
1797
  }
237.2.72 by Teddy Hogeborn
Merge from Björn:
1798
  
24.1.135 by Björn Påhlsson
Earlier signal handling
1799
  /* Initialize Avahi early so avahi_simple_poll_quit() can be called
1800
     from the signal handler */
1801
  /* Initialize the pseudo-RNG for Avahi */
1802
  srand((unsigned int) time(NULL));
1803
  mc.simple_poll = avahi_simple_poll_new();
1804
  if(mc.simple_poll == NULL){
237.16.3 by teddy at bsnet
* plugins.d/mandos-client.c: Prefix all printouts with "Mandos plugin
1805
    fprintf(stderr, "Mandos plugin mandos-client: "
1806
	    "Avahi: Failed to create simple poll object.\n");
237.2.162 by Teddy Hogeborn
* Makefile (BROKEN_PIE): Add comment.
1807
    exitcode = EX_UNAVAILABLE;
24.1.135 by Björn Påhlsson
Earlier signal handling
1808
    goto end;
1809
  }
237.2.72 by Teddy Hogeborn
Merge from Björn:
1810
  
24.1.135 by Björn Påhlsson
Earlier signal handling
1811
  sigemptyset(&sigterm_action.sa_mask);
237.2.72 by Teddy Hogeborn
Merge from Björn:
1812
  ret = sigaddset(&sigterm_action.sa_mask, SIGINT);
1813
  if(ret == -1){
24.1.174 by Björn Påhlsson
* Makefile (CFLAGS): Added "-lrt" to include real time library.
1814
    perror_plus("sigaddset");
237.2.162 by Teddy Hogeborn
* Makefile (BROKEN_PIE): Add comment.
1815
    exitcode = EX_OSERR;
237.2.72 by Teddy Hogeborn
Merge from Björn:
1816
    goto end;
1817
  }
1818
  ret = sigaddset(&sigterm_action.sa_mask, SIGHUP);
1819
  if(ret == -1){
24.1.174 by Björn Påhlsson
* Makefile (CFLAGS): Added "-lrt" to include real time library.
1820
    perror_plus("sigaddset");
237.2.162 by Teddy Hogeborn
* Makefile (BROKEN_PIE): Add comment.
1821
    exitcode = EX_OSERR;
237.2.72 by Teddy Hogeborn
Merge from Björn:
1822
    goto end;
1823
  }
24.1.135 by Björn Påhlsson
Earlier signal handling
1824
  ret = sigaddset(&sigterm_action.sa_mask, SIGTERM);
1825
  if(ret == -1){
24.1.174 by Björn Påhlsson
* Makefile (CFLAGS): Added "-lrt" to include real time library.
1826
    perror_plus("sigaddset");
237.2.162 by Teddy Hogeborn
* Makefile (BROKEN_PIE): Add comment.
1827
    exitcode = EX_OSERR;
24.1.135 by Björn Påhlsson
Earlier signal handling
1828
    goto end;
1829
  }
237.2.120 by Teddy Hogeborn
* plugins.d/mandos-client.c (main): Do not handle ignored signals.
1830
  /* Need to check if the handler is SIG_IGN before handling:
1831
     | [[info:libc:Initial Signal Actions]] |
1832
     | [[info:libc:Basic Signal Handling]]  |
1833
  */
1834
  ret = sigaction(SIGINT, NULL, &old_sigterm_action);
1835
  if(ret == -1){
24.1.174 by Björn Påhlsson
* Makefile (CFLAGS): Added "-lrt" to include real time library.
1836
    perror_plus("sigaction");
237.2.162 by Teddy Hogeborn
* Makefile (BROKEN_PIE): Add comment.
1837
    return EX_OSERR;
237.2.120 by Teddy Hogeborn
* plugins.d/mandos-client.c (main): Do not handle ignored signals.
1838
  }
1839
  if(old_sigterm_action.sa_handler != SIG_IGN){
1840
    ret = sigaction(SIGINT, &sigterm_action, NULL);
1841
    if(ret == -1){
24.1.174 by Björn Påhlsson
* Makefile (CFLAGS): Added "-lrt" to include real time library.
1842
      perror_plus("sigaction");
237.2.162 by Teddy Hogeborn
* Makefile (BROKEN_PIE): Add comment.
1843
      exitcode = EX_OSERR;
237.2.120 by Teddy Hogeborn
* plugins.d/mandos-client.c (main): Do not handle ignored signals.
1844
      goto end;
1845
    }
1846
  }
1847
  ret = sigaction(SIGHUP, NULL, &old_sigterm_action);
1848
  if(ret == -1){
24.1.174 by Björn Påhlsson
* Makefile (CFLAGS): Added "-lrt" to include real time library.
1849
    perror_plus("sigaction");
237.2.162 by Teddy Hogeborn
* Makefile (BROKEN_PIE): Add comment.
1850
    return EX_OSERR;
237.2.120 by Teddy Hogeborn
* plugins.d/mandos-client.c (main): Do not handle ignored signals.
1851
  }
1852
  if(old_sigterm_action.sa_handler != SIG_IGN){
1853
    ret = sigaction(SIGHUP, &sigterm_action, NULL);
1854
    if(ret == -1){
24.1.174 by Björn Påhlsson
* Makefile (CFLAGS): Added "-lrt" to include real time library.
1855
      perror_plus("sigaction");
237.2.162 by Teddy Hogeborn
* Makefile (BROKEN_PIE): Add comment.
1856
      exitcode = EX_OSERR;
237.2.120 by Teddy Hogeborn
* plugins.d/mandos-client.c (main): Do not handle ignored signals.
1857
      goto end;
1858
    }
1859
  }
1860
  ret = sigaction(SIGTERM, NULL, &old_sigterm_action);
1861
  if(ret == -1){
24.1.174 by Björn Påhlsson
* Makefile (CFLAGS): Added "-lrt" to include real time library.
1862
    perror_plus("sigaction");
237.2.162 by Teddy Hogeborn
* Makefile (BROKEN_PIE): Add comment.
1863
    return EX_OSERR;
237.2.120 by Teddy Hogeborn
* plugins.d/mandos-client.c (main): Do not handle ignored signals.
1864
  }
1865
  if(old_sigterm_action.sa_handler != SIG_IGN){
1866
    ret = sigaction(SIGTERM, &sigterm_action, NULL);
1867
    if(ret == -1){
24.1.174 by Björn Påhlsson
* Makefile (CFLAGS): Added "-lrt" to include real time library.
1868
      perror_plus("sigaction");
237.2.162 by Teddy Hogeborn
* Makefile (BROKEN_PIE): Add comment.
1869
      exitcode = EX_OSERR;
237.2.120 by Teddy Hogeborn
* plugins.d/mandos-client.c (main): Do not handle ignored signals.
1870
      goto end;
1871
    }
237.2.117 by Teddy Hogeborn
* plugins.d/mandos-client.c (signal_received): New.
1872
  }
237.2.56 by Teddy Hogeborn
* plugin-runner.c: Whitespace changes only.
1873
  
1874
  /* If the interface is down, bring it up */
269.1.1 by teddy at bsnet
* plugins.d/mandos-client.c: An empty interface name now means to
1875
  if(strcmp(interface, "none") != 0){
237.2.116 by Teddy Hogeborn
* plugins.d/mandos-client.c (quit_now): Move up declaration before
1876
    if_index = (AvahiIfIndex) if_nametoindex(interface);
1877
    if(if_index == 0){
237.16.3 by teddy at bsnet
* plugins.d/mandos-client.c: Prefix all printouts with "Mandos plugin
1878
      fprintf(stderr, "Mandos plugin mandos-client: "
1879
	      "No such interface: \"%s\"\n", interface);
237.2.162 by Teddy Hogeborn
* Makefile (BROKEN_PIE): Add comment.
1880
      exitcode = EX_UNAVAILABLE;
237.2.116 by Teddy Hogeborn
* plugins.d/mandos-client.c (quit_now): Move up declaration before
1881
      goto end;
1882
    }
1883
    
1884
    if(quit_now){
1885
      goto end;
1886
    }
1887
    
237.2.131 by Teddy Hogeborn
* plugins.d/mandos-client.c (init_gnutls_session): Retry interrupted
1888
    /* Re-raise priviliges */
1889
    errno = 0;
1890
    ret = seteuid(0);
1891
    if(ret == -1){
24.1.174 by Björn Påhlsson
* Makefile (CFLAGS): Added "-lrt" to include real time library.
1892
      perror_plus("seteuid");
237.2.131 by Teddy Hogeborn
* plugins.d/mandos-client.c (init_gnutls_session): Retry interrupted
1893
    }
1894
    
237.2.56 by Teddy Hogeborn
* plugin-runner.c: Whitespace changes only.
1895
#ifdef __linux__
1896
    /* Lower kernel loglevel to KERN_NOTICE to avoid KERN_INFO
237.2.157 by Teddy Hogeborn
Convert some programs to use the exit codes from <sysexits.h>. Change
1897
       messages about the network interface to mess up the prompt */
237.2.56 by Teddy Hogeborn
* plugin-runner.c: Whitespace changes only.
1898
    ret = klogctl(8, NULL, 5);
237.2.67 by Teddy Hogeborn
Four new interrelated features:
1899
    bool restore_loglevel = true;
237.2.56 by Teddy Hogeborn
* plugin-runner.c: Whitespace changes only.
1900
    if(ret == -1){
237.2.67 by Teddy Hogeborn
Four new interrelated features:
1901
      restore_loglevel = false;
24.1.174 by Björn Påhlsson
* Makefile (CFLAGS): Added "-lrt" to include real time library.
1902
      perror_plus("klogctl");
237.2.56 by Teddy Hogeborn
* plugin-runner.c: Whitespace changes only.
1903
    }
237.2.71 by Teddy Hogeborn
* plugin-runner.c: Comment change.
1904
#endif	/* __linux__ */
237.2.56 by Teddy Hogeborn
* plugin-runner.c: Whitespace changes only.
1905
    
1906
    sd = socket(PF_INET6, SOCK_DGRAM, IPPROTO_IP);
1907
    if(sd < 0){
24.1.174 by Björn Påhlsson
* Makefile (CFLAGS): Added "-lrt" to include real time library.
1908
      perror_plus("socket");
237.2.162 by Teddy Hogeborn
* Makefile (BROKEN_PIE): Add comment.
1909
      exitcode = EX_OSERR;
237.2.56 by Teddy Hogeborn
* plugin-runner.c: Whitespace changes only.
1910
#ifdef __linux__
237.2.67 by Teddy Hogeborn
Four new interrelated features:
1911
      if(restore_loglevel){
1912
	ret = klogctl(7, NULL, 0);
1913
	if(ret == -1){
24.1.174 by Björn Påhlsson
* Makefile (CFLAGS): Added "-lrt" to include real time library.
1914
	  perror_plus("klogctl");
237.2.67 by Teddy Hogeborn
Four new interrelated features:
1915
	}
237.2.56 by Teddy Hogeborn
* plugin-runner.c: Whitespace changes only.
1916
      }
237.2.71 by Teddy Hogeborn
* plugin-runner.c: Comment change.
1917
#endif	/* __linux__ */
237.2.131 by Teddy Hogeborn
* plugins.d/mandos-client.c (init_gnutls_session): Retry interrupted
1918
      /* Lower privileges */
1919
      errno = 0;
1920
      ret = seteuid(uid);
1921
      if(ret == -1){
24.1.174 by Björn Påhlsson
* Makefile (CFLAGS): Added "-lrt" to include real time library.
1922
	perror_plus("seteuid");
237.2.131 by Teddy Hogeborn
* plugins.d/mandos-client.c (init_gnutls_session): Retry interrupted
1923
      }
237.2.56 by Teddy Hogeborn
* plugin-runner.c: Whitespace changes only.
1924
      goto end;
1925
    }
1926
    strcpy(network.ifr_name, interface);
1927
    ret = ioctl(sd, SIOCGIFFLAGS, &network);
1928
    if(ret == -1){
24.1.174 by Björn Påhlsson
* Makefile (CFLAGS): Added "-lrt" to include real time library.
1929
      perror_plus("ioctl SIOCGIFFLAGS");
237.2.56 by Teddy Hogeborn
* plugin-runner.c: Whitespace changes only.
1930
#ifdef __linux__
237.2.67 by Teddy Hogeborn
Four new interrelated features:
1931
      if(restore_loglevel){
1932
	ret = klogctl(7, NULL, 0);
1933
	if(ret == -1){
24.1.174 by Björn Påhlsson
* Makefile (CFLAGS): Added "-lrt" to include real time library.
1934
	  perror_plus("klogctl");
237.2.67 by Teddy Hogeborn
Four new interrelated features:
1935
	}
237.2.56 by Teddy Hogeborn
* plugin-runner.c: Whitespace changes only.
1936
      }
237.2.71 by Teddy Hogeborn
* plugin-runner.c: Comment change.
1937
#endif	/* __linux__ */
237.2.162 by Teddy Hogeborn
* Makefile (BROKEN_PIE): Add comment.
1938
      exitcode = EX_OSERR;
237.2.131 by Teddy Hogeborn
* plugins.d/mandos-client.c (init_gnutls_session): Retry interrupted
1939
      /* Lower privileges */
1940
      errno = 0;
1941
      ret = seteuid(uid);
1942
      if(ret == -1){
24.1.174 by Björn Påhlsson
* Makefile (CFLAGS): Added "-lrt" to include real time library.
1943
	perror_plus("seteuid");
237.2.131 by Teddy Hogeborn
* plugins.d/mandos-client.c (init_gnutls_session): Retry interrupted
1944
      }
237.2.56 by Teddy Hogeborn
* plugin-runner.c: Whitespace changes only.
1945
      goto end;
1946
    }
1947
    if((network.ifr_flags & IFF_UP) == 0){
1948
      network.ifr_flags |= IFF_UP;
237.2.116 by Teddy Hogeborn
* plugins.d/mandos-client.c (quit_now): Move up declaration before
1949
      take_down_interface = true;
237.2.56 by Teddy Hogeborn
* plugin-runner.c: Whitespace changes only.
1950
      ret = ioctl(sd, SIOCSIFFLAGS, &network);
1951
      if(ret == -1){
237.2.116 by Teddy Hogeborn
* plugins.d/mandos-client.c (quit_now): Move up declaration before
1952
	take_down_interface = false;
24.1.174 by Björn Påhlsson
* Makefile (CFLAGS): Added "-lrt" to include real time library.
1953
	perror_plus("ioctl SIOCSIFFLAGS +IFF_UP");
237.2.162 by Teddy Hogeborn
* Makefile (BROKEN_PIE): Add comment.
1954
	exitcode = EX_OSERR;
237.2.56 by Teddy Hogeborn
* plugin-runner.c: Whitespace changes only.
1955
#ifdef __linux__
237.2.67 by Teddy Hogeborn
Four new interrelated features:
1956
	if(restore_loglevel){
1957
	  ret = klogctl(7, NULL, 0);
1958
	  if(ret == -1){
24.1.174 by Björn Påhlsson
* Makefile (CFLAGS): Added "-lrt" to include real time library.
1959
	    perror_plus("klogctl");
237.2.67 by Teddy Hogeborn
Four new interrelated features:
1960
	  }
24.1.124 by Björn Påhlsson
Added lower kernel loglevel to reduce clutter on system console.
1961
	}
237.2.71 by Teddy Hogeborn
* plugin-runner.c: Comment change.
1962
#endif	/* __linux__ */
237.2.131 by Teddy Hogeborn
* plugins.d/mandos-client.c (init_gnutls_session): Retry interrupted
1963
	/* Lower privileges */
1964
	errno = 0;
1965
	ret = seteuid(uid);
1966
	if(ret == -1){
24.1.174 by Björn Påhlsson
* Makefile (CFLAGS): Added "-lrt" to include real time library.
1967
	  perror_plus("seteuid");
237.2.131 by Teddy Hogeborn
* plugins.d/mandos-client.c (init_gnutls_session): Retry interrupted
1968
	}
65 by Teddy Hogeborn
* plugins.d/password-request.c (main): Bug fix: Bring up network
1969
	goto end;
1970
      }
237.2.56 by Teddy Hogeborn
* plugin-runner.c: Whitespace changes only.
1971
    }
237.7.33 by Teddy Hogeborn
Merge from Björn.
1972
    /* Sleep checking until interface is running.
1973
       Check every 0.25s, up to total time of delay */
237.2.56 by Teddy Hogeborn
* plugin-runner.c: Whitespace changes only.
1974
    for(int i=0; i < delay * 4; i++){
65 by Teddy Hogeborn
* plugins.d/password-request.c (main): Bug fix: Bring up network
1975
      ret = ioctl(sd, SIOCGIFFLAGS, &network);
1976
      if(ret == -1){
24.1.174 by Björn Påhlsson
* Makefile (CFLAGS): Added "-lrt" to include real time library.
1977
	perror_plus("ioctl SIOCGIFFLAGS");
237.2.56 by Teddy Hogeborn
* plugin-runner.c: Whitespace changes only.
1978
      } else if(network.ifr_flags & IFF_RUNNING){
1979
	break;
1980
      }
1981
      struct timespec sleeptime = { .tv_nsec = 250000000 };
1982
      ret = nanosleep(&sleeptime, NULL);
1983
      if(ret == -1 and errno != EINTR){
24.1.174 by Björn Påhlsson
* Makefile (CFLAGS): Added "-lrt" to include real time library.
1984
	perror_plus("nanosleep");
237.2.56 by Teddy Hogeborn
* plugin-runner.c: Whitespace changes only.
1985
      }
1986
    }
237.2.116 by Teddy Hogeborn
* plugins.d/mandos-client.c (quit_now): Move up declaration before
1987
    if(not take_down_interface){
1988
      /* We won't need the socket anymore */
237.2.113 by Teddy Hogeborn
* plugins.d/mandos-client.c (main): Take down network interface on
1989
      ret = (int)TEMP_FAILURE_RETRY(close(sd));
1990
      if(ret == -1){
24.1.174 by Björn Påhlsson
* Makefile (CFLAGS): Added "-lrt" to include real time library.
1991
	perror_plus("close");
237.2.113 by Teddy Hogeborn
* plugins.d/mandos-client.c (main): Take down network interface on
1992
      }
237.2.56 by Teddy Hogeborn
* plugin-runner.c: Whitespace changes only.
1993
    }
1994
#ifdef __linux__
237.2.67 by Teddy Hogeborn
Four new interrelated features:
1995
    if(restore_loglevel){
1996
      /* Restores kernel loglevel to default */
1997
      ret = klogctl(7, NULL, 0);
1998
      if(ret == -1){
24.1.174 by Björn Påhlsson
* Makefile (CFLAGS): Added "-lrt" to include real time library.
1999
	perror_plus("klogctl");
237.2.67 by Teddy Hogeborn
Four new interrelated features:
2000
      }
237.2.56 by Teddy Hogeborn
* plugin-runner.c: Whitespace changes only.
2001
    }
237.2.71 by Teddy Hogeborn
* plugin-runner.c: Comment change.
2002
#endif	/* __linux__ */
237.2.131 by Teddy Hogeborn
* plugins.d/mandos-client.c (init_gnutls_session): Retry interrupted
2003
    /* Lower privileges */
2004
    errno = 0;
2005
    if(take_down_interface){
2006
      /* Lower privileges */
2007
      ret = seteuid(uid);
2008
      if(ret == -1){
24.1.174 by Björn Påhlsson
* Makefile (CFLAGS): Added "-lrt" to include real time library.
2009
	perror_plus("seteuid");
237.2.131 by Teddy Hogeborn
* plugins.d/mandos-client.c (init_gnutls_session): Retry interrupted
2010
      }
2011
    } else {
2012
      /* Lower privileges permanently */
2013
      ret = setuid(uid);
2014
      if(ret == -1){
24.1.174 by Björn Påhlsson
* Makefile (CFLAGS): Added "-lrt" to include real time library.
2015
	perror_plus("setuid");
237.2.131 by Teddy Hogeborn
* plugins.d/mandos-client.c (init_gnutls_session): Retry interrupted
2016
      }
237.2.128 by Teddy Hogeborn
* plugins.d/mandos-client.c (main): Bug fix: Check result of setgid().
2017
    }
237.2.56 by Teddy Hogeborn
* plugin-runner.c: Whitespace changes only.
2018
  }
2019
  
237.2.116 by Teddy Hogeborn
* plugins.d/mandos-client.c (quit_now): Move up declaration before
2020
  if(quit_now){
2021
    goto end;
2022
  }
2023
  
24.1.134 by Björn Påhlsson
plugin-runner: Added support for empty string arguments
2024
  ret = init_gnutls_global(pubkey, seckey);
237.2.56 by Teddy Hogeborn
* plugin-runner.c: Whitespace changes only.
2025
  if(ret == -1){
237.16.3 by teddy at bsnet
* plugins.d/mandos-client.c: Prefix all printouts with "Mandos plugin
2026
    fprintf(stderr, "Mandos plugin mandos-client: "
2027
	    "init_gnutls_global failed\n");
237.2.162 by Teddy Hogeborn
* Makefile (BROKEN_PIE): Add comment.
2028
    exitcode = EX_UNAVAILABLE;
237.2.56 by Teddy Hogeborn
* plugin-runner.c: Whitespace changes only.
2029
    goto end;
2030
  } else {
2031
    gnutls_initialized = true;
2032
  }
2033
  
237.2.116 by Teddy Hogeborn
* plugins.d/mandos-client.c (quit_now): Move up declaration before
2034
  if(quit_now){
2035
    goto end;
2036
  }
2037
  
237.2.56 by Teddy Hogeborn
* plugin-runner.c: Whitespace changes only.
2038
  if(mkdtemp(tempdir) == NULL){
24.1.174 by Björn Påhlsson
* Makefile (CFLAGS): Added "-lrt" to include real time library.
2039
    perror_plus("mkdtemp");
237.2.56 by Teddy Hogeborn
* plugin-runner.c: Whitespace changes only.
2040
    goto end;
2041
  }
24.1.172 by Björn Påhlsson
using scandir instead of readdir
2042
  tempdir_created = true;
237.2.116 by Teddy Hogeborn
* plugins.d/mandos-client.c (quit_now): Move up declaration before
2043
  
2044
  if(quit_now){
2045
    goto end;
2046
  }
237.2.56 by Teddy Hogeborn
* plugin-runner.c: Whitespace changes only.
2047
  
24.1.134 by Björn Påhlsson
plugin-runner: Added support for empty string arguments
2048
  if(not init_gpgme(pubkey, seckey, tempdir)){
237.16.3 by teddy at bsnet
* plugins.d/mandos-client.c: Prefix all printouts with "Mandos plugin
2049
    fprintf(stderr, "Mandos plugin mandos-client: "
2050
	    "init_gpgme failed\n");
237.2.162 by Teddy Hogeborn
* Makefile (BROKEN_PIE): Add comment.
2051
    exitcode = EX_UNAVAILABLE;
237.2.56 by Teddy Hogeborn
* plugin-runner.c: Whitespace changes only.
2052
    goto end;
2053
  } else {
2054
    gpgme_initialized = true;
2055
  }
2056
  
237.2.116 by Teddy Hogeborn
* plugins.d/mandos-client.c (quit_now): Move up declaration before
2057
  if(quit_now){
2058
    goto end;
237.2.56 by Teddy Hogeborn
* plugin-runner.c: Whitespace changes only.
2059
  }
2060
  
2061
  if(connect_to != NULL){
2062
    /* Connect directly, do not use Zeroconf */
2063
    /* (Mainly meant for debugging) */
2064
    char *address = strrchr(connect_to, ':');
2065
    if(address == NULL){
237.16.3 by teddy at bsnet
* plugins.d/mandos-client.c: Prefix all printouts with "Mandos plugin
2066
      fprintf(stderr, "Mandos plugin mandos-client: "
2067
	      "No colon in address\n");
237.2.162 by Teddy Hogeborn
* Makefile (BROKEN_PIE): Add comment.
2068
      exitcode = EX_USAGE;
237.2.56 by Teddy Hogeborn
* plugin-runner.c: Whitespace changes only.
2069
      goto end;
2070
    }
237.2.116 by Teddy Hogeborn
* plugins.d/mandos-client.c (quit_now): Move up declaration before
2071
    
2072
    if(quit_now){
2073
      goto end;
2074
    }
2075
    
237.2.56 by Teddy Hogeborn
* plugin-runner.c: Whitespace changes only.
2076
    uint16_t port;
237.2.74 by Teddy Hogeborn
Overflows are not detected by sscanf(), so stop using it:
2077
    errno = 0;
2078
    tmpmax = strtoimax(address+1, &tmp, 10);
2079
    if(errno != 0 or tmp == address+1 or *tmp != '\0'
2080
       or tmpmax != (uint16_t)tmpmax){
237.16.3 by teddy at bsnet
* plugins.d/mandos-client.c: Prefix all printouts with "Mandos plugin
2081
      fprintf(stderr, "Mandos plugin mandos-client: "
2082
	      "Bad port number\n");
237.2.162 by Teddy Hogeborn
* Makefile (BROKEN_PIE): Add comment.
2083
      exitcode = EX_USAGE;
237.2.56 by Teddy Hogeborn
* plugin-runner.c: Whitespace changes only.
2084
      goto end;
2085
    }
237.2.116 by Teddy Hogeborn
* plugins.d/mandos-client.c (quit_now): Move up declaration before
2086
  
2087
    if(quit_now){
2088
      goto end;
2089
    }
2090
    
237.2.56 by Teddy Hogeborn
* plugin-runner.c: Whitespace changes only.
2091
    port = (uint16_t)tmpmax;
2092
    *address = '\0';
237.2.67 by Teddy Hogeborn
Four new interrelated features:
2093
    /* Colon in address indicates IPv6 */
2094
    int af;
237.7.39 by teddy at bsnet
* plugins.d/mandos-client.c (avahi_loop_with_timeout): Fix warning.
2095
    if(strchr(connect_to, ':') != NULL){
237.2.67 by Teddy Hogeborn
Four new interrelated features:
2096
      af = AF_INET6;
237.7.39 by teddy at bsnet
* plugins.d/mandos-client.c (avahi_loop_with_timeout): Fix warning.
2097
      /* Accept [] around IPv6 address - see RFC 5952 */
2098
      if(connect_to[0] == '[' and address[-1] == ']')
2099
	{
2100
	  connect_to++;
2101
	  address[-1] = '\0';
2102
	}
237.2.67 by Teddy Hogeborn
Four new interrelated features:
2103
    } else {
2104
      af = AF_INET;
2105
    }
237.7.39 by teddy at bsnet
* plugins.d/mandos-client.c (avahi_loop_with_timeout): Fix warning.
2106
    address = connect_to;
237.2.116 by Teddy Hogeborn
* plugins.d/mandos-client.c (quit_now): Move up declaration before
2107
    
2108
    if(quit_now){
2109
      goto end;
2110
    }
237.7.39 by teddy at bsnet
* plugins.d/mandos-client.c (avahi_loop_with_timeout): Fix warning.
2111
    
24.1.163 by Björn Påhlsson
mandos-client: Added never ending loop for --connect
2112
    while(not quit_now){
2113
      ret = start_mandos_communication(address, port, if_index, af);
2114
      if(quit_now or ret == 0){
237.2.162 by Teddy Hogeborn
* Makefile (BROKEN_PIE): Add comment.
2115
	break;
2116
      }
237.7.39 by teddy at bsnet
* plugins.d/mandos-client.c (avahi_loop_with_timeout): Fix warning.
2117
      if(debug){
237.16.3 by teddy at bsnet
* plugins.d/mandos-client.c: Prefix all printouts with "Mandos plugin
2118
	fprintf(stderr, "Mandos plugin mandos-client: "
2119
		"Retrying in %d seconds\n", (int)retry_interval);
237.7.39 by teddy at bsnet
* plugins.d/mandos-client.c (avahi_loop_with_timeout): Fix warning.
2120
      }
2121
      sleep((int)retry_interval);
237.7.40 by Teddy Hogeborn
* plugins.d/mandos-client.c (main): Do not even try to work around
2122
    }
2123
    
24.1.163 by Björn Påhlsson
mandos-client: Added never ending loop for --connect
2124
    if (not quit_now){
237.2.56 by Teddy Hogeborn
* plugin-runner.c: Whitespace changes only.
2125
      exitcode = EXIT_SUCCESS;
2126
    }
237.15.3 by Teddy Hogeborn
Intermediate commit - this does *not* work yet.
2127
    
237.2.56 by Teddy Hogeborn
* plugin-runner.c: Whitespace changes only.
2128
    goto end;
2129
  }
237.2.116 by Teddy Hogeborn
* plugins.d/mandos-client.c (quit_now): Move up declaration before
2130
  
2131
  if(quit_now){
2132
    goto end;
2133
  }
2134
  
237.2.56 by Teddy Hogeborn
* plugin-runner.c: Whitespace changes only.
2135
  {
2136
    AvahiServerConfig config;
2137
    /* Do not publish any local Zeroconf records */
2138
    avahi_server_config_init(&config);
2139
    config.publish_hinfo = 0;
2140
    config.publish_addresses = 0;
2141
    config.publish_workstation = 0;
2142
    config.publish_domain = 0;
2143
    
2144
    /* Allocate a new server */
2145
    mc.server = avahi_server_new(avahi_simple_poll_get
2146
				 (mc.simple_poll), &config, NULL,
2147
				 NULL, &error);
2148
    
2149
    /* Free the Avahi configuration data */
2150
    avahi_server_config_free(&config);
2151
  }
2152
  
2153
  /* Check if creating the Avahi server object succeeded */
2154
  if(mc.server == NULL){
237.16.3 by teddy at bsnet
* plugins.d/mandos-client.c: Prefix all printouts with "Mandos plugin
2155
    fprintf(stderr, "Mandos plugin mandos-client: "
2156
	    "Failed to create Avahi server: %s\n",
237.2.56 by Teddy Hogeborn
* plugin-runner.c: Whitespace changes only.
2157
	    avahi_strerror(error));
237.2.162 by Teddy Hogeborn
* Makefile (BROKEN_PIE): Add comment.
2158
    exitcode = EX_UNAVAILABLE;
237.2.56 by Teddy Hogeborn
* plugin-runner.c: Whitespace changes only.
2159
    goto end;
2160
  }
2161
  
237.2.116 by Teddy Hogeborn
* plugins.d/mandos-client.c (quit_now): Move up declaration before
2162
  if(quit_now){
2163
    goto end;
2164
  }
2165
  
237.2.56 by Teddy Hogeborn
* plugin-runner.c: Whitespace changes only.
2166
  /* Create the Avahi service browser */
2167
  sb = avahi_s_service_browser_new(mc.server, if_index,
237.2.76 by Teddy Hogeborn
* plugins.d/mandos-client.c (browse_callback, main): Do not require
2168
				   AVAHI_PROTO_UNSPEC, "_mandos._tcp",
24.1.134 by Björn Påhlsson
plugin-runner: Added support for empty string arguments
2169
				   NULL, 0, browse_callback, NULL);
237.2.56 by Teddy Hogeborn
* plugin-runner.c: Whitespace changes only.
2170
  if(sb == NULL){
237.16.3 by teddy at bsnet
* plugins.d/mandos-client.c: Prefix all printouts with "Mandos plugin
2171
    fprintf(stderr, "Mandos plugin mandos-client: "
2172
	    "Failed to create service browser: %s\n",
237.2.56 by Teddy Hogeborn
* plugin-runner.c: Whitespace changes only.
2173
	    avahi_strerror(avahi_server_errno(mc.server)));
237.2.162 by Teddy Hogeborn
* Makefile (BROKEN_PIE): Add comment.
2174
    exitcode = EX_UNAVAILABLE;
237.2.56 by Teddy Hogeborn
* plugin-runner.c: Whitespace changes only.
2175
    goto end;
2176
  }
237.2.70 by Teddy Hogeborn
Merge from Björn:
2177
  
237.2.116 by Teddy Hogeborn
* plugins.d/mandos-client.c (quit_now): Move up declaration before
2178
  if(quit_now){
2179
    goto end;
2180
  }
2181
  
237.2.56 by Teddy Hogeborn
* plugin-runner.c: Whitespace changes only.
2182
  /* Run the main loop */
2183
  
2184
  if(debug){
237.16.3 by teddy at bsnet
* plugins.d/mandos-client.c: Prefix all printouts with "Mandos plugin
2185
    fprintf(stderr, "Mandos plugin mandos-client: "
2186
	    "Starting Avahi loop search\n");
237.2.56 by Teddy Hogeborn
* plugin-runner.c: Whitespace changes only.
2187
  }
24.1.174 by Björn Påhlsson
* Makefile (CFLAGS): Added "-lrt" to include real time library.
2188
237.7.33 by Teddy Hogeborn
Merge from Björn.
2189
  ret = avahi_loop_with_timeout(mc.simple_poll,
2190
				(int)(retry_interval * 1000));
24.1.174 by Björn Påhlsson
* Makefile (CFLAGS): Added "-lrt" to include real time library.
2191
  if(debug){
237.16.3 by teddy at bsnet
* plugins.d/mandos-client.c: Prefix all printouts with "Mandos plugin
2192
    fprintf(stderr, "Mandos plugin mandos-client: "
2193
	    "avahi_loop_with_timeout exited %s\n",
24.1.174 by Björn Påhlsson
* Makefile (CFLAGS): Added "-lrt" to include real time library.
2194
	    (ret == 0) ? "successfully" : "with error");
2195
  }
237.2.56 by Teddy Hogeborn
* plugin-runner.c: Whitespace changes only.
2196
  
40 by Teddy Hogeborn
* plugins.d/mandosclient.c (initgnutls): Moved "err" variable into its
2197
 end:
237.2.56 by Teddy Hogeborn
* plugin-runner.c: Whitespace changes only.
2198
  
2199
  if(debug){
237.16.3 by teddy at bsnet
* plugins.d/mandos-client.c: Prefix all printouts with "Mandos plugin
2200
    fprintf(stderr, "Mandos plugin mandos-client: "
2201
	    "%s exiting\n", argv[0]);
237.2.56 by Teddy Hogeborn
* plugin-runner.c: Whitespace changes only.
2202
  }
2203
  
2204
  /* Cleanup things */
2205
  if(sb != NULL)
2206
    avahi_s_service_browser_free(sb);
2207
  
2208
  if(mc.server != NULL)
2209
    avahi_server_free(mc.server);
2210
  
2211
  if(mc.simple_poll != NULL)
2212
    avahi_simple_poll_free(mc.simple_poll);
2213
  
2214
  if(gnutls_initialized){
2215
    gnutls_certificate_free_credentials(mc.cred);
2216
    gnutls_global_deinit();
2217
    gnutls_dh_params_deinit(mc.dh_params);
2218
  }
2219
  
2220
  if(gpgme_initialized){
2221
    gpgme_release(mc.ctx);
2222
  }
24.1.174 by Björn Påhlsson
* Makefile (CFLAGS): Added "-lrt" to include real time library.
2223
237.7.33 by Teddy Hogeborn
Merge from Björn.
2224
  /* Cleans up the circular linked list of Mandos servers the client
2225
     has seen */
24.1.174 by Björn Påhlsson
* Makefile (CFLAGS): Added "-lrt" to include real time library.
2226
  if(mc.current_server != NULL){
2227
    mc.current_server->prev->next = NULL;
2228
    while(mc.current_server != NULL){
2229
      server *next = mc.current_server->next;
2230
      free(mc.current_server);
2231
      mc.current_server = next;
2232
    }
2233
  }
237.2.56 by Teddy Hogeborn
* plugin-runner.c: Whitespace changes only.
2234
  
237.15.3 by Teddy Hogeborn
Intermediate commit - this does *not* work yet.
2235
  /* XXX run network hooks "stop" here  */
2236
  
237.2.113 by Teddy Hogeborn
* plugins.d/mandos-client.c (main): Take down network interface on
2237
  /* Take down the network interface */
237.2.116 by Teddy Hogeborn
* plugins.d/mandos-client.c (quit_now): Move up declaration before
2238
  if(take_down_interface){
237.2.128 by Teddy Hogeborn
* plugins.d/mandos-client.c (main): Bug fix: Check result of setgid().
2239
    /* Re-raise priviliges */
2240
    errno = 0;
2241
    ret = seteuid(0);
237.2.113 by Teddy Hogeborn
* plugins.d/mandos-client.c (main): Take down network interface on
2242
    if(ret == -1){
24.1.174 by Björn Påhlsson
* Makefile (CFLAGS): Added "-lrt" to include real time library.
2243
      perror_plus("seteuid");
237.2.113 by Teddy Hogeborn
* plugins.d/mandos-client.c (main): Take down network interface on
2244
    }
237.2.128 by Teddy Hogeborn
* plugins.d/mandos-client.c (main): Bug fix: Check result of setgid().
2245
    if(geteuid() == 0){
2246
      ret = ioctl(sd, SIOCGIFFLAGS, &network);
2247
      if(ret == -1){
24.1.174 by Björn Påhlsson
* Makefile (CFLAGS): Added "-lrt" to include real time library.
2248
	perror_plus("ioctl SIOCGIFFLAGS");
237.16.3 by teddy at bsnet
* plugins.d/mandos-client.c: Prefix all printouts with "Mandos plugin
2249
      } else if(network.ifr_flags & IFF_UP){
237.2.157 by Teddy Hogeborn
Convert some programs to use the exit codes from <sysexits.h>. Change
2250
	network.ifr_flags &= ~(short)IFF_UP; /* clear flag */
237.2.128 by Teddy Hogeborn
* plugins.d/mandos-client.c (main): Bug fix: Check result of setgid().
2251
	ret = ioctl(sd, SIOCSIFFLAGS, &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 SIOCSIFFLAGS -IFF_UP");
237.2.128 by Teddy Hogeborn
* plugins.d/mandos-client.c (main): Bug fix: Check result of setgid().
2254
	}
2255
      }
2256
      ret = (int)TEMP_FAILURE_RETRY(close(sd));
2257
      if(ret == -1){
24.1.174 by Björn Påhlsson
* Makefile (CFLAGS): Added "-lrt" to include real time library.
2258
	perror_plus("close");
237.2.128 by Teddy Hogeborn
* plugins.d/mandos-client.c (main): Bug fix: Check result of setgid().
2259
      }
237.2.131 by Teddy Hogeborn
* plugins.d/mandos-client.c (init_gnutls_session): Retry interrupted
2260
      /* Lower privileges permanently */
237.2.128 by Teddy Hogeborn
* plugins.d/mandos-client.c (main): Bug fix: Check result of setgid().
2261
      errno = 0;
2262
      ret = setuid(uid);
2263
      if(ret == -1){
24.1.174 by Björn Påhlsson
* Makefile (CFLAGS): Added "-lrt" to include real time library.
2264
	perror_plus("setuid");
237.2.128 by Teddy Hogeborn
* plugins.d/mandos-client.c (main): Bug fix: Check result of setgid().
2265
      }
237.2.113 by Teddy Hogeborn
* plugins.d/mandos-client.c (main): Take down network interface on
2266
    }
2267
  }
2268
  
24.1.172 by Björn Påhlsson
using scandir instead of readdir
2269
  /* Removes the GPGME temp directory and all files inside */
237.2.56 by Teddy Hogeborn
* plugin-runner.c: Whitespace changes only.
2270
  if(tempdir_created){
24.1.172 by Björn Påhlsson
using scandir instead of readdir
2271
    struct dirent **direntries = NULL;
2272
    struct dirent *direntry = NULL;
237.7.40 by Teddy Hogeborn
* plugins.d/mandos-client.c (main): Do not even try to work around
2273
    int numentries = scandir(tempdir, &direntries, notdotentries,
2274
			     alphasort);
2275
    if (numentries > 0){
2276
      for(int i = 0; i < numentries; i++){
24.1.172 by Björn Påhlsson
using scandir instead of readdir
2277
	direntry = direntries[i];
237.2.56 by Teddy Hogeborn
* plugin-runner.c: Whitespace changes only.
2278
	char *fullname = NULL;
2279
	ret = asprintf(&fullname, "%s/%s", tempdir,
2280
		       direntry->d_name);
2281
	if(ret < 0){
24.1.174 by Björn Påhlsson
* Makefile (CFLAGS): Added "-lrt" to include real time library.
2282
	  perror_plus("asprintf");
237.2.56 by Teddy Hogeborn
* plugin-runner.c: Whitespace changes only.
2283
	  continue;
2284
	}
2285
	ret = remove(fullname);
2286
	if(ret == -1){
237.16.3 by teddy at bsnet
* plugins.d/mandos-client.c: Prefix all printouts with "Mandos plugin
2287
	  fprintf(stderr, "Mandos plugin mandos-client: "
2288
		  "remove(\"%s\"): %s\n", fullname, strerror(errno));
237.2.56 by Teddy Hogeborn
* plugin-runner.c: Whitespace changes only.
2289
	}
2290
	free(fullname);
2291
      }
24.1.172 by Björn Påhlsson
using scandir instead of readdir
2292
    }
2293
237.7.40 by Teddy Hogeborn
* plugins.d/mandos-client.c (main): Do not even try to work around
2294
    /* 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
2295
    free(direntries);
237.7.40 by Teddy Hogeborn
* plugins.d/mandos-client.c (main): Do not even try to work around
2296
    if (numentries == -1){
24.1.174 by Björn Påhlsson
* Makefile (CFLAGS): Added "-lrt" to include real time library.
2297
      perror_plus("scandir");
237.2.56 by Teddy Hogeborn
* plugin-runner.c: Whitespace changes only.
2298
    }
2299
    ret = rmdir(tempdir);
2300
    if(ret == -1 and errno != ENOENT){
24.1.174 by Björn Påhlsson
* Makefile (CFLAGS): Added "-lrt" to include real time library.
2301
      perror_plus("rmdir");
237.2.56 by Teddy Hogeborn
* plugin-runner.c: Whitespace changes only.
2302
    }
2303
  }
2304
  
237.2.117 by Teddy Hogeborn
* plugins.d/mandos-client.c (signal_received): New.
2305
  if(quit_now){
237.2.120 by Teddy Hogeborn
* plugins.d/mandos-client.c (main): Do not handle ignored signals.
2306
    sigemptyset(&old_sigterm_action.sa_mask);
2307
    old_sigterm_action.sa_handler = SIG_DFL;
237.2.137 by Teddy Hogeborn
* plugins.d/mandos-client.c (main): Try harder to raise signal on
2308
    ret = (int)TEMP_FAILURE_RETRY(sigaction(signal_received,
2309
					    &old_sigterm_action,
2310
					    NULL));
237.2.117 by Teddy Hogeborn
* plugins.d/mandos-client.c (signal_received): New.
2311
    if(ret == -1){
24.1.174 by Björn Påhlsson
* Makefile (CFLAGS): Added "-lrt" to include real time library.
2312
      perror_plus("sigaction");
237.2.117 by Teddy Hogeborn
* plugins.d/mandos-client.c (signal_received): New.
2313
    }
237.2.137 by Teddy Hogeborn
* plugins.d/mandos-client.c (main): Try harder to raise signal on
2314
    do {
2315
      ret = raise(signal_received);
2316
    } while(ret != 0 and errno == EINTR);
2317
    if(ret != 0){
24.1.174 by Björn Påhlsson
* Makefile (CFLAGS): Added "-lrt" to include real time library.
2318
      perror_plus("raise");
237.2.137 by Teddy Hogeborn
* plugins.d/mandos-client.c (main): Try harder to raise signal on
2319
      abort();
2320
    }
2321
    TEMP_FAILURE_RETRY(pause());
237.2.117 by Teddy Hogeborn
* plugins.d/mandos-client.c (signal_received): New.
2322
  }
2323
  
237.2.56 by Teddy Hogeborn
* plugin-runner.c: Whitespace changes only.
2324
  return exitcode;
13 by Björn Påhlsson
Added following support:
2325
}