chip@tct.uucp (Chip Salzenberg) (05/04/90)
[This article is a good example of why we need "comp.unix.admin".] Dismayed by the weird behavior of SCO Xenix "wall" (write to all users), I wrote a Perl version that I like a lot better: 1. It has nice prompts. 2. It tells you who you're writing to. 3. It skips pseudo-ttys, which is nice since we use pty-based multiscreens. (You may want to remove this feature.) Shar and enjoy. #! /bin/sh # This is a shell archive. Remove anything before this line, then unpack # it by saving it into a file and typing "sh file". To overwrite existing # files, type "sh file -c". You can also feed this as standard input via # unshar, or by typing "sh <file", e.g.. If this archive is complete, you # will see the following message at the end: # "End of shell archive." # Contents: wall # Wrapped by root@tct on Fri May 4 09:40:24 1990 PATH=/bin:/usr/bin:/usr/ucb ; export PATH if test -f 'wall' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'wall'\" else echo shar: Extracting \"'wall'\" \(911 characters\) sed "s/^X//" >'wall' <<'END_OF_FILE' Xeval 'exec /bin/perl -wS $0 ${1+"$@"}' X if 0; X X# X# A Perl version of the rather screwy Xenix "wall" command. X# Written by Chip Salzenberg, 3 May 1990. X# X X$| = 1; X X$_ = `who am i 2>/dev/null`; Xchop; X($me) = split; X$me = "Somebody" unless $me; X Xprint "Enter the message to broadcast. End with ^D.\n" if -t STDIN; Xfor (;;) { X print ">> "; X $_ = <STDIN>; X unless (defined($_)) { X print "<EOF>\n" if -t STDIN; X last; X } X chop; X push(@MSG, "$_ \r\n"); X} Xunless (@MSG) { X print stderr "wall: no message.\n"; X exit; X} Xunshift(@MSG, "\007\r\nBroadcast Message from $me: \r\n"); X Xopen(WHO, "who|"); Xwhile (<WHO>) { X chop; X @F = split; X $tty = $F[1]; X X next if $tty =~ /^ttyp.$/; X X $TTY = "/dev/$tty"; X unless (-c $TTY) { X print stderr "wall: $tty: no such device\n"; X next; X } X unless (open(TTY, ">> $TTY")) { X print stderr "wall: can't open /dev/$tty: $!\n"; X next; X } X print TTY @MSG; X close(TTY); X} Xclose(WHO); END_OF_FILE if test 911 -ne `wc -c <'wall'`; then echo shar: \"'wall'\" unpacked with wrong size! fi chmod +x 'wall' # end of 'wall' fi echo shar: End of shell archive. exit 0 -- Chip Salzenberg at ComDev/TCT <chip%tct@ateng.com>, <uunet!ateng!tct!chip>
kayvan@mrspoc.Transact.COM (Kayvan Sylvan) (05/05/90)
In article <264186E0.17B3@tct.uucp> chip@tct.uucp (Chip Salzenberg) writes: [... a rather nice version of wall ...] $_ = `who am i 2>/dev/null`; chop; ($me) = split; $me = "Somebody" unless $me; Instead of the above, I would do: ($me = getlogin) || (($me) = getpwuid($<)) || ($me = "Somebody"); No extra process. ---Kayvan -- | Kayvan Sylvan @ Transact Software, Inc. -*- Los Altos, CA (415) 961-6112 | | Internet: kayvan@{mrspoc.Transact.com, eris.berkeley.edu, largo.ig.com} | | UUCP: ...!{apple,pyramid,bionet,mips}!mrspoc!kayvan "Imagine Cute Saying" |
lwall@jato.Jpl.Nasa.Gov (Larry Wall) (05/06/90)
In article <KAYVAN.90May5003631@mrspoc.Transact.COM> kayvan@mrspoc.Transact.COM (Kayvan Sylvan) writes: : In article <264186E0.17B3@tct.uucp> chip@tct.uucp (Chip Salzenberg) writes: : : [... a rather nice version of wall ...] : : $_ = `who am i 2>/dev/null`; : chop; : ($me) = split; : $me = "Somebody" unless $me; : : Instead of the above, I would do: : : ($me = getlogin) || (($me) = getpwuid($<)) || ($me = "Somebody"); Granted that the manual says something like that, but it can be shortened, since || always returns one or the other of its arguments, rather than 0 and 1. [Gee, I suppose I should document that somewhere...] I would say $me = getlogin || (getpwuid($<))[0] || "Somebody"; (Though, of course, that ()[] presumes patchlevel 18.) You could even say $me = getlogin || (getpwuid($<))[0] || die "Intruder Alert!\n"; Larry