#!/bin/sh # # CDDL HEADER START # # The contents of this file are subject to the terms of the # Common Development and Distribution License (the "License"). # You may not use this file except in compliance with the License. # # You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE # or http://www.opensolaris.org/os/licensing. # See the License for the specific language governing permissions # and limitations under the License. # # When distributing Covered Code, include this CDDL HEADER in each # file and include the License file at usr/src/OPENSOLARIS.LICENSE. # If applicable, add the following below this CDDL HEADER, with the # fields enclosed by brackets "[]" replaced with your own identifying # information: Portions Copyright [yyyy] [name of copyright owner] # # CDDL HEADER END # # Copyright 2008 Sun Microsystems, Inc. All rights reserved. # Use is subject to license terms. # PATH="/usr/bin:/usr/sbin:${PATH}" export PATH while read src dest; do if [ ! -f $dest ]; then cp -p $src $dest continue; fi newdest=/tmp/i.logindevperm.$$ cat /dev/null > $newdest while read line; do # if not an entry, just print as is and move to next record entry=`echo "$line" | egrep "^[# ]*/[a-zA-Z0-9\/]+[ ]+[0-9]+[ ]+"` if [ -z "$entry" ]; then echo "$line" continue fi # extract 'devices' field devices=`echo "$line" | awk '{print $3}'` if [ -z "$devices" ]; then echo "$line" continue fi # extract 'drivers' field drivers=`echo "$line" | awk '{print $4}'` found_driver=`echo "$drivers" | egrep "^driver="` if [ -z "$found_driver" ]; then drivers="" fi devices=`echo "$devices" | sed 's/\[/\\\[/g' | sed 's/\]/\\\]/g' | sed 's/\+/\\\+/g' | sed 's/\*/\\\*/g'` # if dest has an entry for these devices and the difference # between dest entry and src entry is not only # "/dev/console" vs. "/dev/vt/active", preserve dest entry dest_entry=`egrep "^[# ]*/[a-zA-Z0-9\/]+[ ]+[0-9]+[ ]+$devices[ ]*$drivers" $dest | tail -1 2>/dev/null` tmp_line=`echo "$line" | sed 's:/dev/vt/active:/dev/console:'` if [ -n "$dest_entry" ] && [ "$dest_entry" != "$tmp_line" ]; then echo "$dest_entry" else echo "$line" fi done < $src > $newdest # now carry over user's own entries while read line; do # skip non-entries entry=`echo "$line" | egrep "^[# ]*/[a-zA-Z0-9\/]+[ ]+[0-9]+[ ]+"` if [ -z "$entry" ]; then continue fi # extract 'devices' field devices=`echo "$line" | awk '{print $3}'` if [ -z "$devices" ]; then continue fi # extract 'drivers' field drivers=`echo "$line" | awk '{print $4}'` found_driver=`echo "$drivers" | egrep "^driver="` if [ -z "$found_driver" ]; then drivers="" fi devices=`echo "$devices" | sed 's/\[/\\\[/g' | sed 's/\]/\\\]/g' | sed 's/\+/\\\+/g' | sed 's/\*/\\\*/g'` # if dest has an entry for these devices, preserve that dest_entry=`egrep "^[# ]*/[a-zA-Z0-9\/]+[ ]+[0-9]+[ ]+"$devices"[ ]*"$drivers"" $newdest | tail -1 2>/dev/null` if [ -z "$dest_entry" ]; then echo "$line" fi done < $dest >> $newdest cp $newdest $dest rm -f $newdest done exit 0