/mandos/release

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