cfgfile.h 7.56 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
struct _mount_proxy;
26

27
#include <libxml/tree.h>
Marvin Scholz's avatar
Marvin Scholz committed
28
29
#include "common/thread/thread.h"
#include "common/avl/avl.h"
30
#include "slave.h"
31
#include "connection.h"
32

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

35
typedef enum _operation_mode {
36
 /* Default operation mode. may depend on context */
37
 OMODE_DEFAULT = 0,
38
 /* The normal mode. */
39
 OMODE_NORMAL,
40
41
42
43
44
45
46
47
48
49
50
51
52
53
 /* 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
54
55
} operation_mode;

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

typedef struct ice_config_http_header_tag {
62
    /* type of this header. See http_header_type */
63
    http_header_type type;
64
65

    /* name and value of the header */
66
67
    char *name;
    char *value;
68
69
70
71
72

    /* filters */
    int status;

    /* link to the next list element */
73
74
75
    struct ice_config_http_header_tag *next;
} ice_config_http_header_t;

76
typedef struct ice_config_dir_tag {
77
78
79
80
81
    char *host;
    int touch_interval;
    struct ice_config_dir_tag *next;
} ice_config_dir_t;

Michael Smith's avatar
Michael Smith committed
82
typedef struct _config_options {
83
    char *type;
Michael Smith's avatar
Michael Smith committed
84
85
86
87
88
    char *name;
    char *value;
    struct _config_options *next;
} config_options_t;

89
90
91
92
93
typedef enum _mount_type {
 MOUNT_TYPE_NORMAL,
 MOUNT_TYPE_DEFAULT
} mount_type;

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

137
138
139
    /* maximum history size of played songs */
    ssize_t max_history;

140
141
    struct event_registration_tag *event;

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

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

155
156
157
    struct _mount_proxy *next;
} mount_proxy;

158
159
#define ALIAS_FLAG_PREFIXMATCH          0x0001

160
161
162
163
164
typedef struct _aliases {
    char *source;
    char *destination;
    int port;
    char *bind_address;
165
    char *vhost;
166
    operation_mode omode;
167
    unsigned int flags;
168
    struct _aliases *next;
Philipp Schafft's avatar
Philipp Schafft committed
169
} aliases;
170

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

181
182
183
184
typedef struct _config_tls_context {
    char *cert_file;
    char *key_file;
    char *cipher_list;
Philipp Schafft's avatar
Philipp Schafft committed
185
} config_tls_context_t;
186

187
typedef struct ice_config_tag {
188
189
190
191
192
193
194
    char *config_filename;

    char *location;
    char *admin;

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

203
    char *shoutcast_mount;
204
    char *shoutcast_user;
Philipp Schafft's avatar
Philipp Schafft committed
205
    struct auth_stack_tag *authstack;
206

207
208
    struct event_registration_tag *event;

209
210
211
212
    int touch_interval;
    ice_config_dir_t *dir_list;

    char *hostname;
213
    int sane_hostname;
214
    int port;
215
    char *mimetypes_fn;
216

217
218
    listener_t *listen_sock;
    unsigned int listen_sock_count;
219
220
221
222

    char *master_server;
    int master_server_port;
    int master_update_interval;
223
    char *master_username;
224
225
    char *master_password;

226
227
    ice_config_http_header_t *http_headers;

228
229
230
    /* is TLS supported by the server? */
    int tls_ok;

231
232
233
234
    relay_server *relay;

    mount_proxy *mounts;

235
    char *server_id;
236
237
    char *base_dir;
    char *log_dir;
238
    char *pidfile;
239
    char *null_device;
240
241
    char *banfile;
    char *allowfile;
242
243
244
245
246
247
    char *webroot_dir;
    char *adminroot_dir;
    aliases *aliases;

    char *access_log;
    char *error_log;
248
    char *playlist_log;
249
    int loglevel;
250
251
    int logsize;
    int logarchive;
252

Philipp Schafft's avatar
Philipp Schafft committed
253
    config_tls_context_t tls_context;
254

255
256
257
258
259
    int chroot;
    int chuid;
    char *user;
    char *group;
    char *yp_url[MAX_YP_DIRECTORIES];
260
261
    int yp_url_timeout[MAX_YP_DIRECTORIES];
    int yp_touch_interval[MAX_YP_DIRECTORIES];
262
263
264
265
    int num_yp_directories;
} ice_config_t;

typedef struct {
266
    rwlock_t config_lock;
267
268
269
270
271
272
    mutex_t relay_lock;
} ice_config_locks;

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

273
274
operation_mode config_str_to_omode(const char *str);

275
void config_reread_config(void);
276
277
278
279
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);
280
listener_t *config_clear_listener (listener_t *listener);
281
void config_clear(ice_config_t *config);
Marvin Scholz's avatar
Marvin Scholz committed
282
283
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);
284

285
286
287
config_options_t *config_parse_options(xmlNodePtr node);
void config_clear_options(config_options_t *options);

288
289
290
291
292
int config_rehash(void);

ice_config_locks *config_locks(void);

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