config-connection.c revision 50fe5e053d565b40b0ed2cc7a64b6b98971c0305
5f5870385cff47efd2f58e7892f251cf13761528Timo Sirainen/* Copyright (C) 2005-2009 Dovecot authors, see the included COPYING file */
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainenstruct config_connection *config_connections = NULL;
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainenstatic const char *const *
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainenconfig_connection_next_line(struct config_connection *conn)
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainenconfig_request_output(const char *key, const char *value,
a356c4736fe6041142c6096045bc00c15a80af4eTimo Sirainen enum config_key_type type ATTR_UNUSED, void *context)
c4900d31385344bfadaee53a897daeafdb3063d8Timo Sirainen const char *p;
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen o_stream_send(output, SETTING_STREAM_LF_CHAR, 1);
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainenstatic int config_connection_request(struct config_connection *conn,
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen const char *const *args)
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen /* [<args>] */
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen if (net_addr2ip(*args + 4, &filter.local_net) == 0) {
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen if (net_addr2ip(*args + 4, &filter.remote_net) == 0) {
00e7c3010f7da4a49881a7feb05e413af353af0aTimo Sirainen /* master reads configuration only when reloading settings */
00e7c3010f7da4a49881a7feb05e413af353af0aTimo Sirainen path = master_service_get_config_path(master_service);
00e7c3010f7da4a49881a7feb05e413af353af0aTimo Sirainen if (config_parse_file(path, TRUE, &error) <= 0) {
4c20178a7f70bfe43d252e50796013aac1d8c74aTimo Sirainen if (config_request_handle(&filter, module, CONFIG_DUMP_SCOPE_SET, 0,
0a53eb0283d7ec28c6105f61e118b96fce8ecb95Timo Sirainenstatic void config_connection_input(void *context)
0a53eb0283d7ec28c6105f61e118b96fce8ecb95Timo Sirainen i_error("BUG: Config client connection sent too much data");
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen if (strncmp(line, "VERSION\tconfig\t", 15) != 0 ||
8e1ecc6542da1e14c14e2e59d39dbccdbf68e2b5Timo Sirainen i_error("Config client not compatible with this server "
8e1ecc6542da1e14c14e2e59d39dbccdbf68e2b5Timo Sirainen "(mixed old and new binaries?)");
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen while ((args = config_connection_next_line(conn)) != NULL) {
4e43828ef88183a0750a8a374b6ba4ecf227c58fTimo Sirainen if (config_connection_request(conn, args + 1) < 0)
0a53eb0283d7ec28c6105f61e118b96fce8ecb95Timo Sirainenstruct config_connection *config_connection_create(int fd)
0a53eb0283d7ec28c6105f61e118b96fce8ecb95Timo Sirainen conn->input = i_stream_create_fd(fd, MAX_INBUF_SIZE, FALSE);
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen conn->output = o_stream_create_fd(fd, (size_t)-1, FALSE);
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen conn->io = io_add(fd, IO_READ, config_connection_input, conn);
0a53eb0283d7ec28c6105f61e118b96fce8ecb95Timo Sirainenvoid config_connection_destroy(struct config_connection *conn)
4aab01f4eade3d278b61471516c062ce30a84b5fTimo Sirainen master_service_client_connection_destroyed(master_service);