* Removed uneeded cvs keywords

* Fixed unfree'd 'char *results' in all tcl_* functions (only unfree'd in
  certain cases, moved the free to the actual function) so no more mem
  leaks. Tested this with over 500,000 access's for testing :)
* Miscellaneous source style and tabulation fixes
This commit is contained in:
Ben Collins 1999-02-18 02:18:39 +00:00
parent ac4cb22f1c
commit 8667671d17
17 changed files with 506 additions and 508 deletions

View file

@ -2,5 +2,3 @@
* Add a version, callable from the tcl script for checking features
* don't expand tabs for spaces...

View file

@ -1,4 +1,5 @@
/*
/* $Id$
*
* Copyright 1999, Ben Collins <bcollins@debian.org>, All rights reserved.
*
* Redistribution and use in source and binary forms are permitted only

View file

@ -1,59 +1,56 @@
/*
* $Id: external.h,v 1.3 1999/02/16 23:26:05 bcollins Exp $
*/
/* $Id: external.h,v 1.4 1999/02/17 00:55:03 bcollins Exp $ */
#ifndef _TCL_EXTERNAL_H
#define _TCL_EXTERNAL_H
LDAP_BEGIN_DECL
extern int tcl_back_initialize LDAP_P(( BackendInfo *bi ));
extern int tcl_back_open LDAP_P(( BackendInfo *bi ));
extern int tcl_back_close LDAP_P(( BackendInfo *bi ));
extern int tcl_back_destroy LDAP_P(( BackendInfo *bi ));
extern int tcl_back_initialize LDAP_P ((BackendInfo * bi));
extern int tcl_back_open LDAP_P ((BackendInfo * bi));
extern int tcl_back_close LDAP_P ((BackendInfo * bi));
extern int tcl_back_destroy LDAP_P ((BackendInfo * bi));
extern int tcl_back_db_init LDAP_P(( BackendDB *bd ));
extern int tcl_back_db_open LDAP_P(( BackendDB *bd ));
extern int tcl_back_db_close LDAP_P(( BackendDB *bd ));
extern int tcl_back_db_destroy LDAP_P(( BackendDB *bd ));
extern int tcl_back_db_init LDAP_P ((BackendDB * bd));
extern int tcl_back_db_open LDAP_P ((BackendDB * bd));
extern int tcl_back_db_close LDAP_P ((BackendDB * bd));
extern int tcl_back_db_destroy LDAP_P ((BackendDB * bd));
extern int tcl_back_db_config LDAP_P(( BackendDB *bd,
char *fname, int lineno, int argc, char **argv ));
extern int tcl_back_db_config LDAP_P ((BackendDB * bd,
char *fname, int lineno, int argc, char **argv));
extern int tcl_back_bind LDAP_P(( BackendDB *bd,
Connection *conn, Operation *op,
char *dn, int method, struct berval *cred, char** edn ));
extern int tcl_back_bind LDAP_P ((BackendDB * bd,
Connection * conn, Operation * op,
char *dn, int method, struct berval * cred, char **edn));
extern int tcl_back_unbind LDAP_P(( BackendDB *bd,
Connection *conn, Operation *op ));
extern int tcl_back_unbind LDAP_P ((BackendDB * bd,
Connection * conn, Operation * op));
extern int tcl_back_search LDAP_P(( BackendDB *bd,
Connection *conn, Operation *op,
char *base, int scope, int deref, int sizelimit, int timelimit,
Filter *filter, char *filterstr, char **attrs, int attrsonly ));
extern int tcl_back_search LDAP_P ((BackendDB * bd,
Connection * conn, Operation * op,
char *base, int scope, int deref, int sizelimit, int timelimit,
Filter * filter, char *filterstr, char **attrs, int attrsonly));
extern int tcl_back_compare LDAP_P((BackendDB *bd,
Connection *conn, Operation *op,
char *dn, Ava *ava ));
extern int tcl_back_compare LDAP_P ((BackendDB * bd,
Connection * conn, Operation * op,
char *dn, Ava * ava));
extern int tcl_back_modify LDAP_P(( BackendDB *bd,
Connection *conn, Operation *op,
char *dn, LDAPModList *ml ));
extern int tcl_back_modify LDAP_P ((BackendDB * bd,
Connection * conn, Operation * op,
char *dn, LDAPModList * ml));
extern int tcl_back_modrdn LDAP_P(( BackendDB *bd,
Connection *conn, Operation *op,
char *dn, char*newrdn, int deleteoldrdn ));
extern int tcl_back_modrdn LDAP_P ((BackendDB * bd,
Connection * conn, Operation * op,
char *dn, char *newrdn, int deleteoldrdn));
extern int tcl_back_add LDAP_P(( BackendDB *bd,
Connection *conn, Operation *op, Entry *e ));
extern int tcl_back_add LDAP_P ((BackendDB * bd,
Connection * conn, Operation * op, Entry * e));
extern int tcl_back_delete LDAP_P(( BackendDB *bd,
Connection *conn, Operation *op, char *dn ));
extern int tcl_back_delete LDAP_P ((BackendDB * bd,
Connection * conn, Operation * op, char *dn));
extern int tcl_back_abandon LDAP_P(( BackendDB *bd,
Connection *conn, Operation *op, int msgid ));
extern int tcl_back_abandon LDAP_P ((BackendDB * bd,
Connection * conn, Operation * op, int msgid));
LDAP_END_DECL
#endif /* _TCL_EXTERNAL_H */

View file

