Newsgroups: alt.sources
From: ken@bitsko.slc.ut.us (Ken MacLeod)
Subject: Unidel 1.0, a Citadel-style news/mail reader and BBS, part 07 of 09
Message-ID: <1992May3.013021.18932@bitsko.slc.ut.us>
Date: Sun, 3 May 1992 01:30:21 GMT

Submitted-by: ken@bitsko.slc.ut.us
Archive-name: unidel-1.0/part07

---- Cut Here and unpack ----
#!/bin/sh
# This is part 07 of unidel-1.0
if touch 2>&1 | fgrep 'amc' > /dev/null
 then TOUCH=touch
 else TOUCH=true
fi
# ============= lib/Transfers ==============
echo "x - extracting lib/Transfers (Text)"
sed 's/^X//' << 'SHAR_EOF' > lib/Transfers &&
X#
X# NAME
X#     Transfers  --  Description of file transfer protocols
X#
X# SYNOPSIS
X#     name:description:flags:upl-command:dnl-command
X#
X# DESCRIPTION
X#     Transfers contains the list of file transfer protocols available,
X#     the commands to execute them, a user description and flags to tell
X#     Unidel how to use the command.
X#
X#     Before calling the program, Unidel will set SHELL to 'rsh', PATH
X#     to '/usr/rbin', and change directory to a temporary directory in
X#     which to edit files.
X#
X#     There is no default transfer protocol.
X#
X#     name    is the name of the protocol, used to select or reference the
X#             protocol.
X#     description   is the user description of the protocol, used when
X#             selecting the protocol.
X#     flags   are keywords that describe the protocol to Unidel.  The
X#             available flags are:
X#
X#          Batch    Protocol is a batching protocol and accepts multiple
X#                   files to transfer.  '%s' in upl/dnl-command below may
X#                   one or more space separated file names.
X#
X# SEE ALSO
X#     unidel(1)
X#
XASCII:Plain ASCII, NOT recommended, can't upload:Batch::/usr/bin/cat %s
XXModem:The Original::/usr/local/bin/rx %s:/usr/local/bin/sx %s
XXModem-1k:XModem with 1k blocks (sometimes incorrectly called "YModem")::/usr/local/bin/rx -k %s:/usr/local/bin/sx -k %s
XYModem:(sometimes redundantly called "YModem Batch"):Batch:/usr/local/bin/rb:/usr/local/bin/sb %s
XZModem::Batch:/usr/local/bin/rz:/usr/local/bin/sz %s
X#
X# Has been known to work with Kermit, but I've since forgotten the syntax.
X
SHAR_EOF
$TOUCH -am 0502132892 lib/Transfers &&
chmod 0644 lib/Transfers ||
echo "restore of lib/Transfers failed"
set `wc -c lib/Transfers`;Wc_c=$1
if test "$Wc_c" != "1591"; then
	echo original size 1591, current size $Wc_c
fi
# ============= lib/unidelin ==============
echo "x - extracting lib/unidelin (Text)"
sed 's/^X//' << 'SHAR_EOF' > lib/unidelin &&
X#
X# NAME
X#     unidelin -- perform local actions before loading Unidel
X#
X# DESCRIPTION
X#     This shell script is executed before any other processing done
X#     in Unidel.
X#
X#     One thing that can be done here for bbs-user login accounts is
X#     to untar and uncompress the user home diriectory, which is
X#     tar'red and compress'ed by unidelout.
X#
X#     After this script is run, $HOME/.unidelin is executed.
X#
Xi=`expr \`cat /usr/local/lib/unidel/callerNo\` + 1`
Xecho $i >/usr/local/lib/unidel/callerNo
Xecho "Downtime:"
Xecho "  92Jan18, 5min; Cause: 4-year old human."
Xecho "  92Feb -- 92Mar; Cause: Phone line and sysadmin absence."
Xecho "Local time `/usr/ucb/uptime`, caller $i."
X
Xecho "
X   Bitsko's Bar & Grill BBS:  Here, There or Elsewhere Since 1986
X
X"
SHAR_EOF
$TOUCH -am 0502133492 lib/unidelin &&
chmod 0755 lib/unidelin ||
echo "restore of lib/unidelin failed"
set `wc -c lib/unidelin`;Wc_c=$1
if test "$Wc_c" != "766"; then
	echo original size 766, current size $Wc_c
fi
# ============= lib/unidelout ==============
echo "x - extracting lib/unidelout (Text)"
sed 's/^X//' << 'SHAR_EOF' > lib/unidelout &&
X#
X# NAME
X#     unidelout -- perform local actions before exiting Unidel
X#
X# DESCRIPTION
X#     This shell script is executed after all other processing
X#     in Unidel.
X#
X#     One thing that can be done here for bbs-user login accounts is
X#     to tar and compress the user home diriectory, which is
X#     untar'red and uncompress'ed by unidelin.
X#
X#     Before this script is run, $HOME/.unidelin is executed.
X#
Xecho "
X   Thanks for calling!
X
X"
X
X# let output drain before flushing
Xsleep 1
SHAR_EOF
$TOUCH -am 0502133692 lib/unidelout &&
chmod 0755 lib/unidelout ||
echo "restore of lib/unidelout failed"
set `wc -c lib/unidelout`;Wc_c=$1
if test "$Wc_c" != "490"; then
	echo original size 490, current size $Wc_c
fi
# ============= doc/?.doc ==============
if test ! -d 'doc'; then
    echo "x - creating directory doc"
    mkdir 'doc'
fi
echo "x - extracting doc/?.doc (Text)"
sed 's/^X//' << 'SHAR_EOF' > doc/?.doc &&
XType the following for detailed explanation of Citadel commands.
X
X* == You should read!
X
X.H(elp) ?              This list
X.H(elp) ANSWERS       *Answers to commonly asked questions (UseNet)
X.H(elp) ANSWERS2      *Answers to common questions about this BBS.
X.H(elp) COMMUNITY     *How to get along in the UseNet community (UseNet)
X.H(elp) HISTORY        Citadel Software history
X.H(elp) MAILLISTS      List of available mailing lists (UseNet)
X.H(elp) POLICY        *Policy of Bitsko's Bar & Grill
X.H(elp) RULES         *General UseNet rules (UseNet)
X.H(elp) STYLE         *Writing style (UseNet)
X.H(elp) SUMMARY        Complete summary of [.] commands
X.H(elp) TOPICS         This list
X.H(elp) USENET         How to access the UseNet rooms
SHAR_EOF
$TOUCH -am 0502131792 doc/?.doc &&
chmod 0644 doc/?.doc ||
echo "restore of doc/?.doc failed"
set `wc -c doc/?.doc`;Wc_c=$1
if test "$Wc_c" != "738"; then
	echo original size 738, current size $Wc_c
