summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'src/awk/cachedepends.awk')
-rw-r--r--src/awk/cachedepends.awk210
1 files changed, 210 insertions, 0 deletions
diff --git a/src/awk/cachedepends.awk b/src/awk/cachedepends.awk
new file mode 100644
index 0000000..017e231
--- /dev/null
+++ b/src/awk/cachedepends.awk
@@ -0,0 +1,210 @@
+# Copyright 1999-2004 Gentoo Foundation
+# Distributed under the terms of the GNU General Public License v2
+# $Header$
+
+function print_start() {
+ print "source /sbin/functions.sh" >> TMPCACHE
+ print "" >> TMPCACHE
+ print "need() {" >> TMPCACHE
+ print " echo \"NEED $*\"; return 0" >> TMPCACHE
+ print "}" >> TMPCACHE
+ print "" >> TMPCACHE
+ print "use() {" >> TMPCACHE
+ print " echo \"USE $*\"; return 0" >> TMPCACHE
+ print "}" >> TMPCACHE
+ print "" >> TMPCACHE
+ print "before() {" >> TMPCACHE
+ print " echo \"BEFORE $*\"; return 0" >> TMPCACHE
+ print "}" >> TMPCACHE
+ print "" >> TMPCACHE
+ print "after() {" >> TMPCACHE
+ print " echo \"AFTER $*\"; return 0" >> TMPCACHE
+ print "}" >> TMPCACHE
+ print "" >> TMPCACHE
+ print "provide() {" >> TMPCACHE
+ print " echo \"PROVIDE $*\"; return 0" >> TMPCACHE
+ print "}" >> TMPCACHE
+ print "" >> TMPCACHE
+}
+
+function print_header1(mtime) {
+ print "#*** " MYFILENAME " ***" >> TMPCACHE
+ print "" >> TMPCACHE
+ print "myservice=\"" MYFILENAME "\"" >> TMPCACHE
+ print "myservice=\"${myservice##*/}\"" >> TMPCACHE
+ print "echo \"RCSCRIPT ${myservice}\"" >> TMPCACHE
+ print "" >> TMPCACHE
+ print "echo \"MTIME " mtime "\"" >> TMPCACHE
+ print "" >> TMPCACHE
+}
+
+function print_header2(mtime) {
+ print "(" >> TMPCACHE
+ print " # Get settings for rc-script ..." >> TMPCACHE
+ print "" >> TMPCACHE
+ print " [ -e \"/etc/conf.d/${myservice}\" ] && source \"/etc/conf.d/${myservice}\"" >> TMPCACHE
+ print "" >> TMPCACHE
+ print " [ -e /etc/conf.d/net ] && \\" >> TMPCACHE
+ print " [ \"${myservice%%.*}\" = \"net\" ] && \\" >> TMPCACHE
+ print " [ \"${myservice##*.}\" != \"${myservice}\" ] && source /etc/conf.d/net" >> TMPCACHE
+ print "" >> TMPCACHE
+ print " [ -e /etc/rc.conf ] && source /etc/rc.conf" >> TMPCACHE
+ print "" >> TMPCACHE
+ print " depend() {" >> TMPCACHE
+ print " return 0" >> TMPCACHE
+ print " }" >> TMPCACHE
+ print "" >> TMPCACHE
+}
+
+function print_end() {
+ print "" >> TMPCACHE
+ print " depend" >> TMPCACHE
+ print ")" >> TMPCACHE
+ print "" >> TMPCACHE
+}
+
+BEGIN {
+
+ extension("/lib/rcscripts/filefuncs.so", "dlload")
+
+ # Get our environment variables
+ SVCDIR = ENVIRON["SVCDIR"]
+ if (SVCDIR == "") {
+ eerror("Could not get SVCDIR!")
+ exit 1
+ }
+
+ # Since this could be called more than once simultaneously, use a
+ # temporary cache and rename when finished. See bug 47111
+ ("/bin/mktemp "SVCDIR"/depcache.XXXXXXX") | getline TMPCACHE
+ if (TMPCACHE == "") {
+ eerror("Failed to create temporary cache!")
+ exit 1
+ }
+
+ pipe = "ls /etc/init.d/*"
+ while ((pipe | getline tmpstring) > 0)
+ scripts = scripts " " tmpstring
+ close(pipe)
+
+ split(scripts, TMPRCSCRIPTS)
+
+ # Make sure that its a file we are working with,
+ # and do not process scripts, source or backup files.
+ for (x in TMPRCSCRIPTS)
+ if (((isfile(TMPRCSCRIPTS[x])) || (islink(TMPRCSCRIPTS[x]))) &&
+ (TMPRCSCRIPTS[x] !~ /((\.(c|bak))|\~)$/)) {
+
+ RCCOUNT++
+
+ RCSCRIPTS[RCCOUNT] = TMPRCSCRIPTS[x]
+ }
+
+ if (RCCOUNT == 0) {
+ eerror("No scripts to process!")
+ dosystem("rm -f "TMPCACHE)
+ exit 1
+ }
+
+ print_start()
+
+ for (count = 1;count <= RCCOUNT;count++) {
+
+ MYFNR = 1
+ MYFILENAME = RCSCRIPTS[count]
+ STAT_DATA[1] = 1
+
+ while (((getline < (RCSCRIPTS[count])) > 0) && (!NEXTFILE)) {
+
+ # If line start with a '#' and is the first line
+ if (($0 ~ /^[[:space:]]*#/) && (MYFNR == 1)) {
+
+ # Remove any spaces and tabs
+ gsub(/[[:space:]]+/, "")
+
+ if ($0 == "#!/sbin/runscript") {
+
+ if (RCSCRIPTS[count] ~ /\.sh$/) {
+
+ ewarn(RCSCRIPTS[count] " is invalid (should not end with '.sh')")
+ NEXTFILE = 1
+ continue
+ }
+
+ if (stat(MYFILENAME, STAT_DATA) != 0)
+ ewarn("Could not stat \"" MYFILENAME "\"")
+
+ ISRCSCRIPT = 1
+ print_header1(STAT_DATA["mtime"])
+ } else {
+
+ NEXTFILE = 1
+ continue
+ }
+ }
+
+ # Filter out comments and only process if its a rcscript
+ if (($0 !~ /^[[:space:]]*#/) && (ISRCSCRIPT)) {
+
+ # If line contain 'depend()', set GOTDEPEND to 1
+ if ($0 ~ /depend[[:space:]]*\(\)/) {
+
+ GOTDEPEND = 1
+
+ print_header2()
+ print " # Actual depend() function ..." >> TMPCACHE
+ }
+
+ # We have the depend function...
+ if (GOTDEPEND) {
+
+ # Basic theory is that COUNT will be 0 when we
+ # have matching '{' and '}'
+ COUNT += gsub(/{/, "{")
+ COUNT -= gsub(/}/, "}")
+
+ # This is just to verify that we have started with
+ # the body of depend()
+ SBCOUNT += gsub(/{/, "{")
+
+ # Make sure depend() contain something, else bash
+ # errors out (empty function).
+ if ((SBCOUNT > 0) && (COUNT == 0))
+ print " \treturn 0" >> TMPCACHE
+
+ # Print the depend() function
+ print " " $0 >> TMPCACHE
+
+ # If COUNT=0, and SBCOUNT>0, it means we have read
+ # all matching '{' and '}' for depend(), so stop.
+ if ((SBCOUNT > 0) && (COUNT == 0)) {
+
+ GOTDEPEND = 0
+ COUNT = 0
+ SBCOUNT = 0
+ ISRCSCRIPT = 0
+
+ print_end()
+
+ NEXTFILE = 1
+ continue
+ }
+ }
+ }
+
+ MYFNR++
+ }
+
+ close(RCSCRIPTS[count])
+
+ NEXTFILE = 0
+
+ }
+
+
+ assert(dosystem("rm -f "SVCDIR"/depcache"), "system(rm -f "SVCDIR"/depcache)")
+ assert(dosystem("mv "TMPCACHE" "SVCDIR"/depcache"), "system(mv "TMPCACHE" "SVCDIR"/depcache)")
+}
+
+
+# vim:ts=4