@ -1,5 +1,6 @@
/*
* abandon.c - tcl abandon routine
/* abandon.c - tcl abandon routine
*
* $Id: tcl_abandon.c,v 1.2 1999/02/16 23:32:49 bcollins Exp $
*
* Copyright 1999, Ben Collins <bcollins@debian.org>, All rights reserved.
*
@ -7,10 +8,6 @@
* as authorized by the OpenLDAP Public License. A copy of this
* license is available at http://www.OpenLDAP.org/license.html or
* in file LICENSE in the top-level directory of the distribution.
*
* $Id$
*
* $Log$
*/
#include "portable.h"
@ -20,11 +17,12 @@
#include "slap.h"
#include "tcl_back.h"
int tcl_back_abandon (
Backend *be,
Connection *conn,
Operation *op,
int msgid
int
tcl_back_abandon (
Backend * be,
Connection * conn,
Operation * op,
int msgid
)
{
char *suf_tcl, *results, *command;
@ -32,27 +30,30 @@ int tcl_back_abandon (
struct tclinfo *ti = (struct tclinfo *) be->be_private;
if (ti->ti_abandon == NULL) {
return;
return (-1);
}
for ( i = 0; be->be_suffix[i] != NULL; i++ )
;
suf_tcl = Tcl_Merge(i, be->be_suffix);
for (i = 0; be->be_suffix[i] != NULL; i++);
suf_tcl = Tcl_Merge (i, be->be_suffix);
command = (char *) ch_malloc (strlen(ti->ti_abandon) + strlen(suf_tcl)
command = (char *) ch_malloc (strlen (ti->ti_abandon) + strlen (suf_tcl)
+ 20);
sprintf(command, "%s ABANDON {%ld} {%s}",
sprintf (command, "%s ABANDON {%ld} {%s}",
ti->ti_abandon, op->o_msgid, suf_tcl);
Tcl_Free(suf_tcl);
Tcl_Free (suf_tcl);
ldap_pvt_thread_mutex_lock( &tcl_interpreter_mutex );
code = Tcl_GlobalEval(ti->ti_ii->interp, command);
results = (char *) strdup(ti->ti_ii->interp->result);
ldap_pvt_thread_mutex_unlock( &tcl_interpreter_mutex );
free(command);
ldap_pvt_thread_mutex_lock (&tcl_interpreter_mutex);
code = Tcl_GlobalEval (ti->ti_ii->interp, command);
results = (char *) strdup (ti->ti_ii->interp->result);
ldap_pvt_thread_mutex_unlock (&tcl_interpreter_mutex);
free (command);
if (code != TCL_OK) {
Debug(LDAP_DEBUG_ANY, "tcl_abandon_error: %s\n", results, 0, 0);
}
return( 0 );
if (code != TCL_OK) {
err = LDAP_OPERATIONS_ERROR;
Debug (LDAP_DEBUG_ANY, "tcl_abandon_error: %s\n", results,
0, 0);
}
free(results);
return (err);
}

View file

@ -1,5 +1,6 @@
/*
* add.c - tcl add routine
/* add.c - tcl add routine
*
* $Id: tcl_add.c,v 1.2 1999/02/17 01:05:28 bcollins Exp $
*
* Copyright 1999, Ben Collins <bcollins@debian.org>, All rights reserved.
*
@ -7,10 +8,6 @@
* as authorized by the OpenLDAP Public License. A copy of this
* license is available at http://www.OpenLDAP.org/license.html or
* in file LICENSE in the top-level directory of the distribution.
*
* $Id$
*
* $Log$
*/
#include "portable.h"
@ -20,7 +17,8 @@
#include "slap.h"
#include "tcl_back.h"
int tcl_back_add (
int
tcl_back_add (
Backend * be,
Connection * conn,
Operation * op,
@ -37,34 +35,36 @@ int tcl_back_add (
return (-1);
}
for ( i = 0; be->be_suffix[i] != NULL; i++ )
;
suf_tcl = Tcl_Merge(i, be->be_suffix);
for (i = 0; be->be_suffix[i] != NULL; i++);
suf_tcl = Tcl_Merge (i, be->be_suffix);
entrystr = tcl_clean_entry(e);
entrystr = tcl_clean_entry (e);
command = (char *) ch_malloc (strlen(ti->ti_add) + strlen(suf_tcl) +
strlen(entrystr) + 32);
sprintf(command, "%s ADD {%ld} {%s} {%s}",
command = (char *) ch_malloc (strlen (ti->ti_add) + strlen
(suf_tcl) +
strlen (entrystr) + 32);
sprintf (command, "%s ADD {%ld} {%s} {%s}",
ti->ti_add, op->o_msgid, suf_tcl, entrystr);
Tcl_Free(suf_tcl);
Tcl_Free (suf_tcl);
free (entrystr);
ldap_pvt_thread_mutex_lock( &tcl_interpreter_mutex );
code = Tcl_GlobalEval(ti->ti_ii->interp, command);
results = (char *) strdup(ti->ti_ii->interp->result);
ldap_pvt_thread_mutex_unlock( &tcl_interpreter_mutex );
free(command);
ldap_pvt_thread_mutex_lock (&tcl_interpreter_mutex);
code = Tcl_GlobalEval (ti->ti_ii->interp, command);
results = (char *) strdup (ti->ti_ii->interp->result);
ldap_pvt_thread_mutex_unlock (&tcl_interpreter_mutex);
free (command);
if (code != TCL_OK) {
err = LDAP_OPERATIONS_ERROR;
Debug(LDAP_DEBUG_ANY, "tcl_add_error: %s\n", results, 0, 0);
Debug (LDAP_DEBUG_ANY, "tcl_add_error: %s\n", results, 0, 0);
} else {
interp_send_results ( be, conn, op, results, NULL, 0 );
interp_send_results (be, conn, op, results, NULL, 0);
}
if (err != LDAP_SUCCESS)
send_ldap_result (conn, op, err, NULL, "internal backend error");
send_ldap_result (conn, op, err, NULL,
"internal backend error");
free(results);
return (err);
}

View file

@ -1,5 +1,6 @@
/*
* tcl_back.h - tcl backend header (structs, functions)
/* tcl_back.h - tcl backend header (structs, functions)
*
* $Id: tcl_back.h,v 1.1 1999/02/17 01:23:18 bcollins Exp $
*
* Copyright 1999, Ben Collins <bcollins@debian.org>, All rights reserved.
*
@ -7,10 +8,6 @@
* as authorized by the OpenLDAP Public License. A copy of this
* license is available at http://www.OpenLDAP.org/license.html or
* in file LICENSE in the top-level directory of the distribution.
*
* $Id$
*
* $Log$
*/
#include <tcl.h>
@ -21,48 +18,48 @@
#include <ldap_cdefs.h>
#include "external.h"
extern ldap_pvt_thread_mutex_t tcl_interpreter_mutex;
extern ldap_pvt_thread_mutex_t tcl_interpreter_mutex;
struct i_info {
Tcl_Interp *interp;
char *name;
struct i_info *next;
int count;
Tcl_Interp *interp;
char *name;
struct i_info *next;
int count;
};
extern struct i_info *global_i;
struct tclinfo {
char *script_path;
struct i_info *ti_ii;
char *ti_bind;
char *ti_unbind;
char *ti_search;
char *ti_compare;
char *ti_modify;
char *ti_modrdn;
char *ti_add;
char *ti_delete;
char *ti_abandon;
char *script_path;
struct i_info *ti_ii;
char *ti_bind;
char *ti_unbind;
char *ti_search;
char *ti_compare;
char *ti_modify;
char *ti_modrdn;
char *ti_add;
char *ti_delete;
char *ti_abandon;
};
void readtclscript (char *script, Tcl_Interp * my_tcl);
char *tcl_clean_entry (Entry *e);
char *tcl_clean_entry (Entry * e);
int tcl_ldap_debug (
ClientData clientData,
Tcl_Interp *interp,
int argc,
char *argv[]
ClientData clientData,
Tcl_Interp * interp,
int argc,
char *argv[]
);
int interp_send_results(
Backend *be,
Connection *conn,
Operation *op,
char *result,
char **attrs,
int attrsonly
int interp_send_results (
Backend * be,
Connection * conn,
Operation * op,
char *result,
char **attrs,
int attrsonly
);
#endif

View file

@ -1,5 +1,6 @@
/*
* bind.c - tcl bind routines
/* bind.c - tcl bind routines
*
* $Id: tcl_bind.c,v 1.2 1999/02/17 01:05:28 bcollins Exp $
*
* Copyright 1999, Ben Collins <bcollins@debian.org>, All rights reserved.
*
@ -7,10 +8,6 @@
* as authorized by the OpenLDAP Public License. A copy of this
* license is available at http://www.OpenLDAP.org/license.html or
* in file LICENSE in the top-level directory of the distribution.
*
* $Id$
*
* $Log$
*/
#include "portable.h"
@ -20,14 +17,15 @@
#include "slap.h"
#include "tcl_back.h"
int tcl_back_bind (
int
tcl_back_bind (
Backend * be,
Connection * conn,
Operation * op,
char *dn,
int method,
struct berval *cred,
char** edn
char **edn
)
{
char *command, *suf_tcl, *results;
@ -42,31 +40,34 @@ int tcl_back_bind (
return (-1);
}
for ( i = 0; be->be_suffix[i] != NULL; i++ )
;
suf_tcl = Tcl_Merge(i, be->be_suffix);
for (i = 0; be->be_suffix[i] != NULL; i++);
suf_tcl = Tcl_Merge (i, be->be_suffix);
command = (char *) ch_malloc (strlen(ti->ti_bind) + strlen(suf_tcl) +
strlen(dn) + strlen(cred->bv_val) + 64);
sprintf(command, "%s BIND {%ld} {%s} {%s} {%d} {%lu} {%s}",
command = (char *) ch_malloc (strlen (ti->ti_bind) + strlen
(suf_tcl) +
strlen (dn) + strlen (cred->bv_val) + 64);
sprintf (command, "%s BIND {%ld} {%s} {%s} {%d} {%lu} {%s}",
ti->ti_bind, op->o_msgid, suf_tcl, dn, method, cred->bv_len,
cred->bv_val);
Tcl_Free(suf_tcl);
Tcl_Free (suf_tcl);
ldap_pvt_thread_mutex_lock( &tcl_interpreter_mutex );
code = Tcl_GlobalEval(ti->ti_ii->interp, command);
results = (char *) strdup(ti->ti_ii->interp->result);
ldap_pvt_thread_mutex_unlock( &tcl_interpreter_mutex );
free(command);
ldap_pvt_thread_mutex_lock (&tcl_interpreter_mutex);
code = Tcl_GlobalEval (ti->ti_ii->interp, command);
results = (char *) strdup (ti->ti_ii->interp->result);
ldap_pvt_thread_mutex_unlock (&tcl_interpreter_mutex);
free (command);
if (code != TCL_OK) {
err = LDAP_OPERATIONS_ERROR;
Debug(LDAP_DEBUG_ANY, "tcl_bind_error: %s\n", results, 0, 0);
Debug (LDAP_DEBUG_ANY, "tcl_bind_error: %s\n", results, 0, 0);
} else {
err = interp_send_results ( be, conn, op, results, NULL, 0 );
err = interp_send_results (be, conn, op, results, NULL, 0);
}
if (err != LDAP_SUCCESS)
send_ldap_result (conn, op, err, NULL, "internal backend error");
send_ldap_result (conn, op, err, NULL,
"internal backend error");
free(results);
return (err);
}

View file

@ -1,5 +1,6 @@
/*
* close.c - tcl close routines
/* close.c - tcl close routines
*
* $Id: tcl_close.c,v 1.3 1999/02/17 01:02:11 bcollins Exp $
*
* Copyright 1999, Ben Collins <bcollins@debian.org>, All rights reserved.
*
@ -7,13 +8,6 @@
* as authorized by the OpenLDAP Public License. A copy of this
* license is available at http://www.OpenLDAP.org/license.html or
* in file LICENSE in the top-level directory of the distribution.
*
* $Id: tcl_close.c,v 1.2 1999/02/17 00:55:03 bcollins Exp $
*
* $Log: tcl_close.c,v $
* Revision 1.2 1999/02/17 00:55:03 bcollins
* Implemented all of the (db_)destroy and (db_)close functions
*
*/
#include "portable.h"
@ -28,26 +22,26 @@ tcl_back_close (
BackendInfo * bi
)
{
Tcl_DeleteInterp(global_i->interp);
Tcl_DeleteInterp (global_i->interp);
return( 0 );
return (0);
}
int
tcl_back_destroy(
BackendInfo *bi
tcl_back_destroy (
BackendInfo * bi
)
{
Tcl_Free(global_i->interp);
free(global_i);
ldap_pvt_thread_mutex_destroy( &tcl_interpreter_mutex );
free (global_i->interp);
free (global_i);
ldap_pvt_thread_mutex_destroy (&tcl_interpreter_mutex);
return( 0 );
return (0);
}
int
tcl_back_db_close(
BackendDB *bd
tcl_back_db_close (
BackendDB * bd
)
{
struct tclinfo *ti = (struct tclinfo *) bd->be_private;
@ -55,35 +49,35 @@ tcl_back_db_close(
/* Disable the interp and associated struct */
ti->ti_ii->count--;
if (!ti->ti_ii->count && strcasecmp("default", ti->ti_ii->name)) {
if (!ti->ti_ii->count && strcasecmp ("default", ti->ti_ii->name)) {
/* no more db's using this and it's not the default */
for(ti_tmp = global_i; ti_tmp->next != ti->ti_ii; ti_tmp = ti_tmp->next)
;
for (ti_tmp = global_i; ti_tmp->next != ti->ti_ii; ti_tmp
= ti_tmp->next);
/* This bypasses this interp struct in the global hash */
ti_tmp->next = ti->ti_ii->next;
Tcl_DeleteInterp(ti->ti_ii->interp);
Tcl_DeleteInterp (ti->ti_ii->interp);
}
return( 0 );
return (0);
}
int
tcl_back_db_destroy(
BackendDB *bd
tcl_back_db_destroy (
BackendDB * bd
)
{
struct tclinfo *ti = (struct tclinfo *) bd->be_private;
/*
* Now free up the allocated memory used
*/
/*
* Now free up the allocated memory used
*/
ti->ti_ii->count--;
if (!ti->ti_ii->count && strcasecmp("default", ti->ti_ii->name)) {
Tcl_Free(ti->ti_ii->interp);
free(ti->ti_ii);
free(ti);
if (!ti->ti_ii->count && strcasecmp ("default", ti->ti_ii->name)) {
free (ti->ti_ii->interp);
free (ti->ti_ii);
free (ti);
}
free( bd->be_private );
free (bd->be_private);
bd->be_private = NULL;
return( 0 );
return (0);
}

View file

@ -1,5 +1,6 @@
/*
* compare.c - tcl compare routines
/* compare.c - tcl compare routines
*
* $Id: tcl_compare.c,v 1.2 1999/02/17 01:05:28 bcollins Exp $
*
* Copyright 1999, Ben Collins <bcollins@debian.org>, All rights reserved.
*
@ -7,10 +8,6 @@
* as authorized by the OpenLDAP Public License. A copy of this
* license is available at http://www.OpenLDAP.org/license.html or
* in file LICENSE in the top-level directory of the distribution.
*
* $Id$
*
* $Log$
*/
#include "portable.h"
@ -39,33 +36,35 @@ tcl_back_compare (
return (-1);
}
for ( i = 0; be->be_suffix[i] != NULL; i++ )
;
suf_tcl = Tcl_Merge(i, be->be_suffix);
for (i = 0; be->be_suffix[i] != NULL; i++);
suf_tcl = Tcl_Merge (i, be->be_suffix);
command = (char *) ch_malloc (strlen(ti->ti_compare) +
strlen(suf_tcl) + strlen(dn) + strlen(ava->ava_type) +
strlen(ava->ava_value.bv_val) + 64);
sprintf(command, "%s COMPARE {%ld} {%s} {%s} {%s: %s}",
command = (char *) ch_malloc (strlen (ti->ti_compare) +
strlen (suf_tcl) + strlen (dn) + strlen (ava->ava_type) +
strlen (ava->ava_value.bv_val) + 64);
sprintf (command, "%s COMPARE {%ld} {%s} {%s} {%s: %s}",
ti->ti_compare, op->o_msgid, suf_tcl, dn, ava->ava_type,
ava->ava_value.bv_val);
Tcl_Free(suf_tcl);
ava->ava_value.bv_val);
Tcl_Free (suf_tcl);
ldap_pvt_thread_mutex_lock( &tcl_interpreter_mutex );
code = Tcl_GlobalEval(ti->ti_ii->interp, command);
results = (char *) strdup(ti->ti_ii->interp->result);
ldap_pvt_thread_mutex_unlock( &tcl_interpreter_mutex );
free(command);
ldap_pvt_thread_mutex_lock (&tcl_interpreter_mutex);
code = Tcl_GlobalEval (ti->ti_ii->interp, command);
results = (char *) strdup (ti->ti_ii->interp->result);
ldap_pvt_thread_mutex_unlock (&tcl_interpreter_mutex);
free (command);
if (code != TCL_OK) {
err = LDAP_OPERATIONS_ERROR;
Debug(LDAP_DEBUG_ANY, "tcl_compare_error: %s\n", results, 0, 0);
Debug (LDAP_DEBUG_ANY, "tcl_compare_error: %s\n", results,
0, 0);
} else {
interp_send_results ( be, conn, op, results, NULL, 0 );
interp_send_results (be, conn, op, results, NULL, 0);
}
if (err != LDAP_SUCCESS)
send_ldap_result (conn, op, err, NULL, "internal backend error");
return (0);
send_ldap_result (conn, op, err, NULL,
"internal backend error");
free(results);
return (err);
}

View file

@ -1,5 +1,6 @@
/*
* config.c - tcl backend configuration file routine
/* config.c - tcl backend configuration file routine
*
* $Id: tcl_config.c,v 1.3 1999/02/17 00:53:59 bcollins Exp $
*
* Copyright 1999, Ben Collins <bcollins@debian.org>, All rights reserved.
*
@ -7,13 +8,6 @@
* as authorized by the OpenLDAP Public License. A copy of this
* license is available at http://www.OpenLDAP.org/license.html or
* in file LICENSE in the top-level directory of the distribution.
*
* $Id: tcl_config.c,v 1.2 1999/02/16 23:30:36 bcollins Exp $
*
* $Log: tcl_config.c,v $
* Revision 1.2 1999/02/16 23:30:36 bcollins
* fixed exit()'s to be return()'s
*
*/
#include "portable.h"
@ -25,7 +19,8 @@
struct i_info *global_i;
int tcl_back_db_config (
int
tcl_back_db_config (
BackendDB * bd,
char *fname,
int lineno,
@ -37,9 +32,10 @@ int tcl_back_db_config (
int script_loaded = 0;
if (ti == NULL) {
fprintf (stderr, "%s: line %d: tcl backend info is null!\n", fname,
fprintf (stderr,
"%s: line %d: tcl backend info is null!\n", fname,
lineno);
return( 1 );
return (1);
}
if (ti->ti_ii == NULL) {
ti->ti_ii = global_i;
@ -51,11 +47,11 @@ int tcl_back_db_config (
Debug (LDAP_DEBUG_ANY,
"%s: line %d: missing script in \"scriptpath <script>\" line\n",
fname, lineno, 0);
return( 1 );
return (1);
}
ti->script_path = (char *) strdup (argv[1]);
/* use local interpreter */
/* use local interpreter */
} else if (strcasecmp (argv[0], "tclrealm") == 0) {
struct i_info *ii;
@ -63,7 +59,7 @@ int tcl_back_db_config (
Debug (LDAP_DEBUG_ANY,
"%s: line %d: missing script in \"tclrealm <name>\" line\n",
fname, lineno, 0);
return( 1 );
return (1);
}
ti->ti_ii = NULL;
@ -71,12 +67,12 @@ int tcl_back_db_config (
/* Try to see if it already exists */
do {
if (ii != NULL && !strcasecmp (ii->name, argv[1]))
ti->ti_ii = ii;
ti->ti_ii = ii;
if (ii->next != NULL)
ii = ii->next;
ii = ii->next;
} while (ii->next != NULL);
if (ti->ti_ii == NULL) { /* we need to make a new one */
if (ti->ti_ii == NULL) { /* we need to make a new one */
ii->next = (struct i_info *) ch_malloc
(sizeof (struct i_info));
@ -87,122 +83,101 @@ int tcl_back_db_config (
ti->ti_ii = ii->next;
}
/* proc for binds */
/* proc for binds */
} else if (strcasecmp (argv[0], "bind") == 0) {
if (argc < 2) {
Debug (LDAP_DEBUG_ANY,
"%s: line %d: missing proc in \"bind <proc>\" line\n",
fname, lineno, 0);
return( 1 );
return (1);
}
ti->ti_bind = (char *) strdup (argv[1]);
/* proc for unbinds */
/* proc for unbinds */
} else if (strcasecmp (argv[0], "unbind") == 0) {
if (argc < 2) {
Debug (LDAP_DEBUG_ANY,
"%s: line %d: missing proc in \"unbind <proc>\" line\n",
fname, lineno, 0);
return( 1 );
"%s: line %d: missing proc in \"unbind <proc>\" line\n",
fname, lineno, 0);
return (1);
}
ti->ti_unbind = (char *) strdup (argv[1]);
/* proc for search */
/* proc for search */
} else if (strcasecmp (argv[0], "search") == 0) {
if (argc < 2) {
Debug (LDAP_DEBUG_ANY,
"%s: line %d: missing proc in \"search <proc>\" line\n",
fname, lineno, 0);
return( 1 );
return (1);
}
ti->ti_search = (char *) strdup (argv[1]);
/* proc for compares */
/* proc for compares */
} else if (strcasecmp (argv[0], "compare") == 0) {
if (argc < 2) {
Debug (LDAP_DEBUG_ANY,
"%s: line %d: missing proc in \"compare <proc>\" line\n",
fname, lineno, 0);
return( 1 );
return (1);
}
ti->ti_compare = (char *) strdup (argv[1]);
/* proc for modify */
/* proc for modify */
} else if (strcasecmp (argv[0], "modify") == 0) {
if (argc < 2) {
Debug (LDAP_DEBUG_ANY,
"%s: line %d: missing proc in \"modify <proc>\" line\n",
fname, lineno, 0);
return( 1 );
return (1);
}
ti->ti_modify = (char *) strdup (argv[1]);
/* proc for modrdn */
/* proc for modrdn */
} else if (strcasecmp (argv[0], "modrdn") == 0) {
if (argc < 2) {
Debug (LDAP_DEBUG_ANY,
"%s: line %d: missing proc in \"modrdn <proc>\" line\n",
fname, lineno, 0);
return( 1 );
return (1);
}
ti->ti_modrdn = (char *) strdup (argv[1]);
/* proc for add */
/* proc for add */
} else if (strcasecmp (argv[0], "add") == 0) {
if (argc < 2) {
Debug (LDAP_DEBUG_ANY,
"%s: line %d: missing proc in \"add <proc>\" line\n",
fname, lineno, 0);
return( 1 );
return (1);
}
ti->ti_add = (char *) strdup (argv[1]);
/* proc for delete */
/* proc for delete */
} else if (strcasecmp (argv[0], "delete") == 0) {
if (argc < 2) {
Debug (LDAP_DEBUG_ANY,
"%s: line %d: missing proc in \"delete <proc>\" line\n",
fname, lineno, 0);
return( 1 );
return (1);
}
ti->ti_delete = (char *) strdup (argv[1]);
/* proc for abandon */
/* proc for abandon */
} else if (strcasecmp (argv[0], "abandon") == 0) {
if (argc < 2) {
Debug (LDAP_DEBUG_ANY,
"%s: line %d: missing proc in \"abandon <proc>\" line\n",
fname, lineno, 0);
return( 1 );
return (1);
}
ti->ti_search = (char *) strdup (argv[1]);
} else {
Debug (LDAP_DEBUG_ANY,
"Unknown tcl backend config: %s\n", argv[0], 0, 0);
return( 1 );
return (1);
}
return 0;
}
void readtclscript (char *script, Tcl_Interp * my_tcl)
{
int code;
FILE *f;
f = fopen (script, "r");
if (f == NULL) {
Debug (LDAP_DEBUG_ANY, "Could not open scriptpath %s\n", script,
0, 0);
return( 1 );
}
fclose (f);
code = Tcl_EvalFile (my_tcl, script);
if (code != TCL_OK) {
Debug (LDAP_DEBUG_ANY, "%s: %s\n", script,
Tcl_GetVar (my_tcl, "errorInfo", TCL_GLOBAL_ONLY), 0);
Debug (LDAP_DEBUG_ANY, "%s: error at line\n", script,
my_tcl->errorLine, 0);
return( 1 );
}
}

View file

@ -1,5 +1,6 @@
/*
* delete.c - tcl delete routines
/* delete.c - tcl delete routines
*
* $Id: tcl_delete.c,v 1.2 1999/02/17 01:05:28 bcollins Exp $
*
* Copyright 1999, Ben Collins <bcollins@debian.org>, All rights reserved.
*
@ -7,10 +8,6 @@
* as authorized by the OpenLDAP Public License. A copy of this
* license is available at http://www.OpenLDAP.org/license.html or
* in file LICENSE in the top-level directory of the distribution.
*
* $Id$
*
* $Log$
*/
#include "portable.h"
@ -37,31 +34,33 @@ tcl_back_delete (
return (-1);
}
for ( i = 0; be->be_suffix[i] != NULL; i++ )
;
suf_tcl = Tcl_Merge(i, be->be_suffix);
for (i = 0; be->be_suffix[i] != NULL; i++);
suf_tcl = Tcl_Merge (i, be->be_suffix);
command = (char *) ch_malloc (strlen(ti->ti_delete) + strlen(suf_tcl)
+ strlen(dn) + 64);
sprintf(command, "%s DELETE {%ld} {%s} {%s}",
command = (char *) ch_malloc (strlen (ti->ti_delete) + strlen (suf_tcl)
+ strlen (dn) + 64);
sprintf (command, "%s DELETE {%ld} {%s} {%s}",
ti->ti_delete, op->o_msgid, suf_tcl, dn);
Tcl_Free(suf_tcl);
Tcl_Free (suf_tcl);
ldap_pvt_thread_mutex_lock( &tcl_interpreter_mutex );
code = Tcl_GlobalEval(ti->ti_ii->interp, command);
results = (char *) strdup(ti->ti_ii->interp->result);
ldap_pvt_thread_mutex_unlock( &tcl_interpreter_mutex );
free(command);
ldap_pvt_thread_mutex_lock (&tcl_interpreter_mutex);
code = Tcl_GlobalEval (ti->ti_ii->interp, command);
results = (char *) strdup (ti->ti_ii->interp->result);
ldap_pvt_thread_mutex_unlock (&tcl_interpreter_mutex);
free (command);
if (code != TCL_OK) {
err = LDAP_OPERATIONS_ERROR;
Debug(LDAP_DEBUG_ANY, "tcl_delete_error: %s\n", results, 0, 0);
Debug (LDAP_DEBUG_ANY, "tcl_delete_error: %s\n", results,
0, 0);
} else {
interp_send_results ( be, conn, op, results, NULL, 0 );
interp_send_results (be, conn, op, results, NULL, 0);
}
if (err != LDAP_SUCCESS)
send_ldap_result (conn, op, err, NULL, "internal backend error");
send_ldap_result (conn, op, err, NULL,
"internal backend error");
return (0);
free(results);
return (err);
}

View file

@ -1,5 +1,6 @@
/*
* tcl_init.c - tcl backend initialization
/* tcl_init.c - tcl backend initialization
*
* $Id: tcl_init.c,v 1.3 1999/02/17 01:02:11 bcollins Exp $
*
* Copyright 1999, Ben Collins <bcollins@debian.org>, All rights reserved.
*
@ -7,13 +8,6 @@
* as authorized by the OpenLDAP Public License. A copy of this
* license is available at http://www.OpenLDAP.org/license.html or
* in file LICENSE in the top-level directory of the distribution.
*
* $Id: tcl_init.c,v 1.2 1999/02/17 00:55:54 bcollins Exp $
*
* $Log: tcl_init.c,v $
* Revision 1.2 1999/02/17 00:55:54 bcollins
* Implemented the open, init functions correctly
*
*/
#include "portable.h"
@ -28,12 +22,13 @@
ldap_pvt_thread_mutex_t tcl_interpreter_mutex;
int
tcl_back_initialize(
BackendInfo *bi
tcl_back_initialize (
BackendInfo * bi
)
{
/* Initialize the global interpreter array */
global_i = (struct i_info *) ch_malloc (sizeof (struct i_info));
global_i->count = 0;
global_i->name = "default";
global_i->next = NULL;
@ -41,7 +36,7 @@ tcl_back_initialize(
Tcl_Init (global_i->interp);
/* Initialize the global interpreter lock */
ldap_pvt_thread_mutex_init( &tcl_interpreter_mutex );
ldap_pvt_thread_mutex_init (&tcl_interpreter_mutex);
bi->bi_open = tcl_back_open;
bi->bi_config = NULL;
@ -70,12 +65,13 @@ tcl_back_initialize(
}
int
tcl_back_open(
BackendInfo *bi
tcl_back_open (
BackendInfo * bi
)
{
/* Initialize the global interpreter array */
global_i = (struct i_info *) ch_malloc (sizeof (struct i_info));
global_i->count = 0;
global_i->name = "default";
global_i->next = NULL;
@ -83,19 +79,19 @@ tcl_back_open(
Tcl_Init (global_i->interp);
/* Initialize the global interpreter lock */
ldap_pvt_thread_mutex_init( &tcl_interpreter_mutex );
ldap_pvt_thread_mutex_init (&tcl_interpreter_mutex);
return( 0 );
return (0);
}
int
tcl_back_db_init(
Backend *be
tcl_back_db_init (
Backend * be
)
{
struct tclinfo *ti;
struct tclinfo *ti;
ti = (struct tclinfo *) ch_calloc( 1, sizeof(struct tclinfo) );
ti = (struct tclinfo *) ch_calloc (1, sizeof (struct tclinfo));
/*
* For some reason this causes problems
@ -116,15 +112,16 @@ tcl_back_db_init(
return ti == NULL;
}
int tcl_back_db_open (
BackendDB * bd
int
tcl_back_db_open (
BackendDB * bd
)
{
struct tclinfo *ti = (struct tclinfo *) bd->be_private;
if (ti->ti_ii->interp == NULL) { /* we need to make a new one */
if (ti->ti_ii->interp == NULL) { /* we need to make a new one */
ti->ti_ii->interp = Tcl_CreateInterp ();
Tcl_Init (ti->interp);
Tcl_Init (ti->ti_ii->interp);
}
/* raise that count for the interpreter */
@ -134,7 +131,7 @@ int tcl_back_db_open (
readtclscript (ti->script_path, ti->ti_ii->interp);
/* Intall the debug command */
Tcl_CreateCommand( ti->ti_ii->interp, "ldap:debug", &tcl_ldap_debug,
Tcl_CreateCommand (ti->ti_ii->interp, "ldap:debug", &tcl_ldap_debug,
NULL, NULL);
return 0;

View file

@ -1,5 +1,6 @@
/*
* modify.c - tcl modify routines
/* modify.c - tcl modify routines
*
* $Id: tcl_modify.c,v 1.2 1999/02/17 01:05:28 bcollins Exp $
*
* Copyright 1999, Ben Collins <bcollins@debian.org>, All rights reserved.
*
@ -7,10 +8,6 @@
* as authorized by the OpenLDAP Public License. A copy of this
* license is available at http://www.OpenLDAP.org/license.html or
* in file LICENSE in the top-level directory of the distribution.
*
* $Id$
*
* $Log$
*/
#include "portable.h"
@ -20,7 +17,8 @@
#include "slap.h"
#include "tcl_back.h"
int tcl_back_modify (
int
tcl_back_modify (
Backend * be,
Connection * conn,
Operation * op,
@ -38,20 +36,19 @@ int tcl_back_modify (
return (-1);
}
for ( i = 0; be->be_suffix[i] != NULL; i++ )
;
suf_tcl = Tcl_Merge(i, be->be_suffix);
for (i = 0; be->be_suffix[i] != NULL; i++);
suf_tcl = Tcl_Merge (i, be->be_suffix);
tcl_mods = (char *) ch_malloc( BUFSIZ );
tcl_mods = (char *) ch_malloc (BUFSIZ);
tcl_mods[0] = '\0';
bsize = BUFSIZ;
bp = tcl_mods;
for ( ; modlist != NULL; modlist = modlist->ml_next ) {
for (; modlist != NULL; modlist = modlist->ml_next) {
LDAPMod *mods = &modlist->ml_mod;
char *op = NULL;
switch ( mods->mod_op & ~LDAP_MOD_BVALUES ) {
switch (mods->mod_op & ~LDAP_MOD_BVALUES) {
case LDAP_MOD_ADD:
op = "add";
break;
@ -63,54 +60,58 @@ int tcl_back_modify (
break;
}
len = strlen( mods->mod_type ) + strlen ( op ) + 7;
while ( bp + len - tcl_mods > bsize ) {
len = strlen (mods->mod_type) + strlen (op) + 7;
while (bp + len - tcl_mods > bsize) {
bsize += BUFSIZ;
tcl_mods = (char *) ch_realloc( tcl_mods, bsize );
tcl_mods = (char *) ch_realloc (tcl_mods, bsize);
}
sprintf(bp, "{ {%s: %s} ", op, mods->mod_type);
sprintf (bp, "{ {%s: %s} ", op, mods->mod_type);
bp += len;
for( i = 0;
mods->mod_bvalues != NULL && mods->mod_bvalues[i] != NULL;
i++ )
{
len = strlen( mods->mod_type ) + strlen (
mods->mod_bvalues[i]->bv_val ) + 5 +
(mods->mod_bvalues[i+1] == NULL ? 2 : 0);
while ( bp + len - tcl_mods > bsize ) {
for (i = 0;
mods->mod_bvalues != NULL && mods->mod_bvalues[i]
!= NULL;
i++) {
len = strlen (mods->mod_type) + strlen (
mods->mod_bvalues[i]->bv_val) + 5 +
(mods->mod_bvalues[i + 1] == NULL ? 2 : 0);
while (bp + len - tcl_mods > bsize) {
bsize += BUFSIZ;
tcl_mods = (char *) ch_realloc( tcl_mods, bsize );
tcl_mods = (char *) ch_realloc (tcl_mods, bsize);
}
sprintf(bp, "{%s: %s} %s", mods->mod_type,
mods->mod_bvalues[i]->bv_val, mods->mod_bvalues[i+1] ==
NULL ? "} " : "");
sprintf (bp, "{%s: %s} %s", mods->mod_type,
mods->mod_bvalues[i]->bv_val,
mods->mod_bvalues[i + 1] ==
NULL ? "} " : "");
bp += len;
}
}
command = (char *) ch_malloc (strlen(ti->ti_modify) + strlen(suf_tcl)
+ strlen(dn) + strlen(tcl_mods) + 64);
command = (char *) ch_malloc (strlen (ti->ti_modify) + strlen (suf_tcl)
+ strlen (dn) + strlen (tcl_mods) + 64);
/* This space is simply for aesthetics--\ */
sprintf(command, "%s MODIFY {%ld} {%s} {%s} { %s}",
sprintf (command, "%s MODIFY {%ld} {%s} {%s} { %s}",
ti->ti_modify, op->o_msgid, suf_tcl, dn, tcl_mods);
Tcl_Free(suf_tcl);
free(tcl_mods);
Tcl_Free (suf_tcl);
free (tcl_mods);
ldap_pvt_thread_mutex_lock( &tcl_interpreter_mutex );
code = Tcl_GlobalEval(ti->ti_ii->interp, command);
results = (char *) strdup(ti->ti_ii->interp->result);
ldap_pvt_thread_mutex_unlock( &tcl_interpreter_mutex );
free(command);
ldap_pvt_thread_mutex_lock (&tcl_interpreter_mutex);
code = Tcl_GlobalEval (ti->ti_ii->interp, command);
results = (char *) strdup (ti->ti_ii->interp->result);
ldap_pvt_thread_mutex_unlock (&tcl_interpreter_mutex);
free (command);
if (code != TCL_OK) {
err = LDAP_OPERATIONS_ERROR;
Debug(LDAP_DEBUG_ANY, "tcl_modify_error: %s\n", results, 0, 0);
Debug (LDAP_DEBUG_ANY, "tcl_modify_error: %s\n", results,
0, 0);
} else {
interp_send_results ( be, conn, op, results, NULL, 0 );
interp_send_results (be, conn, op, results, NULL, 0);
}
if (err != LDAP_SUCCESS)
send_ldap_result (conn, op, err, NULL, "internal backend error");
send_ldap_result (conn, op, err, NULL,
"internal backend error");
return (0);
free(results);
return (err);
}

View file

@ -1,5 +1,6 @@
/*
* modrdn.c - tcl modify rdn routines
/* modrdn.c - tcl modify rdn routines
*
* $Id: tcl_modrdn.c,v 1.2 1999/02/17 01:05:28 bcollins Exp $
*
* Copyright 1999, Ben Collins <bcollins@debian.org>, All rights reserved.
*
@ -7,10 +8,6 @@
* as authorized by the OpenLDAP Public License. A copy of this
* license is available at http://www.OpenLDAP.org/license.html or
* in file LICENSE in the top-level directory of the distribution.
*
* $Id$
*
* $Log$
*/
#include "portable.h"
@ -20,7 +17,8 @@
#include "slap.h"
#include "tcl_back.h"
int tcl_back_modrdn (
int
tcl_back_modrdn (
Backend * be,
Connection * conn,
Operation * op,
@ -39,31 +37,34 @@ int tcl_back_modrdn (
return (-1);
}
for ( i = 0; be->be_suffix[i] != NULL; i++ )
;
suf_tcl = Tcl_Merge(i, be->be_suffix);
for (i = 0; be->be_suffix[i] != NULL; i++);
suf_tcl = Tcl_Merge (i, be->be_suffix);
command = (char *) ch_malloc (strlen(ti->ti_modrdn) + strlen(suf_tcl)
+ strlen(dn) + strlen(newrdn) + 64);
sprintf(command, "%s MODRDN {%ld} {%s} {%s} {%s} %d",
ti->ti_add, op->o_msgid, suf_tcl, dn, newrdn, deleteoldrdn ? 1 : 0);
Tcl_Free(suf_tcl);
command = (char *) ch_malloc (strlen (ti->ti_modrdn) + strlen (suf_tcl)
+ strlen (dn) + strlen (newrdn) + 64);
sprintf (command, "%s MODRDN {%ld} {%s} {%s} {%s} %d",
ti->ti_add, op->o_msgid, suf_tcl, dn, newrdn, deleteoldrdn
? 1 : 0);
Tcl_Free (suf_tcl);
ldap_pvt_thread_mutex_lock( &tcl_interpreter_mutex );
code = Tcl_GlobalEval(ti->ti_ii->interp, command);
results = (char *) strdup(ti->ti_ii->interp->result);
ldap_pvt_thread_mutex_unlock( &tcl_interpreter_mutex );
free(command);
ldap_pvt_thread_mutex_lock (&tcl_interpreter_mutex);
code = Tcl_GlobalEval (ti->ti_ii->interp, command);
results = (char *) strdup (ti->ti_ii->interp->result);
ldap_pvt_thread_mutex_unlock (&tcl_interpreter_mutex);
free (command);
if (code != TCL_OK) {
err = LDAP_OPERATIONS_ERROR;
Debug(LDAP_DEBUG_ANY, "tcl_modrdn_error: %s\n", results, 0, 0);
Debug (LDAP_DEBUG_ANY, "tcl_modrdn_error: %s\n", results,
0, 0);
} else {
interp_send_results ( be, conn, op, results, NULL, 0 );
interp_send_results (be, conn, op, results, NULL, 0);
}
if (err != LDAP_SUCCESS)
send_ldap_result (conn, op, err, NULL, "internal backend error");
send_ldap_result (conn, op, err, NULL,
"internal backend error");
return (0);
free(results);
return (err);
}

View file

@ -1,5 +1,6 @@
/*
* search.c - tcl search routines
/* search.c - tcl search routines
*
* $Id: tcl_search.c,v 1.2 1999/02/17 01:05:28 bcollins Exp $
*
* Copyright 1999, Ben Collins <bcollins@debian.org>, All rights reserved.
*
@ -7,10 +8,6 @@
* as authorized by the OpenLDAP Public License. A copy of this
* license is available at http://www.OpenLDAP.org/license.html or
* in file LICENSE in the top-level directory of the distribution.
*
* $Id$
*
* $Log$
*/
#include "portable.h"
@ -20,7 +17,8 @@
#include "slap.h"
#include "tcl_back.h"
int tcl_back_search (
int
tcl_back_search (
Backend * be,
Connection * conn,
Operation * op,
@ -46,40 +44,44 @@ int tcl_back_search (
return (-1);
}
for ( i = 0; attrs != NULL && attrs[i] != NULL; i++ )
;
for (i = 0; attrs != NULL && attrs[i] != NULL; i++);
if (i > 0)
attrs_tcl = Tcl_Merge(i, attrs);
attrs_tcl = Tcl_Merge (i, attrs);
for ( i = 0; be->be_suffix[i] != NULL; i++ )
;
suf_tcl = Tcl_Merge(i, be->be_suffix);
for (i = 0; be->be_suffix[i] != NULL; i++);
suf_tcl = Tcl_Merge (i, be->be_suffix);
command = (char *) ch_malloc (strlen(ti->ti_search) + strlen(suf_tcl)
+ strlen(base) + 40 + strlen(filterstr) + (attrs_tcl == NULL ? 5
: strlen(attrs_tcl)) + 72);
sprintf(command, "%s SEARCH {%ld} {%s} {%s} {%d} {%d} {%d} {%d} {%s} {%d} {%s}",
command = (char *) ch_malloc (strlen (ti->ti_search) + strlen (suf_tcl)
+ strlen (base) + 40 + strlen (filterstr) + (attrs_tcl ==
NULL ? 5
: strlen (attrs_tcl)) + 72);
sprintf (command,
"%s SEARCH {%ld} {%s} {%s} {%d} {%d} {%d} {%d} {%s} {%d} {%s}",
ti->ti_search, op->o_msgid, suf_tcl, base, scope, deref,
sizelimit, timelimit, filterstr, attrsonly ? 1 : 0, attrs_tcl ==
sizelimit, timelimit, filterstr, attrsonly ? 1 : 0,
attrs_tcl ==
NULL ? "{all}" : attrs_tcl);
Tcl_Free( attrs_tcl );
Tcl_Free( suf_tcl );
Tcl_Free (attrs_tcl);
Tcl_Free (suf_tcl);
ldap_pvt_thread_mutex_lock( &tcl_interpreter_mutex );
code = Tcl_GlobalEval(ti->ti_ii->interp, command);
ldap_pvt_thread_mutex_lock (&tcl_interpreter_mutex);
code = Tcl_GlobalEval (ti->ti_ii->interp, command);
results = (char *) strdup(ti->ti_ii->interp->result);
ldap_pvt_thread_mutex_unlock( &tcl_interpreter_mutex );
free(command);
ldap_pvt_thread_mutex_unlock (&tcl_interpreter_mutex);
free (command);
if (code != TCL_OK) {
err = LDAP_OPERATIONS_ERROR;
Debug(LDAP_DEBUG_ANY, "tcl_search_error: %s\n", results, 0, 0);
Debug (LDAP_DEBUG_ANY, "tcl_search_error: %s\n", results,
0, 0);
} else {
interp_send_results ( be, conn, op, results, NULL, 0 );
interp_send_results (be, conn, op, results, NULL, 0);
}
if (err != LDAP_SUCCESS)
send_ldap_result (conn, op, err, NULL, "internal backend error");
return (0);
send_ldap_result (conn, op, err, NULL,
"internal backend error");
free(results);
return (err);
}

View file

@ -1,5 +1,6 @@
/*
* unbind.c - tcl unbind routines
/* unbind.c - tcl unbind routines
*
* $Id: tcl_unbind.c,v 1.2 1999/02/17 01:05:28 bcollins Exp $
*
* Copyright 1999, Ben Collins <bcollins@debian.org>, All rights reserved.
*
@ -7,10 +8,6 @@
* as authorized by the OpenLDAP Public License. A copy of this
* license is available at http://www.OpenLDAP.org/license.html or
* in file LICENSE in the top-level directory of the distribution.
*
* $Id$
*
* $Log$
*/
#include "portable.h"
@ -20,7 +17,8 @@
#include "slap.h"
#include "tcl_back.h"
int tcl_back_unbind (
int
tcl_back_unbind (
Backend * be,
Connection * conn,
Operation * op
@ -33,27 +31,30 @@ int tcl_back_unbind (
if (ti->ti_unbind == NULL) {
send_ldap_result (conn, op, LDAP_UNWILLING_TO_PERFORM, NULL,
"unbind not implemented");
return;
return(-1);
}
for ( i = 0; be->be_suffix[i] != NULL; i++ )
;
suf_tcl = Tcl_Merge(i, be->be_suffix);
for (i = 0; be->be_suffix[i] != NULL; i++);
suf_tcl = Tcl_Merge (i, be->be_suffix);
command = (char *) ch_malloc (strlen(ti->ti_unbind) + strlen(suf_tcl)
+ strlen(conn->c_dn ? conn->c_dn : "") + 64);
sprintf(command, "%s UNBIND {%ld} {%s} {%s}",
ti->ti_unbind, op->o_msgid, suf_tcl, conn->c_dn ? conn->c_dn : "");
Tcl_Free(suf_tcl);
command = (char *) ch_malloc (strlen (ti->ti_unbind) + strlen (suf_tcl)
+ strlen (conn->c_dn ? conn->c_dn : "") + 64);
sprintf (command, "%s UNBIND {%ld} {%s} {%s}",
ti->ti_unbind, op->o_msgid, suf_tcl, conn->c_dn ?
conn->c_dn : "");
Tcl_Free (suf_tcl);
ldap_pvt_thread_mutex_lock( &tcl_interpreter_mutex );
code = Tcl_GlobalEval(ti->ti_ii->interp, command);
results = (char *) strdup(ti->ti_ii->interp->result);
ldap_pvt_thread_mutex_unlock( &tcl_interpreter_mutex );
free(command);
ldap_pvt_thread_mutex_lock (&tcl_interpreter_mutex);
code = Tcl_GlobalEval (ti->ti_ii->interp, command);
results = (char *) strdup (ti->ti_ii->interp->result);
ldap_pvt_thread_mutex_unlock (&tcl_interpreter_mutex);
free (command);
if (code != TCL_OK) {
Debug(LDAP_DEBUG_ANY, "tcl_unbind_error: %s\n", results, 0, 0);
Debug (LDAP_DEBUG_ANY, "tcl_unbind_error: %s\n", results,
0, 0);
}
return 0;
free(results);
return (err);
}

View file

@ -1,5 +1,6 @@
/*
* result.c - tcl backend utility functions
/* result.c - tcl backend utility functions
*
* $Id: tcl_util.c,v 1.2 1999/02/17 01:05:28 bcollins Exp $
*
* Copyright 1999, Ben Collins <bcollins@debian.org>, All rights reserved.
*
@ -7,10 +8,6 @@
* as authorized by the OpenLDAP Public License. A copy of this
* license is available at http://www.OpenLDAP.org/license.html or
* in file LICENSE in the top-level directory of the distribution.
*
* $Id$
*
* $Log$
*/
#include "portable.h"
@ -25,88 +22,99 @@
#include "tcl_back.h"
int
interp_send_results(
Backend *be,
Connection *conn,
Operation *op,
char *result,
char **attrs,
int attrsonly
interp_send_results (
Backend * be,
Connection * conn,
Operation * op,
char *result,
char **attrs,
int attrsonly
)
{
int bsize, len, argcPtr, i, err, code;
char *buf, *bp, **argvPtr, *line, *matched, *info;
Entry *e;
int bsize, len, argcPtr, i, err, code;
char *buf, *bp, **argvPtr, *line, *matched, *info;
Entry *e;
struct tclinfo *ti = (struct tclinfo *) be->be_private;
/* read in the result and send it along */
buf = (char *) ch_malloc( BUFSIZ );
/*
* read in the result and send it along
*/
buf = (char *) ch_malloc (BUFSIZ);
buf[0] = '\0';
bsize = BUFSIZ;
bp = buf;
code = Tcl_SplitList(ti->ti_ii->interp, result, &argcPtr, &argvPtr);
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");
return -1;
}
for ( i = 0 ; i < argcPtr ; i++ ) {
for (i = 0; i < argcPtr; i++) {
line = argvPtr[i];
Debug( LDAP_DEBUG_ANY, "tcl search reading line (%s)\n",
line, 0, 0 );
/* ignore lines beginning with DEBUG: */
if ( strncasecmp( line, "DEBUG:", 6 ) == 0 ) {
/*
* ignore lines beginning with DEBUG:
*/
if (strncasecmp (line, "DEBUG:", 6) == 0) {
continue;
}
len = strlen( line ) + 1;
while ( bp + len - buf > bsize ) {
len = strlen (line) + 1;
while (bp + len - buf > bsize) {
bsize += BUFSIZ;
buf = (char *) ch_realloc( buf, bsize );
buf = (char *) ch_realloc (buf, bsize);
}
sprintf( bp, "%s\n", line );
sprintf (bp, "%s\n", line);
bp += len;
/* line marked the end of an entry or result */
if ( line[0] == '\0' ) {
if ( strncasecmp( buf, "RESULT", 6 ) == 0 ) {
/*
* line marked the end of an entry or result
*/
if (line[0] == '\0') {
if (strncasecmp (buf, "RESULT", 6) == 0) {
break;
}
if ( (e = str2entry( buf )) == NULL ) {
Debug( LDAP_DEBUG_ANY, "str2entry(%s) failed\n",
buf, 0, 0 );
if ((e = str2entry (buf)) == NULL) {
Debug (LDAP_DEBUG_ANY,
"str2entry(%s) failed\n",
buf, 0, 0);
} else {
send_search_entry( be, conn, op, e, attrs,
attrsonly );
entry_free( e );
send_search_entry (be, conn, op, e, attrs,
attrsonly);
entry_free (e);
}
bp = buf;
}
}
(void) str2result( buf, &err, &matched, &info );
(void) str2result (buf, &err, &matched, &info);
/* otherwise, front end will send this result */
if ( err != 0 || op->o_tag != LDAP_REQ_BIND ) {
send_ldap_result( conn, op, err, matched, info );
/*
* otherwise, front end will send this result
*/
if (err != 0 || op->o_tag != LDAP_REQ_BIND) {
send_ldap_result (conn, op, err, matched, info);
}
free( buf );
Tcl_Free( result );
Tcl_Free( (char *) argvPtr );
return( err );
free (buf);
Tcl_Free ((char *) argvPtr);
return (err);
}
char *tcl_clean_entry (Entry *e)
char *
tcl_clean_entry (
Entry * e
)
{
char *entrystr, *mark1, *mark2, *buf, *bp, *dup;
int len, bsize;
pthread_mutex_lock( &entry2str_mutex );
entrystr = entry2str( e, &len, 0 );
pthread_mutex_unlock( &entry2str_mutex );
pthread_mutex_lock (&entry2str_mutex);
entrystr = entry2str (e, &len, 0);
pthread_mutex_unlock (&entry2str_mutex);
buf = (char *) ch_malloc( BUFSIZ );
buf = (char *) ch_malloc (BUFSIZ);
buf[0] = '\0';
bsize = BUFSIZ;
bp = buf;
@ -115,42 +123,68 @@ char *tcl_clean_entry (Entry *e)
mark1 = entrystr;
do {
if (mark1[0] == '\n') {
mark1++;
mark1++;
}
dup = (char *) strdup(mark1);
if (dup[0] != '\0') {
if ((mark2 = (char *) strchr (dup, '\n')) != NULL) {
dup = (char *) strdup (mark1);
if (dup[0] != '\0') {
if ((mark2 = (char *) strchr (dup, '\n')) != NULL) {
mark2[0] = '\0';
}
len = strlen( dup ) + 3;
while ( bp + len - buf > bsize ) {
}
len = strlen (dup) + 3;
while (bp + len - buf > bsize) {
bsize += BUFSIZ;
buf = (char *) ch_realloc( buf, bsize );
}
if (mark1[0] == '\0') {
sprintf(bp, "{} ");
} else {
sprintf(bp, "{%s} ", dup);
}
bp += len;
if (mark2 != NULL) {
buf = (char *) ch_realloc (buf, bsize);
}
if (mark1[0] == '\0') {
sprintf (bp, "{} ");
} else {
sprintf (bp, "{%s} ", dup);
}
bp += len;
if (mark2 != NULL) {
mark2[0] = '\n';
}
}
}
free(dup);
free (dup);
} while ((mark1 = (char *) strchr (mark1, '\n')) != NULL);
return buf;
}
int tcl_ldap_debug (
ClientData clientData,
Tcl_Interp *interp,
int argc,
char *argv[]
int
tcl_ldap_debug (
ClientData clientData,
Tcl_Interp * interp,
int argc,
char *argv[]
)
{
if (argv[1] != NULL) {
Debug(LDAP_DEBUG_ANY, "tcl_debug: %s\n", argv[1], 0, 0);
Debug (LDAP_DEBUG_ANY, "tcl_debug: %s\n", argv[1], 0, 0);
}
return TCL_OK;
}
void
readtclscript (
char *script,
Tcl_Interp * my_tcl)
{
int code;
FILE *f;
f = fopen (script, "r");
if (f == NULL) {
Debug (LDAP_DEBUG_ANY, "Could not open scriptpath %s\n", script,
0, 0);
return;
}
fclose (f);
code = Tcl_EvalFile (my_tcl, script);
if (code != TCL_OK) {
Debug (LDAP_DEBUG_ANY, "%s: %s\n", script,
Tcl_GetVar (my_tcl, "errorInfo", TCL_GLOBAL_ONLY), 0);
Debug (LDAP_DEBUG_ANY, "%s: error at line\n", script,
my_tcl->errorLine, 0);
return;
}
}