annotate src/eldap.c @ 934:c925bacdda60

[xemacs-hg @ 2002-07-29 09:21:12 by michaels] 2002-07-17 Marcus Crestani <crestani@informatik.uni-tuebingen.de> Markus Kaltenbach <makalten@informatik.uni-tuebingen.de> Mike Sperber <mike@xemacs.org> configure flag to turn these changes on: --use-kkcc First we added a dumpable flag to lrecord_implementation. It shows, if the object is dumpable and should be processed by the dumper. * lrecord.h (struct lrecord_implementation): added dumpable flag (MAKE_LRECORD_IMPLEMENTATION): fitted the different makro definitions to the new lrecord_implementation and their calls. Then we changed mark_object, that it no longer needs a mark method for those types that have pdump descritions. * alloc.c: (mark_object): If the object has a description, the new mark algorithm is called, and the object is marked according to its description. Otherwise it uses the mark method like before. These procedures mark objects according to their descriptions. They are modeled on the corresponding pdumper procedures. (mark_with_description): (get_indirect_count): (structure_size): (mark_struct_contents): These procedures still call mark_object, this is needed while there are Lisp_Objects without descriptions left. We added pdump descriptions for many Lisp_Objects: * extents.c: extent_auxiliary_description * database.c: database_description * gui.c: gui_item_description * scrollbar.c: scrollbar_instance_description * toolbar.c: toolbar_button_description * event-stream.c: command_builder_description * mule-charset.c: charset_description * device-msw.c: devmode_description * dialog-msw.c: mswindows_dialog_id_description * eldap.c: ldap_description * postgresql.c: pgconn_description pgresult_description * tooltalk.c: tooltalk_message_description tooltalk_pattern_description * ui-gtk.c: emacs_ffi_description emacs_gtk_object_description * events.c: * events.h: * event-stream.c: * event-Xt.c: * event-gtk.c: * event-tty.c: To write a pdump description for Lisp_Event, we converted every struct in the union event to a Lisp_Object. So we created nine new Lisp_Objects: Lisp_Key_Data, Lisp_Button_Data, Lisp_Motion_Data, Lisp_Process_Data, Lisp_Timeout_Data, Lisp_Eval_Data, Lisp_Misc_User_Data, Lisp_Magic_Data, Lisp_Magic_Eval_Data. We also wrote makro selectors and mutators for the fields of the new designed Lisp_Event and added everywhere these new abstractions. We implemented XD_UNION support in (mark_with_description), so we can describe exspecially console/device specific data with XD_UNION. To describe with XD_UNION, we added a field to these objects, which holds the variant type of the object. This field is initialized in the appendant constructor. The variant is an integer, it has also to be described in an description, if XD_UNION is used. XD_UNION is used in following descriptions: * console.c: console_description (get_console_variant): returns the variant (create_console): added variant initialization * console.h (console_variant): the different console types * console-impl.h (struct console): added enum console_variant contype * device.c: device_description (Fmake_device): added variant initialization * device-impl.h (struct device): added enum console_variant devtype * objects.c: image_instance_description font_instance_description (Fmake_color_instance): added variant initialization (Fmake_font_instance): added variant initialization * objects-impl.h (struct Lisp_Color_Instance): added color_instance_type * objects-impl.h (struct Lisp_Font_Instance): added font_instance_type * process.c: process_description (make_process_internal): added variant initialization * process.h (process_variant): the different process types
author michaels
date Mon, 29 Jul 2002 09:21:25 +0000
parents e54d47b2d736
children d7603d225813
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.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4 This file is part of XEmacs.
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 XEmacs is free software; you can redistribute it and/or modify it
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
7 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
8 Free Software Foundation; either version 2, or (at your option) any
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
9 later version.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
10
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
11 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
12 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
13 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
14 for more details.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
15
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
16 You should have received a copy of the GNU General Public License
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
17 along with XEmacs; see the file COPYING. If not, write to
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
18 the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
19 Boston, MA 02111-1307, USA. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
20
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
21 /* Synched up with: Not in FSF. */
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 /* Author: Oscar Figueiredo with lots of support from Hrvoje Niksic */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
24
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
25 /* This file provides lisp primitives for access to an LDAP library
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
26 conforming to the API defined in RFC 1823.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
27 It has been tested with:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
28 - UMich LDAP 3.3 (http://www.umich.edu/~dirsvcs/ldap/)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
29 - OpenLDAP 1.2 (http://www.openldap.org/)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
30 - Netscape's LDAP SDK (http://developer.netscape.com/) */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
31
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
32
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
33 #include <config.h>
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
34 #include "lisp.h"
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
35 #include "opaque.h"
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
36 #include "sysdep.h"
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
37 #include "buffer.h"
877
e54d47b2d736 [xemacs-hg @ 2002-06-23 09:54:35 by stephent]
stephent
parents: 867
diff changeset
38 #include "process.h" /* for report_process_error */
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
39
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
40 #include <errno.h>
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
41
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
42 #include "eldap.h"
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
43
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 446
diff changeset
44 static Fixnum ldap_default_port;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
45 static Lisp_Object Vldap_default_base;
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 /* Needed by the lrecord definition */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
48 Lisp_Object Qldapp;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
49
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
50 /* ldap-open plist keywords */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
51 static Lisp_Object Qport, Qauth, Qbinddn, Qpasswd, Qderef, Qtimelimit, Qsizelimit;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
52 /* Search scope limits */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
53 static Lisp_Object Qbase, Qonelevel, Qsubtree;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
54 /* Authentication methods */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
55 static Lisp_Object Qkrbv41, Qkrbv42;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
56 /* Deref policy */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
57 static Lisp_Object Qnever, Qalways, Qfind;
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
58 /* Modification types (Qdelete is defined in general.c) */
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
59 static Lisp_Object Qadd, Qreplace;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
60
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
61
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
62 /************************************************************************/
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
63 /* Utility Functions */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
64 /************************************************************************/
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
65
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
66 static void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
67 signal_ldap_error (LDAP *ld, LDAPMessage *res, int ldap_err)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
68 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
69 if (ldap_err <= 0)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
70 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
71 #if defined HAVE_LDAP_PARSE_RESULT
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
72 int err;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
73 ldap_err = ldap_parse_result (ld, res,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
74 &err,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
75 NULL, NULL, NULL, NULL, 0);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
76 if (ldap_err == LDAP_SUCCESS)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
77 ldap_err = err;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
78 #elif defined HAVE_LDAP_GET_LDERRNO
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
79 ldap_err = ldap_get_lderrno (ld, NULL, NULL);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
80 #elif defined HAVE_LDAP_RESULT2ERROR
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
81 ldap_err = ldap_result2error (ld, res, 0);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
82 #else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
83 ldap_err = ld->ld_errno;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
84 #endif
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
85 }
563
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 458
diff changeset
86 invalid_operation ("LDAP error",
771
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 665
diff changeset
87 build_string (ldap_err2string (ldap_err)));
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
88 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
89
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
90
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
91 /************************************************************************/
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
92 /* ldap lrecord basic functions */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
93 /************************************************************************/
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
94
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
95 static Lisp_Object
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 428
diff changeset
96 make_ldap (Lisp_LDAP *ldap)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
97 {
793
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 771
diff changeset
98 return wrap_ldap (ldap);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
99 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
100
934
c925bacdda60 [xemacs-hg @ 2002-07-29 09:21:12 by michaels]
michaels
parents: 877
diff changeset
101 #ifdef USE_KKCC
c925bacdda60 [xemacs-hg @ 2002-07-29 09:21:12 by michaels]
michaels
parents: 877
diff changeset
102 static const struct lrecord_description ldap_description [] = {
c925bacdda60 [xemacs-hg @ 2002-07-29 09:21:12 by michaels]
michaels
parents: 877
diff changeset
103 { XD_LISP_OBJECT, offsetof (struct Lisp_LDAP, host) },
c925bacdda60 [xemacs-hg @ 2002-07-29 09:21:12 by michaels]
michaels
parents: 877
diff changeset
104 { XD_END }
c925bacdda60 [xemacs-hg @ 2002-07-29 09:21:12 by michaels]
michaels
parents: 877
diff changeset
105 };
c925bacdda60 [xemacs-hg @ 2002-07-29 09:21:12 by michaels]
michaels
parents: 877
diff changeset
106 #endif USE_KKCC
c925bacdda60 [xemacs-hg @ 2002-07-29 09:21:12 by michaels]
michaels
parents: 877
diff changeset
107
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
108 static Lisp_Object
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
109 mark_ldap (Lisp_Object obj)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
110 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
111 return XLDAP (obj)->host;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
112 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
113
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
114 static void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
115 print_ldap (Lisp_Object obj, Lisp_Object printcharfun, int escapeflag)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
116 {
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 428
diff changeset
117 Lisp_LDAP *ldap = XLDAP (obj);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
118
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
119 if (print_readably)
563
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 458
diff changeset
120 printing_unreadable_object ("#<ldap %s>", XSTRING_DATA (ldap->host));
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
121
800
a5954632b187 [xemacs-hg @ 2002-03-31 08:27:14 by ben]
ben
parents: 793
diff changeset
122 write_fmt_string_lisp (printcharfun, "#<ldap %S", 1, ldap->host);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
123 if (!ldap->ld)
849
503b6a57cf47 [xemacs-hg @ 2002-05-21 10:29:07 by stephent]
stephent
parents: 800
diff changeset
124 write_c_string (printcharfun,"(dead) ");
800
a5954632b187 [xemacs-hg @ 2002-03-31 08:27:14 by ben]
ben
parents: 793
diff changeset
125 write_fmt_string (printcharfun, " 0x%lx>", (long)ldap);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
126 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
127
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 428
diff changeset
128 static Lisp_LDAP *
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
129 allocate_ldap (void)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
130 {
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 428
diff changeset
131 Lisp_LDAP *ldap = alloc_lcrecord_type (Lisp_LDAP, &lrecord_ldap);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
132
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
133 ldap->ld = NULL;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
134 ldap->host = Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
135 return ldap;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
136 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
137
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
138 static void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
139 finalize_ldap (void *header, int for_disksave)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
140 {
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 428
diff changeset
141 Lisp_LDAP *ldap = (Lisp_LDAP *) header;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
142
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
143 if (for_disksave)
563
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 458
diff changeset
144 invalid_operation ("Can't dump an emacs containing LDAP objects",
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
145 make_ldap (ldap));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
146
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
147 if (ldap->ld)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
148 ldap_unbind (ldap->ld);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
149 ldap->ld = NULL;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
150 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
151
934
c925bacdda60 [xemacs-hg @ 2002-07-29 09:21:12 by michaels]
michaels
parents: 877
diff changeset
152 #ifdef USE_KKCC
c925bacdda60 [xemacs-hg @ 2002-07-29 09:21:12 by michaels]
michaels
parents: 877
diff changeset
153 DEFINE_LRECORD_IMPLEMENTATION ("ldap", ldap,
c925bacdda60 [xemacs-hg @ 2002-07-29 09:21:12 by michaels]
michaels
parents: 877
diff changeset
154 mark_ldap, print_ldap, finalize_ldap,
c925bacdda60 [xemacs-hg @ 2002-07-29 09:21:12 by michaels]
michaels
parents: 877
diff changeset
155 NULL, NULL, ldap_description, Lisp_LDAP);
c925bacdda60 [xemacs-hg @ 2002-07-29 09:21:12 by michaels]
michaels
parents: 877
diff changeset
156 #else /* not USE_KKCC */
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
157 DEFINE_LRECORD_IMPLEMENTATION ("ldap", ldap,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
158 mark_ldap, print_ldap, finalize_ldap,
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 428
diff changeset
159 NULL, NULL, 0, Lisp_LDAP);
934
c925bacdda60 [xemacs-hg @ 2002-07-29 09:21:12 by michaels]
michaels
parents: 877
diff changeset
160 #endif /* not USE_KKCC */
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
161
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
162
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
163
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
164 /************************************************************************/
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
165 /* Basic ldap accessors */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
166 /************************************************************************/
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
167
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
168 DEFUN ("ldapp", Fldapp, 1, 1, 0, /*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
169 Return t if OBJECT is a LDAP connection.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
170 */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
171 (object))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
172 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
173 return LDAPP (object) ? Qt : Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
174 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
175
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
176 DEFUN ("ldap-host", Fldap_host, 1, 1, 0, /*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
177 Return the server host of the connection LDAP, as a string.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
178 */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
179 (ldap))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
180 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
181 CHECK_LDAP (ldap);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
182 return (XLDAP (ldap))->host;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
183 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
184
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
185 DEFUN ("ldap-live-p", Fldap_status, 1, 1, 0, /*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
186 Return t if LDAP is an active LDAP connection.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
187 */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
188 (ldap))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
189 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
190 CHECK_LDAP (ldap);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
191 return (XLDAP (ldap))->ld ? Qt : Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
192 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
193
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
194 /************************************************************************/
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
195 /* Opening/Closing a LDAP connection */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
196 /************************************************************************/
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
197
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
198
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
199 DEFUN ("ldap-open", Fldap_open, 1, 2, 0, /*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
200 Open a LDAP connection to HOST.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
201 PLIST is a plist containing additional parameters for the connection.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
202 Valid keys in that list are:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
203 `port' the TCP port to use for the connection if different from
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
204 `ldap-default-port'.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
205 `auth' is the authentication method to use, possible values depend on
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
206 the LDAP library XEmacs was compiled with: `simple', `krbv41' and `krbv42'.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
207 `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
208 `passwd' is the password to use for simple authentication.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
209 `deref' is one of the symbols `never', `always', `search' or `find'.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
210 `timelimit' is the timeout limit for the connection in seconds.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
211 `sizelimit' is the maximum number of matches to return.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
212 */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
213 (host, plist))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
214 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
215 /* This function can GC */
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 428
diff changeset
216 Lisp_LDAP *ldap;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
217 LDAP *ld;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
218 int ldap_port = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
219 int ldap_auth = LDAP_AUTH_SIMPLE;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
220 char *ldap_binddn = NULL;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
221 char *ldap_passwd = NULL;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
222 int ldap_deref = LDAP_DEREF_NEVER;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
223 int ldap_timelimit = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
224 int ldap_sizelimit = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
225 int err;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
226
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
227 CHECK_STRING (host);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
228
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
229 {
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
230 EXTERNAL_PROPERTY_LIST_LOOP_3 (keyword, value, plist)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
231 {
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
232 /* TCP Port */
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
233 if (EQ (keyword, Qport))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
234 {
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
235 CHECK_INT (value);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
236 ldap_port = XINT (value);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
237 }
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
238 /* Authentication method */
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
239 if (EQ (keyword, Qauth))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
240 {
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
241 if (EQ (value, Qsimple))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
242 ldap_auth = LDAP_AUTH_SIMPLE;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
243 #ifdef LDAP_AUTH_KRBV41
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
244 else if (EQ (value, Qkrbv41))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
245 ldap_auth = LDAP_AUTH_KRBV41;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
246 #endif
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
247 #ifdef LDAP_AUTH_KRBV42
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
248 else if (EQ (value, Qkrbv42))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
249 ldap_auth = LDAP_AUTH_KRBV42;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
250 #endif
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
251 else
563
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 458
diff changeset
252 invalid_constant ("Invalid authentication method", value);
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
253 }
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
254 /* Bind DN */
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
255 else if (EQ (keyword, Qbinddn))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
256 {
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
257 CHECK_STRING (value);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
258 LISP_STRING_TO_EXTERNAL (value, ldap_binddn, Qnative);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
259 }
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
260 /* Password */
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
261 else if (EQ (keyword, Qpasswd))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
262 {
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
263 CHECK_STRING (value);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
264 LISP_STRING_TO_EXTERNAL (value, ldap_passwd, Qnative);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
265 }
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
266 /* Deref */
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
267 else if (EQ (keyword, Qderef))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
268 {
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
269 if (EQ (value, Qnever))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
270 ldap_deref = LDAP_DEREF_NEVER;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
271 else if (EQ (value, Qsearch))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
272 ldap_deref = LDAP_DEREF_SEARCHING;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
273 else if (EQ (value, Qfind))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
274 ldap_deref = LDAP_DEREF_FINDING;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
275 else if (EQ (value, Qalways))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
276 ldap_deref = LDAP_DEREF_ALWAYS;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
277 else
563
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 458
diff changeset
278 invalid_constant ("Invalid deref value", value);
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
279 }
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
280 /* Timelimit */
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
281 else if (EQ (keyword, Qtimelimit))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
282 {
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
283 CHECK_INT (value);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
284 ldap_timelimit = XINT (value);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
285 }
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
286 /* Sizelimit */
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
287 else if (EQ (keyword, Qsizelimit))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
288 {
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
289 CHECK_INT (value);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
290 ldap_sizelimit = XINT (value);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
291 }
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
292 }
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
293 }
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
294
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
295 if (ldap_port == 0)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
296 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
297 ldap_port = ldap_default_port;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
298 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
299
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
300 /* Connect to the server and bind */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
301 slow_down_interrupts ();
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
302 ld = ldap_open ((char *) XSTRING_DATA (host), ldap_port);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
303 speed_up_interrupts ();
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
304
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
305 if (ld == NULL )
563
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 458
diff changeset
306 report_process_error ("Failed connecting to host", host);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
307
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
308 #ifdef HAVE_LDAP_SET_OPTION
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
309 if ((err = ldap_set_option (ld, LDAP_OPT_DEREF,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
310 (void *)&ldap_deref)) != LDAP_SUCCESS)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
311 signal_ldap_error (ld, NULL, err);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
312 if ((err = ldap_set_option (ld, LDAP_OPT_TIMELIMIT,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
313 (void *)&ldap_timelimit)) != LDAP_SUCCESS)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
314 signal_ldap_error (ld, NULL, err);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
315 if ((err = ldap_set_option (ld, LDAP_OPT_SIZELIMIT,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
316 (void *)&ldap_sizelimit)) != LDAP_SUCCESS)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
317 signal_ldap_error (ld, NULL, err);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
318 if ((err = ldap_set_option (ld, LDAP_OPT_REFERRALS,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
319 LDAP_OPT_ON)) != LDAP_SUCCESS)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
320 signal_ldap_error (ld, NULL, err);
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
321 if ((err = ldap_set_option (ld, LDAP_OPT_RESTART,
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
322 LDAP_OPT_ON)) != LDAP_SUCCESS)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
323 signal_ldap_error (ld, NULL, err);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
324 #else /* not HAVE_LDAP_SET_OPTION */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
325 ld->ld_deref = ldap_deref;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
326 ld->ld_timelimit = ldap_timelimit;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
327 ld->ld_sizelimit = ldap_sizelimit;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
328 #ifdef LDAP_REFERRALS
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
329 ld->ld_options = LDAP_OPT_REFERRALS;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
330 #else /* not LDAP_REFERRALS */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
331 ld->ld_options = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
332 #endif /* not LDAP_REFERRALS */
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
333 /* XEmacs uses interrupts (SIGIO,SIGALRM), LDAP calls need to ignore them */
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
334 ld->ld_options |= LDAP_OPT_RESTART;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
335 #endif /* not HAVE_LDAP_SET_OPTION */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
336
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
337 err = ldap_bind_s (ld, ldap_binddn, ldap_passwd, ldap_auth);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
338 if (err != LDAP_SUCCESS)
563
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 458
diff changeset
339 {
867
804517e16990 [xemacs-hg @ 2002-06-05 09:54:39 by ben]
ben
parents: 849
diff changeset
340 Ibyte *interrmess;
563
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 458
diff changeset
341 EXTERNAL_TO_C_STRING (ldap_err2string (err), interrmess, Qnative);
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 458
diff changeset
342 signal_error (Qprocess_error, "Failed binding to the server",
771
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 665
diff changeset
343 build_intstring (interrmess));
563
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 458
diff changeset
344 }
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
345
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
346 ldap = allocate_ldap ();
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
347 ldap->ld = ld;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
348 ldap->host = host;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
349
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
350 return make_ldap (ldap);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
351 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
352
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
353
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
354
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
355 DEFUN ("ldap-close", Fldap_close, 1, 1, 0, /*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
356 Close an LDAP connection.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
357 */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
358 (ldap))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
359 {
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 428
diff changeset
360 Lisp_LDAP *lldap;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
361 CHECK_LIVE_LDAP (ldap);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
362 lldap = XLDAP (ldap);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
363 ldap_unbind (lldap->ld);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
364 lldap->ld = NULL;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
365 return Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
366 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
367
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
368
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
369
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
370 /************************************************************************/
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
371 /* Working on a LDAP connection */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
372 /************************************************************************/
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
373 struct ldap_unwind_struct
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
374 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
375 LDAPMessage *res;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
376 struct berval **vals;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
377 };
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
378
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
379 static Lisp_Object
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
380 ldap_search_unwind (Lisp_Object unwind_obj)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
381 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
382 struct ldap_unwind_struct *unwind =
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
383 (struct ldap_unwind_struct *) get_opaque_ptr (unwind_obj);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
384 if (unwind->res)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
385 ldap_msgfree (unwind->res);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
386 if (unwind->vals)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
387 ldap_value_free_len (unwind->vals);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
388 return Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
389 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
390
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
391 /* The following function is called `ldap-search-basic' instead of */
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
392 /* plain `ldap-search' to maintain compatibility with the XEmacs 21.1 */
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
393 /* API where `ldap-search' was the name of the high-level search */
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
394 /* function */
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
395
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
396 DEFUN ("ldap-search-basic", Fldap_search_basic, 2, 8, 0, /*
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
397 Perform a search on an open LDAP connection.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
398 LDAP is an LDAP connection object created with `ldap-open'.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
399 FILTER is a filter string for the search as described in RFC 1558.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
400 BASE is the distinguished name at which to start the search.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
401 SCOPE is one of the symbols `base', `onelevel' or `subtree' indicating
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
402 the scope of the search.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
403 ATTRS is a list of strings indicating which attributes to retrieve
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
404 for each matching entry. If nil return all available attributes.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
405 If ATTRSONLY is non-nil then only the attributes are retrieved, not
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
406 the associated values.
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
407 If WITHDN is non-nil each entry in the result will be prepended with
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
408 its distinguished name DN.
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
409 If VERBOSE is non-nil progress messages will be echoed.
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
410 The function returns a list of matching entries. Each entry is itself
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
411 an alist of attribute/value pairs optionally preceded by the DN of the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
412 entry according to the value of WITHDN.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
413 */
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
414 (ldap, filter, base, scope, attrs, attrsonly, withdn, verbose))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
415 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
416 /* This function can GC */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
417
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
418 /* Vars for query */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
419 LDAP *ld;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
420 LDAPMessage *e;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
421 BerElement *ptr;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
422 char *a, *dn;
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
423 int i, rc;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
424 int matches;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
425 struct ldap_unwind_struct unwind;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
426
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
427 int ldap_scope = LDAP_SCOPE_SUBTREE;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
428 char **ldap_attributes = NULL;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
429
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
430 int speccount = specpdl_depth ();
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
431
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
432 Lisp_Object list = Qnil;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
433 Lisp_Object entry = Qnil;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
434 Lisp_Object result = Qnil;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
435 struct gcpro gcpro1, gcpro2, gcpro3;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
436
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
437 GCPRO3 (list, entry, result);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
438
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
439 unwind.res = NULL;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
440 unwind.vals = NULL;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
441
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
442 /* Do all the parameter checking */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
443 CHECK_LIVE_LDAP (ldap);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
444 ld = XLDAP (ldap)->ld;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
445
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
446 /* Filter */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
447 CHECK_STRING (filter);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
448
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
449 /* Search base */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
450 if (NILP (base))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
451 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
452 base = Vldap_default_base;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
453 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
454 if (!NILP (base))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
455 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
456 CHECK_STRING (base);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
457 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
458
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
459 /* Search scope */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
460 if (!NILP (scope))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
461 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
462 if (EQ (scope, Qbase))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
463 ldap_scope = LDAP_SCOPE_BASE;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
464 else if (EQ (scope, Qonelevel))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
465 ldap_scope = LDAP_SCOPE_ONELEVEL;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
466 else if (EQ (scope, Qsubtree))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
467 ldap_scope = LDAP_SCOPE_SUBTREE;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
468 else
563
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 458
diff changeset
469 invalid_constant ("Invalid scope", scope);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
470 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
471
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
472 /* Attributes to search */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
473 if (!NILP (attrs))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
474 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
475 CHECK_CONS (attrs);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
476 ldap_attributes = alloca_array (char *, 1 + XINT (Flength (attrs)));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
477
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
478 i = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
479 EXTERNAL_LIST_LOOP (attrs, attrs)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
480 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
481 Lisp_Object current = XCAR (attrs);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
482 CHECK_STRING (current);
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
483 LISP_STRING_TO_EXTERNAL (current, ldap_attributes[i], Qnative);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
484 ++i;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
485 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
486 ldap_attributes[i] = NULL;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
487 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
488
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
489 /* Attributes only ? */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
490 CHECK_SYMBOL (attrsonly);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
491
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
492 /* Perform the search */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
493 if (ldap_search (ld,
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
494 NILP (base) ? (char *) "" : (char *) XSTRING_DATA (base),
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
495 ldap_scope,
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
496 NILP (filter) ? (char *) "" : (char *) XSTRING_DATA (filter),
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
497 ldap_attributes,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
498 NILP (attrsonly) ? 0 : 1)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
499 == -1)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
500 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
501 signal_ldap_error (ld, NULL, 0);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
502 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
503
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
504 /* Ensure we don't exit without cleaning up */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
505 record_unwind_protect (ldap_search_unwind,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
506 make_opaque_ptr (&unwind));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
507
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
508 /* Build the results list */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
509 matches = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
510
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
511 rc = ldap_result (ld, LDAP_RES_ANY, 0, NULL, &unwind.res);
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
512
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
513 while (rc == LDAP_RES_SEARCH_ENTRY)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
514 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
515 QUIT;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
516 matches ++;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
517 e = ldap_first_entry (ld, unwind.res);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
518 /* #### This call to message() is pretty fascist, because it
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
519 destroys the current echo area contents, even when invoked
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
520 from Lisp. It should use echo_area_message() instead, and
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
521 restore the old echo area contents later. */
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
522 if (! NILP (verbose))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
523 message ("Parsing ldap results... %d", matches);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
524 entry = Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
525 /* Get the DN if required */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
526 if (! NILP (withdn))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
527 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
528 dn = ldap_get_dn (ld, e);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
529 if (dn == NULL)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
530 signal_ldap_error (ld, e, 0);
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 428
diff changeset
531 entry = Fcons (build_ext_string (dn, Qnative), Qnil);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
532 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
533 for (a= ldap_first_attribute (ld, e, &ptr);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
534 a != NULL;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
535 a = ldap_next_attribute (ld, e, ptr) )
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
536 {
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 428
diff changeset
537 list = Fcons (build_ext_string (a, Qnative), Qnil);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
538 unwind.vals = ldap_get_values_len (ld, e, a);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
539 if (unwind.vals != NULL)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
540 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
541 for (i = 0; unwind.vals[i] != NULL; i++)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
542 {
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
543 list = Fcons (make_ext_string ((Extbyte *) unwind.vals[i]->bv_val,
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
544 unwind.vals[i]->bv_len,
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 428
diff changeset
545 Qnative),
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
546 list);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
547 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
548 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
549 entry = Fcons (Fnreverse (list),
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
550 entry);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
551 ldap_value_free_len (unwind.vals);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
552 unwind.vals = NULL;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
553 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
554 result = Fcons (Fnreverse (entry),
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
555 result);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
556 ldap_msgfree (unwind.res);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
557 unwind.res = NULL;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
558
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
559 rc = ldap_result (ld, LDAP_RES_ANY, 0, NULL, &(unwind.res));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
560 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
561
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
562 #if defined HAVE_LDAP_PARSE_RESULT
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
563 {
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
564 int rc2 = ldap_parse_result (ld, unwind.res,
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
565 &rc,
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
566 NULL, NULL, NULL, NULL, 0);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
567 if (rc2 != LDAP_SUCCESS)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
568 rc = rc2;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
569 }
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
570 #else
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
571 if (rc == 0)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
572 signal_ldap_error (ld, NULL, LDAP_TIMELIMIT_EXCEEDED);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
573
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
574 if (rc == -1)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
575 signal_ldap_error (ld, unwind.res, (unwind.res==NULL) ? ld->ld_errno : 0);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
576
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
577 #if defined HAVE_LDAP_RESULT2ERROR
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
578 rc = ldap_result2error (ld, unwind.res, 0);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
579 #endif
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
580 #endif
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
581
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
582 if (rc != LDAP_SUCCESS)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
583 signal_ldap_error (ld, NULL, rc);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
584
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
585 ldap_msgfree (unwind.res);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
586 unwind.res = (LDAPMessage *)NULL;
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
587
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
588 /* #### See above for calling message(). */
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
589 if (! NILP (verbose))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
590 message ("Parsing ldap results... done");
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
591
771
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 665
diff changeset
592 unbind_to (speccount);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
593 UNGCPRO;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
594 return Fnreverse (result);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
595 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
596
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
597 DEFUN ("ldap-add", Fldap_add, 3, 3, 0, /*
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
598 Add an entry to an LDAP directory.
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
599 LDAP is an LDAP connection object created with `ldap-open'.
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
600 DN is the distinguished name of the entry to add.
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
601 ENTRY is an entry specification, i.e., a list of cons cells
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
602 containing attribute/value string pairs.
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
603 */
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
604 (ldap, dn, entry))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
605 {
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
606 LDAP *ld;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
607 LDAPMod *ldap_mods, **ldap_mods_ptrs;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
608 struct berval *bervals;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
609 int rc;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
610 int i, j;
665
fdefd0186b75 [xemacs-hg @ 2001-09-20 06:28:42 by ben]
ben
parents: 647
diff changeset
611 Elemcount len;
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
612
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
613 Lisp_Object current = Qnil;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
614 Lisp_Object values = Qnil;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
615 struct gcpro gcpro1, gcpro2;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
616
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
617 GCPRO2 (current, values);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
618
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
619 /* Do all the parameter checking */
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
620 CHECK_LIVE_LDAP (ldap);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
621 ld = XLDAP (ldap)->ld;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
622
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
623 /* Check the DN */
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
624 CHECK_STRING (dn);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
625
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
626 /* Check the entry */
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
627 CHECK_CONS (entry);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
628 if (NILP (entry))
563
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 458
diff changeset
629 invalid_operation ("Cannot add void entry", entry);
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
630
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
631 /* Build the ldap_mods array */
665
fdefd0186b75 [xemacs-hg @ 2001-09-20 06:28:42 by ben]
ben
parents: 647
diff changeset
632 len = (Elemcount) XINT (Flength (entry));
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
633 ldap_mods = alloca_array (LDAPMod, len);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
634 ldap_mods_ptrs = alloca_array (LDAPMod *, 1 + len);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
635 i = 0;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
636 EXTERNAL_LIST_LOOP (entry, entry)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
637 {
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
638 current = XCAR (entry);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
639 CHECK_CONS (current);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
640 CHECK_STRING (XCAR (current));
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
641 ldap_mods_ptrs[i] = &(ldap_mods[i]);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
642 LISP_STRING_TO_EXTERNAL (XCAR (current), ldap_mods[i].mod_type, Qnative);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
643 ldap_mods[i].mod_op = LDAP_MOD_ADD | LDAP_MOD_BVALUES;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
644 values = XCDR (current);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
645 if (CONSP (values))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
646 {
665
fdefd0186b75 [xemacs-hg @ 2001-09-20 06:28:42 by ben]
ben
parents: 647
diff changeset
647 len = (Elemcount) XINT (Flength (values));
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
648 bervals = alloca_array (struct berval, len);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
649 ldap_mods[i].mod_vals.modv_bvals =
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
650 alloca_array (struct berval *, 1 + len);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
651 j = 0;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
652 EXTERNAL_LIST_LOOP (values, values)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
653 {
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
654 current = XCAR (values);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
655 CHECK_STRING (current);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
656 ldap_mods[i].mod_vals.modv_bvals[j] = &(bervals[j]);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
657 TO_EXTERNAL_FORMAT (LISP_STRING, current,
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
658 ALLOCA, (bervals[j].bv_val,
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
659 bervals[j].bv_len),
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
660 Qnative);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
661 j++;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
662 }
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
663 ldap_mods[i].mod_vals.modv_bvals[j] = NULL;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
664 }
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
665 else
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
666 {
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
667 CHECK_STRING (values);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
668 bervals = alloca_array (struct berval, 1);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
669 ldap_mods[i].mod_vals.modv_bvals = alloca_array (struct berval *, 2);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
670 ldap_mods[i].mod_vals.modv_bvals[0] = &(bervals[0]);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
671 TO_EXTERNAL_FORMAT (LISP_STRING, values,
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
672 ALLOCA, (bervals[0].bv_val,
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
673 bervals[0].bv_len),
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
674 Qnative);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
675 ldap_mods[i].mod_vals.modv_bvals[1] = NULL;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
676 }
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
677 i++;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
678 }
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
679 ldap_mods_ptrs[i] = NULL;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
680 rc = ldap_add_s (ld, (char *) XSTRING_DATA (dn), ldap_mods_ptrs);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
681 if (rc != LDAP_SUCCESS)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
682 signal_ldap_error (ld, NULL, rc);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
683
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
684 UNGCPRO;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
685 return Qnil;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
686 }
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
687
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
688 DEFUN ("ldap-modify", Fldap_modify, 3, 3, 0, /*
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
689 Add an entry to an LDAP directory.
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
690 LDAP is an LDAP connection object created with `ldap-open'.
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
691 DN is the distinguished name of the entry to modify.
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
692 MODS is a list of modifications to apply.
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
693 A modification is a list of the form (MOD-OP ATTR VALUE1 VALUE2 ...)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
694 MOD-OP and ATTR are mandatory, VALUEs are optional depending on MOD-OP.
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
695 MOD-OP is the type of modification, one of the symbols `add', `delete'
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
696 or `replace'. ATTR is the LDAP attribute type to modify.
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
697 */
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
698 (ldap, dn, mods))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
699 {
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
700 LDAP *ld;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
701 LDAPMod *ldap_mods, **ldap_mods_ptrs;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
702 struct berval *bervals;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
703 int i, j, rc;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
704 Lisp_Object mod_op;
665
fdefd0186b75 [xemacs-hg @ 2001-09-20 06:28:42 by ben]
ben
parents: 647
diff changeset
705 Elemcount len;
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
706
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
707 Lisp_Object current = Qnil;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
708 Lisp_Object values = Qnil;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
709 struct gcpro gcpro1, gcpro2;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
710
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
711 /* Do all the parameter checking */
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
712 CHECK_LIVE_LDAP (ldap);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
713 ld = XLDAP (ldap)->ld;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
714
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
715 /* Check the DN */
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
716 CHECK_STRING (dn);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
717
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
718 /* Check the entry */
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
719 CHECK_CONS (mods);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
720 if (NILP (mods))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
721 return Qnil;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
722
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
723 /* Build the ldap_mods array */
665
fdefd0186b75 [xemacs-hg @ 2001-09-20 06:28:42 by ben]
ben
parents: 647
diff changeset
724 len = (Elemcount) XINT (Flength (mods));
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
725 ldap_mods = alloca_array (LDAPMod, len);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
726 ldap_mods_ptrs = alloca_array (LDAPMod *, 1 + len);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
727 i = 0;
446
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
728
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
729 GCPRO2 (current, values);
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
730 EXTERNAL_LIST_LOOP (mods, mods)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
731 {
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
732 current = XCAR (mods);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
733 CHECK_CONS (current);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
734 CHECK_SYMBOL (XCAR (current));
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
735 mod_op = XCAR (current);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
736 ldap_mods_ptrs[i] = &(ldap_mods[i]);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
737 ldap_mods[i].mod_op = LDAP_MOD_BVALUES;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
738 if (EQ (mod_op, Qadd))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
739 ldap_mods[i].mod_op |= LDAP_MOD_ADD;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
740 else if (EQ (mod_op, Qdelete))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
741 ldap_mods[i].mod_op |= LDAP_MOD_DELETE;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
742 else if (EQ (mod_op, Qreplace))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
743 ldap_mods[i].mod_op |= LDAP_MOD_REPLACE;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
744 else
563
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 458
diff changeset
745 invalid_constant ("Invalid LDAP modification type", mod_op);
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
746 current = XCDR (current);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
747 CHECK_STRING (XCAR (current));
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
748 LISP_STRING_TO_EXTERNAL (XCAR (current), ldap_mods[i].mod_type, Qnative);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
749 values = XCDR (current);
665
fdefd0186b75 [xemacs-hg @ 2001-09-20 06:28:42 by ben]
ben
parents: 647
diff changeset
750 len = (Elemcount) XINT (Flength (values));
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
751 bervals = alloca_array (struct berval, len);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
752 ldap_mods[i].mod_vals.modv_bvals =
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
753 alloca_array (struct berval *, 1 + len);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
754 j = 0;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
755 EXTERNAL_LIST_LOOP (values, values)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
756 {
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
757 current = XCAR (values);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
758 CHECK_STRING (current);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
759 ldap_mods[i].mod_vals.modv_bvals[j] = &(bervals[j]);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
760 TO_EXTERNAL_FORMAT (LISP_STRING, current,
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
761 ALLOCA, (bervals[j].bv_val,
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
762 bervals[j].bv_len),
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
763 Qnative);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
764 j++;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
765 }
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
766 ldap_mods[i].mod_vals.modv_bvals[j] = NULL;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
767 i++;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
768 }
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
769 ldap_mods_ptrs[i] = NULL;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
770 rc = ldap_modify_s (ld, (char *) XSTRING_DATA (dn), ldap_mods_ptrs);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
771 if (rc != LDAP_SUCCESS)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
772 signal_ldap_error (ld, NULL, rc);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
773
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
774 UNGCPRO;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
775 return Qnil;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
776 }
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
777
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
778
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
779 DEFUN ("ldap-delete", Fldap_delete, 2, 2, 0, /*
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
780 Delete an entry to an LDAP directory.
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
781 LDAP is an LDAP connection object created with `ldap-open'.
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
782 DN is the distinguished name of the entry to delete.
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
783 */
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
784 (ldap, dn))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
785 {
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
786 LDAP *ld;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
787 int rc;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
788
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
789 /* Check parameters */
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
790 CHECK_LIVE_LDAP (ldap);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
791 ld = XLDAP (ldap)->ld;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
792 CHECK_STRING (dn);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
793
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
794 rc = ldap_delete_s (ld, (char *) XSTRING_DATA (dn));
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
795 if (rc != LDAP_SUCCESS)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
796 signal_ldap_error (ld, NULL, rc);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
797
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
798 return Qnil;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
799 }
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
800
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
801 void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
802 syms_of_eldap (void)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
803 {
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
804 INIT_LRECORD_IMPLEMENTATION (ldap);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
805
563
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 458
diff changeset
806 DEFSYMBOL (Qldapp);
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 458
diff changeset
807 DEFSYMBOL (Qport);
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 458
diff changeset
808 DEFSYMBOL (Qauth);
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 458
diff changeset
809 DEFSYMBOL (Qbinddn);
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 458
diff changeset
810 DEFSYMBOL (Qpasswd);
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 458
diff changeset
811 DEFSYMBOL (Qderef);
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 458
diff changeset
812 DEFSYMBOL (Qtimelimit);
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 458
diff changeset
813 DEFSYMBOL (Qsizelimit);
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 458
diff changeset
814 DEFSYMBOL (Qbase);
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 458
diff changeset
815 DEFSYMBOL (Qonelevel);
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 458
diff changeset
816 DEFSYMBOL (Qsubtree);
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 458
diff changeset
817 DEFSYMBOL (Qkrbv41);
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 458
diff changeset
818 DEFSYMBOL (Qkrbv42);
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 458
diff changeset
819 DEFSYMBOL (Qnever);
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 458
diff changeset
820 DEFSYMBOL (Qalways);
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 458
diff changeset
821 DEFSYMBOL (Qfind);
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 458
diff changeset
822 DEFSYMBOL (Qadd);
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 458
diff changeset
823 DEFSYMBOL (Qreplace);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
824
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
825 DEFSUBR (Fldapp);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
826 DEFSUBR (Fldap_host);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
827 DEFSUBR (Fldap_status);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
828 DEFSUBR (Fldap_open);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
829 DEFSUBR (Fldap_close);
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
830 DEFSUBR (Fldap_search_basic);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
831 DEFSUBR (Fldap_add);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
832 DEFSUBR (Fldap_modify);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
833 DEFSUBR (Fldap_delete);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
834 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
835
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
836 void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
837 vars_of_eldap (void)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
838 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
839
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
840 ldap_default_port = LDAP_PORT;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
841 Vldap_default_base = Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
842
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
843 DEFVAR_INT ("ldap-default-port", &ldap_default_port /*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
844 Default TCP port for LDAP connections.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
845 Initialized from the LDAP library. Default value is 389.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
846 */ );
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
847
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
848 DEFVAR_LISP ("ldap-default-base", &Vldap_default_base /*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
849 Default base for LDAP searches.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
850 This is a string using the syntax of RFC 1779.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
851 For instance, "o=ACME, c=US" limits the search to the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
852 Acme organization in the United States.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
853 */ );
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
854
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
855 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
856
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
857