[BACK]Return to MAKEDEV.awk CVS log [TXT][DIR] Up to [cvs.NetBSD.org] / src / etc

Annotation of src/etc/MAKEDEV.awk, Revision 1.16.4.1

1.1       jdolecek    1: #!/usr/bin/awk -
                      2: #
1.16.4.1! liamjfoy    3: #      $NetBSD$
1.1       jdolecek    4: #
                      5: # Copyright (c) 2003 The NetBSD Foundation, Inc.
                      6: # All rights reserved.
                      7: #
                      8: # This code is derived from software contributed to The NetBSD Foundation
                      9: # by Jaromir Dolecek.
                     10: #
                     11: # Redistribution and use in source and binary forms, with or without
                     12: # modification, are permitted provided that the following conditions
                     13: # are met:
                     14: # 1. Redistributions of source code must retain the above copyright
                     15: #    notice, this list of conditions and the following disclaimer.
                     16: # 2. Redistributions in binary form must reproduce the above copyright
                     17: #    notice, this list of conditions and the following disclaimer in the
                     18: #    documentation and/or other materials provided with the distribution.
                     19: # 3. All advertising materials mentioning features or use of this software
                     20: #    must display the following acknowledgement:
                     21: #        This product includes software developed by the NetBSD
                     22: #        Foundation, Inc. and its contributors.
                     23: # 4. Neither the name of The NetBSD Foundation nor the names of its
                     24: #    contributors may be used to endorse or promote products derived
                     25: #    from this software without specific prior written permission.
                     26: #
                     27: # THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
                     28: # ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
                     29: # TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
                     30: # PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
                     31: # BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
                     32: # CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
                     33: # SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
                     34: # INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
                     35: # CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
                     36: # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
                     37: # POSSIBILITY OF SUCH DAMAGE.
                     38: #
                     39:
1.2       jdolecek   40: # Script to generate platform MAKEDEV script from MI template, MD
                     41: # MAKEDEV.conf and MD/MI major lists
                     42: #
                     43: # Uses environment variables MACHINE/MACHINE_ARCH to select
                     44: # appropriate files, and NETBSDSRCDIR to get root of source tree.
                     45:
