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

📄 apr_ldap_url.c

📁 apache的软件linux版本
💻 C
📖 第 1 页 / 共 2 页
字号:
     *     * On early Novell releases, search references/referrals were returned     * in this format, i.e., the dn was kind of in the scope position,     * but the required slash is missing. The whole thing is illegal syntax,     * but we need to account for it. Fortunately it can't be confused with     * anything real.     */    if( (p == NULL) && (q != NULL) && ((q = strchr( q, '?')) != NULL)) {        q++;        /* ? immediately followed by question */        if( *q == '?') {            q++;            if( *q != '\0' ) {                /* parse dn part */                ldap_pvt_hex_unescape( q );                ludp->lud_dn = LDAP_STRDUP( q );            } else {                ludp->lud_dn = LDAP_STRDUP( "" );            }            if( ludp->lud_dn == NULL ) {                LDAP_FREE( url );                apr_ldap_free_urldesc( ludp );                return LDAP_URL_ERR_MEM;            }        }    }    if( p == NULL ) {        LDAP_FREE( url );        *ludpp = ludp;        return LDAP_URL_SUCCESS;    }    /* scan forward for '?' that may marks end of dn */    q = strchr( p, '?' );    if( q != NULL ) {        /* terminate dn part */        *q++ = '\0';    }    if( *p != '\0' ) {        /* parse dn part */        ldap_pvt_hex_unescape( p );        ludp->lud_dn = LDAP_STRDUP( p );    } else {        ludp->lud_dn = LDAP_STRDUP( "" );    }    if( ludp->lud_dn == NULL ) {        LDAP_FREE( url );        apr_ldap_free_urldesc( ludp );        return LDAP_URL_ERR_MEM;    }    if( q == NULL ) {        /* no more */        LDAP_FREE( url );        *ludpp = ludp;        return LDAP_URL_SUCCESS;    }    /* scan forward for '?' that may marks end of attributes */    p = q;    q = strchr( p, '?' );    if( q != NULL ) {        /* terminate attributes part */        *q++ = '\0';    }    if( *p != '\0' ) {        /* parse attributes */        ldap_pvt_hex_unescape( p );        ludp->lud_attrs = ldap_str2charray( p, "," );        if( ludp->lud_attrs == NULL ) {            LDAP_FREE( url );            apr_ldap_free_urldesc( ludp );            return LDAP_URL_ERR_BADATTRS;        }    }    if ( q == NULL ) {        /* no more */        LDAP_FREE( url );        *ludpp = ludp;        return LDAP_URL_SUCCESS;    }    /* scan forward for '?' that may marks end of scope */    p = q;    q = strchr( p, '?' );    if( q != NULL ) {        /* terminate the scope part */        *q++ = '\0';    }    if( *p != '\0' ) {        /* parse the scope */        ldap_pvt_hex_unescape( p );        ludp->lud_scope = str2scope( p );        if( ludp->lud_scope == -1 ) {            LDAP_FREE( url );            apr_ldap_free_urldesc( ludp );            return LDAP_URL_ERR_BADSCOPE;        }    }    if ( q == NULL ) {        /* no more */        LDAP_FREE( url );        *ludpp = ludp;        return LDAP_URL_SUCCESS;    }    /* scan forward for '?' that may marks end of filter */    p = q;    q = strchr( p, '?' );    if( q != NULL ) {        /* terminate the filter part */        *q++ = '\0';    }    if( *p != '\0' ) {        /* parse the filter */        ldap_pvt_hex_unescape( p );        if( ! *p ) {            /* missing filter */            LDAP_FREE( url );            apr_ldap_free_urldesc( ludp );            return LDAP_URL_ERR_BADFILTER;        }        LDAP_FREE( ludp->lud_filter );        ludp->lud_filter = LDAP_STRDUP( p );        if( ludp->lud_filter == NULL ) {            LDAP_FREE( url );            apr_ldap_free_urldesc( ludp );            return LDAP_URL_ERR_MEM;        }    }    if ( q == NULL ) {        /* no more */        LDAP_FREE( url );        *ludpp = ludp;        return LDAP_URL_SUCCESS;    }    /* scan forward for '?' that may marks end of extensions */    p = q;    q = strchr( p, '?' );    if( q != NULL ) {        /* extra '?' */        LDAP_FREE( url );        apr_ldap_free_urldesc( ludp );        return LDAP_URL_ERR_BADURL;    }    /* parse the extensions */    ludp->lud_exts = ldap_str2charray( p, "," );    if( ludp->lud_exts == NULL ) {        LDAP_FREE( url );        apr_ldap_free_urldesc( ludp );        return LDAP_URL_ERR_BADEXTS;    }    for( i=0; ludp->lud_exts[i] != NULL; i++ ) {        ldap_pvt_hex_unescape( ludp->lud_exts[i] );        if( *ludp->lud_exts[i] == '!' ) {            /* count the number of critical extensions */            ludp->lud_crit_exts++;        }    }    if( i == 0 ) {        /* must have 1 or more */        LDAP_FREE( url );        apr_ldap_free_urldesc( ludp );        return LDAP_URL_ERR_BADEXTS;    }    /* no more */    *ludpp = ludp;    LDAP_FREE( url );    return LDAP_URL_SUCCESS;}APU_DECLARE(int) apr_ldap_url_parse(const char *url_in,                                     apr_ldap_url_desc_t **ludpp){    int rc = ldap_url_parse_ext( url_in, ludpp );    if( rc != LDAP_URL_SUCCESS ) {        return rc;    }    if ((*ludpp)->lud_scope == -1) {        (*ludpp)->lud_scope = LDAP_SCOPE_BASE;    }    if ((*ludpp)->lud_host != NULL && *(*ludpp)->lud_host == '\0') {        LDAP_FREE( (*ludpp)->lud_host );        (*ludpp)->lud_host = NULL;    }    return rc;}APU_DECLARE(void) apr_ldap_free_urldesc(apr_ldap_url_desc_t *ludp){    if ( ludp == NULL ) {        return;    }        if ( ludp->lud_scheme != NULL ) {        LDAP_FREE( ludp->lud_scheme );    }    if ( ludp->lud_host != NULL ) {        LDAP_FREE( ludp->lud_host );    }    if ( ludp->lud_dn != NULL ) {        LDAP_FREE( ludp->lud_dn );    }    if ( ludp->lud_filter != NULL ) {        LDAP_FREE( ludp->lud_filter);    }    if ( ludp->lud_attrs != NULL ) {        LDAP_VFREE( ludp->lud_attrs );    }    if ( ludp->lud_exts != NULL ) {        LDAP_VFREE( ludp->lud_exts );    }    LDAP_FREE( ludp );}static void ldap_pvt_hex_unescape(char *s){    /*     * Remove URL hex escapes from s... done in place.  The basic concept for     * this routine is borrowed from the WWW library HTUnEscape() routine.     */    char    *p;    for ( p = s; *s != '\0'; ++s ) {        if ( *s == '%' ) {            if ( *++s == '\0' ) {                break;            }            *p = ldap_pvt_unhex( *s ) << 4;            if ( *++s == '\0' ) {                break;            }            *p++ += ldap_pvt_unhex( *s );        } else {            *p++ = *s;        }    }    *p = '\0';}static int ldap_pvt_unhex(int c){    return( c >= '0' && c <= '9' ? c - '0'        : c >= 'A' && c <= 'F' ? c - 'A' + 10        : c - 'a' + 10 );}static void ldap_charray_free(char **a){    char    **p;    if ( a == NULL ) {        return;    }    for ( p = a; *p != NULL; p++ ) {        if ( *p != NULL ) {            LDAP_FREE( *p );        }    }    LDAP_FREE( (char *) a );}static char **ldap_str2charray(const char *str_in, const char *brkstr){    char    **res;    char    *str, *s;    char    *lasts;    int i;    /* protect the input string from strtok */    str = LDAP_STRDUP( str_in );    if( str == NULL ) {        return NULL;    }    i = 1;    for ( s = str; *s; s++ ) {        if ( ldap_utf8_strchr( brkstr, s ) != NULL ) {            i++;        }    }    res = (char **) LDAP_MALLOC( (i + 1) * sizeof(char *) );    if( res == NULL ) {        LDAP_FREE( str );        return NULL;    }    i = 0;    for ( s = ldap_utf8_strtok( str, brkstr, &lasts );        s != NULL;        s = ldap_utf8_strtok( NULL, brkstr, &lasts ) )    {        res[i] = LDAP_STRDUP( s );        if(res[i] == NULL) {            for( --i ; i >= 0 ; i-- ) {                LDAP_FREE( res[i] );            }            LDAP_FREE( res );            LDAP_FREE( str );            return NULL;        }        i++;    }    res[i] = NULL;    LDAP_FREE( str );    return( res );}#endif /* !APR_HAS_LDAP_URL_PARSE */#endif /* APR_HAS_LDAP */

⌨️ 快捷键说明

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