X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=servers%2Fslapd%2Fback-tcl%2Ftcl_util.c;h=6fff035276788b91e66dc7d95a4be5e3b089c763;hb=592e05e3e1a64f03151eeb9284d48b7a26823242;hp=f7cddf0204d6339a3dc72ca4e5604853ae384fa1;hpb=4a8ab5dbf2ba037b0824d64bb3217ca06671884a;p=openldap diff --git a/servers/slapd/back-tcl/tcl_util.c b/servers/slapd/back-tcl/tcl_util.c index f7cddf0204..6fff035276 100644 --- a/servers/slapd/back-tcl/tcl_util.c +++ b/servers/slapd/back-tcl/tcl_util.c @@ -22,18 +22,14 @@ int interp_send_results ( - Backend * be, - Connection * conn, Operation * op, - char *result, - AttributeName *attrs, - int attrsonly + SlapReply * rs, + char *result ) { - int bsize, len, argcPtr, i, err, code; - char *buf, *bp, **argvPtr, *line, *matched, *info; - Entry *e; - struct tclinfo *ti = (struct tclinfo *) be->be_private; + int bsize, len, argcPtr, i, code; + char *buf, *bp, **argvPtr, *line; + struct tclinfo *ti = (struct tclinfo *) op->o_bd->be_private; /* * read in the result and send it along @@ -45,8 +41,8 @@ interp_send_results ( code = Tcl_SplitList (ti->ti_ii->interp, result, &argcPtr, &argvPtr); if (code != TCL_OK) { argcPtr = 0; - send_ldap_result (conn, op, LDAP_UNWILLING_TO_PERFORM, NULL, - "internal backend error", NULL, NULL ); + send_ldap_error (op, rs, LDAP_UNWILLING_TO_PERFORM, + "internal backend error" ); return -1; } for (i = 0; i < argcPtr; i++) { @@ -73,32 +69,32 @@ interp_send_results ( if (strncasecmp (buf, "RESULT", 6) == 0) { break; } - if ((e = str2entry (buf)) == NULL) { + if ((rs->sr_entry = str2entry (buf)) == NULL) { Debug (LDAP_DEBUG_SHELL, "str2entry(%s) failed\n", buf, 0, 0); } else { - send_search_entry (be, conn, op, e, attrs, - attrsonly, NULL ); - entry_free (e); + rs->sr_attrs = op->oq_search.rs_attrs; + send_search_entry (op, rs); + entry_free (rs->sr_entry); } bp = buf; } } - (void) str2result (buf, &err, &matched, &info); + (void) str2result (buf, &rs->sr_err, (char **)&rs->sr_matched, (char **)&rs->sr_text); /* * otherwise, front end will send this result */ - if (err != 0 || op->o_tag != LDAP_REQ_BIND) { - send_ldap_result (conn, op, err, matched, info, NULL, NULL ); + if (rs->sr_err != 0 || op->o_tag != LDAP_REQ_BIND) { + send_ldap_result (op, rs); } free (buf); Tcl_Free ((char *) argvPtr); - return (err); + return (rs->sr_err); } char * @@ -192,7 +188,7 @@ readtclscript ( struct berval * tcl_merge_bvlist( - struct berval **bvlist, struct berval *out) + BerVarray bvlist, struct berval *out) { struct berval *ret = NULL; int i; @@ -212,16 +208,22 @@ tcl_merge_bvlist( ret->bv_len = 0; ret->bv_val = NULL; - for (i = 0; bvlist[i] != NULL; i++); + for (i = 0; bvlist[i].bv_val != NULL; i++); if (i) { - char *strlist[i + 1]; - for (i = 0; bvlist[i] != NULL; i++) { - strlist[i] = bvlist[i]->bv_val; + char **strlist = ch_malloc ((i + 1) * sizeof(char *)); + if (strlist == NULL) { + if (out == NULL) + ch_free (ret); + return NULL; + } + for (i = 0; bvlist[i].bv_val != NULL; i++) { + strlist[i] = bvlist[i].bv_val; } strlist[i] = NULL; ret->bv_val = Tcl_Merge(i, strlist); ret->bv_len = ret->bv_val ? strlen(ret->bv_val) : 0; + ch_free (strlist); } return ret;