File: common.h

package info (click to toggle)
ldapvi 1.7-11.2
  • links: PTS
  • area: main
  • in suites: forky, sid
  • size: 1,204 kB
  • sloc: ansic: 6,536; xml: 1,331; sh: 194; makefile: 16
file content (373 lines) | stat: -rw-r--r-- 10,845 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
/* -*- show-trailing-whitespace: t; indent-tabs: t -*-
 *
 * Copyright (c) 2003,2004,2005,2006 David Lichteblau
 * Copyright (c) 2006 Perry Nguyen
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; either version 2 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 */
#include <dirent.h>
#include <errno.h>
#include <fcntl.h>
#include <glib.h>
/* fixme: */
#define LDAP_DEPRECATED 1
#include <ldap.h>
#include <ldap_schema.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <strings.h>
#include <sys/ioctl.h>
#include <sys/stat.h>
#include <sys/termios.h>
#include <sys/time.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <time.h>
#include <unistd.h>
#include <ctype.h>

#define MANUAL_SYNTAX_URL "http://www.lichteblau.com/ldapvi/manual#syntax"
#define MANUAL_LDIF_URL "http://www.lichteblau.com/ldapvi/manual#syntax-ldif"
#define RFC_2849_URL "http://www.rfc-editor.org/rfc/rfc2849.txt"

typedef struct tschema {
	GHashTable *classes;
	GHashTable *types;
} tschema;

typedef struct tentroid {
	tschema *schema;
	GPtrArray *classes;
	GPtrArray *must;
	GPtrArray *may;
	LDAPObjectClass *structural;
	GString *comment;
	GString *error;
} tentroid;



/*
 * error.c
 */
#define syserr() do_syserr(__FILE__, __LINE__)

void do_syserr(char *file, int line);
void yourfault(char *str);
void ldaperr(LDAP *ld, char *str);

/*
 * arguments.c
 */
enum ldapvi_mode {
	ldapvi_mode_edit, ldapvi_mode_in, ldapvi_mode_out,
	ldapvi_mode_delete, ldapvi_mode_rename, ldapvi_mode_modrdn
};

enum bind_dialog {
	BD_NEVER = LDAP_SASL_QUIET,
	BD_AUTO = LDAP_SASL_AUTOMATIC,
	BD_ALWAYS = LDAP_SASL_INTERACTIVE
};

/* FIXME (?): For now, we recklessly leak all strings stored in
 * bind_options when reauthentication is performed and new values are
 * stored. */
typedef struct bind_options {
        ber_tag_t authmethod;   /* LDAP_AUTH_SASL or LDAP_AUTH_NONE */
        enum bind_dialog dialog;
        char *user;             /* DN or user search filter */
        char *password;         /* Simple or SASL passwd */
        char *sasl_authcid;
        char *sasl_authzid;
        char *sasl_mech;
        char *sasl_realm;
        char *sasl_secprops;
} bind_options;

typedef struct cmdline {
	char *server;
	GPtrArray *basedns;
	int scope;
	char *filter;
	char **attrs;
	bind_options bind_options;
	int quiet;
	int referrals;
	GPtrArray *classes;
	int ldapmodify_add;
	int managedsait;
	char *sortkeys;
	int starttls;
	int tls;
	int deref;
	int verbose;
	int noquestions;
	int noninteractive;
	int discover;
	int config;
	int ldif;
	int ldapvi;
	int mode;
	char **delete_dns;
	char *rename_old;
	char *rename_new;
	int rename_dor;
	char *in_file;
	int schema_comments;
	int continuous;
	int profileonlyp;
} cmdline;

void init_cmdline(cmdline *cmdline);
void parse_arguments(
	int argc, const char **argv, cmdline *result, GPtrArray *ctrls);
void usage(int fd, int rc);

/*
 * data.c
 */
typedef struct named_array {
	char *name;
	GPtrArray *array;
} named_array;

typedef struct tentry {
	struct named_array e;
} tentry;
#define entry_dn(entry) ((entry)->e.name)
#define entry_attributes(entry) ((entry)->e.array)

typedef struct tattribute {
	struct named_array a;
} tattribute;
#define attribute_ad(attribute) ((attribute)->a.name)
#define attribute_values(attribute) ((attribute)->a.array)

