NetBSD/distrib/common/makedev2spec.awk

190 lines
4.5 KiB
Awk

# $NetBSD: makedev2spec.awk,v 1.1 2002/02/06 16:08:16 lukem Exp $
#
# Copyright (c) 2002 The NetBSD Foundation, Inc.
# All rights reserved.
#
# This code is derived from software contributed to The NetBSD Foundation
# by Luke Mewburn of Wasabi Systems.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions
# are met:
# 1. Redistributions of source code must retain the above copyright
# notice, this list of conditions and the following disclaimer.
# 2. Redistributions in binary form must reproduce the above copyright
# notice, this list of conditions and the following disclaimer in the
# documentation and/or other materials provided with the distribution.
# 3. All advertising materials mentioning features or use of this software
# must display the following acknowledgement:
# This product includes software developed by the NetBSD
# Foundation, Inc. and its contributors.
# 4. Neither the name of The NetBSD Foundation nor the names of its
# contributors may be used to endorse or promote products derived
# from this software without specific prior written permission.
#
# THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
# ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
# TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
# BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
# POSSIBILITY OF SUCH DAMAGE.
#
# makedev2spec.awk --
# Generate mtree(8) specfile from MAKEDEV.wrapper output.
# Typical usage is:
# MAKEDEVSCRIPT=.../MAKEDEV sh MAKEDEV.wrapper some_devs |
# awk -f makedev2spec.awk > specfile
#
BEGIN \
{
errexit = 0;
prefix = "./dev/";
}
$1 == "ln" \
{
if ($2 != "-fs" || NF != 4)
err("Usage: ln -fs from to");
delete gname[$4];
delete uname[$4];
type[$4] = "type=link link=" $3;
mode[$4] = 0755;
next;
}
$1 == "mkdir" \
{
type[$2] = "type=dir";
next;
}
$1 == "mknod" \
{
if (NF != 5)
err("usage; mknod name type major minor");
if ($3 !~ /^[bc]$/)
err("unknown " $1 " type " $3);
type[$2] = "type=" ($3 == "b" ? "block" : "char" ) \
" device=netbsd," $4 "," $5;
next;
}
$1 == "rm" \
{
for (i = 2; i <= NF; i++) {
if ($i == "-f")
continue;
else if ($i ~ /^-/)
err("Unsupported " $1 " option " $i);
n = split(glob($i), globs, " ");
for (j = 1; j <= n; j++) {
delete type[globs[j]];
delete gname[globs[j]];
delete mode[globs[j]];
delete uname[globs[j]];
}
}
next;
}
# XXX: doesn't change symlinks - need to fix
$1 == "chgrp" \
{
for (i = 3; i <= NF; i++) {
n = split(glob($i), globs, " ");
for (j = 1; j <= n; j++) {
gname[globs[j]] = $2;
}
}
next;
}
# XXX: doesn't change symlinks - need to fix
$1 == "chmod" \
{
for (i = 3; i <= NF; i++) {
n = split(glob($i), globs, " ");
for (j = 1; j <= n; j++) {
mode[globs[j]] = $2;
}
}
next;
}
# XXX: doesn't change symlinks - need to fix
$1 == "chown" \
{
user = $2;
if ((n = match(user, /[\.:]/)) > 0) {
group = substr(user, n + 1);
user = substr(user, 1, n-1);
} else {
group = "";
}
for (i = 3; i <= NF; i++) {
n = split(glob($i), globs, " ");
for (j = 1; j <= n; j++) {
uname[globs[j]] = user;
if (group != "")
gname[globs[j]] = group;
}
}
next;
}
{
err("Unknown keyword " $1);
}
END \
{
if (errexit == 0) {
for (i in type) {
printf("%s%-15s %s mode=0%s uname=%s gname=%s\n",
prefix, i, type[i],
mode[i] ? mode[i] : "600",
uname[i] ? uname[i] : "root",
gname[i] ? gname[i] : "wheel");
}
}
}
function err(msg) \
{
printf("%s at line %d of input.\n", msg, NR) >"/dev/stderr";
errexit=1;
exit 1;
}
function glob(g, l, result) \
{
if (g !~ /[?*[]/)
return g;
result = "";
gsub(/\./, "\\.", g);
gsub(/?/, ".", g);
gsub(/*/, ".*", g);
g = "^" g "$";
#print "glob() got a glob " g >"/dev/stderr";
for (l in type) {
#print "glob() checking " l " and " g >"/dev/stderr";
if (l ~ g) {
result = l " " result;
#print "glob(" $0 ") matched " l " and " g >"/dev/stderr";
}
}
#print "glob(" $0 ") returned " result >"/dev/stderr";
return result;
}