mailprio
上传用户:xu_441
上传日期:2007-01-04
资源大小:1640k
文件大小:19k
源码类别:

Email客户端

开发平台:

Unix_Linux

  1. Received: from austin.bsdi.com (root{9l9gVDC7v8t3dlv0OtXTlby6X1zBWd56}@austin.BSDI.COM [205.230.224.49]) by knecht.Sendmail.ORG (8.8.2/8.8.2) with ESMTP id JAA05023 for <eric@sendmail.org>; Thu, 31 Oct 1996 09:29:47 -0800 (PST)
  2. Received: from austin.bsdi.com (localhost [127.0.0.1]) by austin.bsdi.com (8.7.4/8.7.3) with ESMTP id KAA19250; Thu, 31 Oct 1996 10:28:18 -0700 (MST)
  3. Message-Id: <199610311728.KAA19250@austin.bsdi.com>
  4. To: Eric Allman <eric@sendmail.org>
  5. cc: marc@xfree86.org
  6. Subject: Updated mailprio_0_93.shar
  7. From: Tony Sanders <sanders@earth.com>
  8. Organization: Berkeley Software Design, Inc.
  9. Date: Thu, 31 Oct 1996 10:28:14 -0700
  10. Sender: sanders@austin.bsdi.com
  11. Eric, please update contrib/mailprio in the sendmail distribution
  12. to this version at your convenience.  Thanks.
  13. I've also made this available in:
  14. ftp://ftp.earth.com/pub/postmaster/
  15. mailprio_0_93.shar follows...
  16. #!/bin/sh
  17. # This is a shell archive (produced by GNU sharutils 4.1).
  18. # To extract the files from this archive, save it to some FILE, remove
  19. # everything before the `!/bin/sh' line above, then type `sh FILE'.
  20. #
  21. # Made on 1996-10-31 10:07 MST by <sanders@earth.com>.
  22. #
  23. # Existing files will *not* be overwritten unless `-c' is specified.
  24. #
  25. # This shar contains:
  26. # length mode       name
  27. # ------ ---------- ------------------------------------------
  28. #   8260 -rwxr-xr-x mailprio
  29. #   3402 -rw-r--r-- mailprio.README
  30. #   4182 -rwxr-xr-x mailprio_mkdb
  31. #
  32. touch -am 1231235999 $$.touch >/dev/null 2>&1
  33. if test ! -f 1231235999 && test -f $$.touch; then
  34.   shar_touch=touch
  35. else
  36.   shar_touch=:
  37.   echo
  38.   echo 'WARNING: not restoring timestamps.  Consider getting and'
  39.   echo "installing GNU `touch', distributed in GNU File Utilities..."
  40.   echo
  41. fi
  42. rm -f 1231235999 $$.touch
  43. #
  44. # ============= mailprio ==============
  45. if test -f 'mailprio' && test X"$1" != X"-c"; then
  46.   echo 'x - skipping mailprio (file already exists)'
  47. else
  48.   echo 'x - extracting mailprio (text)'
  49.   sed 's/^X//' << 'SHAR_EOF' > 'mailprio' &&
  50. #!/usr/bin/perl
  51. #
  52. # mailprio,v 1.4 1996/10/31 17:03:52 sanders Exp
  53. # Version 0.93 -- Thu Oct 31 09:42:25 MST 1996
  54. #
  55. # mailprio -- setup mail priorities for a mailing list
  56. #
  57. # Copyright 1994, 1996, Tony Sanders <sanders@earth.com>
  58. # Rights are hereby granted to download, use, modify, sell, copy, and
  59. # redistribute this software so long as the original copyright notice
  60. # and this list of conditions remain intact and modified versions are
  61. # noted as such.
  62. #
  63. # I would also very much appreciate it if you could send me a copy of
  64. # any changes you make so I can possibly integrate them into my version.
  65. #
  66. # Options:
  67. #     -p priority_database      -- Specify database to use if not default
  68. #     -q                        -- Process sendmail V8.8.X queue format files
  69. #
  70. # Sort mailing lists or sendmail queue files by mailprio database.
  71. # Files listed on the command line are locked and then sorted in place, in
  72. # the absence of any file arguments it will read STDIN and write STDOUT.
  73. #
  74. # Examples:
  75. #     mailprio < mailing-list > sorted_list
  76. #     mailprio mailing-list1 mailing-list2 mailing-list3 ...
  77. #     mailprio -q /var/spool/mqueue/qf*
  78. # To double check results:
  79. #     sort sorted_list > checkit; sort orig-mailing-list | diff - checkit
  80. #
  81. # To get the maximum value from a transaction delay based priority
  82. # function you need to reorder the distribution list (and the mail
  83. # queue files for that matter) fairly often; you could even have
  84. # your mailing list software reorder the list before each outgoing
  85. # message.
  86. #
  87. $usage = "Usage: mailprio [-p priodb] [-q] [mailinglists ...]n";
  88. $home = "/home/sanders/lists";
  89. $priodb = "$home/mailprio";
  90. $locking = "flock";     # "flock" or "fcntl"
  91. X
  92. # In shell, it would go more or less like this:
  93. #     old_mailprio > /tmp/a
  94. #     fgrep -f lists/inet-access /tmp/a | sed -e 's/^.......//' > /tmp/b
  95. #         ; /tmp/b contains list of known users, faster delivery first
  96. #     fgrep -v -f /tmp/b lists/inet-access > /tmp/c
  97. #         ; put all unknown stuff at the top of new list for now
  98. #     echo '# -----' >> /tmp/c
  99. #     cat /tmp/b >> /tmp/c
  100. X
  101. $qflag = 0;
  102. while ($main'ARGV[0] =~ /^-/) {
  103. X        $args = shift;
  104. X        if ($args =~ m/?/) { print $usage; exit 0; }
  105. X        if ($args =~ m/q/) { $qflag = 1; }
  106. X        if ($args =~ m/p/) {
  107. X            $priodb = shift || die $usage, "-p requires argumentn"; }
  108. }
  109. X
  110. push(@main'ARGV, '-') if ($#ARGV < 0);
  111. while ($file = shift @ARGV) {
  112. X    if ($file eq "-") {
  113. X        $source = "main'STDIN";
  114. X        $sink = "main'STDOUT";
  115. X    } else {
  116. X        $sink = $source = "FH";
  117. X        open($source, "+< $file") || do { warn "$file: $!n"; next; };
  118. X        if (!defined &seize($source, &LOCK_EX | &LOCK_NB)) {
  119. X            # couldn't get lock, just skip it
  120. X            close($source);
  121. X            next;
  122. X        }
  123. X    }
  124. X
  125. X    local(*list);
  126. X    &process($source, *list);
  127. X
  128. X    # setup to write output
  129. X    if ($file ne "-") {
  130. X # zero the file (FH is hardcoded because truncate requires it, sigh)
  131. X        seek(FH, 0, 0) || die "$file: seek: $!n";
  132. X        truncate(FH, 0) || die "$file: truncate: $!n";
  133. X    }
  134. X
  135. X    # do the dirty work
  136. X    &output($sink, *list);
  137. X
  138. X    close($sink) || warn "$file: $!n";         # close clears the lock
  139. X    close($source);
  140. }
  141. X
  142. sub process {
  143. X    # Setup %list and @list
  144. X    local($source, *list) = @_;
  145. X    local($addr, $canon);
  146. X    while ($addr = <$source>) {
  147. X        chop $addr;
  148. X        next if $addr =~ /^# ----- /;                   # that's our line
  149. X        push(@list, $addr), next if $addr =~ /^s*#/;   # save comments
  150. X if ($qflag) {
  151. X     next if $addr =~ m/^./;
  152. X     push(@list, $addr), next if !($addr =~ s/^(R[^:]*:)//);
  153. X     $Rflags = $1;
  154. X }
  155. X        $canon = &canonicalize((&simplify_address($addr))[0]);
  156. X        unless (defined $canon) {
  157. X            warn "$file: no address found: $addrn";
  158. X            push(@list, ($qflag?$Rflags:'') . $addr);       # save it as is
  159. X            next;
  160. X        }
  161. X        if (defined $list{$canon}) {
  162. X            warn "$file: duplicate: ``$addr -> $canon''n";
  163. X            push(@list, ($qflag?$Rflags:'') . $addr);       # save it as is
  164. X            next;
  165. X        }
  166. X        $list{$canon} = $addr;
  167. X    }
  168. }
  169. X
  170. sub output {
  171. X    local($sink, *list) = @_;
  172. X
  173. X    local($to, *prio, *userprio, *useracct);
  174. X    dbmopen(%prio, $priodb, 0644) || die "$priodb: $!n";
  175. X    foreach $to (keys %list) {
  176. X        if (defined $prio{$to}) {
  177. X            # add to list of found users (%userprio) and remove from %list
  178. X            # so that we know what users were not yet prioritized
  179. X            $userprio{$to} = $prio{$to};        # priority
  180. X            $useracct{$to} = $list{$to};        # string
  181. X            delete $list{$to};
  182. X        }
  183. X    }
  184. X    dbmclose(%prio);
  185. X
  186. X    # Put all the junk we found at the very top
  187. X    # (this might not always be a feature)
  188. X    print $sink join("n", @list), "n" if int(@list);
  189. X
  190. X    # prioritized list of users
  191. X    if (int(keys %userprio)) {
  192. X        print $sink '# ----- prioritized users', "n" unless $qflag;
  193. X        foreach $to (sort by_userprio keys %userprio) {
  194. X            die "Opps! Something is seriously wrong with useracct: $ton"
  195. X                unless defined $useracct{$to};
  196. X     print $sink 'RFD:' if $qflag;
  197. X            print $sink $useracct{$to}, "n";
  198. X        }
  199. X    }
  200. X
  201. X    # unprioritized users go last, fast accounts will get moved up eventually
  202. X    # XXX: should go before the "really slow" prioritized users?
  203. X    if (int(keys %list)) {
  204. X        print $sink '# ----- unprioritized users', "n" unless $qflag;
  205. X        foreach $to (keys %list) {
  206. X            print $sink 'RFD:' if $qflag;
  207. X            print $sink $list{$to}, "n";
  208. X        }
  209. X    }
  210. X
  211. X    print $sink ".n" if $qflag;
  212. }
  213. X
  214. sub by_userprio {
  215. X    # sort first by priority, then by key.
  216. X    $userprio{$a} <=> $userprio{$b} || $a cmp $b;
  217. }
  218. X
  219. # REPL-LIB ---------------------------------------------------------------
  220. X
  221. sub canonicalize {
  222. X    local($addr) = @_;
  223. X    # lowercase, strip leading/trailing whitespace
  224. X    $addr =~ y/A-Z/a-z/; $addr =~ s/^s+//; $addr =~ s/s+$//; $addr;
  225. }
  226. X
  227. # @addrs = simplify_address($addr);
  228. sub simplify_address {
  229. X    local($_) = shift;
  230. X    1 while s/([^()]*)//g;          # strip comments
  231. X    1 while s/"[^"]*"//g;               # strip comments
  232. X    split(/,/);                         # split into parts
  233. X    foreach (@_) {
  234. X        1 while s/.*<(.*)>.*/1/;
  235. X        s/^s+//;
  236. X        s/s+$//;
  237. X    }
  238. X    @_;
  239. }
  240. X
  241. ### ---- ###
  242. #
  243. # Error codes
  244. #
  245. do 'errno.ph';
  246. eval 'sub ENOENT {2;}'          unless defined &ENOENT;
  247. eval 'sub EINTR {4;}'           unless defined &EINTR;
  248. eval 'sub EINVAL {22;}'         unless defined &EINVAL;
  249. X
  250. #
  251. # File locking
  252. #
  253. do 'sys/unistd.ph';
  254. eval 'sub SEEK_SET {0;}'        unless defined &SEEK_SET;
  255. X
  256. do 'sys/file.ph';
  257. eval 'sub LOCK_SH {0x01;}'      unless defined &LOCK_SH;
  258. eval 'sub LOCK_EX {0x02;}'      unless defined &LOCK_EX;
  259. eval 'sub LOCK_NB {0x04;}'      unless defined &LOCK_NB;
  260. eval 'sub LOCK_UN {0x08;}'      unless defined &LOCK_UN;
  261. X
  262. do 'fcntl.ph';
  263. eval 'sub F_GETFD {1;}'         unless defined &F_GETFD;
  264. eval 'sub F_SETFD {2;}'         unless defined &F_SETFD;
  265. eval 'sub F_GETFL {3;}'         unless defined &F_GETFL;
  266. eval 'sub F_SETFL {4;}'         unless defined &F_SETFL;
  267. eval 'sub O_NONBLOCK {0x0004;}' unless defined &O_NONBLOCK;
  268. eval 'sub F_SETLK {8;}'         unless defined &F_SETLK;        # nonblocking
  269. eval 'sub F_SETLKW {9;}'        unless defined &F_SETLKW;       # lockwait
  270. eval 'sub F_RDLCK {1;}'         unless defined &F_RDLCK;
  271. eval 'sub F_UNLCK {2;}'         unless defined &F_UNLCK;
  272. eval 'sub F_WRLCK {3;}'         unless defined &F_WRLCK;
  273. $s_flock = "sslll";             # struct flock {type, whence, start, len, pid}
  274. X
  275. # return undef on failure
  276. sub seize {
  277. X    local ($FH, $lock) = @_;
  278. X    local ($ret);
  279. X    if ($locking eq "flock") {
  280. X        $ret = flock($FH, $lock);
  281. X return ($ret == 0 ? undef : 1);
  282. X    } else {
  283. X        local ($flock, $type) = 0;
  284. X        if ($lock & &LOCK_SH) { $type = &F_RDLCK; }
  285. X        elsif ($lock & &LOCK_EX) { $type = &F_WRLCK; }
  286. X        elsif ($lock & &LOCK_UN) { $type = &F_UNLCK; }
  287. X        else { $! = &EINVAL; return undef; }
  288. X        $flock = pack($s_flock, $type, &SEEK_SET, 0, 0, 0);
  289. X        $ret = fcntl($FH, ($lock & &LOCK_NB) ? &F_SETLK : &F_SETLKW, $flock);
  290. X return ($ret == -1 ? undef : 1);
  291. X    }
  292. }
  293. SHAR_EOF
  294.   $shar_touch -am 1031100396 'mailprio' &&
  295.   chmod 0755 'mailprio' ||
  296.   echo 'restore of mailprio failed'
  297.   shar_count="`wc -c < 'mailprio'`"
  298.   test 8260 -eq "$shar_count" ||
  299.     echo "mailprio: original size 8260, current size $shar_count"
  300. fi
  301. # ============= mailprio.README ==============
  302. if test -f 'mailprio.README' && test X"$1" != X"-c"; then
  303.   echo 'x - skipping mailprio.README (file already exists)'
  304. else
  305.   echo 'x - extracting mailprio.README (text)'
  306.   sed 's/^X//' << 'SHAR_EOF' > 'mailprio.README' &&
  307. mailprio README
  308. X
  309. mailprio.README,v 1.2 1996/10/31 17:03:54 sanders Exp
  310. Version 0.93 -- Thu Oct 31 09:42:25 MST 1996
  311. X
  312. Copyright 1994, 1996, Tony Sanders <sanders@earth.com>
  313. Rights are hereby granted to download, use, modify, sell, copy, and
  314. redistribute this software so long as the original copyright notice
  315. and this list of conditions remain intact and modified versions are
  316. noted as such.
  317. X
  318. I would also very much appreciate it if you could send me a copy of
  319. any changes you make so I can possibly integrate them into my version.
  320. X
  321. The current version of this and other related mail tools are available in:
  322. X ftp://ftp.earth.com/pub/postmaster/
  323. X
  324. Even with the new persistent host status in sendmail V8.8.X this
  325. function can still reduce the lag time distributing mail to a large
  326. group of people.  It also makes it a little more likely that everyone
  327. will get mailing list mail in the order sent which can help reduce
  328. duplicate postings.  Basically, the goal is to put slow hosts at
  329. the bottom of the list so that as many fast hosts are delivered
  330. as quickly as possible.
  331. X
  332. CONTENTS
  333. ========
  334. X
  335. X    mailprio.README -- simple docs
  336. X    mailprio -- the address sorter
  337. X    mailprio_mkdb -- builds the database for the sorter
  338. X
  339. X
  340. CHANGES
  341. =======
  342. X    Version 0.92
  343. X Initial public release.
  344. X
  345. X    Version 0.93
  346. X Updated to make use of the (somewhat) new xdelay statistic.
  347. X Changed -q flag to support new sendmail queue file format (RFD:<addr>).
  348. X Fixed argument parsing bug.
  349. X Fixed bug with database getting "garbage" in it.
  350. X
  351. X
  352. CONFIGURATION
  353. =============
  354. X
  355. X    You need to edit each script and ensure proper configuration.
  356. X
  357. X    In mailprio check:        #!perl path, $home, $priodb, $locking
  358. X
  359. X    In mailprio_mkdb check:   #!perl path, $home, $priodb, $maillog
  360. X
  361. X
  362. USAGE: mailprio
  363. ===============
  364. X
  365. X    Usage: mailprio [-p priodb] [-q] [mailinglists ...]
  366. X -p priority_database   -- Specify database to use if not default
  367. X -q                     -- Process sendmail queue format files
  368. X   [USE WITH CAUTION]
  369. X
  370. X    Sort mailing lists or sendmail V8 queue files by mailprio database.
  371. X    Files listed on the command line are locked and then sorted in place, in
  372. X    the absence of any file arguments it will read STDIN and write STDOUT.
  373. X
  374. X    Examples:
  375. X mailprio < mailing-list > sorted_list
  376. X mailprio mailing-list1 mailing-list2 mailing-list3 ...
  377. X mailprio -q /var/spool/mqueue/qf* [not recommended]
  378. X    To double check results:
  379. X sort sorted_list > checkit; sort orig-mailing-list | diff - checkit
  380. X
  381. X    NOTE:
  382. X To get the maximum value from a transaction delay based priority
  383. X function you need to reorder the distribution list (and the mail
  384. X queue files for that matter) fairly often; you could even have
  385. X your mailing list software reorder the list before each outgoing
  386. X message.
  387. X
  388. X
  389. USAGE: mailprio_mkdb
  390. ====================
  391. X
  392. X    Usage: mailprio_mkdb [-l maillog] [-p priodb]
  393. X -l maillog             -- Specify maillog to process if not default
  394. X -p priority_database   -- Specify database to use if not default
  395. X
  396. X    Builds the mail priority database using information from the maillog.
  397. X
  398. X    Run at least nightly before you rotate the maillog.  If you are
  399. X    going to run mailprio more often than that then you will need to
  400. X    load the current maillog information before that will do any good
  401. X    (and to keep from reloading the same information you will need
  402. X    some kind of incremental maillog information to load from).
  403. SHAR_EOF
  404.   $shar_touch -am 1031100396 'mailprio.README' &&
  405.   chmod 0644 'mailprio.README' ||
  406.   echo 'restore of mailprio.README failed'
  407.   shar_count="`wc -c < 'mailprio.README'`"
  408.   test 3402 -eq "$shar_count" ||
  409.     echo "mailprio.README: original size 3402, current size $shar_count"
  410. fi
  411. # ============= mailprio_mkdb ==============
  412. if test -f 'mailprio_mkdb' && test X"$1" != X"-c"; then
  413.   echo 'x - skipping mailprio_mkdb (file already exists)'
  414. else
  415.   echo 'x - extracting mailprio_mkdb (text)'
  416.   sed 's/^X//' << 'SHAR_EOF' > 'mailprio_mkdb' &&
  417. #!/usr/bin/perl
  418. #
  419. # mailprio_mkdb,v 1.5 1996/10/31 17:03:53 sanders Exp
  420. # Version 0.93 -- Thu Oct 31 09:42:25 MST 1996
  421. #
  422. # mailprio_mkdb -- make mail priority database based on delay times
  423. #
  424. # Copyright 1994, 1996, Tony Sanders <sanders@earth.com>
  425. # Rights are hereby granted to download, use, modify, sell, copy, and
  426. # redistribute this software so long as the original copyright notice 
  427. # and this list of conditions remain intact and modified versions are
  428. # noted as such.
  429. #
  430. # I would also very much appreciate it if you could send me a copy of
  431. # any changes you make so I can possibly integrate them into my version.
  432. #
  433. # The average function moves the value around quite rapidly (half-steps)
  434. # which may or may not be a feature.  This version uses the new xdelay
  435. # statistic (new as of sendmail V8) which is per transaction.  We also
  436. # weight the result based on the overall delay.
  437. #
  438. # Something that might be worth doing for systems that don't support
  439. # xdelay would be to compute an approximation of the transaction delay
  440. # by sorting by messages-id and delay then computing the difference
  441. # between adjacent delay values.
  442. #
  443. # To get the maximum value from a transaction delay based priority
  444. # function you need to reorder the distribution list (and the mail
  445. # queue files for that matter) fairly often; you could even have
  446. # your mailing list software reorder the list before each outgoing
  447. # message.
  448. X
  449. $usage = "Usage: mailprio_mkdb [-l maillog] [-p priodb]n";
  450. $home = "/home/sanders/lists";
  451. $maillog = "/var/log/maillog";
  452. $priodb = "$home/mailprio";
  453. X
  454. while ($ARGV[0] =~ /^-/) {
  455. X $args = shift;
  456. X if ($args =~ m/?/) { print $usage; exit 0; }
  457. X if ($args =~ m/l/) {
  458. X     $maillog = shift || die $usage, "-l requires argumentn"; }
  459. X if ($args =~ m/p/) {
  460. X     $priodb = shift || die $usage, "-p requires argumentn"; }
  461. }
  462. X
  463. $SIG{'PIPE'} = 'handle_pipe';
  464. X
  465. # will merge with existing information
  466. dbmopen(%prio, $priodb, 0644) || die "$priodb: $!n";
  467. &getlog_stats($maillog, *prio);
  468. dbmclose(%prio);
  469. exit(0);
  470. X
  471. sub handle_pipe {
  472. X    dbmclose(%prio);
  473. }
  474. X
  475. sub getlog_stats {
  476. X    local($maillog, *stats) = @_;
  477. X    local($to, $delay);
  478. X    local($h, $m, $s);
  479. X    open(MAILLOG, "< $maillog") || die "$maillog: $!n";
  480. X    while (<MAILLOG>) {
  481. X next unless / to=/ && / stat=/;
  482. X next if / stat=queued/;
  483. X if (/ stat=sent/i) {
  484. X     # read delay and xdelay and convert to seconds
  485. X     ($delay) = (m/ delay=([^,]*),/);
  486. X     next unless $delay;
  487. X     ($h, $m, $s) = split(/:/, $delay);
  488. X     $delay = ($h * 60 * 60) + ($m * 60) + $s;
  489. X
  490. X     ($xdelay) = (m/ xdelay=([^,]*),/);
  491. X     next unless $xdelay;
  492. X     ($h, $m, $s) = split(/:/, $xdelay);
  493. X     $xdelay = ($h * 60 * 60) + ($m * 60) + $s;
  494. X
  495. X     # Now weight the delay factor by the transaction delay (xdelay).
  496. X     $xdelay /= 300; # [0 - 1(@5 min)]
  497. X     $xdelay += 0.5; # [0.5 - 1.5]
  498. X     $xdelay = 1.5 if $xdelay > 1.5; # clamp
  499. X     $delay *= $xdelay; # weight delay by xdelay
  500. X }
  501. X elsif (/, stat=/) {
  502. X     # delivery failure of some sort (i.e. bad)
  503. X     $delay = 432000; # force 5 days
  504. X }
  505. X $delay = 1000000 if $delay > 1000000;
  506. X
  507. X # filter the address(es); isn't perfect but is "good enough"
  508. X $to = $_; $to =~ s/^.* to=//;
  509. X 1 while $to =~ s/([^()]*)//g; # strip comments
  510. X 1 while $to =~ s/"[^"]*"//g; # strip comments
  511. X $to =~ s/, .*//; # remove other stat info
  512. X foreach $addr (&simplify_address($to)) {
  513. X     next unless $addr;
  514. X     $addr = &canonicalize($addr);
  515. X     $stats{$addr} = $delay unless defined $stats{$addr}; # init
  516. X     # pseudo-average in the new delay (half-steps)
  517. X     # simple, moving average
  518. X     $stats{$addr} = int(($stats{$addr} + $delay) / 2);
  519. X }
  520. X    }
  521. X    close(MAILLOG);
  522. }
  523. X
  524. # REPL-LIB ---------------------------------------------------------------
  525. X
  526. sub canonicalize {
  527. X    local($addr) = @_;
  528. X    # lowercase, strip leading/trailing whitespace
  529. X    $addr =~ y/A-Z/a-z/; $addr =~ s/^s+//; $addr =~ s/s+$//; $addr;
  530. }
  531. X
  532. # @addrs = simplify_address($addr);
  533. sub simplify_address {
  534. X    local($_) = shift;
  535. X    1 while s/([^()]*)//g;  # strip comments
  536. X    1 while s/"[^"]*"//g; # strip comments
  537. X    split(/,/); # split into parts
  538. X    foreach (@_) {
  539. X 1 while s/.*<(.*)>.*/1/;
  540. X s/^s+//;
  541. X s/s+$//;
  542. X    }
  543. X    @_;
  544. }
  545. SHAR_EOF
  546.   $shar_touch -am 1031100396 'mailprio_mkdb' &&
  547.   chmod 0755 'mailprio_mkdb' ||
  548.   echo 'restore of mailprio_mkdb failed'
  549.   shar_count="`wc -c < 'mailprio_mkdb'`"
  550.   test 4182 -eq "$shar_count" ||
  551.     echo "mailprio_mkdb: original size 4182, current size $shar_count"
  552. fi
  553. exit 0