fi
# ============= doc/answers.doc ==============
echo "x - extracting doc/answers.doc (Text)"
sed 's/^X//' << 'SHAR_EOF' > doc/answers.doc &&
XFrom: spaf@cs.purdue.EDU (Gene Spafford)
XNewsgroups: news.announce.newusers
XSubject: Answers to Frequently Asked Questions (Updated: 27 March 1988)
X
XReplace this file with a recent copy of the article of the same
Xsubject in newsgroup news.announce.newusers.
SHAR_EOF
$TOUCH -am 0502132392 doc/answers.doc &&
chmod 0644 doc/answers.doc ||
echo "restore of doc/answers.doc failed"
set `wc -c doc/answers.doc`;Wc_c=$1
if test "$Wc_c" != "258"; then
	echo original size 258, current size $Wc_c
fi
# ============= doc/bbsinstall.doc ==============
echo "x - extracting doc/bbsinstall.doc (Text)"
sed 's/^X//' << 'SHAR_EOF' > doc/bbsinstall.doc &&
XBBS Installation
X
X  On Bitsko's Bar & Grill I have Unidel set up as the shell program
Xexecuted on login, or in other words, /usr/lib/citadel/citadel is used
Xin place of /bin/sh in the last field of passwd.  Just like shell
Xusers on the system, the call-in Unidel user has her/his own home
Xdirectory.
X
X  At first, I installed logins by hand, simply adding a new entry in
Xpasswd whenever someone wanted it.  This is the easiest method, if you
Xhave a closed system (rare add new users) you may want to use this.
X
X  Very soon after, I set-up the auto-validation system to create new
Xpasswd entries automatically.  This is probably the only 'real' part
Xto making Unidel a BBS program, having a way to add new users in a
Xsecure, automatic way.  I have included my guest-login/auto-validation
Xshells and programs for you to use (in the 'misc' directory), here is
Xhow to set them up:
X
X  NewUser.sh (copied to .../guest/.profile)
X    Create a login called 'guest' (or whatever) with shell '/bin/sh'.
X    Copy 'NewUser.sh' to '.profile' in guest's home directory.  Edit
X    it so that the blurb says what you want it to and to ask the
X    questions you want to ask about the person.  The only required
X    question is user name.
X
X  UpLow
X    This is a program that does case conversion on answers to
X    questions in .profile.  It only converts when the answer is all
X    lower or upper case, if it's mixed then it leaves it alone.  To
X    create it, type 'make UpLow' and copy the program into the $LIBDIR
X    directory.
X
X  AutoVal
X    This is the major part of the auto-validation system, it takes a
X    passwd entry in on standard input, verifies it with a little
X    security checking and appends it to passwd.  To create it, type
X    'make AutoVal' and copy it into the $LIBDIR directory.  As the
X    super-user, 'chown root AutoVal' and 'chmod u+s AutoVal', this
X    makes it so AutoVal can modify passwd.  AutoVal picks the first
X    available user-id greater than 200 and assigns it to the new user.
X
X    WARNING: This probably doesn't need to be said, but I'll say it
X    anyway, any program that runs as set-uid root SHOULD BE VERIFIED,
X    even though I wrote it and use it doesn't mean you should trust it.
X
X  $LIBDIR/unidelin and $HOME/.unidelin
X  $LIBDIR/unidelout and $HOME/.unidelout
X    These two programs are executed when Unidel is started (unidelin)
X    and just before it exits (unidelout).  I use them to archive and
X    compress the user files for all users in a certain common home
X    directory path (/usr/lib/citadel/rc), it leaves other user's files
X    alone.
X
X  I haven't written user-aging scripts yet, so once a user is entered,
Xit doesn't get deleted if they never call back, I'm working on scripts
Xfor that too.
X
X  There's another way of handling call-ins that I haven't played with
Xbut you may be interested in implementing yourself: Having a single
Xcommon UN*X login for all BBS users that then asks for the bbs-login
Xname and then changes $HOME directory and calls Unidel.  This should
Xbe really easy to do with a '.profile' script and a simple user-list.
XThis would be the best way to go if you're a little leary of having
Xlogins appended to your passwd file.
SHAR_EOF
$TOUCH -am 0502131792 doc/bbsinstall.doc &&
chmod 0644 doc/bbsinstall.doc ||
echo "restore of doc/bbsinstall.doc failed"
set `wc -c doc/bbsinstall.doc`;Wc_c=$1
if test "$Wc_c" != "3187"; then
	echo original size 3187, current size $Wc_c
fi
# ============= doc/blurb.doc ==============
echo "x - extracting doc/blurb.doc (Text)"
sed 's/^X//' << 'SHAR_EOF' > doc/blurb.doc &&
X  Hi, thanks for coming in to this BBS.
SHAR_EOF
$TOUCH -am 0502132792 doc/blurb.doc &&
chmod 0644 doc/blurb.doc ||
echo "restore of doc/blurb.doc failed"
set `wc -c doc/blurb.doc`;Wc_c=$1
if test "$Wc_c" != "40"; then
	echo original size 40, current size $Wc_c
fi
# ============= doc/community.doc ==============
echo "x - extracting doc/community.doc (Text)"
sed 's/^X//' << 'SHAR_EOF' > doc/community.doc &&
XFrom: spaf@cs.purdue.EDU (Gene Spafford)
XNewsgroups: news.announce.newusers
XSubject: A Primer on How to Work With the Usenet Community (Updated: 7 September 1987)
X
XReplace this file with a recent copy of the article of the same
Xsubject in newsgroup news.announce.newusers.
SHAR_EOF
$TOUCH -am 0502132692 doc/community.doc &&
chmod 0644 doc/community.doc ||
echo "restore of doc/community.doc failed"
set `wc -c doc/community.doc`;Wc_c=$1
if test "$Wc_c" != "273"; then
	echo original size 273, current size $Wc_c
