cfgfile.h 6.72 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 _http_header_type {
33
 /* static: headers are passed as is to the client. */
34 35 36 37
 HTTP_HEADER_TYPE_STATIC
} http_header_type;

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

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

    /* filters */
    int status;

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

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

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

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

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

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

116 117
    struct event_registration_tag *event;

118
    char *cluster_password;
Philipp Schafft's avatar
Philipp Schafft committed
119
    struct auth_stack_tag *authstack;
120
    unsigned int max_listener_duration;
121 122 123 124 125 126 127 128 129 130

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

131 132 133
    struct _mount_proxy *next;
} mount_proxy;

134 135
#define ALIAS_FLAG_PREFIXMATCH          0x0001

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

147 148
typedef struct _listener_t {
    struct _listener_t *next;
149
    int port;
150
    int so_sndbuf;
151
    char *bind_address;
152
    int shoutcast_compat;
153
    char *shoutcast_mount;
154
    tlsmode_t tls;
155 156
} listener_t;

157 158 159 160
typedef struct _config_tls_context {
    char *cert_file;
    char *key_file;
    char *cipher_list;
Philipp Schafft's avatar
Philipp Schafft committed
161
} config_tls_context_t;
162

163
struct ice_config_tag {
164 165 166 167 168 169 170
    char *config_filename;

    char *location;
    char *admin;

    int client_limit;
    int source_limit;
Karl Heyes's avatar
Karl Heyes committed
171 172
    unsigned int queue_size_limit;
    unsigned int burst_size;
173 174 175 176
    int client_timeout;
    int header_timeout;
    int source_timeout;
    int fileserve;
177
    int on_demand; /* global setting for all relays */
178

179
    char *shoutcast_mount;
180
    char *shoutcast_user;
Philipp Schafft's avatar
Philipp Schafft committed
181
    struct auth_stack_tag *authstack;
182

183 184
    struct event_registration_tag *event;

185 186 187 188
    int touch_interval;
    ice_config_dir_t *dir_list;

    char *hostname;
189
    int sane_hostname;
190
    int port;
191
    char *mimetypes_fn;
192

193 194
    listener_t *listen_sock;
    unsigned int listen_sock_count;
195 196 197 198

    char *master_server;
    int master_server_port;
    int master_update_interval;
199
    char *master_username;
200 201
    char *master_password;

202 203
    ice_config_http_header_t *http_headers;

204 205 206
    /* is TLS supported by the server? */
    int tls_ok;

207 208 209 210
    relay_server *relay;

    mount_proxy *mounts;

211
    char *server_id;
212 213
    char *base_dir;
    char *log_dir;
214
    char *pidfile;
215
    char *null_device;
216 217
    char *banfile;
    char *allowfile;
218 219
    char *webroot_dir;
    char *adminroot_dir;
220
    resource_t *resources;
221 222 223

    char *access_log;
    char *error_log;
224
    char *playlist_log;
225
    int loglevel;
226 227
    int logsize;
    int logarchive;
228

Philipp Schafft's avatar
Philipp Schafft committed
229
    config_tls_context_t tls_context;
230

231 232 233 234 235
    int chroot;
    int chuid;
    char *user;
    char *group;
    char *yp_url[MAX_YP_DIRECTORIES];
236 237
    int yp_url_timeout[MAX_YP_DIRECTORIES];
    int yp_touch_interval[MAX_YP_DIRECTORIES];
238
    int num_yp_directories;
239
};
240 241

typedef struct {
242
    rwlock_t config_lock;
243 244 245 246 247 248
    mutex_t relay_lock;
} ice_config_locks;

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

249 250
operation_mode config_str_to_omode(const char *str);

251
void config_reread_config(void);
252 253 254 255
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);
256
listener_t *config_clear_listener (listener_t *listener);
257
void config_clear(ice_config_t *config);
Marvin Scholz's avatar
Marvin Scholz committed
258 259
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);
260

261 262 263
config_options_t *config_parse_options(xmlNodePtr node);
void config_clear_options(config_options_t *options);

264 265 266 267 268
int config_rehash(void);

ice_config_locks *config_locks(void);

ice_config_t *config_get_config(void);
269
ice_config_t *config_grab_config(void);
270 271 272 273 274
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
275
#endif  /* __CFGFILE_H__ */