1.1       jdolecek   46: BEGIN {
                     47:        # top of source tree, used to find major number list in kernel
                     48:        # sources
1.11      lukem      49:        machine = ENVIRON["MACHINE"]
                     50:        maarch = ENVIRON["MACHINE_ARCH"]
                     51:        srcdir = ENVIRON["NETBSDSRCDIR"]
                     52:        if (!machine || !maarch || !srcdir) {
                     53:                print "ERROR: 'MACHINE', 'MACHINE_ARCH' and 'NETBSDSRCDIR' must be set in environment" > "/dev/stderr"
                     54:                exit 1
                     55:        }
                     56:        top = srcdir "/sys/"
1.1       jdolecek   57:        if (system("test -d '" top "'") != 0) {
1.4       jdolecek   58:                print "ERROR: can't find top of kernel source tree ('" top "' not a directory)" > "/dev/stderr"
1.1       jdolecek   59:                exit 1
                     60:        }
                     61:
                     62:
                     63:        # file with major definitions
                     64:        majors[0] = "conf/majors"
1.9       jdolecek   65:        if ((maarch == "arm" || maarch == "armeb") && system("test -f '" top "arch/" machine "/conf/majors." machine "'") != 0)
1.1       jdolecek   66:                majors[1] = "arch/arm/conf/majors.arm32";
1.16.4.1! liamjfoy   67:        else if (machine == "sbmips")
1.6       jdolecek   68:                majors[1] = "arch/evbmips/conf/majors.evbmips";
                     69:        else
1.1       jdolecek   70:                majors[1] = "arch/" machine "/conf/majors." machine;
                     71:
                     72:        # process all files with majors and fill the chr[] and blk[]
                     73:        # arrays, used in template processing
1.3       itojun     74:        for (m in majors) {
1.1       jdolecek   75:                file = top majors[m]
1.4       jdolecek   76:                if (system("test -f '" file "'") != 0) {
                     77:                        print "ERROR: can't find majors file '" file "'" > "/dev/stderr"
                     78:                        exit 1
                     79:                }
1.1       jdolecek   80:                while (getline < file) {
                     81:                        if ($1 == "device-major") {
                     82:                                if ($3 == "char") {
                     83:                                        chr[$2] = $4
                     84:                                        if ($5 == "block")
                     85:                                                blk[$2] = $6
                     86:                                } else if ($3 == "block")
                     87:                                        blk[$2] = $4
                     88:                        }
                     89:                }
1.5       jdolecek   90:                close(file)
1.1       jdolecek   91:        }
                     92:
1.5       jdolecek   93:        # read MD config file for MD device targets
1.11      lukem      94:        cfgfile = srcdir "/etc/etc." machine "/MAKEDEV.conf"
1.5       jdolecek   95:        if (system("test -f '" cfgfile "'") != 0) {
1.7       jdolecek   96:                print "ERROR: no platform MAKEDEV.conf - '" cfgfile "' doesn't exist" > "/dev/stderr"
1.5       jdolecek   97:                exit 1
                     98:        }
1.12      jdolecek   99:        # skip first two lines
                    100:        getline CONFRCSID < cfgfile     # RCS Id
                    101:        getline < cfgfile               # blank line
1.2       jdolecek  102:        MDDEV = 0               # MD device targets
                    103:        while (getline < cfgfile) {
1.5       jdolecek  104:                if (MDDEV)
                    105:                        MDDEV = MDDEV "\n" $0
                    106:                else
                    107:                        MDDEV = $0
                    108:        }
                    109:        close(cfgfile)
                    110:
                    111:        # determine number of partitions used by platform
                    112:        # there are three variants in tree:
                    113:        # 1. MAXPARTITIONS = 8
                    114:        # 2. MAXPARTITIONS = 16 with no back compat mapping
                    115:        # 3. MAXPARTITIONS = 16 with back compat with old limit of 8
                    116:        # currently all archs, which moved from 8->16 use same
                    117:        # scheme for mapping disk minors, high minor offset
                    118:        # if this changes, the below needs to be adjusted and
                    119:        # additional makedisk_p16foo needs to be added
                    120:        incdir = machine
                    121:        diskpartitions = 0
                    122:        diskbackcompat = 0
                    123:        while (1) {
                    124:                inc = top "arch/" incdir "/include/disklabel.h"
                    125:                if (system("test -f '" inc "'") != 0) {
                    126:                        print "ERROR: can't find kernel include file '" inc "'" > "/dev/stderr"
                    127:                        exit 1
                    128:                }
                    129:                incdir = 0
                    130:                while (getline < inc) {
1.6       jdolecek  131:                        if ($1 == "#define" && $2 == "MAXPARTITIONS")
1.5       jdolecek  132:                                diskpartitions = $3
1.6       jdolecek  133:                        else if ($1 == "#define" && $2 == "OLDMAXPARTITIONS")
                    134:                                diskbackcompat = $3
                    135:                        else if ($1 == "#define" && $2 == "RAW_PART")
                    136:                                RAWDISK_OFF = $3
1.16      he        137:                        else if ($1 == "#include" &&
                    138:                                 $2 ~ "<.*/disklabel.h>" &&
                    139:                                 $2 !~ ".*nbinclude.*")
                    140:                        {
1.5       jdolecek  141:                                # wrapper, switch to the right file
                    142:                                incdir = substr($2, 2)
                    143:                                sub("/.*", "", incdir)
                    144:                                break;
                    145:                        }
                    146:                }
1.13      enami     147:                close(inc)
1.5       jdolecek  148:
                    149:                if (diskpartitions)
                    150:                        break;
                    151:
                    152:                if (!incdir) {
                    153:                        print "ERROR: can't determine MAXPARTITIONS from include file '" inc "'" > "/dev/stderr"
                    154:                        exit 1
                    155:                }
1.2       jdolecek  156:        }
1.5       jdolecek  157:        MKDISK = "makedisk_p" diskpartitions    # routine to create disk devs
1.6       jdolecek  158:        DISKMINOROFFSET = diskpartitions
                    159:        if (diskbackcompat) {
1.5       jdolecek  160:                MKDISK = MKDISK "high"
1.6       jdolecek  161:                DISKMINOROFFSET = diskbackcompat
                    162:        }
                    163:        RAWDISK_NAME = sprintf("%c", 97 + RAWDISK_OFF)          # a+offset
1.2       jdolecek  164:
1.11      lukem     165:        # read etc/master.passwd for user name->UID mapping
                    166:        idfile = srcdir "/etc/master.passwd"
                    167:        if (system("test -f '" idfile "'") != 0) {
                    168:                print "ERROR: can't find password file '" idfile "'" > "/dev/stderr"
                    169:                exit 1
                    170:        }
                    171:        oldFS=FS
                    172:        FS=":"
                    173:        while (getline < idfile) {
                    174:                uid[$1] = $3
                    175:        }
                    176:        close(idfile)
                    177:        FS=oldFS
                    178:
                    179:        # read etc/group for group name->GID mapping
                    180:        idfile = srcdir "/etc/group"
                    181:        if (system("test -f '" idfile "'") != 0) {
                    182:                print "ERROR: can't find group file '" idfile "'" > "/dev/stderr"
                    183:                exit 1
                    184:        }
                    185:        oldFS=FS
                    186:        FS=":"
                    187:        while (getline < idfile) {
                    188:                gid[$1] = $3
                    189:        }
                    190:        close(idfile)
                    191:        FS=oldFS
                    192:
1.1       jdolecek  193:        # initially no substitutions
                    194:        devsubst = 0
                    195:        deventry = ""
                    196: }
                    197:
                    198: /%MI_DEVICES_BEGIN%/ {
                    199:        devsubst = 1;
                    200:        next
                    201: }
                    202:
                    203: /%MI_DEVICES_END%/ {
                    204:        devsubst = 0;
                    205:        next
                    206: }
                    207:
