Home | History | Annotate | Download | only in libnisdb
      1 /*
      2  * CDDL HEADER START
      3  *
      4  * The contents of this file are subject to the terms of the
      5  * Common Development and Distribution License, Version 1.0 only
      6  * (the "License").  You may not use this file except in compliance
      7  * with the License.
      8  *
      9  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
     10  * or http://www.opensolaris.org/os/licensing.
     11  * See the License for the specific language governing permissions
     12  * and limitations under the License.
     13  *
     14  * When distributing Covered Code, include this CDDL HEADER in each
     15  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
     16  * If applicable, add the following below this CDDL HEADER, with the
     17  * fields enclosed by brackets "[]" replaced with your own identifying
     18  * information: Portions Copyright [yyyy] [name of copyright owner]
     19  *
     20  * CDDL HEADER END
     21  */
     22 /*
     23  * Copyright 2001-2003 Sun Microsystems, Inc.  All rights reserved.
     24  * Use is subject to license terms.
     25  */
     26 
     27 #pragma ident	"%Z%%M%	%I%	%E% SMI"
     28 
     29 #ifndef	_LDAP_PARSE_H
     30 #define	_LDAP_PARSE_H
     31 
     32 #include <lber.h>
     33 #include <ldap.h>
     34 #include <rpcsvc/nis.h>
     35 
     36 #include "nis_hashitem.h"
     37 
     38 /* Pick up N2L file names */
     39 #include <ndbm.h>
     40 #include "yptol/shim.h"
     41 #include "yptol/yptol.h"
     42 
     43 #ifdef	__cplusplus
     44 extern "C" {
     45 #endif
     46 
     47 /*
     48  * New <ldap.h> doesn't define LDAP_SCOPE_UNKNOWN, but we still need it.
     49  */
     50 #ifndef	LDAP_SCOPE_UNKNOWN
     51 #define	LDAP_SCOPE_UNKNOWN	0xFF
     52 #endif
     53 
     54 /* Attribute/value hash list element */
     55 typedef struct {
     56 	__nis_hash_item_mt	item;		/* item.name is the attr name */
     57 	int			numValues;
     58 	char			**value;	/* Array of values */
     59 	bool_t			isDefault;	/* True if value is a default */
     60 } __nis_ldap_attribute_t;
     61 
     62 /* YP Domains structure */
     63 typedef struct {
     64 	int	numDomains;	/* number of domains listed in mapping file */
     65 	char	**domainLabels;	/* the labels for particular domain names */
     66 	char	**domains;		/* Array of LDAP domains */
     67 	int	numYppasswdd;	/* Number of yppasswddDomainLabels */
     68 	char	**yppasswddDomainLabels;	/* yppasswdd domain labels */
     69 } __yp_domain_context_t;
     70 
     71 /*
     72  * Begin object mappings
     73  *
     74  * Note that the definitions, where necessary, proceed from the bottom
     75  * (i.e., the "atomic" components) up.
     76  */
     77 
     78 /*
     79  * String match/print descriptor
     80  *
     81  * Intended for use together with a __nis_mapping_match_type_t, which will
     82  * determine which field of the union is valid.
     83  *
     84  * string	Pointer to a NUL-terminated string
     85  * single	Represents a single-character match such as '[a-bTe-w]',
     86  *		which would become
     87  *			{
     88  *				3,				numRange
     89  *				{'a', 'T', 'e'},		lo
     90  *				{'b', 'T', 'w'}			hi
     91  *			}
     92  *		Each pair lo[i]/hi[i] (0 <= i < numRange) defines the
     93  *		range of the wild-card match.
     94  * limit	No use currrently defined; will probably be removed
     95  * berString	Pointer to a string containing a single formatting
     96  *		character as defined by ber_printf(3LDAP). Example: "i"
     97  *		for a binary integer.
     98  */
     99 typedef union {
    100 	char				*string;
    101 	struct {
    102 		int		numRange;
    103 		unsigned char	*lo;		/* Array of numRange elements */
    104 		unsigned char	*hi;		/* Array of numRange elements */
    105 	}				single;
    106 	enum {
    107 		bos,
    108 		eos
    109 	}				limit;
    110 	char				*berString;
    111 } __nis_mapping_match_t;
    112 
    113 /*
    114  * String match/print types and descriptor
    115  *
    116  * Used to describe print or match conversions. The 'match' field has
    117  * the following interpretation:
    118  *
    119  * Type		__nis_mapping_match_t	Comment
    120  *
    121  * mmt_item		<unused>	Value as indicated by corresponding
    122  *					element in __nis_mapping_item_t or
    123  *					__nis_mapping_sub_element_t array
    124  * mmt_string		string
    125  * mmt_single		single
    126  * mmt_limit		limit		Probably not needed
    127  * mmt_any		<unused>	Match any number of any character
    128  * mmt_berstring	berString
    129  * mmt_begin		<unused>	Indicates beginning of format; optional
    130  * mmt_end		<unused>	Indicates end of format; REQUIRED to
    131  *					mark the end of an array of
    132  *					__nis_mapping_format_t's
    133  */
    134 typedef enum {mmt_item, mmt_string, mmt_single, mmt_limit, mmt_any,
    135 		mmt_berstring, mmt_begin, mmt_end}
    136 	__nis_mapping_match_type_t;
    137 
    138 typedef struct {
    139 	__nis_mapping_match_type_t	type;
    140 	__nis_mapping_match_t		match;
    141 } __nis_mapping_format_t;
    142 
    143 /* Forward */
    144 struct __nis_mapping_element_struct;
    145 struct __nis_mapping_item_struct;
    146 
    147 /*
    148  * LDAP search triple
    149  *
    150  * Used to represent a search triple like
    151  *	ou=Group,?one?cn=staff
    152  * or
    153  *	ou=Group,?one?(&(cn=staff)(gidNumber=10))
    154  * or
    155  *	ou=Hosts,?one?("cn=%s", (cname, "%s.*"))
    156  *
    157  * base		The base DN; defaultSearchBase appended if 'base' ends with
    158  *		a comma.
    159  * scope	One of LDAP_SCOPE_BASE, LDAP_SCOPE_ONELEVEL, or
    160  *		LDAP_SCOPE_SUBTREE; LDAP_SCOPE_UNKNOWN means that this
    161  *		__nis_search_triple_t is inactive
    162  * attrs	Either a filter, or a list of attribute/value pairs, depending
    163  *		on context.
    164  * element	Pointer to a value element. If 'element' is non-NULL, the
    165  *		'attrs' value is derived by evaluating 'element'.
    166  */
    167 typedef struct {
    168 	char					*base;
    169 	int					scope;
    170 	char					*attrs;
    171 	struct __nis_mapping_element_struct	*element;
    172 } __nis_search_triple_t;
    173 
    174 /*
    175  * NIS+ index spec
    176  *
    177  * Represents a NIS+ index list, such as
    178  *	name=staff,gid=10
    179  *
    180  * numIndexes	The number of entries in the 'name'/'value' arrays
    181  * name		Array of column names
    182  * value	Array of column values; uses __nis_mapping_format_t so that
    183  *		wild-cards can be represented
    184  *
    185  * Example
    186  *		name=staff,gid=10
    187  *	2,						numIndexes
    188  *	{						name
    189  *		"name",
    190  *		"gid"
    191  *	},
    192  *	{						value
    193  *		{
    194  *			{mmt_begin},
    195  *			{mmt_string, "staff"},
    196  *			{mmt_end}
    197  *		},
    198  *		{
    199  *			{mmt_begin},
    200  *			{mmt_string, "gid"},
    201  *			{mmt_end}
    202  *		}
    203  *	}
    204  */
    205 typedef struct {
    206 	int			numIndexes;
    207 	char			**name;
    208 	__nis_mapping_format_t	**value;
    209 } __nis_index_t;
    210 
    211 /* What to do with the LDAP data when a NIS+ entry is deleted */
    212 typedef enum {dd_always, dd_perDbId, dd_never} __nis_delete_disp_t;
    213 
    214 /* Type of an element in a mapping rule */
    215 typedef enum {me_item, me_print, me_split, me_match, me_extract}
    216 	__nis_mapping_element_type_t;
    217 
    218 /* Type of an item in a mapping rule */
    219 typedef enum {mit_any, mit_nisplus, mit_ldap}	__nis_mapping_item_type_t;
    220 
    221 /*
    222  * NIS+ object name, with index
    223  *
    224  * Used to represent a name like
    225  *	[name = staff, gid = 10]group.org_dir
    226  * (Note: spaces around "=" and after "," to make cstyle happy; such spaces
    227  * are not usually part of the syntax, but they are allowed.)
    228  *
    229  * index	The index part of the name. numIndexes == 0 means there is
    230  *		no index.
    231  * name		The object name proper. If it doesn't end in a dot, the
    232  *		nisplusLDAPbaseDomain is appended.
    233  */
    234 typedef struct {
    235 	__nis_index_t		index;
    236 	char			*name;
    237 } __nis_obj_spec_t;
    238 
    239 /*
    240  * Complete representation of a subset of either the DIT or a NIS+ object.
    241  * Intended for use in a __nis_mapping_item_t, where the 'type' field
    242  * determines which field of the __nis_triple_or_obj_t is active.
    243  */
    244 typedef union {
    245 	__nis_search_triple_t	triple;
    246 	__nis_obj_spec_t	obj;
    247 } __nis_triple_or_obj_t;
    248 
    249 /*
    250  * Mapping item
    251  *
    252  * The mapping item is a single LDAP attribute, or a NIS+ table column, such as
    253  *	ldap:gidNumber:ou=Group, ?one?cn=staff
    254  * or
    255  *	nisplus:gid[name = staff]group.org_dir
    256  * (Note: spaces around "=" and after "," to make cstyle happy; such spaces
    257  * are not usually part of the syntax, but they are allowed.)
    258  *
    259  * type		mit_ldap or mit_nisplus
    260  * name		Attribute/column name
    261  * searchSpec	LDAP search triple, or NIS+ indexed object name
    262  * repeat	True if item should be repeated if necessary. This is used
    263  *		to represent implied lists, such as '(memberUid)', which
    264  *		denotes all values of the 'memberUid' attribute.
    265  * exItem forward mapping item for supporting removespec syntax.
    266  *
    267  */
    268 typedef struct __nis_mapping_item_struct {
    269 	__nis_mapping_item_type_t	type;
    270 	char				*name;
    271 	__nis_triple_or_obj_t		searchSpec;
    272 	bool_t				repeat;
    273 	struct				__nis_mapping_item_struct	*exItem;
    274 } __nis_mapping_item_t;
    275 
    276 /*
    277  * Sub-element of a mapping rule element
    278  *
    279  * Each element/sub-element represents the value(s) derived according to
    280  * the semantics of the element. Although not explicitly represented here,
    281  * values are either strings or BER byte sequences.
    282  *
    283  * type			Type of the 'element' union
    284  * element.item		A single item
    285  * element.print	printf(3C)-style value
    286  *	fmt		Array of formatting elements, terminated by 'mmt_end'
    287  *	numItems	Number of items in the 'item' array
    288  *	item		Array of 'numItems' items
    289  *	doElide		Should the last character of the (string) value be
    290  *			removed ?
    291  *	elide		Character to be removed
    292  * element.split	Item value string split into multiple values
    293  *	item		A single item
    294  *	delim		The separator character for the split
    295  * element.extract	Extraction of a sub-string from an item value
    296  *	fmt		Array of formatting elements, terminated by 'mmt_end'
    297  *	item		A single item
    298  *
    299  * Examples (see __nis_mapping_element_t below for examples using the 'item'
    300  * field of __nis_mapping_sub_element_t). For notational convenience,
    301  * __nis_mapping_item_t's are shortened to just the item name.
    302  *
    303  * (1)	String value consisting of the string "{crypt}" followed by the
    304  *	value of the 'passwd' column. The NIS+LDAPmapping(4) representation
    305  *	is
    306  *		("{crypt}%s", passwd)
    307  *	and the element.print contains
    308  *		{					fmt
    309  *			{mmt_begin},
    310  *			{mmt_string, "{crypt}"},
    311  *			{mmt_item},
    312  *			{mmt_end}
    313  *		},
    314  *		1,					numItems
    315  *		{					item
    316  *			{"passwd"}
    317  *		}
    318  *		FALSE,					doElide
    319  *		'\0'					elide (unused)
    320  *
    321  * (2)	Split a value such as "member1,member2,member3" into multiple
    322  *	(three, here) values using ',' as the separator.
    323  *		(members, ",")
    324  *	element.split
    325  *		{"members"},				item
    326  *		','					delim
    327  *
    328  * (3)	Given a 'cname' column with the value "some.dom.ain.", extract
    329  *	"some", which becomes the value of the expression.
    330  *		(cname, "%s.*")
    331  *	element.extract
    332  *		{					fmt
    333  *			{mmt_begin},
    334  *			{mmt_item},
    335  *			{mmt_string, "."},
    336  *			{mmt_any},
    337  *			{mmt_end}
    338  *		},
    339  *		{"cname"}				item
    340  */
    341 typedef struct {
    342 	__nis_mapping_element_type_t				type;
    343 	union {
    344 		__nis_mapping_item_t				item;
    345 		struct {
    346 			__nis_mapping_format_t		*fmt;
    347 			int				numItems;
    348 			__nis_mapping_item_t		*item;
    349 			bool_t				doElide;
    350 			unsigned char			elide;
    351 		}						print;
    352 		struct {
    353 			__nis_mapping_item_t		item;
    354 			unsigned char			delim;
    355 		}						split;
    356 		struct {
    357 			__nis_mapping_format_t		*fmt;
    358 			__nis_mapping_item_t		item;
    359 		}						extract;
    360 	} element;
    361 } __nis_mapping_sub_element_t;
    362 
    363 /*
    364  * Mapping rule element
    365  *
    366  * Each element/sub-element represents the value(s) derived according to
    367  * the semantics of the element. Although not explicitly represented here,
    368  * values are either strings or BER byte sequences.
    369  *
    370  * type			Type of the 'element' union
    371  * element.item		A single item
    372  * element.print	printf(3C)-style value
    373  *	fmt		Array of formatting elements, terminated by 'mmt_end'
    374  *	numSubElements	Number of sub-elements in the 'subElement' array
    375  *	subElement	Array of 'numSubElements' sub-elements
    376  *	doElide		Should the last character of the (string) value(s) be
    377  *			removed ?
    378  *	elide		Character to be removed
    379  * element.split	Item value string split into multiple values
    380  *	item		A single item
    381  *	delim		The separator character for the split
    382  * element.match	Assignment of item values by matching to a format
    383  *	fmt		Array of formatting elements, terminated by 'mmt_end'
    384  *	numItems	Number of items in the 'item' array
    385  *	item		Array of 'numItems' items
    386  * element.extract	Extraction of a sub-string from an item value
    387  *	fmt		Array of formatting elements, terminated by 'mmt_end'
    388  *	item		A single item
    389  *
    390  * Examples; items represented by just the item name.
    391  *
    392  * (1)	The value of the 'name' column.
    393  *		name
    394  *	element.item
    395  *		{"name"}				item
    396  *
    397  * (2)	Example (1) for a sub-element showed how to construct a value from
    398  *	a printf(3C)-style format string and one or more item values.
    399  *	However that example is only valid when used as a sub-expression
    400  *	(in place of an item in a 'print' list, for example). If
    401  *		("{crypt}%s", passwd)
    402  *	was part of a rule like
    403  *		userPassword=("{crypt}%s", passwd)
    404  *	the representation would use a __nis_mapping_element_t as follows.
    405  *	element.print
    406  *		{					fmt
    407  *			{mmt_begin},
    408  *			{mmt_string, "{crypt}"},
    409  *			{mmt_item},
    410  *			{mmt_end}
    411  *		},
    412  *		1,					numSubElements
    413  *		{					subElement
    414  *			me_item,				type
    415  *			{"passwd"}				item
    416  *		},
    417  *		FALSE,					doElide
    418  *		'\0'					elide (unused)
    419  *
    420  * (3)	Match a value such as "{dh-1024}abcdef000234" to a template format
    421  *	"{%s}%s", assign "dh-1024" to the 'auth_type' column, and
    422  *	"abcdef000234" to the 'public_data' column.
    423  *		("{%s}%s", auth_type, public_data)
    424  *	element.match
    425  *		{					fmt
    426  *			{mmt_begin},
    427  *			{mmt_string, "{"},
    428  *			{mmt_item},
    429  *			{mmt_string, "}"},
    430  *			{mmt_item},
    431  *			{mmt_end}
    432  *		}
    433  *		2,					numItems
    434  *		{					item
    435  *			{"auth_type"},
    436  *			{"public_data"}
    437  *		}
    438  */
    439 typedef struct __nis_mapping_element_struct {
    440 	__nis_mapping_element_type_t				type;
    441 	union {
    442 		__nis_mapping_item_t				item;
    443 		struct {
    444 			__nis_mapping_format_t		*fmt;
    445 			int				numSubElements;
    446 			__nis_mapping_sub_element_t	*subElement;
    447 			bool_t				doElide;
    448 			unsigned char			elide;
    449 		}						print;
    450 		struct {
    451 			__nis_mapping_item_t		item;
    452 			unsigned char			delim;
    453 		}						split;
    454 		struct {
    455 			__nis_mapping_format_t		*fmt;
    456 			int				numItems;
    457 			__nis_mapping_item_t		*item;
    458 		}						match;
    459 		struct {
    460 			__nis_mapping_format_t		*fmt;
    461 			__nis_mapping_item_t		item;
    462 		}						extract;
    463 	} element;
    464 } __nis_mapping_element_t;
    465 
    466 /*
    467  * One side (left or right) of a mapping rule
    468  *
    469  * Example
    470  *	The rule
    471  *		userPassword=("{crypt}%s", passwd)
    472  *	would be reprsented by a __nis_mapping_rule_t as follows
    473  *		{					lhs
    474  *			1,					numElements
    475  *			{					element
    476  *				me_item,
    477  *				{"userPassword"}
    478  *			}
    479  *		},
    480  *		{					rhs
    481  *			1,					numElements
    482  *			{					element
    483  *				me_print,
    484  *				{
    485  *						See example (2) under
    486  *						__nis_mapping_element_t
    487  *						above
    488  *				}
    489  *			}
    490  *		}
    491  */
    492 typedef struct {
    493 	int			numElements;
    494 	__nis_mapping_element_t	*element;
    495 } __nis_mapping_rlhs_t;
    496 
    497 /* A single mapping rule: attribute -> column or column -> attribute */
    498 typedef struct {
    499 	__nis_mapping_rlhs_t	lhs;
    500 	__nis_mapping_rlhs_t	rhs;
    501 } __nis_mapping_rule_t;
    502 
    503 /*
    504  * Map (sub-set of) NIS+ object to location(s) in the LDAP DB
    505  *
    506  * read		base/scope/filter triple used to read data from LDAP;
    507  *		LDAP_SCOPE_UNKNOWN indicates that 'read' is unused
    508  * write	base/scope/attrlist triple used to write data to LDAP;
    509  *		LDAP_SCOPE_UNKNOWN indicates that 'write' is unused
    510  * delDisp	What should happen to the LDAP entry when the corresponding
    511  *		NIS+ data is deleted.
    512  * dbIdName	The dbId for the delete rule set (if any)
    513  * numDbIds	The number of rules in the 'dbId' rule set
    514  * dbId		The delete rule set; this field must point to a valid
    515  *		rule set if 'delDisp' is 'dd_perDbId'; ignored otherwise
    516  * next		Pointer to the next __nis_object_dn_t structure for this
    517  *		NIS+ object.
    518  *
    519  * Example
    520  *	The "group.org_dir.x.y.z." NIS+ table should be read from and
    521  *	written to the "ou=Group" container at "dc=x,dc=y,dc=z". Upon
    522  *	NIS+ entry deletion, we should always attempt to delete the
    523  *	corresponding LDAP attributes.
    524  *
    525  *	{						read
    526  *		"ou=Group,dc=x,dc=y,dc=z",
    527  *		LDAP_SCOPE_ONELEVEL,
    528  *		"objectClass=posixGroup"
    529  *	},
    530  *	{						write
    531  *		"ou=Group,dc=x,dc=y,dc=z",
    532  *		LDAP_SCOPE_ONELEVEL,
    533  *		"objectClass=posixGroup"
    534  *	},
    535  *	dd_always,					delDisp
    536  *	NULL,						dbIdName
    537  *	0,
    538  *	NULL,						dbId
    539  *	NULL						next
    540  */
    541 typedef struct {
    542 	__nis_search_triple_t	read;
    543 	__nis_search_triple_t	write;
    544 	__nis_delete_disp_t	delDisp;
    545 	char			*dbIdName;
    546 	int			numDbIds;
    547 	__nis_mapping_rule_t	**dbId;		/* Delete rule set */
    548 	void			*next;
    549 } __nis_object_dn_t;
    550 
    551 /*
    552  * Per-dbId or -object mapping
    553  *
    554  * Initially collected per-dbId (so that item.name=dbId), the
    555  * __nis_table_mapping_t's are later stored per-object (whereupon
    556  * item.name=objName).
    557  *
    558  * item			Structure used by the hash_item functions
    559  * dbId			The dbId associated with the __nis_table_mapping_t
    560  *			structure
    561  * index		Object sub-set specification; only defined for
    562  *			tables; index.numIndexes equal to zero means that
    563  *			the 'index' is unused.
    564  * next			Pointer to next table sub-set, if any
    565  * numColumns	Number of columns if the object is a table
    566  * column		Column names
    567  * initTtlLo	Lower limit on the initial TTL
    568  * initTtlHi	Upper limit on the initial TTL
    569  * ttl			TTL set after refresh
    570  * commentChar	NIS map comment character
    571  * objectDN		Location in the LDAP DB
    572  * numSplits	number of split fields
    573  * separatorStr separator string to break up NIS split field attributes
    574  * usedns_flag  indicates if the -b option to makedbm is used for a map.
    575  * securemap_flag indicates if the -s option to makedbm is used for a map.
    576  * __nis_mapping_element_t Parsed format strings and name fields storage
    577  * numRulesFromLDAP	Number of rules (and hence elements in the
    578  *			'ruleFromLDAP' array) for mapping LDAP entries
    579  *			to NIS+ objects
    580  * ruleFromLDAP
    581  * numRulesToLDAP	Number of rules (and hence elements in the
    582  *			'ruleToLDAP' array) for mapping NIS+ objects to
    583  *			LDAP entries
    584  * ruleToLDAP
    585  * objType		The NIS+ object type; NIS_BOGUS_OBJ used to indicate
    586  *			not set (in which case the other object data fields
    587  *			should be assumed to be invalid)
    588  * objName		The fully qualified name of the NIS+ object
    589  * objPath		The name used internally by libnisdb (which
    590  *			is path to the data file for the table/directory
    591  *			containing the object)
    592  * obj			A copy of the object itself
    593  * isMaster		Set if this machine is the master for the object
    594  *			(actually for the directory containing it)
    595  * seq_num	A sequence number representing the order of the maps
    596  *			as listed in the NISLDAPmapping.template file.
    597  *
    598  * Example
    599  *	Map the subset of the NIS+ 'group.org_dir.x.y.z.' table for which
    600  *	is true that the 'name' starts with 'a' or 'o' to location per
    601  *	the __nis_object_dn_t example above. No translation rules.
    602  *
    603  *		{					item
    604  *			"group.org_dir.x.y.z."			name
    605  *			<omitted>
    606  *		},
    607  *		"group_subset",				dbId
    608  *		1,					numIndexes
    609  *		{					index
    610  *			1,
    611  *			{"name"},
    612  *			{
    613  *				{mmt_begin},
    614  *				{
    615  *					mmt_single,
    616  *					2,
    617  *					{'a', 'o'},
    618  *					{'a', 'o'},
    619  *				}
    620  *				{mmt_any},
    621  *				{mmt_end}
    622  *			}
    623  *		}
    624  *		NULL,					next
    625  *		4,					numColumns
    626  *		{					column
    627  *			"name",
    628  *			"passwd",
    629  *			"gid",
    630  *			"members"
    631  *		},
    632  *		1800,					initTtlLo
    633  *		5400,					initTtlHi
    634  *		3600,					ttl
    635  *		'#',					commentChar
    636  *		<see __nis_object_dn_t example>,	objectDN
    637  *		0,						numSplits
    638  *		NULL,					separatorStr
    639  *		0,						usedns_flag
    640  *		0, 						securemap_flag
    641  *		<see __nis_mapping_element_t example>, e
    642  *		0,					numRulesFromLDAP
    643  *		NULL,					ruleFromLDAP
    644  *		0,					numRulesToLDAP
    645  *		NULL					ruleToLDAP
    646  *		NIS_TABLE_OBJ,				objType
    647  *		"group.org_dir.x.y.z.",			objName
    648  *		"/var/nis/data/group.org_dir"		objPath
    649  *		<pointer to NIS+ object>		obj
    650  *		1					isMaster
    651  */
    652 typedef struct {
    653 	__nis_hash_item_mt	item;		/* item.name=dbId||objName */
    654 	char			*dbId;		/* Used during initializaton */
    655 	__nis_index_t		index;
    656 	void			*next;		/* Next sub-set spec */
    657 	void			*seqNext;	/* Next in config sequence */
    658 	int				numColumns;
    659 	char			**column;
    660 	time_t			initTtlLo;
    661 	time_t			initTtlHi;
    662 	time_t			ttl;
    663 	char			commentChar;
    664 	__nis_object_dn_t	*objectDN;
    665 	int				numSplits;
    666 	char			*separatorStr;
    667 	int				usedns_flag;
    668 	int				securemap_flag;
    669 	__nis_mapping_element_t	*e;
    670 	int			numRulesFromLDAP;
    671 	__nis_mapping_rule_t	**ruleFromLDAP;
    672 	int			numRulesToLDAP;
    673 	__nis_mapping_rule_t	**ruleToLDAP;
    674 /*
    675  * The following fields contain information about the mapped object.
    676  */
    677 	zotypes			objType;
    678 	char			*objName;	/* FQ object name */
    679 	char			*objPath;	/* nisdb's internal name */
    680 	nis_object		*obj;		/* NIS+ object */
    681 	int			isMaster;	/* Master for this object ? */
    682 	int			seq_num;
    683 } __nis_table_mapping_t;
    684 
    685 /* End object mappings */
    686 
    687 /* Default config file paths */
    688 #define	DEFAULTCONFFILE	"/var/nis/NIS+LDAPmapping"
    689 #define	ETCCONFFILE	"/etc/default/rpc.nisd"
    690 #define	YP_DEFAULTCONFFILE	NTOL_MAP_FILE
    691 #define	YP_ETCCONFFILE	NTOL_CONFIG_FILE
    692 
    693 /* Path to the root object dir file */
    694 #define	ROOTDIRFILE	"/var/nis/data/root_dir"
    695 /* Path to the root object file */
    696 #define	ROOTOBJFILE	"/var/nis/data/root.object"
    697 
    698 extern __nis_table_mapping_t	*ldapMappingSeq;
    699 extern int yp2ldap;
    700 
    701 /* Exported functions */
    702 int			parseConfig(char **ldapCLA, char *ldapConfFile);
    703 int			linked2hash(__nis_table_mapping_t *tlist);
    704 int			dbids2objs(__nis_hash_table_mt *objs,
    705 				__nis_hash_table_mt *dbids);
    706 void			__make_legal(char *s);
    707 char			*internal_table_name(nis_name name, char *res);
    708 nis_name		relative_name(char *s);
    709 char			*internalTableName(char *name);
    710 __nis_table_mapping_t	*getObjMapping(char *name, char *intNameArg,
    711 				int asObj,
    712 				int *doRead, int *doWrite);
    713 
    714 #ifdef	__cplusplus
    715 }
    716 #endif	/* __cplusplus */
    717 
    718 #endif	/* _LDAP_PARSE_H */
    719