+
+
+/*
+ * Create client side and server side connection structures, connected to
+ * one another, for the front end to use for searches on arbitrary back ends.
+ */
+
+int connection_internal_open( Connection **conn, LDAP **ldp, const char *id )
+{
+ int rc;
+ ber_socket_t fd[2] = {-1,-1};
+ Operation *op;
+
+ *conn=NULL;
+ *ldp=NULL;
+
+ rc = lutil_pair( fd );
+ if( rc == -1 ) {
+ return LDAP_OTHER;
+ }
+
+ rc = connection_init( fd[1], "INT", "localhost",
+ "localhost:0", "localhost:00", 0, 256, id );
+ if( rc < 0 ) {
+ tcp_close( fd[0] );
+ tcp_close( fd[1] );
+ return LDAP_OTHER;
+ }
+ slapd_add_internal( fd[1] );
+
+ /* A search operation, number 0 */
+ op = slap_op_alloc( NULL, 0, LDAP_REQ_SEARCH, 0);
+ op->o_ndn.bv_val = ch_strdup( id );
+ op->o_ndn.bv_len = strlen( id );
+ op->o_protocol = LDAP_VERSION3;
+
+ (*conn) = connection_get( fd[1] );
+ LDAP_STAILQ_INSERT_HEAD( &(*conn)->c_ops, op, o_next);
+ (*conn)->c_conn_state = SLAP_C_ACTIVE;
+
+ /* Create the client side of the connection */
+ rc = ldap_open_internal_connection( ldp, &(fd[0]) );
+ if( rc != LDAP_SUCCESS ) {
+ tcp_close( fd[0] );
+ return LDAP_OTHER;
+ }
+
+ /* The connection_get() will have locked the connection's mutex */
+ ldap_pvt_thread_mutex_unlock( &((*conn)->c_mutex) );
+
+ return LDAP_SUCCESS;
+}
+
+
+void connection_internal_close( Connection *conn )
+{
+ Operation *op = LDAP_STAILQ_FIRST(&conn->c_ops);
+
+ LDAP_STAILQ_REMOVE_HEAD(&conn->c_ops, o_next);
+ LDAP_STAILQ_NEXT(op, o_next) = NULL;
+ slap_op_free( op );
+ connection_closing( conn );
+ connection_close( conn );
+}