+my @refs;
+my $call = $self->call;
+my $full;
+my $expunge;
+
+# $DB::single = 1;
+
+while (@f) {
+ my $f = shift @f;
+ if ($f =~ /^fu/io) {
+ return (1, $self->msg('e5')) if $self->priv < 5;
+ $full = 1;
+ } elsif ($f =~ /^ex/io) {
+ return (1, $self->msg('e5')) if $self->priv < 6;
+ $expunge = 1;
+ } elsif ($f =~ /^\d+$/o) {
+ $ref = DXMsg::get($f);
+ if (!$ref) {
+ push @out, "Msg $f not found";
+ next;
+ }
+ if ($self->priv < 5 && $ref->to ne $call && $ref->from ne $call) {
+ push @out, "Msg $f not available";
+ next;
+ }
+ push @refs, $ref;
+ } elsif ($f =~ /(\d+)-(\d+)/) {
+ my $from = $1;
+ my $to = $2;
+ @refs = grep { !($self->priv < 5 && $_->to ne $call && $_->from ne $call) } DXMsg::get_all() unless @refs;
+ @refs = grep { $_->msgno >= $from && $_->msgno <= $to } @refs;
+ } elsif ($f =~ /^fr/io) {
+ $f = shift @f;
+ if ($f) {
+ $f = shellregex($f);
+ @refs = grep { !($self->priv < 5 && $_->to ne $call && $_->from ne $call) } DXMsg::get_all() unless @refs;
+ @refs = grep { $_->from =~ m{$f}i } @refs;
+ }
+ } elsif ($f =~ /^to/io) {
+ $f = shift @f;
+ if ($f) {
+ $f = shellregex($f);
+ @refs = grep { !($self->priv < 5 && $_->to ne $call && $_->from ne $call) } DXMsg::get_all() unless @refs;
+ @refs = grep { $_->to =~ m{$f}i } @refs;
+ }
+ } else {
+ push @out, "invalid argument '$f'";
+ return (1, @out);
+ }
+}