annotate modules/ldap/eldap.c @ 4407:4ee73bbe4f8e

Always use boyer_moore in ASCII or Latin-1 buffers with ASCII search strings. 2007-12-26 Aidan Kehoe <kehoea@parhasard.net> * casetab.c: Extend and correct some case table documentation. * search.c (search_buffer): Correct a bug where only the first entry for a character in the case equivalence table was examined in determining if the Boyer-Moore search algorithm is appropriate. If there are case mappings outside of the charset and row of the characters specified in the search string, those case mappings can be safely ignored (and Boyer-Moore search can be used) if we know from the buffer statistics that the corresponding characters cannot occur. * search.c (boyer_moore): Assert that we haven't been passed a string with varying characters sets or rows within character sets. That's what simple_search is for. In the very rare event that a character in the search string has a canonical case mapping that is not in the same character set and row, don't try to search for the canonical character, search for some other character that is in the the desired character set and row. Assert that the case table isn't corrupt. Do not search for any character case mappings that cannot possibly occur in the buffer, given the buffer metadata about its contents.
author Aidan Kehoe <kehoea@parhasard.net>
date Wed, 26 Dec 2007 17:30:16 +0100
parents 986cd22006a9
children 3a87551bfeb5 3742ea8250b5
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 {
3024
b7f26b2f78bd [xemacs-hg @ 2005-10-25 08:32:40 by ben]
ben
parents: 2720
diff changeset
144 Lisp_LDAP *ldap = ALLOC_LCRECORD_TYPE (Lisp_LDAP, &lrecord_ldap);
996
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 values = Qnil;
2367
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 2286
diff changeset
623 struct gcpro gcpro1;
996
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
624
2367
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 2286
diff changeset
625 GCPRO1 (values);
996
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
626
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
627 /* Do all the parameter checking */
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
628 CHECK_LIVE_LDAP (ldap);
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
629 ld = XLDAP (ldap)->ld;
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
630
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
631 /* Check the DN */
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
632 CHECK_STRING (dn);
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
633
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
634 /* Check the entry */
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
635 CHECK_CONS (entry);
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
636 if (NILP (entry))
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
637 invalid_operation ("Cannot add void entry", entry);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
638
996
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
639 /* Build the ldap_mods array */
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
640 len = (Elemcount) XINT (Flength (entry));
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
641 ldap_mods = alloca_array (LDAPMod, len);
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
642 ldap_mods_ptrs = alloca_array (LDAPMod *, 1 + len);
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
643 i = 0;
2367
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 2286
diff changeset
644
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 EXTERNAL_LIST_LOOP_2 (current, entry)
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 2286
diff changeset
647 {
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 2286
diff changeset
648 CHECK_CONS (current);
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 2286
diff changeset
649 CHECK_STRING (XCAR (current));
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 2286
diff changeset
650 ldap_mods_ptrs[i] = &(ldap_mods[i]);
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 2286
diff changeset
651 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
652 Qnative);
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 2286
diff changeset
653 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
654 values = XCDR (current);
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 2286
diff changeset
655 if (CONSP (values))
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 2286
diff changeset
656 {
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 2286
diff changeset
657 len = (Elemcount) XINT (Flength (values));
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 2286
diff changeset
658 bervals = alloca_array (struct berval, len);
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 2286
diff changeset
659 ldap_mods[i].mod_vals.modv_bvals =
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 2286
diff changeset
660 alloca_array (struct berval *, 1 + len);
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 2286
diff changeset
661 j = 0;
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 2286
diff changeset
662 {
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 2286
diff changeset
663 EXTERNAL_LIST_LOOP_2 (cur2, values)
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 2286
diff changeset
664 {
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 2286
diff changeset
665 CHECK_STRING (cur2);
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 2286
diff changeset
666 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
667 TO_EXTERNAL_FORMAT (LISP_STRING, cur2,
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 2286
diff changeset
668 ALLOCA, (bervals[j].bv_val,
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 2286
diff changeset
669 bervals[j].bv_len),
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 2286
diff changeset
670 Qnative);
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 2286
diff changeset
671 j++;
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 2286
diff changeset
672 }
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 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
675 }
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 2286
diff changeset
676 else
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 2286
diff changeset
677 {
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 2286
diff changeset
678 CHECK_STRING (values);
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 2286
diff changeset
679 bervals = alloca_array (struct berval, 1);
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 2286
diff changeset
680 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
681 2);
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 2286
diff changeset
682 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
683 TO_EXTERNAL_FORMAT (LISP_STRING, values,
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 2286
diff changeset
684 ALLOCA, (bervals[0].bv_val,
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 2286
diff changeset
685 bervals[0].bv_len),
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 2286
diff changeset
686 Qnative);
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 2286
diff changeset
687 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
688 }
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 2286
diff changeset
689 i++;
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 2286
diff changeset
690 }
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 2286
diff changeset
691 }
996
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
692 ldap_mods_ptrs[i] = NULL;
2367
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 2286
diff changeset
693 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
694 ldap_mods_ptrs);
996
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
695 if (rc != LDAP_SUCCESS)
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
696 signal_ldap_error (ld, NULL, rc);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
697
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
698 UNGCPRO;
996
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
699 return Qnil;
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
700 }
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 DEFUN ("ldap-modify", Fldap_modify, 3, 3, 0, /*
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
703 Add an entry to an LDAP directory.
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
704 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
705 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
706 MODS is a list of modifications to apply.
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
707 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
708 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
709 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
710 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
711 */
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
712 (ldap, dn, mods))
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
713 {
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
714 LDAP *ld;
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
715 LDAPMod *ldap_mods, **ldap_mods_ptrs;
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
716 struct berval *bervals;
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
717 int i, j, rc;
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
718 Lisp_Object mod_op;
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
719 Elemcount len;
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
720
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
721 Lisp_Object values = Qnil;
3029
986cd22006a9 [xemacs-hg @ 2005-10-26 13:01:37 by stephent]
stephent
parents: 3024
diff changeset
722 struct gcpro gcpro1;
996
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
723
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
724 /* Do all the parameter checking */
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
725 CHECK_LIVE_LDAP (ldap);
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
726 ld = XLDAP (ldap)->ld;
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
727
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
728 /* Check the DN */
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
729 CHECK_STRING (dn);
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
730
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
731 /* Check the entry */
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
732 CHECK_CONS (mods);
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
733 if (NILP (mods))
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
734 return Qnil;
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
735
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
736 /* Build the ldap_mods array */
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
737 len = (Elemcount) XINT (Flength (mods));
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
738 ldap_mods = alloca_array (LDAPMod, len);
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
739 ldap_mods_ptrs = alloca_array (LDAPMod *, 1 + len);
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
740 i = 0;
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
741
2367
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 2286
diff changeset
742 GCPRO1 (values);
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 2286
diff changeset
743 {
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 2286
diff changeset
744 EXTERNAL_LIST_LOOP_2 (current, mods)
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 2286
diff changeset
745 {
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 2286
diff changeset
746 CHECK_CONS (current);
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 2286
diff changeset
747 CHECK_SYMBOL (XCAR (current));
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 2286
diff changeset
748 mod_op = XCAR (current);
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 2286
diff changeset
749 ldap_mods_ptrs[i] = &(ldap_mods[i]);
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 2286
diff changeset
750 ldap_mods[i].mod_op = LDAP_MOD_BVALUES;
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 2286
diff changeset
751 if (EQ (mod_op, Qadd))
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 2286
diff changeset
752 ldap_mods[i].mod_op |= LDAP_MOD_ADD;
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 2286
diff changeset
753 else if (EQ (mod_op, Qdelete))
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 2286
diff changeset
754 ldap_mods[i].mod_op |= LDAP_MOD_DELETE;
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 2286
diff changeset
755 else if (EQ (mod_op, Qreplace))
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 2286
diff changeset
756 ldap_mods[i].mod_op |= LDAP_MOD_REPLACE;
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 2286
diff changeset
757 else
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 2286
diff changeset
758 invalid_constant ("Invalid LDAP modification type", mod_op);
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 2286
diff changeset
759 current = XCDR (current);
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 2286
diff changeset
760 CHECK_STRING (XCAR (current));
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 2286
diff changeset
761 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
762 Qnative);
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 2286
diff changeset
763 values = XCDR (current);
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 2286
diff changeset
764 len = (Elemcount) XINT (Flength (values));
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 2286
diff changeset
765 bervals = alloca_array (struct berval, len);
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 2286
diff changeset
766 ldap_mods[i].mod_vals.modv_bvals =
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 2286
diff changeset
767 alloca_array (struct berval *, 1 + len);
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 2286
diff changeset
768 j = 0;
2387
7ee6ea4ff5c0 [xemacs-hg @ 2004-11-14 01:43:02 by ben]
ben
parents: 2367
diff changeset
769 {
7ee6ea4ff5c0 [xemacs-hg @ 2004-11-14 01:43:02 by ben]
ben
parents: 2367
diff changeset
770 EXTERNAL_LIST_LOOP_2 (cur2, values)
7ee6ea4ff5c0 [xemacs-hg @ 2004-11-14 01:43:02 by ben]
ben
parents: 2367
diff changeset
771 {
7ee6ea4ff5c0 [xemacs-hg @ 2004-11-14 01:43:02 by ben]
ben
parents: 2367
diff changeset
772 CHECK_STRING (cur2);
7ee6ea4ff5c0 [xemacs-hg @ 2004-11-14 01:43:02 by ben]
ben
parents: 2367
diff changeset
773 ldap_mods[i].mod_vals.modv_bvals[j] = &(bervals[j]);
7ee6ea4ff5c0 [xemacs-hg @ 2004-11-14 01:43:02 by ben]
ben
parents: 2367
diff changeset
774 TO_EXTERNAL_FORMAT (LISP_STRING, cur2,
7ee6ea4ff5c0 [xemacs-hg @ 2004-11-14 01:43:02 by ben]
ben
parents: 2367
diff changeset
775 ALLOCA, (bervals[j].bv_val,
7ee6ea4ff5c0 [xemacs-hg @ 2004-11-14 01:43:02 by ben]
ben
parents: 2367
diff changeset
776 bervals[j].bv_len),
7ee6ea4ff5c0 [xemacs-hg @ 2004-11-14 01:43:02 by ben]
ben
parents: 2367
diff changeset
777 Qnative);
7ee6ea4ff5c0 [xemacs-hg @ 2004-11-14 01:43:02 by ben]
ben
parents: 2367
diff changeset
778 j++;
7ee6ea4ff5c0 [xemacs-hg @ 2004-11-14 01:43:02 by ben]
ben
parents: 2367
diff changeset
779 }
7ee6ea4ff5c0 [xemacs-hg @ 2004-11-14 01:43:02 by ben]
ben
parents: 2367
diff changeset
780 ldap_mods[i].mod_vals.modv_bvals[j] = NULL;
7ee6ea4ff5c0 [xemacs-hg @ 2004-11-14 01:43:02 by ben]
ben
parents: 2367
diff changeset
781 i++;
7ee6ea4ff5c0 [xemacs-hg @ 2004-11-14 01:43:02 by ben]
ben
parents: 2367
diff changeset
782 }
2367
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 2286
diff changeset
783 }
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 2286
diff changeset
784 }
996
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
785 ldap_mods_ptrs[i] = NULL;
2367
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 2286
diff changeset
786 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
787 ldap_mods_ptrs);
996
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
788 if (rc != LDAP_SUCCESS)
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
789 signal_ldap_error (ld, NULL, rc);
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
790
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
791 UNGCPRO;
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
792 return Qnil;
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
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
796 DEFUN ("ldap-delete", Fldap_delete, 2, 2, 0, /*
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
797 Delete an entry to an LDAP directory.
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
798 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
799 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
800 */
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
801 (ldap, dn))
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
802 {
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
803 LDAP *ld;
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
804 int rc;
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
805
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
806 /* Check parameters */
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
807 CHECK_LIVE_LDAP (ldap);
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
808 ld = XLDAP (ldap)->ld;
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
809 CHECK_STRING (dn);
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
810
2367
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 2286
diff changeset
811 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
812 if (rc != LDAP_SUCCESS)
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
813 signal_ldap_error (ld, NULL, rc);
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
814
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
815 return Qnil;
428
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
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
818 void
996
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
819 syms_of_eldap (void)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
820 {
996
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
821 INIT_LRECORD_IMPLEMENTATION (ldap);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
822
996
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
823 DEFSYMBOL (Qeldap);
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
824 DEFSYMBOL (Qldapp);
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
825 DEFSYMBOL (Qport);
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
826 DEFSYMBOL (Qauth);
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
827 DEFSYMBOL (Qbinddn);
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
828 DEFSYMBOL (Qpasswd);
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
829 DEFSYMBOL (Qderef);
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
830 DEFSYMBOL (Qtimelimit);
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
831 DEFSYMBOL (Qsizelimit);
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
832 DEFSYMBOL (Qbase);
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
833 DEFSYMBOL (Qonelevel);
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
834 DEFSYMBOL (Qsubtree);
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
835 DEFSYMBOL (Qkrbv41);
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
836 DEFSYMBOL (Qkrbv42);
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
837 DEFSYMBOL (Qnever);
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
838 DEFSYMBOL (Qalways);
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
839 DEFSYMBOL (Qfind);
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
840 DEFSYMBOL (Qadd);
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
841 DEFSYMBOL (Qreplace);
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
842
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
843 DEFSUBR (Fldapp);
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
844 DEFSUBR (Fldap_host);
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
845 DEFSUBR (Fldap_live_p);
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
846 DEFSUBR (Fldap_open);
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
847 DEFSUBR (Fldap_close);
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
848 DEFSUBR (Fldap_search_basic);
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
849 DEFSUBR (Fldap_add);
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
850 DEFSUBR (Fldap_modify);
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
851 DEFSUBR (Fldap_delete);
428
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
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
854 void
996
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
855 vars_of_eldap (void)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
856 {
996
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
857
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
858 Fprovide (Qeldap);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
859
996
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
860 ldap_default_port = LDAP_PORT;
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
861 Vldap_default_base = Qnil;
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
862
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
863 DEFVAR_INT ("ldap-default-port", &ldap_default_port /*
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
864 Default TCP port for LDAP connections.
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
865 Initialized from the LDAP library. Default value is 389.
428
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
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
868 DEFVAR_LISP ("ldap-default-base", &Vldap_default_base /*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
869 Default base for LDAP searches.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
870 This is a string using the syntax of RFC 1779.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
871 For instance, "o=ACME, c=US" limits the search to the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
872 Acme organization in the United States.
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 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
876
996
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
877 #ifdef HAVE_SHLIB
1706
9fc738581a9d [xemacs-hg @ 2003-09-22 03:21:12 by james]
james
parents: 1632
diff changeset
878 EXTERN_C void unload_eldap (void);
996
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
879 void
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
880 unload_eldap (void)
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
881 {
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
882 /* Remove defined types */
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
883 UNDEF_LRECORD_IMPLEMENTATION (ldap);
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
884
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
885 /* Remove staticpro'ing of symbols */
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
886 unstaticpro_nodump (&Qeldap);
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
887 unstaticpro_nodump (&Qldapp);
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
888 unstaticpro_nodump (&Qport);
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
889 unstaticpro_nodump (&Qauth);
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
890 unstaticpro_nodump (&Qbinddn);
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
891 unstaticpro_nodump (&Qpasswd);
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
892 unstaticpro_nodump (&Qderef);
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
893 unstaticpro_nodump (&Qtimelimit);
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
894 unstaticpro_nodump (&Qsizelimit);
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
895 unstaticpro_nodump (&Qbase);
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
896 unstaticpro_nodump (&Qonelevel);
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
897 unstaticpro_nodump (&Qsubtree);
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
898 unstaticpro_nodump (&Qkrbv41);
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
899 unstaticpro_nodump (&Qkrbv42);
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
900 unstaticpro_nodump (&Qnever);
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
901 unstaticpro_nodump (&Qalways);
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
902 unstaticpro_nodump (&Qfind);
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
903 unstaticpro_nodump (&Qadd);
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
904 unstaticpro_nodump (&Qreplace);
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
905 }
25e260cb7994 [xemacs-hg @ 2002-09-10 15:27:02 by james]
james
parents: 428
diff changeset
906 #endif /* HAVE_SHLIB */