Update NEWS with most important changes
[yaz-moved-to-github.git] / src / zoom-c.c
index b5241f3..2b51aa1 100644 (file)
@@ -2,7 +2,7 @@
  * Copyright (c) 2000-2004, Index Data
  * See the file LICENSE for details.
  *
- * $Id: zoom-c.c,v 1.26 2004-04-06 17:47:24 adam Exp $
+ * $Id: zoom-c.c,v 1.30 2004-10-02 13:28:26 adam Exp $
  *
  * ZOOM layer for C, connections, result sets, queries.
  */
@@ -104,7 +104,7 @@ static void set_dset_error (ZOOM_connection c, int error,
     }
     if (addinfo && addinfo2)
     {
-        c->addinfo = xmalloc(strlen(addinfo) + strlen(addinfo2) + 2);
+        c->addinfo = (char*) xmalloc(strlen(addinfo) + strlen(addinfo2) + 2);
         strcpy(c->addinfo, addinfo);
         strcat(c->addinfo, addinfo2);
     }
@@ -185,7 +185,6 @@ void ZOOM_connection_remove_task (ZOOM_connection c)
        switch (task->which)
        {
        case ZOOM_TASK_SEARCH:
-
            ZOOM_resultset_destroy (task->u.search.resultset);
            break;
        case ZOOM_TASK_RETRIEVE:
@@ -783,6 +782,19 @@ ZOOM_resultset_records (ZOOM_resultset r, ZOOM_record *recs,
     }
 }
 
+static void get_cert(ZOOM_connection c)
+{
+    char *cert_buf;
+    int cert_len;
+    
+    if (cs_get_peer_certificate_x509(c->cs, &cert_buf, &cert_len))
+    {
+        ZOOM_connection_option_setl(c, "sslPeerCert",
+                                   cert_buf, cert_len);
+       xfree(cert_buf);
+    }
+}
+
 static zoom_ret do_connect (ZOOM_connection c)
 {
     void *add;
@@ -795,7 +807,8 @@ static zoom_ret do_connect (ZOOM_connection c)
 
     yaz_log (LOG_DEBUG, "do_connect host=%s", effective_host);
 
-    assert (!c->cs);
+    if (c->cs)
+       cs_close(c->cs);
     c->cs = cs_create_host (effective_host, 0, &add);
 
     if (c->cs && c->cs->protocol == PROTO_HTTP)
@@ -806,7 +819,7 @@ static zoom_ret do_connect (ZOOM_connection c)
         c->proto = PROTO_HTTP;
         cs_get_host_args(c->host_port, &path);
         xfree(c->path);
-        c->path = xmalloc(strlen(path)+2);
+        c->path = (char*) xmalloc(strlen(path)+2);
         c->path[0] = '/';
         strcpy (c->path+1, path);
 #else
@@ -822,6 +835,7 @@ static zoom_ret do_connect (ZOOM_connection c)
         {
             ZOOM_Event event = ZOOM_Event_create(ZOOM_EVENT_CONNECT);
             ZOOM_connection_put_event(c, event);
+           get_cert(c);
             if (c->proto == PROTO_Z3950)
                 ZOOM_connection_send_init(c);
             else
@@ -987,7 +1001,7 @@ static zoom_ret ZOOM_connection_send_init (ZOOM_connection c)
        ZOOM_options_get(c->options, "implementationName"),
        odr_prepend(c->odr_out, "ZOOM-C", ireq->implementationName));
 
-    version = odr_strdup(c->odr_out, "$Revision: 1.26 $");
+    version = odr_strdup(c->odr_out, "$Revision: 1.30 $");
     if (strlen(version) > 10)  /* check for unexpanded CVS strings */
        version[strlen(version)-2] = '\0';
     ireq->implementationVersion = odr_prepend(c->odr_out,
@@ -1078,7 +1092,7 @@ static zoom_ret send_srw (ZOOM_connection c, Z_SRW_PDU *sr)
     };
     ODR o = odr_createmem(ODR_ENCODE);
     int ret;
-    Z_SOAP *p = odr_malloc(o, sizeof(*p));
+    Z_SOAP *p = (Z_SOAP*) odr_malloc(o, sizeof(*p));
     Z_GDU *gdu;
     ZOOM_Event event;
 
@@ -1100,7 +1114,7 @@ static zoom_ret send_srw (ZOOM_connection c, Z_SRW_PDU *sr)
 
         if (cp0 && cp1)
         {
-            char *h = odr_malloc(c->odr_out, cp1 - cp0 + 1);
+            char *h = (char*) odr_malloc(c->odr_out, cp1 - cp0 + 1);
             memcpy (h, cp0, cp1 - cp0);
             h[cp1-cp0] = '\0';
             z_HTTP_header_add(c->odr_out, &gdu->u.HTTP_Request->headers,
@@ -1119,7 +1133,7 @@ static zoom_ret send_srw (ZOOM_connection c, Z_SRW_PDU *sr)
     z_HTTP_header_add(c->odr_out, &gdu->u.HTTP_Request->headers,
                       "SOAPAction", "\"\"");
     p->which = Z_SOAP_generic;
-    p->u.generic = odr_malloc(o, sizeof(*p->u.generic));
+    p->u.generic = (Z_SOAP_Generic *) odr_malloc(o, sizeof(*p->u.generic));
     p->u.generic->no = 0;
     p->u.generic->ns = 0;
     p->u.generic->p = sr;
@@ -1651,7 +1665,8 @@ ZOOM_record_get (ZOOM_record rec, const char *type_spec, int *len)
        }
         if (r->which == Z_External_sutrs)
            return record_iconv_return(rec, len,
-                                      r->u.sutrs->buf, r->u.sutrs->len,
+                                      (char*) r->u.sutrs->buf,
+                                      r->u.sutrs->len,
                                       charset);
         else if (r->which == Z_External_octet)
         {
@@ -2599,7 +2614,7 @@ static Z_APDU *create_update_package(ZOOM_package p)
                odr_malloc (p->odr_out, sizeof(Odr_oct));
            notToKeep->elements[0]->u.opaque->size =
                notToKeep->elements[0]->u.opaque->len = strlen(recordIdOpaque);
-           notToKeep->elements[0]->u.opaque->buf =
+           notToKeep->elements[0]->u.opaque->buf = (unsigned char*)
                odr_strdup(p->odr_out, recordIdOpaque);
        }
        else if (recordIdNumber)
@@ -2656,17 +2671,22 @@ ZOOM_API(void)
             apdu->u.extendedServicesRequest->taskSpecificParameters = r;
         }
     }
