]> git.sur5r.net Git - openldap/blobdiff - servers/slapd/result.c
Per ITS#419, don't require SLAPD_RLOOKUPS when HAVE_TCPD
[openldap] / servers / slapd / result.c
index a0a503b8b5e9866bbd8ab7d5b4f89f14fe998733..cd7c59e59807c5af68ff6a8a84de0e0139a776d2 100644 (file)
@@ -50,6 +50,8 @@ static char *v2ref( struct berval **ref, const char *text )
                v2[len-1] = '\n';
                memcpy(&v2[len], ref[i]->bv_val, ref[i]->bv_len );
                len += ref[i]->bv_len;
+               if (ref[i]->bv_val[ref[i]->bv_len-1] != '/')
+                       ++len;
        }
 
        v2[len-1] = '\0';
@@ -242,6 +244,7 @@ send_ldap_response(
        struct berval   **ref,
        const char      *resoid,
        struct berval   *resdata,
+       struct berval   *sasldata,
        LDAPControl **ctrls
 )
 {
@@ -277,13 +280,19 @@ send_ldap_response(
                        rc = ber_printf( ber, "{V}", ref );
                }
 
+               if( rc != -1 && sasldata != NULL ) {
+                       rc = ber_printf( ber, "tO",
+                               LDAP_TAG_SASL_RES_CREDS, sasldata );
+               }
+
                if( rc != -1 && resoid != NULL ) {
-                       rc = ber_printf( ber, "s", resoid );
+                       rc = ber_printf( ber, "ts",
+                               LDAP_TAG_EXOP_RES_OID, resoid );
                }
 
                if( rc != -1 && resdata != NULL ) {
-                       rc = ber_printf( ber, "O", resdata );
-
+                       rc = ber_printf( ber, "tO",
+                               LDAP_TAG_EXOP_RES_VALUE, resdata );
                }
 
                if( rc != -1 ) {
@@ -360,9 +369,10 @@ send_ldap_disconnect(
                    0 );
        }
 #endif
+
        send_ldap_response( conn, op, tag, msgid,
                err, NULL, text, NULL,
-               reqoid, NULL, NULL );
+               reqoid, NULL, NULL, NULL );
 
        Statslog( LDAP_DEBUG_STATS,
            "conn=%ld op=%ld DISCONNECT err=%ld tag=%lu text=%s\n",
@@ -428,7 +438,7 @@ send_ldap_result(
 
        send_ldap_response( conn, op, tag, msgid,
                err, matched, text, ref,
-               NULL, NULL, ctrls );
+               NULL, NULL, NULL, ctrls );
 
        Statslog( LDAP_DEBUG_STATS,
            "conn=%ld op=%ld RESULT tag=%lu err=%ld text=%s\n",
@@ -440,6 +450,84 @@ send_ldap_result(
        }
 }
 
+void
+send_ldap_sasl(
+    Connection *conn,
+    Operation  *op,
+    ber_int_t  err,
+    const char *matched,
+    const char *text,
+       struct berval **ref,
+       LDAPControl **ctrls,
+       struct berval *cred
+)
+{
+       ber_tag_t tag;
+       ber_int_t msgid;
+
+       Debug( LDAP_DEBUG_TRACE, "send_ldap_sasl %ld\n",
+               (long) err, NULL, NULL );
+
+       tag = req2res( op->o_tag );
+       msgid = (tag != LBER_SEQUENCE) ? op->o_msgid : 0;
+
+#ifdef LDAP_CONNECTIONLESS
+       if ( op->o_cldap ) {
+               ber_pvt_sb_udp_set_dst( conn->c_sb, &op->o_clientaddr );
+               Debug( LDAP_DEBUG_TRACE, "UDP response to %s port %d\n", 
+                   inet_ntoa(((struct sockaddr_in *)
+                   &op->o_clientaddr)->sin_addr ),
+                   ((struct sockaddr_in *) &op->o_clientaddr)->sin_port,
+                   0 );
+       }
+#endif
+
+       send_ldap_response( conn, op, tag, msgid,
+               err, matched, text, ref,
+               NULL, NULL, cred, ctrls  );
+}
+
+void
+send_ldap_extended(
+    Connection *conn,
+    Operation  *op,
+    ber_int_t  err,
+    const char *matched,
+    const char *text,
+    struct berval **refs,
+    char               *rspoid,
+       struct berval *rspdata,
+       LDAPControl **ctrls
+)
+{
+       ber_tag_t tag;
+       ber_int_t msgid;
+
+       Debug( LDAP_DEBUG_TRACE,
+               "send_ldap_extended %ld:%s (%ld)\n",
+               (long) err,
+               rspoid ? rspoid : "",
+               rspdata != NULL ? (long) rspdata->bv_len : (long) 0 );
+
+       tag = req2res( op->o_tag );
+       msgid = (tag != LBER_SEQUENCE) ? op->o_msgid : 0;
+
+#ifdef LDAP_CONNECTIONLESS
+       if ( op->o_cldap ) {
+               ber_pvt_sb_udp_set_dst( conn->c_sb, &op->o_clientaddr );
+               Debug( LDAP_DEBUG_TRACE, "UDP response to %s port %d\n", 
+                   inet_ntoa(((struct sockaddr_in *)
+                   &op->o_clientaddr)->sin_addr ),
+                   ((struct sockaddr_in *) &op->o_clientaddr)->sin_port,
+                   0 );
+       }
+#endif
+
+       send_ldap_response( conn, op, tag, msgid,
+               err, matched, text, refs,
+               rspoid, rspdata, NULL, ctrls );
+}
+
 
 void
 send_search_result(
@@ -500,7 +588,7 @@ send_search_result(
 
        send_ldap_response( conn, op, tag, msgid,
                err, matched, text, refs,
-               NULL, NULL, ctrls );
+               NULL, NULL, NULL, ctrls );
 
        Statslog( LDAP_DEBUG_STATS,
            "conn=%ld op=%ld SEARCH RESULT tag=%lu err=%ld text=%s\n",
@@ -797,7 +885,7 @@ send_search_reference(
 
        if( op->o_protocol < LDAP_VERSION3 ) {
                /* save the references for the result */
-               if( *refs == NULL ) {
+               if( *refs != NULL ) {
                        value_add( v2refs, refs );
                }
                return 0;