cfgfile.h 7.59 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 {
Philipp Schafft's avatar
Philipp Schafft committed
34
    /* static: headers are passed as is to the client. */
35 36 37
    HTTP_HEADER_TYPE_STATIC,
    /* CORS: headers are only sent to the client if it's a CORS request. */
    HTTP_HEADER_TYPE_CORS
38 39 40
} http_header_type;

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

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

    /* filters */
    int status;

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

55
struct _config_options {
56
    char *type;
Michael Smith's avatar
Michael Smith committed
57 58
    char *name;
    char *value;
59 60
    config_options_t *next;
};
Michael Smith's avatar
Michael Smith committed
61

62 63 64 65 66
typedef enum _mount_type {
 MOUNT_TYPE_NORMAL,
 MOUNT_TYPE_DEFAULT
} mount_type;

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

110 111 112
    /* maximum history size of played songs */
    ssize_t max_history;

113 114
    struct event_registration_tag *event;

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

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

128 129 130
    struct _mount_proxy *next;
} mount_proxy;

131 132
#define ALIAS_FLAG_PREFIXMATCH          0x0001

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

147
typedef enum _listener_type_tag {
148 149 150
    LISTENER_TYPE_ERROR,
    LISTENER_TYPE_NORMAL,
    LISTENER_TYPE_VIRTUAL
151 152
} listener_type_t;

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

168 169 170 171
typedef struct _config_tls_context {
    char *cert_file;
    char *key_file;
    char *cipher_list;
Philipp Schafft's avatar
Philipp Schafft committed
172
} config_tls_context_t;
173

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

192
struct ice_config_tag {
193 194 195 196 197 198 199
    char *config_filename;

    char *location;
    char *admin;

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

210
    char *shoutcast_mount;
211
    char *shoutcast_user;
212
    auth_stack_t *authstack;
213

214 215
    struct event_registration_tag *event;

216
    char *hostname;
217
    int sane_hostname;
218
    int port;
219
    char *mimetypes_fn;
220

221 222
    listener_t *listen_sock;
    unsigned int listen_sock_count;
223 224 225 226

    char *master_server;
    int master_server_port;
    int master_update_interval;
227
    char *master_username;
228 229
    char *master_password;

230 231
    ice_config_http_header_t *http_headers;

232 233 234
    /* is TLS supported by the server? */
    int tls_ok;

235 236
    size_t relay_length;
    relay_config_t **relay;
237 238 239

    mount_proxy *mounts;

240
    char *server_id;
241 242
    char *base_dir;
    char *log_dir;
243
    char *pidfile;
244
    char *null_device;
245 246
    char *banfile;
    char *allowfile;
247 248
    char *webroot_dir;
    char *adminroot_dir;
249
    resource_t *resources;
250
    reportxml_database_t *reportxml_db;
251 252 253

    char *access_log;
    char *error_log;
254
    char *playlist_log;
255
    int loglevel;
256 257
    int logsize;
    int logarchive;
258

Philipp Schafft's avatar
Philipp Schafft committed
259
    config_tls_context_t tls_context;
260

261 262 263 264 265
    int chroot;
    int chuid;
    char *user;
    char *group;
    char *yp_url[MAX_YP_DIRECTORIES];
266 267
    int yp_url_timeout[MAX_YP_DIRECTORIES];
    int yp_touch_interval[MAX_YP_DIRECTORIES];
268
    size_t num_yp_directories;
269
};
270 271

typedef struct {
272
    rwlock_t config_lock;
273 274 275 276 277 278
    mutex_t relay_lock;
} ice_config_locks;

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

279 280
operation_mode config_str_to_omode(const char *str);

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

listener_t *config_copy_listener_one(const listener_t *listener);
291

292 293 294
config_options_t *config_parse_options(xmlNodePtr node);
void config_clear_options(config_options_t *options);

295 296 297 298
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);

299 300 301 302 303
int config_rehash(void);

ice_config_locks *config_locks(void);

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