# Makefile to (re-)generate db versions of system database files.
# Copyright (C) 1996, 1997, 1998 Free Software Foundation, Inc.
# This file is part of the GNU C Library.
# Contributed by Ulrich Drepper <drepper@cygnus.com>, 1996.
#

# The GNU C Library is free software; you can redistribute it and/or
# modify it under the terms of the GNU Lesser General Public
# License as published by the Free Software Foundation; either
# version 2.1 of the License, or (at your option) any later version.

# The GNU C Library is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
# Lesser General Public License for more details.

# You should have received a copy of the GNU Lesser General Public
# License along with the GNU C Library; if not, write to the Free
# Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
# 02111-1307 USA.

DATABASES = $(wildcard /etc/passwd /etc/group /etc/ethers /etc/protocols \
		       /etc/rpc /etc/services /etc/shadow /etc/netgroup)

VAR_DB = /var/db

AWK = awk
MAKEDB = makedb --quiet

all: $(patsubst %,$(VAR_DB)/%.db,$(notdir $(DATABASES)))


$(VAR_DB)/passwd.db: /etc/passwd
	@echo -n "$(patsubst %.db,%,$(@F))... "
	@$(AWK) 'BEGIN { FS=":"; OFS=":"; cnt=0 } \
		 /^[ \t]*$$/ { next } \
		 /^[ \t]*#/ { next } \
		 { printf "0%u ", cnt++; print } \
		 /^[^#]/ { printf ".%s ", $$1; print; \
			   printf "=%s ", $$3; print }' $^ | \
	$(MAKEDB) -o $@ -
	@echo "done."

$(VAR_DB)/group.db: /etc/group
	@echo -n "$(patsubst %.db,%,$(@F))... "
	@$(AWK) 'BEGIN { FS=":"; OFS=":"; cnt=0 } \
		 /^[ \t]*$$/ { next } \
		 /^[ \t]*#/ { next } \
		 { printf "0%u ", cnt++; print } \
		 /^[^#]/ { printf ".%s ", $$1; print; \
			   printf "=%s ", $$3; print }' $^ | \
	$(MAKEDB) -o $@ -
	@echo "done."

$(VAR_DB)/ethers.db: /etc/ethers
	@echo -n "$(patsubst %.db,%,$(@F))... "
	@$(AWK) 'BEGIN { cnt=0 } \
		 /^[ \t]*$$/ { next } \
		 /^[ \t]*#/ { next } \
		 { printf "0%u ", cnt++; print } \
		 /^[^#]/ { printf ".%s ", $$1; print; \
			   printf "=%s ", $$2; print }' $^ | \
	$(MAKEDB) -o $@ -
	@echo "done."

$(VAR_DB)/protocols.db: /etc/protocols
	@echo -n "$(patsubst %.db,%,$(@F))... "
	@$(AWK) 'BEGIN { cnt=0 } \
		 /^[ \t]*$$/ { next } \
		 /^[ \t]*#/ { next } \
		 { printf "0%u ", cnt++; print } \
		 /^[^#]/ { printf ".%s ", $$1; print; \
			   printf "=%s ", $$2; print; \
			   for (i = 3; i <= NF && !($$i ~ /^#/); ++i) \
			     { printf ".%s ", $$i; print } }' $^ | \
	$(MAKEDB) -o $@ -
	@echo "done."

$(VAR_DB)/rpc.db: /etc/rpc
	@echo -n "$(patsubst %.db,%,$(@F))... "
	@$(AWK) 'BEGIN { cnt=0 } \
		 /^[ \t]*$$/ { next } \
		 /^[ \t]*#/ { next } \
		 { printf "0%u ", cnt++; print } \
		 /^[^#]/ { printf ".%s ", $$1; print; \
			   printf "=%s ", $$2; print; \
			   for (i = 3; i <= NF && !($$i ~ /^#/); ++i) \
			     { printf ".%s ", $$i; print } }' $^ | \
	$(MAKEDB) -o $@ -
	@echo "done."

$(VAR_DB)/services.db: /etc/services
	@echo -n "$(patsubst %.db,%,$(@F))... "
	@$(AWK) 'BEGIN { FS="[ \t/]+"; cnt=0 } \
		 /^[ \t]*$$/ { next } \
		 /^[ \t]*#/ { next } \
		 { printf "0%u ", cnt++; print } \
		 /^[^#]/ { printf ".%s/%s ", $$1, $$3; print; \
			   printf ".%s/ ", $$1; print; \
			   printf "=%s/%s ", $$2, $$3; print; \
			   printf "=%s/ ", $$2; print; \
			   for (i = 4; i <= NF && !($$i ~ /^#/); ++i) \
			     { printf ".%s/%s ", $$i, $$3; print; \
			       printf ".%s/ ", $$i; print } }' $^ | \
	$(MAKEDB) -o $@ -
	@echo "done."

$(VAR_DB)/shadow.db: /etc/shadow
	@echo -n "$(patsubst %.db,%,$(@F))... "
	@$(AWK) 'BEGIN { FS=":"; OFS=":"; cnt=0 } \
		 /^[ \t]*$$/ { next } \
		 /^[ \t]*#/ { next } \
		 { printf "0%u ", cnt++; print } \
		 /^[^#]/ { printf ".%s ", $$1; print }' $^ | \
	(umask 077 && $(MAKEDB) -o $@ -)
	@echo "done."
	@if chgrp shadow $@ 2>/dev/null; then \
	  chmod g+r $@; \
	else \
	  chown 0 $@; chgrp 0 $@; chmod 600 $@; \
	  echo; \
	  echo "Warning: The shadow password database $@"; \
	  echo "has been set to be readable only by root.  You may want"; \
	  echo "to make it readable by the \`shadow' group depending"; \
	  echo "on your configuration."; \
	  echo; \
	fi

$(VAR_DB)/netgroup.db: /etc/netgroup
	@echo -n "$(patsubst %.db,%,$(@F))... "
	@$(AWK) 'BEGIN { cnt=0 } \
		 /^[ \t]*$$/ { next } \
		 /^[ \t]*#/ { next } \
		 { printf "0%u ", cnt++; print } \
		 /^[^#]/ { end=sub(/\\/, " "); \
			   gsub(/[ \t]+/, " "); \
			   if(end == 1) printf "%s", $$0; else print }' $^ | \
	$(MAKEDB) -o $@ -
	@echo "done."
