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

📄 retcode.c

📁 ldap服务器源码
💻 C
📖 第 1 页 / 共 3 页
字号:
				{					char		*next;					if ( rdi.rdi_sleeptime != 0 ) {						fprintf( stderr, "%s: line %d: retcode: "							"\"sleeptime\" already provided.\n",							fname, lineno );						return 1;					}					rdi.rdi_sleeptime = strtol( &argv[ i ][ STRLENOF( "sleeptime=" ) ], &next, 10 );					if ( next == argv[ i ] || next[ 0 ] != '\0' ) {						fprintf( stderr, "%s: line %d: retcode: "							"unable to parse \"sleeptime=%s\".\n",							fname, lineno, &argv[ i ][ STRLENOF( "sleeptime=" ) ] );						return 1;					}				} else {					fprintf( stderr, "%s: line %d: retcode: "						"unknown option \"%s\".\n",							fname, lineno, argv[ i ] );					return 1;				}			}		}		for ( rdip = &rd->rd_item; *rdip; rdip = &(*rdip)->rdi_next )			/* go to last */ ;				*rdip = ( retcode_item_t * )ch_malloc( sizeof( retcode_item_t ) );		*(*rdip) = rdi;	} else if ( strcasecmp( argv0, "indir" ) == 0 ) {		rd->rd_flags |= RETCODE_FINDIR;	} else if ( strcasecmp( argv0, "sleep" ) == 0 ) {		switch ( argc ) {		case 1:			fprintf( stderr, "%s: line %d: retcode: "				"\"retcode-sleep <time>\": missing <time>\n",				fname, lineno );			return 1;		case 2:			break;		default:			fprintf( stderr, "%s: line %d: retcode: "				"\"retcode-sleep <time>\": extra cruft after <time>\n",				fname, lineno );			return 1;		}		if ( lutil_atoi( &rd->rd_sleep, argv[ 1 ] ) != 0 ) {			fprintf( stderr, "%s: line %d: retcode: "				"\"retcode-sleep <time>\": unable to parse <time>\n",				fname, lineno );			return 1;		}	} else {		return SLAP_CONF_UNKNOWN;	}	return 0;}static intretcode_db_open( BackendDB *be ){	slap_overinst	*on = (slap_overinst *)be->bd_info;	retcode_t	*rd = (retcode_t *)on->on_bi.bi_private;	retcode_item_t	*rdi;	for ( rdi = rd->rd_item; rdi; rdi = rdi->rdi_next ) {		LDAPRDN			rdn = NULL;		int			rc, j;		char*			p;		struct berval		val[ 3 ];		char			buf[ SLAP_TEXT_BUFLEN ];		/* DN */		rdi->rdi_e.e_name = rdi->rdi_dn;		rdi->rdi_e.e_nname = rdi->rdi_ndn;		/* objectClass */		val[ 0 ] = oc_errObject->soc_cname;		val[ 1 ] = slap_schema.si_oc_extensibleObject->soc_cname;		BER_BVZERO( &val[ 2 ] );		attr_merge( &rdi->rdi_e, slap_schema.si_ad_objectClass, val, NULL );		/* RDN avas */		rc = ldap_bv2rdn( &rdi->rdi_dn, &rdn, (char **) &p,				LDAP_DN_FORMAT_LDAP );		assert( rc == LDAP_SUCCESS );		for ( j = 0; rdn[ j ]; j++ ) {			LDAPAVA			*ava = rdn[ j ];			AttributeDescription	*ad = NULL;			const char		*text;			rc = slap_bv2ad( &ava->la_attr, &ad, &text );			assert( rc == LDAP_SUCCESS );						attr_merge_normalize_one( &rdi->rdi_e, ad,					&ava->la_value, NULL );		}		ldap_rdnfree( rdn );		/* error code */		snprintf( buf, sizeof( buf ), "%d", rdi->rdi_err );		ber_str2bv( buf, 0, 0, &val[ 0 ] );		attr_merge_one( &rdi->rdi_e, ad_errCode, &val[ 0 ], NULL );		if ( rdi->rdi_ref != NULL ) {			attr_merge_normalize( &rdi->rdi_e, slap_schema.si_ad_ref,				rdi->rdi_ref, NULL );		}		/* text */		if ( !BER_BVISNULL( &rdi->rdi_text ) ) {			val[ 0 ] = rdi->rdi_text;			attr_merge_normalize_one( &rdi->rdi_e, ad_errText, &val[ 0 ], NULL );		}		/* matched */		if ( !BER_BVISNULL( &rdi->rdi_matched ) ) {			val[ 0 ] = rdi->rdi_matched;			attr_merge_normalize_one( &rdi->rdi_e, ad_errMatchedDN, &val[ 0 ], NULL );		}		/* sleep time */		if ( rdi->rdi_sleeptime > 0 ) {			snprintf( buf, sizeof( buf ), "%d", rdi->rdi_sleeptime );			ber_str2bv( buf, 0, 0, &val[ 0 ] );			attr_merge_one( &rdi->rdi_e, ad_errSleepTime, &val[ 0 ], NULL );		}		/* operations */		if ( rdi->rdi_mask & SN_DG_OP_ADD ) {			BER_BVSTR( &val[ 0 ], "add" );			attr_merge_normalize_one( &rdi->rdi_e, ad_errOp, &val[ 0 ], NULL );		}		if ( rdi->rdi_mask & SN_DG_OP_BIND ) {			BER_BVSTR( &val[ 0 ], "bind" );			attr_merge_normalize_one( &rdi->rdi_e, ad_errOp, &val[ 0 ], NULL );		}		if ( rdi->rdi_mask & SN_DG_OP_COMPARE ) {			BER_BVSTR( &val[ 0 ], "compare" );			attr_merge_normalize_one( &rdi->rdi_e, ad_errOp, &val[ 0 ], NULL );		}		if ( rdi->rdi_mask & SN_DG_OP_DELETE ) {			BER_BVSTR( &val[ 0 ], "delete" );			attr_merge_normalize_one( &rdi->rdi_e, ad_errOp, &val[ 0 ], NULL );		}		if ( rdi->rdi_mask & SN_DG_EXTENDED ) {			BER_BVSTR( &val[ 0 ], "extended" );			attr_merge_normalize_one( &rdi->rdi_e, ad_errOp, &val[ 0 ], NULL );		}		if ( rdi->rdi_mask & SN_DG_OP_MODIFY ) {			BER_BVSTR( &val[ 0 ], "modify" );			attr_merge_normalize_one( &rdi->rdi_e, ad_errOp, &val[ 0 ], NULL );		}		if ( rdi->rdi_mask & SN_DG_OP_RENAME ) {			BER_BVSTR( &val[ 0 ], "rename" );			attr_merge_normalize_one( &rdi->rdi_e, ad_errOp, &val[ 0 ], NULL );		}		if ( rdi->rdi_mask & SN_DG_OP_SEARCH ) {			BER_BVSTR( &val[ 0 ], "search" );			attr_merge_normalize_one( &rdi->rdi_e, ad_errOp, &val[ 0 ], NULL );		}	}	return 0;}static intretcode_db_destroy( BackendDB *be ){	slap_overinst	*on = (slap_overinst *)be->bd_info;	retcode_t	*rd = (retcode_t *)on->on_bi.bi_private;	if ( rd ) {		retcode_item_t	*rdi, *next;		for ( rdi = rd->rd_item; rdi != NULL; rdi = next ) {			ber_memfree( rdi->rdi_dn.bv_val );			ber_memfree( rdi->rdi_ndn.bv_val );			if ( !BER_BVISNULL( &rdi->rdi_text ) ) {				ber_memfree( rdi->rdi_text.bv_val );			}			if ( !BER_BVISNULL( &rdi->rdi_matched ) ) {				ber_memfree( rdi->rdi_matched.bv_val );			}			if ( rdi->rdi_ref ) {				ber_bvarray_free( rdi->rdi_ref );			}			BER_BVZERO( &rdi->rdi_e.e_name );			BER_BVZERO( &rdi->rdi_e.e_nname );			entry_clean( &rdi->rdi_e );			next = rdi->rdi_next;			ch_free( rdi );		}		if ( !BER_BVISNULL( &rd->rd_pdn ) ) {			ber_memfree( rd->rd_pdn.bv_val );		}		if ( !BER_BVISNULL( &rd->rd_npdn ) ) {			ber_memfree( rd->rd_npdn.bv_val );		}		ber_memfree( rd );	}	return 0;}#if SLAPD_OVER_RETCODE == SLAPD_MOD_DYNAMICstatic#endif /* SLAPD_OVER_RETCODE == SLAPD_MOD_DYNAMIC */intretcode_initialize( void ){	int		i, code;	const char	*err;	static struct {		char			*name;		char			*desc;		AttributeDescription	**ad;	} retcode_at[] = {	        { "errCode", "( 1.3.6.1.4.1.4203.666.11.4.1.1 "		        "NAME ( 'errCode' ) "		        "DESC 'LDAP error code' "		        "EQUALITY integerMatch "		        "ORDERING integerOrderingMatch "		        "SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 "			"SINGLE-VALUE )",			&ad_errCode },		{ "errOp", "( 1.3.6.1.4.1.4203.666.11.4.1.2 "			"NAME ( 'errOp' ) "			"DESC 'Operations the errObject applies to' "			"EQUALITY caseIgnoreMatch "			"SUBSTR caseIgnoreSubstringsMatch "			"SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )",			&ad_errOp},		{ "errText", "( 1.3.6.1.4.1.4203.666.11.4.1.3 "			"NAME ( 'errText' ) "			"DESC 'LDAP error textual description' "			"EQUALITY caseIgnoreMatch "			"SUBSTR caseIgnoreSubstringsMatch "			"SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 "			"SINGLE-VALUE )",			&ad_errText },		{ "errSleepTime", "( 1.3.6.1.4.1.4203.666.11.4.1.4 "			"NAME ( 'errSleepTime' ) "			"DESC 'Time to wait before returning the error' "			"EQUALITY integerMatch "			"SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 "			"SINGLE-VALUE )",			&ad_errSleepTime },		{ "errMatchedDN", "( 1.3.6.1.4.1.4203.666.11.4.1.5 "			"NAME ( 'errMatchedDN' ) "			"DESC 'Value to be returned as matched DN' "			"EQUALITY distinguishedNameMatch "			"SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 "			"SINGLE-VALUE )",			&ad_errMatchedDN },		{ NULL }	};	static struct {		char		*name;		char		*desc;		ObjectClass	**oc;	} retcode_oc[] = {		{ "errAbsObject", "( 1.3.6.1.4.1.4203.666.11.4.3.0 "			"NAME ( 'errAbsObject' ) "			"SUP top ABSTRACT "			"MUST ( errCode ) "			"MAY ( "				"cn "				"$ description "				"$ errOp "				"$ errText "				"$ errSleepTime "				"$ errMatchedDN "			") )",			&oc_errAbsObject },		{ "errObject", "( 1.3.6.1.4.1.4203.666.11.4.3.1 "			"NAME ( 'errObject' ) "			"SUP errAbsObject STRUCTURAL "			")",			&oc_errObject },		{ "errAuxObject", "( 1.3.6.1.4.1.4203.666.11.4.3.2 "			"NAME ( 'errAuxObject' ) "			"SUP errAbsObject AUXILIARY "			")",			&oc_errAuxObject },		{ NULL }	};	for ( i = 0; retcode_at[ i ].name != NULL; i++ ) {		LDAPAttributeType	*at;		at = ldap_str2attributetype( retcode_at[ i ].desc,			&code, &err, LDAP_SCHEMA_ALLOW_ALL );		if ( !at ) {			fprintf( stderr, "retcode: "				"AttributeType load failed: %s %s\n",				ldap_scherr2str( code ), err );			return code;		}#if LDAP_VENDOR_VERSION_MINOR == X || LDAP_VENDOR_VERSION_MINOR > 2		code = at_add( at, 0, NULL, &err );#else		code = at_add( at, &err );#endif		ldap_memfree( at );		if ( code != LDAP_SUCCESS ) {			fprintf( stderr, "retcode: "				"AttributeType load failed: %s %s\n",				scherr2str( code ), err );			return code;		}		code = slap_str2ad( retcode_at[ i ].name,				retcode_at[ i ].ad, &err );		if ( code != LDAP_SUCCESS ) {			fprintf( stderr, "retcode: unable to find "				"AttributeDescription \"%s\": %d (%s)\n",				retcode_at[ i ].name, code, err );			return 1;		}	}	for ( i = 0; retcode_oc[ i ].name != NULL; i++ ) {		LDAPObjectClass *oc;		oc = ldap_str2objectclass( retcode_oc[ i ].desc,				&code, &err, LDAP_SCHEMA_ALLOW_ALL );		if ( !oc ) {			fprintf( stderr, "retcode: "				"ObjectClass load failed: %s %s\n",				ldap_scherr2str( code ), err );			return code;		}#if LDAP_VENDOR_VERSION_MINOR == X || LDAP_VENDOR_VERSION_MINOR > 2		code = oc_add( oc, 0, NULL, &err );#else		code = oc_add( oc, &err );#endif		ldap_memfree(oc);		if ( code != LDAP_SUCCESS ) {			fprintf( stderr, "retcode: "				"ObjectClass load failed: %s %s\n",				scherr2str( code ), err );			return code;		}		*retcode_oc[ i ].oc = oc_find( retcode_oc[ i ].name );		if ( *retcode_oc[ i ].oc == NULL ) {			fprintf( stderr, "retcode: unable to find "				"objectClass \"%s\"\n",				retcode_oc[ i ].name );			return 1;		}	}	retcode.on_bi.bi_type = "retcode";	retcode.on_bi.bi_db_init = retcode_db_init;	retcode.on_bi.bi_db_config = retcode_db_config;	retcode.on_bi.bi_db_open = retcode_db_open;	retcode.on_bi.bi_db_destroy = retcode_db_destroy;	retcode.on_bi.bi_op_add = retcode_op_func;	retcode.on_bi.bi_op_bind = retcode_op_func;	retcode.on_bi.bi_op_compare = retcode_op_func;	retcode.on_bi.bi_op_delete = retcode_op_func;	retcode.on_bi.bi_op_modify = retcode_op_func;	retcode.on_bi.bi_op_modrdn = retcode_op_func;	retcode.on_bi.bi_op_search = retcode_op_func;	retcode.on_bi.bi_extended = retcode_op_func;	retcode.on_response = retcode_response;	return overlay_register( &retcode );}#if SLAPD_OVER_RETCODE == SLAPD_MOD_DYNAMICintinit_module( int argc, char *argv[] ){	return retcode_initialize();}#endif /* SLAPD_OVER_RETCODE == SLAPD_MOD_DYNAMIC */#endif /* SLAPD_OVER_RETCODE */

⌨️ 快捷键说明

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