-    if (!strcmp(type, "create"))  /* create database */
+    else if (!strcmp(type, "create"))  /* create database */
     {
        apdu = create_admin_package(p, Z_ESAdminOriginPartToKeep_create,
                                    0, 0);
     }  
-    if (!strcmp(type, "drop"))  /* drop database */
+    else if (!strcmp(type, "drop"))  /* drop database */
     {
        apdu = create_admin_package(p, Z_ESAdminOriginPartToKeep_drop,
                                    0, 0);
     }
-    if (!strcmp(type, "update")) /* update record(s) */
+    else if (!strcmp(type, "commit"))  /* commit changes */
+    {
+       apdu = create_admin_package(p, Z_ESAdminOriginPartToKeep_commit,
+                                   0, 0);
+    }
+    else if (!strcmp(type, "update")) /* update record(s) */
     {
        apdu = create_update_package(p);
     }
@@ -3011,7 +3031,7 @@ static void handle_srw_response(ZOOM_connection c,
         npr->u.databaseRecord->which = Z_External_octet;
         npr->u.databaseRecord->u.octet_aligned = (Odr_oct *)
             odr_malloc(c->odr_in, sizeof(Odr_oct));
-        npr->u.databaseRecord->u.octet_aligned->buf = 
+        npr->u.databaseRecord->u.octet_aligned->buf = (unsigned char*)
             res->records[i].recordData_buf;
         npr->u.databaseRecord->u.octet_aligned->len = 
             npr->u.databaseRecord->u.octet_aligned->size = 
@@ -3063,7 +3083,7 @@ static void handle_http(ZOOM_connection c, Z_HTTP_Response *hres)
         if (!ret && soap_package->which == Z_SOAP_generic &&
             soap_package->u.generic->no == 0)
         {
-            Z_SRW_PDU *sr = soap_package->u.generic->p;
+            Z_SRW_PDU *sr = (Z_SRW_PDU*) soap_package->u.generic->p;
             if (sr->which == Z_SRW_searchRetrieve_response)
                 handle_srw_response(c, sr->u.response);
             else
@@ -3227,11 +3247,18 @@ ZOOM_connection_option_get (ZOOM_connection c, const char *key)
 
 ZOOM_API(void)
 ZOOM_connection_option_set (ZOOM_connection c, const char *key,
-                                  const char *val)
+                           const char *val)
 {
     ZOOM_options_set (c->options, key, val);
 }
 
+ZOOM_API(void)
+ZOOM_connection_option_setl (ZOOM_connection c, const char *key,
+                            const char *val, int len)
+{
+    ZOOM_options_setl (c->options, key, val, len);
+}
+
 ZOOM_API(const char *)
 ZOOM_resultset_option_get (ZOOM_resultset r, const char *key)
 {
@@ -3367,6 +3394,7 @@ static int ZOOM_connection_do_io(ZOOM_connection c, int mask)
         else if (ret == 0)
         {
             ZOOM_connection_put_event (c, event);
+           get_cert(c);
             if (c->proto == PROTO_Z3950)
                 ZOOM_connection_send_init(c);
             else