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