cfgfile.h 7.45 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>
Marvin Scholz's avatar
Marvin Scholz committed
26 27
#include "common/thread/thread.h"
#include "common/avl/avl.h"
28
#include "icecasttypes.h"
29
#include "compat.h"
30

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

33
typedef enum _http_header_type {
34
 /* static: headers are passed as is to the client. */
35 36 37 38
 HTTP_HEADER_TYPE_STATIC
} http_header_type;

typedef struct ice_config_http_header_tag {
39
    /* type of this header. See http_header_type */
40
    http_header_type type;
41 42

    /* name and value of the header */
43 44
    char *name;
    char *value;
45 46 47 48 49

    /* filters */
    int status;

    /* link to the next list element */
50 51 52
    struct ice_config_http_header_tag *next;
} ice_config_http_header_t;

53
typedef struct ice_config_dir_tag {
54 55 56 57 58
    char *host;
    int touch_interval;
    struct ice_config_dir_tag *next;
} ice_config_dir_t;

59
struct _config_options {
60
    char *type;
Michael Smith's avatar
Michael Smith committed
61 62
    char *name;
    char *value;
63 64
    config_options_t *next;
};
Michael Smith's avatar
Michael Smith committed
65

66 67 68 69 70
typedef enum _mount_type {
 MOUNT_TYPE_NORMAL,
 MOUNT_TYPE_DEFAULT
} mount_type;

71
typedef struct _mount_proxy {
Marvin Scholz's avatar
Marvin Scholz committed
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
    /* 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
102
    unsigned int queue_size_limit;
Marvin Scholz's avatar
Marvin Scholz committed
103 104 105 106 107 108 109 110 111 112
    /* 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;
113

114 115 116
    /* maximum history size of played songs */
    ssize_t max_history;

117 118
    struct event_registration_tag *event;

119
    char *cluster_password;
120
    auth_stack_t *authstack;
121
    unsigned int max_listener_duration;
122 123 124 125 126 127 128 129 130 131

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

132 133 134
    struct _mount_proxy *next;
} mount_proxy;

135 136
#define ALIAS_FLAG_PREFIXMATCH          0x0001

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

151
typedef enum _listener_type_tag {
152 153 154
    LISTENER_TYPE_ERROR,
    LISTENER_TYPE_NORMAL,
    LISTENER_TYPE_VIRTUAL
155 156
} listener_type_t;

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

171 172 173 174
typedef struct _config_tls_context {
    char *cert_file;
    char *key_file;
    char *cipher_list;
Philipp Schafft's avatar
Philipp Schafft committed
175
} config_tls_context_t;
176

177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194
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;

195
struct ice_config_tag {
196 197 198 199 200 201 202
    char *config_filename;

    char *location;
    char *admin;

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

213
    char *shoutcast_mount;
214
    char *shoutcast_user;
215
    auth_stack_t *authstack;
216

217 218
    struct event_registration_tag *event;

219 220 221 222
    int touch_interval;
    ice_config_dir_t *dir_list;

    char *hostname;
223
    int sane_hostname;
224
    int port;
225
    char *mimetypes_fn;
226

227 228
    listener_t *listen_sock;
    unsigned int listen_sock_count;
229 230 231 232

    char *master_server;
    int master_server_port;
    int master_update_interval;
233
    char *master_username;
234 235
    char *master_password;

236 237
    ice_config_http_header_t *http_headers;

238 239 240
    /* is TLS supported by the server? */
    int tls_ok;

241 242
    size_t relay_length;
    relay_config_t **relay;
243 244 245

    mount_proxy *mounts;

246
    char *server_id;
247 248
    char *base_dir;
    char *log_dir;
249
    char *pidfile;
250
    char *null_device;
251 252
    char *banfile;
    char *allowfile;
253 254
    char *webroot_dir;
    char *adminroot_dir;
255
    resource_t *resources;
256
    reportxml_database_t *reportxml_db;
257 258 259

    char *access_log;
    char *error_log;
260
    char *playlist_log;
261
    int loglevel;
262 263
    int logsize;
    int logarchive;
264

Philipp Schafft's avatar
Philipp Schafft committed
265
    config_tls_context_t tls_context;
266

267 268 269 270 271
    int chroot;
    int chuid;
    char *user;
    char *group;
    char *yp_url[MAX_YP_DIRECTORIES];
272 273
    int yp_url_timeout[MAX_YP_DIRECTORIES];
    int yp_touch_interval[MAX_YP_DIRECTORIES];
274
    size_t num_yp_directories;
275
};
276 277

typedef struct {
278
    rwlock_t config_lock;
279 280 281 282 283 284
    mutex_t relay_lock;
} ice_config_locks;

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

285 286
operation_mode config_str_to_omode(const char *str);

287
void config_reread_config(void);
288 289 290 291
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);
292
listener_t *config_clear_listener (listener_t *listener);
293
void config_clear(ice_config_t *config);
Marvin Scholz's avatar
Marvin Scholz committed
294
mount_proxy *config_find_mount(ice_config_t *config, const char *mount, mount_type type);
295 296

listener_t *config_copy_listener_one(const listener_t *listener);
297

298 299 300
config_options_t *config_parse_options(xmlNodePtr node);
void config_clear_options(config_options_t *options);

301 302 303 304 305
int config_rehash(void);

ice_config_locks *config_locks(void);

ice_config_t *config_get_config(void);
306
ice_config_t *config_grab_config(void);
307 308 309 310 311
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
312
#endif  /* __CFGFILE_H__ */