1.12      jdolecek  208: # output 'Generated from' lines
                    209: /\$[N]etBSD/ {
                    210:        print "#"
                    211:        print "# Generated from:"
                    212:
                    213:        # MAKEDEV.awk (this script) RCS Id
1.16.4.1! liamjfoy  214:        ARCSID = "$NetBSD$"
1.12      jdolecek  215:        gsub(/\$/, "", ARCSID)
                    216:        print "#        " ARCSID
                    217:
                    218:        # MAKEDEV.tmpl RCS Id
                    219:        gsub(/\$/, "")
                    220:        print $0
                    221:
                    222:        # MD MAKEDEV.conf RCS Id
                    223:        # strip leading hash and insert machine subdirectory name
                    224:        gsub(/\$/, "", CONFRCSID)
                    225:        sub(/^\# /, "", CONFRCSID)
                    226:        sub(/MAKEDEV.conf/, "etc." machine "/MAKEDEV.conf", CONFRCSID)
                    227:        print "#        " CONFRCSID
                    228:
                    229:        next # don't print the RCS Id line again
                    230: }
                    231:
                    232: # filter the 'PLEASE RUN ...' paragraph
                    233: /^\#   PLEASE RUN/, /^\#\#\#\#\#\#/ {
                    234:        next
                    235: }
                    236:
                    237: # filter the device list
                    238: /^\# Tapes/,/^$/ {
                    239:        next
                    240: }
                    241:
1.4       jdolecek  242: # filter the two unneeded makedisk_p* routines, leave only
                    243: # the one used
1.10      dmcmahil  244: /^makedisk_p8\(\) \{/, /^\}/ {
1.4       jdolecek  245:        if (MKDISK != "makedisk_p8")
                    246:                next;
                    247: }