fi
# ============= doc/config.doc ==============
echo "x - extracting doc/config.doc (Text)"
sed 's/^X//' << 'SHAR_EOF' > doc/config.doc &&
X
X  Temporary Enter Configuration summary.
X
X_._E(nter) _C(onfiguration)
X  _?  is this help file.
X  _D  Select Message Editor
X  _E  Toggle Expert mode.
X  _F  Toggle Floor mode.
X  _M  Change Message pause mode.
X  _N  Enter full Name.
X  _P  Enter Password.
X  _S  Enter Signature.
X  _T  Enter Terminal type.
X  _X  Change Transfer protocol.
SHAR_EOF
$TOUCH -am 0502131792 doc/config.doc &&
chmod 0644 doc/config.doc ||
echo "restore of doc/config.doc failed"
set `wc -c doc/config.doc`;Wc_c=$1
if test "$Wc_c" != "348"; then
	echo original size 348, current size $Wc_c
fi
# ============= doc/dates.doc ==============
echo "x - extracting doc/dates.doc (Text)"
sed 's/^X//' << 'SHAR_EOF' > doc/dates.doc &&
XDates are used when reading messages, listing files, and entering expiration
Xdates on messages.
X
XA date is a string consisting of 0 or more specifications of
Xthe following form:
X
X  tod	 A _t_o_d is a time of day, which is of the form
X	 _h_h[:_m_m[:_s_s]] (or _h_h_m_m) [_m_e_r_i_d_i_a_n] [_z_o_n_e].  If no
X	 meridian - aaaammmm or ppppmmmm - is specified, a 24-hour clock
X	 is used.  A _t_o_d may be specified as just _h_h followed
X	 by a _m_e_r_i_d_i_a_n.
X
X  date	 A _d_a_t_e is a specific month and day, and possibly a
X	 year.	Acceptable formats are _m_m/_d_d[/_y_y] and
X	 _m_o_n_t_h_n_a_m_e _d_d[, _y_y] If omitted, the year defaults to
X	 the current year; if a year is specified as a number
X	 less than 100, 1900 is added.	If a number not
X	 followed by a day or relative time unit occurs, it
X	 will be interpreted as a year if a _t_o_d, _m_o_n_t_h_n_a_m_e,
X	 and _d_d have already been specified; otherwise, it
X	 will be treated as a _t_o_d.
X
X  day	 A _d_a_y of the week may be specified; the current day
X	 will be used if appropriate.  A _d_a_y may be preceded
X	 by a _n_u_m_b_e_r, indicating which instance of that day is
X	 desired; the default is 1111.  Negative _n_u_m_b_e_r_s indicate
X	 times past.  Some symbolic _n_u_m_b_e_r_s are accepted:
X	 llllaaaasssstttt, nnnneeeexxxxtttt, and the ordinals ffffiiiirrrrsssstttt through ttttwwwweeeellllfffftttthhhh
X	 (sssseeeeccccoooonnnndddd is ambiguous, and is not accepted as an
X	 ordinal number).  The symbolic number nnnneeeexxxxtttt is
X	 equivalent to 2222; thus, nnnneeeexxxxtttt mmmmoooonnnnddddaaaayyyy refers not to the
X	 immediately coming Monday, but to the one a week
X	 later.
X
X  relative time
X	 Specifications relative to the current time are also
X	 accepted. The format is [_n_u_m_b_e_r] _u_n_i_t; acceptable
X	 units are yyyyeeeeaaaarrrr, mmmmoooonnnntttthhhh, ffffoooorrrrttttnnnniiiigggghhhhtttt, wwwweeeeeeeekkkk, ddddaaaayyyy, hhhhoooouuuurrrr,
X	 mmmmiiiinnnnuuuutttteeee, and sssseeeeccccoooonnnndddd.
X
X  The actual date is formed as follows:  first, any absolute
X  date and/or time is processed and converted.	Using that
X  time as the base, day-of-week specifications are added;
X  last, relative specifications are used.  If a date or day is
X  specified, and no absolute or relative time is given,
X  midnight is used.  Finally, a correction is applied so that
X  the correct hour of the day is produced after allowing for
X  daylight savings time differences.
X
X  _G_e_t_d_a_t_e accepts most common abbreviations for days, months,
X  etc.; in particular, it will recognize them with upper or
X  lower case first letter, and will recognize three-letter
X  abbreviations for any of them, with or without a trailing
X  period.  Units, such as wwwweeeeeeeekkkks, may be specified in the
X  singular or plural.  Timezone and meridian values may be in
X  upper or lower case, and with or without periods.
X
XAAAAUUUUTTTTHHHHOOOORRRR
X  Steven M. Bellovin (unc!smb)
X  Dept. of Computer Science
X  University of North Carolina at Chapel Hill
X
XBBBBUUUUGGGGSSSS
X  The grammar and scanner are rather primitive; certain
X  desirable and unambiguous constructions are not accepted.
X  Worse yet, the meaning of some legal phrases is not what is
X  expected; nnnneeeexxxxtttt wwwweeeeeeeekkkk is identical to 2222 wwwweeeeeeeekkkkssss.
X  The daylight savings time correction is not perfect, and can
X  get confused if handed times between midnight and 2:00 am on
X  the days that the reckoning changes.
SHAR_EOF
$TOUCH -am 0502131792 doc/dates.doc &&
chmod 0644 doc/dates.doc ||
echo "restore of doc/dates.doc failed"
set `wc -c doc/dates.doc`;Wc_c=$1
if test "$Wc_c" != "3910"; then
	echo original size 3910, current size $Wc_c
