#!/bin/akanga
#
# lp [<options>] <prog> ...
#
#	Anzeige aller Prozesse von <prog>. Fuer <prog> darf nur der
#	Programmname (ohne Verzeichnis) angegeben werden.
#
#	Optionen:
#	  -b <text>		Gibt <text> vor jeder Prozesszeile aus.
#	  -k <signal>		An jeden Prozess wird <signal> geschickt.
#	  -q			Schaltet die Ausgabe der Prozesszeilen aus.
#				  -qq schaltet auch die Ausgabe von Fehlern
#				  aus.
#
# Version 1.0.15
#
#	bigfix: lp meldet manchmal laufende Prozesse nicht.
#
# Version 1.0.13
#
#	Der Name des Prozesses wird jetzt zwischen Benutzername und
#	Kommandozeile ausgeben.
#
# Version 1.0.12
#
#	Es gab zwei verschiedene Versionen von lp.  Eine konnte Scripts
#	korrekt anzeigen, die andere nicht.  Diese Version kann es.
#
#	Die korrekte lp-Version hatte den -b Schalter nicht - hinzugefuegt.
#	Ausserdem ist die -q Option neu.
#

initvars -s '' before quiet signal
parseopt '*' b:k:q $*

while (~ $1 -*) {
	switch ($1) {
	case -b
		before = $2
		shift 2

	case -k
		signal = $2
		shift 2

	case -q
		if (~ $quiet '') { quiet = yes } else { quiet = noerrors }
		shift

	case - --
		shift
		break
		
	case *
		echo $0: unknown option: -$1 >[1=2]
		exit 1
		}
	}


if (~ $quiet yes) {
	exec >/dev/null
} else if (~ $quiet noerrors ) {
	exec >/dev/null >[2=1]
	}


ppid = `{ awk '{ print $4; exit }' </proc/$pid/stat }
proglist = $*

data = `{
	cat /proc/[0-9]*/stat |
	awk 'NF > 2  &&  $1 != ENVIRON["ppid"] {
		if (substr($2, 1, 1) == "(")
			$2 = substr($2, 2, length($2) - 2);

		print $1, $2;
		}'
	}
#echo $data >[1=2]

kpid = ()

{ while (! ~ $#data 0 1) {
	process = $data(1)
	prog = $data(2)
	shift data 2

	for (i in $proglist) {
		binary = ''
		if (~ $i /*) {
			binary = $i
			let 'i = basename(i)'

			let 'proginode = stat("-u", binary)'
			let 'procinode = stat("-u", "/proc/" ^ process ^ "/exe")'
#echo $proginode $procinode $process $prog $i >[1=2]
			}

		if (! ~ $binary ''  &&  ! ~ $proginode $procinode) {
			# nichts
		} else if (~ $prog $i) {
			dir = '/proc/' ^ $process
			if (let 'test("-d", dir)') {
				cmdline = `{ cat /proc/$process/cmdline }
				let 'owner = stat("-o", dir)'
				echo $process $owner $i $cmdline

				kpid = ($kpid $process)
				}
			}
		}
	}

  if (! ~ $#data 0)
  	echo $0: internal error >[1=2]

  if (! ~ $signal ''  &&  ! ~ $kpid ()) {
  	kill -$signal $kpid
  	}
  } |
awk '
	BEGIN {
		before = ENVIRON["before"];

		FS = ":";
		FILE = "/etc/passwd";
		while (getline <FILE > 0) {
			user[$3] = $1
			}

		close(FILE);
		FS = " ";
		}

	/./ {
		if ($2 in user)
			$2 = user[$2];

		print before $0;
		}'

exit 0

