/** \brief Represents client state for a connection to one search target */
struct client {
struct session_database *database;
+ struct conf_server *server;
struct connection *connection;
struct session *session;
char *pquery; // Current search
char *p[512];
extract_terms(se->nmem, cn, p);
se->relevance = relevance_create(
- global_parameters.server->relevance_pct,
+ se->service->relevance_pct,
se->nmem, (const char **) p,
se->expected_maxrecs);
}
static struct host *hosts = 0; // The hosts we know about
+#if 0
static xmlDoc *get_explain_xml(const char *id)
{
struct stat st;
else
return 0;
}
+#endif
// Create a new host structure for hostport
static struct host *create_host(const char *hostport)
yaz_log(YLOG_LOG, "New database: %s", id);
+#if 0
if (config && config->targetprofiles
&& (doc = get_explain_xml(id)))
{
if (!explain)
return 0;
}
+#endif
if (strlen(id) > 255)
return 0;
#define MAX_HTTP_HEADER 4096
static void proxy_io(IOCHAN i, int event);
-static struct http_channel *http_create(const char *addr);
+static struct http_channel *http_create(const char *addr,
+ struct conf_server *server);
static void http_destroy(IOCHAN i);
// If this is set, we proxy normal HTTP requests
struct http_buf *requestbuf;
char server_via[128] = "";
char server_port[16] = "";
- struct conf_server *ser = global_parameters.server;
+ struct conf_server *ser = c->server;
if (!p) // This is a new connection. Create a proxy channel
{
iochan_destroy(i);
}
-static struct http_channel *http_create(const char *addr)
+static struct http_channel *http_create(const char *addr,
+ struct conf_server *server)
{
struct http_channel *r = http_channel_freelist;
r->nmem = nmem_create();
r->wrbuf = wrbuf_alloc();
}
+ r->server = server;
r->proxy = 0;
r->iochan = 0;
r->iqueue = r->oqueue = 0;
int s;
IOCHAN c;
struct http_channel *ch;
+ struct conf_server *server = iochan_getdata(i);
len = sizeof addr;
if ((s = accept(fd, (struct sockaddr *) &addr, &len)) < 0)
yaz_log(YLOG_DEBUG, "New command connection");
c = iochan_create(s, http_io, EVENT_INPUT | EVENT_EXCEPT);
- ch = http_create(inet_ntoa(addr.sin_addr));
+ ch = http_create(inet_ntoa(addr.sin_addr), server);
ch->iochan = c;
iochan_setdata(c, ch);
static int listener_socket = 0;
/* Create a http-channel listener, syntax [host:]port */
-int http_init(const char *addr)
+int http_init(const char *addr, struct conf_server *server)
{
IOCHAN c;
int l;
listener_socket = l;
c = iochan_create(l, http_accept, EVENT_INPUT | EVENT_EXCEPT);
+ iochan_setdata(c, server);
pazpar2_add_channel(c);
return 0;
}
struct http_channel *next; // for freelist
char addr[20]; // forwarded address
http_channel_observer_t observers;
+ struct conf_server *server;
};
struct http_proxy // attached to iochan for proxy connection
};
void http_set_proxyaddr(char *url, char *baseurl);
-int http_init(const char *addr);
+int http_init(const char *addr, struct conf_server *ser);
void http_close_server(void);
void http_addheader(struct http_response *r,
const char *name, const char *value);
char buf[1024];
const char *clear = http_argbyname(c->request, "clear");
const char *service_name = http_argbyname(c->request, "service");
- struct conf_service *service = locate_service(service_name);
+ struct conf_service *service = locate_service(c->server,
+ service_name);
struct http_session *s = http_session_create(service);
struct http_response *rs = c->response;
// Note: Some things in this structure will eventually move to configuration
struct parameters global_parameters =
{
- "",
- "",
- 0,
0, // dump_records
0, // debug_mode
30, // operations timeout
stat->num_clients = count;
}
-int start_http_listener(void)
+int start_http_listener(struct conf_config *conf,
+ const char *listener_override,
+ const char *proxy_override)
{
- char hp[128] = "";
- struct conf_server *ser = global_parameters.server;
-
- if (*global_parameters.listener_override)
- strcpy(hp, global_parameters.listener_override);
- else
+ struct conf_server *ser;
+ for (ser = conf->servers; ser; ser = ser->next)
{
- strcpy(hp, ser->host ? ser->host : "");
- if (ser->port)
+ char hp[128];
+ *hp = '\0';
+ if (listener_override)
{
- if (*hp)
- strcat(hp, ":");
- sprintf(hp + strlen(hp), "%d", ser->port);
+ strcpy(hp, listener_override);
+ listener_override = 0; /* only first server is overriden */
}
- }
- return http_init(hp);
-}
-
-void start_proxy(void)
-{
- char hp[128] = "";
- struct conf_server *ser = global_parameters.server;
+ else
+ {
+ strcpy(hp, ser->host ? ser->host : "");
+ if (ser->port)
+ {
+ if (*hp)
+ strcat(hp, ":");
+ sprintf(hp + strlen(hp), "%d", ser->port);
+ }
+ }
+ if (http_init(hp, ser))
+ return -1;
- if (*global_parameters.proxy_override)
- strcpy(hp, global_parameters.proxy_override);
- else if (ser->proxy_host || ser->proxy_port)
- {
- strcpy(hp, ser->proxy_host ? ser->proxy_host : "");
- if (ser->proxy_port)
+ *hp = '\0';
+ if (proxy_override)
+ strcpy(hp, proxy_override);
+ else if (ser->proxy_host || ser->proxy_port)
{
- if (*hp)
- strcat(hp, ":");
- sprintf(hp + strlen(hp), "%d", ser->proxy_port);
+ strcpy(hp, ser->proxy_host ? ser->proxy_host : "");
+ if (ser->proxy_port)
+ {
+ if (*hp)
+ strcat(hp, ":");
+ sprintf(hp + strlen(hp), "%d", ser->proxy_port);
+ }
}
+ if (*hp)
+ http_set_proxyaddr(hp, ser->myurl ? ser->myurl : "");
}
- else
- return;
-
- http_set_proxyaddr(hp, ser->myurl ? ser->myurl : "");
+ return 0;
}
-
// Master list of connections we're handling events to
static IOCHAN channel_list = 0;
void pazpar2_add_channel(IOCHAN chan)
return rec_md;
}
-const char *get_mergekey(xmlDoc *doc, struct client *cl, int record_no,
- struct conf_service *service, NMEM nmem)
+static const char *get_mergekey(xmlDoc *doc, struct client *cl, int record_no,
+ struct conf_service *service, NMEM nmem)
{
char *mergekey_norm = 0;
xmlNode *root = xmlDocGetRootElement(doc);
const char *norm_str;
pp2_relevance_token_t prt =
pp2_relevance_tokenize(
- global_parameters.server->mergekey_pct,
+ service->mergekey_pct,
(const char *) mergekey);
while ((norm_str = pp2_relevance_token_next(prt)))
const char *norm_str;
pp2_relevance_token_t prt =
pp2_relevance_tokenize(
- global_parameters.server->mergekey_pct,
+ service->mergekey_pct,
(const char *) value);
while ((norm_str = pp2_relevance_token_next(prt)))
sizeof(union data_types));
prt = pp2_relevance_tokenize(
- global_parameters.server->sort_pct,
+ service->sort_pct,
rec_md->data.text.disp);
pp2_relevance_token_next(prt);
/** \brief global parameters */
struct parameters {
- char proxy_override[128];
- char listener_override[128];
- struct conf_server *server;
int dump_records;
int debug_mode;
int timeout; /* operations timeout, in seconds */
void child_handler(void *data)
{
- start_proxy();
-
- config_read_settings(path_override);
+ struct conf_config *config = (struct conf_config *) data;
+ config_read_settings(config, path_override);
global_parameters.odr_in = odr_createmem(ODR_DECODE);
global_parameters.odr_out = odr_createmem(ODR_ENCODE);
const char *pidfile = 0;
const char *uid = 0;
int session_timeout = 60;
+ const char *listener_override = 0;
+ const char *proxy_override = 0;
+ struct conf_config *config;
#ifndef WIN32
if (signal(SIGPIPE, SIG_IGN) == SIG_ERR)
daemon = 1;
break;
case 'f':
- if (!read_config(arg))
+ config = read_config(arg);
+ if (!config)
exit(1);
break;
case 'h':
- strcpy(global_parameters.listener_override, arg);
+ listener_override = arg;
break;
case 'l':
yaz_log_init_file(arg);
yaz_log(YLOG_FATAL, "Load config with -f");
return 1;
}
- global_parameters.server = config->servers;
-
- ret = start_http_listener();
+ ret = start_http_listener(config, listener_override, proxy_override);
if (ret)
return ret; /* error starting http listener */
yaz_daemon("pazpar2",
(global_parameters.debug_mode ? YAZ_DAEMON_DEBUG : 0) +
(daemon ? YAZ_DAEMON_FORK : 0) + YAZ_DAEMON_KEEPALIVE,
- child_handler, 0 /* child_data */,
+ child_handler, config /* child_data */,
pidfile, uid);
return 0;
}
void session_apply_setting(struct session *se, char *dbname, char *setting, char *value);
const char *session_setting_oneval(struct session_database *db, int offset);
-int start_http_listener(void);
+int start_http_listener(struct conf_config *conf,
+ const char *listener_override,
+ const char *proxy_override);
void start_proxy(void);
void pazpar2_add_channel(IOCHAN c);
#include <yaz/snprintf.h>
#include <yaz/tpath.h>
-#define CONFIG_NOEXTERNS
#include "pazpar2_config.h"
#include "settings.h"
static char confdir[256] = ".";
-struct conf_config *config = 0;
+struct conf_config *config1 = 0;
static char *parse_settings(NMEM nmem, xmlNode *node);
{
struct conf_service *s = parse_service(n, service_id);
if (s)
+ {
+ s->relevance_pct = server->relevance_pct ?
+ server->relevance_pct : pp2_charset_create(0);
+ s->sort_pct = server->sort_pct ?
+ server->sort_pct : pp2_charset_create(0);
+ s->mergekey_pct = server->mergekey_pct ?
+ server->mergekey_pct : pp2_charset_create(0);
*sp = s;
+ }
}
}
else
return 0;
}
}
- if (!server->relevance_pct)
- server->relevance_pct = pp2_charset_create(0);
- if (!server->sort_pct)
- server->sort_pct = pp2_charset_create(0);
- if (!server->mergekey_pct)
- server->mergekey_pct = pp2_charset_create(0);
return server;
}
return r;
}
-struct conf_service *locate_service(const char *service_id)
+struct conf_service *locate_service(struct conf_server *server,
+ const char *service_id)
{
- struct conf_service *s = config->servers->service;
+ struct conf_service *s = server->service;
for (; s; s = s->next)
if (s->id && service_id && 0 == strcmp(s->id, service_id))
return s;
return r;
}
-int read_config(const char *fname)
+struct conf_config *read_config(const char *fname)
{
xmlDoc *doc = xmlParseFile(fname);
const char *p;
+ struct conf_config *config;
xmlSubstituteEntitiesDefault(1);
xmlLoadExtDtdDefaultValue = 1;
config = parse_config(xmlDocGetRootElement(doc));
xmlFreeDoc(doc);
- if (config)
- return 1;
- else
- return 0;
+ return config;
}
-void config_read_settings(const char *path_override)
+void config_read_settings(struct conf_config *config,
+ const char *path_override)
{
struct conf_service *s = config->servers->service;
for (;s ; s = s->next)
char *id;
char *settings;
NMEM nmem;
+
+ /* duplicated from conf_server */
+ pp2_charset_t relevance_pct;
+ pp2_charset_t sort_pct;
+ pp2_charset_t mergekey_pct;
+
+
struct database *databases;
};
int conf_service_sortkey_field_id(struct conf_service *service, const char * name);
-void config_read_settings(const char *path_override);
-
-struct conf_service *locate_service(const char *service_id);
-
struct conf_server
{
char *host;
struct conf_targetprofiles *targetprofiles;
};
-#ifndef CONFIG_NOEXTERNS
+struct conf_config *read_config(const char *fname);
+xsltStylesheet *conf_load_stylesheet(const char *fname);
-extern struct conf_config *config;
+void config_read_settings(struct conf_config *config,
+ const char *path_override);
-#endif
+struct conf_service *locate_service(struct conf_server *server,
+ const char *service_id);
-int read_config(const char *fname);
-xsltStylesheet *conf_load_stylesheet(const char *fname);
#endif
#include <config.h>
#endif
-//#define CONFIG_NOEXTERNS
#include "pazpar2_config.h"
#include "record.h"
-
-
union data_types * data_types_assign(NMEM nmem,
union data_types ** data1,
union data_types data2)