]> git.sur5r.net Git - openldap/blob - servers/slapd/tools/ldif2id2children.c
Rework ac/socket.h for HAVE_WINSOCK:
[openldap] / servers / slapd / tools / ldif2id2children.c
1 #include "portable.h"
2
3 #include <stdio.h>
4 #include <stdlib.h>
5
6 #include <ac/ctype.h>
7 #include <ac/string.h>
8 #include <ac/socket.h>
9 #include <ac/unistd.h>
10
11 #include "ldapconfig.h"
12 #include "../slap.h"
13 #include "../back-ldbm/back-ldbm.h"
14
15 #include "ldif.h"
16
17 #define MAXARGS                 100
18
19 static char     *tailorfile;
20 static char     *inputfile;
21  
22 static void
23 usage( char *name )
24 {
25         fprintf( stderr, "usage: %s -i inputfile [-d debuglevel] [-f configfile] [-n databasenumber]\n", name );
26         exit( 1 );
27 }
28
29 int
30 main( int argc, char **argv )
31 {
32         int             i, stop;
33         char            *linep, *buf;
34         char            line[BUFSIZ];
35         int             lineno, elineno;
36         int             lmax, lcur;
37         int             dbnum;
38         ID              id;
39         struct dbcache  *db, *db2;
40         Backend         *be = NULL;
41         struct ldbminfo *li;
42         struct berval   bv;
43         struct berval   *vals[2];
44
45         tailorfile = SLAPD_DEFAULT_CONFIGFILE;
46         dbnum = -1;
47         while ( (i = getopt( argc, argv, "d:f:i:n:" )) != EOF ) {
48                 switch ( i ) {
49                 case 'd':       /* turn on debugging */
50                         ldap_debug = atoi( optarg );
51                         break;
52
53                 case 'f':       /* specify a tailor file */
54                         tailorfile = strdup( optarg );
55                         break;
56
57                 case 'i':       /* input file */
58                         inputfile = strdup( optarg );
59                         break;
60
61                 case 'n':       /* which config file db to index */
62                         dbnum = atoi( optarg ) - 1;
63                         break;
64
65                 default:
66                         usage( argv[0] );
67                         break;
68                 }
69         }
70         if ( inputfile == NULL ) {
71                 usage( argv[0] );
72         } else {
73                 if ( freopen( inputfile, "r", stdin ) == NULL ) {
74                         perror( inputfile );
75                         exit( 1 );
76                 }
77         }
78
79         /*
80          * initialize stuff and figure out which backend we're dealing with
81          */
82
83         slap_init(SLAP_TOOL_MODE, "ldif2id2children");
84         read_config( tailorfile );
85
86         if ( dbnum == -1 ) {
87                 for ( dbnum = 0; dbnum < nbackends; dbnum++ ) {
88                         if ( strcasecmp( backends[dbnum].be_type, "ldbm" )
89                             == 0 ) {
90                                 break;
91                         }
92                 }
93                 if ( dbnum == nbackends ) {
94                         fprintf( stderr, "No ldbm database found in config file\n" );
95                         exit( 1 );
96                 }
97         } else if ( dbnum < 0 || dbnum > (nbackends-1) ) {
98                 fprintf( stderr, "Database number selected via -n is out of range\n" );
99                 fprintf( stderr, "Must be in the range 1 to %d (number of databases in the config file)\n", nbackends );
100                 exit( 1 );
101         } else if ( strcasecmp( backends[dbnum].be_type, "ldbm" ) != 0 ) {
102                 fprintf( stderr, "Database number %d selected via -n is not an ldbm database\n", dbnum );
103                 exit( 1 );
104         }
105
106         slap_startup(dbnum);
107         be = &backends[dbnum];
108
109         /* disable write sync'ing */
110         li = (struct ldbminfo *) be->be_private;
111         li->li_dbcachewsync = 0;
112
113         /*
114          * first, make the dn2id index
115          */
116
117         if ( (db = ldbm_cache_open( be, "dn2id", LDBM_SUFFIX, LDBM_NEWDB ))
118             == NULL ) {
119                 perror( "dn2id file" );
120                 exit( 1 );
121         }
122
123         id = 0;
124         stop = 0;
125         lineno = 0;
126         buf = NULL;
127         lcur = lmax = 0;
128         vals[0] = &bv;
129         vals[1] = NULL;
130         while ( ! stop ) {
131                 char            *type, *val, *s;
132                 int             vlen;
133                 Datum           key, data;
134
135                 ldbm_datum_init( key );
136                 ldbm_datum_init( data );
137
138                 if ( fgets( line, sizeof(line), stdin ) != NULL ) {
139                         int     len;
140
141                         lineno++;
142                         len = strlen( line );
143                         while ( lcur + len + 1 > lmax ) {
144                                 lmax += BUFSIZ;
145                                 buf = (char *) ch_realloc( buf, lmax );
146                         }
147                         strcpy( buf + lcur, line );
148                         lcur += len;
149                 } else {
150                         stop = 1;
151                 }
152                 if ( line[0] == '\n' || stop && buf && *buf ) {
153                         if ( *buf != '\n' ) {
154                                 if (isdigit((unsigned char) *buf)) {
155                                         id = atol(buf);
156                                 } else {
157                                         id++;
158                                 }
159                                 s = buf;
160                                 elineno = 0;
161                                 while ( (linep = ldif_getline( &s )) != NULL ) {
162                                         elineno++;
163                                         if ( ldif_parse_line( linep, &type, &val,
164                                             &vlen ) != 0 ) {
165                                                 Debug( LDAP_DEBUG_PARSE,
166                             "bad line %d in entry ending at line %d ignored\n",
167                                                     elineno, lineno, 0 );
168                                                 continue;
169                                         }
170
171                                         if ( strcmp( type, "dn" ) == 0 )
172                                                 break;
173                                 }
174
175                                 if ( linep == NULL ) {
176                                         fprintf( stderr, "entry %ld has no dn\n",
177                                             id );
178                                 } else {
179                                         key.dptr = dn_normalize_case( val );
180                                         key.dsize = strlen( val ) + 1;
181                                         data.dptr = (char *) &id;
182                                         data.dsize = sizeof(ID);
183                                         if ( ldbm_store( db->dbc_db, key, data,
184                                             LDBM_REPLACE ) != 0 ) {
185                                                 perror( "dn2id ldbm_store" );
186                                                 exit( 1 );
187                                         }
188                                 }
189                         }
190                         *buf = '\0';
191                         lcur = 0;
192                         line[0] = '\0';
193                 }
194         }
195         if ( buf )
196                 free( buf );
197
198         /*
199          * next, make the id2children index
200          */
201
202         if ( (db2 = ldbm_cache_open( be, "id2children", LDBM_SUFFIX,
203             LDBM_NEWDB )) == NULL ) {
204                 perror( "id2children file" );
205                 exit( 1 );
206         }
207
208         rewind( stdin );
209         id = 0;
210         stop = 0;
211         buf = NULL;
212         lineno = 0;
213         lcur = lmax = 0;
214         vals[0] = &bv;
215         vals[1] = NULL;
216         while ( ! stop ) {
217                 char    *type, *val, *s, *dn;
218                 int     vlen;
219                 ID      pid;
220                 char    buf2[20];
221                 Datum   key, data;
222
223                 ldbm_datum_init( key );
224                 ldbm_datum_init( data );
225
226                 if ( fgets( line, sizeof(line), stdin ) != NULL ) {
227                         int     len;
228
229                         len = strlen( line );
230                         while ( lcur + len + 1 > lmax ) {
231                                 lmax += BUFSIZ;
232                                 buf = (char *) ch_realloc( buf, lmax );
233                         }
234                         strcpy( buf + lcur, line );
235                         lcur += len;
236                 } else {
237                         stop = 1;
238                 }
239                 if ( line[0] == '\n' || stop && buf && *buf ) {
240                         if ( * buf != '\n' ) {
241                                 id++;
242                                 s = buf;
243                                 while ( (linep = ldif_getline( &s )) != NULL ) {
244                                         if ( ldif_parse_line( linep, &type, &val,
245                                             &vlen ) != 0 ) {
246                                                 Debug( LDAP_DEBUG_PARSE,
247                                                     "bad line %d ignored\n",
248                                                     lineno, 0, 0 );
249                                                 continue;
250                                         }
251
252                                         if ( strcmp( type, "dn" ) == 0 )
253                                                 break;
254                                 }
255
256                                 if ( linep == NULL ) {
257                                         fprintf( stderr, "entry %ld has no dn\n",
258                                             id );
259                                 } else {
260                                         if ( (dn = dn_parent( be, val ))
261                                             == NULL ) {
262                                                 pid = 0;
263                                         } else {
264                                                 key.dptr =
265                                                     dn_normalize_case( dn );
266                                                 key.dsize = strlen( dn ) + 1;
267
268                                                 data = ldbm_fetch( db->dbc_db,
269                                                     key );
270                                                 free( dn );
271                                                 if ( data.dptr == NULL ) {
272                                                         dn_normalize_case( val );
273                                                         if ( ! be_issuffix( be,
274                                                             val ) ) {
275         Debug( LDAP_DEBUG_PARSE, "no parent \"%s\" of \"%s\"\n", dn, val, 0 );
276                                                         }
277                                                         *buf = '\0';
278                                                         lcur = 0;
279                                                         line[0] = '\0';
280                                                         continue;
281                                                 }
282                                                 (void) memcpy( (char *) &pid,
283                                                     data.dptr, sizeof(ID) );
284
285                                                 ldbm_datum_free( db->dbc_db, data);
286                                         }
287
288                                         sprintf( buf2, "%c%ld", EQ_PREFIX, pid );
289                                         key.dptr = buf2;
290                                         key.dsize = strlen( buf2 ) + 1;
291                                         if ( idl_insert_key( be, db2, key, id )
292                                             != 0 ) {
293                                                 perror( "idl_insert_key" );
294                                                 exit( 1 );
295                                         }
296                                 }
297                         }
298                         *buf = '\0';
299                         lcur = 0;
300                         line[0] = '\0';
301                 }
302         }
303
304         slap_shutdown(dbnum);
305         slap_destroy();
306
307         exit( 0 );
308 }