⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ncbi_service.c

📁 ncbi源码
💻 C
📖 第 1 页 / 共 2 页
字号:
        return;    SERV_Reset(iter);    if (iter->op && iter->op->Close)        (*iter->op->Close)(iter);    if (iter->skip)        free(iter->skip);    if (iter->service)        free((void*) iter->service);    free(iter);}int/*bool*/ SERV_Update(SERV_ITER iter, const char* text){    static const char used_server_info[] = "Used-Server-Info-";    int retval = 0/*not updated yet*/;    if (iter && iter->op && text) {        TNCBI_Time now = (TNCBI_Time) time(0);        const char *c, *b;        for (b = text; (c = strchr(b, '\n')) != 0; b = c + 1) {            size_t len = (size_t)(c - b);            SSERV_Info* info;            unsigned int d1;            char* p, *t;            int d2;            if (!(t = (char*) malloc(len + 1)))                continue;            memcpy(t, b, len);            if (t[len - 1] == '\r')                t[len - 1] = 0;            else                t[len] = 0;            p = t;            if (iter->op->Update && (*iter->op->Update)(iter, now, p))                retval = 1/*updated*/;            if (strncasecmp(p, used_server_info,                            sizeof(used_server_info) - 1) == 0) {                p += sizeof(used_server_info) - 1;                if (sscanf(p, "%u: %n", &d1, &d2) >= 1 &&                    (info = SERV_ReadInfo(p + d2)) != 0) {                    if (!s_AddSkipInfo(iter, info))                        free(info);                    else                        retval = 1/*updated*/;                }            }            free(t);        }    }    return retval;}char* SERV_Print(SERV_ITER iter){    static const char client_revision[] = "Client-Revision: %hu.%hu\r\n";    static const char accepted_types[] = "Accepted-Server-Types:";    char buffer[128], *str;    TSERV_Type type, t;    size_t buflen, i;    BUF buf = 0;    /* Put client version number */    buflen = sprintf(buffer, client_revision,                     SERV_CLIENT_REVISION_MAJOR, SERV_CLIENT_REVISION_MINOR);    assert(buflen < sizeof(buffer));    if (!BUF_Write(&buf, buffer, buflen)) {        BUF_Destroy(buf);        return 0;    }    if (iter) {        /* Form accepted server types */        buflen = sizeof(accepted_types) - 1;        memcpy(buffer, accepted_types, buflen);        type = (TSERV_Type) (iter->type & ~fSERV_StatelessOnly);        for (t = 1; t; t <<= 1) {            if (type & t) {                const char* name = SERV_TypeStr((ESERV_Type) t);                size_t namelen = strlen(name);                if (!namelen || buflen + 1 + namelen + 2 >= sizeof(buffer))                    break;                buffer[buflen++] = ' ';                strcpy(&buffer[buflen], name);                buflen += namelen;            }        }        if (buffer[buflen - 1] != ':') {            strcpy(&buffer[buflen], "\r\n");            assert(strlen(buffer) == buflen+2  &&  buflen+2 < sizeof(buffer));            if (!BUF_Write(&buf, buffer, buflen + 2)) {                BUF_Destroy(buf);                return 0;            }        }        /* Drop any outdated skip entries */        s_SkipSkip(iter);        /* Put all the rest into rejection list */        for (i = 0; i < iter->n_skip; i++) {            if (!(str = SERV_WriteInfo(iter->skip[i])))                break;            buflen = sprintf(buffer, "Skip-Info-%u: ", (unsigned) i + 1);             assert(buflen < sizeof(buffer)-1);            if (!BUF_Write(&buf, buffer, buflen) ||                !BUF_Write(&buf, str, strlen(str)) ||                !BUF_Write(&buf, "\r\n", 2)) {                free(str);                break;            }            free(str);        }        if (i < iter->n_skip) {            BUF_Destroy(buf);            return 0;        }    }    /* Ok then, we have filled the entire header, <CR><LF> terminated */    if ((buflen = BUF_Size(buf)) != 0) {        if ((str = (char*) malloc(buflen + 1)) != 0) {            if (BUF_Read(buf, str, buflen) != buflen) {                free(str);                str = 0;            } else                str[buflen] = '\0';        }    } else        str = 0;    BUF_Destroy(buf);    return str;}/* * Note parameters' ranges here: * 0.0 <= pref <= 1.0 * 0.0 <  gap  <= 1.0 * n >= 2 * Hence, the formula below always yields a value in the range [0.0 .. 1.0]. */double SERV_Preference(double pref, double gap, unsigned int n){    assert(0.0 <= pref && pref <= 1.0);    assert(0.0 <  gap  && gap  <= 1.0);    assert(n >= 2);    if (gap >= pref)        return gap;    else if (gap >= 0.75*(1.0/(double) n))        return pref;    else        return 2.5*gap*pref;}/* * -------------------------------------------------------------------------- * $Log: ncbi_service.c,v $ * Revision 1000.3  2004/06/01 18:45:22  gouriano * PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R6.52 * * Revision 6.52  2004/05/17 18:19:43  lavr * Mark skip infos with maximal time instead of calculating 1 year from now * * Revision 6.51  2004/03/23 02:28:21  lavr * Limit service name resolution recursion by 8 * * Revision 6.50  2004/01/30 14:37:26  lavr * Client revision made independent of CVS revisions * * Revision 6.49  2003/09/02 21:17:15  lavr * Clean up included headers * * Revision 6.48  2003/06/26 15:20:46  lavr * Additional parameter "external" in implementation of generic methods * * Revision 6.47  2003/06/09 19:53:01  lavr * +SERV_OpenP() * * Revision 6.46  2003/04/30 17:00:47  lavr * Name collision resolved * * Revision 6.45  2003/02/28 14:49:04  lavr * SERV_Preference(): redeclare last argument 'unsigned' * * Revision 6.44  2003/02/13 22:04:16  lavr * Document SERV_Preference() domain, change last argument, tweak formula * * Revision 6.43  2003/01/31 21:19:30  lavr * +SERV_GetInfoP(), preference measure for preferred host, SERV_Preference() * * Revision 6.42  2002/11/12 05:53:01  lavr * Fit a long line within 80 chars * * Revision 6.41  2002/10/28 20:16:00  lavr * Take advantage of host info API * * Revision 6.40  2002/10/28 15:43:49  lavr * Use "ncbi_ansi_ext.h" privately and use strncpy0() * * Revision 6.39  2002/10/11 19:48:10  lavr * +SERV_GetConfig() * const dropped in return value of SERV_ServiceName() * * Revision 6.38  2002/09/04 15:11:41  lavr * Log moved to end * * Revision 6.37  2002/05/06 19:16:50  lavr * +#include <stdio.h>, +SERV_ServiceName() - translation of service name * * Revision 6.36  2002/04/15 20:07:09  lavr * Use size_t for iterating over skip_info's * * Revision 6.35  2002/04/13 06:35:11  lavr * Fast track routine SERV_GetInfoEx(), many syscalls optimizations * * Revision 6.34  2002/03/22 19:51:28  lavr * Do not explicitly include <assert.h>: included from ncbi_core.h * * Revision 6.33  2002/03/11 21:59:32  lavr * 'Client version' changed into 'Client revision' * * Revision 6.32  2001/11/09 20:03:14  lavr * Minor fix to remove a trailing space in client version tag * * Revision 6.31  2001/10/01 19:52:38  lavr * Call update directly; do not remove time from server specs in SERV_Print() * * Revision 6.30  2001/09/29 19:33:04  lavr * BUGFIX: SERV_Update() requires VT bound (was not the case in constructor) * * Revision 6.29  2001/09/28 22:03:12  vakatov * Included missing <connect/ncbi_ansi_ext.h> * * Revision 6.28  2001/09/28 20:50:16  lavr * SERV_Update() modified to capture Used-Server-Info tags; * Update VT method changed - now called on per-line basis; * Few bugfixes related to keeping last info correct * * Revision 6.27  2001/09/24 20:28:48  lavr * +SERV_Reset(); SERV_Close() changed to utilize SERV_Reset() * * Revision 6.26  2001/09/10 21:19:48  lavr * SERV_Print():  Client version tag added * SERV_OpenEx(): Firewall type handling * * Revision 6.25  2001/08/20 21:58:19  lavr * Parameter change for clarity: info -> net_info if type is SConnNetInfo * * Revision 6.24  2001/06/25 15:35:54  lavr * Added function: SERV_GetNextInfoEx * * Revision 6.23  2001/06/20 17:27:49  kans * include <time.h> for Mac compiler * * Revision 6.22  2001/06/19 19:12:01  lavr * Type change: size_t -> TNCBI_Size; time_t -> TNCBI_Time * * Revision 6.21  2001/05/24 21:28:12  lavr * Timeout for skip servers increased to 1 year period * * Revision 6.20  2001/05/17 15:02:51  lavr * Typos corrected * * Revision 6.19  2001/04/24 21:37:26  lavr * New code for: SERV_MapperName() and SERV_Penalize(). * * Revision 6.18  2001/03/21 21:23:30  lavr * Explicit type conversion size_t -> unsigned in printf * * Revision 6.17  2001/03/20 22:03:32  lavr * BUGFIX in SERV_Print (miscalculation of buflen for accepted server types) * * Revision 6.16  2001/03/06 23:55:25  lavr * SOCK_gethostaddr -> SOCK_gethostbyname * * Revision 6.15  2001/03/05 23:10:29  lavr * SERV_WriteInfo takes only one argument now * * Revision 6.14  2001/03/02 20:09:51  lavr * Support added for SERV_LOCALHOST as preferred_host. * * Revision 6.13  2001/03/01 00:31:23  lavr * SERV_OpenSimple now builds SConnNetInfo to use both LBSMD and DISPD.CGI * * Revision 6.12  2001/02/09 17:33:06  lavr * Modified: fSERV_StatelessOnly overrides info->stateless * * Revision 6.11  2001/01/25 17:05:32  lavr * Bugfix in SERV_OpenEx: op was not inited to 0 * * Revision 6.10  2001/01/08 23:47:29  lavr * (unsigned char) conversion in isspace * * Revision 6.9  2001/01/08 22:38:34  lavr * Numerous patches to code after debugging * * Revision 6.8  2000/12/29 18:01:27  lavr * SERV_Print introduced; pool of skipped services now follows * expiration times of services and is updated on that basis. * * Revision 6.7  2000/12/06 22:20:30  lavr * Skip info list is not maintained forever; instead the entries get * deleted in accordance with their expiration period * * Revision 6.6  2000/10/20 17:19:04  lavr * SConnNetInfo made 'const' as a parameter to 'SERV_Open*' * 'SERV_Update' added as a private interface * * Revision 6.5  2000/10/05 22:36:21  lavr * Additional parameters in call to DISPD mapper * * Revision 6.4  2000/05/31 23:12:23  lavr * First try to assemble things together to get working service mapper * * Revision 6.3  2000/05/22 16:53:11  lavr * Rename service_info -> server_info everywhere (including * file names) as the latter name is more relevant * * Revision 6.2  2000/05/12 21:42:59  lavr * Cleaned up for the C++ compilation, etc. * * Revision 6.1  2000/05/12 18:50:20  lavr * First working revision * * ========================================================================== */

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -