1 /* $OpenLDAP$ */
2 /* This work is part of OpenLDAP Software <http://www.openldap.org/>.
3  *
4  * Copyright 1998-2021 The OpenLDAP Foundation.
5  * All rights reserved.
6  *
7  * Redistribution and use in source and binary forms, with or without
8  * modification, are permitted only as authorized by the OpenLDAP
9  * Public License.
10  *
11  * A copy of this license is available in file LICENSE in the
12  * top-level directory of the distribution or, alternatively, at
13  * <http://www.OpenLDAP.org/license.html>.
14  */
15 /* Portions Copyright (c) 1996 Regents of the University of Michigan.
16  * All rights reserved.
17  *
18  * Redistribution and use in source and binary forms are permitted
19  * provided that this notice is preserved and that due credit is given
20  * to the University of Michigan at Ann Arbor. The name of the University
21  * may not be used to endorse or promote products derived from this
22  * software without specific prior written permission. This software
23  * is provided ``as is'' without express or implied warranty.
24  */
25 
26 #ifndef _LDIF_H
27 #define _LDIF_H
28 
29 #include <ldap_cdefs.h>
30 
31 LDAP_BEGIN_DECL
32 
33 /* This is NOT a bogus extern declaration (unlike ldap_debug) */
34 LDAP_LDIF_V (int) ldif_debug;
35 
36 #define LDIF_LINE_WIDTH      76      /* default maximum length of LDIF lines */
37 #define LDIF_LINE_WIDTH_MAX  ((ber_len_t)-1) /* maximum length of LDIF lines */
38 #define LDIF_LINE_WIDTH_WRAP(wrap) ((wrap) == 0 ? LDIF_LINE_WIDTH : (wrap))
39 
40 /*
41  * Macro to calculate maximum number of bytes that the base64 equivalent
42  * of an item that is "len" bytes long will take up.  Base64 encoding
43  * uses one byte for every six bits in the value plus up to two pad bytes.
44  */
45 #define LDIF_BASE64_LEN(len)	(((len) * 4 / 3 ) + 3)
46 
47 /*
48  * Macro to calculate maximum size that an LDIF-encoded type (length
49  * tlen) and value (length vlen) will take up:  room for type + ":: " +
50  * first newline + base64 value + continued lines.  Each continued line
51  * needs room for a newline and a leading space character.
52  */
53 #define LDIF_SIZE_NEEDED(nlen,vlen) \
54     ((nlen) + 4 + LDIF_BASE64_LEN(vlen) \
55     + ((LDIF_BASE64_LEN(vlen) + (nlen) + 3) / (LDIF_LINE_WIDTH-1) * 2 ))
56 
57 #define LDIF_SIZE_NEEDED_WRAP(nlen,vlen,wrap) \
58     ((nlen) + 4 + LDIF_BASE64_LEN(vlen) \
59     + ((wrap) == 0 ? ((LDIF_BASE64_LEN(vlen) + (nlen) + 3) / ( LDIF_LINE_WIDTH-1 ) * 2 ) : \
60 	((wrap) == LDIF_LINE_WIDTH_MAX ? 0 : ((LDIF_BASE64_LEN(vlen) + (nlen) + 3) / (wrap-1) * 2 ))))
61 
62 LDAP_LDIF_F( int )
63 ldif_parse_line LDAP_P((
64 	LDAP_CONST char *line,
65 	char **name,
66 	char **value,
67 	ber_len_t *vlen ));
68 
69 LDAP_LDIF_F( int )
70 ldif_parse_line2 LDAP_P((
71 	char *line,
72 	struct berval *type,
73 	struct berval *value,
74 	int *freeval ));
75 
76 LDAP_LDIF_F( FILE * )
77 ldif_open_url LDAP_P(( LDAP_CONST char *urlstr ));
78 
79 LDAP_LDIF_F( int )
80 ldif_fetch_url LDAP_P((
81 	LDAP_CONST char *line,
82 	char **value,
83 	ber_len_t *vlen ));
84 
85 LDAP_LDIF_F( char * )
86 ldif_getline LDAP_P(( char **next ));
87 
88 LDAP_LDIF_F( int )
89 ldif_countlines LDAP_P(( LDAP_CONST char *line ));
90 
91 /* ldif_ropen, rclose, read_record - just for reading LDIF files,
92  * no special open/close needed to write LDIF files.
93  */
94 typedef struct LDIFFP {
95 	FILE *fp;
96 	struct LDIFFP *prev;
97 } LDIFFP;
98 
99 LDAP_LDIF_F( LDIFFP * )
100 ldif_open LDAP_P(( LDAP_CONST char *file, LDAP_CONST char *mode ));
101 
102 LDAP_LDIF_F( void )
103 ldif_close LDAP_P(( LDIFFP * ));
104 
105 LDAP_LDIF_F( int )
106 ldif_read_record LDAP_P((
107 	LDIFFP *fp,
108 	unsigned long *lineno,
109 	char **bufp,
110 	int *buflen ));
111 
112 LDAP_LDIF_F( int )
113 ldif_must_b64_encode_register LDAP_P((
114 	LDAP_CONST char *name,
115 	LDAP_CONST char *oid ));
116 
117 LDAP_LDIF_F( void )
118 ldif_must_b64_encode_release LDAP_P(( void ));
119 
120 #define LDIF_PUT_NOVALUE	0x0000	/* no value */
121 #define LDIF_PUT_VALUE		0x0001	/* value w/ auto detection */
122 #define LDIF_PUT_TEXT		0x0002	/* assume text */
123 #define	LDIF_PUT_BINARY		0x0004	/* assume binary (convert to base64) */
124 #define LDIF_PUT_B64		0x0008	/* pre-converted base64 value */
125 
126 #define LDIF_PUT_COMMENT	0x0010	/* comment */
127 #define LDIF_PUT_URL		0x0020	/* url */
128 #define LDIF_PUT_SEP		0x0040	/* separator */
129 
130 LDAP_LDIF_F( void )
131 ldif_sput LDAP_P((
132 	char **out,
133 	int type,
134 	LDAP_CONST char *name,
135 	LDAP_CONST char *val,
136 	ber_len_t vlen ));
137 
138 LDAP_LDIF_F( void )
139 ldif_sput_wrap LDAP_P((
140 	char **out,
141 	int type,
142 	LDAP_CONST char *name,
143 	LDAP_CONST char *val,
144 	ber_len_t vlen,
145         ber_len_t wrap ));
146 
147 LDAP_LDIF_F( char * )
148 ldif_put LDAP_P((
149 	int type,
150 	LDAP_CONST char *name,
151 	LDAP_CONST char *val,
152 	ber_len_t vlen ));
153 
154 LDAP_LDIF_F( char * )
155 ldif_put_wrap LDAP_P((
156 	int type,
157 	LDAP_CONST char *name,
158 	LDAP_CONST char *val,
159 	ber_len_t vlen,
160 	ber_len_t wrap ));
161 
162 LDAP_LDIF_F( int )
163 ldif_is_not_printable LDAP_P((
164 	LDAP_CONST char *val,
165 	ber_len_t vlen ));
166 
167 LDAP_END_DECL
168 
169 #endif /* _LDIF_H */
170