Home | History | Annotate | Download | only in common
      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 (the "License").
      6  * You may not use this file except in compliance with the License.
      7  *
      8  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
      9  * or http://www.opensolaris.org/os/licensing.
     10  * See the License for the specific language governing permissions
     11  * and limitations under the License.
     12  *
     13  * When distributing Covered Code, include this CDDL HEADER in each
     14  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
     15  * If applicable, add the following below this CDDL HEADER, with the
     16  * fields enclosed by brackets "[]" replaced with your own identifying
     17  * information: Portions Copyright [yyyy] [name of copyright owner]
     18  *
     19  * CDDL HEADER END
     20  */
     21 /*
     22  * Copyright 2008 Sun Microsystems, Inc.  All rights reserved.
     23  * Use is subject to license terms.
     24  *
     25  * From "tsol_gettpent.c	7.13	00/10/13 SMI; TSOL 2.x"
     26  */
     27 
     28 #pragma ident	"%Z%%M%	%I%	%E% SMI"
     29 
     30 #include <stdio.h>
     31 #include <string.h>
     32 #include <nss_dbdefs.h>
     33 #include <libtsnet.h>
     34 #include <secdb.h>
     35 #include <nss.h>
     36 #include <libintl.h>
     37 
     38 extern void _nss_XbyY_fgets(FILE *, nss_XbyY_args_t *);	/* from lib.c */
     39 
     40 static int tsol_tp_stayopen;	/* Unsynchronized, but it affects only	*/
     41 				/*   efficiency, not correctness	*/
     42 static DEFINE_NSS_DB_ROOT(db_root);
     43 static DEFINE_NSS_GETENT(context);
     44 
     45 
     46 static void
     47 _nss_initf_tsol_tp(nss_db_params_t *p)
     48 {
     49 	p->name	= NSS_DBNAM_TSOL_TP;
     50 	p->default_config = NSS_DEFCONF_TSOL_TP;
     51 }
     52 
     53 tsol_tpent_t *
     54 tsol_gettpbyname(const char *name)
     55 {
     56 	int		err = 0;
     57 	char		*errstr = NULL;
     58 	char		buf[NSS_BUFLEN_TSOL_TP];
     59 	tsol_tpstr_t	result;
     60 	tsol_tpstr_t	*tpstrp = NULL;
     61 	nss_XbyY_args_t arg;
     62 
     63 	NSS_XbyY_INIT(&arg, &result, buf, sizeof (buf), str_to_tpstr);
     64 
     65 	arg.key.name	= name;
     66 	arg.stayopen	= tsol_tp_stayopen;
     67 	arg.h_errno	= TSOL_NOT_FOUND;
     68 	arg.status = nss_search(&db_root, _nss_initf_tsol_tp,
     69 	    NSS_DBOP_TSOL_TP_BYNAME, &arg);
     70 	tpstrp = (tsol_tpstr_t *)NSS_XbyY_FINI(&arg);
     71 
     72 #ifdef	DEBUG
     73 	(void) fprintf(stdout, "tsol_gettpbyname %s: %s\n",
     74 	    name, tpstrp ? tpstrp->template : "NULL");
     75 #endif	/* DEBUG */
     76 
     77 	if (tpstrp == NULL)
     78 		return (NULL);
     79 
     80 	return (tpstr_to_ent(tpstrp, &err, &errstr));
     81 }
     82 
     83 void
     84 tsol_settpent(int stay)
     85 {
     86 	tsol_tp_stayopen |= stay;
     87 	nss_setent(&db_root, _nss_initf_tsol_tp, &context);
     88 }
     89 
     90 void
     91 tsol_endtpent(void)
     92 {
     93 	tsol_tp_stayopen = 0;
     94 	nss_endent(&db_root, _nss_initf_tsol_tp, &context);
     95 	nss_delete(&db_root);
     96 }
     97 
     98 tsol_tpent_t *
     99 tsol_gettpent(void)
    100 {
    101 	int		err = 0;
    102 	char		*errstr = NULL;
    103 	char		buf[NSS_BUFLEN_TSOL_TP];
    104 	tsol_tpstr_t	result;
    105 	tsol_tpstr_t	*tpstrp = NULL;
    106 	nss_XbyY_args_t arg;
    107 
    108 	NSS_XbyY_INIT(&arg, &result, buf, sizeof (buf), str_to_tpstr);
    109 	/* No key, no stayopen */
    110 	arg.status = nss_getent(&db_root, _nss_initf_tsol_tp, &context, &arg);
    111 	tpstrp = (tsol_tpstr_t *)NSS_XbyY_FINI(&arg);
    112 
    113 #ifdef	DEBUG
    114 	(void) fprintf(stdout, "tsol_gettpent: %s\n",
    115 	    tpstrp ? tpstrp->template : "NULL");
    116 #endif	/* DEBUG */
    117 
    118 	if (tpstrp == NULL)
    119 		return (NULL);
    120 
    121 	return (tpstr_to_ent(tpstrp, &err, &errstr));
    122 }
    123 
    124 tsol_tpent_t *
    125 tsol_fgettpent(FILE *f, boolean_t *error)
    126 {
    127 	int		err = 0;
    128 	char		*errstr = NULL;
    129 	char		buf[NSS_BUFLEN_TSOL_TP];
    130 	tsol_tpstr_t	result;
    131 	tsol_tpstr_t	*tpstrp = NULL;
    132 	tsol_tpent_t	*tpentp = NULL;
    133 	nss_XbyY_args_t	arg;
    134 
    135 	NSS_XbyY_INIT(&arg, &result, buf, sizeof (buf), str_to_tpstr);
    136 	_nss_XbyY_fgets(f, &arg);
    137 	tpstrp = (tsol_tpstr_t *)NSS_XbyY_FINI(&arg);
    138 	if (tpstrp == NULL)
    139 		return (NULL);
    140 	tpentp = tpstr_to_ent(tpstrp, &err, &errstr);
    141 	while (tpentp == NULL) {
    142 		/*
    143 		 * Loop until we find a non-blank, non-comment line, or
    144 		 * until EOF. No need to log blank lines, comments.
    145 		 */
    146 		if (err != LTSNET_EMPTY) {
    147 			(void) fprintf(stderr, "%s: %.32s%s: %s\n",
    148 			    gettext("Error parsing tnrhtp file"), errstr,
    149 			    (strlen(errstr) > 32)? "...": "",
    150 			    (char *)tsol_strerror(err, errno));
    151 			*error = B_TRUE;
    152 		}
    153 		_nss_XbyY_fgets(f, &arg);
    154 		tpstrp = (tsol_tpstr_t *)NSS_XbyY_FINI(&arg);
    155 		if (tpstrp == NULL)	/* EOF */
    156 			return (NULL);
    157 		tpentp = tpstr_to_ent(tpstrp, &err, &errstr);
    158 	}
    159 	return (tpentp);
    160 }
    161 
    162 /*
    163  * This is the callback routine for nss.  It just wraps the tsol_sgettpent
    164  * parser.
    165  */
    166 int
    167 str_to_tpstr(const char *instr, int lenstr, void *entp, char *buffer,
    168     int buflen)
    169 {
    170 	int		len;
    171 	char		*last = NULL;
    172 	char		*sep = KV_TOKEN_DELIMIT;
    173 	tsol_tpstr_t	*tpstrp = (tsol_tpstr_t *)entp;
    174 
    175 	if ((instr >= buffer && (buffer + buflen) > instr) ||
    176 	    (buffer >= instr && (instr + lenstr) > buffer))
    177 		return (NSS_STR_PARSE_PARSE);
    178 	if (lenstr >= buflen)
    179 		return (NSS_STR_PARSE_ERANGE);
    180 	(void) strncpy(buffer, instr, buflen);
    181 	tpstrp->template = _strtok_escape(buffer, sep, &last);
    182 	tpstrp->attrs = _strtok_escape(NULL, sep, &last);
    183 	if (tpstrp->attrs != NULL) {
    184 		len = strlen(tpstrp->attrs);
    185 		if (tpstrp->attrs[len - 1] == '\n')
    186 			tpstrp->attrs[len - 1] = '\0';
    187 	}
    188 
    189 #ifdef	DEBUG
    190 	(void) fprintf(stdout,
    191 	    "str_to_tpstr:\nstr - %s\n\ttemplate - %s\n\tattrs - %s\n",
    192 	    instr, tpstrp->template ? tpstrp->template : "NULL",
    193 	    tpstrp->attrs ? tpstrp->attrs : "NULL");
    194 #endif	/* DEBUG */
    195 
    196 	return (NSS_STR_PARSE_SUCCESS);
    197 }
    198