cfgfile.h 7.58 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
#include <libxml/tree.h>
Marvin Scholz's avatar
Marvin Scholz committed
24 25
#include "common/thread/thread.h"
#include "common/avl/avl.h"
26
#include "icecasttypes.h"
27
#include "compat.h"
28

29 30
#define XMLSTR(str) ((xmlChar *)(str)) 

31
typedef enum _http_header_type {
Philipp Schafft's avatar
Philipp Schafft committed
32
    /* static: headers are passed as is to the client. */
33 34 35
    HTTP_HEADER_TYPE_STATIC,
    /* CORS: headers are only sent to the client if it's a CORS request. */
    HTTP_HEADER_TYPE_CORS
36 37 38
} 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
struct _config_options {
54
    char *type;
Michael Smith's avatar
Michael Smith committed
55 56
    char *name;
    char *value;
57 58
    config_options_t *next;
};
Michael Smith's avatar
Michael Smith committed
59

60 61 62 63 64
typedef enum _mount_type {
 MOUNT_TYPE_NORMAL,
 MOUNT_TYPE_DEFAULT
} mount_type;

65
typedef struct _mount_proxy {
Marvin Scholz's avatar
Marvin Scholz committed
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
    /* 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
96
    unsigned int queue_size_limit;
Marvin Scholz's avatar
Marvin Scholz committed
97 98 99 100 101 102 103 104 105 106
    /* 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;
107

108 109 110
    /* maximum history size of played songs */
    ssize_t max_history;

111 112
    struct event_registration_tag *event;

113
    char *cluster_password;
114
    auth_stack_t *authstack;
115
    unsigned int max_listener_duration;
116 117 118 119 120 121 122 123 124 125

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

126 127 128
    struct _mount_proxy *next;
} mount_proxy;

129 130
#define ALIAS_FLAG_PREFIXMATCH          0x0001

131
typedef struct _resource {
132 133 134 135
    char *source;
    char *destination;
    int port;
    char *bind_address;
136
    char *listen_socket;
137
    char *vhost;
138 139
    char *module;
    char *handler;
140
    operation_mode omode;
141
    unsigned int flags;
142 143
    struct _resource *next;
} resource_t;
144

145 146 147 148 149 150 151
typedef struct _yp_directory {
    char *url;
    int timeout;
    int touch_interval;
    struct _yp_directory *next;
} yp_directory_t;

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

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

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

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

197
struct ice_config_tag {
198 199 200 201 202 203 204
    char *config_filename;

    char *location;
    char *admin;

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

215
    char *shoutcast_mount;
216
    char *shoutcast_user;
217
    auth_stack_t *authstack;
218

219 220
    struct event_registration_tag *event;

221
    char *hostname;
222
    int sane_hostname;
223
    int port;
224
    char *mimetypes_fn;
225

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

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

235 236
    ice_config_http_header_t *http_headers;

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

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

    mount_proxy *mounts;

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

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

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

266 267 268 269
    int chroot;
    int chuid;
    char *user;
    char *group;
270 271

    yp_directory_t *yp_directories;
272
};
273 274

typedef struct {
275
    rwlock_t config_lock;
276 277 278 279 280 281
    mutex_t relay_lock;
} ice_config_locks;

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

282 283
operation_mode config_str_to_omode(const char *str);

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

listener_t *config_copy_listener_one(const listener_t *listener);
294

295 296 297
config_options_t *config_parse_options(xmlNodePtr node);
void config_clear_options(config_options_t *options);

298 299 300 301
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);

302 303 304 305 306
int config_rehash(void);

ice_config_locks *config_locks(void);

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