File: mkpath.sh

package info (click to toggle)
smail 3.2.0.102-1
  • links: PTS
  • area: main
  • in suites: slink
  • size: 4,228 kB
  • ctags: 3,924
  • sloc: ansic: 41,366; sh: 3,434; makefile: 2,349; awk: 689; perl: 598; yacc: 427; sed: 2
file content (146 lines) | stat: -rw-r--r-- 3,870 bytes parent folder | download | duplicates (4)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
#! /bin/sh
# @(#) mkpath.sh,v 1.6 1992/07/11 11:40:14 tron Exp
#
# mkpath - make a pathalias output file
#
#    Copyright (C) 1988 Ronald S. Karr and Landon Curt Noll
#    Copyright (C) 1992 Ronald S. Karr
#
# See the file COPYING, distributed with smail, for restriction
# and warranty information.

# Usage:	
#	mkpath [-v] [-V] [-x] [-e] [-n] [-t trace] [path_config]
#
#	-v		verbose mode for mkpath, execution block commands
#			are executed with the sh(1) -v flag
#	-V		pathalias(8) runs with '-v' verbose mode
#	-x 		execution block commands are executed with the
#			sh(1) '-x' option.
#	-e		tries to get mkpath to stop when it encounters a
#			syntax error, and the internal sh(1) to stop when
#			a top level command exits with a non-zero status.
#	-n		disables the execution of any sh(1) commands
#			useful with the '-v' and disables '-x', '-e', '-V', '-t'
#	-t trace	all input of pathalias(8) is to be copied into
#			the file 'trace'.
#	path_config 	pathalia's configuration file, '-' => stdin,
#			or $LIB_DIR/maps/mkpath.conf by default
#
# If '-V' and '-t' are both used, '-V' must be before '-t'.


# base directory for smail library/utility
#
# These directories should be owned by root, and only writeable by root
#
LIB_DIR="X_LIB_DIR_X"
UTIL_BIN_DIR="X_UTIL_BIN_DIR_X"
TMPDIR="X_TMP_DIR_X"
MAPDIR="$LIB_DIR/maps"

# standard locations
#
PATHALIAS=$UTIL_BIN_DIR/pathalias
DCASEHOST=$UTIL_BIN_DIR/dcasehost
AWKFILE=$UTIL_BIN_DIR/mkpath.awk
GLEEM=$UTIL_BIN_DIR/gleem
GETOPT=$UTIL_BIN_DIR/getopt
SORT=sort
PATH="X_UTIL_PATH_X:X_SECURE_PATH_X"; export PATH

# parse args - need a public domain getopt command - XXX
#
PROG=$0
USAGE="$PROG: usage: $PROG [-v] [-V] [-x] [-e] [-n] [-t trace] [path_config]"
set -- `$GETOPT -n $PROG -q vVxent: $*`
if [ "$?" -ne 0 ]; then
    echo "$USAGE" 1>&2
    exit 1
fi
SHELL_ARGS="-"
ERR=0
TEE_FILE=
PWD=`pwd`
for i in $*; do
    case $i in
    -v)	SHELL_ARGS="$SHELL_ARGS"v; shift;;
    -V)	PATHALIAS="$PATHALIAS -v"; shift;;
    -x)	SHELL_ARGS="$SHELL_ARGS"x; shift;;
    -e)	SHELL_ARGS="$SHELL_ARGS"e; ERR=1; shift;;
    -n)	SHELL_ARGS="$SHELL_ARGS"n; shift;;
    -t) if [ -z "$TEE_FILE" ]; then
	    TEE_FILE="$2"; PATHALIAS="tee -a $TEE_FILE | $PATHALIAS";
	fi; shift 2;;
    --)	shift; break;;
    esac
done
# determine the path.conf config file
if [ "$#" -gt 1 ]; then
    echo "$USAGE"
    exit 4
elif [ "$#" -eq 1 ]; then
    CONFIG="$1"
else
    CONFIG=
fi

# verify that we can read the config file
# determine the initial directory
#
if [ "$CONFIG" = "-" ]; then
    CD="$PWD"
    CONFIG="mkpath_stdin"
    CONF=""
elif [ -z "$CONFIG" ]; then
    CD="$MAPDIR"
    cd "$CD"
    CD=`pwd`
    CONFIG="$MAPDIR"/mkpath.conf
    CONF="$CONFIG"
elif [ -r "$CONFIG" ]; then
    if [ "`expr $CONFIG : '\\/'`" -eq 0 ]; then
	CD=`pwd`
    else
    	CD=`echo "$CONFIG" | sed 's,^\(.*\)/[^/][^/]*$,\1,'`
	cd "$CD"
	CD=`pwd`
    fi
    CONF="$CONFIG"
else
    echo "$PROG: can not read $CONFIG" 1>&2
    exit 5
fi

# special action commands
#
# args to run pathalias, switch fields and sort for the pathsort command
PATHSORT="$PATHALIAS -i -D|$DCASEHOST|$SORT -T $TMPDIR"

# export vars needed for the sub-shell
#

# process the config file
#
trap "rm -f $TMPDIR/stm*;exit 1" 1 2 3 15
if [ "$TEE_FILE" ]; then
	cat /dev/null > $TEE_FILE
fi
# strip input of #comments, run it thru awk and into the shell
(echo "#! /bin/sh $SHELL_ARGS"
 echo "PROG=\"$PROG\""
 echo "PWD=\"$PWD\""
 echo "CD=\"$CD\""
 echo "CWD=\"$CD\""
 echo "ERR=\"$ERR\""
 echo "PATH=\"$PATH\""
 echo "GLEEM=\"$GLEEM\""
 echo "PATHALIAS=\"$PATHALIAS\""
 echo "PATHSORT=\"$PATHSORT\""
 echo "export PROG PWD CD CWD ERR PATH GLEEM PATHALIAS PATHSORT"
 if [ -z "$CONF" ]; then
	sed -e 's/[	 ]*#.*$//' -e 's/^[	 ]*//'
 else	
	sed -e 's/[	 ]*#.*$//' -e 's/^[	 ]*//' < "$CONFIG"
 fi | awk -f "$AWKFILE" ERR="$ERR" PROG="$PROG" - ) | /bin/sh "$SHELL_ARGS"
exit $?