1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
|
/*
* (C) 2013-2018 by Christian Hesse <mail@eworm.de>
*
* This software may be used and distributed according to the terms
* of the GNU General Public License, incorporated herein by reference.
*/
#ifndef _PACREDIR_H
#define _PACREDIR_H
#define _GNU_SOURCE
/* glibc headers */
#include <arpa/inet.h>
#include <assert.h>
#include <getopt.h>
#include <math.h>
#include <net/if.h>
#include <signal.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/socket.h>
#include <sys/stat.h>
#include <time.h>
/* systemd headers */
#include <systemd/sd-daemon.h>
/* Avahi headers */
#include <avahi-client/lookup.h>
#include <avahi-common/error.h>
#include <avahi-common/simple-watch.h>
/* various headers needing linker options */
#include <curl/curl.h>
#include <iniparser.h>
#include <microhttpd.h>
#include <pthread.h>
/* compile time configuration */
#include "config.h"
#include "version.h"
#define PROGNAME "pacredir"
/* hosts */
struct hosts {
/* host name */
char * host;
/* protocol (AVAHI_PROTO_INET, AVAHI_PROTO_INET6 or AVAHI_PROTO_UNSPEC) */
AvahiProtocol proto;
/* resolved address */
char address[AVAHI_ADDRESS_STR_MAX];
/* network port */
uint16_t port;
/* true if host/service is online */
uint8_t online;
/* unix timestamp of last bad request */
__time_t badtime;
/* count the number of bad requests */
unsigned int badcount;
/* pointer to next struct element */
struct hosts * next;
};
/* ignore interfaces */
struct ignore_interfaces {
/* interface name */
char * interface;
/* pointer to next struct element */
struct ignore_interfaces * next;
};
/* request */
struct request {
/* host infos */
struct hosts * host;
/* url */
char * url;
/* HTTP status code */
long http_code;
/* total connection time */
double time_total;
/* last modified timestamp */
long last_modified;
};
/* write_log */
int write_log(FILE *stream, const char *format, ...);
/* get_fqdn */
char * get_fqdn(const char * hostname, const char * domainname);
/* get_url */
char * get_url(const char * hostname, AvahiProtocol proto, const char * address, const uint16_t port, const uint8_t dbfile, const char * uri);
/* add_host */
int add_host(const char * host, AvahiProtocol proto, const char * address, const uint16_t port, const char * type);
/* remove_host */
int remove_host(const char * host, AvahiProtocol proto, const char * type);
/* resolve_callback */
static void resolve_callback(AvahiServiceResolver *r,
AvahiIfIndex interface,
AvahiProtocol protocol,
AvahiResolverEvent event,
const char *name,
const char *type,
const char *domain,
const char *host,
const AvahiAddress *address,
uint16_t port,
AvahiStringList *txt,
AvahiLookupResultFlags flags,
void* userdata);
/* browse_callback */
static void browse_callback(AvahiServiceBrowser *b,
AvahiIfIndex interface,
AvahiProtocol protocol,
AvahiBrowserEvent event,
const char *name,
const char *type,
const char *domain,
AvahiLookupResultFlags flags,
void* userdata);
/* client_callback */
static void client_callback(AvahiClient *c,
AvahiClientState state,
void * userdata);
/* get_http_code */
static void * get_http_code(void * data);
/* ahc_echo */
static int ahc_echo(void * cls,
struct MHD_Connection * connection,
const char * uri,
const char * method,
const char * version,
const char * upload_data,
size_t * upload_data_size,
void ** ptr);
/* sig_callback */
void sig_callback(int signal);
/* sighup_callback */
void sighup_callback(int signal);
#endif /* _PACREDIR_H */
// vim: set syntax=c:
|