int perl_back_add( Backend *be, Connection *conn, Operation *op, Entry *e ) { int len; int count; int return_code; PerlBackend *perl_back = (PerlBackend *) be->be_private; ldap_pvt_thread_mutex_lock( &perl_interpreter_mutex ); ldap_pvt_thread_mutex_lock( &entry2str_mutex ); { dSP; ENTER; SAVETMPS; PUSHMARK(sp); XPUSHs( perl_back->pb_obj_ref ); XPUSHs(sv_2mortal(newSVpv( entry2str( e, &len ), 0 ))); PUTBACK; #ifdef PERL_IS_5_6 count = call_method("add", G_SCALAR); #else count = perl_call_method("add", G_SCALAR); #endif SPAGAIN; if (count != 1) { croak("Big trouble in back_add\n"); } return_code = POPi; PUTBACK; FREETMPS; LEAVE; } ldap_pvt_thread_mutex_unlock( &entry2str_mutex ); ldap_pvt_thread_mutex_unlock( &perl_interpreter_mutex ); send_ldap_result( conn, op, return_code, NULL, NULL, NULL, NULL ); Debug( LDAP_DEBUG_ANY, "Perl ADD\n", 0, 0, 0 ); return( 0 ); }
int perl_back_add( Operation *op, SlapReply *rs ) { PerlBackend *perl_back = (PerlBackend *) op->o_bd->be_private; int len; int count; #if defined(HAVE_WIN32_ASPERL) || defined(USE_ITHREADS) PERL_SET_CONTEXT( PERL_INTERPRETER ); #endif ldap_pvt_thread_mutex_lock( &perl_interpreter_mutex ); ldap_pvt_thread_mutex_lock( &entry2str_mutex ); { dSP; ENTER; SAVETMPS; PUSHMARK(sp); XPUSHs( perl_back->pb_obj_ref ); XPUSHs(sv_2mortal(newSVpv( entry2str( op->ora_e, &len ), 0 ))); PUTBACK; #ifdef PERL_IS_5_6 count = call_method("add", G_SCALAR); #else count = perl_call_method("add", G_SCALAR); #endif SPAGAIN; if (count != 1) { croak("Big trouble in back_add\n"); } rs->sr_err = POPi; PUTBACK; FREETMPS; LEAVE; } ldap_pvt_thread_mutex_unlock( &entry2str_mutex ); ldap_pvt_thread_mutex_unlock( &perl_interpreter_mutex ); send_ldap_result( op, rs ); Debug( LDAP_DEBUG_ANY, "Perl ADD\n", 0, 0, 0 ); return( 0 ); }
int shell_back_add( Operation *op, SlapReply *rs ) { struct shellinfo *si = (struct shellinfo *) op->o_bd->be_private; AttributeDescription *entry = slap_schema.si_ad_entry; FILE *rfp, *wfp; int len; if ( si->si_add == NULL ) { send_ldap_error( op, rs, LDAP_UNWILLING_TO_PERFORM, "add not implemented" ); return( -1 ); } if ( ! access_allowed( op, op->oq_add.rs_e, entry, NULL, ACL_WADD, NULL ) ) { send_ldap_error( op, rs, LDAP_INSUFFICIENT_ACCESS, NULL ); return -1; } if ( forkandexec( si->si_add, &rfp, &wfp ) == (pid_t)-1 ) { send_ldap_error( op, rs, LDAP_OTHER, "could not fork/exec" ); return( -1 ); } /* write out the request to the add process */ fprintf( wfp, "ADD\n" ); fprintf( wfp, "msgid: %ld\n", (long) op->o_msgid ); print_suffixes( wfp, op->o_bd ); ldap_pvt_thread_mutex_lock( &entry2str_mutex ); fprintf( wfp, "%s", entry2str( op->oq_add.rs_e, &len ) ); ldap_pvt_thread_mutex_unlock( &entry2str_mutex ); fclose( wfp ); /* read in the result and send it along */ read_and_send_results( op, rs, rfp ); fclose( rfp ); return( 0 ); }
static int sock_over_response( Operation *op, SlapReply *rs ) { slap_overinst *on = (slap_overinst *)op->o_bd->bd_info; struct sockinfo *si = (struct sockinfo *)on->on_bi.bi_private; FILE *fp; if ( rs->sr_type == REP_RESULT ) { if ( !( si->si_resps & SOCK_REP_RESULT )) return SLAP_CB_CONTINUE; } else if ( rs->sr_type == REP_SEARCH ) { if ( !( si->si_resps & SOCK_REP_SEARCH )) return SLAP_CB_CONTINUE; } else return SLAP_CB_CONTINUE; if (( fp = opensock( si->si_sockpath )) == NULL ) return SLAP_CB_CONTINUE; if ( rs->sr_type == REP_RESULT ) { /* write out the result */ fprintf( fp, "RESULT\n" ); fprintf( fp, "msgid: %ld\n", (long) op->o_msgid ); sock_print_conn( fp, op->o_conn, si ); fprintf( fp, "code: %d\n", rs->sr_err ); if ( rs->sr_matched ) fprintf( fp, "matched: %s\n", rs->sr_matched ); if (rs->sr_text ) fprintf( fp, "info: %s\n", rs->sr_text ); } else { /* write out the search entry */ int len; fprintf( fp, "ENTRY\n" ); fprintf( fp, "msgid: %ld\n", (long) op->o_msgid ); sock_print_conn( fp, op->o_conn, si ); ldap_pvt_thread_mutex_lock( &entry2str_mutex ); fprintf( fp, "%s", entry2str( rs->sr_entry, &len ) ); ldap_pvt_thread_mutex_unlock( &entry2str_mutex ); } fprintf( fp, "\n" ); fclose( fp ); return SLAP_CB_CONTINUE; }
int sock_back_add( Operation *op, SlapReply *rs ) { struct sockinfo *si = (struct sockinfo *) op->o_bd->be_private; AttributeDescription *entry = slap_schema.si_ad_entry; FILE *fp; int len; if ( ! access_allowed( op, op->oq_add.rs_e, entry, NULL, ACL_WADD, NULL ) ) { send_ldap_error( op, rs, LDAP_INSUFFICIENT_ACCESS, NULL ); return -1; } if ( (fp = opensock( si->si_sockpath )) == NULL ) { send_ldap_error( op, rs, LDAP_OTHER, "could not open socket" ); return( -1 ); } /* write out the request to the add process */ fprintf( fp, "ADD\n" ); fprintf( fp, "msgid: %ld\n", (long) op->o_msgid ); sock_print_conn( fp, op->o_conn, si ); sock_print_suffixes( fp, op->o_bd ); ldap_pvt_thread_mutex_lock( &entry2str_mutex ); fprintf( fp, "%s", entry2str( op->oq_add.rs_e, &len ) ); ldap_pvt_thread_mutex_unlock( &entry2str_mutex ); fprintf (fp, "\n" ); /* read in the result and send it along */ sock_read_and_send_results( op, rs, fp ); fclose( fp ); return( 0 ); }
int slapcat( int argc, char **argv ) { ID id; int rc = EXIT_SUCCESS; Operation op = {0}; const char *progname = "slapcat"; int requestBSF; int doBSF = 0; slap_tool_init( progname, SLAPCAT, argc, argv ); requestBSF = ( sub_ndn.bv_len || filter ); #ifdef SIGPIPE (void) SIGNAL( SIGPIPE, slapcat_sig ); #endif #ifdef SIGHUP (void) SIGNAL( SIGHUP, slapcat_sig ); #endif (void) SIGNAL( SIGINT, slapcat_sig ); (void) SIGNAL( SIGTERM, slapcat_sig ); if( !be->be_entry_open || !be->be_entry_close || !( be->be_entry_first_x || be->be_entry_first ) || !be->be_entry_next || !be->be_entry_get ) { fprintf( stderr, "%s: database doesn't support necessary operations.\n", progname ); exit( EXIT_FAILURE ); } if( be->be_entry_open( be, 0 ) != 0 ) { fprintf( stderr, "%s: could not open database.\n", progname ); exit( EXIT_FAILURE ); } op.o_bd = be; if ( !requestBSF && be->be_entry_first ) { id = be->be_entry_first( be ); } else { if ( be->be_entry_first_x ) { id = be->be_entry_first_x( be, sub_ndn.bv_len ? &sub_ndn : NULL, scope, filter ); } else { assert( be->be_entry_first != NULL ); doBSF = 1; id = be->be_entry_first( be ); } } for ( ; id != NOID; id = be->be_entry_next( be ) ) { char *data; int len; Entry* e; if ( gotsig ) break; e = be->be_entry_get( be, id ); if ( e == NULL ) { printf("# no data for entry id=%08lx\n\n", (long) id ); rc = EXIT_FAILURE; if ( continuemode == 0 ) { break; } else if ( continuemode == 1 ) { continue; } /* this is a last resort: linearly scan all ids * trying to recover as much as possible (ITS#6482) */ while ( ++id != NOID ) { e = be->be_entry_get( be, id ); if ( e != NULL ) break; printf("# no data for entry id=%08lx\n\n", (long) id ); } if ( e == NULL ) break; } if ( doBSF ) { if ( sub_ndn.bv_len && !dnIsSuffixScope( &e->e_nname, &sub_ndn, scope ) ) { be_entry_release_r( &op, e ); continue; } if ( filter != NULL ) { int rc = test_filter( NULL, e, filter ); if ( rc != LDAP_COMPARE_TRUE ) { be_entry_release_r( &op, e ); continue; } } } if ( verbose ) { printf( "# id=%08lx\n", (long) id ); } data = entry2str( e, &len ); be_entry_release_r( &op, e ); if ( data == NULL ) { printf("# bad data for entry id=%08lx\n\n", (long) id ); rc = EXIT_FAILURE; if( continuemode ) continue; break; } if ( fputs( data, ldiffp->fp ) == EOF || fputs( "\n", ldiffp->fp ) == EOF ) { fprintf(stderr, "%s: error writing output.\n", progname); rc = EXIT_FAILURE; break; } } be->be_entry_close( be ); if ( slap_tool_destroy()) rc = EXIT_FAILURE; return rc; }
int main( int argc, char **argv ) { ID id; int rc = EXIT_SUCCESS; slap_tool_init( "slapcat", SLAPCAT, argc, argv ); if( !be->be_entry_open || !be->be_entry_close || !be->be_entry_first || !be->be_entry_next || !be->be_entry_get ) { fprintf( stderr, "%s: database doesn't support necessary operations.\n", progname ); exit( EXIT_FAILURE ); } if( be->be_entry_open( be, 0 ) != 0 ) { fprintf( stderr, "%s: could not open database.\n", progname ); exit( EXIT_FAILURE ); } for ( id = be->be_entry_first( be ); id != NOID; id = be->be_entry_next( be ) ) { char *data; int len; Entry* e = be->be_entry_get( be, id ); if( verbose ) { printf( "# id=%08lx\n", (long) id ); } if ( e == NULL ) { printf("# no data for entry id=%08lx\n\n", (long) id ); rc = EXIT_FAILURE; if( continuemode ) continue; break; } data = entry2str( e, &len ); be_entry_release_r( be, 0L, 0L, e ); if ( data == NULL ) { printf("# bad data for entry id=%08lx\n\n", (long) id ); rc = EXIT_FAILURE; if( continuemode ) continue; break; } fputs( data, ldiffp ); fputs( "\n", ldiffp ); } be->be_entry_close( be ); slap_tool_destroy(); return rc; }
int id2entry_add( Backend *be, Entry *e ) { DBCache *db; Datum key, data; int len, rc, flags; #ifndef WORDS_BIGENDIAN ID id; #endif ldbm_datum_init( key ); ldbm_datum_init( data ); #ifdef NEW_LOGGING LDAP_LOG( INDEX, ENTRY, "id2entry_add: (%s)%ld\n", e->e_dn, e->e_id, 0 ); #else Debug( LDAP_DEBUG_TRACE, "=> id2entry_add( %ld, \"%s\" )\n", e->e_id, e->e_dn, 0 ); #endif if ( (db = ldbm_cache_open( be, "id2entry", LDBM_SUFFIX, LDBM_WRCREAT )) == NULL ) { #ifdef NEW_LOGGING LDAP_LOG( INDEX, ERR, "id2entry_add: could not open/create id2entry%s\n", LDBM_SUFFIX, 0,0 ); #else Debug( LDAP_DEBUG_ANY, "Could not open/create id2entry%s\n", LDBM_SUFFIX, 0, 0 ); #endif return( -1 ); } #ifdef WORDS_BIGENDIAN key.dptr = (char *) &e->e_id; #else id = htonl(e->e_id); key.dptr = (char *) &id; #endif key.dsize = sizeof(ID); ldap_pvt_thread_mutex_lock( &entry2str_mutex ); data.dptr = entry2str( e, &len ); data.dsize = len + 1; /* store it */ flags = LDBM_REPLACE; rc = ldbm_cache_store( db, key, data, flags ); ldap_pvt_thread_mutex_unlock( &entry2str_mutex ); ldbm_cache_close( be, db ); #ifdef NEW_LOGGING LDAP_LOG( INDEX, ENTRY, "id2entry_add: return %d\n", rc, 0, 0 ); #else Debug( LDAP_DEBUG_TRACE, "<= id2entry_add %d\n", rc, 0, 0 ); #endif return( rc ); }