NOTE: This documentation is old, so look for the new stuff in ChangeLog.


                 Welcome to alpha release of QEcho package.
                 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

  This document describes how to install, configure and operate QEcho and
 QDed.

                                    CONTENTS

 0. Warnings
 1. Compiling and installing QEcho
 2. Configuring QEcho and QDed
 2.1. QEcho configuration file
 2.2. QEcho AreaList file
 2.3. QEcho routing file
 2.4. QDed name substitution file
 2.5. QDed template files
 2.6. Tips and tricks
 2.6.1. Transit subscription
 2.6.2. Restricted links
 2.6.3. Setting up SysV-init with QEcho
 2.6.4. Terminal problems
 2.6.5. Getting up on multiuser systems
 2.6.6. It crashes! What now?
 3. Operating QEcho
 3.1. Command line options
 3.2. Daemon mode
 4. QDed hot keys
 4.1. Browsing list of areas
 4.2. Browsing message area
 4.3. Editing a message
 4.4. Nodelist index
 5. Known problems
 6. Obtaining new QEcho versions
 7. Author, copyrights, thanks, etc.


 0. Warnings.
 ~~~~~~~~~~~~
 
             WARNING! WARNING! WARNING! WARNING! WARNING!
 
  This QEcho revision is _NOT_ well tested! Moreover, it _IS_ known to be
buggy; it can unexpectedly fail; it can take all mail with it; it can thrash
the message base; finally, it's a pain.

  Therefore, I ask you to read _all_ through this document carefully,
