annotate modules/ldap/eldap.c @ 2367:ecf1ebac70d8

[xemacs-hg @ 2004-11-04 23:05:23 by ben] commit mega-patch configure.in: Turn off -Winline and -Wchar-subscripts. Use the right set of cflags when compiling modules. Rewrite ldap configuration to separate the inclusion of lber (needed in recent Cygwin) from the basic checks for the needed libraries. add a function for MAKE_JUNK_C; initially code was added to generate xemacs.def using this, but it will need to be rewritten. add an rm -f for junk.c to avoid weird Cygwin bug with cp -f onto an existing file. Sort list of auto-detected functions and eliminate unused checks for stpcpy, setlocale and getwd. Add autodetection of Cygwin scanf problems BETA: Rewrite section on configure to indicate what flags are important and what not. digest-doc.c, make-dump-id.c, profile.c, sorted-doc.c: Add proper decls for main(). make-msgfile.c: Document that this is old junk. Move proposal to text.c. make-msgfile.lex: Move proposal to text.c. make-mswin-unicode.pl: Convert error-generating code so that the entire message will be seen as a single unrecognized token. mule/mule-ccl.el: Update docs. lispref/mule.texi: Update CCL docs. ldap/eldap.c: Mule-ize. Use EXTERNAL_LIST_LOOP_2 instead of deleted EXTERNAL_LIST_LOOP. * XEmacs 21.5.18 "chestnut" is released. --------------------------------------------------------------- MULE-RELATED WORK: --------------------------------------------------------------- --------------------------- byte-char conversion --------------------------- buffer.c, buffer.h, insdel.c, text.c: Port FSF algorithm for byte-char conversion, replacing broken previous version. Track the char position of the gap. Add functions to do char-byte conversion downwards as well as upwards. Move comments about algorithm workings to internals manual. --------------------------- work on types --------------------------- alloc.c, console-x-impl.h, dump-data.c, dump-data.h, dumper.c, dialog-msw.c, dired-msw.c, doc.c, editfns.c, esd.c, event-gtk.h, event-msw.c, events.c, file-coding.c, file-coding.h, fns.c, glyphs-eimage.c, glyphs-gtk.c, glyphs-msw.c, glyphs-shared.c, glyphs-x.c, glyphs.c, glyphs.h, gui.c, hpplay.c, imgproc.c, intl-win32.c, lrecord.h, lstream.c, keymap.c, lisp.h, libsst.c, linuxplay.c, miscplay.c, miscplay.h, mule-coding.c, nas.c, nt.c, ntheap.c, ntplay.c, objects-msw.c, objects-tty.c, objects-x.c, print.c, process-nt.c, process.c, redisplay.h, select-common.h, select-gtk.c, select-x.c, sgiplay.c, sound.c, sound.h, sunplay.c, sysfile.h, sysdep.c, syswindows.h, text.c, unexnt.c, win32.c, xgccache.c: Further work on types. This creates a full set of types for all the basic semantics of `char' that I have so far identified, so that its semantics can always be identified for the purposes of proper Mule-safe code, and the raw use of `char' always avoided. (1) More type renaming, for consistency of naming. Char_ASCII -> Ascbyte UChar_ASCII -> UAscbyte Char_Binary -> CBinbyte UChar_Binary -> Binbyte SChar_Binary -> SBinbyte (2) Introduce Rawbyte, CRawbyte, Boolbyte, Chbyte, UChbyte, and Bitbyte and use them. (3) New types Itext, Wexttext and Textcount for separating out the concepts of bytes and textual units (different under UTF-16 and UTF-32, which are potential internal encodings). (4) qxestr*_c -> qxestr*_ascii. lisp.h: New; goes with other qxe() functions. #### Maybe goes in a different section. lisp.h: Group generic int-type defs together with EMACS_INT defs. lisp.h: * lisp.h (WEXTTEXT_IS_WIDE) New defns. lisp.h: New type to replace places where int occurs as a boolean. It's signed because occasionally people may want to use -1 as an error value, and because unsigned ints are viral -- see comments in the internals manual against using them. dynarr.c: int -> Bytecount. --------------------------- Mule-izing --------------------------- device-x.c: Partially Mule-ize. dumper.c, dumper.h: Mule-ize. Use Rawbyte. Use stderr_out not printf. Use wext_*(). sysdep.c, syswindows.h, text.c: New Wexttext API for manipulation of external text that may be Unicode (e.g. startup code under Windows). emacs.c: Mule-ize. Properly deal with argv in external encoding. Use wext_*() and Wexttext. Use Rawbyte. #if 0 some old junk on SCO that is unlikely to be correct. Rewrite allocation code in run-temacs. emacs.c, symsinit.h, win32.c: Rename win32 init function and call it even earlier, to initialize mswindows_9x_p even earlier, for use in startup code (XEUNICODE_P). process.c: Use _wenviron not environ under Windows, to get Unicode environment variables. event-Xt.c: Mule-ize drag-n-drop related stuff. dragdrop.c, dragdrop.h, frame-x.c: Mule-ize. text.h: Add some more stand-in defines for particular kinds of conversion; use in Mule-ization work in frame-x.c etc. --------------------------- Freshening --------------------------- intl-auto-encap-win32.c, intl-auto-encap-win32.h: Regenerate. --------------------------- Unicode-work --------------------------- intl-win32.c, syswindows.h: Factor out common options to MultiByteToWideChar and WideCharToMultiByte. Add convert_unicode_to_multibyte_malloc() and convert_unicode_to_multibyte_dynarr() and use. Add stuff for alloca() conversion of multibyte/unicode. alloc.c: Use dfc_external_data_len() in case of unicode coding system. alloc.c, mule-charset.c: Don't zero out and reinit charset Unicode tables. This fucks up dump-time loading. Anyway, either we load them at dump time or run time, never both. unicode.c: Dump the blank tables as well. --------------------------------------------------------------- DOCUMENTATION, MOSTLY MULE-RELATED: --------------------------------------------------------------- EmacsFrame.c, emodules.c, event-Xt.c, fileio.c, input-method-xlib.c, mule-wnnfns.c, redisplay-gtk.c, redisplay-tty.c, redisplay-x.c, regex.c, sysdep.c: Add comment about Mule work needed. text.h: Add more documentation describing why DFC routines were not written to return their value. Add some other DFC documentation. console-msw.c, console-msw.h: Add pointer to docs in win32.c. emacs.c: Add comments on sources of doc info. text.c, charset.h, unicode.c, intl-win32.c, intl-encap-win32.c, text.h, file-coding.c, mule-coding.c: Collect background comments and related to text matters and internationalization, and proposals for work to be done, in text.c or Internals manual, stuff related to specific textual API's in text.h, and stuff related to internal implementation of Unicode conversion in unicode.c. Put lots of pointers to the comments to make them easier to find. s/mingw32.h, s/win32-common.h, s/win32-native.h, s/windowsnt.h, win32.c: Add bunches of new documentation on the different kinds of builds and environments under Windows and how they work. Collect this info in win32.c. Add pointers to these docs in the relevant s/* files. emacs.c: Document places with long comments. Remove comment about exiting, move to internals manual, put in pointer. event-stream.c: Move docs about event queues and focus to internals manual, put in pointer. events.h: Move docs about event stream callbacks to internals manual, put in pointer. profile.c, redisplay.c, signal.c: Move documentation to the Internals manual. process-nt.c: Add pointer to comment in win32-native.el. lisp.h: Add comments about some comment conventions. lisp.h: Add comment about the second argument. device-msw.c, redisplay-msw.c: @@#### comments are out-of-date. --------------------------------------------------------------- PDUMP WORK (MOTIVATED BY UNICODE CHANGES) --------------------------------------------------------------- alloc.c, buffer.c, bytecode.c, console-impl.h, console.c, device.c, dumper.c, lrecord.h, elhash.c, emodules.h, events.c, extents.c, frame.c, glyphs.c, glyphs.h, mule-charset.c, mule-coding.c, objects.c, profile.c, rangetab.c, redisplay.c, specifier.c, specifier.h, window.c, lstream.c, file-coding.h, file-coding.c: PDUMP: Properly implement dump_add_root_block(), which never worked before, and is necessary for dumping Unicode tables. Pdump name changes for accuracy: XD_STRUCT_PTR -> XD_BLOCK_PTR. XD_STRUCT_ARRAY -> XD_BLOCK_ARRAY. XD_C_STRING -> XD_ASCII_STRING. *_structure_* -> *_block_*. lrecord.h: some comments added about dump_add_root_block() vs dump_add_root_block_ptr(). extents.c: remove incorrect comment about pdump problems with gap array. --------------------------------------------------------------- ALLOCATION --------------------------------------------------------------- abbrev.c, alloc.c, bytecode.c, casefiddle.c, device-msw.c, device-x.c, dired-msw.c, doc.c, doprnt.c, dragdrop.c, editfns.c, emodules.c, file-coding.c, fileio.c, filelock.c, fns.c, glyphs-eimage.c, glyphs-gtk.c, glyphs-msw.c, glyphs-x.c, gui-msw.c, gui-x.c, imgproc.c, intl-win32.c, lread.c, menubar-gtk.c, menubar.c, nt.c, objects-msw.c, objects-x.c, print.c, process-nt.c, process-unix.c, process.c, realpath.c, redisplay.c, search.c, select-common.c, symbols.c, sysdep.c, syswindows.h, text.c, text.h, ui-byhand.c: New macros {alloca,xnew}_{itext,{i,ext,raw,bin,asc}bytes} for more convenient allocation of these commonly requested items. Modify functions to use alloca_ibytes, alloca_array, alloca_extbytes, xnew_ibytes, etc. also XREALLOC_ARRAY, xnew. alloc.c: Rewrite the allocation functions to factor out repeated code. Add assertions for freeing dumped data. lisp.h: Moved down and consolidated with other allocation stuff. lisp.h, dynarr.c: New functions for allocation that's very efficient when mostly in LIFO order. lisp.h, text.c, text.h: Factor out some stuff for general use by alloca()-conversion funs. text.h, lisp.h: Fill out convenience routines for allocating various kinds of bytes and put them in lisp.h. Use them in place of xmalloc(), ALLOCA(). text.h: Fill out the convenience functions so the _MALLOC() kinds match the alloca() kinds. --------------------------------------------------------------- ERROR-CHECKING --------------------------------------------------------------- text.h: Create ASSERT_ASCTEXT_ASCII() and ASSERT_ASCTEXT_ASCII_LEN() from similar Eistring checkers and change the Eistring checkers to use them instead. --------------------------------------------------------------- MACROS IN LISP.H --------------------------------------------------------------- lisp.h: Redo GCPRO declarations. Create a "base" set of functions that can be used to generate any kind of gcpro sets -- regular, ngcpro, nngcpro, private ones used in GC_EXTERNAL_LIST_LOOP_2. buffer.c, callint.c, chartab.c, console-msw.c, device-x.c, dialog-msw.c, dired.c, extents.c, ui-gtk.c, rangetab.c, nt.c, mule-coding.c, minibuf.c, menubar-msw.c, menubar.c, menubar-gtk.c, lread.c, lisp.h, gutter.c, glyphs.c, glyphs-widget.c, fns.c, fileio.c, file-coding.c, specifier.c: Eliminate EXTERNAL_LIST_LOOP, which does not check for circularities. Use EXTERNAL_LIST_LOOP_2 instead or EXTERNAL_LIST_LOOP_3 or EXTERNAL_PROPERTY_LIST_LOOP_3 or GC_EXTERNAL_LIST_LOOP_2 (new macro). Removed/redid comments on EXTERNAL_LIST_LOOP. --------------------------------------------------------------- SPACING FIXES --------------------------------------------------------------- callint.c, hftctl.c, number-gmp.c, process-unix.c: Spacing fixes. --------------------------------------------------------------- FIX FOR GEOMETRY PROBLEM IN FIRST FRAME --------------------------------------------------------------- unicode.c: Add workaround for newlib bug in sscanf() [should be fixed by release 1.5.12 of Cygwin]. toolbar.c: bug fix for problem of initial frame being 77 chars wide on Windows. will be overridden by my other ws. --------------------------------------------------------------- FIX FOR LEAKING PROCESS HANDLES: --------------------------------------------------------------- process-nt.c: Fixes for leaking handles. Inspired by work done by Adrian Aichner <adrian@xemacs.org>. --------------------------------------------------------------- FIX FOR CYGWIN BUG (Unicode-related): --------------------------------------------------------------- unicode.c: Add workaround for newlib bug in sscanf() [should be fixed by release 1.5.12 of Cygwin]. --------------------------------------------------------------- WARNING FIXES: --------------------------------------------------------------- console-stream.c: `reinit' is unused. compiler.h, event-msw.c, frame-msw.c, intl-encap-win32.c, text.h: Add stuff to deal with ANSI-aliasing warnings I got. regex.c: Gather includes together to avoid warning. --------------------------------------------------------------- CHANGES TO INITIALIZATION ROUTINES: --------------------------------------------------------------- buffer.c, emacs.c, console.c, debug.c, device-x.c, device.c, dragdrop.c, emodules.c, eval.c, event-Xt.c, event-gtk.c, event-msw.c, event-stream.c, event-tty.c, events.c, extents.c, faces.c, file-coding.c, fileio.c, font-lock.c, frame-msw.c, glyphs-widget.c, glyphs.c, gui-x.c, insdel.c, lread.c, lstream.c, menubar-gtk.c, menubar-x.c, minibuf.c, mule-wnnfns.c, objects-msw.c, objects.c, print.c, scrollbar-x.c, search.c, select-x.c, text.c, undo.c, unicode.c, window.c, symsinit.h: Call reinit_*() functions directly from emacs.c, for clarity. Factor out some redundant init code. Move disallowed stuff that had crept into vars_of_glyphs() into complex_vars_of_glyphs(). Call init_eval_semi_early() from eval.c not in the middle of vars_of_() in emacs.c since there should be no order dependency in the latter calls. --------------------------------------------------------------- ARMAGEDDON: --------------------------------------------------------------- alloc.c, emacs.c, lisp.h, print.c: Rename inhibit_non_essential_printing_operations to inhibit_non_essential_conversion_operations. text.c: Assert on !inhibit_non_essential_conversion_operations. console-msw.c, print.c: Don't do conversion in SetConsoleTitle or FindWindow to avoid problems during armageddon. Put #errors for NON_ASCII_INTERNAL_FORMAT in places where problems would arise. --------------------------------------------------------------- CHANGES TO THE BUILD PROCEDURE: --------------------------------------------------------------- config.h.in, s/cxux.h, s/usg5-4-2.h, m/powerpc.h: Add comment about correct ordering of this file. Rearrange everything to follow this -- put all #undefs together and before the s&m files. Add undefs for HAVE_ALLOCA, C_ALLOCA, BROKEN_ALLOCA_IN_FUNCTION_CALLS, STACK_DIRECTION. Remove unused HAVE_STPCPY, HAVE_GETWD, HAVE_SETLOCALE. m/gec63.h: Deleted; totally broken, not used at all, not in FSF. m/7300.h, m/acorn.h, m/alliant-2800.h, m/alliant.h, m/altos.h, m/amdahl.h, m/apollo.h, m/att3b.h, m/aviion.h, m/celerity.h, m/clipper.h, m/cnvrgnt.h, m/convex.h, m/cydra5.h, m/delta.h, m/delta88k.h, m/dpx2.h, m/elxsi.h, m/ews4800r.h, m/gould.h, m/hp300bsd.h, m/hp800.h, m/hp9000s300.h, m/i860.h, m/ibmps2-aix.h, m/ibmrs6000.h, m/ibmrt-aix.h, m/ibmrt.h, m/intel386.h, m/iris4d.h, m/iris5d.h, m/iris6d.h, m/irist.h, m/isi-ov.h, m/luna88k.h, m/m68k.h, m/masscomp.h, m/mg1.h, m/mips-nec.h, m/mips-siemens.h, m/mips.h, m/news.h, m/nh3000.h, m/nh4000.h, m/ns32000.h, m/orion105.h, m/pfa50.h, m/plexus.h, m/pmax.h, m/powerpc.h, m/pyrmips.h, m/sequent-ptx.h, m/sequent.h, m/sgi-challenge.h, m/symmetry.h, m/tad68k.h, m/tahoe.h, m/targon31.h, m/tekxd88.h, m/template.h, m/tower32.h, m/tower32v3.h, m/ustation.h, m/vax.h, m/wicat.h, m/xps100.h: Delete C_ALLOCA, HAVE_ALLOCA, STACK_DIRECTION, BROKEN_ALLOCA_IN_FUNCTION_CALLS. All of this is auto-detected. When in doubt, I followed recent FSF sources, which also have these things deleted.
author ben
date Thu, 04 Nov 2004 23:08:28 +0000
parents 04bc9d2f42c7
children 7ee6ea4ff5c0
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1 /* LDAP client interface for XEmacs.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2 Copyright (C) 1998 Free Software Foundation, Inc.
2367
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 2286
diff changeset
3 Copyright (C) 2004 Ben Wing.
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 2286
diff changeset
4
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6 This file is part of XEmacs.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
7
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
8 XEmacs is free software; you can redistribute it and/or modify it
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
9 under the terms of the GNU General Public License as published by the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
10 Free Software Foundation; either version 2, or (at your option) any
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
11 later version.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
12
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
13 XEmacs is distributed in the hope that it will be useful, but WITHOUT
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
14 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
15 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
16 for more details.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
17
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
18 You should have received a copy of the GNU General Public License
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
19 along with XEmacs; see the file COPYING. If not, write to
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
20 the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
21 Boston, MA 02111-1307, USA. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
22
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
23 /* Synched up with: Not in FSF. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
24
996
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
25 /* Author: Oscar Figueiredo with lots of support from Hrvoje Niksic */
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
26
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
27 /* This file provides lisp primitives for access to an LDAP library
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
28 conforming to the API defined in RFC 1823.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
29 It has been tested with:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
30 - UMich LDAP 3.3 (http://www.umich.edu/~dirsvcs/ldap/)
996
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
31 - OpenLDAP 1.2 (http://www.openldap.org/)
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
32 - Netscape's LDAP SDK (http://developer.netscape.com/) */
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
33
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
34
996
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
35 #include <config.h>
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
36 #include "lisp.h"
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
37 #include "opaque.h"
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
38 #include "sysdep.h"
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
39 #include "buffer.h"
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
40 #include "process.h" /* for report_process_error */
1632
64eaceca611d [xemacs-hg @ 2003-08-19 02:07:03 by james]
james
parents: 1270
diff changeset
41 #ifdef HAVE_SHLIB
64eaceca611d [xemacs-hg @ 2003-08-19 02:07:03 by james]
james
parents: 1270
diff changeset
42 # include "emodules.h"
64eaceca611d [xemacs-hg @ 2003-08-19 02:07:03 by james]
james
parents: 1270
diff changeset
43 #endif
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
44
996
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
45 #include <errno.h>
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
46
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
47 #include "eldap.h"
996
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
48
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
49 static Fixnum ldap_default_port;
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
50 static Lisp_Object Vldap_default_base;
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
51
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
52 static Lisp_Object Qeldap;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
53
996
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
54 /* Needed by the lrecord definition */
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
55 Lisp_Object Qldapp;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
56
996
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
57 /* ldap-open plist keywords */
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
58 static Lisp_Object Qport, Qauth, Qbinddn, Qpasswd, Qderef, Qtimelimit, Qsizelimit;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
59 /* Search scope limits */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
60 static Lisp_Object Qbase, Qonelevel, Qsubtree;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
61 /* Authentication methods */
996
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
62 static Lisp_Object Qkrbv41, Qkrbv42;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
63 /* Deref policy */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
64 static Lisp_Object Qnever, Qalways, Qfind;
996
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
65 /* Modification types (Qdelete is defined in general.c) */
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
66 static Lisp_Object Qadd, Qreplace;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
67
996
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
68
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
69 /************************************************************************/
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
70 /* Utility Functions */
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
71 /************************************************************************/
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
72
2268
61855263cb07 [xemacs-hg @ 2004-09-14 14:32:29 by james]
james
parents: 1706
diff changeset
73 static DECLARE_DOESNT_RETURN (signal_ldap_error (LDAP *, LDAPMessage *, int));
61855263cb07 [xemacs-hg @ 2004-09-14 14:32:29 by james]
james
parents: 1706
diff changeset
74
61855263cb07 [xemacs-hg @ 2004-09-14 14:32:29 by james]
james
parents: 1706
diff changeset
75 static DOESNT_RETURN
2286
04bc9d2f42c7 [xemacs-hg @ 2004-09-20 19:18:55 by james]
james
parents: 2272
diff changeset
76 signal_ldap_error (LDAP *ld,
04bc9d2f42c7 [xemacs-hg @ 2004-09-20 19:18:55 by james]
james
parents: 2272
diff changeset
77 #if defined HAVE_LDAP_PARSE_RESULT || defined HAVE_LDAP_RESULT2ERROR
04bc9d2f42c7 [xemacs-hg @ 2004-09-20 19:18:55 by james]
james
parents: 2272
diff changeset
78 LDAPMessage *res,
04bc9d2f42c7 [xemacs-hg @ 2004-09-20 19:18:55 by james]
james
parents: 2272
diff changeset
79 #else
04bc9d2f42c7 [xemacs-hg @ 2004-09-20 19:18:55 by james]
james
parents: 2272
diff changeset
80 LDAPMessage *UNUSED (res),
04bc9d2f42c7 [xemacs-hg @ 2004-09-20 19:18:55 by james]
james
parents: 2272
diff changeset
81 #endif
04bc9d2f42c7 [xemacs-hg @ 2004-09-20 19:18:55 by james]
james
parents: 2272
diff changeset
82 int ldap_err)
996
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
83 {
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
84 if (ldap_err <= 0)
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
85 {
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
86 #if defined HAVE_LDAP_PARSE_RESULT
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
87 int err;
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
88 ldap_err = ldap_parse_result (ld, res,
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
89 &err,
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
90 NULL, NULL, NULL, NULL, 0);
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
91 if (ldap_err == LDAP_SUCCESS)
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
92 ldap_err = err;
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
93 #elif defined HAVE_LDAP_GET_LDERRNO
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
94 ldap_err = ldap_get_lderrno (ld, NULL, NULL);
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
95 #elif defined HAVE_LDAP_RESULT2ERROR
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
96 ldap_err = ldap_result2error (ld, res, 0);
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
97 #else
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
98 ldap_err = ld->ld_errno;
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
99 #endif
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
100 }
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
101 invalid_operation ("LDAP error",
2367
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 2286
diff changeset
102 build_ext_string (ldap_err2string (ldap_err), Qnative));
996
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
103 }
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
104
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
105
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
106 /************************************************************************/
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
107 /* ldap lrecord basic functions */
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
108 /************************************************************************/
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
109
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
110 static Lisp_Object
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
111 make_ldap (Lisp_LDAP *ldap)
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
112 {
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
113 return wrap_ldap (ldap);
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
114 }
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
115
1220
848225013a08 [xemacs-hg @ 2003-01-17 16:59:20 by james]
james
parents: 996
diff changeset
116 static const struct memory_description ldap_description [] = {
996
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
117 { XD_LISP_OBJECT, offsetof (struct Lisp_LDAP, host) },
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
118 { XD_END }
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
119 };
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
120
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
121 static Lisp_Object
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
122 mark_ldap (Lisp_Object obj)
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
123 {
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
124 return XLDAP (obj)->host;
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
125 }
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
126
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
127 static void
2286
04bc9d2f42c7 [xemacs-hg @ 2004-09-20 19:18:55 by james]
james
parents: 2272
diff changeset
128 print_ldap (Lisp_Object obj, Lisp_Object printcharfun, int UNUSED (escapeflag))
996
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
129 {
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
130 Lisp_LDAP *ldap = XLDAP (obj);
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
131
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
132 if (print_readably)
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
133 printing_unreadable_object ("#<ldap %s>", XSTRING_DATA (ldap->host));
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
134
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
135 write_fmt_string_lisp (printcharfun, "#<ldap %S", 1, ldap->host);
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
136 if (!ldap->ld)
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
137 write_c_string (printcharfun,"(dead) ");
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
138 write_fmt_string (printcharfun, " 0x%lx>", (long)ldap);
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
139 }
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
140
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
141 static Lisp_LDAP *
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
142 allocate_ldap (void)
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
143 {
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
144 Lisp_LDAP *ldap = alloc_lcrecord_type (Lisp_LDAP, &lrecord_ldap);
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
145
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
146 ldap->ld = NULL;
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
147 ldap->host = Qnil;
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
148 return ldap;
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
149 }
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
150
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
151 static void
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
152 finalize_ldap (void *header, int for_disksave)
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
153 {
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
154 Lisp_LDAP *ldap = (Lisp_LDAP *) header;
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
155
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
156 if (for_disksave)
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
157 invalid_operation ("Can't dump an emacs containing LDAP objects",
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
158 make_ldap (ldap));
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
159
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
160 if (ldap->ld)
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
161 ldap_unbind (ldap->ld);
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
162 ldap->ld = NULL;
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
163 }
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
164
1220
848225013a08 [xemacs-hg @ 2003-01-17 16:59:20 by james]
james
parents: 996
diff changeset
165 DEFINE_LRECORD_IMPLEMENTATION ("ldap", ldap, 0,
996
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
166 mark_ldap, print_ldap, finalize_ldap,
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
167 NULL, NULL, ldap_description, Lisp_LDAP);
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
168
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
169
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
170 /************************************************************************/
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
171 /* Basic ldap accessors */
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
172 /************************************************************************/
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
173
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
174 /* ###autoload */
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
175 DEFUN ("ldapp", Fldapp, 1, 1, 0, /*
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
176 Return t if OBJECT is a LDAP connection.
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
177 */
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
178 (object))
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
179 {
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
180 return LDAPP (object) ? Qt : Qnil;
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
181 }
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
182
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
183 DEFUN ("ldap-host", Fldap_host, 1, 1, 0, /*
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
184 Return the server host of the connection LDAP, as a string.
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
185 */
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
186 (ldap))
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
187 {
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
188 CHECK_LDAP (ldap);
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
189 return (XLDAP (ldap))->host;
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
190 }
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
191
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
192 DEFUN ("ldap-live-p", Fldap_live_p, 1, 1, 0, /*
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
193 Return t if LDAP is an active LDAP connection.
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
194 */
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
195 (ldap))
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
196 {
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
197 CHECK_LDAP (ldap);
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
198 return (XLDAP (ldap))->ld ? Qt : Qnil;
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
199 }
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
200
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
201 /************************************************************************/
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
202 /* Opening/Closing a LDAP connection */
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
203 /************************************************************************/
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
204
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
205
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
206 /* ###autoload */
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
207 DEFUN ("ldap-open", Fldap_open, 1, 2, 0, /*
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
208 Open a LDAP connection to HOST.
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
209 PLIST is a plist containing additional parameters for the connection.
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
210 Valid keys in that list are:
996
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
211 `port' the TCP port to use for the connection if different from
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
212 `ldap-default-port'.
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
213 `auth' is the authentication method to use, possible values depend on
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
214 the LDAP library XEmacs was compiled with: `simple', `krbv41' and `krbv42'.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
215 `binddn' is the distinguished name of the user to bind as (in RFC 1779 syntax).
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
216 `passwd' is the password to use for simple authentication.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
217 `deref' is one of the symbols `never', `always', `search' or `find'.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
218 `timelimit' is the timeout limit for the connection in seconds.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
219 `sizelimit' is the maximum number of matches to return.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
220 */
996
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
221 (host, plist))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
222 {
996
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
223 /* This function can GC */
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
224 Lisp_LDAP *ldap;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
225 LDAP *ld;
996
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
226 int ldap_port = 0;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
227 int ldap_auth = LDAP_AUTH_SIMPLE;
2367
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 2286
diff changeset
228 Extbyte *ldap_binddn = NULL;
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 2286
diff changeset
229 Extbyte *ldap_password = NULL;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
230 int ldap_deref = LDAP_DEREF_NEVER;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
231 int ldap_timelimit = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
232 int ldap_sizelimit = 0;
996
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
233 int err;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
234
996
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
235 CHECK_STRING (host);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
236
996
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
237 {
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
238 EXTERNAL_PROPERTY_LIST_LOOP_3 (keyword, value, plist)
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
239 {
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
240 /* TCP Port */
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
241 if (EQ (keyword, Qport))
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
242 {
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
243 CHECK_INT (value);
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
244 ldap_port = XINT (value);
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
245 }
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
246 /* Authentication method */
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
247 if (EQ (keyword, Qauth))
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
248 {
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
249 if (EQ (value, Qsimple))
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
250 ldap_auth = LDAP_AUTH_SIMPLE;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
251 #ifdef LDAP_AUTH_KRBV41
996
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
252 else if (EQ (value, Qkrbv41))
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
253 ldap_auth = LDAP_AUTH_KRBV41;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
254 #endif
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
255 #ifdef LDAP_AUTH_KRBV42
996
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
256 else if (EQ (value, Qkrbv42))
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
257 ldap_auth = LDAP_AUTH_KRBV42;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
258 #endif
996
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
259 else
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
260 invalid_constant ("Invalid authentication method", value);
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
261 }
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
262 /* Bind DN */
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
263 else if (EQ (keyword, Qbinddn))
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
264 {
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
265 CHECK_STRING (value);
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
266 LISP_STRING_TO_EXTERNAL (value, ldap_binddn, Qnative);
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
267 }
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
268 /* Password */
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
269 else if (EQ (keyword, Qpasswd))
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
270 {
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
271 CHECK_STRING (value);
2272
4ec724310f33 [xemacs-hg @ 2004-09-14 20:54:29 by james]
james
parents: 2268
diff changeset
272 LISP_STRING_TO_EXTERNAL (value, ldap_password, Qnative);
996
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
273 }
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
274 /* Deref */
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
275 else if (EQ (keyword, Qderef))
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
276 {
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
277 if (EQ (value, Qnever))
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
278 ldap_deref = LDAP_DEREF_NEVER;
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
279 else if (EQ (value, Qsearch))
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
280 ldap_deref = LDAP_DEREF_SEARCHING;
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
281 else if (EQ (value, Qfind))
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
282 ldap_deref = LDAP_DEREF_FINDING;
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
283 else if (EQ (value, Qalways))
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
284 ldap_deref = LDAP_DEREF_ALWAYS;
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
285 else
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
286 invalid_constant ("Invalid deref value", value);
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
287 }
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
288 /* Timelimit */
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
289 else if (EQ (keyword, Qtimelimit))
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
290 {
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
291 CHECK_INT (value);
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
292 ldap_timelimit = XINT (value);
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
293 }
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
294 /* Sizelimit */
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
295 else if (EQ (keyword, Qsizelimit))
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
296 {
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
297 CHECK_INT (value);
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
298 ldap_sizelimit = XINT (value);
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
299 }
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
300 }
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
301 }
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
302
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
303 if (ldap_port == 0)
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
304 {
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
305 ldap_port = ldap_default_port;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
306 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
307
996
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
308 /* Connect to the server and bind */
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
309 slow_down_interrupts ();
2367
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 2286
diff changeset
310 ld = ldap_open (NEW_LISP_STRING_TO_EXTERNAL (host, Qnative), ldap_port);
996
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
311 speed_up_interrupts ();
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
312
996
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
313 if (ld == NULL )
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
314 report_process_error ("Failed connecting to host", host);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
315
996
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
316 #ifdef HAVE_LDAP_SET_OPTION
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
317 if ((err = ldap_set_option (ld, LDAP_OPT_DEREF,
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
318 (void *)&ldap_deref)) != LDAP_SUCCESS)
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
319 signal_ldap_error (ld, NULL, err);
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
320 if ((err = ldap_set_option (ld, LDAP_OPT_TIMELIMIT,
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
321 (void *)&ldap_timelimit)) != LDAP_SUCCESS)
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
322 signal_ldap_error (ld, NULL, err);
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
323 if ((err = ldap_set_option (ld, LDAP_OPT_SIZELIMIT,
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
324 (void *)&ldap_sizelimit)) != LDAP_SUCCESS)
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
325 signal_ldap_error (ld, NULL, err);
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
326 if ((err = ldap_set_option (ld, LDAP_OPT_REFERRALS,
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
327 LDAP_OPT_ON)) != LDAP_SUCCESS)
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
328 signal_ldap_error (ld, NULL, err);
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
329 if ((err = ldap_set_option (ld, LDAP_OPT_RESTART,
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
330 LDAP_OPT_ON)) != LDAP_SUCCESS)
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
331 signal_ldap_error (ld, NULL, err);
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
332 #else /* not HAVE_LDAP_SET_OPTION */
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
333 ld->ld_deref = ldap_deref;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
334 ld->ld_timelimit = ldap_timelimit;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
335 ld->ld_sizelimit = ldap_sizelimit;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
336 #ifdef LDAP_REFERRALS
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
337 ld->ld_options = LDAP_OPT_REFERRALS;
996
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
338 #else /* not LDAP_REFERRALS */
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
339 ld->ld_options = 0;
996
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
340 #endif /* not LDAP_REFERRALS */
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
341 /* XEmacs uses interrupts (SIGIO,SIGALRM), LDAP calls need to ignore them */
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
342 ld->ld_options |= LDAP_OPT_RESTART;
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
343 #endif /* not HAVE_LDAP_SET_OPTION */
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
344
2272
4ec724310f33 [xemacs-hg @ 2004-09-14 20:54:29 by james]
james
parents: 2268
diff changeset
345 err = ldap_bind_s (ld, ldap_binddn, ldap_password, ldap_auth);
996
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
346 if (err != LDAP_SUCCESS)
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
347 {
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
348 signal_error (Qprocess_error, "Failed binding to the server",
2367
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 2286
diff changeset
349 build_ext_string (ldap_err2string (err), Qnative));
996
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
350 }
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
351
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
352 ldap = allocate_ldap ();
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
353 ldap->ld = ld;
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
354 ldap->host = host;
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
355
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
356 return make_ldap (ldap);
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
357 }
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
358
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
359
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
360
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
361 DEFUN ("ldap-close", Fldap_close, 1, 1, 0, /*
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
362 Close an LDAP connection.
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
363 */
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
364 (ldap))
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
365 {
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
366 Lisp_LDAP *lldap;
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
367 CHECK_LIVE_LDAP (ldap);
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
368 lldap = XLDAP (ldap);
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
369 ldap_unbind (lldap->ld);
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
370 lldap->ld = NULL;
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
371 return Qnil;
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
372 }
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
373
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
374
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
375
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
376 /************************************************************************/
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
377 /* Working on a LDAP connection */
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
378 /************************************************************************/
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
379 struct ldap_unwind_struct
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
380 {
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
381 LDAPMessage *res;
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
382 struct berval **vals;
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
383 };
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
384
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
385 static Lisp_Object
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
386 ldap_search_unwind (Lisp_Object unwind_obj)
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
387 {
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
388 struct ldap_unwind_struct *unwind =
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
389 (struct ldap_unwind_struct *) get_opaque_ptr (unwind_obj);
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
390 if (unwind->res)
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
391 ldap_msgfree (unwind->res);
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
392 if (unwind->vals)
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
393 ldap_value_free_len (unwind->vals);
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
394 return Qnil;
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
395 }
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
396
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
397 /* The following function is called `ldap-search-basic' instead of */
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
398 /* plain `ldap-search' to maintain compatibility with the XEmacs 21.1 */
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
399 /* API where `ldap-search' was the name of the high-level search */
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
400 /* function */
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
401
996
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
402 DEFUN ("ldap-search-basic", Fldap_search_basic, 2, 8, 0, /*
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
403 Perform a search on an open LDAP connection.
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
404 LDAP is an LDAP connection object created with `ldap-open'.
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
405 FILTER is a filter string for the search as described in RFC 1558.
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
406 BASE is the distinguished name at which to start the search.
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
407 SCOPE is one of the symbols `base', `onelevel' or `subtree' indicating
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
408 the scope of the search.
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
409 ATTRS is a list of strings indicating which attributes to retrieve
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
410 for each matching entry. If nil return all available attributes.
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
411 If ATTRSONLY is non-nil then only the attributes are retrieved, not
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
412 the associated values.
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
413 If WITHDN is non-nil each entry in the result will be prepended with
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
414 its distinguished name DN.
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
415 If VERBOSE is non-nil progress messages will be echoed.
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
416 The function returns a list of matching entries. Each entry is itself
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
417 an alist of attribute/value pairs optionally preceded by the DN of the
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
418 entry according to the value of WITHDN.
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
419 */
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
420 (ldap, filter, base, scope, attrs, attrsonly, withdn, verbose))
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
421 {
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
422 /* This function can GC */
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
423
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
424 /* Vars for query */
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
425 LDAP *ld;
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
426 LDAPMessage *e;
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
427 BerElement *ptr;
2367
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 2286
diff changeset
428 Extbyte *a, *dn;
996
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
429 int i, rc;
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
430 int matches;
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
431 struct ldap_unwind_struct unwind;
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
432
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
433 int ldap_scope = LDAP_SCOPE_SUBTREE;
2367
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 2286
diff changeset
434 Extbyte **ldap_attributes = NULL;
996
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
435
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
436 int speccount = specpdl_depth ();
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
437
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
438 Lisp_Object list = Qnil;
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
439 Lisp_Object entry = Qnil;
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
440 Lisp_Object result = Qnil;
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
441 struct gcpro gcpro1, gcpro2, gcpro3;
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
442
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
443 GCPRO3 (list, entry, result);
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
444
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
445 unwind.res = NULL;
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
446 unwind.vals = NULL;
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
447
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
448 /* Do all the parameter checking */
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
449 CHECK_LIVE_LDAP (ldap);
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
450 ld = XLDAP (ldap)->ld;
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
451
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
452 /* Filter */
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
453 CHECK_STRING (filter);
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
454
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
455 /* Search base */
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
456 if (NILP (base))
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
457 {
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
458 base = Vldap_default_base;
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
459 }
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
460 if (!NILP (base))
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
461 {
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
462 CHECK_STRING (base);
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
463 }
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
464
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
465 /* Search scope */
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
466 if (!NILP (scope))
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
467 {
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
468 if (EQ (scope, Qbase))
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
469 ldap_scope = LDAP_SCOPE_BASE;
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
470 else if (EQ (scope, Qonelevel))
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
471 ldap_scope = LDAP_SCOPE_ONELEVEL;
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
472 else if (EQ (scope, Qsubtree))
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
473 ldap_scope = LDAP_SCOPE_SUBTREE;
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
474 else
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
475 invalid_constant ("Invalid scope", scope);
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
476 }
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
477
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
478 /* Attributes to search */
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
479 if (!NILP (attrs))
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
480 {
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
481 CHECK_CONS (attrs);
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
482 ldap_attributes = alloca_array (char *, 1 + XINT (Flength (attrs)));
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
483
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
484 i = 0;
2367
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 2286
diff changeset
485 {
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 2286
diff changeset
486 EXTERNAL_LIST_LOOP_2 (current, attrs)
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 2286
diff changeset
487 {
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 2286
diff changeset
488 CHECK_STRING (current);
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 2286
diff changeset
489 LISP_STRING_TO_EXTERNAL (current, ldap_attributes[i], Qnative);
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 2286
diff changeset
490 ++i;
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 2286
diff changeset
491 }
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 2286
diff changeset
492 }
996
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
493 ldap_attributes[i] = NULL;
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
494 }
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
495
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
496 /* Attributes only ? */
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
497 CHECK_SYMBOL (attrsonly);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
498
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
499 /* Perform the search */
996
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
500 if (ldap_search (ld,
2367
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 2286
diff changeset
501 NILP (base) ? "" :
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 2286
diff changeset
502 NEW_LISP_STRING_TO_EXTERNAL (base, Qnative),
996
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
503 ldap_scope,
2367
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 2286
diff changeset
504 NILP (filter) ? "" :
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 2286
diff changeset
505 NEW_LISP_STRING_TO_EXTERNAL (filter, Qnative),
996
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
506 ldap_attributes,
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
507 NILP (attrsonly) ? 0 : 1)
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
508 == -1)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
509 {
996
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
510 signal_ldap_error (ld, NULL, 0);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
511 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
512
996
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
513 /* Ensure we don't exit without cleaning up */
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
514 record_unwind_protect (ldap_search_unwind,
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
515 make_opaque_ptr (&unwind));
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
516
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
517 /* Build the results list */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
518 matches = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
519
996
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
520 rc = ldap_result (ld, LDAP_RES_ANY, 0, NULL, &unwind.res);
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
521
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
522 while (rc == LDAP_RES_SEARCH_ENTRY)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
523 {
996
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
524 QUIT;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
525 matches ++;
996
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
526 e = ldap_first_entry (ld, unwind.res);
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
527 /* #### This call to message() is pretty fascist, because it
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
528 destroys the current echo area contents, even when invoked
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
529 from Lisp. It should use echo_area_message() instead, and
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
530 restore the old echo area contents later. */
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
531 if (! NILP (verbose))
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
532 message ("Parsing ldap results... %d", matches);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
533 entry = Qnil;
996
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
534 /* Get the DN if required */
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
535 if (! NILP (withdn))
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
536 {
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
537 dn = ldap_get_dn (ld, e);
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
538 if (dn == NULL)
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
539 signal_ldap_error (ld, e, 0);
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
540 entry = Fcons (build_ext_string (dn, Qnative), Qnil);
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
541 }
2367
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 2286
diff changeset
542 for (a = ldap_first_attribute (ld, e, &ptr);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
543 a != NULL;
2367
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 2286
diff changeset
544 a = ldap_next_attribute (ld, e, ptr))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
545 {
996
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
546 list = Fcons (build_ext_string (a, Qnative), Qnil);
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
547 unwind.vals = ldap_get_values_len (ld, e, a);
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
548 if (unwind.vals != NULL)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
549 {
996
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
550 for (i = 0; unwind.vals[i] != NULL; i++)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
551 {
996
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
552 list = Fcons (make_ext_string ((Extbyte *) unwind.vals[i]->bv_val,
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
553 unwind.vals[i]->bv_len,
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
554 Qnative),
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
555 list);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
556 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
557 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
558 entry = Fcons (Fnreverse (list),
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
559 entry);
996
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
560 ldap_value_free_len (unwind.vals);
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
561 unwind.vals = NULL;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
562 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
563 result = Fcons (Fnreverse (entry),
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
564 result);
996
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
565 ldap_msgfree (unwind.res);
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
566 unwind.res = NULL;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
567
996
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
568 rc = ldap_result (ld, LDAP_RES_ANY, 0, NULL, &(unwind.res));
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
569 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
570
996
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
571 #if defined HAVE_LDAP_PARSE_RESULT
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
572 {
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
573 int rc2 = ldap_parse_result (ld, unwind.res,
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
574 &rc,
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
575 NULL, NULL, NULL, NULL, 0);
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
576 if (rc2 != LDAP_SUCCESS)
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
577 rc = rc2;
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
578 }
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
579 #else
996
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
580 if (rc == 0)
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
581 signal_ldap_error (ld, NULL, LDAP_TIMELIMIT_EXCEEDED);
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
582
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
583 if (rc == -1)
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
584 signal_ldap_error (ld, unwind.res, (unwind.res==NULL) ? ld->ld_errno : 0);
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
585
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
586 #if defined HAVE_LDAP_RESULT2ERROR
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
587 rc = ldap_result2error (ld, unwind.res, 0);
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
588 #endif
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
589 #endif
996
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
590
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
591 if (rc != LDAP_SUCCESS)
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
592 signal_ldap_error (ld, NULL, rc);
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
593
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
594 ldap_msgfree (unwind.res);
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
595 unwind.res = (LDAPMessage *)NULL;
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
596
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
597 /* #### See above for calling message(). */
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
598 if (! NILP (verbose))
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
599 message ("Parsing ldap results... done");
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
600
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
601 unbind_to (speccount);
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
602 UNGCPRO;
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
603 return Fnreverse (result);
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
604 }
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
605
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
606 DEFUN ("ldap-add", Fldap_add, 3, 3, 0, /*
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
607 Add an entry to an LDAP directory.
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
608 LDAP is an LDAP connection object created with `ldap-open'.
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
609 DN is the distinguished name of the entry to add.
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
610 ENTRY is an entry specification, i.e., a list of cons cells
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
611 containing attribute/value string pairs.
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
612 */
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
613 (ldap, dn, entry))
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
614 {
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
615 LDAP *ld;
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
616 LDAPMod *ldap_mods, **ldap_mods_ptrs;
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
617 struct berval *bervals;
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
618 int rc;
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
619 int i, j;
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
620 Elemcount len;
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
621
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
622 Lisp_Object current = Qnil;
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
623 Lisp_Object values = Qnil;
2367
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 2286
diff changeset
624 struct gcpro gcpro1;
996
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
625
2367
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 2286
diff changeset
626 GCPRO1 (values);
996
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
627
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
628 /* Do all the parameter checking */
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
629 CHECK_LIVE_LDAP (ldap);
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
630 ld = XLDAP (ldap)->ld;
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
631
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
632 /* Check the DN */
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
633 CHECK_STRING (dn);
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
634
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
635 /* Check the entry */
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
636 CHECK_CONS (entry);
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
637 if (NILP (entry))
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
638 invalid_operation ("Cannot add void entry", entry);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
639
996
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
640 /* Build the ldap_mods array */
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
641 len = (Elemcount) XINT (Flength (entry));
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
642 ldap_mods = alloca_array (LDAPMod, len);
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
643 ldap_mods_ptrs = alloca_array (LDAPMod *, 1 + len);
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
644 i = 0;
2367
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 2286
diff changeset
645
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 2286
diff changeset
646 {
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 2286
diff changeset
647 EXTERNAL_LIST_LOOP_2 (current, entry)
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 2286
diff changeset
648 {
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 2286
diff changeset
649 CHECK_CONS (current);
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 2286
diff changeset
650 CHECK_STRING (XCAR (current));
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 2286
diff changeset
651 ldap_mods_ptrs[i] = &(ldap_mods[i]);
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 2286
diff changeset
652 LISP_STRING_TO_EXTERNAL (XCAR (current), ldap_mods[i].mod_type,
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 2286
diff changeset
653 Qnative);
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 2286
diff changeset
654 ldap_mods[i].mod_op = LDAP_MOD_ADD | LDAP_MOD_BVALUES;
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 2286
diff changeset
655 values = XCDR (current);
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 2286
diff changeset
656 if (CONSP (values))
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 2286
diff changeset
657 {
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 2286
diff changeset
658 len = (Elemcount) XINT (Flength (values));
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 2286
diff changeset
659 bervals = alloca_array (struct berval, len);
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 2286
diff changeset
660 ldap_mods[i].mod_vals.modv_bvals =
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 2286
diff changeset
661 alloca_array (struct berval *, 1 + len);
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 2286
diff changeset
662 j = 0;
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 2286
diff changeset
663 {
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 2286
diff changeset
664 EXTERNAL_LIST_LOOP_2 (cur2, values)
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 2286
diff changeset
665 {
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 2286
diff changeset
666 CHECK_STRING (cur2);
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 2286
diff changeset
667 ldap_mods[i].mod_vals.modv_bvals[j] = &(bervals[j]);
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 2286
diff changeset
668 TO_EXTERNAL_FORMAT (LISP_STRING, cur2,
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 2286
diff changeset
669 ALLOCA, (bervals[j].bv_val,
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 2286
diff changeset
670 bervals[j].bv_len),
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 2286
diff changeset
671 Qnative);
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 2286
diff changeset
672 j++;
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 2286
diff changeset
673 }
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 2286
diff changeset
674 }
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 2286
diff changeset
675 ldap_mods[i].mod_vals.modv_bvals[j] = NULL;
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 2286
diff changeset
676 }
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 2286
diff changeset
677 else
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 2286
diff changeset
678 {
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 2286
diff changeset
679 CHECK_STRING (values);
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 2286
diff changeset
680 bervals = alloca_array (struct berval, 1);
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 2286
diff changeset
681 ldap_mods[i].mod_vals.modv_bvals = alloca_array (struct berval *,
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 2286
diff changeset
682 2);
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 2286
diff changeset
683 ldap_mods[i].mod_vals.modv_bvals[0] = &(bervals[0]);
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 2286
diff changeset
684 TO_EXTERNAL_FORMAT (LISP_STRING, values,
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 2286
diff changeset
685 ALLOCA, (bervals[0].bv_val,
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 2286
diff changeset
686 bervals[0].bv_len),
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 2286
diff changeset
687 Qnative);
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 2286
diff changeset
688 ldap_mods[i].mod_vals.modv_bvals[1] = NULL;
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 2286
diff changeset
689 }
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 2286
diff changeset
690 i++;
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 2286
diff changeset
691 }
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 2286
diff changeset
692 }
996
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
693 ldap_mods_ptrs[i] = NULL;
2367
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 2286
diff changeset
694 rc = ldap_add_s (ld, NEW_LISP_STRING_TO_EXTERNAL (dn, Qnative),
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 2286
diff changeset
695 ldap_mods_ptrs);
996
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
696 if (rc != LDAP_SUCCESS)
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
697 signal_ldap_error (ld, NULL, rc);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
698
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
699 UNGCPRO;
996
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
700 return Qnil;
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
701 }
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
702
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
703 DEFUN ("ldap-modify", Fldap_modify, 3, 3, 0, /*
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
704 Add an entry to an LDAP directory.
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
705 LDAP is an LDAP connection object created with `ldap-open'.
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
706 DN is the distinguished name of the entry to modify.
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
707 MODS is a list of modifications to apply.
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
708 A modification is a list of the form (MOD-OP ATTR VALUE1 VALUE2 ...)
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
709 MOD-OP and ATTR are mandatory, VALUEs are optional depending on MOD-OP.
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
710 MOD-OP is the type of modification, one of the symbols `add', `delete'
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
711 or `replace'. ATTR is the LDAP attribute type to modify.
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
712 */
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
713 (ldap, dn, mods))
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
714 {
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
715 LDAP *ld;
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
716 LDAPMod *ldap_mods, **ldap_mods_ptrs;
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
717 struct berval *bervals;
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
718 int i, j, rc;
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
719 Lisp_Object mod_op;
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
720 Elemcount len;
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
721
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
722 Lisp_Object values = Qnil;
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
723 struct gcpro gcpro1, gcpro2;
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
724
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
725 /* Do all the parameter checking */
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
726 CHECK_LIVE_LDAP (ldap);
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
727 ld = XLDAP (ldap)->ld;
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
728
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
729 /* Check the DN */
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
730 CHECK_STRING (dn);
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
731
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
732 /* Check the entry */
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
733 CHECK_CONS (mods);
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
734 if (NILP (mods))
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
735 return Qnil;
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
736
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
737 /* Build the ldap_mods array */
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
738 len = (Elemcount) XINT (Flength (mods));
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
739 ldap_mods = alloca_array (LDAPMod, len);
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
740 ldap_mods_ptrs = alloca_array (LDAPMod *, 1 + len);
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
741 i = 0;
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
742
2367
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 2286
diff changeset
743 GCPRO1 (values);
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 2286
diff changeset
744 {
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 2286
diff changeset
745 EXTERNAL_LIST_LOOP_2 (current, mods)
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 2286
diff changeset
746 {
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 2286
diff changeset
747 CHECK_CONS (current);
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 2286
diff changeset
748 CHECK_SYMBOL (XCAR (current));
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 2286
diff changeset
749 mod_op = XCAR (current);
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 2286
diff changeset
750 ldap_mods_ptrs[i] = &(ldap_mods[i]);
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 2286
diff changeset
751 ldap_mods[i].mod_op = LDAP_MOD_BVALUES;
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 2286
diff changeset
752 if (EQ (mod_op, Qadd))
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 2286
diff changeset
753 ldap_mods[i].mod_op |= LDAP_MOD_ADD;
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 2286
diff changeset
754 else if (EQ (mod_op, Qdelete))
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 2286
diff changeset
755 ldap_mods[i].mod_op |= LDAP_MOD_DELETE;
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 2286
diff changeset
756 else if (EQ (mod_op, Qreplace))
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 2286
diff changeset
757 ldap_mods[i].mod_op |= LDAP_MOD_REPLACE;
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 2286
diff changeset
758 else
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 2286
diff changeset
759 invalid_constant ("Invalid LDAP modification type", mod_op);
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 2286
diff changeset
760 current = XCDR (current);
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 2286
diff changeset
761 CHECK_STRING (XCAR (current));
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 2286
diff changeset
762 LISP_STRING_TO_EXTERNAL (XCAR (current), ldap_mods[i].mod_type,
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 2286
diff changeset
763 Qnative);
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 2286
diff changeset
764 values = XCDR (current);
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 2286
diff changeset
765 len = (Elemcount) XINT (Flength (values));
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 2286
diff changeset
766 bervals = alloca_array (struct berval, len);
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 2286
diff changeset
767 ldap_mods[i].mod_vals.modv_bvals =
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 2286
diff changeset
768 alloca_array (struct berval *, 1 + len);
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 2286
diff changeset
769 j = 0;
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 2286
diff changeset
770 EXTERNAL_LIST_LOOP_2 (cur2, values)
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 2286
diff changeset
771 {
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 2286
diff changeset
772 CHECK_STRING (cur2);
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 2286
diff changeset
773 ldap_mods[i].mod_vals.modv_bvals[j] = &(bervals[j]);
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 2286
diff changeset
774 TO_EXTERNAL_FORMAT (LISP_STRING, cur2,
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 2286
diff changeset
775 ALLOCA, (bervals[j].bv_val,
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 2286
diff changeset
776 bervals[j].bv_len),
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 2286
diff changeset
777 Qnative);
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 2286
diff changeset
778 j++;
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 2286
diff changeset
779 }
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 2286
diff changeset
780 ldap_mods[i].mod_vals.modv_bvals[j] = NULL;
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 2286
diff changeset
781 i++;
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 2286
diff changeset
782 }
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 2286
diff changeset
783 }
996
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
784 ldap_mods_ptrs[i] = NULL;
2367
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 2286
diff changeset
785 rc = ldap_modify_s (ld, NEW_LISP_STRING_TO_EXTERNAL (dn, Qnative),
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 2286
diff changeset
786 ldap_mods_ptrs);
996
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
787 if (rc != LDAP_SUCCESS)
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
788 signal_ldap_error (ld, NULL, rc);
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
789
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
790 UNGCPRO;
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
791 return Qnil;
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
792 }
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
793
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
794
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
795 DEFUN ("ldap-delete", Fldap_delete, 2, 2, 0, /*
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
796 Delete an entry to an LDAP directory.
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
797 LDAP is an LDAP connection object created with `ldap-open'.
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
798 DN is the distinguished name of the entry to delete.
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
799 */
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
800 (ldap, dn))
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
801 {
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
802 LDAP *ld;
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
803 int rc;
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
804
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
805 /* Check parameters */
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
806 CHECK_LIVE_LDAP (ldap);
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
807 ld = XLDAP (ldap)->ld;
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
808 CHECK_STRING (dn);
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
809
2367
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 2286
diff changeset
810 rc = ldap_delete_s (ld, NEW_LISP_STRING_TO_EXTERNAL (dn, Qnative));
996
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
811 if (rc != LDAP_SUCCESS)
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
812 signal_ldap_error (ld, NULL, rc);
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
813
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
814 return Qnil;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
815 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
816
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
817 void
996
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
818 syms_of_eldap (void)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
819 {
996
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
820 INIT_LRECORD_IMPLEMENTATION (ldap);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
821
996
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
822 DEFSYMBOL (Qeldap);
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
823 DEFSYMBOL (Qldapp);
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
824 DEFSYMBOL (Qport);
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
825 DEFSYMBOL (Qauth);
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
826 DEFSYMBOL (Qbinddn);
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
827 DEFSYMBOL (Qpasswd);
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
828 DEFSYMBOL (Qderef);
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
829 DEFSYMBOL (Qtimelimit);
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
830 DEFSYMBOL (Qsizelimit);
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
831 DEFSYMBOL (Qbase);
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
832 DEFSYMBOL (Qonelevel);
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
833 DEFSYMBOL (Qsubtree);
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
834 DEFSYMBOL (Qkrbv41);
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
835 DEFSYMBOL (Qkrbv42);
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
836 DEFSYMBOL (Qnever);
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
837 DEFSYMBOL (Qalways);
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
838 DEFSYMBOL (Qfind);
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
839 DEFSYMBOL (Qadd);
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
840 DEFSYMBOL (Qreplace);
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
841
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
842 DEFSUBR (Fldapp);
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
843 DEFSUBR (Fldap_host);
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
844 DEFSUBR (Fldap_live_p);
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
845 DEFSUBR (Fldap_open);
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
846 DEFSUBR (Fldap_close);
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
847 DEFSUBR (Fldap_search_basic);
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
848 DEFSUBR (Fldap_add);
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
849 DEFSUBR (Fldap_modify);
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
850 DEFSUBR (Fldap_delete);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
851 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
852
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
853 void
996
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
854 vars_of_eldap (void)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
855 {
996
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
856
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
857 Fprovide (Qeldap);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
858
996
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
859 ldap_default_port = LDAP_PORT;
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
860 Vldap_default_base = Qnil;
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
861
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
862 DEFVAR_INT ("ldap-default-port", &ldap_default_port /*
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
863 Default TCP port for LDAP connections.
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
864 Initialized from the LDAP library. Default value is 389.
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
865 */ );
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
866
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
867 DEFVAR_LISP ("ldap-default-base", &Vldap_default_base /*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
868 Default base for LDAP searches.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
869 This is a string using the syntax of RFC 1779.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
870 For instance, "o=ACME, c=US" limits the search to the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
871 Acme organization in the United States.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
872 */ );
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
873
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
874 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
875
996
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
876 #ifdef HAVE_SHLIB
1706
9fc738581a9d [xemacs-hg @ 2003-09-22 03:21:12 by james]
james
parents: 1632
diff changeset
877 EXTERN_C void unload_eldap (void);
996
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
878 void
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
879 unload_eldap (void)
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
880 {
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
881 /* Remove defined types */
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
882 UNDEF_LRECORD_IMPLEMENTATION (ldap);
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
883
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
884 /* Remove staticpro'ing of symbols */
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
885 unstaticpro_nodump (&Qeldap);
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
886 unstaticpro_nodump (&Qldapp);
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
887 unstaticpro_nodump (&Qport);
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
888 unstaticpro_nodump (&Qauth);
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
889 unstaticpro_nodump (&Qbinddn);
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
890 unstaticpro_nodump (&Qpasswd);
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
891 unstaticpro_nodump (&Qderef);
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
892 unstaticpro_nodump (&Qtimelimit);
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
893 unstaticpro_nodump (&Qsizelimit);
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
894 unstaticpro_nodump (&Qbase);
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
895 unstaticpro_nodump (&Qonelevel);
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
896 unstaticpro_nodump (&Qsubtree);
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
897 unstaticpro_nodump (&Qkrbv41);
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
898 unstaticpro_nodump (&Qkrbv42);
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
899 unstaticpro_nodump (&Qnever);
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
900 unstaticpro_nodump (&Qalways);
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
901 unstaticpro_nodump (&Qfind);
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
902 unstaticpro_nodump (&Qadd);
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
903 unstaticpro_nodump (&Qreplace);
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
904 }
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
905 #endif /* HAVE_SHLIB */