#!/bin/rc rfork en ramfs if(~ $#editor 0) editor=hold argv0=$0 all=() debug=() mfile=/tmp/m.$user.$pid new=() quote=() sort=(sort -nr) fn delete{ del=() for(i in $*){ if(test -d /mail/fs/mbox/^$q($i)){ echo delete mbox $q($i) >/mail/fs/ctl del=($del $i) } } echo !$#del messages deleted } fn flag{ for(i in $r) if(~ $1 [\+][aDdfrSs] [-][aDdfrSs]) if(test -d /mail/fs/mbox/^$q($i)) echo $1 >/mail/fs/mbox/^$q($i)^/flags } 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 forward{ for(i in $r){ subject=`{sed -n '6p' /mail/fs/mbox/^$q($i)^/info} subject='Fwd: '$"subject if(~ $new 1){ mffile=/tmp/m.f.$user.$pid >$mffile eval $editor $mffile sendyn if(~ $send y) /bin/upas/marshal \ -s $"subject \ -A /mail/fs/mbox/^$q($i)^/raw \ $* <$mffile } if not /bin/upas/marshal \ -s $"subject \ -t `{file -m /mail/fs/mbox/^$q($i)^/raw} \ -A /mail/fs/mbox/^$q($i)^/raw \ -n $* } } fn getc{ cc=$* switch($1){ case /* while(~ $cc */*) cc=`{echo $cc | sed 's/^.*\///g'} case %* while(~ $cc *%*) cc=`{echo $cc | sed 's/^.*%//g'} case [0-9]*.[0-9]* cc=pb case * cc=`{echo $* | sed 's/^(,|,[0-9]*|[0-9]*,[0-9]*|[0-9]*,|[0-9]*)//g'} ccc=`{echo $1 | sed 's/[^a-zA-Z]//g'} if(~ $cc(1) e F m M mb s w) cc=$cc if not if(~ $#cc 0 && ~ $#ccc 0) cc=p if not if(~ $#ccc 1) cc=$ccc if not if(~ $#cc 0) cc=NEXT } echo $cc } fn getf{ if(~ $1 */*) echo $1 if not echo /mail/box/$user/$1 } fn getpnq{ p=$1 nq=`{ for(i in `{seq $p $#q}) echo $i } } fn getr{ switch($1){ case /* regexp=`{echo $1 | sed 's/^\///g; s/\/.*$//g'} rr=`{grep -e $"regexp $mfile | awk '{print $1;}'} case %* regexp=`{echo $1 | sed 's/^%//g; s/%.*$//g'} rr=`{grep -e $"regexp /mail/fs/mbox/*/body | awk -F '/' '{print $5;}'} case [0-9]*.[0-9]* rr=`{echo $1 | sed 's/\.*$//g'} case * rr=`{echo $1 | sed 's/[^0-9,]//g'} rr=`{ switch($rr){ case *,* start=`{echo $rr | sed 's/,.*$//g'} stop=`{echo $rr | sed 's/^.*,//g'} if(~ $#start 0 && ~ $#stop 0) seq 1 $#q if not if(~ $#start 0) seq 1 $stop if not if(~ $#stop 0) seq $start $#q if not seq $start $stop case [0-9]* echo $rr case * if(! ~ $1 [a-zA-Z]) next echo $p } } } for(i in $rr) if(test -d /mail/fs/mbox/^$q($i)) echo $i } fn mailm{ mmfile=/tmp/m.m.$user.$pid >$mmfile eval $editor $mmfile sendyn if(~ $send y) /bin/upas/marshal $* <$mmfile } fn next{ if(~ $#r 0) nq=`{seq 1 $#q} if not nq=`{nshift $nq} p=$nq(1) r=$p } fn nshift{ shift; echo $* } fn pb{ for(i in $*){ if(test -d /mail/fs/mbox/^$q($r)^/$i){ type=`{echo `{file -m /mail/fs/mbox/^$q($r)^/$i/body}} echo !--- using plumber to type $"type plumb /mail/fs/mbox/^$q($r)^/$i/body.^`{echo $"type | sed 's/^.*\///g'} } if not echo !no sub parts } } fn printb{ if(~ $#p 0) p=0 r=`{ for(i in `{seq `{echo $p+1 | bc} `{echo $p+10 | bc}}) if(~ $i `{echo $nq}) echo $i } if(~ $#r 0) r=$nq getpnq $r($#r) printh } fn printh{ for(i in $r) grep -e '^'$"i' ' $mfile } fn printm{ for(i in $r){ cat /mail/fs/mbox/^$q($i)^/header echo if(~ `{sed -n '7p' /mail/fs/mbox/^$q($i)^/info} *multipart*){ parts=`{ls -p /mail/fs/mbox/^$q($i) | grep -e '^[0-9]'} body=1/body } if not{ parts=() body=body } if(~ `{file -m /mail/fs/mbox/^$q($i)^/^$body} *html*){ echo !/bin/htmlfmt htmlfmt -l60 -cutf8 /mail/fs/mbox/^$q($i)^/^$body } if not cat /mail/fs/mbox/^$q($i)^/^$body echo if(! ~ $#parts 0){ for(j in $parts){ type=`{file -m /mail/fs/mbox/^$q($i)^/$j/body} if(! ~ $type text*){ file=`{cat /mail/fs/mbox/^$q($i)^/$j/filename} if(! ~ $#file 0) file='(file,'$"file')' fake=`{ if(~ $#file 0) echo body if not echo body.^`{echo $type | sed 's/^.*\///g; s/(jpeg|JPEG)/jpg/g'} } size=`{du /mail/fs/mbox/^$q($i)^/$j/$fake} echo !--- $i.$j $type $size $file /mail/fs/mbox/^$q($i)^/$j/$fake } } parts=() } } } fn printmf{ for(i in $*){ flags=`{sed -n '18p' /mail/fs/mbox/^$q($i)^/info | sed 's/-//g' } mime=`{ if(~ `{sed -n '7p' /mail/fs/mbox/^$q($i)^/info} multipart*) echo H } size=`{sed -n '17p' /mail/fs/mbox/^$q($i)^/info} date=`{sed -n '5p' /mail/fs/mbox/^$q($i)^/info | fmtd} from=`{sed 1q /mail/fs/mbox/^$q($i)^/info} subject=`{sed -n '6p' /mail/fs/mbox/^$q($i)^/info | awk '{print substr($0,0,50);}'} echo $"i' '$"mime' '$"flags' '$"size' '$"date' '$"from' '$"subject } } fn printq{ for(i in $r){ if(~ `{cat /mail/fs/mbox/^$q($i)^/type} multipart*) body=1/body if not body=body if(~ `{file /mail/fs/mbox/^$q($i)^/^$body} *HTML*) htmlfmt -l60 -cutf8 /mail/fs/mbox/^$q($i)^/^$body | sed 's/^/> /g' if not sed 's/^/> /g' /mail/fs/mbox/^$q($i)^/^$body echo } } fn printr{ for(i in $r) cat /mail/fs/mbox/^$q($i)^/rawunix } fn printv{ echo q: $q echo nq: $nq echo d: $d echo or: $or echo r: $r echo op: $op echo p: $p echo parts: $parts } fn reply{ mrfile=/tmp/m.r.$user.$pid for(i in $r){ >$mrfile to=`{cat /mail/fs/mbox/^$q($i)^/replyto} if(~ $all 1) to=($to `{cat /mail/fs/mbox/^$q($i)^/cc}) subject=`{cat /mail/fs/mbox/^$q($i)^/subject} if(! ~ $subject Re:*) subject='Re: '$"subject if(~ $quote 1) r=$i printq >$mrfile eval $editor $mrfile sendyn if(~ $send y) /bin/upas/marshal \ -s $"subject \ -R /mail/fs/mbox/^$q($i) \ $to <$mrfile } flag +a } fn sendyn{ echo echo -n 'send (y, n) ' send=`{read} switch($send){ case y n ; case * sendyn } } fn store{ f=() sfile=`{echo $* | sed 's/^s //g'} if(~ $#sfile 0) f=1 for(i in $r){ if(~ $f 1) sfile=`{sed 's/@.*$//g' /mail/fs/mbox/^$q($i)^/replyto} sdir=`{getf $sfile} if(! test -d $sdir) echo create $sfile >/mail/fs/ctl cp /mail/fs/mbox/^$q($i)^/raw $sdir/^`{cat /mail/fs/mbox/^$q($i)^/fileid} echo !saved in $sdir } flag +S f=() } fn update{ if(! ~ $#d 0) delete $d d=() q=`{ls -np /mail/fs/mbox | eval $sort | grep -v ctl} nq=`{seq 1 $#q} p=() r=() printmf $nq >$mfile echo $#q messages } fn write{ wfile=`{echo $* | sed 's/^w //g'} for(i in $r){ cp /mail/fs/mbox/^$q($i)^/body $wfile echo !saved in $wfile } } fn usage { echo usage: $argv0 [ -d ] [ -f mbox ] [ -r ] >[1=2] exit usage } while(~ $1 -*){ switch($1){ case -d; debug=1 case -f; /bin/upas/fs -f `{getf $2}; shift case -r; sort=(sort -n) case *; usage } shift } if(! test -f /mail/fs/ctl) /bin/upas/fs update while(){ echo -n $"p': ' raw=`{read} or=$r op=$p r=`{getr $raw} c=`{getc $raw} if(~ $debug 1){ echo r: $r echo c: $c } switch($c){ case a getpnq $r($#r) all=1 reply case A getpnq $r($#r) all=1 quote=1 reply case b printb case d getpnq $r($#r) d=`{ { for(i in $d $r) echo $i } | sort -n | uniq } r=$d flag +D case e' '* mailm `{nshift $c} case f store case F' '* getpnq $r($#r) flag `{nshift $c} case h getpnq $r($#r) printh case H # printH - mime structure case m' '* getpnq $r($#r) forward `{nshift $c} case M' '* getpnq $r($#r) new=1 forward `{nshift $c} case mb' '* if(! ~ $#d 0) delete $d d=() /bin/upas/fs -f `{getf `{nshift $c}} update case p getpnq $r($#r) printm case P getpnq $r($#r) printr case pb parts=`{echo $r | sed 's/^.*\.//g'} r=`{echo $r | sed 's/\..*$//g'} getpnq $r($#r) pb $parts case q update exit case r getpnq $r($#r) reply case rf getpnq $r($#r) store reply case R getpnq $r($#r) quote=1 reply case s' '* getpnq $r($#r) store `{nshift $c} case u getpnq $r($#r) r=$d flag -D d=`{ { for(i in $r) for(j in $d) if(! ~ $j $i) echo $j } | sort -n | uniq } case w' '* getpnq $r($#r) write `{nshift $c} case x exit case y update case '"' getpnq $r($#r) printq case '|' # cmd w/ body as stdin case '||' # cmd w/ whole msg as stdin case '!' # cmd case '=' echo $p case '?' printv case * echo !illegal command } }