* Copyright (c) 1995-2002, Index Data
* See the file LICENSE for details.
*
- * $Id: client.c,v 1.170 2002-09-17 21:19:38 adam Exp $
+ * $Id: client.c,v 1.171 2002-09-24 08:05:41 adam Exp $
*/
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
+#include <ctype.h>
#include <yaz/yaz-util.h>
#define maxOtherInfosSupported 10
struct {
int oidval;
- char* value;
+ char* value;
} extraOtherInfos[maxOtherInfosSupported];
if (S_ISREG(status.st_mode) && (inf = fopen(fname, "r")))
{
size_t len = status.st_size;
- char *buf = xmalloc (len);
+ char *buf = (char *) xmalloc (len);
fread (buf, 1, len, inf);
notToKeep->elements[0]->which = Z_IUSuppliedRecords_elem_opaque;
if (*recid)
{
- notToKeep->elements[0]->u.opaque = odr_malloc (out, sizeof(Odr_oct));
- notToKeep->elements[0]->u.opaque->buf = recid;
+ notToKeep->elements[0]->u.opaque = (Odr_oct *)
+ odr_malloc (out, sizeof(Odr_oct));
+ notToKeep->elements[0]->u.opaque->buf = (unsigned char *) recid;
notToKeep->elements[0]->u.opaque->size = strlen(recid);
notToKeep->elements[0]->u.opaque->len = strlen(recid);
}
{"schema",CLASS_SCHEMA},
{"tagset",CLASS_TAGSET},
{"general",CLASS_GENERAL},
- {0,0}
+ {0,(enum oid_class) 0}
};
char oname_str[101], oclass_str[101], oid_str[101];
char* name;
}
if(extraOtherInfos[i].oidval != -1)
- printf(" otherinfo %d %s %s\n",i,yaz_z3950_oid_value_to_str(extraOtherInfos[i].oidval,CLASS_RECSYN), extraOtherInfos[i].value);
+ printf(" otherinfo %d %s %s\n",
+ i,
+ yaz_z3950_oid_value_to_str(
+ (enum oid_value) extraOtherInfos[i].oidval,
+ CLASS_RECSYN),
+ extraOtherInfos[i].value);
} else {
for(i=0; i<maxOtherInfosSupported; ++i) {
if(extraOtherInfos[i].oidval != -1)
- printf(" otherinfo %d %s %s\n",i,yaz_z3950_oid_value_to_str(extraOtherInfos[i].oidval,CLASS_RECSYN), extraOtherInfos[i].value);
+ printf(" otherinfo %d %s %s\n",
+ i,
+ yaz_z3950_oid_value_to_str(
+ (enum oid_value) extraOtherInfos[i].oidval,
+ CLASS_RECSYN),
+ extraOtherInfos[i].value);
}
}
}
- if(!cmd[i].local_tabcompletes) {
- cmd[i].local_tabcompletes = calloc(1,sizeof(char**));
- }
+ if(!cmd[i].local_tabcompletes)
+ cmd[i].local_tabcompletes = (char **) calloc(1,sizeof(char**));
num_of_tabs=0;
num_of_tabs++;
}
- cmd[i].local_tabcompletes =
+ cmd[i].local_tabcompletes = (char **)
realloc(cmd[i].local_tabcompletes,(num_of_tabs+2)*sizeof(char**));
tabslist=cmd[i].local_tabcompletes;
tabslist[num_of_tabs]=strdup(tabargument);
* Copyright (c) 1997-2002, Index Data
* See the file LICENSE for details.
*
- * $Id: siconv.c,v 1.4 2002-08-30 11:27:44 adam Exp $
+ * $Id: siconv.c,v 1.5 2002-09-24 08:05:41 adam Exp $
*/
/* mini iconv and wrapper for system iconv library (if present) */
static size_t yaz_write_UTF8 (yaz_iconv_t cd, unsigned long x,
char **outbuf, size_t *outbytesleft)
{
- unsigned char *outp = *outbuf;
+ unsigned char *outp = (unsigned char *) *outbuf;
if (x <= 0x7f && *outbytesleft >= 1)
{
*outp++ = (unsigned char) x;
cd->my_errno = YAZ_ICONV_E2BIG; /* not room for output */
return (size_t)(-1);
}
- *outbuf = outp;
+ *outbuf = (char *) outp;
return 0;
}
static size_t yaz_write_ISO8859_1 (yaz_iconv_t cd, unsigned long x,
char **outbuf, size_t *outbytesleft)
{
- unsigned char *outp = *outbuf;
+ unsigned char *outp = (unsigned char *) *outbuf;
if (x > 255 || x < 1)
{
cd->my_errno = YAZ_ICONV_EILSEQ;
cd->my_errno = YAZ_ICONV_E2BIG;
return (size_t)(-1);
}
- *outbuf = outp;
+ *outbuf = (char *) outp;
return 0;
}
static size_t yaz_write_UCS4 (yaz_iconv_t cd, unsigned long x,
char **outbuf, size_t *outbytesleft)
{
- unsigned char *outp = *outbuf;
+ unsigned char *outp = (unsigned char *) *outbuf;
if (*outbytesleft >= 4)
{
*outp++ = (unsigned char) (x<<24);
cd->my_errno = YAZ_ICONV_E2BIG;
return (size_t)(-1);
}
- *outbuf = outp;
+ *outbuf = (char *) outp;
return 0;
}
static size_t yaz_write_UCS4LE (yaz_iconv_t cd, unsigned long x,
char **outbuf, size_t *outbytesleft)
{
- unsigned char *outp = *outbuf;
+ unsigned char *outp = (unsigned char *) *outbuf;
if (*outbytesleft >= 4)
{
*outp++ = (unsigned char) x;
cd->my_errno = YAZ_ICONV_E2BIG;
return (size_t)(-1);
}
- *outbuf = outp;
+ *outbuf = (char *) outp;
return 0;
}
yaz_iconv_t yaz_iconv_open (const char *tocode, const char *fromcode)
{
- yaz_iconv_t cd = xmalloc (sizeof(*cd));
+ yaz_iconv_t cd = (yaz_iconv_t) xmalloc (sizeof(*cd));
cd->write_handle = 0;
cd->read_handle = 0;
if (cd->init_handle)
{
size_t no_read;
- size_t r = (cd->init_handle)(cd, *inbuf, *inbytesleft, &no_read);
+ size_t r = (cd->init_handle)(cd, (unsigned char *) *inbuf,
+ *inbytesleft, &no_read);
if (r)
{
if (cd->my_errno == YAZ_ICONV_EINVAL)
break;
}
- x = (cd->read_handle)(cd, *inbuf, *inbytesleft, &no_read);
+ x = (cd->read_handle)(cd, (unsigned char *) *inbuf, *inbytesleft,
+ &no_read);
if (no_read == 0)
{
r = (size_t)(-1);
/*
- * $Id: zoom-c.c,v 1.1 2002-09-16 18:45:14 adam Exp $
+ * $Id: zoom-c.c,v 1.2 2002-09-24 08:05:42 adam Exp $
*
* ZOOM layer for C, connections, result sets, queries.
*/
#include <sys/poll.h>
#endif
-static int ZOOM_connection_send_init (ZOOM_connection c);
-static int do_write_ex (ZOOM_connection c, char *buf_out, int len_out);
+typedef enum {
+ zoom_pending,
+ zoom_complete
+} zoom_ret;
+
+
+static zoom_ret ZOOM_connection_send_init (ZOOM_connection c);
+static zoom_ret do_write_ex (ZOOM_connection c, char *buf_out, int len_out);
static ZOOM_Event ZOOM_Event_create (int kind)
{
return 0;
}
-static int do_write(ZOOM_connection c);
+static zoom_ret do_write(ZOOM_connection c);
ZOOM_API(void)
ZOOM_connection_destroy(ZOOM_connection c)
void ZOOM_resultset_addref (ZOOM_resultset r)
{
if (r)
+ {
(r->refcount)++;
+ yaz_log (LOG_DEBUG, "ZOOM_resultset_addref r=%p count=%d",
+ r, r->refcount);
+ }
}
ZOOM_resultset ZOOM_resultset_create ()
{
ZOOM_resultset r = (ZOOM_resultset) xmalloc (sizeof(*r));
+ yaz_log (LOG_DEBUG, "ZOOM_resultset_create r = %p", r);
r->refcount = 1;
r->size = 0;
r->odr = odr_createmem (ODR_ENCODE);
if (!r)
return;
(r->refcount)--;
- yaz_log (LOG_DEBUG, "destroy r = %p count=%d", r, r->refcount);
+ yaz_log (LOG_DEBUG, "ZOOM_resultset_destroy r = %p count=%d",
+ r, r->refcount);
if (r->refcount == 0)
{
ZOOM_record_cache rc;
}
}
-static int do_connect (ZOOM_connection c)
+static zoom_ret do_connect (ZOOM_connection c)
{
void *add;
const char *effective_host;
ZOOM_connection_put_event(c, event);
ZOOM_connection_send_init(c);
c->state = STATE_ESTABLISHED;
- return 1;
+ return zoom_pending;
}
else if (ret > 0)
{
c->mask += ZOOM_SELECT_WRITE;
if (c->cs->io_pending & CS_WANT_READ)
c->mask += ZOOM_SELECT_READ;
- return 1;
+ return zoom_pending;
}
}
c->state = STATE_IDLE;
c->error = ZOOM_ERROR_CONNECT;
- return 0;
+ return zoom_complete;
}
int z3950_connection_socket(ZOOM_connection c)
z_APDU(odr_pr, &a, 0, 0);
odr_destroy(odr_pr);
}
+ yaz_log (LOG_DEBUG, "encoding failed");
c->error = ZOOM_ERROR_ENCODE;
- do_close (c);
+ odr_reset(out);
return -1;
}
return 0;
}
-static int send_APDU (ZOOM_connection c, Z_APDU *a)
+static zoom_ret send_APDU (ZOOM_connection c, Z_APDU *a)
{
ZOOM_Event event;
assert (a);
if (encode_APDU(c, a, c->odr_out))
- return -1;
+ return zoom_complete;
c->buf_out = odr_getbuf(c->odr_out, &c->len_out, 0);
event = ZOOM_Event_create (ZOOM_EVENT_SEND_APDU);
ZOOM_connection_put_event (c, event);
odr_reset(c->odr_out);
- do_write (c);
- return 0;
+ return do_write (c);
}
-static int ZOOM_connection_send_init (ZOOM_connection c)
+/* returns 1 if PDU was sent OK (still pending )
+ 0 if PDU was not sent OK (nothing to wait for)
+*/
+
+static zoom_ret ZOOM_connection_send_init (ZOOM_connection c)
{
const char *impname;
Z_APDU *apdu = zget_APDU(c->odr_out, Z_APDU_initRequest);
}
}
assert (apdu);
- send_APDU (c, apdu);
-
- return 0;
+ return send_APDU (c, apdu);
}
-static int ZOOM_connection_send_search (ZOOM_connection c)
+static zoom_ret ZOOM_connection_send_search (ZOOM_connection c)
{
ZOOM_resultset r;
int lslb, ssub, mspn;
break;
}
r->setname = xstrdup (setname);
- yaz_log (LOG_DEBUG, "allocating %s", r->setname);
+ yaz_log (LOG_DEBUG, "allocating set %s", r->setname);
}
else
r->setname = xstrdup ("default");
}
search_req->resultSetName = odr_strdup(c->odr_out, r->setname);
/* send search request */
- send_APDU (c, apdu);
- return 1;
+ return send_APDU (c, apdu);
}
static void response_diag (ZOOM_connection c, Z_DiagRec *p)
return 1;
}
-static int send_sort (ZOOM_connection c)
+static zoom_ret send_sort (ZOOM_connection c)
{
ZOOM_resultset resultset;
if (!c->tasks || c->tasks->which != ZOOM_TASK_SEARCH)
- return 0;
+ return zoom_complete;
resultset = c->tasks->u.search.resultset;
if (c->error)
{
resultset->r_sort_spec = 0;
- return 0;
+ return zoom_complete;
}
if (resultset->r_sort_spec)
{
req->sortedResultSetName = odr_strdup (c->odr_out, resultset->setname);
req->sortSequence = resultset->r_sort_spec;
resultset->r_sort_spec = 0;
- send_APDU (c, apdu);
- return 1;
+ return send_APDU (c, apdu);
}
- return 0;
+ return zoom_complete;
}
-static int send_present (ZOOM_connection c)
+static zoom_ret send_present (ZOOM_connection c)
{
Z_APDU *apdu = 0;
Z_PresentRequest *req = 0;
ZOOM_resultset resultset;
if (!c->tasks)
- return 0;
+ return zoom_complete;
switch (c->tasks->which)
{
resultset->count = c->tasks->u.retrieve.count;
if (resultset->start >= resultset->size)
- return 0;
+ return zoom_complete;
if (resultset->start + resultset->count > resultset->size)
resultset->count = resultset->size - resultset->start;
break;
default:
- return 0;
+ return zoom_complete;
}
syntax = ZOOM_resultset_option_get (resultset, "preferredRecordSyntax");
schema = ZOOM_resultset_option_get (resultset, "schema");
if (c->error) /* don't continue on error */
- return 0;
+ return zoom_complete;
if (resultset->start < 0)
- return 0;
+ return zoom_complete;
for (i = 0; i<resultset->count; i++)
{
ZOOM_record rec =
break;
}
if (i == resultset->count)
- return 0;
+ return zoom_complete;
apdu = zget_APDU(c->odr_out, Z_APDU_presentRequest);
req = apdu->u.presentRequest;
req->recordComposition = compo;
}
req->resultSetId = odr_strdup(c->odr_out, resultset->setname);
- send_APDU (c, apdu);
- return 1;
+ return send_APDU (c, apdu);
}
ZOOM_API(ZOOM_scanset)
}
}
-static int send_package (ZOOM_connection c)
+static zoom_ret send_package (ZOOM_connection c)
{
ZOOM_Event event;
if (!c->tasks)
- return 0;
+ return zoom_complete;
assert (c->tasks->which == ZOOM_TASK_PACKAGE);
-
+
event = ZOOM_Event_create (ZOOM_EVENT_SEND_APDU);
ZOOM_connection_put_event (c, event);
-
- do_write_ex (c, c->tasks->u.package->buf_out,
- c->tasks->u.package->len_out);
- return 1;
+
+ return do_write_ex (c, c->tasks->u.package->buf_out,
+ c->tasks->u.package->len_out);
}
-static int send_scan (ZOOM_connection c)
+static zoom_ret send_scan (ZOOM_connection c)
{
ZOOM_scanset scan;
Z_APDU *apdu = zget_APDU(c->odr_out, Z_APDU_scanRequest);
Z_ScanRequest *req = apdu->u.scanRequest;
if (!c->tasks)
- return 0;
+ return zoom_complete;
assert (c->tasks->which == ZOOM_TASK_SCAN);
scan = c->tasks->u.scan.scan;
req->databaseNames = set_DatabaseNames (c, scan->options,
&req->num_databaseNames);
- send_APDU (c, apdu);
-
- return 1;
+ return send_APDU (c, apdu);
}
ZOOM_API(size_t)
ZOOM_options_set (scan->options, key, val);
}
-
-
static Z_APDU *create_es_package (ZOOM_package p, int type)
{
const char *str;
r->u.single_ASN1_type = (Odr_oct *)
odr_malloc (out, sizeof(*r->u.single_ASN1_type));
- r->u.single_ASN1_type->buf = odr_malloc (out, illRequest_size);
+ r->u.single_ASN1_type->buf = (unsigned char*)
+ odr_malloc (out, illRequest_size);
r->u.single_ASN1_type->len = illRequest_size;
r->u.single_ASN1_type->size = illRequest_size;
memcpy (r->u.single_ASN1_type->buf, illRequest_buf, illRequest_size);
static Z_ItemOrder *encode_item_order(ZOOM_package p)
{
- Z_ItemOrder *req = odr_malloc (p->odr_out, sizeof(*req));
+ Z_ItemOrder *req = (Z_ItemOrder *) odr_malloc (p->odr_out, sizeof(*req));
const char *str;
req->which=Z_IOItemOrder_esRequest;
req->u.esRequest->toKeep = (Z_IOOriginPartToKeep *)
odr_malloc(p->odr_out,sizeof(Z_IOOriginPartToKeep));
req->u.esRequest->toKeep->supplDescription = 0;
- req->u.esRequest->toKeep->contact =
+ req->u.esRequest->toKeep->contact = (Z_IOContact *)
odr_malloc (p->odr_out, sizeof(*req->u.esRequest->toKeep->contact));
str = ZOOM_options_get(p->options, "contact-name");
apdu = create_es_package (p, VAL_ITEMORDER);
if (apdu)
{
- r = odr_malloc (p->odr_out, sizeof(*r));
+ r = (Z_External *) odr_malloc (p->odr_out, sizeof(*r));
r->direct_reference =
yaz_oidval_to_z3950oid(p->odr_out, CLASS_EXTSERV,
ZOOM_task task = ZOOM_connection_add_task (c, ZOOM_TASK_PACKAGE);
task->u.package = p;
buf = odr_getbuf(p->odr_out, &p->len_out, 0);
- p->buf_out = xmalloc (p->len_out);
+ p->buf_out = (char *) xmalloc (p->len_out);
memcpy (p->buf_out, buf, p->len_out);
(p->refcount)++;
static int ZOOM_connection_exec_task (ZOOM_connection c)
{
ZOOM_task task = c->tasks;
+ zoom_ret ret = zoom_complete;
- yaz_log (LOG_DEBUG, "ZOOM_connection_exec_task");
if (!task)
- return 0;
- if (c->error != ZOOM_ERROR_NONE ||
- (!c->cs && task->which != ZOOM_TASK_CONNECT))
{
- ZOOM_connection_remove_tasks (c);
+ yaz_log (LOG_DEBUG, "ZOOM_connection_exec_task task=<null>");
return 0;
}
yaz_log (LOG_DEBUG, "ZOOM_connection_exec_task type=%d run=%d",
task->which, task->running);
+ if (c->error != ZOOM_ERROR_NONE ||
+ (!c->cs && task->which != ZOOM_TASK_CONNECT))
+ {
+ yaz_log (LOG_DEBUG, "remove tasks because of error = %d", c->error);
+ ZOOM_connection_remove_tasks (c);
+ return 0;
+ }
if (task->running)
+ {
+ yaz_log (LOG_DEBUG, "task already running");
return 0;
+ }
task->running = 1;
switch (task->which)
{
case ZOOM_TASK_SEARCH:
- /* see if search hasn't been sent yet. */
- if (ZOOM_connection_send_search (c))
- return 1;
+ ret = ZOOM_connection_send_search (c);
break;
case ZOOM_TASK_RETRIEVE:
- if (send_present (c))
- return 1;
+ ret = send_present (c);
break;
case ZOOM_TASK_CONNECT:
- if (do_connect(c))
- return 1;
+ ret = do_connect(c);
break;
case ZOOM_TASK_SCAN:
- if (send_scan(c))
- return 1;
+ ret = send_scan(c);
break;
case ZOOM_TASK_PACKAGE:
- if (send_package(c))
- return 1;
+ ret = send_package(c);
+ break;
}
- ZOOM_connection_remove_task (c);
- return 0;
+ if (ret == zoom_complete)
+ {
+ yaz_log (LOG_DEBUG, "task removed (complete)");
+ ZOOM_connection_remove_task (c);
+ return 0;
+ }
+ yaz_log (LOG_DEBUG, "task pending");
+ return 1;
}
-static int send_sort_present (ZOOM_connection c)
+static zoom_ret send_sort_present (ZOOM_connection c)
{
- int r = send_sort (c);
- if (!r)
+ zoom_ret r = send_sort (c);
+ if (r == zoom_complete)
r = send_present (c);
return r;
}
if (id)
ZOOM_options_setl (c->tasks->u.package->options,
- "targetReference", id->buf, id->len);
+ "targetReference", (char*) id->buf, id->len);
}
return 1;
}
Z_InitResponse *initrs;
c->mask = 0;
- yaz_log (LOG_DEBUG, "hande_apdu type=%d", apdu->which);
+ yaz_log (LOG_DEBUG, "handle_apdu type=%d", apdu->which);
switch(apdu->which)
{
case Z_APDU_initResponse:
if (p)
{
char *charset=NULL, *lang=NULL;
- int selected;
+ int sel;
- yaz_get_response_charneg(tmpmem, p, &charset, &lang, &selected);
+ yaz_get_response_charneg(tmpmem, p, &charset, &lang, &sel);
yaz_log(LOG_DEBUG, "Target accepted: charset - %s,"
"language - %s, select - %d",
- charset, lang, selected);
+ charset, lang, sel);
nmem_destroy(tmpmem);
}
break;
case Z_APDU_searchResponse:
handle_search_response (c, apdu->u.searchResponse);
- if (!send_sort_present (c))
+ if (send_sort_present (c) == zoom_complete)
ZOOM_connection_remove_task (c);
break;
case Z_APDU_presentResponse:
handle_present_response (c, apdu->u.presentResponse);
- if (!send_present (c))
+ if (send_present (c) == zoom_complete)
ZOOM_connection_remove_task (c);
break;
case Z_APDU_sortResponse:
sort_response (c, apdu->u.sortResponse);
- if (!send_present (c))
+ if (send_present (c) == zoom_complete)
ZOOM_connection_remove_task (c);
break;
case Z_APDU_scanResponse:
return 1;
}
-static int do_write_ex (ZOOM_connection c, char *buf_out, int len_out)
+static zoom_ret do_write_ex (ZOOM_connection c, char *buf_out, int len_out)
{
int r;
ZOOM_Event event;
yaz_log (LOG_DEBUG, "reconnect write");
c->tasks->running = 0;
ZOOM_connection_insert_task (c, ZOOM_TASK_CONNECT);
- return 0;
+ return zoom_complete;
}
if (c->state == STATE_CONNECTING)
c->error = ZOOM_ERROR_CONNECT;
else
c->error = ZOOM_ERROR_CONNECTION_LOST;
do_close (c);
- return 1;
+ return zoom_complete;
}
else if (r == 1)
{
c->mask = ZOOM_SELECT_READ|ZOOM_SELECT_EXCEPT;
yaz_log (LOG_DEBUG, "do_write_ex 2 mask=%d", c->mask);
}
- return 0;
+ return zoom_pending;
}
-static int do_write(ZOOM_connection c)
+static zoom_ret do_write(ZOOM_connection c)
{
return do_write_ex (c, c->buf_out, c->len_out);
}