fi
# ============= doc/edit.doc ==============
echo "x - extracting doc/edit.doc (Text)"
sed 's/^X//' << 'SHAR_EOF' > doc/edit.doc &&
X* == NOT WORKING YET, if you try to use it you could lose your message.
X
X?(Help)              This file.
XS(end)
XP(rint)
XA(bort)
XC(ontinue)
XH(old message)     * For later continuing.
X%(Encrypt)         * Encrypt message with password, or ROT-13, before send.
X
XE(dit Header)        Followed by...
X  ?(Help)            List entered headers, plus common headers
X  C(c)               Carbon copy, send copies to.
X  B(cc)              Blind Cc, send copies to, but keep it a secret.
X  E(xpires)          Suggested expiration date.  See .H(elp) DATES
X  F(ollowup-to)      Limited set of cross-posted newsgroups, or "poster".
X  K(eywords)         Key words of message.
X  N(ewsgroups)       Crossposted newsgroups.
X  M(Summary)         Summary of message.
X  P(riority)         Any priority note, but 1-9 will be useful as the first
X                     word in the line, like "Priority: 1, READ THIS!",
X                     because the computer knows how to use it.
X  R(eply-To)         Use this address to reply to, instead of the address
X                     posted from.
X  S(ubject)          Subject of message.
X  T(o)               Addresses to send to.
X  [0-9]            * User defined headers, 0 through 9.
SHAR_EOF
$TOUCH -am 0502131792 doc/edit.doc &&
chmod 0644 doc/edit.doc ||
echo "restore of doc/edit.doc failed"
set `wc -c doc/edit.doc`;Wc_c=$1
if test "$Wc_c" != "1205"; then
	echo original size 1205, current size $Wc_c
fi
# ============= doc/enter.doc ==============
echo "x - extracting doc/enter.doc (Text)"
sed 's/^X//' << 'SHAR_EOF' > doc/enter.doc &&
XI guess I haven't got to this help file yet.
SHAR_EOF
$TOUCH -am 0502131792 doc/enter.doc &&
chmod 0644 doc/enter.doc ||
echo "restore of doc/enter.doc failed"
set `wc -c doc/enter.doc`;Wc_c=$1
if test "$Wc_c" != "45"; then
	echo original size 45, current size $Wc_c
fi
# ============= doc/extended.doc ==============
echo "x - extracting doc/extended.doc (Text)"
sed 's/^X//' << 'SHAR_EOF' > doc/extended.doc &&
XThis help file not finished yet.
X
XThere are other commands besides those available from the one-key commands
X(the main menu), these "extended" commands are all used by typing a
X'_.' (period) before the commands.
X
XFor a brief summary of the extended commands type '_._?'.
SHAR_EOF
$TOUCH -am 0502131792 doc/extended.doc &&
chmod 0644 doc/extended.doc ||
echo "restore of doc/extended.doc failed"
set `wc -c doc/extended.doc`;Wc_c=$1
if test "$Wc_c" != "274"; then
	echo original size 274, current size $Wc_c
fi
# ============= doc/floors.doc ==============
echo "x - extracting doc/floors.doc (Text)"
sed 's/^X//' << 'SHAR_EOF' > doc/floors.doc &&
XThis help file not finished yet.
X
X
XUnidel is made up of rooms.  Rooms are grouped into floors.
X
XUnidel makes use of floors in two ways:
X  1)  You can forget an entire floor at one time so you never go to any room
X      on that floor again.
X  2)  Since UseNet is so verra big, all the UseNet floors are initially
X      forgotten so that new users can hopefully get used to the way Citadel
X      works before getting swamped by UseNet.  (By the way [BTW], we
X      actually subscribe to SIX networks, by they all look like UseNet so
X      we lump them all together and call them "UseNet".)
X
XFor a summary of commands to get around floors, type '_;_?'.
SHAR_EOF
$TOUCH -am 0502131792 doc/floors.doc &&
chmod 0644 doc/floors.doc ||
echo "restore of doc/floors.doc failed"
set `wc -c doc/floors.doc`;Wc_c=$1
if test "$Wc_c" != "652"; then
	echo original size 652, current size $Wc_c
fi
# ============= doc/floorsum.doc ==============
echo "x - extracting doc/floorsum.doc (Text)"
sed 's/^X//' << 'SHAR_EOF' > doc/floorsum.doc &&
XFloor Commands Summary:
X
X_;_G(oto) _F_L_O_O_R             Go to first room on FLOOR
X_;_C(onfiguration)          Toggle to floor mode or back
X_;_K(nown Floors)           Display all unforgotten floors,
X                            Use .Z to display forgotten floors.
X_;_S(kip floor)             Skip this floor, go to next floor
X_;_Z(Forget Floor)          Forget this floor
X_;_>                        Go to next floor
X_;_<                        Go to previous floor
X_>                         Go to next floor
X_<                         Go to previous floor
X_;_N(ew)                    New message on this floor
X_;_R(ead) [KTVXYZ] [AGNOR]  Download messages on this floor
SHAR_EOF
$TOUCH -am 0502131792 doc/floorsum.doc &&
chmod 0644 doc/floorsum.doc ||
echo "restore of doc/floorsum.doc failed"
set `wc -c doc/floorsum.doc`;Wc_c=$1
if test "$Wc_c" != "698"; then
	echo original size 698, current size $Wc_c
fi
# ============= doc/help.doc ==============
echo "x - extracting doc/help.doc (Text)"
sed 's/^X//' << 'SHAR_EOF' > doc/help.doc &&
X  The BBS is made up of rooms, each room is devoted to a different subject.
XRooms that share a common theme are grouped onto floors.
X
X  When you enter the BBS you will see which rooms have new messages in them.
XUse the _G key to go to the first or next room with new messages, then use
Xthe _N key to read the new messages in that room.  When you are done use
Xthe _T key to terminate, or exit, the session.
X
X  Typing a _? in most places will get you specific help.
X
X  More help is available by typing _._H(elp) _?, you will get a list of
Xavailable help topics.
SHAR_EOF
$TOUCH -am 0502132692 doc/help.doc &&
chmod 0644 doc/help.doc ||
echo "restore of doc/help.doc failed"
set `wc -c doc/help.doc`;Wc_c=$1
if test "$Wc_c" != "567"; then
	echo original size 567, current size $Wc_c
