#!/bin/rc # Mother wants to talk to you. # use with nupas/fs rfork en ramfs argv0=$0 if(~ $#editor 0) editor=hold mb=mbox msg=() fn d{ if(test $1 -le $#rposts && test -d $rposts($1)){ dposts=($dposts $1) flag +D $1 } if not echo !address } fn deldposts{ ndel=() for(i in $dposts){ if(test $i -le $#rposts && test -d $rposts($i)){ echo delete $mb $rposts($i) >/mail/fs/ctl ndel=($ndel $i) } } echo !$#ndel messages deleted } fn e{ >/tmp/e eval $editor /tmp/e yn send if(~ $yn y) /bin/upas/marshal $* $rposts($2)^/flags puth $2 } || echo !address } } fn fmtd{ date=`{cat} switch($date(2)){ case Jan; mo=1 case Feb; mo=2 case Mar; mo=3 case Apr; mo=4 case May; mo=5 case Jun; mo=6 case Jul; mo=7 case Aug; mo=8 case Sep; mo=9 case Oct; mo=10 case Nov; mo=11 case Dec; mo=12 } switch($date(3)){ case [0-9] da=0^$date(3) case * da=$date(3) } switch($date(6)){ case `{date | awk '{print $6;}'} ti=`{echo $date(4) | awk '{print substr($0,0,5);}'} case * ti=$date(6) } echo $mo/$da $ti } fn geth{ for(i in $*){ fcp $rposts($i)^/info /tmp/ flags=`{sed -n 18p /tmp/info | sed 's/-//g'} mime=`{ if(~ `{sed -n 7p /tmp/info} multipart*) echo H } size=`{sed -n 17p /tmp/info} date=`{sed -n 5p /tmp/info | fmtd} from=`{sed -n 1p /tmp/info} subject=`{sed -n 6p /tmp/info | awk '{print substr($0,0,50);}'} rm /tmp/info # unicode 00a0 divides message number from headline. # command input ignores everything after unicode 00a0. # these lines may be selected and sent to the prompt. echo ' '$"i' '$"mime' '$"flags' '$"size' '$"date' '$"from' '$"subject } } fn getposts{ ls | grep -e '^[0-9]+$' | sort -n } fn getr{ switch($*){ case ,; echo $posts case ,*; seq 1 `{echo $* | sed 's/,//g'} case *,; seq `{echo $* | sed 's/,//g'} $posts($#posts) case *,*; seq `{echo $* | sed 's/,/ /g'} case *; echo $* } } fn h{ sed -n $1^p /tmp/h } fn m{ if(test $1 -le $#rposts && test -f $rposts($1)^/info){ subject=`{sed -n 6p $rposts($1)^/info} if(! ~ $subject FWD:* Fwd:* fwd:*) subject=(Fwd: $subject) e -s $"subject -A $rposts($1)^/raw $*(2-) flag +a $1 } if not echo !address } fn printhelp{ echo 'Commands are of the form [] [args] := | ',' := a reply to sender and recipients b print the next ten headers d mark for deletion e ... enter message (args passed to upas/marshal) g/regexp/cmd grep headlines for regexp and run cmd on matches h print message headline (,h for all) help print this help message m ... forward mail to address(es) mb ... change to specified mailbox p print the processed message P print the raw message q quit r reply to message s ... store message in specified mailbox u remove deletion mark y synchronize with mail box " print message in quoted form, suitable for reply' } fn p{ if(test $1 -le $#rposts && test -f $rposts($1)^/header){ { # avoid stutter by dumping everything everything into a file first cat $rposts($1)^/header echo if(~ `{sed -n 7p $rposts($1)^/info} multipart*){ parts=`{ls -p $rposts($1) | grep -e '^[0-9]+'} body=1/body if(test -f $rposts($1)^/1/1/body) body=1/1/body } if not{ parts=() body=body } if(~ `{file -m $rposts($1)^/$body} *html*){ echo !/bin/htmlfmt htmlfmt -l60 -cutf8 $rposts($1)^/$body } if not cat $rposts($1)^/$body echo if(! ~ $#parts 0){ parts=$parts(2-) for(j in $parts){ type=`{sed -n 7p $rposts($1)^/$j/info} disp=`{sed -n 8p $rposts($1)^/$j/info} file=`{sed -n 9p $rposts($1)^/$j/info} if(! ~ $#file 0 || ~ $disp file inline){ file='(file,'$"file')' fake=`{ if(~ $file *.*) echo body.^`{echo $file | sed 's/^.*\.//g'} if not echo body } size=`{du $rposts($1)^/$j/$fake} echo !--- $rposts($1)^.$j $type $size(1) $file /mail/fs/$mb/^$rposts($1)^/$j/$fake } } parts=() } } >/tmp/p cat /tmp/p go=1 r=$1 post=$1 prompt=$1 flag +s $1 } if not echo !address } fn P{ if(test $1 -le $#rposts && test -f $rposts($1)^/rawunix){ cat $rposts($1)^/rawunix go=1 r=$1 post=$1 prompt=$1 flag +s $1 } if not echo !address } fn puth{ fcp $rposts($1)^/info /tmp/ flags=`{sed -n 18p /tmp/info | sed 's/-//g'} mime=`{ if(~ `{sed -n 7p /tmp/info} multipart*) echo H } size=`{sed -n 17p /tmp/info} date=`{sed -n 5p /tmp/info | fmtd} from=`{sed -n 1p /tmp/info} subject=`{sed -n 6p /tmp/info | awk '{print substr($0,0,50);}'} rm /tmp/info { echo $1 echo c # remember: unicode 00a0 divides message number from headline. echo ' '^$1^' '$"mime' '$"flags' '$"size' '$"date' '$"from' '$"subject echo . echo w echo q } | sam -d /tmp/h >/dev/null >[2=1] } fn r{ if(test $1 -le $#rposts && test -f $rposts($1)^/info){ subject=`{sed -n 6p $rposts($1)^/info} if(! ~ $subject RE:* Re:* re:*) subject=(Re: $subject) e -s $"subject $*(2-) `{sed -n 4p $rposts($1)^/info} flag +a $1 } if not echo !address } fn s{ if(test $1 -le $#rposts && test -f $rposts($1)^/raw){ if(! test -d /mail/box/$user/$2) echo create $2 >/mail/fs/ctl fcp $rposts($1)^/raw /mail/box/$user/$2/^`{cat $rposts($1)^/fileid} flag +S $1 echo !saved in $2 } if not echo !address } fn u{ if(test $1 -le $#rposts && test -d $rposts($1)) flag -D $1 if not echo !address dposts=`{grep -v $1 <{for(j in $dposts){ echo $j }}} } fn y{ go=() r=$post if(! ~ $#dposts 0){ deldposts dposts=() } if(! ~ $q 1){ rposts=`{getposts} posts=`{seq 1 $#rposts} post=$posts(1) prompt=$post geth $posts >/tmp/h if(~ $#msg 0) echo $#posts messages } } fn yn{ echo echo -n $* ' (y, n) ' yn=`{read} switch($yn){ case y n ; case * yn } } fn '"' { p $1 | sed 1d | sed 's/^/> /g' | sed 's/^> >/>>/g' } fn usage{ echo usage: $argv0 [ -d ] [ -f mbox ] >[1=2] exit usage } while(~ $1 -*){ switch($1){ case -d; debug=1 case -f; mb=$2; shift case -p; msg=$2; shift case *; usage } shift } if(! ~ $#* 0) usage if(! test -f /mail/fs/ctl) /bin/upas/fs >[2]/dev/null if(! ~ $mb mbox) echo open /mail/box/$user/$mb $mb >/mail/fs/ctl builtin cd /mail/fs/$mb y if(! ~ $#msg 0) p $msg while(){ echo -n $"prompt': ' # command input ignores everything after unicode 00a0. rcmd=`{read | sed 's/[ ].*$//g' | sed 's/^([0-9]+)?(,)?([0-9]+)?/& /g'} switch($rcmd){ case ,* [0-9]* r=`{getr $rcmd(1)} cmd=$rcmd(2-) if(~ $#cmd 0) cmd=p case * r=$post cmd=$rcmd } switch($cmd){ case a a' '* for(i in $r) r $i $cmd(2-) `{sed -n 2,3p $rposts($i)^/info | sort -n | uniq} post=$r($#r) prompt=$post case b r=`{seq $r(1) `{echo $r(1)^+10|bc}} if(test $r($#r) -gt $posts($#posts)) r=`{seq $r(1) $posts($#posts)} if(! ~ $#r 0 && test $r(1) -le $posts($#posts)){ sed -n $r(1)^,$r($#r)^p /tmp/h post=$r($#r) prompt=$post } if not echo !address case d for(i in $r) d $i post=$r($#r) prompt=$post case e' '* e $cmd(2-) case g/* regexp=`{echo $cmd | awk -F '/' '{print $2;}'} # BUG: / is stripped from regexp and cmd cmd=`{echo $cmd | awk -F '/' '{$1=""; $2=""; print;}'} r=`{/mail/fs/ctl builtin cd /mail/fs/$mb y post=$posts(1) prompt=$post } if not echo !/mail/box/$user/$nmb does not exist case p for(i in $r) p $i case P for(i in $r) P $i case q q=1 y # BUP STOP exit case r r' '* for(i in $r) r $i $cmd(2-) post=$r($#r) prompt=$post case s' '* for(i in $r) s $i $cmd(2-) post=$r($#r) prompt=$post case u for(i in $r) u $i post=$r($#r) prompt=$post case y y case '"' for(i in $r) '"' $i post=$r($#r) prompt=$post case '?' echo dposts: $dposts echo rposts: $rposts echo posts: $posts echo post: $post echo r: $r case * if(~ $post $posts(1) && ~ $#go 0) p $post if not if(! ~ $post $posts($#posts)){ post=`{echo $post^+1 | bc} if(test $post -gt $posts($#posts)) post=$posts($#posts) p $post } } }