1 # Functions for parsing nsswitch.conf
3 $nsswitch_config_file = $config{'nsswitch_conf'} || "/etc/nsswitch.conf";
5 # get_nsswitch_config()
6 # Returns an array ref of information from nsswitch.conf
7 sub get_nsswitch_config
9 if (!scalar(@get_nsswitch_cache)) {
10 @get_nsswitch_cache = ( );
12 open(CONF, $nsswitch_config_file);
16 if (/^\s*(\S+)\s*:\s*(.*)/) {
17 # Found a switch config file
18 local $switch = { 'name' => $1,
22 while($servs =~ /\S/) {
23 if ($servs =~ /^\s*\[([^\]]*)\](.*)/) {
24 # Actions for some source
26 foreach $av (split(/\s+/, $1)) {
27 local ($a, $v) = split(/=/,$av);
28 $srcs[$#srcs]->{lc($a)} =lc($v);
31 elsif ($servs =~ /^\s*(\S+)(.*)/) {
33 push(@srcs, { 'src' => $1 });
37 $switch->{'srcs'} = \@srcs;
38 push(@get_nsswitch_cache, $switch);
44 return \@get_nsswitch_cache;
47 # save_nsswitch_config(&switch)
49 sub save_nsswitch_config
52 local $lref = &read_file_lines($nsswitch_config_file);
53 local $line = "$switch->{'name'}:";
54 foreach my $s (@{$switch->{'srcs'}}) {
55 $line .= " ".$s->{'src'};
57 foreach my $st (keys %$s) {
59 push(@acts, uc($st)."=".$s->{$st});
63 $line .= " [".join(" ", @acts)."]";
66 $lref->[$switch->{'line'}] = $line;
67 &flush_file_lines($nsswitch_config_file);
70 # list_switch_sources()
71 # Returns a list of valid nsswitch.conf sources for this OS, and a map from
72 # sources to allowed services
73 sub list_switch_sources
75 if ($gconfig{'os_type'} =~ /-linux$/) {
77 return ( [ 'files', 'nisplus', 'nis', 'compat', 'dns', 'db',
79 { 'dns' => [ 'hosts' ],
80 'compat' => [ 'passwd', 'shadow', 'group' ] } );
82 elsif ($gconfig{'os_type'} eq 'solaris' && $gconfig{'os_version'} < 8) {
84 return ( [ 'files', 'nis', 'nisplus', 'compat', 'dns' ],
85 { 'dns' => [ 'hosts' ],
86 'compat' => [ 'passwd', 'group' ] } );
88 elsif ($gconfig{'os_type'} eq 'solaris' && $gconfig{'os_version'} >= 8) {
90 return ( [ 'files', 'nis', 'nisplus', 'compat', 'dns', 'ldap',
92 { 'dns' => [ 'hosts' ],
93 'compat' => [ 'passwd', 'group' ],
94 'user' => [ 'printers' ],
95 'xfn' => [ 'printers' ] } );
97 elsif ($gconfig{'os_type'} eq 'aix') {
99 return ( [ 'files', 'nis', 'nisplus', 'compat', 'dns', 'ldap',
101 { 'dns' => [ 'hosts' ],
102 'compat' => [ 'passwd', 'group' ],
103 'user' => [ 'printers' ],
104 'xfn' => [ 'printers' ] } );
106 elsif ($gconfig{'os_type'} eq 'unixware') {
108 return ( [ 'files', 'dns', 'nis', 'nisplus' ],
109 { 'dns' => [ 'hosts' ] } );
113 return ( [ 'files', 'dns', 'nis', 'nisplus' ] );
117 sub list_switch_statuses
119 return ( 'success', 'notfound', 'unavail', 'tryagain' );
122 sub list_switch_actions
124 return ( 'return', 'continue' );