1 /*        $NetBSD: ldif.h,v 1.3 2021/08/14 16:14:55 christos Exp $    */
2 
3 /* $OpenLDAP$ */
4 /* This work is part of OpenLDAP Software <http://www.openldap.org/>.
5  *
6  * Copyright 1998-2021 The OpenLDAP Foundation.
7  * All rights reserved.
8  *
9  * Redistribution and use in source and binary forms, with or without
10  * modification, are permitted only as authorized by the OpenLDAP
11  * Public License.
12  *
13  * A copy of this license is available in file LICENSE in the
14  * top-level directory of the distribution or, alternatively, at
15  * <http://www.OpenLDAP.org/license.html>.
16  */
17 /* Portions Copyright (c) 1996 Regents of the University of Michigan.
18  * All rights reserved.
19  *
20  * Redistribution and use in source and binary forms are permitted
21  * provided that this notice is preserved and that due credit is given
22  * to the University of Michigan at Ann Arbor. The name of the University
23  * may not be used to endorse or promote products derived from this
24  * software without specific prior written permission. This software
25  * is provided ``as is'' without express or implied warranty.
26  */
27 
28 #ifndef _LDIF_H
29 #define _LDIF_H
30 
31 #include <ldap_cdefs.h>
32 
33 LDAP_BEGIN_DECL
34 
35 /* This is NOT a bogus extern declaration (unlike ldap_debug) */
36 LDAP_LDIF_V (int) ldif_debug;
37 
38 #define LDIF_LINE_WIDTH      78      /* default maximum length of LDIF lines */
39 #define LDIF_LINE_WIDTH_MAX  ((ber_len_t)-1) /* maximum length of LDIF lines */
40 #define LDIF_LINE_WIDTH_WRAP(wrap) ((wrap) == 0 ? LDIF_LINE_WIDTH : (wrap))
41 
42 /*
43  * Macro to calculate maximum number of bytes that the base64 equivalent
44  * of an item that is "len" bytes long will take up.  Base64 encoding
45  * uses one byte for every six bits in the value plus up to two pad bytes.
46  */
47 #define LDIF_BASE64_LEN(len)  (((len) * 4 / 3 ) + 3)
48 
49 /*
50  * Macro to calculate maximum size that an LDIF-encoded type (length
51  * tlen) and value (length vlen) will take up:  room for type + ":: " +
52  * first newline + base64 value + continued lines.  Each continued line
53  * needs room for a newline and a leading space character.
54  */
55 #define LDIF_SIZE_NEEDED(nlen,vlen) LDIF_SIZE_NEEDED_WRAP(nlen, vlen, 0)
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 /* ldif_open equivalent that opens ldif stream in memory rather than from file */
103 LDAP_LDIF_F( LDIFFP * )
104 ldif_open_mem LDAP_P(( char *ldif, size_t size, LDAP_CONST char *mode ));
105 
106 LDAP_LDIF_F( void )
107 ldif_close LDAP_P(( LDIFFP * ));
108 
109 LDAP_LDIF_F( int )
110 ldif_read_record LDAP_P((
111           LDIFFP *fp,
112           unsigned long *lineno,
113           char **bufp,
114           int *buflen ));
115 
116 LDAP_LDIF_F( int )
117 ldif_must_b64_encode_register LDAP_P((
118           LDAP_CONST char *name,
119           LDAP_CONST char *oid ));
120 
121 LDAP_LDIF_F( void )
122 ldif_must_b64_encode_release LDAP_P(( void ));
123 
124 #define LDIF_PUT_NOVALUE      0x0000    /* no value */
125 #define LDIF_PUT_VALUE                  0x0001    /* value w/ auto detection */
126 #define LDIF_PUT_TEXT                   0x0002    /* assume text */
127 #define   LDIF_PUT_BINARY               0x0004    /* assume binary (convert to base64) */
128 #define LDIF_PUT_B64                    0x0008    /* pre-converted base64 value */
129 
130 #define LDIF_PUT_COMMENT      0x0010    /* comment */
131 #define LDIF_PUT_URL                    0x0020    /* url */
132 #define LDIF_PUT_SEP                    0x0040    /* separator */
133 
134 LDAP_LDIF_F( void )
135 ldif_sput LDAP_P((
136           char **out,
137           int type,
138           LDAP_CONST char *name,
139           LDAP_CONST char *val,
140           ber_len_t vlen ));
141 
142 LDAP_LDIF_F( void )
143 ldif_sput_wrap LDAP_P((
144           char **out,
145           int type,
146           LDAP_CONST char *name,
147           LDAP_CONST char *val,
148           ber_len_t vlen,
149         ber_len_t wrap ));
150 
151 LDAP_LDIF_F( char * )
152 ldif_put LDAP_P((
153           int type,
154           LDAP_CONST char *name,
155           LDAP_CONST char *val,
156           ber_len_t vlen ));
157 
158 LDAP_LDIF_F( char * )
159 ldif_put_wrap LDAP_P((
160           int type,
161           LDAP_CONST char *name,
162           LDAP_CONST char *val,
163           ber_len_t vlen,
164           ber_len_t wrap ));
165 
166 LDAP_LDIF_F( int )
167 ldif_is_not_printable LDAP_P((
168           LDAP_CONST char *val,
169           ber_len_t vlen ));
170 
171 LDAP_END_DECL
172 
173 #endif /* _LDIF_H */
174