usr/src/lib/libc/port/gen/nsparse.c
author Jon Tibble <meths@btinternet.com>
Thu, 09 Dec 2010 22:32:39 +0100
changeset 13255 4afa820d78b9
parent 6812 febeba71273d
permissions -rw-r--r--
298 SPARC build fails in smt_pause.o 478 Build needs fixing for pkgdepend flag day Reviewed by: [email protected] Reviewed by: [email protected] Reviewed by: [email protected] Approved by: [email protected]
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     1
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     2
 * CDDL HEADER START
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     3
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     4
 * The contents of this file are subject to the terms of the
1914
8a8c5f225b1b 4916205 libcmd should not use file operation routines from C library
casper
parents: 0
diff changeset
     5
 * Common Development and Distribution License (the "License").
8a8c5f225b1b 4916205 libcmd should not use file operation routines from C library
casper
parents: 0
diff changeset
     6
 * You may not use this file except in compliance with the License.
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     7
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     8
 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     9
 * or http://www.opensolaris.org/os/licensing.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    10
 * See the License for the specific language governing permissions
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    11
 * and limitations under the License.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    12
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    13
 * When distributing Covered Code, include this CDDL HEADER in each
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    14
 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    15
 * If applicable, add the following below this CDDL HEADER, with the
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    16
 * fields enclosed by brackets "[]" replaced with your own identifying
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    17
 * information: Portions Copyright [yyyy] [name of copyright owner]
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    18
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    19
 * CDDL HEADER END
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    20
 */
