Amiga-Request@cs.odu.edu (Amiga Sources/Binaries Moderator) (02/04/90)
Submitted-by: overload!dillon (Matt Dillon)
Posting-number: Volume 90, Issue 050
Archive-name: unix/uucp-1.03d/part06
#!/bin/sh
# This is a shell archive. Remove anything before this line, then unpack
# it by saving it into a file and typing "sh file". To overwrite existing
# files, type "sh file -c". You can also feed this as standard input via
# unshar, or by typing "sh <file", e.g.. If this archive is complete, you
# will see the following message at the end:
# "End of archive 6 (of 16)."
# Contents: Disk2.contents man/Domains man/Tar
# src/News060/Anews/anews.c src/dmail/commands.c
# src/dmail/sendmail.c
# Wrapped by tadguy@xanth on Sat Feb 3 20:51:10 1990
PATH=/bin:/usr/bin:/usr/ucb ; export PATH
if test -f 'Disk2.contents' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'Disk2.contents'\"
else
echo shar: Extracting \"'Disk2.contents'\" \(9104 characters\)
sed "s/^X//" >'Disk2.contents' <<'END_OF_FILE'
X
XArchive ../uucp1.03D.zoo.2:
XLength CF Size Now Date Time
X-------- --- -------- --------- --------
X 44056 49% 22470 29 Dec 89 20:13:44 uucp1/man/dme.doc
X 193 13% 168 10 Jan 90 12:43:06 uucp1/man/expandm
X 403 21% 317 8 Jan 90 17:21:06 uucp1/man/TrimFile
X 1492 29% 1065 23 Oct 89 15:50:50 uucp1/man/UUSer
X 18172 45% 10071 14 Oct 89 15:36:50 uucp1/man/MAPS
X 1441 45% 790 14 Oct 89 15:36:24 uucp1/man/UPDATES
X 49150 57% 21032 14 Oct 89 15:36:32 uucp1/man/how2usenet
X 89791 53% 42431 3 Nov 89 15:44:36 uucp1/man/Standards
X 6833 55% 3109 14 Oct 89 15:36:46 uucp1/man/NewsGroups
X 1960 39% 1195 5 Jan 90 16:48:12 uucp1/man/Aliases
X 749 18% 616 14 Oct 89 15:36:46 uucp1/man/MapExample
X 12488 48% 6505 25 Jan 90 22:28:16 uucp1/man/GNU-LICENSE
X 320 14% 276 10 Jan 90 19:00:32 uucp1/man/PhoneBook
X 1990 35% 1294 10 Jan 90 10:53:20 uucp1/man/Assigns
X 5912 43% 3369 8 Jan 90 23:21:56 uucp1/man/dmail
X 5367 46% 2898 3 Nov 89 16:13:56 uucp1/man/Compress
X 2893 34% 1898 10 Jan 90 15:40:36 uucp1/man/UUCico
X 6005 44% 3343 27 Oct 89 22:27:32 uucp1/man/Getty
X 4580 40% 2763 27 Oct 89 22:32:12 uucp1/man/DCron
X 1736 43% 984 14 Oct 89 15:38:24 uucp1/man/UUdecode
X 1592 45% 871 14 Oct 89 15:38:26 uucp1/man/UUClean
X 3569 49% 1837 14 Oct 89 15:38:26 uucp1/man/Grep
X 2919 45% 1594 14 Oct 89 15:38:28 uucp1/man/UUlog
X 1168 34% 772 27 Oct 89 22:33:42 uucp1/man/man
X 2919 45% 1594 14 Oct 89 15:38:30 uucp1/man/UUCP
X 1736 43% 984 14 Oct 89 15:38:32 uucp1/man/UUencode
X 8139 53% 3832 14 Oct 89 15:38:20 uucp1/man/Tar
X 380 25% 286 27 Oct 89 22:24:08 uucp1/man/From
X 314 24% 240 14 Oct 89 15:38:20 uucp1/man/Rmail
X 9043 49% 4593 8 Jan 90 23:33:20 uucp1/man/Domains
X 2130 34% 1411 27 Oct 89 22:26:52 uucp1/man/Passwd
X 572 22% 447 27 Oct 89 22:31:18 uucp1/man/NULL
X 2380 38% 1479 7 Nov 89 16:46:26 uucp1/man/L.sys
X 1178 31% 817 3 Nov 89 14:13:54 uucp1/man/Security
X 22 0% 22 3 Nov 89 14:21:56 uucp1/man/.Distfiles
X 62 0% 62 3 Nov 89 16:01:58 uucp1/man/Config
X 559 32% 380 10 Jan 90 15:30:52 uucp1/src/TODO
X 56681 0% 56681 14 Jan 90 19:13:36 uucp1/src/dmail.zoo
X 496 23% 384 10 Jan 90 16:38:00 uucp1/src/sendmail/DMakefile
X 22055 53% 10259 25 Jan 90 12:51:56 uucp1/src/sendmail/sendmail.c
X 1232 37% 780 10 Jan 90 16:38:20 uucp1/src/sendmail/parse.c
X 4164 44% 2317 25 Jan 90 12:41:10 uucp1/src/sendmail/domain.c
X 40885 50% 20582 3 Nov 89 11:29:48 uucp1/src/compress/compress.c
X 3856 40% 2321 3 Nov 89 11:30:10 uucp1/src/compress/tarsplit.c
X 938 40% 565 3 Nov 89 16:08:56 uucp1/src/compress/DMakefile
X 6648 47% 3544 3 Nov 89 11:30:36 uucp1/src/compress/unshar.c
X 3204 40% 1923 3 Nov 89 11:30:50 uucp1/src/compress/uudecode.c
X 2000 35% 1294 3 Nov 89 11:31:26 uucp1/src/compress/uuencode.c
X 9 0% 9 31 Oct 89 14:23:22 uucp1/src/.Distfiles
X 3865 41% 2266 10 Jan 90 16:39:30 uucp1/src/GUtil/uuserdump.c
X 925 27% 677 10 Jan 90 16:38:54 uucp1/src/GUtil/uident.c
X 3220 43% 1850 10 Jan 90 16:39:20 uucp1/src/GUtil/gnote.c
X 676 30% 474 10 Jan 90 16:39:42 uucp1/src/GUtil/DMakefile
X 1801 37% 1140 10 Jan 90 16:39:46 uucp1/src/MUtil/trimfile.c
X 2388 41% 1410 10 Jan 90 16:40:00 uucp1/src/MUtil/from.c
X 1032 35% 670 3 Nov 89 11:26:34 uucp1/src/MUtil/man.c
X 579 32% 392 8 Jan 90 15:17:24 uucp1/src/MUtil/DMakefile
X 432 21% 341 10 Jan 90 16:40:12 uucp1/src/MUtil/expandm.c
X 811 29% 572 10 Jan 90 15:45:22 uucp1/src/ReadMe
X 1459 31% 1006 25 Jan 90 14:18:26 uucp1/src/uucico/version.doc
X 11298 47% 5942 10 Jan 90 15:31:28 uucp1/src/uucico/sysdep.c
X 32949 50% 16420 25 Jan 90 14:10:38 uucp1/src/uucico/uucico.c
X 974 41% 576 10 Jan 90 15:34:06 uucp1/src/uucico/DMakefile
X 854 32% 582 14 Oct 89 15:39:52 uucp1/src/uucico/modem.h
X 2378 39% 1440 25 Jan 90 14:12:44 uucp1/src/uucico/uuxqt.c
X 939 23% 727 25 Jan 90 14:17:18 uucp1/src/uucico/uupoll.c
X 3441 45% 1903 25 Jan 90 14:12:30 uucp1/src/uucico/uux.c
X 16481 53% 7796 10 Jan 90 15:40:00 uucp1/src/uucico/gio.c
X 1876 39% 1150 10 Jan 90 15:13:56 uucp1/src/uucico/sysdep.h
X 675 18% 551 25 Jan 90 14:15:24 uucp1/src/uucico/uuname.c
X 2821 42% 1627 23 Oct 89 17:41:24 uucp1/src/uucico/includes.h
X 672 18% 549 25 Jan 90 14:12:24 uucp1/src/uucico/uuhosts.c
X 3907 47% 2070 25 Jan 90 12:51:14 uucp1/src/uucico/uucp.c
X 1358 27% 986 25 Oct 89 16:40:56 uucp1/src/uucico/uucp.h
X 3471 39% 2106 10 Jan 90 16:41:24 uucp1/src/uucico/modem.c
X 126 3% 122 10 Jan 90 16:41:46 uucp1/src/include/tmpfile.h
X 330 25% 249 10 Jan 90 16:41:38 uucp1/src/include/log.h
X 1625 34% 1080 10 Jan 90 16:42:08 uucp1/src/include/config.h
X 540 35% 351 10 Jan 90 16:42:14 uucp1/src/include/pwd.h
X 239 15% 203 10 Jan 90 16:42:38 uucp1/src/include/sys/stat.h
X 125 3% 121 10 Jan 90 16:42:58 uucp1/src/include/sys/types.h
X 136 17% 113 10 Jan 90 16:43:16 uucp1/src/include/sys/file.h
X 107 10% 96 10 Jan 90 16:43:26 uucp1/src/include/sys/time.h
X 19742 52% 9486 8 Jan 90 02:20:58 uucp1/src/getty/getty.c
X 195 5% 185 10 Jan 90 16:43:56 uucp1/src/getty/syms.c
X 1689 33% 1135 10 Jan 90 16:44:04 uucp1/src/getty/passwd.c
X 369 23% 283 26 Oct 89 18:13:06 uucp1/src/getty/DMakefile
X 834 34% 551 10 Jan 90 16:44:26 uucp1/src/lib/getenv.c
X 156 1% 155 10 Jan 90 16:44:30 uucp1/src/lib/sleep.c
X 519 26% 382 10 Jan 90 16:44:46 uucp1/src/lib/mntreq.c
X 589 33% 394 10 Jan 90 16:44:18 uucp1/src/lib/string.c
X 376 20% 302 10 Jan 90 16:44:54 uucp1/src/lib/tmpfile.c
X 1505 39% 914 10 Jan 90 16:45:04 uucp1/src/lib/config.c
X 815 28% 587 10 Jan 90 16:45:08 uucp1/src/lib/setstdin.c
X 2562 39% 1551 10 Jan 90 16:45:24 uucp1/src/lib/serialport.c
X 615 27% 449 6 Jan 90 00:27:02 uucp1/src/lib/DMakefile
X 1815 42% 1052 14 Jan 90 19:05:52 uucp1/src/lib/getpwnam.c
X 2345 41% 1380 10 Jan 90 16:45:36 uucp1/src/lib/lockfile.c
X 49 0% 49 21 Oct 89 19:29:16 uucp1/src/lib/syms.c
X 4268 45% 2353 10 Jan 90 16:45:48 uucp1/src/lib/alias.c
X 643 31% 446 14 Jan 90 19:04:58 uucp1/src/lib/seq.c
X 2279 40% 1358 14 Jan 90 19:06:06 uucp1/src/lib/security.c
X 621 22% 485 14 Jan 90 19:06:16 uucp1/src/lib/lsys.c
X 1273 34% 841 14 Jan 90 19:06:26 uucp1/src/lib/log.c
X 338 24% 256 10 Jan 90 16:46:02 uucp1/src/lib/validuser.c
X 705 23% 540 25 Jan 90 11:18:18 uucp1/src/version.h
X 17361 48% 9096 10 Jan 90 16:24:30 uucp1/src/News060/rnews.c
X 9639 49% 4887 10 Jan 90 18:47:40 uucp1/src/News060/Anews/anews.c
X 2055 37% 1287 10 Jan 90 11:21:54 uucp1/src/News060/Anews/sendpacket.c
X 2229 36% 1419 10 Jan 90 16:27:04 uucp1/src/News060/Anews/raw.c
X 1607 33% 1069 10 Jan 90 16:27:36 uucp1/src/News060/Anews/mscan.c
X 477 21% 376 10 Jan 90 16:27:42 uucp1/src/News060/Anews/DMakefile
X 4092 45% 2239 25 Jan 90 13:56:46 uucp1/src/News060/postnews.c
X 567 26% 420 10 Jan 90 16:28:06 uucp1/src/News060/DMakefile
X 2039 36% 1303 10 Jan 90 16:28:20 uucp1/src/uuser/uuser.doc
X 1880 39% 1154 10 Jan 90 16:29:12 uucp1/src/uuser/misc.c
X 506 23% 391 10 Jan 90 16:29:34 uucp1/src/uuser/DMakefile
X 100 7% 93 22 Oct 89 17:27:12 uucp1/src/uuser/mountlist
X 13243 53% 6286 10 Jan 90 16:29:56 uucp1/src/uuser/uuser.c
X 16308 25% 12188 25 Jan 90 23:03:22 uucp1/c/compress
X 9284 23% 7183 25 Jan 90 23:03:14 uucp1/c/uuencode
X 11000 23% 8449 25 Jan 90 23:03:16 uucp1/c/uudecode
X 10720 23% 8215 25 Jan 90 23:03:16 uucp1/c/tarsplit
X 26580 29% 18783 25 Jan 90 23:03:18 uucp1/c/tar
X 10100 22% 7835 25 Jan 90 23:03:18 uucp1/c/man
X 8048 22% 6283 25 Jan 90 23:03:20 uucp1/c/uident
X 10828 23% 8345 25 Jan 90 23:03:20 uucp1/c/unshar
X 10248 23% 7866 25 Jan 90 23:03:20 uucp1/c/from
X-------- --- -------- --------- --------
X 754104 41% 446333 128 files
END_OF_FILE
if test 9104 -ne `wc -c <'Disk2.contents'`; then
echo shar: \"'Disk2.contents'\" unpacked with wrong size!
fi
# end of 'Disk2.contents'
fi
if test -f 'man/Domains' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'man/Domains'\"
else
echo shar: Extracting \"'man/Domains'\" \(9043 characters\)
sed "s/^X//" >'man/Domains' <<'END_OF_FILE'
X
XNAME
X UULIB:Domain
X
XSYNOPSIS
X -
X
XDESCRIPTION
X
X The UULIB:Domain file holds routing information for addresses
X you send USENET mail to. This file is normally required ONLY if
X your machine can talk to MORE THAN ONE USENET host.
X
X For machines that can talk to ONLY ONE USENET host, you need
X only set the 'DefaultNode' entry in UULIB:Config to the name
X of the one host.
X
X A domain is something like 'CTS.COM' or 'BERKELEY.EDU'. Lets
X say you have direct USENET connections to UCBVAX.Berkeley.EDU and
X FUBAR.CTS.COM.
X
X Now, you want to send an email message to CHARLIE.Berkeley.EDU
X and another email message to GALAXY.CTS.COM ... obviously you will
X want the first message to be routed through UCBVAX and the second
X routed through FUBAR. The appropriate domain entries would be:
X
X *.berkeley.edu MF UU ucbvax.UUCP
X *.cts.com MF UU fubar.UUCP
X
X You will also want a default of some sort ... say you send mail
X to PHOTON.CSNET, you want unknown domains to be routed to somewhere
X that knows how to deal with them. So you would also have another
X entry in UULIB:Domain:
X
X * MF UU ucbvax.UUCP
X
X That specifies the machine to route mail through to reach an
X unknown address.
X
X *** NOTE *** UUCP sites that you directly connect to need not be listed
X in UULIB:Domain, the UULIB:L.Sys file is automatically scanned for such
X sites. For said machines any additional domain information is ignored
X (such as .UUCP). In case the name of an immediately adjacent UUCP site
X conflicts with another site you can enter that other site into the domain
X list explicitly using the MD Type described below.
X
X FORMAT OF DOMAIN FILE
X
X Each line in the domain file may be blank, contain a '#' and then
X a comment, or contain a domain record. Each domain record is broken
X up into four fields:
X
X Domain Type Class Address-Info
X
X Domain = domain in question, you may use '*' instead of a domain
X name to match ONE OR MORE SUBDOMAINS or the machine name.
X Case is ignored.
X
X For example: *.COM
X *.Berkeley.EDU
X *
X
X Type = MF or MD. MF stands for mail forwarder, MD stands for
X mail destination. The difference can be shown with an
X example:
X
X ucbvax.berkeley.edu MD UU ucbvax.UUCP
X *.berkeley.edu MF UU ucbvax.UUCP
X
X In the first case the domain is actually a complete machine
X name which we can directly talk to, thus MD is used telling
X the mail system that we REPLACE the address with this address.
X
X In the second case the machine is what we must go THROUGH to
X reach machines with the given domain (note that more explicitly
X specified domains always have priority of less explicitly
X specified domains). The mail system will PREPEND the address
X field with the forwarding machine address.
X
X Class = UU
X Currently only UU, meaning USENET class, is supported. This
X field is reserved to allow specification of different types
X of low level mailers so the mail system is not necessarily
X limited to using the USENET as the transport layer.
X
X AddrInfo
X for the UU class AddrInfo contains a ! separated UUCP path
X where the first machine MUST be an immediately adjacent node.
X The remainder of the path is tagged onto the rmail line along
X with the original path specification.
X
X NOTE: For any machine in the bang (!) path of the AddrInfo
X field which is directly connected to the previous machine
X (the first machine is always directly connected to your
X machine), the domain is optional. That is, the machine may
X be listed with or without a domain separated by dots. The
X examples below show parts of paths both with and without
X domain names.
X
X when you route through the INTERNET, however, you must be
X more careful. Only known USENET paths may be addressed
X without worrying about the domain part of the machine name.
X
X REGISTERED DOMAINS
X
X We will eventually have our own domain that is registered with the
X network community. When this occurs we will probably set up an
X automated system that keeps everybody's UULIB:Domain file consistant.
X Each UULIB:Domain file will then have an entry for all machines in
X our domain. Thus, while UULIB:Domain is not being used so much at
X the moment I expect it will be used in a major way in the future.
X
X
XADDRESSES IN A SMALL ISOLATED NETWORK
X
X Using the UULIB:Domain file in local networks drastically
X simplifies most other parts of the UUCP mail system. The
X greatest advantage of using a Domain file is that you can
X refer to machines in your local net by name rather than by
X path and can refer to them by name in any groups you might
X have constructed in UULIB:Aliases. you can also use the Domain
X file to re-route email to machines that may have moved to
X somewhere else in your local network (say a buddy moves back
X east) without bouncing the email. Which we can't do anyway yet..
X automatic bouncing will be in a future release.
X
X Lets say you have a group of people all running UUCP connected
X like this:
X d
X / f
X / /
X a---b---c---h
X / \ \
X / \ g
X x e
X
X If your machine is b.UUCP and you want to email to user@h.UUCP,
X then the appropriate path is:
X
X To: c!h!user
X
X If your machine is d.UUCP and you want to email to g.UUCP,
X then the appropriate path is:
X
X To: b!c!g!user
X
X There is another alternative. You can setup your UULIB:Domain
X file with all of these paths and just say:
X
X To: user@g.UUCP
X
X The Domain file would be different for each node but you have
X removed the complexity one step. The Domain file for a.UUCP
X would look like this:
X
X * MF UU b.UUCP
X
X This assumes that b.UUCP also implements Domains. The Domain
X file for b.UUCP would look like this:
X
X * MF UU c.UUCP
X x.UUCP MF UU a.UUCP
X
X Because, apart from x.UUCP, the only nodes b.UUCP cannot reach
X directly are reachable via c.UUCP.
X
X The Domain file for c.UUCP would be:
X
X * MF UU b.UUCP
X
X Because the only nodes c.UUCP cannot reach go through b.UUCP,
X so we set the default route for unknown nodes to go through
X b.UUCP. Here we assume that b.UUCP uses UULIB:Domains as
X well and knows how to get to x.UUCP which is not immediately
X adjacent to it.
X
X The Domain file for c.UUCP assuming the b.UUCP does NOT use
X a Domains file (which is safest actually) is:
X
X * MF UU b.UUCP
X x.UUCP MF UU b.UUCP!a.UUCP
X
X Alternately you can use MD (mail destination):
X
X * MF UU b.UUCP
X x.UUCP MD UU b.UUCP!a.UUCP!x.UUCP
X
XADDRESSES IN A SMALL NETWORK WITH A SINGLE CONNECTION TO THE OUTSIDE WORLD:
X
X d
X / f
X / /
X a---b---c---h---ucbvax.berkeley.edu
X / \ \
X / \ g
X x e
X
X This is another possible configuration... one person in your
X little Amiga network has a connection to the outside world.
X In this case everyone in your network should have UULIB:Domain
X entries to properly route email back and forth. Specifically, if
X you are giving somebody your email address and your machine is
X x.UUCP, you want to be able to give them:
X
X ucbvax.berkeley.edu!h!x!user
X
X As your address rather than
X
X ucbvax.berkeley.edu!h!c!b!a!x!user
X
X In otherwords, you want to HIDE your local network from the
X outside world. This would require h.UUCP to have the
X following UULIB:Domain file:
X
X * MF UU ucbvax.berkeley.edu
X a.UUCP MF UU c!b
X b.UUCP MF UU c
X d.UUCP MF UU c!b
X e.UUCP MF UU c!b
X f.UUCP MF UU c
X g.UUCP MF UU c
X x.UUCP MF UU c!b!a
X
X Each of the other nodes in the network would have a similar
X Domain file. Note that when you have a connection to the
X outside world the default, '*', should point to the outside
X world. The '*' entry for a.UUCP, for example, would be:
X
X * MF UU b!c!h!ucbvax
X
X If everyone in your local net implemented '*' properly it
X would suffice to redirect '*' to, say, just b.UUCP, and b.UUCP
X would direct it to c.UUCP, etc... The cleanest way to deal
X with it is actually to redirect it to the last node in your
X local net that talks to the outside world:
X
X * MF UU b!c!h
X
X This allows the sysop at h.UUCP the latitude to do further
X routing. For example, what if h.UUCP was able to connect to
X two machines on the outside world!
X
X ucbvax.berkeley.edu
X /
X ----h
X \
X pacbell.pacbell.com
X
X In this case you want to give h.UUCP the latitude to redirect
X email to the .pacbell.com domain to pacbell.pacbell.com
X instead of going the long path through ucbvax.berkeley.edu ...
X
X * MF UU ucbvax
X *.PacBell.COM MF UU pacbell
X
X Thus, all the other nodes in your local network should direct
X unknown addresses through h.UUCP rather than bypass h.UUCP's
X domain system by giving an explicit route through it.
X
END_OF_FILE
if test 9043 -ne `wc -c <'man/Domains'`; then
echo shar: \"'man/Domains'\" unpacked with wrong size!
fi
# end of 'man/Domains'
fi
if test -f 'man/Tar' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'man/Tar'\"
else
echo shar: Extracting \"'man/Tar'\" \(8139 characters\)
sed "s/^X//" >'man/Tar' <<'END_OF_FILE'
X
XNAME
X tar - media file archiver
X
XSYNOPSIS
X tar -[BcDhikmopstvxzZ] [-b N] [-f F] [-T F] [ filename ... ]
X
XDESCRIPTION
X tar provides a way to store many files into a single
X archive, which can be kept in another file, stored on
X an I/O device such as tape, floppy, cartridge, or disk, or
X piped to another program. It is useful for making backup
X copies, or for packaging up a set of files to move them to
X another system.
X
X When reading an archive, this version of tar continues after
X finding an error. Previous versions required the `i' option
X to ignore checksum errors.
X
XOPTIONS
X tar options can be specified in either of two ways. The
X usual Unix conventions can be used: each option is preceded
X by `-'; arguments directly follow each option; multiple
X options can be combined behind one `-' as long as they take
X no arguments. For compatability with the Unix tar program,
X the options may also be specified as ``keyletters,'' wherein
X all the option letters occur in the first argument to tar,
X with no `-', and their arguments, if any, occur in the
X second, third, ... arguments. Examples:
X
X Normal: tar -f arcname -cv file1 file2
X
X Old: tar fcv arcname file1 file2
X
X At least one of the -c, -t, or -x options must be included.
X The rest are optional.
X
X Files to be operated upon are specified by a list of file
X names, which follows the option specifications (or can be
X read from a file by the -T option). Specifying a directory
X name causes that directory and all the files it contains to
X be (recursively) processed. In general, specifying full
X path names when creating an archive is a bad idea, since
X when the files are extracted, they will have to be extracted
X into exactly where they were dumped from. Instead, cd to
X the root directory and use relative file names.
X
X -b N Specify a blocking factor for the archive. The block
X size will be N x 512 bytes. Larger blocks typically
X run faster and let you fit more data on a tape. The
X default blocking factor is set when tar is compiled,
X and is typically 20. There is no limit to the maximum
X block size, as long as enough memory can be allocated
X for it, and as long as the device containing the
X archive can read or write that block size.
X
X -B When reading an archive, reblock it as we read it.
X Normally, tar reads each block with a single read(2)
X system call. This does not work when reading from a
X pipe or network socket under Berkeley Unix. With this
X option, it will do multiple read(2)s until it gets
X enough data to fill the specified block size. -B can
X also be used to speed up the reading of tapes that were
X written with small blocking factors, by specifying a
X large blocking factor with -b and having tar read many
X small blocks into memory before it tries to process
X them.
X
X -c Create an archive from a list of files.
X
X -D With each message that tar produces, print the record
X number within the archive where the message occurred.
X This option is especially useful when reading damaged
X archives, since it helps to pinpoint the damaged sec-
X tion.
X
X -f F Specify the filename of the archive. If the specified
X filename is ``-'', the archive is read from the stan-
X dard input or written to the standard output. If this
X option is not used, a default archive name (which was
X picked when tar was compiled) is used. The default is
X normally set to the ``first'' tape drive or other tran-
X sportable I/O medium on the system.
X
X -h When creating an archive, if a symbolic link is encoun-
X tered, dump the file or directory to which it points,
X rather than dumping it as a symbolic link.
X
X -i When reading an archive, ignore blocks of zeros in the
X archive. Normally a block of zeros indicates the end
X of the archive, but in a damaged archive, or one which
X was created by appending several archives, this option
X allows tar to continue. It is not on by default
X because there is garbage written after the zeroed
X blocks by the Unix tar program.
X
X -k When extracting files from an archive, keep existing
X files, rather than overwriting them with the version
X from the archive.
X
X -m When extracting files from an archive, set each file's
X modified timestamp to the current time, rather than
X extracting each file's modified timestamp from the
X archive.
X
X -o When creating an archive, write an old format archive,
X which does not include information about directories,
X pipes, or device files, and specifies file ownership by
X uid's and gid's rather than by user names and group
X names. In most cases, a ``new'' format archive can be
X read by an ``old'' tar program without serious trouble,
X so this option should seldom be needed.
X
X -p When extracting files from an archive, restore them to
X the same permissions that they had in the archive. If
X -p is not specified, the current umask limits the per-
X missions of the extracted files. See umask(2).
X
X -t List a table of contents of an existing archive. If
X file names are specified, just list files matching the
X specified names.
X
X -s When specifying a list of filenames to be listed or
X extracted from an archive, the -s flag specifies that
X the list is sorted into the same order as the tape.
X This allows a large list to be used, even on small
X machines, because the entire list need not be read into
X memory at once. Such a sorted list can easily be
X created by running ``tar -t'' on the archive and edit-
X ing its output.
X
X -T F Rather than specifying the file names to operate on as
X arguments to the tar command, this option specifies
X that the file names should be read from the file F, one
X per line. If the file name specified is ``-'', the
X list is read from the standard input. This option, in
X conjunction with the -s option, allows an arbitrarily
X large list of files to be processed, and allows the
X list to be piped to tar.
X
X -v Be verbose about the files that are being processed or
X listed. Normally, archive creation or file extraction
X are silent, and archive listing just gives file names.
X The -v option causes an ``ls -l''-like listing to be
X produced.
X
X -x Extract files from an existing archive. If file name
X are specified, just extract files matching the speci-
X fied names, otherwise extract all the files in the
X archive.
X
X -z or -Z
X When extracting or listing an archive, these options
X specify that the archive should be decompressed while
X it is read, using the -d option of the compress(1) pro-
X gram. The archive itself is not modified.
X
XBUGS
X The r, u, w, X, l, F, C, and digit options of Unix tar are
X not supported.
X
X It should be possible to create a compressed archive with
X the -z option.
X
X
XNOTES ON AMIGA VERSION:
X
XAddendum for Version 1.1:
X
X The -p option for extracting files with their dates
X preserved is now supported (under AmigaDos 1.2 only; do not
X try to use this option under AmigaDos 1.1).
X
XAddendum for Version 1.2:
X
X The -p option now works on floppies as well as ram:. Various
X internal hacking has been done, and things are slightly
X different than before. The date conversion is now aware that
X it's summertime, and not wintertime (a change noticble only
X to people who've been porting tar archives back and forth
X between Unix and the Amiga).
X
END_OF_FILE
if test 8139 -ne `wc -c <'man/Tar'`; then
echo shar: \"'man/Tar'\" unpacked with wrong size!
fi
# end of 'man/Tar'
fi
if test -f 'src/News060/Anews/anews.c' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'src/News060/Anews/anews.c'\"
else
echo shar: Extracting \"'src/News060/Anews/anews.c'\" \(9663 characters\)
sed "s/^X//" >'src/News060/Anews/anews.c' <<'END_OF_FILE'
X
X/*
X * ANEWS.C
X *
X * Copyright 1988 by William Loftus. All rights reserved.
X *
X * From William P. Loftus's UUCP0.60 distribution.
X */
X
X#include <dos.h>
X#include <stdio.h>
X#include <stdlib.h>
X#include <ctype.h>
X#include "log.h"
X#include "/version.h"
X
X#define YES 1
X#define NO 0
X#define ON scr_inverse_on()
X#define OFF scr_inverse_off()
X#define UL_On printf("\x1b[4m")
X#define UL_Off printf("\x1b[0m")
X#define Clear_eol printf("\x9bK")
X#define Clear_Screen printf("\x9bH\x9bJ")
X#define Cr printf("\xd")
X#define PROG_NAME "Anews"
X
X#define MAXGROUPS 512
X
XIDENT(".00");
X
Xint PageSize;
Xint current = 0;
Xint countgroups;
Xint last[MAXGROUPS]; /* Last read articles */
Xchar **ng;
Xchar *get_next_file();
Xchar fg,bg;
Xchar homedir[128];
Xchar *pager;
X
Xvoid init();
Xvoid scan_subjects();
Xvoid do_quit();
Xvoid do_help1();
Xvoid do_help2();
Xvoid scr_inverse_on();
Xvoid scr_inverse_off();
Xvoid InitNewsrc();
X
Xchar **
XGetNewsgroups_Lastread()
X{
X FILE *fp;
X char buf[BUFSIZ];
X static char *ng[MAXGROUPS];
X int i;
X
X if(!(fp=fopen("UUNEWS:newsrc","r"))) {
X printf("Anews: Error.. could not open UUNEWS:newsrc\n");
X printf("Creating file UUNEWS:newsrc from UUCP:Lib/newsgroups.\n");
X InitNewsrc();
X fp=fopen("UUNEWS:newsrc","r");
X }
X
X for(i=0; i < MAXGROUPS; i++) {
X if (fscanf(fp,"%s %d",&buf,&last[i])==EOF)
X break;
X ng[i] = malloc(strlen(buf));
X strcpy(ng[i],buf);
X }
X fclose(fp);
X countgroups=i;
X return(ng);
X}
X
X
Xvoid
XInitNewsrc()
X{
X char buffer[80];
X FILE *fp_in, *fp_out;
X
X if(!(fp_in=fopen("UULIB:newsgroups","r"))) {
X printf("Error: Cannot open UULIB:newsgroups.\n");
X exit(0);
X }
X
X if(!(fp_out=fopen("UUNEWS:newsrc","w"))) {
X printf("Error: Cannot create newsrc file.\n");
X fclose(fp_in);
X exit(0);
X }
X
X while(fscanf(fp_in,"%s",&buffer)!=EOF) {
X fprintf(fp_out,"%s %d\n",buffer,0);
X strset(buffer,NULL);
X }
X
X fclose(fp_in); fclose(fp_out);
X}
X
Xvoid
Xmain(argc,argv)
Xint argc;
Xchar **argv;
X{
X int ch;
X
X LogProgram = "ANews";
X init();
X ng = GetNewsgroups_Lastread();
X raw(stdin);
X for (;;) {
X chdir("UUNEWS:");
X do {
X chdir(ng[current]);
X if (read_directory() != NULL) {
X ON;
X printf("Read %s? [y/n]",ng[current]);
X OFF;
X } else {
X if (ng[++current] == NULL)
X do_quit();
X ch = NULL;
X break;
X }
X putchar(' ');
X ch = getchar();
X printf("\n");
X } while ((ch == '\n') || (ch == '\r'));
X
X switch (ch) {
X case 'Y': /* Force the newsgroup to be read from the start..
X * We don't want to reset the last message read, so discard
X * the return
X */
X (void)readgroup(ng[current],last[current],1);
X break;
X case 'y':
X last[current] = readgroup(ng[current],last[current],0);
X break;
X case 'n':
X case 'N':
X if (ng[++current] == NULL)
X do_quit();
X break;
X case 'h':
X case 'H':
X case '?':
X do_help1();
X break;
X case 'q':
X case 'Q':
X do_quit();
X case '=':
X read_directory(NULL);
X scan_subjects();
X break;
X default:
X break;
X }
X }
X}
X
Xchar *
XGet_Env(envar, def)
Xchar *envar, *def;
X{
X char *p,*eptr,*getenv();
X
X if ((p=getenv(envar)) != NULL) {
X eptr =(char *) malloc(strlen(p)+1);
X strcpy(eptr,p);
X } else
X eptr=def;
X
X return(eptr);
X}
X
Xvoid
Xinit()
X{
X getcwd(homedir, 128);
X chdir("UUNEWS:");
X pager = Get_Env("PAGER", "Sys:Utilities/More");
X fg = *Get_Env("FG","8");
X bg = *Get_Env("BG","0");
X PageSize = atoi(Get_Env("PAGESIZE", "20"));
X}
X
Xchar *
Xsubs(newsfile)
Xchar *newsfile;
X{
X FILE *fp;
X int j = 0;
X static char buf[BUFSIZ];
X
X if ((fp = fopen(newsfile,"r")) == NULL) {
X printf(" Couldn't open %s\x1b[K\n",newsfile);
X return(NULL);
X }
X while ((j++ < 50) && fgets(buf,BUFSIZ,fp)) {
X if (strncmp("Subject:", buf, 8) == 0) {
X buf[strlen(buf)-1] = '\0';
X fclose(fp);
X return buf;
X }
X }
X
X fclose(fp);
X return NULL;
X}
X
Xvoid
Xscan_subjects()
X{
X char *ptr,ch,*s;
X int i,pos;
X extern int file_pointer;
X
X pos = file_pointer;
X
X i = 0;
X while (ptr = get_next_file()) {
X if (atoi(ptr) == 0)
X continue;
X if ((++i % PageSize) == 0) {
X ON;
X printf("(Hit any key to continue)");
X OFF;
X ch=getchar();
X Cr;
X Clear_eol;
X if (ch == 'q')
X break;
X }
X if (s = subs(ptr))
X printf("%s: %s\n",ptr,s);
X else
X printf("Error: No Subject line in %s\n",ptr);
X }
X file_pointer = pos;
X}
X
Xvoid
Xdo_quit()
X{
X FILE *fp;
X int j;
X
X
X if(!(fp=fopen("UUNEWS:newsrc","w"))) {
X printf("Error, could not open UUNEWS:newsrc for writing.\n");
X } else {
X for(j = 0; j < countgroups; j++) {
X fprintf(fp,"%s %d\n",ng[j],last[j]);
X }
X }
X fclose(fp);
X
X chdir(homedir);
X cooked(stdin);
X exit(0);
X}
X
Xvoid
Xdo_help1()
X{
X printf("\x1b[0;1;33;40m");
X printf("Y Read this newsgroup\n");
X printf("y Read only new articles in this newsgroup\n");
X printf("n/N Skip this newsgroup\n");
X printf("= List article subjects in this newsgroup\n");
X printf("h/H/? Display help\n");
X printf("q/Q Quit to DOS\n");
X printf("\x1b[0;31;40m");
X}
X
Xvoid
Xdo_help2()
X{
X printf("\x1b[0;1;33;40m");
X printf("\n(space) Display next page of current article\n");
X printf("(return) Same as (space)\n");
X printf("n/N Goto the next article\n");
X printf("= List article subjects for the remaining articles\n");
X printf("d/D Delete this article\n");
X printf("- Backup to previous article\n");
X printf("^ Goto the first article (sorry no $)\n");
X printf("(number) Goto the given article number\n");
X printf("./> Scan subject of next article, hit return to read it\n");
X printf(",/< Backup one article, displaying its subject\n");
X printf("w/W Write the current article to a file\n");
X printf("h/H/? Display help\n");
X printf("q/Q Quit this group and return to the main menu\n");
X printf("\x1b[0;31;40m");
X}
X
Xreadgroup(group,lastread,force)
Xchar *group;
Xint lastread, force;
X{
X char *name;
X FILE *fp;
X char buf[BUFSIZ], newname[40], temp[BUFSIZ];
X int i,done,ch,delete,last2; /* Can't think of a different way to do it */
X extern int file_pointer;
X
X if (force==1) {
X file_pointer=0;
X goto Forced;
X }
X
X while ((atoi(name = get_next_file()) <= lastread) && name);
X
X if (name == NULL) {
X Clear_Screen;
X printf("\nNo new news articles..\n");
X return (lastread);
X } else
X goto skipit;
X
X /*
X * we exit from that pointing to the last file we read.. this gets the
X * first one we haven't read, Falling Through CAN be fun ya know?
X */
X
X
XForced:
X while(name=get_next_file()) {
Xskipit:
X /* A necessary little kludge to remember the article number we are on */
X last2=atoi(name);
X
Xnamed_file:
X Clear_Screen;
X if ( (fp = fopen(name,"r")) == NULL) {
X printf("Article %s unavailable.\n",name);
X ON;
X printf("(Hit any key to continue)");
X OFF;
X getchar();
X continue;
X }
X
X delete = done = NO;
X while (fgets(buf, BUFSIZ, fp) && (*buf != '\n')) {
X if ((strncmp(buf, "Subject",7) == 0)) {
X fputs("Subject: ", stdout);
X UL_On;
X fputs(buf+9, stdout);
X UL_Off;
X } else {
X fputs(buf,stdout);
X }
X }
X do {
X ON;
X printf("%s [%s]?",group,name);
X OFF;
X putchar(' ');
X ch = getchar();
X
X /* Erase the prompt */
X Cr;
X Clear_eol;
X
X switch (ch) {
X case ' ':
X case '\n':
X case '\r':
X case '\t':
X i = 0;
X do {
X fputs(buf,stdout);
X } while ((fgets(buf,BUFSIZ,fp) != NULL) && ( i++ <PageSize) );
X break;
X
X case '?':
X case 'h':
X case 'H':
X ON;
X printf("%s [%s]?",group,name);
X OFF;
X do_help2();
X break;
X
X case 'w':
X case 'W':
X ON;
X printf("Write Article %s as ??", name);
X OFF;
X printf(" ");
X strcpy(temp,"copy ");
X strcat(temp,name);
X strcat(temp," to ");
X cooked(stdin);
X gets(newname);
X raw(stdin);
X if (!*newname)
X break;
X strcat(temp,newname);
X if (system(temp))
X break;
X printf("%s Saved to %s\n",name,newname);
X break;
X
X case '=':
X scan_subjects();
X break;
X case 'q':
X case 'Q':
X fclose(fp);
X return(last2>lastread?last2:lastread);
X break;
X
X case '-': if (file_pointer != 1)
X file_pointer -= 2;;
X done = YES;
X break;
X
X case '^':
X file_pointer = 0;
X done = YES;
X break;
X
X case '0':
X case '1':
X case '2':
X case '3':
X case '4':
X case '5':
X case '6':
X case '7':
X case '8':
X case '9':
X cooked(stdin);
X newname[0] = ch;
X ON;
X printf("Goto Article");
X OFF;
X printf(" #%c",ch);
X gets(newname+1);
X raw(stdin);
X fclose(fp);
X name = newname;
X goto named_file;
X
X case '.':
X case '>':
X case ',':
X case '<':
X for(;;) {
X char *strng;
X strng=subs(name);
X strng[strlen(strng)>49?50:strlen(strng)] = NULL;
X printf("\r #%-s\t%-50s\x1b[K",name,strng);
X ON;
X printf("\rGoto Article");
X OFF;
X switch (getchar()) {
X case ',':
X case '<':
X file_pointer -= 2;
X if (file_pointer <0)
X file_pointer=0;
X case '>':
X case '.':
X name=get_next_file();
X break;
X default:
X goto named_file;
X }
X }
X
X case 'd':
X case 'D':
X delete = YES;
X
X case 'n':
X case 'N':
X done = YES;
X
X default:
X break;
X }
X } while (done == NO);
X
X fclose(fp);
X if (delete == YES) {
X if (remove(name)) {
X printf("Error deleting %s\n",name);
X ulog(-1, "Error deleting %s", name);
X }
X }
X }
X return((last2 > lastread) ? last2 : lastread);
X}
X
Xvoid
Xscr_inverse_on()
X{
X printf("\x9b\x37;3%c;4%cm",fg,bg);
X}
X
Xvoid
Xscr_inverse_off()
X{
X printf("\x9b\x30;33;40m\033[0m");
X}
END_OF_FILE
if test 9663 -ne `wc -c <'src/News060/Anews/anews.c'`; then
echo shar: \"'src/News060/Anews/anews.c'\" unpacked with wrong size!
fi
# end of 'src/News060/Anews/anews.c'
fi
if test -f 'src/dmail/commands.c' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'src/dmail/commands.c'\"
else
echo shar: Extracting \"'src/dmail/commands.c'\" \(10361 characters\)
sed "s/^X//" >'src/dmail/commands.c' <<'END_OF_FILE'
X
X/*
X * COMMANDS.C
X *
X * (C) Copyright 1985-1990 by Matthew Dillon, All Rights Reserved.
X *
X * Global Routines: DO_QUIT()
X * DO_EXIT()
X * DO_CD()
X * DO_ECHO()
X * DO_GO()
X * DO_SOURCE()
X * DO_SHELL()
X * DO_WRITE()
X * DO_DELNEXT()
X * DO_NUMBER()
X * DO_NEXT()
X * DO_HEADER()
X * DO_TYPE()
X * DO_DELETE()
X * DO_UNDELETE()
X * DO_MARK()
X * DO_BREAK()
X *
X * Static Routines: None.
X *
X */
X
X#include <stdio.h>
X#include <sys/file.h>
X#include "dmail.h"
X
X#define LAST_TYPE 0
X#define LAST_HEADER 1
X
Xstatic int Last_operation;
Xstatic int Last_deleted = -1;
Xstatic char ScrBuf[1024];
X
Xvoid
Xdo_quit(garbage, com)
Xchar *garbage;
X{
X int fd, r, back;
X char *str;
X
X push_break();
X if (get_inode (mail_file) == get_inode (output_file)) {
X back = save_file (0, 0, ST_DELETED | ST_STORED);
X } else {
X r = write_file (output_file, O_CREAT, ST_READ, ST_DELETED | ST_STORED);
X if (r < 0) {
X printf ("Unable to write to %s\n", output_file);
X back = save_file (0, 0, ST_DELETED | ST_STORED);
X } else {
X back = save_file (0, 0, ST_READ | ST_DELETED | ST_STORED);
X }
X }
X if (back < 0)
X printf ("Unable to update %s\n", mail_file);
X if (back > 0)
X printf ("%d kept in %s\n", back, mail_file);
X sleep (1);
X if ((fd = open (mail_file, O_RDONLY, 0)) >= 0) {
X read (fd, Buf, 1);
X close (fd);
X }
X if (!com)
X done (0);
X free_entry();
X if (av[1] == 0) {
X if (!Silence)
X puts ("NO FROM FILE SPECIFIED");
X av[1] = mail_file;
X av[2] = NULL;
X }
X Did_cd = 0;
X mail_file = realloc (mail_file, strlen(av[1]) + 1);
X strcpy (mail_file, av[1]);
X str = (av[2]) ? av[2] : mail_file;
X output_file = realloc (output_file, strlen(str) + 1);
X strcpy (output_file, str);
X initial_load_mail();
X m_select (Nulav, M_RESET);
X pop_break();
X if (!Silence)
X printf ("\nRF %-20s WF %-20s\n", mail_file, output_file);
X}
X
Xvoid
Xdo_exit(garbage, com)
Xchar *garbage;
X{
X char *str;
X
X if (!com)
X done (0);
X push_break();
X free_entry();
X if (av[1] == 0) {
X if (!Silence)
X puts ("NO FROM FILE SPECIFIED");
X av[1] = mail_file;
X av[2] = NULL;
X }
X mail_file = realloc (mail_file, strlen(av[1]) + 1);
X strcpy (mail_file, av[1]);
X str = (av[2]) ? av[2] : mail_file;
X output_file = realloc (output_file, strlen(str) + 1);
X strcpy (output_file, str);
X initial_load_mail();
X m_select (Nulav, M_RESET);
X pop_break();
X if (!Silence)
X printf ("\nRF %-20s WF %-20s\n", mail_file, output_file);
X}
X
X
Xdo_cd()
X{
X char *dir = (ac < 2) ? home_dir : av[1];
X
X if (chdir(dir) < 0) {
X printf ("Cannot CD to %s\n", dir);
X return (-1);
X }
X ++Did_cd;
X return (1);
X}
X
X
Xdo_echo(str)
Xchar *str;
X{
X puts (next_word(str));
X fflush(stdout);
X return (1);
X}
X
X
Xdo_go()
X{
X int i;
X
X if (ac < 2) {
X puts ("go to which article?");
X }
X rewind_range (1);
X i = get_range();
X if (i < 0) {
X if (!Silence)
X printf ("Message #%d does not exist\n", i);
X return (-1);
X }
X if (i == 0) {
X if (!Silence)
X puts ("No Message");
X return (-1);
X }
X Current = indexof(i);
X return (1);
X}
X
X
Xdo_source(scratch, overide)
Xchar *scratch;
X{
X char *comline = malloc(1024);
X FILE *fi = NULL;
X
X if (ac < 2) {
X puts ("No file argument to source");
X free(comline);
X return (-1);
X }
X if (push_base()) {
X push_break();
X pop_base();
X if (fi != NULL)
X fclose (fi);
X pop_break();
X free(comline);
X return (-1);
X }
X push_break();
X fi = fopen (av[1], "r");
X pop_break();
X if (fi == NULL) {
X if (!overide)
X printf ("Cannot open %s\n", av[1]);
X free(comline);
X return (-1);
X }
X while (fgets (comline, 1024, fi) != NULL) {
X comline[strlen(comline) - 1] = '\0';
X if (comline[0] != '#')
X exec_command (comline);
X }
X push_break();
X fclose (fi);
X fi = NULL;
X free(comline);
X pop_break();
X pop_base();
X return (1);
X}
X
X
Xdo_shell(str)
Xchar *str;
X{
X#ifdef UNIX
X int pid, ret;
X#endif
X char *shell, *ptr;
X char *args;
X
X#ifdef AMIGA
X shell = "";
X#else
X shell = getenv("SHELL");
X#endif
X if (shell == NULL)
X shell = "/bin/sh";
X ptr = shell + strlen(shell) - 1;
X while (ptr > shell && *ptr && *ptr != '/')
X --ptr;
X args = (strcmp(ptr, "/sh"))? "-fc" : "-c";
X push_break();
X str = next_word (str);
X#ifdef UNIX
X if (strlen (str)) {
X if ((pid = vfork()) == 0) {
X execl (shell, shell, args, str, NULL);
X _exit (1);
X }
X } else {
X if ((pid = vfork()) == 0) {
X execl (shell, shell, NULL);
X _exit (1);
X }
X }
X while ((ret = wait(0)) > 0) {
X if (ret == pid)
X break;
X }
X#endif
X#ifdef AMIGA
X Execute(str, NULL, NULL);
X#endif
X pop_break();
X return (1);
X}
X
X
Xdo_write()
X{
X char *file;
X int r, count = 0;
X register int i, j;
X
X if (ac < 2) {
X puts ("You must specify at least a file-name");
X return (-1);
X }
X file = av[1];
X rewind_range (2);
X push_break();
X while (i = get_range()) {
X j = indexof (i);
X if (j >= 0 && !(Entry[j].status & ST_DELETED)) {
X Entry[j].status |= ST_STORED | ST_SCR;
X ++count;
X }
X }
X r = write_file (file, O_CREAT, ST_SCR, 0);
X rewind_range (2);
X if (r > 0) {
X while (i = get_range()) {
X j = indexof (i);
X if (j >= 0)
X Entry[j].status &= ~ST_SCR;
X }
X if (!Silence)
X printf ("%d Items written\n", count);
X } else {
X while (i = get_range()) {
X j = indexof (i);
X if (j >= 0)
X Entry[j].status &= ~(ST_SCR | ST_STORED);
X }
X printf ("Could not write to file %s\n", file);
X }
X pop_break();
X return (1);
X}
X
X/*
X * DB, added 3 Oct 1988
X */
X
Xdo_delprev()
X{
X do_mark("", ST_DELETED);
X if (Current)
X return(do_next("", -1));
X return(-1);
X}
X
Xdo_delnext()
X{
X static int warning;
X
X if (!warning && Last_operation == LAST_HEADER) {
X ++warning;
X puts ("Note that the next command is displaying headers only at");
X puts ("this point. (one-time warning, NOTHING deleted");
X return (-1);
X }
X if (do_mark("", ST_DELETED) > 0)
X return (do_next("", 1));
X return (-1);
X}
X
X
Xdo_number(str, com)
Xchar *str;
Xint com;
X{
X int x;
X
X x = indexof (atoi(str));
X if (x < 0) {
X puts ("Non existant message");
X return (-1);
X }
X Current = x;
X switch (Last_operation) {
X case LAST_TYPE:
X return (do_type());
X case LAST_HEADER:
X return (do_header());
X default:
X puts ("Internal Error NEXT");
X return (-1);
X }
X}
X
X
Xdo_next(str, com)
Xchar *str;
X{
X int ok;
X
X push_break();
X if (com > 0) {
X if (++Current > Entries)
X Current = Entries;
X if (fix() < 0) {
X puts ("End of file");
X pop_break();
X return (-1);
X }
X --com;
X }
X if (com < 0) {
X ++com;
X ok = 0;
X while (--Current >= 0) {
X if (Entry[Current].no && !(Entry[Current].status & ST_DELETED)) {
X ok = 1;
X break;
X }
X }
X if (!ok) {
X puts ("Start of file");
X Current = 0;
X fix();
X pop_break();
X return (-1);
X }
X }
X pop_break();
X if (!com) {
X switch (Last_operation) {
X case LAST_TYPE:
X return (do_type());
X case LAST_HEADER:
X return (do_header());
X }
X }
X return (1);
X}
X
X
Xdo_header()
X{
X Last_operation = LAST_HEADER;
X if (push_base()) {
X push_break();
X pop_base();
X PAGER (-1);
X fseek (m_fi, 0, 0);
X fflush (stdout);
X pop_break();
X return (-1);
X }
X if (single_position() < 0)
X return (-1);
X if (Current < 0) {
X puts("Software error #commands.0");
X exit(1);
X }
X PAGER (0);
X sprintf (Puf, "MESSAGE HEADER #%d (%d) %s\n",
X Entry[Current].no,
X Current + 1,
X (Entry[Current].status & ST_DELETED) ? " DELETED" : "");
X PAGER (Puf);
X sprintf (Puf, "From %s\n", Entry[Current].from);
X PAGER (Puf);
X while (fgets (ScrBuf, 1024, m_fi) != NULL) {
X FPAGER (ScrBuf);
X if (*ScrBuf == '\n') {
X PAGER (-1);
X pop_base();
X return (1);
X }
X }
X PAGER ("END OF FILE ENCOUNTERED");
X PAGER (-1);
X pop_base();
X return (-1);
X}
X
Xdo_type()
X{
X int i;
X
X Last_operation = LAST_TYPE;
X if (push_base()) {
X push_break();
X pop_base();
X PAGER (-1);
X fseek (m_fi, 0, 0);
X fflush (stdout);
X pop_break();
X return (-1);
X }
X if (single_position() < 0)
X return (-1);
X if (Current < 0) {
X puts("Software Error #commands.1");
X exit(1);
X }
X if (skip_to_data (m_fi) < 0) {
X printf ("Cannot find data for message %d\n", Entry[Current].no);
X return (-1);
X }
X PAGER (0);
X sprintf (Puf, "MESSAGE TEXT #%d (%d) %s\n",
X Entry[Current].no,
X Current + 1,
X (Entry[Current].status & ST_DELETED) ? " DELETED" : "");
X PAGER (Puf);
X for (i = 0; i < Listsize; ++i) {
X if (*Entry[Current].fields[header[i]]) {
X sprintf (Puf, "%-10s %s",
X Find[header[i]].search,
X Entry[Current].fields[header[i]]);
X PAGER (Puf);
X }
X }
X PAGER ("");
X while ((fgets (ScrBuf, 1024, m_fi) != NULL) && strncmp (ScrBuf, "From ", 5))
X FPAGER (ScrBuf);
X Entry[Current].status |= ST_READ;
X PAGER (-1);
X pop_base();
X return (1);
X}
X
X
Xdo_mark(garbage, mask)
Xchar *garbage;
X{
X int count = 0;
X register int i, j;
X
X rewind_range (1);
X push_break();
X while (i = get_range()) {
X j = indexof (i);
X if (j >= 0) {
X if (mask & ST_DELETED)
X Last_deleted = j;
X if ((Entry[j].status & mask) != mask) {
X Entry[j].status |= mask;
X if (Entry[j].status & ST_DELETED)
X Entry[j].status &= ~(ST_STORED | ST_READ | ST_TAG);
X ++count;
X }
X }
X }
X if (!Silence)
X printf ("%d Items\n", count);
X pop_break();
X return (1);
X}
X
X
Xdo_unmark(garbage, mask)
Xchar *garbage;
X{
X int count = 0;
X register int i, j;
X register struct ENTRY *en;
X
X push_break();
X if (ac == 1 && (mask & ST_DELETED) && Last_deleted != -1) {
X en = &Entry[Last_deleted];
X if (en->no) {
X en->status &= ~mask;
X printf ("Undeleted last deleted message (# %d)\n", en->no);
X Current = Last_deleted;
X Last_deleted = -1;
X } else {
X puts ("Last deleted message not within current select bounds");
X pop_break();
X return (-1);
X }
X pop_break();
X return (1);
X }
X rewind_range (1);
X while (i = get_range()) {
X j = indexof (i);
X if (j >= 0) {
X if (Entry[j].status & mask) {
X Entry[j].status &= ~mask;
X ++count;
X }
X }
X }
X if (!Silence)
X printf ("%d Items\n", count);
X pop_break();
X return ((count) ? 1 : -1);
X}
X
Xdo_break(garbage, mask)
Xchar *garbage;
X{
X if (mask)
X pop_break();
X else
X push_break();
X return (1);
X}
X
Xvoid
Xdo_ver()
X{
X puts (DVERSION);
X}
X
END_OF_FILE
if test 10361 -ne `wc -c <'src/dmail/commands.c'`; then
echo shar: \"'src/dmail/commands.c'\" unpacked with wrong size!
fi
# end of 'src/dmail/commands.c'
fi
if test -f 'src/dmail/sendmail.c' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'src/dmail/sendmail.c'\"
else
echo shar: Extracting \"'src/dmail/sendmail.c'\" \(9206 characters\)
sed "s/^X//" >'src/dmail/sendmail.c' <<'END_OF_FILE'
X
X/*
X * SENDMAIL.C
X *
X * (C) Copyright 1985-1990 by Matthew Dillon, All Rights Reserved.
X *
X * Global Routines: DO_REPLY()
X * DO_MAIL()
X *
X * Static Routines: WORD_SIZE()
X * FOPEN_SCRATCH()
X * FREOPEN_SCRATCH()
X * FCLOSE_SCRATCH()
X * FTERMINATE_SCRATCH()
X * DELETE_SCRATCH()
X * RUN_VI()
X * SEND_MAIL()
X *
X *
X */
X
X#include <stdio.h>
X#include <sys/types.h>
X#include <sys/stat.h>
X#include <sys/file.h>
X#ifdef UNIX
X#include <sys/ioctl.h>
X#endif
X#include <sys/time.h>
X#include <signal.h>
X#include "dmail.h"
X
X#ifdef AMIGA
X#include <dos.h>
X
Xstruct XFORKENV {
X long env_priority;
X long env_stack;
X long env_stdin;
X long env_stdout;
X long env_console;
X long env_msgport;
X};
X
X#endif
X
XFILE *fi;
Xchar file[64];
X
Xvoid fclose_scratch();
Xvoid fopen_scratch();
Xvoid copy_header();
Xvoid send_mail();
X
Xdo_reply(garbage, itext)
Xchar *garbage;
X{
X int i, j;
X int anyargs = 0;
X int to_field, cc_field;
X int len;
X char *ptr;
X static char buf[1024];
X char scr;
X char *istr;
X
X if (!(istr = get_var(LEVEL_SET, "_headchar")))
X istr = ">";
X if (push_base()) {
X push_break();
X pop_base();
X fclose_scratch();
X puts ("ABORTED, no mail sent");
X unlink(file);
X pop_break();
X return (-1);
X }
X fopen_scratch();
X strcpy (buf, "To: ");
X for (i = 1; i < ac; ++i) {
X if (*av[i] >= '0' && *av[i] <= '9') {
X if ((j = indexof(atoi(av[i]))) < 0) {
X puts ("No such message");
X fclose_scratch();
X unlink(file);
X pop_break();
X return (-1);
X }
X Current = j;
X } else {
X if (anyargs)
X strcat (buf, ", ");
X anyargs = 1;
X strcat (buf, av[i]);
X }
X }
X len = strlen(buf);
X switch (itext) {
X case R_FORWARD:
X strcat (buf, "\n");
X fputs (buf, fi);
X fputs ("Subject: \n", fi);
X break;
X case R_INCLUDE:
X case R_REPLY:
X if (anyargs) {
X strcat (buf, ", ");
X len = strlen(buf);
X }
X buf[len] = 0;
X if (Current >= 0) {
X char *rf = get_var(LEVEL_SET, "replyfields");
X if (rf == NULL)
X rf = "";
X while (*rf) { /* attempt to find the fields listed */
X char *re;
X char *ptr;
X char c;
X for (re = rf; *re && *re != ' ' && *re != 9; ++re);
X c = *re;
X *re = 0;
X ptr = get_field(rf);
X if (*ptr) {
X *re = c;
X sprintf (buf + len, "%s\n", ptr);
X break;
X }
X *re = c;
X while (*re == ' ' || *re == 9)
X ++re;
X rf = re;
X }
X if (*rf == 0) {
X sprintf (buf + len, "%.*s\n",
X word_size(Entry[Current].from), Entry[Current].from);
X }
X }
X fputs (buf, fi);
X fputs ("Cc: ", fi);
X ptr = get_field ("To:");
X to_field = (*ptr) ? 1 : 0;
X fputs (ptr, fi);
X scr = *(ptr + strlen(ptr) - 1);
X ptr = get_field ("Cc:");
X cc_field = (*ptr) ? 1 : 0;
X if (cc_field) {
X if (scr == '\n') {
X fputs (" ", fi);
X }
X if (to_field)
X fputs (", ", fi);
X fputs (ptr, fi);
X }
X fputs ("\nSubject: Re: ", fi);
X fputs (get_field ("Subject:"), fi);
X fputs ("\n", fi);
X break;
X case R_MAIL:
X fputs (buf, fi);
X fputs ("\n", fi);
X fputs ("Cc: \n", fi);
X fputs ("Bcc: \n", fi);
X fputs ("Subject: \n", fi);
X break;
X default:
X puts ("INTERNAL STUPID MAIL ERROR: REPLY");
X break;
X }
X copy_header (fi);
X fputs ("\n\n", fi);
X if (itext == R_FORWARD || itext == R_INCLUDE) {
X position_current();
X if (itext == R_FORWARD) {
X if (Current >= 0)
X fprintf (fi, "ORIGINALLY From %s\n", Entry[Current].from);
X } else {
X skip_to_data (m_fi);
X }
X while ((fgets (Buf, MAXFIELDSIZE, m_fi) != NULL) && !isfrom(Buf)) {
X if (itext == R_INCLUDE)
X fputs(istr, fi);
X fputs (Buf, fi);
X }
X fputs ("\n", fi);
X }
X fclose_scratch();
X if (itext != R_MAIL) {
X push_break();
X if (Current >= 0) {
X Entry[Current].status |= ST_SCR;
X write_file("tmp:Original", O_CREAT | O_TRUNC, ST_SCR, 0);
X Entry[Current].status &= ~ST_SCR;
X }
X pop_break();
X }
X j = -1;
Xloop:
X ++j;
X if (run_vi() || j) {
X push_break();
X switch (do_ask()) {
X case 1:
X puts ("SENDING.. wait");
X send_mail();
X {
X FILE *li = fopen(file, "r");
X char buf[128], *ptr = NULL;
X
X if (li) {
X while (fgets(buf, 128, li) && buf[0] != '\n') {
X if (strncmp(buf, "Farchive:", 9) == 0) {
X buf[strlen(buf)-1] = '\0';
X for (ptr = buf + 9; *ptr == ' '; ++ptr);
X if (ptr[0] == '$')
X ptr = get_var(LEVEL_SET, ptr+1);
X break;
X }
X }
X fclose(li);
X }
X archive_mail(ptr);
X }
X unlink(file);
X break;
X case 2:
X pop_break();
X goto loop;
X default:
X unlink (file);
X break;
X }
X pop_base();
X pop_break();
X } else {
X puts ("File not modified or ABORTED, no mail sent");
X unlink(file);
X pop_base();
X }
X unlink ("#");
X}
X
Xdo_ask()
X{
X char in[256];
X
X if (!S_ask)
X return (1);
X fputs ("\n(Send, Vi, Quit) ?", stdout);
X fflush(stdout);
X gets (in);
X switch (in[0]) {
X case 's':
X case 'S':
X return (1);
X case 'q':
X case 'Q':
X puts ("ABORT, no mail sent");
X return (3);
X case 'v':
X case 'V':
X default:
X return (2);
X }
X}
X
X
X
Xstatic void
Xcopy_header(fi)
XFILE *fi;
X{
X FILE *fs;
X char *ptr;
X
X if (ptr = get_var (LEVEL_SET, "header")) {
X push_break();
X if ((fs = fopen (ptr, "r")) != NULL) {
X while (fgets (Buf, MAXFIELDSIZE, fs) != NULL)
X fputs (Buf, fi);
X fclose (fs);
X } else {
X printf ("Cannot open header file %d %s\n", strlen(ptr), ptr);
X perror ("fopen");
X }
X pop_break();
X }
X}
X
X
Xstatic void
Xfopen_scratch()
X{
X static int c;
X int fd;
X
X sprintf(file, "tmp:dmt%d%d", getpid(), c++);
X fd = open(file, O_RDWR|O_CREAT|O_TRUNC, 0700);
X if (fd < 0) {
X perror ("Dmail, cannot open scratch file");
X done (1);
X }
X#ifdef AMIGA /* fix bug in Lattice C fdopen */
X fi = fopen("nil:", "w");
X fclose(fi);
X#endif
X fi = fdopen(fd, "w+");
X}
X
Xstatic void
Xfclose_scratch()
X{
X if (fi != NULL) {
X fflush (fi);
X fclose (fi);
X fi = NULL;
X }
X}
X
X
Xstatic
Xword_size(str)
Xregister char *str;
X{
X register int size = 0;
X
X while (*str) {
X if (*str == ' ')
X return (size);
X ++str;
X ++size;
X }
X return (size);
X}
X
X
Xstatic
Xrun_vi()
X{
X#ifdef UNIX
X char buf[64];
X int ret, pid = 0;
X#endif
X struct stat stat1, stat2;
X char *argv[3];
X
X argv[0] = visual;
X argv[1] = file;
X argv[2] = NULL;
X if (push_base()) {
X push_break();
X pop_base();
X#ifdef UNIX
X if (pid) {
X kill (pid, SIGKILL);
X sprintf (buf, "tmp:Ex%d", pid); unlink (buf);
X sprintf (buf, "tmp:Rx%d", pid); unlink (buf);
X wait(0);
X system ("clear; reset ; clear");
X pid = 0;
X }
X#endif
X pop_break();
X return (0);
X }
X stat1.st_mtime = stat2.st_mtime = stat1.st_ctime = stat2.st_ctime = 0;
X stat (file, &stat1);
X if (S_novibreak)
X push_break();
X
X#ifdef UNIX
X pid = vfork();
X if (!pid) {
X execv (visual, argv);
X printf ("Cannot exec visual: %s\n", visual);
X _exit (1);
X }
X while ((ret = wait(0)) > 0) {
X if (ret == pid)
X break;
X }
X#endif
X#ifdef AMIGA
X {
X short i;
X static char buf[128];
X
X strcpy(buf, argv[0]);
X for (i = 1; argv[i]; ++i) {
X strcat(buf, " ");
X strcat(buf, argv[i]);
X }
X Execute(buf, NULL, NULL);
X }
X#endif
X if (S_novibreak)
X pop_break();
X stat (file, &stat2);
X pop_base();
X return (!(stat1.st_mtime==stat2.st_mtime));
X}
X
X
X#ifdef UNIX
X
Xstatic void
Xsend_mail()
X{
X int fd, stdin_fd;
X char *argv[6];
X
X push_break();
X argv[0] = S_sendmail;
X argv[1] = "-t";
X argv[2] = "-oem";
X argv[3] = "-i";
X if (S_verbose) {
X argv[4] = "-v";
X argv[5] = NULL;
X } else {
X argv[4] = NULL;
X }
X
X fd = open (file, O_RDONLY, 0);
X if (fd < 0) {
X perror ("Dmail, Cannot open scratch file");
X done (1);
X }
X lseek(fd, 0, 0);
X
X stdin_fd = dup (0);
X dup2 (fd, 0); /* STDIN = message file */
X close(fd); /* don't need message file anymore */
X if (!fork()) {
X int fd = open("/dev/tty", O_RDWR, 0);
X if (fd >= 0) {
X ioctl(fd, TIOCNOTTY, 0);
X close(fd);
X freopen("/dev/null", "w", stdout);
X freopen("/dev/null", "w", stderr);
X }
X execv (S_sendmail, argv);
X printf ("Unable to exec sendmail: %s\n", S_sendmail);
X _exit (1);
X }
X dup2 (stdin_fd, 0); /* restore STDIN */
X close(stdin_fd);
X if (S_verbose) {
X puts ("Waiting for sendmail...");
X wait (0);
X puts ("Sendmail done");
X }
X pop_break();
X}
X
X#endif
X#ifdef AMIGA
X
Xstatic void
Xsend_mail()
X{
X static char Buf[256];
X
X push_break();
X sprintf(Buf, "%s < %s%s -f %s", S_sendmail, file, (S_verbose ? " -v" : ""), user_name);
X
X printf("Sending\n");
X if (Execute(Buf, NULL, NULL) == 0)
X printf("Unable to run: %s\n", Buf);
X
X pop_break();
X}
X
X#endif
X
X
X
X
X
Xstatic
Xarchive_mail(ptr)
Xchar *ptr;
X{
X FILE *ifi, *ofi;
X long tim = time(NULL);
X
X if (!ptr)
X ptr = get_var(LEVEL_SET, "archive");
X if (ptr == NULL || *ptr == '\0')
X return(-1);
X ifi = fopen(file, "r");
X if (ifi == NULL) {
X puts ("Cannot open scratch file");
X return(-1);
X }
X ofi = fopen(ptr, "a");
X if (ofi == NULL) {
X puts ("Cannot open archive file");
X fclose(ifi);
X return(-1);
X }
X sprintf (Buf, "\nFrom %s (ARCHIVE)\n", user_name);
X fputs (Buf, ofi);
X sprintf (Buf, "Date: %s", ctime(&tim));
X fputs (Buf, ofi);
X while (fgets (Buf, MAXFIELDSIZE, ifi))
X fputs (Buf, ofi);
X fclose(ofi);
X fclose(ifi);
X return (1);
X}
X
X
END_OF_FILE
if test 9206 -ne `wc -c <'src/dmail/sendmail.c'`; then
echo shar: \"'src/dmail/sendmail.c'\" unpacked with wrong size!
fi
# end of 'src/dmail/sendmail.c'
fi
echo shar: End of archive 6 \(of 16\).
cp /dev/null ark6isdone
MISSING=""
for I in 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 ; do
if test ! -f ark${I}isdone ; then
MISSING="${MISSING} ${I}"
fi
done
if test "${MISSING}" = "" ; then
echo You have unpacked all 16 archives.
rm -f ark[1-9]isdone ark[1-9][0-9]isdone
else
echo You still need to unpack the following archives:
echo " " ${MISSING}
fi
## End of shell archive.
exit 0
--
Submissions to comp.sources.amiga and comp.binaries.amiga should be sent to:
amiga@cs.odu.edu
or amiga@xanth.cs.odu.edu ( obsolescent mailers may need this address )
or ...!uunet!xanth!amiga ( very obsolescent mailers need this address )
Comments, questions, and suggestions should be addressed to ``amiga-request''
(please only use ``amiga'' for actual submissions) at the above addresses.