nsswitch revision 129650
1#!/bin/sh
2#
3# Copyright (c) 1993 - 2004 The FreeBSD Project. All rights reserved.
4#
5# Redistribution and use in source and binary forms, with or without
6# modification, are permitted provided that the following conditions
7# are met:
8# 1. Redistributions of source code must retain the above copyright
9#    notice, this list of conditions and the following disclaimer.
10# 2. Redistributions in binary form must reproduce the above copyright
11#    notice, this list of conditions and the following disclaimer in the
12#    documentation and/or other materials provided with the distribution.
13#
14# THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND
15# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
16# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
17# ARE DISCLAIMED.  IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE
18# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
19# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
20# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
21# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
22# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
23# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
24# SUCH DAMAGE.
25#
26# $FreeBSD: head/etc/rc.d/nsswitch 129650 2004-05-24 11:48:58Z des $
27#
28
29# PROVIDE: nsswitch
30# REQUIRE: root
31# BEFORE:  network
32# KEYWORD: FreeBSD
33
34. /etc/rc.subr
35
36name="nsswitch"
37start_cmd="nsswitch_start"
38stop_cmd=":"
39
40convert_host_conf()
41{
42    host_conf=$1; shift;
43    nsswitch_conf=$1; shift;
44    awk '                                                                   \
45        /^[:blank:]*#/       { next }                                       \
46        /(hosts|local|file)/ { nsswitch[c] = "files"; c++; next }           \
47        /(dns|bind)/         { nsswitch[c] = "dns";   c++; next }           \
48        /nis/                { nsswitch[c] = "nis";   c++; next }           \
49        { printf "Warning: unrecognized line [%s]", $0 > "/dev/stderr" }    \
50        END {                                                               \
51                printf "hosts: ";                                           \
52                for (i in nsswitch) printf "%s ", nsswitch[i];              \
53                printf "\n";                                                \
54        }' < $host_conf > $nsswitch_conf
55}
56
57generate_host_conf()
58{
59    nsswitch_conf=$1; shift;
60    host_conf=$1; shift;
61
62    awk '
63BEGIN {
64    xlat["files"] = "hosts";
65    xlat["dns"] = "bind";
66    xlat["nis"] = "nis";
67    cont = 0;
68}
69sub(/^[\t ]*hosts:/, "") || cont {
70    if (!cont)
71        srcs = ""
72    sub(/#.*/, "")
73    gsub(/[][]/, " & ")
74    cont = sub(/\\$/, "")
75    srcs = srcs " " $0
76}
77END {
78    print "# Auto-generated from nsswitch.conf, do not edit"
79    ns = split(srcs, s)
80    for (n = 1; n <= ns; ++n) {
81        if (s[n] in xlat)
82            print xlat[s[n]]
83    }
84}
85' <$nsswitch_conf >$host_conf
86}
87
88nsswitch_start()
89{
90	# Generate host.conf for compatibility
91	#
92	if [ -f "/etc/nsswitch.conf" ]; then
93		echo 'Generating host.conf.'
94		generate_host_conf /etc/nsswitch.conf /etc/host.conf
95	fi
96
97	# Convert host.conf to nsswitch.conf if necessary
98	#
99	if [ -f "/etc/host.conf" -a ! -f "/etc/nsswitch.conf" ]; then
100		echo ''
101		echo 'Warning: /etc/host.conf is no longer used'
102		echo '  /etc/nsswitch.conf will be created for you'
103		convert_host_conf /etc/host.conf /etc/nsswitch.conf
104	fi
105}
106
107load_rc_config $name
108run_rc_command "$1"
109