10Sstevel@tonic-gate /*
20Sstevel@tonic-gate * CDDL HEADER START
30Sstevel@tonic-gate *
40Sstevel@tonic-gate * The contents of this file are subject to the terms of the
51450Sjanga * Common Development and Distribution License (the "License").
61450Sjanga * You may not use this file except in compliance with the License.
70Sstevel@tonic-gate *
80Sstevel@tonic-gate * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
90Sstevel@tonic-gate * or http://www.opensolaris.org/os/licensing.
100Sstevel@tonic-gate * See the License for the specific language governing permissions
110Sstevel@tonic-gate * and limitations under the License.
120Sstevel@tonic-gate *
130Sstevel@tonic-gate * When distributing Covered Code, include this CDDL HEADER in each
140Sstevel@tonic-gate * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
150Sstevel@tonic-gate * If applicable, add the following below this CDDL HEADER, with the
160Sstevel@tonic-gate * fields enclosed by brackets "[]" replaced with your own identifying
170Sstevel@tonic-gate * information: Portions Copyright [yyyy] [name of copyright owner]
180Sstevel@tonic-gate *
190Sstevel@tonic-gate * CDDL HEADER END
200Sstevel@tonic-gate */
211676Sjpk
220Sstevel@tonic-gate /*
23*12788Sgary.winiger@oracle.com * Copyright (c) 1999, 2010, Oracle and/or its affiliates. All rights reserved.
240Sstevel@tonic-gate */
250Sstevel@tonic-gate
260Sstevel@tonic-gate #include <ctype.h>
270Sstevel@tonic-gate #include <libintl.h>
280Sstevel@tonic-gate #include <strings.h>
290Sstevel@tonic-gate #include <stdio.h>
301676Sjpk #include <tsol/label.h>
310Sstevel@tonic-gate #include "../../../lib/libsldap/common/ns_sldap.h"
320Sstevel@tonic-gate
330Sstevel@tonic-gate
340Sstevel@tonic-gate #define SAME 0
350Sstevel@tonic-gate
360Sstevel@tonic-gate struct mapping {
370Sstevel@tonic-gate char *database;
380Sstevel@tonic-gate char *def_type;
390Sstevel@tonic-gate char *objectclass;
400Sstevel@tonic-gate char *actual_db;
410Sstevel@tonic-gate };
420Sstevel@tonic-gate
430Sstevel@tonic-gate #define PUBLICKEY 0
440Sstevel@tonic-gate
450Sstevel@tonic-gate static struct mapping maplist[] = {
460Sstevel@tonic-gate {"publickey", "uidnumber", "niskeyobject", "passwd"},
470Sstevel@tonic-gate {"publickey", "cn", "niskeyobject", "host"},
480Sstevel@tonic-gate {"bootparams", "cn", "bootableDevice", NULL},
490Sstevel@tonic-gate {"ethers", "cn", "ieee802Device", NULL},
500Sstevel@tonic-gate {"group", "cn", "posixgroup", NULL},
510Sstevel@tonic-gate {"hosts", "cn", "iphost", NULL},
520Sstevel@tonic-gate {"ipnodes", "cn", "iphost", NULL},
530Sstevel@tonic-gate {"netgroup", "cn", "nisnetgroup", NULL},
540Sstevel@tonic-gate {"netmasks", "ipnetworknumber", "ipnetwork", NULL},
550Sstevel@tonic-gate {"networks", "ipnetworknumber", "ipnetwork", NULL},
560Sstevel@tonic-gate {"passwd", "uid", "posixaccount", NULL},
570Sstevel@tonic-gate {"protocols", "cn", "ipprotocol", NULL},
580Sstevel@tonic-gate {"rpc", "cn", "oncrpc", NULL},
590Sstevel@tonic-gate {"services", "cn", "ipservice", NULL},
600Sstevel@tonic-gate {"aliases", "cn", "mailGroup", NULL},
610Sstevel@tonic-gate {"project", "SolarisProjectID", "SolarisProject", NULL},
620Sstevel@tonic-gate {"printers", "printer-uri", "sunPrinter", NULL},
630Sstevel@tonic-gate {"shadow", "uid", "shadowaccount", NULL},
640Sstevel@tonic-gate {"auth_attr", "cn", "SolarisAuthAttr", NULL},
650Sstevel@tonic-gate {"prof_attr", "cn", "SolarisProfAttr", NULL},
660Sstevel@tonic-gate {"exec_attr", "cn", "SolarisExecAttr", NULL},
670Sstevel@tonic-gate {"user_attr", "uid", "SolarisUserAttr", NULL},
681676Sjpk {"tnrhtp", "ipTnetTemplateName", "ipTnetTemplate", NULL},
691676Sjpk {"tnrhdb", "ipTnetNumber", "ipTnetHost", NULL},
700Sstevel@tonic-gate {NULL, NULL, NULL, NULL}
710Sstevel@tonic-gate };
720Sstevel@tonic-gate
732830Sdjl #define PROF_ATTR_FILTER \
742830Sdjl "(&(objectclass=SolarisProfAttr)(!(SolarisKernelSecurityPolicy=*))%s)"
752830Sdjl #define TNRHTP_FILTER \
762830Sdjl "(&(objectclass=ipTnetTemplate)(!(objectclass=ipTnetHost))%s)"
772830Sdjl #define OC_FILTER "objectclass=%s"
782830Sdjl #define OC_FLEN 15
792830Sdjl #define OC_FILTER2 "(&(objectclass=%s)%s)"
802830Sdjl #define OC_FLEN2 22
812830Sdjl
821450Sjanga /* Malloc and print error message in case of failure */
831450Sjanga #define MALLOC(ptr, len) \
841450Sjanga if ((ptr = (char *)malloc(len)) == NULL) { \
851450Sjanga (void) fprintf(stderr, gettext("out of memory\n")); \
861450Sjanga }
871450Sjanga
881450Sjanga /*
891450Sjanga * Allocate memory for filter and user data. Set
901450Sjanga * error to 1 if either of the mallocs fail.
911450Sjanga * In addition, free the memory allocated for filter,
921450Sjanga * if memory allocation for user data fails.
931450Sjanga */
941450Sjanga #define MALLOC_FILTER_UDATA(ptr1, len1, ptr2, len2, error) \
951450Sjanga error = 0; \
961450Sjanga MALLOC(ptr1, len1); \
971450Sjanga if (!ptr1) { \
981450Sjanga error = 1; \
991450Sjanga } \
1001450Sjanga else { \
1011450Sjanga MALLOC(ptr2, len2); \
1021450Sjanga if (!ptr2) { \
1031450Sjanga error = 1; \
1041450Sjanga free(ptr1); \
1051450Sjanga } \
1061450Sjanga }
1070Sstevel@tonic-gate
1080Sstevel@tonic-gate void
printMapping()1090Sstevel@tonic-gate printMapping()
1100Sstevel@tonic-gate {
1110Sstevel@tonic-gate int i;
1120Sstevel@tonic-gate
1131450Sjanga (void) fprintf(stdout,
114*12788Sgary.winiger@oracle.com gettext("database default type objectclass\n"));
1151450Sjanga (void) fprintf(stdout,
116*12788Sgary.winiger@oracle.com gettext("============= ================= =============\n"));
1170Sstevel@tonic-gate /* first dump auto_* and automount which are not in maplist[] */
1181450Sjanga (void) fprintf(stdout, "%-15s%-20s%s\n", "auto_*", "automountKey",
119*12788Sgary.winiger@oracle.com "automount");
1201450Sjanga (void) fprintf(stdout, "%-15s%-20s%s\n", "automount",
121*12788Sgary.winiger@oracle.com "automountMapName", "automountMap");
1220Sstevel@tonic-gate for (i = 0; maplist[i].database != NULL; i++) {
1231676Sjpk /* skip printing shadow */
1241676Sjpk if (strcasecmp(maplist[i].database, "shadow") == 0)
1251676Sjpk continue;
1261676Sjpk if (!is_system_labeled()) {
1271676Sjpk /*
1281676Sjpk * do not print tnrhdb and tnrhtp if system is
1291676Sjpk * not configured with Trusted Extensions
1301676Sjpk */
1311676Sjpk if ((strcasecmp(maplist[i].database, "tnrhdb") == 0) ||
1321676Sjpk (strcasecmp(maplist[i].database, "tnrhtp") == 0))
1331676Sjpk continue;
1341676Sjpk }
1351450Sjanga (void) fprintf(stdout, "%-15s%-20s%s\n", maplist[i].database,
1361676Sjpk maplist[i].def_type, maplist[i].objectclass);
1370Sstevel@tonic-gate }
1380Sstevel@tonic-gate }
1390Sstevel@tonic-gate
1401450Sjanga /*
1411450Sjanga * set_key routine to handle user specified keys.
1421450Sjanga * A key can be of the form: attribute=value or value.
1431450Sjanga * A filter is constructed from a set of keys specified in
1441450Sjanga * the form (|(key1)(key2)...(keyn))
1451450Sjanga * It returns: NULL if no keys are defined or
1461450Sjanga * the keyfilter as constructed above.
1471450Sjanga */
1480Sstevel@tonic-gate
1490Sstevel@tonic-gate char *
set_keys(char ** key,char * attrtype)1500Sstevel@tonic-gate set_keys(char **key, char *attrtype)
1510Sstevel@tonic-gate {
1520Sstevel@tonic-gate char *keyeq = NULL;
1531450Sjanga char *keyfilter = NULL;
1541450Sjanga int len, totlen = 1; /* Terminating NULL byte */
1550Sstevel@tonic-gate char *k, **karray;
1561450Sjanga char *tmpptr;
1570Sstevel@tonic-gate
1580Sstevel@tonic-gate if (!key || !key[0]) /* should never contain NULL string */
1590Sstevel@tonic-gate return (NULL);
1600Sstevel@tonic-gate
1611450Sjanga if (key[1]) {
1621450Sjanga totlen += 3;
1631450Sjanga /* Allocate memory for '(|)' */
1641450Sjanga MALLOC(keyfilter, totlen);
1651450Sjanga if (!keyfilter)
1661450Sjanga exit(2);
1671450Sjanga (void) snprintf(keyfilter, totlen, "(|");
1680Sstevel@tonic-gate }
1690Sstevel@tonic-gate
1700Sstevel@tonic-gate karray = key;
1711450Sjanga while ((k = *karray) != 0) {
1720Sstevel@tonic-gate keyeq = strchr(k, '=');
1731450Sjanga if (keyeq) {
1741450Sjanga /* make enough room for (%s) */
1751450Sjanga totlen += strlen(k) + 2;
1761450Sjanga } else {
1771450Sjanga /* make enough room for (%s=%s) */
1781450Sjanga totlen += strlen(attrtype) + strlen(k) + 3;
1791450Sjanga }
1801450Sjanga
1811450Sjanga len = keyfilter ? strlen(keyfilter) : 0;
1821450Sjanga
1831450Sjanga if (!(tmpptr = (char *)realloc(keyfilter, totlen))) {
1841450Sjanga if (keyfilter)
1851450Sjanga free(keyfilter);
1861450Sjanga (void) fprintf(stderr, gettext("out of memory\n"));
1870Sstevel@tonic-gate exit(2);
1880Sstevel@tonic-gate }
1891450Sjanga keyfilter = tmpptr;
1901450Sjanga
1911450Sjanga if (keyeq) {
1921450Sjanga (void) snprintf(keyfilter + len, totlen - len,
193*12788Sgary.winiger@oracle.com "(%s)", k);
1941450Sjanga } else {
1951450Sjanga (void) snprintf(keyfilter + len, totlen - len,
196*12788Sgary.winiger@oracle.com "(%s=%s)", attrtype, k);
1971450Sjanga }
1980Sstevel@tonic-gate karray++;
1990Sstevel@tonic-gate }
2001450Sjanga
2011450Sjanga if (key[1]) {
2021450Sjanga /* We allocated memory for this earlier */
2031450Sjanga (void) strlcat(keyfilter, ")", totlen);
2041450Sjanga }
2051450Sjanga
2060Sstevel@tonic-gate return (keyfilter);
2070Sstevel@tonic-gate }
2080Sstevel@tonic-gate
2090Sstevel@tonic-gate
2100Sstevel@tonic-gate /*
2110Sstevel@tonic-gate * A special set_key routine for to handle public keys.
2120Sstevel@tonic-gate * If the key starts with a digiti, view it as a user id.
2130Sstevel@tonic-gate * Otherwise, view it as a hostname.
2140Sstevel@tonic-gate * It returns: -1 no keys defined, 0 key defined but none for type
2150Sstevel@tonic-gate * specified, n>0 number of matches found.
2160Sstevel@tonic-gate */
2170Sstevel@tonic-gate int
set_keys_publickey(char ** key,char * attrtype,int type,char ** ret)2180Sstevel@tonic-gate set_keys_publickey(char **key, char *attrtype, int type, char **ret)
2190Sstevel@tonic-gate {
2200Sstevel@tonic-gate char *keyeq = NULL;
2211450Sjanga char *keyfilter = NULL;
2221450Sjanga char *pre_filter = NULL;
2230Sstevel@tonic-gate char *k, **karray;
2240Sstevel@tonic-gate int count = 0;
2251450Sjanga int len, totlen = 1; /* Terminating NULL byte */
2261450Sjanga char *tmpptr;
2270Sstevel@tonic-gate
2280Sstevel@tonic-gate if (!key || !key[0]) { /* should never contain NULL string */
2290Sstevel@tonic-gate *ret = NULL;
2300Sstevel@tonic-gate return (-1);
2310Sstevel@tonic-gate }
2320Sstevel@tonic-gate
2330Sstevel@tonic-gate karray = key;
2341450Sjanga while ((k = *karray) != 0) {
2350Sstevel@tonic-gate keyeq = strchr(k, '=');
2361450Sjanga if (keyeq) {
2371450Sjanga /* make enough room for (%s) */
2381450Sjanga totlen += strlen(k) + 2;
2391450Sjanga } else {
2401450Sjanga if ((type == 0 && isdigit(*k)) ||
2410Sstevel@tonic-gate /* user type keys */
2421450Sjanga (type == 1 && (!isdigit(*k)))) {
2430Sstevel@tonic-gate /* hosts type keys */
2441450Sjanga /* make enough room for (%s=%s) */
2451450Sjanga totlen += strlen(k) + strlen(attrtype) + 3;
2460Sstevel@tonic-gate } else {
2470Sstevel@tonic-gate karray++;
2480Sstevel@tonic-gate continue;
2490Sstevel@tonic-gate }
2500Sstevel@tonic-gate }
2511450Sjanga
2521450Sjanga len = pre_filter ? strlen(pre_filter) : 0;
2531450Sjanga
2541450Sjanga if (!(tmpptr = (char *)realloc(pre_filter, totlen))) {
2551450Sjanga if (pre_filter)
2561450Sjanga free(pre_filter);
2571450Sjanga (void) fprintf(stderr, gettext("out of memory\n"));
2580Sstevel@tonic-gate exit(2);
2590Sstevel@tonic-gate }
2601450Sjanga pre_filter = tmpptr;
2611450Sjanga
2621450Sjanga if (keyeq) {
2631450Sjanga (void) snprintf(pre_filter + len, totlen - len,
264*12788Sgary.winiger@oracle.com "(%s)", k);
2651450Sjanga } else {
2661450Sjanga (void) snprintf(pre_filter + len, totlen - len,
267*12788Sgary.winiger@oracle.com "(%s=%s)", attrtype, k);
2681450Sjanga }
2690Sstevel@tonic-gate karray++;
2700Sstevel@tonic-gate count++;
2710Sstevel@tonic-gate }
2720Sstevel@tonic-gate if (count > 1) {
2731450Sjanga len = strlen(pre_filter) + 4;
2741450Sjanga if (!(keyfilter = (char *)malloc(len))) {
2751450Sjanga (void) fprintf(stderr, gettext("out of memory\n"));
2761450Sjanga free(pre_filter);
2770Sstevel@tonic-gate exit(2);
2780Sstevel@tonic-gate }
2791450Sjanga (void) snprintf(keyfilter, len, "(|%s)", pre_filter);
2801450Sjanga free(pre_filter);
2810Sstevel@tonic-gate *ret = keyfilter;
2820Sstevel@tonic-gate } else
2830Sstevel@tonic-gate *ret = pre_filter;
2840Sstevel@tonic-gate return (count);
2850Sstevel@tonic-gate }
2860Sstevel@tonic-gate
2870Sstevel@tonic-gate /*
2880Sstevel@tonic-gate * publickey specific set_filter
2890Sstevel@tonic-gate * type 0 -> check for user publickeys
2900Sstevel@tonic-gate * type 1 -> check for hosts publickeys
2910Sstevel@tonic-gate */
2920Sstevel@tonic-gate char *
set_filter_publickey(char ** key,char * database,int type,char ** udata)2930Sstevel@tonic-gate set_filter_publickey(char **key, char *database, int type, char **udata)
2940Sstevel@tonic-gate {
2951450Sjanga char *filter = NULL;
2960Sstevel@tonic-gate char *userdata;
2971450Sjanga char *keyfilter = NULL;
2980Sstevel@tonic-gate int rc;
2991450Sjanga int filterlen, udatalen;
3001450Sjanga short nomem = 0;
3010Sstevel@tonic-gate
3021450Sjanga if (!database || !udata) {
3030Sstevel@tonic-gate return (NULL);
3040Sstevel@tonic-gate }
3050Sstevel@tonic-gate
3060Sstevel@tonic-gate if (strcasecmp(database, maplist[PUBLICKEY].database) == SAME) {
3070Sstevel@tonic-gate rc = set_keys_publickey(key,
308*12788Sgary.winiger@oracle.com maplist[PUBLICKEY + type].def_type, type, &keyfilter);
3090Sstevel@tonic-gate switch (rc) {
3100Sstevel@tonic-gate case -1:
3111450Sjanga filterlen = strlen(maplist[PUBLICKEY].objectclass) + 13;
3121450Sjanga udatalen = 3;
3131450Sjanga MALLOC_FILTER_UDATA(filter, filterlen, userdata,
314*12788Sgary.winiger@oracle.com udatalen, nomem);
3151450Sjanga if (!nomem) {
3161450Sjanga (void) snprintf(filter, filterlen,
317*12788Sgary.winiger@oracle.com "objectclass=%s",
318*12788Sgary.winiger@oracle.com maplist[PUBLICKEY].objectclass);
3191450Sjanga (void) snprintf(userdata, udatalen, "%%s");
3201450Sjanga }
3210Sstevel@tonic-gate break;
3220Sstevel@tonic-gate case 0:
3230Sstevel@tonic-gate return (NULL);
3240Sstevel@tonic-gate default:
3251450Sjanga filterlen = strlen(maplist[PUBLICKEY].objectclass) +
326*12788Sgary.winiger@oracle.com strlen(keyfilter) + 18;
3271450Sjanga udatalen = strlen(keyfilter) + 8;
3281450Sjanga MALLOC_FILTER_UDATA(filter, filterlen, userdata,
329*12788Sgary.winiger@oracle.com udatalen, nomem);
3301450Sjanga if (!nomem) {
331*12788Sgary.winiger@oracle.com (void) snprintf(filter, filterlen,
332*12788Sgary.winiger@oracle.com "(&(objectclass=%s)%s)",
333*12788Sgary.winiger@oracle.com maplist[PUBLICKEY].objectclass, keyfilter);
334*12788Sgary.winiger@oracle.com (void) snprintf(userdata, udatalen,
335*12788Sgary.winiger@oracle.com "(&(%%s)%s)", keyfilter);
3361450Sjanga }
3370Sstevel@tonic-gate }
3380Sstevel@tonic-gate } else {
3390Sstevel@tonic-gate if ((keyfilter = set_keys(key, "cn")) == NULL) {
3401450Sjanga filterlen = 14;
3411450Sjanga udatalen = 3;
3421450Sjanga MALLOC_FILTER_UDATA(filter, filterlen, userdata,
343*12788Sgary.winiger@oracle.com udatalen, nomem);
3441450Sjanga if (!nomem) {
3451450Sjanga (void) snprintf(filter, filterlen,
346*12788Sgary.winiger@oracle.com "objectclass=*");
3471450Sjanga (void) snprintf(userdata, udatalen, "%%s");
3481450Sjanga }
3490Sstevel@tonic-gate } else {
3501450Sjanga filterlen = strlen(keyfilter) + 1;
3511450Sjanga udatalen = strlen(keyfilter) + 8;
3521450Sjanga MALLOC_FILTER_UDATA(filter, filterlen, userdata,
353*12788Sgary.winiger@oracle.com udatalen, nomem);
3541450Sjanga if (!nomem) {
3551450Sjanga (void) snprintf(filter, filterlen, "%s",
356*12788Sgary.winiger@oracle.com keyfilter);
3571450Sjanga (void) snprintf(userdata, udatalen,
358*12788Sgary.winiger@oracle.com "(&(%%s)%s)", keyfilter);
3591450Sjanga }
3600Sstevel@tonic-gate }
3610Sstevel@tonic-gate }
3620Sstevel@tonic-gate #ifdef DEBUG
3631450Sjanga (void) fprintf(stdout, "set_filter: filter=\"%s\"\n", filter);
3641450Sjanga (void) fprintf(stdout, "set_filter: userdata=\"%s\"\n", userdata);
3650Sstevel@tonic-gate #endif /* DEBUG */
3661450Sjanga if (keyfilter)
3671450Sjanga free(keyfilter);
3681450Sjanga if (nomem)
3691450Sjanga exit(2);
3701450Sjanga *udata = userdata;
3710Sstevel@tonic-gate return (filter);
3720Sstevel@tonic-gate }
3730Sstevel@tonic-gate
3740Sstevel@tonic-gate
3750Sstevel@tonic-gate /* generic set_filter, this function is not thread safe */
3760Sstevel@tonic-gate char *
set_filter(char ** key,char * database,char ** udata)3770Sstevel@tonic-gate set_filter(char **key, char *database, char **udata)
3780Sstevel@tonic-gate {
3791450Sjanga char *filter = NULL;
3801450Sjanga char *userdata = NULL;
3810Sstevel@tonic-gate char *keyfilter;
3821450Sjanga int i, filterlen, udatalen;
3830Sstevel@tonic-gate int rc, v2 = 1;
3842830Sdjl int dbpf, dbtp;
3850Sstevel@tonic-gate void **paramVal = NULL;
3860Sstevel@tonic-gate ns_ldap_error_t *errorp = NULL;
3871450Sjanga short nomem;
3880Sstevel@tonic-gate
3891450Sjanga if (!database || !udata) {
3900Sstevel@tonic-gate return (NULL);
3910Sstevel@tonic-gate }
3920Sstevel@tonic-gate
3930Sstevel@tonic-gate
3940Sstevel@tonic-gate /*
3950Sstevel@tonic-gate * Check for version of the profile the client is using
3960Sstevel@tonic-gate *
3970Sstevel@tonic-gate * For version 1 profiles we do use nisMap and nisObject schema
3980Sstevel@tonic-gate * for backward compatibility with Solaris 8 clients.
3990Sstevel@tonic-gate *
4000Sstevel@tonic-gate * For version 2 profiles we use automountMap and automount as
4010Sstevel@tonic-gate * default attributes (which can then be overridden in libsldap
4020Sstevel@tonic-gate * if schema mapping is configured in the profile).
4030Sstevel@tonic-gate *
4040Sstevel@tonic-gate * If profile version is not available, use version 2 as default.
4050Sstevel@tonic-gate */
4060Sstevel@tonic-gate rc = __ns_ldap_getParam(NS_LDAP_FILE_VERSION_P, ¶mVal, &errorp);
4070Sstevel@tonic-gate if (rc != NS_LDAP_SUCCESS || !paramVal || !*paramVal) {
4080Sstevel@tonic-gate /* should print a message here: using v2 defaults */
4090Sstevel@tonic-gate (void) __ns_ldap_freeError(&errorp);
4100Sstevel@tonic-gate } else {
4110Sstevel@tonic-gate if (strcasecmp(*paramVal, NS_LDAP_VERSION_1) == 0)
4120Sstevel@tonic-gate v2 = 0;
4130Sstevel@tonic-gate (void) __ns_ldap_freeParam(¶mVal);
4140Sstevel@tonic-gate }
4150Sstevel@tonic-gate
4160Sstevel@tonic-gate /*
4170Sstevel@tonic-gate * starts at 2 to skip over publickey databases.
4180Sstevel@tonic-gate * These databases are handled separately.
4190Sstevel@tonic-gate */
4200Sstevel@tonic-gate for (i = 2; maplist[i].database != NULL; i++) {
4210Sstevel@tonic-gate if (strcasecmp(database, maplist[i].database) == SAME) {
4222830Sdjl dbpf = 0, dbtp = 0;
4232830Sdjl if (strcasecmp(database, "prof_attr") == 0)
4242830Sdjl dbpf = 1;
4252830Sdjl else if (strcasecmp(database, "tnrhtp") == 0)
4262830Sdjl dbtp = 1;
4270Sstevel@tonic-gate if ((keyfilter = set_keys(key, maplist[i].def_type))
428*12788Sgary.winiger@oracle.com == NULL) {
4292830Sdjl filterlen = strlen(maplist[i].objectclass);
4301450Sjanga udatalen = 3;
4312830Sdjl if (dbpf)
4322830Sdjl filterlen += strlen(PROF_ATTR_FILTER)
433*12788Sgary.winiger@oracle.com + 1;
4342830Sdjl else if (dbtp)
4352830Sdjl filterlen += strlen(TNRHTP_FILTER) + 1;
4362830Sdjl else
4372830Sdjl filterlen += OC_FLEN;
4382830Sdjl
4391450Sjanga MALLOC_FILTER_UDATA(filter, filterlen, userdata,
440*12788Sgary.winiger@oracle.com udatalen, nomem);
4412830Sdjl if (nomem)
4422830Sdjl goto done;
4432830Sdjl if (dbpf)
4441450Sjanga (void) snprintf(filter, filterlen,
445*12788Sgary.winiger@oracle.com PROF_ATTR_FILTER, "");
4462830Sdjl else if (dbtp)
4472830Sdjl (void) snprintf(filter, filterlen,
448*12788Sgary.winiger@oracle.com TNRHTP_FILTER, "");
4492830Sdjl else
4502830Sdjl (void) snprintf(filter, filterlen,
451*12788Sgary.winiger@oracle.com OC_FILTER,
452*12788Sgary.winiger@oracle.com maplist[i].objectclass);
4532830Sdjl
4542830Sdjl (void) snprintf(userdata, udatalen, "%%s");
4550Sstevel@tonic-gate } else {
4561450Sjanga filterlen = strlen(maplist[i].objectclass) +
457*12788Sgary.winiger@oracle.com strlen(keyfilter);
4582830Sdjl if (dbpf)
4592830Sdjl filterlen += strlen(PROF_ATTR_FILTER)
460*12788Sgary.winiger@oracle.com + 1;
4612830Sdjl else if (dbtp)
4622830Sdjl filterlen += strlen(TNRHTP_FILTER) + 1;
4632830Sdjl else
4642830Sdjl filterlen += OC_FLEN2;
4652830Sdjl
4661450Sjanga udatalen = strlen(keyfilter) + 8;
4671450Sjanga MALLOC_FILTER_UDATA(filter, filterlen, userdata,
468*12788Sgary.winiger@oracle.com udatalen, nomem);
4692830Sdjl if (nomem)
4702830Sdjl goto done;
4712830Sdjl if (dbpf)
4722830Sdjl (void) snprintf(filter, filterlen,
473*12788Sgary.winiger@oracle.com PROF_ATTR_FILTER, keyfilter);
4742830Sdjl else if (dbtp)
4751450Sjanga (void) snprintf(filter, filterlen,
476*12788Sgary.winiger@oracle.com TNRHTP_FILTER, keyfilter);
4772830Sdjl else
4782830Sdjl (void) snprintf(filter, filterlen,
479*12788Sgary.winiger@oracle.com OC_FILTER2,
480*12788Sgary.winiger@oracle.com maplist[i].objectclass, keyfilter);
4812830Sdjl
4822830Sdjl (void) snprintf(userdata, udatalen,
483*12788Sgary.winiger@oracle.com "(&(%%s)%s)", keyfilter);
4840Sstevel@tonic-gate }
4851450Sjanga goto done;
4860Sstevel@tonic-gate }
4870Sstevel@tonic-gate }
4880Sstevel@tonic-gate
4890Sstevel@tonic-gate /* special cases for automounter and other services */
4900Sstevel@tonic-gate
4910Sstevel@tonic-gate /* auto_* services */
4920Sstevel@tonic-gate if (strncasecmp(database, "auto_", 5) == SAME) {
493*12788Sgary.winiger@oracle.com if (v2) {
494*12788Sgary.winiger@oracle.com if ((keyfilter = set_keys(key, "automountKey"))
495*12788Sgary.winiger@oracle.com != NULL) {
496*12788Sgary.winiger@oracle.com filterlen = strlen(keyfilter) + 27;
497*12788Sgary.winiger@oracle.com udatalen = strlen(keyfilter) + 8;
498*12788Sgary.winiger@oracle.com MALLOC_FILTER_UDATA(filter, filterlen,
499*12788Sgary.winiger@oracle.com userdata, udatalen, nomem);
500*12788Sgary.winiger@oracle.com if (!nomem) {
501*12788Sgary.winiger@oracle.com (void) snprintf(filter, filterlen,
502*12788Sgary.winiger@oracle.com "(&(objectclass=automount)%s)",
503*12788Sgary.winiger@oracle.com keyfilter);
504*12788Sgary.winiger@oracle.com (void) snprintf(userdata, udatalen,
505*12788Sgary.winiger@oracle.com "(&(%%s)%s)", keyfilter);
506*12788Sgary.winiger@oracle.com }
507*12788Sgary.winiger@oracle.com } else {
508*12788Sgary.winiger@oracle.com filterlen = 22;
509*12788Sgary.winiger@oracle.com udatalen = 3;
510*12788Sgary.winiger@oracle.com MALLOC_FILTER_UDATA(filter, filterlen,
511*12788Sgary.winiger@oracle.com userdata, udatalen, nomem);
512*12788Sgary.winiger@oracle.com if (!nomem) {
513*12788Sgary.winiger@oracle.com (void) strlcpy(filter,
514*12788Sgary.winiger@oracle.com "objectclass=automount", filterlen);
515*12788Sgary.winiger@oracle.com (void) strlcpy(userdata, "%s",
516*12788Sgary.winiger@oracle.com udatalen);
517*12788Sgary.winiger@oracle.com }
5181450Sjanga }
5190Sstevel@tonic-gate } else {
520*12788Sgary.winiger@oracle.com if ((keyfilter = set_keys(key, "cn")) != NULL) {
521*12788Sgary.winiger@oracle.com filterlen = strlen(keyfilter) + 27;
522*12788Sgary.winiger@oracle.com udatalen = strlen(keyfilter) + 8;
523*12788Sgary.winiger@oracle.com MALLOC_FILTER_UDATA(filter, filterlen,
524*12788Sgary.winiger@oracle.com userdata, udatalen, nomem);
525*12788Sgary.winiger@oracle.com if (!nomem) {
526*12788Sgary.winiger@oracle.com (void) snprintf(filter, filterlen,
527*12788Sgary.winiger@oracle.com "(&(objectclass=nisObject)%s)",
528*12788Sgary.winiger@oracle.com keyfilter);
529*12788Sgary.winiger@oracle.com (void) snprintf(userdata, udatalen,
530*12788Sgary.winiger@oracle.com "(&(%%s)%s)", keyfilter);
531*12788Sgary.winiger@oracle.com }
532*12788Sgary.winiger@oracle.com } else {
533*12788Sgary.winiger@oracle.com filterlen = 22;
534*12788Sgary.winiger@oracle.com udatalen = 3;
535*12788Sgary.winiger@oracle.com MALLOC_FILTER_UDATA(filter, filterlen,
536*12788Sgary.winiger@oracle.com userdata, udatalen, nomem);
537*12788Sgary.winiger@oracle.com if (!nomem) {
538*12788Sgary.winiger@oracle.com (void) strlcpy(filter,
539*12788Sgary.winiger@oracle.com "objectclass=nisObject", filterlen);
540*12788Sgary.winiger@oracle.com (void) strlcpy(userdata, "%s",
541*12788Sgary.winiger@oracle.com udatalen);
542*12788Sgary.winiger@oracle.com }
5431450Sjanga }
5440Sstevel@tonic-gate }
545*12788Sgary.winiger@oracle.com goto done;
5460Sstevel@tonic-gate }
5470Sstevel@tonic-gate
5480Sstevel@tonic-gate /* automount service */
5490Sstevel@tonic-gate if (strcasecmp(database, "automount") == SAME) {
550*12788Sgary.winiger@oracle.com if (v2) {
551*12788Sgary.winiger@oracle.com if ((keyfilter = set_keys(key, "automountMapName"))
552*12788Sgary.winiger@oracle.com != NULL) {
553*12788Sgary.winiger@oracle.com filterlen = strlen(keyfilter) + 30;
554*12788Sgary.winiger@oracle.com udatalen = strlen(keyfilter) + 8;
555*12788Sgary.winiger@oracle.com MALLOC_FILTER_UDATA(filter, filterlen,
556*12788Sgary.winiger@oracle.com userdata, udatalen, nomem);
557*12788Sgary.winiger@oracle.com if (!nomem) {
558*12788Sgary.winiger@oracle.com (void) snprintf(filter, filterlen,
559*12788Sgary.winiger@oracle.com "(&(objectclass=automountMap)%s)",
560*12788Sgary.winiger@oracle.com keyfilter);
561*12788Sgary.winiger@oracle.com (void) snprintf(userdata, udatalen,
562*12788Sgary.winiger@oracle.com "(&(%%s)%s)", keyfilter);
563*12788Sgary.winiger@oracle.com }
564*12788Sgary.winiger@oracle.com } else {
565*12788Sgary.winiger@oracle.com filterlen = 25;
566*12788Sgary.winiger@oracle.com udatalen = 3;
567*12788Sgary.winiger@oracle.com MALLOC_FILTER_UDATA(filter, filterlen,
568*12788Sgary.winiger@oracle.com userdata, udatalen, nomem);
569*12788Sgary.winiger@oracle.com if (!nomem) {
570*12788Sgary.winiger@oracle.com (void) strlcpy(filter,
571*12788Sgary.winiger@oracle.com "objectclass=automountMap",
572*12788Sgary.winiger@oracle.com filterlen);
573*12788Sgary.winiger@oracle.com (void) strlcpy(userdata, "%s",
574*12788Sgary.winiger@oracle.com udatalen);
575*12788Sgary.winiger@oracle.com }
5761450Sjanga }
5770Sstevel@tonic-gate } else {
578*12788Sgary.winiger@oracle.com if ((keyfilter = set_keys(key, "nisMapName"))
579*12788Sgary.winiger@oracle.com != NULL) {
580*12788Sgary.winiger@oracle.com filterlen = strlen(keyfilter) + 24;
581*12788Sgary.winiger@oracle.com udatalen = strlen(keyfilter) + 8;
582*12788Sgary.winiger@oracle.com MALLOC_FILTER_UDATA(filter, filterlen,
583*12788Sgary.winiger@oracle.com userdata, udatalen, nomem);
584*12788Sgary.winiger@oracle.com if (!nomem) {
585*12788Sgary.winiger@oracle.com (void) snprintf(filter, filterlen,
586*12788Sgary.winiger@oracle.com "(&(objectclass=nisMap)%s)",
587*12788Sgary.winiger@oracle.com keyfilter);
588*12788Sgary.winiger@oracle.com (void) snprintf(userdata, udatalen,
589*12788Sgary.winiger@oracle.com "(&(%%s)%s)", keyfilter);
590*12788Sgary.winiger@oracle.com }
591*12788Sgary.winiger@oracle.com } else {
592*12788Sgary.winiger@oracle.com filterlen = 19;
593*12788Sgary.winiger@oracle.com udatalen = 3;
594*12788Sgary.winiger@oracle.com MALLOC_FILTER_UDATA(filter, filterlen,
595*12788Sgary.winiger@oracle.com userdata, udatalen, nomem);
596*12788Sgary.winiger@oracle.com if (!nomem) {
597*12788Sgary.winiger@oracle.com (void) strlcpy(filter,
598*12788Sgary.winiger@oracle.com "objectclass=nisMap", filterlen);
599*12788Sgary.winiger@oracle.com (void) strlcpy(userdata, "%s",
600*12788Sgary.winiger@oracle.com udatalen);
601*12788Sgary.winiger@oracle.com }
6021450Sjanga }
6030Sstevel@tonic-gate }
604*12788Sgary.winiger@oracle.com goto done;
6050Sstevel@tonic-gate }
6060Sstevel@tonic-gate
6070Sstevel@tonic-gate /* other services (catch all) */
6080Sstevel@tonic-gate if ((keyfilter = set_keys(key, "cn")) == NULL) {
6091450Sjanga filterlen = 14;
6101450Sjanga udatalen = 3;
611*12788Sgary.winiger@oracle.com MALLOC_FILTER_UDATA(filter, filterlen, userdata, udatalen,
612*12788Sgary.winiger@oracle.com nomem);
6131450Sjanga if (!nomem) {
6141450Sjanga (void) snprintf(filter, filterlen, "objectclass=*");
6151450Sjanga (void) strlcpy(userdata, "%s", udatalen);
6161450Sjanga }
6170Sstevel@tonic-gate } else {
6181450Sjanga filterlen = strlen(keyfilter) + 1;
6191450Sjanga udatalen = strlen(keyfilter) + 8;
620*12788Sgary.winiger@oracle.com MALLOC_FILTER_UDATA(filter, filterlen, userdata, udatalen,
621*12788Sgary.winiger@oracle.com nomem);
6221450Sjanga if (!nomem) {
6231450Sjanga (void) snprintf(filter, filterlen, "%s", keyfilter);
6241450Sjanga (void) snprintf(userdata, udatalen, "(&(%%s)%s)",
625*12788Sgary.winiger@oracle.com keyfilter);
6261450Sjanga }
6270Sstevel@tonic-gate }
6280Sstevel@tonic-gate
6290Sstevel@tonic-gate done:
6300Sstevel@tonic-gate #ifdef DEBUG
6311450Sjanga (void) fprintf(stdout, "set_filter: filter=\"%s\"\n", filter);
6321450Sjanga (void) fprintf(stdout, "set_filter: userdata=\"%s\"\n", userdata);
6330Sstevel@tonic-gate #endif /* DEBUG */
6341450Sjanga if (keyfilter)
6351450Sjanga free(keyfilter);
6361450Sjanga if (nomem)
6371450Sjanga exit(2);
6381450Sjanga *udata = userdata;
6390Sstevel@tonic-gate return (filter);
6400Sstevel@tonic-gate }
641