4
* This file demonstrates how to use Avahi's core API, this is
5
* the embeddable mDNS stack for embedded applications.
7
* End user applications should *not* use this API and should use
8
* the D-Bus or C APIs, please see
9
* client-browse-services.c and glib-integration.c
11
* I repeat, you probably do *not* want to use this example.
2
15
This file is part of avahi.
136
143
gpgme_strsource(rc), gpgme_strerror(rc));
141
fprintf(stderr, "decryption of gpg packet succeeded\n");
145
gpgme_decrypt_result_t result;
146
result = gpgme_op_decrypt_result(ctx);
148
fprintf(stderr, "gpgme_op_decrypt_result failed\n");
150
fprintf(stderr, "Unsupported algorithm: %s\n", result->unsupported_algorithm);
151
fprintf(stderr, "Wrong key usage: %d\n", result->wrong_key_usage);
152
if(result->file_name != NULL){
153
fprintf(stderr, "File name: %s\n", result->file_name);
155
gpgme_recipient_t recipient;
156
recipient = result->recipients;
158
while(recipient != NULL){
159
fprintf(stderr, "Public key algorithm: %s\n",
160
gpgme_pubkey_algo_name(recipient->pubkey_algo));
161
fprintf(stderr, "Key ID: %s\n", recipient->keyid);
162
fprintf(stderr, "Secret key available: %s\n",
163
recipient->status == GPG_ERR_NO_SECKEY ? "No" : "Yes");
164
recipient = recipient->next;
147
/* gpgme_decrypt_result_t result; */
148
/* result = gpgme_op_decrypt_result(ctx); */
149
/* fprintf(stderr, "Unsupported algorithm: %s\n", result->unsupported_algorithm); */
150
/* fprintf(stderr, "Wrong key usage: %d\n", result->wrong_key_usage); */
151
/* if(result->file_name != NULL){ */
152
/* fprintf(stderr, "File name: %s\n", result->file_name); */
154
/* gpgme_recipient_t recipient; */
155
/* recipient = result->recipients; */
157
/* while(recipient != NULL){ */
158
/* fprintf(stderr, "Public key algorithm: %s\n", */
159
/* gpgme_pubkey_algo_name(recipient->pubkey_algo)); */
160
/* fprintf(stderr, "Key ID: %s\n", recipient->keyid); */
161
/* fprintf(stderr, "Secret key available: %s\n", */
162
/* recipient->status == GPG_ERR_NO_SECKEY ? "No" : "Yes"); */
163
/* recipient = recipient->next; */
170
167
/* Delete the GPGME FILE pointer cryptotext data buffer */
171
168
gpgme_data_release(dh_crypto);
236
gnutls_global_set_log_level(11);
237
gnutls_global_set_log_function(debuggnutls);
223
/* Uncomment to enable full debuggin on the gnutls library */
224
/* gnutls_global_set_log_level(11); */
225
/* gnutls_global_set_log_function(debuggnutls); */
241
228
/* openpgp credentials */
242
229
if ((ret = gnutls_certificate_allocate_credentials (&es->cred))
249
fprintf(stderr, "Attempting to use openpgp certificate %s"
250
" and keyfile %s as gnutls credentials\n", CERTFILE, KEYFILE);
253
235
ret = gnutls_certificate_set_openpgp_key_file
254
236
(es->cred, CERTFILE, KEYFILE, GNUTLS_OPENPGP_FMT_BASE64);
255
237
if (ret != GNUTLS_E_SUCCESS) {
321
304
size_t buffer_capacity = 0;
322
305
ssize_t decrypted_buffer_size;
324
const char interface[] = "eth0";
327
fprintf(stderr, "Setting up a tcp connection to %s\n", ip);
330
309
tcp_sd = socket(PF_INET6, SOCK_STREAM, 0);
332
311
perror("socket");
337
fprintf(stderr, "Binding to interface %s\n", interface);
340
ret = setsockopt(tcp_sd, SOL_SOCKET, SO_BINDTODEVICE, interface, 5);
315
ret = setsockopt(tcp_sd, SOL_SOCKET, SO_BINDTODEVICE, "eth0", 5);
342
317
perror("setsockopt bindtodevice");
346
321
memset(&to,0,sizeof(to));
347
322
to.sin6_family = AF_INET6;
348
ret = inet_pton(AF_INET6, ip, &to.sin6_addr);
323
ret = inet_pton(AF_INET6, ip, &ip_addr);
350
325
perror("inet_pton");
357
332
to.sin6_port = htons(port);
358
to.sin6_scope_id = if_nametoindex(interface);
361
fprintf(stderr, "Connection to: %s\n", ip);
333
to.sin6_scope_id = if_nametoindex("eth0");
364
335
ret = connect(tcp_sd, (struct sockaddr *) &to, sizeof(to));
435
396
buffer_length += ret;
439
400
if (buffer_length > 0){
440
if ((decrypted_buffer_size = gpg_packet_decrypt(buffer, buffer_length, &decrypted_buffer, CERT_ROOT)) >= 0){
401
if ((decrypted_buffer_size = gpg_packet_decrypt(buffer, buffer_length, &decrypted_buffer, CERT_ROOT)) == 0){
441
404
fwrite (decrypted_buffer, 1, decrypted_buffer_size, stdout);
442
405
free(decrypted_buffer);
448
411
//shutdown procedure
451
fprintf(stderr, "Closing tls session\n");
455
412
gnutls_bye (es.session, GNUTLS_SHUT_RDWR);
491
448
case AVAHI_RESOLVER_FOUND: {
492
449
char ip[AVAHI_ADDRESS_STR_MAX];
493
450
avahi_address_snprint(ip, sizeof(ip), address);
495
fprintf(stderr, "Mandos server found at %s on port %d\n", ip, port);
497
451
int ret = start_mandos_communcation(ip, port);
499
453
exit(EXIT_SUCCESS);
552
506
int main(AVAHI_GCC_UNUSED int argc, AVAHI_GCC_UNUSED char*argv[]) {
553
507
AvahiServerConfig config;
554
508
AvahiSServiceBrowser *sb = NULL;
555
const char db[] = "--debug";
558
int returncode = EXIT_SUCCESS;
559
char *basename = rindex(argv[0], '/');
560
if(basename == NULL){
566
char *program_name = malloc(strlen(basename) + sizeof(db));
568
if (program_name == NULL){
573
program_name[0] = '\0';
575
for (int i = 1; i < argc; i++){
576
if (not strncmp(argv[i], db, 5)){
577
strcat(strcat(strcat(program_name, db ), "="), basename);
578
if(not strcmp(argv[i], db) or not strcmp(argv[i], program_name)){
586
avahi_set_log_function(empty_log);
512
avahi_set_log_function(empty_log);
589
514
/* Initialize the psuedo-RNG */
590
515
srand(time(NULL));
603
527
config.publish_workstation = 0;
604
528
config.publish_domain = 0;
530
/* /\* Set a unicast DNS server for wide area DNS-SD *\/ */
531
/* avahi_address_parse("193.11.177.11", AVAHI_PROTO_UNSPEC, &config.wide_area_servers[0]); */
532
/* config.n_wide_area_servers = 1; */
533
/* config.enable_wide_area = 1; */
606
535
/* Allocate a new server */
607
536
server = avahi_server_new(avahi_simple_poll_get(simple_poll), &config, NULL, NULL, &error);
609
538
/* Free the configuration data */
610
539
avahi_server_config_free(&config);
612
/* Check if creating the server object succeeded */
541
/* Check wether creating the server object succeeded */
614
543
fprintf(stderr, "Failed to create server: %s\n", avahi_strerror(error));
615
returncode = EXIT_FAILURE;
619
547
/* Create the service browser */
620
548
if (!(sb = avahi_s_service_browser_new(server, if_nametoindex("eth0"), AVAHI_PROTO_INET6, "_mandos._tcp", NULL, 0, browse_callback, server))) {
621
549
fprintf(stderr, "Failed to create service browser: %s\n", avahi_strerror(avahi_server_errno(server)));
622
returncode = EXIT_FAILURE;
626
553
/* Run the main loop */
629
fprintf(stderr, "Starting avahi loop search\n");
632
554
avahi_simple_poll_loop(simple_poll);
637
fprintf(stderr, "%s exiting\n", argv[0]);
640
560
/* Cleanup things */