78
80
bool debug = false;
82
const char mandos_protocol_version[] = "1";
81
gnutls_session_t session;
85
AvahiSimplePoll *simple_poll;
82
87
gnutls_certificate_credentials_t cred;
83
gnutls_dh_params_t dh_params;
92
size_t adjustbuffer(char *buffer, size_t buffer_length,
93
size_t buffer_capacity){
94
if (buffer_length + BUFFER_SIZE > buffer_capacity){
95
buffer = realloc(buffer, buffer_capacity + BUFFER_SIZE);
99
buffer_capacity += BUFFER_SIZE;
101
return buffer_capacity;
87
104
static ssize_t pgp_packet_decrypt (char *packet, size_t packet_size,
88
105
char **new_packet,
207
if (new_packet_length + BUFFER_SIZE > new_packet_capacity){
208
*new_packet = realloc(*new_packet,
209
(unsigned int)new_packet_capacity
211
if (*new_packet == NULL){
224
new_packet_capacity = adjustbuffer(*new_packet, new_packet_length,
225
new_packet_capacity);
226
if (new_packet_capacity == 0){
227
perror("adjustbuffer");
215
230
new_packet_capacity += BUFFER_SIZE;
322
337
safer_gnutls_strerror(ret));
325
if ((ret = gnutls_priority_set_direct (es->session, "NORMAL", &err))
340
if ((ret = gnutls_priority_set_direct (es->session, mc->priority, &err))
326
341
!= GNUTLS_E_SUCCESS) {
327
342
fprintf(stderr, "Syntax error at: %s\n", err);
328
343
fprintf(stderr, "GnuTLS error: %s\n",
536
static AvahiSimplePoll *simple_poll = NULL;
537
static AvahiServer *server = NULL;
539
static void resolve_callback(
540
AvahiSServiceResolver *r,
541
AvahiIfIndex interface,
542
AVAHI_GCC_UNUSED AvahiProtocol protocol,
543
AvahiResolverEvent event,
547
const char *host_name,
548
const AvahiAddress *address,
550
AVAHI_GCC_UNUSED AvahiStringList *txt,
551
AVAHI_GCC_UNUSED AvahiLookupResultFlags flags,
552
AVAHI_GCC_UNUSED void* userdata) {
575
static void resolve_callback( AvahiSServiceResolver *r,
576
AvahiIfIndex interface,
577
AVAHI_GCC_UNUSED AvahiProtocol protocol,
578
AvahiResolverEvent event,
582
const char *host_name,
583
const AvahiAddress *address,
585
AVAHI_GCC_UNUSED AvahiStringList *txt,
586
AVAHI_GCC_UNUSED AvahiLookupResultFlags flags,
587
AVAHI_GCC_UNUSED void* userdata) {
588
mandos_context *mc = userdata;
554
589
assert(r); /* Spurious warning */
556
591
/* Called whenever a service has been resolved successfully or
561
596
case AVAHI_RESOLVER_FAILURE:
562
597
fprintf(stderr, "(Resolver) Failed to resolve service '%s' of"
563
598
" type '%s' in domain '%s': %s\n", name, type, domain,
564
avahi_strerror(avahi_server_errno(server)));
599
avahi_strerror(avahi_server_errno(mc->server)));
567
602
case AVAHI_RESOLVER_FOUND:
572
607
fprintf(stderr, "Mandos server \"%s\" found on %s (%s) on"
573
608
" port %d\n", name, host_name, ip, port);
575
int ret = start_mandos_communication(ip, port, interface);
610
int ret = start_mandos_communication(ip, port, interface, mc);
577
612
exit(EXIT_SUCCESS);
581
616
avahi_s_service_resolver_free(r);
584
static void browse_callback(
585
AvahiSServiceBrowser *b,
586
AvahiIfIndex interface,
587
AvahiProtocol protocol,
588
AvahiBrowserEvent event,
592
AVAHI_GCC_UNUSED AvahiLookupResultFlags flags,
595
AvahiServer *s = userdata;
596
assert(b); /* Spurious warning */
598
/* Called whenever a new services becomes available on the LAN or
599
is removed from the LAN */
603
case AVAHI_BROWSER_FAILURE:
605
fprintf(stderr, "(Browser) %s\n",
606
avahi_strerror(avahi_server_errno(server)));
607
avahi_simple_poll_quit(simple_poll);
610
case AVAHI_BROWSER_NEW:
611
/* We ignore the returned resolver object. In the callback
612
function we free it. If the server is terminated before
613
the callback function is called the server will free
614
the resolver for us. */
616
if (!(avahi_s_service_resolver_new(s, interface, protocol, name,
618
AVAHI_PROTO_INET6, 0,
619
resolve_callback, s)))
620
fprintf(stderr, "Failed to resolve service '%s': %s\n", name,
621
avahi_strerror(avahi_server_errno(s)));
624
case AVAHI_BROWSER_REMOVE:
627
case AVAHI_BROWSER_ALL_FOR_NOW:
628
case AVAHI_BROWSER_CACHE_EXHAUSTED:
619
static void browse_callback( AvahiSServiceBrowser *b,
620
AvahiIfIndex interface,
621
AvahiProtocol protocol,
622
AvahiBrowserEvent event,
626
AVAHI_GCC_UNUSED AvahiLookupResultFlags flags,
628
mandos_context *mc = userdata;
629
assert(b); /* Spurious warning */
631
/* Called whenever a new services becomes available on the LAN or
632
is removed from the LAN */
636
case AVAHI_BROWSER_FAILURE:
638
fprintf(stderr, "(Browser) %s\n",
639
avahi_strerror(avahi_server_errno(mc->server)));
640
avahi_simple_poll_quit(mc->simple_poll);
643
case AVAHI_BROWSER_NEW:
644
/* We ignore the returned resolver object. In the callback
645
function we free it. If the server is terminated before
646
the callback function is called the server will free
647
the resolver for us. */
649
if (!(avahi_s_service_resolver_new(mc->server, interface, protocol, name,
651
AVAHI_PROTO_INET6, 0,
652
resolve_callback, mc)))
653
fprintf(stderr, "Failed to resolve service '%s': %s\n", name,
654
avahi_strerror(avahi_server_errno(s)));
657
case AVAHI_BROWSER_REMOVE:
660
case AVAHI_BROWSER_ALL_FOR_NOW:
661
case AVAHI_BROWSER_CACHE_EXHAUSTED:
633
666
/* Combines file name and path and returns the malloced new
671
706
{"certdir", required_argument, 0, 'd'},
672
707
{"certkey", required_argument, 0, 'c'},
673
708
{"certfile", required_argument, 0, 'k'},
709
{"dh_bits", required_argument, 0, 'D'},
710
{"priority", required_argument, 0, 'p'},
676
713
int option_index = 0;
795
847
config.publish_domain = 0;
797
849
/* Allocate a new server */
798
server = avahi_server_new(avahi_simple_poll_get(simple_poll),
850
mc.server = avahi_server_new(avahi_simple_poll_get(simple_poll),
799
851
&config, NULL, NULL, &error);
801
853
/* Free the configuration data */
802
854
avahi_server_config_free(&config);
804
856
/* Check if creating the server object succeeded */
806
858
fprintf(stderr, "Failed to create server: %s\n",
807
859
avahi_strerror(error));
808
860
returncode = EXIT_FAILURE;
812
864
/* Create the service browser */
813
sb = avahi_s_service_browser_new(server, if_index,
865
sb = avahi_s_service_browser_new(mc.server, if_index,
814
866
AVAHI_PROTO_INET6,
815
867
"_mandos._tcp", NULL, 0,
816
browse_callback, server);
868
browse_callback, &mc);
818
870
fprintf(stderr, "Failed to create service browser: %s\n",
819
avahi_strerror(avahi_server_errno(server)));
871
avahi_strerror(avahi_server_errno(mc.server)));
820
872
returncode = EXIT_FAILURE;