-/* $Id: pazpar2.c,v 1.63 2007-04-04 22:43:10 marc Exp $ */
+/* $Id: pazpar2.c,v 1.67 2007-04-08 23:04:20 adam Exp $ */
#include <stdlib.h>
#include <stdio.h>
static void connection_destroy(struct connection *co);
static int client_prep_connection(struct client *cl);
static void ingest_records(struct client *cl, Z_Records *r);
-//static struct conf_retrievalprofile *database_retrieval_profile(struct database *db);
void session_alert_watch(struct session *s, int what);
-char *session_setting_oneval(struct session *s, struct database *db, const char *name);
+char *session_setting_oneval(struct session *s, struct database *db, int offset);
IOCHAN channel_list = 0; // Master list of connections we're handling events to
100,
MAX_CHUNK,
0,
- 0,
0
};
return 0;
}
+// Set authentication token in init if one is set for the client
+// TODO: Extend this to handle other schemes than open (should be simple)
+static void init_authentication(struct client *cl, Z_InitRequest *req)
+{
+ struct database *db = cl->database;
+ struct session *se = cl->session;
+ char *auth = session_setting_oneval(se, db, PZ_AUTHENTICATION);
+
+ if (auth)
+ {
+ Z_IdAuthentication *idAuth = odr_malloc(global_parameters.odr_out,
+ sizeof(*idAuth));
+ idAuth->which = Z_IdAuthentication_open;
+ idAuth->u.open = auth;
+ req->idAuthentication = idAuth;
+ }
+}
static void send_init(IOCHAN i)
{
ODR_MASK_SET(a->u.initRequest->protocolVersion, Z_ProtocolVersion_2);
ODR_MASK_SET(a->u.initRequest->protocolVersion, Z_ProtocolVersion_3);
+ init_authentication(cl, a->u.initRequest);
/* add virtual host if tunneling through Z39.50 proxy */
yaz_oi_set_string_oidval(&a->u.initRequest->otherInfo,
global_parameters.odr_out, VAL_PROXY,
1, cl->database->url);
-
-
if (send_apdu(cl, a) >= 0)
{
for (ndb = 0; db->databases[ndb]; ndb++)
databaselist[ndb] = db->databases[ndb];
- if (!(piggyback = session_setting_oneval(se, db, "pz:piggyback")) || *piggyback == '1')
+ if (!(piggyback = session_setting_oneval(se, db, PZ_PIGGYBACK)) || *piggyback == '1')
{
- if ((recsyn = session_setting_oneval(se, db, "pz:syntax")))
+ if ((recsyn = session_setting_oneval(se, db, PZ_NATIVESYNTAX)))
a->u.searchRequest->preferredRecordSyntax =
yaz_str_to_z3950oid(global_parameters.odr_out,
CLASS_RECSYN, recsyn);
a->u.presentRequest->resultSetId = "Default";
- if ((recsyn = session_setting_oneval(se, db, "pz:syntax")))
+ if ((recsyn = session_setting_oneval(se, db, PZ_NATIVESYNTAX)))
a->u.presentRequest->preferredRecordSyntax =
yaz_str_to_z3950oid(global_parameters.odr_out,
CLASS_RECSYN, recsyn);
static xmlDoc *normalize_record(struct client *cl, Z_External *rec)
{
- struct conf_retrievalprofile *rprofile = cl->database->rprofile;
- struct conf_retrievalmap *m;
+ struct database_retrievalmap *m;
+ struct database *db = cl->database;
xmlNode *res;
xmlDoc *rdoc;
// First normalize to XML
- if (rprofile->native_syntax == Nativesyn_iso2709)
+ if (db->yaz_marc)
{
char *buf;
int len;
}
buf = (char*) rec->u.octet_aligned->buf;
len = rec->u.octet_aligned->len;
- if (yaz_marc_read_iso2709(rprofile->yaz_marc, buf, len) < 0)
+ if (yaz_marc_read_iso2709(db->yaz_marc, buf, len) < 0)
{
yaz_log(YLOG_WARN, "Failed to decode MARC %s",
cl->database->url);
return 0;
}
- if (yaz_marc_write_xml(rprofile->yaz_marc, &res,
+ if (yaz_marc_write_xml(db->yaz_marc, &res,
"http://www.loc.gov/MARC21/slim", 0, 0) < 0)
{
yaz_log(YLOG_WARN, "Failed to encode as XML %s",
#endif
}
- for (m = rprofile->maplist; m; m = m->next)
+ for (m = db->map; m; m = m->next)
{
xmlDoc *new;
- if (m->type != Map_xslt)
- {
- yaz_log(YLOG_WARN, "Unknown map type");
- return 0;
- }
if (!(new = xsltApplyStylesheet(m->stylesheet, rdoc, 0)))
{
yaz_log(YLOG_WARN, "XSLT transformation failed");
// Retrieve first defined value for 'name' for given database.
// Will be extended to take into account user associated with session
-char *session_setting_oneval(struct session *s, struct database *db, const char *name)
+char *session_setting_oneval(struct session *s, struct database *db, int offset)
{
- int offset = settings_offset(name);
-
- if (offset < 0)
- return 0;
if (!db->settings[offset])
return 0;
return db->settings[offset]->value;
cl->connection = new;
new->link = link;
- new->iochan = iochan_create(cs_fileno(link), 0, handler, 0);
+ new->iochan = iochan_create(cs_fileno(link), handler, 0);
iochan_setdata(new->iochan, new);
new->iochan->next = channel_list;
channel_list = new->iochan;
return 0;
}
-#ifdef GAGA // Moved to database.c
-
-// This function will most likely vanish when a proper target profile mechanism is
-// introduced.
-void load_simpletargets(const char *fn)
-{
- FILE *f = fopen(fn, "r");
- char line[256];
-
- if (!f)
- {
- yaz_log(YLOG_WARN|YLOG_ERRNO, "open %s", fn);
- exit(1);
- }
-
- while (fgets(line, 255, f))
- {
- char *url, *db;
- char *name;
- struct host *host;
- struct database *database;
-
- if (strncmp(line, "target ", 7))
- continue;
- line[strlen(line) - 1] = '\0';
-
- if ((name = strchr(line, ';')))
- *(name++) = '\0';
-
- url = line + 7;
- if ((db = strchr(url, '/')))
- *(db++) = '\0';
- else
- db = "Default";
-
- yaz_log(YLOG_LOG, "Target: %s, '%s'", url, db);
- for (host = hosts; host; host = host->next)
- if (!strcmp((const char *) url, host->hostport))
- break;
- if (!host)
- {
- struct addrinfo *addrinfo, hints;
- char *port;
- char ipport[128];
- unsigned char addrbuf[4];
- int res;
-
- host = xmalloc(sizeof(struct host));
- host->hostport = xstrdup(url);
- host->connections = 0;
-
- if ((port = strchr(url, ':')))
- *(port++) = '\0';
- else
- port = "210";
-
- hints.ai_flags = 0;
- hints.ai_family = PF_INET;
- hints.ai_socktype = SOCK_STREAM;
- hints.ai_protocol = IPPROTO_TCP;
- hints.ai_addrlen = 0;
- hints.ai_addr = 0;
- hints.ai_canonname = 0;
- hints.ai_next = 0;
- // This is not robust code. It assumes that getaddrinfo returns AF_INET
- // address.
- if ((res = getaddrinfo(url, port, &hints, &addrinfo)))
- {
- yaz_log(YLOG_WARN, "Failed to resolve %s: %s", url, gai_strerror(res));
- xfree(host->hostport);
- xfree(host);
- continue;
- }
- assert(addrinfo->ai_family == PF_INET);
- memcpy(addrbuf, &((struct sockaddr_in*)addrinfo->ai_addr)->sin_addr.s_addr, 4);
- sprintf(ipport, "%u.%u.%u.%u:%s",
- addrbuf[0], addrbuf[1], addrbuf[2], addrbuf[3], port);
- host->ipport = xstrdup(ipport);
- freeaddrinfo(addrinfo);
- host->next = hosts;
- hosts = host;
- }
- database = xmalloc(sizeof(struct database));
- database->host = host;
- database->url = xmalloc(strlen(url) + strlen(db) + 2);
- strcpy(database->url, url);
- strcat(database->url, "/");
- strcat(database->url, db);
- if (name)
- database->name = xstrdup(name);
- else
- database->name = 0;
-
- database->databases = xmalloc(2 * sizeof(char *));
- database->databases[0] = xstrdup(db);
- database->databases[1] = 0;
- database->errors = 0;
- database->qprofile = 0;
- database->rprofile = database_retrieval_profile(database);
- database->next = databases;
- databases = database;
-
- }
- fclose(f);
-}
-
-#endif
-
static struct client *client_create(void)
{
struct client *r;
http_init(hp);
}
-// Initialize CCL map for a target
-// Note: This approach ignores user-specific CCL maps, for which I
-// don't presently see any application.
-static void prepare_cclmap(void *context, struct database *db)
-{
- struct setting *s;
-
- if (!db->settings)
- return;
- db->ccl_map = ccl_qual_mk();
- for (s = db->settings[PZ_CCLMAP]; s; s = s->next)
- if (!*s->user)
- {
- char *p = strchr(s->name + 3, ':');
- if (!p)
- {
- yaz_log(YLOG_FATAL, "Malformed cclmap name: %s", s->name);
- exit(1);
- }
- p++;
- ccl_qual_fitem(db->ccl_map, s->value, p);
- }
-}
-
-// Read settings for each database, and prepare a CCL map for that database
-static void prepare_cclmaps(void)
-{
- grep_databases(0, 0, prepare_cclmap);
-}
-
static void start_proxy(void)
{
char hp[128] = "";
else if (global_parameters.server->settings)
settings_read(global_parameters.server->settings);
else
- yaz_log(YLOG_WARN, "No settings-directory specified. Problems may ensue!");
- prepare_cclmaps();
- global_parameters.yaz_marc = yaz_marc_create();
- yaz_marc_subfield_str(global_parameters.yaz_marc, "\t");
+ yaz_log(YLOG_WARN, "No settings-directory specified. Problems may well ensue!");
+ prepare_databases();
global_parameters.odr_in = odr_createmem(ODR_DECODE);
global_parameters.odr_out = odr_createmem(ODR_ENCODE);