<varlistentry><term>attribute <literal>listenref</literal> (optional)</term>
<listitem>
<para>
- Specifies listener for this server. If this attribute is not
- given, the server is accessible from all listener. In order
- for the server to be used for real, howeever, the virtual host
- must match (if specified in the configuration).
+ Specifies one or more listeners for this server. Each server ID is
+ separated by a comma.
+ If this attribute is not given, the server is accessible from all
+ listeners. In order for the server to be used for real, however, the
+ virtual host must match if specified in the configuration.
</para>
</listitem>
</varlistentry>
<directory>/var/www/s1</directory>
<config>config.cfg</config>
</server>
- <server id="server2">
+ <server id="server2" listenref="public,internal">
<host>server2.mydomain</host>
<directory>/var/www/s2</directory>
<config>config.cfg</config>
<para>
There are three configured backend servers. The first two
servers, <literal>"server1"</literal> and <literal>"server2"</literal>,
- can be reached by both listener addresses - since
- no <literal>listenref</literal> attribute is specified.
- In order to distinguish between the two a virtual host has
+ can be reached by both listener addresses.
+ <literal>"server1"</literal> is reached by all (two) since no
+ <literal>listenref</literal> attribute is specified.
+ <literal>"server2"</literal> is reached by the two listeners specified.
+ In order to distinguish between the two, a virtual host has
been specified for each of server in the <literal>host</literal>
elements.
</para>
statserv_options_block cb;
char *host;
char *id;
- int listen_ref;
+ int *listen_ref;
cql_transform_t cql_transform;
CCL_bibset ccl_transform;
void *server_node_ptr;
int host_match = 0;
if ( !gfs->host || (host && gfs->host && !strcmp(host, gfs->host)))
host_match = 1;
- if (!gfs->listen_ref ||
- gfs->listen_ref == assoc->client_chan->chan_id)
+ if (!gfs->listen_ref)
listen_match = 1;
+ else
+ {
+ int i;
+ for (i = 0; gfs->listen_ref[i] != -1; i++)
+ if (gfs->listen_ref[i] == assoc->client_chan->chan_id)
+ listen_match = 1;
+ }
if (listen_match && host_match)
{
if (force_open ||
gfs->server_node_ptr = ptr_server;
if (listenref)
{
- int id_no;
- struct gfs_listen *gl = gfs_listen_list;
- for (id_no = 1; gl; gl = gl->next, id_no++)
- if (gl->id && !strcmp(gl->id, listenref))
- {
- gfs->listen_ref = id_no;
- break;
- }
- if (!gl)
- yaz_log(YLOG_WARN, "Non-existent listenref '%s' in server "
- "config element", listenref);
+ char **refs;
+ int num, i;
+ nmem_strsplit(gfs_nmem, ",", listenref, &refs, &num);
+ gfs->listen_ref = (int*) nmem_malloc(gfs_nmem,
+ sizeof(int) * (num + 1));
+ for (i = 0; i < num; i++)
+ {
+ int id_no;
+ struct gfs_listen *gl = gfs_listen_list;
+ gfs->listen_ref[i] = 0;
+ for (id_no = 1; gl; gl = gl->next, id_no++)
+ if (gl->id && !strcmp(gl->id, refs[i]))
+ {
+ gfs->listen_ref[i] = id_no;
+ break;
+ }
+ if (!gl)
+ yaz_log(YLOG_WARN, "Non-existent listenref '%s' "
+ "in server config element", refs[i]);
+ }
+ gfs->listen_ref[i] = -1;
}
for (ptr = ptr_server->children; ptr; ptr = ptr->next)
{