cfgfile.h 7.51 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>.
12
 * Copyright 2011-2014, 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

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

32
typedef enum _operation_mode {
33
 /* Default operation mode. may depend on context */
34
 OMODE_DEFAULT = 0,
35
 /* The normal mode. */
36
 OMODE_NORMAL,
37 38 39 40 41 42 43 44 45 46 47 48 49 50
 /* Mimic some of the behavior of older versions.
  * This mode should only be used in transition to normal mode,
  * e.g. to give some clients time to upgrade to new API.
  */
 OMODE_LEGACY,
 /* The struct mode includes some behavior for future versions
  * that can for some reason not yet be used in the normal mode
  * e.g. because it may break interfaces in some way.
  * New applications should test against this mode and developer
  * of software interacting with Icecast on an API level should
  * have a look for strict mode behavior to avoid random breakage
  * with newer versions of Icecast.
  */
 OMODE_STRICT
51 52
} operation_mode;

53
typedef enum _http_header_type {
54
 /* static: headers are passed as is to the client. */
55 56 57 58
 HTTP_HEADER_TYPE_STATIC
} http_header_type;

typedef struct ice_config_http_header_tag {
59
    /* type of this header. See http_header_type */
60
    http_header_type type;
61 62

    /* name and value of the header */
63 64
    char *name;
    char *value;
65 66 67 68 69

    /* filters */
    int status;

    /* link to the next list element */
70 71 72
    struct ice_config_http_header_tag *next;
} ice_config_http_header_t;

73
typedef struct ice_config_dir_tag {
74 75 76 77 78
    char *host;
    int touch_interval;
    struct ice_config_dir_tag *next;
} ice_config_dir_t;

Michael Smith's avatar
Michael Smith committed
79
typedef struct _config_options {
80
    char *type;
Michael Smith's avatar
Michael Smith committed
81 82 83 84 85
    char *name;
    char *value;
    struct _config_options *next;
} config_options_t;

86 87 88 89 90
typedef enum _mount_type {
 MOUNT_TYPE_NORMAL,
 MOUNT_TYPE_DEFAULT
} mount_type;

91
typedef struct _mount_proxy {
Marvin Scholz's avatar
Marvin Scholz committed
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
    /* 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
122
    unsigned int queue_size_limit;
Marvin Scholz's avatar
Marvin Scholz committed
123 124 125 126 127 128 129 130 131 132
    /* 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;
133

134 135 136
    /* maximum history size of played songs */
    ssize_t max_history;

137 138
    struct event_registration_tag *event;

139
    char *cluster_password;
Philipp Schafft's avatar
Philipp Schafft committed
140
    struct auth_stack_tag *authstack;
141
    unsigned int max_listener_duration;
142 143 144 145 146 147 148 149 150 151

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

152 153 154
    struct _mount_proxy *next;
} mount_proxy;

155 156
#define ALIAS_FLAG_PREFIXMATCH          0x0001

157
typedef struct _resource {
158 159 160 161
    char *source;
    char *destination;
    int port;
    char *bind_address;
162
    char *vhost;
163
    operation_mode omode;
164
    unsigned int flags;
165 166
    struct _resource *next;
} resource_t;
167

168 169
typedef struct _listener_t {
    struct _listener_t *next;
170
    int port;
171
    int so_sndbuf;
172
    char *bind_address;
173
    int shoutcast_compat;
174
    char *shoutcast_mount;
175
    tlsmode_t tls;
176 177
} listener_t;

178 179 180 181
typedef struct _config_tls_context {
    char *cert_file;
    char *key_file;
    char *cipher_list;
Philipp Schafft's avatar
Philipp Schafft committed
182
} config_tls_context_t;
183

184
struct ice_config_tag {
185 186 187 188 189 190 191
    char *config_filename;

    char *location;
    char *admin;

    int client_limit;
    int source_limit;
Karl Heyes's avatar
Karl Heyes committed
192 193
    unsigned int queue_size_limit;
    unsigned int burst_size;
194 195 196 197
    int client_timeout;
    int header_timeout;
    int source_timeout;
    int fileserve;
198
    int on_demand; /* global setting for all relays */
199

200
    char *shoutcast_mount;
201
    char *shoutcast_user;
Philipp Schafft's avatar
Philipp Schafft committed
202
    struct auth_stack_tag *authstack;
203

204 205
    struct event_registration_tag *event;

206 207 208 209
    int touch_interval;
    ice_config_dir_t *dir_list;

    char *hostname;
210
    int sane_hostname;
211
    int port;
212
    char *mimetypes_fn;
213

214 215
    listener_t *listen_sock;
    unsigned int listen_sock_count;
216 217 218 219

    char *master_server;
    int master_server_port;
    int master_update_interval;
220
    char *master_username;
221 222
    char *master_password;

223 224
    ice_config_http_header_t *http_headers;

225 226 227
    /* is TLS supported by the server? */
    int tls_ok;

228 229 230 231
    relay_server *relay;

    mount_proxy *mounts;

232
    char *server_id;
233 234
    char *base_dir;
    char *log_dir;
235
    char *pidfile;
236
    char *null_device;
237 238
    char *banfile;
    char *allowfile;
239 240
    char *webroot_dir;
    char *adminroot_dir;
241
    resource_t *resources;
242 243 244

    char *access_log;
    char *error_log;
245
    char *playlist_log;
246
    int loglevel;
247 248
    int logsize;
    int logarchive;
249

Philipp Schafft's avatar
Philipp Schafft committed
250
    config_tls_context_t tls_context;
251

252 253 254 255 256
    int chroot;
    int chuid;
    char *user;
    char *group;
    char *yp_url[MAX_YP_DIRECTORIES];
257 258
    int yp_url_timeout[MAX_YP_DIRECTORIES];
    int yp_touch_interval[MAX_YP_DIRECTORIES];
259
    int num_yp_directories;
260
};
261 262

typedef struct {
263
    rwlock_t config_lock;
264 265 266 267 268 269
    mutex_t relay_lock;
} ice_config_locks;

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

270 271
operation_mode config_str_to_omode(const char *str);

272
void config_reread_config(void);
273 274 275 276
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);
277
listener_t *config_clear_listener (listener_t *listener);
278
void config_clear(ice_config_t *config);
Marvin Scholz's avatar
Marvin Scholz committed
279 280
mount_proxy *config_find_mount(ice_config_t *config, const char *mount, mount_type type);
listener_t *config_get_listen_sock(ice_config_t *config, connection_t *con);
281

282 283 284
config_options_t *config_parse_options(xmlNodePtr node);
void config_clear_options(config_options_t *options);

285 286 287 288 289
int config_rehash(void);

ice_config_locks *config_locks(void);

ice_config_t *config_get_config(void);
290
ice_config_t *config_grab_config(void);
291 292 293 294 295
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
296
#endif  /* __CFGFILE_H__ */