/mandos/trunk

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