cfgfile.h 6.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>.
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 "global.h"
31
#include "connection.h"
32

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

35 36 37 38 39 40
typedef enum _operation_mode {
 OMODE_DEFAULT = 0,
 OMODE_NORMAL,
 OMODE_LEGACY
} operation_mode;

41
typedef enum _http_header_type {
42
 /* static: headers are passed as is to the client. */
43 44 45 46
 HTTP_HEADER_TYPE_STATIC
} http_header_type;

typedef struct ice_config_http_header_tag {
47
    /* type of this header. See http_header_type */
48
    http_header_type type;
49 50

    /* name and value of the header */
51 52
    char *name;
    char *value;
53 54 55 56 57

    /* filters */
    int status;

    /* link to the next list element */
58 59 60
    struct ice_config_http_header_tag *next;
} ice_config_http_header_t;

61
typedef struct ice_config_dir_tag {
62 63 64 65 66
    char *host;
    int touch_interval;
    struct ice_config_dir_tag *next;
} ice_config_dir_t;

Michael Smith's avatar
Michael Smith committed
67
typedef struct _config_options {
68
    char *type;
Michael Smith's avatar
Michael Smith committed
69 70 71 72 73
    char *name;
    char *value;
    struct _config_options *next;
} config_options_t;

74 75 76 77 78
typedef enum _mount_type {
 MOUNT_TYPE_NORMAL,
 MOUNT_TYPE_DEFAULT
} mount_type;

79 80 81
typedef struct _mount_proxy {
    char *mountname; /* The mountpoint this proxy is used for */

82 83
    mount_type mounttype; /* The type of the mount point */

84 85
    char *dumpfile; /* Filename to dump this stream to (will be appended). NULL
                       to not dump. */
86
    char *intro_filename; /* Send contents of file to client before the stream */
87 88
    int fallback_when_full; /* switch new listener to fallback source
                               when max listeners reached */
89 90
    int max_listeners; /* Max listeners for this mountpoint only. -1 to not 
                          limit here (i.e. only use the global limit) */
Michael Smith's avatar
Michael Smith committed
91 92 93 94 95 96
    char *fallback_mount; /* Fallback mountname */

    int fallback_override; /* When this source arrives, do we steal back
                              clients from the fallback? */
    int no_mount; /* Do we permit direct requests of this mountpoint? (or only
                     indirect, through fallbacks) */
Karl Heyes's avatar
Karl Heyes committed
97 98 99
    int burst_size; /* amount to send to a new client if possible, -1 take
                     * from global setting */
    unsigned int queue_size_limit;
100
    int hidden; /* Do we list this on the xsl pages */
101 102
    unsigned int source_timeout; /* source timeout in seconds */
    char *charset; /* character set if not utf8 */
103
    int mp3_meta_interval; /* outgoing per-stream metadata interval */
Michael Smith's avatar
Michael Smith committed
104

105 106
    ice_config_http_header_t *http_headers; /* additional HTTP headers */

107 108
    struct event_registration_tag *event;

109
    char *cluster_password;
Philipp Schafft's avatar
Philipp Schafft committed
110
    struct auth_stack_tag *authstack;
111
    unsigned int max_listener_duration;
112 113 114 115 116 117 118 119 120 121

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

122 123 124 125 126 127 128 129
    struct _mount_proxy *next;
} mount_proxy;

typedef struct _aliases {
    char *source;
    char *destination;
    int port;
    char *bind_address;
130
    char *vhost;
131
    operation_mode omode;
132
    struct _aliases *next;
Philipp Schafft's avatar
Philipp Schafft committed
133
} aliases;
134

135 136
typedef struct _listener_t {
    struct _listener_t *next;
137
    int port;
138
    int so_sndbuf;
139
    char *bind_address;
140
    int shoutcast_compat;
141
    char *shoutcast_mount;
142
    int ssl;
143 144
} listener_t;

145
typedef struct ice_config_tag {
146 147 148 149 150 151 152
    char *config_filename;

    char *location;
    char *admin;

    int client_limit;
    int source_limit;
Karl Heyes's avatar
Karl Heyes committed
153 154
    unsigned int queue_size_limit;
    unsigned int burst_size;
155 156 157 158
    int client_timeout;
    int header_timeout;
    int source_timeout;
    int fileserve;
159
    int on_demand; /* global setting for all relays */
160

161
    char *shoutcast_mount;
Philipp Schafft's avatar
Philipp Schafft committed
162
    struct auth_stack_tag *authstack;
163

164 165
    struct event_registration_tag *event;

166 167 168 169
    int touch_interval;
    ice_config_dir_t *dir_list;

    char *hostname;
170
    int sane_hostname;
171
    int port;
172
    char *mimetypes_fn;
173

174 175
    listener_t *listen_sock;
    unsigned int listen_sock_count;
176 177 178 179

    char *master_server;
    int master_server_port;
    int master_update_interval;
180
    char *master_username;
181 182
    char *master_password;

183 184
    ice_config_http_header_t *http_headers;

185 186 187 188
    relay_server *relay;

    mount_proxy *mounts;

189
    char *server_id;
190 191
    char *base_dir;
    char *log_dir;
192
    char *pidfile;
193
    char *null_device;
194 195
    char *banfile;
    char *allowfile;
196
    char *cert_file;
197
    char *cipher_list;
198 199 200 201 202 203
    char *webroot_dir;
    char *adminroot_dir;
    aliases *aliases;

    char *access_log;
    char *error_log;
204
    char *playlist_log;
205
    int loglevel;
206 207
    int logsize;
    int logarchive;
208 209 210 211 212 213

    int chroot;
    int chuid;
    char *user;
    char *group;
    char *yp_url[MAX_YP_DIRECTORIES];
214 215
    int yp_url_timeout[MAX_YP_DIRECTORIES];
    int yp_touch_interval[MAX_YP_DIRECTORIES];
216 217 218 219
    int num_yp_directories;
} ice_config_t;

typedef struct {
220
    rwlock_t config_lock;
221 222 223 224 225 226
    mutex_t relay_lock;
} ice_config_locks;

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

227 228
operation_mode config_str_to_omode(const char *str);

229
void config_reread_config(void);
230 231 232 233
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);
234
listener_t *config_clear_listener (listener_t *listener);
235
void config_clear(ice_config_t *config);
236
mount_proxy *config_find_mount (ice_config_t *config, const char *mount, mount_type type);
237
listener_t *config_get_listen_sock (ice_config_t *config, connection_t *con);
238

239 240 241
config_options_t *config_parse_options(xmlNodePtr node);
void config_clear_options(config_options_t *options);

242 243 244 245 246
int config_rehash(void);

ice_config_locks *config_locks(void);

ice_config_t *config_get_config(void);
247
ice_config_t *config_grab_config(void);
248 249 250 251 252
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
253
#endif  /* __CFGFILE_H__ */