including "Known problems" section.
 
 1. Compiling and installing QEcho.
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

  Execute `make' at QEcho directory. When compiling succeeds, execute `make
 install'.

  Note: if you have previous version of QEcho installed, you should _not_
 run `make install'. Instead, you will need either look through your configs
 and change them to work with new version.

  Then you should change configs as needed.


 2. Configuring QEcho and QDed.
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 

  2.1. QEcho configuration file (/etc/qecho/qeconfig).

   This is the file where main config resides. It consists of a number of
  lines, one line for one statement; lines beginning with `#' are ignored
  (they're comments, did you understand? <g>). Description for all possible
  statements follows.

    Statement         	Description
    ---------           -----------

    Address		Defines your address. Should be set to your domanized
			address; you may have more than one address 
			statement.

    AllowedUser		Defines name of a user who can use QDed (not QEcho). 
			Users not specified here will get an error messages
			when trying to run QDed. You may have as much of this
			statements as you want.

    Tearline		Defines tearline. This should be defined for each of
			your addresses (i.e. the number of tearlines should
			exactly match number of addresses).

    Origin		Defines origin. This should be defined for each of
			your addresses (see `Tearline').

    Template		Defines template file. This should be defined for
			each of your addresses; template files will be
			searched in $(HOME)/.qded directory.

    AutoSkip		Defines string to substitute instead of lines deleted
			with Ctrl-N. Should be only one.

    Crosspost		Defines string to be placed in crossposting list
			before the name of each area (don't forget ending
			space). Should be only one.

    StartCut		Defines string to be placed at the beginning of
			inserted file. Should be only one.

    EndCut		Defines string to be placed at the end of inserted
			file. Should be only one.

    KillRe		Enables/disables automatic `Re:' killing in subjects.
			Should be only one and set to `Yes' or `No'.

    QuoteTearline	Enables/disables tearline quoting. Should be only one
			and set to `Yes' or `No'.

    QuoteOrigin		Enables/disables origin quoting. Should be only one
			and set to `Yes' or `No'.

    TwitAddress		Defines an address whose mail you don't need to see
			in your messagebase. This is handled when tossing
			mail, not while browsing areas. Address should be
			undomanized and fully specified (although, I assume,
			wildcarding will work here, but I don't recommend
			to try). You may have as much TwitAddress statements
			as you want.

    TwitName		Defines a man whose mail you don't need to see while
			browsing an areas. This is handled while browsing,
			thus you can turn it on/off on the fly. You may
			have as much TwitName statements as you want (as
			your machine allows you, hmm).

    CarbonCopy		Defines a carbon copy condition. The statement
			consists of a three parts separated by spaces: 
			match field (`From', `To' or `Subj'), matching
			string in double quotes and area name where carbon
			copies will be placed. You may have as much 
			CarbonCopy statements as you want.

    TransitGroup	Defines an area group number where transit
			subscription available (see AreaList description).
			You may have as much TransitGroup statements as
			you want.

    TransitList		Defines file name containing list of areas available
			for transit subscription in the corresponding group.
			List is assumed to be present in backbone echo list
			format. This should be defined for each of
			TransitGroup statements (see `TransitGroup').

    TransitLink		Defines domanized address (hmm) of link for transit
			subscription to areas specified in the corresponding
			list (see `TransitList'). This should be defined for
			each of TransitList statements. Address should be
			one among your links (see `Link' below).

    RestrictLink	Defines link whose rights in specified echo area (or
			netmail area) are restricted in the specific area.
			Specified address should be one among your links
			(see `Link' below). This statements are bound with
			the `RestrictArea' and `RestrictMode' statements
                        below.

    RestrictArea        Defines area where restrictions are applied (see
			`RestrictLink' above). Maybe `NETMAIL' or `*', where
			star corresponds to all areas except netmail.

    RestrictMode	Defines restriction mode (see above). Could be one
			of `ReadOnly', `WriteOnly', `None' or `Firewall'
 			words. All matching restrict modes are applied
			in order as they're specified in config file (i.e.
			you can make link read-only in all echos except
			one).

    Robot		Defines external robot name (or alias). Netmails
			addressed to this name and your system will go
			through the corresponding robot (see RobotCmd and
			RobotMode below). You can have as much robots as
			you want.

    RobotCmd		Defines shell command to be started to satisfy a
			robot request (see Robot above). Message will be
			passed to standart input of a command according to
			the corresponding robot mode (see RobotMode below).

    RobotMode		Defines mode for header and message body passing.
			For now, there's only one mode, called 'ifgate',
			when FTN message is converted to something like
			RFC message and passed as well through. This mode
			is applicable for FileFix by Serg Oskin. No command
			line parameters are passed to the command itself.
			This simulates sendmail command aliases (right?).

    DupeChecking	Defines whether messages will be checked for
			duplications. Should be one and set to 'Yes' or
			'No'.

    DupeBase		Defines path to file (full path with file name),
			where dupes info will be stored. This file should
			be manually removed if dupeboard was reconfigured,
			otherwise sig11 would be most likely thing to occur.

    DupeRecords		Defines number of dupe records to keep (my
			favourite is 1024). DupeBase file should be removed
			if this value changes.

    DupeArea		Defines name of a message area where messages that
			considered to be dupes will be stored (area can
			be passthrough, but must be specified if dupeboard
			is active).

    Link		Defines domanized address of your link. You may have
			as much links as you want (don't forget about your
			diskspace - no one will check it for overflows).

    Password		Defines password to use with corresponding link. This
			should be defined for each of Link statements. The
			passwords to AreaFix and to ARCmail is the same.

    AutoCreate		Defines autocreate defaults for corresponding link.
			This should be defined for each of Link statements.
			The value should either be `Off' or be present in
			the form <GroupNum>[p]:<AreaList Info>, where AreaList
			Info is a rest of AreaList string after file name 
			(see `AreaList structure' below) beginning from
			UseAka field. If `p' symbol is placed after group
			number, new area will be created as passthrough,
			otherwise msgbase file name will be set to lowercased
			areatag (thanks God we have long file names).

    AreaFixing		Defines set of groups where corresponding link can
			use AreaFix. This should be defined for each of
			Link statements. The value should either be `Off'
			or a list of numbers separates with spaces.

    Flavour		Defines flavour of packets going to the corresponding
			link. This should be defined for each of Link
			statements. The value should be one of `Normal',
			`Hold' and `Crash' (without quotes, hmm).

    RouteVia		Defines address through which mail will go for
			addresses defined in corresponding `RouteFor'
			statements.

    RouteFor		Defines list of addresses whose mail will go
			through address defined in corresponding `RouteVia'
			statement.

    Nodelist		Defines path and file name for one of your nodelist.
			Each Nodelist statement must have corresponding
			NodeOrig statement (see below). After adding or
			changing these statement you should rebuild nodelist
			index (see 'index' command). You may have as much
			nodelists as you want (and one pair of
			Nodelist/NodeOrig entries for each).

    NodeOrig		Defines originating address for the nodelist. May be
			incomplete (e.g. 2: or 2:5020). Address need to be
			specified without a domain.

    NoSearchFor		Defines name which will never be searched in
			nodelist, e.g. AreaFix, AllFix, etc. You may have
			as much robot names as you want.

    Inbound		Defines path to inbound directory. Should be only
			one.

    Outbound		Defines path to outbound directory. Should be only
			one.

    MaxPacketSize	Defines limit (in bytes) for outbound packets size.
			That's not an exactly limit, but only a checkpoint
			marking when the packets need to be closed and moved
			from temp place to the real outbound. It refers to
			the size of non-packed PKTs. The statement should
			be only one or absent.

    Temp		Defines path to directory where unpacked bundles
			will be placed while tossing. Should be only one.

    TempOutbound	Defines path to directory where non-packed bundles
			will be placed before packing. Should be only one.

    Flags		Defines path to directory where QEcho flags will
			be placed (as for now, only the file `crashstat'
			may appear there when system shutdowns while QEcho
			daemon was active. It will disappear when the daemon
			restarts). Should be only one.

    Unzip		Defines name of unpacker to use. Only zip is now
			supported. Should be only one.

    Zip			Defines name of packer to use. Only zip is now
			supported. Should be only one.

    MsgBase		Defines path to directory where your messagebase
			files will be located. Should be only one.

    BaseOwnMode		If specified, defines mode (usual notation - e.g.,
			0666) of newly created msgbase files. Should be only
			one or absent.

    BaseOwnUser		If specified, defines user by which msgbases will be
			owned. Should be only one or absent. Must be
			specified together with BaseOwnGroup.

    BaseOwnGroup	If specified, defines user by whose group msgbases
			will be owned. Should be only one or absent. Must
			be specified together with BaseOwnUser.

    AreaList		Defines path to AreaList (see below). Should be only
			one.

    LinkInfo		Defines path to LinkInfo file, where information
			about paused links is stored. This file is auto
			maintained, so you should not need to care about
			its contents. Usually the path is the same as
			for AreaList (i.e. default is /etc/qecho/LinkInfo).

    AreaFixHelp		Defines path to the file will be send for %HELP
			request. Should be only one.

    AreaFixReject	Defines path to the file will be send to the system
			which is not allowed but tries to use your AreaFix.
			Should be only one.

    AreaFixList		Defines path to the file will be send as header for
			%LIST request. Should be only one.

    AreaFixMSize	Defines maximum size in bytes of AreaFix answer.
			Should be either only one or absent (4 Gb limit
			will be assumed ;-) ).

    Routing		Defines path to routing file (see below). Should be
			only one.

    SaveBackup		Defines path to directory where incoming bundles
			and packets will be kept for debug reasons. Should
			be either only one or absent.

    BadPackets		Defines path to directory where rejected (considered
			not to be valid) packets will be moved to. Should
			be only one.

    ExpireDays		Defines the number of days messages will be kept in
			messagebase (default value, see `AreaList 
                   	structure'). Should be only one.

    MaxUnlinkedDays	Defines the number of days unlinked area will stay
			in AreaList (used for transit unsubscription). Should
			be only one.

    LogFile		Defines path to logfile. Should be only one.

    DaemonSleep		Defines time (in seconds) daemon will sleep between
			search tries for incoming packets. Should be only
			one.

    UseSyslog		Defines whether logging will go through syslog
			interface or directly to files. Should be only
			one and set to 'Yes' or 'No'.

    LogFacility		Defines facility name to use in non-daemon mode for
			syslog calls (see /usr/include/sys/syslog.h for
			valid facility names). Should be specified if
			UseSyslog set to Yes.

    LogFacilityD	Defines facility name to use in daemon mode for
			syslog calls (see /usr/include/sys/syslog.h for
			valid facility names). Should be specified if
			UseSyslog set to Yes.

    DaemonLog		Defines path to daemon logfile. Should be only one.

    TempBase		Defines path to directory where messagebase files
			will be recreated while packing (this is not used
			now, but reserved for great future extensions). 
			Should be only one.

    ZoneExtensions	Enables/disables adding zone number as extension in
			outbound directory names. Should be only one and
			set to `Yes' or `No' (I simply don't know how it
			should be. `No' is a working setting for ifcico).

    StrictOrigin	Enables/disables strict origin checking. Should be
			only one and set to `Yes' or `No'. When set to Yes,
			all echomail msgs without origin or with origin
			where valid return address was not found will be
			dropped for `invalid zone number' reason. Setting
			this to No will disable dropping, but invalid
			addresses may be substituted.

    MessageTracking	Enables/disables message tracking feature (debug,
			hmm). Should be only one and set to `Yes' or `No'.
			TrackingLog should be specified when it set to Yes.
			You should not use it for no reasons except debug,
			because it significantly slows down tossing and 
			tracking log grows too fast.. but I leave it for
			you.

    ZonedKludges	Enables/disables multizone seen-by and paths. Should
			be only one and set to `Yes' or `No'. In reality,
			this does nothing (it was important in such ancient
			versions where kludges was handled as strings). Set
			it to `No' and forget.

    AlwaysIntl		Enables/disables unconditional addition of INTL
			kludge in netmail. FTSC says nothing here, but some
			trackers (iTrack) requires this to be `Yes'. Should
			be only one and set to `Yes' or `No'.

    BadMailArea		Defines area name where bad messages will be placed.
			Should be only one.

    TransitNetmail	Defines area name where transit netmail messages will
			be placed. Should be only one if specified; may be
			omitted (transit netmails will go away through in
			this case).

    SeparateBundles	Enables/disables separate storage for each link's
			bundles. When enabled, it will create `.mbx'
			directories for a bundles. It's a really cool
			feature - it avoids a tons of problems when manually
			killing old mail, etc. Should be only one and set
			to `Yes' or `No'.

    KillSent		Enables/disables usage of Kill/Sent attribute instead
			of Truncate/Sent in flos. Should be only one and set
			to `Yes' or `No'.


   QDed uses the same format configuration file (/etc/qecho/qdconfig). By
  default, /etc/qecho/qdconfig is a symlink to /etc/qecho/qeconfig, although
  you can change this as you want.


  2.2. QEcho AreaList file (/etc/qecho/AreaList).

   This file contains a list of message areas (except netmail) to be used
  by QEcho and QDed. It consists of a number of lines, one for each area, and
  is automatically rewritten every time QEcho finishes (therefore it's no
  use to place comments here). Each line have the following format:

  <Group> [* <ExpireDays>] <Echo_Name> <File_Name> <Use_Aka> {<Export_To>...}

   `Group' is a numeric value identifying a group the area belongs to (see
  AreaFixing and TransitGroup above).

   `ExpireDays' is a numeric value specifying how long messages will be kept
  in this area. -1 stands for default value (see ExpireDays above).

   `Echo_Name' is a well-known areatag.

   `File_Name' is a file name template where the messagebase will be placed,
  or a word `passthrough' used to indicate no messagebase should be created.
  Such passthrough areas will not be shown in editor.

   Two left fields, `Use_Aka' and `Export_To' contains an addresses. There
  is a nice feature.. Each address can be presented in one of two formats:
  a) "* zone:net/node[.point]" - usual 4D format address; b) "num_of_entry",
  where num_of_entry is a numeric value specifying a number of corresponding
  entry in main configuration file (i.e. number of "Address" statement for
  `Use_Aka' field and "Link" for `Export_To' one). Second way of addressing
  was the only way in some ancient versions, and it is still enabled, but
  automatic update of AreaList will convert all relative numbers to 4D
  addresses anyway. Moreover, this means all addresses you specify here
  should exist in main config as corresponding entries. Specifying here
  an unknown address will cause unpredictable behaviour.

   `Use_Aka' is an address specification (see above) of aka to be used in
  this area.

   `Export_To' is a list of address specifications (see above) separated by
  spaces which are linked to this area. Note: the first should be an uplink.
  It is important for transit subscription.

   Automatically unsubscribed areas will have an additional "! date_unlinked"
  field after the group number. Date_unlinked is a hexadecimal number
  representing the date when the area was unlinked. Such areas will disappear
  when MaxUnlinkedDays (see above) period is over. This stands only for
  passthrough areas, so you won't notice anything anyway :-)


  2.3. QEcho routing file (/etc/qecho/Routing) (*).

   This file contains a netmail routing map for QEcho. Lines beginning with
  `#' are ignored. Other non-empty lines are treated as routing definitions.
  The first address on line specifies link through which mail addressed to
  second address will go. First address should be domanized and exist among
  your links in main config in the same reasons as in AreaList. Second one
  should not be domanized (hmm, I simply know will it work with domains).
  It's a pretty simple description, but one of most worse things to tune,
  you should know. 
   
   Second address in routing definition may be defined incompletely. E.g.,
  the following definitions of this address are valid:

     	2:			all addresses in zone 2
	2:5020			all addresses in zone 2, net 5020
	2:5020/463		node 2:5020/463 and his points
	2:5020/463.1		point 2:5020/463.1
	
   The order of statements is significant, because the first matching rule
  will be used to route. If no matching rules were found, message will be
  rejected (moved to badmail area).

   QEcho does not keep transit netmails in your netmail area. This is done
  to free you from wishing to disclose them :-) Disclosure of transit netmail
  is an annoying behaviour and may result in exco... reread policy if you're
  still reading :^) (**)

  -----
     * This file is obsoleted, routing is now included in main config (see
       description for `RouteFor' and `RouteVia' statements).
    ** See description for `TransitNetmail' statement.

  2.4. QDed name substitution file ($HOME/.qded/names).

   This file is used by QDed to specify name to be used with each address.
  It may be empty. Each line in this file have the following format:

                       <Address>\<FullName>

   Address may be specified incompletely, as in routing definition. E.g.,
  statement "909:\Queen" means QDed will use name `Queen' in all zone 909.
  If QDed finds no matches, it takes user's full name as the default.


  2.5. QDed template file(s) ($HOME/.qded/?).

   The name of this file(s) specified in main configuration file. You may 
  have multiple templates, QDed will select one corresponding to an aka used.

   Each template file is a simple text file contains some keywords beginning
  with `%' sign. Complete list of implemented keywords follows.

	%n	Skip the rest of a line if reply is to be placed in the same
		area
	%f	Skip the rest of a line if it's not a forward
	%M	Your full name
	%r	Your undomanized address
	%a	Original area
	%O	Original message author's full name
	%AO	Original message author's undomanized address
	%d	Date of original message
	%o	Original message recipient's full name
	%p	Skip the rest of a line if original area was not netmail
	%Ao	Original message recipient's undomanized address
	%s	Subject of original message
	%b	Text of original message (possibly quoted)
	%t	First name of message recipient (not original)
	%q	Skip the rest of a line if you aren't replying
	%c	Use the rest of a line as cookie file name (see below)


   Cookie files are searched in same directory ($HOME/.qded) and are treated
  as simple text files having the following format:

    ~<Cookie_text>@
    ~<Cookie_text>@ ....

   where Cookie_text can contain any characters including carriage returns.
  QDed will select one of this using a great random() function. ;-)


  2.6. Tips and tricks.

   2.6.1. Transit subscription.

    Well, possibly working transit subscription is the most useful feature 
   of QEcho, which makes your life as painless as it could be with FTN. So,
   let's describe in detail how to make it works.
    First, you need to choose links who will get your forwarded areafix
   requests from downlinks. Get their available echo areas lists. You need
   to convert these lists into backbone echo list format, as shown below:

     <Flags>,<AreaTag>,<Description>,<Moderator name>,<Moderator address>

   where Flags must be empty, and fields other than AreaTag are simply
   ignored. Converting can be easily done with awk. There's a lot of
   areafices out there, so there's no common solution, but the most simple
   way to do is to type:
 
    awk '{ print $1 }' arealist.txt > arealist.1

   then remove all garbage from arealist.1 and type

    awk '{ print ","$0",No description,Nobody,0:0/0," }' arealist.1 > arealist.2

   The trouble can arise when you have two or more links with the same echos.
   For example, let's say that you have one 'primary' and one 'secondary'
   link, with their arealists (in The Right Format) in arealist.prim and
   arealist.sec. You would like to run

    awk -F, '{ if(system("grep -qi \""$2"\" arealist.prim")!=0)
               print $0; }' arealist.sec > arealist.sec.new

   This removes all echos available on primary link from the list of
   secondary one, writing result in arealist.sec.new (I hope).
    Now you will hopefully have transit lists ready. Let's say they are
   named as transit.<xxx>, where xxx is something you like to write here
   (as for myself, here's link node number). Now you will choose, what
   groups of areas will be transit - one group for each transit list. For
   example, you chosen 1 and 2. So, write:

     TransitGroup	1
     TransitLink	<link address with domain>
     TransitList        <path to this list>
     TransitGroup	2
     TransitLink	<second link addr with domain>
     TransitList	<path to second list>

   and so on. Don't forget to check, is these specified addresses among
   your links.
    Then you add these groups number to AreaFixing stats of those links to 
   whom you would like to give access to transit areas. You also need to set
   MaxUnlinkedDays to the estimated timeout between sending areafix request
   and it's completion (week is usually enough). That's the timeout when
   automatically unlinked areas will disappear.
    You can mix normal and transit areas in the same group. Area will be
   autounlinked when it is passthrough, only one link is left and this area
   belongs to this link's transit list, transit group and so on.
    This way it works.

  2.6.2. Restricted links.

    We are not living in heaven. Our life is dictated by Policy, so if we
   really want to be, we need to provide mechanism for restricting someone
   rights in some place. But we aren't evil - we will not unlink entire
   network to restrict just one node's rights, as someone did (you know
   who I am talking about, right?). Thanks God.
    So, all of all, let's say we simply want to unplug some link from some
   area. We will write:

         RestrictLink <this link>
         RestrictArea <areatag>
         RestrictMode Firewall

    That's funny. But sometimes we need to disable mailing to all areas
   except one, for example, readonly everywhere expect our LOCAL.AREA. This
   can be done in simple way too:

         RestrictLink <this link>
         RestrictArea *
         RestrictMode ReadOnly

         RestrictLink <this link>
         RestrictArea LOCAL.AREA
         RestrictMode None

    Note order. Also note that * implies NETMAIL, so NETMAIL will possibly
   need to have been unrestricted too.

  2.6.3. Setting up SysV-init with QEcho.

    It's fairly simple. You need to write (or change ever written) SysV-style
   script for QEcho, where commands for starting and shutting down is
   'qecho daemon' and 'qecho undaemon'. You don't have to use killproc or
   some other init routine. Also, you may write 'killwait' instead of
   'undaemon' - this will shutdown quickly and possibly fix a problem with
   hanging shutdowns (oh God...). Whatever you choose, it works.

  2.6.4. Terminal problems.

    Yes, we all have them. So there's a file, linux.tic, included in this
   package. You need to compile it with tic or infocmp, depending on the
   ncurses version you have (backup your linux terminfo file first). Then
   try again. If it doesn't help... upgrade ncurses, what you can else do?
   I haven't seen the program linked with ncurses library which works ok
   with all ncurses/terminfo/kernel combinations anyway.

  2.6.5. Getting up on multiuser systems.

    All right. You will need fake user in a fake group, who will own both
   QEcho and ifcico stuff, assuming fnet/fnet. QEcho must be set both setuid
   and setgid (no danger, I think). All directories in both ifcico and QEcho
   tree must be owned by this user/group, QEcho config files too.  All QEcho
   config files need to be set -rw-------, except for qdconfig and AreaList,
   which most likely to be -rw-r-----. qdconfig must no longer be a link to
   qeconfig (just for security). BaseOwnUser and BaseOwnGroup must be set to
   fnet. Permissions to msgbase files would be 0660, so BaseOwnMode must be
   set to 0660 too.
    I write "must" just because I spend a lot of hours getting it works.
   That's a cool idea having separate non-root account for all networking
   stuff anyway, so even single-user system owners will possibly need to
   configure it this way.
    A little hint: you need to use 'su' explicitly if you're running perl
   scripts as external daemons or else. The reason is that perl checks for
   setuid and begins to play some stupid security game, e.g. FileFix will
   not work in this environment. So, you possibly would like to write smth
   like ''su -c "/usr/lib/ifmail/filefix" fnet'' instead of simple
   /usr/lib/ifmail/filefix.
 
  2.6.6. It crashes! What now?

    First, check your config to find out where domains are set and where
   they are not. Compare with this manual. Do it again some times...
    Second, if all domanized addresses are domanized and in reverse, check
   if all links from AreaList/LinkInfo present in the main config. All ok?
    Third, check the permissions.
    Still doesn't help?
    Find a packet that crashes QEcho. I will be greatly pleased if it would
   be just one or two messages. Send it to me together with your configs
   (you may replace passwords with '*', can't you?). So that's all you
   can possibly do... However, if you're a programmer, you can try to find
   the bug for yourself, but I would not like any patches - only description
   of bugs are welcome, not the pieces of code, otherwise I won't be able to
   maintain it. Anyway, there's not much people sending me code :)

 3. Operating QEcho.
 ~~~~~~~~~~~~~~~~~~~

  3.1. Command line options.

   QEcho's command line can either consist of a several commands or the only
  command to start daemon. Available commands are:

	toss		Toss incoming packets and bundles

	scan		Scan messagebase for outgoing mail

	expire		Remove obsoleted (see ExpireDays) messages from 
			messagebase

	pack		Pack messagebase, purging all previously removed
			messages

	link		Build reply-links in messagebase

	poll <Address>	Create a .?lo for this address (should be domanized)
			to force mailer poll it; this was implemented simply
			because it was very easy to implement

	kill		Terminate daemon if it is active

	killwait	Terminate daemon as fast as possible and wait
			for termination

	daemon		Start in daemon mode if no other daemon running

	undaemon	Cause daemon to terminate when it's idle and wait
			for termination

	index		Cause daemon to rebuild the nodelist index (if any).
   
   You can give several commands at once to be executed in given order; but
  you can't mix commands with daemon requests. This means you can write
  something like "scan pack expire link", but cannot write "daemon scan" or 
  "scan daemon" or "poll 2:5020/251@fidonet daemon scan kill". Therefore,
  command `daemon' should be the only command in command line if specified,
  and `kill' command too. This is not a hard limitation, is it?

   QEcho will not output nothing except error messages, all output goes to
  logfile. When commands are given to daemon, it will exit immediately
  (leaving daemon doing the work) - commands are automatically spooled in
  message queue, otherwise you'll have to wait the command to be completed.


  3.2. Daemon mode.

   Daemon mode was implemented to give QEcho such a reliability and
  invisibility that no DOS echoprocessor can ever think of. Started in this
  mode, QEcho will periodically check (see DaemonSleep) inbound directory
  for received bundles, toss it and serve requests from other QEchos started,
  allowing them to exit immediately. Moreover, in daemon mode QEcho will
  properly handle SIGTERM and SIGQUIT signals, keeping the process state 
  as fast as possible and then recovering it after restart, allowing you to
  shutdown the system without having a headache.

   UNIX is a true multitasking system, thus there can easily occur such a
  situation when QEcho and multiple QDeds are doing something simultaneously.
  But there's no problem. QDed will automatically rescan an opened message
  area when it detects any unexpected changes, allowing other QDeds to freely
  modify this area; QEcho is acting in simular way. The only thing where
  troubles are really big, is messagebase packing. As for now, the solution
  for QEcho is to wait while no QDeds are using this area and then repack it,
  disabling other access to the file. Therefore, a significant pauses may
  occur in daemon work while packing messagebase.

   I'd like to recommend you to add `qecho undaemon' keyword to reboot, halt
  and shutdown scripts if you starting daemon from rc script to be sure for
  proper termination. `qecho killwait' will go slightly faster, but there's
  a greater probability for losing something important, although it pretends
  to be crash-resistant.

   As of newer versions of QEcho, they're known to work fine with full SysV
  style init, so I'd recommend you to write all SysV init stuff needed to
  start and stop daemon with `daemon' and `undaemon' commands.

   Crash-recovery code (handling of SIGTERM) seems to be working fine too,
  but I don't recommend you to use it except when you really need it. 
  Although this code is the only place where no bugs were found ;-)   

 4. QDed hot keys.
 ~~~~~~~~~~~~~~~~~

  4.1. Browsing list of areas.
  
   The following keys available while browsing list of message areas:

	Esc, F10		Quit QDed
	Tab			Go to next unread area
	Ctrl-R			Update total/unread counters (rescan)
        Ctrl-C			Clear unread counter (catchup)
	Any printable symbol	Search for areatag
	Backspace		Delete last symbol of entered areatag
	Ctrl-U			Clear entered areatag
	Arrows, PgUp/PgDn	Do the corresponding action
	Enter			Browse selected area


  4.2. Browsing message area.

   The following keys available while browsing message area:

	Esc, F10, q		Go to area selection window
	Up/Down/PgUp/PgDn	Scroll current message
	*			Go to original message
	/			Go to first reply
	-			Go to previous reply
	+			Go to next reply
	Left/Right		Go to previous/next message
	Del			Delete message
	K			Turn kludges showing on/off
	S			Save message to file
	L			Show list of messages in this area
	W			Enter new message
	C			Change message text
	R			Reply to this message
	F			Forward message
	N			Reply to different area


  4.3. Editing a message.

   The following keys available while editing a message:

	Esc, F10		Drop message
	F2			Save message
	F4			Crosspost message; area list will appear,
				where selection/unselection can be done by
				pressing Enter. F10 is to confirm. To cancel
				crossposting, unselect all selected areas and
				press F10.
     	F5			Carbon copy (netmail only). Ins/Del will
				modify carbon copy list, Enter - accept,
				F10 - discard. This feature is not well
				tested (i.e. was never tested) :)
        F3			Insert text from a file
	Ctrl-Y			Delete line
	Ctrl-N			Delete line, substituting with AutoSkip value

  4.4. Nodelist index.

   Just try to simply press 'Enter' on a To: field and see what's happening.
  Exact sequence of nodelist searching operations when you enter To: name is:

    o	try to find exact matching name - if found, substitute address
    o   try to interpret entered string as a valid ftn address (see below)
        if ok, search nodelists for that and substitute if found
    o	open nodelist browser with mark on most closely matching entry
    o   allow user to select - if so, substitute selected
    o   nothing left to play with ;) - drop to the usual scheme

   You need to compile the index before trying. Uncompiled or mismatching
  index will most likely cause sig11 :-(

   A more practical feature for nodelist searcher is `search via address'.
  You can enter an address, possibly incomplete (in the last case missing
  parts will be taken from your originating address, regardless it had been
  changed or not - see below for incompletes) - if any match can be found
  in nodelists, it will be substituted. If not, see above :-)

   Here is some examples for incomplete addresses and their expansion:

     	609		==> 		2:5020/609
	.3		==>		2:5020/609.3
	5005/1		==>		2:5005/1

   There are some curious expansions, something like:

	1:		==>		1:5020/609
	1:5005		==>		1:5005/609

   And may be even something like this

	1:.3		==>		1:5020/609.3
	5005/		==>		2:5005/609

  will work too, but I haven't tested those as I consider them useless -
  but address parsing code is much more general than it needed to be, so
  let us have this useless features too :) In fact, I simply can't remind
  what that parser exactly does :(

 5. Known problems.
 ~~~~~~~~~~~~~~~~~~

  Here's a list of problems are known to occur in some situations:

    Problem: QEcho hangs while packing msgbase.
    Reason: one or more QDeds has been dead while browsing this area.
    Possibility: Little.
    Comment: fixed now. Let's all throw it away.

    Problem: QEcho hangs and leaves about 50 megabytes of shit in a log.
    Reason: Discovered! Discovered! I found it! :)
    Possibility: Should not happen.
    Comment: fixed now. Forget this beast.

    Problem: QDed doesn't show text cursor as needed.
    Reason: ncurses and/or terminfo database. Maybe I'll turn to SLang -
	    I've found newer versions of ncurses to be incompatible with
            older, and there's a tons of other problems.
    Possibility: Large.
    Comment: Hmm... :)

    Problem: Passthrough areas are re-autocreated as not passthrough.
    Reason: Slow link (try increasing MaxUnlinkedDays) or a bug.
    Possibility: Maybe.
    Comment: It's definitely not a bug. It's a feature.

    Problem: QEcho cannot terminate properly when system dies.
    Reason: Obvious. Turn to a full SysV-style init.
    Possibility: Depends on your hands. ;-)
    Comment: There's a possibility of a trouble - for example, let's see
    what happens when system is being rebooted while ifcico was active and
    qecho was waiting for ifcico to remove bsy file. Yes, you are right.
    Killwait command will cause deadlock. What can I do?.. 

    Problem: Manual changes to AreaList are all disappeared. 
    Reason: QEcho daemon was active. You should stop it before doing.
    Possibility: Depends on your experience. ;-)
    Comment: None.

 ATTENTION! If you suddenly discover any problem not listed here, PLEASE,
 PLEASE, PLEASE, mail me... (no one will do anyway. PLEASE!) :-)


 6. Obtaining new QEcho versions.
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 
  New versions are always available at official QEcho ftp site:

               ftp://ftp.mgdtd.ac.ru/pub/QEcho/QEcho.tgz
 
  or (for those fidonetters who can't access ftp) freqable at 2:5020/609 as
  `qecho.tgz', _BUT PREPARE TO DIE_ if you'll hear my sleepy voice instead of
  modem. You are warned :)


 7. Author, copyrights, thanks, etc.
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

   All coding done by Queen (real name - Nikolay Shadrin). Feel free to 
  contact me at:

      	2:5020/609@fidonet
	queen@qh.mirea.ac.ru

   Thanks goes out to:

      - Victor Belov <scream@hotdog.hq.aenet.ru>
      - Dimitry Martemianov <saruman@mirea.ac.ru> 

                                                 /Queen