1.10      dmcmahil  248: /^makedisk_p16\(\) \{/, /^\}/ {
1.4       jdolecek  249:        if (MKDISK != "makedisk_p16")
                    250:                next;
                    251: }
1.10      dmcmahil  252: /^makedisk_p16high\(\) \{/, /^\}/ {
1.4       jdolecek  253:        if (MKDISK != "makedisk_p16high")
                    254:                next;
                    255: }
                    256:
1.11      lukem     257: # special cases aside, handle normal line
1.1       jdolecek  258: {
1.8       jdolecek  259:        sub(/^%MD_DEVICES%/, MDDEV)
                    260:        sub(/%MKDISK%/, MKDISK)
                    261:        sub(/%DISKMINOROFFSET%/, DISKMINOROFFSET)
                    262:        sub(/%RAWDISK_OFF%/, RAWDISK_OFF)
                    263:        sub(/%RAWDISK_NAME%/, RAWDISK_NAME)
1.14      enami     264:        parsed = ""
                    265:        line = $0
                    266:        while (match(line, /%[gu]id_[a-z]*%/)) {
                    267:                typ = substr(line, RSTART + 1, 3);
                    268:                nam = substr(line, RSTART + 5, RLENGTH - 6);
                    269:                if (typ == "uid") {
                    270:                        if (!(nam in uid)) {
                    271:                                print "ERROR unmatched uid in `" $0 "'" > \
                    272:                                    "/dev/stderr"
                    273:                                exit 1
                    274:                        } else
                    275:                                id = uid[nam];
                    276:                } else {
                    277:                        if (!(nam in gid)) {
                    278:                                print "ERROR unmatched gid in `" $0 "'" > \
                    279:                                    "/dev/stderr"
                    280:                                exit 1
                    281:                        } else
                    282:                                id = gid[nam];
                    283:                }
1.15      enami     284:                parsed = parsed substr(line, 1, RSTART - 1) id
1.14      enami     285:                line = substr(line, RSTART + RLENGTH)
1.11      lukem     286:        }
1.14      enami     287:        $0 = parsed line
1.2       jdolecek  288:
1.1       jdolecek  289:        # if device substitutions are not active, do nothing more
                    290:        if (!devsubst) {
                    291:                print
                    292:                next
                    293:        }
                    294: }
                    295:
                    296: # first line of device entry
                    297: /^[a-z].*\)$/ {
                    298:        if (length(deventry) > 0) {
                    299:                # We have a previous entry to print. Replace all known
                    300:                # character and block devices. If no unknown character
                    301:                # or block device definition remains within the entry,
                    302:                # print it to output, otherwise scrap it.
1.14      enami     303:                parsed = ""
                    304:                while (match(deventry, /%[a-z]*_(blk|chr)%/)) {
                    305:                        nam = substr(deventry, RSTART + 1, RLENGTH - 6);
                    306:                        typ = substr(deventry, RSTART + RLENGTH - 4, 3);
                    307:                        if (typ == "blk") {
                    308:                                if (!(nam in blk)) {
                    309:                                        deventry = $0
                    310:                                        next
                    311:                                } else
                    312:                                        dev = blk[nam];
                    313:                        } else {
                    314:                                if (!(nam in chr)) {
                    315:                                        deventry = $0
                    316:                                        next
                    317:                                } else
                    318:                                        dev = chr[nam];
                    319:                        }
1.15      enami     320:                        parsed = parsed substr(deventry, 1, RSTART - 1) dev
1.14      enami     321:                        deventry = substr(deventry, RSTART + RLENGTH)
                    322:                }
1.1       jdolecek  323:
1.14      enami     324:                print parsed deventry
1.1       jdolecek  325:        }
                    326:        deventry = $0
                    327:        next
                    328: }
                    329:
                    330: # template line within device substitution section - just keep appending
                    331: # to the current entry
                    332: {
                    333:        deventry = deventry "\n" $0
                    334: }

CVSweb <webmaster@jp.NetBSD.org>