#! @im_path_perl@ ################################################################ ### ### imget ### ### Author: Internet Message Group ### Created: Jan 14, 1996 ### Revised: Feb 28, 2000 ### BEGIN { @im_my_siteperl@ @im_src_siteperl@ }; my $VERSION = "imget version 20000228(IM140)"; $Prog = 'imget'; ## ## 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_debug $opt_help $opt_buffer); ## ## Environments ## my $NNTP_processed; $EXPLANATION = " $Prog :: Internet Message Get $VERSION Usage: $Prog [options] "; @EnvConfig = ( 'NNTPSERVERS;s;;' => "Default NNTP servers.", ); @OptConfig = ( 'src;s;;' => "Message source: 'local[:path_of_mbox]'\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'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).\n" , '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', 'quiet;b;;' => 'Suppress informational messages.', 'verbose;b;;' => 'With verbose messages.', 'debug;d;;' => "With debug message.", 'help;b;;' => 'Display this help message.', 'SSHServer,S;s;localhost;SSH_server' => 'SSH port relay server.', ); ## ## 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? 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 ### 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: