cfgfile.h 7.78 KB
Newer Older
1 2 3 4 5
/* Icecast
 *
 * This program is distributed under the GNU General Public License, version 2.
 * A copy of this license is included with this source.
 *
6
 * Copyright 2000-2004, Jack Moffitt <jack@xiph.org>, 
7 8 9 10
 *                      Michael Smith <msmith@xiph.org>,
 *                      oddsock <oddsock@xiph.org>,
 *                      Karl Heyes <karl@xiph.org>
 *                      and others (see AUTHORS for details).
11
 * Copyright 2011,      Dave 'justdave' Miller <justdave@mozilla.com>.
Philipp Schafft's avatar
Philipp Schafft committed
12
 * Copyright 2011-2018, Philipp "ph3-der-loewe" Schafft <lion@lion.leolix.org>,
13 14
 */

Karl Heyes's avatar
Karl Heyes committed
15 16
#ifndef __CFGFILE_H__
#define __CFGFILE_H__
17

18 19
#define CONFIG_EINSANE  -1
#define CONFIG_ENOROOT  -2
20
#define CONFIG_EBADROOT -3
21
#define CONFIG_EPARSE   -4
22 23 24

#define MAX_YP_DIRECTORIES 25

25
#include <libxml/tree.h>
26 27
#include <igloo/thread.h>
#include <igloo/avl.h>
Marvin Scholz's avatar
Marvin Scholz committed
28

29
#include "icecasttypes.h"
30
#include "compat.h"
31

32 33
#define XMLSTR(str) ((xmlChar *)(str)) 

34
typedef enum _http_header_type {
Philipp Schafft's avatar
Philipp Schafft committed
35
    /* static: headers are passed as is to the client. */
36 37 38
    HTTP_HEADER_TYPE_STATIC,
    /* CORS: headers are only sent to the client if it's a CORS request. */
    HTTP_HEADER_TYPE_CORS
39 40 41
} http_header_type;

typedef struct ice_config_http_header_tag {
42
    /* type of this header. See http_header_type */
43
    http_header_type type;
44 45

    /* name and value of the header */
46 47
    char *name;
    char *value;
48 49 50 51 52

    /* filters */
    int status;

    /* link to the next list element */
53 54 55
    struct ice_config_http_header_tag *next;
} ice_config_http_header_t;

56
typedef struct ice_config_dir_tag {
57 58 59 60 61
    char *host;
    int touch_interval;
    struct ice_config_dir_tag *next;
} ice_config_dir_t;

62
struct _config_options {
63
    char *type;
Michael Smith's avatar
Michael Smith committed
64 65
    char *name;
    char *value;
66 67
    config_options_t *next;
};
Michael Smith's avatar
Michael Smith committed
68

69 70 71 72 73
typedef enum _mount_type {
 MOUNT_TYPE_NORMAL,
 MOUNT_TYPE_DEFAULT
} mount_type;

74
typedef struct _mount_proxy {
Marvin Scholz's avatar
Marvin Scholz committed
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
    /* The mountpoint this proxy is used for */
    char *mountname;
    /* The type of the mount point */
    mount_type mounttype;
    /* Filename to dump this stream to (will be appended).
     * NULL to not dump.
     */
    char *dumpfile;
    /* Send contents of file to client before the stream */
    char *intro_filename;
    /* Switch new listener to fallback source when max listeners reached */
    int fallback_when_full;
    /* Max listeners for this mountpoint only.
     * -1 to not limit here (i.e. only use the global limit)
     */
    int max_listeners;
    /* Fallback mountname */
    char *fallback_mount;
    /* When this source arrives, do we steal back
     * clients from the fallback?
     */
    int fallback_override;
    /* Do we permit direct requests of this mountpoint?
     * (or only indirect, through fallbacks)
     */
    int no_mount;
    /* amount to send to a new client if possible, -1 take
     * from global setting
     */
    int burst_size;
Karl Heyes's avatar
Karl Heyes committed
105
    unsigned int queue_size_limit;
Marvin Scholz's avatar
Marvin Scholz committed
106 107 108 109 110 111 112 113 114 115
    /* Do we list this on the xsl pages */
    int hidden;
    /* source timeout in seconds */
    unsigned int source_timeout;
    /* character set if not utf8 */
    char *charset;
    /* outgoing per-stream metadata interval */
    int mp3_meta_interval;
    /* additional HTTP headers */
    ice_config_http_header_t *http_headers;
116

117 118 119
    /* maximum history size of played songs */
    ssize_t max_history;

120 121
    struct event_registration_tag *event;

122
    char *cluster_password;
123
    auth_stack_t *authstack;
124
    unsigned int max_listener_duration;
125 126 127 128 129 130 131 132 133 134

    char *stream_name;
    char *stream_description;
    char *stream_url;
    char *stream_genre;
    char *bitrate;
    char *type;
    char *subtype;
    int yp_public;

135 136 137
    struct _mount_proxy *next;
} mount_proxy;

138 139
#define ALIAS_FLAG_PREFIXMATCH          0x0001

140
typedef struct _resource {
141 142 143 144
    char *source;
    char *destination;
    int port;
    char *bind_address;
145
    char *listen_socket;
146
    char *vhost;
147 148
    char *module;
    char *handler;
149
    operation_mode omode;
150
    unsigned int flags;
151 152
    struct _resource *next;
} resource_t;
153

154
typedef enum _listener_type_tag {
155 156 157
    LISTENER_TYPE_ERROR,
    LISTENER_TYPE_NORMAL,
    LISTENER_TYPE_VIRTUAL
158 159
} listener_type_t;

160 161
typedef struct _listener_t {
    struct _listener_t *next;
162
    char *id;
163
    char *on_behalf_of;
164
    listener_type_t type;
165
    int port;
166
    int so_sndbuf;
167
    int listen_backlog;
168
    char *bind_address;
169
    int shoutcast_compat;
170
    char *shoutcast_mount;
171
    tlsmode_t tls;
172
    auth_stack_t *authstack;
173 174
} listener_t;

175 176 177 178
typedef struct _config_tls_context {
    char *cert_file;
    char *key_file;
    char *cipher_list;
Philipp Schafft's avatar
Philipp Schafft committed
179
} config_tls_context_t;
180

181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198
typedef struct {
    char *server;
    int port;
    char *mount;
    char *username;
    char *password;
    char *bind;
    int mp3metadata;
} relay_config_upstream_t;

typedef struct {
    char *localmount;
    int on_demand;
    size_t upstreams;
    relay_config_upstream_t *upstream;
    relay_config_upstream_t upstream_default;
} relay_config_t;

199
struct ice_config_tag {
200 201 202 203 204 205 206
    char *config_filename;

    char *location;
    char *admin;

    int client_limit;
    int source_limit;
207
    int body_size_limit;
Karl Heyes's avatar
Karl Heyes committed
208 209
    unsigned int queue_size_limit;
    unsigned int burst_size;
210 211 212
    int client_timeout;
    int header_timeout;
    int source_timeout;
213
    int body_timeout;
214
    int fileserve;
215
    int on_demand; /* global setting for all relays */
216

217
    char *shoutcast_mount;
218
    char *shoutcast_user;
219
    auth_stack_t *authstack;
220

221 222
    struct event_registration_tag *event;

223 224 225 226
    int touch_interval;
    ice_config_dir_t *dir_list;

    char *hostname;
227
    int sane_hostname;
228
    int port;
229
    char *mimetypes_fn;
230

231 232
    listener_t *listen_sock;
    unsigned int listen_sock_count;
233 234 235 236

    char *master_server;
    int master_server_port;
    int master_update_interval;
237
    char *master_username;
238 239
    char *master_password;

240 241
    ice_config_http_header_t *http_headers;

242 243 244
    /* is TLS supported by the server? */
    int tls_ok;

245 246
    size_t relay_length;
    relay_config_t **relay;
247 248 249

    mount_proxy *mounts;

250
    char *server_id;
251 252
    char *base_dir;
    char *log_dir;
253
    char *pidfile;
254
    char *null_device;
255 256
    char *banfile;
    char *allowfile;
257 258
    char *webroot_dir;
    char *adminroot_dir;
259
    resource_t *resources;
260
    reportxml_database_t *reportxml_db;
261 262 263

    char *access_log;
    char *error_log;
264
    char *playlist_log;
265
    int loglevel;
266 267
    int logsize;
    int logarchive;
268

Philipp Schafft's avatar
Philipp Schafft committed
269
    config_tls_context_t tls_context;
270

271 272 273 274 275
    int chroot;
    int chuid;
    char *user;
    char *group;
    char *yp_url[MAX_YP_DIRECTORIES];
276 277
    int yp_url_timeout[MAX_YP_DIRECTORIES];
    int yp_touch_interval[MAX_YP_DIRECTORIES];
278
    size_t num_yp_directories;
279
};
280 281

typedef struct {
282 283
    igloo_rwlock_t config_lock;
    igloo_mutex_t relay_lock;
284 285 286 287 288
} ice_config_locks;

void config_initialize(void);
void config_shutdown(void);

289 290
operation_mode config_str_to_omode(const char *str);

291
void config_reread_config(void);
292 293 294 295
int config_parse_file(const char *filename, ice_config_t *configuration);
int config_initial_parse_file(const char *filename);
int config_parse_cmdline(int arg, char **argv);
void config_set_config(ice_config_t *config);
296
listener_t *config_clear_listener (listener_t *listener);
297
void config_clear(ice_config_t *config);
Marvin Scholz's avatar
Marvin Scholz committed
298
mount_proxy *config_find_mount(ice_config_t *config, const char *mount, mount_type type);
299 300

listener_t *config_copy_listener_one(const listener_t *listener);
301

302 303 304
config_options_t *config_parse_options(xmlNodePtr node);
void config_clear_options(config_options_t *options);

305 306 307 308
void config_parse_http_headers(xmlNodePtr                  node,
                               ice_config_http_header_t  **http_headers);
void config_clear_http_header(ice_config_http_header_t *header);

309 310 311 312 313
int config_rehash(void);

ice_config_locks *config_locks(void);

ice_config_t *config_get_config(void);
314
ice_config_t *config_grab_config(void);
315 316 317 318 319
void config_release_config(void);

/* To be used ONLY in one-time startup code */
ice_config_t *config_get_config_unlocked(void);

Karl Heyes's avatar
Karl Heyes committed
320
#endif  /* __CFGFILE_H__ */