Imported Upstream version 7.44.0
[platform/upstream/curl.git] / packages / OS400 / os400sys.c
index ab0c4fb..4be1dea 100644 (file)
@@ -5,7 +5,7 @@
  *                            | (__| |_| |  _ <| |___
  *                             \___|\___/|_| \_\_____|
  *
- * Copyright (C) 1998 - 2013, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2014, Daniel Stenberg, <daniel@haxx.se>, et al.
  *
  * This software is licensed as described in the file COPYING, which
  * you should have received as part of this distribution. The terms
@@ -38,8 +38,8 @@
 #include <qadrt.h>
 #include <errno.h>
 
-#ifdef USE_QSOSSL
-#include <qsossl.h>
+#ifdef HAVE_ZLIB_H
+#include <zlib.h>
 #endif
 
 #ifdef USE_GSKIT
@@ -94,16 +94,12 @@ static void
 thdbufdestroy(void * private)
 
 {
-  localkey_t i;
-  buffer_t * p;
-
-  if (private) {
-    p = (buffer_t *) private;
-
-    for (i = (localkey_t) 0; i < LK_LAST; i++) {
-      if (p->buf)
-        free(p->buf);
+  if(private) {
+    buffer_t * p = (buffer_t *) private;
+    localkey_t i;
 
+    for(i = (localkey_t) 0; i < LK_LAST; i++) {
+      free(p->buf);
       p++;
       }
 
@@ -116,13 +112,13 @@ static void
 terminate(void)
 
 {
-  if (Curl_thread_buffer == buffer_threaded) {
+  if(Curl_thread_buffer == buffer_threaded) {
     locbufs = pthread_getspecific(thdkey);
     pthread_setspecific(thdkey, (void *) NULL);
     pthread_key_delete(thdkey);
     }
 
-  if (Curl_thread_buffer != buffer_undef) {
+  if(Curl_thread_buffer != buffer_undef) {
     thdbufdestroy((void *) locbufs);
     locbufs = (buffer_t *) NULL;
     }
@@ -140,31 +136,31 @@ get_buffer(buffer_t * buf, long size)
   /* If `size' >= 0, make sure buffer at `buf' is at least `size'-byte long.
      Return the buffer address. */
 
-  if (size < 0)
+  if(size < 0)
     return buf->buf;
 
-  if (!buf->buf) {
-    if ((buf->buf = malloc(size)))
+  if(!buf->buf) {
+    if((buf->buf = malloc(size)))
       buf->size = size;
 
     return buf->buf;
     }
 
-  if ((unsigned long) size <= buf->size) {
+  if((unsigned long) size <= buf->size) {
     /* Shorten the buffer only if it frees a significant byte count. This
        avoids some realloc() overhead. */
 
-    if (buf->size - size < MIN_BYTE_GAIN)
+    if(buf->size - size < MIN_BYTE_GAIN)
       return buf->buf;
     }
 
   /* Resize the buffer. */
 
-  if ((cp = realloc(buf->buf, size))) {
+  if((cp = realloc(buf->buf, size))) {
     buf->buf = cp;
     buf->size = size;
     }
-  else if (size <= buf->size)
+  else if(size <= buf->size)
     cp = buf->buf;
 
   return cp;
@@ -191,16 +187,16 @@ buffer_threaded(localkey_t key, long size)
 
   bufs = (buffer_t *) pthread_getspecific(thdkey);
 
-  if (!bufs) {
-    if (size < 0)
+  if(!bufs) {
+    if(size < 0)
       return (char *) NULL;             /* No buffer yet. */
 
     /* Allocate buffer descriptors for the current thread. */
 
-    if (!(bufs = calloc((size_t) LK_LAST, sizeof *bufs)))
+    if(!(bufs = calloc((size_t) LK_LAST, sizeof *bufs)))
       return (char *) NULL;
 
-    if (pthread_setspecific(thdkey, (void *) bufs)) {
+    if(pthread_setspecific(thdkey, (void *) bufs)) {
       free(bufs);
       return (char *) NULL;
       }
@@ -222,11 +218,10 @@ buffer_undef(localkey_t key, long size)
 
   /* Determine if we can use pthread-specific data. */
 
-  if (Curl_thread_buffer == buffer_undef) {     /* If unchanged during lock. */
-    if (!pthread_key_create(&thdkey, thdbufdestroy))
+  if(Curl_thread_buffer == buffer_undef) {      /* If unchanged during lock. */
+    if(!pthread_key_create(&thdkey, thdbufdestroy))
       Curl_thread_buffer = buffer_threaded;
-    else if (!(locbufs = calloc((size_t) LK_LAST,
-                                             sizeof *locbufs))) {
+    else if(!(locbufs = calloc((size_t) LK_LAST, sizeof *locbufs))) {
       pthread_mutex_unlock(&mutex);
       return (char *) NULL;
       }
@@ -241,6 +236,28 @@ buffer_undef(localkey_t key, long size)
 }
 
 
+static char *
+set_thread_string(localkey_t key, const char * s)
+
+{
+  int i;
+  char * cp;
+
+  if(!s)
+    return (char *) NULL;
+
+  i = strlen(s) + 1;
+  cp = Curl_thread_buffer(key, MAX_CONV_EXPANSION * i + 1);
+
+  if(cp) {
+    i = QadrtConvertE2A(cp, s, MAX_CONV_EXPANSION * i, i);
+    cp[i] = '\0';
+  }
+
+  return cp;
+}
+
+
 int
 Curl_getnameinfo_a(const struct sockaddr * sa, curl_socklen_t salen,
               char * nodename, curl_socklen_t nodenamelen,
@@ -256,41 +273,35 @@ Curl_getnameinfo_a(const struct sockaddr * sa, curl_socklen_t salen,
   enodename = (char *) NULL;
   eservname = (char *) NULL;
 
-  if (nodename && nodenamelen)
-    if (!(enodename = malloc(nodenamelen)))
+  if(nodename && nodenamelen)
+    if(!(enodename = malloc(nodenamelen)))
       return EAI_MEMORY;
 
-  if (servname && servnamelen)
-    if (!(eservname = malloc(servnamelen))) {
-      if (enodename)
-        free(enodename);
-
+  if(servname && servnamelen)
+    if(!(eservname = malloc(servnamelen))) {
+      free(enodename);
       return EAI_MEMORY;
       }
 
   status = getnameinfo(sa, salen, enodename, nodenamelen,
                        eservname, servnamelen, flags);
 
-  if (!status) {
-    if (enodename) {
+  if(!status) {
+    if(enodename) {
       i = QadrtConvertE2A(nodename, enodename,
         nodenamelen - 1, strlen(enodename));
       nodename[i] = '\0';
       }
 
-    if (eservname) {
+    if(eservname) {
       i = QadrtConvertE2A(servname, eservname,
         servnamelen - 1, strlen(eservname));
       servname[i] = '\0';
       }
     }
 
-  if (enodename)
-    free(enodename);
-
-  if (eservname)
-    free(eservname);
-
+  free(enodename);
+  free(eservname);
   return status;
 }
 
@@ -309,23 +320,21 @@ Curl_getaddrinfo_a(const char * nodename, const char * servname,
   enodename = (char *) NULL;
   eservname = (char *) NULL;
 
-  if (nodename) {
+  if(nodename) {
     i = strlen(nodename);
 
-    if (!(enodename = malloc(i + 1)))
+    if(!(enodename = malloc(i + 1)))
       return EAI_MEMORY;
 
     i = QadrtConvertA2E(enodename, nodename, i, i);
     enodename[i] = '\0';
     }
 
-  if (servname) {
+  if(servname) {
     i = strlen(servname);
 
-    if (!(eservname = malloc(i + 1))) {
-      if (enodename)
-        free(enodename);
-
+    if(!(eservname = malloc(i + 1))) {
+      free(enodename);
       return EAI_MEMORY;
       }
 
@@ -334,128 +343,12 @@ Curl_getaddrinfo_a(const char * nodename, const char * servname,
     }
 
   status = getaddrinfo(enodename, eservname, hints, res);
-
-  if (enodename)
-    free(enodename);
-
-  if (eservname)
-    free(eservname);
-
+  free(enodename);
+  free(eservname);
   return status;
 }
 
 
-#ifdef USE_QSOSSL
-
-/* ASCII wrappers for the SSL procedures. */
-
-int
-Curl_SSL_Init_Application_a(SSLInitApp * init_app)
-
-{
-  int rc;
-  unsigned int i;
-  SSLInitApp ia;
-
-  if (!init_app || !init_app->applicationID || !init_app->applicationIDLen)
-    return SSL_Init_Application(init_app);
-
-  memcpy((char *) &ia, (char *) init_app, sizeof ia);
-  i = ia.applicationIDLen;
-
-  if (!(ia.applicationID = malloc(i + 1))) {
-    errno = ENOMEM;
-    return SSL_ERROR_IO;
-    }
-
-  QadrtConvertA2E(ia.applicationID, init_app->applicationID, i, i);
-  ia.applicationID[i] = '\0';
-  rc = SSL_Init_Application(&ia);
-  free(ia.applicationID);
-  init_app->localCertificateLen = ia.localCertificateLen;
-  init_app->sessionType = ia.sessionType;
-  return rc;
-}
-
-
-int
-Curl_SSL_Init_a(SSLInit * init)
-
-{
-  int rc;
-  unsigned int i;
-  SSLInit ia;
-
-  if (!init || (!init->keyringFileName && !init->keyringPassword))
-    return SSL_Init(init);
-
-  memcpy((char *) &ia, (char *) init, sizeof ia);
-
-  if (ia.keyringFileName) {
-    i = strlen(ia.keyringFileName);
-
-    if (!(ia.keyringFileName = malloc(i + 1))) {
-      errno = ENOMEM;
-      return SSL_ERROR_IO;
-      }
-
-    QadrtConvertA2E(ia.keyringFileName, init->keyringFileName, i, i);
-    ia.keyringFileName[i] = '\0';
-    }
-
-  if (ia.keyringPassword) {
-    i = strlen(ia.keyringPassword);
-
-    if (!(ia.keyringPassword = malloc(i + 1))) {
-      if (ia.keyringFileName)
-        free(ia.keyringFileName);
-
-      errno = ENOMEM;
-      return SSL_ERROR_IO;
-      }
-
-    QadrtConvertA2E(ia.keyringPassword, init->keyringPassword, i, i);
-    ia.keyringPassword[i] = '\0';
-    }
-
-  rc = SSL_Init(&ia);
-
-  if (ia.keyringFileName)
-    free(ia.keyringFileName);
-
-  if (ia.keyringPassword)
-    free(ia.keyringPassword);
-
-  return rc;
-}
-
-
-char *
-Curl_SSL_Strerror_a(int sslreturnvalue, SSLErrorMsg * serrmsgp)
-
-{
-  int i;
-  char * cp;
-  char * cp2;
-
-  cp = SSL_Strerror(sslreturnvalue, serrmsgp);
-
-  if (!cp)
-    return cp;
-
-  i = strlen(cp);
-
-  if (!(cp2 = Curl_thread_buffer(LK_SSL_ERROR, MAX_CONV_EXPANSION * i + 1)))
-    return cp2;
-
-  i = QadrtConvertE2A(cp2, cp, MAX_CONV_EXPANSION * i, i);
-  cp2[i] = '\0';
-  return cp2;
-}
-
-#endif /* USE_QSOSSL */
-
-
 #ifdef USE_GSKIT
 
 /* ASCII wrappers for the GSKit procedures. */
@@ -534,7 +427,7 @@ gsk_free_handle(struct Curl_gsk_descriptor * p)
 {
   struct gskstrlist * q;
 
-  while ((q = p->strlist)) {
+  while((q = p->strlist)) {
     p->strlist = q;
     free((void *) q->asciistr);
     free(q);
@@ -555,7 +448,7 @@ Curl_gsk_environment_close(gsk_handle * my_env_handle)
   if(!*my_env_handle)
     return GSK_INVALID_HANDLE;
   p = (struct Curl_gsk_descriptor *) *my_env_handle;
-  if ((rc = gsk_environment_close(&p->h)) == GSK_OK) {
+  if((rc = gsk_environment_close(&p->h)) == GSK_OK) {
     gsk_free_handle(p);
     *my_env_handle = (gsk_handle) NULL;
   }
@@ -575,7 +468,7 @@ Curl_gsk_secure_soc_close(gsk_handle * my_session_handle)
   if(!*my_session_handle)
     return GSK_INVALID_HANDLE;
   p = (struct Curl_gsk_descriptor *) *my_session_handle;
-  if ((rc = gsk_secure_soc_close(&p->h)) == GSK_OK) {
+  if((rc = gsk_secure_soc_close(&p->h)) == GSK_OK) {
     gsk_free_handle(p);
     *my_session_handle = (gsk_handle) NULL;
   }
@@ -627,7 +520,7 @@ Curl_gsk_attribute_set_buffer_a(gsk_handle my_gsk_handle, GSK_BUF_ID bufID,
   p = (struct Curl_gsk_descriptor *) my_gsk_handle;
   if(!bufSize)
     bufSize = strlen(buffer);
-  if (!(ebcdicbuf = malloc(bufSize + 1)))
+  if(!(ebcdicbuf = malloc(bufSize + 1)))
       return GSK_INSUFFICIENT_STORAGE;
   QadrtConvertA2E(ebcdicbuf, buffer, bufSize, bufSize);
   ebcdicbuf[bufSize] = '\0';
@@ -689,7 +582,7 @@ cachestring(struct Curl_gsk_descriptor * p,
   char * asciibuf;
   struct gskstrlist * sp;
 
-  for (sp = p->strlist; sp; sp = sp->next)
+  for(sp = p->strlist; sp; sp = sp->next)
     if(sp->ebcdicstr == ebcdicbuf)
       break;
   if(!sp) {
@@ -726,7 +619,7 @@ Curl_gsk_attribute_get_buffer_a(gsk_handle my_gsk_handle, GSK_BUF_ID bufID,
   if(!buffer || !bufSize)
     return GSK_OS400_ERROR_INVALID_POINTER;
   p = (struct Curl_gsk_descriptor *) my_gsk_handle;
-  if ((rc = gsk_attribute_get_buffer(p->h, bufID, &mybuf, &mylen)) != GSK_OK)
+  if((rc = gsk_attribute_get_buffer(p->h, bufID, &mybuf, &mylen)) != GSK_OK)
     return rc;
   if((rc = cachestring(p, mybuf, mylen, buffer)) == GSK_OK)
     *bufSize = mylen;
@@ -825,23 +718,7 @@ const char *
 Curl_gsk_strerror_a(int gsk_return_value)
 
 {
-  int i;
-  const char * cp;
-  char * cp2;
-
-  cp = gsk_strerror(gsk_return_value);
-
-  if (!cp)
-    return cp;
-
-  i = strlen(cp);
-
-  if (!(cp2 = Curl_thread_buffer(LK_GSK_ERROR, MAX_CONV_EXPANSION * i + 1)))
-    return cp2;
-
-  i = QadrtConvertE2A(cp2, cp, MAX_CONV_EXPANSION * i, i);
-  cp2[i] = '\0';
-  return cp2;
+  return set_thread_string(LK_GSK_ERROR, gsk_strerror(gsk_return_value));
 }
 
 int
@@ -878,11 +755,11 @@ Curl_gss_convert_in_place(OM_uint32 * minor_status, gss_buffer_t buf)
 
   i = buf->length;
 
-  if (i) {
-    if (!(t = malloc(i))) {
+  if(i) {
+    if(!(t = malloc(i))) {
       gss_release_buffer(minor_status, buf);
 
-      if (minor_status)
+      if(minor_status)
         *minor_status = ENOMEM;
 
       return -1;
@@ -906,14 +783,14 @@ Curl_gss_import_name_a(OM_uint32 * minor_status, gss_buffer_t in_name,
   unsigned int i;
   gss_buffer_desc in;
 
-  if (!in_name || !in_name->value || !in_name->length)
+  if(!in_name || !in_name->value || !in_name->length)
     return gss_import_name(minor_status, in_name, in_name_type, out_name);
 
   memcpy((char *) &in, (char *) in_name, sizeof in);
   i = in.length;
 
-  if (!(in.value = malloc(i + 1))) {
-    if (minor_status)
+  if(!(in.value = malloc(i + 1))) {
+    if(minor_status)
       *minor_status = ENOMEM;
 
     return GSS_S_FAILURE;
@@ -938,15 +815,15 @@ Curl_gss_display_status_a(OM_uint32 * minor_status, OM_uint32 status_value,
   rc = gss_display_status(minor_status, status_value, status_type,
                               mech_type, message_context, status_string);
 
-  if (rc != GSS_S_COMPLETE || !status_string ||
-      !status_string->length || !status_string->value)
+  if(rc != GSS_S_COMPLETE || !status_string ||
+     !status_string->length || !status_string->value)
     return rc;
 
   /* No way to allocate a buffer here, because it will be released by
      gss_release_buffer(). The solution is to overwrite the EBCDIC buffer
      with ASCII to return it. */
 
-  if (Curl_gss_convert_in_place(minor_status, status_string))
+  if(Curl_gss_convert_in_place(minor_status, status_string))
     return GSS_S_FAILURE;
 
   return rc;
@@ -954,7 +831,8 @@ Curl_gss_display_status_a(OM_uint32 * minor_status, OM_uint32 status_value,
 
 
 OM_uint32
-Curl_gss_init_sec_context_a(OM_uint32 * minor_status, gss_cred_id_t cred_handle,
+Curl_gss_init_sec_context_a(OM_uint32 * minor_status,
+                            gss_cred_id_t cred_handle,
                             gss_ctx_id_t * context_handle,
                             gss_name_t target_name, gss_OID mech_type,
                             gss_flags_t req_flags, OM_uint32 time_req,
@@ -972,12 +850,12 @@ Curl_gss_init_sec_context_a(OM_uint32 * minor_status, gss_cred_id_t cred_handle,
 
   in.value = NULL;
 
-  if ((inp = input_token))
-    if (inp->length && inp->value) {
+  if((inp = input_token))
+    if(inp->length && inp->value) {
       i = inp->length;
 
-      if (!(in.value = malloc(i + 1))) {
-        if (minor_status)
+      if(!(in.value = malloc(i + 1))) {
+        if(minor_status)
           *minor_status = ENOMEM;
 
         return GSS_S_FAILURE;
@@ -993,11 +871,9 @@ Curl_gss_init_sec_context_a(OM_uint32 * minor_status, gss_cred_id_t cred_handle,
                              target_name, mech_type, req_flags, time_req,
                              input_chan_bindings, inp, actual_mech_type,
                              output_token, ret_flags, time_rec);
+  free(in.value);
 
-  if (in.value)
-    free(in.value);
-
-  if (rc != GSS_S_COMPLETE || !output_token ||
+  if(rc != GSS_S_COMPLETE || !output_token ||
       !output_token->length || !output_token->value)
     return rc;
 
@@ -1005,7 +881,7 @@ Curl_gss_init_sec_context_a(OM_uint32 * minor_status, gss_cred_id_t cred_handle,
      gss_release_buffer(). The solution is to overwrite the EBCDIC buffer
      with ASCII to return it. */
 
-  if (Curl_gss_convert_in_place(minor_status, output_token))
+  if(Curl_gss_convert_in_place(minor_status, output_token))
     return GSS_S_FAILURE;
 
   return rc;
@@ -1022,7 +898,7 @@ Curl_gss_delete_sec_context_a(OM_uint32 * minor_status,
 
   rc = gss_delete_sec_context(minor_status, context_handle, output_token);
 
-  if (rc != GSS_S_COMPLETE || !output_token ||
+  if(rc != GSS_S_COMPLETE || !output_token ||
       !output_token->length || !output_token->value)
     return rc;
 
@@ -1030,7 +906,7 @@ Curl_gss_delete_sec_context_a(OM_uint32 * minor_status,
      gss_release_buffer(). The solution is to overwrite the EBCDIC buffer
      with ASCII to return it. */
 
-  if (Curl_gss_convert_in_place(minor_status, output_token))
+  if(Curl_gss_convert_in_place(minor_status, output_token))
     return GSS_S_FAILURE;
 
   return rc;
@@ -1051,12 +927,12 @@ Curl_ldap_init_a(char * host, int port)
   char * ehost;
   void * result;
 
-  if (!host)
+  if(!host)
     return (void *) ldap_init(host, port);
 
   i = strlen(host);
 
-  if (!(ehost = malloc(i + 1)))
+  if(!(ehost = malloc(i + 1)))
     return (void *) NULL;
 
   QadrtConvertA2E(ehost, host, i, i);
@@ -1078,23 +954,21 @@ Curl_ldap_simple_bind_s_a(void * ld, char * dn, char * passwd)
   edn = (char *) NULL;
   epasswd = (char *) NULL;
 
-  if (dn) {
+  if(dn) {
     i = strlen(dn);
 
-    if (!(edn = malloc(i + 1)))
+    if(!(edn = malloc(i + 1)))
       return LDAP_NO_MEMORY;
 
     QadrtConvertA2E(edn, dn, i, i);
     edn[i] = '\0';
     }
 
-  if (passwd) {
+  if(passwd) {
     i = strlen(passwd);
 
-    if (!(epasswd = malloc(i + 1))) {
-      if (edn)
-        free(edn);
-
+    if(!(epasswd = malloc(i + 1))) {
+      free(edn);
       return LDAP_NO_MEMORY;
       }
 
@@ -1103,13 +977,8 @@ Curl_ldap_simple_bind_s_a(void * ld, char * dn, char * passwd)
     }
 
   i = ldap_simple_bind_s(ld, edn, epasswd);
-
-  if (epasswd)
-    free(epasswd);
-
-  if (edn)
-    free(edn);
-
+  free(epasswd);
+  free(edn);
   return i;
 }
 
@@ -1131,10 +1000,10 @@ Curl_ldap_search_s_a(void * ld, char * base, int scope, char * filter,
   eattrs = (char * *) NULL;
   status = LDAP_SUCCESS;
 
-  if (base) {
+  if(base) {
     i = strlen(base);
 
-    if (!(ebase = malloc(i + 1)))
+    if(!(ebase = malloc(i + 1)))
       status = LDAP_NO_MEMORY;
     else {
       QadrtConvertA2E(ebase, base, i, i);
@@ -1142,10 +1011,10 @@ Curl_ldap_search_s_a(void * ld, char * base, int scope, char * filter,
       }
     }
 
-  if (filter && status == LDAP_SUCCESS) {
+  if(filter && status == LDAP_SUCCESS) {
     i = strlen(filter);
 
-    if (!(efilter = malloc(i + 1)))
+    if(!(efilter = malloc(i + 1)))
       status = LDAP_NO_MEMORY;
     else {
       QadrtConvertA2E(efilter, filter, i, i);
@@ -1153,17 +1022,17 @@ Curl_ldap_search_s_a(void * ld, char * base, int scope, char * filter,
       }
     }
 
-  if (attrs && status == LDAP_SUCCESS) {
-    for (i = 0; attrs[i++];)
+  if(attrs && status == LDAP_SUCCESS) {
+    for(i = 0; attrs[i++];)
       ;
 
-    if (!(eattrs = calloc(i, sizeof *eattrs)))
+    if(!(eattrs = calloc(i, sizeof *eattrs)))
       status = LDAP_NO_MEMORY;
     else {
-      for (j = 0; attrs[j]; j++) {
+      for(j = 0; attrs[j]; j++) {
         i = strlen(attrs[j]);
 
-        if (!(eattrs[j] = malloc(i + 1))) {
+        if(!(eattrs[j] = malloc(i + 1))) {
           status = LDAP_NO_MEMORY;
           break;
           }
@@ -1174,24 +1043,20 @@ Curl_ldap_search_s_a(void * ld, char * base, int scope, char * filter,
       }
     }
 
-  if (status == LDAP_SUCCESS)
+  if(status == LDAP_SUCCESS)
     status = ldap_search_s(ld, ebase? ebase: "", scope,
                            efilter? efilter: "(objectclass=*)",
                            eattrs, attrsonly, res);
 
-  if (eattrs) {
-    for (j = 0; eattrs[j]; j++)
+  if(eattrs) {
+    for(j = 0; eattrs[j]; j++)
       free(eattrs[j]);
 
     free(eattrs);
     }
 
-  if (efilter)
-    free(efilter);
-
-  if (ebase)
-    free(ebase);
-
+  free(efilter);
+  free(ebase);
   return status;
 }
 
@@ -1200,16 +1065,15 @@ struct berval * *
 Curl_ldap_get_values_len_a(void * ld, LDAPMessage * entry, const char * attr)
 
 {
-  int i;
   char * cp;
   struct berval * * result;
 
   cp = (char *) NULL;
 
-  if (attr) {
-    i = strlen(attr);
+  if(attr) {
+    int i = strlen(attr);
 
-    if (!(cp = malloc(i + 1))) {
+    if(!(cp = malloc(i + 1))) {
       ldap_set_lderrno(ld, LDAP_NO_MEMORY, NULL,
                        ldap_err2string(LDAP_NO_MEMORY));
       return (struct berval * *) NULL;
@@ -1220,12 +1084,10 @@ Curl_ldap_get_values_len_a(void * ld, LDAPMessage * entry, const char * attr)
     }
 
   result = ldap_get_values_len(ld, entry, cp);
+  free(cp);
 
-  if (cp)
-    free(cp);
-
-  /* Result data are binary in nature, so they haven't been converted to EBCDIC.
-     Therefore do not convert. */
+  /* Result data are binary in nature, so they haven't been
+     converted to EBCDIC. Therefore do not convert. */
 
   return result;
 }
@@ -1235,23 +1097,7 @@ char *
 Curl_ldap_err2string_a(int error)
 
 {
-  int i;
-  char * cp;
-  char * cp2;
-
-  cp = ldap_err2string(error);
-
-  if (!cp)
-    return cp;
-
-  i = strlen(cp);
-
-  if (!(cp2 = Curl_thread_buffer(LK_LDAP_ERROR, MAX_CONV_EXPANSION * i + 1)))
-    return cp2;
-
-  i = QadrtConvertE2A(cp2, cp, MAX_CONV_EXPANSION * i, i);
-  cp2[i] = '\0';
-  return cp2;
+  return set_thread_string(LK_LDAP_ERROR, ldap_err2string(error));
 }
 
 
@@ -1265,12 +1111,12 @@ Curl_ldap_get_dn_a(void * ld, LDAPMessage * entry)
 
   cp = ldap_get_dn(ld, entry);
 
-  if (!cp)
+  if(!cp)
     return cp;
 
   i = strlen(cp);
 
-  if (!(cp2 = malloc(i + 1)))
+  if(!(cp2 = malloc(i + 1)))
     return cp2;
 
   QadrtConvertE2A(cp2, cp, i, i);
@@ -1297,12 +1143,12 @@ Curl_ldap_first_attribute_a(void * ld,
 
   cp = ldap_first_attribute(ld, entry, berptr);
 
-  if (!cp)
+  if(!cp)
     return cp;
 
   i = strlen(cp);
 
-  if (!(cp2 = malloc(i + 1)))
+  if(!(cp2 = malloc(i + 1)))
     return cp2;
 
   QadrtConvertE2A(cp2, cp, i, i);
@@ -1329,12 +1175,12 @@ Curl_ldap_next_attribute_a(void * ld,
 
   cp = ldap_next_attribute(ld, entry, berptr);
 
-  if (!cp)
+  if(!cp)
     return cp;
 
   i = strlen(cp);
 
-  if (!(cp2 = malloc(i + 1)))
+  if(!(cp2 = malloc(i + 1)))
     return cp2;
 
   QadrtConvertE2A(cp2, cp, i, i);
@@ -1364,8 +1210,8 @@ convert_sockaddr(struct sockaddr_storage * dstaddr,
 
   /* Convert a socket address into job CCSID, if needed. */
 
-  if (!srcaddr || srclen < offsetof(struct sockaddr, sa_family) +
-      sizeof srcaddr->sa_family || srclen > sizeof *dstaddr) {
+  if(!srcaddr || srclen < offsetof(struct sockaddr, sa_family) +
+     sizeof srcaddr->sa_family || srclen > sizeof *dstaddr) {
     errno = EINVAL;
     return -1;
     }
@@ -1398,7 +1244,7 @@ Curl_os400_connect(int sd, struct sockaddr * destaddr, int addrlen)
 
   i = convert_sockaddr(&laddr, destaddr, addrlen);
 
-  if (i < 0)
+  if(i < 0)
     return -1;
 
   return connect(sd, (struct sockaddr *) &laddr, i);
@@ -1414,7 +1260,7 @@ Curl_os400_bind(int sd, struct sockaddr * localaddr, int addrlen)
 
   i = convert_sockaddr(&laddr, localaddr, addrlen);
 
-  if (i < 0)
+  if(i < 0)
     return -1;
 
   return bind(sd, (struct sockaddr *) &laddr, i);
@@ -1431,7 +1277,7 @@ Curl_os400_sendto(int sd, char * buffer, int buflen, int flags,
 
   i = convert_sockaddr(&laddr, dstaddr, addrlen);
 
-  if (i < 0)
+  if(i < 0)
     return -1;
 
   return sendto(sd, buffer, buflen, flags, (struct sockaddr *) &laddr, i);
@@ -1450,7 +1296,7 @@ Curl_os400_recvfrom(int sd, char * buffer, int buflen, int flags,
   struct sockaddr_un * dstu;
   struct sockaddr_storage laddr;
 
-  if (!fromaddr || !addrlen || *addrlen <= 0)
+  if(!fromaddr || !addrlen || *addrlen <= 0)
     return recvfrom(sd, buffer, buflen, flags, fromaddr, addrlen);
 
   laddrlen = sizeof laddr;
@@ -1458,7 +1304,7 @@ Curl_os400_recvfrom(int sd, char * buffer, int buflen, int flags,
   rcvlen = recvfrom(sd, buffer, buflen, flags,
                     (struct sockaddr *) &laddr, &laddrlen);
 
-  if (rcvlen < 0)
+  if(rcvlen < 0)
     return rcvlen;
 
   switch (laddr.ss_family) {
@@ -1471,7 +1317,7 @@ Curl_os400_recvfrom(int sd, char * buffer, int buflen, int flags,
     i = QadrtConvertE2A(dstu->sun_path, srcu->sun_path, i, laddrlen);
     laddrlen = i + offsetof(struct sockaddr_un, sun_path);
 
-    if (laddrlen < *addrlen)
+    if(laddrlen < *addrlen)
       dstu->sun_path[i] = '\0';
 
     break;
@@ -1480,10 +1326,10 @@ Curl_os400_recvfrom(int sd, char * buffer, int buflen, int flags,
     break;
 
   default:
-    if (laddrlen > *addrlen)
+    if(laddrlen > *addrlen)
       laddrlen = *addrlen;
 
-    if (laddrlen)
+    if(laddrlen)
       memcpy((char *) fromaddr, (char *) &laddr, laddrlen);
 
     break;
@@ -1492,3 +1338,79 @@ Curl_os400_recvfrom(int sd, char * buffer, int buflen, int flags,
   *addrlen = laddrlen;
   return rcvlen;
 }
+
+
+#ifdef HAVE_LIBZ
+const char *
+Curl_os400_zlibVersion(void)
+
+{
+  return set_thread_string(LK_ZLIB_VERSION, zlibVersion());
+}
+
+
+int
+Curl_os400_inflateInit_(z_streamp strm, const char * version, int stream_size)
+
+{
+  z_const char * msgb4 = strm->msg;
+  int ret;
+
+  ret = inflateInit(strm);
+
+  if(strm->msg != msgb4)
+    strm->msg = set_thread_string(LK_ZLIB_MSG, strm->msg);
+
+  return ret;
+}
+
+
+int
+Curl_os400_inflateInit2_(z_streamp strm, int windowBits,
+                                        const char * version, int stream_size)
+
+{
+  z_const char * msgb4 = strm->msg;
+  int ret;
+
+  ret = inflateInit2(strm, windowBits);
+
+  if(strm->msg != msgb4)
+    strm->msg = set_thread_string(LK_ZLIB_MSG, strm->msg);
+
+  return ret;
+}
+
+
+int
+Curl_os400_inflate(z_streamp strm, int flush)
+
+{
+  z_const char * msgb4 = strm->msg;
+  int ret;
+
+  ret = inflate(strm, flush);
+
+  if(strm->msg != msgb4)
+    strm->msg = set_thread_string(LK_ZLIB_MSG, strm->msg);
+
+  return ret;
+}
+
+
+int
+Curl_os400_inflateEnd(z_streamp strm)
+
+{
+  z_const char * msgb4 = strm->msg;
+  int ret;
+
+  ret = inflateEnd(strm);
+
+  if(strm->msg != msgb4)
+    strm->msg = set_thread_string(LK_ZLIB_MSG, strm->msg);
+
+  return ret;
+}
+
+#endif