fi
# ============= doc/history.doc ==============
echo "x - extracting doc/history.doc (Text)"
sed 's/^X//' << 'SHAR_EOF' > doc/history.doc &&
XHISTORY.DOC
X
X			    Citadel
X		       Bulletin	Board System
X
XCitadel	was written in mid-December 1981 by CrT. Miraculously, it
Xran three days unattended over New Year's, collecting some
Xremarkably favorable reactions.	During the months that it ran at
X633-3282 (ODD-DATA), Citadel became one	of the more popular BBs	in
Xtown, and there	was some disappointment	when a hardware	failure
Xforced the system down in February of 1982.  But in January CrT	had
Xpublished the  source code in BDS C, putting it	in the public domain.
X
XDavid Mitchell brought up the next incarnation of the Citadel
Xprogram	in April of 1982, running on hardware provided by Richard
XKnox.  Called the Island Communication System, it is located on
XBainbridge Island in Puget Sound.  ICS has about 30 regular users
Xand about 120 log entries. Newcomers find it easy to learn, and
Xoften leave messages praising it. Some of the system's daily users
Xare in Boston.
X
XCitadel	is descended from DandD.pas, an	adventure game editor/driver.
XIt is arranged as a series of rooms, starting with the LOBBY.  In
Xeach room the user can read existing messages and leave	more. There
Xmay be up to 128 rooms in the current implementation. The system was
Xbrought	up with	only one room, the LOBBY.  Additional rooms were
Xcreated	by the users, with room	names appropriate to the topics	covered.
X
XThis is	being written (82Dec07)	as the Version 2 beta-test goes	out.
XVersion	1 got a	friendly reception and had relatively few bugs.	 We'll
Xsee if this is a trend or fluctuation...
X
XEnvironment:  Citadel has had a	checkered past.	 It first ran on a
X64K Heath H89 with Magnolia CP/M, Hayes	Smartmodem (plus an acoustic
Xon another port) and BDS C V1.32. Further development was done under
XBDS C 1.4x on a	TRS-80 with Omikron CP/M, a Teletek FDC-1, and a
XFurgeson Big Board.  At	present	the ICS	implementation runs on the
XFDC-1, while development is done on the	Big Board. Version 2 was
Xtested on the original H89, now	with dual 8" SSDD drives :-) and a
Xprinter, Magnolia CP/M V2.223 :-( , and	BDS C 1.46.
X
XStarting with the 82Jan	posting	on Seattle's MailBoard (thanks John!),
Xvarious	fragments of Version 1 seem to have percolated around the
Xcountry. This version 2	release	should supercede them and save
Xpeople the frustration of trying to make sense out of them.
X
XDavid Mitchell
XCrT
X
X85Apr27
X   Having obtained Citadel 2.10	from CUG through SuperComp, and	then
Xhaving helped upgrade it to Citadel 2.40 using,	at various times, a
XH89 and	a Z-100, Citadel-86 for	MS-DOS 2.xx was	developed in order
Xto ... um.  Well, in any case, the first version of Citadel-86 went
Xup on the 8088 side of a Z-100 in the Fall of '84, using MS-DOS	2.13.
X
X   As the months passed	and as the whims hit the translator, Citadel-86
Xcame closer and	closer to being	functionally identical to Citadel 2.40,
Xand in January '85 the final downloading stuff was added, thus
Xcoming close 'nuff to Citadel 2.40's main programs for the translator.
XDuring March and April of '85, the utilities of	Citadel	2.40
Xunderwent translation and by mid-April,	the last of these utilities
Xhad been translated and	at least superficially tested, thus
Xcompleting the Citadel translation process (thank ghod).
X
X   Now all that	remains	is isolating and killing the final few bugs,
Xsome of	which the translator is	certain	are resident in	the compiler
Xin use (otherwise he'd have to admit to	having made mistakes, lord
Xforbid!).
X
X   Oh, and by the way, the name	Citadel-86 was the suggestion of a
Xcertain	Lord Castleregh, and was selected after	a polling process of
Xthe first Citadel-86 system (Test System).
X						Hue, Jr.
X
X85Jun13
X   Ha Ha Ha. Here we are, thinking we only have	a few more bugs	to
Xhit? Silly me, I decided to add	in the auto-networking stuff on	a
Xwhim. WHAT have	I created? Whom	knows ...
X
X						Hue, Jr.
X
X87Sep09
X    And	now it's been ported to	the Atari ST.  My porting job wasn't
Xeven difficult -- it took me just over a month to get it running on
Xthe Atari ST.  STadel has become a very	popular	program	in the last
X6 months, with about 40	sites around the country (and outside! I've
Xheard reports that there is a STadel in	Italy!,	of all places.)
X
X    STadel is slowly diverging from C-86, since	I've decided to
Xtry to reverse-engineer	modifications that Hue,	Jr. has	put into
XC-86 rather than just repeat ports of his code.	That's introduced
Xa few, um, interesting bugs and	variant	behaviors....
X
X    Quite a few	people have helped with	STadel.	 Dale Schumacher
X(Dalnefre') wrote/ported a UUCP	packet-driver which I used as a
Xkernel for my UUCP mail	gateway, Jay Johnson has provided quite
Xa bit of useful	advice and code	fragments from his implementation
Xof Citadel for the Amiga, and Hue, Jr. continues to diddle C-86,
Xproviding me with a endless source of headaches..., umm, er,
Xinspiration.
X						orc
X
X24 Apr 88
X    And now Unidel has been written from the ground up to run under
XUNIX* and in front of UseNet News.  It's been five months since the
Xfirst time I saw STadel.  I spent three months continuing to diddle
Xwith a BBS for UNIX and News when it hit me that Citadel was what I
Xreally wanted.  Today it's up and running.
X
X    Unidel is a major diversion from STadel and Citadel.  To the
Xperson using Unidel it is identical to STadel, to the sysadmin it
Xis a news reader similar to 'vnews'.  The files and organization
Xare those 'normal' to UNIX, users are in the passwd file and have
Xhome directories, the message base is UseNet News, the networker
Xis News and UUCP, mail is handled by the system mailer, and all
Xconfiguration and user files are editable text files.
X
X				Ken
X
XP.S.  About this time orc is also doing a direct port of STadel
Xto UNIX.  Those looking for a self-contained system or a system
Xthat evolves with the other ports of STadel would do well to
Xtake a look at it.
X
X19 Dec 90
X    After a few system crashes, systems sold, four versions of UNIX
Xand months without access to a computer, Unidel is now on it's way out
Xinto the world.  Unidel now networks with STadels and (marginally)
XCit-86s using citnet, has more robust and UseNet-compatible handling
Xof mail and news headers, is relatively clean coded, supports multiple
Xprivate mail rooms and uses external editors and file transfer
Xprograms.
X
X				Ken
X				ken@bitsko.slc.ut.us
X
X*UNIX is a trademark of AT&T
SHAR_EOF
$TOUCH -am 0502131792 doc/history.doc &&
chmod 0644 doc/history.doc ||
echo "restore of doc/history.doc failed"
set `wc -c doc/history.doc`;Wc_c=$1
if test "$Wc_c" != "6297"; then
	echo original size 6297, current size $Wc_c
fi
# ============= doc/install.doc ==============
echo "x - extracting doc/install.doc (Text)"
sed 's/^X//' << 'SHAR_EOF' > doc/install.doc &&
X  First, before even touching Unidel, install these programs
Xand become familiar with them if you haven't already:
X
X    UseNet News 2.10, 2.11 or C-News (other versions may work also)
X    SMail 2.5 (other versions should work without problem)
X    your local mailer program
X    your local paging program ('more', 'less' or 'pg')
X    rz and sz (optional, for BBS operation)
X
XNews and SMail are fairly common and easy to pick up, RZ/SZ is a
Xlittle harder but is worth the effort as it is a file transfer
Xprogram for call-in users.
X
X  You should also be familiar with these parts of UNIX operating
Xsystem:
X
X    passwd file
X    Adding new users
X    UUCP
X    ed, vi or another editor (for working with the 'localize.sh'
X       shell, if needed)
X    C (for tinkering with 'defs.h', if needed)
X 
X  After all that, edit the localize.sh file that comes with Unidel to
Xreflect your system and type 'make', the result should be an
Xexecutable file called 'unidel' and it should run first time if News
Xis all set up.  Copy unidel to /usr/bin or a local bin directory for
Xothers to use.
X
X  Refer to the other files in the 'doc' directory for more detailed
Xinfo on security and general use of Unidel.  Refer to the 'lib'
Xdirectory for info on making floors and file directories.  Refer to
Xbbsinstall.doc for instructions and hints on installing Unidel as a
Xcall-in BBS program.
X
X  Once you're all set up, drop me a note at ken@bitsko.slc.ut.us or
Xuunet!bitsko.slc.ut.us!ken and I'll add you onto the Unidel mailing
Xlist.  If you set your system up as a dial-in BBS, let me know and
XI'll add you to the Unidel and Room-based Systems BBS listings, please
Xinclude your UseNet directory form that comes with News.
SHAR_EOF
$TOUCH -am 0502131792 doc/install.doc &&
chmod 0644 doc/install.doc ||
echo "restore of doc/install.doc failed"
set `wc -c doc/install.doc`;Wc_c=$1
if test "$Wc_c" != "1694"; then
	echo original size 1694, current size $Wc_c
fi
# ============= doc/maillists.doc ==============
echo "x - extracting doc/maillists.doc (Text)"
sed 's/^X//' << 'SHAR_EOF' > doc/maillists.doc &&
XFrom: spaf@cs.purdue.EDU (Gene Spafford)
XNewsgroups: news.lists,news.announce.newusers
XSubject: Publicly Accessible Mailing Lists (Updated: 16 May 1988)
X
XReplace this file with a recent copy of the article of the same
Xsubject in newsgroup news.announce.newusers.
SHAR_EOF
$TOUCH -am 0502132592 doc/maillists.doc &&
chmod 0644 doc/maillists.doc ||
echo "restore of doc/maillists.doc failed"
set `wc -c doc/maillists.doc`;Wc_c=$1
if test "$Wc_c" != "263"; then
	echo original size 263, current size $Wc_c
fi
# ============= doc/mainmenu.doc ==============
echo "x - extracting doc/mainmenu.doc (Text)"
sed 's/^X//' << 'SHAR_EOF' > doc/mainmenu.doc &&
X+---=* READING *=--+--=*    ROOMS   *=--+--=*   FILES   *=--+--=* STUFF *=---+
X\   _New messages   |   _Goto new room    |   _List files      |   _Help         /
X/   _Forward read   |   _Skip this room   |   _Upload file     |   _Terminate    \
X\   _Old read       |   _Known rooms      |   _Download file   |       session  /
X/   _Reverse read   |   _Zap (forget)     |                   |   _Your info    \
X+---=**#######**=--+-- Type the _E key to enter a message  --+--=**#####**=---+
X\                          Type the _H key for help.                         /
X  --===***#####***===---/\---===***#######***===---/\---===***#####***===--
SHAR_EOF
$TOUCH -am 0502131792 doc/mainmenu.doc &&
chmod 0644 doc/mainmenu.doc ||
echo "restore of doc/mainmenu.doc failed"
set `wc -c doc/mainmenu.doc`;Wc_c=$1
if test "$Wc_c" != "660"; then
	echo original size 660, current size $Wc_c
fi
# ============= doc/more.doc ==============
echo "x - extracting doc/more.doc (Text)"
sed 's/^X//' << 'SHAR_EOF' > doc/more.doc &&
XSpace or Return continues message
X
XD -- Download message (or file if file description)
XN -- Next message
XS -- Stop reading
XF -- Followup by posting to message
XR -- Reply by email to author
XB -- Back up one article
SHAR_EOF
$TOUCH -am 0502131792 doc/more.doc &&
chmod 0644 doc/more.doc ||
echo "restore of doc/more.doc failed"
set `wc -c doc/more.doc`;Wc_c=$1
if test "$Wc_c" != "214"; then
	echo original size 214, current size $Wc_c
fi
# ============= doc/motd.doc ==============
echo "x - extracting doc/motd.doc (Text)"
sed 's/^X//' << 'SHAR_EOF' > doc/motd.doc &&
X                            Welcome to
X
X-----------------------/  Bitsko's Bar & Grill  \--------------------------
X
XYour fortune for the day:
SHAR_EOF
$TOUCH -am 0502132592 doc/motd.doc &&
chmod 0644 doc/motd.doc ||
echo "restore of doc/motd.doc failed"
set `wc -c doc/motd.doc`;Wc_c=$1
if test "$Wc_c" != "144"; then
	echo original size 144, current size $Wc_c
fi
# ============= doc/policy.doc ==============
echo "x - extracting doc/policy.doc (Text)"
sed 's/^X//' << 'SHAR_EOF' > doc/policy.doc &&
X  This BBS reserves the right to refuse service to the obnoxious, anything
Xshort of that is fine.  This 'line' I draw is applied more rigorously to
Xnetworked rooms, and applied most rigorously in UseNet rooms.
X
X  There are policies in regards to certain rooms, I will fill these policies
Xin as I find out about them.  Some of the ones I do know about:
X
X  UseNet rooms as a whole:  UseNet is overcrowded, there is often too much
Xthere to read and there seems to be no way to fix this, PLEASE mail your
Xresponses rather than posting when you are in a UseNet room.
X
X  Some rooms are moderated:  'Moderated' means that your posting is mailed
Xto someone who will decide if it is appropriate for that newsgroup.  Usually
Xyour only response is _no_ response if your post is inappropriate.  This is
Xmostly in the .sources. and .binaries. groups where the purpose of
Xmoderation is to keep _all_ discussion out of the group.
X
X  DO NOT CROSSPOST TO 'TALK.BIZARRE':  No matter how bizarre you think your
Xposting might be, you don't realize that that IS NOT the purpose of the
Xtalk.bizarre froup.  Of course, this does not imply that anyone _does_know_ the
Xpurpose of talk.bizarre.
X
X  It's generally a bad idea to have computer wars on UseNet.  Avoid it.
SHAR_EOF
$TOUCH -am 0502132492 doc/policy.doc &&
chmod 0644 doc/policy.doc ||
echo "restore of doc/policy.doc failed"
set `wc -c doc/policy.doc`;Wc_c=$1
if test "$Wc_c" != "1242"; then
	echo original size 1242, current size $Wc_c
fi
# ============= doc/questions.doc ==============
echo "x - extracting doc/questions.doc (Text)"
sed 's/^X//' << 'SHAR_EOF' > doc/questions.doc &&
XCommonly asked questions that aren't clearly answered elsewhere:
X
XI've Zapped a room, how do I go back to it?
X      Go to the room by using .G(oto room) RoomName.  If you've forgotten
X    the name of the room, use .Z(List Forgotten Rooms) to list all the rooms
X    you've zapped.
X
XWhere are the fabled UseNet rooms that everyone talks about?
X      UseNet rooms are pre-forgotten.  Use .Z(List Forgotten Rooms) to list
X    the UseNet floors.  When you go to the room (.G) or floor (;G) all the
X    rooms on that floor will appear.  Happy hunting, and don't wear out your
X    Z key :-).
SHAR_EOF
$TOUCH -am 0502131792 doc/questions.doc &&
chmod 0644 doc/questions.doc ||
echo "restore of doc/questions.doc failed"
set `wc -c doc/questions.doc`;Wc_c=$1
if test "$Wc_c" != "585"; then
	echo original size 585, current size $Wc_c
fi
# ============= doc/read.doc ==============
echo "x - extracting doc/read.doc (Text)"
sed 's/^X//' << 'SHAR_EOF' > doc/read.doc &&
XSummary for .R(ead)
X  * == Not yet implemented
X
XMajor Modes, typing one of these starts you reading
X
XA(ll)         From the beginning, or, in forward order.
XN(ew)         Only messages you haven't read before, in forward order.
XO(ld Reverse) Only messages you have read before, in reverse order.
XR(everse)     From the end, or, in reverse order.
X<RETURN>      Only one message.*
X
XMinor Modes, can be intermixed* with selectors
X
XM(ore)      Pause at end of pages (or don't, if pause is your normal mode*)
XP(rotocol)  Gather all the messages, and use the default protocol to transfer
X=(headers)  Display one line headers only.  Headers are marked 'N' for new,
X            'O' for old, 'Z' for zapped, 1-9 for priority, '!' from you or a
X            followup to yours, '<' if crossposted to a more relevent room,
X            or '>' if in a less rel. room, and 'X' for checked.
XG(lobal)    In all known rooms in all known floors. kinda*
X
XMessage Selectors, can be intermixed* with minor modes
X
X"string"    With "string" in the header.*  See .H(elp) REGEX
X"!string"   That don't have "string" in the header.*
X'string'    With "string" in the header or message.*  SLOW
X'!string'   That don't have "string" in the header or message.*  SLOW
X[date]      Entered on "date".*  See .H(elp) DATES
X[<date]     Entered before date.*
X[>date]     Entered after date.*
X###         Number ###
X<msgID>     Message with ID "msgID", changing rooms if need be.*
XX(Checked)  Check-marked messages.*  Messages are tagged by you while reading.*
X
XExamples
X
X.R(ead) M(ore) N(ew)
X   Read new messages pausing at the end of each screen or message.
X.R(ead) G(lobal) P(rotocol) N(ew)
X   Gather new messages in all known rooms into a file and download them.
X.R(ead) "flame" R(everse)
X   Read all messages with "flame" in the header, in reverse.
X.R(ead) [>last thursday] A(ll)
X   Read all messages since last Thursday.
X.R(ead) [yesterday] A(ll)
X   Read all messages posted yesterday.
X.R(ead) 153 R(everse)
X   Read all messages starting from message 153, in reverse.
X.R(ead) =(Headers) N(ew)
X   Display the headers of new messages.
X.R(ead) 'tech' =(Headers) [>noon, Oct 19, 1989] A(ll)
X   Display headers of all messages since noon, Oct 19, 1989, with 'tech'
X   in the message.
X.R(ead) P(rotocol) "sysop" G(lobal) A(ll)
X   Gather all messages to, from, or about the sysop ("sysop" is found in the
X   header somewhere) in all known rooms, and download them.
X.R(ead) [>last friday] [<yesterday] A(ll)
X   Display all messages between last friday and yesterday.
X.R(ead) [<march 1] [>june 3] A(ll)
X   Read all message before March 1 and all messages after June 3.
SHAR_EOF
$TOUCH -am 0502131792 doc/read.doc &&
chmod 0644 doc/read.doc ||
echo "restore of doc/read.doc failed"
set `wc -c doc/read.doc`;Wc_c=$1
if test "$Wc_c" != "2624"; then
	echo original size 2624, current size $Wc_c
fi
# ============= doc/regex.doc ==============
echo "x - extracting doc/regex.doc (Text)"
sed 's/^X//' << 'SHAR_EOF' > doc/regex.doc &&
XRegular expressions are the search strings you use when reading messages
Xwith "string" or listing files.
X
XSimple Search Strings
X
X  Further on you will read the complete description for regular expressions,
Xthis is a simple "get started" description.
X
X  A '*' is used to match any number of characters.
X  A '?' is used to match one character.
X  All other characters are matched exactly.
X
XExamples
X
X  If you want to list files starting with "ul" and ending with ".doc",
Xuse "ul*.doc".
X  If you want to select messages that contain "test", use "test".
X
XComplex Search Strings
X
X(Pulled from the UNIX manual page ed(1))
XA regular expression (RE) specifies a set of character strings.  A member
Xof this set of strings is _m_a_t_c_h_e_d by the RE.  The REs allowed
Xby Unidel are constructed as follows:
X
X  Start the RE with a '+' to distinguish a simple RE and a complex RE.
X
X  The following _o_n_e-_c_h_a_r_a_c_t_e_r _R_Es match a _s_i_n_g_l_e character:
X
X  1.1	 An ordinary character (_n_o_t one of those discussed in
X	 1.2 below) is a one-character RE that matches itself.
X
X  1.2	 A backslash (\\\\) followed by any special character is
X	 a one-character RE that matches the special character
X	 itself.  The special characters are:
X
X	 a.    ...., ****, [[[[, and \\\\ (period, asterisk, left square
X	       bracket, and backslash, respectively), which
X	       are always special, _e_x_c_e_p_t when they appear
X	       within square brackets ([[[[]]]]; see 1.4 below).
X
X	 b.    ^ (caret or circumflex), which is special at
X	       the _b_e_g_i_n_n_i_n_g of an _e_n_t_i_r_e RE (see 3.1 and 3.2
X	       below), or when it immediately follows the left
X	       of a pair of square brackets ([[[[]]]]) (see 1.4
X	       below).
X
X	 c.    $$$$ (currency symbol), which is special at the
X	       _e_n_d of an entire RE (see 3.2 below).
X
X	 d.    The character used to bound (i.e., delimit) an
X	       entire RE, which is special for that RE.
X
X  1.3	 A period (....) is a one-character RE that matches any
X	 character except new-line.
X
X  1.4	 A non-empty string of characters enclosed in square
X	 brackets ([[[[]]]]) is a one-character RE that matches _a_n_y
X	 _o_n_e character in that string.
X
X	 If the first character of the string is a circumflex
X	 (^), the one-character RE matches any character
X	 _e_x_c_e_p_t new-line and the remaining characters in the
X	 string.  The ^ has this special meaning _o_n_l_y if it
X	 occurs first in the string.
X
X	 The minus (----) may be used to indicate a range of
X	 consecutive ASCII characters; for example, [[[[0000----9999]]]] is
X	 equivalent to [[[[0000111122223333444455556666777788889999]]]].  The ---- loses this special
X	 meaning if it occurs first (after an initial ^, if
X	 any) or last in the string.  The right square bracket
X	 (]]]]) does not terminate such a string when it is the
X	 first character within it (after an initial ^, if
X	 any); e.g., [[[[]]]]aaaa----ffff]]]] matches either a right square
X	 bracket (]]]]) or one of the letters aaaa through ffff
X	 inclusive.
X
X	 The four characters listed in 1.2.a above stand for
X	 themselves within a string of characters.
X
X  The following rules may be used to construct _R_Es from one-
X  character REs:
X
X  2.1	 A one-character RE matches whatever the one-character
X	 RE matches.
X
X  2.2	 A one-character RE followed by an asterisk (****)
X	 matches _z_e_r_o or more occurrences of the one-character
X	 RE.  If there is any choice, the longest leftmost
X	 string that permits a match is chosen.
X
X  2.3	 A one-character RE followed by \\\\{{{{_m\\\\}}}}, \\\\{{{{_m,\\\\}}}}, or
X	 \\\\{{{{_m,_n\\\\}}}} matches a _r_a_n_g_e of occurrences of the one-
X	 character RE.	The values of _m and _n must be non-
X	 negative integers less than 256; \\\\{{{{_m\\\\}}}} matches
X	 _e_x_a_c_t_l_y _m occurrences; \\\\{{{{_m,\\\\}}}} matches _a_t _l_e_a_s_t _m
X	 occurrences; \\\\{{{{_m,_n\\\\}}}} matches _a_n_y _n_u_m_b_e_r of
X	 occurrences _b_e_t_w_e_e_n _m and _n inclusive.  Whenever a
X	 choice exists, the RE matches as many occurrences as
X	 possible.
X
X  2.4	 The concatenation of REs matches the concatenation of
X	 the strings matched by each component that was
X	 concatenated.
X
X  2.5	 A RE enclosed between the character sequences \\\\(((( and
X	 \\\\)))) matches whatever the unadorned RE matches.
X
X  2.6	 The expression \\\\_n matches the same string of
X	 characters as was matched by an expression enclosed
X	 between \\\\(((( and \\\\)))) _e_a_r_l_i_e_r in the same RE.  Here _n is
X	 a digit; the sub-expression specified is that
X	 beginning with the _n-th occurrence of \\\\(((( counting
X	 from the left.  For example, the expression
X	 ^\\\\((((....****\\\\))))\\\\1111$$$$ matches a line consisting of two repeated
X	 appearances of the same string.
X
X  An _e_n_t_i_r_e _R_E may be constrained to match only an initial
X  segment or final segment of a line (or both).
X
X  3.1	 A circumflex (^) at the beginning of an entire RE
X	 constrains that RE to match an _i_n_i_t_i_a_l segment of a
X	 line.
X
X  3.2	 A currency symbol ($$$$) at the end of an entire RE
X	 constrains that RE to match a _f_i_n_a_l segment of a
X	 line.
X
X  The construction ^_e_n_t_i_r_e _R_E$$$$ constrains the entire RE to
X  match the entire line.
SHAR_EOF
$TOUCH -am 0502131792 doc/regex.doc &&
chmod 0644 doc/regex.doc ||
echo "restore of doc/regex.doc failed"
set `wc -c doc/regex.doc`;Wc_c=$1
if test "$Wc_c" != "5617"; then
	echo original size 5617, current size $Wc_c
fi
echo "End of part 7, continue with part 8"
exit 0
