1*00b67f09SDavid van Moolenbroek /* $NetBSD: zone2ldap.c,v 1.4 2014/12/10 04:37:57 christos Exp $ */
2*00b67f09SDavid van Moolenbroek
3*00b67f09SDavid van Moolenbroek /*
4*00b67f09SDavid van Moolenbroek * Copyright (C) 2001 Jeff McNeil <jeff@snapcase.g-rock.net>
5*00b67f09SDavid van Moolenbroek *
6*00b67f09SDavid van Moolenbroek * Permission to use, copy, modify, and distribute this software for any
7*00b67f09SDavid van Moolenbroek * purpose with or without fee is hereby granted, provided that the above
8*00b67f09SDavid van Moolenbroek * copyright notice and this permission notice appear in all copies.
9*00b67f09SDavid van Moolenbroek *
10*00b67f09SDavid van Moolenbroek * Change Log
11*00b67f09SDavid van Moolenbroek *
12*00b67f09SDavid van Moolenbroek * Tue May 1 19:19:54 EDT 2001 - Jeff McNeil
13*00b67f09SDavid van Moolenbroek * Update to objectClass code, and add_to_rr_list function
14*00b67f09SDavid van Moolenbroek * (I need to rename that) to support the dNSZone schema,
15*00b67f09SDavid van Moolenbroek * ditched dNSDomain2 schema support. Version 0.3-ALPHA
16*00b67f09SDavid van Moolenbroek */
17*00b67f09SDavid van Moolenbroek
18*00b67f09SDavid van Moolenbroek #include <errno.h>
19*00b67f09SDavid van Moolenbroek #include <string.h>
20*00b67f09SDavid van Moolenbroek #include <stdlib.h>
21*00b67f09SDavid van Moolenbroek #include <unistd.h>
22*00b67f09SDavid van Moolenbroek #include <getopt.h>
23*00b67f09SDavid van Moolenbroek
24*00b67f09SDavid van Moolenbroek #include <isc/buffer.h>
25*00b67f09SDavid van Moolenbroek #include <isc/entropy.h>
26*00b67f09SDavid van Moolenbroek #include <isc/hash.h>
27*00b67f09SDavid van Moolenbroek #include <isc/mem.h>
28*00b67f09SDavid van Moolenbroek #include <isc/print.h>
29*00b67f09SDavid van Moolenbroek #include <isc/result.h>
30*00b67f09SDavid van Moolenbroek
31*00b67f09SDavid van Moolenbroek #include <dns/db.h>
32*00b67f09SDavid van Moolenbroek #include <dns/dbiterator.h>
33*00b67f09SDavid van Moolenbroek #include <dns/fixedname.h>
34*00b67f09SDavid van Moolenbroek #include <dns/name.h>
35*00b67f09SDavid van Moolenbroek #include <dns/rdata.h>
36*00b67f09SDavid van Moolenbroek #include <dns/rdataset.h>
37*00b67f09SDavid van Moolenbroek #include <dns/rdatasetiter.h>
38*00b67f09SDavid van Moolenbroek #include <dns/result.h>
39*00b67f09SDavid van Moolenbroek #include <dns/rdatatype.h>
40*00b67f09SDavid van Moolenbroek
41*00b67f09SDavid van Moolenbroek #include <ldap.h>
42*00b67f09SDavid van Moolenbroek
43*00b67f09SDavid van Moolenbroek #define DNS_OBJECT 6
44*00b67f09SDavid van Moolenbroek #define DNS_TOP 2
45*00b67f09SDavid van Moolenbroek
46*00b67f09SDavid van Moolenbroek #define VERSION "0.4-ALPHA"
47*00b67f09SDavid van Moolenbroek
48*00b67f09SDavid van Moolenbroek #define NO_SPEC 0
49*00b67f09SDavid van Moolenbroek #define WI_SPEC 1
50*00b67f09SDavid van Moolenbroek
51*00b67f09SDavid van Moolenbroek /* Global Zone Pointer */
52*00b67f09SDavid van Moolenbroek char *gbl_zone = NULL;
53*00b67f09SDavid van Moolenbroek
54*00b67f09SDavid van Moolenbroek typedef struct LDAP_INFO
55*00b67f09SDavid van Moolenbroek {
56*00b67f09SDavid van Moolenbroek char *dn;
57*00b67f09SDavid van Moolenbroek LDAPMod **attrs;
58*00b67f09SDavid van Moolenbroek struct LDAP_INFO *next;
59*00b67f09SDavid van Moolenbroek int attrcnt;
60*00b67f09SDavid van Moolenbroek }
61*00b67f09SDavid van Moolenbroek ldap_info;
62*00b67f09SDavid van Moolenbroek
63*00b67f09SDavid van Moolenbroek /* usage Info */
64*00b67f09SDavid van Moolenbroek void usage ();
65*00b67f09SDavid van Moolenbroek
66*00b67f09SDavid van Moolenbroek /* Add to the ldap dit */
67*00b67f09SDavid van Moolenbroek void add_ldap_values (ldap_info * ldinfo);
68*00b67f09SDavid van Moolenbroek
69*00b67f09SDavid van Moolenbroek /* Init an ldap connection */
70*00b67f09SDavid van Moolenbroek void init_ldap_conn ();
71*00b67f09SDavid van Moolenbroek
72*00b67f09SDavid van Moolenbroek /* Ldap error checking */
73*00b67f09SDavid van Moolenbroek void ldap_result_check (char *msg, char *dn, int err);
74*00b67f09SDavid van Moolenbroek
75*00b67f09SDavid van Moolenbroek /* Put a hostname into a char ** array */
76*00b67f09SDavid van Moolenbroek char **hostname_to_dn_list (char *hostname, char *zone, unsigned int flags);
77*00b67f09SDavid van Moolenbroek
78*00b67f09SDavid van Moolenbroek /* Find out how many items are in a char ** array */
79*00b67f09SDavid van Moolenbroek int get_attr_list_size (char **tmp);
80*00b67f09SDavid van Moolenbroek
81*00b67f09SDavid van Moolenbroek /* Get a DN */
82*00b67f09SDavid van Moolenbroek char *build_dn_from_dc_list (char **dc_list, unsigned int ttl, int flag);
83*00b67f09SDavid van Moolenbroek
84*00b67f09SDavid van Moolenbroek /* Add to RR list */
85*00b67f09SDavid van Moolenbroek void add_to_rr_list (char *dn, char *name, char *type, char *data,
86*00b67f09SDavid van Moolenbroek unsigned int ttl, unsigned int flags);
87*00b67f09SDavid van Moolenbroek
88*00b67f09SDavid van Moolenbroek /* Error checking */
89*00b67f09SDavid van Moolenbroek void isc_result_check (isc_result_t res, char *errorstr);
90*00b67f09SDavid van Moolenbroek
91*00b67f09SDavid van Moolenbroek /* Generate LDIF Format files */
92*00b67f09SDavid van Moolenbroek void generate_ldap (dns_name_t * dnsname, dns_rdata_t * rdata,
93*00b67f09SDavid van Moolenbroek unsigned int ttl);
94*00b67f09SDavid van Moolenbroek
95*00b67f09SDavid van Moolenbroek /* head pointer to the list */
96*00b67f09SDavid van Moolenbroek ldap_info *ldap_info_base = NULL;
97*00b67f09SDavid van Moolenbroek
98*00b67f09SDavid van Moolenbroek char *argzone, *ldapbase, *binddn, *bindpw = NULL;
99*00b67f09SDavid van Moolenbroek char *ldapsystem = "localhost";
100*00b67f09SDavid van Moolenbroek static char *objectClasses[] =
101*00b67f09SDavid van Moolenbroek { "top", "dNSZone", NULL };
102*00b67f09SDavid van Moolenbroek static char *topObjectClasses[] = { "top", NULL };
103*00b67f09SDavid van Moolenbroek LDAP *conn;
104*00b67f09SDavid van Moolenbroek unsigned int debug = 0;
105*00b67f09SDavid van Moolenbroek
106*00b67f09SDavid van Moolenbroek #ifdef DEBUG
107*00b67f09SDavid van Moolenbroek debug = 1;
108*00b67f09SDavid van Moolenbroek #endif
109*00b67f09SDavid van Moolenbroek
110*00b67f09SDavid van Moolenbroek int
main(int * argc,char ** argv)111*00b67f09SDavid van Moolenbroek main (int *argc, char **argv)
112*00b67f09SDavid van Moolenbroek {
113*00b67f09SDavid van Moolenbroek isc_mem_t *mctx = NULL;
114*00b67f09SDavid van Moolenbroek isc_entropy_t *ectx = NULL;
115*00b67f09SDavid van Moolenbroek isc_result_t result;
116*00b67f09SDavid van Moolenbroek char *basedn;
117*00b67f09SDavid van Moolenbroek ldap_info *tmp;
118*00b67f09SDavid van Moolenbroek LDAPMod *base_attrs[2];
119*00b67f09SDavid van Moolenbroek LDAPMod base;
120*00b67f09SDavid van Moolenbroek isc_buffer_t buff;
121*00b67f09SDavid van Moolenbroek char *zonefile;
122*00b67f09SDavid van Moolenbroek char fullbasedn[1024];
123*00b67f09SDavid van Moolenbroek char *ctmp;
124*00b67f09SDavid van Moolenbroek dns_fixedname_t fixedzone, fixedname;
125*00b67f09SDavid van Moolenbroek dns_rdataset_t rdataset;
126*00b67f09SDavid van Moolenbroek char **dc_list;
127*00b67f09SDavid van Moolenbroek dns_rdata_t rdata = DNS_RDATA_INIT;
128*00b67f09SDavid van Moolenbroek dns_rdatasetiter_t *riter;
129*00b67f09SDavid van Moolenbroek dns_name_t *zone, *name;
130*00b67f09SDavid van Moolenbroek dns_db_t *db = NULL;
131*00b67f09SDavid van Moolenbroek dns_dbiterator_t *dbit = NULL;
132*00b67f09SDavid van Moolenbroek dns_dbnode_t *node;
133*00b67f09SDavid van Moolenbroek extern char *optarg;
134*00b67f09SDavid van Moolenbroek extern int optind, opterr, optopt;
135*00b67f09SDavid van Moolenbroek int create_base = 0;
136*00b67f09SDavid van Moolenbroek int topt;
137*00b67f09SDavid van Moolenbroek
138*00b67f09SDavid van Moolenbroek if ((int) argc < 2)
139*00b67f09SDavid van Moolenbroek {
140*00b67f09SDavid van Moolenbroek usage ();
141*00b67f09SDavid van Moolenbroek exit (-1);
142*00b67f09SDavid van Moolenbroek }
143*00b67f09SDavid van Moolenbroek
144*00b67f09SDavid van Moolenbroek while ((topt = getopt ((int) argc, argv, "D:w:b:z:f:h:?dcv")) != -1)
145*00b67f09SDavid van Moolenbroek {
146*00b67f09SDavid van Moolenbroek switch (topt)
147*00b67f09SDavid van Moolenbroek {
148*00b67f09SDavid van Moolenbroek case 'v':
149*00b67f09SDavid van Moolenbroek printf("%s\n", VERSION);
150*00b67f09SDavid van Moolenbroek exit(0);
151*00b67f09SDavid van Moolenbroek case 'c':
152*00b67f09SDavid van Moolenbroek create_base++;
153*00b67f09SDavid van Moolenbroek break;
154*00b67f09SDavid van Moolenbroek case 'd':
155*00b67f09SDavid van Moolenbroek debug++;
156*00b67f09SDavid van Moolenbroek break;
157*00b67f09SDavid van Moolenbroek case 'D':
158*00b67f09SDavid van Moolenbroek binddn = strdup (optarg);
159*00b67f09SDavid van Moolenbroek break;
160*00b67f09SDavid van Moolenbroek case 'w':
161*00b67f09SDavid van Moolenbroek bindpw = strdup (optarg);
162*00b67f09SDavid van Moolenbroek break;
163*00b67f09SDavid van Moolenbroek case 'b':
164*00b67f09SDavid van Moolenbroek ldapbase = strdup (optarg);
165*00b67f09SDavid van Moolenbroek break;
166*00b67f09SDavid van Moolenbroek case 'z':
167*00b67f09SDavid van Moolenbroek argzone = strdup (optarg);
168*00b67f09SDavid van Moolenbroek // We wipe argzone all to hell when we parse it for the DN */
169*00b67f09SDavid van Moolenbroek gbl_zone = strdup(argzone);
170*00b67f09SDavid van Moolenbroek break;
171*00b67f09SDavid van Moolenbroek case 'f':
172*00b67f09SDavid van Moolenbroek zonefile = strdup (optarg);
173*00b67f09SDavid van Moolenbroek break;
174*00b67f09SDavid van Moolenbroek case 'h':
175*00b67f09SDavid van Moolenbroek ldapsystem = strdup (optarg);
176*00b67f09SDavid van Moolenbroek break;
177*00b67f09SDavid van Moolenbroek case '?':
178*00b67f09SDavid van Moolenbroek default:
179*00b67f09SDavid van Moolenbroek usage ();
180*00b67f09SDavid van Moolenbroek exit (0);
181*00b67f09SDavid van Moolenbroek }
182*00b67f09SDavid van Moolenbroek }
183*00b67f09SDavid van Moolenbroek
184*00b67f09SDavid van Moolenbroek if ((argzone == NULL) || (zonefile == NULL))
185*00b67f09SDavid van Moolenbroek {
186*00b67f09SDavid van Moolenbroek usage ();
187*00b67f09SDavid van Moolenbroek exit (-1);
188*00b67f09SDavid van Moolenbroek }
189*00b67f09SDavid van Moolenbroek
190*00b67f09SDavid van Moolenbroek if (debug)
191*00b67f09SDavid van Moolenbroek printf ("Initializing ISC Routines, parsing zone file\n");
192*00b67f09SDavid van Moolenbroek
193*00b67f09SDavid van Moolenbroek result = isc_mem_create (0, 0, &mctx);
194*00b67f09SDavid van Moolenbroek isc_result_check (result, "isc_mem_create");
195*00b67f09SDavid van Moolenbroek
196*00b67f09SDavid van Moolenbroek result = isc_entropy_create(mctx, &ectx);
197*00b67f09SDavid van Moolenbroek isc_result_check (result, "isc_entropy_create");
198*00b67f09SDavid van Moolenbroek
199*00b67f09SDavid van Moolenbroek result = isc_hash_create(mctx, ectx, DNS_NAME_MAXWIRE);
200*00b67f09SDavid van Moolenbroek isc_result_check (result, "isc_hash_create");
201*00b67f09SDavid van Moolenbroek
202*00b67f09SDavid van Moolenbroek isc_buffer_init (&buff, argzone, strlen (argzone));
203*00b67f09SDavid van Moolenbroek isc_buffer_add (&buff, strlen (argzone));
204*00b67f09SDavid van Moolenbroek dns_fixedname_init (&fixedzone);
205*00b67f09SDavid van Moolenbroek zone = dns_fixedname_name (&fixedzone);
206*00b67f09SDavid van Moolenbroek result = dns_name_fromtext (zone, &buff, dns_rootname, 0, NULL);
207*00b67f09SDavid van Moolenbroek isc_result_check (result, "dns_name_fromtext");
208*00b67f09SDavid van Moolenbroek
209*00b67f09SDavid van Moolenbroek result = dns_db_create (mctx, "rbt", zone, dns_dbtype_zone,
210*00b67f09SDavid van Moolenbroek dns_rdataclass_in, 0, NULL, &db);
211*00b67f09SDavid van Moolenbroek isc_result_check (result, "dns_db_create");
212*00b67f09SDavid van Moolenbroek
213*00b67f09SDavid van Moolenbroek result = dns_db_load (db, zonefile);
214*00b67f09SDavid van Moolenbroek isc_result_check (result, "Check Zone Syntax: dns_db_load");
215*00b67f09SDavid van Moolenbroek
216*00b67f09SDavid van Moolenbroek result = dns_db_createiterator (db, 0, &dbit);
217*00b67f09SDavid van Moolenbroek isc_result_check (result, "dns_db_createiterator");
218*00b67f09SDavid van Moolenbroek
219*00b67f09SDavid van Moolenbroek result = dns_dbiterator_first (dbit);
220*00b67f09SDavid van Moolenbroek isc_result_check (result, "dns_dbiterator_first");
221*00b67f09SDavid van Moolenbroek
222*00b67f09SDavid van Moolenbroek dns_fixedname_init (&fixedname);
223*00b67f09SDavid van Moolenbroek name = dns_fixedname_name (&fixedname);
224*00b67f09SDavid van Moolenbroek dns_rdataset_init (&rdataset);
225*00b67f09SDavid van Moolenbroek dns_rdata_init (&rdata);
226*00b67f09SDavid van Moolenbroek
227*00b67f09SDavid van Moolenbroek while (result == ISC_R_SUCCESS)
228*00b67f09SDavid van Moolenbroek {
229*00b67f09SDavid van Moolenbroek node = NULL;
230*00b67f09SDavid van Moolenbroek result = dns_dbiterator_current (dbit, &node, name);
231*00b67f09SDavid van Moolenbroek
232*00b67f09SDavid van Moolenbroek if (result == ISC_R_NOMORE)
233*00b67f09SDavid van Moolenbroek break;
234*00b67f09SDavid van Moolenbroek
235*00b67f09SDavid van Moolenbroek isc_result_check (result, "dns_dbiterator_current");
236*00b67f09SDavid van Moolenbroek
237*00b67f09SDavid van Moolenbroek riter = NULL;
238*00b67f09SDavid van Moolenbroek result = dns_db_allrdatasets (db, node, NULL, 0, &riter);
239*00b67f09SDavid van Moolenbroek isc_result_check (result, "dns_db_allrdatasets");
240*00b67f09SDavid van Moolenbroek
241*00b67f09SDavid van Moolenbroek result = dns_rdatasetiter_first (riter);
242*00b67f09SDavid van Moolenbroek //isc_result_check(result, "dns_rdatasetiter_first");
243*00b67f09SDavid van Moolenbroek
244*00b67f09SDavid van Moolenbroek while (result == ISC_R_SUCCESS)
245*00b67f09SDavid van Moolenbroek {
246*00b67f09SDavid van Moolenbroek dns_rdatasetiter_current (riter, &rdataset);
247*00b67f09SDavid van Moolenbroek result = dns_rdataset_first (&rdataset);
248*00b67f09SDavid van Moolenbroek isc_result_check (result, "dns_rdatasetiter_current");
249*00b67f09SDavid van Moolenbroek
250*00b67f09SDavid van Moolenbroek while (result == ISC_R_SUCCESS)
251*00b67f09SDavid van Moolenbroek {
252*00b67f09SDavid van Moolenbroek dns_rdataset_current (&rdataset, &rdata);
253*00b67f09SDavid van Moolenbroek generate_ldap (name, &rdata, rdataset.ttl);
254*00b67f09SDavid van Moolenbroek dns_rdata_reset (&rdata);
255*00b67f09SDavid van Moolenbroek result = dns_rdataset_next (&rdataset);
256*00b67f09SDavid van Moolenbroek }
257*00b67f09SDavid van Moolenbroek dns_rdataset_disassociate (&rdataset);
258*00b67f09SDavid van Moolenbroek result = dns_rdatasetiter_next (riter);
259*00b67f09SDavid van Moolenbroek
260*00b67f09SDavid van Moolenbroek }
261*00b67f09SDavid van Moolenbroek dns_rdatasetiter_destroy (&riter);
262*00b67f09SDavid van Moolenbroek result = dns_dbiterator_next (dbit);
263*00b67f09SDavid van Moolenbroek
264*00b67f09SDavid van Moolenbroek }
265*00b67f09SDavid van Moolenbroek
266*00b67f09SDavid van Moolenbroek /* Initialize the LDAP Connection */
267*00b67f09SDavid van Moolenbroek if (debug)
268*00b67f09SDavid van Moolenbroek printf ("Initializing LDAP Connection to %s as %s\n", ldapsystem, binddn);
269*00b67f09SDavid van Moolenbroek
270*00b67f09SDavid van Moolenbroek init_ldap_conn ();
271*00b67f09SDavid van Moolenbroek
272*00b67f09SDavid van Moolenbroek if (create_base)
273*00b67f09SDavid van Moolenbroek {
274*00b67f09SDavid van Moolenbroek if (debug)
275*00b67f09SDavid van Moolenbroek printf ("Creating base zone DN %s\n", argzone);
276*00b67f09SDavid van Moolenbroek
277*00b67f09SDavid van Moolenbroek dc_list = hostname_to_dn_list (argzone, argzone, DNS_TOP);
278*00b67f09SDavid van Moolenbroek basedn = build_dn_from_dc_list (dc_list, 0, NO_SPEC);
279*00b67f09SDavid van Moolenbroek
280*00b67f09SDavid van Moolenbroek for (ctmp = &basedn[strlen (basedn)]; ctmp >= &basedn[0]; ctmp--)
281*00b67f09SDavid van Moolenbroek {
282*00b67f09SDavid van Moolenbroek if ((*ctmp == ',') || (ctmp == &basedn[0]))
283*00b67f09SDavid van Moolenbroek {
284*00b67f09SDavid van Moolenbroek base.mod_op = LDAP_MOD_ADD;
285*00b67f09SDavid van Moolenbroek base.mod_type = "objectClass";
286*00b67f09SDavid van Moolenbroek base.mod_values = topObjectClasses;
287*00b67f09SDavid van Moolenbroek base_attrs[0] = &base;
288*00b67f09SDavid van Moolenbroek base_attrs[1] = NULL;
289*00b67f09SDavid van Moolenbroek
290*00b67f09SDavid van Moolenbroek if (ldapbase)
291*00b67f09SDavid van Moolenbroek {
292*00b67f09SDavid van Moolenbroek if (ctmp != &basedn[0])
293*00b67f09SDavid van Moolenbroek sprintf (fullbasedn, "%s,%s", ctmp + 1, ldapbase);
294*00b67f09SDavid van Moolenbroek else
295*00b67f09SDavid van Moolenbroek sprintf (fullbasedn, "%s,%s", ctmp, ldapbase);
296*00b67f09SDavid van Moolenbroek
297*00b67f09SDavid van Moolenbroek }
298*00b67f09SDavid van Moolenbroek else
299*00b67f09SDavid van Moolenbroek {
300*00b67f09SDavid van Moolenbroek if (ctmp != &basedn[0])
301*00b67f09SDavid van Moolenbroek sprintf (fullbasedn, "%s", ctmp + 1);
302*00b67f09SDavid van Moolenbroek else
303*00b67f09SDavid van Moolenbroek sprintf (fullbasedn, "%s", ctmp);
304*00b67f09SDavid van Moolenbroek }
305*00b67f09SDavid van Moolenbroek result = ldap_add_s (conn, fullbasedn, base_attrs);
306*00b67f09SDavid van Moolenbroek ldap_result_check ("intial ldap_add_s", fullbasedn, result);
307*00b67f09SDavid van Moolenbroek }
308*00b67f09SDavid van Moolenbroek
309*00b67f09SDavid van Moolenbroek }
310*00b67f09SDavid van Moolenbroek }
311*00b67f09SDavid van Moolenbroek else
312*00b67f09SDavid van Moolenbroek {
313*00b67f09SDavid van Moolenbroek if (debug)
314*00b67f09SDavid van Moolenbroek printf ("Skipping zone base dn creation for %s\n", argzone);
315*00b67f09SDavid van Moolenbroek }
316*00b67f09SDavid van Moolenbroek
317*00b67f09SDavid van Moolenbroek for (tmp = ldap_info_base; tmp != NULL; tmp = tmp->next)
318*00b67f09SDavid van Moolenbroek {
319*00b67f09SDavid van Moolenbroek
320*00b67f09SDavid van Moolenbroek if (debug)
321*00b67f09SDavid van Moolenbroek printf ("Adding DN: %s\n", tmp->dn);
322*00b67f09SDavid van Moolenbroek
323*00b67f09SDavid van Moolenbroek add_ldap_values (tmp);
324*00b67f09SDavid van Moolenbroek }
325*00b67f09SDavid van Moolenbroek
326*00b67f09SDavid van Moolenbroek if (debug)
327*00b67f09SDavid van Moolenbroek printf("Operation Complete.\n");
328*00b67f09SDavid van Moolenbroek
329*00b67f09SDavid van Moolenbroek /* Cleanup */
330*00b67f09SDavid van Moolenbroek isc_hash_destroy();
331*00b67f09SDavid van Moolenbroek isc_entropy_detach(&ectx);
332*00b67f09SDavid van Moolenbroek isc_mem_destroy(&mctx);
333*00b67f09SDavid van Moolenbroek if (zonefile)
334*00b67f09SDavid van Moolenbroek free(zonefile);
335*00b67f09SDavid van Moolenbroek
336*00b67f09SDavid van Moolenbroek return 0;
337*00b67f09SDavid van Moolenbroek }
338*00b67f09SDavid van Moolenbroek
339*00b67f09SDavid van Moolenbroek
340*00b67f09SDavid van Moolenbroek /* Check the status of an isc_result_t after any isc routines.
341*00b67f09SDavid van Moolenbroek * I should probably rename this function, as not to cause any
342*00b67f09SDavid van Moolenbroek * confusion with the isc* routines. Will exit on error. */
343*00b67f09SDavid van Moolenbroek void
isc_result_check(isc_result_t res,char * errorstr)344*00b67f09SDavid van Moolenbroek isc_result_check (isc_result_t res, char *errorstr)
345*00b67f09SDavid van Moolenbroek {
346*00b67f09SDavid van Moolenbroek if (res != ISC_R_SUCCESS)
347*00b67f09SDavid van Moolenbroek {
348*00b67f09SDavid van Moolenbroek fprintf (stderr, " %s: %s\n", errorstr, isc_result_totext (res));
349*00b67f09SDavid van Moolenbroek exit (-1);
350*00b67f09SDavid van Moolenbroek }
351*00b67f09SDavid van Moolenbroek }
352*00b67f09SDavid van Moolenbroek
353*00b67f09SDavid van Moolenbroek
354*00b67f09SDavid van Moolenbroek /* Takes DNS information, in bind data structure format, and adds textual
355*00b67f09SDavid van Moolenbroek * zone information to the LDAP run queue. */
356*00b67f09SDavid van Moolenbroek void
generate_ldap(dns_name_t * dnsname,dns_rdata_t * rdata,unsigned int ttl)357*00b67f09SDavid van Moolenbroek generate_ldap (dns_name_t * dnsname, dns_rdata_t * rdata, unsigned int ttl)
358*00b67f09SDavid van Moolenbroek {
359*00b67f09SDavid van Moolenbroek unsigned char name[DNS_NAME_MAXTEXT + 1];
360*00b67f09SDavid van Moolenbroek unsigned int len;
361*00b67f09SDavid van Moolenbroek unsigned char type[20];
362*00b67f09SDavid van Moolenbroek unsigned char data[2048];
363*00b67f09SDavid van Moolenbroek char **dc_list;
364*00b67f09SDavid van Moolenbroek char *dn;
365*00b67f09SDavid van Moolenbroek
366*00b67f09SDavid van Moolenbroek isc_buffer_t buff;
367*00b67f09SDavid van Moolenbroek isc_result_t result;
368*00b67f09SDavid van Moolenbroek
369*00b67f09SDavid van Moolenbroek isc_buffer_init (&buff, name, sizeof (name));
370*00b67f09SDavid van Moolenbroek result = dns_name_totext (dnsname, ISC_TRUE, &buff);
371*00b67f09SDavid van Moolenbroek isc_result_check (result, "dns_name_totext");
372*00b67f09SDavid van Moolenbroek name[isc_buffer_usedlength (&buff)] = 0;
373*00b67f09SDavid van Moolenbroek
374*00b67f09SDavid van Moolenbroek isc_buffer_init (&buff, type, sizeof (type));
375*00b67f09SDavid van Moolenbroek result = dns_rdatatype_totext (rdata->type, &buff);
376*00b67f09SDavid van Moolenbroek isc_result_check (result, "dns_rdatatype_totext");
377*00b67f09SDavid van Moolenbroek type[isc_buffer_usedlength (&buff)] = 0;
378*00b67f09SDavid van Moolenbroek
379*00b67f09SDavid van Moolenbroek isc_buffer_init (&buff, data, sizeof (data));
380*00b67f09SDavid van Moolenbroek result = dns_rdata_totext (rdata, NULL, &buff);
381*00b67f09SDavid van Moolenbroek isc_result_check (result, "dns_rdata_totext");
382*00b67f09SDavid van Moolenbroek data[isc_buffer_usedlength (&buff)] = 0;
383*00b67f09SDavid van Moolenbroek
384*00b67f09SDavid van Moolenbroek dc_list = hostname_to_dn_list (name, argzone, DNS_OBJECT);
385*00b67f09SDavid van Moolenbroek len = (get_attr_list_size (dc_list) - 2);
386*00b67f09SDavid van Moolenbroek dn = build_dn_from_dc_list (dc_list, ttl, WI_SPEC);
387*00b67f09SDavid van Moolenbroek
388*00b67f09SDavid van Moolenbroek if (debug)
389*00b67f09SDavid van Moolenbroek printf ("Adding %s (%s %s) to run queue list.\n", dn, type, data);
390*00b67f09SDavid van Moolenbroek
391*00b67f09SDavid van Moolenbroek add_to_rr_list (dn, dc_list[len], type, data, ttl, DNS_OBJECT);
392*00b67f09SDavid van Moolenbroek }
393*00b67f09SDavid van Moolenbroek
394*00b67f09SDavid van Moolenbroek
395*00b67f09SDavid van Moolenbroek /* Locate an item in the Run queue linked list, by DN. Used by functions
396*00b67f09SDavid van Moolenbroek * which add items to the run queue.
397*00b67f09SDavid van Moolenbroek */
398*00b67f09SDavid van Moolenbroek ldap_info *
locate_by_dn(char * dn)399*00b67f09SDavid van Moolenbroek locate_by_dn (char *dn)
400*00b67f09SDavid van Moolenbroek {
401*00b67f09SDavid van Moolenbroek ldap_info *tmp;
402*00b67f09SDavid van Moolenbroek for (tmp = ldap_info_base; tmp != (ldap_info *) NULL; tmp = tmp->next)
403*00b67f09SDavid van Moolenbroek {
404*00b67f09SDavid van Moolenbroek if (!strncmp (tmp->dn, dn, strlen (dn)))
405*00b67f09SDavid van Moolenbroek return tmp;
406*00b67f09SDavid van Moolenbroek }
407*00b67f09SDavid van Moolenbroek return (ldap_info *) NULL;
408*00b67f09SDavid van Moolenbroek }
409*00b67f09SDavid van Moolenbroek
410*00b67f09SDavid van Moolenbroek
411*00b67f09SDavid van Moolenbroek
412*00b67f09SDavid van Moolenbroek /* Take textual zone data, and add to the LDAP Run queue. This works like so:
413*00b67f09SDavid van Moolenbroek * If locate_by_dn does not return, alloc a new ldap_info structure, and then
414*00b67f09SDavid van Moolenbroek * calloc a LDAPMod array, fill in the default "everyone needs this" information,
415*00b67f09SDavid van Moolenbroek * including object classes and dc's. If it locate_by_dn does return, then we'll
416*00b67f09SDavid van Moolenbroek * realloc for more LDAPMod structs, and appened the new data. If an LDAPMod exists
417*00b67f09SDavid van Moolenbroek * for the parameter we're adding, then we'll realloc the mod_values array, and
418*00b67f09SDavid van Moolenbroek * add the new value to the existing LDAPMod. Finnaly, it assures linkage exists
419*00b67f09SDavid van Moolenbroek * within the Run queue linked ilst*/
420*00b67f09SDavid van Moolenbroek
421*00b67f09SDavid van Moolenbroek void
add_to_rr_list(char * dn,char * name,char * type,char * data,unsigned int ttl,unsigned int flags)422*00b67f09SDavid van Moolenbroek add_to_rr_list (char *dn, char *name, char *type,
423*00b67f09SDavid van Moolenbroek char *data, unsigned int ttl, unsigned int flags)
424*00b67f09SDavid van Moolenbroek {
425*00b67f09SDavid van Moolenbroek int i;
426*00b67f09SDavid van Moolenbroek int x;
427*00b67f09SDavid van Moolenbroek ldap_info *tmp;
428*00b67f09SDavid van Moolenbroek int attrlist;
429*00b67f09SDavid van Moolenbroek char ldap_type_buffer[128];
430*00b67f09SDavid van Moolenbroek char charttl[64];
431*00b67f09SDavid van Moolenbroek
432*00b67f09SDavid van Moolenbroek
433*00b67f09SDavid van Moolenbroek if ((tmp = locate_by_dn (dn)) == NULL)
434*00b67f09SDavid van Moolenbroek {
435*00b67f09SDavid van Moolenbroek
436*00b67f09SDavid van Moolenbroek /* There wasn't one already there, so we need to allocate a new one,
437*00b67f09SDavid van Moolenbroek * and stick it on the list */
438*00b67f09SDavid van Moolenbroek
439*00b67f09SDavid van Moolenbroek tmp = (ldap_info *) malloc (sizeof (ldap_info));
440*00b67f09SDavid van Moolenbroek if (tmp == (ldap_info *) NULL)
441*00b67f09SDavid van Moolenbroek {
442*00b67f09SDavid van Moolenbroek fprintf (stderr, "malloc: %s\n", strerror (errno));
443*00b67f09SDavid van Moolenbroek ldap_unbind_s (conn);
444*00b67f09SDavid van Moolenbroek exit (-1);
445*00b67f09SDavid van Moolenbroek }
446*00b67f09SDavid van Moolenbroek
447*00b67f09SDavid van Moolenbroek tmp->dn = strdup (dn);
448*00b67f09SDavid van Moolenbroek tmp->attrs = (LDAPMod **) calloc (sizeof (LDAPMod *), flags);
449*00b67f09SDavid van Moolenbroek if (tmp->attrs == (LDAPMod **) NULL)
450*00b67f09SDavid van Moolenbroek {
451*00b67f09SDavid van Moolenbroek fprintf (stderr, "calloc: %s\n", strerror (errno));
452*00b67f09SDavid van Moolenbroek ldap_unbind_s (conn);
453*00b67f09SDavid van Moolenbroek exit (-1);
454*00b67f09SDavid van Moolenbroek }
455*00b67f09SDavid van Moolenbroek
456*00b67f09SDavid van Moolenbroek for (i = 0; i < flags; i++)
457*00b67f09SDavid van Moolenbroek {
458*00b67f09SDavid van Moolenbroek tmp->attrs[i] = (LDAPMod *) malloc (sizeof (LDAPMod));
459*00b67f09SDavid van Moolenbroek if (tmp->attrs[i] == (LDAPMod *) NULL)
460*00b67f09SDavid van Moolenbroek {
461*00b67f09SDavid van Moolenbroek fprintf (stderr, "malloc: %s\n", strerror (errno));
462*00b67f09SDavid van Moolenbroek exit (-1);
463*00b67f09SDavid van Moolenbroek }
464*00b67f09SDavid van Moolenbroek }
465*00b67f09SDavid van Moolenbroek tmp->attrs[0]->mod_op = LDAP_MOD_ADD;
466*00b67f09SDavid van Moolenbroek tmp->attrs[0]->mod_type = "objectClass";
467*00b67f09SDavid van Moolenbroek
468*00b67f09SDavid van Moolenbroek if (flags == DNS_OBJECT)
469*00b67f09SDavid van Moolenbroek tmp->attrs[0]->mod_values = objectClasses;
470*00b67f09SDavid van Moolenbroek else
471*00b67f09SDavid van Moolenbroek {
472*00b67f09SDavid van Moolenbroek tmp->attrs[0]->mod_values = topObjectClasses;
473*00b67f09SDavid van Moolenbroek tmp->attrs[1] = NULL;
474*00b67f09SDavid van Moolenbroek tmp->attrcnt = 2;
475*00b67f09SDavid van Moolenbroek tmp->next = ldap_info_base;
476*00b67f09SDavid van Moolenbroek ldap_info_base = tmp;
477*00b67f09SDavid van Moolenbroek return;
478*00b67f09SDavid van Moolenbroek }
479*00b67f09SDavid van Moolenbroek
480*00b67f09SDavid van Moolenbroek tmp->attrs[1]->mod_op = LDAP_MOD_ADD;
481*00b67f09SDavid van Moolenbroek tmp->attrs[1]->mod_type = "relativeDomainName";
482*00b67f09SDavid van Moolenbroek tmp->attrs[1]->mod_values = (char **) calloc (sizeof (char *), 2);
483*00b67f09SDavid van Moolenbroek
484*00b67f09SDavid van Moolenbroek if (tmp->attrs[1]->mod_values == (char **)NULL)
485*00b67f09SDavid van Moolenbroek exit(-1);
486*00b67f09SDavid van Moolenbroek
487*00b67f09SDavid van Moolenbroek tmp->attrs[1]->mod_values[0] = strdup (name);
488*00b67f09SDavid van Moolenbroek tmp->attrs[1]->mod_values[2] = NULL;
489*00b67f09SDavid van Moolenbroek
490*00b67f09SDavid van Moolenbroek sprintf (ldap_type_buffer, "%sRecord", type);
491*00b67f09SDavid van Moolenbroek
492*00b67f09SDavid van Moolenbroek tmp->attrs[2]->mod_op = LDAP_MOD_ADD;
493*00b67f09SDavid van Moolenbroek tmp->attrs[2]->mod_type = strdup (ldap_type_buffer);
494*00b67f09SDavid van Moolenbroek tmp->attrs[2]->mod_values = (char **) calloc (sizeof (char *), 2);
495*00b67f09SDavid van Moolenbroek
496*00b67f09SDavid van Moolenbroek if (tmp->attrs[2]->mod_values == (char **)NULL)
497*00b67f09SDavid van Moolenbroek exit(-1);
498*00b67f09SDavid van Moolenbroek
499*00b67f09SDavid van Moolenbroek tmp->attrs[2]->mod_values[0] = strdup (data);
500*00b67f09SDavid van Moolenbroek tmp->attrs[2]->mod_values[1] = NULL;
501*00b67f09SDavid van Moolenbroek
502*00b67f09SDavid van Moolenbroek tmp->attrs[3]->mod_op = LDAP_MOD_ADD;
503*00b67f09SDavid van Moolenbroek tmp->attrs[3]->mod_type = "dNSTTL";
504*00b67f09SDavid van Moolenbroek tmp->attrs[3]->mod_values = (char **) calloc (sizeof (char *), 2);
505*00b67f09SDavid van Moolenbroek
506*00b67f09SDavid van Moolenbroek if (tmp->attrs[3]->mod_values == (char **)NULL)
507*00b67f09SDavid van Moolenbroek exit(-1);
508*00b67f09SDavid van Moolenbroek
509*00b67f09SDavid van Moolenbroek sprintf (charttl, "%d", ttl);
510*00b67f09SDavid van Moolenbroek tmp->attrs[3]->mod_values[0] = strdup (charttl);
511*00b67f09SDavid van Moolenbroek tmp->attrs[3]->mod_values[1] = NULL;
512*00b67f09SDavid van Moolenbroek
513*00b67f09SDavid van Moolenbroek tmp->attrs[4]->mod_op = LDAP_MOD_ADD;
514*00b67f09SDavid van Moolenbroek tmp->attrs[4]->mod_type = "zoneName";
515*00b67f09SDavid van Moolenbroek tmp->attrs[4]->mod_values = (char **)calloc(sizeof(char *), 2);
516*00b67f09SDavid van Moolenbroek tmp->attrs[4]->mod_values[0] = gbl_zone;
517*00b67f09SDavid van Moolenbroek tmp->attrs[4]->mod_values[1] = NULL;
518*00b67f09SDavid van Moolenbroek
519*00b67f09SDavid van Moolenbroek tmp->attrs[5] = NULL;
520*00b67f09SDavid van Moolenbroek tmp->attrcnt = flags;
521*00b67f09SDavid van Moolenbroek tmp->next = ldap_info_base;
522*00b67f09SDavid van Moolenbroek ldap_info_base = tmp;
523*00b67f09SDavid van Moolenbroek }
524*00b67f09SDavid van Moolenbroek else
525*00b67f09SDavid van Moolenbroek {
526*00b67f09SDavid van Moolenbroek
527*00b67f09SDavid van Moolenbroek for (i = 0; tmp->attrs[i] != NULL; i++)
528*00b67f09SDavid van Moolenbroek {
529*00b67f09SDavid van Moolenbroek sprintf (ldap_type_buffer, "%sRecord", type);
530*00b67f09SDavid van Moolenbroek if (!strncmp
531*00b67f09SDavid van Moolenbroek (ldap_type_buffer, tmp->attrs[i]->mod_type,
532*00b67f09SDavid van Moolenbroek strlen (tmp->attrs[i]->mod_type)))
533*00b67f09SDavid van Moolenbroek {
534*00b67f09SDavid van Moolenbroek attrlist = get_attr_list_size (tmp->attrs[i]->mod_values);
535*00b67f09SDavid van Moolenbroek tmp->attrs[i]->mod_values =
536*00b67f09SDavid van Moolenbroek (char **) realloc (tmp->attrs[i]->mod_values,
537*00b67f09SDavid van Moolenbroek sizeof (char *) * (attrlist + 1));
538*00b67f09SDavid van Moolenbroek
539*00b67f09SDavid van Moolenbroek if (tmp->attrs[i]->mod_values == (char **) NULL)
540*00b67f09SDavid van Moolenbroek {
541*00b67f09SDavid van Moolenbroek fprintf (stderr, "realloc: %s\n", strerror (errno));
542*00b67f09SDavid van Moolenbroek ldap_unbind_s (conn);
543*00b67f09SDavid van Moolenbroek exit (-1);
544*00b67f09SDavid van Moolenbroek }
545*00b67f09SDavid van Moolenbroek for (x = 0; tmp->attrs[i]->mod_values[x] != NULL; x++);
546*00b67f09SDavid van Moolenbroek
547*00b67f09SDavid van Moolenbroek tmp->attrs[i]->mod_values[x] = strdup (data);
548*00b67f09SDavid van Moolenbroek tmp->attrs[i]->mod_values[x + 1] = NULL;
549*00b67f09SDavid van Moolenbroek return;
550*00b67f09SDavid van Moolenbroek }
551*00b67f09SDavid van Moolenbroek }
552*00b67f09SDavid van Moolenbroek tmp->attrs =
553*00b67f09SDavid van Moolenbroek (LDAPMod **) realloc (tmp->attrs,
554*00b67f09SDavid van Moolenbroek sizeof (LDAPMod) * ++(tmp->attrcnt));
555*00b67f09SDavid van Moolenbroek if (tmp->attrs == NULL)
556*00b67f09SDavid van Moolenbroek {
557*00b67f09SDavid van Moolenbroek fprintf (stderr, "realloc: %s\n", strerror (errno));
558*00b67f09SDavid van Moolenbroek ldap_unbind_s (conn);
559*00b67f09SDavid van Moolenbroek exit (-1);
560*00b67f09SDavid van Moolenbroek }
561*00b67f09SDavid van Moolenbroek
562*00b67f09SDavid van Moolenbroek for (x = 0; tmp->attrs[x] != NULL; x++);
563*00b67f09SDavid van Moolenbroek tmp->attrs[x] = (LDAPMod *) malloc (sizeof (LDAPMod));
564*00b67f09SDavid van Moolenbroek tmp->attrs[x]->mod_op = LDAP_MOD_ADD;
565*00b67f09SDavid van Moolenbroek tmp->attrs[x]->mod_type = strdup (ldap_type_buffer);
566*00b67f09SDavid van Moolenbroek tmp->attrs[x]->mod_values = (char **) calloc (sizeof (char *), 2);
567*00b67f09SDavid van Moolenbroek tmp->attrs[x]->mod_values[0] = strdup (data);
568*00b67f09SDavid van Moolenbroek tmp->attrs[x]->mod_values[1] = NULL;
569*00b67f09SDavid van Moolenbroek tmp->attrs[x + 1] = NULL;
570*00b67f09SDavid van Moolenbroek }
571*00b67f09SDavid van Moolenbroek }
572*00b67f09SDavid van Moolenbroek
573*00b67f09SDavid van Moolenbroek /* Size of a mod_values list, plus the terminating NULL field. */
574*00b67f09SDavid van Moolenbroek int
get_attr_list_size(char ** tmp)575*00b67f09SDavid van Moolenbroek get_attr_list_size (char **tmp)
576*00b67f09SDavid van Moolenbroek {
577*00b67f09SDavid van Moolenbroek int i = 0;
578*00b67f09SDavid van Moolenbroek char **ftmp = tmp;
579*00b67f09SDavid van Moolenbroek while (*ftmp != NULL)
580*00b67f09SDavid van Moolenbroek {
581*00b67f09SDavid van Moolenbroek i++;
582*00b67f09SDavid van Moolenbroek ftmp++;
583*00b67f09SDavid van Moolenbroek }
584*00b67f09SDavid van Moolenbroek return ++i;
585*00b67f09SDavid van Moolenbroek }
586*00b67f09SDavid van Moolenbroek
587*00b67f09SDavid van Moolenbroek
588*00b67f09SDavid van Moolenbroek /* take a hostname, and split it into a char ** of the dc parts,
589*00b67f09SDavid van Moolenbroek * example, we have www.domain.com, this function will return:
590*00b67f09SDavid van Moolenbroek * array[0] = com, array[1] = domain, array[2] = www. */
591*00b67f09SDavid van Moolenbroek
592*00b67f09SDavid van Moolenbroek char **
hostname_to_dn_list(char * hostname,char * zone,unsigned int flags)593*00b67f09SDavid van Moolenbroek hostname_to_dn_list (char *hostname, char *zone, unsigned int flags)
594*00b67f09SDavid van Moolenbroek {
595*00b67f09SDavid van Moolenbroek char *tmp;
596*00b67f09SDavid van Moolenbroek static char *dn_buffer[64];
597*00b67f09SDavid van Moolenbroek int i = 0;
598*00b67f09SDavid van Moolenbroek char *zname;
599*00b67f09SDavid van Moolenbroek char *hnamebuff;
600*00b67f09SDavid van Moolenbroek
601*00b67f09SDavid van Moolenbroek zname = strdup (hostname);
602*00b67f09SDavid van Moolenbroek
603*00b67f09SDavid van Moolenbroek if (flags == DNS_OBJECT)
604*00b67f09SDavid van Moolenbroek {
605*00b67f09SDavid van Moolenbroek
606*00b67f09SDavid van Moolenbroek if (strlen (zname) != strlen (zone))
607*00b67f09SDavid van Moolenbroek {
608*00b67f09SDavid van Moolenbroek tmp = &zname[strlen (zname) - strlen (zone)];
609*00b67f09SDavid van Moolenbroek *--tmp = '\0';
610*00b67f09SDavid van Moolenbroek hnamebuff = strdup (zname);
611*00b67f09SDavid van Moolenbroek zname = ++tmp;
612*00b67f09SDavid van Moolenbroek }
613*00b67f09SDavid van Moolenbroek else
614*00b67f09SDavid van Moolenbroek hnamebuff = "@";
615*00b67f09SDavid van Moolenbroek }
616*00b67f09SDavid van Moolenbroek else
617*00b67f09SDavid van Moolenbroek {
618*00b67f09SDavid van Moolenbroek zname = zone;
619*00b67f09SDavid van Moolenbroek hnamebuff = NULL;
620*00b67f09SDavid van Moolenbroek }
621*00b67f09SDavid van Moolenbroek
622*00b67f09SDavid van Moolenbroek for (tmp = strrchr (zname, '.'); tmp != (char *) 0;
623*00b67f09SDavid van Moolenbroek tmp = strrchr (zname, '.'))
624*00b67f09SDavid van Moolenbroek {
625*00b67f09SDavid van Moolenbroek *tmp++ = '\0';
626*00b67f09SDavid van Moolenbroek dn_buffer[i++] = tmp;
627*00b67f09SDavid van Moolenbroek }
628*00b67f09SDavid van Moolenbroek dn_buffer[i++] = zname;
629*00b67f09SDavid van Moolenbroek dn_buffer[i++] = hnamebuff;
630*00b67f09SDavid van Moolenbroek dn_buffer[i] = NULL;
631*00b67f09SDavid van Moolenbroek
632*00b67f09SDavid van Moolenbroek return dn_buffer;
633*00b67f09SDavid van Moolenbroek }
634*00b67f09SDavid van Moolenbroek
635*00b67f09SDavid van Moolenbroek
636*00b67f09SDavid van Moolenbroek /* build an sdb compatible LDAP DN from a "dc_list" (char **).
637*00b67f09SDavid van Moolenbroek * will append dNSTTL information to each RR Record, with the
638*00b67f09SDavid van Moolenbroek * exception of "@"/SOA. */
639*00b67f09SDavid van Moolenbroek
640*00b67f09SDavid van Moolenbroek char *
build_dn_from_dc_list(char ** dc_list,unsigned int ttl,int flag)641*00b67f09SDavid van Moolenbroek build_dn_from_dc_list (char **dc_list, unsigned int ttl, int flag)
642*00b67f09SDavid van Moolenbroek {
643*00b67f09SDavid van Moolenbroek int size;
644*00b67f09SDavid van Moolenbroek int x;
645*00b67f09SDavid van Moolenbroek static char dn[1024];
646*00b67f09SDavid van Moolenbroek char tmp[128];
647*00b67f09SDavid van Moolenbroek
648*00b67f09SDavid van Moolenbroek bzero (tmp, sizeof (tmp));
649*00b67f09SDavid van Moolenbroek bzero (dn, sizeof (dn));
650*00b67f09SDavid van Moolenbroek size = get_attr_list_size (dc_list);
651*00b67f09SDavid van Moolenbroek for (x = size - 2; x > 0; x--)
652*00b67f09SDavid van Moolenbroek {
653*00b67f09SDavid van Moolenbroek if (flag == WI_SPEC)
654*00b67f09SDavid van Moolenbroek {
655*00b67f09SDavid van Moolenbroek if (x == (size - 2) && (strncmp (dc_list[x], "@", 1) == 0) && (ttl))
656*00b67f09SDavid van Moolenbroek sprintf (tmp, "relativeDomainName=%s + dNSTTL=%d,", dc_list[x], ttl);
657*00b67f09SDavid van Moolenbroek else if (x == (size - 2))
658*00b67f09SDavid van Moolenbroek sprintf(tmp, "relativeDomainName=%s,",dc_list[x]);
659*00b67f09SDavid van Moolenbroek else
660*00b67f09SDavid van Moolenbroek sprintf(tmp,"dc=%s,", dc_list[x]);
661*00b67f09SDavid van Moolenbroek }
662*00b67f09SDavid van Moolenbroek else
663*00b67f09SDavid van Moolenbroek {
664*00b67f09SDavid van Moolenbroek sprintf(tmp, "dc=%s,", dc_list[x]);
665*00b67f09SDavid van Moolenbroek }
666*00b67f09SDavid van Moolenbroek
667*00b67f09SDavid van Moolenbroek
668*00b67f09SDavid van Moolenbroek strncat (dn, tmp, sizeof (dn) - strlen (dn));
669*00b67f09SDavid van Moolenbroek }
670*00b67f09SDavid van Moolenbroek
671*00b67f09SDavid van Moolenbroek sprintf (tmp, "dc=%s", dc_list[0]);
672*00b67f09SDavid van Moolenbroek strncat (dn, tmp, sizeof (dn) - strlen (dn));
673*00b67f09SDavid van Moolenbroek
674*00b67f09SDavid van Moolenbroek fflush(NULL);
675*00b67f09SDavid van Moolenbroek return dn;
676*00b67f09SDavid van Moolenbroek }
677*00b67f09SDavid van Moolenbroek
678*00b67f09SDavid van Moolenbroek
679*00b67f09SDavid van Moolenbroek /* Initialize LDAP Conn */
680*00b67f09SDavid van Moolenbroek void
init_ldap_conn()681*00b67f09SDavid van Moolenbroek init_ldap_conn ()
682*00b67f09SDavid van Moolenbroek {
683*00b67f09SDavid van Moolenbroek int result;
684*00b67f09SDavid van Moolenbroek conn = ldap_open (ldapsystem, LDAP_PORT);
685*00b67f09SDavid van Moolenbroek if (conn == NULL)
686*00b67f09SDavid van Moolenbroek {
687*00b67f09SDavid van Moolenbroek fprintf (stderr, "Error opening Ldap connection: %s\n",
688*00b67f09SDavid van Moolenbroek strerror (errno));
689*00b67f09SDavid van Moolenbroek exit (-1);
690*00b67f09SDavid van Moolenbroek }
691*00b67f09SDavid van Moolenbroek
692*00b67f09SDavid van Moolenbroek result = ldap_simple_bind_s (conn, binddn, bindpw);
693*00b67f09SDavid van Moolenbroek ldap_result_check ("ldap_simple_bind_s", "LDAP Bind", result);
694*00b67f09SDavid van Moolenbroek }
695*00b67f09SDavid van Moolenbroek
696*00b67f09SDavid van Moolenbroek /* Like isc_result_check, only for LDAP */
697*00b67f09SDavid van Moolenbroek void
ldap_result_check(char * msg,char * dn,int err)698*00b67f09SDavid van Moolenbroek ldap_result_check (char *msg, char *dn, int err)
699*00b67f09SDavid van Moolenbroek {
700*00b67f09SDavid van Moolenbroek if ((err != LDAP_SUCCESS) && (err != LDAP_ALREADY_EXISTS))
701*00b67f09SDavid van Moolenbroek {
702*00b67f09SDavid van Moolenbroek fprintf(stderr, "Error while adding %s (%s):\n",
703*00b67f09SDavid van Moolenbroek dn, msg);
704*00b67f09SDavid van Moolenbroek ldap_perror (conn, dn);
705*00b67f09SDavid van Moolenbroek ldap_unbind_s (conn);
706*00b67f09SDavid van Moolenbroek exit (-1);
707*00b67f09SDavid van Moolenbroek }
708*00b67f09SDavid van Moolenbroek }
709*00b67f09SDavid van Moolenbroek
710*00b67f09SDavid van Moolenbroek
711*00b67f09SDavid van Moolenbroek
712*00b67f09SDavid van Moolenbroek /* For running the ldap_info run queue. */
713*00b67f09SDavid van Moolenbroek void
add_ldap_values(ldap_info * ldinfo)714*00b67f09SDavid van Moolenbroek add_ldap_values (ldap_info * ldinfo)
715*00b67f09SDavid van Moolenbroek {
716*00b67f09SDavid van Moolenbroek int result;
717*00b67f09SDavid van Moolenbroek char dnbuffer[1024];
718*00b67f09SDavid van Moolenbroek
719*00b67f09SDavid van Moolenbroek
720*00b67f09SDavid van Moolenbroek if (ldapbase != NULL)
721*00b67f09SDavid van Moolenbroek sprintf (dnbuffer, "%s,%s", ldinfo->dn, ldapbase);
722*00b67f09SDavid van Moolenbroek else
723*00b67f09SDavid van Moolenbroek sprintf (dnbuffer, "%s", ldinfo->dn);
724*00b67f09SDavid van Moolenbroek
725*00b67f09SDavid van Moolenbroek result = ldap_add_s (conn, dnbuffer, ldinfo->attrs);
726*00b67f09SDavid van Moolenbroek ldap_result_check ("ldap_add_s", dnbuffer, result);
727*00b67f09SDavid van Moolenbroek }
728*00b67f09SDavid van Moolenbroek
729*00b67f09SDavid van Moolenbroek
730*00b67f09SDavid van Moolenbroek
731*00b67f09SDavid van Moolenbroek
732*00b67f09SDavid van Moolenbroek /* name says it all */
733*00b67f09SDavid van Moolenbroek void
usage()734*00b67f09SDavid van Moolenbroek usage ()
735*00b67f09SDavid van Moolenbroek {
736*00b67f09SDavid van Moolenbroek fprintf (stderr,
737*00b67f09SDavid van Moolenbroek "zone2ldap -D [BIND DN] -w [BIND PASSWORD] -b [BASE DN] -z [ZONE] -f [ZONE FILE] -h [LDAP HOST]
738*00b67f09SDavid van Moolenbroek [-c Create LDAP Base structure][-d Debug Output (lots !)] \n ");}
739