#! @im_path_perl@
################################################################
###
### imget
###
### Author: Internet Message Group
### Created: Jan 14, 1996
### Revised: Apr 23, 2007
###
BEGIN {
@im_my_siteperl@
@im_src_siteperl@
};
$Prog = 'imget';
my $VERSION_DATE = "20161010";
my $VERSION_NUMBER = "153";
my $VERSION = "${Prog} version ${VERSION_DATE}(IM${VERSION_NUMBER})";
my $VERSION_INFORMATION = "${Prog} (IM ${VERSION_NUMBER}) ${VERSION_DATE}
Copyright (C) 1999 IM developing team
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
";
##
## Require packages
##
use IM::Config;
use IM::MsgStore;
use IM::Scan;
use IM::Util;
use integer;
use strict;
use vars qw($Prog $EXPLANATION @EnvConfig @OptConfig
$INSECURE $SUIDROOT
$opt_quiet $opt_noscan $opt_scaninboxonly $opt_form $opt_jissafe
$opt_width $opt_lock $opt_count $opt_keep $opt_protokeep $opt_src
$opt_dst $opt_mode $opt_assoc $opt_verbose $opt_buffer
$opt_debug $opt_help $opt_version);
##
## Environments
##
my $NNTP_processed;
$EXPLANATION = "$VERSION
get mail/news messages
Usage: $Prog [OPTIONS]
";
@EnvConfig = (
'NNTPSERVERS;s;;' => "Default NNTP servers.",
);
@OptConfig = (
'src;s;;' =>
"Message source: 'local[:path_of_mailbox]'\n" .
"\t\t\t\t'pop[/APOP|/RPOP|/POP][:user][\@host]'\n" .
"\t\t\t\t'imap[/AUTH|/LOGIN][:user][\@host]'\n" .
"\t\t\t\t'imap%folder[//AUTH|//LOGIN][:user][\@host]'\n" .
"\t\t\t\t'nntp:group[\@host]' or\n" .
"\t\t\t\t'stdin'" ,
'dst;s;;' =>
'Message destination: "+folder" or "=locally.saved.news"',
'noscan;b;;' => 'No scan listings',
'scaninboxonly,o;b;;'=> 'Do not show scanned-lines if InboxFolder != dst',
'form;s;;' => 'Scan format',
'buffer;B;;' => 'Make output data buffered',
'jissafe;b;;' => 'Safe manner for JIS',
'width;i;;' => 'Width of result for scan listings',
# 'thread;b;;' => 'Make threads',
# 'indent;i;;' => "Width of thread indent",
'lock;s;flock;' => 'Local mailbox locking style. (none,flock,file)',
'rpath;s;append;' => "Conversion of UNIX From line into Return-Path:\n" .
"\t\t(append, ignore, replace)",
'keep;i;0;' => "Preserve messages\n" .
"\t\t(POP: in days; 0=delete immediately, -1=preserve forever)\n" .
"\t\t(otherwise: 0=delete immediately, non0=preserve forever)",
'protokeep;s;UIDL;'=> "Protocol type to use for keeping messages on POP\n".
"\t\t(UIDL, LAST, STATUS, MSGID)\n" .
"\t\tTimed out deletion is not supported with LAST",
'usecl;b;;Obey_CL' => "Use value of Content-Length header for delimitation".
"\n\t\t(effective only if source of messages is local)" ,
'count;i;;' => 'Number of messages to be gotten in a process (NNTP)',
'mode;s;get;' => 'Processing mode: "get", "from" or "check"',
'assoc;s;;' => "Association list: dst1=src1;dst2=src2;...\n" .
"\t\tThis overrides --dst and --src options",
'mimedecodequoted,x;b;;' => 'Decode broken mime-encoded strings',
'SSHServer,S;s;localhost;SSH_server'
=> 'SSH port relay server',
'quiet;b;;' => 'Suppress informational messages',
'verbose;b;;' => 'With verbose messages',
'debug;d;;' => "With debug message",
'help;b;;' => "Display this help and exit",
'version,V;b;;' => "Output version information and exit",
);
##
## Dropping root privilidge
##
if (unixp() && $> == 0 && $< != 0) {
$SUIDROOT = 1;
# if RPOP
{
require IM::TcpTransaction && import IM::TcpTransaction;
pool_priv_sock(3); # XXX number of sockets to be pooled
}
im_notice("dropping root privilidge.\n");
$> = $<; # drop root
$< = $<; # be sure not to gain root again
$> = 0; # try to gain root
if ($> == 0) { # oops, gained again
$INSECURE = 1;
$> = $<; # drop root
}
if ($> == 0) {
im_die("still having root privilege.\n");
}
}
##
## Profile and option processing
##
my $selector = read_cfg_selector(\@ARGV);
init_opt(\@OptConfig);
read_env(\@EnvConfig);
read_cfg();
set_selector($selector) == 0 or exit 1 if defined($selector);
my $myinbox = inbox_folder($selector);
$opt_dst = $myinbox if ($opt_dst eq '');
my $cnf_src = $opt_src; $opt_src = '';
my $cnf_dst = $opt_dst; $opt_dst = '';
my $cnf_assoc = $opt_assoc; $opt_assoc = '';
read_opt(\@ARGV); # help?
print("${VERSION_INFORMATION}") && exit $EXIT_SUCCESS if $opt_version;
help($EXPLANATION) && exit $EXIT_SUCCESS if $opt_help;
debug_option($opt_debug) if $opt_debug;
##
## Main
##
$SIG{'ALRM'} = \&alarm_func;
if ($opt_src eq '' && $opt_dst eq '') {
$opt_src = $cnf_src;
$opt_dst = $cnf_dst;
$opt_assoc = $cnf_assoc if ($opt_assoc eq '');
} else {
$opt_src = $cnf_src if ($opt_src eq '');
$opt_dst = $cnf_dst if ($opt_dst eq '');
}
read_petnames();
&set_scan_form($opt_form, $opt_width, $opt_jissafe);
my($assoc, $msgs);
if ($opt_assoc ne '') {
foreach $assoc (split(';', $opt_assoc)) {
if ($assoc =~ /(\S+)\s*=\s*(\S+)/) {
my($dst, $src) = ($1, $2);
my $m = &get_sub($src, $dst, $opt_mode, $myinbox);
$msgs = $m if ($m > $msgs);
} else {
im_warn("invalid parameter for --assoc: $assoc.\n");
}
}
} else {
$msgs = &get_sub($opt_src, $opt_dst, $opt_mode, $myinbox);
}
&nntp_close if ($NNTP_processed);
if ($msgs > 0) {
exit $EXIT_SUCCESS;
} else {
exit $EXIT_ERROR;
}
##
## End of Main
##
sub get_sub {
my($src, $dst, $mode, $myinbox) = @_;
my($msgs);
if ($mode ne "get" && $mode ne "check" && $mode ne "from"
&& $mode ne "skip") {
im_die("unknown mode: $mode\n");
}
my $noscan = $opt_noscan ||
($opt_scaninboxonly && ($myinbox ne $dst));
if ($src =~ /^local/i) {
require IM::LocalMbox && import IM::LocalMbox;
$msgs = local_get_msg($src, $dst, $mode, $opt_lock, $noscan);
} elsif ($src =~ /^pop/i) {
require IM::Pop && import IM::Pop;
$msgs = pop_get_msg($src, $dst, $mode, $noscan);
} elsif ($src =~ /^imap/i) {
require IM::Imap && import IM::Imap;
$msgs = imap_get_msg($src, $dst, $mode, $opt_count, $noscan);
} elsif ($src =~ /^nntp/i || $src =~ /^news/i) {
require IM::Nntp && import IM::Nntp;
$msgs = nntp_get_msg($src, $dst, $mode, $opt_count, $noscan);
$NNTP_processed = 1;
} elsif ($src =~ /^stdin/i) {
process_stdin($noscan);
} else {
im_die("source \"$src\" is not supported.\n");
return -1;
}
return $msgs;
}
sub process_stdin($) {
my $noscan = shift;
my @Message = ();
while () {
push(@Message, $_);
}
&store_message(\@Message, $opt_dst, $noscan);
&exec_getsbrfile($opt_dst);
}
sub alarm_func() {
# no operation
}
### ToDo list
# code conversion
# auto refile
# filter execution
__END__
=head1 NAME
imget - get mail/news messages
=head1 SYNOPSIS
B [OPTIONS]
=head1 DESCRIPTION
The I command incorporates messages from mail/news servers.
This command is provided by IM (Internet Message).
=head1 OPTIONS
=over 5
=item I<-s, --src=STRING>
Message source: 'local[:path_of_mailbox]',
'pop[/APOP|/RPOP|/POP][:user][@host]',
'imap[[/AUTH|/LOGIN]|%folder[//AUTH|//LOGIN]][:user][@host]',
'nntp:group[@host]', or
'stdin'.
=item I<-d, --dst=STRING>
Message destination: "+folder" or "=locally.saved.news".
=item I<-n, --noscan={on,off}>
No scan listings.
=item I<-o, --scaninboxonly={on,off}>
Do not show scanned-lines if InboxFolder != dst.
=item I<-f, --form=STRING>
Scan format. Default value is "%+5n %m%d %-14A %S || %b".
=item I<-b, --buffer={on,off}>
Make output data buffered.
=item I<-j, --jissafe={on,off}>
Safe manner for JIS. Default value is "on".
=item I<-w, --width=NUM>
Width of result for scan listings. Default value is 80.
=item I<-l, --lock=STRING>
Local mailbox locking style (none, flock, file).
Default value is "flock".
=item I<-r, --rpath=STRING>
Conversion of UNIX From line into Return-Path: (append, ignore, replace).
Default value is "append".
=item I<-k, --keep=NUM>
Preserve messages. Default value is 0.
(POP: in days; 0=delete immediately, -1=preserve forever)
(otherwise: 0=delete immediately, non0=preserve forever)
=item I<-p, --protokeep=STRING>
Protocol type to use for keeping messages on POP (UIDL, LAST, STATUS, MSGID).
Timed out deletion is not supported with LAST.
Default value is "UIDL".
=item I<-u, --usecl={on,off}>
Use value of Content-Length header for delimitation.
(effective only if source of messages is local).
=item I<-c, --count=NUM>
Number of messages to be gotten in a process (NNTP).
=item I<-m, --mode=STRING>
Processing mode: "get", "from" or "check".
Default value is "get".
=item I<-a, --assoc=STRING>
Association list: dst1=src1;dst2=src2;...
This overrides --dst and --src options.
=item I<-x, --mimedecodequoted={on,off}>
Decode broken mime-encoded strings.
=item I<-S, --sshserver=SERVER>
SSH port relay server.
=item I<-q, --quiet={on,off}>
Do not show any messages.
=item I<-v, --verbose={on,off}>
Print verbose messages when running.
=item I<--debug=DEBUG_OPTION>
Print debug messages when running.
=item I<-h, --help>
Display help message and exit.
=item I<--version>
Output version information and exit.
=back
=head1 COPYRIGHT
IM (Internet Message) is copyrighted by IM developing team.
You can redistribute it and/or modify it under the modified BSD
license. See the copyright file for more details.
=cut
### Copyright (C) 1997, 1998, 1999 IM developing team
### All rights reserved.
###
### Redistribution and use in source and binary forms, with or without
### modification, are permitted provided that the following conditions
### are met:
###
### 1. Redistributions of source code must retain the above copyright
### notice, this list of conditions and the following disclaimer.
### 2. Redistributions in binary form must reproduce the above copyright
### notice, this list of conditions and the following disclaimer in the
### documentation and/or other materials provided with the distribution.
### 3. Neither the name of the team nor the names of its contributors
### may be used to endorse or promote products derived from this software
### without specific prior written permission.
###
### THIS SOFTWARE IS PROVIDED BY THE TEAM AND CONTRIBUTORS ``AS IS'' AND
### ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
### IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
### PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE TEAM OR CONTRIBUTORS BE
### LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
### CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
### SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
### BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
### WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
### OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
### IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
### Local Variables:
### mode: perl
### End: