mirror of
https://git.openldap.org/openldap/openldap.git
synced 2025-12-20 22:59:34 -05:00
Move back-tcl to the Attic
This commit is contained in:
parent
da6d557cdc
commit
c425a7ce1d
21 changed files with 947 additions and 2737 deletions
66
configure.in
66
configure.in
|
|
@ -238,9 +238,6 @@ OL_ARG_WITH(shell_module,[ --with-shell-module module type static|dynamic],
|
||||||
OL_ARG_ENABLE(sql,[ --enable-sql enable sql backend], no)dnl
|
OL_ARG_ENABLE(sql,[ --enable-sql enable sql backend], no)dnl
|
||||||
OL_ARG_WITH(sql_module,[ --with-sql-module module type static|dynamic], static,
|
OL_ARG_WITH(sql_module,[ --with-sql-module module type static|dynamic], static,
|
||||||
[static dynamic])
|
[static dynamic])
|
||||||
OL_ARG_ENABLE(tcl,[ --enable-tcl enable tcl backend], no)dnl
|
|
||||||
OL_ARG_WITH(tcl_module,[ --with-tcl-module module type static|dynamic], static,
|
|
||||||
[static dynamic])
|
|
||||||
|
|
||||||
dnl ----------------------------------------------------------------
|
dnl ----------------------------------------------------------------
|
||||||
dnl SLAPD Overlay Options
|
dnl SLAPD Overlay Options
|
||||||
|
|
@ -305,9 +302,6 @@ if test $ol_enable_slapd = no ; then
|
||||||
if test $ol_enable_shell = yes ; then
|
if test $ol_enable_shell = yes ; then
|
||||||
AC_MSG_WARN([slapd disabled, ignoring --enable-shell argument])
|
AC_MSG_WARN([slapd disabled, ignoring --enable-shell argument])
|
||||||
fi
|
fi
|
||||||
if test $ol_enable_tcl = yes ; then
|
|
||||||
AC_MSG_WARN([slapd disabled, ignoring --enable-tcl argument])
|
|
||||||
fi
|
|
||||||
if test $ol_enable_sql = yes ; then
|
if test $ol_enable_sql = yes ; then
|
||||||
AC_MSG_WARN([slapd disabled, ignoring --enable-sql argument])
|
AC_MSG_WARN([slapd disabled, ignoring --enable-sql argument])
|
||||||
fi
|
fi
|
||||||
|
|
@ -365,9 +359,6 @@ if test $ol_enable_slapd = no ; then
|
||||||
if test $ol_with_shell_module != static ; then
|
if test $ol_with_shell_module != static ; then
|
||||||
AC_MSG_WARN([slapd disabled, ignoring --with-shell-module argument])
|
AC_MSG_WARN([slapd disabled, ignoring --with-shell-module argument])
|
||||||
fi
|
fi
|
||||||
if test $ol_with_tcl_module != static ; then
|
|
||||||
AC_MSG_WARN([slapd disabled, ignoring --with-tcl-module argument])
|
|
||||||
fi
|
|
||||||
if test $ol_with_sql_module != static ; then
|
if test $ol_with_sql_module != static ; then
|
||||||
AC_MSG_WARN([slapd disabled, ignoring --with-sql-module argument])
|
AC_MSG_WARN([slapd disabled, ignoring --with-sql-module argument])
|
||||||
fi
|
fi
|
||||||
|
|
@ -397,7 +388,6 @@ if test $ol_enable_slapd = no ; then
|
||||||
ol_enable_passwd=no
|
ol_enable_passwd=no
|
||||||
ol_enable_perl=no
|
ol_enable_perl=no
|
||||||
ol_enable_shell=no
|
ol_enable_shell=no
|
||||||
ol_enable_tcl=no
|
|
||||||
ol_enable_sql=no
|
ol_enable_sql=no
|
||||||
|
|
||||||
ol_enable_modules=no
|
ol_enable_modules=no
|
||||||
|
|
@ -421,7 +411,6 @@ if test $ol_enable_slapd = no ; then
|
||||||
ol_with_passwd_module=static
|
ol_with_passwd_module=static
|
||||||
ol_with_perl_module=static
|
ol_with_perl_module=static
|
||||||
ol_with_shell_module=static
|
ol_with_shell_module=static
|
||||||
ol_with_tcl_module=static
|
|
||||||
ol_with_sql_module=static
|
ol_with_sql_module=static
|
||||||
|
|
||||||
ol_enable_slurpd=no
|
ol_enable_slurpd=no
|
||||||
|
|
@ -457,8 +446,7 @@ elif test $ol_enable_ldbm = no ; then
|
||||||
$ol_enable_passwd = no -a \
|
$ol_enable_passwd = no -a \
|
||||||
$ol_enable_perl = no -a \
|
$ol_enable_perl = no -a \
|
||||||
$ol_enable_shell = no -a \
|
$ol_enable_shell = no -a \
|
||||||
$ol_enable_sql = no -a \
|
$ol_enable_sql = no -a ; then
|
||||||
$ol_enable_tcl = no ; then
|
|
||||||
|
|
||||||
if test $ol_enable_slapd = yes ; then
|
if test $ol_enable_slapd = yes ; then
|
||||||
AC_MSG_ERROR([slapd requires a backend])
|
AC_MSG_ERROR([slapd requires a backend])
|
||||||
|
|
@ -575,7 +563,6 @@ BUILD_PASSWD=no
|
||||||
BUILD_PERL=no
|
BUILD_PERL=no
|
||||||
BUILD_SHELL=no
|
BUILD_SHELL=no
|
||||||
BUILD_SQL=no
|
BUILD_SQL=no
|
||||||
BUILD_TCL=no
|
|
||||||
|
|
||||||
BUILD_BDB_DYNAMIC=static
|
BUILD_BDB_DYNAMIC=static
|
||||||
BUILD_DNSSRV_DYNAMIC=static
|
BUILD_DNSSRV_DYNAMIC=static
|
||||||
|
|
@ -588,7 +575,6 @@ BUILD_NULL_DYNAMIC=static
|
||||||
BUILD_PASSWD_DYNAMIC=static
|
BUILD_PASSWD_DYNAMIC=static
|
||||||
BUILD_PERL_DYNAMIC=static
|
BUILD_PERL_DYNAMIC=static
|
||||||
BUILD_SHELL_DYNAMIC=static
|
BUILD_SHELL_DYNAMIC=static
|
||||||
BUILD_TCL_DYNAMIC=static
|
|
||||||
BUILD_SQL_DYNAMIC=static
|
BUILD_SQL_DYNAMIC=static
|
||||||
|
|
||||||
BUILD_DYNGROUP=no
|
BUILD_DYNGROUP=no
|
||||||
|
|
@ -610,7 +596,6 @@ SLAPD_SQL_LDFLAGS=
|
||||||
SLAPD_SQL_LIBS=
|
SLAPD_SQL_LIBS=
|
||||||
SLAPD_SQL_INCLUDES=
|
SLAPD_SQL_INCLUDES=
|
||||||
|
|
||||||
MOD_TCL_LIB=
|
|
||||||
KRB4_LIBS=
|
KRB4_LIBS=
|
||||||
KRB5_LIBS=
|
KRB5_LIBS=
|
||||||
SASL_LIBS=
|
SASL_LIBS=
|
||||||
|
|
@ -822,7 +807,6 @@ else
|
||||||
ol_with_passwd_module=static
|
ol_with_passwd_module=static
|
||||||
ol_with_perl_module=static
|
ol_with_perl_module=static
|
||||||
ol_with_shell_module=static
|
ol_with_shell_module=static
|
||||||
ol_with_tcl_module=static
|
|
||||||
ol_with_sql_module=static
|
ol_with_sql_module=static
|
||||||
if test $ol_with_dyngroup = mod ; then
|
if test $ol_with_dyngroup = mod ; then
|
||||||
AC_MSG_WARN([building static dyngroup overlay])
|
AC_MSG_WARN([building static dyngroup overlay])
|
||||||
|
|
@ -2175,35 +2159,6 @@ if test $ol_enable_sql != no ; then
|
||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
|
|
||||||
dnl ----------------------------------------------------------------
|
|
||||||
dnl TCL
|
|
||||||
if test $ol_enable_tcl != no ; then
|
|
||||||
AC_CHECK_HEADERS(tcl.h)
|
|
||||||
|
|
||||||
if test $ac_cv_header_tcl_h != yes ; then
|
|
||||||
have_tcl=no
|
|
||||||
else
|
|
||||||
for lib in tcl tcl7.6 tcl8.0 tcl8.2 ; do
|
|
||||||
AC_CHECK_LIB($lib,main,
|
|
||||||
[have_tcl=yes
|
|
||||||
if test x"$ol_with_tcl_module" = "xstatic" ; then
|
|
||||||
SLAPD_LIBS="$SLAPD_LIBS -l${lib}"
|
|
||||||
else
|
|
||||||
MOD_TCL_LIB="-l${lib}"
|
|
||||||
fi;break],[have_tcl=no])
|
|
||||||
done
|
|
||||||
fi
|
|
||||||
|
|
||||||
if test $have_tcl != yes ; then
|
|
||||||
AC_MSG_WARN([could not find -ltcl])
|
|
||||||
if test $ol_enable_tcl = yes ; then
|
|
||||||
AC_MSG_ERROR([could not find tcl, select appropriate options or disable])
|
|
||||||
fi
|
|
||||||
|
|
||||||
ol_enable_tcl=no
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
|
|
||||||
dnl ----------------------------------------------------------------
|
dnl ----------------------------------------------------------------
|
||||||
dnl ud needs termcap (should insert check here)
|
dnl ud needs termcap (should insert check here)
|
||||||
ol_link_termcap=no
|
ol_link_termcap=no
|
||||||
|
|
@ -2804,21 +2759,6 @@ if test "$ol_enable_shell" != no ; then
|
||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if test "$ol_enable_tcl" != no ; then
|
|
||||||
AC_DEFINE(SLAPD_TCL,1,[define to support TCL backend])
|
|
||||||
BUILD_SLAPD=yes
|
|
||||||
BUILD_TCL=yes
|
|
||||||
if test "$ol_with_tcl_module" != static; then
|
|
||||||
AC_DEFINE(SLAPD_TCL_DYNAMIC,1,
|
|
||||||
[define to support dynamic TCL backend])
|
|
||||||
BUILD_TCL=mod
|
|
||||||
BUILD_TCL_DYNAMIC=shared
|
|
||||||
SLAPD_DYNAMIC_BACKENDS="$SLAPD_DYNAMIC_BACKENDS back-tcl"
|
|
||||||
else
|
|
||||||
SLAPD_STATIC_BACKENDS="$SLAPD_STATIC_BACKENDS back-tcl"
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
|
|
||||||
if test "$ol_link_sql" != no ; then
|
if test "$ol_link_sql" != no ; then
|
||||||
AC_DEFINE(SLAPD_SQL,1,[define to support SQL backend])
|
AC_DEFINE(SLAPD_SQL,1,[define to support SQL backend])
|
||||||
BUILD_SLAPD=yes
|
BUILD_SLAPD=yes
|
||||||
|
|
@ -2912,7 +2852,6 @@ AC_SUBST(BUILD_SLAPD)
|
||||||
AC_SUBST(BUILD_PERL)
|
AC_SUBST(BUILD_PERL)
|
||||||
AC_SUBST(BUILD_SHELL)
|
AC_SUBST(BUILD_SHELL)
|
||||||
AC_SUBST(BUILD_SQL)
|
AC_SUBST(BUILD_SQL)
|
||||||
AC_SUBST(BUILD_TCL)
|
|
||||||
AC_SUBST(BUILD_BDB_DYNAMIC)
|
AC_SUBST(BUILD_BDB_DYNAMIC)
|
||||||
AC_SUBST(BUILD_DNSSRV_DYNAMIC)
|
AC_SUBST(BUILD_DNSSRV_DYNAMIC)
|
||||||
AC_SUBST(BUILD_HDB_DYNAMIC)
|
AC_SUBST(BUILD_HDB_DYNAMIC)
|
||||||
|
|
@ -2925,7 +2864,6 @@ AC_SUBST(BUILD_SLAPD)
|
||||||
AC_SUBST(BUILD_PERL_DYNAMIC)
|
AC_SUBST(BUILD_PERL_DYNAMIC)
|
||||||
AC_SUBST(BUILD_SHELL_DYNAMIC)
|
AC_SUBST(BUILD_SHELL_DYNAMIC)
|
||||||
AC_SUBST(BUILD_SQL_DYNAMIC)
|
AC_SUBST(BUILD_SQL_DYNAMIC)
|
||||||
AC_SUBST(BUILD_TCL_DYNAMIC)
|
|
||||||
AC_SUBST(BUILD_DYNGROUP)
|
AC_SUBST(BUILD_DYNGROUP)
|
||||||
AC_SUBST(BUILD_PROXYCACHE)
|
AC_SUBST(BUILD_PROXYCACHE)
|
||||||
AC_SUBST(BUILD_SLURPD)
|
AC_SUBST(BUILD_SLURPD)
|
||||||
|
|
@ -2937,7 +2875,6 @@ AC_SUBST(LDBM_LIBS)
|
||||||
AC_SUBST(LTHREAD_LIBS)
|
AC_SUBST(LTHREAD_LIBS)
|
||||||
AC_SUBST(LUTIL_LIBS)
|
AC_SUBST(LUTIL_LIBS)
|
||||||
AC_SUBST(WRAP_LIBS)
|
AC_SUBST(WRAP_LIBS)
|
||||||
AC_SUBST(MOD_TCL_LIB)
|
|
||||||
|
|
||||||
AC_SUBST(SLAPD_MODULES_CPPFLAGS)
|
AC_SUBST(SLAPD_MODULES_CPPFLAGS)
|
||||||
AC_SUBST(SLAPD_MODULES_LDFLAGS)
|
AC_SUBST(SLAPD_MODULES_LDFLAGS)
|
||||||
|
|
@ -3009,7 +2946,6 @@ servers/slapd/back-passwd/Makefile:build/top.mk:servers/slapd/back-passwd/Makefi
|
||||||
servers/slapd/back-perl/Makefile:build/top.mk:servers/slapd/back-perl/Makefile.in:build/mod.mk \
|
servers/slapd/back-perl/Makefile:build/top.mk:servers/slapd/back-perl/Makefile.in:build/mod.mk \
|
||||||
servers/slapd/back-shell/Makefile:build/top.mk:servers/slapd/back-shell/Makefile.in:build/mod.mk \
|
servers/slapd/back-shell/Makefile:build/top.mk:servers/slapd/back-shell/Makefile.in:build/mod.mk \
|
||||||
servers/slapd/back-sql/Makefile:build/top.mk:servers/slapd/back-sql/Makefile.in:build/mod.mk \
|
servers/slapd/back-sql/Makefile:build/top.mk:servers/slapd/back-sql/Makefile.in:build/mod.mk \
|
||||||
servers/slapd/back-tcl/Makefile:build/top.mk:servers/slapd/back-tcl/Makefile.in:build/mod.mk \
|
|
||||||
servers/slapd/shell-backends/Makefile:build/top.mk:servers/slapd/shell-backends/Makefile.in:build/srv.mk \
|
servers/slapd/shell-backends/Makefile:build/top.mk:servers/slapd/shell-backends/Makefile.in:build/srv.mk \
|
||||||
servers/slapd/slapi/Makefile:build/top.mk:servers/slapd/slapi/Makefile.in:build/lib.mk:build/lib-shared.mk \
|
servers/slapd/slapi/Makefile:build/top.mk:servers/slapd/slapi/Makefile.in:build/lib.mk:build/lib-shared.mk \
|
||||||
servers/slapd/overlays/Makefile:build/top.mk:servers/slapd/overlays/Makefile.in:build/lib.mk:build/lib-shared.mk \
|
servers/slapd/overlays/Makefile:build/top.mk:servers/slapd/overlays/Makefile.in:build/lib.mk:build/lib-shared.mk \
|
||||||
|
|
|
||||||
|
|
@ -578,9 +578,6 @@
|
||||||
/* Define if you have the <syslog.h> header file. */
|
/* Define if you have the <syslog.h> header file. */
|
||||||
#undef HAVE_SYSLOG_H
|
#undef HAVE_SYSLOG_H
|
||||||
|
|
||||||
/* Define if you have the <tcl.h> header file. */
|
|
||||||
#undef HAVE_TCL_H
|
|
||||||
|
|
||||||
/* Define if you have the <tcpd.h> header file. */
|
/* Define if you have the <tcpd.h> header file. */
|
||||||
#undef HAVE_TCPD_H
|
#undef HAVE_TCPD_H
|
||||||
|
|
||||||
|
|
@ -1028,12 +1025,6 @@
|
||||||
/* define to support dynamic SHELL backend */
|
/* define to support dynamic SHELL backend */
|
||||||
#undef SLAPD_SHELL_DYNAMIC
|
#undef SLAPD_SHELL_DYNAMIC
|
||||||
|
|
||||||
/* define to support TCL backend */
|
|
||||||
#undef SLAPD_TCL
|
|
||||||
|
|
||||||
/* define to support dynamic TCL backend */
|
|
||||||
#undef SLAPD_TCL_DYNAMIC
|
|
||||||
|
|
||||||
/* define to support SQL backend */
|
/* define to support SQL backend */
|
||||||
#undef SLAPD_SQL
|
#undef SLAPD_SQL
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,56 +0,0 @@
|
||||||
# Makefile.in for back-tcl
|
|
||||||
# $OpenLDAP$
|
|
||||||
## This work is part of OpenLDAP Software <http://www.openldap.org/>.
|
|
||||||
##
|
|
||||||
## Copyright 1998-2003 The OpenLDAP Foundation.
|
|
||||||
## All rights reserved.
|
|
||||||
##
|
|
||||||
## Redistribution and use in source and binary forms, with or without
|
|
||||||
## modification, are permitted only as authorized by the OpenLDAP
|
|
||||||
## Public License.
|
|
||||||
##
|
|
||||||
## A copy of this license is available in the file LICENSE in the
|
|
||||||
## top-level directory of the distribution or, alternatively, at
|
|
||||||
## <http://www.OpenLDAP.org/license.html>.
|
|
||||||
###########################################################################
|
|
||||||
#
|
|
||||||
# Copyright 1999, Ben Collins <bcollins@debian.org>, All rights reserved.
|
|
||||||
#
|
|
||||||
# Redistribution and use in source and binary forms are permitted only
|
|
||||||
# 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.
|
|
||||||
#
|
|
||||||
##########################################################################
|
|
||||||
|
|
||||||
SRCS = tcl_init.c tcl_search.c tcl_close.c tcl_config.c tcl_bind.c \
|
|
||||||
tcl_unbind.c tcl_compare.c tcl_modify.c tcl_add.c tcl_modrdn.c \
|
|
||||||
tcl_delete.c tcl_abandon.c tcl_util.c
|
|
||||||
OBJS = tcl_init.lo tcl_search.lo tcl_close.lo tcl_config.lo tcl_bind.lo \
|
|
||||||
tcl_unbind.lo tcl_compare.lo tcl_modify.lo tcl_add.lo tcl_modrdn.lo \
|
|
||||||
tcl_delete.lo tcl_abandon.lo tcl_util.lo
|
|
||||||
|
|
||||||
LDAP_INCDIR= ../../../include
|
|
||||||
LDAP_LIBDIR= ../../../libraries
|
|
||||||
|
|
||||||
BUILD_OPT = "--enable-tcl"
|
|
||||||
BUILD_MOD = @BUILD_TCL@
|
|
||||||
BUILD_MOD_DYNAMIC = @BUILD_TCL_DYNAMIC@
|
|
||||||
|
|
||||||
mod_DEFS = -DSLAPD_IMPORT
|
|
||||||
MOD_DEFS = $(@BUILD_TCL@_DEFS)
|
|
||||||
|
|
||||||
shared_LDAP_LIBS = $(LDAP_LIBLDAP_R_LA) $(LDAP_LIBLBER_LA)
|
|
||||||
NT_LINK_LIBS = -L.. -lslapd $(@BUILD_LIBS_DYNAMIC@_LDAP_LIBS)
|
|
||||||
UNIX_LINK_LIBS = $(@BUILD_LIBS_DYNAMIC@_LDAP_LIBS)
|
|
||||||
|
|
||||||
LIBBASE = back_tcl
|
|
||||||
|
|
||||||
XDEFS = $(MODULES_CPPFLAGS)
|
|
||||||
XINCPATH = -I.. -I$(srcdir)/..
|
|
||||||
|
|
||||||
all-local-lib: ../.backend
|
|
||||||
|
|
||||||
../.backend: lib$(LIBBASE).a
|
|
||||||
@touch $@
|
|
||||||
|
|
||||||
|
|
@ -1 +0,0 @@
|
||||||
The Tcl Backend is described in the slapd-tcl(5) manual page.
|
|
||||||
|
|
@ -1,4 +0,0 @@
|
||||||
* lock mutex on a per interpreter basis instead of global
|
|
||||||
|
|
||||||
* Add a version, callable from the tcl script for checking features
|
|
||||||
|
|
||||||
|
|
@ -1,40 +0,0 @@
|
||||||
/* $OpenLDAP$ */
|
|
||||||
|
|
||||||
#ifndef _TCL_EXTERNAL_H
|
|
||||||
#define _TCL_EXTERNAL_H
|
|
||||||
|
|
||||||
LDAP_BEGIN_DECL
|
|
||||||
|
|
||||||
extern BI_init tcl_back_initialize;
|
|
||||||
extern BI_open tcl_back_open;
|
|
||||||
extern BI_close tcl_back_close;
|
|
||||||
extern BI_destroy tcl_back_destroy;
|
|
||||||
|
|
||||||
extern BI_db_init tcl_back_db_init;
|
|
||||||
extern BI_db_open tcl_back_db_open;
|
|
||||||
extern BI_db_close tcl_back_db_close;
|
|
||||||
extern BI_db_destroy tcl_back_db_destroy;
|
|
||||||
|
|
||||||
extern BI_db_config tcl_back_db_config;
|
|
||||||
|
|
||||||
extern BI_op_bind tcl_back_bind;
|
|
||||||
|
|
||||||
extern BI_op_unbind tcl_back_unbind;
|
|
||||||
|
|
||||||
extern BI_op_search tcl_back_search;
|
|
||||||
|
|
||||||
extern BI_op_compare tcl_back_compare;
|
|
||||||
|
|
||||||
extern BI_op_modify tcl_back_modify;
|
|
||||||
|
|
||||||
extern BI_op_modrdn tcl_back_modrdn;
|
|
||||||
|
|
||||||
extern BI_op_add tcl_back_add;
|
|
||||||
|
|
||||||
extern BI_op_delete tcl_back_delete;
|
|
||||||
|
|
||||||
extern BI_op_abandon tcl_back_abandon;
|
|
||||||
|
|
||||||
LDAP_END_DECL
|
|
||||||
|
|
||||||
#endif /* _TCL_EXTERNAL_H */
|
|
||||||
|
|
@ -1,59 +0,0 @@
|
||||||
/* $OpenLDAP$ */
|
|
||||||
/* abandon.c - tcl abandon routine
|
|
||||||
*
|
|
||||||
* Copyright 1999, Ben Collins <bcollins@debian.org>, All rights reserved.
|
|
||||||
*
|
|
||||||
* Redistribution and use in source and binary forms are permitted only
|
|
||||||
* 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.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "portable.h"
|
|
||||||
|
|
||||||
#include <stdio.h>
|
|
||||||
|
|
||||||
#include "slap.h"
|
|
||||||
#include "tcl_back.h"
|
|
||||||
|
|
||||||
int
|
|
||||||
tcl_back_abandon (
|
|
||||||
Operation * op,
|
|
||||||
SlapReply * rs
|
|
||||||
)
|
|
||||||
{
|
|
||||||
char *results, *command;
|
|
||||||
struct berval suf_tcl;
|
|
||||||
int code, err = 0;
|
|
||||||
struct tclinfo *ti = (struct tclinfo *) op->o_bd->be_private;
|
|
||||||
|
|
||||||
if (ti->ti_abandon.bv_len == 0) {
|
|
||||||
return (-1);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (tcl_merge_bvlist(op->o_bd->be_suffix, &suf_tcl) == NULL) {
|
|
||||||
return (-1);
|
|
||||||
}
|
|
||||||
|
|
||||||
command = (char *) ch_malloc (ti->ti_abandon.bv_len + suf_tcl.bv_len
|
|
||||||
+ 80);
|
|
||||||
sprintf (command, "%s ABANDON {%ld/%ld} {%s} {%ld/%d}",
|
|
||||||
ti->ti_abandon.bv_val, op->o_connid, (long) op->o_msgid,
|
|
||||||
suf_tcl.bv_val, op->o_connid, op->oq_abandon.rs_msgid);
|
|
||||||
Tcl_Free (suf_tcl.bv_val);
|
|
||||||
|
|
||||||
ldap_pvt_thread_mutex_lock (&tcl_interpreter_mutex);
|
|
||||||
code = Tcl_GlobalEval (ti->ti_ii->interp, command);
|
|
||||||
results = (char *) ch_strdup (ti->ti_ii->interp->result);
|
|
||||||
ldap_pvt_thread_mutex_unlock (&tcl_interpreter_mutex);
|
|
||||||
free (command);
|
|
||||||
|
|
||||||
if (code != TCL_OK) {
|
|
||||||
err = LDAP_OTHER;
|
|
||||||
Debug (LDAP_DEBUG_SHELL, "tcl_abandon_error: %s\n", results,
|
|
||||||
0, 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
free (results);
|
|
||||||
return (err);
|
|
||||||
}
|
|
||||||
|
|
@ -1,71 +0,0 @@
|
||||||
/* $OpenLDAP$ */
|
|
||||||
/* add.c - tcl add routine
|
|
||||||
*
|
|
||||||
* Copyright 1999, Ben Collins <bcollins@debian.org>, All rights reserved.
|
|
||||||
*
|
|
||||||
* Redistribution and use in source and binary forms are permitted only
|
|
||||||
* 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.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "portable.h"
|
|
||||||
|
|
||||||
#include <stdio.h>
|
|
||||||
|
|
||||||
#include "slap.h"
|
|
||||||
#include "tcl_back.h"
|
|
||||||
|
|
||||||
int
|
|
||||||
tcl_back_add (
|
|
||||||
Operation * op,
|
|
||||||
SlapReply * rs
|
|
||||||
)
|
|
||||||
{
|
|
||||||
char *command, *entrystr, *results;
|
|
||||||
struct berval suf_tcl;
|
|
||||||
int code;
|
|
||||||
struct tclinfo *ti = (struct tclinfo *) op->o_bd->be_private;
|
|
||||||
|
|
||||||
if (ti->ti_add.bv_len == 0) {
|
|
||||||
send_ldap_error (op, rs, LDAP_UNWILLING_TO_PERFORM,
|
|
||||||
"add not implemented" );
|
|
||||||
return (-1);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (tcl_merge_bvlist (op->o_bd->be_suffix, &suf_tcl) == NULL) {
|
|
||||||
send_ldap_error (op, rs, LDAP_OTHER, NULL);
|
|
||||||
return (-1);
|
|
||||||
}
|
|
||||||
|
|
||||||
entrystr = tcl_clean_entry(op->oq_add.rs_e);
|
|
||||||
|
|
||||||
command = (char *) ch_malloc (ti->ti_add.bv_len + suf_tcl.bv_len +
|
|
||||||
strlen(entrystr) + 52);
|
|
||||||
sprintf (command, "%s ADD {%ld/%ld} {%s} {%s}",
|
|
||||||
ti->ti_add.bv_val, op->o_connid, (long) op->o_msgid,
|
|
||||||
suf_tcl.bv_val, entrystr);
|
|
||||||
Tcl_Free (suf_tcl.bv_val);
|
|
||||||
free (entrystr);
|
|
||||||
|
|
||||||
ldap_pvt_thread_mutex_lock (&tcl_interpreter_mutex);
|
|
||||||
code = Tcl_GlobalEval (ti->ti_ii->interp, command);
|
|
||||||
results = (char *) ch_strdup (ti->ti_ii->interp->result);
|
|
||||||
ldap_pvt_thread_mutex_unlock (&tcl_interpreter_mutex);
|
|
||||||
free (command);
|
|
||||||
|
|
||||||
if (code != TCL_OK) {
|
|
||||||
rs->sr_err = LDAP_OTHER;
|
|
||||||
Debug (LDAP_DEBUG_SHELL, "tcl_add_error: %s\n", results, 0, 0);
|
|
||||||
} else {
|
|
||||||
interp_send_results (op, rs, results);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (rs->sr_err != LDAP_SUCCESS) {
|
|
||||||
rs->sr_text = "internal backend error";
|
|
||||||
send_ldap_result (op, rs);
|
|
||||||
}
|
|
||||||
|
|
||||||
free (results);
|
|
||||||
return (rs->sr_err);
|
|
||||||
}
|
|
||||||
|
|
@ -1,62 +0,0 @@
|
||||||
/* $OpenLDAP$ */
|
|
||||||
/* tcl_back.h - tcl backend header (structs, functions)
|
|
||||||
*
|
|
||||||
* Copyright 1999, Ben Collins <bcollins@debian.org>, All rights reserved.
|
|
||||||
*
|
|
||||||
* Redistribution and use in source and binary forms are permitted only
|
|
||||||
* 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.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include <tcl.h>
|
|
||||||
|
|
||||||
#ifndef SLAPD_TCL_H
|
|
||||||
#define SLAPD_TCL_H
|
|
||||||
|
|
||||||
#include <ldap_cdefs.h>
|
|
||||||
#include "external.h"
|
|
||||||
|
|
||||||
extern ldap_pvt_thread_mutex_t tcl_interpreter_mutex;
|
|
||||||
|
|
||||||
struct i_info {
|
|
||||||
Tcl_Interp *interp;
|
|
||||||
char *name;
|
|
||||||
struct i_info *next;
|
|
||||||
int count;
|
|
||||||
};
|
|
||||||
|
|
||||||
extern struct i_info *global_i;
|
|
||||||
|
|
||||||
struct tclinfo {
|
|
||||||
struct berval ti_script_path;
|
|
||||||
struct i_info *ti_ii;
|
|
||||||
struct berval ti_bind;
|
|
||||||
struct berval ti_unbind;
|
|
||||||
struct berval ti_search;
|
|
||||||
struct berval ti_compare;
|
|
||||||
struct berval ti_modify;
|
|
||||||
struct berval ti_modrdn;
|
|
||||||
struct berval ti_add;
|
|
||||||
struct berval ti_delete;
|
|
||||||
struct berval ti_abandon;
|
|
||||||
};
|
|
||||||
|
|
||||||
void readtclscript (char *script, Tcl_Interp * my_tcl);
|
|
||||||
char *tcl_clean_entry (Entry * e);
|
|
||||||
struct berval *tcl_merge_bvlist (BerVarray bvlist, struct berval *out);
|
|
||||||
|
|
||||||
int tcl_ldap_debug (
|
|
||||||
ClientData clientData,
|
|
||||||
Tcl_Interp * interp,
|
|
||||||
int argc,
|
|
||||||
char *argv[]
|
|
||||||
);
|
|
||||||
|
|
||||||
int interp_send_results (
|
|
||||||
Operation * op,
|
|
||||||
SlapReply * rs,
|
|
||||||
char *result
|
|
||||||
);
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
@ -1,68 +0,0 @@
|
||||||
/* $OpenLDAP$ */
|
|
||||||
/* bind.c - tcl bind routines
|
|
||||||
*
|
|
||||||
* Copyright 1999, Ben Collins <bcollins@debian.org>, All rights reserved.
|
|
||||||
*
|
|
||||||
* Redistribution and use in source and binary forms are permitted only
|
|
||||||
* 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.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "portable.h"
|
|
||||||
|
|
||||||
#include <stdio.h>
|
|
||||||
|
|
||||||
#include "slap.h"
|
|
||||||
#include "tcl_back.h"
|
|
||||||
|
|
||||||
int
|
|
||||||
tcl_back_bind (
|
|
||||||
Operation * op,
|
|
||||||
SlapReply * rs )
|
|
||||||
{
|
|
||||||
char *command, *results;
|
|
||||||
struct berval suf_tcl;
|
|
||||||
int code;
|
|
||||||
struct tclinfo *ti = (struct tclinfo *) op->o_bd->be_private;
|
|
||||||
|
|
||||||
if (ti->ti_bind.bv_len == 0) {
|
|
||||||
send_ldap_error (op, rs, LDAP_UNWILLING_TO_PERFORM,
|
|
||||||
"bind not implemented" );
|
|
||||||
return (-1);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (tcl_merge_bvlist (op->o_bd->be_suffix, &suf_tcl) == NULL) {
|
|
||||||
send_ldap_error (op, rs, LDAP_OTHER, NULL );
|
|
||||||
return (-1);
|
|
||||||
}
|
|
||||||
|
|
||||||
command = (char *) ch_malloc (ti->ti_bind.bv_len + suf_tcl.bv_len +
|
|
||||||
op->o_req_dn.bv_len + op->oq_bind.rb_cred.bv_len + 84);
|
|
||||||
sprintf (command, "%s BIND {%ld/%ld} {%s} {%s} {%d} {%lu} {%s}",
|
|
||||||
ti->ti_bind.bv_val, op->o_connid, (long) op->o_msgid,
|
|
||||||
suf_tcl.bv_val,
|
|
||||||
op->o_req_dn.bv_val, op->oq_bind.rb_method, op->oq_bind.rb_cred.bv_len, op->oq_bind.rb_cred.bv_val);
|
|
||||||
Tcl_Free (suf_tcl.bv_val);
|
|
||||||
|
|
||||||
ldap_pvt_thread_mutex_lock (&tcl_interpreter_mutex);
|
|
||||||
code = Tcl_GlobalEval (ti->ti_ii->interp, command);
|
|
||||||
results = (char *) ch_strdup (ti->ti_ii->interp->result);
|
|
||||||
ldap_pvt_thread_mutex_unlock (&tcl_interpreter_mutex);
|
|
||||||
free (command);
|
|
||||||
|
|
||||||
if (code != TCL_OK) {
|
|
||||||
rs->sr_err = LDAP_OTHER;
|
|
||||||
Debug (LDAP_DEBUG_SHELL, "tcl_bind_error: %s\n", results, 0, 0);
|
|
||||||
} else {
|
|
||||||
rs->sr_err = interp_send_results (op, rs, results);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (rs->sr_err != LDAP_SUCCESS) {
|
|
||||||
rs->sr_text = "internal backend error";
|
|
||||||
send_ldap_result (op, rs);
|
|
||||||
}
|
|
||||||
|
|
||||||
free (results);
|
|
||||||
return (rs->sr_err);
|
|
||||||
}
|
|
||||||
|
|
@ -1,82 +0,0 @@
|
||||||
/* $OpenLDAP$ */
|
|
||||||
/* close.c - tcl close routines
|
|
||||||
*
|
|
||||||
* Copyright 1999, Ben Collins <bcollins@debian.org>, All rights reserved.
|
|
||||||
*
|
|
||||||
* Redistribution and use in source and binary forms are permitted only
|
|
||||||
* 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.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "portable.h"
|
|
||||||
|
|
||||||
#include <stdio.h>
|
|
||||||
|
|
||||||
#include "slap.h"
|
|
||||||
#include "tcl_back.h"
|
|
||||||
|
|
||||||
int
|
|
||||||
tcl_back_close (
|
|
||||||
BackendInfo * bi
|
|
||||||
)
|
|
||||||
{
|
|
||||||
Tcl_DeleteInterp (global_i->interp);
|
|
||||||
|
|
||||||
return (0);
|
|
||||||
}
|
|
||||||
|
|
||||||
int
|
|
||||||
tcl_back_destroy (
|
|
||||||
BackendInfo * bi
|
|
||||||
)
|
|
||||||
{
|
|
||||||
free (global_i->interp);
|
|
||||||
free (global_i);
|
|
||||||
ldap_pvt_thread_mutex_destroy (&tcl_interpreter_mutex);
|
|
||||||
|
|
||||||
return (0);
|
|
||||||
}
|
|
||||||
|
|
||||||
int
|
|
||||||
tcl_back_db_close (
|
|
||||||
BackendDB * bd
|
|
||||||
)
|
|
||||||
{
|
|
||||||
struct tclinfo *ti = (struct tclinfo *) bd->be_private;
|
|
||||||
struct i_info *ti_tmp;
|
|
||||||
|
|
||||||
/* Disable the interp and associated struct */
|
|
||||||
ti->ti_ii->count--;
|
|
||||||
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);
|
|
||||||
/* This bypasses this interp struct in the global hash */
|
|
||||||
ti_tmp->next = ti->ti_ii->next;
|
|
||||||
Tcl_DeleteInterp (ti->ti_ii->interp);
|
|
||||||
}
|
|
||||||
return (0);
|
|
||||||
}
|
|
||||||
|
|
||||||
int
|
|
||||||
tcl_back_db_destroy (
|
|
||||||
BackendDB * bd
|
|
||||||
)
|
|
||||||
{
|
|
||||||
struct tclinfo *ti = (struct tclinfo *) bd->be_private;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Now free up the allocated memory used
|
|
||||||
*/
|
|
||||||
ti->ti_ii->count--;
|
|
||||||
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);
|
|
||||||
bd->be_private = NULL;
|
|
||||||
|
|
||||||
return (0);
|
|
||||||
}
|
|
||||||
|
|
@ -1,71 +0,0 @@
|
||||||
/* $OpenLDAP$ */
|
|
||||||
/* compare.c - tcl compare routines
|
|
||||||
*
|
|
||||||
* Copyright 1999, Ben Collins <bcollins@debian.org>, All rights reserved.
|
|
||||||
*
|
|
||||||
* Redistribution and use in source and binary forms are permitted only
|
|
||||||
* 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.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "portable.h"
|
|
||||||
|
|
||||||
#include <stdio.h>
|
|
||||||
|
|
||||||
#include "slap.h"
|
|
||||||
#include "tcl_back.h"
|
|
||||||
|
|
||||||
int
|
|
||||||
tcl_back_compare (
|
|
||||||
Operation * op,
|
|
||||||
SlapReply * rs
|
|
||||||
)
|
|
||||||
{
|
|
||||||
char *command, *results;
|
|
||||||
struct berval suf_tcl;
|
|
||||||
int code;
|
|
||||||
struct tclinfo *ti = (struct tclinfo *) op->o_bd->be_private;
|
|
||||||
|
|
||||||
if (ti->ti_compare.bv_len == 0) {
|
|
||||||
send_ldap_error (op, rs, LDAP_UNWILLING_TO_PERFORM,
|
|
||||||
"compare not implemented" );
|
|
||||||
return (-1);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (tcl_merge_bvlist (op->o_bd->be_suffix, &suf_tcl) == NULL) {
|
|
||||||
send_ldap_error (op, rs, LDAP_OTHER, NULL );
|
|
||||||
return (-1);
|
|
||||||
}
|
|
||||||
|
|
||||||
command = (char *) ch_malloc (ti->ti_compare.bv_len +
|
|
||||||
suf_tcl.bv_len + op->o_req_dn.bv_len + op->oq_compare.rs_ava->aa_desc->ad_cname.bv_len +
|
|
||||||
op->oq_compare.rs_ava->aa_value.bv_len + 84);
|
|
||||||
sprintf (command, "%s COMPARE {%ld/%ld} {%s} {%s} {%s: %s}",
|
|
||||||
ti->ti_compare.bv_val, op->o_connid, (long) op->o_msgid,
|
|
||||||
suf_tcl.bv_val, op->o_req_dn.bv_val,
|
|
||||||
op->oq_compare.rs_ava->aa_desc->ad_cname.bv_val, op->oq_compare.rs_ava->aa_value.bv_val);
|
|
||||||
Tcl_Free (suf_tcl.bv_val);
|
|
||||||
|
|
||||||
ldap_pvt_thread_mutex_lock (&tcl_interpreter_mutex);
|
|
||||||
code = Tcl_GlobalEval (ti->ti_ii->interp, command);
|
|
||||||
results = (char *) ch_strdup (ti->ti_ii->interp->result);
|
|
||||||
ldap_pvt_thread_mutex_unlock (&tcl_interpreter_mutex);
|
|
||||||
free (command);
|
|
||||||
|
|
||||||
if (code != TCL_OK) {
|
|
||||||
rs->sr_err = LDAP_OTHER;
|
|
||||||
Debug (LDAP_DEBUG_SHELL, "tcl_compare_error: %s\n", results,
|
|
||||||
0, 0);
|
|
||||||
} else {
|
|
||||||
interp_send_results (op, rs, results);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (rs->sr_err != LDAP_SUCCESS) {
|
|
||||||
rs->sr_text = "internal backend error";
|
|
||||||
send_ldap_result (op, rs);
|
|
||||||
}
|
|
||||||
|
|
||||||
free (results);
|
|
||||||
return (rs->sr_err);
|
|
||||||
}
|
|
||||||
|
|
@ -1,181 +0,0 @@
|
||||||
/* $OpenLDAP$ */
|
|
||||||
/* config.c - tcl backend configuration file routine
|
|
||||||
*
|
|
||||||
* Copyright 1999, Ben Collins <bcollins@debian.org>, All rights reserved.
|
|
||||||
*
|
|
||||||
* Redistribution and use in source and binary forms are permitted only
|
|
||||||
* 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.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "portable.h"
|
|
||||||
|
|
||||||
#include <stdio.h>
|
|
||||||
|
|
||||||
#include "slap.h"
|
|
||||||
#include "tcl_back.h"
|
|
||||||
|
|
||||||
struct i_info *global_i;
|
|
||||||
|
|
||||||
int
|
|
||||||
tcl_back_db_config (
|
|
||||||
BackendDB * bd,
|
|
||||||
const char *fname,
|
|
||||||
int lineno,
|
|
||||||
int argc,
|
|
||||||
char **argv
|
|
||||||
)
|
|
||||||
{
|
|
||||||
struct tclinfo *ti = (struct tclinfo *) bd->be_private;
|
|
||||||
|
|
||||||
if (ti == NULL) {
|
|
||||||
fprintf (stderr,
|
|
||||||
"%s: line %d: tcl backend info is null!\n", fname,
|
|
||||||
lineno);
|
|
||||||
return (1);
|
|
||||||
}
|
|
||||||
if (ti->ti_ii == NULL) {
|
|
||||||
ti->ti_ii = global_i;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Script to load */
|
|
||||||
if (strcasecmp (argv[0], "scriptpath") == 0) {
|
|
||||||
if (argc < 2) {
|
|
||||||
Debug (LDAP_DEBUG_CONFIG,
|
|
||||||
"%s: line %d: missing script in \"scriptpath <script>\" line\n",
|
|
||||||
fname, lineno, 0);
|
|
||||||
return (1);
|
|
||||||
}
|
|
||||||
ber_str2bv( argv[1], 0, 1, &ti->ti_script_path );
|
|
||||||
|
|
||||||
/* use local interpreter */
|
|
||||||
} else if (strcasecmp (argv[0], "tclrealm") == 0) {
|
|
||||||
struct i_info *ii;
|
|
||||||
|
|
||||||
if (argc < 2) {
|
|
||||||
Debug (LDAP_DEBUG_CONFIG,
|
|
||||||
"%s: line %d: missing script in \"tclrealm <name>\" line\n",
|
|
||||||
fname, lineno, 0);
|
|
||||||
return (1);
|
|
||||||
}
|
|
||||||
ti->ti_ii = NULL;
|
|
||||||
|
|
||||||
ii = global_i;
|
|
||||||
/* Try to see if it already exists */
|
|
||||||
do {
|
|
||||||
if (ii != NULL && !strcasecmp (ii->name, argv[1]))
|
|
||||||
ti->ti_ii = ii;
|
|
||||||
if (ii->next != NULL)
|
|
||||||
ii = ii->next;
|
|
||||||
} while (ii->next != NULL);
|
|
||||||
|
|
||||||
if (ti->ti_ii == NULL) { /* we need to make a new one */
|
|
||||||
ii->next = (struct i_info *) ch_malloc
|
|
||||||
(sizeof (struct i_info));
|
|
||||||
|
|
||||||
ii->next->count = 0;
|
|
||||||
ii->next->name = (char *) ch_strdup (argv[1]);
|
|
||||||
ii->next->interp = NULL;
|
|
||||||
ii->next->next = NULL;
|
|
||||||
ti->ti_ii = ii->next;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* proc for binds */
|
|
||||||
} else if (strcasecmp (argv[0], "bind") == 0) {
|
|
||||||
if (argc < 2) {
|
|
||||||
Debug (LDAP_DEBUG_CONFIG,
|
|
||||||
"%s: line %d: missing proc in \"bind <proc>\" line\n",
|
|
||||||
fname, lineno, 0);
|
|
||||||
return (1);
|
|
||||||
}
|
|
||||||
ber_str2bv( argv[1], 0, 1, &ti->ti_bind );
|
|
||||||
|
|
||||||
/* proc for unbinds */
|
|
||||||
} else if (strcasecmp (argv[0], "unbind") == 0) {
|
|
||||||
if (argc < 2) {
|
|
||||||
Debug (LDAP_DEBUG_CONFIG,
|
|
||||||
"%s: line %d: missing proc in \"unbind <proc>\" line\n",
|
|
||||||
fname, lineno, 0);
|
|
||||||
return (1);
|
|
||||||
}
|
|
||||||
ber_str2bv( argv[1], 0, 1, &ti->ti_unbind );
|
|
||||||
|
|
||||||
/* proc for search */
|
|
||||||
} else if (strcasecmp (argv[0], "search") == 0) {
|
|
||||||
if (argc < 2) {
|
|
||||||
Debug (LDAP_DEBUG_CONFIG,
|
|
||||||
"%s: line %d: missing proc in \"search <proc>\" line\n",
|
|
||||||
fname, lineno, 0);
|
|
||||||
return (1);
|
|
||||||
}
|
|
||||||
ber_str2bv( argv[1], 0, 1, &ti->ti_search );
|
|
||||||
|
|
||||||
/* proc for compares */
|
|
||||||
} else if (strcasecmp (argv[0], "compare") == 0) {
|
|
||||||
if (argc < 2) {
|
|
||||||
Debug (LDAP_DEBUG_CONFIG,
|
|
||||||
"%s: line %d: missing proc in \"compare <proc>\" line\n",
|
|
||||||
fname, lineno, 0);
|
|
||||||
return (1);
|
|
||||||
}
|
|
||||||
ber_str2bv( argv[1], 0, 1, &ti->ti_compare );
|
|
||||||
|
|
||||||
/* proc for modify */
|
|
||||||
} else if (strcasecmp (argv[0], "modify") == 0) {
|
|
||||||
if (argc < 2) {
|
|
||||||
Debug (LDAP_DEBUG_CONFIG,
|
|
||||||
"%s: line %d: missing proc in \"modify <proc>\" line\n",
|
|
||||||
fname, lineno, 0);
|
|
||||||
return (1);
|
|
||||||
}
|
|
||||||
ber_str2bv( argv[1], 0, 1, &ti->ti_modify );
|
|
||||||
|
|
||||||
/* proc for modrdn */
|
|
||||||
} else if (strcasecmp (argv[0], "modrdn") == 0) {
|
|
||||||
if (argc < 2) {
|
|
||||||
Debug (LDAP_DEBUG_CONFIG,
|
|
||||||
"%s: line %d: missing proc in \"modrdn <proc>\" line\n",
|
|
||||||
fname, lineno, 0);
|
|
||||||
return (1);
|
|
||||||
}
|
|
||||||
ber_str2bv( argv[1], 0, 1, &ti->ti_modrdn );
|
|
||||||
|
|
||||||
/* proc for add */
|
|
||||||
} else if (strcasecmp (argv[0], "add") == 0) {
|
|
||||||
if (argc < 2) {
|
|
||||||
Debug (LDAP_DEBUG_CONFIG,
|
|
||||||
"%s: line %d: missing proc in \"add <proc>\" line\n",
|
|
||||||
fname, lineno, 0);
|
|
||||||
return (1);
|
|
||||||
}
|
|
||||||
ber_str2bv( argv[1], 0, 1, &ti->ti_add );
|
|
||||||
|
|
||||||
/* proc for delete */
|
|
||||||
} else if (strcasecmp (argv[0], "delete") == 0) {
|
|
||||||
if (argc < 2) {
|
|
||||||
Debug (LDAP_DEBUG_CONFIG,
|
|
||||||
"%s: line %d: missing proc in \"delete <proc>\" line\n",
|
|
||||||
fname, lineno, 0);
|
|
||||||
return (1);
|
|
||||||
}
|
|
||||||
ber_str2bv( argv[1], 0, 1, &ti->ti_delete );
|
|
||||||
|
|
||||||
/* proc for abandon */
|
|
||||||
} else if (strcasecmp (argv[0], "abandon") == 0) {
|
|
||||||
if (argc < 2) {
|
|
||||||
Debug (LDAP_DEBUG_CONFIG,
|
|
||||||
"%s: line %d: missing proc in \"abandon <proc>\" line\n",
|
|
||||||
fname, lineno, 0);
|
|
||||||
return (1);
|
|
||||||
}
|
|
||||||
ber_str2bv( argv[1], 0, 1, &ti->ti_abandon );
|
|
||||||
|
|
||||||
} else {
|
|
||||||
Debug (LDAP_DEBUG_CONFIG,
|
|
||||||
"Unknown tcl backend config: %s\n", argv[0], 0, 0);
|
|
||||||
return (1);
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
@ -1,69 +0,0 @@
|
||||||
/* $OpenLDAP$ */
|
|
||||||
/* delete.c - tcl delete routines
|
|
||||||
*
|
|
||||||
* Copyright 1999, Ben Collins <bcollins@debian.org>, All rights reserved.
|
|
||||||
*
|
|
||||||
* Redistribution and use in source and binary forms are permitted only
|
|
||||||
* 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.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "portable.h"
|
|
||||||
|
|
||||||
#include <stdio.h>
|
|
||||||
|
|
||||||
#include "slap.h"
|
|
||||||
#include "tcl_back.h"
|
|
||||||
|
|
||||||
int
|
|
||||||
tcl_back_delete (
|
|
||||||
Operation * op,
|
|
||||||
SlapReply * rs
|
|
||||||
)
|
|
||||||
{
|
|
||||||
char *command, *results;
|
|
||||||
struct berval suf_tcl;
|
|
||||||
int code, err = 0;
|
|
||||||
struct tclinfo *ti = (struct tclinfo *) op->o_bd->be_private;
|
|
||||||
|
|
||||||
if (ti->ti_delete.bv_len == 0) {
|
|
||||||
send_ldap_error (op, rs, LDAP_UNWILLING_TO_PERFORM,
|
|
||||||
"delete not implemented" );
|
|
||||||
return (-1);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (tcl_merge_bvlist (op->o_bd->be_suffix, &suf_tcl) == NULL) {
|
|
||||||
send_ldap_error (op, rs, LDAP_OTHER, NULL);
|
|
||||||
return (-1);
|
|
||||||
}
|
|
||||||
|
|
||||||
command = (char *) ch_malloc (ti->ti_delete.bv_len + suf_tcl.bv_len
|
|
||||||
+ op->o_req_dn.bv_len + 84);
|
|
||||||
sprintf (command, "%s DELETE {%ld/%ld} {%s} {%s}",
|
|
||||||
ti->ti_delete.bv_val, op->o_connid, (long) op->o_msgid,
|
|
||||||
suf_tcl.bv_val, op->o_req_dn.bv_val);
|
|
||||||
Tcl_Free (suf_tcl.bv_val);
|
|
||||||
|
|
||||||
ldap_pvt_thread_mutex_lock (&tcl_interpreter_mutex);
|
|
||||||
code = Tcl_GlobalEval (ti->ti_ii->interp, command);
|
|
||||||
results = (char *) ch_strdup (ti->ti_ii->interp->result);
|
|
||||||
ldap_pvt_thread_mutex_unlock (&tcl_interpreter_mutex);
|
|
||||||
free (command);
|
|
||||||
|
|
||||||
if (code != TCL_OK) {
|
|
||||||
rs->sr_err = LDAP_OTHER;
|
|
||||||
Debug (LDAP_DEBUG_SHELL, "tcl_delete_error: %s\n", results,
|
|
||||||
0, 0);
|
|
||||||
} else {
|
|
||||||
interp_send_results (op, rs, results);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (rs->sr_err != LDAP_SUCCESS) {
|
|
||||||
rs->sr_text = "internal backend error";
|
|
||||||
send_ldap_result (op, rs);
|
|
||||||
}
|
|
||||||
|
|
||||||
free (results);
|
|
||||||
return (rs->sr_err);
|
|
||||||
}
|
|
||||||
|
|
@ -1,174 +0,0 @@
|
||||||
/* $OpenLDAP$ */
|
|
||||||
/* tcl_init.c - tcl backend initialization
|
|
||||||
*
|
|
||||||
* Copyright 1999, Ben Collins <bcollins@debian.org>, All rights reserved.
|
|
||||||
*
|
|
||||||
* Redistribution and use in source and binary forms are permitted only
|
|
||||||
* 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.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "portable.h"
|
|
||||||
|
|
||||||
#include <stdio.h>
|
|
||||||
|
|
||||||
#include <ac/socket.h>
|
|
||||||
|
|
||||||
#include "slap.h"
|
|
||||||
#include "tcl_back.h"
|
|
||||||
|
|
||||||
ldap_pvt_thread_mutex_t tcl_interpreter_mutex;
|
|
||||||
|
|
||||||
#ifdef SLAPD_TCL_DYNAMIC
|
|
||||||
|
|
||||||
void init_module(int argc, char *argv[]) {
|
|
||||||
BackendInfo bi;
|
|
||||||
|
|
||||||
memset( &bi, '\0', sizeof(bi) );
|
|
||||||
bi.bi_type = "tcl";
|
|
||||||
bi.bi_init = tcl_back_initialize;
|
|
||||||
|
|
||||||
backend_add(&bi);
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif /* SLAPD_TCL_DYNAMIC */
|
|
||||||
|
|
||||||
int
|
|
||||||
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;
|
|
||||||
global_i->interp = Tcl_CreateInterp ();
|
|
||||||
Tcl_Init (global_i->interp);
|
|
||||||
|
|
||||||
/* Initialize the global interpreter lock */
|
|
||||||
ldap_pvt_thread_mutex_init (&tcl_interpreter_mutex);
|
|
||||||
|
|
||||||
bi->bi_open = tcl_back_open;
|
|
||||||
bi->bi_config = 0;
|
|
||||||
bi->bi_close = tcl_back_close;
|
|
||||||
bi->bi_destroy = tcl_back_destroy;
|
|
||||||
|
|
||||||
bi->bi_db_init = tcl_back_db_init;
|
|
||||||
bi->bi_db_config = tcl_back_db_config;
|
|
||||||
bi->bi_db_open = tcl_back_db_open;
|
|
||||||
bi->bi_db_close = tcl_back_db_close;
|
|
||||||
bi->bi_db_destroy = tcl_back_db_destroy;
|
|
||||||
|
|
||||||
bi->bi_op_bind = tcl_back_bind;
|
|
||||||
bi->bi_op_unbind = tcl_back_unbind;
|
|
||||||
bi->bi_op_search = tcl_back_search;
|
|
||||||
bi->bi_op_compare = tcl_back_compare;
|
|
||||||
bi->bi_op_modify = tcl_back_modify;
|
|
||||||
bi->bi_op_modrdn = tcl_back_modrdn;
|
|
||||||
bi->bi_op_add = tcl_back_add;
|
|
||||||
bi->bi_op_delete = tcl_back_delete;
|
|
||||||
bi->bi_op_abandon = tcl_back_abandon;
|
|
||||||
|
|
||||||
bi->bi_chk_referrals = 0;
|
|
||||||
|
|
||||||
bi->bi_connection_init = 0;
|
|
||||||
bi->bi_connection_destroy = 0;
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
int
|
|
||||||
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;
|
|
||||||
global_i->interp = Tcl_CreateInterp ();
|
|
||||||
Tcl_Init (global_i->interp);
|
|
||||||
|
|
||||||
/* Initialize the global interpreter lock */
|
|
||||||
ldap_pvt_thread_mutex_init (&tcl_interpreter_mutex);
|
|
||||||
|
|
||||||
return (0);
|
|
||||||
}
|
|
||||||
|
|
||||||
int
|
|
||||||
tcl_back_db_init (
|
|
||||||
Backend * be
|
|
||||||
)
|
|
||||||
{
|
|
||||||
struct tclinfo *ti;
|
|
||||||
|
|
||||||
ti = (struct tclinfo *) ch_calloc (1, sizeof (struct tclinfo));
|
|
||||||
|
|
||||||
ti->ti_script_path.bv_len = 0;
|
|
||||||
ti->ti_script_path.bv_val = NULL;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* For some reason this causes problems
|
|
||||||
* specifically set to NULL
|
|
||||||
*/
|
|
||||||
ti->ti_bind.bv_len = 0;
|
|
||||||
ti->ti_bind.bv_val = NULL;
|
|
||||||
|
|
||||||
ti->ti_unbind.bv_len = 0;
|
|
||||||
ti->ti_unbind.bv_val = NULL;
|
|
||||||
|
|
||||||
ti->ti_search.bv_len = 0;
|
|
||||||
ti->ti_search.bv_val = NULL;
|
|
||||||
|
|
||||||
ti->ti_compare.bv_len = 0;
|
|
||||||
ti->ti_compare.bv_val = NULL;
|
|
||||||
|
|
||||||
ti->ti_modify.bv_len = 0;
|
|
||||||
ti->ti_modify.bv_val = NULL;
|
|
||||||
|
|
||||||
ti->ti_modrdn.bv_len = 0;
|
|
||||||
ti->ti_modrdn.bv_val = NULL;
|
|
||||||
|
|
||||||
ti->ti_add.bv_len = 0;
|
|
||||||
ti->ti_add.bv_val = NULL;
|
|
||||||
|
|
||||||
ti->ti_delete.bv_len = 0;
|
|
||||||
ti->ti_delete.bv_val = NULL;
|
|
||||||
|
|
||||||
ti->ti_abandon.bv_len = 0;
|
|
||||||
ti->ti_abandon.bv_val = NULL;
|
|
||||||
|
|
||||||
be->be_private = ti;
|
|
||||||
|
|
||||||
return ti == NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
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 */
|
|
||||||
ti->ti_ii->interp = Tcl_CreateInterp ();
|
|
||||||
Tcl_Init (ti->ti_ii->interp);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* raise that count for the interpreter */
|
|
||||||
ti->ti_ii->count++;
|
|
||||||
|
|
||||||
/* now let's (try to) load the script */
|
|
||||||
readtclscript (ti->ti_script_path.bv_val, ti->ti_ii->interp);
|
|
||||||
|
|
||||||
/* install the debug command */
|
|
||||||
Tcl_CreateCommand (ti->ti_ii->interp, "ldap:debug", &tcl_ldap_debug,
|
|
||||||
NULL, NULL);
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
@ -1,125 +0,0 @@
|
||||||
/* $OpenLDAP$ */
|
|
||||||
/* modify.c - tcl modify routines
|
|
||||||
*
|
|
||||||
* Copyright 1999, Ben Collins <bcollins@debian.org>, All rights reserved.
|
|
||||||
*
|
|
||||||
* Redistribution and use in source and binary forms are permitted only
|
|
||||||
* 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.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "portable.h"
|
|
||||||
|
|
||||||
#include <stdio.h>
|
|
||||||
|
|
||||||
#include "slap.h"
|
|
||||||
#include "tcl_back.h"
|
|
||||||
|
|
||||||
int
|
|
||||||
tcl_back_modify (
|
|
||||||
Operation * op,
|
|
||||||
SlapReply * rs
|
|
||||||
)
|
|
||||||
{
|
|
||||||
char *command, *bp, *tcl_mods, *results;
|
|
||||||
struct berval suf_tcl;
|
|
||||||
int i, code, len, bsize;
|
|
||||||
struct tclinfo *ti = (struct tclinfo *) op->o_bd->be_private;
|
|
||||||
Modifications *modlist = op->oq_modify.rs_modlist;
|
|
||||||
|
|
||||||
if (ti->ti_modify.bv_len == 0) {
|
|
||||||
send_ldap_error (op, rs, LDAP_UNWILLING_TO_PERFORM,
|
|
||||||
"modify not implemented" );
|
|
||||||
return (-1);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (tcl_merge_bvlist (op->o_bd->be_suffix, &suf_tcl) == NULL) {
|
|
||||||
send_ldap_error (op, rs, LDAP_OTHER, NULL);
|
|
||||||
return (-1);
|
|
||||||
}
|
|
||||||
|
|
||||||
tcl_mods = (char *) ch_malloc (BUFSIZ);
|
|
||||||
tcl_mods[0] = '\0';
|
|
||||||
bsize = BUFSIZ;
|
|
||||||
bp = tcl_mods;
|
|
||||||
|
|
||||||
for (; modlist != NULL; modlist = modlist->sml_next) {
|
|
||||||
Modification *mods = &modlist->sml_mod;
|
|
||||||
const struct berval
|
|
||||||
op_add = { sizeof("add") - 1, "add" },
|
|
||||||
op_delete = { sizeof("delete") - 1, "delete" },
|
|
||||||
op_replace = { sizeof("replace") - 1, "replace" },
|
|
||||||
*op = NULL;
|
|
||||||
|
|
||||||
switch (mods->sm_op & ~LDAP_MOD_BVALUES) {
|
|
||||||
case LDAP_MOD_ADD:
|
|
||||||
op = &op_add;
|
|
||||||
break;
|
|
||||||
case LDAP_MOD_DELETE:
|
|
||||||
op = &op_delete;
|
|
||||||
break;
|
|
||||||
case LDAP_MOD_REPLACE:
|
|
||||||
op = &op_replace;
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
assert(0);
|
|
||||||
}
|
|
||||||
|
|
||||||
len = mods->sm_type.bv_len + op->bv_len + 7;
|
|
||||||
while (bp + len - tcl_mods > bsize) {
|
|
||||||
bsize += BUFSIZ;
|
|
||||||
tcl_mods = (char *) ch_realloc (tcl_mods, bsize);
|
|
||||||
}
|
|
||||||
sprintf (bp, "{ {%s: %s} ", op->bv_val, mods->sm_type.bv_val);
|
|
||||||
bp += len;
|
|
||||||
for (i = 0;
|
|
||||||
mods->sm_bvalues != NULL && mods->sm_bvalues[i].bv_val
|
|
||||||
!= NULL;
|
|
||||||
i++) {
|
|
||||||
len = mods->sm_type.bv_len +
|
|
||||||
mods->sm_bvalues[i].bv_len + 5 +
|
|
||||||
(mods->sm_bvalues[i + 1].bv_val == NULL ? 2 : 0);
|
|
||||||
while (bp + len - tcl_mods > bsize) {
|
|
||||||
bsize += BUFSIZ;
|
|
||||||
tcl_mods = (char *) ch_realloc (tcl_mods, bsize);
|
|
||||||
}
|
|
||||||
sprintf (bp, "{%s: %s} %s", mods->sm_type.bv_val,
|
|
||||||
mods->sm_bvalues[i].bv_val,
|
|
||||||
mods->sm_bvalues[i + 1].bv_val ==
|
|
||||||
NULL ? "} " : "");
|
|
||||||
bp += len;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
command = (char *) ch_malloc (ti->ti_modify.bv_len + suf_tcl.bv_len
|
|
||||||
+ op->o_req_dn.bv_len + strlen (tcl_mods) + 84);
|
|
||||||
/* This space is simply for aesthetics--\ */
|
|
||||||
sprintf (command, "%s MODIFY {%ld/%ld} {%s} {%s} { %s}",
|
|
||||||
ti->ti_modify.bv_val, op->o_connid, (long) op->o_msgid,
|
|
||||||
suf_tcl.bv_val, op->o_req_dn.bv_val, tcl_mods);
|
|
||||||
Tcl_Free (suf_tcl.bv_val);
|
|
||||||
free (tcl_mods);
|
|
||||||
|
|
||||||
ldap_pvt_thread_mutex_lock (&tcl_interpreter_mutex);
|
|
||||||
code = Tcl_GlobalEval (ti->ti_ii->interp, command);
|
|
||||||
results = (char *) ch_strdup (ti->ti_ii->interp->result);
|
|
||||||
ldap_pvt_thread_mutex_unlock (&tcl_interpreter_mutex);
|
|
||||||
free (command);
|
|
||||||
|
|
||||||
if (code != TCL_OK) {
|
|
||||||
rs->sr_err = LDAP_OTHER;
|
|
||||||
Debug (LDAP_DEBUG_SHELL, "tcl_modify_error: %s\n", results,
|
|
||||||
0, 0);
|
|
||||||
} else {
|
|
||||||
interp_send_results (op, rs, results);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (rs->sr_err != LDAP_SUCCESS) {
|
|
||||||
rs->sr_text = "internal backend error";
|
|
||||||
send_ldap_result (op, rs);
|
|
||||||
}
|
|
||||||
|
|
||||||
free (results);
|
|
||||||
return (rs->sr_err);
|
|
||||||
}
|
|
||||||
|
|
@ -1,93 +0,0 @@
|
||||||
/* $OpenLDAP$ */
|
|
||||||
/* modrdn.c - tcl modify rdn routines
|
|
||||||
*
|
|
||||||
* Copyright 1999, Ben Collins <bcollins@debian.org>, All rights reserved.
|
|
||||||
*
|
|
||||||
* Redistribution and use in source and binary forms are permitted only
|
|
||||||
* 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.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
* LDAP v3 newSuperior support.
|
|
||||||
*
|
|
||||||
* Copyright 1999, Juan C. Gomez, All rights reserved.
|
|
||||||
* This software is not subject to any license of Silicon Graphics
|
|
||||||
* Inc. or Purdue University.
|
|
||||||
*
|
|
||||||
* Redistribution and use in source and binary forms are permitted
|
|
||||||
* without restriction or fee of any kind as long as this notice
|
|
||||||
* is preserved.
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "portable.h"
|
|
||||||
|
|
||||||
#include <stdio.h>
|
|
||||||
|
|
||||||
#include "slap.h"
|
|
||||||
#include "tcl_back.h"
|
|
||||||
|
|
||||||
int
|
|
||||||
tcl_back_modrdn (
|
|
||||||
Operation * op,
|
|
||||||
SlapReply * rs
|
|
||||||
)
|
|
||||||
{
|
|
||||||
char *command, *results;
|
|
||||||
struct berval suf_tcl;
|
|
||||||
int code;
|
|
||||||
struct tclinfo *ti = (struct tclinfo *) op->o_bd->be_private;
|
|
||||||
|
|
||||||
if (ti->ti_modrdn.bv_len == 0) {
|
|
||||||
send_ldap_error (op, rs, LDAP_UNWILLING_TO_PERFORM,
|
|
||||||
"modrdn not implemented" );
|
|
||||||
return (-1);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (tcl_merge_bvlist (op->o_bd->be_suffix, &suf_tcl) == NULL) {
|
|
||||||
send_ldap_error (op, rs, LDAP_OTHER, NULL);
|
|
||||||
return (-1);
|
|
||||||
}
|
|
||||||
|
|
||||||
command = (char *) ch_malloc (ti->ti_modrdn.bv_len + suf_tcl.bv_len
|
|
||||||
+ op->o_req_dn.bv_len + op->oq_modrdn.rs_newrdn.bv_len
|
|
||||||
+ (op->oq_modrdn.rs_newSup ? op->oq_modrdn.rs_newSup->bv_len : 0) + 84);
|
|
||||||
if ( op->oq_modrdn.rs_newSup ) {
|
|
||||||
sprintf (command, "%s MODRDN {%ld/%ld} {%s} {%s} {%s} %d {%s}",
|
|
||||||
ti->ti_modrdn.bv_val,
|
|
||||||
op->o_connid, (long) op->o_msgid,
|
|
||||||
suf_tcl.bv_val, op->o_req_dn.bv_val,
|
|
||||||
op->oq_modrdn.rs_newrdn.bv_val, op->oq_modrdn.rs_deleteoldrdn ? 1 : 0,
|
|
||||||
op->oq_modrdn.rs_newSup->bv_val );
|
|
||||||
} else {
|
|
||||||
sprintf (command, "%s MODRDN {%ld} {%s} {%s} {%s} %d",
|
|
||||||
ti->ti_modrdn.bv_val, (long) op->o_msgid,
|
|
||||||
suf_tcl.bv_val, op->o_req_dn.bv_val,
|
|
||||||
op->oq_modrdn.rs_newrdn.bv_val, op->oq_modrdn.rs_deleteoldrdn ? 1 : 0 );
|
|
||||||
}
|
|
||||||
Tcl_Free (suf_tcl.bv_val);
|
|
||||||
|
|
||||||
ldap_pvt_thread_mutex_lock (&tcl_interpreter_mutex);
|
|
||||||
code = Tcl_GlobalEval (ti->ti_ii->interp, command);
|
|
||||||
results = (char *) ch_strdup (ti->ti_ii->interp->result);
|
|
||||||
ldap_pvt_thread_mutex_unlock (&tcl_interpreter_mutex);
|
|
||||||
free (command);
|
|
||||||
|
|
||||||
if (code != TCL_OK) {
|
|
||||||
rs->sr_err = LDAP_OTHER;
|
|
||||||
Debug (LDAP_DEBUG_SHELL, "tcl_modrdn_error: %s\n", results,
|
|
||||||
0, 0);
|
|
||||||
} else {
|
|
||||||
interp_send_results (op, rs, results);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (rs->sr_err != LDAP_SUCCESS) {
|
|
||||||
rs->sr_text = "internal backend error";
|
|
||||||
send_ldap_result (op, rs);
|
|
||||||
}
|
|
||||||
|
|
||||||
free (results);
|
|
||||||
return (rs->sr_err);
|
|
||||||
}
|
|
||||||
|
|
@ -1,85 +0,0 @@
|
||||||
/* $OpenLDAP$ */
|
|
||||||
/* search.c - tcl search routines
|
|
||||||
*
|
|
||||||
* Copyright 1999, Ben Collins <bcollins@debian.org>, All rights reserved.
|
|
||||||
*
|
|
||||||
* Redistribution and use in source and binary forms are permitted only
|
|
||||||
* 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.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "portable.h"
|
|
||||||
|
|
||||||
#include <stdio.h>
|
|
||||||
|
|
||||||
#include "slap.h"
|
|
||||||
#include "tcl_back.h"
|
|
||||||
|
|
||||||
int
|
|
||||||
tcl_back_search (
|
|
||||||
Operation * op,
|
|
||||||
SlapReply * rs )
|
|
||||||
{
|
|
||||||
char *attrs_tcl = NULL, *results, *command;
|
|
||||||
struct berval suf_tcl;
|
|
||||||
int i, code;
|
|
||||||
struct tclinfo *ti = (struct tclinfo *) op->o_bd->be_private;
|
|
||||||
AttributeName *an;
|
|
||||||
|
|
||||||
if (ti->ti_search.bv_len == 0) {
|
|
||||||
send_ldap_error (op, rs, LDAP_UNWILLING_TO_PERFORM,
|
|
||||||
"search not implemented" );
|
|
||||||
return (-1);
|
|
||||||
}
|
|
||||||
|
|
||||||
for (i = 0, an = op->oq_search.rs_attrs; an && an->an_name.bv_val; an++, i++);
|
|
||||||
if (i > 0) {
|
|
||||||
char **sattrs = ch_malloc( (i+1) * sizeof(char *));
|
|
||||||
for (i = 0, an = op->oq_search.rs_attrs; an->an_name.bv_val; an++, i++)
|
|
||||||
sattrs[i] = an->an_name.bv_val;
|
|
||||||
sattrs[i] = NULL;
|
|
||||||
attrs_tcl = Tcl_Merge (i, sattrs);
|
|
||||||
ch_free(sattrs);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (tcl_merge_bvlist (op->o_bd->be_suffix, &suf_tcl) == NULL) {
|
|
||||||
Tcl_Free (attrs_tcl);
|
|
||||||
send_ldap_error (op, rs, LDAP_OTHER, NULL);
|
|
||||||
return (-1);
|
|
||||||
}
|
|
||||||
|
|
||||||
command = (char *) ch_malloc (ti->ti_search.bv_len + suf_tcl.bv_len
|
|
||||||
+ op->o_req_dn.bv_len + 60 + op->oq_search.rs_filterstr.bv_len +
|
|
||||||
(attrs_tcl == NULL ? 5 : strlen (attrs_tcl)) + 72);
|
|
||||||
sprintf (command,
|
|
||||||
"%s SEARCH {%ld/%ld} {%s} {%s} {%d} {%d} {%d} {%d} {%s} {%d} {%s}",
|
|
||||||
ti->ti_search.bv_val, op->o_connid, (long) op->o_msgid,
|
|
||||||
suf_tcl.bv_val, op->o_req_dn.bv_val, op->oq_search.rs_scope, op->oq_search.rs_deref,
|
|
||||||
op->oq_search.rs_slimit, op->oq_search.rs_tlimit, op->oq_search.rs_filterstr.bv_val,
|
|
||||||
op->oq_search.rs_attrsonly ? 1 : 0, attrs_tcl == NULL ? "{all}" : attrs_tcl);
|
|
||||||
Tcl_Free (attrs_tcl);
|
|
||||||
Tcl_Free (suf_tcl.bv_val);
|
|
||||||
|
|
||||||
ldap_pvt_thread_mutex_lock (&tcl_interpreter_mutex);
|
|
||||||
code = Tcl_GlobalEval (ti->ti_ii->interp, command);
|
|
||||||
results = (char *) ch_strdup (ti->ti_ii->interp->result);
|
|
||||||
ldap_pvt_thread_mutex_unlock (&tcl_interpreter_mutex);
|
|
||||||
free (command);
|
|
||||||
|
|
||||||
if (code != TCL_OK) {
|
|
||||||
rs->sr_err = LDAP_OTHER;
|
|
||||||
Debug (LDAP_DEBUG_SHELL, "tcl_search_error: %s\n", results,
|
|
||||||
0, 0);
|
|
||||||
} else {
|
|
||||||
interp_send_results (op, rs, results );
|
|
||||||
}
|
|
||||||
|
|
||||||
if (rs->sr_err != LDAP_SUCCESS) {
|
|
||||||
rs->sr_text = "internal backend error";
|
|
||||||
send_ldap_result (op, rs );
|
|
||||||
}
|
|
||||||
|
|
||||||
free (results);
|
|
||||||
return (rs->sr_err);
|
|
||||||
}
|
|
||||||
|
|
@ -1,58 +0,0 @@
|
||||||
/* $OpenLDAP$ */
|
|
||||||
/* unbind.c - tcl unbind routines
|
|
||||||
*
|
|
||||||
* Copyright 1999, Ben Collins <bcollins@debian.org>, All rights reserved.
|
|
||||||
*
|
|
||||||
* Redistribution and use in source and binary forms are permitted only
|
|
||||||
* 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.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "portable.h"
|
|
||||||
|
|
||||||
#include <stdio.h>
|
|
||||||
|
|
||||||
#include "slap.h"
|
|
||||||
#include "tcl_back.h"
|
|
||||||
|
|
||||||
int
|
|
||||||
tcl_back_unbind (
|
|
||||||
Operation * op,
|
|
||||||
SlapReply * rs
|
|
||||||
)
|
|
||||||
{
|
|
||||||
char *command, *results;
|
|
||||||
struct berval suf_tcl;
|
|
||||||
int code, err = 0;
|
|
||||||
struct tclinfo *ti = (struct tclinfo *) op->o_bd->be_private;
|
|
||||||
|
|
||||||
if (ti->ti_unbind.bv_len == 0) {
|
|
||||||
return (-1);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (tcl_merge_bvlist (op->o_bd->be_suffix, &suf_tcl) == NULL) {
|
|
||||||
return (-1);
|
|
||||||
}
|
|
||||||
|
|
||||||
command = (char *) ch_malloc (ti->ti_unbind.bv_len + suf_tcl.bv_len
|
|
||||||
+ op->o_conn->c_dn.bv_len + 84);
|
|
||||||
sprintf (command, "%s UNBIND {%ld/%ld} {%s} {%s}",
|
|
||||||
ti->ti_unbind.bv_val, op->o_connid, (long) op->o_msgid,
|
|
||||||
suf_tcl.bv_val, op->o_conn->c_dn.bv_val ? op->o_conn->c_dn.bv_val : "");
|
|
||||||
Tcl_Free (suf_tcl.bv_val);
|
|
||||||
|
|
||||||
ldap_pvt_thread_mutex_lock (&tcl_interpreter_mutex);
|
|
||||||
code = Tcl_GlobalEval (ti->ti_ii->interp, command);
|
|
||||||
results = (char *) ch_strdup (ti->ti_ii->interp->result);
|
|
||||||
ldap_pvt_thread_mutex_unlock (&tcl_interpreter_mutex);
|
|
||||||
free (command);
|
|
||||||
|
|
||||||
if (code != TCL_OK) {
|
|
||||||
Debug (LDAP_DEBUG_SHELL, "tcl_unbind_error: %s\n", results,
|
|
||||||
0, 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
free (results);
|
|
||||||
return (err);
|
|
||||||
}
|
|
||||||
|
|
@ -1,231 +0,0 @@
|
||||||
/* $OpenLDAP$ */
|
|
||||||
/* result.c - tcl backend utility functions
|
|
||||||
*
|
|
||||||
* Copyright 1999, Ben Collins <bcollins@debian.org>, All rights reserved.
|
|
||||||
*
|
|
||||||
* Redistribution and use in source and binary forms are permitted only
|
|
||||||
* 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.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "portable.h"
|
|
||||||
|
|
||||||
#include <stdio.h>
|
|
||||||
|
|
||||||
#include <ac/string.h>
|
|
||||||
#include <ac/socket.h>
|
|
||||||
#include <ac/unistd.h>
|
|
||||||
|
|
||||||
#include "slap.h"
|
|
||||||
#include "tcl_back.h"
|
|
||||||
|
|
||||||
int
|
|
||||||
interp_send_results (
|
|
||||||
Operation * op,
|
|
||||||
SlapReply * rs,
|
|
||||||
char *result
|
|
||||||
)
|
|
||||||
{
|
|
||||||
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
|
|
||||||
*/
|
|
||||||
buf = (char *) ch_malloc (BUFSIZ);
|
|
||||||
buf[0] = '\0';
|
|
||||||
bsize = BUFSIZ;
|
|
||||||
bp = buf;
|
|
||||||
code = Tcl_SplitList (ti->ti_ii->interp, result, &argcPtr, &argvPtr);
|
|
||||||
if (code != TCL_OK) {
|
|
||||||
argcPtr = 0;
|
|
||||||
send_ldap_error (op, rs, LDAP_UNWILLING_TO_PERFORM,
|
|
||||||
"internal backend error" );
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
for (i = 0; i < argcPtr; i++) {
|
|
||||||
line = argvPtr[i];
|
|
||||||
|
|
||||||
/*
|
|
||||||
* ignore lines beginning with DEBUG:
|
|
||||||
*/
|
|
||||||
if (strncasecmp (line, "DEBUG:", 6) == 0) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
len = strlen (line) + 1;
|
|
||||||
while (bp + len - buf > bsize) {
|
|
||||||
bsize += BUFSIZ;
|
|
||||||
buf = (char *) ch_realloc (buf, bsize);
|
|
||||||
}
|
|
||||||
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) {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
if ((rs->sr_entry = str2entry (buf)) == NULL) {
|
|
||||||
Debug (LDAP_DEBUG_SHELL,
|
|
||||||
"str2entry(%s) failed\n",
|
|
||||||
buf, 0, 0);
|
|
||||||
} else {
|
|
||||||
rs->sr_attrs = op->oq_search.rs_attrs;
|
|
||||||
send_search_entry (op, rs);
|
|
||||||
entry_free (rs->sr_entry);
|
|
||||||
}
|
|
||||||
|
|
||||||
bp = buf;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
(void) str2result (buf, &rs->sr_err, (char **)&rs->sr_matched, (char **)&rs->sr_text);
|
|
||||||
|
|
||||||
/*
|
|
||||||
* otherwise, front end will send this result
|
|
||||||
*/
|
|
||||||
if (rs->sr_err != 0 || op->o_tag != LDAP_REQ_BIND) {
|
|
||||||
send_ldap_result (op, rs);
|
|
||||||
}
|
|
||||||
|
|
||||||
free (buf);
|
|
||||||
Tcl_Free ((char *) argvPtr);
|
|
||||||
return (rs->sr_err);
|
|
||||||
}
|
|
||||||
|
|
||||||
char *
|
|
||||||
tcl_clean_entry (
|
|
||||||
Entry * e
|
|
||||||
)
|
|
||||||
{
|
|
||||||
char *entrystr, *mark1, *mark2, *buf, *bp, *dup;
|
|
||||||
int len, bsize;
|
|
||||||
|
|
||||||
ldap_pvt_thread_mutex_lock(&entry2str_mutex);
|
|
||||||
entrystr = entry2str (e, &len);
|
|
||||||
|
|
||||||
buf = (char *) ch_malloc (BUFSIZ);
|
|
||||||
buf[0] = '\0';
|
|
||||||
bsize = BUFSIZ;
|
|
||||||
bp = buf;
|
|
||||||
bp++[0] = ' ';
|
|
||||||
|
|
||||||
mark1 = entrystr;
|
|
||||||
do {
|
|
||||||
if (mark1[0] == '\n') {
|
|
||||||
mark1++;
|
|
||||||
}
|
|
||||||
dup = (char *) ch_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) {
|
|
||||||
bsize += BUFSIZ;
|
|
||||||
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);
|
|
||||||
} while ((mark1 = (char *) strchr (mark1, '\n')) != NULL);
|
|
||||||
|
|
||||||
ldap_pvt_thread_mutex_unlock (&entry2str_mutex);
|
|
||||||
return buf;
|
|
||||||
}
|
|
||||||
|
|
||||||
int
|
|
||||||
tcl_ldap_debug (
|
|
||||||
ClientData clientData,
|
|
||||||
Tcl_Interp * interp,
|
|
||||||
int argc,
|
|
||||||
char *argv[]
|
|
||||||
)
|
|
||||||
{
|
|
||||||
if (argv[1] != NULL) {
|
|
||||||
Debug (LDAP_DEBUG_SHELL, "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_SHELL, "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_SHELL, "%s: %s\n", script,
|
|
||||||
Tcl_GetVar (my_tcl, "errorInfo", TCL_GLOBAL_ONLY), 0);
|
|
||||||
Debug (LDAP_DEBUG_SHELL, "%s: error at line\n", script,
|
|
||||||
my_tcl->errorLine, 0);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
struct berval *
|
|
||||||
tcl_merge_bvlist(
|
|
||||||
BerVarray bvlist, struct berval *out)
|
|
||||||
{
|
|
||||||
struct berval *ret = NULL;
|
|
||||||
int i;
|
|
||||||
|
|
||||||
if (bvlist == NULL)
|
|
||||||
return NULL;
|
|
||||||
|
|
||||||
if (out == NULL) {
|
|
||||||
ret = (struct berval *)ch_malloc(sizeof(struct berval));
|
|
||||||
if (ret == NULL) {
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
ret = out;
|
|
||||||
}
|
|
||||||
|
|
||||||
ret->bv_len = 0;
|
|
||||||
ret->bv_val = NULL;
|
|
||||||
|
|
||||||
for (i = 0; bvlist[i].bv_val != NULL; i++);
|
|
||||||
|
|
||||||
if (i) {
|
|
||||||
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;
|
|
||||||
}
|
|
||||||
|
|
||||||
Loading…
Reference in a new issue