X-Git-Url: http://git.indexdata.com/?a=blobdiff_plain;f=comstack%2Fcomstack.c;h=b621522922b9953ae4780ad23fabf5b8462ac2bb;hb=30de094a4a567f7fada6d5932e23921770ac671c;hp=6a4cc05c8660d058b0a5895a41fb7225d0ad129a;hpb=8f2523329baf822bb1f71aaa262376551391553e;p=yaz-moved-to-github.git diff --git a/comstack/comstack.c b/comstack/comstack.c index 6a4cc05..b621522 100644 --- a/comstack/comstack.c +++ b/comstack/comstack.c @@ -1,44 +1,17 @@ /* - * Copyright (c) 1995-2001, Index Data + * Copyright (c) 1995-2003, Index Data * See the file LICENSE for details. * - * $Log: comstack.c,v $ - * Revision 1.8 2001-07-19 19:49:02 adam - * Added include of string.h. - * - * Revision 1.7 2001/03/21 12:43:36 adam - * Implemented cs_create_host. Better error reporting for SSL comstack. - * - * Revision 1.6 1999/11/30 13:47:11 adam - * Improved installation. Moved header files to include/yaz. - * - * Revision 1.5 1998/06/22 11:32:35 adam - * Added 'conditional cs_listen' feature. - * - * Revision 1.4 1997/09/29 07:16:14 adam - * Array cs_errlist no longer global. - * - * Revision 1.3 1997/09/01 08:49:14 adam - * New windows NT/95 port using MSV5.0. Minor changes only. - * - * Revision 1.2 1995/09/29 17:01:48 quinn - * More Windows work - * - * Revision 1.1 1995/06/14 09:58:20 quinn - * Renamed yazlib to comstack. - * - * Revision 1.2 1995/05/16 08:51:15 quinn - * License, documentation, and memory fixes - * - * Revision 1.1 1995/03/14 10:28:34 quinn - * Adding server-side support to tcpip.c and fixing bugs in nonblocking I/O - * - * + * $Id: comstack.c,v 1.13 2003-03-11 11:05:19 adam Exp $ */ #include +#include + #include #include +#include +#include static const char *cs_errlist[] = { @@ -63,8 +36,27 @@ const char *cs_strerror(COMSTACK h) return cs_errmsg(h->cerrno); } +void cs_get_host_args(const char *type_and_host, const char **args) +{ + + *args = ""; + if (*type_and_host && strncmp(type_and_host, "unix:", 5)) + { + const char *cp; + cp = strstr(type_and_host, "://"); + if (cp) + cp = cp+3; + else + cp = type_and_host; + cp = strchr(cp, '/'); + if (cp) + *args = cp+1; + } +} + COMSTACK cs_create_host(const char *type_and_host, int blocking, void **vp) { + enum oid_proto proto = PROTO_Z3950; const char *host = 0; COMSTACK cs; CS_TYPE t; @@ -83,13 +75,42 @@ COMSTACK cs_create_host(const char *type_and_host, int blocking, void **vp) return 0; #endif } + else if (strncmp (type_and_host, "unix:", 5) == 0) + { +#ifndef WIN32 + t = unix_type; + host = type_and_host + 5; +#else + return 0; +#endif + } + else if (strncmp(type_and_host, "http:", 5) == 0) + { + t = tcpip_type; + host = type_and_host + 5; + if (host[0] == '/' && host[1] == '/') + host = host + 2; + proto = PROTO_HTTP; + } + else if (strncmp(type_and_host, "https:", 6) == 0) + { +#if HAVE_OPENSSL_SSL_H + t = ssl_type; + host = type_and_host + 6; + if (host[0] == '/' && host[1] == '/') + host = host + 2; +#else + return 0; +#endif + proto = PROTO_HTTP; + } else { t = tcpip_type; host = type_and_host; - + } - cs = cs_create (t, blocking, PROTO_Z3950); + cs = cs_create (t, blocking, proto); if (!cs) return 0; @@ -100,3 +121,57 @@ COMSTACK cs_create_host(const char *type_and_host, int blocking, void **vp) } return cs; } + +int cs_look (COMSTACK cs) +{ + return cs->event; +} + +int cs_complete_auto(const unsigned char *buf, int len) +{ + if (!len) + return 0; + if (!buf[0] && !buf[1]) + return 0; + if (len > 5 && buf[0] >= 0x20 && buf[0] < 0x7f + && buf[1] >= 0x20 && buf[1] < 0x7f + && buf[2] >= 0x20 && buf[2] < 0x7f) + { + /* deal with HTTP request/response */ + int i = 2, content_len = 0; + + while (i <= len-4) + { + if (buf[i] == '\r' && buf[i+1] == '\n') + { + i += 2; + if (buf[i] == '\r' && buf[i+1] == '\n') + { + /* i += 2 seems not to work with GCC -O2 .. + so i+2 is used instead .. */ + if (len >= (i+2)+ content_len) + return (i+2)+ content_len; + break; + } + if (i < len-18) + { + if (!memcmp(buf+i, "Content-Length:", 15)) + { + i+= 15; + if (buf[i] == ' ') + i++; + content_len = 0; + while (i <= len-4 && isdigit(buf[i])) + content_len = content_len*10 + (buf[i++] - '0'); + if (content_len < 0) /* prevent negative offsets */ + content_len = 0; + } + } + } + else + i++; + } + return 0; + } + return completeBER(buf, len); +}