tentry *entry_new(char *dn);
void entry_free(tentry *e);
int entry_cmp(tentry *e, tentry *f);

tattribute *attribute_new(char *ad);
void attribute_free(tattribute *a);
int attribute_cmp(tattribute *a, tattribute *b);

int named_array_ptr_cmp(const void *aa, const void *bb);

LDAPMod *attribute2mods(tattribute *attribute);
LDAPMod **entry2mods(tentry *entry);
tattribute *entry_find_attribute(tentry *entry, char *ad, int createp);
void attribute_append_value(tattribute *attribute, char *data, int n);
int attribute_find_value(tattribute *attribute, char *data, int n);
int attribute_remove_value(tattribute *a, char *data, int n);

struct berval *string2berval(GArray *s);
struct berval *gstring2berval(GString *s);
char *array2string(GArray *av);
void xfree_berval(struct berval *bv);

/*
 * parse.c
 */
typedef int (*parser_entry)(FILE *, long, char **, tentry **, long *);
typedef int (*parser_peek)(FILE *, long, char **, long *);
typedef int (*parser_skip)(FILE *, long, char **);
typedef int (*parser_rename)(FILE *, long, char **, char **, int *);
typedef int (*parser_delete)(FILE *, long, char **);
typedef int (*parser_modify)(FILE *, long, char **, LDAPMod ***);
typedef void (*print_entry)(FILE *, tentry *, char *, tentroid *);

typedef struct tparser {
	parser_entry entry;

	parser_peek peek;
	parser_skip skip;

	parser_rename rename;
	parser_delete delete;
	parser_modify modify;

	print_entry print; /* ja, das muss so sein */
} tparser;

extern tparser ldif_parser;
extern tparser ldapvi_parser;

int peek_entry(FILE *s, long offset, char **key, long *pos);
int read_entry(FILE *s, long offset, char **key, tentry **entry, long *pos);
int read_rename(FILE *s, long offset, char **dn1, char **dn2, int *);
int read_modify(FILE *s, long offset, char **dn, LDAPMod ***mods);
int read_delete(FILE *s, long offset, char **dn);
int skip_entry(FILE *s, long offset, char **key);
int read_profile(FILE *s, tentry **entry);

/*
 * diff.c
 */
typedef int (*handler_change)(int, char *, char *, LDAPMod **, void *);
typedef int (*handler_rename)(int, char *, tentry *, void *);
typedef int (*handler_add)(int, char *, LDAPMod **, void *);
typedef int (*handler_delete)(int, char *, void *);
typedef int (*handler_rename0)(int, char *, char *, int, void *);

typedef struct thandler {
	handler_change change;
	handler_rename rename;
	handler_add add;
	handler_delete delete;
	handler_rename0 rename0;
} thandler;

int compare_streams(
	tparser *parser,
	thandler *handler,
	void *userdata,
	GArray *offsets,
	FILE *clean,
	FILE *data,
	long *error_position,
	long *syntax_error_position);

enum frob_rdn_mode {
	FROB_RDN_CHECK, FROB_RDN_REMOVE, FROB_RDN_ADD, FROB_RDN_CHECK_NONE
};
int frob_rdn(tentry *entry, char *dn, int mode);
int process_immediate(tparser *, thandler *, void *, FILE *, long, char *);


/*
 * misc.c
 */
enum dialog_mode {
	DIALOG_DEFAULT, DIALOG_PASSWORD, DIALOG_CHALLENGE
};
typedef struct dialog {
	enum dialog_mode mode;
	char *prompt;
	char *value;
} tdialog;

int carray_cmp(GArray *a, GArray *b);
int carray_ptr_cmp(const void *aa, const void *bb);
void cp(char *src, char *dst, off_t skip, int append);
void fcopy(FILE *src, FILE *dst);
char choose(char *prompt, char *charbag, char *help);
void edit_pos(char *pathname, long pos);
void edit(char *pathname, long line);
void view(char *pathname);
int pipeview(int *fd);
void pipeview_wait(int pid);
char *home_filename(char *name);
void read_ldapvi_history(void);
void write_ldapvi_history(void);
char *ldapvi_getline(char *prompt, char *value);
char *get_password();
char *append(char *a, char *b);
void *xalloc(size_t size);
char *xdup(char *str);
int adjoin_str(GPtrArray *, char *);
int adjoin_ptr(GPtrArray *, void *);
void init_dialog(tdialog *, enum dialog_mode, char *, char *);
void dialog(char *header, tdialog *, int, int);
void fdcp(int fdsrc, int fddst);