6812
febeba71273d PSARC 2008/309 expunge synonyms.h
raf
parents: 1914
diff changeset
    21
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    22
/*
6812
febeba71273d PSARC 2008/309 expunge synonyms.h
raf
parents: 1914
diff changeset
    23
 * Copyright 2008 Sun Microsystems, Inc.  All rights reserved.
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    24
 * Use is subject to license terms.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    25
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    26
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    27
#pragma ident	"%Z%%M%	%I%	%E% SMI"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    28
6812
febeba71273d PSARC 2008/309 expunge synonyms.h
raf
parents: 1914
diff changeset
    29
#include "lint.h"
1914
8a8c5f225b1b 4916205 libcmd should not use file operation routines from C library
casper
parents: 0
diff changeset
    30
#include "file64.h"
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    31
#include "mtlib.h"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    32
#include "libc.h"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    33
#include <synch.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    34
#include <sys/types.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    35
#include <stdlib.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    36
#include <stdio.h>
1914
8a8c5f225b1b 4916205 libcmd should not use file operation routines from C library
casper
parents: 0
diff changeset
    37
#include <stdio_ext.h>
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    38
#include <string.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    39
#include <ctype.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    40
#include <limits.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    41
#include <dlfcn.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    42
#include <errno.h>
1914
8a8c5f225b1b 4916205 libcmd should not use file operation routines from C library
casper
parents: 0
diff changeset
    43
#include "stdiom.h"
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    44
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    45
#define	__NSS_PRIVATE_INTERFACE
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    46
#include "nsswitch_priv.h"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    47
#undef	__NSS_PRIVATE_INTERFACE
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    48
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    49
#include <syslog.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    50
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    51
#define	islabel(c) 	(isalnum(c) || (c) == '_')
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    52
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    53
#define	LIBC_STRDUP(new, existing) \
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    54
	if ((new = libc_strdup(existing)) == NULL) { \
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    55
		dup_fail = 1; \
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    56
		goto barf_line; \
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    57
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    58
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    59
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    60
 * This file has all the routines that access the configuration
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    61
 * information.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    62
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    63
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    64
struct cons_cell_v1 { /* private to the parser */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    65
	struct __nsw_switchconfig_v1 *sw;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    66
	struct cons_cell_v1 *next;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    67
};
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    68
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    69
struct cons_cell { /* private to the parser */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    70
	struct __nsw_switchconfig *sw;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    71
	struct cons_cell *next;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    72
};
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    73
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    74
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    75
 * Local routines
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    76
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    77
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    78
static char *skip(char **, char);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    79
static char *labelskip(char *);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    80
static char *spaceskip(char *);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    81
static struct __nsw_switchconfig_v1 *scrounge_cache_v1(const char *);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    82
static struct __nsw_switchconfig *scrounge_cache(const char *);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    83
static int add_concell_v1(struct __nsw_switchconfig_v1 *);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    84
static int add_concell(struct __nsw_switchconfig *);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    85
static void freeconf_v1(struct __nsw_switchconfig_v1 *);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    86
static void freeconf(struct __nsw_switchconfig *);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    87
static int alldigits(char *);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    88
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    89
static struct cons_cell_v1 *concell_list_v1; /* stays with add_concell() */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    90
static struct cons_cell *concell_list; /* stays with add_concell() */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    91
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    92
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    93
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    94
 * With the "lookup control" feature, the default criteria for NIS, NIS+,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    95
 * and any new services (e.g. ldap) will be:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    96
 *     [SUCCESS=return  NOTFOUND=continue UNAVAIL=continue TRYAGAIN=forever]
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    97
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    98
 * For backward compat, NIS via NIS server in DNS forwarding mode will be:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    99
 *     [SUCCESS=return  NOTFOUND=continue UNAVAIL=continue TRYAGAIN=continue]
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   100
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   101
 * And also for backward compat, the default criteria for DNS will be:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   102
 *     [SUCCESS=return  NOTFOUND=continue UNAVAIL=continue TRYAGAIN=continue]
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   103
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   104
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   105
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   106
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   107
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   108
 * The BIND resolver normally will retry several times on server non-response.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   109
 * But now with the "lookup control" feature, we don't want the resolver doing
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   110
 * many retries, rather we want it to return control (reasonably) quickly back
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   111
 * to the switch engine.  However, when TRYAGAIN=N or TRYAGAIN=forever is
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   112
 * not explicitly set by the admin in the conf file, we want the old "resolver
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   113
 * retry a few times" rather than no retries at all.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   114
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   115
static int 	dns_tryagain_retry = 3;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   116
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   117
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   118
 * For backward compat (pre "lookup control"), the dns default behavior is
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   119
 * soft lookup.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   120
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   121
static void
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   122
set_dns_default_lkp(struct __nsw_lookup_v1 *lkp)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   123
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   124
	if (strcasecmp(lkp->service_name, "dns") == 0) {
6812
febeba71273d PSARC 2008/309 expunge synonyms.h
raf
parents: 1914
diff changeset
   125
		lkp->actions[__NSW_TRYAGAIN] = __NSW_TRYAGAIN_NTIMES;
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   126
		lkp->max_retries = dns_tryagain_retry;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   127
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   128
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   129
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   130
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   131
 * Private interface used by nss_common.c, hence this function is not static
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   132
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   133
struct __nsw_switchconfig_v1 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   134
_nsw_getoneconfig_v1(const char *name, char *linep, enum __nsw_parse_err *errp)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   135
	/* linep   Nota Bene: not const char *	*/
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   136
	/* errp  Meanings are abused a bit	*/
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   137
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   138
	struct __nsw_switchconfig_v1 *cfp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   139
	struct __nsw_lookup_v1 *lkp, **lkq;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   140
	int end_crit, dup_fail = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   141
	action_t act;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   142
	char *p, *tokenp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   143
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   144
	*errp = __NSW_CONF_PARSE_SUCCESS;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   145
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   146
	if ((cfp = libc_malloc(sizeof (struct __nsw_switchconfig_v1)))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   147
	    == NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   148
		*errp = __NSW_CONF_PARSE_SYSERR;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   149
		return (NULL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   150
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   151
	LIBC_STRDUP(cfp->dbase, name);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   152
	lkq = &cfp->lookups;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   153
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   154
	/* linep points to a naming service name */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   155
	for (;;) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   156
		int i;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   157
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   158
		/* white space following the last service */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   159
		if (*linep == '\0' || *linep == '\n') {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   160
			return (cfp);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   161
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   162
		if ((lkp = libc_malloc(sizeof (struct __nsw_lookup_v1)))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   163
		    == NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   164
			*errp = __NSW_CONF_PARSE_SYSERR;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   165
			freeconf_v1(cfp);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   166
			return (NULL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   167
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   168
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   169
		*lkq = lkp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   170
		lkq = &lkp->next;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   171
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   172
		for (i = 0; i < __NSW_STD_ERRS_V1; i++)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   173
			if (i == __NSW_SUCCESS)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   174
				lkp->actions[i] = __NSW_RETURN;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   175
			else if (i == __NSW_TRYAGAIN)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   176
				lkp->actions[i] = __NSW_TRYAGAIN_FOREVER;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   177
			else
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   178
				lkp->actions[i] = __NSW_CONTINUE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   179
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   180
		/* get criteria for the naming service */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   181
		if (tokenp = skip(&linep, '[')) { /* got criteria */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   182
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   183
			/* premature end, illegal char following [ */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   184
			if (!islabel(*linep))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   185
				goto barf_line;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   186
			LIBC_STRDUP(lkp->service_name, tokenp);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   187
			cfp->num_lookups++;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   188
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   189
			set_dns_default_lkp(lkp);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   190
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   191
			end_crit = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   192
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   193
			/* linep points to a switch_err */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   194
			for (;;) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   195
				int ntimes = 0; /* try again max N times */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   196
				int dns_continue = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   197
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   198
				if ((tokenp = skip(&linep, '=')) == NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   199
					goto barf_line;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   200
				}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   201
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   202
				/* premature end, ill char following = */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   203
				if (!islabel(*linep))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   204
					goto barf_line;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   205
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   206
				/* linep points to the string following '=' */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   207
				p = labelskip(linep);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   208
				if (*p == ']')
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   209
					end_crit = 1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   210
				else if (*p != ' ' && *p != '\t')
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   211
					goto barf_line;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   212
				*p++ = '\0'; /* null terminate linep */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   213
				p = spaceskip(p);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   214
				if (!end_crit) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   215
					if (*p == ']') {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   216
					end_crit = 1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   217
					*p++ = '\0';
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   218
					} else if (*p == '\0' || *p == '\n') {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   219
						return (cfp);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   220
					} else if (!islabel(*p))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   221
					/* p better be the next switch_err */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   222
						goto barf_line;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   223
				}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   224
				if (strcasecmp(linep, __NSW_STR_RETURN) == 0)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   225
					act = __NSW_RETURN;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   226
				else if (strcasecmp(linep,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   227
						    __NSW_STR_CONTINUE) == 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   228
					if (strcasecmp(lkp->service_name,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   229
						    "dns") == 0 &&
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   230
						strcasecmp(tokenp,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   231
							__NSW_STR_TRYAGAIN)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   232
							== 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   233
						/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   234
						 * Add one more condition
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   235
						 * so it retries only if it's
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   236
						 * "dns [TRYAGAIN=continue]"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   237
						 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   238
						dns_continue = 1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   239
						act = __NSW_TRYAGAIN_NTIMES;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   240
					} else
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   241
						act = __NSW_CONTINUE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   242
				} else if (strcasecmp(linep,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   243
					    __NSW_STR_FOREVER) == 0)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   244
					act = __NSW_TRYAGAIN_FOREVER;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   245
				else if (alldigits(linep)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   246
					act = __NSW_TRYAGAIN_NTIMES;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   247
					ntimes = atoi(linep);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   248
					if (ntimes < 0 || ntimes > INT_MAX)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   249
						ntimes = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   250
				}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   251
				else
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   252
					goto barf_line;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   253
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   254
				if (__NSW_SUCCESS_ACTION(act) &&
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   255
				    strcasecmp(tokenp,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   256
					    __NSW_STR_SUCCESS) == 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   257
					lkp->actions[__NSW_SUCCESS] = act;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   258
				} else if (__NSW_NOTFOUND_ACTION(act) &&
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   259
					strcasecmp(tokenp,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   260
					    __NSW_STR_NOTFOUND) == 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   261
					lkp->actions[__NSW_NOTFOUND] = act;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   262
				} else if (__NSW_UNAVAIL_ACTION(act) &&
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   263
					strcasecmp(tokenp,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   264
					    __NSW_STR_UNAVAIL) == 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   265
					lkp->actions[__NSW_UNAVAIL] = act;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   266
				} else if (__NSW_TRYAGAIN_ACTION(act) &&
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   267
					strcasecmp(tokenp,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   268
					    __NSW_STR_TRYAGAIN) == 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   269
					lkp->actions[__NSW_TRYAGAIN] = act;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   270
					if (strcasecmp(lkp->service_name,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   271
						    "nis") == 0)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   272
						lkp->actions[
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   273
						    __NSW_NISSERVDNS_TRYAGAIN]
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   274
						    = act;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   275
					if (act == __NSW_TRYAGAIN_NTIMES)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   276
						lkp->max_retries =
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   277
						dns_continue ?
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   278
						dns_tryagain_retry : ntimes;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   279
				} else {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   280
					/*EMPTY*/
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   281
					/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   282
					 * convert string tokenp to integer
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   283
					 * and put in long_errs
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   284
					 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   285
				}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   286
				if (end_crit) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   287
					linep = spaceskip(p);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   288
					if (*linep == '\0' || *linep == '\n')
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   289
						return (cfp);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   290
					break; /* process next naming service */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   291
				}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   292
				linep = p;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   293
			} /* end of while loop for a name service's criteria */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   294
		} else {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   295
			/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   296
			 * no criteria for this naming service.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   297
			 * linep points to name service, but not null
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   298
			 * terminated.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   299
			 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   300
			p = labelskip(linep);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   301
			if (*p == '\0' || *p == '\n') {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   302
				*p = '\0';
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   303
				LIBC_STRDUP(lkp->service_name, linep);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   304
				set_dns_default_lkp(lkp);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   305
				cfp->num_lookups++;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   306
				return (cfp);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   307
			}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   308
			if (*p != ' ' && *p != '\t')
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   309
				goto barf_line;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   310
			*p++ = '\0';
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   311
			LIBC_STRDUP(lkp->service_name, linep);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   312
			set_dns_default_lkp(lkp);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   313
			cfp->num_lookups++;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   314
			linep = spaceskip(p);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   315
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   316
	} /* end of while(1) loop for a name service */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   317
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   318
barf_line:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   319
	freeconf_v1(cfp);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   320
	*errp = dup_fail ? __NSW_CONF_PARSE_SYSERR : __NSW_CONF_PARSE_NOPOLICY;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   321
	return (NULL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   322
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   323
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   324
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   325
 * Private interface used by nss_common.c, hence this function is not static
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   326
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   327
struct __nsw_switchconfig *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   328
_nsw_getoneconfig(const char *name, char *linep, enum __nsw_parse_err *errp)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   329
	/* linep   Nota Bene: not const char *	*/
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   330
	/* errp  Meanings are abused a bit	*/
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   331
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   332
	struct __nsw_switchconfig *cfp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   333
	struct __nsw_lookup *lkp, **lkq;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   334
	int end_crit, dup_fail = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   335
	action_t act;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   336
	char *p, *tokenp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   337
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   338
	*errp = __NSW_CONF_PARSE_SUCCESS;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   339
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   340
	if ((cfp = libc_malloc(sizeof (struct __nsw_switchconfig)))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   341
	    == NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   342
		*errp = __NSW_CONF_PARSE_SYSERR;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   343
		return (NULL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   344
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   345
	LIBC_STRDUP(cfp->dbase, name);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   346
	lkq = &cfp->lookups;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   347
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   348
	/* linep points to a naming service name */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   349
	for (;;) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   350
		int i;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   351
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   352
		/* white space following the last service */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   353
		if (*linep == '\0' || *linep == '\n') {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   354
			return (cfp);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   355
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   356
		if ((lkp = libc_malloc(sizeof (struct __nsw_lookup)))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   357
		    == NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   358
			*errp = __NSW_CONF_PARSE_SYSERR;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   359
			freeconf(cfp);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   360
			return (NULL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   361
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   362
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   363
		*lkq = lkp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   364
		lkq = &lkp->next;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   365
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   366
		for (i = 0; i < __NSW_STD_ERRS; i++)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   367
			if (i == __NSW_SUCCESS)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   368
				lkp->actions[i] = 1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   369
			else
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   370
				lkp->actions[i] = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   371
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   372
		/* get criteria for the naming service */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   373
		if (tokenp = skip(&linep, '[')) { /* got criteria */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   374
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   375
			/* premature end, illegal char following [ */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   376
			if (!islabel(*linep))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   377
				goto barf_line;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   378
			LIBC_STRDUP(lkp->service_name, tokenp);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   379
			cfp->num_lookups++;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   380
			end_crit = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   381
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   382
			/* linep points to a switch_err */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   383
			for (;;) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   384
				if ((tokenp = skip(&linep, '=')) == NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   385
					goto barf_line;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   386
				}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   387
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   388
				/* premature end, ill char following = */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   389
				if (!islabel(*linep))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   390
					goto barf_line;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   391
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   392
				/* linep points to the string following '=' */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   393
				p = labelskip(linep);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   394
				if (*p == ']')
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   395
					end_crit = 1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   396
				else if (*p != ' ' && *p != '\t')
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   397
					goto barf_line;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   398
				*p++ = '\0'; /* null terminate linep */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   399
				p = spaceskip(p);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   400
				if (!end_crit) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   401
					if (*p == ']') {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   402
					end_crit = 1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   403
					*p++ = '\0';
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   404
					} else if (*p == '\0' || *p == '\n')
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   405
						return (cfp);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   406
					else if (!islabel(*p))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   407
					/* p better be the next switch_err */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   408
						goto barf_line;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   409
				}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   410
				if (strcasecmp(linep, __NSW_STR_RETURN) == 0)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   411
					act = __NSW_RETURN;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   412
				else if (strcasecmp(linep,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   413
					    __NSW_STR_CONTINUE) == 0)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   414
					act = __NSW_CONTINUE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   415
				else if (strcasecmp(linep,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   416
					    __NSW_STR_FOREVER) == 0)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   417
					/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   418
					 * =forever or =N might be in conf file
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   419
					 * but old progs won't expect it.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   420
					 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   421
					act = __NSW_RETURN;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   422
				else if (alldigits(linep))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   423
					act = __NSW_CONTINUE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   424
				else
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   425
					goto barf_line;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   426
				if (strcasecmp(tokenp,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   427
					    __NSW_STR_SUCCESS) == 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   428
					lkp->actions[__NSW_SUCCESS] = act;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   429
				} else if (strcasecmp(tokenp,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   430
					    __NSW_STR_NOTFOUND) == 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   431
					lkp->actions[__NSW_NOTFOUND] = act;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   432
				} else if (strcasecmp(tokenp,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   433
					    __NSW_STR_UNAVAIL) == 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   434
					lkp->actions[__NSW_UNAVAIL] = act;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   435
				} else if (strcasecmp(tokenp,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   436
					    __NSW_STR_TRYAGAIN) == 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   437
					lkp->actions[__NSW_TRYAGAIN] = act;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   438
				} else {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   439
					/*EMPTY*/
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   440
					/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   441
					 * convert string tokenp to integer
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   442
					 * and put in long_errs
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   443
					 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   444
				}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   445
				if (end_crit) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   446
					linep = spaceskip(p);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   447
					if (*linep == '\0' || *linep == '\n')
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   448
						return (cfp);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   449
					break; /* process next naming service */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   450
				}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   451
				linep = p;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   452
			} /* end of while loop for a name service's criteria */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   453
		} else {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   454
			/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   455
			 * no criteria for this naming service.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   456
			 * linep points to name service, but not null
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   457
			 * terminated.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   458
			 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   459
			p = labelskip(linep);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   460
			if (*p == '\0' || *p == '\n') {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   461
				*p = '\0';
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   462
				LIBC_STRDUP(lkp->service_name, linep);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   463
				cfp->num_lookups++;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   464
				return (cfp);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   465
			}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   466
			if (*p != ' ' && *p != '\t')
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   467
				goto barf_line;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   468
			*p++ = '\0';
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   469
			LIBC_STRDUP(lkp->service_name, linep);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   470
			cfp->num_lookups++;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   471
			linep = spaceskip(p);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   472
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   473
	} /* end of while(1) loop for a name service */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   474
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   475
barf_line:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   476
	freeconf(cfp);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   477
	*errp = dup_fail ? __NSW_CONF_PARSE_SYSERR : __NSW_CONF_PARSE_NOPOLICY;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   478
	return (NULL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   479
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   480
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   481
static mutex_t serialize_config_v1 = DEFAULTMUTEX;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   482
static mutex_t serialize_config = DEFAULTMUTEX;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   483
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   484
static void
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   485
syslog_warning(const char *dbase)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   486
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   487
	syslog(LOG_WARNING,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   488
	    "libc: bad lookup policy for %s in %s, using defaults..\n",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   489
	    dbase, __NSW_CONFIG_FILE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   490
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   491
1914
8a8c5f225b1b 4916205 libcmd should not use file operation routines from C library
casper
parents: 0
diff changeset
   492
/*
8a8c5f225b1b 4916205 libcmd should not use file operation routines from C library
casper
parents: 0
diff changeset
   493
 * Since we cannot call malloc() or lock any of the ordinary mutexes
8a8c5f225b1b 4916205 libcmd should not use file operation routines from C library
casper
parents: 0
diff changeset
   494
 * while we hold an lmutex_lock(), we open the file outside the lock
8a8c5f225b1b 4916205 libcmd should not use file operation routines from C library
casper
parents: 0
diff changeset
   495
 * and disable locking on the file; the latter is fine because we're
8a8c5f225b1b 4916205 libcmd should not use file operation routines from C library
casper
parents: 0
diff changeset
   496
 * reading the fp only from a single thread.
8a8c5f225b1b 4916205 libcmd should not use file operation routines from C library
casper
parents: 0
diff changeset
   497
 */
8a8c5f225b1b 4916205 libcmd should not use file operation routines from C library
casper
parents: 0
diff changeset
   498
static FILE *
8a8c5f225b1b 4916205 libcmd should not use file operation routines from C library
casper
parents: 0
diff changeset
   499
open_conf(void)
8a8c5f225b1b 4916205 libcmd should not use file operation routines from C library
casper
parents: 0
diff changeset
   500
{
8a8c5f225b1b 4916205 libcmd should not use file operation routines from C library
casper
parents: 0
diff changeset
   501
	FILE *fp = fopen(__NSW_CONFIG_FILE, "rF");
8a8c5f225b1b 4916205 libcmd should not use file operation routines from C library
casper
parents: 0
diff changeset
   502
8a8c5f225b1b 4916205 libcmd should not use file operation routines from C library
casper
parents: 0
diff changeset
   503
	if (fp != NULL) {
8a8c5f225b1b 4916205 libcmd should not use file operation routines from C library
casper
parents: 0
diff changeset
   504
		if (_findbuf(fp) == NULL) {
8a8c5f225b1b 4916205 libcmd should not use file operation routines from C library
casper
parents: 0
diff changeset
   505
			(void) fclose(fp);
8a8c5f225b1b 4916205 libcmd should not use file operation routines from C library
casper
parents: 0
diff changeset
   506
			return (NULL);
8a8c5f225b1b 4916205 libcmd should not use file operation routines from C library
casper
parents: 0
diff changeset
   507
		}
8a8c5f225b1b 4916205 libcmd should not use file operation routines from C library
casper
parents: 0
diff changeset
   508
		SET_IONOLOCK(fp);
8a8c5f225b1b 4916205 libcmd should not use file operation routines from C library
casper
parents: 0
diff changeset
   509
	}
8a8c5f225b1b 4916205 libcmd should not use file operation routines from C library
casper
parents: 0
diff changeset
   510
	return (fp);
8a8c5f225b1b 4916205 libcmd should not use file operation routines from C library
casper
parents: 0
diff changeset
   511
}
8a8c5f225b1b 4916205 libcmd should not use file operation routines from C library
casper
parents: 0
diff changeset
   512
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   513
struct __nsw_switchconfig_v1 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   514
__nsw_getconfig_v1(const char *dbase, enum __nsw_parse_err *errp)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   515
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   516
	struct __nsw_switchconfig_v1 *cfp, *retp = NULL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   517
	int syslog_error = 0;
1914
8a8c5f225b1b 4916205 libcmd should not use file operation routines from C library
casper
parents: 0
diff changeset
   518
	FILE *fp = NULL;
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   519
	char *linep;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   520
	char lineq[BUFSIZ];
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   521
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   522
	lmutex_lock(&serialize_config_v1);
1914
8a8c5f225b1b 4916205 libcmd should not use file operation routines from C library
casper
parents: 0
diff changeset
   523
top:
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   524
	if (cfp = scrounge_cache_v1(dbase)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   525
		*errp = __NSW_CONF_PARSE_SUCCESS;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   526
		lmutex_unlock(&serialize_config_v1);
1914
8a8c5f225b1b 4916205 libcmd should not use file operation routines from C library
casper
parents: 0
diff changeset
   527
		if (fp != NULL)
8a8c5f225b1b 4916205 libcmd should not use file operation routines from C library
casper
parents: 0
diff changeset
   528
			(void) fclose(fp);
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   529
		return (cfp);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   530
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   531
1914
8a8c5f225b1b 4916205 libcmd should not use file operation routines from C library
casper
parents: 0
diff changeset
   532
	if (fp == NULL) {
8a8c5f225b1b 4916205 libcmd should not use file operation routines from C library
casper
parents: 0
diff changeset
   533
		struct cons_cell_v1 *cp = concell_list_v1;
8a8c5f225b1b 4916205 libcmd should not use file operation routines from C library
casper
parents: 0
diff changeset
   534
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   535
		lmutex_unlock(&serialize_config_v1);
1914
8a8c5f225b1b 4916205 libcmd should not use file operation routines from C library
casper
parents: 0
diff changeset
   536
		/* open_conf() must be called w/o locks held */
8a8c5f225b1b 4916205 libcmd should not use file operation routines from C library
casper
parents: 0
diff changeset
   537
		if ((fp = open_conf()) == NULL) {
8a8c5f225b1b 4916205 libcmd should not use file operation routines from C library
casper
parents: 0
diff changeset
   538
			*errp = __NSW_CONF_PARSE_NOFILE;
8a8c5f225b1b 4916205 libcmd should not use file operation routines from C library
casper
parents: 0
diff changeset
   539
			return (NULL);
8a8c5f225b1b 4916205 libcmd should not use file operation routines from C library
casper
parents: 0
diff changeset
   540
		}
8a8c5f225b1b 4916205 libcmd should not use file operation routines from C library
casper
parents: 0
diff changeset
   541
		lmutex_lock(&serialize_config_v1);
8a8c5f225b1b 4916205 libcmd should not use file operation routines from C library
casper
parents: 0
diff changeset
   542
		/* Cache changed? */
8a8c5f225b1b 4916205 libcmd should not use file operation routines from C library
casper
parents: 0
diff changeset
   543
		if (cp != concell_list_v1)
8a8c5f225b1b 4916205 libcmd should not use file operation routines from C library
casper
parents: 0
diff changeset
   544
			goto top;
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   545
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   546
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   547
	*errp = __NSW_CONF_PARSE_NOPOLICY;
1914
8a8c5f225b1b 4916205 libcmd should not use file operation routines from C library
casper
parents: 0
diff changeset
   548
	while (linep = fgets(lineq, BUFSIZ, fp)) {
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   549
		enum __nsw_parse_err	line_err;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   550
		char			*tokenp, *comment;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   551
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   552
		/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   553
		 * Ignore portion of line following the comment character '#'.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   554
		 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   555
		if ((comment = strchr(linep, '#')) != NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   556
			*comment = '\0';
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   557
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   558
		/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   559
		 * skip past blank lines.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   560
		 * otherwise, cache as a struct switchconfig.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   561
		 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   562
		if ((*linep == '\0') || isspace(*linep)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   563
			continue;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   564
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   565
		if ((tokenp = skip(&linep, ':')) == NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   566
			continue; /* ignore this line */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   567
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   568
		if (cfp = scrounge_cache_v1(tokenp)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   569
			continue; /* ? somehow this database is in the cache */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   570
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   571
		if (cfp = _nsw_getoneconfig_v1(tokenp, linep, &line_err)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   572
			(void) add_concell_v1(cfp);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   573
			if (strcmp(cfp->dbase, dbase) == 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   574
				*errp = __NSW_CONF_PARSE_SUCCESS;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   575
				retp = cfp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   576
			}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   577
		} else {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   578
			/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   579
			 * Got an error on this line, if it is a system
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   580
			 * error we might as well give right now. If it
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   581
			 * is a parse error on the second entry of the
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   582
			 * database we are looking for and the first one
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   583
			 * was a good entry we end up logging the following
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   584
			 * syslog message and using a default policy instead.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   585
			 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   586
			if (line_err == __NSW_CONF_PARSE_SYSERR) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   587
				*errp = __NSW_CONF_PARSE_SYSERR;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   588
				break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   589
			} else if (line_err == __NSW_CONF_PARSE_NOPOLICY &&
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   590
			    strcmp(tokenp, dbase) == 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   591
				syslog_error = 1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   592
				*errp = __NSW_CONF_PARSE_NOPOLICY;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   593
				break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   594
			}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   595
			/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   596
			 * Else blithely ignore problems on this line and
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   597
			 *   go ahead with the next line.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   598
			 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   599
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   600
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   601
	lmutex_unlock(&serialize_config_v1);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   602
	/*
1914
8a8c5f225b1b 4916205 libcmd should not use file operation routines from C library
casper
parents: 0
diff changeset
   603
	 * We have to drop the lock before calling fclose()/syslog().
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   604
	 */
1914
8a8c5f225b1b 4916205 libcmd should not use file operation routines from C library
casper
parents: 0
diff changeset
   605
	(void) fclose(fp);
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   606
	if (syslog_error)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   607
		syslog_warning(dbase);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   608
	return (retp);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   609
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   610
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   611
struct __nsw_switchconfig *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   612
__nsw_getconfig(const char *dbase, enum __nsw_parse_err *errp)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   613
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   614
	struct __nsw_switchconfig *cfp, *retp = NULL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   615
	int syslog_error = 0;
1914
8a8c5f225b1b 4916205 libcmd should not use file operation routines from C library
casper
parents: 0
diff changeset
   616
	FILE *fp = NULL;
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   617
	char *linep;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   618
	char lineq[BUFSIZ];
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   619
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   620
	lmutex_lock(&serialize_config);
1914
8a8c5f225b1b 4916205 libcmd should not use file operation routines from C library
casper
parents: 0
diff changeset
   621
top:
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   622
	if (cfp = scrounge_cache(dbase)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   623
		*errp = __NSW_CONF_PARSE_SUCCESS;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   624
		lmutex_unlock(&serialize_config);
1914
8a8c5f225b1b 4916205 libcmd should not use file operation routines from C library
casper
parents: 0
diff changeset
   625
		if (fp != NULL)
8a8c5f225b1b 4916205 libcmd should not use file operation routines from C library
casper
parents: 0
diff changeset
   626
			(void) fclose(fp);
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   627
		return (cfp);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   628
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   629
1914
8a8c5f225b1b 4916205 libcmd should not use file operation routines from C library
casper
parents: 0
diff changeset
   630
	if (fp == NULL) {
8a8c5f225b1b 4916205 libcmd should not use file operation routines from C library
casper
parents: 0
diff changeset
   631
		struct cons_cell *cp = concell_list;
8a8c5f225b1b 4916205 libcmd should not use file operation routines from C library
casper
parents: 0
diff changeset
   632
		/* open_conf() must be called w/o locks held */
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   633
		lmutex_unlock(&serialize_config);
1914
8a8c5f225b1b 4916205 libcmd should not use file operation routines from C library
casper
parents: 0
diff changeset
   634
		if ((fp = open_conf()) == NULL) {
8a8c5f225b1b 4916205 libcmd should not use file operation routines from C library
casper
parents: 0
diff changeset
   635
			*errp = __NSW_CONF_PARSE_NOFILE;
8a8c5f225b1b 4916205 libcmd should not use file operation routines from C library
casper
parents: 0
diff changeset
   636
			return (NULL);
8a8c5f225b1b 4916205 libcmd should not use file operation routines from C library
casper
parents: 0
diff changeset
   637
		}
8a8c5f225b1b 4916205 libcmd should not use file operation routines from C library
casper
parents: 0
diff changeset
   638
		lmutex_lock(&serialize_config);
8a8c5f225b1b 4916205 libcmd should not use file operation routines from C library
casper
parents: 0
diff changeset
   639
		/* Cache changed? */
8a8c5f225b1b 4916205 libcmd should not use file operation routines from C library
casper
parents: 0
diff changeset
   640
		if (cp != concell_list)
8a8c5f225b1b 4916205 libcmd should not use file operation routines from C library
casper
parents: 0
diff changeset
   641
			goto top;
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   642
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   643
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   644
	*errp = __NSW_CONF_PARSE_NOPOLICY;
1914
8a8c5f225b1b 4916205 libcmd should not use file operation routines from C library
casper
parents: 0
diff changeset
   645
	while (linep = fgets(lineq, BUFSIZ, fp)) {
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   646
		enum __nsw_parse_err	line_err;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   647
		char			*tokenp, *comment;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   648
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   649
		/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   650
		 * Ignore portion of line following the comment character '#'.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   651
		 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   652
		if ((comment = strchr(linep, '#')) != NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   653
			*comment = '\0';
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   654
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   655
		/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   656
		 * skip past blank lines.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   657
		 * otherwise, cache as a struct switchconfig.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   658
		 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   659
		if ((*linep == '\0') || isspace(*linep)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   660
			continue;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   661
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   662
		if ((tokenp = skip(&linep, ':')) == NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   663
			continue; /* ignore this line */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   664
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   665
		if (cfp = scrounge_cache(tokenp)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   666
			continue; /* ? somehow this database is in the cache */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   667
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   668
		if (cfp = _nsw_getoneconfig(tokenp, linep, &line_err)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   669
			(void) add_concell(cfp);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   670
			if (strcmp(cfp->dbase, dbase) == 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   671
				*errp = __NSW_CONF_PARSE_SUCCESS;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   672
				retp = cfp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   673
			}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   674
		} else {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   675
			/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   676
			 * Got an error on this line, if it is a system
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   677
			 * error we might as well give right now. If it
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   678
			 * is a parse error on the second entry of the
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   679
			 * database we are looking for and the first one
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   680
			 * was a good entry we end up logging the following
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   681
			 * syslog message and using a default policy instead.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   682
			 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   683
			if (line_err == __NSW_CONF_PARSE_SYSERR) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   684
				*errp = __NSW_CONF_PARSE_SYSERR;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   685
				break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   686
			} else if (line_err == __NSW_CONF_PARSE_NOPOLICY &&
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   687
			    strcmp(tokenp, dbase) == 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   688
				syslog_error = 1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   689
				*errp = __NSW_CONF_PARSE_NOPOLICY;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   690
				break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   691
			}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   692
			/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   693
			 * Else blithely ignore problems on this line and
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   694
			 *   go ahead with the next line.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   695
			 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   696
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   697
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   698
	lmutex_unlock(&serialize_config);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   699
	/*
1914
8a8c5f225b1b 4916205 libcmd should not use file operation routines from C library
casper
parents: 0
diff changeset
   700
	 * We have to drop the lock before calling fclose()/syslog().
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   701
	 */
1914
8a8c5f225b1b 4916205 libcmd should not use file operation routines from C library
casper
parents: 0
diff changeset
   702
	(void) fclose(fp);
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   703
	if (syslog_error)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   704
		syslog_warning(dbase);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   705
	return (retp);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   706
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   707
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   708
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   709
static struct __nsw_switchconfig_v1 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   710
scrounge_cache_v1(const char *dbase)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   711
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   712
	struct cons_cell_v1 *cellp = concell_list_v1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   713
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   714
	for (; cellp; cellp = cellp->next)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   715
		if (strcmp(dbase, cellp->sw->dbase) == 0)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   716
			return (cellp->sw);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   717
	return (NULL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   718
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   719
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   720
static struct __nsw_switchconfig *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   721
scrounge_cache(const char *dbase)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   722
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   723
	struct cons_cell *cellp = concell_list;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   724
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   725
	for (; cellp; cellp = cellp->next)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   726
		if (strcmp(dbase, cellp->sw->dbase) == 0)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   727
			return (cellp->sw);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   728
	return (NULL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   729
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   730
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   731
static void
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   732
freeconf_v1(struct __nsw_switchconfig_v1 *cfp)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   733
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   734
	if (cfp) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   735
		if (cfp->dbase)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   736
			libc_free(cfp->dbase);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   737
		if (cfp->lookups) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   738
			struct __nsw_lookup_v1 *nex, *cur;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   739
			for (cur = cfp->lookups; cur; cur = nex) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   740
				libc_free(cur->service_name);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   741
				nex = cur->next;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   742
				libc_free(cur);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   743
			}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   744
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   745
		libc_free(cfp);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   746
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   747
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   748
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   749
static void
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   750
freeconf(struct __nsw_switchconfig *cfp)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   751
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   752
	if (cfp) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   753
		if (cfp->dbase)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   754
			libc_free(cfp->dbase);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   755
		if (cfp->lookups) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   756
			struct __nsw_lookup *nex, *cur;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   757
			for (cur = cfp->lookups; cur; cur = nex) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   758
				libc_free(cur->service_name);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   759
				nex = cur->next;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   760
				libc_free(cur);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   761
			}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   762
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   763
		libc_free(cfp);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   764
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   765
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   766
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   767
action_t
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   768
__nsw_extended_action_v1(struct __nsw_lookup_v1 *lkp, int err)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   769
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   770
	struct __nsw_long_err *lerrp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   771
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   772
	for (lerrp = lkp->long_errs; lerrp; lerrp = lerrp->next) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   773
		if (lerrp->nsw_errno == err)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   774
			return (lerrp->action);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   775
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   776
	return (__NSW_CONTINUE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   777
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   778
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   779
action_t
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   780
__nsw_extended_action(struct __nsw_lookup *lkp, int err)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   781
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   782
	struct __nsw_long_err *lerrp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   783
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   784
	for (lerrp = lkp->long_errs; lerrp; lerrp = lerrp->next) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   785
		if (lerrp->nsw_errno == err)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   786
			return (lerrp->action);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   787
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   788
	return (__NSW_CONTINUE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   789
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   790
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   791
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   792
/* give the next non-alpha character */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   793
static char *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   794
labelskip(char *cur)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   795
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   796
	char *p = cur;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   797
	while (islabel(*p))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   798
		++p;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   799
	return (p);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   800
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   801
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   802
/* give the next non-space character */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   803
static char *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   804
spaceskip(char *cur)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   805
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   806
	char *p = cur;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   807
	while (*p == ' ' || *p == '\t')
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   808
		++p;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   809
	return (p);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   810
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   811
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   812
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   813
 * terminate the *cur pointed string by null only if it is
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   814
 * followed by "key" surrounded by zero or more spaces and
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   815
 * return value is the same as the original *cur pointer and
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   816
 * *cur pointer is advanced to the first non {space, key} char
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   817
 * followed by the key. Otherwise, return NULL and keep
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   818
 * *cur unchanged.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   819
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   820
static char *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   821
skip(char **cur, char key)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   822
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   823
	char *p, *tmp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   824
	char *q = *cur;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   825
	int found, tmpfound;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   826
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   827
	tmp = labelskip(*cur);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   828
	p = tmp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   829
	found = (*p == key);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   830
	if (found) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   831
		*p++ = '\0'; /* overwrite the key */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   832
		p = spaceskip(p);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   833
	} else {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   834
		while (*p == ' ' || *p == '\t') {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   835
			tmpfound = (*++p == key);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   836
			if (tmpfound) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   837
				found = tmpfound;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   838
					/* null terminate the return token */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   839
				*tmp = '\0';
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   840
				p++; /* skip the key */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   841
			}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   842
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   843
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   844
	if (!found)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   845
		return (NULL); /* *cur unchanged */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   846
	*cur = p;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   847
	return (q);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   848
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   849
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   850
/* add to the front: LRU */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   851
static int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   852
add_concell_v1(struct __nsw_switchconfig_v1 *cfp)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   853
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   854
	struct cons_cell_v1 *cp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   855
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   856
	if (cfp == NULL)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   857
		return (1);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   858
	if ((cp = libc_malloc(sizeof (struct cons_cell_v1))) == NULL)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   859
		return (1);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   860
	cp->sw = cfp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   861
	cp->next = concell_list_v1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   862
	concell_list_v1 = cp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   863
	return (0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   864
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   865
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   866
/* add to the front: LRU */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   867
static int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   868
add_concell(struct __nsw_switchconfig *cfp)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   869
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   870
	struct cons_cell *cp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   871
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   872
	if (cfp == NULL)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   873
		return (1);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   874
	if ((cp = libc_malloc(sizeof (struct cons_cell))) == NULL)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   875
		return (1);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   876
	cp->sw = cfp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   877
	cp->next = concell_list;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   878
	concell_list = cp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   879
	return (0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   880
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   881
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   882
int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   883
__nsw_freeconfig_v1(struct __nsw_switchconfig_v1 *conf)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   884
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   885
	struct cons_cell_v1 *cellp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   886
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   887
	if (conf == NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   888
		return (-1);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   889
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   890
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   891
	 * Hacked to make life easy for the code in nss_common.c.  Free conf
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   892
	 *   iff it was created by calling _nsw_getoneconfig() directly
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   893
	 *   rather than by calling nsw_getconfig.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   894
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   895
	lmutex_lock(&serialize_config_v1);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   896
	for (cellp = concell_list_v1;  cellp;  cellp = cellp->next) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   897
		if (cellp->sw == conf) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   898
			break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   899
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   900
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   901
	lmutex_unlock(&serialize_config_v1);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   902
	if (cellp == NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   903
		/* Not in the cache;  free it */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   904
		freeconf_v1(conf);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   905
		return (1);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   906
	} else {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   907
		/* In the cache;  don't free it */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   908
		return (0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   909
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   910
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   911
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   912
int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   913
__nsw_freeconfig(struct __nsw_switchconfig *conf)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   914
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   915
	struct cons_cell *cellp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   916
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   917
	if (conf == NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   918
		return (-1);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   919
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   920
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   921
	 * Hacked to make life easy for the code in nss_common.c.  Free conf
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   922
	 *   iff it was created by calling _nsw_getoneconfig() directly
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   923
	 *   rather than by calling nsw_getconfig.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   924
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   925
	lmutex_lock(&serialize_config);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   926
	for (cellp = concell_list;  cellp;  cellp = cellp->next) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   927
		if (cellp->sw == conf) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   928
			break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   929
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   930
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   931
	lmutex_unlock(&serialize_config);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   932
	if (cellp == NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   933
		/* Not in the cache;  free it */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   934
		freeconf(conf);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   935
		return (1);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   936
	} else {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   937
		/* In the cache;  don't free it */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   938
		return (0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   939
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   940
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   941
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   942
/* Return 1 if the string contains all digits, else return 0. */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   943
static int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   944
alldigits(char *s)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   945
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   946
	for (; *s; s++)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   947
		if (!isdigit(*s))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   948
			return (0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   949
	return (1);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   950
}