X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=servers%2Fslapd%2Fproto-slap.h;h=5c29a9cf75a0ec1e03e35e4c18328fdd1da0747d;hb=56bbc0b4860c716b4a21f98c2f0eba9a7a70b765;hp=b519ffb96707e22e626980f4bf87780bae210e32;hpb=637c0a83011fbe8ad6de6cff82ea65a495cae6f2;p=openldap diff --git a/servers/slapd/proto-slap.h b/servers/slapd/proto-slap.h index b519ffb967..5c29a9cf75 100644 --- a/servers/slapd/proto-slap.h +++ b/servers/slapd/proto-slap.h @@ -1,8 +1,14 @@ +/* + * Copyright 1998-1999 The OpenLDAP Foundation, All Rights Reserved. + * COPYING RESTRICTIONS APPLY, see COPYRIGHT file + */ #ifndef _PROTO_SLAP #define _PROTO_SLAP #include +LDAP_BEGIN_DECL + /* * acl.c */ @@ -11,11 +17,12 @@ int access_allowed LDAP_P(( Backend *be, Connection *conn, Operation *op, Entry *e, char *attr, struct berval *val, int access )); -struct acl * acl_get_applicable LDAP_P(( Backend *be, +AccessControl * acl_get_applicable LDAP_P(( Backend *be, Operation *op, Entry *e, char *attr, int nmatches, regmatch_t *matches )); -int acl_access_allowed LDAP_P(( struct acl *a, Backend *be, Connection *conn, Entry *e, +int acl_access_allowed LDAP_P(( + AccessControl *a, Backend *be, Connection *conn, Entry *e, struct berval *val, Operation *op, int access, char *edn, regmatch_t *matches )); @@ -38,6 +45,7 @@ int str2access LDAP_P(( char *str )); */ void attr_free LDAP_P(( Attribute *a )); +Attribute *attr_dup LDAP_P(( Attribute *a )); char * attr_normalize LDAP_P(( char *s )); int attr_merge_fast LDAP_P(( Entry *e, char *type, struct berval **vals, int nvals, int naddvals, int *maxvals, Attribute ***a )); @@ -46,6 +54,17 @@ Attribute * attr_find LDAP_P(( Attribute *a, char *type )); int attr_delete LDAP_P(( Attribute **attrs, char *type )); int attr_syntax LDAP_P(( char *type )); void attr_syntax_config LDAP_P(( char *fname, int lineno, int argc, char **argv )); +AttributeType * at_find LDAP_P(( const char *name )); +int at_find_in_list LDAP_P(( AttributeType *sat, AttributeType **list )); +int at_append_to_list LDAP_P(( AttributeType *sat, AttributeType ***listp )); +int at_delete_from_list LDAP_P(( int pos, AttributeType ***listp )); +int at_fake_if_needed LDAP_P(( char *name )); +int at_schema_info LDAP_P(( Entry *e )); +int at_add LDAP_P(( LDAP_ATTRIBUTE_TYPE *at, const char **err )); +char * at_canonical_name LDAP_P(( char * a_type )); + +void attrs_free LDAP_P(( Attribute *a )); +Attribute *attrs_dup LDAP_P(( Attribute *a )); /* * ava.c @@ -58,22 +77,53 @@ void ava_free LDAP_P(( Ava *ava, int freeit )); * backend.c */ -Backend * new_backend LDAP_P(( char *type )); -Backend * select_backend LDAP_P(( char * dn )); +int backend_init LDAP_P((void)); +int backend_add LDAP_P((BackendInfo *aBackendInfo)); +int backend_num LDAP_P((Backend *be)); +int backend_startup LDAP_P((Backend *be)); +int backend_shutdown LDAP_P((Backend *be)); +int backend_destroy LDAP_P((void)); + +BackendInfo * backend_info LDAP_P(( char *type )); +BackendDB * backend_db_init LDAP_P(( char *type )); + +BackendDB * select_backend LDAP_P(( char * dn )); + int be_issuffix LDAP_P(( Backend *be, char *suffix )); int be_isroot LDAP_P(( Backend *be, char *ndn )); int be_isroot_pw LDAP_P(( Backend *be, char *ndn, struct berval *cred )); char* be_root_dn LDAP_P(( Backend *be )); -void be_close LDAP_P(( void )); +int be_entry_release_rw LDAP_P(( Backend *be, Entry *e, int rw )); +#define be_entry_release_r( be, e ) be_entry_release_rw( be, e, 0 ) +#define be_entry_release_w( be, e ) be_entry_release_rw( be, e, 1 ) + + +extern int backend_unbind LDAP_P((Connection *conn, Operation *op)); + +extern int backend_connection_init LDAP_P((Connection *conn)); +extern int backend_connection_destroy LDAP_P((Connection *conn)); + +extern int backend_group LDAP_P((Backend *be, + Entry *target, + char *gr_ndn, char *op_ndn, + char *objectclassValue, char *groupattrName)); + +#ifdef SLAPD_SCHEMA_DN +/* temporary extern for temporary routine*/ +extern Attribute *backend_subschemasubentry( Backend * ); +#endif + /* * ch_malloc.c */ -void * ch_malloc LDAP_P(( unsigned long size )); -void * ch_realloc LDAP_P(( void *block, unsigned long size )); -void * ch_calloc LDAP_P(( unsigned long nelem, unsigned long size )); +void * ch_malloc LDAP_P(( ber_len_t size )); +void * ch_realloc LDAP_P(( void *block, ber_len_t size )); +void * ch_calloc LDAP_P(( ber_len_t nelem, ber_len_t size )); char * ch_strdup LDAP_P(( const char *string )); +void ch_free LDAP_P(( void * )); +#define free ch_free /* * charray.c @@ -85,18 +135,52 @@ void charray_free LDAP_P(( char **array )); int charray_inlist LDAP_P(( char **a, char *s )); char ** charray_dup LDAP_P(( char **a )); char ** str2charray LDAP_P(( char *str, char *brkstr )); +char * charray2str LDAP_P(( char **a )); + +/* + * controls.c + */ +int get_ctrls LDAP_P(( + Connection *co, + Operation *op, + int senderrors )); + +int get_manageDSAit LDAP_P(( Operation *op )); /* * config.c */ -void read_config LDAP_P(( char *fname, Backend **bep, FILE *pfp )); +int read_config LDAP_P(( char *fname )); /* * connection.c */ +int connections_init LDAP_P((void)); +int connections_shutdown LDAP_P((void)); +int connections_destroy LDAP_P((void)); +int connections_timeout_idle LDAP_P((time_t)); + +long connection_init LDAP_P(( + ber_socket_t s, + const char* url, + const char* dnsname, + const char* peername, + const char* sockname, + int use_tls )); -void connection_activity LDAP_P(( Connection *conn )); +void connection_closing LDAP_P(( Connection *c )); +int connection_state_closing LDAP_P(( Connection *c )); +char *connection_state2str LDAP_P(( int state )); + +int connection_write LDAP_P((ber_socket_t s)); +int connection_read LDAP_P((ber_socket_t s)); + +unsigned long connections_nextid(void); + +Connection* connection_first LDAP_P((ber_socket_t *)); +Connection* connection_next LDAP_P((Connection *, ber_socket_t *)); +void connection_done LDAP_P((Connection *)); /* * dn.c @@ -105,25 +189,30 @@ void connection_activity LDAP_P(( Connection *conn )); char * dn_normalize LDAP_P(( char *dn )); char * dn_normalize_case LDAP_P(( char *dn )); char * dn_parent LDAP_P(( Backend *be, char *dn )); +char ** dn_subtree LDAP_P(( Backend *be, char *dn )); +char * dn_rdn LDAP_P(( Backend *be, char *dn )); int dn_issuffix LDAP_P(( char *dn, char *suffix )); +#ifdef DNS_DN int dn_type LDAP_P(( char *dn )); -char * dn_upcase LDAP_P(( char *dn )); - +#endif +char * str2upper LDAP_P(( char *str )); +char * str2lower LDAP_P(( char *str )); +int rdn_validate LDAP_P(( const char* str )); +char * rdn_attr_value LDAP_P(( char * rdn )); +char * rdn_attr_type LDAP_P(( char * rdn )); +void build_new_dn LDAP_P(( char ** new_dn, char *e_dn, char * p_dn, + char * newrdn )); /* * entry.c */ Entry * str2entry LDAP_P(( char *s )); -char * entry2str LDAP_P(( Entry *e, int *len, int printid )); +char * entry2str LDAP_P(( Entry *e, int *len )); void entry_free LDAP_P(( Entry *e )); -int entry_rdwr_lock LDAP_P(( Entry *e, int rw )); -int entry_rdwr_rlock LDAP_P(( Entry *e )); -int entry_rdwr_wlock LDAP_P(( Entry *e )); -int entry_rdwr_unlock LDAP_P(( Entry *e, int rw )); -int entry_rdwr_runlock LDAP_P(( Entry *e )); -int entry_rdwr_wunlock LDAP_P(( Entry *e )); -int entry_rdwr_init LDAP_P(( Entry *e )); +int entry_cmp LDAP_P(( Entry *a, Entry *b )); +int entry_dn_cmp LDAP_P(( Entry *a, Entry *b )); +int entry_id_cmp LDAP_P(( Entry *a, Entry *b )); /* * filter.c @@ -147,21 +236,38 @@ int test_filter LDAP_P(( Backend *be, Connection *conn, Operation *op, Entry *e, FILE * lock_fopen LDAP_P(( char *fname, char *type, FILE **lfp )); int lock_fclose LDAP_P(( FILE *fp, FILE *lfp )); +/* + * module.c + */ + +#ifdef SLAPD_MODULES +int load_module LDAP_P(( const char* file_name, int argc, char *argv[] )); +#endif /* SLAPD_MODULES */ + /* * monitor.c */ +extern char *supportedExtensions[]; +extern char *supportedControls[]; -void monitor_info LDAP_P(( Connection *conn, Operation *op )); +void monitor_info LDAP_P(( + Connection *conn, + Operation *op, + char ** attrs, + int attrsonly )); /* * operation.c */ void slap_op_free LDAP_P(( Operation *op )); -Operation * slap_op_add LDAP_P(( Operation **olist, - BerElement *ber, unsigned long msgid, - unsigned long tag, char *dn, int id, int connid )); -void slap_op_delete LDAP_P(( Operation **olist, Operation *op )); +Operation * slap_op_alloc LDAP_P(( + BerElement *ber, ber_int_t msgid, + ber_tag_t tag, ber_int_t id )); + +int slap_op_add LDAP_P(( Operation **olist, Operation *op )); +int slap_op_remove LDAP_P(( Operation **olist, Operation *op )); +Operation * slap_op_pop LDAP_P(( Operation **olist )); /* * phonetic.c @@ -176,36 +282,96 @@ char * phonetic LDAP_P(( char *s )); * repl.c */ -void replog LDAP_P(( Backend *be, int optype, char *dn, void *change, int flag )); +void replog LDAP_P(( Backend *be, Operation *op, char *dn, void *change )); /* * result.c */ -void send_ldap_result LDAP_P(( Connection *conn, Operation *op, int err, char *matched, - char *text )); -void send_ldap_search_result LDAP_P(( Connection *conn, Operation *op, int err, - char *matched, char *text, int nentries )); -void close_connection LDAP_P(( Connection *conn, int opconnid, int opid )); +struct berval **get_entry_referrals LDAP_P(( + Backend *be, Connection *conn, Operation *op, + Entry *e )); + +void send_ldap_result LDAP_P(( + Connection *conn, Operation *op, + int err, char *matched, char *text, + struct berval **refs, + LDAPControl **ctrls )); + +void send_ldap_disconnect LDAP_P(( + Connection *conn, Operation *op, + int err, char *text )); + +void send_search_result LDAP_P(( + Connection *conn, Operation *op, + int err, char *matched, char *text, + struct berval **refs, + LDAPControl **ctrls, + int nentries )); + +int send_search_reference LDAP_P(( + Backend *be, Connection *conn, Operation *op, + Entry *e, struct berval **refs, int scope, + LDAPControl **ctrls, + struct berval ***v2refs )); + +int send_search_entry LDAP_P(( + Backend *be, Connection *conn, Operation *op, + Entry *e, char **attrs, int attrsonly, + LDAPControl **ctrls )); + +int str2result LDAP_P(( char *s, + int *code, char **matched, char **info )); + +/* + * sasl.c + */ +extern char **supportedSASLMechanisms; + +int sasl_init(void); +int sasl_destroy(void); /* * schema.c */ int oc_schema_check LDAP_P(( Entry *e )); +int oc_check_operational_attr LDAP_P(( char *type )); +int oc_check_usermod_attr LDAP_P(( char *type )); +int oc_check_no_usermod_attr LDAP_P(( char *type )); +ObjectClass *oc_find LDAP_P((const char *ocname)); +int oc_add LDAP_P((LDAP_OBJECT_CLASS *oc, const char **err)); +Syntax *syn_find LDAP_P((const char *synname)); +int syn_add LDAP_P((LDAP_SYNTAX *syn, slap_syntax_check_func *check, const char **err)); +MatchingRule *mr_find LDAP_P((const char *mrname)); +int mr_add LDAP_P((LDAP_MATCHING_RULE *mr, slap_mr_normalize_func *normalize, slap_mr_compare_func *compare, const char **err)); +void schema_info LDAP_P((Connection *conn, Operation *op, char **attrs, int attrsonly)); +int schema_init LDAP_P((void)); + +int is_entry_objectclass LDAP_P(( Entry *, char* objectclass )); +#define is_entry_alias(e) is_entry_objectclass((e), "ALIAS") +#define is_entry_referral(e) is_entry_objectclass((e), "REFERRAL") + /* * schemaparse.c */ -void parse_oc LDAP_P(( Backend *be, char *fname, int lineno, int argc, char **argv )); - +void parse_oc_old LDAP_P(( Backend *be, char *fname, int lineno, int argc, char **argv )); +void parse_oc LDAP_P(( char *fname, int lineno, char *line )); +void parse_at LDAP_P(( char *fname, int lineno, char *line )); +char *scherr2str LDAP_P((int code)); /* * str2filter.c */ Filter * str2filter LDAP_P(( char *str )); +/* + * suffixalias.c + */ +char *suffix_alias LDAP_P(( Backend *be, char *ndn )); + /* * value.c */ @@ -220,136 +386,109 @@ int value_find LDAP_P(( struct berval **vals, struct berval *v, int syntax, int normalize )); /* - * suffixAlias.c + * user.c */ -char *suffixAlias LDAP_P(( char *dn, Operation *op, Backend *be )); +#if defined(HAVE_PWD_H) && defined(HAVE_GRP_H) +void slap_init_user LDAP_P(( char *username, char *groupname )); +#endif /* * Other... */ -extern char **g_argv; -extern char *default_referral; +extern struct berval **default_referral; extern char *replogfile; -extern char Versionstr[]; +extern const char Versionstr[]; extern int active_threads; extern int defsize; extern int deftime; extern int g_argc; extern int global_default_access; extern int global_lastmod; +extern int global_idletimeout; extern int global_schemacheck; +extern char *global_realm; extern int lber_debug; extern int ldap_syslog; -extern int num_conns; + +extern ldap_pvt_thread_mutex_t num_sent_mutex; extern long num_bytes_sent; +extern long num_pdu_sent; extern long num_entries_sent; -extern long ops_completed; -extern long ops_initiated; - -extern pthread_mutex_t active_threads_mutex; -extern pthread_cond_t active_threads_cond; - -extern pthread_mutex_t currenttime_mutex; -extern pthread_mutex_t entry2str_mutex; -extern pthread_mutex_t new_conn_mutex; -extern pthread_mutex_t num_sent_mutex; -extern pthread_mutex_t ops_mutex; -extern pthread_mutex_t replog_mutex; +extern long num_refs_sent; + +extern ldap_pvt_thread_mutex_t num_ops_mutex; +extern long num_ops_completed; +extern long num_ops_initiated; + +extern char *slapd_pid_file; +extern char *slapd_args_file; +extern char **g_argv; +extern time_t starttime; + +time_t slap_get_time LDAP_P((void)); + +extern ldap_pvt_thread_mutex_t active_threads_mutex; +extern ldap_pvt_thread_cond_t active_threads_cond; + +extern ldap_pvt_thread_mutex_t entry2str_mutex; +extern ldap_pvt_thread_mutex_t replog_mutex; + #ifdef SLAPD_CRYPT -extern pthread_mutex_t crypt_mutex; +extern ldap_pvt_thread_mutex_t crypt_mutex; #endif -extern pthread_t listener_tid; -extern struct acl *global_acl; -extern struct objclass *global_oc; -extern time_t currenttime; +extern ldap_pvt_thread_mutex_t gmtime_mutex; -extern int be_group LDAP_P((Backend *be, Entry *target, - char *gr_ndn, char *op_ndn, - char *objectclassValue, char *groupattrName)); -extern void init LDAP_P((void)); -extern void be_unbind LDAP_P((Connection *conn, Operation *op)); -extern void config_info LDAP_P((Connection *conn, Operation *op)); -extern void do_abandon LDAP_P((Connection *conn, Operation *op)); -extern void do_add LDAP_P((Connection *conn, Operation *op)); -extern void do_bind LDAP_P((Connection *conn, Operation *op)); -extern void do_compare LDAP_P((Connection *conn, Operation *op)); -extern void do_delete LDAP_P((Connection *conn, Operation *op)); -extern void do_modify LDAP_P((Connection *conn, Operation *op)); -extern void do_modrdn LDAP_P((Connection *conn, Operation *op)); -extern void do_search LDAP_P((Connection *conn, Operation *op)); -extern void do_unbind LDAP_P((Connection *conn, Operation *op)); -extern void * slapd_daemon LDAP_P((void *port)); - -extern int nbackends; -extern Backend *backends; -extern int send_search_entry LDAP_P((Backend *be, Connection *conn, Operation *op, Entry *e, char **attrs, int attrsonly)); -extern int str2result LDAP_P(( char *s, int *code, char **matched, char **info )); - -#if defined( SLAPD_MONITOR_DN ) -extern Connection *c; -extern int dtblsize; -extern time_t starttime; -#endif +extern AccessControl *global_acl; -#ifdef SLAPD_LDBM -extern int ldbm_back_bind LDAP_P((Backend *be, - Connection *c, Operation *o, - char *dn, int method, struct berval *cred, char** edn )); -extern void ldbm_back_unbind LDAP_P((Backend *be, Connection *c, Operation *o )); -extern int ldbm_back_search LDAP_P((Backend *be, Connection *c, Operation *o, char *base, int scope, int deref, int slimit, int tlimit, Filter *f, char *filterstr, char **attrs, int attrsonly)); -extern int ldbm_back_compare LDAP_P((Backend *be, Connection *c, Operation *o, char *dn, Ava *ava)); -extern int ldbm_back_modify LDAP_P((Backend *be, Connection *c, Operation *o, char *dn, LDAPModList *ml)); -extern int ldbm_back_modrdn LDAP_P((Backend *be, Connection *c, Operation *o, char *dn, char *newrdn, int deleteoldrdn )); -extern int ldbm_back_add LDAP_P((Backend *be, Connection *c, Operation *o, Entry *e)); -extern int ldbm_back_delete LDAP_P((Backend *be, Connection *c, Operation *o, char *dn)); -extern void ldbm_back_abandon LDAP_P((Backend *be, Connection *c, Operation *o, int msgid)); -extern void ldbm_back_config LDAP_P((Backend *be, char *fname, int lineno, int argc, char **argv )); -extern void ldbm_back_init LDAP_P((Backend *be)); -extern void ldbm_back_close LDAP_P((Backend *be)); -extern int ldbm_back_group LDAP_P((Backend *be, Entry *target, - char *gr_ndn, char *op_ndn, - char *objectclassValue, char *groupattrName )); -#endif +int slap_init LDAP_P((int mode, char* name)); +int slap_startup LDAP_P(( Backend *be )); +int slap_shutdown LDAP_P(( Backend *be )); +int slap_destroy LDAP_P((void)); -#ifdef SLAPD_PASSWD -extern int passwd_back_search LDAP_P((Backend *be, Connection *c, Operation *o, char *base, int scope, int deref, int slimit, int tlimit, Filter *f, char *filterstr, char **attrs, int attrsonly)); -extern void passwd_back_config LDAP_P((Backend *be, char *fname, int lineno, int argc, char **argv )); -#endif +struct sockaddr_in; -#ifdef SLAPD_SHELL -extern int shell_back_bind LDAP_P((Backend *be, - Connection *c, Operation *o, - char *dn, int method, struct berval *cred, char** edn )); -extern void shell_back_unbind LDAP_P((Backend *be, Connection *c, Operation *o )); -extern int shell_back_search LDAP_P((Backend *be, Connection *c, Operation *o, char *base, int scope, int deref, int slimit, int tlimit, Filter *f, char *filterstr, char **attrs, int attrsonly)); -extern int shell_back_compare LDAP_P((Backend *be, Connection *c, Operation *o, char *dn, Ava *ava)); -extern int shell_back_modify LDAP_P((Backend *be, Connection *c, Operation *o, char *dn, LDAPModList *m)); -extern int shell_back_modrdn LDAP_P((Backend *be, Connection *c, Operation *o, char *dn, char *newrdn, int deleteoldrdn )); -extern int shell_back_add LDAP_P((Backend *be, Connection *c, Operation *o, Entry *e)); -extern int shell_back_delete LDAP_P((Backend *be, Connection *c, Operation *o, char *dn)); -extern void shell_back_abandon LDAP_P((Backend *be, Connection *c, Operation *o, int msgid)); -extern void shell_back_config LDAP_P((Backend *be, char *fname, int lineno, int argc, char **argv )); -extern void shell_back_init LDAP_P((Backend *be)); -#endif +extern int slapd_daemon_init( char *urls, int port, int tls_port ); +extern int slapd_daemon_destroy(void); +extern int slapd_daemon(void); -#ifdef SLAPD_PERL -extern int perl_back_bind LDAP_P(( Backend *be, - Connection *conn, Operation *op, - char *dn, int method, struct berval *cred, char** edn )); -extern void perl_back_unbind LDAP_P(( Backend *be, Connection *conn, Operation *op )); -extern int perl_back_search LDAP_P(( Backend *be, Connection *conn, Operation *op, char *base, int scope, int deref, int sizelimit, int timelimit, Filter *filter, char *filterstr, char **attrs, int attrsonly )); -extern int perl_back_compare LDAP_P((Backend *be, Connection *conn, Operation *op, char *dn, Ava *ava )); -extern int perl_back_modify LDAP_P(( Backend *be, Connection *conn, Operation *op, char *dn, LDAPModList *ml )); -extern int perl_back_modrdn LDAP_P(( Backend *be, Connection *conn, Operation *op, char *dn, char*newrdn, int deleteoldrdn )); -extern int perl_back_add LDAP_P(( Backend *be, Connection *conn, Operation *op, Entry *e )); -extern int perl_back_delete LDAP_P(( Backend *be, Connection *conn, Operation *op, char *dn )); -/* extern int perl_back_abandon(); */ -extern void perl_back_config LDAP_P(( Backend *be, char *fname, int lineno, int argc, char **argv )); -extern void perl_back_init LDAP_P(( Backend *be )); -extern void perl_back_close LDAP_P(( Backend *be )); -/* extern int perl_back_group(); */ -#endif +extern void slapd_set_write LDAP_P((ber_socket_t s, int wake)); +extern void slapd_clr_write LDAP_P((ber_socket_t s, int wake)); +extern void slapd_set_read LDAP_P((ber_socket_t s, int wake)); +extern void slapd_clr_read LDAP_P((ber_socket_t s, int wake)); + +extern void slapd_remove LDAP_P((ber_socket_t s, int wake)); + +extern void slap_set_shutdown LDAP_P((int sig)); +extern void slap_do_nothing LDAP_P((int sig)); + +extern void config_info LDAP_P(( + Connection *conn, + Operation *op, + char ** attrs, + int attrsonly )); + +extern void root_dse_info LDAP_P(( + Connection *conn, + Operation *op, + char ** attrs, + int attrsonly )); + +extern int do_abandon LDAP_P((Connection *conn, Operation *op)); +extern int do_add LDAP_P((Connection *conn, Operation *op)); +extern int do_bind LDAP_P((Connection *conn, Operation *op)); +extern int do_compare LDAP_P((Connection *conn, Operation *op)); +extern int do_delete LDAP_P((Connection *conn, Operation *op)); +extern int do_modify LDAP_P((Connection *conn, Operation *op)); +extern int do_modrdn LDAP_P((Connection *conn, Operation *op)); +extern int do_search LDAP_P((Connection *conn, Operation *op)); +extern int do_unbind LDAP_P((Connection *conn, Operation *op)); +extern int do_extended LDAP_P((Connection *conn, Operation *op)); + + +extern ber_socket_t dtblsize; + +LDAP_END_DECL #endif /* _proto_slap */