/*
 * schema.c
 */
char *objectclass_name(LDAPObjectClass *);
char *attributetype_name(LDAPAttributeType *);

tschema *schema_new(LDAP *ld);
void schema_free(tschema *schema);
LDAPObjectClass *schema_get_objectclass(tschema *, char *);
LDAPAttributeType *schema_get_attributetype(tschema *, char *);

tentroid *entroid_new(tschema *);
void entroid_reset(tentroid *);
void entroid_free(tentroid *);
LDAPObjectClass *entroid_get_objectclass(tentroid *, char *);
LDAPAttributeType *entroid_get_attributetype(tentroid *, char *);
LDAPObjectClass *entroid_request_class(tentroid *, char *);
int entroid_remove_ad(tentroid *, char *);
int compute_entroid(tentroid *);

/*
 * print.c
 */
typedef enum t_print_binary_mode {
	PRINT_ASCII, PRINT_UTF8, PRINT_JUNK
} t_print_binary_mode;
extern t_print_binary_mode print_binary_mode;

void print_ldapvi_entry(FILE *s, tentry *entry, char *key, tentroid *);
void print_ldapvi_modify(FILE *s, char *dn, LDAPMod **mods);
void print_ldapvi_rename(FILE *s, char *olddn, char *newdn, int deleteoldrdn);
void print_ldapvi_add(FILE *s, char *dn, LDAPMod **mods);
void print_ldapvi_delete(FILE *s, char *dn);
void print_ldapvi_modrdn(FILE *s, char *olddn, char *newrdn, int deleteoldrdn);
void print_ldapvi_message(FILE *, LDAP *, LDAPMessage *, int key, tentroid *);
void print_ldif_entry(FILE *s, tentry *entry, char *key, tentroid *);
void print_ldif_modify(FILE *s, char *dn, LDAPMod **mods);
void print_ldif_rename(FILE *s, char *olddn, char *newdn, int deleteoldrdn);
void print_ldif_add(FILE *s, char *dn, LDAPMod **mods);
void print_ldif_delete(FILE *s, char *dn);
void print_ldif_modrdn(FILE *s, char *olddn, char *newrdn, int deleteoldrdn);
void print_ldif_message(FILE *, LDAP *, LDAPMessage *, int key, tentroid *);

/*
 * search.c
 */
void discover_naming_contexts(LDAP *ld, GPtrArray *basedns);
GArray *search(
	FILE *s, LDAP *ld, cmdline *cmdline, LDAPControl **ctrls, int notty,
	int ldif);
LDAPMessage *get_entry(LDAP *ld, char *dn, LDAPMessage **result);

/*
 * port.c
 */
typedef void (*on_exit_function)(int, void *);
int g_string_append_sha(GString *string, char *key);
int g_string_append_ssha(GString *string, char *key);
int g_string_append_md5(GString *string, char *key);
int g_string_append_smd5(GString *string, char *key);

/*
 * base64.c
 */
void print_base64(unsigned char const *src, size_t srclength, FILE *s);
void g_string_append_base64(
	GString *string, unsigned char const *src, size_t srclength);
int read_base64(char const *src, unsigned char *target, size_t targsize);

/*
 * sasl.c
 */
typedef struct sasl_defaults {
	bind_options *bind_options;
	GPtrArray *scratch;
	char *pathname;
	int fd, out, err;
} tsasl_defaults;

void init_sasl_redirection(tsasl_defaults *, char *);
void enable_sasl_redirection(tsasl_defaults *);
void disable_sasl_redirection(tsasl_defaults *);
void finish_sasl_redirection(tsasl_defaults *);

tsasl_defaults *sasl_defaults_new(bind_options *bind_options);
void sasl_defaults_free(tsasl_defaults *sd);
int ldapvi_sasl_interact(LDAP *ld, unsigned flags, void *defaults, void *p);