@database "The All New And Improved BBBS SysOp Manual, for v3.33 How"
@author "Kalle Soiha, Copyright (c) 1997"

@remark
@remark This documentation is beerware. (IVb) 1997 Kalle Soiha
@remark Last update on 26.06.97.
@remark Maintained by Kalle Soiha (Kalle.Soiha@bbbs.net).
@remark
@remark BBBS is a copyright of Kim Heino and Tapani T. Salmi, (c) 1990-1997.
@remark

@wrap 78
@toc table_of_contents
@help help

@remark AmigaGuide forever!

@node Main "The BBBS System Operator Manual - Welcome!"
@{b}oooooooooooooooo    oooooooooooooooo    oooooooooooooooo          ooooooo o@{ub}
@{b} BBBBBB""""BBBBBBo   BBBBBB""""BBBBBBo   BBBBBB""""BBBBBBo    oBBBBB""""BBBo@{ub}
@{b} BBBBBB     BBBBB"   BBBBBB     BBBBB"   BBBBBB     BBBBB"   BBBBBB       "B@{ub}
@{b} BBBBBB   oBBBB""    BBBBBB   oBBBB""    BBBBBB   oBBBB""    BBBBBBBoo     "@{ub}
@{b} BBBBBBBBBBBBooo     BBBBBBBBBBBBooo     BBBBBBBBBBBBooo     "BBBBBBBBBBBoo@{ub}
@{b} BBBBBB"   "BBBBBo   BBBBBB"   "BBBBBo   BBBBBB"   "BBBBBo     "BBBBBBBBBBBBB@{ub}
@{b} BBBBBB      BBBBBB  BBBBBB      BBBBBB  BBBBBB      BBBBBB        """BBBBBBBB@{ub}
@{b} BBBBBB      BBBBBBB BBBBBB      BBBBBBB BBBBBB      BBBBBB Bo         BBBBBB"@{ub}
@{b} BBBBBB     oBBBBBB  BBBBBB     oBBBBBB  BBBBBB     oBBBBBB BBBo      oBBBBB"@{ub}
@{b} BBBBBBBooBBBBBBB"   BBBBBBBooBBBBBBB"   BBBBBBBooBBBBBBB"   oBBBBBBBBBBBB""@{ub}
@{b}"""""""""""""""     """""""""""""""     """""""""""""""          """"""@{ub}

                                @{i}Version 3.33 How@{ui}
             @{i}Copyright (c) 1990-1997 Kim Heino and Tapani T. Salmi@{ui}

                            @{b}System Operator's Manual@{ub}

           Welcome to BBBS! Please select a topic you wish to view...

                            @{"First-time installation" link INSTALL}
                               @{"Table of Contents" link TABLE_OF_CONTENTS}
                       @{"The BBBS License and contact info" link APP_LEGAL}
@endnode

@node table_of_contents "The BBBS v3.33 How System Operator Manual - Table of Contents"
                                @{b}WELCOME TO BBBS!@{ub}
                                @{b}================@{ub}
                         @{"First-time installation of BBBS" link INSTALL}

                                 @{b}CONFIGURATION@{ub}
                                 @{b}=============@{ub}
                         @{"Configuring BBBS - an overview" link CFG_MAIN}
                        @{"The BCFG4 Configuration Program" link CFG_BCFG4}
                               @{"User access groups" link CFG_GROUPS}
                                 @{"The file areas" link CFG_FILE}
                             @{"The external.bbb-file" link CFG_EXTERNAL}
                            @{"BBBS groupmail functions" link CFG_ALIAS}
                         @{"Internet access configuration" link CFG_INET}
                              @{"The BBBS chat system" link CFG_CHAT}
                             @{"The BBBS color palette" link CFG_COLORS}
                     @{"bbbstxt-files: language configuration" link CFG_BBBSTXT}
                        @{"Overview of the files BBBS uses" link CFG_FILES}

                                 @{b}GENERAL STUFF@{ub}
                                 @{b}=============@{ub}
                        @{"The BBBS command line functions" link SYS_CMDLINE}
                          @{"TCP/IP networking with BBBS" link SYS_TCPIP}
                       @{"The waiting for a caller-screen" link SYS_WAITFORCALLER}
                                @{"Local SysOp keys" link SYS_KEYS}
                          @{"The BTERM terminal emulator" link BTERM0}

                            @{b}THE BBBS SCRIPT LANGUAGE@{ub}
                            @{b}========================@{ub}
                  @{"Introduction to the BZ programming language" link BZ_MAIN}
                          @{"The BZ Language: Expressions" link BZ_MAIN_EXPS}
                    @{"The BZ Language: Functions and Variables" link BZ_MAIN_FUNCS}
                     @{"The functions in BZ49 runtime library" link BZ_LIB}
                     @{"The variables in BZ49 runtime library" link BZ_VAR}
                             @{"Other script languages" link BZ_OTHER}


                        @{b}OPERATING SYSTEM CONSIDERATIONS@{ub}
                        @{b}===============================@{ub}
                                @{"BBBS for PC-DOS" link SYS_DIFFS_DOS}
                               @{"BBBS for IBM OS/2" link SYS_DIFFS_OS2}
                         @{"BBBS for Microsoft Windows NT" link SYS_DIFFS_NT}
                              @{"BBBS for UNIX clones" link SYS_DIFFS_NIX}
                            @{"OS environment variables" link SYS_ENV}

                                   @{b}APPENDICES@{ub}
                                   @{b}==========@{ub}
                                 @{"Top-19 errors" link APP_TOPERRORS}
                       @{"About regular expression (regexp)" link APP_REGEXP}
                                   @{"Wildcards" link APP_WILDCARDS}
                    @{"The BBBS license and contact information" link APP_LEGAL}
                           @{"BBBS prices and order form" link APP_ORDER}
                                   @{"References" link APP_REFS}

 @{b}BBBS@{ub} is a copyright of @{i}Kim Heino@{ui} and @{i}Tapani T. Salmi@{ui}, Copyright @{b}(c)@{ub} 1990-1997
@endnode

@node INSTALL "First-time installation of BBBS"
First of all, thank you for choosing @{b}BBBS@{ub}, the powerful, all-in-one BBS software solution!

Creating a working BBS system with BBBS is very simple. As you are reading this, you probably have already extracted the BBBS distribution package to a directory. This directory is called the "BBS directory". It is probably a good idea to name it something like @{b}c:/bbs@{ub}, if not but for simplicity's sake.

To get a minimal configuration, you will need to run the @{"BCFG4 configuration program" link cfg_bcfg4 }. You can do a lot of configuration there, but for starters you will just have to configure the @{i}name of your BBS@{ui} and @{i}your own name@{ui}. Other options should be quite correct, but you can check them all if you like. If you run into trouble, you can at any time request help with the @{i}F1@{ui} key.

When you are finished with BCFG4, select @{i}exit and save@{ui} and wait for BCFG4 to save the configuration you just created. Depending on how many conferences you created (and a lot of other things), the saving procedure can take a long time or a very long time. Remember that patience is a virtue!

When BCFG4 is finished, you have a working configuration. Now all you need to do is log in to the system once to register yourself as the system operator. BBBS can be run in local mode by executing it with the command line @{b}BBBS 0@{ub}. The first user that will register into the system will be the @{i}main system@{ui} @{i}operator@{ui} or "user 0", with access to everything. After you have done this, you have a fully functional setup.

To get the most out of BBBS, though, you will need to do a bit more configuring. Just a few things you might like to check are if your @{"menu files" link cfg_files_menus } are OK, what kind of @{"file areas" link cfg_file } you would like to have, if the @{"user access configuration" link cfg_groups } is ok and especially if @{"external programs" link cfg_external }, such as packers work. But otherwise, BBBS is now installed. Have fun!
@endnode


@node CFG_MAIN "Configuring BBBS, an overview"
BBBS, being a comprehensive, all-in-one system, has a lot of features and therefore there is also a lot to configure. The basic things are configured with the @{"BCFG4 Configuration Program" link cfg_bcfg4}, the rest with ASCII-format text files residing in your BBS-directory, which can be edited with your favorite editor or with the BBBS's internal @{b}mg@{ub} editor.

Most important one of these is the file @{"groups" link cfg_groups}. It is used to define @{i}user access groups@{ui}. Groups are the basis of BBBS security, so it is very important that you have a thorough look into the file and how it is formed.

A set of important files are also the 'filedir*'-files. These are used to create @{"the file areas" link cfg_file } in your BBBS system. The BBBS filesystem, @{i}File/4@{ui}, is a very powerful "OS-like" filesystem, with tree-structure and file manipulation commands familiar from most operating system shells.

A lot of miscellaneous configuration is in the @{"external.bbb" link cfg_external }-file. In it resides the configuration of external programs, such as packers and protocols. Also, a lot of configuration related to networking with other BBS systems can be found in this file.

The configuration of @{i}BBBS groupmail features resides@{ui} in the @{"alias.bbb" link cfg_alias}-file. This is where things like @{i}mailing lists@{ui} and @{i}comment receivers@{ui} are defined.

BBBS has also a lot of @{i}Internet access tools@{ui}. The behavior of BBBS in Internet and other TCP/IP-networks can be defined in the file @{"inet.bbb" link cfg_inet}.

@{"The BBBS chat system" link cfg_chat} is also a very complicated, channel-based one. The available @{i}channels@{ui} and @{i}feelings@{ui} can be configured with the files in the feelings-directory, defined in @{"BCFG4" link cfg_bcfg4 }.

In addition to these configuration files, there are also a lot of @{"other files" link cfg_files} that are used to do all sorts of miscellaneous configuration.

Examples of all configuration files came with the distribution package. In addition to the examples in this manual, do refer also to these files, as they are pretty straightforward and self-explainatory.
@endnode


@node cfg_bcfg4 "The BCFG4 configuration program"
The @{i}BCFG4 configuration program@{ui} is used to do most of the configuration in BBBS. The BCFG4 interface is very easy to use. If you run into trouble or do not understand something, the @{b}F1@{ub} key will give you immediate help.

The BCFG4 program is called @{b}bcfg4.exe@{ub}. The calling convention of this program is simple:

@{b}bcfg4.exe [node]@{ub}

Where @{b}node@{ub} is the number of the BBBS node you want to configure. In BCFG4, the global configuration is always the same regardless of the node specified, the local configuration is specific for each node.

If you specify "@{b}bad@{ub}" as the @{b}node@{ub}-parameter, then BCFG4 will scan your badecho-directory for nonexistant echos and create them according to the rules in the @{"badecho-section of external.bbb-file" link CFG_EXTERNAL_badecho}, if there is at least one "unnamed" conference in your conference configuration.

The things you'll probably want to check are:
  - @{"The general stuff" link global_general}
  - @{"The global toggles" link global_toggles}
  - @{"The conference configuration" link global_confs}
  - @{"The modem setup for each node" link local_modem}
  - If you want to have networks, the @{"FidoNet configuration" link global_network}

Otherwise, the default values should be pretty much OK. You can (and should) @{"go through everything" link bcfg4_main}, though, just to make sure.
@endnode


@node CFG_GROUPS "The GROUPS-file: defining user access"
BBBS's powerful user access management is based on @{i}groups@{ui}. Groups are collections of other groups with a distinctive name. The groups you define are global. That is, you can use them anywhere in the system. In every system you will most likely run into a situation where you need groups. Just one of them is when you need to create a "private" conference or a "news" conference. This is all very easy with groups. All you need to do is to type a few lines.


@{i}Defining general groups@{ui}

Groups are defined in the file @{b}groups@{ub}, residing in the BBS-directory. The format of the file is as follows; blank lines and lines beginning with a semicolon (';') are ignored:

@{b}name_of_group:group1{,group2{,...}}@{ub}

As you can see, a group contains only other groups. Every user is a member of the groups called @{b}all@{ub} and @{b}first.last@{ub}, where @{b}first@{ub} is the first name of the user and @{b}last@{ub} is the last name. So, to define a group called @{b}bz@{ub} with the users "Kim Heino" and "Tapani Salmi", you write:

@{b}; Creating a simple general group with two users:@{ub}
@{b};@{ub}
@{b}bz:kim.heino,tapani.salmi@{ub}

Then, to create a group @{b}simka@{ub} with the members of the @{b}bz@{ub}-group and also the users "Pertti Heikkinen" and "Rune Johansen", you would write:

@{b}; An example of creating a group called 'simka' with another group:@{ub}
@{b};@{ub}
@{b}simka:bz,pertti.heikkinen,rune.johansen@{ub}

Group names that include an exclamation mark ('@{b}!@{ub}') have a special meaning: such groups include all members of the group left of the exclamation mark, except the members of the group at the right side of it. For example, the group @{b}fsysop!bz@{ub} contains all users of the group @{b}fsysop@{ub}, except the members of the group @{b}bz@{ub}. A shortcut for @{b}all!foo@{ub} is @{b}!foo@{ub}. An example:

@{b}; Example of using exclusive groups:@{ub}
@{b};@{ub}
@{b}simka:bz,pertti.heikkinen,tuomo.soini,rune.johansen@{ub}
@{b}finnish:simka!rune.johansen@{ub}
@{b};@{ub}
@{b}; Another example; group true has persons that are members of groups foo@{ub}
@{b}; and bar:@{ub}
@{b};@{ub}
@{b}foo=kim.heino,tapani.salmi,kalle.soiha,olli.t”rm„,sami.virtanen@{ub}
@{b}bar=rune.johansen,kim.heino,olli.t”rm„,matti.luoma@{ub}
@{b}temp=!foo,!bar@{ub}
@{b}true=!temp@{ub}
@{b};@{ub}
@{b}; So, the group true contains the users Kim Heino and Olli T”rm„.@{ub}
@{b};@{ub}

Remember that if you try to create group @{b}foo@{ub} with the line:

@{b}foo:all!kim.heino,all!tapani.salmi@{ub}

The result is that everybody is a member of the group @{b}foo@{ub}, since they are members of the first group or the second group and the group @{b}foo@{ub} is the two put together. The correct way to do this is would be:

@{b}bz:kim.heino,tapani.salmi@{ub}
@{b}foo:all!bz@{ub}
@{b}; or foo:!bz@{ub}

Remember also that the group @{b}all!all@{ub} has no sense: it is an empty group.

Another group name that has a special meaning is any group with a string like @{b}\@yymmdd@{ub} added to it, where @{b}yymmdd@{ub} is a date (@{b}yy@{ub} specifies the year, @{b}mm@{ub} the month and @{b}dd@{ub} the day). Groups like this have effect in the group they are being added to only until the specified date is reached. 14 days before the date is reached, the members of the group receive a message that their access in a group will soon expire. When the date is reached, an exclamation mark is added to the group name. An example:

@{b}; Example of a group with a member that will exist only for a specified@{ub}
@{b}; time:@{ub}
@{b};@{ub}
@{b}kids:toni.saari,samuli.suominen,olli.t”rm„@990903@{ub}
@{b};@{ub}
@{b}; At 20.8. 1999, the line will change into:@{ub}
@{b};@{ub}
@{b}; kids:toni.saari,samuli.suominen,olli.t”rm„@990903!@{ub}
@{b};@{ub}
@{b}; Finally, at 3.9. 1999, user Olli T”rm„ will be removed from the group@{ub}
@{b}; and the line will change into:@{ub}
@{b};@{ub}
@{b}; kids:toni.saari,samuli.suominen@{ub}

There are also so-called "age" groups. They are named @{b}<age@{ub} and @{b}>age@{ub}. Every user whose age is under @{b}age@{ub} years, belongs into the group @{b}<age@{ub}. Likewise, every user whose age is over @{b}age@{ub} years, belongs into the group @{b}>age@{ub}. An example:

@{b}; Example of a group with age definition:@{ub}
@{b};@{ub}
@{b}kids2:samuli.suominen,<9@{ub}
@{b};@{ub}
@{b}; In addition to the user "Samuli Suominen", everyone whose age is@{ub}
@{b}; under nine years belongs into the group kids2.@{ub}

Groups are also cumulative. That is, when you have created a group on one line, creating it "again" on an another line simply adds to the already existing group. The @{b}simka@{ub} group defined above could have also been defined like this:

@{b}; Another example of creating a group called 'simka'.@{ub}
@{b};@{ub}
@{b}simka:bz@{ub}
@{b}simka:pertti.heikkinen,rune.johansen@{ub}

This is good to remember as a single line in the groups file can only be 1023 characters in length. Remember also that the groups-file is read from top to bottom.


@{i}Restricting conference access with groups@{ui}

For every @{i}conference@{ui} you generate, there is also a set of groups, defining who can do what in the conference. Lets say you generate a conference called @{b}chat@{ub}. For it, there are also four groups:

@{b}chat\@@{ub}   - members cannot read or write the messages in the conference.
@{b}chat\@r@{ub}  - members can only read messages in the conference.
@{b}chat\@w@{ub}  - members can both read and write messages in the conference.
@{b}chat\@s@{ub}  - members have SigOp access in the conference.

By default, all users are members of the @{b}chat@w@{ub}-group, so they have full read and write access to the "chat"-conference. An example: to have only the members of the group @{b}simka@{ub} and user "Kalle Soiha" be able to read the conference called "BBBS.Simka", you would write:

@{b}; An example of how to restrict conference access:@{ub}
@{b};@{ub}
@{b}; First disallow everyone to read the bbbs.simka-conference:@{ub}
@{b};@{ub}
@{b}bbbs.simka@:all@{ub}
@{b};@{ub}
@{b}; Then allow group "simka" and the user "Kalle Soiha" to read and@{ub}
@{b}; write into it:@{ub}
@{b};@{ub}
@{b}bbbs.simka\@w:simka,kalle.soiha@{ub}

But what if you have a lot of network areas in your BBS and would prefer not to have the members of group @{b}newbies@{ub} write into these conferences, only read? One way to do this would be:

@{b}; A bad example of limiting access from a lot of conferences:@{ub}
@{b};@{ub}
@{b}sf.aloittelijat\@w:all@{ub}
@{b}sf.aloittelijat\@r:newbies@{ub}
@{b}sf.amiga\@w:all@{ub}
@{b}sf.amiga\@r:newbies@{ub}
@{b}; etc. ad nauseam@{ub}

The BBBS group system offers a much quicker way to achieve this. You can create a group with a @{"regular expression" link APP_REGEXP}. There are four kinds of @{i}regexp groups@{ui}:

@{b}name@=regexp@{ub}   - Members of the group cannot read or write any messages
                 to conferences matching the regular expression
                 "regexp".
@{b}name@r=regexp@{ub}  - Members of the group can only read messages from
                 conferences matching the regular expression "regexp".
@{b}name@w=regexp@{ub}  - Members of the group can both read and write messages
                 to conferences matching the regular expression
                 "regexp".
@{b}name@s=regexp@{ub}  - Members of the group have sigop access to conferences
                 matching the regular expression "regexp".

"name" can be any string you like, but it should be something that has something to do with the actual function of the group. Note, that "name" is @{i}NOT@{ui} the name of the regular expression group. It is just an unique string that is part of the name. The real name of the regexp group @{b}name\@r=regexp@{ub} is @{b}name@r@{ub}.

As you probably have already guessed, regexp groups can be very powerful indeed, though they can give you a major headache if you don't know a lot about regular expression. It is very important to completely understand what regexp is. "Normal" OS-shell wildcards like '@{b}?@{ub}' and '@{b}*@{ub}' are part of regexp, but they have a completely different meaning in it.

As an example, let's see how we can easily solve the FidoNet access problem with regexp groups:

@{b}; The correct way to limit access from a lot of conferences:@{ub}
@{b};@{ub}
@{b}nonewbies\@w=^sf\\.:all@{ub}
@{b}nonewbies\@r=^sf\\.:newbies@{ub}

Notice the power of the regular expression. With just two lines, the write-access of group newbies is removed from all conferences beginning with the string "SF.". It doesn't matter how many conferences there are, the regexp group automatically applies to all conferences matching the expression given.

Remember that the last specified conference group will take effect, not the most "powerful" one; that is, if you first give a sigop access to a certain group, and later on in the file give the same group a read-access, the group will have only read-access, NOT sigop-access. This is also true for regexp-conference groups.


@{i}List of all predefined groups that cannot be reassigned:@{ui}

@{b}Group name               Members@{ub}
@{b}=======================================================================@{ub}
@{b}all@{ub}                      all users, always.
@{b}firstname.lastname@{ub}       user with the name "Firstname Lastname".
@{b}foo!bar@{ub}                  users who are members of the group @{b}foo@{ub}, but
                         not the group @{b}bar@{ub}.
@{b}!foo@{ub}                     users who are not members of the group @{b}foo@{ub}.
@{b}>age@{ub}                     users who are older than @{b}age@{ub} years.
                         (from the birthday-field of the "u a" command)
@{b}<age@{ub}                     users who are younger than @{b}age@{ub} years.
                         (from the birthday-field of the "u a" command)
@{b}account@{ub}                  users who have an account defined and have
                         some credit/money left.
@{b}nomoney@{ub}                  users who have an account defined, but don't
                         have any credit/money left.
@{b}noaccount@{ub}                users who don't have an account defined.
@{b}limitx@{ub}                   users who have the limit value @{b}x@{ub}.
@{b}sysx@{ub}                     users who have the sysop access @{b}x@{ub}.


@{i}List of all groups that can be reassigned:@{ui}

@{b}Group name               Who should be members?@{ub}
@{b}=======================================================================@{ub}
@{b}conf@@{ub}                    users who have no read or write access to
                         conference @{b}conf@{ub}.
@{b}conf@r@{ub}                   users who have only read access to the
                         conference @{b}conf@{ub}.
@{b}conf@w@{ub}                   users who have both read and write access to
                         the conferece @{b}conf@{ub}.
@{b}conf@s@{ub}                   users who have sigop access to the conference
                         @{b}conf@{ub}.
@{b}conf@=regexp@{ub}             users who have no read or write access to
                         conferences matching the regular expression
                         @{b}regexp@{ub}.
@{b}conf@r=regexp@{ub}            users who have only read access to the
                         conferences matching the regular expression
                         @{b}regexp@{ub}.
@{b}conf@w=regexp@{ub}            users who have read and write access to the
                         conferences matching the regular expression
                         @{b}regexp@{ub}.
@{b}conf@s=regexp@{ub}            users who have sigop access to the conferences
                         matching the regular expression 'regexp'.
@{b}nochat@{ub}                   users to whom sysop should always be
                         unavailable for chat.
@{b}okchat@{ub}                   users to whom sysop should always be available
                         for chat.
@{b}nonode@{ub}                   users to whom members of other nodes should
                         always be unavailable (i.e. users who should
                         not be able to send node messages).
@{b}nofeel@{ub}                   users who should not be able to use @{"feelings" link CFG_CHAT_FEELINGS}.
@{b}okuser@{ub}                   users who should be able to log in during a
                         "nouser"-event.
@{b}ftp@{ub}                      users who should be allowed to use the main
                         menu command 'ftp' to FTP out.
@{b}rlogin@{ub}                   users who should be allowed to use the main
                         menu command 'rlogin' to rlogin out.
@{b}telnet@{ub}                   users who should be allowed to use the main
                         menu command 'telnet' to telnet out.
@{b}finger@{ub}                   users who should be allowed to use the main
                         menu command 'finger' to finger out.
@{b}hunt@{ub}                     users who should be allowed to use the main
                         menu command 'hunt' to play Hunt.
@{b}hack@{ub}                     users who should be allowed to use the main
                         menu command 'hack' to play NetHack.
@{b}irc@{ub}                      users who should be allowed to use the
                         BBBS groupchat to interface with the @{i}Internet Relay@{ui}
                         @{i}Chat.@{ui}
@endnode

@node CFG_FILE "Defining file areas in BBBS"
The BBBS filesystem, @{i}File/4@{ui}, is a bit different than the filesystems on most systems you've seen. File/4 has a tree-like structure and is based on a @{i}command shell@{ui}, so users familiar with most OS shells should feel pretty much at home.

The core of File/4 is the @{i}virtual directory structure@{ui} defined in @{"filedir*-files" link CFG_FILE_FILEDIRS}. Virtual directory structure can but need not be the same as the real directory structure in your hard disk. Individual directories are in turn set up with @{"descript.ion-files" link CFG_FILE_DESCRIPTION} and the @{"BBBS group system" link CFG_GROUPS}.
@endnode


@node CFG_FILE_FILEDIRS "The directory structure: filedir*-files"
The @{i}virtual directory tree@{ui} for File/4 is created with @{b}filedir@{ub}-files in your @{"BBS root directory" link cfg_files_root}. This is the directory structure that the users see when browsing your file areas. @{b}Filedir@{ub}-files have a running number as their extension. There are three kinds of @{b}filedir@{ub}-files. For each type of @{b}filedir@{ub}-file the extension has a different meaning. The different types are:

@{b}1)@{ub} @{i}The filedirg-files@{ui} (named @{b}filedirg.nnn@{ub}, starting from 000). These
   are used to define the @{b}global@{ub} file directories. Global file
   directories are always added to the directory structure. The
   extension number in filedirg-files has no special meaning, but you
   can have multiple filedirg-files, if you have large fileareas and
   want to keep different kinds of directories in different
   filedirg-files.

@{b}2)@{ub} @{i}The filedirn-files@{ui} (named @{b}filedirn.nnn@{ub}, starting from 001). These
   are used to define directories specific for each node. For example,
   directories that should be available only for node 1 should be
   placed into the file @{b}filedirn.001@{ub}. The first such line that
   the user can write to in the filedirn-file defines the @{i}"hold"-directory@{ui}
   for that node and it @{i}must@{ui} exist. Hold directory is used by the
   users to temporarily hold files which they want to download or otherwise
   handle. If you do not create a hold directory for a node, BBBS will
   complain "hold not found" when a user enters the fileareas. Therefore,
   you'll need a filedirn-file for each node you want to be able to access
   files. For things to be universal in all BBBS systems, please name your
   hold directory @{b}/tmp@{ub}.

@{b}3)@{ub} @{i}The filedirc-files@{ui} (named @{b}filedirc.nnn@{ub}, starting from 000). These
   are used to define directories specific for a certain @{i}conference@{ui}.
   For example, the file @{b}filedirc.012@{ub} specifies directories that are
   added to the directory structure only when the user is in conference
   number 12.

The structure of all @{b}filedir@{ub}-files is simple. Each line of the @{b}filedir@{ub}-file specifies one directory entry. A single entry should consist of three fields:

       @{i}virtual_directory   real_directory   description_and_flags@{ui}

@{i}Virtual directory@{ui} is the name of the directory that the user sees when browsing the file areas. It should be written in lower case. Creating a directory like @{b}/Windows/Games@{ub} will not work, it will only show the directory @{b}/windows@{ub} and not its subdirectories. This is one of the @{"top-19 errors" link APP_TOPERRORS}.

@{i}Real directory@{ui} is the actual directory on your hard disk or CD-ROM where the files belonging to this directory should be stored. You must create these directories.

It is very important that you use a forward slash ('/') as the directory separator in @{i}BOTH@{ui} virtual directory and real directory fields and @{i}NOT@{ui} a backslash ('\\'). This is because backslash is used as an escape character in BBBS. Also, it is very recommended that you use only lowercase characters in virtual directory pathnames.

@{i}Description@{ui} is simply a short description of what kind of files the directory contains.

@{i}Flags@{ui} are very important: they are used to specify various things for the directory. One of these is the @{i}directory access@{ui}. By default, everyone can read the files in every file area. To define which @{"groups" link CFG_GROUPS} are allowed to read and/or write from/to the directory, the following flags can be used:

@{b}@r:group1{,group2{,...}}@{ub}    (specified groups are given @{i}READ@{ui} access to
                             the directory)
@{b}@w:group1{,group2{,...}}@{ub}    (specified groups are given @{i}WRITE@{ui} access to
                             the directory)
@{b}@rw:group1{,group2{,...}}@{ub}   (specified groups are given both @{i}READ@{ui} and
                             @{i}WRITE@{ui} access to the directory)
(@{b}@wr@{ub} flag is synonymous to the @{b}@rw@{ub} flag)

@{i}READ@{ui} access means that the users belonging to such a group can only read files. That is, they can type or download files in the directory. @{b}WRITE@{ub} access allows users to also @{i}delete@{ui} or @{i}move@{ui} the files in the directory. Therefore, users should normally have only @{i}READ@{ui} access to most directories.

The @{b}@e@{ub}-flag, when added to the @{i}flags@{ui}-field of the directory, is used to prevent new files scanning for that directory. This is useful for directories that don't change, like CD-ROMs.

By default, BBBS uses a file called @{b}descript.ion@{ub} in the directory's real directory as the @{"description file" link CFG_FILE_DESCRIPTION} for the directory. You can change this with the @{b}@0@{ub} and @{b}@1@{ub}-flags. The difference is that with @{b}@0@{ub}, the file size and date are read from the disk, with @{b}@1@{ub} they are read from the descript.ion-file. This is useful with CD-ROMs.

For example, if you specify this in your filedir-file:

@{b}/                c:/root/             Root directory@{ub}
@{b}/graph           c:/pictures/         Assorted pictures@{ub}
@{b}/graph/people    c:/pictures/faces/   People @0c:/descs/faces.desc@{ub}

BBBS would search the descriptions for files from the files
@{b}c:/descs/faces.desc@{ub}, instead of @{b}c:/pictures/faces/descript.ion@{ub}.

Note how the root directories for the directories @{b}/graph/people@{ub} and @{b}/graph@{ub} have to be specified. Otherwise they would not show up in the directory listing.

Also, the description output can be formatted with the @{b}@n@{ub} and @{b}@@@{ub} flags. @{b}@n@{ub} generates a single line feed to the description and the @{b}@@@{ub} creates one '@'-character.

If a line in a filedir-file begins with a dot, then the filename after the dot (separated with a space) must exist or the directory entries after the dot-line will not be included to the directory tree. This feature can be used with removable media, such as a CD-ROM. You can have one directory for all your CD-ROMs as long as you define correct dot-lines to ensure that the disk in the CD-ROM drive is autodetected.
@endnode


@node CFG_FILE_DESCRIPTION "Setup of directories: the descript.ion-files"
Descriptions for files in a File/4 directory are stored in a @{i}4DOS@{ui}-compatible @{b}descript.ion@{ub} file. They can have a "hidden" attribute, but not read only, as BBBS needs to rewrite the file from time to time. The format of a descript.ion file is simple:

                        @{i}filename  description_and_flags@{ui}

@{i}Description@{ui} is simply the description for the file. If there is a description for a file that does not exist on the disk, then it is displayed in the directory listing, but is marked "offline" by BBBS. In the description, some @{i}flags@{ui} can be used:

@{b}@r:group1{,group2{,...}}@{ub}
   Give @{i}READ@{ui} access to the specified @{"groups" link CFG_GROUPS} for this file. Members of
   groups with @{i}READ@{ui} access can read the file, that is, they can download
   or type it.

@{b}@w:group1{,group2{,...}}@{ub}
   Give @{i}WRITE@{ui} access to the specified groups for this file. Members of
   groups with @{i}WRITE@{ui} access can write to this file. That is, they can
   for example delete it, if this has been enabled in BCFG4. Having a
   @{i}WRITE@{ui}-access to a directory overrides the read-only-access on a single
   file.

@{b}@p:group1{,group2{,...}}@{ub}
   Make the file PRIVATE for the specified groups. Only the members of
   these groups can see this file, except for users that have a WRITE
   access to the directory that the file is stored in.

@{b}@@@{ub}
   Write a single '@'-character to the description at this point.

@{b}@n@{ub}
   Insert a new line to the description at this point.

@{b}@f@{ub}
   Make this file @{i}free@{ui}. Free files can be downloaded by all users if
   they have at least @{i}READ@{ui} access to the directory. Free files can be
   downloaded even by users without download access. You should make
   especially useful files, like virus scanners, off-line mail programs
   and the BBBS, free so that all users can download them immedately.

@{b}@ltruefile@{ub}
   The file is a link: the real file is stored at the directory pointed to
   by @{b}truefile@{ub}. The original file should still exist (use 0-byte files).
   Note that @{b}truefile@{ub} can also be a link to some other file. If you use a
   lot of links, remember to run @{"BLINKFIX" link SYS_CMDLINE_BLINKFIX} daily.

@{b}@adate@{ub}
   The date @{b}date@{ub} should be used as the file's date, specified in
   @{b}yymmdd@{ub}-format. This is used in description files referred to via
   a @{b}@1@{ub}-flag in the @{"filedirg" link CFG_FILE_FILEDIRS}-files.

@{b}@ssize@{ub}
   The file should be marked as @{b}size@{ub} bytes long, no matter what.
   This is also used with the @{b}@1@{ub}-flag.

There are two special files that can be used to format the directory list output. These files are "@{b}.@{ub}" and "@{b}..@{ub}". You can specify multiple entries for them. The description for the file "@{b}.@{ub}" is displayed in the directory list as-is, without the dot. Files before and after the "@{b}.@{ub}"-file are sorted separately by @{"BFILSORT" link SYS_CMDLINE_BFILSORT}. The description of the file "@{b}..@{ub}" is displayed right after user changes to this directory, and again, without the ".." prefix.

Example:

@{b}.. The current BBBS version is 3.33 How.@{ub}
@{b}.@{ub}
@{b}. The main files are:@{ub}
@{b}.@{ub}
@{b}bbbs_d.rar The BBBS executables for PC-DOS. @d223 @f@{ub}
@{b}bbbs_2.rar The BBBS executables for IBM OS/2. @d543 @f@{ub}
@{b}bbbs_gen.rar The shared parts of BBBS. @d666 @f@{ub}
@{b}.@{ub}
@{b}. Some other files:@{ub}
@{b}.@{ub}
@{b}bag.exe The AmigaGuide reader for PC-DOS. @d50 @f@{ub}
@{b}bbbshelp The BBBS help file in English. @d72 @f@{ub}
@endnode

@node CFG_EXTERNAL "Configuring external things: the external.bbb-file"
The @{b}external.bbb@{ub}-file is used to configure most things that can be considered "external". This includes @{"packers" link CFG_EXTERNAL_PACKERS}, @{"external protocols" link CFG_EXTERNAL_PROTOCOLS} and some @{"networking configuration" link CFG_EXTERNAL_NET}.

The @{b}external.bbb@{ub}-file is divided into @{i}sections@{ui}. A @{i}section@{ui} begins with the name of the section in brackets ('@{b}[@{ub}' and '@{b}]@{ub}' characters) and continues until another section starts. Like in all BBBS configuration files, empty lines and lines beginning with a semi-colon ('@{b};@{ub}') are ignored.

You can also implicitly force a certain section be used only if a certain version of BBBS is run. This can be accomplished by naming the section @{b}[section.os]@{ub}. @{b}os@{ub} can be any of the following, depending on the version of BBBS you wish to use those definitions with:

@{b}OS2@{ub}        BBBS/2, the OS/2 version.
@{b}NT@{ub}         BBBS/NT, the Windows NT version.
@{b}DOS@{ub}        BBBS/D, the PC-DOS version.
@{b}SUNOS@{ub}      BBBS/SUM and BBBS/SOS, the SunOS versions.
@{b}IRIX@{ub}       BBBS/IRX, the Irix version.
@{b}HPUX@{ub}       BBBS/HP, the HP-UX version.
@{b}ULTRIX@{ub}     BBBS/U, the Ultrix version.
@{b}SCO@{ub}        BBBS/SCO, the SCO UNIX version.
@{b}SOLARIS@{ub}    BBBS/SOL, the Solaris version.
@{b}UNIXWARE@{ub}   BBBS/UW, the UnixWare version.
@{b}LINUX@{ub}      BBBS/L, the 80386 Linux version.
@{b}FREEBSD@{ub}    BBBS/FBI, the 80386 FreeBSD version.

Note that the OS-specific sections (such as [af_pack.os2]) must be listed before "global" sections (such as [af_pack]), as BBBS will use the configurations from the first usable section it encounters.
@endnode


@node CFG_EXTERNAL_PACKERS "external.bbb: configuring packers"
The packers BBBS uses are configured in the @{b}external.bbb@{ub}-file, in four sections. In all sections one line defines one packer: line #1 for packer #1, line #2 for packer #2 and so on. For each packer, all sections must be defined. The character @{b}-@{ub} in any line means that packer is disabled.

The sections used are:

@{b}[af_ext]@{ub}

In this section, the extensions used by the packers are configured. The extensions specified here are also used to identify the packer used when the user information is listed in the user editor.

@{b}[af_ident]@{ub}

This section defines an unique "fingerprint" for each packer. You need to specify the @{i}offset@{ui} of the fingerprint (starting from 0) and of course the @{i}indent bytes@{ui}, in hexadecimal, separated with a comma. If the indent bytes are found from the specified offset in any file, then that file is assumed to be packed with the packer with the corresponding indent bytes.

@{b}[af_pack]@{ub}

This section specifies the OS command string used to pack a single file into an archive.

@{b}[af_unpack]@{ub}

This section specifies the OS command string used to unpack a file or a set of files from the packet to the current directory.

For the @{b}af_pack@{ub} and @{b}af_unpack@{ub} sections, you can use the standard @{"external.bbb meta characters" link CFG_EXTERNAL_META} to specify various things, like the name of the archive.

If you add or remove packers, you should also remember to edit the line 359 in your @{"bbbstxt" link CFG_BBBSTXT}-files to reflect your packer setup. Otherwise your users might select packers that are not available. In the bbbstxt-file, the packer names are separated with a slash ('@{b}/@{ub}'). To add a packer, simply write an appropriate name at the end of the list. If you want to disable a packer, then just remove the appropriate packer's name, but NOT the slash, unless you remove it also from your external.bbb.

@{i}Note!@{ui} In all command lines you should use the directory separator of your operating system!

@{b}Example:@{ub}

@{b}; Example of a single packer definition:@{ub}
@{b};@{ub}
@{b}[af_ext]@{ub}
@{b}zip@{ub}
@{b};@{ub}
@{b}[af_ident]@{ub}
@{b}00,504b@{ub}
@{b};@{ub}
@{b}[af_pack]@{ub}
@{b}c:\\bbs\\pack\\zip.exe -9 -j %p %F@{ub}
@{b};@{ub}
@{b}[af_unpack]@{ub}
@{b}c:\\bbs\\pack\\unzip.exe -j -o -C -s -q %p %f@{ub}
@endnode


@node CFG_EXTERNAL_PROTOCOLS  "external.bbb: configuring protocols"
The @{i}file transfer protocols@{ui} are configured in the @{b}external.bbb@{ub}-file. For each protocol, there are three sections that need to be configured. In each section, the first line is for protocol #1, the second line for protocol #2 and so on. The '@{b}-@{ub}' character in any line means that protocol is disabled. BBBS can also handle protocol numbers 1 to 9 internally, but you can use an external program for them too if you like.

The sections used are:

@{b}[t_name]@{ub}

This section simply defines the names of the protocols. The only place they are shown is the user editor to identify the used protocol.

@{b}[t_download]@{ub}

This section defines the OS command strings to launch the protocol to download (send to the remote user) a set of files, the names of which are in a specified file. The @{"meta-character" link CFG_EXTERNAL_META} '%f' can be used to insert the name of this list file.

@{b}[t_upload]@{ub}

This section defines the OS command strings to launch the protocol to upload (receive from the remote user) files into the current directory.

As with @{"packers" link CFG_EXTERNAL_PACKERS}, you can use the @{"external.bbb meta characters" link CFG_EXTERNAL_META} in the @{b}t_download@{ub} and @{b}t_upload@{ub}-sections.

If you add or remove protocols, you should also remember to edit the line 358 in your @{"bbbstxt" link CFG_BBBSTXT}-files to reflect your protocol setup. Otherwise your users might select protocols that are not available. In the bbbstxt-file, the protocol names are separated with a slash ('@{b}/@{ub}'). To add a protocol, simply write an appropriate name at the end of the list. If you want to disable a protocol, then just remove the appropriate protocol's name, but NOT the slash, unless you remove it also from your external.bbb.

@{i}Note!@{ui} In all command lines you should use the directory separator of your operating system!

@{b}Example:@{ub}

@{b}; An example to use the@{ub} @{i}GSZ@{ui} @{b}program instead of the internal ZModem:@{ub}
@{b};@{ub}
@{b}[t_name]@{ub}
@{b}ZModem@{ub}
@{b};@{ub}
@{b}[t_download]@{ub}
@{b}c:\\bbs\\prot\\gsz.exe portx %b,%i %h"handshake cts "sz @%f@{ub}
@{b};@{ub}
@{b}[t_upload]@{ub}
@{b}c:\\bbs\\prot\\gsz.exe portx %b,%i %h"handshake cts "rz@{ub}
@endnode


@node CFG_EXTERNAL_NET "external.bbb: Network configuration"
In the @{b}external.bbb@{ub}-file, there is also several sections related to @{i}FidoNet@{ui} technology networking configuration. They are:

   - @{"The nodelist section" link CFG_EXTERNAL_NET_NODELIST} (section @{b}nodelist@{ub})
   - @{"The FidoNet echomail area setup" link CFG_EXTERNAL_NET_ECHOMAIL} (section @{b}echomail@{ub})
   - @{"The FidoNet nodes setup" link CFG_EXTERNAL_NET_NODES} (section @{b}nodes@{ub})
   - @{"The file-echo configuration sections" link CFG_EXTERNAL_NET_TICK} (sections @{b}tick.adopt@{ub} and @{b}ticks@{ub})
   - @{"The node and NetMail remappers" link CFG_EXTERNAL_REMAP} (sections @{b}node_remap@{ub} and @{b}NetMail_remap@{ub})
   - @{"Badecho configuration for BCFG4" link CFG_EXTERNAL_badecho} (section @{b}badecho@{ub})

Also, an arcane @{b}AGNET/QWK@{ub}-style network can be used with BBBS. Setup for
such a network is done with the @{"external.bbb-section agnet" link CFG_EXTERNAL_NET_AGNET}.
@endnode


@node CFG_EXTERNAL_NET_NODELIST "external.bbb: The nodelist-section"
@{i}FidoNet@{ui} technology networks use @{i}nodelists@{ui} to work out the destinations of echomail messages. A @{i}nodelist@{ui} is a list of all (or some) systems in the network. In BBBS, the nodelists are listed in the @{b}external.bbb@{ub}-file, under the section @{b}nodelist@{ub}. Under this section all nodelists that @{"BNC" link SYS_CMDLINE_BNC} should compile are listed. After each name, an additional wildcard-specification for a @{i}nodediff@{ui} (used by @{"BNDIFF" link SYS_CMDLINE_BNDIFF}) can be specified. If the second parameter starts with an exclamation mark ('@{b}!@{ub}'), then the nodelist specified is @{i}replaced@{ui} by the file specified by the second parameter. An ampersand character ('@{b}&@{ub}') works like an exclamation mark, but the second parameter must specify a compressed list.

Remember that full nodelists should be uncompressed, whereas nodediffs should be in compressed form.

In all @{b}nodelist@{ub}-section entries @{"wildcards" link APP_WILDCARDS} are allowed.

@{b}Example:@{ub}

@{b}[nodelist]@{ub}
@{b}; A normal nodelist for foonet:@{ub}
@{b}c:/bbs/nodelist/foonet.list@{ub}
@{b}; lukki.lst in c:/bbs/nodelist is replaced by lukki.list in c:/inbound@{ub}
@{b}; when there is one...@{ub}
@{b}c:/bbs/nodelist/lukki.lst !c:/inbound/lukki.lst@{ub}
@{b}; barnet.list is replaced with the one from the compressed file barnet.zip@{ub}
@{b}; in c:/inbound when there is one...@{ub}
@{b}c:/bbs/nodelist/barnet.list &c:/inbound/barnet.zip@{ub}
@{b}; Assuming all nodediff.* files in c:/bbs/inbound/ are diffs for the nodelist@{ub}
@{b}; below...@{ub}
@{b}c:/bbs/nodelist/nodelist.* c:/bbs/inbound/nodediff.*@{ub}
@endnode


@node CFG_EXTERNAL_NET_ECHOMAIL "external.bbb: The echomail-section"
The @{i}FidoNet@{ui} network echomail areas are defined under the section @{b}echomail@{ub}, in the @{b}external.bbb@{ub}-file. This section is automatically updated by @{"BCFG4" link CFG_BCFG4} when it saves the conference configuration, but you can modify it also by hand if you like. Note that your 'NetMail' area should @{i}NOT@{ui} be added to this section.

The format of the @{b}echomail@{ub}-section is simple: one line defines one echomail area. A single entry consists of six fields, separated with spaces. The fields are (from left to right):

@{i}group@{ui}        A single character group ID for this echomail area. Any
             character can be used. Areas from different networks should be
             configured under a differing group ID. If you are running a
             @{i}host@{ui} or a @{i}hub@{ui}, the accesses of your downlinks are defined with
             these group IDs.

@{i}areatag @{ui}     The area tag for this echomail area. The echomail is
             distributed between systems under this name.

@{i}bbbs name@{ui}    The name of the conference to which messages to this echomail
             area should be written to. If the conference name has spaces,
             enclose the name in quotes. If you want to write them a
             conference with the same name as the areatag of this echomail
             area, use a single '@{b}-@{ub}' character here. A '@{b}!@{ub}' character in this
             field makes this area a passthrough area. For passthrough areas
             at least one add-aka should be defined (see below).

@{i}add akas@{ui}     The list of akas that should be added for this area. BOGUS also
             adds your default aka (defined in BCFG4) for this echomail area.
             Note that you can specify multiple akas here. You should @{i}not@{ui}
             write the same aka twice. For passthrough-areas at least one
             aka should be defined in this field.

@{i}flags@{ui}        Here you can specify one or more flags for this area. Just list
             the flags you want to activate one after another. If you don't
             want to use any flags, use the '@{b}-@{ub}' character only. Allowed
             flags are:

             @{b}S@{ub}  Secure: incoming mail to this area is accepted only if the
                the area's uplink is listed in the @{i}export list@{ui}.
                Whenever possible, use this flag.
             @{b}V@{ub}  Visible: area is visible in @{i}areafix@{ui} listings even to nodes
                who don't have access to it.
             @{b}D@{ub}  Don't perform any dupe checking for this area.

@{i}export @{ui}      The list of nodenumbers this echomail area should be exported
             to. You can list as many nodes as you like. You can use only
             net/node if the node is in the same zone as the previous node,
             or only node if zone:net is the same. If you add a '@{b}>@{ub}'-character
             in front of a nodenumber, then it is marked only for export. If
             you add a '@{b}<@{ub}'-character in front of a nodenumber, then it is
             marked only for import.

As with @{"tick file-echoes" link CFG_EXTERNAL_NET_TICK}, you can also specify add a description for the
echomail area after all fields by prefixing it with a slash ("@{b}/@{ub}") character.
If you don't specify a description here, then the one defined in BCFG4 is
used. This way you can add descriptions also for passthrough areas.

@{b}Example:@{ub}

@{b}[echomail]@{ub}
@{b}; An example echomail-section definition:@{ub}
@{b}; gr areatag        bbbs name           add akas    flags export@{ub}
@{b}; -- -------------- ------------------- ----------- ----- --------------@{ub}
@{b}B BBBS.ENGLISH      -                   -           S     47:1000/101@{ub}
@{b}G GENERAL           "MAIN BOARD"        40:765/151  S     40:765/765 49@{ub}
@{b}P TESTAREA          !                   40:765/151  S     40:765/765 49@{ub}
@endnode


@node CFG_EXTERNAL_NET_NODES "external.bbb: The nodes-section"
The nodes in a @{i}FidoNet@{ui} technology network you want to poll from or that poll you are defined under the section @{b}nodes@{ub} in the @{b}external.bbb@{ub}-file. The format of this section is simple: one line defines one node. In a single entry there are nine fields, separated with spaces. From left to right, the fields are:

@{i}node@{ui}        The FidoNet address of this node.

@{i}spass@{ui}       The session password that is used with BBBS's internal @{i}BackDoor@{ui}
            mailer. If you want to run a secure system, you must specify
            both mail session password and packet password for all nodes.

@{i}apass@{ui}       BRoboCop (areafix) requests from this node must have this
            password in the subject of the message.

@{i}ppass@{ui}       The "packet-password"; a password stored in outbound packets
            going to this node. This same password has to be also in inbound
            packets from this node to make sure the packets are really from
            that node.

@{i}tpass@{ui}       The password for @{"TICK files" link CFG_EXTERNAL_NET_TICK}.

@{i}gr@{ui}          The @{"echomail" link CFG_EXTERNAL_NET_ECHOMAIL} area groups that are available for this node for
            both reading and writing. Groups that are listed after the '@{b}!@{ub}'
            character, including the group '@{b}!@{ub}', can not be disconnected,
            only connected.

@{i}st@{ui}          Specifies the @{i}flags@{ui} for this node, as well as the status of
            outbound mail packets for this node. List the flags one after
            another or use the '@{b}-@{ub}' flag if the node is to have no flags
            and "normal" status (mail is transferred regardless of the
            poller). Normally the '@{b}-@{ub}' flag is used. Available flags are:

            @{b}C@{ub}  The mail packets for this node are automatically @{i}crashmail@{ui}.
            @{b}H@{ub}  The mail packets for this node are @{i}hold@{ui}: they are not
               polled anywhere. Instead, the node must pick up them.
            @{b}!@{ub}  Do not route NetMails directly to this node.
            @{b}B@{ub}  Do not use @{i}HYDRA@{ui} protocol with this node.
            @{b}R@{ub}  Do not use the @{i}EMSI@{ui} handshake with this node.
            @{b}X@{ub}  Do not use the @{i}xHYDRA@{ui} protocol with this node.
            @{b}D@{ub}  Do not use @{i}FTS-0001@{ui} handshake with this node.

@{i}pa@{ui}          Specifies the packer that should be used with this node. It
            should be a number, pointing to the appropriate @{"packer entry" link CFG_EXTERNAL_PACKERS} in
            the @{b}external.bbb@{ub}-file.

@{i}route@{ui}       The routings for this node. By default, @{"BOGUS" link SYS_CMDLINE_BOGUS} automatically
            routes all NetMail to this node directly to it. With this field
            you can specify more. You can list as many routings as you like.
            One routing can be either @{b}zone:*@{ub}, specifying all nodes in
            that zone, @{b}zone:net/*@{ub}, specifying all nodes in that net or
            even a complete 4D-address (@{b}zone:net/node.point@{ub}). Also, if you
            add an asterisk, '@{b}*@{ub}', in front of a routing, then @{b}BOGUS@{ub} will scan
            your nodelist for all downlinks of the hub or region specified
            and route also their mails via this node.


@{b}Example:@{ub}

@{b}; An example nodes-section:@{ub}
@{b};@{ub}
@{b}[nodes]@{ub}
@{b}; node      spass   apass   ppass   tpass gr  st pa route@{ub}
@{b}; --------- ------- ------- ------- ----- --- -- -- -------------------@{ub}
@{b}47:1000/101 privat  passw   -       fub   BCD H  3  47:* 27:47/* 2:20/0@{ub}
@{b}2:222/222   sesonly -       -       -     -   !  3@{ub}
@{b}2:222/0     boot    boot    boot    boot  BD  !  3@{ub}
@{b}2:222/70    boot    boot    boot    boot  C   -  3  1:* 2:* 3:* 4:* 5:* 6:*@{ub}
@{b}2:222/71    boot    -       boot    -     -   !  3@{ub}
@{b}; hub route:@{ub}
@{b}2:22/222    session foopass pktpass tick  B   C  3  *2:22/222@{ub}
@{b}; region route:@{ub}
@{b}2:222/69    example foopass packet  tick  B   C  3  *2:22/0@{ub}
@endnode


@node CFG_EXTERNAL_NET_TICK "external.bbb: FidoNet technology file-echo configuration"
@{i}Adopting files@{ui}

FidoNet technology @{b}TICK@{ub}-style file-echoes are configured with two sections in the @{b}external.bbb@{ub}-file: the @{b}tick.adopt@{ub} section defines the files @{"BTICK" link SYS_CMDLINE_BTICK} should generate a @{b}TICK@{ub} file for. For each file, three sequential lines under @{b}tick.adopt@{ub} should be listed. The first line should contain the @{b}TICK@{ub} areaname that should be used with the file. The second the file name, @{"wildcards" link APP_WILDCARDS} are allowed. Finally, the third line should contain a description for the file.

Please be careful with the @{b}tick.adopt@{ub}-section as there is no way to check who originally sent the file for you!


@{i}Defining TICK file-echoes@{ui}

The @{b}TICK@{ub} file-echo areas are defined under the @{b}ticks@{ub}-section. Under the @{b}ticks@{ub}-section, one line defines one file-echo. One entry consists of seven fields, separated with spaces. The fields are, from left to right:

@{i}gr@{ui}      A single character group ID for this tick area. Any character can be
        used as the group ID. Different types of file-echo areas and
        especially file-echo areas of different networks should be grouped
        under a differing group ID. If you are running a @{i}host@{ui} or a @{i}hub@{ui}, the
        file-echo area accesses of your downlinks are specified in the
        nodes-section with these group IDs, so be clear with them.

@{i}tag@{ui}     The name of this file-echo area.

@{i}path@{ui}    The directory to which incoming files for this area should be moved
        to. This directory must exist.

@{i}aka@{ui}     The nodenumber that should be used with this file-echo area.
        You can also list many akas.

@{i}afl@{ui}     The area @{i}flags@{ui} for this area, listed one after the another. You can
        use multiple flags. See below for export flags as you can use them
        in this field, too. You can also use the '-' flag to disable all
        flags, and usually you should. The available area flags are:

        @{b}V@{ub}  The area is visible for all nodes.
        @{b}Z@{ub}  @{b}file_id.diz@{ub} should not be used in this area.
        @{b}R@{ub}  Don't check CRC of the incoming file.
        @{b}!@{ub}  Passthrough, do not update @{"descript.ion-files" link CFG_FILE_DESCRIPTION} accordingly.
        @{b}A@{ub}  Append info to the announce message.

@{i}export@{ui}  The node numbers to which this file-echo area should be exported to.
        You can list as many node numbers as you like. You can also use one
        or more export flags in front of the node number. The available
        flags are:

        @{b}@@{ub}  This node is unlinked, no files should be sent to it.
        @{b}+@{ub}  Do not send a tick file to this node, just forward the file.
        @{b}<@{ub}  Accept files from this node, but do not send any.
        @{b}>@{ub}  Only send files to this node.
        @{b}H@{ub}  Mark files as @{i}hold@{ui}, so that the node in question must pick up
           them.
        @{b}C@{ub}  Mark files as @{i}crash@{ui}, so that you will poll them to the node.
        @{b}N@{ub}  Mark files as @{i}normal@{ui} (the default).

After these fields the slash character ("/") and the @{i}description@{ui} for the
file-echo can follow, but are not mandatory.

Note that the password used with tick-files is configured in the
@{"nodes-section" link CFG_EXTERNAL_NET_NODES} of external.bbb!

@{b}Examples:@{ub}

[tick.adopt]


@{b}[ticks]@{ub}
@{b}; gr tag   path         aka        afl export         desc@{ub}
@{b}; -- ----- ------------ ---------- --- -------------- -------------------@{ub}
@{b}A BBBS     d:/pub/bbbs/ 2:22/222   AH  <2:222/222 @42 /BBBS and utilities@{ub}
@{b}V LUKKI    d:/pub/txt/  40:765/151 HS  40:765/765     /LukkiVerkko@{ub}
@endnode


@node CFG_EXTERNAL_REMAP "external.bbb: The remapping features"
With BBBS it is also possible to @{i}remap@{ui} NetMail destinations and nodelist entries. The sections @{b}node_remap@{ub} and @{b}NetMail_remap@{ub} in the @{b}external.bbb@{ub}-file are used to accomplish these things.


@{i}[node_remap]@{ui}

The section @{b}node_remap@{ub} can be used to add or override a @{"nodelist" link CFG_EXTERNAL_NET_NODELIST} entry. This is useful for example points that need only one or few nodelist entries and not the whole nodelist. One line of @{b}node_remap@{ub}-section defines one remapping. The syntax of one node remap entry is:

@{b},4d_nodenumber,sitename,location,sysop,phonenumber,flags@{ub}

All fields should be self-explainatory. The phonenumber-field can have
multiple phone numbers, separated with colons ('@{b}:@{ub}'). When @{i}BackDoor@{ui} tries to
dial this system, one phone number is selected at random. Note that the
@{"phone number conversion in BCFG4" link bcfg432} is done to these phone numbers as well!

The flags-field is the @{"standard FidoNet flags" link bcfg405} that are active with this
system, separated with commas.

@{b}Example:@{ub}

@{b}[node_remap]@{ub}
@{b}; A Foobar-site with three phonenumbers that can be dialled:@{ub}
@{b}; Note that nodenumber is in 4D-format!@{ub}
@{b},12:34/5.0,Foobar-site,Foobar_City,Joe_Hacker,555-4242:555-6969:555-5555,300@{ub}


@{i}[NetMail_remap]@{ui}

The section @{b}NetMail_remap@{ub} can be used to override the sender, receiver and
their node numbers. One line under @{b}NetMail_remap@{ub}-section defines one
remapping. The syntax is @{b}original#new@{ub} where @{b}original@{ub} is a @{"regular expression" link APP_REGEXP}
matching the string in the following format:

@{b}sender,senders_4d_fidonet_address,receiver,receivers_4d_fidonet_address@{ub}

@{b}new@{ub} is the sender, receiver and FidoNet addresses the message should be
remapped to, in the same format. In @{b}new@{ub}, an empty field means that the
original value should be kept.

For example, if you specify the following under @{b}NetMail_remap@{ub}:

@{b}^.*,.*,dino-maintainer,2:22/222.666$#,,Kalle Soiha,2:22/222.0@{ub}

Then all NetMails to the user "dino-maintainer" at node 2:22/222.666 should
be directed to the user Kalle Soiha at node 2:22/222.

@{i}NOTE!@{ui} If you are not @{i}ABSOLUTELY SURE@{ui} that you know what you are doing, do
@{i}NOT@{ui} use @{b}NetMail_remap@{ub}. It can do you more harm than good and the results
will very likely not be what you want.
@endnode

@node CFG_EXTERNAL_NET_AGNET "external.bbb: AGNET/QWK-style network configuration"
BBBS also supports the very arcane @{b}AGNET/QWK@{ub} style of networking, in
which the off-line @{b}QWK@{ub} and @{b}REP@{ub}-packets are transferred to and from BBS's
according to certain rules. To set up this kind of network in BBBS, the
section @{b}agnet@{ub} in external.bbb is used. Under this section, each line defines
one remote system and/or user name, in the following format:

@{b}name,areafile,suffix,route_regexp@{ub}

@{b}name@{ub} is the name of the AGNET-user that should execute the polling. The
@{b}areafile@{ub}-parameter should be the name of the file remapping the QWK
numbers to local area names, see below for more information. @{b}suffix@{ub} should
be the AGNET suffix that should be used for this system. @{b}route_regexp@{ub}
should be a regular expression matching the systems that mail should be
routed to.

For example:

@{b}BCG BOX,agareas,\@BCG,\@@{ub}

This will make the AGNET username into "BCG BOX". Users writing messages
from this system will be, for example "Joe Hacker@BCG". Also, all incoming
AGNET mail to this system will be routed.

In the file specified by the @{b}areafile@{ub}-parameter, the QWK index numbers
should be matched against the correct local conferences. In the file,
one line defines one conference in @{b}qwk_number,local_name@{ub}-style format.

For example:

@{b}15,Net.Chat@{ub}
@{b}16,Net.Computers@{ub}
@{b}17,Net.BBBS@{ub}
@{b}...@{ub}

It is highly recommended that you do not use AGNET networking unless there
really is need for it, as the FidoNet style of networking is much more
advanced.
@endnode

@node CFG_EXTERNAL_BADECHO "external.bbb: The badecho settings for BCFG4"
@{"BCFG4" link CFG_BCFG4} can autocreate conferences for such echomail areas that have inbound
mail, but have no conference configured. This can be accomplished by
running the BCFG4 program with the "@{b}bad@{ub}"-parameter.

The @{b}badecho@{ub}-section can be used to control the behavior of the automatic
conference creator of BCFG4. If the badecho-section exists, then only
the areas matching the criterias defined in the section will be created.
Remember also that you @{i}must@{ui} have at least one "unnamed" conference in your
conference configuration or no conferences are added.

Note that when you define badecho-entries and run BCFG4 with the "bad"
parameter, your @{"echomail-section" link CFG_EXTERNAL_NET_ECHOMAIL} in external.bbb will be updated
automatically, along with the conference configuration in BCFG4.

In the badecho-section, one line defines one criteria in the following
format (items in curly brackets are optional):

@{b}uplink area {aka_list} {in_char out_char origin} group {area_prefix} export@{ub}

@{i}uplink@{ui} is the nodenumber of your uplink the echomail area must originate.

@{i}area@{ui} is a @{"regular expression" link APP_REGEXP} matching the names of the areas that
can be created.

@{i}aka_list@{ui} is a list of your akas that should be added to the messages in
this echomail area. The first aka is used in BCFG4, the rest in the @{b}echomail@{ub}-
section of external.bbb.

@{i}in_char@{ui} is the name of the character set that should be used when importing
messages.

@{i}out_char@{ui} is the name of the character set that should be used when exporting
messages. This must be specified if you have specified also the @{b}in_char@{ub}-
field.

@{i}origin@{ui} is the number of the origin line that should be used on the area.
This must be given if you have specified inbound and outbound character sets.

@{i}group@{ui} is the single character group ID that should be applied to the area.
If the group is '@{b}-@{ub}', then the area will @{b}NOT@{ub} be created.

@{i}area_prefix@{ui} is the prefix that should be applied to the area name. If there
is a '@{b}!@{ub}' character in the prefix, then the area will be created as a
@{b}passthrough@{ub} area.

@{i}export@{ui} is a list of akas that the area should be exported to. The uplink
is automatically added to this list, so you do not need to list it.


@{b}Example:@{ub}

@{b}[badecho]@{ub}
@{b}; For areas that originate from 2:210/27: do not generate areas starting@{ub}
@{b}; with the string "BBBS". Generate all the rest, with the aka 2:222/0,@{ub}
@{b}; origin line 0, group F, prefix "INT.". Export the area to 2:22/10 and@{ub}
@{b}; 2:222/151.666:@{ub}
@{b};@{ub}
@{b}2:210/27 ^BBBS -@{ub}
@{b}2:210/27 . 2:222/0 IBM IBM 0 F INT. 2:22/10 2:222/151.666@{ub}
@{b};@{ub}
@{b}; All areas originating from 2:22/222, beginning with "FOO" should be@{ub}
@{b}; created as passthrough areas, export them to 2:22/10:@{ub}
@{b};@{ub}
@{b}2:22/222 ^FOO P ! 2:22/10@{ub}
@{b};@{ub}
@{b}; For all areas from 2:22/222, beginning with "BAR" use the akas 50:123/5@{ub}
@{b}; and 69:100/12, export to 2:222/151.666, using origin line 5:@{ub}
@{b};@{ub}
@{b}2:22/222 ^BAR 50:123/5 69:100/12 IBM IBM 5 B 2:222/151.666@{ub}
@{b};@{ub}
@{b}; For all areas from 2:22/222, beginning with "BUZ" use the akas 50:123/5@{ub}
@{b}; and 69:100/12, export to 2:222/151.666, using origin line 0 and the ISO@{ub}
@{b}; charset for inbound messages, and the MAC charset for outbound:@{ub}
@{b};@{ub}
@{b}2:22/222 ^BUZ 50:123/5 69:100/12 ISO MAC 0 Z 2:222/151.666@{ub}
@endnode

@node CFG_EXTERNAL_META "The meta characters in external.bbb-file"
You can use following meta chars when configuring packers and protocols in
the @{b}external.bbb@{ub}-file. They are replaced with corresponding string or number.

        @{b}%e@{ub}              Character 27, ESC, ^[.
        @{b}%r@{ub}              Character 13, CR, ^M.
        @{b}%%@{ub}              Character 37, "%".
        @{b}%p@{ub}              Packet name to/from which files should be (un)packed.
        @{b}%f@{ub}              File that should be sent/received or file to be
                        (un)packed to/from a packet.
        @{b}%F@{ub}              Filename (@{b}%f@{ub}), but with "*.*" converted to "*".
        @{b}%d@{ub}              Filename (@{b}%f@{ub}) without its path.
        @{b}%D@{ub}              Filename (@{b}%d@{ub}), but with "*.* "converted to "*".
        @{b}%c@{ub}              In PC-DOS, OS/2 and NT-versions this is the
                        value of either COMSPEC or SHELL variables, checked
                        in that order. If neither is defined, then it will be
                        "c:\\os2\\cmd.exe" (under OS/2) or "c:\\command.com".
                        Under UNIX versions, the order is SHELL, COMSPEC.
                        If neither is defined, then "/bin/sh" is used.
        @{b}%n@{ub}              Value of the "cfgl.newdir" (@{"bl_newdir" link bz_var_bl_newdir}) variable.
        @{b}%N@{ub}              User's name.
        @{b}%L@{ub}              The current node number.
        @{b}%o@{ub}              Comport number.
        @{b}%b@{ub}              Comport base address (in hex).
        @{b}%i@{ub}              Comport IRQ.
        @{b}%s@{ub}              Comport real baud rate.
        @{b}%l@{ub}              Comport baud rate.
        @{b}%a@{ub}              Comport handle.
        @{b}%A@{ub}              Comport device.
        @{b}%h"text"@{ub}        If RTS/CTS handshake is enabled, text "text",
                        otherwise nothing.
@endnode

@node CFG_ALIAS "Configuring BBBS groupmail functions: the alias.bbb-file"
The file @{b}alias.bbb@{ub} is used for two purposes. Firstly, you can create
@{i}mailing lists@{ui} so that you can easily send the same message to multiple
receivers. The format of a mailing list entry in @{b}alias.bbb@{ub} is as
follows:

@{b}listname:fidonet_number1, user_name1,@{ub}
         @{b}fidonet_number2, user_name2,@{ub}
         @{b}fidonet_number3, user_name3@{ub}
         @{b}...@{ub}

Everything should be typed on a single line in the @{b}alias.bbb@{ub}-file. You
can also create aliases for users in this way: just create a mailing
list with just one user. For email-aliases, the FidoNet number should be
your own FidoNet number.

The second purpose of @{b}alias.bbb@{ub} is to define the receivers for @{i}comments@{ui}
users write with the global command "@{i}com@{ui}". They are defined in a very
similar manner to mailing lists; to define a comment receiver, use the
string @{b}COM_*@{ub} as the mailing list name. Replace @{b}*@{ub} with the corresponding
key the user should press when asked for a comment receiver. After the colon,
you should write the user name or mailing list that the comment should be
sent to. If the first character after the colon is a '@{b}<@{ub}'-character, then
the file specified after the '<' is shown when the choice is selected.

When you define comment receivers, remember also to correctly list the
comment receivers in the @{b}precom@{ub}-file in the @{"menus-directory" link CFG_FILES_MENUS}.

@{b}Example:@{ub}

@{b}; An example alias.bbb-file@{ub}
@{b}; This one defines aliases 'B' and 'Z' for the users Kim Heino and@{ub}
@{b}; Tapani Salmi at FidoNet address 2:22/222, a mailinglist called BZ,@{ub}
@{b}; including the same users and three comment receivers:@{ub}
@{b};@{ub}
@{b}B: 2:22/222, Kim Heino@{ub}
@{b}Z: 2:22/222, Tapani Salmi@{ub}
@{b}BZ: 2:22/222, Kim Heino, 2:22/222, Tapani Salmi@{ub}
@{b}COM_B:Kim Heino@{ub}
@{b}COM_Z:bz@{ub}
@{b}COM_F:<c:/bbs/menus/access@{ub}
@endnode

@node CFG_INET "Configuring Internet access in BBBS: the inet.bbb-file"
All Internet access is configured in the file @{b}inet.bbb@{ub}. Like the
@{"external.bbb-file" link CFG_EXTERNAL}, it is divided into different sections. The sections
used are:

@{b}[telnet]@{ub}
@{b}[finger]@{ub}
@{b}[rlogin]@{ub}
@{b}[hunt]@{ub}
@{b}[ftp]@{ub}

These five sections are used to configure the limitations for outgoing
connections. The @{b}telnet@{ub}-section is used for limitations concerning
outgoing @{i}telnet@{ui}-targets, the @{b}finger@{ub}-section for @{i}finger@{ui} targets and so
on. Connections can only be made to the destinations specified in the
appropriate @{b}inet.bbb@{ub}-section. The syntax for an entry is:

@{b}destination:group1{,group2{,group3...}}@{ub}

Before any user can use any Internet services, he must first be a member
of the @{"group" link CFG_GROUPS} with the name of the service: the group @{b}telnet@{ub} for @{i}telnet@{ui}-
connections, the group @{b}ftp@{ub} for @{i}ftp@{ui}-connections and so on. Also, the
user's destination must be listed in that service's @{b}inet.bbb@{ub}-section,
and be a member of one of the groups defined for that destination.

Only the @{"groups" link CFG_GROUPS} listed can use the service specified in the section,
and only to targets matching the @{"regular expression" link APP_REGEXP} @{b}destination@{ub}.

For example, to allow only members of the group @{b}blood_men@{ub} to make an
@{i}ftp@{ui} connection to the site @{b}ftp.pirasat.org@{ub}, but allow everyone to ftp
into sites with the @{b}.fi@{ub} domain suffix, you would write into @{b}inet.bbb@{ub}:

@{b}[ftp]@{ub}
@{b}^ftp\\.pirasat\\.org$:blood_men@{ub}
@{b}\\.fi$:all@{ub}

@{b}[aka]@{ub}

This section is used to define shortcuts for destinations for other
Internet services. The syntax is simple:

@{b}alias1:real1@{ub}
@{b}alias2:real2@{ub}
@{b}...@{ub}

For example, the definition @{b}b:Kim.Heino@utu.fi@{ub} would mean that the
simple destination @{b}b@{ub} would be expanded into @{b}Kim.Heino@utu.fi@{ub}.

@{b}[aliasout]@{ub}

This section is used to define outgoing Internet-aliases for @{"SMTP" link SYS_CMDLINE_BSMTP} and
@{"NNTP" link SYS_CMDLINE_BNNTP} mail transfer and @{"BOGUS" link SYS_CMDLINE_BOGUS} import, when the gating option is enabled.
The syntax is:

@{b}inet-address:original@{ub}
@{b}@domain:@original@{ub}

The first form is used to alias one local or remote user to a different
inet-name. The second is used to alias a whole domain to a different
name. The @{"remote domain" link bcfg3010} from @{"BCFG4" link CFG_BCFG4} is implied before checking for
the entries in the aliasout-section.

An example:

@{b}; To define the address "b@fix.no" be an alias for the local user@{ub}
@{b}; "Kim Heino":@{ub}
@{b}b@fix.no:Kim Heino@{ub}
@{b}; To direct all mail going to domain bcgbox.bbbs.eu.org to@{ub}
@{b}; p0.f222.n22.z2.fidonet.org:@{ub}
@{b}@bcgbox.bbbs.eu.org:@p0.f222.n22.z2.fidonet.org@{ub}

@{b}[aliasin]@{ub}

The @{b}aliasin@{ub}-section works like the @{b}aliasout@{ub}-section, but defines
incoming Internet-aliases. For example:

@{b}; To define all mail sent to postmaster@fix.no to end up to the user@{ub}
@{b}; Torfinn Nome:@{ub}
@{b}postmaster@fix.no:Torfinn Nome@{ub}
@{b}; To alias the whole domain bcgbox.bbbs.eu.org:@{ub}
@{b}@bcgbox.bbbs.eu.org:@p0.f222.n22.z2.fidonet.org@{ub}

@{b}[fingerin]@{ub}

This section is used by the BBBS finger program, @{b}bbbs.fingerd.exe@{ub}. In
it the remote @{i}finger@{ui} shortcuts are defined. The syntax is simple:

@{b}name:user name@{ub}
@{b}name:<filename@{ub}

The first form is a normal user alias, the second one can be used to
show any text file to the person fingering the name.

An example:

@{b}; To make fingering of the user "B" to display the info of Kim Heino:@{ub}
@{b}b:Kim Heino@{ub}
@{b}; To display the file "c:/manual" to the person fingering the@{ub}
@{b}; user "rtfm":@{ub}
@{b}rtfm:<c:/manual@{ub}

@{b}[listin]@{ub}

This section can be used to allow remote users send email directly to
a conference. The syntax is:

@{b}aliasfrom,aliasto:conference@{ub}

All mail sent to @{b}aliasto@{ub} by @{b}aliasfrom@{ub} will be written to the conference
named @{b}conference@{ub}. Either of the fields can be empty, so just the other
field is checked. For example, to write all mail sent to @{b}bbbs-list@fix.no@{ub}
to the conference @{b}BBBS.Chat@{ub}, you would write:

@{b},bbbs-list@fix.no:bbbs.chat@{ub}

And, to write all mail coming from @{b}listserv@foo.edu@{ub} to the conference
@{b}foolist@{ub}, you would write:

@{b}listserv@foo.edu,:foolist@{ub}

These aliases are used when incoming SMTP messages are received and after
the aliases in the @{b}aliasin@{ub}-section have been processed. Remember that
both aliases have to be full Internet addresses!

@{b}[bounce_from]@{ub}
@{b}[bounce_to]@{ub}

These two sections define the addresses that mail from/to should be bounced
back to the sender. Under both sections, one entry can be either a full
Internet address or just @domain. For example, to bounce all mail from
@{b}coolcorp.com@{ub} and all mail sent to @{b}nomail@mysite.net@{ub}, you would
write into inet.bbb:

@{b}[bounce_from]@{ub}
@{b}@coolcorp.com@{ub}

@{b}[bounce_to]@{ub}
@{b}nomail@mysite.net@{ub}
@endnode


@node CFG_CHAT "Configuring the BBBS Chat System"
BBBS has a very powerful, @{"channel" link CFG_CHAT_CHANNELS}-based chat system with @{"feelings" link CFG_CHAT_FEELINGS},
familiar from conversation systems like @{i}IRC@{ui} and different @{i}MUD@{ui}s.
Basically, chat channels are "discussion rooms". In every channel there
can be a number of users chatting at the same time. All messages that
are sent to a channel by a person are seen by all other members of the
channel the message was sent to.

The channels can be either @{i}static@{ui} or @{i}temporary@{ui}. Static channels always
exist, even if there aren't be any members on them. Temporary channels
exist only as long as they have members. Static channels are defined in
the file @{b}channels.bbb@{ub}, residing in the feelings-directory specified in
@{"BCFG4" link CFG_BCFG4}. Definitions for temporary channels reside in the file @{b}channel2.bbb@{ub},
but you needn't worry about it, as BBBS will automatically update it when
necessary.
@endnode


@node CFG_CHAT_CHANNELS "Configuring chat channels"
Each line of the @{b}channels.bbb@{ub}-file defines one static channel, in the
following format:

@{b}#channel_name channel_description@{ub}

All channel names begin with the '@{b}#@{ub}'-character. The description should
be a simple description of the topic or topics that should be discussed in
the channel. In the description, you can use some @{i}flags@{ui} to define the
behavior of the channel:

@{b}+a@{ub}       Make the channel @{i}auto-invite@{ui}. All users are automatically
         made members of a channel with this flag.
@{b}+igroup@{ub}  Make the channel inaccessible to all but members of the @{"group" link CFG_GROUPS}
         @{b}group@{ub}.
@{b}+ogroup@{ub}  The group @{b}group@{ub} is given @{i}channel operator@{ui} access to this
         channel. Channel operators can use the @{b}/kick@{ub} command to
         remove unwanted users from a channel and change the topic of
         channels that don't have a static topic.
@{b}+t@{ub}       The topic of the channel is "locked" and can only be changed
         by channel operators. You don't need to specify this flag for
         static channels, as topic is always locked for them.

For example:
@{b}#chat +osysops +a General public chat@{ub}
@{b}#simka +isimka Private simka channel@{ub}

The @{i}bans@{ui} for different channels are defined in the file @{b}banned.bbb@{ub} in
the feelings directory. The format of this file is simple: one line
defines one ban in the following format:

@{b}#channel_name:user_name@{ub}

So, for example, to ban the user "Samuli Suominen" from the channel
#vanessa_rulez, you would write into @{b}banned.bbb@{ub}:

@{b}#vanessa_rulez:Samuli Suominen@{ub}

You can also have word bans for different channels. These are specified in
the file @{b}wordban.bbb@{ub}. In this file, each line is a @{"regular expression" link APP_REGEXP} that
defines one word ban. Every time a user sends a chat message to a channel, a
string in the form @{b}#channel:message@{ub} is created, with @{b}channel@{ub} being the
channel the message is sent to and @{b}message@{ub} the actual message. The string is
then matched against all the definitions in the @{b}wordban.bbb@{ub}-file. If any of
the expressions in the file match the string, then the user sending the
message is automatically banned from the channel the message was sent to.

For example, specifying @{b}^#chat:Call.*BBS@{ub} in @{b}wordban.bbb@{ub} would autoban
everybody sending a message starting with "Call" and containing the string
"BBS" to channel @{b}#chat@{ub}.
@endnode


@node CFG_CHAT_FEELINGS "Configuring chat feelings"
The BBBS chat has also the possibility to use various @{i}feelings@{ui},
familiar from different @{i}MUD@{ui}s. They can be used to give some "flavor"
to the chat. There are a @{b}lot@{ub} of feelings in the BBBS
distribution package, but you might want to create your own as
well. The feelings are contained in data files in the
feelings-directory specified in @{"BCFG4" link CFG_BCFG4}. They are sorted into files by
their first character, so that the feeling @{b}abduct@{ub} is in the file
@{b}a.dat@{ub}, the feeling @{b}teleport@{ub} in @{b}t.dat@{ub}, and so on. Note that the data
files are case sensitive!

There are three types of feelings: ones that require a @{i}focus@{ui} (another
user) for them to be used, ones that work without a focus and ones
that can be used either with or without a focus. They are defined with
the @{i}keywords@{ui} @{b}wfocus@{ub}, @{b}wofocus@{ub} and @{b}wwofocus@{ub}, respectively.

In the data files, the feelings are listed in blocks. Each block
begins with a @{i}keyword@{ui}, specifying what kind of a feeling will be
defined next. Then a colon and the name that should be used to
activate this feeling. In the name, the necessary part should written
in upper case. That is, if you define a feeling called @{b}REMind@{ub}, then it
can be typed by writing just "rem". The feeling definition block
consists of a starting curly bracket '@{b}\{@{ub}', one or more @{i}sockets@{ui} and a
closing curly bracket '@{b}\}@{ub}'. Note that there has to be at least one
space before the closing bracket. Empty lines are ignored, as well as
lines beginning with the pipe character '@{b}|@{ub}'.

There are many @{i}sockets@{ui} that can be used. Which ones are required vary
with the type of the feeling. The generally required sockets are the
@{b}message@{ub} sockets:

@{b}selfwf:@{ub} Message displayed to the person emitting the feeling, with
        focused feeling.
@{b}allwf:@{ub}  Message displayed to all, except the person emitting the
        feeling and the focus, with focused feeling.
@{b}focus:@{ub}  Message displayed to the focus.
@{b}selfof:@{ub} Message displayed to the person emitting the feeling, without
        focus.
@{b}allof:@{ub}  Message displayed to all, except the person emitting the
        feeling, without focus.

The @{b}message@{ub} sockets contain the actual feeling message to be
displayed. It can be up to 250 characters long and it will be
wordwrapped automatically when printed to screen. You can use ansi-codes
in the message to override the @{b}color@{ub}-socket (see below), but it will
screw up the wordwrapping.

Following variables can be used in the message string:

@{b}Var   Expands to:@{ub}
@{b}=========================================================================@{ub}
@{b}$N@{ub}    The nick of the user emitting the feeling.
@{b}$F@{ub}    The nick of the focus.
@{b}$A@{ub}    The @{i}grade@{ui} of the feeling. See below for more about
      grades. This should follow the verb to get "correct" English.
@{b}$B@{ub}    The @{i}extension@{ui} of the feeling. This should normally be at the end
      of the feeling.

The following depend on the user's sex:

@{b}$G @{ub}   "his" or "her"
@{b}$P@{ub}    "him" or "her"
@{b}$E@{ub}    "he" or "she"

In lower case (@{b}$g@{ub}, @{b}$p@{ub}, @{b}$e@{ub}), they depend on the focus' sex.

Other sockets that are not required in any feelings, but can still be
defined, are:

@{b}author:@{ub}    Name of the person who added this feeling.
@{b}classes:@{ub}   The classes this feeling belongs to, see below for a list.
@{b}color:@{ub}     The default color of this feeling: yellow, green, blue,
           red, cyan or white. First letter is sufficient.
@{b}ext:@{ub}       The default @{i}extension@{ui} of this feeling.
@{b}grade:@{ub}     The default @{i}grade@{ui} of this feeling. See below for more on
           grades.
@{b}group:@{ub}     A @{"regexp" link APP_REGEXP} groupname, defaults to "all". Only members of the
           @{"group" link CFG_GROUPS} specified here can use this feeling.
@{b}karma:@{ub}     "Karma" value of this feeling, from -10 (very evil) to +10.
@{b}standing:@{ub}  The political value of this feeling from -10 (extreme left)
           to +10 (extreme right).

List of feeling @{i}classes@{ui}:

@{b}affectionate@{ub}       (compassionate)
@{b}aggressive@{ub}
@{b}audible@{ub}            (generates sound)
@{b}burgeois@{ub}           (capitalistic)
@{b}friendly@{ub}
@{b}funny@{ub}
@{b}inferior@{ub}           (the user of the feeling is inferior to others)
@{b}malignant@{ub}          (evil, in other words)
@{b}negative@{ub}
@{b}positive@{ub}
@{b}red@{ub}                (communist, remember also the @{b}standing@{ub}-socket)
@{b}superior@{ub}           (the user of the feeling is superior to others)
@{b}tactile@{ub}            (physical, touching)
@{b}vulgar@{ub}
@{b}white@{ub}              (monarchist or bourgoise, remember also "standing")


@{b}Grades@{ub}

The @{i}grade@{ui} of the feeling describes manner in which the feeling is
executed. Such as @{b}shamelessly@{ub}, @{b}gracefully@{ub} etc. The users can add
any grade they like to a feeling, but you can specify shortcuts for
grades in the @{b}*.gra@{ub}-files in the feelings-directory. Like the feeling
data files, the grades are separated into files by their first letter:
@{b}shamelessly@{ub} goes into @{b}s.gra@{ub}, @{b}gracefully@{ub} into @{b}g.gra@{ub} and so on.

The syntax of grade files is simple, first the name of the grade (with
the necessary part written in upper case), then a colon and then what
it should be expanded to. See below for an example.


@{b}Examples:@{ub}

@{b}| Some example feelings.@{ub}
@{b}|@{ub}
@{b}wfocus: ABDuct@{ub}
@{b}  {@{ub}
@{b}    selfwf: You $A abduct $F $B.@{ub}
@{b}    allwf: $N $A abducts $F $B.@{ub}
@{b}    focus: $N $A abducts you $B.@{ub}
@{b}    grade: shame@{ub}
@{b}    group: sysops@{ub}
@{b}    karma: -3@{ub}
@{b}  }@{ub}

@{b}wwofocus: AGRee@{ub}
@{b}  {@{ub}
@{b}    selfof: You $A agree $B.@{ub}
@{b}    allof: $N $A agrees $B.@{ub}
@{b}    selfwf: You agree $A with $F $B.@{ub}
@{b}    allwf: $N agrees $A with $F $B.@{ub}
@{b}    focus: $N agrees $A with you $B.@{ub}
@{b}    grade: whole | wholeheartedly...@{ub}
@{b}  }@{ub}

@{b}wofocus: BLInk@{ub}
@{b}  {@{ub}
@{b}    selfof: You $A blink $B.@{ub}
@{b}    allof: $N $A blinks $B.@{ub}
@{b}  }@{ub}


@{b}| An example f.gra:@{ub}
@{b}|@{ub}
@{b}FATherly:in a fatherly manner@{ub}
@{b}FAIthfully:faithfully@{ub}
@{b}FOOlishly:foolishly@{ub}
@{b}FRUstration:in frustration@{ub}
@{b}FONdly:fondly@{ub}
@{b}FEVerently:feverently@{ub}
@{b}FINally:finally@{ub}
@endnode

@node cfg_colors "Setting up the color palette: the COLORS.BBB-file"
The @{i}color schemes@{ui} for the @{i}u pal@{ui}-command are set up in the @{b}colors.bbb@{ub}-file in
the BBS-directory. In addition to the schemes defined here, users can create
their own customized schemes with the @{i}palette editor@{ui}.

The syntax of the file is simple: first the scheme name, then a colon and
then 52 characters defining the colors to be used. The characters represent
different items as follows:

@{b}Position@{ub} @{b}Defines the color of...@{ub}
@{b}==========================================================================@{ub}
   @{b}1.@{ub}    normal text in the message header.
   @{b}2.@{ub}    user names in the message header.
   @{b}3.@{ub}    subject lines in the message header.
   @{b}4.@{ub}    normal text in messages.
   @{b}5.@{ub}    quoted text in messages.
   @{b}6.@{ub}    double-quoted text in messages.
   @{b}7.@{ub}    net information (origin/tear/kludge lines) in messages.
   @{b}8.@{ub}    the directory line in file listing.
   @{b}9.@{ub}    the topmost header lines in file listing.
  @{b}10.@{ub}    sub-directories in file listing.
  @{b}11.@{ub}    normal files in file listing.
  @{b}12.@{ub}    free files in file listing.
  @{b}13.@{ub}    file links in file listing.
  @{b}14.@{ub}    the first line of the file description in file listing.
  @{b}15.@{ub}    the rest of the file description lines.
  @{b}16.@{ub}    the numeric data (amount of downloads etc.) in file listing.
  @{b}17.@{ub}    chat messages sent by the user him/herself.
  @{b}18.@{ub}    incoming public chat messages.
  @{b}19.@{ub}    incoming private messages.
  @{b}20.@{ub}    informative messages (login/logout, entered message...) in chat.
  @{b}21.@{ub}    the chat prefix string (the string displayed before the message).
  @{b}22.@{ub}    incoming public chat messages addressed to the user.
  @{b}23.@{ub}    the header help lines in "Join"-command.
  @{b}24.@{ub}    the highlighted characters in "Join"-command.
  @{b}25.@{ub}    a selected option in "Join"-command.
  @{b}26.@{ub}    an unselected option in "Join"-command.
  @{b}27.@{ub}    local public area names in "Join"-command.
  @{b}28.@{ub}    public network area names in "Join"-command.
  @{b}29.@{ub}    local private area names in "Join"-command.
  @{b}30.@{ub}    network mail area names in "Join"-command.
  @{b}31.@{ub}    area descriptions in "Join"-command.
  @{b}32.@{ub}    header lines in "SHow"-command.
  @{b}33.@{ub}    total separator line in "SHow"-command.
  @{b}34.@{ub}    conference names in "SHow"-command.
  @{b}35.@{ub}    numeric information in "SHow"-command.
  @{b}36.@{ub}    number specifying the amount of personal messages in "SHow".
  @{b}37.@{ub}    user info display header.
  @{b}38.@{ub}    user info display texts.
  @{b}39.@{ub}    user info display numeric information.
  @{b}40.@{ub}    header of "Who"-display.
  @{b}41.@{ub}    nodenumber for active nodes in "Who".
  @{b}42.@{ub}    nodenumber for inactive nodes in "Who".
  @{b}43.@{ub}    speed for active nodes in "Who".
  @{b}44.@{ub}    speed for inactive nodes in "Who".
  @{b}45.@{ub}    status text for active nodes in "Who".
  @{b}46.@{ub}    status text for inactive nodes in "Who".
  @{b}47.@{ub}    "when" time for active nodes in "Who".
  @{b}48.@{ub}    "when" time for inactive nodes in "Who".
  @{b}49.@{ub}    nickname for active nodes in "Who".
  @{b}50.@{ub}    nickname for inactive nodes in "Who".
  @{b}51.@{ub}    name of the caller for active nodes in "Who".
  @{b}52.@{ub}    name of the caller for inactive nodes in "Who".

The character can be a number (0-9) or a letter from a to f. The characters
represent different ANSI attributes as follows:

  @{b}Char@{ub}   @{b}Color@{ub}
@{b}================================@{ub}
   @{b}0@{ub}     Black
   @{b}1@{ub}     Red
   @{b}2@{ub}     Green
   @{b}3@{ub}     Yellow
   @{b}4@{ub}     Blue
   @{b}5@{ub}     Magenta
   @{b}6@{ub}     Cyan
   @{b}7@{ub}     White
   @{b}8@{ub}     Black with bold
   @{b}9@{ub}     Red with bold
   @{b}a@{ub}     Green with bold
   @{b}b@{ub}     Yellow with bold
   @{b}c@{ub}     Blue with bold
   @{b}d@{ub}     Magenta with bold
   @{b}e@{ub}     Cyan with bold
   @{b}f@{ub}     White with bold
@endnode

@node CFG_BBBSTXT "bbbstxt-files: language configuration"
With BBBS, it is possible to use up to ten different language configurations.
The language configuration is done with the @{b}bbbstxt@{ub}-files in the BBS root
directory. The extension of the file specifies the language number it
describes. An extensionless bbbstxt-file contains the "default" language,
usually English. With the distribution package, four languages are supplied:
English (@{b}bbbstxt@{ub}), Finnish (@{b}bbbstxt1@{ub}), Swedish (@{b}bbbstxt2@{ub})
and Norwegian (@{b}bbbstxt3@{ub}).

To edit the supplied languages or create new ones, you can use your
favorite ASCII-editor. Each bbbstxt-file should contain 713 lines. Each
line describes one string that is displayed somewhere in the system.
These are (of course) the same in every bbbstxt-file. When the strings
are displayed should be pretty self-explainatory.

When you are editing the bbbstxt-files, note that the lines should always
contain the original amount of @{i}modifiers@{ui}, characters prefixed with a
percent sign ('@{b}%@{ub}'). The modifies are familiar from the C-language,
so that '@{b}%u@{ub}' specifies a number, '@{b}%s@{ub}' a string and so on.

The bbbstxt-files also contain the names of the commands for the different
menus. If you want to, for example, use the @{b}error@{ub}-script to replace a
command, then you should remove the original command from all your
bbbstxt-files. The error.bz-script that came with the distribution package
also offers an easier way to create new commands and replace old ones,
the @{b}commands.bbb@{ub}-file. See the example script for more details about it.

Remember that if you really want to have multiple languages, you should
code also your scripts so that they support all your languages!
@endnode

@node cfg_files "An overview of the files BBBS uses"
Besides the most obivious @{"configuration files" link CFG_MAIN}, BBBS uses and creates a lot
of other files that are used. The directory names given here are not
mandatory, they can be anything you like, but you should have them like this
for easier reference in case of trouble.

By default, BBBS creates the following directories and files to the
@{"BBBS root directory" link CFG_FILES_ROOT}:

@{b}bad/@{ub}             @{"Badecho" link CFG_EXTERNAL_BADECHO} directory.
@{b}feelings/@{ub}        Directory containing @{"feelings" link CFG_CHAT_FEELINGS} and @{"chat" link CFG_CHAT} configuration.
@{b}grab1/@{ub}           Grab directory for node one.
@{b}hold1/@{ub}           Filearea "hold" directory for node one.
@{b}inbound/@{ub}         Directory containing inbound FidoNet mail.
@{b}mail/@{ub}            NetMail directory for file attaches.
@{b}main/@{ub}            @{"BBBS main directory" link CFG_FILES_MAIN}, containing the messagebase etc.
@{b}menus/@{ub}           @{"BBBS menus directory" link CFG_FILES_MENUS}, containing all the menus.
@{b}misc/@{ub}            @{"Miscellaneous files" link CFG_FILES_MISC}.
@{b}new1/@{ub}            Temporary upload directory for node one.
@{b}outbound/@{ub}        Directory containing outbound FidoNet mail.
@{b}pub/@{ub}             Public file directory, used as an example in filedirg.000.
@{b}scripts/@{ub}         Directory containing all the @{"BBBS scripts" link BZ_MAIN}.
@{b}secure/@{ub}          Directory for storing secure incoming FidoNet messages.
@{b}tmpin/@{ub}           Directory for temporarily storing inbound packets.
@{b}tmpout/@{ub}          Directory for temporarily storing outbound packets.
@{b}voice/@{ub}           Directory for storing voice messages.
@{b}work/@{ub}            A general-purpose working directory.
@{b}alias.bbb@{ub}        The file holding the @{"BBBS groupmail configuration" link CFG_ALIAS}.
@{b}bbbscfg4.000@{ub}     Global configuration used by all nodes
@{b}bbbscfg4.x@{ub}       Local configuration for node @{b}x@{ub}.
@{b}bcfg4.exe@{ub}        @{"The configuration program" link CFG_BCFG4}.
@{b}external.bbb@{ub}     Configuration file for @{"protocols" link CFG_EXTERNAL_PROTOCOLS}, @{"packers" link CFG_EXTERNAL_PACKERS} and some
                 @{"FidoNet stuff" link CFG_EXTERNAL_NET}.
@{b}filedirg.000@{ub}     The global @{"file directories" link CFG_FILE}.
@{b}filedirn.x@{ub}       The local file directories for node @{b}x@{ub}.
@{b}groups@{ub}           The @{"group definition" link CFG_GROUPS} file.
@endnode


@node cfg_files_root "The files in the BBBS root directory"
The following files should reside in your BBBS root directory:

@{b}alias.bbb@{ub}          The file holding the @{"BBBS groupmail configuration" link CFG_ALIAS}.
@{b}bag.exe@{ub}            The AmigaGuide reader. bag.exe will have different
                   functions depending on what name it is run with. When run
                   as @{b}ag2html.exe@{ub}, it will convert AmigaGuide files to HTML
                   format. As @{b}ag2doc.exe@{ub}, it will convert AmigaGuide files
                   to a normal ASCII format, with emphasis characters. As
                   @{b}ag2txt.exe@{ub}, it will convert AmigaGuide files to normal
                   ASCII text.
@{b}bbbs.001@{ub}           A library file.
@{b}bbbs.002@{ub}           Another library file.
@{b}bbbs.exe@{ub}           The main executable.
@{b}bbbs.fingerd.exe@{ub}   The BBBS finger daemon.
@{b}bbbs.key@{ub}           Your personal registeration key. Keep good backups
                   on this one!
@{b}bbbs.smtpd.exe@{ub}     The BBBS SMTP daemon for incoming Internet e-mail.
@{b}bbbs.telnetd.exe@{ub}   The BBBS telnet daemon for telnet logins.
@{b}bbbscapi.dll@{ub}       A dynamic link library (@{"OS/2 version" link SYS_DIFFS_OS2} only).
@{b}bbbscfg4.000@{ub}       Global configuration used by all nodes
@{b}bbbscfg4.x@{ub}         Local configuration for node @{b}x@{ub}.
@{b}bcfg4.exe@{ub}          @{"The configuration program" link CFG_BCFG4}.
@{b}bbbstxt@{ub}            Language file for language 0. The bbbstxt files hold most
                   of the text that BBBS will display to the screen. You can
                   modify it as you like.
@{b}bbbstxtn@{ub}           Language file for language @{b}n@{ub}.
@{b}bcfg4.exe@{ub}          The @{"BCFG4 configuration program" link CFG_BCFG4}.
@{b}brobo.wht@{ub}          The Artificial Stupidity file for BRoboCop.
@{b}bterm.log@{ub}          Log file created by @{"BTERM" link BTERM0}.
@{b}bterm.pho@{ub}          The BTERM phonebook.
@{b}colors.bbb@{ub}         The @{"color scheme configuration" link CFG_COLORS} file.
@{b}external.bbb@{ub}       Configuration file for @{"protocols" link CFG_EXTERNAL_PROTOCOLS}, @{"packers" link CFG_EXTERNAL_PACKERS} and some
                   @{"FidoNet stuff" link CFG_EXTERNAL_NET}.
@{b}filedirc.x@{ub}         The @{"file directories" link CFG_FILE} for the conference @{b}x@{ub}.
@{b}filedirg.000@{ub}       The global file directories.
@{b}filedirn.x@{ub}         The local file directories for node @{b}x@{ub}.
@{b}groups@{ub}             The @{"group definition" link CFG_GROUPS} file.
@{b}ripc.exe@{ub}           A program to compile RipScript files into BBBS RIP
                   menu files.
@{b}sysop.gui@{ub}          What you are reading right now.
@{b}hello.zad@{ub}          The default @{"voice greetings file" link BCFG1706}.
@{b}hippo.wht@{ub}          When a user sends a message to Hippo, she will reply with
                   a random line from this file.
@{b}inet.bbb@{ub}           File containing @{"Internet access configuration" link CFG_INET}.
@{b}jargon.txt@{ub}         An optional online hacker's dictionary (@{i}The Jargon File@{ui}).
                   The command @{i}q ja@{ui} will need this.
@{b}up_scan.bat@{ub}        For all uploads, BBBS will automatically run this file.
@{b}up_scan.cmd@{ub}        Like up_scan.bat, but for @{"the OS/2 version" link SYS_DIFFS_OS2}.
@{b}up_scan.sh@{ub}         Like up_scan.bat, but for @{"UNIX versions" link SYS_DIFFS_NIX}.
@{b}_mg@{ub}                The MG editor startup file. See the file @{b}mg.tex@{ub} for MG
                   documentation.
@endnode


@node cfg_files_main "The files in /bbs/main directory"
The main directory contains the most important BBBS database files. You
should keep good backups on this directory!

@{b}00000000.hdr@{ub}    Headers for the messages in conference 0.
@{b}00000000.txt@{ub}    Message texts for conference 0.
@{b}0000000a.hdr@{ub}    Headers for the messages in conference 10.
@{b}0000000a.txt@{ub}    Message texts for conference 10.
@{b}accounts.dat@{ub}    Account records for accounting.
@{b}badpoll.dat@{ub}     Information on unsuccessful polls.
@{b}bbbsdown.dat@{ub}    Records kept about up/downloaded files. If missing, BBBS
                creates it again.
@{b}bbbshi.dat@{ub}      Hippo messages for the users.
@{b}bbbsset.dat@{ub}     Aliases and sets created by users.
@{b}bbbsstat.dat@{ub}    Statistics file.
@{b}bbbsuser.dat@{ub}    The main userfile. @{i}Backup this often!@{ui}
@{b}bbbsuser.idx@{ub}    Index for bbbsuser.dat. Autocreated by BBBS on startup.
@{b}btickube.dup@{ub}    Duplicate file database for @{"BTICK" link SYS_CMDLINE_BTICK}.
@{b}busypoll.dat@{ub}    Information on polls on busy nodes.
@{b}bzll.dat@{ub}        Library file.
@{b}chatlog.1@{ub}       Logfile from last chat with local user on node 1.
@{b}confcfg4.dat@{ub}    Conference setup.
@{b}confusr4.dat@{ub}    Database containing the lastread-pointers and joined
                conferences for the users.
@{b}filedir*.idx@{ub}    Index for fileareas. Can be recreated with @{"BBBS BFILEIDX" link SYS_CMDLINE_BFILEIDX}.
@{b}grabdupe.dup@{ub}    Duplicate offline reply packet database. Used to check if
                user tries to upload same reply packet more than once.
@{b}log1@{ub}            The log that is kept for each node. The name can be
                changed in BCFG4.
@{b}okfiles@{ub}         Only files listed in this file may be uploaded.
@{b}okuser@{ub}          Only users listed in this file may register as a new
                user.
@{b}nodelist.idx@{ub}    Nodelist index, created by @{"BNC" link SYS_CMDLINE_BNC}.
@{b}statzero.dat@{ub}    Statistics file.
@{b}sysnote@{ub}         Notes that BBBS writes to the sysop (newusers, changed
                names, uploaded files, etc)
@{b}tossdupe.dup@{ub}    Database to keep track of duplicate outgoing echomail.
@{b}trashcan@{ub}        Opposite of okuser, users listed in this file may not
                register.
@{b}trashfil@{ub}        Opposite of okfiles, files listed in this file may not be
                uploaded.
@endnode


@node cfg_files_menus "The files in /bbs/menus directory"
The files in @{b}/bbs/menus@{ub} directory can be recognized by their extension.

        @{b}Extension       When user sees this file@{ub}
        @{b}===========================================@{ub}
        @{b}<none>@{ub}          Language 0, no ANSI, novice
        @{b}.1@{ub}              Language 1, no ANSI, novice
        @{b}.gr@{ub}             Language 0, ANSI, novice
        @{b}.gr1@{ub}            Language 1, ANSI, novice
        @{b}.r@{ub}              Language 0, RIP, novice
        @{b}.r1@{ub}             Language 1, RIP, novice
        @{b}.x@{ub}              Language 0, no ANSI, expert
        @{b}.x1@{ub}             Language 1, no ANSI, expert
        @{b}.xg@{ub}             Language 0, ANSI, expert
        @{b}.xg1@{ub}            Language 1, ANSI, expert
        @{b}.xr@{ub}             Language 0, RIP, expert
        @{b}.xr1@{ub}            Language 1, RIP, expert


@{b}areainfo.000@{ub}    Displayed by "r ai" command on the conference zero.
@{b}bang@{ub}            Russian roulette bang-file.
@{b}bbbshelp@{ub}        File with the help displayed with "h".
@{b}bftpmenu@{ub}        Menu used for FTP-commands.
@{b}birthday@{ub}        The list of those who celebrate their birthday.
@{b}brobo_af@{ub}        Header for BAllFix replies.
@{b}brobo_cf@{ub}        Header for AreaFix replies and connection notifies.
@{b}brobo_ff@{ub}        Header for FileFix (@{"BTICK" link SYS_CMDLINE_BTICK}) message.
@{b}brobo_fr@{ub}        Header for file request replies.
@{b}brobo_nf@{ub}        Header for NameFix replies.
@{b}bull@{ub}            The bulletin menu.
@{b}bull0@{ub}           Welcome-bulletin (displayed when the user logs in).
@{b}bull1@{ub}           Bulletin number one.
@{b}c019b@{ub}           Bulletin menu for conference 19.
@{b}c019b0@{ub}          First-join-bulletin for conference 19.
@{b}c019b1@{ub}          Bulletin one for conference 19.
@{b}c019j@{ub}           Always-join-bulletin for conference 19.
@{b}charmenu@{ub}        Menu used for character choice command.
@{b}chathelp@{ub}        The help screen for groupchat.
@{b}chatmenu@{ub}        Menu used for chat command.
@{b}colors01@{ub}        The first screen of the palette editor.
@{b}colors02@{ub}        The second screen of the palette editor.
@{b}confer@{ub}          The list of the conferences. Delete it to use
                BBBS internal comments.
@{b}doormenu@{ub}        Menu used for door command.
@{b}edithelp@{ub}        The help screen for the full-screen editor.
@{b}event@{ub}           Displayed when user is thrown out after login because
                of an event.
@{b}feelmens@{ub}        Extended chat help, SysOp only.
@{b}feelmenu@{ub}        Extended chat help.
@{b}fil4mens@{ub}        Menu used for file command, SysOp only.
@{b}fil4menu@{ub}        Menu used for file command.
@{b}fingerd@{ub}         Header displayed before 'finger' information.
@{b}flaghelp@{ub}        Help file for file flagging.
@{b}formmenu@{ub}        Menu used for choosing archiving method.
@{b}getlost@{ub}         This file will be shown to user with "getlost" status.
@{b}globmenu@{ub}        Menu  used  for  global commands, will be shown after the
                listing of a main, read, file, utility or sysop menu.
@{b}grabdupe@{ub}        Displayed when user has uploaded a reply packet
                containing already sent messages.
@{b}grabmenu@{ub}        Menu containing the different grab format choices.
@{b}hello@{ub}           Hello-message for the new user.
@{b}helplink@{ub}        Index file for bbbshelp.
@{b}huntmenu@{ub}        Menu used for search command.
@{b}joinhelp@{ub}        Help file for joining.
@{b}langmenu@{ub}        Menu used for language choice.
@{b}lostpass@{ub}        This file will be shown to user who has lost password.
@{b}mainmens@{ub}        Menu used for main command, SysOp only.
@{b}mainmenu@{ub}        Menu used for main command.
@{b}markmenu@{ub}        Menu used for mark command.
@{b}outbmenu@{ub}        Menu used for outbound manager.
@{b}postlog@{ub}         The file will shown after the `g y` command.
@{b}postreg@{ub}         The file will be listed after a user has registered.
@{b}prechat@{ub}         The file will be shown before reason for SysOp chat is asked.
@{b}precom@{ub}          The file will be shown before `comment` command.
@{b}precreg@{ub}         The file will be shown before closed system password question.
@{b}predesc@{ub}         Will be shown to user before asking descriptions for files.
@{b}predown@{ub}         The file will be shown before a user downloads a file.
@{b}prefing@{ub}         Displayed before asking a finger destination.
@{b}preftp@{ub}          Displayed before asking a ftp destination.
@{b}pregrab@{ub}         This file will be shown before the scratchpad is sent to the
                user using the @{b}grab@{ub} command.
@{b}prehunt@{ub}         Displayed before asking a Hunt server location.
@{b}prelog@{ub}          The file that is listed before the user logs in.
@{b}prepreup@{ub}        The file shown before asking the filename in upload command.
@{b}prereg@{ub}          The file is shown before a user is registered.
@{b}prerlog@{ub}         Displayed before asking a rlogin destination.
@{b}preteln@{ub}         Displayed before asking a telnet destination.
@{b}preup@{ub}           The file will be shown prior to an upload.
@{b}protmenu@{ub}        Menu used for protocol choice.
@{b}readmens@{ub}        Menu used for read command, SysOp only.
@{b}readmenu@{ub}        Menu used for read command.
@{b}rmodmenu@{ub}        Menu used for read mode selection.
@{b}termmenu@{ub}        Menu used for terminal type selection.
@{b}utilmens@{ub}        Menu used for utility command, SysOp only.
@{b}utilmenu@{ub}        Menu used for utility command.
@endnode

@node cfg_files_temp "The files in /bbs/temp directory"
@{b}areatoss.0@{ub}      Areatoss infofile for all nodes, created by BBBS after
                user logs off. If he/she wrote messages to FidoNet
                areas, bit according to conference number will be
                set in this file. @{b}BBBS BOGUS A@{ub} will read this
                to scan areas written to, for exporting mail.
@{b}areatoss.1@{ub}      Areatoss infofile for node one, created by BBBS after
                user logs off. If he/she wrote messages to FidoNet
                areas, the number(s) of the conference(s) will be
                written into this file. For node two it has extension 2.
@{b}bbbsmsg.1@{ub}       Nodemessage file for node one.
@{b}bbbsnode@{ub}        Node status information for the system.
@{b}bbbsrun.1@{ub}       Flagfile for node one, BBBS is now running on that node.
@{b}bbbsrun.a@{ub}       Flagfile for @{"BSMTP" link SYS_CMDLINE_BSMTP}. When this file exists, a BSMTP session
                is running.
@{b}bbbsrun.b@{ub}       Flagfile for @{"BNNTP" link SYS_CMDLINE_BNNTP}. When this file exists, a BNNTP session
                is running.
@{b}bbbsrun.c@{ub}       Flagfile for @{"BOGUS" link SYS_CMDLINE_BOGUS}. When this file exists, BOGUS is running.
@{b}bbbsrun.d@{ub}       Flagfile for @{"BPOP" link SYS_CMDLINE_BPOP}. When this file exists, BPOP is running.
@{b}feelings.1@{ub}      Feelings-file for node one.
@{b}transfer.1@{ub}      Transfer queue for node one.
@endnode

@node cfg_files_misc "The files in /bbs/misc directory"
The @{b}/bbs/misc@{ub} directory contains various miscellaneous files:

@{b}bbbsdef.h@{ub}       The C-language header file containing the structure of
                all BBBS data files. If you want to do some programming,
                you can use this file as a reference.
@{b}mg.tex@{ub}          The complete documentation for the BBBS's internal @{i}MG@{ui}
                editor, in LaTeX format.
@{b}msgview.c@{ub}       A C-language example on how to read the message text from
                the BBBS messagebase.
@{b}setpass.c@{ub}       A C-language source code for changing the SysOp's
                password - for emergencies.
@endnode

@node SYS_CMDLINE "The BBBS command line functions"
The standard BBBS calling convention is:

@{b}bbbs.exe [com] [node]@{ub}

Where @{b}node@{ub} is the node number to start this BBBS session into, and @{b}com@{ub}
the comport number. This convention should suffice for most BBBS
configurations. However, there are different versions of BBBS for
various OS's. Depending on which of them you run, you can also use
some other parameters or have a completely different calling
convention.

BBBS offers also some other services that can be started from the
command line. To use them, BBBS can also be invoked as:

@{b}bbbs.exe [command] {parameters}@{ub}

@{b}Command@{ub} can be any of the ones listed below. Parameters vary from
command to command.

@{b}Command   Function@{ub}
@{b}=======================================================================@{ub}
@{"BAADD" link SYS_CMDLINE_BAADD}     An account management tool.
@{"BCONF" link SYS_CMDLINE_BCONF}     Display statistics on conferences.
@{"BCSTAT" link SYS_CMDLINE_BCSTAT}    Display statistics on conference feeds.
@{"BDATE" link SYS_CMDLINE_BDATE}     Update the birthday list.
@{"BFILEIDX" link SYS_CMDLINE_BFILEIDX}  Create an index file of the file directories.
@{"BFILSORT" link SYS_CMDLINE_BFILSORT}  Sort the @{"file directories" link CFG_FILE}.
@{"BFTP" link SYS_CMDLINE_BFTP}      Batch FTP.
@{"BHATCH" link SYS_CMDLINE_BHATCH}    Hatch the specified file into the specified file-echo.
@{"BKILL" link SYS_CMDLINE_BKILL}     Kill users with criterias.
@{"BLINKFIX" link SYS_CMDLINE_BLINKFIX}  Update the datestamps of file links.
@{"BLIST" link SYS_CMDLINE_BLIST}     Make an ASCII format file list.
@{"BMKILL" link SYS_CMDLINE_BMKILL}    Kill messages with criterias.
@{"BMSG" link SYS_CMDLINE_BMSG}      Import/export @{i}FidoNet@{ui} mail.
@{"BMT" link SYS_CMDLINE_BMT}       A FidoNet message tracker.
@{"BNC" link SYS_CMDLINE_BNC}       Compile the @{"nodelist" link CFG_EXTERNAL_NET_NODELIST}(s) specified in @{"external.bbb" link CFG_EXTERNAL}.
@{"BNDIFF" link SYS_CMDLINE_BNDIFF}    Update a nodelist from a @{i}NODEDIFF@{ui}.
@{"BNEWF" link SYS_CMDLINE_BNEWF}     Make an ASCII format list of new files.
@{"BNMSG" link SYS_CMDLINE_BNMSG}     Send a node message.
@{"BNNTP" link SYS_CMDLINE_BNNTP}     Exchange netnews with NNTP servers.
@{"BOGUS" link SYS_CMDLINE_BOGUS}     B's Original Garbage Unicast System (@{i}FidoNet@{ui} mail import/export)
@{"BOK" link SYS_CMDLINE_BOK}       Make an OKFILE.TXT file for use with the @{i}FrontDoor@{ui} mailer.
@{"BOM" link SYS_CMDLINE_BOM}       Command line interface to the BBBS @{i}outbound manager@{ui}.
@{"BPC" link SYS_CMDLINE_BPC}       Pack a conference with criterias.
@{"BPOP" link SYS_CMDLINE_BPOP}      Receive mail from POP3 server.
@{"BPUS" link SYS_CMDLINE_BPUS}      Pack the user database.
@{"BRSA" link SYS_CMDLINE_BRSA}      Generate new RSA keys.
@{"BSETPACK" link SYS_CMDLINE_BSETPACK}  Pack the environment variable settings file.
@{"BSMTP" link SYS_CMDLINE_BSMTP}     Exchange email with SMTP servers.
@{"BSTAT" link SYS_CMDLINE_BSTAT}     Show a statistics list.
@{"BTICK" link SYS_CMDLINE_BTICK}     Process he incoming @{b}TICK@{ub} files from file-echoes.
@{"BTIME" link SYS_CMDLINE_BTIME}     Adjust the time with a timeserver.
@{"BTXT2BBS" link SYS_CMDLINE_BTXT2BBS}  Convert a text file to a message.
@{"BWHO" link SYS_CMDLINE_BWHO}      Show who is online at the moment.
@endnode


@node SYS_CMDLINE_BAADD "BBBS BAADD - An account management tool"
@{i}Usage:@{ui} @{b}bbbs.exe baadd [amount] {account}@{ub}

@{b}BAADD@{ub} is used to edit the amount of money on different @{i}accounts@{ui}.
@{b}Amount@{ub} is the value to add to the account(s): using negative values
will deduct money from the specified account(s).

The @{b}account@{ub}-parameter is a @{"regular expression" link APP_REGEXP} specifying the accounts
to change, default is all accounts. If it is not specified, then only
accounts without credit will be changed.
@endnode


@node SYS_CMDLINE_BCONF "BBBS BCONF - Display statistics on the conferences"
@{i}Usage:@{ui} @{b}bbbs.exe bconf@{ub}

@{b}BCONF@{ub} displays some status information on the active conferences. The
output will look something like this:

  A# Name                             First  Last    kB MIFPN    Age    M#
--------------------------------------------------------------------------
   0 Netmail                              1   270   159   FP  970410     1
   1 SysOp News                           1    12     2  I  N 961017    11
   2 Post Office                          1   228    67 MI P  970406    73
   3 Administrative                       1    36    10       961228     4
   4 Resume                               1    48    50 MI  N 970307    73
   5 General Chat                         1   133    47  I    970411    68

Descriptions for the different fields:

@{i}A#@{ui}     is the area number.
@{i}Name@{ui}   is the area name.
@{i}First@{ui}  is the number of the first active message in the conference.
@{i}Last@{ui}   is the number of the last message in the conference.
@{i}kB@{ui}     is the size of the message area, in kilobytes.
@{i}MIFPN@{ui}  @{b}M@{ub} - area is a "must": everyone must be a member.
       @{b}I@{ub} - area is auto-invite: new users are automatically members.
       @{b}F@{ub} - area is an echomail area.
       @{b}P@{ub} - area is for private messages.
       @{b}N@{ub} - replies are not allowed in the conference.
@{i}Age@{ui}    is the datestamp of the last message in the conference.
@{i}M#@{ui}     signifies how many members there are in the conference.
@endnode

@node SYS_CMDLINE_BCSTAT "BBBS BCSTAT - Display statistics of conference feeds"
@{i}Usage:@{ui} @{b}bbbs.exe bcstat [area_regexp] [date] {fido}@{ub}

@{b}BCSTAT@{ub} displays the amount of messages received to the areas matching
the @{"regular expression" link APP_REGEXP} @{b}area_regexp@{ub} since @{b}date@{ub}. @{b}date@{ub} can be any standard
day, like @{b}960831@{ub}, or @{b}-10@{ub}, meaning ten days before the current date. If
the optional parameter "@{b}fido@{ub}" is added, then the area names that are
output are their FidoNet echomail names. By default, areas are listed
with their local area names.

@{b}Examples:@{ub}

@{b}bbbs.exe bcstat ^bbbs\. 962511@{ub}
@{b}bbbs.exe bcstat ^bbbs\. -10 fido@{ub}
@endnode


@node SYS_CMDLINE_BDATE "BBBS BDATE - Update the birthday list."
@{i}Usage:@{ui} @{b}bbbs.exe bdate@{ub}

@{b}BDATE@{ub} will update the file @{b}birthday@{ub} in your @{"global menu directory" link CFG_FILES_MENUS}, which
is shown every time a user logs in. This command should be run every day.
@endnode


@node SYS_CMDLINE_BFILEIDX "BBBS BFILEIDX - Create an index file of the file directories"
@{i}Usage:@{ui} @{b}bbbs.exe bfileidx {D} {O}@{ub}

@{b}BFILEIDX@{ub} scans through your file directories and creates an index file
to speed up file searches and such. Also, it reports of errors in the
file areas, such as too long description lines. For better performance, this
command should be run every day. If you decide not to run it daily, then do
not run it at all.

The optional '@{b}D@{ub}' parameter gives a report of files with no
description. The '@{b}O@{ub}' parameter gives a report of files which are
"offline" (specified in the @{"descript.ion files" link CFG_FILE_DESCRIPTION}, but do not exist in
the disk).
@endnode


@node SYS_CMDLINE_BFILSORT "BBBS BFILSORT - Sort the file directories"
@{i}Usage:@{ui} @{b}bbbs.exe bfilsort@{ub}

@{b}BFILSORT@{ub} sorts your file directories (the @{"descript.ion files" link CFG_FILE_DESCRIPTION}). The
entries before and after the dot entries are sorted separately. If you
want to have nicely sorted file directories, run this command every
day.
@endnode

@node SYS_CMDLINE_BFTP "BBBS BFTP - Batch FTP"
@{i}Usage:@{ui} @{b}bbbs.exe bftp [commandfile] [get-dir]@{ub}

@{b}BFTP@{ub} can be used to use BBBS's internal FTP routines in batch mode. The
parameter @{b}commandfile@{ub} should be the search path of a file containing
the commands to execute, each on their own line. @{b}get-dir@{ub} should be the
directory the FTP command 'get' should store the transferred files to.

Note that the first line of @{b}commandfile@{ub} should contain the address of the
FTP server that should be connected to. Also, the last command should be
"quit", otherwise BFTP will revert into interactive FTP mode.


@{b}An example of a commandfile:@{ub}

@{b}ftp.bbbs.net@{ub}
@{b}anonymous@{ub}
@{b}myname@myhost@{ub}
@{b}cd /pub/dist/bbbs@{ub}
@{b}get *@{ub}
@{b}quit@{ub}
@endnode

@node SYS_CMDLINE_BHATCH "BBBS BHATCH - Hatch the specified file into the specified file-echo"
@{i}Usage:@{ui} @{b}bbbs.exe bhatch {-replace_file} [filename] [echoname] {description}@{ub}

@{b}BHATCH@{ub} is used to hatch a new file into a @{b}TICK@{ub} @{"file-echo" link CFG_EXTERNAL_NET_TICK}. The
@{b}filename@{ub}-parameter specifies the file to hatch. @{b}Echoname@{ub} is the name
of the file-echo the file should be hatched into, as entered in
@{"external.bbb" link CFG_EXTERNAL}. If you do not specify a @{b}description@{ub}, then BHATCH will
try to read it from your file area.

The @{b}replace_file@{ub}-parameter is also optional. It specifies the file
that should be replaced by this file. You cannot use wildcards, for
obvious reasons.
@endnode


@node SYS_CMDLINE_BKILL "BBBS BKILL - Kill users with criterias"
@{i}Usage:@{ui} @{b}bbbs.exe bkill {Tyyyymmdd} {Cx} {Lx} {Rx} {Ux} {Ix} {*}@{ub}

@{b}BKILL@{ub} can be used to kill users with certain criterias. You can
specify one or more of the criterias. To be killed or listed, the user must
match all the criterias.

@{b}Tyyyymmdd@{ub}   All users who haven't called since @{b}yyyymmdd@{ub}. Defaults into
            one year from the current date.
@{b}Cx@{ub}          All users who have called less than @{b}x@{ub} times.
@{b}Lx@{ub}          All users who have written less than @{b}x@{ub} messages.
@{b}Rx@{ub}          All users who have read less than @{b}x@{ub} messages.
@{b}Ux@{ub}          All users who have uploaded less than @{b}x@{ub} bytes.
@{b}Ix@{ub}          All users who have limit @{b}x@{ub} (default=don't care (256)).

By default @{b}BKILL@{ub} only lists the users who match the specified
criterias. If you are absolutely hundred percent positive that you
want to kill the users matching the criterias, you need to add the
@{b}*@{ub}-parameter to the end of the command line.
@endnode


@node SYS_CMDLINE_BLINKFIX "BBBS BLINKFIX - Update the datestamps of file links"
@{i}Usage:@{ui} @{b}bbbs.exe blinkfix@{ub}

@{b}BLINKFIX@{ub} updates the dates of the file links to match the dates of the
real files they are links to. This command should be run every day if
you are using file links.
@endnode


@node SYS_CMDLINE_BLIST "BBBS BLIST - Make an ASCII format file list"
@{i}Usage:@{ui} @{b}bbbs.exe blist [filename] {groups {starting_dir}}@{ub}

@{b}BLIST@{ub} can be used to build an ASCII-format file of all the files in
your BBS. The list will be in the same format as the output of the
"f s -r *"-command. To create a list of only new files, you can use the
command @{"BNEWF" link SYS_CMDLINE_BNEWF}.

The only required parameter is the name of the file the resulting list
should be written to. The @{b}group@{ub}-parameter can be used to generate
lists of files only for different @{"groups" link CFG_GROUPS}. When used, only files for
that group has read-access to are included into the list. The
@{b}starting_dir@{ub}-parameter simply defines the directory the list
generation should be started from. By default, generation will start
from the first directory defined in @{"filedirg" link CFG_FILE_FILEDIRS}.000.

The @{b}starting_dir@{ub}-parameter can only be used if the @{b}groups@{ub}-parameter is also
defined.
@endnode

@node SYS_CMDLINE_BMKILL "BBBS BMKILL - Kill messages with criterias"
@{i}Usage:@{ui} @{b}bbbs.exe bmkill [area] [from] [to] [subject] [after] [before] {*}@{ub}

@{b}BMKILL@{ub} can be used to kill messages according to certain criterias. The
@{b}area@{ub}, @{b}from@{ub}, @{b}to@{ub} and @{b}subject@{ub} parameters are @{"regular expressions" link APP_REGEXP} that are
matched against their relative fields. @{b}after@{ub} and @{b}before@{ub} parameters can
be standard days; either in @{b}yymmdd@{ub}-format or, for example "-10", for "ten days
before the current date". For a message to be taken into account, it must
match all criterias.

By default, @{b}BMKILL@{ub} only lists the messages that match the specified
criterias. If you are absolutely one hundred percent sure that you want
to kill the messages, an additional @{b}*@{ub} parameter has to be added.

Note that the @{"BBBS BPC" link SYS_CMDLINE_BPC} command has to be used to actually remove the
killed messages from the message base.
@endnode

@node SYS_CMDLINE_BMSG "BBBS BMSG - Import/export FidoNet mail"
@{i}Usage:@{ui} @{b}bbbs.exe bmsg [R|W|F]@{ub}

The @{b}BMSG@{ub} command can be used to interface BBBS with an external mail
tosser. @{b}BMSG@{ub} converts the messages in BBBS messagebase into @{i}FTS-0001@{ui}
format and vice-versa.

The @{b}R@{ub}-parameter (@{b}BBBS BMSG R@{ub}) is used to collect all the new messages
from BBBS and convert them into @{i}FTS-0001@{ui} format files and write them
into directories specified in @{"BCFG4" link CFG_BCFG4}. After this command, a mail
processor of some sort should be run to create outbound mail packets.

The @{b}W@{ub}-parameter (@{b}BBBS BMSG W@{ub}) is used to write all the @{b}*.MSG@{ub} format
messages to BBBS. Again, they are read from the directory specified in
BCFG4.

The final parameter (@{b}BBBS BMSG F@{ub}) requires an additional parameter;
the file name of an @{b}areatoss@{ub} file. This file should contain the
names or numbers of the areas that should be scanned for new
messages. BBBS automatically generates a file called @{b}areatoss.nnn@{ub} into
the @{"temporary directory" link CFG_FILES_TEMP}, where @{b}nnn@{ub} is the node number.

It is highly recommended that you use the BBBS's internal @{"BOGUS" link SYS_CMDLINE_BOGUS} mail
tosser instead of an external one.
@endnode

@node SYS_CMDLINE_BMT "BBBS BMT - A FidoNet message tracker"
@{i}Usage:@{ui} @{b}bbbs.exe bmt@{ub}

@{b}BMT@{ub} will scan your NetMail directory for messages with unlisted
destination address. It also logs the sender, receiver and subject of
the NetMail messages. This command can be run after NetMail is written
into the message base.
@endnode


@node SYS_CMDLINE_BNC "BBBS BNC - Compile the nodelist(s)"
@{i}Usage:@{ui} @{b}bbbs.exe bnc {x}@{ub}

@{b}BNC@{ub} compiles the @{"nodelist" link CFG_EXTERNAL_NET_NODELIST}(s) defined in the @{"external.bbb-file" link CFG_EXTERNAL} to be
used with BBBS. This command should be run every time there is changes
to a @{i}nodelist@{ui}. If you give an additional parameter (can be
anything), then the nodelist is complied even if it is up to date.
@endnode


@node SYS_CMDLINE_BNDIFF "BBBS BNDIFF - Update a nodelist from a NODEDIFF"
@{i}Usage:@{ui} @{b}bbbs.exe bndiff@{ub}

You should run @{b}BNDIFF@{ub} every time you receive a @{i}nodediff@{ui}. It will
automagically update the nodelist to be consistent with the nodediff.
The nodediff names are read from the @{"nodelist-section" link CFG_EXTERNAL_NET_NODELIST} of the
@{"external.bbb-file" link CFG_EXTERNAL}.
@endnode


@node SYS_CMDLINE_BNEWF "BBBS BNEWF - Make an ASCII format list of new files"
@{i}Usage:@{ui} @{b}bbbs.exe bnewf [filename] {groups} {starting_dir} {date}@{ub}

@{b}BNEWF@{ub} can be used to build an ASCII-format file of the new files in
your BBS. The list will be in the same format as the output of the
@{i}F S *@{ui}-command. To create a list of all files in your system, you can use
the command @{"BLIST" link SYS_CMDLINE_BLIST}.

The only required parameter is the name of the file the resulting list
should be written to. The @{b}group@{ub}-parameter can be used to generate
lists of files only for different @{"groups" link CFG_GROUPS}. When used, only files for
that @{i}group@{ui} has read-access to are included into the list. The
@{b}starting_dir@{ub}-parameter simply defines the directory the list
generation should be started from. By default, generation will start
from the first directory defined in @{"filedirg" link CFG_FILE_FILEDIRS}.000.

The @{b}date@{ub}-parameter can be used to control the date after which files
are considered to be "new". It can be any standard date, like @{b}961125@{ub}
(for the 25th of November, 1996) or, for example, @{b}-10@{ub}, meaning the
date ten days before the current day.

For example, to include the new files since the last ten days to the list
in the file @{b}newfiles-10@{ub}, issue the command:

@{b}bbbs.exe bnewf newfiles-10 all / -10@{ub}
@endnode


@node SYS_CMDLINE_BNMSG "BBBS BNMSG - Send a node message."
@{i}Usage:@{ui} @{b}bbbs.exe bnmsg [fromnode] {-fromnick} [tonode] [message]@{ub}

@{b}BNMSG@{ub} sends a node message to the BBBS. @{b}fromnode@{ub} is the node the
message should be coming from. The optional parameter @{b}fromnick@{ub} defines
the nick from which the message will seem to come from. @{b}tonode@{ub} is the
node that the message should be sent to. The message itself can be up
to 250 characters long.
@endnode


@node SYS_CMDLINE_BNNTP "BBBS BNNTP - Exchange netnews with NNTP servers"
@{i}Usage:@{ui} @{b}bbbs.exe bnntp w [host0] {host1} {host2} {...}@{ub}
       or @{b}bbbs.exe bnntp r [host0] {host1} {host2} {...}@{ub}
       or @{b}bbbs.exe bnntp z [host0] {host1} {host2} {...}@{ub}
       or @{b}bbbs.exe bnntp s [host] [localname] [n]@{ub}
       or @{b}bbbs.exe bnntp c [host] [localname] [n]@{ub}
       or @{b}bbbs.exe bnntp g [host] [filename]@{ub}

@{b}BNNTP@{ub} is used to exchange @{i}netnews@{ui} with @{i}NNTP@{ui} servers. The
@{b}action@{ub}-parameter defines whether netnews should be sent or received
from the host(s) specified. The @{b}W@{ub} action is used to receive, the @{b}R@{ub}
action to send news. The host list must be either names or
IP-addresses of valid NNTP servers.

The @{b}Z@{ub} action can be used to reset the @{i}want@{ui} pointers to the last message
number in the servers specified.

The actions @{b}S@{ub} and @{b}C@{ub} and be used to set the @{i}want@{ui} pointers so that at
maximum @{b}n@{ub} messages are returned the next time news are received from the
host specified, with the exception that with the @{b}C@{ub} action, no duplicate
articles (such articles that you have already received) will be transferred.

The @{b}G@{ub} action can be used to get the list of available areas in host to the
file @{b}filename@{ub}.
@endnode


@node SYS_CMDLINE_BOGUS "BBBS BOGUS - The BBBS internal FidoNet mail processor"
@{i}Usage:@{ui} @{b}bbbs.exe bogus w@{ub}
       or @{b}bbbs.exe bogus b@{ub}
       or @{b}bbbs.exe bogus r@{ub}
       or @{b}bbbs.exe bogus f [filename]@{ub}
       or @{b}bbbs.exe bogus a@{ub}
       or @{b}bbbs.exe bogus n {nodes}@{ub}

@{b}BOGUS@{ub} is BBBS's internal @{i}FidoNet@{ui} mail processor. It can be used to
import and export @{i}FidoNet@{ui} mail. Instead of @{b}BOGUS@{ub}, you can also use
other, external mail processors with BBBS @{"BMSG" link SYS_CMDLINE_BMSG}, but this is not
recommended, as @{b}BOGUS@{ub} can directly manipulate the BBBS messagebase and
is therefore a lot faster.

The behavior of @{b}BOGUS@{ub} is controlled via the @{"FidoNet-configuration" link CFG_EXTERNAL_NET} in
the @{"external.bbb-file" link CFG_EXTERNAL}.

There are six different actions that can be used. The @{b}W@{ub}-action
(@{b}bbbs bogus w@{ub}) is used for @{i}toss/pack@{ui}; @{b}BOGUS@{ub} tosses all incoming mail
packets in the FidoNet inbound directory, forwards mail to the
downlinks of your node and imports the mail into the BBBS message
base.

The @{b}B@{ub}-action (@{b}bbbs bogus b@{ub}) is almost the same as the @{b}W@{ub}-action, with
the exception that only the @{i}badecho@{ui}-directory is checked for messages.

The @{b}R@{ub}-action (@{b}bbbs bogus r@{ub}) is used for @{i}scan/pack@{ui}; @{b}BOGUS@{ub} scans the
BBBS message base for mail that is to be exported and packs it.

The @{b}F@{ub}-action (@{b}bbbs bogus f@{ub}) requires an additional parameter: a
filename for an @{b}areatoss@{ub} file that should list the area names or
numbers that should be scanned for exportable mail. An @{b}areatoss@{ub}-file
is automatically generated by BBBS into the @{"temporary directory" link CFG_FILES_TEMP}, named
as @{b}areatoss.nnn@{ub}, where @{b}nnn@{ub} is the nodenumber of the node that the
@{b}areatoss@{ub}-file is for. Otherwise, the @{b}F@{ub}-action works like the @{b}R@{ub}-action.

The @{b}A@{ub}-action (@{b}bbbs bogus a@{ub}) is like the @{b}R@{ub}-action, with the exception
that it uses internal quick scan information to check which areas
contain exportable mail. When you use the @{b}A@{ub}-action, the first run can
be very slow, but subsequent runs are a lot faster than scans done
with just the @{b}R@{ub}-action.

The @{b}N@{ub}-action also requires additional parameters. A list of downlinks
or nodes should be specified. An area connection notify is then sent
to the nodes/downlinks specified. For nodes that have a @{b}!@{ub} character in
their @{b}st@{ub} field in the @{"nodes-section of external.bbb" link CFG_EXTERNAL_NET_NODES}, the notify is
sent only if the node has also the @{b}apass@{ub} field defined.

The @{b}R@{ub}-action should be used daily, even if @{b}F@{ub} or @{b}A@{ub}-actions are used on
user logoff to ensure that all mail is actually exported.
@endnode

@node SYS_CMDLINE_BOK "BBBS BOK - Make an OKFILE.TXT file for use with FrontDoor mailer"
@{i}Usage:@{ui} @{b}bbbs.exe bok [path]@{ub}

@{b}BOK@{ub} is used to generate a list of files for the @{i}FrontDoor@{ui} mailer. The
@{b}path@{ub}-parameter should specify the directory to which your @{i}FrontDoor@{ui} is
installed. @{i}FrontDoor@{ui} can then receive file requests and answer to
them. @{b}BOK@{ub} will create two files: @{b}reqlist.txt@{ub}, containing the
directories from which files can be requested and @{b}okfile.txt@{ub},
containing links to the files. You should specify these files also in
your @{i}FrontDoor@{ui} configuration.

It is highly recommended that instead of @{i}FrontDoor@{ui} you use BBBS's
internal @{i}BackDoor@{ui} mailer.
@endnode


@node SYS_CMDLINE_BOM "BBBS BOM - Command line interface to the BBBS outbound manager"
@{b}Usage:@{ub} @{b}bbbs.exe bom [command]@{ub}

@{b}BOM@{ub} can be used to interface with the BBBS's @{i}outbound manager@{ui}. The

With outbound manager you can manage your outbound mail. When you enter
into your outbound manager window, you will get list of our outbound mail.
List format is following:

Nodenumber         Age Flags     Bad Busy ArcMail Files
------------------ --- --------- --- ---- ------- -------
2:222/222.0          0 IC RFDE     0    0    45kB  1994kB
2:220/666.0          0   H FDE     0   12     3kB    10kB

Age tells you how old the oldest outgoing NetMail is, i.e. how long time
ago that node polled you.

@{i}Flags are:@{ui}

@{i}I@{ui}mmidiate
@{i}C@{ui}rash
@{i}H@{ui}old
File @{i}R@{ui}equest
@{i}F@{ui}ile attach
@{i}D@{ui}irect
@{i}E@{ui}rase file when sent

@{i}Bad@{ui} tells you number of many unsuccessfull mailsessions there is.
You can limit number of these from @{"BCFG4" link CFG_BCFG4}.

@{i}Busy@{ui} tells you number of busy calls. Busycalls area cleared every
night.

@{i}ArcMail@{ui} tells you amount of outbound ArcMail.

@{i}Files@{ui} tells you amount of outbound Files.

@{b}command@{ub}-parameter can be any valid @{i}outbound manager command@{ui}:

@{i}L@{ui}ist {@{b}node#@{ub}}                    List messages (for node)
@{i}CH@{ui}ange [@{b}message#|node#@{ub}] {@{b}modif@{ub}} Change message number/all messages for node
@{i}C@{ui}reate [@{b}node#@{ub}] {@{b}modifiers@{ub}}      Create message for node
@{i}D@{ui}elete [@{b}message#@{ub}]               Delete message
@{i}BA@{ui}d [@{b}node#@{ub}] [@{b}number@{ub}]            Change number of bad polls for node
@{i}B@{ui}usy [@{b}node#@{ub}] [@{b}number@{ub}]           Change number of busy polls for node
@{i}CL@{ui}ear                           Clear tickdir and attach messages
@{i}Q@{ui}uit                            Quit back to main menu

@{b}Modifiers@{ub} are:

{@{i}New_to_Node#@{ui}}
{@{i}+@{ui}|@{i}-@{ui}}@{i}I@{ui}mmediate  {@{i}+@{ui}|@{i}-@{ui}}@{i}C@{ui}rash  {@{i}+@{ui}|@{i}-@{ui}}@{i}H@{ui}old  {@{i}+@{ui}|@{i}-@{ui}}@{i}R@{ui}equest  {@{i}+@{ui}|@{i}-@{ui}}@{i}F@{ui}ile  {@{i}+@{ui}|@{i}-@{ui}}@{i}D@{ui}irect
{@{i}+@{ui}|@{i}-@{ui}}@{i}E@{ui}rase      {@{i}+@{ui}|@{i}-@{ui}}@{i}T@{ui}runc  {@{i}+@{ui}|@{i}-@{ui}}@{i}L@{ui}ock
{@{i}New_Subject@{ui}}
@endnode


@node SYS_CMDLINE_BPC "BBBS BPC - Pack a conference with criterias"
@{i}Usage:@{ui} @{b}bbbs.exe bpc a [areaname] [min] [max]@{ub}
       or @{b}bbbs.exe bpc b@{ub}
       or @{b}bbbs.exe bpc s [areaname] [num]@{ub}
       or @{b}bbbs.exe bpc r [areaname]@{ub}
       or @{b}bbbs.exe bpc t@{ub}

@{b}BPC@{ub} is used to renumber the messages in the conferences. @{i}DO NOT RUN@{ui}
@{i}ANY BPC COMMANDS WHILE THERE ARE USERS LOGGED IN!@{ui} This will cause very
nasty effects you don't want to experience. Don't say we didn't warn you.

@{b}BPC A@{ub} will delete messages from the conference @{b}areaname@{ub}, so that at
least @{b}min@{ub} messages are left active, but no more than @{b}max@{ub}.

@{b}BPC B@{ub} works like @{b}BPC A@{ub}, but it processes all the conferences, reading
the @{b}min@{ub} and @{b}max@{ub} values from the @{"conference configuration" link global_confs} in @{"BCFG4" link CFG_BCFG4}.

@{b}BPC S@{ub} deletes all messages from the conference @{b}areaname@{ub} that have a
number smaller than @{b}num@{ub}.

@{b}BPC R@{ub} will repair the conference @{b}areaname@{ub}, renumbering the messages so
that the first active message will be the message number one.

@{b}BPC T@{ub} scans for bad areas and fixes them, if any are found. It will
also renumber the conference like @{b}BPC R@{ub}, if there are more than 62000
active messages in the conference.
@endnode

@node SYS_CMDLINE_BPOP "BBBS BPOP - Receive mail from POP3 server"
@{i}Usage:@{ui} @{b}bbbs.exe bpop [host] [userid] [password]@{ub}

@{b}BPOP@{ub} receives and deletes all mail from @{b}userid@{ub}'s POP3 mailbox in host @{b}host@{ub},
using the password @{b}password@{ub}. BPOP first tries to make a secure APOP login
and then falls back to normal login if that is unsuccessful. If you want
to send your email out, you must of course use the @{"BBBS BSMTP" link SYS_CMDLINE_BSMTP} command.

POP3 cannot be reliably used with BBS's as the real receiver's name cannot
be determined. Still, BBBS will try to figure it out from the "To:"-line.
It is very recommended to use bbbs.smtpd.exe instead.
@endnode

@node SYS_CMDLINE_BPUS "BBBS BPUS - Pack the user database"
@{i}Usage:@{ui} @{b}bbbs.exe bpus@{ub}

@{b}BPUS@{ub} will pack the user database by removing all @{i}killed@{ui} users. @{i}DO NOT@{ui}
@{i}USE THE BPUS COMMAND WHILE THERE ARE USERS LOGGED IN!@{ui} This will cause
nasty effects you will not want to experience. Don't say we didn't
warn you.
@endnode

@node SYS_CMDLINE_BRSA "BBBS BRSA - Generate new RSA keys"
@{i}Usage:@{ui} @{b}bbbs.exe brsa@{ub}

BRSA generates new RSA keys for BZLink-Lite connections by making a new
bzll.dat-file to the main-directory. Please be patient, it might take a
long while to run.
@endnode

@node SYS_CMDLINE_BSETPACK "BBBS BSETPACK - Pack the environment variable settings file"
@{i}Usage:@{ui} @{b}bbbs.exe bsetpack@{ub}

@{b}BSETPACK@{ub} packs the user settings file. This command should be run
every day. @{i}DO NOT RUN BSETPACK WHILE THERE ARE USERS LOGGED IN!@{ui} This
will cause nasty effects you will not want to experience. Don't say we
didn't warn you.
@endnode


@node SYS_CMDLINE_BSMTP "BBBS BSMTP - Exchange email with SMTP servers"
@{i}Usage:@{ui} @{b}bbbs.exe bsmtp w [hostname]@{ub}
       or @{b}bbbs.exe bsmtp r [hostname]@{ub}

@{b}BSMTP@{ub} is used to exchange email with @{i}SMTP@{ui} servers. @{b}BSMTP W@{ub} sends and
receives email to/from the specified host. Receiving email requires a
@{b}SMTP@{ub} server that supports the 'turn' command. This is unusual, as
the 'turn' command in SMTP sessions creates a well-known security
hole. To receive email, you can use BBBS's internal SMTP daemon,
@{b}bbbs.smtp.exe@{ub}.

@{b}BSMTP R@{ub} simply sends all outgoing email to the specified host.
@endnode


@node SYS_CMDLINE_BSTAT "BBBS BSTAT - Show a statistics list"
@{i}Usage:@{ui} @{b}bbbs.exe bstat@{ub}

@{b}BSTAT@{ub} displays some BBBS usage statistics for the last seven days. It
displays the total amount of online minutes, calls and messages left
to the system.
@endnode


@node SYS_CMDLINE_BTICK "BBBS BTICK - Process he incoming TICK files from file-echoes"
@{i}Usage:@{ui} @{b}bbbs.exe btick@{ub}

@{b}BTICK@{ub} is used to process the incoming @{b}TICK@{ub} files from the
@{"file-echoes" link CFG_EXTERNAL_NET_TICK} and to place the files to correct file areas in your
BBBS. You should run this command every time you receive @{b}TICK@{ub} files.
@endnode

@node SYS_CMDLINE_BTIME "BBBS BTIME - Adjust the time with a timeserver"
@{i}Usage:@{ui} @{b}bbbs.exe btime [hostname] [socket_number] [max_diff] [add_secs]@{ub}

@{b}BTIME@{ub} can be used to adjust the clock of your computer according to the
time on a @{i}timeserver@{ui} residing in the host specified by @{b}hostname@{ub}, at the
socket specified by @{b}socket_number@{ub}. Normally, the socket number is 37,
the standard time socket.

The @{b}max_diff@{ub} parameter should be used to specify the maximum
difference (in seconds) that can exist. If the difference is greater than
@{b}max_diff@{ub} seconds, then no adjusting is done.

@{b}add_secs@{ub} specifies the amount of seconds to add to the time received from
the timeserver. It should be 0, unless the 'ping' time to the timeserver
host is very long.
@endnode

@node SYS_CMDLINE_BTXT2BBS "BBBS BTXT2BBS - Convert a text file to a message"
@{i}Usage:@{ui} @{b}bbbs.exe btxt2bbs [areaname] [file] {/F from} {/T to} {/S subject}@{ub}

@{b}BTXT2BBS@{ub} is used to import a single text file to the BBBS message
base. @{b}areaname@{ub} is the name of the area that the message should be
written to. @{b}file@{ub} is the name of the file to be written. The @{b}/F@{ub}, @{b}/T@{ub} and
@{b}/S@{ub} switches can be used to change the sender, receiver and subject of
the message, but they are optional. They default to "SysOp", "all" and
the name of the file being written.
@endnode


@node SYS_CMDLINE_BWHO "BBBS BWHO - Show who is online at the moment"
@{i}Usage:@{ui} @{b}bbbs.exe bwho@{ub}

@{b}BWHO@{ub} shows the online status of the system at the moment, in the same
format as BBBS's internal who-command.
@endnode

@node SYS_TCPIP "BBBS in TCP/IP networks"
All versions of BBBS (except the PC-DOS version, @{"BBBS/D" link SYS_DIFFS_DOS}) can be very
easily interfaced with @{b}TCP/IP@{ub} networks, such as the Internet. BBBS
comes equipped with all necessary tools for TCP/IP network
connections.

Access configuration for all Internet features is done with the
@{"inet.bbb-file" link CFG_INET}. If you want your users to be able to use the network
features, be sure to check that this file is set up correctly.

The special executables (@{b}bbbs.telnetd.exe@{ub} etc) are present only in @{"BBBS/2" link SYS_DIFFS_OS2}
and @{"BBBS/NT" link SYS_DIFFS_NT} versions, as the @{"UNIX versions" link SYS_DIFFS_NIX} communicate through
stdin/stdout and are therefore simple to configure into using a TCP/IP
network.


@{i}Outgoing telnet connections@{ui}

If you want BBBS to be able to "dial" out with the standard @{b}telnet@{ub}
protocol, for example to do mail polls via the Internet, you must
start BBBS with the @{b}TCPIP@{ub} @{i}device@{ui}. When doing so the @{b}com@{ub} parameter
is ignored.

Note that nodes that are started for TCP/IP dialling should have
@{"slow protocols" link bcfg1804} enabled in @{"BCFG4" link CFG_BCFG4}. Also, the "dial string" should be just
@{b}ATD@{ub}, @{i}not@{ui} "ATDT". With outgoing telnet connections, the ATZ
command is used to control the connection type: ATZ7 defaults to 7-bit
connection, ATZ8 to an 8-bit one.

For a telnet poller, following @{"nodelist" link CFG_EXTERNAL_NET_NODELIST} format should be used:

@{b};A With just an IP-address, using nonstandard port 666:@{ub}
@{b};A@{ub}
@{b},1000,A_Telnet_Poller,Cyberspace,Joe_Hacker,192.210.9.14:666,300,IP@{ub}
@{b};A@{ub}
@{b};A With a nameserver address, using default port 23:@{ub}
@{b};A@{ub}
@{b},1000,A_Telnet_Poller,Cyberspace,Joe_Hacker,bbs.telnetpoll.org,300,CM,IP@{ub}


@{i}Incoming telnet connections@{ui}

For incoming @{b}telnet@{ub} communications, the program @{b}bbbs.telnetd.exe@{ub} is
provided. It will act as a @{i}telnet daemon@{ui} and a gateway between the
telnet connection and the BBBS. With @{b}bbbs.telnetd.exe@{ub}, both user logins
and mail polls are possible via telnet. Of course, for polling to be
possible @{i}BackDoor@{ui} must be enabled in @{"BCFG4" link CFG_BCFG4}.

The calling convention for @{b}bbbs.telnetd.exe@{ub} is:

@{b}bbbs.telnetd.exe <min_node> <max_node> <socket> [priority] ["identd"]@{ub}

@{b}min_node@{ub} is the first node to use for telnet connections, @{b}max_node@{ub} is
the last one. @{b}socket@{ub} is the number of the @{i}socket@{ui} @{b}bbbs.telnetd.exe@{ub} should
watch for incoming connections. 23 is the default telnet port, but you can
specify any port you like. @{b}Priority@{ub} defines the @{"OS priority" link bcfg1100}
@{b}bbbs.telnetd.exe@{ub} should run in.

The final parameter @{b}identd@{ub} can be specified if you want to use
@{b}identd@{ub} with the telnet connections. When @{b}identd@{ub} is used, the user id
of the telnetter is reported, along with the @{i}IP address@{ui} the user is
telnetting from. Using @{b}identd@{ub} is recommended only if you really need it.

When @{b}bbbs.telnetd.exe@{ub} detects an incoming telnet connection for the port
it was started into, it will spawn @{b}dotbbbs.cmd@{ub} (@{b}dotbbbs.bat@{ub} in
@{"BBBS/NT" link SYS_DIFFS_NT}) in the current directory. This batch file should contain the
necessary commands to start BBBS with the parameters given to the
batch file.

Nodes that are configured for telnet connections should have the string
"telnet" in their @{"FD's DOBBS.BAT-field" link bcfg603} in @{"BCFG4" link CFG_BCFG4}.


@{i}Incoming SMTP connections@{ui}

BBBS can deal with incoming @{i}SMTP@{ui} connections with the @{b}bbbs.smtpd.exe@{ub} mail
daemon program. It will keep an eye on a specific port and deal with
incoming SMTP connections accordingly. The calling convention of
@{b}bbbs.smtpd.exe@{ub} is:

@{b}bbbs.smtpd.exe [socket_number] {priority}@{ub}

@{b}socket_number@{ub} is the number of the socket the mail daemon should be started
to. The standard SMTP socket is 25, but you can start the daemon also to
nonstandard ports. @{b}Priority@{ub}-parameter defines the @{"OS priority" link bcfg1100} the daemon
should run in.

You can send out email with the SMTP protocol with the BBBS command line
command @{"BSMTP" link SYS_CMDLINE_BSMTP}.

BBBS also supports POP3 connections with for receiving email with
@{"BBBS BPOP" link SYS_CMDLINE_BPOP}. This is not recommended on multi-user systems, though.


@{i}Incoming finger connections@{ui}

For incoming @{b}finger@{ub} connections, the BBBS finger daemon @{b}bbbs.fingerd.exe@{ub} is
provided. It will keep an eye on a specific port and deal with incoming
finger connections accordingly. The calling convention of @{b}bbbs.fingerd.exe@{ub}
is:

@{b}bbbs.fingerd.exe [socket_number] {priority}@{ub}

@{b}socket_number@{ub} is the number of the socket the finger daemon should be
started to. The standard finger socket is 79, but you can start the daemon
also to nonstandard ports. @{b}Priority@{ub}-parameter defines the @{"OS priority" link bcfg1100} the
daemon should run in.

Remember to check you @{"inet.bbb" link CFG_INET} file for incoming finger configuration!


@{b}Example:@{ub}

A sample dotbbbs.cmd file:

@{b}c:@{ub}
@{b}cd \\bbs@{ub}
@{b}bbbs.exe %1 %2 %3 %4 %5 %6 %7@{ub}
@endnode



@node SYS_WAITFORCALLER "Waiting for a caller screen"
When BBBS is waiting for a caller, it displays some statistics, like
the name of the previous caller and the amount of messages entered. In
this screen, there are some keys that you can use to invoke different
options. They are listed below.

You can also select all these options from the pull-down menus,
activated with the @{b}F1@{ub} key. Some of the options are available only if
you have enabled @{i}Backdoor@{ui} from @{"BCFG4" link CFG_BCFG4}. They are marked with an
asterisk ('@{b}*@{ub}').

@{i}alt-A@{ui}      Set SysOp available for chat requests.
@{i}alt-B@{ui}      Set modem busy and exit BBBS.
@{i}alt-E@{ui}      Exit with an errorlevel.
@{i}alt-F@{ui}      Force modem to answer an incoming call now.
@{i}alt-G@{ui}      Request a file from a remote system. @{b}*@{ub}
@{i}alt-J@{ui}      Start the @{"BTERM Terminal Emulator" link BTERM0}.
@{i}alt-L@{ui}      Make a local login to this node.
@{i}alt-N@{ui}      Set SysOp not available for chat requests.
@{i}alt-O@{ui}      Start the @{i}outbound manager@{ui}. @{b}*@{ub}
@{i}alt-P@{ui}      Poll a remote system. @{b}*@{ub}
@{i}alt-Q@{ui}      Exit BBBS with errorlevel 0.
@{i}alt-S@{ui}      Send a file to a remote system. @{b}*@{ub}
@{i}alt-X@{ui}      Reset modem.
@{i}alt-Z@{ui}      Jump to OS shell.
@{i}space@{ui}      Rescan outbound messages. @{b}*@{ub}
@endnode

@node SYS_KEYS "Local SysOp keys"
Listed below are the local sysop keys you can use when an user is
logged into your BBBS system, assuming you have enabled them in
@{"BCFG4" link CFG_BCFG4}.

@{i}F10@{ui}        Show information about the user that is online.
@{i}F6@{ui}         Start full screen SysOp-to-user chat. Press @{b}ESC@{ub} to end it.
@{i}F7@{ui}         Start line-by-line SysOp-to-user chat. Press @{b}F7@{ub} again to
           end chat.
@{i}shift-F1@{ui}   Reduce the online users' time by 5 minutes.
@{i}shift-F2@{ui}   Reduce the online users' time by 1 minute.
@{i}shift-F3@{ui}   Increase the online users' time by 1 minute.
@{i}shift-F4@{ui}   Increase the online users' time by 5 minutes.
@{i}shift-F5@{ui}   Reduce the online users' time limit by 5 minutes, permanently.
@{i}shift-F6@{ui}   Reduce the online users' time limit by 1 minute, permanently.
@{i}shift-F7@{ui}   Increase the online users' time limit by 5 minutes, permanently.
@{i}shift-F8@{ui}   Increase the online users' time limit by 5 minutes, permanently.
@{i}alt-A@{ui}      Set SysOp available for chat requests.
@{i}alt-B@{ui}      Enters backscroll mode. Cursor keys up and down scroll, @{b}ESC@{ub}
           key ends backscroll. @{b}Enter@{ub} and @{b}space@{ub} keys paste the middle
           line to the user screen . The backscroll is completely transparent;
           the remote user will not notice that you are in backscroll.
           Backscroll cannot be used while the user is downloading. Backscroll
           is available only in operating systems that have threads.
@{i}alt-C@{ui}      Start full screen SysOp-to-User chat. Same as @{b}F6@{ub}.
@{i}alt-E@{ui}      Toggle whether the stuff sent to remote users' screen
           should be displayed in local screen.
@{i}alt-F@{ui}      Grant file access to the user online. This is a permanent
           access change.
@{i}alt-K@{ui}      Hangup this node now.
@{i}alt-L@{ui}      Lock the remote keyboard. With this you can make sure that
           the remote user does not interfere with what you're doing on the
           node. Very useful when you grant temporarly SysOp access.
@{i}alt-N@{ui}      Set SysOp not available for chat requests.
@{i}alt-Q@{ui}      Take this node down after the current user logs out.
@{i}alt-S@{ui}      Toggle temporary SysOp access #255 for the user
           online.
@{i}alt-U@{ui}      Adds a file to the outgoing batch in @{b}HYDRA@{ub} sessions. You
           should write the name of the file to be added to the chat
           window.
@{i}alt-Z@{ui}      Drop to OS shell. The user online will get a message
           informing him that the SysOp has dropped into OS and that
           he should wait for the SysOp to return. Nasty.
@{i}alt-0@{ui}      Run @{"keyboard macro" link bcfg801} 0.
@{i}alt-1@{ui}      Run keyboard macro 1.
@{i}alt-2@{ui}      Run keyboard macro 2.
@{i}alt-3@{ui}      Run keyboard macro 3.
@{i}alt-4@{ui}      Run keyboard macro 4.
@{i}alt-5@{ui}      Run keyboard macro 5.
@{i}alt-6@{ui}      Run keyboard macro 6.
@{i}alt-7@{ui}      Run keyboard macro 7.
@{i}alt-8@{ui}      Run keyboard macro 8.
@{i}alt-9@{ui}      Run keyboard macro 9.
@endnode

@node BTERM0 "BTERM, the small VT320 terminal emulator"
@{b}BTERM@{ub}, accessible from either the waiting for a caller-screen or from
the command line by specifying the device @{b}BTERM@{ub} (or by starting
the BBBS executable named to @{b}bterm.exe@{ub}), is a small VT320 terminal emulator.
It allows you to call to other systems quickly, without having to start
another program.

When @{b}BTERM@{ub} is started from the command line, any additional
parameters after the device will be interpreted as script names to be
executed.

If @{b}BTERM@{ub} is started with the @{b}ISDN@{ub} device (@{"OS/2 version" link SYS_DIFFS_OS2} only), then @{b}BTERM@{ub}
can interface the ISDN CAPI via a simple Hayes command emulation:

@{b}Command       Action@{ub}
@{b}========================================================@{ub}
@{b}ATA@{ub}           Answers incoming ISDN call.
@{b}ATDxxxx@{ub}       Dials number xxxx.
@{b}ATI@{ub}           Gives some information.
@{b}ATZ@{ub}           Initializes the ISDN CAPI.
@{b}ATZx@{ub}          Specifies the EAZ level @{b}x@{ub}.

If @{b}BTERM@{ub} is started with the @{b}TCPIP@{ub} device, then BTERM can "dial" out
using the standard TCP/IP telnet protocol. The @{b}ATD@{ub} command can be used
to achieve this. After the ATD command, simply insert the hostname or
an absolute IP address. For example, to telnet to @{b}fix.no@{ub}, just type
"ATDfix.no". If you want to specify a different port than the standard
telnet port (23), then you should separate it from the hostname or
IP address with the colon character ("@{b}:@{ub}"). For example, to telnet to
foobar.org, port 3000, type "ATDfoobar.org:3000". Also, the ATZ command can
be used to control the telnet connection type: ATZ7 defaults to 7-bit
connections, ATZ8 to 8-bit ones.

The following keys can be used in the terminal screen:

@{i}F1@{ui}    Show this help.
@{i}F5@{ui}    Toggle @{"BZLink-Lite" link BTERM0_BZLL} on/off. When you are connected with
      @{i}BZLink-Lite@{ui}, you cannot disable it.
@{i}F6@{ui}    Set @{i}BZLink-Lite@{ui} file transfer priority. Priority 1 is the
      slowest.
@{i}F7@{ui}    Show some @{i}BZLink-Lite@{ui} statistics: status of current
      download/upload, the amount of sent packets and the amount of
      resends for this session.
@{i}Alt-A@{ui} Toggle audio bell on/off.
@{i}Alt-B@{ui} Enter backscroll mode. Up/down arrow keys scroll, @{b}space@{ub} and
      @{b}enter@{ub} keys paste the middle line to the terminal.
@{i}Alt-C@{ui} Select the @{"character set" link bterm4} to use. By default, BTERM uses the
      @{b}ISO@{ub} character set.
@{i}Alt-E@{ui} Execute a @{"BZ-script" link BZ_MAIN} in BTERM mode.
@{i}Alt-F@{ui} Send a FAX.
@{i}Alt-G@{ui} @{"Get (download) a file." link bterm5}
@{i}Alt-J@{ui} Clear screen.
@{i}Alt-K@{ui} Hang up now, without asking.
@{i}Alt-L@{ui} Toggle the log file (@{b}bterm.log@{ub}) on/off.
@{i}Alt-M@{ui} Toggle newline/linefeed mode.
@{i}Alt-O@{ui} Record a voice file.
@{i}Alt-P@{ui} Enter the @{"phonebook" link bterm_alt-p}.
@{i}Alt-Q@{ui} Quit BBBS, exit straight into the OS.
@{i}Alt-R@{ui} Send a break signal.
@{i}Alt-S@{ui} @{"Send (upload) a file" link bterm1}.
@{i}Alt-T@{ui} Display the elapsed online time.
@{i}Alt-V@{ui} Playback a voice file.
@{i}Alt-X@{ui} Quit @{b}BTERM@{ub}; exit into the caller waiting screen or into
      OS, depending on where @{b}BTERM@{ub} was started from.
@{i}Alt-Z@{ui} Shell into the OS.
@{i}Alt-0@{ui} Run @{"keyboard macro" link bcfg801} 0.
@{i}Alt-1@{ui} Run keyboard macro 1.
@{i}Alt-2@{ui} Run keyboard macro 2.
@{i}Alt-3@{ui} Run keyboard macro 3.
@{i}Alt-4@{ui} Run keyboard macro 4.
@{i}Alt-5@{ui} Run keyboard macro 5.
@{i}Alt-6@{ui} Run keyboard macro 6.
@{i}Alt-7@{ui} Run keyboard macro 7.
@{i}Alt-8@{ui} Run keyboard macro 8.
@{i}Alt-9@{ui} Run keyboard macro 9.
@endnode

@node BTERM_ALT-P "The BTERM Phonebook"
Pressing ALT-P in the BTERM terminal screen opens the phonebook.

The following keys can be used:

@{i}Up/Down@{ui}  Move the selector.
@{i}Space@{ui}    Mark the system under the selector.
@{i}Enter@{ui}    Start dialing. If no systems are marked, the system under the
         selector is dialled. Otherwise, the systems are dialed in the
         order they were marked.
@{i}E@{ui}        Edit the entry under the selector.
@{i}Del@{ui}      @{"Delete" link bterm8} the entry under the selector.
@{i}Ins@{ui}      Insert @{"a new entry" link bterm2} to the selector position.
@{i}ESC@{ui}      Exit phonebook to terminal screen.

BBBS uses the file @{b}bterm.pho@{ub} to store the phonebook.
@endnode

@node BTERM8 "Really delete phonebook entry -dialog"
When you delete entries, BTERM wants you to confirm that really want to delete the phonebook entry.

If you do, press Y. If you do not, press N.
@endnode

@node bterm2 "BBS name -dialog"
When inserting entries, you will be presented with two dialogboxes. To the BBS name-dialog you should enter the name of the system in question. After this, you will get the @{"BBS phonenumber -dialog" link bterm3}
@endnode

@node bterm3 "BBS phonenumber -dialog"
Enter here the phonenumber(s) of the system. If the system has many nodes,
just enter them all. When you have entered enough phonenumbers, press
enter on an empty dialog. When dialling to a system, BTERM will call the
numbers you entered sequentially.

Note that BTERM will do phone number conversion to these entries, too!
@endnode

@node bterm5 "Download a file -dialog"
Alt-G starts file downloading (gets a file from remote).

BTERM supports following file transfer protocols for downloading files:

        @{b}H@{ub}YDRA          bidirectional with chat
        @{b}S@{ub}low-HYDRA     HYDRA for 7bit links
        @{b}Z@{ub}modem         unidirectional full stream
        @{b}Y@{ub}modem         unidirectional with block acking
        Z@{b}e@{ub}dZap         Zmodem with 8kB blocks
        @{b}K@{ub}ermit         unidirectional, bit slow, but very universal

If you use HYDRA you can also upload files at the same time. To add files after you have started a download session, press @{i}Alt-C@{ui} to enter the HYDRA chat window. Then type the filename with full pathname and press @{i}Alt-U@{ui} to add it to the outgoing batch.
@endnode

@node bterm1 "Filename to upload -dialog"
When you start uploading, you will be presented with a dialog to which you should enter the file names that should be uploaded (@{"wildcards" link APP_WILDCARDS} are ok). Press @{i}Enter@{ui} on an empty dialog to enter the file selector.

After this dialog, you will be presented with @{"the upload protocol-dialog" link bterm6}. In the selector you can move with the cursor keys, @{"delete a file" link bterm7} with the @{i}del@{ui}-key and send the file under the selector with the space bar.
@endnode

@node bterm6 "Upload protocol -dialog"
BTERM supports following file transfer protocols for uploading files:

@{b}H@{ub}YDRA          bidirectional with chat
@{b}S@{ub}low-HYDRA     HYDRA for 7bit links
@{b}Z@{ub}modem         unidirectional full stream
@{b}Y@{ub}modem         unidirectional with block acking
Z@{b}e@{ub}dZap         Zmodem with 8kB blocks
@{b}X@{ub}modem         slow, but universal
@{b}K@{ub}ermit         unidirectional, bit slow, but very universal
@{b}A@{ub}SCII          just dump text file to remote

If you use HYDRA you can also download files at the same time. To add files after you have started a upload session, press @{i}Alt-C@{ui} to enter the HYDRA chat window. Then type the filename with full pathname and press @{i}Alt-U@{ui} to add it to the outgoing batch.
@endnode

@node bterm7 "Really delete -dialog"
When you press @{i}del@{ui} in the file selection dialog, BTERM wants you to confirm that really want to delete this file.

If you do, press Y. If you do not, press N.
@endnode

@node bterm4 "Select charset -dialog"
Alt-C gives you a list of character sets that you can choose.

Possible choices are:

@{b}I@{ub}SO Latin-1    8bit, used in most InterNet systems  (default)
IBM @{b}P@{ub}C         8bit, used in most BBS systems
@{b}F@{ub}innish        7bit, used in some BBS in Finland
@{b}N@{ub}orwegian      7bit, used in some BBS in Norway
@{b}U@{ub}K             7bit, no national charset conversion
@{b}M@{ub}AC            8bit, used by MAC computers
@endnode

@node BTERM0_BZLL "The BZLink-Lite protocol"
One of the most powerful features of @{"BTERM" link BTERM0} and BBBS is the support of
the @{b}BZLink-Lite@{ub} protocol. There are many advantages from using
@{b}BZLink-Lite@{ub}. One of these features is the secure login
service. Systems that can act as @{b}BZLink-Lite@{ub} servers (like BBBS)
autodetect @{b}BZLink-Lite@{ub} clients (like BTERM) at login and make the
login secure, so that no passwords are transferred between systems,
only encrypted strings.

Another great feature of @{b}BZLink-Lite@{ub} is that file transfers are
completely transparent: you can start receiving a file and continue
your business in the BBS in a normal way, with a negligible loss of
response time or file transfer speed.

BTERM's @{b}BZLink-Lite@{ub} client mode is activated with the @{b}F5@{ub} key in the
terminal mode. Next login to a system with a @{b}BZLink-Lite@{ub} server will
then be a @{b}BZLink-Lite@{ub} one.

The priority of @{b}BZLink-Lite@{ub} file transfers can be used to control how
much bandwidth is dedicated to the file transfer and how much to
normal BBS usage. With priority 1, most of the time is dedicated to
normal usage. Higher priority means faster file transfer, but slower
response time for other activities. The (approximate) file transfer
speed is @{b}priority*512@{ub} characters per second. Within BTERM, the
priority can be changed with the @{b}F6@{ub} key.
@endnode


@node bz_main "BBBS Scripts: The BZ Programming Language"
For heavy customization, BBBS has the possibility to run @{b}BZ49@{ub} processor
binaries. All scripts that are executed by BBBS are BZ49 binaries. The @{"bzc.exe" link BZ_MAIN_BZC}
compiler program that came with BBBS can be used to generate BZ49 binaries
with the @{i}BZ programming language@{ui}. The BZ language (hereafter referred to
only as BZ) is a very powerful programming language, with features from @{i}C@{ui},
@{i}Pascal@{ui} and @{i}perl@{ui}.

BZ source code files have the extension @{b}.BZ@{ub}. BZ language header files have
the extension @{b}.BZH@{ub}. BZ49 binaries have the extension @{b}.BZB@{ub}. BZ49 assembly
source code files should have the extension @{b}.BZS@{ub}.

BBBS will run the following scripts, residing in the script directory
specified in @{"BCFG4" link CFG_BCFG4}:

@{b}Script     When it is run?@{ub}
@{b}=========================================================================@{ub}
@{b}ascript@{ub}    Always when a user logs in.
@{b}auscript@{ub}   After a user has entered a description for a uploaded file.
@{b}brobo@{ub}      When a user sends an unknown command to BRoboCop.
@{b}dscript@{ub}    After a user has downloaded a file.
@{b}editor@{ub}     When a user starts message editing and his editor is "script".
@{b}error@{ub}      When a user enters an unknown command.
@{b}gascript@{ub}   When a user logs out with the @{i}g a@{ui}-command.
@{b}gscript@{ub}    When a user logs out normally.
@{b}gotfax@{ub}     When a FAX is received.
@{b}gotmail@{ub}    When new @{i}FidoNet@{ui} mail is received.
@{b}gotvoice@{ub}   When a voice call is received.
@{b}hotlog@{ub}     After a special hotlogin string from the user.
@{b}lscript@{ub}    When the user logs out, after @{b}GSCRIPT@{ub} and @{b}GASCRIPT@{ub}.
@{b}msgfilt@{ub}    After a user has saved a message in a message editor.
@{b}msgpfilt@{ub}   Before the message editor is invoked.
@{b}newupass@{ub}   Before asking the @{"closed system password" link bcfg203}.
@{b}nodemsgf@{ub}   When a user receives a node message (to show it).
@{b}notavail@{ub}   After a chat request, if sysop is not available.
@{b}opendoor@{ub}   When a user executes the main menu @{i}OPen@{ui} command.
@{b}postchat@{ub}   After sysop-to-user chat has ended.
@{b}rscript@{ub}    After a new user has registered to the system.
@{b}script@{ub}     When a user executes the main menu @{i}Answer@{ui}-command.
@{b}snooze@{ub}     When a user is about to be sleep disconnected.
@{b}uscript@{ub}    After a user has uploaded a file.

Also, every time BBBS tries to print the string @{b}\\2foo\\2@{ub}, where @{b}\\2@{ub} is the
ASCII character 2, the script @{b}foo@{ub} is run. This can be used almost
everywhere BBBS displays something; the @{b}bbbstxt@{ub}-files, @{"menus" link CFG_FILES_MENUS}, bulletins...

Some BZ-scripts have parameters passed to their main()-function. See the
examples that came with the distribution package to see which ones do,
and what.

This manual documents BZ, but is not a guide to learn programming with. We
assume that you have done programming with a structured programming language
like @{i}C@{ui} or @{i}Pascal@{ui} before. If you haven't, then there are a lot of good books
and tutorials out there that teach the concepts of structured programming.
Reading a C tutorial/book will help tremendously as many BZ functions
resemble their C counterparts or are exactly the same.

As the source code of BZ is pure ASCII, you can use any text editor to
create your source. Remember that @{i}CASE IS IMPORTANT@{ui}, like in all major
languages. Whitespace (such as spaces, tabulators, carriage returns or line
feeds) is not important, but using them makes the source look cleaner and
it is easier for you and other people looking at your source to understand
what you mean. The compiler, however, does not care how you arrange the
source, so you can write it as you see fit.

In the distribution package, several examples of BZ scripts have been
supplied. The best way to learn BZ is to study these files carefully
and modify them to see what happens. Try it out! You really can't break
anything!

Note that BBBS also supports the use of some @{"other script languages" link BZ_OTHER}.
@endnode

@node bz_main_exps "BZ Language: Expressions"
Every @{b}BZ@{ub} command is an @{i}expression@{ui}. A simple function call @{b}foobar()@{ub} is an
expression the value of which is the return value of the function @{b}foobar@{ub}.
The name of a variable is an expression with the value of the variable.
Expressions can be grouped with @{"operators" link BZ_MAIN_OPERATORS} to form more complex expressions.
The @{i}evaluating@{ui} of an expression means that the value of it is determined.
Integer @{"constants" link BZ_MAIN_CONSTANTS} evaluate into the value the @{i}constant@{ui} represents. String
constants evaluate into 0 when they are used in an arithmetic context.
Otherwise, they evaluate into the sequence of characters the string
represents.

Every expression also evaluates into a @{i}boolean value@{ui}; @{b}true@{ub} or @{b}false@{ub}.
Expression is false if the value of it is 0, any other value means that the
expression is true.

An @{i}assignment@{ui} is an expression in which the value of an expression is placed
into a variable. The value of an assignment expression is the value of
the variable that is assigned to the other variable. Thus, the value of an
expression like @{i}a=5@{ui} is 5. The value of the expression @{i}foo=2*500;@{ui} is 1000,
the value of the expression 2*500.

There is also the concept of a so-called @{i}conditional expression@{ui}: the syntax
of it is: @{b}expression?true:false@{ub}. First, the @{b}expression@{ub} is evaluated. If it
evaluates to true, then the @{b}true-part@{ub} of the conditional expression is
evaluated next. Otherwise, the @{b}false-part@{ub} is evaluated.
@endnode

@node bz_main_funcs "BZ Language: Functions and Variables"
The structure of a BZ program is:

@{b}function {@{ub}
   @{b}expression@{ub}
   @{b}expression@{ub}
   @{b}...@{ub}
@{b}}@{ub}

Therefore, BZ is based on @{i}functions@{ui}. The execution of a program starts from
the function @{b}main@{ub} and returning from it ends the program. "Execution" of a
program means the @{i}evaluation@{ui} of sequential @{"expressions" link BZ_MAIN_EXPS}.

A @{i}function@{ui} is defined with the @{i}keywords@{ui} @{b}int@{ub} or @{b}char@{ub}. For example:

@{b}// An example function@{ub}
@{b}/*@{ub}
   @{b}Note how BZ uses C++-style comments. Everything between /* and */ are@{ub}
   @{b}considered as comments. When there is a // in a line, everything after@{ub}
  @{b} it is considered to be a comment.@{ub}
@{b} */@{ub}
@{b}int example(int foo) {@{ub}
  @{b}// the code goes here@{ub}
@{b}}@{ub}

A function can also have @{i}parameters@{ui} passed to it. The parameters are listed
in the parenthesis, separated with commas. This example function has one
integer type of parameter called foo. Note how the @{i}block@{ui} (the function
code, in this case) is begun C-style. This is universal in BZ: blocks of
code always start with curly brackets. There are a number of functions and
constructs already defined in the @{"BZ Runtime Library" link BZ_LIB}. They are the functions
you will mostly use.

A function is called by writing its name and the parameters that should be
passed to it in parenthesis. For example, the function above could be called
simply as @{b}example()@{ub}. BZ functions always return something, normally 0. The
special function @{b}return()@{ub} can be used to return from a function with a
value. Example:

@{b}// A function that always returns 42 (not very useful).@{ub}
@{b}int return_42() {@{ub}
  @{b}return(42);@{ub}
@{b}}@{ub}

The parameter of return can be any @{"expression" link BZ_MAIN_EXPS}.

The @{b}int@{ub} and @{b}char@{ub} keywords are also used to declare @{i}variables@{ui} in BZ.
After @{b}int@{ub} or @{b}char@{ub} the variable name should be written. Variable name can
consist of all letters and numbers and the underscore character '_'. A
variable name cannot begin with a number. Multiple variables can be defined
with a single keyword, they just need to be separated with commas. A
variable is only effective in the block that it is defined in. To declare a
global variable, declare it outside a function. In all cases, the variable
can be used only after the point it has been defined.

The keyword @{b}int@{ub} declares @{i}integer@{ui} variables and @{b}char@{ub} declares @{i}string@{ui}
variables. BZ does not have typing, so you can assign integer values to
string variables and vice-versa. However, this is @{b}VERY@{ub} bad style and might
retailiate in the future, when stricter typing is added to BZ someday.

@{b}// An example of a variable declaration:@{ub}
@{b}int example2() {@{ub}
@{b}   int  number,second_number;@{ub}
@{b}   char string,second_string;@{ub}
@{b}}@{ub}

When declaring variables, they can be assigned an initial value when they are
defined:

@{b}// An example of variable declaration with initial value:@{ub}
@{b}int example3() {@{ub}
@{b}   int  bz=42;@{ub}
@{b}   int  yebo=bz*49;@{ub}
@{b}   char b="Kim Heino",z="Tapani Salmi",pjh="Durak";@{ub}
@{b}}@{ub}

Naturally, variables can be assigned values. This is done with the =
@{"operator" link BZ_MAIN_OPERATORS}.

@{b}// An example of an assignment@{ub}
@{b}int example4() {@{ub}
@{b}   int foo,bar,buz;@{ub}

@{b}   foo=2;@{ub}
@{b}   bar=5;@{ub}
@{b}   buz=foo+bar;@{ub}
@{b}}@{ub}

Every variable in BZ is an @{i}index variable@{ui}. An index is referred to as
@{b}variable[index]@{ub}. The name of the variable is actually just index 0 of it.
Multiple indeces can also be given an initial value:

@{b}// An example of variable declaration with initial value on multiple indeces:@{ub}
@{b}int example5() {@{ub}
@{b}   char digits={@{ub}
@{b}     "0", "1", "2", "3", "4", "5", "6", "7", "8", "9"@{ub}
@{b}   };@{ub}

@{b}   digits[1];  // this contains the string constant "1".@{ub}

@{b}}@{ub}
@endnode

@node bz_main_bzc "bzc.exe: the BZ Language compiler"
@{b}bzc.exe@{ub} is the program that is used to compile BZ source codes into
@{b}BZ49@{ub} binaries. The calling convention of BZC is very simple:

@{b}bzc.exe file {*}@{ub}

The parameter @{b}file@{ub} is the file name to be compiled. It is not necessary to
write the extension .BZ. If you give the additional parameter, the asterisk
character, then @{b}bzc.exe@{ub} is run in debug mode: it displays the compiled
BZ49 assembly source file after compilation. It is only of use for die-hard
BZ49 gurus, so you should not bother.

bzc.exe also features a built-in @{i}preprocessor@{ui}. The preprocessor
first scans through the source file, before any compiling is done. It
understands two compiler directives: @{b}#include@{ub} and @{b}#define@{ub}.

The @{b}#include@{ub} compiler directive can be used to insert another source file to
a certain point in the source. It is simple to use; after the directive
should come the name of file to include at that point, enclosed between
"less than"- and "greater than"-characters or quotes. For style reasons,
you should only include files that have the extension @{b}.BZH@{ub}.

@{b}Examples:@{ub}

@{b}#include <foo.bzh>     // includes foo.bzh@{ub}
@{b}#include "foo.bzh"     // ...likewise...@{ub}


The @{b}#define@{ub} command can be used to create simple macros. The syntax of
@{b}#define@{ub} is:

@{b}#define OLD new@{ub}

After a @{b}#define@{ub} directive, whenever @{b}OLD@{ub} is encountered in the source, it is
replaced with @{b}new@{ub}.
@endnode


@node bz_main_constants "BZ Language constants"
A @{i}string constant@{ui} is a sequence of ASCII characters enclosed in quotes, for
example, @{b}"Hello"@{ub}, @{b}"World"@{ub}, or @{b}"Hello World"@{ub}. Some character can, or must be,
inserted by quoting it with `@{b}\\@{ub}' character.

        @{b}Quote    Character              ASCII@{ub}
        @{b}=====================================@{ub}
        \\"       "                         34
        \\\\       \\                         92
        \\a       Bell                       7
        \\b       Backspace                  8
        \\e       Escape                    27
        \\f       Form Feed                 12
        \\n       Line Feed                 10
        \\r       Carriage Return           13
        \\t       Horizontal Tabulator       9
        \\v       Vertical Tabulator        11

All other characters can be quoted by writing a backslash followed by
character's ASCII number in octal (base-8). For example ESC (\\e) can also
be written "\\033".

An @{i}integer constant@{ui} is a sequence of digits representing an integer value in
the range -2147483648 to 2147483647. An integer constant must start with a
digit from 1 to 9 or the negative sign `-' followed by a digit. You can also
use octal integers (base-8, starting with 0) and hexadecimals (base-16,
starting with 0x).
@endnode


@node bz_main_operators "BZ Language operators"
Below are listed all the operators in BZ language:

@{b}Operator      (Un|Bin)ary    What it is/does@{ub}
@{b}================================================================@{ub}
-             unary          Arithmetic negation
~             unary          Complement
!             unary          Logical NOT
++            unary          Increment by one
--            unary          Decrement by one
*             binary         Multiplication
/             binary         Division
%             binary         Remainder (Modulo)
+             binary         Addition
-             binary         Subtraction
<             binary         Is less than?
>             binary         Is greater than?
<=            binary         Is less than or equal to?
>=            binary         Is greater than or equal to?
==            binary         Is equal to?
!=            binary         Is inequal to?
&             binary         Bitwise AND
|             binary         Bitwise OR
^             binary         Bitwise Exclusive OR
&&            binary         Logical AND
||            binary         Logical OR
<<            binary         Bit shift left
>>            binary         Bit shift right
=             binary         Assignment
+=            binary         Assignment with addition
-=            binary         Assignment with substraction
*=            binary         Assignment with multiplication
/=            binary         Assignment with division
&=            binary         Assignment with bitwise AND
|=            binary         Assignment with bitwise OR
^=            binary         Assignment with bitwise Exclusive OR
<<=           binary         Assignment with bit shift left
>>=           binary         Assignment with bit shift right
@endnode

@node bz_other_rexx "REXX as the script language"
With @{"BBBS/2" link SYS_DIFFS_OS2} it is possible to use @{i}REXX@{ui} as the script language. When starting
a script, BBBS/2 first checks for the existence of a @{b}BZ49@{ub} binary. If one is
not found, then BBBS/2 will try to execute a @{b}CMD@{ub} file with the same name. If
one is found, it is then executed as a @{i}REXX@{ui} script. Note that you must have
REXX support installed, as BBBS REXX scripts are passed through the standard
REXX interpreter.

BBBS/2 adds some functions to rexx:

Function     Usage
============================================================================
@{b}bbbs_say@{ub}     Works like the normal REXX @{b}say@{ub} function, except that output is
             done to both local and remote screens.
@{b}bbbs_kbhit@{ub}   Works like the BZ Runtime Library @{"kbhit()" link BZ_LIB_KBHIT} command.
@{b}bbbs_getch@{ub}   Works like the BZ Runtime Library @{"getch()" link BZ_LIB_GETCH} command.
@{b}bbbs_input@{ub}   Works like the BZ Runtime Library @{"input()" link BZ_LIB_INPUT} command.
@{b}bbbs_getvar@{ub}  Gets a @{"BZ Runtime Library variable" link BZ_VAR}. Requires the variable name
             and optinally the @{i}index@{ui} (for such variables that are indexed)
             as parameters.
@{b}bbbs_setvar@{ub}  Sets a BZ Runtime Library variable. Requires the variable name
             and the value to be set and optionally the @{i}index@{ui} (for such
             variables that are indexed) as parameters.

Otherwise, there is nothing special about REXX scripts. They are just like
any other REXX scripts, except that they are executed by BBBS.
@endnode


@node bz_lib "The BZ Runtime Library by Categories"
The @{i}BZ runtime library@{ui} consists of the following predefined @{i}functions@{ui} and
@{i}constructs@{ui}. See also the @{b}stdlib.bzh@{ub} header file for constant definitions and
some extra functions.

See also the @{"alphabetic list of functions" link bz_lib_alphabetic}.

@{b}Constructs:@{ub}
@{"asm" link BZ_LIB_ASM}           @{"break" link BZ_LIB_BREAK}          @{"do...while" link BZ_LIB_DOWHILE}     @{"for" link BZ_LIB_FOR}            @{"if...else" link BZ_LIB_IF}
@{"return" link BZ_LIB_RETURN}        @{"switch...case" link BZ_LIB_SWITCHCASE}  @{"while" link BZ_LIB_WHILE}


@{b}General Functions:@{ub}
@{"beep()" link BZ_LIB_BEEP}        @{"breceive()" link BZ_LIB_BRECEIVE}     @{"bsend()" link BZ_LIB_BSEND}        @{"delay()" link BZ_LIB_DELAY}        @{"_delay()" link BZ_LIB_DELAY}
@{"exit()" link BZ_LIB_EXIT}        @{"help()" link BZ_LIB_HELP}         @{"tictactoe()" link BZ_LIB_TICTACTOE}    @{"yellsysop()" link BZ_LIB_YELLSYSOP}


@{b}Low-level Functions and System Calls:@{ub}
@{"bbbs() " link BZ_LIB_BBBS}       @{"bfile4()" link BZ_LIB_BFILE4}       @{"exec()" link BZ_LIB_EXEC}         @{"getenv()" link BZ_LIB_GETENV}       @{"getnodestatus()" link BZ_LIB_GETNODESTATUS}
@{"make_pcboard12sys()" link BZ_LIB_MAKE_PCBOARD12SYS}          @{"make_pcboard14sys()" link BZ_LIB_MAKE_PCBOARD14SYS}           @{"sendnode()" link BZ_LIB_SENDNODE}
@{"setenv()" link BZ_LIB_SETENV}      @{"spawn()" link BZ_LIB_SPAWN}        @{"system()" link BZ_LIB_SYSTEM}       @{"time()" link BZ_LIB_TIME}


@{b}String Manipulation Functions:@{ub}
@{"copy()" link BZ_LIB_COPY}        @{"delete()" link BZ_LIB_DELETE}       @{"parsecom()" link BZ_LIB_PARSECOM}     @{"pos()" link BZ_LIB_POS}          @{"regexp()" link BZ_LIB_REGEXP}
@{"sprintf()" link BZ_LIB_SPRINTF}     @{"stlocase()" link BZ_LIB_STLOCASE}     @{"strcat()" link BZ_LIB_STRCAT}       @{"strlen()" link BZ_LIB_STRLEN}       @{"stupcase()" link BZ_LIB_STUPCASE}


@{b}File I/O Functions:@{ub}
@{"closedir()" link BZ_LIB_CLOSEDIR}    @{"fclose()" link BZ_LIB_FCLOSE}       @{"feof()" link BZ_LIB_FEOF}         @{"fflush()" link BZ_LIB_FFLUSH}       @{"fgetc()" link BZ_LIB_FGETC}
@{"fgets()" link BZ_LIB_FGETS}       @{"fopen()" link BZ_LIB_FOPEN}        @{"fprintf()" link BZ_LIB_FPRINTF}      @{"fputc()" link BZ_LIB_FPUTC}        @{"fseek()" link BZ_LIB_FSEEK}
@{"ftell()" link BZ_LIB_FTELL}       @{"getnodemessage()" link BZ_LIB_GETNODEMESSAGE}              @{"opendir()" link BZ_LIB_OPENDIR}      @{"readdir()" link BZ_LIB_READDIR}
@{"remove()" link BZ_LIB_REMOVE}      @{"rename()" link BZ_LIB_RENAME}       @{"rewinddir()" link BZ_LIB_REWINDDIR}


@{b}Standard I/O Functions:@{ub}
@{"getch()" link BZ_LIB_GETCH}       @{"_getch()" link BZ_LIB_GETCH}       @{"input()" link BZ_LIB_INPUT}        @{"kbhit()" link BZ_LIB_KBHIT}        @{"printf()" link BZ_LIB_PRINTF}


@{b}User Data Functions:@{ub}
@{"freeuser()" link BZ_LIB_FREEUSER}    @{"loaduser()" link BZ_LIB_LOADUSER}     @{"seekforuser()" link BZ_LIB_SEEKFORUSER}
@endnode

@node bz_lib_alphabetic "Alphabetic listing of the BZ Runtime Library"
There is also the list of BZ Runtime Library commands @{"by category" link BZ_LIB}.

@{"  asm                 " link BZ_LIB_ASM} - directly program the BZ49-processor
@{"  bbbs()              " link BZ_LIB_BBBS} - execute a BBBS-command
@{"  bfile4()            " link BZ_LIB_BFILE4} - enter the File/4 filesystem
@{"  beep()              " link BZ_LIB_BEEP} - emit a beep sound
@{"  break               " link BZ_LIB_BREAK} - end the execution of a block
@{"  breceive()          " link BZ_LIB_BRECEIVE} - receive file(s) from remote
@{"  bsend()             " link BZ_LIB_BSEND} - send file(s) to remote
@{"  closedir()          " link BZ_LIB_CLOSEDIR} - close a directory opened with opendir
@{"  copy()              " link BZ_LIB_COPY} - copy a part of string
@{"  delay(), _delay()   " link BZ_LIB_DELAY} - halt program execution for a specified amount of time
@{"  delete()            " link BZ_LIB_DELETE} - deletes a part of a string
@{"  do..while           " link BZ_LIB_DOWHILE} - repeat a command until a condition is met
@{"  exec()              " link BZ_LIB_EXEC} - execute another script
@{"  exit()              " link BZ_LIB_EXIT} - quit the current script
@{"  if..else            " link BZ_LIB_IF} - execute a statement based on an expression
@{"  fclose()            " link BZ_LIB_FCLOSE} - close a file
@{"  feof()              " link BZ_LIB_FEOF} - determine if a file pointer is at end of file
@{"  fflush()            " link BZ_LIB_FFLUSH} - flush a file into the disk
@{"  fgetc()             " link BZ_LIB_FGETC} - read a character from a file
@{"  fgets()             " link BZ_LIB_FGETS} - read a string from a file
@{"  fopen()             " link BZ_LIB_FOPEN} - open a file
@{"  for                 " link BZ_LIB_FOR} - repeat a loop until a condition is met
@{"  fprintf()           " link BZ_LIB_FPRINTF} - write formatted text into a file
@{"  fputc()             " link BZ_LIB_FPUTC} - write a single byte into a file
@{"  freeuser()          " link BZ_LIB_FREEUSER} - return normal bu-variable values
@{"  fseek()             " link BZ_LIB_FSEEK} - position the pointer of a file handle
@{"  ftell()             " link BZ_LIB_FTELL} - return the file pointer position
@{"  getch(), _getch()   " link BZ_LIB_GETCH} - read a keypress without waiting
@{"  getenv()            " link BZ_LIB_GETENV} - get the value of an environment variable
@{"  getnodestatus()     " link BZ_LIB_GETNODESTATUS} - get a part of the status of a specified node
@{"  getnodemessage()    " link BZ_LIB_GETNODEMESSAGE} - read a node message from a file
@{"  help()              " link BZ_LIB_HELP} - execute the AmigaGuide help file reader
@{"  input()             " link BZ_LIB_INPUT} - read user input
@{"  kbhit()             " link BZ_LIB_KBHIT} - check to see if a key has been pressed
@{"  loaduser()          " link BZ_LIB_LOADUSER} - adjust bu-variables to the values of another user
@{"  make_pcboard12sys() " link BZ_LIB_MAKE_PCBOARD12SYS} - make a v12 PCBOARD.SYS control file
@{"  make_pcboard14sys() " link BZ_LIB_MAKE_PCBOARD14SYS} - make a v14 PCBOARD.SYS control file
@{"  opendir()           " link BZ_LIB_OPENDIR} - opens a directory for reading
@{"  parsecom()          " link BZ_LIB_PARSECOM} - parse input for commands
@{"  pos()               " link BZ_LIB_POS} - search for a substring in a string
@{"  printf()            " link BZ_LIB_PRINTF} - write formatted output into the screen
@{"  readdir()           " link BZ_LIB_READDIR} - read a single directory entry
@{"  regexp()            " link BZ_LIB_REGEXP} - check to see if a string matches a regular expression
@{"  remove              " link BZ_LIB_REMOVE} - delete a file
@{"  rename()            " link BZ_LIB_RENAME} - rename a file
@{"  return              " link BZ_LIB_RETURN} - return from a function
@{"  rewinddir()         " link BZ_LIB_REWINDDIR} - move the directory pointer to the first entry
@{"  seekforuser()       " link BZ_LIB_SEEKFORUSER} - find the user number of an user
@{"  sendnode()          " link BZ_LIB_SENDNODE} - send a node message
@{"  setenv()            " link BZ_LIB_SETENV} - set an environment variable
@{"  spawn()             " link BZ_LIB_SPAWN} - execute another script
@{"  sprintf()           " link BZ_LIB_SPRINTF} - write formatted text into a string
@{"  stlocase()          " link BZ_LIB_STLOCASE} - convert a string into lower case
@{"  strcat()            " link BZ_LIB_STRCAT} - join two strings
@{"  strlen()            " link BZ_LIB_STRLEN} - calculate the length of a string
@{"  stupcase()          " link BZ_LIB_STUPCASE} - convert a string into upper case.
@{"  switch...case       " link BZ_LIB_SWITCHCASE} - create big if...else-loops with same condition
@{"  system()            " link BZ_LIB_SYSTEM} - execute an operating system command
@{"  time()              " link BZ_LIB_TIME} - return seconds since 1.1.1970, 00:00 UTC
@{"  tictactoe()         " link BZ_LIB_TICTACTOE} - execute the game of TicTacToe
@{"  yellsysop()         " link BZ_LIB_YELLSYSOP} - page the system operator
@{"  while               " link BZ_LIB_WHILE} - repeat until a condition is met
@endnode

@node bz_lib_asm "asm"
   @{b}CONSTRUCT@{ub}  asm() - directly program the BZ49-processor

    @{b}SYNOPSIS@{ub}  @{b}asm(command, argument);@{ub}

              @{i}command@{ui}  - a BZ49-processor command
              @{i}argument@{ui} - an integer containing the command argument

 @{b}DESCRIPTION@{ub}  @{b}asm()@{ub} is used to control the BZ49-processor directly. @{b}command@{ub}
              can be any valid BZ49-processor command. @{b}argument@{ub} should be
              the argument of the command. This command should be used by
              die-hard BZ49-gurus only.
@endnode

@node bz_lib_break "break"
   @{b}CONSTRUCT@{ub}  break - end the execution of a block.

    @{b}SYNOPSIS@{ub}  @{b}break;@{ub}

 @{b}DESCRIPTION@{ub}  @{b}break@{ub} ends the execution of the current block, as if there was
              a closing bracket there.

     @{b}EXAMPLE@{ub}  for(i=0;;++i) {
                if(i==3) @{b}break;@{ub}
              }

    @{b}SEE ALSO@{ub}  @{"for" link BZ_LIB_FOR}, @{"do..while" link BZ_LIB_DOWHILE}, @{"switch..case" link BZ_LIB_SWITCHCASE}, @{"while" link BZ_LIB_WHILE}
@endnode

@node bz_lib_dowhile "do...while"
   @{b}CONSTRUCT@{ub}  do...while - repeat a command until a condition is met

    @{b}SYNOPSIS@{ub}  @{b}do command while(condition);@{ub}

 @{b}DESCRIPTION@{ub}  @{b}do...while@{ub} executes the @{i}command@{ui} once and then repeatedly,
              until the @{"expression" link BZ_MAIN_EXPS} @{b}condition@{ub} evaluates to false.

     @{b}EXAMPLE@{ub}  @{b}do@{ub} {
                ++i;
                printf("Still under 42...\\n");
              } @{b}while@{ub}(i<42);

    @{b}SEE ALSO@{ub}  @{"while" link BZ_LIB_WHILE}, @{"for" link BZ_LIB_FOR}, @{"break" link BZ_LIB_BREAK}
@endnode

@node bz_lib_for "for"
   @{b}CONSTRUCT@{ub}  for - repeat a loop until a condition is met

    @{b}SYNOPSIS@{ub}  @{b}for({expression{,...}}; {condition{,...}}; {expression{,...}})@{ub}
              @{b}statement;@{ub}

 @{b}DESCRIPTION@{ub}  @{b}for@{ub} is used to repeat the @{b}statement@{ub} until the
              @{b}condition@{ub}-@{"expression" link BZ_MAIN_EXPS} evaluates to false. Before the loop is
              started, the @{i}expressions@{ui} listed before the first semi-colon
              are evaluated. Every time the loop has been completed the
              third @{i}expression@{ui} is evaluated. Normally, the first expression
              should be used to initialize a counter variable and the third
              expression to increment it.

     @{b}EXAMPLE@{ub}  @{b}for@{ub}(t=10; t>0; t--) {
                printf("T minus %d and counting...\\n",t);
                delay(10);
              }

    @{b}SEE ALSO@{ub}  @{"while" link BZ_LIB_WHILE}, @{"do...while" link BZ_LIB_DOWHILE}
@endnode

@node bz_lib_if "if...else"
   @{b}CONSTRUCT@{ub}  if...else - execute a statement based on an expression

    @{b}SYNOPSIS@{ub}  @{b}if(condition) command1; {else command2;}@{ub}

 @{b}DESCRIPTION@{ub}  @{b}if@{ub} is used when a command or group of commands should be
              executed only if a specified @{i}condition@{ui} is met. @{b}command1@{ub} is
              executed only if the @{"expression" link BZ_MAIN_EXPS} @{b}condition@{ub} is true. The
              @{b}else@{ub}-part is optional. If it is included, then @{b}command2@{ub} is
              executed if the @{i}expression@{ui} @{b}condition@{ub} is false.

     @{b}EXAMPLE@{ub}  @{b}if@{ub}(foo != bar) {
                printf("Make the world equal!\\n");
                foo=bar;
              } @{b}else@{ub} printf("Equality forever!\\n");

    @{b}SEE ALSO@{ub}  @{"switch...case" link BZ_LIB_SWITCHCASE}
@endnode

@node bz_lib_return "return"
   @{b}CONSTRUCT@{ub}  return - return from a function

    @{b}SYNOPSIS@{ub}  @{b}return({expression});@{ub}

 @{b}DESCRIPTION@{ub}  @{b}return@{ub} is used to exit a @{"BZ function" link BZ_MAIN_FUNCS} and optionally return a
              value, specified by @{i}expression@{ui}. If @{i}expression@{ui} is not specified,
              the value 0 will be returned.

     @{b}EXAMPLE@{ub}  int addition(int first, int second) {
                int result;

                result=first+second;
                @{b}return@{ub}(result);
              }

              int main() {
                printf("2 + 3 = %d\\n",addition(2,3));
                @{b}return@{ub}(0);
              }

    @{b}SEE ALSO@{ub}  @{"break" link BZ_LIB_BREAK}, @{"exit" link BZ_LIB_EXIT}
@endnode

@node bz_lib_switchcase "switch...case"
   @{b}CONSTRUCT@{ub}  switch...case - create big if...else-loops with same
              condition.

    @{b}SYNOPSIS@{ub}  @{b}switch(condition) {@{ub}
                @{b}case expression2: statement;@{ub}
                @{b}case expression3: statement;@{ub}
                @{b}...@{ub}
                @{b}default:statement@{ub}
              @{b}}@{ub}

 @{b}DESCRIPTION@{ub}  @{b}switch...case@{ub} is used to create big if...else loops with the
              same condition. First, the @{"expression" link BZ_MAIN_EXPS} @{b}condition@{ub} is evaluated.
              Then all @{b}case-statements@{ub} and their relative @{i}expressions@{ui} are
              checked for equality. When an equality is found, all the
              following @{i}statements@{ui} are executed. If none of the case
              expressions match, the optional @{b}default@{ub}-statement is executed.
              Note that to execute only one case-statement, the statement
              has to end in @{b}break;@{ub} call. Otherwise all case-statements below
              it are also executed.

     @{b}EXAMPLE@{ub}  @{b}switch@{ub} (bar) {
                 @{b}case@{ub} 1:
                 @{b}case@{ub} 2:{
                 printf("1 or 2\\n");
                 break;
                 }
                 @{b}case@{ub} 3:{
                    printf("3\\n");
                    break;
                 }
                 @{b}case@{ub} 4:printf("4 or ");
                 @{b}case@{ub} 5:{
                    printf("5\\n");
                 break;
                 }
                 @{b}default@{ub}:{
                    printf("unknown\\n");
                    break;
                 }
              }

    @{b}SEE ALSO@{ub}  @{"if...else" link BZ_LIB_IF}
@endnode

@node bz_lib_while "while"
   @{b}CONSTRUCT@{ub}  while - repeat until a condition is met

    @{b}SYNOPSIS@{ub}  @{b}while(condition) command;@{ub}

 @{b}DESCRIPTION@{ub}  @{b}while@{ub} is used to loop continuously until a @{i}condition@{ui} is met.
              Every time before executing @{b}command@{ub}, the @{"expression" link BZ_MAIN_EXPS} @{b}condition@{ub}
              is evaluated. If it evaluates into true, then the command is
              executed. Note that if the @{i}expression@{ui} is false from the very
              beginning, the command will never be executed.

     @{b}EXAMPLE@{ub}  @{b}while@{ub}(t>0) {
                printf("T minus %d and counting...\\n",t);
                delay(10);
                t--;
              }

    @{b}SEE ALSO@{ub}  @{"do...while" link BZ_LIB_DOWHILE}, @{"for" link BZ_LIB_FOR}
@endnode

@node bz_lib_bbbs "bbbs"
    @{b}FUNCTION@{ub}  bbbs() - execute a BBBS-command

    @{b}SYNOPSIS@{ub}  @{b}bbbs(command);@{ub}

              @{i}command@{ui} - a string containing the command line to be executed

 @{b}DESCRIPTION@{ub}  @{b}bbbs()@{ub} executes the command line specified in @{b}command@{ub} as if
              it were issued by the user.

     @{b}EXAMPLE@{ub}  @{b}bbbs@{ub}("f cd /pub/pictures get *");
              @{b}bbbs@{ub}("g y");

@{b}RETURN VALUE@{ub}  @{b}bbbs()@{ub} returns always 0.
@endnode

@node bz_lib_bfile4 "bfile4"
    @{b}FUNCTION@{ub}  bfile4() - enter the File/4 filesystem

    @{b}SYNOPSIS@{ub}  @{b}bfile4();@{ub}

 @{b}DESCRIPTION@{ub}  @{b}bfile4()@{ub} enters the BBBS File/4 filesystem, as if the user
              had issued the BBBS command to enter the file menu. @{b}bfile4()@{ub}
              exits when the user issues either the @{b}Quit@{ub} or @{b}Goodbye@{ub} command.
              When the user is using a file menu invoked with a call to
              @{b}bfile4()@{ub} he/she cannot use any of the global commands or
              change the active menu.

@{b}RETURN VALUE@{ub}  @{b}bfile4()@{ub} returns always 0.

     @{b}EXAMPLE@{ub}  int main() {
                printf("Entering filemenu...\\n");
                @{b}bfile4@{ub}();
                printf("Have a nice day!\\n");
              }

    @{b}SEE ALSO@{ub}  @{"bbbs()" link BZ_LIB_BBBS}
@endnode

@node bz_lib_beep "beep"
    @{b}FUNCTION@{ub}  beep() - emit a beep sound

    @{b}SYNOPSIS@{ub}  @{b}beep();@{ub}

 @{b}DESCRIPTION@{ub}  @{b}beep()@{ub} outputs a single beep to both the remote and local
              terminal if the user does not have the 'silent mode' bit
              active in @{"bu_utoggles" link BZ_VAR_BU_UTOGGLES}.

@{b}RETURN VALUE@{ub}  @{b}beep()@{ub} returns always 0.
@endnode

@node bz_lib_breceive "breceive"
    @{b}FUNCTION@{ub}  breceive() - receive file(s) from remote

    @{b}SYNOPSIS@{ub}  @{b}breceive(dir);@{ub}

              @{i}dir@{ui} - a string denoting the directory to which the file(s)
                    should be received to.

 @{b}DESCRIPTION@{ub}  @{b}breceive()@{ub} receives files to the directory specified in @{b}dir@{ub}
              with the user's currently selected transfer protocol.

@{b}RETURN VALUE@{ub}  breceive() returns always 0.

     @{b}EXAMPLE@{ub}  int main() {
                char d;

                if(bu_access & 0xff) {
                  printf("Okay, sir boss, you can upload where you like.\\n");
                  d=input("Enter directory: ",255,0);
                  printf("Ok, receiving...\\n");
                  @{b}breceive@{ub}(d);
                } else printf("You're not a sysop!\\n");
              }

    @{b}SEE ALSO@{ub}  @{"bsend()" link BZ_LIB_BSEND}
@endnode

@node bz_lib_bsend "bsend"
    @{b}FUNCTION@{ub}  bsend() - send file(s) to remote

    @{b}SYNOPSIS@{ub}  @{b}bsend(listfile);@{ub}

              @{i}listfile@{ui} - a string containing the name of the file in which
              the files to be sent are listed.

 @{b}DESCRIPTION@{ub}  @{b}bsend()@{ub} sends the files listed in listfile to the remote user
              with the user's currently selected transfer protocol. In the
              @{b}listfile@{ub}, a single line should contain one file to be sent.

@{b}RETURN VALUE@{ub}  @{b}bsend()@{ub} returns true if all went OK, false otherwise.

     @{b}EXAMPLE@{ub}  int main() {
                int f;

                printf("I'll send you my autoexec.bat and config.sys...\\n");

                f=fopen("fubba.fil","wt");
                fprintf(f,"c:/autoexec.bat\\n");
                fprintf(f,"c:/config.sys\\n");
                fclose(f);

                @{b}bsend@{ub}("fubba.fil");
              }

    @{b}SEE ALSO@{ub}  @{"breceive()" link BZ_LIB_BRECEIVE}
@endnode

@node bz_lib_closedir "closedir"
    @{b}FUNCTION@{ub}  closedir() - close a directory opened with opendir

    @{b}SYNOPSIS@{ub}  @{b}closedir();@{ub}

 @{b}DESCRIPTION@{ub}  @{b}closedir()@{ub} closes the directory stream opened with a @{b}opendir@{ub}
              call. After all necessary directory reads have been done to
              a opened directory, a @{b}closedir()@{ub} call should be made to ensure
              that the memory allocated to the directory entries is freed.

@{b}RETURN VALUE@{ub}  @{b}closedir()@{ub} returns always 0.

     @{b}EXAMPLE@{ub}  int main() {
                /* quick-and-dirty directory lister
                 *
                 * an example of opendir(), readdir(), closedir() and
                 * rewinddir().
                 */

                char spec,entry,file;
                int size,filecount;

                spec=input("Enter filespec: ",255,0);
                opendir(spec);

                printf("Directory of %s...\\n\\n",spec);

                do {
                  redisp=0; filecount=0;
                  while(strlen(entry=readdir())) {
                    file=copy(entry,1,pos(entry,"\2"));
                    delete(entry,1,pos("\2",entry));
                    size=copy(entry,1,pos(entry,"\2"));
                    printf("%.30s %i\\n",file,size);
                    ++filecount;
                  }

                  printf("Total %u files.\\n",filecount);
                  printf("Hit space to view the list again.\\n");
                  while(!kbhit());
                  if(getch()==" ") {
                    rewinddir();
                    redisp=1;
                  }
                } while(redisp);

                printf("Have a nice day!\\n");
                @{b}closedir@{ub}();
              }

    @{b}SEE ALSO@{ub}  @{"opendir" link BZ_LIB_OPENDIR}, @{"readdir" link BZ_LIB_READDIR}, @{"rewinddir" link BZ_LIB_REWINDDIR}
@endnode

@node bz_lib_copy "copy"
    @{b}FUNCTION@{ub}  copy() - copy a part of string

    @{b}SYNOPSIS@{ub}  @{b}copy(buf, start, len);@{ub}

              @{i}buf@{ui}   - the string to copy from
              @{i}start@{ui} - an integer denoting the first character to start
                      copying from
              @{i}len@{ui}   - an integer denoting the amount of characters to be
                      copied

 @{b}DESCRIPTION@{ub}  @{b}copy()@{ub} copies at maximum @{b}len@{ub} characters from the string
              @{b}buf@{ub}, starting from the @{b}start@{ub}th character. The copying
              stops if the end of @{b}buf@{ub}-string is reached.

@{b}RETURN VALUE@{ub}  @{b}copy()@{ub} returns the copied string.

    @{b}EXAMPLES@{ub}  a=copy("foobar",1,3);
              (returns "foo")

              b=copy("It is true: BBBS rules, by far!",13,10);
              (returns "BBBS rules")

    @{b}SEE ALSO@{ub}  @{"delete()" link BZ_LIB_DELETE}, @{"pos()" link BZ_LIB_POS}
@endnode


@node bz_lib_delay "delay, _delay"
    @{b}FUNCTION@{ub}  delay(), _delay() - halt program execution for a specified
              amount of time

    @{b}SYNOPSIS@{ub}  @{b}delay(time);@{ub}

              @{i}time@{ui} - the time to delay, in tenths of second

              @{b}_delay(time);@{ub}

              @{i}time@{ui} - the time to delay, in milliseconds

 @{b}DESCRIPTION@{ub}  Both @{b}delay()@{ub} and @{b}_delay()@{ub} completely halt the program
              execution for the specified amount of time. With @{b}_delay()@{ub},
              the time delayed is just an approximation and cannot be used
              for precise timing.

@{b}RETURN VALUE@{ub}  Both @{b}delay()@{ub} and @{b}_delay()@{ub} return always 0.

     @{b}EXAMPLE@{ub}  int main() {
                if(!bu_resume) {
                  printf("For not writing a resume, there will be a 5 ");
                  printf("second delay!\\n");
                  @{b}delay@{ub}(50);
                }
              }
@endnode


@node bz_lib_delete "delete"
    @{b}FUNCTION@{ub}  delete() - deletes a part of a string

    @{b}SYNOPSIS@{ub}  @{b}delete(buf, start, len);@{ub}

              @{i}buf@{ui}   - the string to delete from
              @{i}start@{ui} - an integer denoting the first character to start
                      deleting from
              @{i}len@{ui}   - an integer denoting the amount of characters to
                      delete

 @{b}DESCRIPTION@{ub}  @{b}delete()@{ub} deletes at maximum @{b}len@{ub} characters from the
              string @{b}buf@{ub}, starting from character @{b}start@{ub}. If the end
              of @{b}buf@{ub} is reached, then the deleting will stop.

@{b}RETURN VALUE@{ub}  @{b}delete()@{ub} returns the operated string.

    @{b}EXAMPLES@{ub}  a=delete("foobar",4,3);
              (returns "foo");

              b=delete("foobar",1,3);
              (returns "bar");

              z=delete("merry christmas, Mr. B!",7,11);
              (returns "merry Mr. B!")
@endnode

@node bz_lib_exec "exec"
    @{b}FUNCTION@{ub}  exec() - execute another script

    @{b}SYNOPSIS@{ub}  @{b}exec(file);@{ub}

              @{i}file@{ui} - a string containing the name of the script to run

 @{b}DESCRIPTION@{ub}  @{b}exec()@{ub} executes another script. @{b}file@{ub} must be a valid
              script name. A call to @{b}exec()@{ub} aborts the execution of the
              current script - there is no way to return to the script
              that invoked @{b}exec()@{ub}. If this is what you want to do, use
              @{b}spawn()@{ub} instead.

              It is also possible to pass parameters to the @{b}main@{ub}-function
              of the script being called. This is accomplished by adding
              the parameters to the @{b}file@{ub}-parameter of @{b}exec()@{ub}, separated with
              the ASCII character 1.

@{b}RETURN VALUE@{ub}  @{b}exec()@{ub} does not return.

     @{b}EXAMPLE@{ub}  @{b}exec@{ub}("c:/bbs/bz/newscript");

    @{b}SEE ALSO@{ub}  @{"spawn()" link BZ_LIB_SPAWN}
@endnode


@node bz_lib_exit "exit"
    @{b}FUNCTION@{ub}  exit() - quit the current script

    @{b}SYNOPSIS@{ub}  @{b}exit(error);@{ub}

              @{i}error@{ui} - an integer containing the error code that should be
                      returned

 @{b}DESCRIPTION@{ub}  e@{b}xit()@{ub} exits the current script with the error code
              specified in @{b}error@{ub}. @{b}exit()@{ub} does not do any checking for
              open files or loaded users. Always be sure that all files
              are closed and freeuser() called before calling @{b}exit()@{ub}.

@{b}RETURN VALUE@{ub}  @{b}exit()@{ub} does not return.

     @{b}EXAMPLE@{ub}  @{b}exit@{ub}(666);
@endnode


@node bz_lib_fclose "fclose"
    @{b}FUNCTION@{ub}  fclose() - close a file

    @{b}SYNOPSIS@{ub}  @{b}fclose(handle);@{ub}

              @{i}handle@{ui} - the filehandle that should be closed

 @{b}DESCRIPTION@{ub}  @{b}fclose()@{ub} closes the file associated to filehandle @{b}handle@{ub}.
              All opened files should be closed via a call to @{b}fclose()@{ub}
              before the script is exited.

@{b}RETURN VALUE@{ub}  @{b}fclose()@{ub} returns always 0.

     @{b}EXAMPLE@{ub}  int main() {
                int f;

                if((f=fopen("fubba.fil","wt"))==-1) {
                  printf("Ugh!\\n");
                  exit(-1);
                }
                fprintf(f,"foo!\\n");
                fprintf(f,"bar!\\n");
                @{b}fclose@{ub}(f);
                exit(1);
              }
@endnode

@node bz_lib_feof "feof"
    @{b}FUNCTION@{ub}  feof() - determine if a file pointer is at end of file

    @{b}SYNOPSIS@{ub}  @{b}feof(handle);@{ub}

              @{i}handle@{ui} - the file handle of the file to check

 @{b}DESCRIPTION@{ub}  @{b}feof()@{ub} determines if end of file has been reached in file
              associated to the filehandle @{b}handle@{ub}. If a file is opened
              in text mode (see @{b}fopen@{ub}), then also control-z-character
              (normal end-of-file-character) is interpreted as end of
              file.

@{b}RETURN VALUE@{ub}  @{b}feof()@{ub} returns true, if end of file has been reached,
              otherwise it returns false.

     @{b}EXAMPLE@{ub}  int main() {
                 int f;

                 if((f=fopen("fubba.fil","rt"))==-1) {
                   printf("Ugh!\\n");
                   exit(-1);
                 }

                 /* display fubba.fil... */
                 while(!@{b}feof@{ub}(f) && bv_carrier) printf("%s\\n",fgets(f));
                 fclose(f);
                 exit(1);
              }
@endnode


@node bz_lib_fflush "fflush"
    @{b}FUNCTION@{ub}  fflush() - flush a file into the disk

    @{b}SYNOPSIS@{ub}  @{b}fflush(handle);@{ub}

              @{i}handle@{ui} - the file handle to flush

 @{b}DESCRIPTION@{ub}  @{b}fflush()@{ub} flushes all the buffers of the file associated
              with the file handle @{b}handle@{ub}, causing all unwritten data
              be written to disk.

@{b}RETURN VALUE@{ub}  @{b}fflush()@{ub} returns always 0.

     @{b}EXAMPLE@{ub}  f=fopen("testfile.tmp","wt");
              fputc(65,f);
              fputc(66,f);
              fputc(67,f);
              printf("fputc\n");
              getch();

              @{b}fflush@{ub}(f);
              printf("fflush\n");
              getch();

              fclose(f);
              printf("fclose\n");
              getch();
              remove("testfile.tmp");
@endnode


@node bz_lib_fgetc "fgetc"
    @{b}FUNCTION@{ub}  fgetc() - read a character from a file

    @{b}SYNOPSIS@{ub}  @{b}fgetc(handle);@{ub}

              @{i}handle@{ui} - the file handle of the file to read the character
                       from

 @{b}DESCRIPTION@{ub}  @{b}fgetc()@{ub} reads a single character from the file associated
              to the file handle @{b}handle@{ub}.

@{b}RETURN VALUE@{ub}  @{b}fgetc()@{ub} returns the ASCII value of the character that is
              read, or -1 if end of file has been reached.

     @{b}EXAMPLE@{ub}  int main() {

                int i, f;
                char bar;

                f=fopen("c:/bbbs/bzc.exe","rb");
                i=fopen("c:/bbbs/test","wb");

                while ((bar=@{b}fgetc@{ub}(f))!=-1) fputc(bar,i);

                fclose(i);
                fclose(f);

              }

    @{b}SEE ALSO@{ub}  @{"fputc" link BZ_LIB_FPUTC}, @{"fgets" link BZ_LIB_FGETS}
@endnode


@node bz_lib_fgets "fgets"
    @{b}FUNCTION@{ub}  fgets() - read a string from a file

    @{b}SYNOPSIS@{ub}  @{b}fgets(handle);@{ub}

              @{i}handle@{ui} - the file handle of the file to read the string from

 @{b}DESCRIPTION@{ub}  fgets() reads a single line of characters from the file
              associated to filehandle @{b}handle@{ub}. A line is considered as
              a sequence of characters followed by a CR+LF-pair.

@{b}RETURN VALUE@{ub}  @{b}fgets()@{ub} returns the actual string read.

     @{b}EXAMPLE@{ub}  fubba=@{b}fgets@{ub}(f);

    @{b}SEE ALSO@{ub}  @{"fgetc" link BZ_LIB_FGETC}, @{"fputc" link BZ_LIB_FPUTC}
@endnode


@node bz_lib_fopen "fopen"
    @{b}FUNCTION@{ub}  fopen() - open a file

    @{b}SYNOPSIS@{ub}  @{b}fopen(filename, mode);@{ub}

              @{i}filename@{ui} - a string containing the name of the file to open
              @{i}mode@{ui}     - a string containing the mode that the file
                         should be opened in

 @{b}DESCRIPTION@{ub}  @{b}fopen()@{ub} opens a file specified in @{b}filename@{ub}. All files
              must be opened before any input or output can be made to or
              from them. The mode that the file is opened in depends on
              the string @{b}mode@{ub}. Possible modes are:

              @{i}"r"@{ui}     Open the file for reading. The file must exist.

              @{i}"w"@{ui}     Open the file for writing only. If the file doesn't
              exist, it will be created. Otherwise, it will be truncated
              to 0 bytes.

              @{i}"a"@{ui}     Open the file for appending. If the file doesn't
              exist, it will be created. Otherwise, the file pointer is
              set to the end of file. All writing will be done to the end
              of file.

              @{i}"r+"@{ui}    Open the file for both reading and writing. The
              file must exist.

              @{i}"w+"@{ui}    Open the file for both reading and writing. If the
              file exists, it will be truncated to 0 bytes, otherwise a
              new file will be created.

              @{i}"a+@{ui}"    Open the file for reading and appending. If the
              file does not exist, it will be created. All writing will
              be done to the end of file.

              There are also two additional mode flags that need to be
              appended to the end of the mode-string; @{b}t@{ub} for text mode and
              @{b}b@{ub} for binary mode. In text mode CR characters are skipped
              on input and newline characters converted to CR/LF-pairs on
              output. If the last character of the file is a Ctrl-Z, then it
              and everything following it will be discarded on input. In
              binary mode, none of these transformations are used.

@{b}RETURN VALUE@{ub}  @{b}fopen()@{ub} returns a file handle if the open is successful,
              otherwise it returns -1.

     @{b}EXAMPLE@{ub}  int main() {
                int f;

                if((f=@{b}fopen@{ub}("fubba.fil","wt"))==-1) {
                  printf("Ugh!\\n");
                  exit(-1);
                }
                fprintf(f,"foo!\\n");
                fprintf(f,"bar!\\n");
                fclose(f);
                exit(1);
              }
@endnode


@node bz_lib_fprintf "fprintf"
    @{b}FUNCTION@{ub}  fprintf() - write formatted text into a file

    @{b}SYNOPSIS@{ub}  @{b}fprintf(handle, format {,argument{,argument...}});@{ub}

              @{i}handle@{ui} - the file handle to write the formatted text into.
              @{i}format@{ui} - a format specifier, see @{b}printf()@{ub} for details.

              @{b}fprintf()@{ub} can have a number of additional arguments,
              depending on the format specifier. For every format
              specifier in @{b}format@{ub}, an argument should be given.

 @{b}DESCRIPTION@{ub}  @{b}fprintf()@{ub} performs formatted output to the file specified by
              the file handle @{b}handle@{ub}.

@{b}RETURN VALUE@{ub}  @{b}fprintf()@{ub} does not return anything.

     @{b}EXAMPLE@{ub}  int main() {
                 int f;
                 char fubba;

                 f=fopen("fubba.fil","wt");
                 fubba=input("Fubba: ",10,0);
                 @{b}fprintf@{ub}("3+3=%i  Fubba=%s\\n",3+3,fubba);
                 fclose(f);
              }

    @{b}SEE ALSO@{ub}  printf(), sprintf()
@endnode

@node bz_lib_fputc "fputc"
    @{b}FUNCTION@{ub}  fputc() - write a single byte into a file

    @{b}SYNOPSIS@{ub}  @{b}fputc(byte, handle);@{ub}

              @{i}byte@{ui}   - the ASCII value of the byte to write.
              @{i}handle@{ui} - the file handle to write the byte into.

 @{b}DESCRIPTION@{ub}  @{b}fputc()@{ub} writes the byte @{b}byte@{ub} into the file associated
              with the file specified by file handle @{b}handle@{ub}.

@{b}RETURN VALUE@{ub}  @{b}fputc()@{ub} returns always 0.

     @{b}EXAMPLE@{ub}  int main() {

                int i, f;
                char bar;

                f=fopen("c:/bbbs/bzc.exe","rb");
                i=fopen("c:/bbbs/test","wb");

                while ((bar=@{b}fgetc@{ub}(f))!=-1) fputc(bar,i);

                fclose(i);
                fclose(f);

              }

    @{b}SEE ALSO@{ub}  @{"fgetc" link BZ_LIB_FGETC}
@endnode


@node bz_lib_freeuser "freeuser"
    @{b}FUNCTION@{ub}  freeuser() - return normal bu-variable values after a
              loaduser() call.

    @{b}SYNOPSIS@{ub}  @{b}freeuser();@{ub}

 @{b}DESCRIPTION@{ub}  @{b}freeuser()@{ub} returns the bu-variable values to the ones they
              were before a call to @{b}loaduser()@{ub}. It should always be
              called before exiting, if a @{b}loaduser()@{ub} call has been made.

@{b}RETURN VALUE@{ub}  @{b}freeuser()@{ub} returns always 0.

     @{b}EXAMPLE@{ub}  int main() {
                 int i;

                 for(i=0; !loaduser(i); ++i) {
                   printf("User #%04u: %s\\n",i,bu_name);
                   @{b}freeuser@{ub}();
                 }
              }

    @{b}SEE ALSO@{ub}  @{"loaduser()" link BZ_LIB_LOADUSER}
@endnode


@node bz_lib_fseek "fseek"
    @{b}FUNCTION@{ub}  fseek() - position the pointer of a file handle

    @{b}SYNOPSIS@{ub}  @{b}fseek(handle, offset, whence);@{ub}

              @{i}handle@{ui} - the file handle of the file the pointer of which
              should be positioned.
              @{i}offset@{ui} - an integer determining the amount of bytes to move
              the file pointer.
              @{i}whence@{ui} - an integer determining the start position to start
              the positioning:

              0 (@{b}SEEK_SET@{ub}) - the file beginning
              1 (@{b}SEEK_CUR@{ub}) - the current file pointer position
              2 (@{b}SEEK_END@{ub}) - the end of file

 @{b}DESCRIPTION@{ub}  @{b}fseek()@{ub} moves the file pointer @{b}offset@{ub} bytes, starting
              from the file position determined by @{b}whence@{ub}. For text mode
              files, @{b}offset@{ub} should be either 0, or a value returned by
              @{b}ftell()@{ub}.

@{b}RETURN VALUE@{ub}  @{b}fseek()@{ub} returns true, if an error is encountered.

    @{b}EXAMPLES@{ub}  Seek to the 10th byte of the file:
              @{b}fseek@{ub}(f, 10, 0);

              Seek 10 bytes forward from the current position:
              @{b}fseek@{ub}(f, 10, 1);

              Seek 10 bytes backward from the end of file:
              @{b}fseek@{ub}(f, -10, 2);

    @{b}SEE ALSO@{ub}  @{"ftell()" link BZ_LIB_FTELL}
@endnode


@node bz_lib_ftell "ftell"
    @{b}FUNCTION@{ub}  ftell() - return the file pointer position

    @{b}SYNOPSIS@{ub}  @{b}ftell(handle);@{ub}

              @{i}handle@{ui} - the file handle of the file to return the file
              pointer position from.

 @{b}DESCRIPTION@{ub}  @{b}ftell()@{ub} determines and returns the current position of the
              file pointer and returns an integer determining the
              position as bytes from the beginning of the file, if the
              file is opened in binary mode. In text mode this is not so,
              but the value can nonetheless be used in subsequent calls
              to @{b}fseek()@{ub}.

@{b}RETURN VALUE@{ub}  @{b}ftell()@{ub} returns an integer determining the current file
              pointer position.

     @{b}EXAMPLE@{ub}  fseek(f, 0, 2);
              printf("The file is %u bytes long.\\n",@{b}ftell@{ub}(f));

    @{b}SEE ALSO@{ub}  @{"fseek()" link BZ_LIB_FSEEK}
@endnode


@node bz_lib_getch "getch and _getch"
    @{b}FUNCTION@{ub}  getch(), _getch() - read a keypress without waiting

    @{b}SYNOPSIS@{ub}  @{b}getch();@{ub}

              @{b}_getch(whence);@{ub}

              @{i}whence@{ui} - an integer denoting what kind of keypresses should be
              read, as follows:

              @{b}whence            action@{ub}
              @{b}===================================================@{ub}
              0 (@{b}GETCH_BOTH@{ub})    Read from both local and remote
              1 (@{b}GETCH_LOCAL@{ub})   Read only from local keyboard
              2 (@{b}GETCH_REMOTE@{ub})  Read only from remote keyboard

 @{b}DESCRIPTION@{ub}  Both @{b}getch()@{ub} and @{b}_getch()@{ub} read a single character from the
              (specified) input buffer, if one is available. With @{b}_getch()@{ub}
              the @{b}whence@{ub} value 0 (@{b}GETCH_BOTH@{ub}) should not be used. Instead,
              a @{b}getch()@{ub} call should be made. Note that @{b}getch()@{ub} nor @{b}_getch()@{ub}
              will not wait for a character to become available. If that is
              what you want to do, you should use @{b}input()@{ub} instead.

@{b}RETURN VALUE@{ub}  Both @{b}getch()@{ub} and @{b}_getch()@{ub} return the character that was read or
              the value (character) 255 if none is available.

    @{b}EXAMPLES@{ub}  printf("The key '%c' was pressed.\\n",@{b}getch@{ub}());
              printf("User pressed the key '%c'.\\n",@{b}_getch(2)@{ub});

    @{b}SEE ALSO@{ub}  @{"input()" link BZ_LIB_INPUT}, @{"kbhit()" link BZ_LIB_KBHIT}
@endnode

@node bz_lib_getenv "getenv"
    @{b}FUNCTION@{ub}  getenv() - get the value of an environment variable.

    @{b}SYNOPSIS@{ub}  @{b}getenv(env);@{ub}

              @{i}env@{ui} - a string containing the name of the environment variable
              to be read.

 @{b}DESCRIPTION@{ub}  @{b}getenv()@{ub} reads the value of the specified environment variable
              and returns it. Note that @{b}getenv()@{ub} reads BBBS environment
              variables and has nothing to do with the environment variables
              set in the OS.

              The following environment variables are set internally by BBBS:

              @{b}Environment    Function@{ub}
              @{b}============================================================@{ub}
              @{b}\\01MEMBER@{ub}      list of @{"BBBS chat system" link CFG_CHAT} channels the user is a
                             member of, separated with commas.
              @{b}\\01RESIGN@{ub}      list of auto-join chat system channels the user
                             has resigned from, separated with commas.
              @{b}\\01TARGET@{ub}      the current chat system target of the user.
              @{b}\\01COLORS@{ub}      the number of the palette (in @{"colors.bbb" link CFG_COLORS}) the
                             user is using, or "@{b}cxxxxx@{ub}", where @{b}xxxxx@{ub} are
                             the color letters, @{b}colors.bbb@{ub}-style.

              (@{b}\\01@{ub} is the ASCII character 1, not the actual string "\\01")

@{b}RETURN VALUE@{ub}  @{b}getenv()@{ub} returns the value of the specified environment
              variable.

     @{b}EXAMPLE@{ub}  printf("Your chat target is: %s\\n",@{b}getenv@{ub}("\\1TARGET");

    @{b}SEE ALSO@{ub}  @{"setenv()" link BZ_LIB_SETENV}
@endnode


@node bz_lib_getnodestatus "getnodestatus"
    @{b}FUNCTION@{ub}  getnodestatus() - get a part of the status of a specified node.

    @{b}SYNOPSIS@{ub}  @{b}getnodestatus(node, item);@{ub}

              @{i}node@{ui} - an integer specifying the node number to get status
              from.
              @{i}item@{ui} - an integer specifying the type of information that
              should be returned.

 @{b}DESCRIPTION@{ub}  @{b}getnodestatus()@{ub} returns a single piece of information about
              the status of the specified node. The @{b}item@{ub}-parameter value
              is determined by what kind of information should be returned,
              as follows:

              @{b}Item             Description                          Type@{ub}
              @{b}==========================================================@{ub}
              0 (@{b}GNS_SPLIT@{ub})    Reserved                             @{i}int@{ui}
              1 (@{b}GNS_BSTATUS@{ub})  @{i}bstatus@{ui}-value (see below)            @{i}int@{ui}
              2 (@{b}GNS_ZSTATUS@{ub})  @{i}zstatus@{ui}-value (see below)            @{i}int@{ui}
              3 (@{b}GNS_SPEED@{ub})    The bps rate of the node (0=local)   @{i}int@{ui}
              4 (@{b}GNS_TIME@{ub})     when-value in who (see below)        @{i}int@{ui}
              5 (@{b}GNS_ENDTIME@{ub})  when-value in who when downloading   @{i}int@{ui}
              6 (@{b}GNS_NICK@{ub})     The nickname of the user in node     @{i}char@{ui}
              7 (@{b}GNS_REALNAME@{ub}) The real name of the user in node    @{i}char@{ui}
              8 (@{b}GNS_IDLE@{ub})     The amount of idle time (see below)  @{i}int@{ui}

              The @{i}bstatus@{ui}-value contains some toggles about the node. If bit
              1 is set, then the node is in a mail session. If bit 2 is set,
              then the node is in groupchat via the @{b}HYDRA@{ub} protocol. If bit 3
              is set then the node has the "KEEPALIVE" environment set,
              meaning that it will not be sleep disconneted. If bit 4 is
              set, then the node has the "KEEPIDLE" environment set, meaning
              that is should be shown as "idle", even though it might not
              actually be so.

              The @{i}zstatus@{ui}-value defines the actual status of the node. It is
              a single integer, determining it as follows:

              @{b}zstatus            Status of the node@{ub}
              @{b}==============================================================@{ub}
               0 (@{b}ZS_OFF@{ub})        Node is down.
               1 (@{b}ZS_ACTIVE@{ub})     Node is "active".
               2 (@{b}ZS_NOTAVAIL@{ub})   Node is not available.
               3 (@{b}ZS_WRITING@{ub})    Node is entering a message.
               4 (@{b}ZS_GRAB@{ub})       Node is grabbing (downloading messages).
               5 (@{b}ZS_DOWNLOAD@{ub})   Node is downloading a file.
               6 (@{b}ZS_UPLOAD@{ub})     Node is uploading a file.
               7 (@{b}ZS_SYSCHAT@{ub})    Node is chatting with SysOp.
               8 (@{b}ZS_DOOR@{ub})       Node has opened a door.
               9 (@{b}ZS_GROUPCHAT@{ub})  Node is in groupchat.
              10 (@{b}ZS_TELNET@{ub})     Node is using network (telnet, ftp...)
              11 (@{b}ZS_SHELLED@{ub})    Node has shelled in to the OS.

              The @{b}time@{ub} value determines the login time of the current
              user. It is an integer, packed so that the "hour" value is
              multiplied with the value 256 (0x100) and the "minute" value
              is the added to the result.

              The @{b}nick@{ub} and @{b}realname@{ub} values are simply strings containing
              the real name and the nickname of the user in the node.

              The @{b}GNS_IDLE@{ub} field is the UNIX time() timestamp of the moment
              when the node has started to be idle. Idle times of less than
              120 seconds should be ignored.

@{b}RETURN VALUE@{ub}  @{b}getnodestatus()@{ub} return value depends on the @{b}item@{ub} parameter,
              see the table above.

     @{b}EXAMPLE@{ub}  int main() {
                 int i;

                 for(i=1; i<bg_max_nodes+1; ++i) {
                   printf("Node #%02u: %s\\n",i,@{b}getnodestatus@{ub}(i,7));
                 }
              }
@endnode


@node bz_lib_getnodemessage "getnodemessage"
    @{b}FUNCTION@{ub}  getnodemessage() - read a node message from a file

    @{b}SYNOPSIS@{ub}  @{b}getnodemessage(nodefile);@{ub}

              @{i}nodefile@{ui} - the file handle of the file the node message should
              be read from.

 @{b}DESCRIPTION@{ub}  @{b}getnodemessage()@{ub} reads 340 bytes (a BBBS chatrec) from the
              file specified by the file handle @{b}nodefile@{ub} and converts them
              into a formatted string with the message. Normally you should
              use @{b}getnodemessage()@{ub} with the @{b}message.xxx@{ub}-files in the BBBS
              @{"temporary directory" link CFG_FILES_TEMP}.

@{b}RETURN VALUE@{ub}  @{b}getnodemessage()@{ub} returns a formatted string containing the
              message from the chatrec read.

     @{b}EXAMPLE@{ub}  int main() {
                int f;
                char s, fn;

                fn=sprintf("%sbbbsmsg.%u",bg_tempdir,bv_nodenumber);
                f=fopen(fn,"rb");

                while ((s=@{b}getnodemessage@{ub}(f))!="") printf("%sn",s);

                fclose(f);
                fclose(fopen(fn,"wb"));
              }
@endnode


@node bz_lib_help "help"
    @{b}FUNCTION@{ub}  help() - execute the AmigaGuide help file reader

    @{b}SYNOPSIS@{ub}  @{b}help(file, node);@{ub}

              @{i}file@{ui} - a string containing the name of the help file to read.
              @{i}node@{ui} - a string containing the name of the help file node to
              start reading from.

 @{b}DESCRIPTION@{ub}  @{b}help()@{ub} executes the BBBS's built-in @{i}AmigaGuide@{ui} reader and
              loads into it the file specified in @{b}file@{ub} and displays the
              node specified in @{b}node@{ub}. If @{b}file@{ub} is empty, then the
              standard help file (@{b}bbbshelp@{ub}) is loaded.

@{b}RETURN VALUE@{ub}  @{b}help()@{ub} returns always 0.

     @{b}EXAMPLE@{ub}  @{b}help@{ub}("","Main");
              @{b}help@{ub}("c:/bbs/sysop.guide","bz_lib_help");
@endnode

@node bz_lib_input "input"
    @{b}FUNCTION@{ub}  input() - read user input

    @{b}SYNOPSIS@{ub}  @{b}input(prompt, length, multi);@{ub}

              @{i}prompt@{ui} - a string containing the prompt that should be
              displayed as a prompt.
              @{i}length@{ui} - an integer determining the maximum amount of
              characters that should be accepted.
              @{i}multi@{ui}  - an integer controlling the node messages and whether
              or not only a word should be read.

 @{b}DESCRIPTION@{ub}  @{b}input()@{ub} reads from the user at maximum @{b}length@{ub} characters,
              first displaying the string @{b}prompt@{ub}, using the BBBS input
              buffer. The parameter @{b}multi@{ub} defines whether or not multiple
              words should be read; multiple words are read only if multi is
              false. The bit 7 of @{b}multi@{ub} is an exception: if it is set, then
              no nodemessages are processed while user is typing his/her
              input.

@{b}RETURN VALUE@{ub}  @{b}input()@{ub} returns a string containing the user input, modified
              approriately.

    @{b}EXAMPLES@{ub}  command=@{b}input@{ub}("Your Command: ",50,1);
              foo=@{b}input@{ub}("Enter string: ",50,0);

    @{b}SEE ALSO@{ub}  @{"getch()" link BZ_LIB_GETCH}
@endnode


@node bz_lib_kbhit "kbhit"
    @{b}FUNCTION@{ub}  kbhit() - check to see if a key has been pressed

    @{b}SYNOPSIS@{ub}  @{b}kbhit();@{ub}

 @{b}DESCRIPTION@{ub}  @{b}kbhit()@{ub} checks if a key has been pressed or not. Note that
              @{b}kbhit()@{ub} will not wait for a user to press a key.

@{b}RETURN VALUE@{ub}  @{b}kbhit()@{ub} returns true if a key has been pressed.

     @{b}EXAMPLE@{ub}  while(!@{b}kbhit@{ub}()) printf("BBBS forever!\\n");

    @{b}SEE ALSO@{ub}  @{"getch()" link BZ_LIB_GETCH}
@endnode


@node bz_lib_loaduser "loaduser"
    @{b}FUNCTION@{ub}  loaduser() - adjust bu-variables to contain the values of
              another user

    @{b}SYNOPSIS@{ub}  @{b}loaduser(userno);@{ub}

              @{i}userno@{ui} - an integer determining the absolute user number of
              the user whose values should be loaded.

 @{b}DESCRIPTION@{ub}  @{b}loaduser()@{ub} adjusts the values of the bu-variables so that they
              contain the values of the user whose user number is @{b}userno@{ub}.
              The bu-variables contain these values until a call to
              @{b}freeuser()@{ub} is made.

@{b}RETURN VALUE@{ub}  @{b}loaduser()@{ub} returns a nonzero value if an error occurs,
              otherwise it returns 0.

     @{b}EXAMPLE@{ub}  int main() {
                 int i;

                 for(i=0; !@{b}loaduser@{ub}(i); ++i) {
                   printf("User #%04u: %s\\n",i,bu_name);
                   freeuser();
                 }
              }

    @{b}SEE ALSO@{ub}  @{"freeuser()" link BZ_LIB_FREEUSER}
@endnode


@node bz_lib_make_pcboard12sys "make_pcboard12sys"
    @{b}FUNCTION@{ub}  make_pcboard12sys() - make a v12 PCBOARD.SYS control file

    @{b}SYNOPSIS@{ub}  @{b}make_pcboard12sys(file);@{ub}

              @{i}file@{ui} - a string containing the name of the file that the
              control file should be created into.

 @{b}DESCRIPTION@{ub}  @{b}make_pcboard12sys()@{ub} creates a door control file @{b}PCBOARD.SYS@{ub},
              that is compliant with version 12. This can be used with
              various external door programs.

@{b}RETURN VALUE@{ub}  @{b}make_pcboard12sys()@{ub} returns always 0.

     @{b}EXAMPLE@{ub}  @{b}make_pcboard12sys@{ub}("pcboard.sys");

    @{b}SEE ALSO@{ub}  @{"make_pcboard14sys()" link BZ_LIB_MAKE_PCBOARD14SYS}
@endnode


@node bz_lib_make_pcboard14sys "make_pcboard14sys"
    @{b}FUNCTION@{ub}  make_pcboard14sys() - make a v14 PCBOARD.SYS control file

    @{b}SYNOPSIS@{ub}  @{b}make_pcboard14sys(file);@{ub}

              @{i}file@{ui} - a string containing the name of the file that the
              control file should be created into.

 @{b}DESCRIPTION@{ub}  @{b}make_pcboard14sys()@{ub} creates a door control file @{b}PCBOARD.SYS@{ub},
              that is compliant with version 14. This can be used with
              various external door programs.

@{b}RETURN VALUE@{ub}  @{b}make_pcboard14sys()@{ub} returns always 0.

     @{b}EXAMPLE@{ub}  @{b}make_pcboard14sys@{ub}("pcboard.sys");

    @{b}SEE ALSO@{ub}  @{"make_pcboard12sys()" link BZ_LIB_MAKE_PCBOARD12SYS}
@endnode


@node bz_lib_opendir "opendir"
    @{b}FUNCTION@{ub}  opendir() - opens a directory for reading

    @{b}SYNOPSIS@{ub}  @{b}opendir(filespec);@{ub}

              @{i}filespec@{ui} - a string containing the filespec of the files to
              read.

 @{b}DESCRIPTION@{ub}  @{b}opendir()@{ub} opens a directory for reading files that match the
              wild card expression in @{b}filespec@{ub}. If you want to open a
              directory different than the current directory, simply list it
              before the wild card expression.

@{b}RETURN VALUE@{ub}  @{b}opendir()@{ub} returns true if there was no error, false otherwise.

     @{b}EXAMPLE@{ub}  int main() {
                /* quick-and-dirty directory lister
                 *
                 * an example of opendir(), readdir(), closedir() and
                 * rewinddir().
                 */

                char spec,entry,file;
                int size,filecount;

                spec=input("Enter filespec: ",255,0);
                @{b}opendir@{ub}(spec);

                printf("Directory of %s...\\n\\n",spec);

                do {
                  redisp=0; filecount=0;
                  while(strlen(entry=readdir())) {
                    file=copy(entry,1,pos(entry,"\2"));
                    delete(entry,1,pos("\2",entry));
                    size=copy(entry,1,pos(entry,"\2"));
                    printf("%.30s %i\\n",file,size);
                    ++filecount;
                  }

                  printf("Total %u files.\\n",filecount);
                  printf("Hit space to view the list again.\\n");
                  while(!kbhit());
                  if(getch()==" ") {
                    rewinddir();
                    redisp=1;
                  }
                } while(redisp);

                printf("Have a nice day!\\n");
                closedir();
              }

    @{b}SEE ALSO@{ub}  @{"readdir()" link BZ_LIB_READDIR}, @{"rewinddir()" link BZ_LIB_REWINDDIR}, @{"closedir()" link BZ_LIB_CLOSEDIR}
@endnode


@node bz_lib_parsecom "parsecom"
    @{b}FUNCTION@{ub}  parsecom() - parse input for commands

    @{b}SYNOPSIS@{ub}  @{b}parsecom(cmd_list, input);@{ub}

              @{i}cmd_list@{ui} - list of available commands, separated with slashes.
              @{i}input@{ui}    - the input string.

 @{b}DESCRIPTION@{ub}  parsecom() parses the input specified in input to see if it
              matches any of the commands specified in @{b}cmd_list@{ub}. The
              commands in @{b}cmd_list@{ub} should be separated with slashes. Also,
              they should be written in dual case, so that the necessary
              (unique) part of the command is in upper case, the rest in
              lower case. @{b}cmd_list@{ub} should contain no more than 254 commands.

@{b}RETURN VALUE@{ub}  @{b}parsecom()@{ub} returns an integer denoting the number of the
              command that the @{b}input@{ub} matches, otherwise it returns 255. If
              the input string is empty, @{b}parsecom()@{ub} returns 0.

     @{b}EXAMPLE@{ub}  cmdno=@{b}parsecom@{ub}("Quit/Read/UGH",input("Com: ",40,1));
@endnode


@node bz_lib_pos "pos"
    @{b}FUNCTION@{ub}  pos() - search for a substring in a string

    @{b}SYNOPSIS@{ub}  @{b}pos(haystack, needle);@{ub}

              @{i}haystack@{ui} - the string to be scanned.
              @{i}needle@{ui}   - the substring to be located.

 @{b}DESCRIPTION@{ub}  @{b}pos()@{ub} seeks the first occurance of @{b}needle@{ub} in @{b}haystack@{ub}.

@{b}RETURN VALUE@{ub}  If @{b}needle@{ub} is found in @{b}haystack@{ub}, then the starting character
              number in @{b}haystack@{ub} is returned. Otherwise, pos() returns 0.

     @{b}EXAMPLE@{ub}  if(@{b}pos@{ub}(bv_groups,"sysop")) printf("G'day sir boss!\\n");

    @{b}SEE ALSO@{ub}  @{"regexp()" link BZ_LIB_REGEXP}
@endnode


@node bz_lib_printf "printf"
    @{b}FUNCTION@{ub}  printf() - write formatted output into the screen

    @{b}SYNOPSIS@{ub}  @{b}printf(format {,argument{,argument...}});@{ub}

              @{i}format@{ui}   - a format specifier

 @{b}DESCRIPTION@{ub}  @{b}printf()@{ub} writes formatted output into the screen. Characters
              in format are written directly to the screen until a @{i}format@{ui}
              @{i}specification@{ui} is found. A format specification has the
              following format:

              @{b}%{flags}{width}{.precision}type@{ub}

              where items in curly barckets are optional. For each format
              specification, an extra parameter has to be added to the
              @{b}printf()@{ub} call. This parameter is then formatted according to
              the format specification and written to the screen.

              The @{b}flags@{ub} field in format specification is used to modify
              the formatting. The following flags are available:

              @{b}Flag   Meaning@{ub}
              @{b}==============================================================@{ub}
              @{b}-@{ub}      Left-justify the result in the field. Otherwise, the
                     result is right-justified. The value will be padded
                     with blanks on the right. If @{b}-@{ub} is not specified, then
                     the result is padded to the left with blanks or zeros,
                     depending on the type in the format specification.

              @{b}+@{ub}      Always insert a sign (+ or -), when a number is being
                     output.

              @{b}0@{ub}      If a number is being output, pad the field with '0'
                     characters instead of blanks. This flag is ignored if a
                     string is being output or if the - flag is specified.

              If the length of the result is less than the width specified
              in the format specifier, then it is padded with blanks or '@{b}0@{ub}'
              characters. If the @{b}-@{ub} flag is used, then the field is padded to
              the right, otherwise to the left. If the length of the result
              is greater than the width-field in format specifier, then the
              field is @{i}NOT@{ui} truncated.

              The @{b}precision@{ub}-field can only be used with strings. It
              determines the maximum length of the string for this field. If
              the string is longer, then it will be truncated to be the
              correct length.

              The @{b}type@{ub}-field is a single character determining the type of
              conversion done the the argument matching this format
              specification. It can be one of the following:

              @{b}Type  Output and the type of the required extra argument@{ub}
              @{b}============================================================@{ub}
              @{b}%@{ub}     The '%' character. This type does not need an extra
                    argument.
              @{b}c@{ub}     A single character.
              @{b}d@{ub}     A signed decimal integer.
              @{b}i@{ub}     A signed decimal integer.
              @{b}o@{ub}     An unsigned octal integer.
              @{b}s@{ub}     A string
              @{b}u@{ub}     An unsigned decimal integer
              @{b}x@{ub}     An unsigned hexadecimal integer, using lower case.
              @{b}X@{ub}     An unsigned hexadecimal integer, using upper case.

@{b}RETURN VALUE@{ub}  @{b}printf()@{ub} returns the number of characters displayed.

    @{b}EXAMPLES@{ub}  @{b}printf@{ub}("Foobar!\\n");
              @{b}printf@{ub}("Hello, %s!\\n",bu_name);
              @{b}printf@{ub}("49=0x%04X=%4oo",49,49);
              @{b}printf@{ub}("%-33s%s",bu_name,bu_city);
              @{b}printf@{ub}("%4.4s","123456");

    @{b}SEE ALSO@{ub}  @{"fprintf()" link BZ_LIB_FPRINTF}, @{"sprintf()" link BZ_LIB_SPRINTF}
@endnode

@node bz_lib_readdir "readdir"
    @{b}FUNCTION@{ub}  readdir() - read a single directory entry

    @{b}SYNOPSIS@{ub}  @{b}readdir();@{ub}

 @{b}DESCRIPTION@{ub}  @{b}readdir()@{ub} reads the next directory entry matching the filespec
              given when @{b}opendir()@{ub} was called. If @{b}opendir()@{ub} has not been
              called, @{b}readdir()@{ub} will always fail.

@{b}RETURN VALUE@{ub}  If successful, @{b}readdir()@{ub} returns a string containing the
              filename, file size and the file date, separated with the
              ASCII character number 2. Otherwise, @{b}readdir()@{ub} returns an
              empty string.

     @{b}EXAMPLE@{ub}  int main() {
                /* quick-and-dirty directory lister
                 *
                 * an example of opendir(), readdir(), closedir() and
                 * rewinddir().
                 */

                char spec,entry,file;
                int size,filecount;

                spec=input("Enter filespec: ",255,0);
                @{b}opendir@{ub}(spec);

                printf("Directory of %s...\\n\\n",spec);

                do {
                  redisp=0; filecount=0;
                  while(strlen(entry=readdir())) {
                    file=copy(entry,1,pos(entry,"\2"));
                    delete(entry,1,pos("\2",entry));
                    size=copy(entry,1,pos(entry,"\2"));
                    printf("%.30s %i\\n",file,size);
                    ++filecount;
                  }

                  printf("Total %u files.\\n",filecount);
                  printf("Hit space to view the list again.\\n");
                  while(!kbhit());
                  if(getch()==" ") {
                    rewinddir();
                    redisp=1;
                  }
                } while(redisp);

                printf("Have a nice day!\\n");
                closedir();
              }

    @{b}SEE ALSO@{ub}  @{"opendir()" link BZ_LIB_OPENDIR}, @{"rewinddir()" link BZ_LIB_REWINDDIR}, @{"closedir()" link BZ_LIB_CLOSEDIR}
@endnode

@node bz_lib_regexp "regexp"
    @{b}FUNCTION@{ub}  regexp() - check to see if a string matches a regular
              expression

    @{b}SYNOPSIS@{ub}  @{b}regexp(exp, str);@{ub}

              @{i}exp@{ui} - a string containing the regular expression to match.
              @{i}str@{ui} - a string containing the string to check.

 @{b}DESCRIPTION@{ub}  @{b}regexp()@{ub} executes @{"regular expression" link APP_REGEXP} matching, using @{b}exp@{ub} as
              the regular expression and @{b}str@{ub} as the string to check. @{b}exp@{ub} has
              to be a valid @{i}regular expression@{ui}.

@{b}RETURN VALUE@{ub}  @{b}regexp()@{ub} returns true, if @{b}str@{ub} matches the expression @{b}exp@{ub},
              otherwise it returns false.

     @{b}EXAMPLE@{ub}  int main() {
                // a quick-and-dirty grep program:

                int f,c=0;
                char fn,exp,line;

                exp=input("Exp : ",255,0);
                fn=input("File:",255,1);

                if((f=fopen(fn,"rt"))==-1) {
                  printf("grep: no such file '%s'\n",fn);
                  exit(-1);
                }

                while(!feof(f)) {
                  ++c;
                  if(@{b}regexp@{ub}(exp, line=fgets(f)))
                    printf("%i: %s\n",c,line);
                }
              }

    @{b}SEE ALSO@{ub}  @{"pos()" link BZ_LIB_POS}
@endnode

@node bz_lib_remove "remove"
    @{b}FUNCTION@{ub}  remove - delete a file

    @{b}SYNOPSIS@{ub}  @{b}remove(file);@{ub}

              @{i}file@{ui} - a string containing the name and path of the file
              to delete.

 @{b}DESCRIPTION@{ub}  @{b}remove()@{ub} deletes the file specified by the parameter @{b}file@{ub}.
              The @{b}file@{ub}-parameter cannot contain @{"wildcards" link app_wildcards}. If you want
              to delete multiple files, you should do this with the OS
              shell by using the @{b}system()@{ub} function.

@{b}RETURN VALUE@{ub}  @{b}remove()@{ub} returns always 0.

     @{b}EXAMPLE@{ub}  @{b}remove@{ub}("c:/bbs/fubba.fil");

    @{b}SEE ALSO@{ub}  @{"system" link BZ_LIB_SYSTEM}, @{"rename" link BZ_LIB_RENAME}
@endnode

@node bz_lib_rename "rename"
    @{b}FUNCTION@{ub}  rename() - rename a file

    @{b}SYNOPSIS@{ub}  @{b}rename(old, new);@{ub}

              @{i}old@{ui} - a string containing the name of the file to be renamed.
              @{i}new@{ui} - a string containing the name that the file should be
              renamed to.

 @{b}DESCRIPTION@{ub}  @{b}rename()@{ub} renames the file @{b}old@{ub} to @{b}new@{ub}.

@{b}RETURN VALUE@{ub}  @{b}rename()@{ub} returns 0 if renaming was successful, nonzero if
              error occurred.

     @{b}EXAMPLE@{ub}  @{b}rename@{ub}("fubba.fil","foobar.fil");

    @{b}SEE ALSO@{ub}  @{"remove()" link BZ_LIB_REMOVE}
@endnode


@node bz_lib_rewinddir "rewinddir"
    @{b}FUNCTION@{ub}  rewinddir() - move the directory pointer to the first
              directory entry

    @{b}SYNOPSIS@{ub}  @{b}rewinddir();@{ub}

 @{b}DESCRIPTION@{ub}  @{b}rewinddir()@{ub} adjusts the directory pointer so that it points to
              the first file in the directory matching the filespec given to
              @{b}opendir()@{ub}. @{b}rewinddir()@{ub} should not be called until after
              @{b}opendir()@{ub} is called to open a directory.

@{b}RETURN VALUE@{ub}  @{b}rewinddir()@{ub} returns always 0.

     @{b}EXAMPLE@{ub}  int main() {
                /* quick-and-dirty directory lister
                 *
                 * an example of opendir(), readdir(), closedir() and
                 * rewinddir().
                 */

                char spec,entry,file;
                int size,filecount;

                spec=input("Enter filespec: ",255,0);
                @{b}opendir@{ub}(spec);

                printf("Directory of %s...\\n\\n",spec);

                do {
                  redisp=0; filecount=0;
                  while(strlen(entry=readdir())) {
                    file=copy(entry,1,pos(entry,"\2"));
                    delete(entry,1,pos("\2",entry));
                    size=copy(entry,1,pos(entry,"\2"));
                    printf("%.30s %i\\n",file,size);
                    ++filecount;
                  }

                  printf("Total %u files.\\n",filecount);
                  printf("Hit space to view the list again.\\n");
                  while(!kbhit());
                  if(getch()==" ") {
                    rewinddir();
                    redisp=1;
                  }
                } while(redisp);

                printf("Have a nice day!\\n");
                closedir();
              }

    @{b}SEE ALSO@{ub}  @{"opendir()" link BZ_LIB_OPENDIR}, @{"readdir()" link BZ_LIB_READDIR}, @{"closedir()" link BZ_LIB_CLOSEDIR}
@endnode


@node bz_lib_seekforuser "seekforuser"
    @{b}FUNCTION@{ub}  seekforuser() - find the user number of an user

    @{b}SYNOPSIS@{ub}  @{b}seekforuser(name);@{ub}

              @{i}name@{ui} - a string containing the name of the user whose user
              number should be searched for.

 @{b}DESCRIPTION@{ub}  @{b}seekforuser()@{ub} finds the absolute user number of the user name.
              This number can be used in subsequent calls to @{b}loaduser()@{ub}.

@{b}RETURN VALUE@{ub}  @{b}seekforuser()@{ub} returns the user number of name, or 65535 if the
              user is not found.

     @{b}EXAMPLE@{ub}  loaduser(@{b}seekforuser@{ub}("Gleb Butcher"));

    @{b}SEE ALSO@{ub}  @{"loaduser()" link BZ_LIB_LOADUSER}
@endnode

@node bz_lib_sendnode "sendnode"
    @{b}FUNCTION@{ub}  sendnode() - send a node message

    @{b}SYNOPSIS@{ub}  @{b}sendnode(from, to, message, filter, prefix);@{ub}

              @{i}from@{ui}    - an integer denoting the node from which the node
              message should originate.
              @{i}to@{ui}      - an integer denoting the node to which the node
              message should be sent to.
              @{i}message@{ui} - a string containing the actual message text.
              @{i}filter@{ui}  - an integer containing the filter level of the
              message.
              @{i}prefix@{ui}  - a string containing the prefix of the message.

 @{b}DESCRIPTION@{ub}  @{b}sendnode()@{ub} sends a node message from node @{b}from@{ub} to the node @{b}to@{ub}.
              The bits in @{b}filter@{ub} define what type of node message it is. If
              the bit is unset, it means that it can be interpreted to be a
              message of that filter level. Therefore, messages with filter
              level 255 should not be used, as they can not be filtered out.

              @{b}Bit  Level@{ub}
              @{b}=======================================@{ub}
              0    Chat feeling
              1    Login / Logout information
              2    "New message entered"-information
              3    Public chat message
              4    Private chat message

              @{b}prefix@{ub} determines what kind of prefix the message should have
              when BBBS formats it into a message. Available prefixes are:

              @{b}Prefix               Message type@{ub}
              @{b}=========================================================@{ub}
              @{i}#[* ] :nick{ color}@{ui}  A feeling with focus @{b}nick@{ub}, displayed
                                   with color @{b}color@{ub}.
              @{i}#channel:nick@{ui}        A chat message in channel @{b}#channel@{ub},
                                   written by user with nickname @{b}nick@{ub}.
              @{i}nick@{ui}                 A private message from user with nickname
                                   @{b}nick@{ub}.
              @{i}*channel:nick@{ui}        An informative message to/about channel
                                   @{b}#channel@{ub} form user with nickname @{b}nick@{ub}.

              There are some node messages that have a special meaning:

              @{b}Message      Action taken when a node receives this message@{ub}
              @{b}===========================================================@{ub}
              @{b}\\02CLICK@{ub}     Sends back the message "@{b}\\02HUM@{ub}"
              @{b}\\02UDATA@{ub}     Re-reads the user record
              @{b}\\02RGROUP@{ub}    Re-reads the @{"group control file" link CFG_GROUPS} 'groups'.
              @{b}\\02RCHAT@{ub}     Re-reads the @{"chat channels" link CFG_CHAT_CHANNELS} file 'channels.bbb'.

              (In the above, \\02 is the ASCII character number 2, not the
              absolute string "\\02".)

@{b}RETURN VALUE@{ub}  @{b}sendnode()@{ub} returns always 0.

     @{b}EXAMPLE@{ub}  @{b}sendnode@{ub}(bv_nodenumber,1,"Hello!",255,bn_nick);

    @{b}SEE ALSO@{ub}  @{"getnodemessage()" link BZ_LIB_GETNODEMESSAGE}
@endnode


@node bz_lib_setenv "setenv"
    @{b}FUNCTION@{ub}  setenv() - set an environment variable

    @{b}SYNOPSIS@{ub}  @{b}setenv(env, value);@{ub}

              @{i}env@{ui}   - a string containing the name of the environment variable
              to set.
              @{i}value@{ui} - a string containing the value that the environment
              variable should be set to.

 @{b}DESCRIPTION@{ub}  @{b}setenv()@{ub} changes the value of the environment variable @{b}env@{ub} to
              be contain @{b}value@{ub}. If the environment variable does not exist,
              then it will be created. Note that like @{b}getenv()@{ub}, @{b}setenv()@{ub}
              deals with BBBS's internal environment variables, and has
              nothing to do with the environment variables of the OS.

              If you do not wish to have a environment variable listed with
              the "u set" command, then use the ASCII character 1 as the
              first character of the name.

@{b}RETURN VALUE@{ub}  @{b}setenv()@{ub} returns always 0

    @{b}EXAMPLES@{ub}  @{b}setenv@{ub}("FUBBA","t");
              @{b}setenv@{ub}("\\1INVISIBLE","foo!");

    @{b}SEE ALSO@{ub}  @{"getenv()" link BZ_LIB_GETENV}
@endnode

@node bz_lib_spawn "spawn"
    @{b}FUNCTION@{ub}  spawn() - execute another script.

    @{b}SYNOPSIS@{ub}  @{b}spawn(file);@{ub}

              @{i}file@{ui} - a string containing the name of the script to execute.

 @{b}DESCRIPTION@{ub}  @{b}spawn()@{ub} executes another script. The execution of the
              program invoking @{b}spawn()@{ub} will continue when the executed
              program exits.

              It is also possible to pass parameters to the @{b}main@{ub}-function
              of the script being called. This is accomplished by adding
              the parameters to the @{b}file@{ub}-parameter of @{b}spawn()@{ub}, separated with
              the ASCII character 1.

@{b}RETURN VALUE@{ub}  @{b}spawn()@{ub} returns always 0.

     @{b}EXAMPLE@{ub}  @{b}spawn@{ub}("c:/bbs/bz/newscript");

    @{b}SEE ALSO@{ub}  @{"exec()" link BZ_LIB_EXEC}
@endnode

@node bz_lib_sprintf "sprintf"
    @{b}FUNCTION@{ub}  sprintf() - write formatted text into a string.

    @{b}SYNOPSIS@{ub}  @{b}sprintf(format {,argument{,argument...}});@{ub}

              @{i}format@{ui} - a format specifier, see @{b}printf()@{ub} for details

              @{b}sprintf()@{ub} can have a number of additional arguments,
              depending on the @{i}format specifier@{ui}. For every format
              specifier in @{b}format@{ub}, an argument should be given.

 @{b}DESCRIPTION@{ub}  @{b}sprintf()@{ub} performs formatted output and returns it.

@{b}RETURN VALUE@{ub}  @{b}sprintf()@{ub} returns the formatted string.

     @{b}EXAMPLE@{ub}  bar=@{b}sprintf@{ub}("49=0x%04X=%oo",49,49);

    @{b}SEE ALSO@{ub}  @{"printf()" link BZ_LIB_PRINTF}, @{"fprintf()" link BZ_LIB_FPRINTF}
@endnode

@node bz_lib_stlocase "stlocase"
    @{b}FUNCTION@{ub}  stlocase() - convert a string into lower case

    @{b}SYNOPSIS@{ub}  @{b}stlocase(str);@{ub}

              @{i}str@{ui} - the string to be converted

 @{b}DESCRIPTION@{ub}  @{b}stlocase()@{ub} converts a string into lower case, taking into
              account the character set that the user is using.

@{b}RETURN VALUE@{ub}  @{b}stlocase()@{ub} returns @{b}str@{ub} in lower case.

     @{b}EXAMPLE@{ub}  foo=@{b}stlocase@{ub}("eLiTeS SuCK!");

    @{b}SEE ALSO@{ub}  @{"stupcase()" link BZ_LIB_STUPCASE}
@endnode

@node bz_lib_strcat "strcat"
    @{b}FUNCTION@{ub}  strcat() - join two strings

    @{b}SYNOPSIS@{ub}  @{b}strcat(str1, str2);@{ub}

              @{i}str1@{ui} - a string
              @{i}str2@{ui} - the string that should be joined to @{b}str1@{ub}

 @{b}DESCRIPTION@{ub}  @{b}strcat()@{ub} joins @{b}str2@{ub} into @{b}str1.@{ub}

@{b}RETURN VALUE@{ub}  @{b}strcat()@{ub} returns a string consisting of @{b}str1@{ub} and @{b}str2@{ub}.

     @{b}EXAMPLE@{ub}  foo=input("What is your name? ",50,1);
              printf("%s!\\n",@{b}strcat@{ub}("Hello, ",foo));

    @{b}SEE ALSO@{ub}  @{"sprintf()" link BZ_LIB_SPRINTF}
@endnode

@node bz_lib_strlen "strlen"
    @{b}FUNCTION@{ub}  strlen() - calculate the length of a string

    @{b}SYNOPSIS@{ub}  @{b}strlen(str);@{ub}

              @{i}str@{ui} - the string the length of which should determined.

 @{b}DESCRIPTION@{ub}  @{b}strlen()@{ub} calculates the length of @{b}str@{ub} and returns it.

@{b}RETURN VALUE@{ub}  @{b}strlen(@{ub}) returns an integer determining the length of @{b}str@{ub} in
              characters.

     @{b}EXAMPLE@{ub}  printf("You are %u chars long!\\n",@{b}strlen@{ub}(bu_name));
@endnode

@node bz_lib_stupcase "stupcase"
    @{b}FUNCTION@{ub}  stupcase() - convert a string into upper case.

    @{b}SYNOPSIS@{ub}  @{b}stupcase(str);@{ub}

              @{i}str@{ui} - the string to be converted

 @{b}DESCRIPTION@{ub}  @{b}stupcase()@{ub} converts a string into upper case, taking into
              account the character set that the user is using.

@{b}RETURN VALUE@{ub}  @{b}stupcase()@{ub} returns @{b}str@{ub} in upper case.

     @{b}EXAMPLE@{ub}  foo=stupcase("i want to yell!");

    @{b}SEE ALSO@{ub}  @{"stlocase()" link BZ_LIB_STLOCASE}
@endnode

@node bz_lib_system "system"
    @{b}FUNCTION@{ub}  system() - execute an operating system command

    @{b}SYNOPSIS@{ub}  @{b}system(command, swap);@{ub}

              @{i}command@{ui} - a string containing the OS command to be executed.
              @{i}swap@{ui}    - an integer determining if swapping should be done.

 @{b}DESCRIPTION@{ub}  @{b}system()@{ub} drops into OS, executes the OS command @{b}command@{ub} and
              returns back to the program. If @{b}swap@{ub} is true, then BBBS will
              be swapped to disk or EMS/XMS to save memory for the OS
              command execution in such environments in which this is
              possible to do.

@{b}RETURN VALUE@{ub}  @{b}system()@{ub} returns an integer determining the errorlevel value
              as returned by the OS.

     @{b}EXAMPLE@{ub}  printf("Errorlevel=%u",@{b}system@{ub}("foo.exe",1));

    @{b}SEE ALSO@{ub}  @{"bbbs()" link BZ_LIB_BBBS}, @{"exec()" link BZ_LIB_EXEC}, @{"spawn()" link BZ_LIB_SPAWN}
@endnode

@node bz_lib_time "time"
    @{b}FUNCTION@{ub}  time() - return seconds since 1.1.1970, 00:00 UTC

    @{b}SYNOPSIS@{ub}  time();

 @{b}DESCRIPTION@{ub}  time() returns the amount of seconds that have passed
              since 1.1.1970 at 00:00 UTC.

@{b}RETURN VALUE@{ub}  time() returns an integer determining the amount of
              seconds that have passed.
@endnode

@node bz_lib_tictactoe "tictactoe"
    @{b}FUNCTION@{ub}  tictactoe() - execute the game of TicTacToe

    @{b}SYNOPSIS@{ub}  @{b}tictactoe(mode, mark);@{ub}

              @{i}mode@{ui} - An integer determining the mode of play.
              @{i}mark@{ui} - The mark to be used.

 @{b}DESCRIPTION@{ub}  @{b}tictactoe()@{ub} executes the BBBS's internal TicTacToe game. The
              game is played in mode @{b}mode@{ub}, with the mark setup @{b}mark@{ub}. mode 1
              and mark 0 is the normal local versus remote-tictactoe.

@{b}RETURN VALUE@{ub}  @{b}tictactoe()@{ub} returns an integer from 1 to 5, determining the
              result of the game, as follows:
              1 - Local user quit the game.
              2 - Remote user quit the game.
              3 - Local user won.
              4 - Remote user won.
              5 - Carrier was dropped.

    @{b}EXAMPLES@{ub}  @{b}tictactoe@{ub}(1,0);
              @{b}tictactoe@{ub}(2,1);
              @{b}tictactoe@{ub}(2,2);
@endnode


@node bz_lib_yellsysop "yellsysop"
    @{b}FUNCTION@{ub}  yellsysop() - page the system operator

    @{b}SYNOPSIS@{ub}  @{b}yellsysop(ask);@{ub}

              @{i}ask@{ui} - an integer denoting whether or not a reason should be
              asked.

 @{b}DESCRIPTION@{ub}  @{b}yellsysop()@{ub} pages the system operator. If @{b}ask@{ub} is true, then a
              chat reason will be asked.

@{b}RETURN VALUE@{ub}  @{b}yellsysop()@{ub} returns true if the SysOp answered to the page
              request.

     @{b}EXAMPLE@{ub}  @{b}yellsysop@{ub}(1);
@endnode

@node bz_var "BBBS variables"
The following global variables are defined in BZ run-time library:

        @{b}Variable name              Type         Index   Constant@{ub}
        @{b}========================================================@{ub}

        @{fg highlight}Conference variables:@{fg text}
        @{" bc_count_of_co     " link bz_var_bc_count_of_co}       int                  *
        @{" bc_post_conf       " link bz_var_bc_post_conf  }       int                  *
        @{" bc_resume_conf     " link bz_var_bc_resume_conf}       int                  *
        @{" bc_fileinfo_co     " link bz_var_bc_fileinfo_co}       int                  *
        @{" bc_lastread        " link bz_var_bc_lastread   }       int          *       *
        @{" bc_status          " link bz_var_bc_status     }       int          *       *
        @{" bc_confname        " link bz_var_bc_confname   }       char         *       *
        @{" bc_description     " link bz_var_bc_description}       char         *       *
        @{" bc_ulastread       " link bz_var_bc_ulastread  }       int          *
        @{" bc_ustatus         " link bz_var_bc_ustatus    }       int          *
        @{" bc_uaccess         " link bz_var_bc_uaccess    }       int          *

        @{fg highlight}Function variables:@{fg text}
        @{" bf_timleft         " link bz_var_bf_timleft    }       int                  *
        @{" bf_hour            " link bz_var_bf_hour       }       int                  *
        @{" bf_min             " link bz_var_bf_min        }       int                  *
        @{" bf_sec             " link bz_var_bf_sec        }       int                  *
        @{" bf_year            " link bz_var_bf_year       }       int                  *
        @{" bf_month           " link bz_var_bf_month      }       int                  *
        @{" bf_day             " link bz_var_bf_day        }       int                  *

        @{fg highlight}Global config:@{fg text}
        @{" bg_bbbs_name       " link bz_var_bg_bbbs_name  }       char                 *
        @{" bg_sysop_name      " link bz_var_bg_sysop_name }       char                 *
        @{" bg_closed_pass     " link bz_var_bg_closed_pass}       char                 *
        @{" bg_grabfile        " link bz_var_bg_grabfile   }       char                 *
        @{" bg_maindir         " link bz_var_bg_maindir    }       char                 *
        @{" bg_updir           " link bz_var_bg_updir      }       char
        @{" bg_tempdir         " link bz_var_bg_tempdir    }       char                 *
        @{" bg_menudir         " link bz_var_bg_menudir    }       char                 *
        @{" bg_tickdir         " link bz_var_bg_tickdir    }       char                 *
        @{" bg_NetMail         " link bz_var_bg_NetMail    }       char                 *
        @{" bg_inbound         " link bz_var_bg_inbound    }       char                 *
        @{" bg_feelingsdir     " link bz_var_bg_feelingsdir}       char                 *
        @{" bg_scriptdir       " link bz_var_bg_scriptdir  }       char                 *
        @{" bg_max_nodes       " link bz_var_bg_max_nodes  }       int                  *
        @{" bg_bankmax         " link bz_var_bg_bankmax    }       int                  *
        @{" bg_newu_time       " link bz_var_bg_newu_time  }       int                  *
        @{" bg_bankrate        " link bz_var_bg_bankrate   }       int                  *
        @{" bg_msgrate         " link bz_var_bg_msgrate    }       int                  *
        @{" bg_newu_access     " link bz_var_bg_newu_access}       int                  *
        @{" bg_gtoggles        " link bz_var_bg_gtoggles   }       int                  *
        @{" bg_htoggles        " link bz_var_bg_htoggles   }       int                  *
        @{" bg_zone            " link bz_var_bg_zone       }       int          *       *
        @{" bg_net             " link bz_var_bg_net        }       int          *       *
        @{" bg_node            " link bz_var_bg_node       }       int          *       *
        @{" bg_point           " link bz_var_bg_point      }       int          *       *

        @{fg highlight}Local config:@{fg text}
        @{" bl_modem_init1     " link bz_var_bl_modem_init1}       char                 *
        @{" bl_modem_init2     " link bz_var_bl_modem_init2}       char                 *
        @{" bl_modem_init3     " link bz_var_bl_modem_init3}       char                 *
        @{" bl_modem_hangu     " link bz_var_bl_modem_hangu}       char                 *
        @{" bl_modem_busy_     " link bz_var_bl_modem_busy_}       char                 *
        @{" bl_modem_answe     " link bz_var_bl_modem_answe}       char                 *
        @{" bl_fd_dobbs        " link bz_var_bl_fd_dobbs   }       char                 *
        @{" bl_logfile         " link bz_var_bl_logfile    }       char                 *
        @{" bl_loginlog        " link bz_var_bl_loginlog   }       char                 *
        @{" bl_grabdir         " link bz_var_bl_grabdir    }       char                 *
        @{" bl_menudir         " link bz_var_bl_menudir    }       char                 *
        @{" bl_newdir          " link bz_var_bl_newdir     }       char                 *
        @{" bl_spyfile         " link bz_var_bl_spyfile    }       char                 *
        @{" bl_start_speed     " link bz_var_bl_start_speed}       int                  *
        @{" bl_min_speed       " link bz_var_bl_min_speed  }       int                  *
        @{" bl_base_addres     " link bz_var_bl_base_addres}       int                  *
        @{" bl_irq             " link bz_var_bl_irq        }       int                  *
        @{" bl_pollrate        " link bz_var_bl_pollrate   }       int                  *
        @{" bl_answer_ring     " link bz_var_bl_answer_ring}       int                  *
        @{" bl_ltoggles        " link bz_var_bl_ltoggles   }       int                  *

        @{fg highlight}Node variables:@{fg text}
        @{" bn_split           " link bz_var_bn_split      }       int
        @{" bn_bstatus         " link bz_var_bn_bstatus    }       int
        @{" bn_zstatus         " link bz_var_bn_zstatus    }       int
        @{" bn_speed           " link bz_var_bn_speed      }       int
        @{" bn_time            " link bz_var_bn_time       }       int
        @{" bn_nick            " link bz_var_bn_nick       }       char
        @{" bn_realname        " link bz_var_bn_realname   }       char

        @{fg highlight}User variables:@{fg text}
        @{" bu_name            " link bz_var_bu_name       }       char                 *
        @{" bu_address         " link bz_var_bu_address    }       char
        @{" bu_city            " link bz_var_bu_city       }       char
        @{" bu_phone           " link bz_var_bu_phone      }       char
        @{" bu_birth           " link bz_var_bu_birth      }       char
        @{" bu_ok2login        " link bz_var_bu_ok2login   }       int
        @{" bu_termcap         " link bz_var_bu_termcap    }       int
        @{" bu_pagelength      " link bz_var_bu_pagelength }       int
        @{" bu_charset         " link bz_var_bu_charset    }       int
        @{" bu_language        " link bz_var_bu_language   }       int
        @{" bu_readmode        " link bz_var_bu_readmode   }       int
        @{" bu_packtype        " link bz_var_bu_packtype   }       int
        @{" bu_protocol        " link bz_var_bu_protocol   }       int
        @{" bu_nodemsgfilt     " link bz_var_bu_nodemsgfilt}       int
        @{" bu_timelimit       " link bz_var_bu_timelimit  }       int
        @{" bu_timeleft        " link bz_var_bu_timeleft   }       int
        @{" bu_timeson         " link bz_var_bu_timeson    }       int
        @{" bu_msgleft         " link bz_var_bu_msgleft    }       int
        @{" bu_uploaded        " link bz_var_bu_uploaded   }       int
        @{" bu_downloaded      " link bz_var_bu_downloaded }       int
        @{" bu_pmsgleft        " link bz_var_bu_pmsgleft   }       int
        @{" bu_puploaded       " link bz_var_bu_puploaded  }       int
        @{" bu_pdownloaded     " link bz_var_bu_pdownloaded}       int
        @{" bu_ptimeson        " link bz_var_bu_ptimeson   }       int
        @{" bu_pmsgdumped      " link bz_var_bu_pmsgdumped }       int
        @{" bu_pmsgread        " link bz_var_bu_pmsgread   }       int
        @{" bu_pkbup           " link bz_var_bu_pkbup      }       int
        @{" bu_pkbdown         " link bz_var_bu_pkbdown    }       int
        @{" bu_fchecked        " link bz_var_bu_fchecked   }       int
        @{" bu_timebank        " link bz_var_bu_timebank   }       int
        @{" bu_resume          " link bz_var_bu_resume     }       int
        @{" bu_limits          " link bz_var_bu_limits     }       int
        @{" bu_access          " link bz_var_bu_access     }       int
        @{" bu_utoggles        " link bz_var_bu_utoggles   }       int
        @{" bu_firsttime       " link bz_var_bu_firsttime  }       int
        @{" bu_lasttime        " link bz_var_bu_lasttime   }       int
        @{" bu_msgread         " link bz_var_bu_msgread    }       int
        @{" bu_msgdumped       " link bz_var_bu_msgdumped  }       int
        @{" bu_kbup            " link bz_var_bu_kbup       }       int
        @{" bu_kbdown          " link bz_var_bu_kbdown     }       int
        @{" bu_todaydown       " link bz_var_bu_todaydown  }       int
        @{" bu_userbits        " link bz_var_bu_userbits   }       int

        @{fg highlight}Other variables:@{fg text}
        @{" bv_filna           " link bz_var_bv_filna      }       char
        @{" bv_local_buffe     " link bz_var_bv_local_buffe}       char
        @{" bv_comhandle       " link bz_var_bv_comhandle  }       int                  *
        @{" bv_comdevice       " link bz_var_bv_comdevice  }       char                 *
        @{" bv_comstring       " link bz_var_bv_comstring  }       char
        @{" bv_interface       " link bz_var_bv_interface  }       char
        @{" bv_crrdir          " link bz_var_bv_crrdir     }       char
        @{" bv_holdreal        " link bz_var_bv_holdreal   }       char
        @{" bv_hddesc          " link bz_var_bv_hddesc     }       char
        @{" bv_serna           " link bz_var_bv_serna      }       char                 *
        @{" bv_tempsys         " link bz_var_bv_tempsys    }       int
        @{" bv_unum            " link bz_var_bv_unum       }       int                  *
        @{" bv_confnro         " link bz_var_bv_confnro    }       int                  *
        @{" bv_baud            " link bz_var_bv_baud       }       int
        @{" bv_realbaud        " link bz_var_bv_realbaud   }       int
        @{" bv_loginhour       " link bz_var_bv_loginhour  }       int
        @{" bv_loginmin        " link bz_var_bv_loginmin   }       int
        @{" bv_lastmsg         " link bz_var_bv_lastmsg    }       int
        @{" bv_curmsg          " link bz_var_bv_curmsg     }       int
        @{" bv_firstmsg        " link bz_var_bv_firstmsg   }       int
        @{" bv_lastreaded      " link bz_var_bv_lastreaded }       int
        @{" bv_newavail        " link bz_var_bv_newavail   }       int
        @{" bv_foryou          " link bz_var_bv_foryou     }       int
        @{" bv_serno           " link bz_var_bv_serno      }       int                  *
        @{" bv_vername         " link bz_var_bv_vername    }       char                 *
        @{" bv_ver             " link bz_var_bv_ver        }       char                 *
        @{" bv_brobot          " link bz_var_bv_brobot     }       int
        @{" bv_tomenu          " link bz_var_bv_tomenu     }       int
        @{" bv_nodenumber      " link bz_var_bv_nodenumber }       int                  *
        @{" bv_reduced         " link bz_var_bv_reduced    }       int
        @{" bv_nextevent       " link bz_var_bv_nextevent  }       int
        @{" bv_temptime        " link bz_var_bv_temptime   }       int
        @{" bv_com             " link bz_var_bv_com        }       int                  *
        @{" bv_carrier         " link bz_var_bv_carrier    }       int
        @{" bv_outputstopp     " link bz_var_bv_outputstopp}       int
        @{" bv_quicklogin      " link bz_var_bv_quicklogin }       int
        @{" bv_paged           " link bz_var_bv_paged      }       int
        @{" bv_groups          " link bz_var_bv_groups     }       char
        @{" bv_txt             " link bz_var_bv_txt        }       char         *       *
@endnode

@node bz_var_bc_count_of_co "bc_count_of_co"
   @{b}VARIABLE@{ub}   bc_count_of_co

       @{b}TYPE@{ub}   int (constant)

@{b}DESCRIPTION@{ub}   Returns the total number of conferences.
@endnode

@node bz_var_bc_post_conf "bc_post_conf"
   @{b}VARIABLE@{ub}   bc_post_conf

       @{b}TYPE@{ub}   int (constant)

@{b}DESCRIPTION@{ub}   Conference number for the defined post conference.
              If no post conference is defined this will contain the
              number 65535.
@endnode

@node bz_var_bc_resume_conf "bc_resume_conf"
   @{b}VARIABLE@{ub}   bc_resume_conf

       @{b}TYPE@{ub}   int (constant)

@{b}DESCRIPTION@{ub}   Conference number for the defined resume conference.
              If no resume conference is defined this will contain the
              number 65535.
@endnode

@node bz_var_bc_fileinfo_co "bc_fileinfo_co"
   @{b}VARIABLE@{ub}   bc_fileinfo_co

       @{b}TYPE@{ub}   int (constant)

@{b}DESCRIPTION@{ub}   Conference number for the defined fileinfo conference.
              If no fileinfo conference is defined this will contain the
              number 65535.
@endnode

@node bz_var_bc_lastread "bc_lastread"
   @{b}VARIABLE@{ub}   bc_lastread[x]

       @{b}TYPE@{ub}   int (constant), indexed

@{b}DESCRIPTION@{ub}   Returns the amout of messages automatically put to scan when
              user joins to conference #x.

    @{b}EXAMPLE@{ub}   printf("User gets %u messages when joining to %s\\n",
                     bc_lastread[3],bc_confname[3]);
@endnode

@node bz_var_bc_status "bc_status"
   @{b}VARIABLE@{ub}   bc_status[x]

       @{b}TYPE@{ub}   int (constant), indexed

@{b}DESCRIPTION@{ub}   Returns a number which indicates what status conference #x has.

              The bits are:
              @{i}1    @{ui} must
              @{i}2    @{ui} member
              @{i}4    @{ui} invite
              @{i}8    @{ui} fidoarea
              @{i}16   @{ui} postarea
              @{i}32   @{ui} allowpriv
              @{i}64   @{ui} nomarks
              @{i}128  @{ui} noreply
              @{i}256  @{ui} nostrip
              @{i}512  @{ui} allfix
              @{i}1024 @{ui} namefix
              @{i}2048 @{ui} alias
              @{i}4096 @{ui} allowtag
              @{i}8192 @{ui} agnet
              @{i}16384@{ui} moderated
              @{i}32768@{ui} nntp
@endnode

@node bz_var_bc_confname "bc_confname"
   @{b}VARIABLE@{ub}   bc_confname[x]

       @{b}TYPE@{ub}   char (constant), indexed

@{b}DESCRIPTION@{ub}   Returns the name of conference #x.
@endnode

@node bz_var_bc_description "bc_description"
   @{b}VARIABLE@{ub}   bc_description[x]

       @{b}TYPE@{ub}   char (constant), indexed

@{b}DESCRIPTION@{ub}   Returns the description of conference #x.
@endnode

@node bz_var_bc_ulastread "bc_ulastead"
   @{b}VARIABLE@{ub}   bc_ulastread[x]

       @{b}TYPE@{ub}   int (constant), indexed

@{b}DESCRIPTION@{ub}   Returns the user's lastread pointer for conference #x.
@endnode

@node bz_var_bc_ustatus "bc_ustatus"
   @{b}VARIABLE@{ub}   bc_ustatus[x]

       @{b}TYPE@{ub}   int (constant), indexed

@{b}DESCRIPTION@{ub}   Returns the user's status bits for conference #x.
@endnode

@node bz_var_bc_uaccess "bc_uaccess"
   @{b}VARIABLE@{ub}   bc_uaccess[x]

       @{b}TYPE@{ub}   int (constant), indexed

@{b}DESCRIPTION@{ub}   Returns the user's access bits for conference #x.
@endnode

@node bz_var_bf_timleft "bf_timleft"
   @{b}VARIABLE@{ub}   bf_timleft

       @{b}TYPE@{ub}   int (constant)

@{b}DESCRIPTION@{ub}   Returns minutes left for this call for the current user.

@{b}EXAMPLE CODE@{ub}  int main() {
                printf("You have %u min. left for this call.\\n",@{i}bf_timleft@{ui});
              }
@endnode

@node bz_var_bf_hour    "bf_hour"
   @{b}VARIABLE@{ub}   bf_hour

       @{b}TYPE@{ub}   int (constant)

@{b}DESCRIPTION@{ub}   This is the hour part of the time. It returns the
              current hour.
@endnode

@node bz_var_bf_min     "bf_min"
   @{b}VARIABLE@{ub}   bf_min

       @{b}TYPE@{ub}   int (constant)

@{b}DESCRIPTION@{ub}   This is the minute part of the time. It returns the
              current minutes.
@endnode

@node bz_var_bf_sec     "bf_sec"
   @{b}VARIABLE@{ub}   bf_sec

       @{b}TYPE@{ub}   int (constant)

@{b}DESCRIPTION@{ub}   This is the seconds part of the time. It returns the
              current seconds.
@endnode

@node bz_var_bf_year    "bf_year"
   @{b}VARIABLE@{ub}   bf_year

       @{b}TYPE@{ub}   int (constant)

@{b}DESCRIPTION@{ub}   This is year part of the date. It returns the
              current year.
@endnode

@node bz_var_bf_month   "bf_month"
   @{b}VARIABLE@{ub}   bf_month

       @{b}TYPE@{ub}   int (constant)

@{b}DESCRIPTION@{ub}   This is month part of the date. It returns the
              current month.
@endnode

@node bz_var_bf_day     "bf_day"
   @{b}VARIABLE@{ub}   bf_day

       @{b}TYPE@{ub}   int (constant)

@{b}DESCRIPTION@{ub}   This is the day part of the date. It returns the
              current day.
@endnode

@node bz_var_bg_bbbs_name "bg_bbbs_name"
   @{b}VARIABLE@{ub}   bg_bbbs_name

       @{b}TYPE@{ub}   char (constant)

@{b}DESCRIPTION@{ub}   Returns the name of the board.
@endnode

@node bz_var_bg_sysop_name "bg_sysop_name"
   @{b}VARIABLE@{ub}   bg_sysop_name

       @{b}TYPE@{ub}   char (constant)

@{b}DESCRIPTION@{ub}   Returns the name of User #0, which is the "real" SysOp.
@endnode

@node bz_var_bg_closed_pass "bg_closed_pass"
   @{b}VARIABLE@{ub}   bg_closed_pass

       @{b}TYPE@{ub}   char (constant)

@{b}DESCRIPTION@{ub}   Returns the password for accessing the system if you
              run a closed system. This string is crypted.
@endnode

@node bz_var_bg_grabfile  "bg_grabfile"
   @{b}VARIABLE@{ub}   bg_grabfile

       @{b}TYPE@{ub}   char (constant)

@{b}DESCRIPTION@{ub}   Returns the name of the grabfile as you have defined
              it in BCFG/4.
@endnode

@node bz_var_bg_maindir   "bg_maindir"
   @{b}VARIABLE@{ub}   bg_maindir

       @{b}TYPE@{ub}   char (constant)

@{b}DESCRIPTION@{ub}   Returns the path to your main dir including a
              trailing slash.
@endnode

@node bz_var_bg_updir     "bg_updir"
   @{b}VARIABLE@{ub}   bg_updir

       @{b}TYPE@{ub}   char

@{b}DESCRIPTION@{ub}   Returns the path to your upload directory including
              a trailing slash.

    @{b}Remarks@{ub}   If you changes this variable remember to change it back to
              original value too!
@endnode

@node bz_var_bg_tempdir   "bg_tempdir"
   @{b}VARIABLE@{ub}   bg_tempdir

       @{b}TYPE@{ub}   char (constant)

@{b}DESCRIPTION@{ub}   Returns the path to your work directory including
              a trailing slash.
@endnode

@node bz_var_bg_menudir   "bg_menudir"
   @{b}VARIABLE@{ub}   bg_menudir

       @{b}TYPE@{ub}   char (constant)

@{b}DESCRIPTION@{ub}   Returns the path to your main menu directory
              including a trailing slash.
@endnode

@node bz_var_bg_tickdir   "bg_tickdir"
   @{b}VARIABLE@{ub}   bg_tickdir

       @{b}TYPE@{ub}   char (constant)

@{b}DESCRIPTION@{ub}   Returns the path to your tick files directory
              including a trailing slash.
@endnode

@node bz_var_bg_NetMail   "bg_NetMail"
   @{b}VARIABLE@{ub}   bg_NetMail

       @{b}TYPE@{ub}   char (constant)

@{b}DESCRIPTION@{ub}   Returns the path to your NetMail directory
              including a trailing slash.
@endnode

@node bz_var_bg_inbound   "bg_inbound"
   @{b}VARIABLE@{ub}   bg_inbound

       @{b}TYPE@{ub}   char (constant)

@{b}DESCRIPTION@{ub}   Returns the path to your inbound files directory
              including a trailing slash.
@endnode

@node bz_var_bg_feelingsdir "bg_feelingsdir"
   @{b}VARIABLE@{ub}   bg_feelingsdir

       @{b}TYPE@{ub}   char (constant)

@{b}DESCRIPTION@{ub}   Returns the path to your feelings directory
              including a trailing slash.
@endnode

@node bz_var_bg_scriptdir "bg_scriptdir"
   @{b}VARIABLE@{ub}   bg_scriptdir

       @{b}TYPE@{ub}   char (constant)

@{b}DESCRIPTION@{ub}   Returns the path to your scripts directory
              including a trailing slash. All of your scripts should
              be in this directory.
@endnode

@node bz_var_bg_max_nodes "bg_max_nodes"
   @{b}VARIABLE@{ub}   bg_max_nodes

       @{b}TYPE@{ub}   int (constant)

@{b}DESCRIPTION@{ub}   Returns the number of nodes configured in your system.
@endnode

@node bz_var_bg_bankmax   "bg_bankmax"
   @{b}VARIABLE@{ub}   bg_bankmax

       @{b}TYPE@{ub}   int (constant)

@{b}DESCRIPTION@{ub}   Returns the maximum amount of time allowed to store
              in the Time Bank.
@endnode

@node bz_var_bg_newu_time "bg_newu_time"
   @{b}VARIABLE@{ub}   bg_newu_time

       @{b}TYPE@{ub}   int (constant)

@{b}DESCRIPTION@{ub}   Returns the default timelimit for new users.
@endnode

@node bz_var_bg_bankrate  "bg_bankrate"
   @{b}VARIABLE@{ub}   bg_bankrate

       @{b}TYPE@{ub}   int (constant)

@{b}DESCRIPTION@{ub}   Returns the ratio divider used for calculating the
              Time Bank ratio.
@endnode

@node bz_var_bg_msgrate   "bg_msgrate"
   @{b}VARIABLE@{ub}   bg_msgrate

       @{b}TYPE@{ub}   int (constant)

@{b}DESCRIPTION@{ub}   Returns the ratio divider used for calculating the
              number of messages a user must write to get Download access
              from BRoboCop.
@endnode

@node bz_var_bg_newu_access  "bg_newu_access"
   @{b}VARIABLE@{ub}   bg_newu_access

       @{b}TYPE@{ub}   int (constant)

@{b}DESCRIPTION@{ub}   Returns a number which sets several different user
              settings:

              @{i}0x40000000@{ui}        New user has download access
              @{i}0x80000000@{ui}        New user has upload access
@endnode

@node bz_var_bg_gtoggles "bg_gtoggles"
   @{b}VARIABLE@{ub}   bg_gtoggles

      @{b}TYPE@{ub}    int (constant)

@{b}DESCRIPTION@{ub}   Returns a number containg different global toggles.
              (See also @{"bg_htoggles" link bz_var_bg_htoggles})

              @{b}Bit Meaning@{ub}
              @{b}=== ==========================@{ub}
              @{i} 0@{ui}  up_down_check
              @{i} 1@{ui}  show_privates
              @{i} 2@{ui}  brobocop
              @{i} 3@{ui}  hippo
              @{i} 4@{ui}  show_empty
              @{i} 5@{ui}  whotext
              @{i} 6@{ui}  pack_messages
              @{i} 7@{ui}  fido_hydra
              @{i} 8@{ui}  fido_zedzap
              @{i} 9@{ui}  fido_tranx
              @{i}10@{ui}  fido_unlistnode
              @{i}11@{ui}  fido_unlistpoint
              @{i}12@{ui}  fido_unprotnode
              @{i}13@{ui}  fido_freq_answering
              @{i}14@{ui}  fido_freq_calling
              @{i}15@{ui}  show_sysop_in_stats
              @{i}16@{ui}  bmt_check_destination
              @{i}17@{ui}  disable_newu_address
              @{i}18@{ui}  disable_newu_birthday
              @{i}19@{ui}  users_are_hidden
              @{i}20@{ui}  upload_scan
              @{i}21@{ui}  poll_all_crashes
              @{i}22@{ui}  delete_dup_uploads
              @{i}23@{ui}  savebad
              @{i}24@{ui}  savesecure
              @{i}25@{ui}  bmt_log_headers
              @{i}27@{ui}  no_remote_sysop
              @{i}28@{ui}  bogus_save_NetMail
              @{i}29@{ui}  kb_day_relative
              @{i}30@{ui}  global_download
              @{i}31@{ui}  nntp_gateway
              @{i}32@{ui}  smtp_gateway
@endnode

@node bz_var_bg_htoggles "bg_htoggles"
   @{b}VARIABLE@{ub}   bg_htoggles

      @{b}TYPE@{ub}    int (constant)

@{b}DESCRIPTION@{ub}   Returns a number containg more different global toggles.
              (See also @{"bg_gtoggles" link bz_var_bg_gtoggles})

              @{b}Bit Meaning@{ub}
              @{b}=== ==========================@{ub}
              @{i} 0@{ui}  nntp_save_headers
              @{i} 1@{ui}  smtp_save_headers
              @{i} 2@{ui}  chat_uses_time
              @{i} 3@{ui}  sysnote_msg
              @{i} 4@{ui}  eom_to_uucp
              @{i} 5@{ui}  use_nodenum_not_nick
              @{i} 6@{ui}  allow_all_names
              @{i} 7@{ui}  not used
              @{i} 8@{ui}  grab_is_free
              @{i} 9@{ui}  uploader_owns_file
@endnode

@node bz_var_bg_zone "bg_zone"
   @{b}VARIABLE@{ub}   bg_zone[x]

      @{b}TYPE@{ub}    int (constant), indexed

@{b}DESCRIPTION@{ub}   Returns the zone part of FidoNet AKA #x.
@endnode

@node bz_var_bg_net "bg_net"
   @{b}VARIABLE@{ub}   bg_net[x]

      @{b}TYPE@{ub}    int (constant), indexed

@{b}DESCRIPTION@{ub}   Returns the net part of FidoNet AKA #x.
@endnode

@node bz_var_bg_node "bg_node"
   @{b}VARIABLE@{ub}   bg_node[x]

      @{b}TYPE@{ub}    int (constant), indexed

@{b}DESCRIPTION@{ub}   Returns the node part of FidoNet AKA #x.
@endnode

@node bz_var_bg_point "bg_point"
   @{b}VARIABLE@{ub}   bg_point[x]

      @{b}TYPE@{ub}    int (constant), indexed

@{b}DESCRIPTION@{ub}   Returns the point part of FidoNet AKA #x.
@endnode

@node bz_var_bl_modem_init1 "bl_modem_init1"
   @{b}VARIABLE@{ub}   bl_modem_init1

       @{b}TYPE@{ub}   char (constant)

@{b}DESCRIPTION@{ub}   Returns the first of the three line Init string from BCFG/4.
@endnode

@node bz_var_bl_modem_init2 "bl_modem_init2"
   @{b}VARIABLE@{ub}   bl_modem_init2

       @{b}TYPE@{ub}   char (constant)

@{b}DESCRIPTION@{ub}   Returns the second of the three line Init string from BCFG/4.
@endnode

@node bz_var_bl_modem_init3 "bl_modem_init3"
   @{b}VARIABLE@{ub}   bl_modem_init3

       @{b}TYPE@{ub}   char (constant)

@{b}DESCRIPTION@{ub}   Returns the third of the three line Init string from BCFG/4.
@endnode

@node bz_var_bl_modem_hangu "bl_modem_hangu"
   @{b}VARIABLE@{ub}   bl_modem_hangu

       @{b}TYPE@{ub}   char (constant)

@{b}DESCRIPTION@{ub}   Returns the configured string to force the modem to hang up.
@endnode

@node bz_var_bl_modem_busy_ "bl_modem_busy_"
   @{b}VARIABLE@{ub}   bl_modem_busy_

       @{b}TYPE@{ub}   char (constant)

@{b}DESCRIPTION@{ub}   Returns the configured string to set the modem busy from BCFG/4.
@endnode

@node bz_var_bl_modem_answe "bl_modem_answe"
   @{b}VARIABLE@{ub}   bl_modem_answe

       @{b}TYPE@{ub}   char (constant)

@{b}DESCRIPTION@{ub}   Returns the configured string to tell the modem to answer an
              incoming call. This is configured in BCFG/4.
@endnode

@node bz_var_bl_fd_dobbs  "bl_fd_dobbs"
   @{b}VARIABLE@{ub}   bl_fd_dobbs

       @{b}TYPE@{ub}   char (constant)

@{b}DESCRIPTION@{ub}   Returns the path and name of the DOBBS.BAT file used for
              FrontDoor if one is defined in BCFG/4. If none is defined, the
              string will be empty.
@endnode

@node bz_var_bl_logfile   "bl_logfile"
   @{b}VARIABLE@{ub}   bl_logfile

       @{b}TYPE@{ub}   char (constant)

@{b}DESCRIPTION@{ub}   Returns the path and the filename of the current
              node's log file.
@endnode

@node bz_var_bl_loginlog  "bl_loginlog"
   @{b}VARIABLE@{ub}   bl_loginlog

       @{b}TYPE@{ub}   char (constant)

@{b}DESCRIPTION@{ub}   Returns the path and the filename of the current node's
              login file.
@endnode

@node bz_var_bl_grabdir   "bl_grabdir"
   @{b}VARIABLE@{ub}   bl_grabdir

       @{b}TYPE@{ub}   char (constant)

@{b}DESCRIPTION@{ub}   Returns the path including a trailing slash for the
              current node's grab directory.
@endnode

@node bz_var_bl_menudir   "bl_menudir"
   @{b}VARIABLE@{ub}   bl_menudir

       @{b}TYPE@{ub}   char (constant)

@{b}DESCRIPTION@{ub}   Returns the path including a trailing slash for the
              current node's menu directory.
@endnode

@node bz_var_bl_newdir    "bl_newdir"
   @{b}VARIABLE@{ub}   bl_newdir

       @{b}TYPE@{ub}   char (constant)

@{b}DESCRIPTION@{ub}   Returns the path including a trailing slash for the
              current node's temporarly upload directory. (The directory that
              BBBS uses to store files users upload while the upload is in
              process.)
@endnode

@node bz_var_bl_spyfile   "bl_spyfile"
   @{b}VARIABLE@{ub}   bl_spyfile

       @{b}TYPE@{ub}   char (constant)

@{b}DESCRIPTION@{ub}   Returns the filename for the  current node's temporarly
              spyfile. Empty if none defined.
@endnode

@node bz_var_bl_start_speed "bl_start_speed"
   @{b}VARIABLE@{ub}   bl_start_speed

       @{b}TYPE@{ub}   int (constant)

@{b}DESCRIPTION@{ub}   Returns the configured start speed from BCFG/4.
@endnode

@node bz_var_bl_min_speed "bl_min_speed"
   @{b}VARIABLE@{ub}   bl_min_speed

       @{b}TYPE@{ub}   int (constant)

@{b}DESCRIPTION@{ub}   Returns the configured minimum speed to log in from BCFG/4.
@endnode

@node bz_var_bl_base_addres "bl_base_addres"
   @{b}VARIABLE@{ub}   bl_base_addres

       @{b}TYPE@{ub}   int (constant)

@{b}DESCRIPTION@{ub}   Returns the configured base I/O address for the
              communications port for the current node.
@endnode

@node bz_var_bl_irq       "bl_irq"
   @{b}VARIABLE@{ub}   bl_irq

       @{b}TYPE@{ub}   int (constant)

@{b}DESCRIPTION@{ub}   Returns the configured IRQ address for the communications
              port for the current node.
@endnode

@node bz_var_bl_pollrate  "bl_pollrate"
   @{b}VARIABLE@{ub}   bl_pollrate

       @{b}TYPE@{ub}   int (constant)

@{b}DESCRIPTION@{ub}   Returns the configured polling rate for current node.
@endnode

@node bz_var_bl_answer_ring "bl_answer_ring"
   @{b}VARIABLE@{ub}   bl_answer_ring

       @{b}TYPE@{ub}   int (constant)

@{b}DESCRIPTION@{ub}   Returns the configured number of rings to answer on for
              the current node.
@endnode

@node bz_var_bl_ltoggles  "bl_ltoggles"
   @{b}VARIABLE@{ub}   bl_ltoggles

       @{b}TYPE@{ub}   int (constant)

@{b}DESCRIPTION@{ub}   Returns a number containing several different settings
              that are unique to each node. The numbers are:

              @{b}Bit Meaning@{ub}
              @{b}=== ======================@{ub}
              @{i} 0@{ui}  local_bell
              @{i} 1@{ui}  rts_cts
              @{i} 2@{ui}  reset_speed
              @{i} 3@{ui}  hangup_at_exit
              @{i} 4@{ui}  set_16550
              @{i} 5@{ui}  local_sysop_keys
              @{i} 6@{ui}  local_echo
              @{i} 7@{ui}  save_screen
              @{i} 8@{ui}  null_modem_login
              @{i} 9@{ui}  send_crashmail
              @{i}10@{ui}  backdoor
              @{i}11@{ui}  fast_fax
              @{i}12@{ui}  dont_check_carrier
              @{i}13@{ui}  nocarrier_is_busy
              @{i}14@{ui}  show_shell_output
              @{i}15@{ui}  allow_shell_break
              @{i}16@{ui}  slow_protocols
              @{i}17@{ui}  fax_receive_revbit
              @{i}18@{ui}  fax_send_revbit
              @{i}19@{ui}  buffered_output
              @{i}20@{ui}  rockwell_kludge
              @{i}21@{ui}  fix_rar_bug
@endnode

@node bz_var_bn_split     "bn_split"
   @{b}VARIABLE@{ub}   bn_split

       @{b}TYPE@{ub}   int

@{b}DESCRIPTION@{ub}   Currently unused, should be zero.
@endnode

@node bz_var_bn_bstatus   "bn_bstatus"
   @{b}VARIABLE@{ub}   bn_bstatus

       @{b}TYPE@{ub}   int

@{b}DESCRIPTION@{ub}   If bit @{i}0@{ui} is set, user has error correcting modem.
              If bit @{i}1@{ui} is set, this is a mail session.
@endnode

@node bz_var_bn_zstatus   "bn_zstatus"
   @{b}VARIABLE@{ub}   bn_zstatus

       @{b}TYPE@{ub}   int

@{b}DESCRIPTION@{ub}   Enumed activity:

              @{i} 0@{ui} = logged off
              @{i} 1@{ui} = active
              @{i} 2@{ui} = not active
              @{i} 3@{ui} = writing
              @{i} 4@{ui} = grab
              @{i} 5@{ui} = down
              @{i} 6@{ui} = up
              @{i} 7@{ui} = chat
              @{i} 8@{ui} = door
              @{i} 9@{ui} = groupchat
              @{i}10@{ui} = net activity (telnet, ftp, etc...)
@endnode

@node bz_var_bn_speed     "bn_speed"
   @{b}VARIABLE@{ub}   bn_speed

       @{b}TYPE@{ub}   int

@{b}DESCRIPTION@{ub}   Line connect speed, 0 if local.
@endnode

@node bz_var_bn_time      "bn_time"
   @{b}VARIABLE@{ub}   bn_time

       @{b}TYPE@{ub}   int

@{b}DESCRIPTION@{ub}   Login time, hours*256+minutes.
@endnode

@node bz_var_bn_nick      "bn_nick"
   @{b}VARIABLE@{ub}   bn_nick

       @{b}TYPE@{ub}   char

@{b}DESCRIPTION@{ub}   Returns the nick used in the Who command. This can be
              set by the user using U SET "NICK".
@endnode

@node bz_var_bn_realname  "bn_realname"
   @{b}VARIABLE@{ub}   bn_realname

       @{b}TYPE@{ub}   char

@{b}DESCRIPTION@{ub}   Returns the realname of current user.
@endnode

@node bz_var_bu_name      "bu_name"
   @{b}VARIABLE@{ub}   bu_name

       @{b}TYPE@{ub}   char (constant)

@{b}DESCRIPTION@{ub}   Returns the users name as written to BBBS in uppercase.

@{b}EXAMPLE CODE@{ub}  printf("%s\\n",@{i}bu_name@{ui});
@endnode

@node bz_var_bu_address   "bu_address"
   @{b}VARIABLE@{ub}   bu_address

       @{b}TYPE@{ub}   char

@{b}DESCRIPTION@{ub}   Returns the users address as written to BBBS.

@{b}EXAMPLE CODE@{ub}  printf("%s\\n",@{i}bu_address@{ui});
@endnode

@node bz_var_bu_city      "bu_city"
   @{b}VARIABLE@{ub}   bu_city

       @{b}TYPE@{ub}   char

@{b}DESCRIPTION@{ub}   Returns the users city as written to BBBS.

@{b}EXAMPLE CODE@{ub}  printf("%s\\n",@{i}bu_city@{ui});
@endnode

@node bz_var_bu_phone     "bu_phone"
   @{b}VARIABLE@{ub}   bu_phone

       @{b}TYPE@{ub}   char

@{b}DESCRIPTION@{ub}   Returns the users phonenumber as written to BBBS.

@{b}EXAMPLE CODE@{ub}  printf("%s\\n",@{i}bu_phone@{ui});
@endnode

@node bz_var_bu_birth     "bu_birth"
   @{b}VARIABLE@{ub}   bu_birth

       @{b}TYPE@{ub}   char

@{b}DESCRIPTION@{ub}   Returns the users birthday as written to BBBS.

@{b}EXAMPLE CODE@{ub}  printf("%s\\n",@{i}bu_birth@{ui});
@endnode

@node bz_var_bu_ok2login "bu_ok2login"
   @{b}VARIABLE@{ub}   bu_ok2login

       @{b}TYPE@{ub}   int

@{b}DESCRIPTION@{ub}   Contains users login status. There are three different
              types:

              @{i}0@{ui} = yes      The user can log in.
              @{i}1@{ui} = getlost  The user is shown the getlost file and then
                           logged off.
              @{i}2@{ui} = killed   The user name is removed, but a new user with
                           that name can log in as a new user.

@{b}EXAMPLE CODE@{ub}  printf("Login status: %u\\n",@{i}bu_ok2login@{ui});
@endnode

@node bz_var_bu_termcap   "bu_termcap"
   @{b}VARIABLE@{ub}   bu_termcap

       @{b}TYPE@{ub}   int

@{b}DESCRIPTION@{ub}   This variable contains terminal related information.

              It is divided into two bitwise parts:

              @{b}Bit 0-3 - terminal types@{ub}:
              @{i}0@{ui}=TTY
              @{i}1@{ui}=ANSI
              @{i}2@{ui}=AVATAR
              @{i}3@{ui}=VT320

              @{b}Bit 4-7 - editors@{ub}:
              @{i}0@{ui}=Line
              @{i}1@{ui}=FSE
              @{i}2@{ui}=MG
@endnode

@node bz_var_bu_pagelength "bu_pagelength"
   @{b}VARIABLE@{ub}   bu_pagelength

       @{b}TYPE@{ub}   int

@{b}DESCRIPTION@{ub}   Sets number of lines per page for the current user.

@{b}EXAMPLE CODE@{ub}  int main() {
                int p;
                p=@{i}bu_pagelength@{ui};
                @{i}bu_pagelength@{ui}=0;
                /* do your stuff that requires no --more-- prompt */
                @{i}bu_pagelength@{ui}=p;
              }
@endnode

@node bz_var_bu_charset   "bu_charset"
   @{b}VARIABLE@{ub}   bu_charset

       @{b}TYPE@{ub}   int

@{b}DESCRIPTION@{ub}   Returns a number representing the character set the
              user is using. The number for the different character sets are:

              @{i} 0@{ui} IBM
              @{i} 1@{ui} SF7
              @{i} 2@{ui} ISO
              @{i} 3@{ui} IBN
              @{i} 4@{ui} US7
              @{i} 5@{ui} GE7
              @{i} 6@{ui} NO7
              @{i} 7@{ui} FR7
              @{i} 8@{ui} IT7
              @{i} 9@{ui} SP7
              @{i}10@{ui} MAC
@endnode

@node bz_var_bu_language  "bu_language"
   @{b}VARIABLE@{ub}   bu_language

       @{b}TYPE@{ub}   int

@{b}DESCRIPTION@{ub}   Returns the users language. Values are 0 through 9.
              (0=English,1=Suomi,2=Svenska,3=Norsk)
@endnode

@node bz_var_bu_readmode  "bu_readmode"
   @{b}VARIABLE@{ub}   bu_readmode

       @{b}TYPE@{ub}   int

@{b}DESCRIPTION@{ub}   This contains information about read modes for the
              user and preferred format for grab collection. It is divieded
              into two bitwise parts:

              @{b}Bit 0-3 - read modes:@{ub}
              @{i}0@{ui}=Marked
              @{i}1@{ui}=Reference
              @{i}2@{ui}=Forward

              @{b}Bit 4-7 - offline format:@{ub}
              @{i}0@{ui}=Text
              @{i}1@{ui}=Hippo
              @{i}2@{ui}=Hippo2
              @{i}3@{ui}=OMEN
              @{i}4@{ui}=QWK
              @{i}5@{ui}=Blue Wave
@endnode

@node bz_var_bu_packtype  "bu_packtype"
   @{b}VARIABLE@{ub}   bu_packtype

       @{b}TYPE@{ub}   int

@{b}DESCRIPTION@{ub}   Contains a number corresponding to a packer type.

              The different types are:

              @{i}0@{ui}=text
              @{i}1@{ui}=arc
              @{i}2@{ui}=zip
              @{i}3@{ui}=lzh
              @{i}4@{ui}=arj
              @{i}5@{ui}=zoo
              @{i}6@{ui}=hpk
              @{i}7@{ui}=rar

              Additional packers will just be given the next number in range.
@endnode

@node bz_var_bu_protocol  "bu_protocol"
   @{b}VARIABLE@{ub}   bu_protocol

       @{b}TYPE@{ub}   int

@{b}DESCRIPTION@{ub}   Returns a number corresponding to a protocol.

              The different types are:

              @{i}0@{ui}=Zmodem
              @{i}1@{ui}=Ymodem
              @{i}2@{ui}=Xmodem
              @{i}3@{ui}=Slow-HYDRA
              @{i}4@{ui}=Xmodem CRC
              @{i}5@{ui}=Ymodem Batch
              @{i}6@{ui}=Slow--Zmodem
              @{i}7@{ui}=Hydra
              @{i}8@{ui}=ZedZap

              Additional protocols will just be given the next number in range.
@endnode

@node bz_var_bu_nodemsgfilt "bu_nodemsgfilt"
   @{b}VARIABLE@{ub}   bu_nodemsgfilt

       @{b}TYPE@{ub}   int

@{b}DESCRIPTION@{ub}   Returns the node message filter level.

              Different levels are:
              @{i} 0@{ui} nothing
              @{i}10@{ui} login / logout
              @{i}20@{ui} entered message
              @{i}30@{ui} joined/exited group chat
              @{i}49@{ui} messages in group chat, node messages
              @{i}50@{ui} everything
@endnode

@node bz_var_bu_timelimit "bu_timelimit"
   @{b}VARIABLE@{ub}   bu_timelimit

       @{b}TYPE@{ub}   int

@{b}DESCRIPTION@{ub}   Returns the daily timelimit of the user. 0 means the
              user has unlimited time.
@endnode

@node bz_var_bu_timeleft "bu_timeleft"
   @{b}VARIABLE@{ub}   bu_timeleft

       @{b}TYPE@{ub}   int

@{b}DESCRIPTION@{ub}   Returns the amount of minutes that the caller had
              available when the call started. At logout, this value
              will contain the value of @{"bf_timleft" link bz_var_bf_timleft}.
@endnode

@node bz_var_bu_timeson   "bu_timeson"
   @{b}VARIABLE@{ub}   bu_timeson

       @{b}TYPE@{ub}   int

@{b}DESCRIPTION@{ub}   Returns the number of logins for all time for the
              current user.
@endnode

@node bz_var_bu_msgleft   "bu_msgleft"
   @{b}VARIABLE@{ub}   bu_msgleft

       @{b}TYPE@{ub}   int

@{b}DESCRIPTION@{ub}   Returns the number of messages written for the current
              user for all time.
@endnode

@node bz_var_bu_uploaded  "bu_uploaded"
   @{b}VARIABLE@{ub}   bu_uploaded

       @{b}TYPE@{ub}   int

@{b}DESCRIPTION@{ub}   Returns the number of files uploaded by the current user.
@endnode

@node bz_var_bu_downloaded "bu_downloaded"
   @{b}VARIABLE@{ub}   bu_downloaded

       @{b}TYPE@{ub}   int

@{b}DESCRIPTION@{ub}   Returns the number of files dowloaded by the current user.
@endnode

@node bz_var_bu_pmsgleft "bu_pmsgleft"
   @{b}VARIABLE@{ub}   bu_pmsgleft

       @{b}TYPE@{ub}   int

@{b}DESCRIPTION@{ub}   Returns the number of messages left since the last reset
              for the current user.
@endnode

@node bz_var_bu_puploaded   "bu_puploaded"
   @{b}VARIABLE@{ub}   bu_puploaded

       @{b}TYPE@{ub}   int

@{b}DESCRIPTION@{ub}   Returns the number of files upload since the last reset
              for the current user.
@endnode

@node bz_var_bu_pdownloaded "bu_pdownloaded"
   @{b}VARIABLE@{ub}   bu_pdownloaded

       @{b}TYPE@{ub}   int

@{b}DESCRIPTION@{ub}   Returns the number of files downloaded since the last
              reset for the current user.
@endnode

@node bz_var_bu_ptimeson   "bu_ptimeson"
   @{b}VARIABLE@{ub}   bu_ptimeson

       @{b}TYPE@{ub}   int

@{b}DESCRIPTION@{ub}   Returns the number of calls since the last reset for the
              current user.
@endnode

@node bz_var_bu_pmsgdumped  "bu_pmsgdumped"
   @{b}VARIABLE@{ub}   bu_pmsgdumped

       @{b}TYPE@{ub}   int

@{b}DESCRIPTION@{ub}   Returns the number of messages dumped since the last reset
              for the current user.
@endnode

@node bz_var_bu_pmsgread "bu_pmsgread"
   @{b}VARIABLE@{ub}   bu_pmsgread

       @{b}TYPE@{ub}   int

@{b}DESCRIPTION@{ub}   Returns the number of messages read since the last reset for
              the current user.
@endnode

@node bz_var_bu_pkbup "bu_pkbup"
   @{b}VARIABLE@{ub}   bu_pkbup

       @{b}TYPE@{ub}   int

@{b}DESCRIPTION@{ub}   Returns the number of kilobytes uploaded since the last
              reset for the current user.
@endnode

@node bz_var_bu_pkbdown "bu_pkbdown"
   @{b}VARIABLE@{ub}   bu_pkbdown

       @{b}TYPE@{ub}   int

@{b}DESCRIPTION@{ub}   Returns the number of kilobytes downloaded since the last
              reset for the current user.
@endnode

@node bz_var_bu_fchecked  "bu_fchecked"
   @{b}VARIABLE@{ub}   bu_fchecked

       @{b}TYPE@{ub}   int

@{b}DESCRIPTION@{ub}   Returns a datecode for the date the current user last
              checked for new files.

              Day is lower 5 bits, month is next 4 bits and year (since 1980)
              is the upper 7 bits.
@endnode

@node bz_var_bu_timebank  "bu_timebank"
   @{b}VARIABLE@{ub}   bu_timebank

       @{b}TYPE@{ub}   int

@{b}DESCRIPTION@{ub}   Returns the number of minutes the current user has
              stored in his/hers timebank.
@endnode

@node bz_var_bu_resume    "bu_resume"
   @{b}VARIABLE@{ub}   bu_resume

       @{b}TYPE@{ub}   int

@{b}DESCRIPTION@{ub}   Returns the message number in the User Info conference
              that contains the current users userresume.
@endnode

@node bz_var_bu_limits    "bu_limits"
   @{b}VARIABLE@{ub}   bu_limits

       @{b}TYPE@{ub}   int

@{b}DESCRIPTION@{ub}   Returns a number containing different user limits,
              corresponds to "u limit" command.
@endnode

@node bz_var_bu_access    "bu_access"
   @{b}VARIABLE@{ub}   bu_access

       @{b}TYPE@{ub}   int

@{b}DESCRIPTION@{ub}   Returns a number containing differnt user acces bits.

              The bits are:
              @{i}  0@{ui} DOS
              @{i}  1@{ui} Conferences
              @{i}  2@{ui} Files
              @{i}  3@{ui} Private messages
              @{i}  4@{ui} Passwords
              @{i} 30@{ui} Download
              @{i} 31@{ui} Upload
              @{i}255@{ui} Sysop
@endnode

@node bz_var_bu_utoggles "bu_utoggles"
   @{b}VARIABLE@{ub}   bu_utoggles

       @{b}TYPE@{ub}   int

@{b}DESCRIPTION@{ub}   Returns a number containing several different user toggles.

              The bits are:
              @{i} 0@{ui} Insert mode
              @{i} 1@{ui} Indent mode
              @{i} 2@{ui} XY Display in editor
              @{i} 3@{ui} Don't flash your name
              @{i} 4@{ui} Conference status at login
              @{i} 5@{ui} Expert mode
              @{i} 6@{ui} Not used
              @{i} 7@{ui} Colors
              @{i} 8@{ui} Review own messages
              @{i} 9@{ui} Real VT100 keyboard
              @{i}10@{ui} Quote messages
              @{i}11@{ui} Silent mode
              @{i}12@{ui} Return to read menu with enter-key
@endnode

@node bz_var_bu_firsttime "bu_firsttime"
   @{b}VARIABLE@{ub}   bu_firsttime

       @{b}TYPE@{ub}   int

@{b}DESCRIPTION@{ub}   Returns a datecode for the first time the current user
              logged on to the board.

              @{b}Bits  Meaning@{ub}
              @{b}====  ====================@{ub}
              0-4   Seconds/2
              5-10  Minutes
              11-15 Hours
              16-20 Day
              21-24 Month
              25-31 Year-1980
@endnode

@node bz_var_bu_lasttime "bu_lasttime"
   @{b}VARIABLE@{ub}   bu_lasttime

       @{b}TYPE@{ub}   int

@{b}DESCRIPTION@{ub}   Returns a datecode for the last time the current user
              logged on to the board.

              @{b}Bits  Meaning@{ub}
              @{b}====  ====================@{ub}
              0-4   Seconds/2
              5-10  Minutes
              11-15 Hours
              16-20 Day
              21-24 Month
              25-31 Year-1980
@endnode

@node bz_var_bu_msgread   "bu_msgread"
   @{b}VARIABLE@{ub}   bu_msgread

       @{b}TYPE@{ub}   int

@{b}DESCRIPTION@{ub}   Returns the number of total messages read for the
              current user.
@endnode

@node bz_var_bu_msgdumped "bu_msgdumped"
   @{b}VARIABLE@{ub}   bu_msgdumped

       @{b}TYPE@{ub}   int

@{b}DESCRIPTION@{ub}   Returns the number of total messages dumped for the
              current user.
@endnode

@node bz_var_bu_kbup   "bu_kbup"
   @{b}VARIABLE@{ub}   bu_kbup

       @{b}TYPE@{ub}   int

@{b}DESCRIPTION@{ub}   Returns the total number of kilobytes uploaded for the
              current user.
@endnode

@node bz_var_bu_kbdown "bu_kbdown"
   @{b}VARIABLE@{ub}   bu_kbdown

       @{b}TYPE@{ub}   int

@{b}DESCRIPTION@{ub}   Returns the total number of kilobytes downloaded for the
              current user.
@endnode

@node bz_var_bu_todaydown "bu_todaydown"
   @{b}VARIABLE@{ub}   bu_todaydown

       @{b}TYPE@{ub}   int

@{b}DESCRIPTION@{ub}   Returns the amount of bytes the current user has
              downloaded today.
@endnode

@node bz_var_bu_userbits  "bu_userbits"
   @{b}VARIABLE@{ub}   bu_userbits

       @{b}TYPE@{ub}   int

@{b}DESCRIPTION@{ub}   Returns a number contianing userbits. This is not used
              by BBBS so feel free to use this variable as you want, but
              remember that others might use it as well.
@endnode

@node bz_var_bv_filna     "bv_filna"
   @{b}VARIABLE@{ub}   bv_filna

       @{b}TYPE@{ub}   char

@{b}DESCRIPTION@{ub}   Contains the name of the last processed file.

@{b}EXAMPLE CODE@{ub}  int main() {
                printf("Last processed file: %s\\n",@{i}bv_filna@{ui});
              }
@endnode

@node bz_var_bv_local_buffe "bv_local_buffe"
   @{b}VARIABLE@{ub}   bv_local_buffe

       @{b}TYPE@{ub}   char

@{b}DESCRIPTION@{ub}   This is the keyboard buffer used by BBBS in all input
              routines.

@{b}EXAMPLE CODE@{ub}  int main() {
                @{i}bv_local_buffe@{ui} = "G;Y;";
              }
@endnode

@node bz_var_bv_comhandle "bv_comhandle"
   @{b}VARIABLE@{ub}   bv_comhandle

       @{b}TYPE@{ub}   int (constant)

@{b}DESCRIPTION@{ub}   Has communication device handle.

@{b}EXAMPLE CODE@{ub}  int main() {
                system(sprintf("foo.exe %u %s",@{i}bv_comhandle@{ui},bv_comdevice),0);
              }
@endnode

@node bz_var_bv_comdevice "bv_comdevice"
   @{b}VARIABLE@{ub}   bv_comdevice

       @{b}TYPE@{ub}   char (constant)

@{b}DESCRIPTION@{ub}   Has communication device name.

@{b}EXAMPLE CODE@{ub}  int main() {
                system(sprintf("foo.exe %u %s",bv_comhandle,@{i}bv_comdevice@{ui}),0);
              }
@endnode

@node bz_var_bv_comstring "bv_comstring"
   @{b}VARIABLE@{ub}   bv_comstring

       @{b}TYPE@{ub}   char

@{b}DESCRIPTION@{ub}   Contains the command queue used by BBBS.

@{b}EXAMPLE CODE@{ub}  int main() {
                if (pos("TEST",@{i}bv_comstring@{ui})) // if queue contains TEST
                  @{i}bv_comstring@{ui} = "";          // then delete queue
              }
@endnode

@node bz_var_bv_interface "bv_interface"
   @{b}VARIABLE@{ub}   bv_interface

       @{b}TYPE@{ub}   int

@{b}DESCRIPTION@{ub}   Is used as a indicator which identifies b-mode or not.

@{b}EXAMPLE CODE@{ub}  int main() {
                if (!@{i}bv_interface@{ui})
                  printf("Standard mode is active\\n");
                else
                  printf("You are currently in b-mode\\n");
              }
@endnode

@node bz_var_bv_crrdir "bv_crrdir"
   @{b}VARIABLE@{ub}   bv_crrdir

       @{b}TYPE@{ub}   char

@{b}DESCRIPTION@{ub}   Returns the current virtual dir in BBBS's internal File/4
              system.

@{b}EXAMPLE CODE@{ub}  int main() {
                printf("Current dir: %s\\n",@{i}bv_crrdir@{ui});
              }

   @{b}See Also@{ub}   @{"bv_realdir" link bz_var_bv_realdir}
@endnode

@node bz_var_bv_realdir "bv_realdir"
   @{b}VARIABLE@{ub}   bv_realdir

       @{b}TYPE@{ub}   char

@{b}DESCRIPTION@{ub}   Returns the current real dir in BBBS's internal File/4
              system.

@{b}EXAMPLE CODE@{ub}  int main() {
                printf("Current dir: %s\\n",@{i}bv_realdir@{ui});
              }

   @{b}See Also@{ub}   @{"bv_crrdir" link bz_var_bv_crrdir}
@endnode

@node bz_var_bv_holdreal  "bv_holdreal"
   @{b}VARIABLE@{ub}   bv_holdreal

       @{b}TYPE@{ub}   char

@{b}DESCRIPTION@{ub}   Returns the path to current node's hold directory.

@{b}EXAMPLE CODE@{ub}  int main() {
                int f;
                if ((f=fopen(strcat(@{i}bv_holdreal@{ui},"windows.bin"),"rb"))!=-1) {
                  fclose(f);
                  printf("DANGER! Will Robinson DANGER! Alien lifeform!\\n");
                }
              }
@endnode

@node bz_var_bv_hddesc    "bv_hddesc"
   @{b}VARIABLE@{ub}   bv_hddesc

       @{b}TYPE@{ub}   char

@{b}DESCRIPTION@{ub}   Returns the path and filename of the current node's
              descript.ion file containing the descriptions for files in
              hold.

@{b}EXAMPLE CODE@{ub}  int main() {
                int f;
                if ((f=fopen(@{i}bv_hddesc@{ui},"rt"))!=-1) {
                  if (fgets(f)!="")
                    printf("You have files in your hold-area!\\n");
                  fclose(f);
                }
              }
@endnode

@node bz_var_bv_serna     "bv_serna"
   @{b}VARIABLE@{ub}   bv_serna

       @{b}TYPE@{ub}   char

@{b}DESCRIPTION@{ub}   Returns the registered BBBS Name from BBBS.KEY

@{b}EXAMPLE CODE@{ub}  int main() {
                printf("You have reached %s\\n",@{i}bv_serna@{ui})
              }
@endnode

@node bz_var_bv_tempsys   "bv_tempsys"
   @{b}VARIABLE@{ub}   bv_tempsys

       @{b}TYPE@{ub}   int

@{b}DESCRIPTION@{ub}   Change the temporary SysOp level for the current user.
              SysOp's access is a bitfield integer. You can use values from
              0 to 255, as following:

              @{i} 1@{ui} Can shell to OS and execute OS commands
              @{i} 2@{ui} Full access to all conferences
              @{i} 4@{ui} Full access to all files
              @{i} 8@{ui} May read private messages from all conferences
              @{i}16@{ui} May change passwords
              @{i}32@{ui} May edit user's status (kill, status)
              @{i}64@{ui} May change Netmail message attributes

              To give a certain access just add the numbers. For example, if
              you want a user to have access to all conferences and  private
              messages, the value is 10 (2+8).

@{b}EXAMPLE CODE@{ub}  int main() {
                char name, passw;
                char old_sys;

                if (bu_name == "FOO USER") {
                  printf("You may change the password on a user.\\n");
                  if ((name = input("User        : ",80,0))!="") {
                    passw = input("New password: ",10,1);
                    old_sys = @{i}bv_tempsys@{ui};
                    @{i}bv_tempsys@{ui} = 16;
                    bbbs(sprintf("q;q;u;find;\\"%s\\";p;%s;%s;;",name,
                                                               passw,
                                                               name);
                    @{i}bv_tempsys@{ui} = old_sys;
                  }
                }
              }
@endnode

@node bz_var_bv_unum      "bv_unum"
   @{b}VARIABLE@{ub}   bv_unum

       @{b}TYPE@{ub}   int

@{b}DESCRIPTION@{ub}   Returns the current users user number from the user
              database.

@{b}EXAMPLE CODE@{ub}  int main() {
                printf("You are user number %u\\n",@{i}bv_unum@{ui});
              }
@endnode

@node bz_var_bv_confnro   "bv_confnro"
   @{b}VARIABLE@{ub}   bv_confnro

       @{b}TYPE@{ub}   int

@{b}DESCRIPTION@{ub}   Returns the number of the current conference.

@{b}EXAMPLE CODE@{ub}  int main() {
                printf("You are in conference number %u\\n",@{i}bv_confnro@{ui});
              }
@endnode

@node bz_var_bv_baud      "bv_baud"
   @{b}VARIABLE@{ub}   bv_baud

       @{b}TYPE@{ub}   int

@{b}DESCRIPTION@{ub}   Returns the baudrate for the current call. If it is a
              local login, this number will be 9600.
@endnode

@node bz_var_bv_realbaud  "bv_realbaud"
   @{b}VARIABLE@{ub}   bv_realbaud

       @{b}TYPE@{ub}   int

@{b}DESCRIPTION@{ub}   Returns the real baudrate for the current call. If it
              is a local login, this number will be 0.
@endnode

@node bz_var_bv_loginhour "bv_loginhour"
   @{b}VARIABLE@{ub}   bv_loginhour

       @{b}TYPE@{ub}   int

@{b}DESCRIPTION@{ub}   Returns the hour part of the time when the user
              logged in.

@{b}EXAMPLE CODE@{ub}  int main() {
                printf("You logged in at %02u:%02u\\n",@{i}bv_loginhour@{ui},
                                                      @{"bv_loginmin" link bz_var_bv_loginmin});
              }
@endnode

@node bz_var_bv_loginmin  "bv_loginmin"
   @{b}VARIABLE@{ub}   bv_loginmin

       @{b}TYPE@{ub}   int

@{b}DESCRIPTION@{ub}   Returns the minute part of the time when the user
              logged in.

@{b}EXAMPLE CODE@{ub}  int main() {
                printf("You logged in at %02u:%02u\\n",@{"bv_loginhour" link bz_var_bv_loginhour},
                                                      @{i}bv_loginmin@{ui});
              }
@endnode

@node bz_var_bv_lastmsg   "bv_lastmsg"
   @{b}VARIABLE@{ub}   bv_lastmsg

       @{b}TYPE@{ub}   int

@{b}DESCRIPTION@{ub}   Returns the number of last message read in current
              conference.

@{b}EXAMPLE CODE@{ub}  int main() {
                printf("Last message read: %u\\n",@{i}bv_lastmsg@{ui});
              }
@endnode

@node bz_var_bv_curmsg    "bv_curmsg"
   @{b}VARIABLE@{ub}   bv_curmsg

       @{b}TYPE@{ub}   int

@{b}DESCRIPTION@{ub}   Returns current message number.

@{b}EXAMPLE CODE@{ub}  int main() {
                printf("Current message number is: %u\\n",@{i}bv_curmsg@{ui});
              }
@endnode

@node bz_var_bv_firstmsg  "bv_firstmsg"
   @{b}VARIABLE@{ub}   bv_firstmsg

       @{b}TYPE@{ub}   int

@{b}DESCRIPTION@{ub}   Returns number of first available message in current
              conference.

@{b}EXAMPLE CODE@{ub}  int main() {
                printf("First message number is: %u\\n",@{i}bv_firstmsg@{ui});
              }
@endnode

@node bz_var_bv_lastreaded "bv_lastreaded"
   @{b}VARIABLE@{ub}   bv_lastreaded

       @{b}TYPE@{ub}   int

@{b}DESCRIPTION@{ub}   Returns number of last read message in current
              conference.

@{b}EXAMPLE CODE@{ub}  int main() {
                printf("Last message read is: %u\\n",@{i}bv_lastreaded@{ui});
              }
@endnode

@node bz_var_bv_newavail  "bv_newavail"
   @{b}VARIABLE@{ub}   bv_newavail

       @{b}TYPE@{ub}   int

@{b}DESCRIPTION@{ub}   Returns a number indicating how many new messages the
              current conference contains.

@{b}EXAMPLE CODE@{ub}  int main() {
                printf("You have %u new messages.\\n",@{i}bv_newavail@{ui});
              }
@endnode

@node bz_var_bv_foryou    "bv_foryou"
   @{b}VARIABLE@{ub}   bv_foryou

       @{b}TYPE@{ub}   int

@{b}DESCRIPTION@{ub}   Returns a number indicating how many messages in
              current conference is addressed to you.

@{b}EXAMPLE CODE@{ub}  int main() {
                printf("You have %u personal messages.\\n",@{i}bv_foryou@{ui});
              }
@endnode

@node bz_var_bv_serno     "bv_serno"
   @{b}VARIABLE@{ub}   bv_serno

       @{b}TYPE@{ub}   int

@{b}DESCRIPTION@{ub}   Returns the BBBS registration number from BBBS.KEY.

@{b}EXAMPLE CODE@{ub}  int main() {
                printf("Serial number: %u\\n",@{i}bv_serno@{ui});
              }
@endnode

@node bz_var_bv_vername   "bv_vername"
   @{b}VARIABLE@{ub}   bv_vername

       @{b}TYPE@{ub}   char

@{b}DESCRIPTION@{ub}   Returns the BBBS version name.

@{b}EXAMPLE CODE@{ub}  int main() {
                printf("OS: %s\\n",copy(@{i}bv_vername@{ui},6,3));
              }
@endnode

@node bz_var_bv_ver      "bv_ver"
   @{b}VARIABLE@{ub}   bv_ver

       @{b}TYPE@{ub}   char

@{b}DESCRIPTION@{ub}   Returns the BBBS version number.

@{b}EXAMPLE CODE@{ub}  int main() {
                printf("%s v%s\\n",bv_vername,@{i}bv_ver@{ui});
              }
@endnode

@node bz_var_bv_tomenu   "bv_tomenu"
   @{b}VARIABLE@{ub}   bv_tomenu

       @{b}TYPE@{ub}   int

@{b}DESCRIPTION@{ub}   Returns the menu number where user is.
                     1=read
                     2=main
                     3=util
                     4=file
                     5=chat
                     6=outb
                     7=ftp

@{b}EXAMPLE CODE@{ub}  int main() {
                if (@{i}bv_tomenu@{ui}==2) printf("main menu\\n");
              }
@endnode

@node bz_var_bv_brobot   "bv_brobot"
   @{b}VARIABLE@{ub}   bv_brobot

       @{b}TYPE@{ub}   int

@{b}DESCRIPTION@{ub}   Returns how many times user has asked for download access
              from BRoboCop in this call.

@{b}EXAMPLE CODE@{ub}  int main() {
                printf("Download access requests: %u\\n",@{i}bv_brobot@{ui});
              }
@endnode

@node bz_var_bv_nodenumber "bv_nodenumber"
   @{b}VARIABLE@{ub}   bv_nodenumber

       @{b}TYPE@{ub}   int

@{b}DESCRIPTION@{ub}   Returns the nodenumber for the current node.

@{b}EXAMPLE CODE@{ub}  int main() {
                printf("You are connected to node %u\\n",@{i}bv_nodenumber@{ui});
              }
@endnode

@node bz_var_bv_reduced   "bv_reduced"
   @{b}VARIABLE@{ub}   bv_reduced

       @{b}TYPE@{ub}   int

@{b}DESCRIPTION@{ub}   Returns the number of minutes the current users
              timelimit has been reduced by due to an event.

@{b}EXAMPLE CODE@{ub}  int main() {
                printf("Timelimit is reduced by %u minutes\\n",@{i}bv_reduced@{ui});
              }
@endnode

@node bz_var_bv_nextevent "bv_nextevent"
   @{b}VARIABLE@{ub}   bv_nextevent

       @{b}TYPE@{ub}   int

@{b}DESCRIPTION@{ub}   Returns the number of minutes left to the next event.

@{b}EXAMPLE CODE@{ub}  int main() {
                printf("Next event is due in %u minutes\\n",@{i}bv_nextevent@{ui});
              }
@endnode

@node bz_var_bv_temptime  "bv_temptime"
   @{b}VARIABLE@{ub}   bv_temptime

       @{b}TYPE@{ub}   int

@{b}DESCRIPTION@{ub}   Returns the time limit of the user for the current
              call. At the start of the call, this is assigned the value
              of @{"bu_timeleft" link bz_var_bu_timeleft}.

              If you want to modify the user's timelimit for the current
              call, modify this variable.
@endnode

@node bz_var_bv_com       "bv_com"
   @{b}VARIABLE@{ub}   bv_com

       @{b}TYPE@{ub}   int

@{b}DESCRIPTION@{ub}   Returns the COM port number of current node.

@{b}EXAMPLE CODE@{ub}  int main() {
                printf("You are running on COM port %u\\n",@{i}bv_com@{ui});
              }
@endnode

@node bz_var_bv_carrier   "bv_carrier"
   @{b}VARIABLE@{ub}   bv_carrier

       @{b}TYPE@{ub}   int

@{b}DESCRIPTION@{ub}   Inidicates the state of modem carrier

              @{i}0@{ui} inactive
              @{i}1@{ui} active

              Can be used to decide if the user hangs up or not.
              @{b}SHOULD@{ub} be used when running loops in scripts,
              BBBS will not abort the script even if user hangs up.

@{b}EXAMPLE CODE@{ub}  int main() {
                printf("Hit any key (or hangup)!!!\\n");
                while (!kbhit() && @{i}bv_carrier@{ui});
              }
@endnode

@node bz_var_bv_outputstopp "bv_outputstopp"
   @{b}VARIABLE@{ub}   bv_outputstopp

       @{b}TYPE@{ub}   int

@{b}DESCRIPTION@{ub}   (Dis)enables output to the user/local screen. Can be used
              when you want to do something which the user shouldn't see.

              BBBS will set bit 0 to 1 if user presses 'N' to --more--
              and resets it when doing @{"input()" link bz_lib_input} next time. You probably
              want to alter this variable after @{i}showfile()@{ui} or similar
              functions. BBBS resets only bits 0-2 and saves 3-7.

              Bit Meaning
              --- ----------------------------------------------------
              @{i}  1@{ui} User pressed 'N' to "--more--"
              @{i} 16@{ui} 'N' to "--more--" is disabled
              @{i} 32@{ui} Show log entries to screen too
              @{i} 64@{ui} Local screen output is disabled
              @{i}128@{ui} Remote output is disabled


@{b}EXAMPLE CODE@{ub}  int main() {
                printf("Please wait while joining some conferences..\\n");
                @{i}bv_outputstopp@{ui} = @{i}bv_outputstopp@{ui} | 1;
                bbbs("j;bbbs.english;");
                bbbs("j;bbbs.util;");
                @{i}bv_outputstopp@{ui} = @{i}bv_outputstopp@{ui} & 0xF8;
              }
@endnode

@node bz_var_bv_quicklogin "bv_quicklogin"
   @{b}VARIABLE@{ub}   bv_quicklogin

       @{b}TYPE@{ub}   int

@{b}DESCRIPTION@{ub}   Toggles whether quicklogin was used or not.

              @{i}0@{ui} not used
              @{i}1@{ui} used
@endnode

@node bz_var_bv_paged "bv_paged"
   @{b}VARIABLE@{ub}   bv_paged

       @{b}TYPE@{ub}   int

@{b}DESCRIPTION@{ub}   Number of times user has requested chat with sysop.
@endnode

@node bz_var_bv_groups "bv_groups"
   @{b}VARIABLE@{ub}   bv_groups

       @{b}TYPE@{ub}   char

@{b}DESCRIPTION@{ub}   Returns a string with all the groups the current user
              are a member of. Groups are seperated by a comma (,).
@endnode

@node bz_var_bv_txt "bv_txt"
   @{b}VARIABLE@{ub}   bv_txt[linenumber]

       @{b}TYPE@{ub}   char (constant), indexed

@{b}DESCRIPTION@{ub}   Returns the text at the linenumber you supply from
              BBBSTXTx where x is nothing for english or the language code
              the current user is using.

@{b}EXAMPLE CODE@{ub}  Using english language the following command:
              printf("%s\\n",bv_txt[13]);
              will output:
              @{i}Sorry, no resume info in this system.@{ui}
@endnode

@node bz_other "Other script languages"
Along with the @{"BZ language" link BZ_MAIN}, BBBS also supports @{i}Java@{ui} and @{i}perl@{ui} as script
languages. When a perl or Java script is executed, all input and output
from/to stdin/stdout is redirected accordingly, so you can use the standard
input/output commands of the language.

If you want to use perl or Java as a script language, you will have to
specify the @{b}BBBSJAVA@{ub} (for Java) or @{b}BBBSPERL@{ub} (for perl)
@{"environment variable" link SYS_ENV} to contain the path to the parser for the appropriate
language.

If you are using @{"BBBS/2" link SYS_DIFFS_OS2}, it is also possible to use @{"REXX" link BZ_OTHER_REXX} as the script
language.

If you use multiple script languages, remember that BBBS first tries to
run BZ programs (@{b}.bz@{ub}), then REXX scripts (@{b}.cmd@{ub}), then Java scripts (@{b}.class@{ub})
and finally perl scripts (@{b}.pl@{ub}).
@endnode

@node SYS_DIFFS_DOS "BBBS/D, BBBS for PC-DOS"
@{b}BBBS/D@{ub} is the @{b}PC-DOS@{ub} specific version of BBBS.

BBBS should work on all IBM PC compatible computers running @{b}PC-DOS@{ub}
@{b}v3.1@{ub} (or compatible). @{b}BBBS/D@{ub} can be run under @{i}DESQview@{ui} or other similar
multitasking environment. @{b}BBBS/D@{ub} requires about 370kB of free
memory and can use your EMS/XMS memory for swapping in DOS shells
(where it uses only 3.5kB of your conventional memory). You may not
load any memory resident (TSR) programs when you are in DOS shell. You
can run BBBS on Local Area Networks. Using a real disk caching program
(not @{i}SmartDrive@{ui}) will speed things up dramatically. Optionally, a @{b}FOSSIL@{ub}
communications driver (revision level 5 or higher) can be used with
@{b}BBBS/D@{ub}, but is not required.

There are some of features, like the Internet-support, that do not work
under the PC-DOS version, for obvious reasons.

You can use the following @{i}DESQview@{ui} settings with BBBS/D:

        Memory Size (in K)................: 370
        Writes text directly to screen....: [Y]
        Displays graphics information.....: [N]
        Virtualize text/graphics (Y,N,T)..: [T]
        Maximum Program Memory Size (in K): 640
        Maximum EMS/XMS/VCPI/DPMI (in K)..:
        Uses its own colors...............: [Y]
        Runs in background (Y,N,blank)....: [Y]
        Uses math coprocessor.............: [N]

On multinode systems it is highly recommended to use @{i}IBM OS/2@{ui}, not
@{i}DESQview@{ui}, even with @{b}BBBS/D@{ub}. The DOS-version of BBBS automatically
detects @{i}OS/2@{ui} and @{i}DESQview@{ui}, but some advanced timesliding options are
only available under @{i}OS/2@{ui} (in a @{b}VDM@{ub} with @{b}BBBS/D@{ub} or native
@{"BBBS/2" link SYS_DIFFS_OS2}). When running @{b}BBBS/D@{ub} in a VDM you should use @{b}VX00@{ub} (look for a
package called @{b}SIO*@{ub}) or some other OS/2 @{b}FOSSIL@{ub} driver. If you are
running @{b}BBBS/D@{ub} in a VDM, run remote nodes in full screen sessions, @{i}not@{ui}
in a WPS window.

BBBS supports all standard FOSSIL drivers (revision level 5 or
higher), such as @{i}X00@{ui} or @{i}BNU@{ui}. However, if you don't want to use a FOSSIL
driver, BBBS offers you reliable, high-speed internal communication
routines. On startup BBBS will automatically detect whether or not a
FOSSIL driver is loaded and act accordingly. Using a FOSSIL driver is
recommended, though. Remember to load the FOSSIL driver before
@{i}DESQview@{ui}.

Usually you can set the receive and transmit buffer sizes when loading
the FOSSIL driver. Using 4kB buffers will give you good performance
and will speed up your system. It will also give you more reliable
file transfer with some internal and external @{"protocols" link CFG_EXTERNAL_PROTOCOLS}. Of course,
bigger buffers will allocate more memory so if you are very tight on
memory you can use smaller transmit and receive buffers, like
512 bytes (usually FOSSIL driver's default settings).

For more information, read your FOSSIL user's guide.
@endnode


@node SYS_DIFFS_OS2 "BBBS/2, BBBS for IBM OS/2"
@{b}BBBS/2@{ub} is the @{i}IBM OS/2 2+@{ui} specific version of BBBS.

To run @{b}BBBS/2@{ub}, you need a system that is capable of running @{i}OS/2@{ui},
version 2 or higher. Thus, you will need at least 4MB of memory, but
8MB is highly recommended. If you are running tight on memory, you
should consider running BBBS under a shell other than WPS. @{i}MShell@{ui} and
@{i}FileBar@{ui} are known to be good replacement shells for running BBBS.

@{b}BBBS/2@{ub} will work on a FAT drive, but it is highly recommended to
run BBBS only on @{i}HPFS@{ui} drives. Using HPFS drives will speed up your
system dramatically. At least your file areas should be on a HPFS
drive to have real file names.


The @{b}BBBS/2@{ub} calling convention is:

@{b}bbbs.exe [com] [node] {device} {*} {handle}@{ub}

@{b}Device@{ub} is the comport device, @{b}handle@{ub} is the filehandle number of an
already opened comport. @{b}Device@{ub} should be specified if you are using
some special hardware, like @{i}DigiBoard@{ui}. With the device-parameter BBBS
will support up to 255 comports.

Users of DigiBoard should note that the DigiBoard OS/2 drivers (and also
some other drivers that have too small output buffers) have trouble coping
with high-speed bidirectional transfers with protocols such as HYDRA. To
get BBBS working correctly with these kind of setups, the BCFG4 option
@{"Local: OS: Buffered output" link bcfg1103} should be turned on to get better performance.

@{b}Device@{ub} must also be specified if you want to specify a @{i}handle@{ui}, used
with external mailers and other such programs. Using the special
handle @{b}BTERM@{ub} you can start @{"BTERM" link BTERM0} automatically. When started like
this, exiting BTERM will cause a return to the OS.

@{b}BBBS/2@{ub} is able to do communications via @{i}named pipes@{ui} and @{i}shared@{ui}
@{i}memory@{ui}. To use pipes, you must specify a valid pipe name as the
@{b}device@{ub}, for example @{b}\\PIPE\\BBBSpipe@{ub} or @{b}\\\\SERVER\\PIPE\\BBBSpipe@{ub}. To
use shared memory, the @{b}device@{ub} must be @{b}\\SHAREMEM\\memfile@{ub}, where
@{b}memfile@{ub} is an appropriate shared memory handle.

The asterisk ('@{b}*@{ub}') should be added after the device name if you want
BBBS to act as a @{i}client@{ui} for named pipe/shared memory communications
(by default, BBBS will act as a server).

@{b}BBBS/2@{ub} also supports ISDN CAPI; by starting BBBS with an additional
@{b}ISDN@{ub} @{i}device@{ui}, it is possible to dial out and take incoming calls with
ISDN equipment that support 16bit or 32bit CAPI (version 1.1) under OS/2.

An ISDN node is started normally, with an @{b}ISDN@{ub} as the device. The
@{b}com@{ub}-parameter should be the adapter number, with 1 being adapter
number 0 and so on.

BBBS accomplishes dialling out with ISDN by doing some simple Hayes
emulation on the ISDN device via the ISDN CAPI. The EAZ of incoming and
outgoing calls is done with the @{b}ATZin,out@{ub} command, where @{b}in@{ub} is the
incoming EAZ and @{b}out@{ub} the outgoing EAZ. For incoming EAZ the parameter
is a bitmapped value (bits 0 to 9), where bit 0 specifies global calls and
the rest of the bits specify each their respective EAZ. For example, to
specify global call and EAZ 1, the value for @{b}in@{ub} should be 3 (000000011b).
The @{b}out@{ub} parameter, on the other hand, is simply the EAZ number (not
bitmapped) to use.

You should also configure the @{"modem init string" link bcfg701} in BCFG4 appropriately.
For ISDN dialling, the correct one is "ATD".


@{b}Examples:@{ub}

Start node 5 and use modem in comport 7:

        @{b}bbbs.exe 1 5 COM7@{ub}

Start node 2 and use async pipe so that it can be used via network
from the server "SERVER01" (start a named pipe server):

        @{b}bbbs.exe 1 2 \\PIPE\\BBSNODE2@{ub}

Start node 1 from workstation (as a named pipe client) so that it uses
BBBS node 2 via async pipe and network from "SERVER01":

        @{b}bbbs.exe 1 1 \\\\SERVER01\\PIPE\\BBSNODE2 *@{ub}

Start node 5 for use with ISDN connections, using adapter number 0:

        @{b}bbbs.exe 1 5 ISDN@{ub}

Start @{"BTERM" link BTERM0}, use modem in comport 2:

        @{b}bbbs.exe 1 1 COM2 BTERM@{ub}
@endnode


@node SYS_DIFFS_NT "BBBS/NT, BBBS for Microsoft Windows NT"
@{b}BBBS/NT@{ub} is the Microsoft Windows NT specific version of BBBS.

To run @{b}BBBS/NT@{ub}, you will need a system that is capable of running
Microsoft Windows NT. A 386/33 with 16MB of memory can run @{b}BBBS/NT@{ub} with
acceptable performance, but 32MB of memory is highly recommended. More
memory means better performance.

@{b}BBBS/NT@{ub} will work from a FAT drive, but using @{i}NTFS@{ui} drives is
recommended. At least your file areas should be placed on a NTFS drive
for maximum performance.


The @{b}BBBS/NT@{ub} calling convention is:

@{b}bbbs.exe [com] [node] {device} {*} {handle}@{ub}

@{b}Device@{ub} is the comport device, @{b}handle@{ub} is the filehandle number of an
already opened comport. @{b}Device@{ub} should be specified if you are using
some special hardware, like @{i}DigiBoard@{ui}. With device-parameter, BBBS will
support up to 255 comports.

@{b}Device@{ub} must also be specified if you want to specify a @{b}handle@{ub}, used
with external mailers and other such programs. Using the special
handle @{b}BTERM@{ub} you can start @{"BTERM" link BTERM0} automatically. When started like
this, exiting BTERM will cause a return to the OS.

@{b}BBBS/NT@{ub} is able to do communications via @{i}named pipes@{ui} and @{i}shared@{ui}
@{i}memory@{ui}. To use pipes, you must specify a valid pipe name as the
@{b}device@{ub}, for example @{b}\\\\.\\PIPE\\BBBSpipe@{ub}. To use shared memory, the
@{b}device@{ub} must be @{b}MAPFILE:memfile@{ub}, where @{b}memfile@{ub} is an appropriate
shared memory name.

The asterisk ('@{b}*@{ub}') should be added after the device name if you want
BBBS to act as a client for named pipe/shared memory communications
(by default, BBBS will act as a server).


@{b}Examples:@{ub}

Start node 5 and use modem in comport 7:

        @{b}bbbs.exe 1 5 COM7@{ub}

Start node 2 and use async pipe so that it can be used via network
from the server "SERVER01" (start a named pipe server):

        @{b}bbbs.exe 1 2 \\\\.\\PIPE\\BBSNODE2@{ub}

Start node 1 from workstation (as a named pipe client) so that it uses
BBBS node 2 via async pipe and network from "SERVER01":

        @{b}bbbs.exe 1 1 \\\\SERVER01\\PIPE\\BBSNODE2 *@{ub}

Start @{"BTERM" link BTERM0}, use modem in comport 2:

        @{b}bbbs.exe 1 1 COM2 BTERM@{ub}
@endnode


@node SYS_DIFFS_NIX "The UNIX versions of BBBS"
There is a version of BBBS for the following @{i}UNIX@{ui} clones:

        @{b}BBBS/L@{ub}          Linux, 80386
        @{b}BBBS/SoS@{ub}        Solaris 2.X, Sparc
        @{b}BBBS/UW@{ub}         UnixWare, 80386
        @{b}BBBS/SuM@{ub}        SunOS 4.X, Motorola
        @{b}BBBS/SuS@{ub}        SunOS 4.X, Sparc
        @{b}BBBS/IrS@{ub}        IRIX, SGI
        @{b}BBBS/UlD@{ub}        Ultrix, DEC
        @{b}BBBS/HP@{ub}         HP-UX, PA
        @{b}BBBS/Sco@{ub}        SCO, 80386
        @{b}BBBS/FBI@{ub}        FreeBSD, 80386

The @{b}UNIX@{ub} versions of BBBS can use @{i}stdin/stdout@{ui} to communicate without
support of the local screen. This means that BBBS can be used as a
@{i}shell@{ui} and as a @{i}getty@{ui}. When BBBS is executed with the name
@{b}bbbs_an.exe@{ub}, it will automatically find the first free node and use
stdin/stdout.

If you would like to run BBBS as a shell for the users, you can create
a special user account called @{b}bbbs@{ub}, the shell of which is
@{b}/home/bbbs/bbbs_an.exe@{ub}. To use BBBS as a @{b}getty@{ub}, you must first disable
the real getty from that port and then start @{b}bbbs_an.exe@{ub} and redirect
the input and output to the correct port. If you want to use BBBS via
network, you should patch your telnet daemon to start @{b}bbbs_an.exe@{ub}
and not @{b}login@{ub}.

If you desperately want to run BBBS with local screen support, you
should specify the comport @{b}device@{ub} BBBS should use. It is very much
advised that you use redirection, though, as it is much, much faster. When
you are using local screen, you should at least disable local echo from
BCFG4.

BBBS/L supports also @{b}ISDN@{ub} cards, if you have compiled proper support
to your kernel. If you use the ISDN device, then be sure to set the
modem init strings in @{b}BCFG4@{ub} according to the ISDN driver in your kernel.
Remember that your kernel must do proper Hayes emulation for the ISDN card,
as BBBS will see the card as a normal modem.

The @{b}BTERM@{ub} handle can be used to start the @{"BTERM terminal emulator" link BTERM0}
automatically. When started this way, exiting BTERM will cause a
return to the OS.


@{b}Examples:@{ub}

Start BBBS for node 1, using the device /dev/ttyS2, with local screen
support:

        @{b}bbbs.exe 2 1 /dev/ttyS2@{ub}

Start BBBS for node 1, using normal redirection:

        @{b}bbbs.exe 2 1 </dev/ttyS2 >/dev/ttyS2@{ub}

Start @{"BTERM" link BTERM0}, use the device /dev/ttyS1 to communicate:

        @{b}bbbs.exe 1 1 /dev/ttyS1 BTERM@{ub}
@endnode

@node SYS_ENV "OS environment variables"
The following OS environment variables can be set to control the behavior
of BBBS:

@{b}Variable        Available values/what it is@{ub}
@{b}===========================================================================@{ub}
@{b}BBBS@{ub}            @{i}FOSSIL@{ui} - with @{"BBBS/D" link SYS_DIFFS_DOS}, use always FOSSIL for communication
                @{i}BCOM@{ui}   - with BBBS/D, use always internal high speed async
                         communication routines. This overrides FOSSIL.
                @{i}INT14@{ui}  - with BBBS/D, use always @{b}BIOS@{ub} routines for
                         communication. This is @{b}slow@{ub}. Do not use it,
                         unless you really need to.
                @{i}DEBUG@{ui}  - show some debugging information while running.
                         This can be added to any of the above with a
                         comma. For example @{b}BCOM,DEBUG@{ub}.

@{b}BZLL@{ub}            When this environment variable is set (that is, it contains
                any string) the @{"BZLink-Lite" link BTERM0_BZLL} is automatically activated in
                @{"BTERM terminal emulator" link BTERM0}.

@{b}BBBSJAVA@{ub}        This environment variable determines the search path of the
                @{i}Java@{ui} parser used to run Java scripts (@{b}.class@{ub}).

@{b}BBBSPERL@{ub}        This environment variable determines the search path of the
                @{i}perl@{ui} parser used to run perl scripts (@{b}.pl@{ub}).

@{b}BBBSHACK@{ub}        This environment variable should point to a @{i}NetHack@{ui}
                playground, if you want your users to use the 'q hack'-command
                to play NetHack.

BBBS also supports the standard timezone variables @{b}TZ@{ub} and @{b}TZUTC@{ub}. It is very
recommended to set both to get correct time values in BBBS. The @{b}TZ@{ub} variable
should contain the timezone, the @{b}TZUTC@{ub} variable the difference from UTC
time. Remember that the variables should be the same for all nodes, otherwise
you will see very big (errorneous) values in, for example, the who-command
output.

For Finland, in winter time, the correct timezone is @{i}EET-2@{ui}. Thus, @{b}TZUTC@{ub}
should be @{b}+0200@{ub}. For Norway, the timezone is @{i}CET-1@{ui} and the difference from
UTC is @{b}+0100@{ub}. For summer time, one hour should be added to these values,
resulting into @{i}EET-3@{ui} (@{b}+0300@{ub}) for Finland and @{i}CET-2@{ui} (@{b}+0200@{ub}) for Norway.
@endnode

@node app_toperrors "Top-19 errors"
@{b}1Q:@{ub}     BBBS reports "Directory not found." when I try to enter the file
        areas.
@{b}1A:@{ub}     Your "@{"filedirg.000" link CFG_FILE_FILEDIRS}" file is missing root-directory, `/'.

@{b}2Q:@{ub}     BBBS does not find subdirectories in the file area.
@{b}2A:@{ub}     Write directories in lower case, not upper. Use `/' as directory
        separator, not `\\'.

@{b}3Q:@{ub}     BBBS does not initialize modem.
@{b}3A:@{ub}     Your initialization string misses `|'. Also remember to use it
        in your busy and answer strings.

@{b}4Q:@{ub}     BBBS reports mysterious disk errors.
@{b}4A:@{ub}     You are using SmartDrive or some other non-working disk utility.
        Please  remove  them  and try again. You should also specify big
        value for @{i}files@{ui}-setting in your config.sys.

@{b}5Q:@{ub}     I get "Access denied." when I try to DEScribe or delete a file.
@{b}5A:@{ub}     Give yourself a write access to file directories with `\@w' flag.
        Remember to edit "groups" file too.

@{b}6Q:@{ub}     BBBS reports "Hold not found." every time somebody logs in.
@{b}6A:@{ub}     You have not specified correct hold directory in filedirn.???
        file(s). Remember to give all users a write access to the hold.

@{b}7Q:@{ub}     BBBS reports swap error when shelling to external program?
@{b}7A:@{ub}     You have wrong path in external.bbb file or the filename is
        missing extension.

@{b}8Q:@{ub}     The commands are all messed up: who brings up bulletin menu
        and stuff like that.
@{b}8A:@{ub}     You haven't updated your bbbstxt-files or have messed them up.
        Update them from the distribution package.

@{b}9Q:@{ub}     BBBS does not work.
@{b}9A:@{ub}     Use a soft, lint-free cloth to clean your hard disk. The
        magnetic dust interferes with high-fidelity applications. Also
        delete your copy of Microsoft Windows.

@{b}10Q:@{ub}    When will the next version be available?
@{b}10A:@{ub}    Dunno.

@{b}11Q:@{ub}    "Download", "MOve" and "COpy" commands does not work in the file
        area.
@{b}11A:@{ub}    You have too long description for some file(s) in the current
        directory. Maximum length is about 750 characters.

@{b}12Q:@{ub}    When starting BBBS it just returns to OS. It works fine with FD.
@{b}12A:@{ub}    You have defined local/general/dobbs.bat in BCFG4. Clear it.
        You should also read help for that option.

@{b}13Q:@{ub}    BBBS does not find the phonenumber of system listed in nodelist.
@{b}13A:@{ub}    Remember to compile nodelists every day by running BNC.

@{b}14Q:@{ub}    Sometimes I see descriptions like "-Q81028001e000001c83acc0" for
        the files in my filearea.
@{b}14A:@{ub}    You've been running QPEG with "write descriptions" option on.
        That's a error/problem in QPEG. Turn the option off.

@{b}15Q:@{ub}    BackDoor doesn't poll to some system
@{b}15A:@{ub}    The system has been busy too many times or there has been too
        many errors while calling it (see: maindir/busypoll.dat and
        maindir/badpoll.dat). You should also check that node is CM or
        you have correct event running and your nodelist index is up to
        date. "Send crashmail" and "Backdoor" toggles must also be enabled.

@{b}16Q:@{ub}    BBBS reports "Can't open the program" when executing it.
@{b}16A:@{ub}    Your  shell  does  not provide full filename for "bbbs.exe". Try
        to start it with command "bbbs.exe", not "bbbs".

@{b}17Q:@{ub}    I have noticed that some messages are disappearing faster than
        others. Why is that and who decides?
@{b}17A:@{ub}    Its the size of the message. You see, the messages are stored on
        disk. A message is encoded in things known as 'bits' which are
        written on the disk. A disk is a rotating platter. As anyone
        knows centrifugal force will force anything off of a rotating
        surface.

        As time goes on, the message moves closer and closer to the edge
        of the disk, and finally, it flies right off. Of course, the
        larger messages (more bits == more weight) tend to fly off
        faster.

@{b}18Q:@{ub}    Clock in OS is OK, but in BBBS it's wrong by one hour.
@{b}18A:@{ub}    Your @{i}TZ@{ui} @{"environment" link SYS_ENV} variable is wrong. You haven't set it at
        all, or it has/misses @{i}DST@{ui} suffix.

@{b}19Q:@{ub}    OS/2 reports that comport is already in use when I try to start
        external program.
@{b}19A:@{ub}    If you try to start OS/2 program you must give it comport handle
        (%a in @{"external.bbb" link CFG_EXTERNAL}), not number or device (%o, %A). If you try to
        start a DOS program you must use SIO driver and it's "-"-parameter
        (in config.sys: "(port,base irq,-)").
@endnode


@node APP_REGEXP "About regular expression"
        Regular  Expression is a standard way to scan for a text. RegExp
        has  specific  syntax  for wildcards which differs from wildcard
        scan used for files. All texts in BBBS are scanned with RegExps,
        the scan in not case sensitive.

        @{b}RegExp          What it does@{ub}
        @{b}================================================================@{ub}
        foz             text "foz" as it is
        ^               beginning of the line
        $               end of the line
        .               any character
        [foz]           character `f', `o' or `z'
        [^foz]          any other character than `f', `o' or `z'
        [f-j]           equal to command "[fghij]"
        [^f-j]          equal to commnad "[^fghij]"
        (foo|bar)       text "foo" or "bar"
        x?              equal to command "(x|)"
        x+              one or more `x'
        x*              zero or more `x'
        \\x              character `x', used finding f.ex. `*'

@{b}NOTE@{ub}
        Following  RegExps  are  valid, but the result might not be what
        you think you asked for.

        @{b}RegExp          What it does@{ub}
        @{b}================================================================@{ub}
        .*              matches everything
        .               matches everything except an empty line
        fub*            matches lines with "fu"
        file*.*         matches lines with "fil"

@{b}EXAMPLE@{ub}
        @{b}RegExp          What it does@{ub}
        @{b}================================================================@{ub}
        foobar          scan for text "foobar" anywhere in the line
        ^foobar         scan for a line starting with "foobar"
        fo.bar          scan for a line with text fo<any character>bar
        \\*              scan for character "*" anywhere in the line
        foo(bar|ugh)*buz$
                        scan for a line with text "foo" followed by zero
                        or  more "bar" or "ugh" and followed by "buz" at
                        the  end of the line. For example lines "foobuz"
                        and "junkfoobarughbarbuz" matches this RegExp

@{b}SEE ALSO@{ub}
        @{"Wildcards" link APP_WILDCARDS}
@endnode

@node app_wildcards "Wildcards"
@{b}DESCRIPTION@{ub}
        Wildcard-filescan is a standard way to scan for files with user-
        defined pattern. The pattern must match whole filename.

        @{b}Wildcard        What it does@{ub}
        @{b}================================================================@{ub}
        foz             text "foz" as it is
        *               zero or more characters (any)
        ?               any character
        [foz]           character `f', `o' or `z'
        [!foz]          any other character than `f', `o' or `z'
        [f-j]           equal to command "[fghij]"
        [!f-j]          equal to commnad "[!fghij]"
        \\x              character `x', used finding f.ex. `['

@{b}NOTE@{ub}
        Following  wildcards are valid, but the result might not be what
        you think you asked for.

        @{b}Wildcard        What it does@{ub}
        @{b}================================================================@{ub}
        *.*             matches filenames with "." in it, not all files
        foo*.*          matches  filenames  starting with foo and having
                        "." in it

@{b}EXAMPLE@{ub}
        @{b}Wildcard        What it does@{ub}
        @{b}================================================================@{ub}
        *               all files
        *foo*           filenames with "foo" in it
        foo*bar[1-4x]   filenames  starting  with  "foo" and ending with
                        "bar" followed by a number from 1 to 4 or "x"

@{b}SEE ALSO@{ub}
        @{"Regular Expression" link app_regexp}
@endnode

@node app_legal "The BBBS License"
Read the terms and conditions of this license agreement carefully before
using the software. If you for any reason, whatsoever, cannot accept the
conditions in this agreement, you are not permitted to use BBBS.

BBBS is a proprietary product of Kim Heino and Tapani T. Salmi,
hereafter "the authors", protected by applicable copyright laws and
international treaty provisions.

BBBS is not, nor has ever been, public domain or free software. You must
register after the 30-day evaluation period. If you decide to use this
software, then you are under both legal and moral obligations to
register it with the author. Registration entitles you continue using
BBBS.

In the event that you are in violation of this license agreement, you
agree and accept that the authors may cancel your registration and any
rights to use BBBS that you may have.

BBBS is provided "as is", without warranty of any kind or fitness for a
particular purpose, either expressed or implied, all of which are hereby
explicitly disclaimed. The authors only guarantees that BBBS will occupy
disk space. The authors liability resulting from your use or inability
to use BBBS is limited to the amount that the affected party has paid
for it.

The registered version of BBBS may not be duplicated other than for
backup purposes. In a non registered version there is user's timelimit
limited to 31 minutes. That limitation will be removed when registering
the program.

Some BBBS versions are distributed with object code files. These objects
may only be used to rebuild (link) BBBS executables, all other uses are
strictly forbidden.

There are two versions of BBBS, with and without RSA crypting. BBBS with
RSA may not be imported to some countries, especially the USA. Please
check your local import laws first. The RSA library used is fully coded
in Finland.

There are two different licenses for BBBS: COMMERCIAL and NONCOMMERCIAL.
You may use NONCOMMERCIAL license only if your BBS is free for all users
(new and old ones) and it is public for everybody to log in. You must
use COMMERCIAL license if you use BBBS in a company for inner or
external mail or file transfer purposes, or you run a support BBS for a
company or it's products.

One license for BBBS is valid only in one system, which may contain one
or more computers physically connected to each other all the time via LAN,
WAN or similar. You may not use one license in two physically separated
systems, i.e. in two different offices of one company.

You can order with the @{"registeration form" link app_order}.

In doubt contact the authors.


@{b}Contact Information:@{ub}

Kim Heino                               BarCode BBS
Paavolankatu 3 D 34                     v/Rune Johansen
FIN-20240  TURKU                        Ospelia 23 B
Finland                                 N-1481 Hagan
@{i}Internet:@{ui} Kim.Heino@utu.fi, b@bbbs.net  Norway
@{i}BBS/FAX:@{ui} +358 2 240 4036 (BCG-Box)      @{i}Internet:@{ui} rune@cinet.no, rune@bbbs.net
         +358 2 240 7755                @{i}BBS/FAX:@{ui} +47-67 06 00 07 (BarCode)
         +358 2 240 1413                         +47-67 06 10 44
         +358 2 240 4410                @{i}Fidonet:@{ui} 2:210/20
@{i}FidoNet:@{ui} 2:22/222
@endnode

@node app_order "BBBS prices and order form"
Remember to read and understand the @{"BBBS license" link APP_LEGAL} carefully before ordering
to avoid unnecessary hassle! If you have any questions, contact the authors.

The BBBS node license is divided in two; phone nodes and local nodes.
A local node can not be used with modem or ISDN (or modem emulating
driver), it can only be used for local/telnet/PIPE (LAN) connections.
A phone node can be used for all purposes. The minimum is 2 phone nodes
and 0 local nodes. See the table below for current prices and available
node amounts.

Current prices in Finnish Marks (FIM) and Norwegian Crowns (NKR) are:

              @{b}Noncommercial   Commercial@{ub}
 @{b}Phone nodes  FIM   NKR       FIM   NKR@{ub}
 @{b}----------------------------------------@{ub}
 2            300   500       900   1500
 5            500   800       1500  2400       @{i}!!!!!!!!!!!!!!!!!!!!!!!!!@{ui}
 10           1000  1500      3000  4500       @{i}!!                     !!@{ui}
 20           2000  3000      6000  9000       @{i}!!@{ui}  Remember:          @{i}!!@{ui}
 21 and over  ask   ask       ask   ask        @{i}!!                     !!@{ui}
                                               @{i}!!@{ui}  The minimum is     @{i}!!@{ui}
              @{b}Noncommercial   Commercial@{ub}       @{i}!!@{ui}  2 phone nodes and  @{i}!!@{ui}
 @{b}Local nodes  FIM   NKR       FIM   NKR@{ub}        @{i}!!@{ui}  0 local nodes.     @{i}!!@{ui}
 @{b}----------------------------------------@{ub}      @{i}!!@{ui}                     @{i}!!@{ui}
 0            0     0         0     0          @{i}!!!!!!!!!!!!!!!!!!!!!!!!!@{ui}
 5            100   180       300   500
 10           200   350       600   1000
 20           400   650       1200  1900
 21 and over  ask   ask       ask   ask

The change of the number of nodes or the license type will cost the
difference * 1.1. Changes made within a week will be charged for
difference only. I.e. if you want to upgrade from 2 phone node
noncommercial license to 5 phone node commercial license, the price
will be (1500-300)*1.1, 1320 FIM. Fill in new registeration form when
you want to upgrade. When upgrading you can only increase your node
amounts, you can not decrease them.

When registering world-wide, send the registration form and money to:

 @{i}Address:@{ui}                                @{i}Bank-account:@{ui}
 Kim Heino                               Turun Seudun Osuuspankki, Finland
 Paavolankatu 3 D 34                     571236-58198
 FIN-20240  TURKU
 Finland

When registering in Norway or with credit card, send the registration form
and money to:

 @{i}Address:@{ui}                                @{i}Bank-account:@{ui} 1607 57 54098
 BarCode BBS                             @{i}Post-account:@{ui} 0536 20 82139
 v/Rune Johansen
 Ospelia 23 B
 N-1481 Hagan
 Norway

Do not use "Telegiro" for payment in Norway, since the receipt for your
payment is not sent out to the receiver. It is only noticable on monthly
statement, and could very easily be overlooked.

For registering by credit card (VISA or American Express), please fill
out the credit card information in the bottom of this form too, and FAX
to BarCode BBS at +47 22 64 41 22, or send printed version to the
address above by regular mail.

                Don't forget to sign at the bottom line!!!


                         BBBS Registration Form                 Date: __/__/__


      Your name/company: ____________________________________________

         Street address: ____________________________________________

            Postal code: ____________________________________________

                Country: ____________________________________________

            Voice phone: ____________________________________________

 BBS name (max 18 char): _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _

  BBS phones/open hours: ____________________________________________

      Network addresses: ____________________________________________

         Other BBS info: ____________________________________________

        License type:
        [_] Noncommercial license
        [_] Commercial license
        [_] Upgrade, current BBS name is __________________________,
            license number _______ and number of phone nodes ______,
            and number of local nodes ______.

        Number of phone nodes: __________
                                             Total price: __________
        Number of local nodes: __________

        Method of payment:
        [_] Money included to letter
        [_] Credit card
        [_] Paid to bank account number _________________, date: _____________

        Method of sending registration key to you:
        [_] by mail, in 3.5" HD disk
        [_] by modem from BCG-Box, username:
        [_] by modem from BarCode, username: _________________________________

 What kind of hardware and software are you using? (Name and model, hard disk,
 amount of RAM, modem, operating system, LAN, etc.)

 _____________________________________________________________________________

 _____________________________________________________________________________

 Other comments, ideas, etc:

 _____________________________________________________________________________

 _____________________________________________________________________________


 I have read the BBBS license agreement and fully agree to obey it.


            Signature: _________________________________________

For registration by credit card only:

Due to the fact that credit card registrations are done in Norway, the
prices applied are in Norwegian Crowns. 1 US$ was approx. 6,50 NKR in
August, 1996.

Remember that the address and name in the registration has to be the
same as the name and address of the card holder.

Prices for BBBS registration:

 Noncommercial              Commercial
 Phone nodes   NKR          Phone nodes   NKR
 ------------------         ------------------
 2             500          2             1500
 5             800          5             2400
 10            1500         10            4500
 20            3000         20            9000

 Noncommercial              Commercial
 Local nodes   NKR          Local nodes   NKR
 ------------------         ------------------
 0             0            0             0
 5             180          5             500
 10            350          10            1000
 20            650          20            1900


 I wish to withdraw the sum of __________ NKR from my credit card account for
 the payment of registration of BBBS.


 Credit card type (Mark with X):   (  ) American Express (  ) VISA

 Card number: ______ ______ ______ ______

 Expiry date: ___/___


                SIGNATURE: _____________________________________________


  Name in capital letters: _____________________________________________
@endnode

@node HELP "How to use the help system"
        The help system commands:

        @{b}C@{ub}ontents  - Shows the contents (the main help menu)
        @{b}I@{ub}ndex     - Shows an alpateical index
        @{b}H@{ub}elp      - Shows you this help
        @{b}R@{ub}etrace   - Shows the last helpscreen you looked at
        Browse @{b}<@{ub}  - Shows the previous helpscreen in the helpfile
        Browse @{b}>@{ub}  - Shows the next helpscreen in the helpfile
        @{b}S@{ub}earch    - Keyword search
        @{b}Q@{ub}uit      - Quits back to BCFG4

        When you are in the helpsystem you can move up and down with
        arrow keys. The keys Ctrl-R and Ctrl-C will scroll one page Up
        or Down.

        Often you will see words or sentences that are marked with a
        different background color. These are links to other related
        information. Just press enter when you have selected a link to
        get more information about that subject.
@endnode


@node APP_REFS "References"
See Also (if you want to know more about):

@{b}Byte, March 1991, page 309, Lossless Data Compression, by Steve Apiki@{ub}
        This article describes Huffman coding and LZW coding.

@{b}Davis, Stephen R.: DESQview@{ub}
        A Guide to Programming the DESQview Multitasking Environment.
        ISBN 1-55851-028-1

@{b}fts-0001@{ub}
        A Basic FidoNet(r) Technical Standard.

@{b}fts-0005@{ub}
        The distribution nodelist.

@{b}fts-0004@{ub}
        EchoMail Specification

@{b}fts-0006@{ub}
        YOOHOO and YOOHOO/2U2, The NetMail handshake used by Opus-CBCS
        and other intelligent FidoNet mail handling packages.

@{b}fts-0007@{ub}
        An Enhanced FidoNet(r) Technical Standard

@{b}fts-0009@{ub}
        Message identification and reply linkage.

@{b}fsc-0011@{ub}
        Some thoughts on fsc-0001.

@{b}fsc-0015@{ub}
        FOSSIL 5.0 Documentation.

@{b}fsc-0016@{ub}
        FidoNet Mail Session Startup.

@{b}fsc-0025@{ub}
        AVATAR Video Spec.

@{b}fsc-0028@{ub}
        A Collection of Notes on Moving Files in FidoNet.

@{b}fsc-0037@{ub}
        AVATAR 0+ Video Spec.

@{b}fsc-0039@{ub}
        A Type-2 Packet Extension Proposal.

@{b}fsc-0045@{ub}
        A Proposed Type-2 Packet Extension.

@{b}fsc-0048@{ub}
        A Proposed Type-2 Packet Extension.

@{b}fsc-0050@{ub}
        A Character Set Identifier For FidoNet Message Editors.

@{b}fsc-0053@{ub}
        Specifications for the ^aFLAGS field.

@{b}fsc-0054@{ub}
        A System-Independent Way of Transferring Special Characters,
        Character Sets and Style Information in FIDO Messages.

@{b}fsc-0056@{ub}
        EMSI/IEMSI Protocol Definitions.

@{b}fsc-0057@{ub}
        Conference Managers - Specifications for Requests

@{b}fsc-0062@{ub}
        A Proposed Nodelist flag indicating Online Times of a Node

@{b}fsc-0068@{ub}
        A Proposed Replacement For FTS-0004.

@{b}fsc-0072@{ub}
        The HYDRA file transfer protocol.

@{b}grep(1) manual page@{ub}
        Regular expression.

@{b}COMMON ISDN API@{ub}
        Standard Interface between Application Programs and ISDN
        Adapters.

@{b}Murphy's Law@{ub}
        Why BBBS does not work?

@{b}National Semiconductor: Data Communications, Local Area Networks, UARTs@{ub}
        What the heck is this NS16550AFN anyway? Also describes other
        NS's UARTs with great details.

@{b}PC Magazine, May 26, 1992, page 361, Lab Notes, by Douglas Boling@{ub}
        Putting Serial-Port Technology in Perspective, Part 2. This
        article describes serial port communication with normal and FIFO
        UARTs and IBM Type 3 UART.

@{b}rfc0821@{ub}
        Simple Mail Transfer Protocol.

@{b}rfc0822@{ub}
        Standard for the format of ARPA InterNet text messages.

@{b}rfc0850@{ub}
        Standard for Interchange of USENET Messages

@{b}rfc0854@{ub}
        Telnet protocol specification

@{b}rfc0855@{ub}
        Telnet option specifications

@{b}rfc0856@{ub}
        Telnet binary transmission

@{b}rfc0857@{ub}
        Telnet echo option

@{b}rfc0858@{ub}
        Telnet suppress go ahead option

@{b}rfc0859@{ub}
        Telnet status option

@{b}rfc0860@{ub}
        Telnet timing mark option

@{b}rfc0861@{ub}
        Telnet extended options - list option

@{b}rfc0959@{ub}
        File Transfer Protocol (FTP)

@{b}rfc0977@{ub}
        Network News Transfer Protocol.

@{b}rfc1282@{ub}
        BSD Rlogin

@{b}rfc1321@{ub}
        The MD5 Message-Digest Algorithm.

@{b}rfc1345@{ub}
        Character Mnemonics & Character Sets.

@{b}rfc1437@{ub}
        The Extension of MIME Content-Types to a New Medium. The matter-
        transport/sentient-life-form MIME type is intended to facilitate
        the wider interoperation of electronic mail messages that
        include entire sentient life forms, such as human beings.

@{b}rfc1459@{ub}
        Internet Relay Chat Protocol

@{b}rfc1521@{ub}
        MIME (Multipurpose Internet Mail Extensions) Part One:
        Mechanisms for Specifying and Describing the Format of Internet
        Message Bodies.

@{b}rfc1522@{ub}
        MIME (Multipurpose Internet Mail Extensions) Part Two:
        Message Header Extensions for Non-ASCII Text.

@{b}rfc1563@{ub}
        The text/enriched MIME Content-type.

@{b}RC96AC and RC144AC Modem Designer's Guide@{ub}
        @{i}All@{ui} the possible info about modems based on Rockwell chip.

@{b}Tremblay, Sorenson: The Theory and Practice of Compiler Writing@{ub}
        How to write your own BZC replacement. ISBN 0-07-066616-4

@{b}Your Modem Reference Guide@{ub}
        How to set up your modem and initialization strings.
@endnode


@remark *** BCFG4 nodes begin here! ***

@node bcfg4_main "BCFG4 configuration program, table of contents"
        @{b}THE HITCHHIKERS' GUIDE TO BCFG4@{ub}
        @{b}===============================@{ub}

@{b}TABLE OF CONTENTS:@{ub}
        @{i}Global@{ui}
        @{" General         " link global_general  }
        @{" Toggles         " link global_toggles  }
        @{" Numbers         " link global_numbers  }
        @{" FidoNet         " link global_network  }
        @{" Confs           " link global_confs    }
        @{i}Local@{ui}
        @{" General         " link local_general   }
        @{" Modem           " link local_modem     }
        @{" Dial            " link bcfg1200        }
        @{" Hotlogins       " link bcfg802         }
        @{" Macros          " link bcfg801         }
        @{" Rush Hour       " link bcfg901         }
        @{" Events          " link local_general   }
        @{" OS              " link bcfg1100        }
        @{i}Other@{ui}
        @{" Exit/Don't save " link bcfg11          }
        @{" Exit/Save       " link bcfg12          }

@endnode

@node global_general "Global General"
@{b}SUBTOPICS:@{ub}
        @{" BBBS's name      " link bcfg201}
        @{" BTERM down dir   " link bcfg218}
        @{" FAX receive dir  " link bcfg217}
        @{" Grabfile name    " link bcfg210}
        @{" Main directory   " link bcfg211}
        @{" Menus directory  " link bcfg212}
        @{" NewUser password " link bcfg203}
        @{" SysOp's name     " link bcfg202}
        @{" Work directory   " link bcfg214}
        @{" Upload directory " link bcfg213}
        @{" Internet log     " link bcfg246}
        @{" IRC Server       " link bcfg3042}
@endnode

@node global_toggles "Global Toggles"
@{b}SUBTOPICS:@{ub}
        @{" BRoboCop                          " link bcfg208}
        @{" Check for duplicate uploads       " link bcfg223}
        @{" Check similar filenames in upload " link bcfg222}
        @{" Don't ask address from new user   " link bcfg219}
        @{" Don't ask birthday from new user  " link bcfg220}
        @{" Hide userlist                     " link bcfg221}
        @{" Hippo                             " link bcfg209}
        @{" Pack messages                     " link bcfg215}
        @{" Show SysOp in statistics          " link bcfg216}
        @{" Show empty nodes on Who command   " link bcfg206}
        @{" Show private messages to CoSysOps " link bcfg204}
        @{" Upload/download check             " link bcfg205}
        @{" Grab is free                      " link bcfg264}
        @{" Uploader owns file                " link bcfg265}
@endnode

@node global_numbers "Global Numbers"
@{b}SUBTOPICS:@{ub}
        @{" Byte Limits       " link bcfg308}
        @{" Download          " link bcfg306}
        @{" FAX error         " link bcfg312}
        @{" File Limits       " link bcfg309}
        @{" Max. desc lines   " link bcfg310}
        @{" Message rate      " link bcfg303}
        @{" NewUser timelimit " link bcfg302}
        @{" Timebank maximum  " link bcfg304}
        @{" Timebank rate     " link bcfg305}
        @{" Total nodes       " link bcfg301}
        @{" Upload            " link bcfg307}
        @{" WhoDown size      " link bcfg311}
@endnode

@node global_network "Global FidoNet"
@{b}SUBTOPICS:@{ub}
        @{i}General@{ui}
        @{" AKA Matching                " link bcfg407}
        @{" Flags                       " link bcfg405}
        @{" Location                    " link bcfg402}
        @{" Nodenumbers                 " link bcfg406}
        @{" Phone                       " link bcfg403}
        @{" Show AKAs                   " link bcfg438}
        @{" Site name                   " link bcfg401}
        @{" Speed                       " link bcfg404}
        @{i}Sessions@{ui}
        @{" Check destination (BMT)     " link bcfg1312}
        @{" HYDRA                       " link bcfg415}
        @{" Inbound                     " link bcfg408}
        @{" Mail errorlevel             " link bcfg414}
        @{" Mail from unlisted nodes    " link bcfg418}
        @{" Mail from unlisted points   " link bcfg419}
        @{" Mail from unprotected nodes " link bcfg420}
        @{" NetMail                     " link bcfg409}
        @{" Poll all crashmail          " link bcfg439}
        @{" Rescan time                 " link bcfg413}
        @{" Tickdir                     " link bcfg410}
        @{" Tranx node                  " link bcfg411}
        @{" Tranx toggle                " link bcfg417}
        @{" User mail errorlevel        " link bcfg436}
        @{" ZedZap                      " link bcfg416}
        @{i}FREQ@{ui}
        @{" Magic files                 " link bcfg434}
        @{" Maximum 100 kB's            " link bcfg425}
        @{" Maximum files               " link bcfg424}
        @{" Maximum minutes             " link bcfg426}
        @{" Minimum baud                " link bcfg427}
        @{" Normal dirs                 " link bcfg435}
        @{" Remote FREQ when answering  " link bcfg422}
        @{" Remote FREQ when calling    " link bcfg423}
        @{i}Dial@{ui}
        @{" Convert from                " link bcfg432}
        @{" Convert to                  " link bcfg433}
        @{" Delay when busy             " link bcfg430}
        @{" Number of tries             " link bcfg431}
@endnode

@node global_confs "Global Conferences"
@{b}SUBTOPICS:@{ub}
        @{" Alias allowed " link bcfg528}
        @{" AllFix        " link bcfg524}
        @{" Allow private " link bcfg518}
        @{" BPC max       " link bcfg514}
        @{" BPC min       " link bcfg513}
        @{" Conf Browser  " link bcfg1}
        @{" Desc          " link bcfg506}
        @{" Export        " link bcfg527}
        @{" Fileinfo      " link bcfg504}
        @{" Import        " link bcfg526}
        @{" Invite users  " link bcfg516}
        @{" Moderator     " link bcfg512}
        @{" Msg scan      " link bcfg509}
        @{" Must for all  " link bcfg515}
        @{" Name          " link bcfg505}
        @{" NameFix       " link bcfg525}
        @{" Net area      " link bcfg521}
        @{" Netpath       " link bcfg507}
        @{" No Fido strip " link bcfg522}
        @{" No mark reset " link bcfg520}
        @{" No reply      " link bcfg519}
        @{" Nodenumber    " link bcfg510}
        @{" Origin        " link bcfg511}
        @{" Post conf.    " link bcfg517}
        @{" Post          " link bcfg502}
        @{" Resume        " link bcfg503}
        @{" Total         " link bcfg501}
        @{" UUCPpath      " link bcfg508}
@endnode

@node local_general "Local General"
@{b}SUBTOPICS:@{ub}
        @{" Audio bell           " link bcfg612}
        @{" BackDoor             " link bcfg616}
        @{" Blackout timer       " link bcfg609}
        @{" Don't poll flags     " link bcfg618}
        @{" FAX baud             " link bcfg617}
        @{" FD's DOBBS.BAT       " link bcfg603}
        @{" Grab directory       " link bcfg604}
        @{" Local SysOp keys     " link bcfg613}
        @{" Local screen echo    " link bcfg610}
        @{" Logfile              " link bcfg601}
        @{" Login.Log            " link bcfg602}
        @{" Menus directory      " link bcfg605}
        @{" Min. login baud      " link bcfg607}
        @{" Nodemsg poll rate    " link bcfg608}
        @{" Save screen on shell " link bcfg611}
        @{" Send crashmail       " link bcfg615}
        @{" Sleep disconnect     " link bcfg614}
        @{" Uptemp directory     " link bcfg606}
        @{" Lockup password      " link bcfg619}
        @{" Lockup timeout       " link bcfg620}
@endnode

@node local_modem "Local Modem"
@{b}SUBTOPICS:@{ub}
        @{" Busy string            " link bcfg703}
        @{" Fast FAX               " link bcfg714}
        @{" Hangup at logout       " link bcfg710}
        @{" Hangup string          " link bcfg702}
        @{" IRQ                    " link bcfg707}
        @{" Init string            " link bcfg701}
        @{" NS16550 FIFO buffer    " link bcfg711}
        @{" No carrier check       " link bcfg716}
        @{" Null modem login       " link bcfg713}
        @{" RTS/CTS handshake      " link bcfg712}
        @{" Reset to connect speed " link bcfg709}
        @{" Ring count             " link bcfg708}
        @{" Start baud             " link bcfg705}
@endnode

@node bcfg1 "Global: Conferences: Conference Browser"
Move with cursor keys: @{i}up@{ui}, @{i}down@{ui}, @{i}home@{ui}, @{i}end@{ui}, @{i}pgup@{ui}, @{i}pgdn@{ui}. Select current conference with @{i}Enter@{ui} or @{i}ESC@{ui}.

Press @{i}SPACE@{ui} to toggle @{b}dragging@{ub}. With dragging you can reorder the conferences. All required updates are done automatically when you'll save the config. DO @{b}NOT@{ub} change order when BBBS is active!

@{i}del@{ui}ete moves current conference to the end of the list.
@{i}ins@{ui}ert moves last conference to the current position.
@{i}s@{ui}-key sorts all the next conferences having the same prefix than the current one.
@endnode

@node bcfg2 "Main: Global: General"
Global options are same for all nodes.

You can move in this menu by pressing @{i}up@{ui} and @{i}down @{ui} keys. Select the item to configure by pressing @{i}enter@{ui}.

You can also use Emacs keys to move around:

  C-n   down
  C-p   up
  C-f   right
  C-b   left
  C-v   page down / next screen
  C-u   page up   / previous screen
  C-q   F1 / Help
  C-w   F2
  C-e   F3
  C-r   F4
  C-t   F5
  C-y   F6
@endnode

@node bcfg13 "Main: Global: Toggles"
You can move in this menu by pressing @{i}up@{ui} and @{i}down @{ui} keys. Select the item to configure by pressing @{i}enter@{ui}.
@endnode

@node bcfg3 "Main: Global: Numbers"
You can move in this menu by pressing @{i}up@{ui} and @{i}down @{ui} keys. Select the item to configure by pressing @{i}enter@{ui}.
@endnode

@node bcfg4 "Main: Global: FidoNet"
New submenu pops up here. Move with cursor keys and press enter to select new subtopic to enter.

General:        General FidoNet settings, AKAs and such stuff.
Sessions:       Receive directories, errorlevels, etc.
Origins:        Origin lines.
FREQ:           FREQ limits.
Dial:           Dial conversion.
BOGUS:          BOGUS and BMT settings.
@endnode

@node bcfg5 "Main: Global: Confs"
You can move in this menu by pressing @{i}up@{ui} and @{i}down @{ui} keys. Select the item to configure by pressing @{i}enter@{ui}.

In this window you can press @{i}F2@{ui} to browse conferences, @{i}F3@{ui} to edit your nodenumber setup and @{i}F4@{ui} to edit your origin lines.

By pressing @{i}F5@{ui} you can add multiple conferences at one batch.

By pressing @{i}F6@{ui} BCFG4 will automatically check your badecho directory for new conferences.
@endnode

@node bcfg6 "Main: Local: General"
Local options are only for this node.

You can move in this menu by pressing @{i}up@{ui} and @{i}down @{ui} keys. Select the item to configure by pressing @{i}enter@{ui}.
@endnode

@node bcfg7 "Main: Local: Modem"
You can move in this menu by pressing @{i}up@{ui} and @{i}down @{ui} keys. Select the item to configure by pressing @{i}enter@{ui}.
@endnode

@node bcfg14 "Main: Local: Hotlogins"
You can move in this menu by pressing @{i}up@{ui} and @{i}down @{ui} keys. Select the item to configure by pressing @{i}enter@{ui}.
@endnode

@node bcfg8 "Main: Local: Macros"
You can move in this menu by pressing @{i}up@{ui} and @{i}down @{ui} keys. Select the item to configure by pressing @{i}enter@{ui}.
@endnode

@node bcfg9 "Main: Local: Rush Hour"
You can move in this menu by pressing @{i}up@{ui} and @{i}down @{ui} keys. Select the item to configure by pressing @{i}enter@{ui}.
@endnode

@node bcfg10 "Main: Local: Events"
You can move in this menu by pressing @{i}up@{ui} and @{i}down @{ui} keys. Select the item to configure by pressing @{i}enter@{ui}.
@endnode

@node bcfg11 "Main: Exit, don't save"
Quit, but do not save changes. This will abort all the changes you have made during configuration.

@{b}See Also@{ub}: @{"Exit and save" link bcfg12}
@endnode

@node bcfg12 "Main: Exit and save"
Quit and save changes to the disks. The changes you have just made will be written to the disk.

@{b}See Also@{ub}: @{"Exit, don't save" link bcfg11}
@endnode

@node bcfg201 "Global: General: BBBS's name"
The BBS name is the name you wish to identify your system with.
@endnode

@node bcfg202 "Global: General: SysOp's name"
When user enters message to "SYSOP" or a comment, message will be addressed to this name. This is useful when you are for example going to have a holiday and you want make someone else a temporary SysOp.

NOTE! the @{i}sysnote@{ui}-file will still be shown only to user number 0.
@endnode

@node bcfg203 "Global: General: NewUser password"
NewUser password will be asked when a new user logs in and he/she wants to register as an user. If empty, no password will be asked (except his/her personal password).

If you are running public BBS you should leave this empty.
@endnode

@node bcfg1800 "Global: General: NewUser account"
The account name for new user. Empty is none, "*" is user's name, others are the name of the account. Accounts can be used to charge money from users.

If you are running free BBS you should leave this empty.
@endnode

@node bcfg210 "Global: General: Grabfile name"
This is the name of the grabfile users will get from you with command @{b}MD@{ub}. Do not write @{i}`.'@{ui} to the name!

NOTE! With OMEN packets only two first letters are used. That's because of OMEN standard.
@endnode

@node bcfg211 "Global: General: Main directory"
This is the most important directory of BBBS. This directory includes messagebase, userbase and other important files. You should backup it often.
@endnode

@node bcfg212 "Global: General: Menus directory"
Common menus for all nodes are here. You can have different menus for all nodes with @{i}local menu directory@{ui} setting.
@endnode

@node bcfg213 "Global: General: Upload directory"
Uploaded files will be copied to this directory.
@endnode

@node bcfg245 "Global: General: FidoNet log"
BOGUS, BMT and BTICK will log their activities here.
@endnode

@node bcfg1820 "Global: General: CD-ROM paths"
You can specify here the real paths of your CD-ROM drives. When user wants to download a file from these paths BBBS will copy the file to your hard disk (hold/cdtemp.dir) first. It will speed up downloading and allows you to have CD-jukebox.

Use regexp. For example, if you want to specify paths d:, e: and f:, you can use "^[def]:".
@endnode

@node bcfg214 "Global: General: Work directory"
Small temporary files needed by BBBS are stored here. BBBS creates and deletes them automatically. Ramdisk is recommended!

Size requirements is nodes*size_of_long_message, about nodes*64kB.
@endnode

@node bcfg241 "Global: General: Feelings directory"
Chat configuration and feelings files are here.
@endnode

@node bcfg242 "Global: General: Script directory"
BBBS will look for your scripts only from this directory.
@endnode

@node bcfg217 "Global: General: FAX receive dir"
Incoming faxes will be stored here. BBBS can receive FAXes if you have group 3 class 2 FAXmodem and you have configured it's adaptive answer correctly. FAXes will be saved as raw Group 3 FAX files. You can use the utility called @{b}g3topbm.exe@{ub} to convert a 1D Huffman encoded FAX file a to PBM file (Portable BitMap). There is also a utility called @{b}g3togif.exe@{ub} that converts a raw G3 file directly to GIF (Graphics Interchange Format).

Example: c:/bbs/fax
@endnode

@node bcfg218 "Global: General: BTERM down dir"
The directory where BTERM puts your downloads.

Example: c:/bbs/bterm
@endnode

@node bcfg246 "Global: General: Internet log"
The name of the file where all logs on Internet activities should be stored, in case you want to separate them from @{"FidoNet logs" link bcfg245}.
@endnode

@node bcfg3042 "Global: General: IRC Server"
BBBS can interface its groupchat with the Internet Relay Chat. If you want this, you should specify here the IRC server to which BBBS should connect to when IRC features are in use. Syntax is server:port, for example "irc.funet.fi:6667". If you leave this field empty, the IRC features are disabled.
@endnode

@node bcfg204 "Global: Toggles: Show private messages to CoSysOps"
If enabled, CoSysOp(s) can read all the private messages in the conferences. Main SysOp (user 0) has always this privilege.
@endnode

@node bcfg205 "Global: Toggles: Upload/download check"
If enabled, BBBS will perform upload/download check for user's statistic every time he/she logs in.
@endnode

@node bcfg206 "Global: Toggles: Show empty nodes on Who command"
Normally all nodes will be shown in @{b}Who's online@{ub} command. If you disable this option only nodes with active user will be shown. This might be good to turn off if you have more than 10 nodes.
@endnode

@node bcfg208 "Global: Toggles: BRoboCop"
Enables node-BRoboCop. BRoboCop is a automatic cop in your system, users can ask download access from it, play russian roulette, etc. BRoboCop also has control of uploaded message packets when user is requesting something like resign from conference.

BRoboCop's artificial stupidity is controlled via the @{i}brobo.wht@{ui}-file. The format of the file is:

@{b}>regexp@{ub}
@{b}text@{ub}
@{b}text@{ub}
@{b}text@{ub}
@{b}[...]@{ub}

'regexp' is a @{"regular expression" link APP_REGEXP}. If the message the user sends to BRoboCop matches it, then a random text line under that regexp is sent back as a reply. This feature of BRoboCop is programmed to the @{b}brobo.bz@{ub} script file.

If enabled, BRoboCop will also control if the users flood (repeat the same messages over and over) on a BBBS chat channel. When BRoboCop detects excessive flooding by a user it will react as if the user had sent a message containing only "FLOOD" in it and throw the user out.
@endnode

@node bcfg209 "Global: Toggles: Hippo"
Enables node-Hippo. Hippo is a nice guy to talk with. It also enables you to send @{i}Hippo-messages@{ui} to the users with `HIPpo` command in mainmenu.

When user send a node message to Hippo-node, Hippo will look file @{i}hippo.wht@{ui} to what to reply.
@endnode

@node bcfg215 "Global: Toggles: Pack messages"
By default, BBBS will compress all messages to smaller space, thus saving your disk space about 50%. The compression used is very fast and transparent, disabling it wont speed up anything.

The only reason why you would like to disable it is because you are using an external disk compressing utility, like Stacker.

You can enable and disable this at any time as it only effects to new messages.
@endnode

@node bcfg216 "Global: Toggles: Show SysOp in statistics"
When enabled SysOp (user #0) will be included and counted to statistics.
@endnode

@node bcfg219 "Global: Toggles: Don't ask address from new user"
When enabled system won't ask address or phone number from new user.
@endnode

@node bcfg220 "Global: Toggles: Don't ask birthday from new user"
When enabled system won't ask birthday from new user.
@endnode

@node bcfg221 "Global: Toggles: Hide userlist"
When enabled system won't allow users to see userlist or statistics. Users are also logged in in "hide" mode.
@endnode

@node bcfg222 "Global: Toggles: Check similar filenames in upload"
When enabled, BBBS will scan for similar filenames according to the filename user just gave the system in upload.
@endnode

@node bcfg223 "Global: Toggles: Check for duplicate uploads"
When enabled, BBBS will scan your fileareas for exactly matching filename according to the filename user just uploaded. If found, the uploaded file will be deleted.

If you run LAN or (brain-dead) FAT using a @{b}big@{ub} @{i}trashfil@{ui} file is better idea for performance reasons. Just write names of all the files in your file areas to trashfil file (@{i}ls -R > trashfil@{ui} from your favourite shell).
@endnode

@node bcfg224 "Global: Toggles: Download"
Does user get download access in first call or not.
@endnode

@node bcfg225 "Global: Toggles: Upload"
Does user get upload access in first call or not.
@endnode

@node bcfg1801 "Global: Toggles: kB/Day limit relative to 9600 bps"
Normally (this toggle is off) users are allowed to download only x kB's per each day. If you toggle this on, the limit will be relative to connect speed.

Example:

Limit is 3000kB/day, connect speed is 19200bps, user is allowed to download 6000kB's.
@endnode

@node bcfg1806 "Global: Toggles: Global Download command"
Should be disabled for better operation.
@endnode

@node bcfg1807 "Global: Toggles: Chat uses time"
Normally BBBS does not reduce user's time while chatting with SysOp. If this toggle is on, time will be reduced.
@endnode

@node bcfg1808 "Global: Toggles: SysOp Notes message"
It this toggles is on SysOp notes will be written to post area as a message when user #0 logs in. If off, it will only be shown to user #0 at login.
@endnode

@node bcfg226 "Global: Toggles: Don't allow remote SysOp logins"
You should not turn this toggle on unless you are absolutely sure you will not try to login to your system by calling it. If it is on, only local logins will be allowed for user #0.
@endnode

@node bcfg260 "Global: Toggles: Email-O-Magic: Send all to UUCP"
Forces Email-O-Magic to send all outgoing messages as to UUCP, even if the receivers name fits. If you want to use Email-O-Magic against some other than BBBS gate you must turn this toggle on.

To define Email-O-Magic conference turn postarea and fidoarea toggles on and define gate's address as moderator.
@endnode

@node bcfg261 "Global: Toggles: Use nodenumber, not nick"
Uses (old) nodenumber style nodemessages, not nick.

This toggle forces a static nick for users, "1" for user in node 1, and so on.
@endnode

@node bcfg262 "Global: Toggles: Allow all names"
If you turn this toggle on users are not restricted to two word names. You should also remove "FIRST"-word from bbbstxt lines 17 and 63.
@endnode


@node bcfg264 "Global: Toggles: Grab is free"
When this option is enabled, grabbing will not reduce the user's available time for the day.
@endnode

See also: @{"Global: Toggles: Chat uses time" link bcfg1807}
@endnode

@node bcfg265 "Global: Toggles: Uploader owns file"
When this option is enabled, users can use the 'rm' and 'des' file menu commands on files they have uploaded.
@endnode

@node bcfg301 "Global: Numbers: Total nodes"
Total number of nodes in your system. BRoboCop and Hippo are automatically added to it if enabled.
@endnode

@node bcfg302 "Global: Numbers: NewUser timelimit"
When a new user registers, their daily time limit on the system is set in their user profile. If you don't want to use time limits then just set the new user time limit to zero and the system will not check this for you. Otherwise new users will get the value set here. You can upgrade it later, of course.
@endnode

@node bcfg303 "Global: Numbers: Message rate"
BRoboCop doesn't give download access before:

        100 * Number_of_written_messages
        -------------------------------- > Message_rate
              Number_of_calls

In other words:

If message rate is 0, user has to write no messages.
If message rate is 50, user has to write one message per two calls.
If message rate is 100, user has to write one message per one calls.
@endnode

@node bcfg304 "Global: Numbers: Timebank maximum"
Maximum amount of time user can save to timebank.
@endnode

@node bcfg305 "Global: Numbers: Timebank rate"
For one minute in timebank BBBS requires timebank_rate minutes from user.

For example: User stores 10 minutes, rate is 5. He/she gets 2 minutes to the
             bank.
@endnode

@node bcfg306 "Global: Numbers: HYDRA tx"
Size of HYDRA transmit window. Do not change this unless you know what you are doing.

0=stream, 1=2kB, 2=4kB, ..., 8=16kB
@endnode

@node bcfg307 "Global: Numbers: HYDRA rx"
Size of HYDRA receive window. Do not change this unless you know what you are doing.

0=stream, 1=2kB, 2=4kB, ..., 8=16kB
@endnode

@node bcfg263 "Global: Numbers: Flood count"
Determines how many identical chat messages can be sent to a channel before the sender is kicked out by BRoboCop.

Entering a value of 0 here disables flood checking completely.
@endnode

@node bcfg308 "Global: Limits: Byte Limits"
User can download limit bytes for each byte he/she uploads. These numbers are used with BRoboCop.
@endnode

@node bcfg309 "Global: Limits: File Limits"
User can download limit files for each file he/she uploads. These numbers are used with BRoboCop.
@endnode

@node bcfg1802 "Global: Limits: kB/Day"
User can download limit kB's for each day. 0 is unlimited.
@endnode

@node bcfg1803 "Global: Limits: Cost"
If you have enabled accounts each call will be changed by these numbers. Cost/Call is charged for each call and Cost/Min is changed for each minute user is online. Cost/Hour is charged for each starting hour of online time.

Example:

Cost/Call   = 56
Cost/Min    = 2
Cost/Hour   = 100
Online time = 13 minutes
Total cost  = 56 + 2 * 13 + 100 = 182
@endnode

@node bcfg310 "Global: Numbers: Max. desc lines"
This is the maximum amount of lines user can use to describe a file in the file area (does not effect to file_id.diz or TICK import).

There is also a limitation of 4096 bytes (768 for PC-DOS version) for descriptions, which cannot be changed.
@endnode

@node bcfg311 "Global: Numbers: WhoDown size"
By default, BBBS will keep track of all uploads and downloads. Here you can specify how many entries will be saved. Users can view and scan this log with `f wd` command.

Entering zero here will disable this feature.
@endnode

@node bcfg312 "Global: Numbers: FAX error"
If there are new received faxes after a completed FAX session, BBBS exits with this errorlevel. Remember that you can also use the @{b}gotfax@{ub}-script.
@endnode

@node bcfg401 "Global: FidoNet: General: Site name"
This is your system's name that will be exchanged in EMSI with mailers that poll you, and that you poll. Usually your BBS name and the same as in Global: General: BBBS's name.
@endnode

@node bcfg402 "Global: FidoNet: General: Location"
Location of your system. Example: Turku, Finland. Will be exchanged in EMSI.
@endnode

@node bcfg403 "Global: FidoNet: General: Phone"
Telephone number of your system. Will be exchanged in EMSI.
@endnode

@node bcfg404 "Global: FidoNet: General: Speed"
Your maximum modem speed in bps. Will be exchanged in EMSI.
@endnode

@node bcfg405 "Global: FidoNet: General: Flags"
The nodelist flags that are valid for your site. Will be exchanged in EMSI. Example: CM,V32B,V42B,XX

   @{b}Action flags@{ub}
   @{b}============@{ub}
   @{i}CM@{ui}        Node accepts mail 24 hours a day
   @{i}MO@{ui}        Node is "mail only", no BBS.

   @{b}Modem feature flags@{ub}
   @{b}===================@{ub}
   @{i}V22@{ui}       ITU-T V22     1200 bps full duplex
   @{i}V32@{ui}       ITU-T V32     9600 bps full duplex
   @{i}V32B@{ui}      ITU-T V32bis 14400 bps full duplex
   @{i}V34@{ui}       ITU-T V34    28800 bps full duplex
   @{i}V42@{ui}       LAP-M error correction, also MNP 1-4
   @{i}V42B@{ui}      LAP-M error correction, also MNP 1-5
   @{i}MNP@{ui}       Microcom Networking Protocol error correction
   @{i}HST@{ui}       USR Courier HST
   @{i}H14@{ui}       USR Courier HST up to 14.4Kbps
   @{i}H16@{ui}       USR Courier HST up to 16.8Kbps
   @{i}V32T@{ui}      V.32 Terbo (includes  V.32Bis)
   @{i}VFC@{ui}       Rockwell V.Fast Class
   @{i}ZYX@{ui}       Zyxel 16.8/19.2 Kbps (includes V42B and V32B)

   @{b}Echomail flags@{ub}
   @{b}==============@{ub}

   |----------------------------------------------------------|
   |      |           Bark          |          WaZOO          |
   |      |-------------------------|-------------------------|
   |      |    File    |   Update   |    File    |   Update   |
   | Flag |  Requests  |  Requests  |  Requests  |  Requests  |
   |------|------------|------------|------------|------------|
   | XA   |     Yes    |     Yes    |     Yes    |     Yes    |
   | XB   |     Yes    |     Yes    |     Yes    |     No     |
   | XC   |     Yes    |     No     |     Yes    |     Yes    |
   | XP   |     Yes    |     Yes    |     No     |     No     |
   | XR   |     Yes    |     No     |     Yes    |     No     |
   | XW   |     No     |     No     |     Yes    |     No     |
   | XX   |     No     |     No     |     Yes    |     Yes    |
   |----------------------------------------------------------|

   If you have file requests enabled, the correct file request flag
   for BackDoor is @{b}XX@{ub}.

   @{b}Mailer open time flags@{ub} (if not 24h/day)
   @{b}======================@{ub}
   @{i}Txy@{ui}       (See 'xy' from the table below)

   @{i}NOTE!@{ui} All times are UTC-times (for example, Finland's summer time is
   three hours ahead of UTC)

   +------+----+ +------+----+ +------+----+ +------+----+ +------+----+
   | Char |Time| | Char |Time| | Char |Time| | Char |Time| | Char |Time|
   +------+----+ +------+----+ +------+----+ +------+----+ +------+----+
   |   A  |0000| |   F  |0500| |   K  |1000| |   P  |1500| |   U  |2000|
   |   a  |0030| |   f  |0530| |   k  |1030| |   p  |1530| |   u  |2030|
   |   B  |0100| |   G  |0600| |   L  |1100| |   Q  |1600| |   V  |2100|
   |   b  |0130| |   g  |0630| |   l  |1130| |   q  |1630| |   v  |2130|
   |   C  |0200| |   H  |0700| |   M  |1200| |   R  |1700| |   W  |2200|
   |   c  |0230| |   h  |0730| |   m  |1230| |   r  |1730| |   w  |2230|
   |   D  |0300| |   I  |0800| |   N  |1300| |   S  |1800| |   X  |2300|
   |   d  |0330| |   i  |0830| |   n  |1330| |   s  |1830| |   x  |2330|
   |   E  |0400| |   J  |0900| |   O  |1400| |   T  |1900| |      |    |
   |   e  |0430| |   j  |0930| |   o  |1430| |   t  |1930| |      |    |
   +------+----+ +------+----+ +------+----+ +------+----+ +------+----+

   For example, if a node has a T-flag "TsF", meaning that it is open
   18:30-05:00 UTC-time (that is 21:30-08:00 Finland's summer time).

   @{b}ISDN flags@{ub}
   @{b}==========@{ub}
   @{i}V110L@{ui}     ITU-T V.110 19k2 asynchronous
   @{i}V110H@{ui}     ITU-T V.110 38k4 asynchronous
   @{i}V120L@{ui}     ITU-T V.120 56k asynchronous
   @{i}V120H@{ui}     ITU-T V.120 64k asynchronous
   @{i}X75@{ui}       ITU-T X.75 single link procedure, 64kbit/s B-channel
   @{i}ISDN@{ui}      "Others". Should be used only if none of the above are
             correct.
@endnode

@node bcfg438 "Global: FidoNet: General: Show AKAs"
Show only # of first akas to remote. If you specify 99 here, all of your akas will be transmitted to remote in EMSI session (this should be used). Specifying zero will only send your matching aka to remote, no other akas. Using value of 3 will present remote your matching aka and akas 0-2.
@endnode

@node bcfg406 "Global: FidoNet: General: Nodenumbers"
Your nodenumbers, in 4D-format (zone:net/node.point). First nodenumber (#0) is your main address, others are AKAs (Also Known As).

Example: 2:22/222.0
@endnode

@node bcfg407 "Global: FidoNet: General: AKA Matching"
Match this AKA for following regexp nodenumbers.

Example:

^[1-6]:                 Will use this nodenumber with zones 1-6
^14:15[12]0/            Will use this nodenumber with zone 14 and nets
                        1510 and 1520.
@endnode

@node bcfg408 "Global: FidoNet: Sessions: Inbound"
Where your incoming FidoNet files are stored. BTICK will look for this directory for new files and move received files to right directory.
@endnode

@node bcfg409 "Global: FidoNet: Sessions: NetMail"
Your FTS-0001 format NetMail directory for file attaches.
@endnode

@node bcfg410 "Global: FidoNet: Sessions: Tickdir"
Where outgoing tick files are stored to be sent from your system. It is a good idea to use your (BOGUS's) outbound directory for these too.
@endnode

@node bcfg411 "Global: FidoNet: Sessions: Tranx node"
Tranx your clock with this node.
@endnode

@node bcfg413 "Global: FidoNet: Sessions: Rescan time"
This setting tells how often BBBS should check your Netmail-area for changes. Unit is minutes.
@endnode

@node bcfg414 "Global: FidoNet: Sessions: Mail errorlevel"
If there is new received mail after a completed mailsession, BBBS exits with this errorlevel. In addition to exiting, the @{b}gotmail@{ub}-script is always run when mail is received.

Entering 0 here disables this feature.
@endnode

@node bcfg436 "Global: FidoNet: Sessions: User mail errorlevel"
If user writes new message(s) to area(s) which are declared as 'FidoNet area' in the message area configuration, BBBS exits with this errorlevel after user logs off.

Entering 0 will disable this function.
@endnode

@node bcfg415 "Global: FidoNet: Sessions: HYDRA"
If checked, internal HYDRA protocol is enabled in EMSI mailsessions.
@endnode

@node bcfg416 "Global: FidoNet: Sessions: ZedZap"
If checked, internal ZedZap (ZModem variant) protocol is enabled in EMSI mailsessions.
@endnode

@node bcfg417 "Global: FidoNet: Sessions: Tranx toggle"
If enabled BBBS tries to Tranx your clock to time with system address configured in @{"Global: FidoNet: Sessions" link bcfg411}.
@endnode

@node bcfg418 "Global: FidoNet: Sessions: Mail from unlisted nodes"
If checked, accept mail also from nodes not listed on the nodelist.
@endnode

@node bcfg419 "Global: FidoNet: Sessions: Mail from unlisted points"
If checked, accept mail also from points not listed on the nodelist.
@endnode

@node bcfg420 "Global: FidoNet: Sessions: Mail from unprotected nodes"
Accept mail from nodes which doesn't have a session password specified.
@endnode

@node bcfg439 "Global: FidoNet: Sessions: Poll all crashmail"
Normally BackDoor will only poll crashmail originally from your akas. If you enable this option BackDoor will poll all messages having crash bit set.

If you enable this, everybody can route NetMails to you and thus force you to poll long distance calls.
@endnode

@node bcfg421 "Global: FidoNet: Origins"
BBBS will add origin line to echomail messages when exporting messages from BBBS with @{"BMSG" link SYS_CMDLINE_BMSG} or @{"BOGUS" link SYS_CMDLINE_BOGUS}. Origin line contains information about node where the message came from. You could e.g. place your BBS name here.

NOTE! Your nodenumber will be added automatically so DO NOT write it on the origin line. For example, if you specify "@{i}BCG-Box@{ui}" as your origin line, the last line added to your messages will look something like this "@{fg fill} * Origin: BCG-Box (2:22/222)@{fg text}".
@endnode

@node bcfg422 "Global: FidoNet: FREQ: Remote FREQ when answering"
When this option is enabled, remote systems can call you and request files from your system. Usually enabled.
@endnode

@node bcfg423 "Global: FidoNet: FREQ: Remote FREQ when calling"
When this option is enabled, remote system can request files from your system when you call them. Usually disabled.

NOTE! When you call, you also pay for the transfer. If you check this option, be sure you have some kind of limits set in FREQ configuration.
@endnode

@node bcfg424 "Global: FidoNet: FREQ: Maximum files"
The maximum number of files your system allows for one file request session.

Normal: Maximum number of files for normal nodes
Secure: Maximum number of files for password secured sessions
Points: Maximum number of files for points
@endnode

@node bcfg425 "Global: FidoNet: FREQ: Maximum 100 kB's"
The maximum number of 100 kilobytes your system allows for one file request session.

Normal: Maximum number of 100kB's for normal nodes
Secure: Maximum number of 100kB's for password secured sessions
Points: Maximum number of 100kB's for points
@endnode

@node bcfg426 "Global: FidoNet: FREQ: Maximum minutes"
The maximum number of minutes your system allows for one file request session.

Normal: Maximum number of minutes for normal nodes
Secure: Maximum number of minutes for password secured sessions
Points: Maximum number of minutes for points
@endnode

@node bcfg427 "Global: FidoNet: FREQ: Minimum baud"
The minimum baud rate to allow requests. If the current connection is at lower speed, requests will not be honored.

Normal: Minimum baud rate to allow requests for normal nodes
Secure: Minimum baud rate to allow requests for secured sessions
Points: Minimum baud rate to allow requests for points
@endnode

@node bcfg430 "Global: FidoNet: Dial: Delay when busy"
How long BBBS will wait before dialing again the number that was busy on the previous call. Unit is minutes.
@endnode

@node bcfg431 "Global: FidoNet: Dial: Number of tries when busy"
How many times BBBS will try to dial and get connect to a specific number before giving up, when the node is busy.

NOTE! It's not good for your health to specify a HIGH number here. Good value is 30. It tries 30 times before giving up.
@endnode

@node bcfg470 "Global: FidoNet: Dial: Number of tries when bad"
How many times BBBS will try to dial and get connect to a specific number before giving up, when there was some kind of error (carrier lost or such problems).

NOTE! It's not good for your health to specify a LOW number here. Good value is 3. It tries 3 times before giving up.
@endnode

@node bcfg432 "Global: FidoNet: Dial: Convert from"
Convert phonenumbers from. See example below:

    Convert from                  Convert to
 0:                            -> 990-
    : Adds 990- string to before every phonenumber.
    : 358-2-2404036 will be translated to 990-358-2-2404036
 1: 990-358-                   -> 0
    : Converts 990-358- string to 0
    : 990-358-2-2404036 will be translated to 02-2404036
 2: 02-                        ->
    : Takes 02- string away
    : 02-2404036 will be translated to 2404036
@endnode

@node bcfg433 "Global: FidoNet: Dial: Convert to"
Convert phonenumbers to. See example below:

    Convert from                  Convert to
 0:                            -> 990-
    : Adds 990- string to before every phonenumber.
    : 358-2-2404036 will be translated to 990-358-2-2404036
 1: 990-358-                   -> 0
    : Converts 990-358- string to 0
    : 990-358-2-2404036 will be translated to 02-2404036
 2: 02-                        ->
    : Takes 02- string away
    : 02-2404036 will be translated to 2404036
@endnode

@node bcfg434 "Global: FidoNet: FREQ: Magic files"
Path to the "magic" file list. In it you can enter magic names that can be used when remote system is requesting files. Most of the systems have magic file called "files" (your filelist) and "about" (generic info about your system). If the file name begins with a '@'-character, then a script file name should be written after it. This script will be run, when a file with it's magic name is FREQ'd.

--- magic.lst begin ---
files   c:/bbs/files/bcgbox.fil
about   c:/bbs/bcgbox.txt
bbbs    d:/pub/bbbs/bbbs_d.lzh d:/pub/bbbs/bbbs_gen.lzh
secret  @script
--- magic.lst end ---
@endnode

@node bcfg435 "Global: FidoNet: FREQ: Normal dirs"
Path to normal directory list in which you can enter directories that remote systems can request files from. Your file areas are scanned automatically first.

--- normdir.lst begin ---
c:/bbs/files/
d:/pub/
d:/pub/bbbs/
d:/pub/txt/faq/
e:/tmp/
--- normdir.lst end ---
@endnode

@node bcfg501 "Global: Conferences: Total"
Total number of conferences in your system.
@endnode

@node bcfg502 "Global: Conferences: Post"
Areanumber for your post conference. Messages entered with @{b}COMment@{ub} command are stored here. This is @{b}not@{ub} your NetMail area.
@endnode

@node bcfg503 "Global: Conferences: Resume"
Areanumber for your resume conference (the conference where users can write information about themselves). The command in BBBS is @{b}`U RES'@{ub}.

65535 = disabled
@endnode

@node bcfg504 "Global: Conferences: Fileinfo"
Areanumber for your fileinfo conference (the conference where information of the uploaded files will be written).

65535 = disabled
@endnode

@node bcfg505 "Global: Conferences: Name"
Name of current conference. Some more-or-less standard names are "News" for news from SysOp to users, "Post Office" (or Post) for private messages, "NetMail" for private FidoNet messages, "Users" (or Resume) for users resumes, "Fileinfo" for fileinfo messages, etc.

By pressing @{i}F5@{ui} you can add multiple conferences at one batch from fidonet.na type text file.

By pressing @{i}F6@{ui} BCFG4 will automatically check your badecho directory for new conferences.
@endnode

@node bcfg506 "Global: Conferences: Description"
Conference description, users will see this description when joining to conferences with the @{b}JOIN@{ub} command.

For example:

@{fg fill}BBBS.Chat@{fg text}                        BBBS support echo, Finnish
@{fg fill}BBBS.English@{fg text}                     BBBS support echo, English
@endnode

@node bcfg507 "Global: Conferences: *.MSG path"
Path to FTS-0001 format (MSG) messages.

When exporting messages, BMSG places messages in this directory. After export you should run your message tosser (e.g. @{i}GEcho@{ui}) in SCAN mode. Tosser scans your message areas for new messages and creates outbound mail packets. When your tosser has performed the operation you can remove all files from this directory.
@endnode

@node bcfg508 "Global: Conferences: NNTP"
These should be empty (zero) if you are not polling messages from NNTP hosts.

Name is the real name of this newsgroup in NNTP server. Host number is NNTP server number, given in BNNTP command line.

Newsgroup name "-" defaults to the name of the conference.

For email conference set newsgroup name to "-" and toggle postarea flag on.
@endnode

@node bcfg509 "Global: Conferences: Msg scan"
When user joins to a new conference there are usually lots of unread messages. This option is used to limit the first time new message scan. E.g. you have 600 messages in the general chat area and a new user joins that area. Now you could have been specified that only 50 newest messages are scanned automatically.
@endnode

@node bcfg510 "Global: Conferences: Nodenumber"
Which nodenumber is used, if this conference is linked to some sort of a FidoNet. Nodenumbers can be specified in @{i}Global:FidoNet@{ui} part of the configuration.

With local message areas you don't need to set up this option correctly!

You can press @{i}F3@{ui} to see/edit your nodenumbers.
@endnode

@node bcfg511 "Global: Conferences: Origin"
Origin line used in this conference.

You can press @{i}F4@{ui} to see/edit your origin lines.
@endnode

@node bcfg512 "Global: Conferences: Moderator"
If this conference is premoderated, you should specify moderator's FidoNet address here. If it's not moderated, use 0:0/0.0 in this field.

BBBS uses @{i}PISKI@{ui} moderating. The message is saved as public message to conference, but when sending it to other FidoNet nodes, it is moved to NetMail as a private message to moderator's node. It's moderators job to move it again to conference or delete the message.

Usually you should just use "0:0/0.0" here. Use "2:22/222.0" in BBBS.SYSOP.
@endnode

@node bcfg513 "Global: Conferences: BPC min"
Minimum amount of messages for BPC.

When your conference reaches to total BPC_max messages old messages are deleted so that there will be BPC_min messages left.

Let's take couple of examples:

@{b}# messages   BPC_min   BPC_max    Action@{ub}
@{b}========================================================================@{ub}
   @{b}  0@{ub}         @{i}100       200@{ui}      Nothing happens
   @{b} 50@{ub}         @{i}100       200@{ui}      Nothing happens
   @{b}100@{ub}         @{i}100       200@{ui}      Nothing happens
   @{b}150@{ub}         @{i}100       200@{ui}      Nothing happens
   @{b}200@{ub}         @{i}100       200@{ui}      Nothing happens
   @{b}250@{ub}         @{i}100       200@{ui}      Conf. is packed, 100 messages are left
   @{b}300@{ub}         @{i}100       200@{ui}      Conf. is packed, 100 messages are left
@endnode

@node bcfg514 "Global: Conferences: BPC max"
Maximum amount of messages for BPC.

@{b}See Also@{ub}: @{"BPC min" link bcfg513}
@endnode

@node bcfg515 "Global: Conferences: Must for all"
Don't allow users to resign.
@endnode

@node bcfg516 "Global: Conferences: Invite users"
Make new user member of this conference automatically on his first call.
@endnode

@node bcfg517 "Global: Conferences: Post conf."
Post only conference. Enable for your Post, NetMail and EMail areas.
@endnode

@node bcfg518 "Global: Conferences: Allow private"
Allow both public and private messages.
@endnode

@node bcfg519 "Global: Conferences: No reply"
Do not allow replies in this conference.
@endnode

@node bcfg520 "Global: Conferences: No mark reset"
If enabled, user won't be able to mark messages as read on this area, he/she has to read them all.
@endnode

@node bcfg521 "Global: Conferences: Fido area"
Enable this to force BBBS handle this area as FidoNet area.
@endnode

@node bcfg550 "Global: Conferences: AGNET area"
Enable this to cause this conference to function as an @{"AGNET" link CFG_EXTERNAL_NET_AGNET} area.
@endnode

@node bcfg522 "Global: Conferences: No Fido strip"
With BOGUS this will record SEEN-BY and PATH lines as kludges of the message. You can use normal "u set" command to view kludges.

With BMSG this will record all the kludges and SEEN-BY's as visible lines of the message.
@endnode

@node bcfg524 "Global: Conferences: AllFix"
Enables BBBS to answer incoming AllFix-requests in this conference. Currently local requests are ignored.

@{b}Do not enable this on your NetMail area!@{ub}

AllFix request is a simple way to find a specific file(s) from remote systems by using wildcards or keyscan. The structure of a message to AllFix is very simple. The message must be addressed to AllFix. The subject line must contain a list of file specifications or keywords. Keywords must be enclosed within double quotes and/or started with dash character. You can put more than one word within the quotes.

For example, in the following message, Super Luser is looking for the latest version of BBBS and a help file.

@{b}-----------------------------------------------------@{ub}
@{fg filltext}AllFix-area message #42 from @{fg text}@{b}SUPER LUSER@{ub}@{fg filltext} to @{fg text}@{b}ALLFIX@{ub}@{fg filltext}.@{fg text}
@{fg filltext}   Entered on 18th November, 1993 at 12:41, 1 lines.@{fg text}

@{fg highlight}Subject: bbbs* "help file"@{fg text}
@{fg highlight}==========================@{fg text}

@{fg fill}Just looking for...@{fg text}
@{b}-----------------------------------------------------@{ub}

The message text (body) is ignored. BBBS recognizes messages addressed to @{i}ALLFIX@{ui}, @{i}BROBOCOP@{ui}, @{i}FILEMGR@{ui} and @{i}ARCHIE@{ui}.

Please note that when user is looking for file @{b}snip*@{ub} and keyword @{b}snip@{ub}, the same file will be reported twice.

To disable AllFix scan for certain file directory use "@r:all" flag in the filedir* file. AllFix does not belong to the "all" group!

If you enable both AllFix and NameFix in the same area and BBBS receives a message addressed to BRoboCop, both files and users are checked.

@{b}See Also@{ub}: @{"NameFix" link bcfg525}
@endnode

@node bcfg525 "Global: Conferences: NameFix"
Enables BBBS to answer incoming NameFix-requests in this conference. Currently local requests are ignored.

@{b}Do not enable this on your NetMail area!@{ub}

NameFix request is a simple way to find a specific user from remote systems. The structure of a message to NameFix is very simple. The message must be addressed to NameFix. The subject line must contain name of the user you are looking for.

For example, in the following message, Super Luser is looking for user called Test User.

@{b}-----------------------------------------------------@{ub}
@{fg filltext}NameFix-area message #42 from @{fg text}@{b}SUPER LUSER@{ub}@{fg filltext} to @{fg text}@{b}NAMEFIX@{ub}@{fg filltext}.@{fg text}
@{fg filltext}   Entered on 18th November, 1993 at 12:41, 1 lines.@{fg text}

@{fg highlight}Subject: Test User@{fg text}
@{fg highlight}==================@{fg text}

@{fg fill}Where is she?@{fg text}
@{b}-----------------------------------------------------@{ub}

The message text (body) is ignored. BBBS recognizes messages addressed to @{i}NAMEFIX@{ui}, @{i}BROBOCOP@{ui}, @{i}WHOIS@{ui} and @{i}FINGER@{ui}.

If you enable both AllFix and NameFix in the same area and BBBS receives a message addressed to BRoboCop, both files and users are checked.

@{b}See Also@{ub}: @{"AllFix" link bcfg524}
@endnode

@node bcfg528 "Global: Conferences: Alias allowed"
Allow users to write message with alias names. The command in BBBS to set an alias is @{b}`U SET ALIAS'@{ub}.
@endnode

@node bcfg526 "Global: Conferences: Import"
Charset used when importing msg-files to BBBS. Usually this might be ISO (ISO Latin-1), IBM or your national charset (SF7 for Finland, NO7 for Norway).

You can use hotkeys 1234567890+ to select, or toggle with space.
@endnode

@node bcfg527 "Global: Conferences: Export"
Charset used when exporting msg-files from BBBS. Usually this might be ISO (ISO Latin-1), IBM or your national charset (SF7 for Finland, NO7 for Norway).

You can use hotkeys 1234567890+ to select, or toggle with space.
@endnode

@node bcfg540 "Global: Conferences: Fido name"
Network name of the conference. "-" if same as the real name.
@endnode

@node bcfg541 "Global: Conferences: Fido export"
Nodenumbers where this area will be exported.
@endnode

@node bcfg542 "Global: Conferences: Fido group"
The one character group for this conference.
@endnode

@node bcfg543 "Global: Conferences: Fido flags"
Flags for this area:

        S       Secure
        V       Visible
        D       No dupe check
        >       Export only
        <       Import only
@endnode

@node bcfg529 "Global: Conferences: Multiadd: Listfile"
Full filename to fidonet.na type text file with conference names and descriptions. Press @{i}ESC@{ui} to start updating.

Adding many conferences can take @{i}several@{ui} minutes. Patience is a virtue.
@endnode

@node bcfg530 "Global: Conferences: Multiadd: Prefix"
Prefix string to be added to conference names.
@endnode

@node bcfg601 "Local: General: Logfile"
All kinds of information about user's activities are written to this file. For example, connection speed, login time and date, downloaded files, written messages, time used and so on. Here is example of one visit:

02:42 --------------------------
02:42 CONNECT 14400
02:42 1st January, 1994
02:42 Login: SUPER LUSER
02:42 Invited: Flame
02:48 Marketplace message 17 entered
02:49 Joined: LV/Markkinat
02:50 LV/Markkinat message 984 entered
02:57 New files checked
02:57 Logout: SUPER LUSER
02:57  * Messages dumped:  0
02:57  * Messages read:    31
02:57  * Messages entered: 2
02:57  * Time used today:  15
@endnode

@node bcfg602 "Local: General: Login.Log"
You can leave this entry empty.

You may use a separate logfile to log user logins and logouts. User address, Phone number, Times On and Last On -information is also written to this file.
@endnode

@node bcfg4000 "Local: General: Spy file"
You should leave this entry empty.

If you want to keep very detailed logfile of your users actions you can specify a filename here. All the commands user enters are logged here. Please note that this will slow the system down a bit. See also "q spy" command.
@endnode

@node bcfg603 "Local: General: FD's DOBBS.BAT"
If you want to use BBBS's internal answer mode this field MUST be left empty.

Here you can specify path to FrontDoor style DOBBS.BAT file. When user logs in, BBBS looks this file for user's baud rate and some other information.

Please note, that BBBS can read only FrontDoor v2.02's DOBBS.BAT. Other versions write different file, which will not be processed correctly.

If filename is specified, it should contain one line in following format:

@{b}x s x n i@{ub}

x = anything, may not contain spaces
s = connect speed
n = time for next event, or "x", if not specified
i = other connection information from modem (may contain spaces)

Example: x 14400 x 720 /ARQ/V32/LAPM/V42BIS/Caller ID=1234567
@endnode

@node bcfg604 "Local: General: Grab directory"
Temporary grabfiles are stored here.

@{b}MUST BE EMPTY DIRECTORY!@{ub}
@endnode

@node bcfg605 "Local: General: Menus directory"
Local menus for this node are here. You can have common menus for all nodes with @{i}global menu directory@{ui} setting.

BBBS will first look this directory for menus and if the menu file is not found here the common menu directory will be searched. Some files, like global bulletins are only looked from common menu directory.
@endnode

@node bcfg606 "Local: General: Uptemp directory"
Uploads are @{b}temporarily@{ub} stored here. After user has described uploaded files, they are moved to the upload directory (defined in Global: General: Upload directory).

@{b}MUST BE EMPTY DIRECTORY!@{ub}
@endnode

@node bcfg607 "Local: General: Min. login baud"
If you wish, you may specify a minimum speed for callers so as to lock out users using slower modems from this particular node. If you leave the option set at zero all users will be allowed to connect.
@endnode

@node bcfg608 "Local: General: Nodemsg poll rate"
How often to poll nodemessages. Smaller values are faster. One unit is about two seconds.
@endnode

@node bcfg609 "Local: General: Blackout timer"
Blank screen when blackout timer (in minutes) has expired with no activity on internal answer mode. Use 0 to disable.
@endnode

@node bcfg610 "Local: General: Local screen echo"
Normally you can see exactly what is happening when a remote user is logged in. This can use quite a bit of resources on a loaded system, and if you don't really need to see what is going on then you can use this option to tell the system not to update the local screen while remote users are using the system.

You can toggle the local screen echo back on at any time by pressing the @{i}F10@{ui} key for the rest of the current user session. You can also press @{i}Alt-E@{ui} to turn it on/off temporarily.
@endnode

@node bcfg611 "Local: General: Save screen on shell"
Restore original screen after external program.
@endnode

@node bcfg612 "Local: General: Audio bell"
Enables local audio bell. If bell is disabled, you won't hear if someone is yelling you.
@endnode

@node bcfg613 "Local: General: Local SysOp keys"
Allow all local users to use local sysop keys. If turned off then the user for example cannot use the sysop local-keys to give temporary sysop privileges to the user logged in. This might be useful if you are running a local system in order to prevent the users from giving themselves sysop rights or change the time limit. You can see help for the keys by pressing shift-F10. You can use F10 to get information about the caller for the node.
@endnode

@node bcfg614 "Local: General: Sleep disconnect"
Users who are logged into the system have to type something to keep the system alive. If it looks as they have fallen asleep then we just hangup on them. The sleep disconnect is the time in minutes we wait. Set it to zero to disable this feature.

Values are not exactly correct maximum idle times, for example value 4 means the system waits from minimum 3 to maximum 4 minutes before hangup.

Remember also that before sleep disconnect, the @{b}snooze@{ub}-script is run.
@endnode

@node bcfg615 "Local: General: Send crashmail"
Enables crashmail polling for this node. All crash mail will be sent immediately.
@endnode

@node bcfg616 "Local: General: BackDoor"
Enables BBBS's internal FidoNet mailer, BackDoor, for this node. Normal human callers will not notice anything if enabled. Must be enabled for allowing other BBSes to transfer mail and files with you.
@endnode

@node bcfg617 "Local: General: FAX baud"
New baud rate when receiving FAXes. Some modems want it to be 19200, ZyXEL and Nokia do not. If no change is required, use 0.
@endnode

@node bcfg619 "Local: General: Lockup password"
The password that has to be entered before any of the local sysop keys can be used. Local sysop keys will be locked when the @{"lockup timeout" link bcfg620} expires.
@endnode

@node bcfg620 "Local: General: Lockup timeout"
The time that has to pass before the local sysop keys are locked with the @{"lockup password" link bcfg619}. Units are seconds in the range 1-65500. Using value 0 here disables the locking of the sysop keys.
@endnode

@node bcfg1804 "Local: General: Slow protocols"
Normally this option is off.

When turned on, BBBS will use Slow-HYDRA and Slow-Zmodem instead of HYDRA and Zmodem in EMSI sessions of this node. Slow versions should be used on non-8bit links (as telnet nodes).
@endnode

@node bcfg618 "Local: General: Poll flags"
BackDoor will not poll crashmail to nodes whose nodelist entry matches "don't poll" regexp and will poll only to nodes whose nodelist entry matches "ok poll" regexp. These options should be used on multinode systems to make sure BackDoor will use your modemx to poll remotes modemx and your modemy on another node to poll remotes modemy. You can also use this option to hold all outgoing mail to certain systems or systems who only have V22 modem.
@endnode

@node bcfg1813 "Local: General: Revbits"
Some fax modems use reversed bit order in send and/or receive. For most modems these options should be off (direct bit order), ZyXEL uses direct for receive and reversed for send, USR Sportster uses reversed for both.

See also AT+FBOR (Class 2) and AT+FBO (Class 2.0) commands from your modem's manual.
@endnode

@node bcfg701 "Local: Modem: Init string"
String(s) to be sent for the modem upon initializing.

Here is couple of examples for different modems:

@{b}Modem:          Init-1                    Init-2@{ub}
@{b}========================================================================@{ub}
@{i}Asta 2400E@{ui}      @{b}ATZ|                      ATM0E0|@{ub}
@{i}GVC@{ui}             @{b}ATZ|                      ATM0E0|@{ub}
@{i}Nokia ECM FAST@{ui}  @{b}ATZ|@{ub}
@{i}Supra 14400@{ui}     @{b}AT&F2M0E0S95=45W2|@{ub}
@{i}Supra 2400@{ui}      @{b}ATZ|                      ATM0E0X3|@{ub}
@{i}USR V.34@{ui}        @{b}AT&F1S0=0M0X4E0|@{ub}
@{i}Zoom@{ui}            @{b}ATZ|                      AT%E2M0E0|@{ub}
@{i}ZyXEL@{ui}           @{b}AT&F2M0E0|@{ub}


Following meta-chars are available:

@{b}|@{ub}      Enter, Cr, ^M
@{b}<@{ub}      Lower DTR (hangup)
@{b}>@{ub}      Raise DTR
@{b}~@{ub}      0.5s delay

If you want to be able to receive FAXes, you must turn on your modem's adaptive answer. Here is couple of examples:

Nokia ECM FAST:  AT+FCLASS=2+FCLASS=0+FLID="fax_id"|
                 AT+FAA=1|
Supra 14400:     AT+FCLASS=0;+FAA=1;+FCR=1;+FDCC=1,5,0,2,0,0,0,0|
                 AT+FLID="fax_id";&K3|
USR V.34:        Init1: AT+FCLASS=2.0|
                 Init2: AT+FLI="fax_id"+FBO=1+FNR=1,1,1|
                 BTERM Init: AT+FCLASS=0|
                 Answer: ATS2=255+FAA=1;A|
ZyXEL:           AT#B0#V1#T0#L2+FLID=fax_id|
                 AT+FCLASS=0|
Terton ET:       Init1: ATZ|
                 Init2: AT+FCLASS=1;+FCLASS=0;+FLID="fax_id"|
                 Answer: ATS2=255+FAA=1;A|
Generic:         AT+FCLASS=0;+FCR=1;+FDCC=1,5|
Generic answer:  AT+FAA=1;A|

BBBS requires line speed (DCE) in CONNECT-response from your modem, not the speed between your computer and your modem (DTE).
@endnode

@node bcfg715 "Local: Modem: BTERM init string"
String(s) to be sent for the modem when entering BTERM.

Following meta-chars are available:

@{b}|@{ub}      Enter, Cr, ^M
@{b}<@{ub}      Lower DTR (hangup)
@{b}>@{ub}      Raise DTR
@{b}~@{ub}      0.5s delay

For all modems, there should be the command @{b}ATS5=127@{ub} in this field to change
the del character from Ctrl-H to del, which is correct for BTERM.
@endnode

@node bcfg702 "Local: Modem: Hangup string"
String to sent for the modem to hang up the phone.

Following meta-chars are available:

@{b}|@{ub}      Enter, Cr, ^M
@{b}<@{ub}      Lower DTR (hangup)
@{b}>@{ub}      Raise DTR
@{b}~@{ub}      0.5s delay
@endnode

@node bcfg703 "Local: Modem: Busy string"
String to sent for the modem to make line busy.

Following meta-chars are available:

@{b}|@{ub}      Enter, Cr, ^M
@{b}<@{ub}      Lower DTR (hangup)
@{b}>@{ub}      Raise DTR
@{b}~@{ub}      0.5s delay
@endnode

@node bcfg704 "Local: Modem: Answer string"
When a caller has dialed in the modem should send the text "RING" to the system. When the system sees this it will tell the modem to answer the phone. The modem answer string does this, usually with "ATS2=255A".

If you enable voice-options, you could use:

ZyXEL: AT+FCLASS=8;S2=255A|
Rockwell: AT#CLS=8;S2=255A|

Following meta-chars are available:

@{b}|@{ub}      Enter, Cr, ^M
@{b}<@{ub}      Lower DTR (hangup)
@{b}>@{ub}      Raise DTR
@{b}~@{ub}      0.5s delay
@endnode

@node bcfg739 "Local: Modem: Aftercall string"
This string is sent to the modem after caller has disconnected. It can be used for debugging purposes. Usually you don't want to use this, but if you do, remember to specify aftercall lines too. For example ZyXEL supports "ATI2" which will dump line info to screen.

Following meta-chars are available:

@{b}|@{ub}      Enter, Cr, ^M
@{b}<@{ub}      Lower DTR (hangup)
@{b}>@{ub}      Raise DTR
@{b}~@{ub}      0.5s delay
@endnode

@node bcfg740 "Local: Modem: Aftercall lines"
BBBS will log this many lines after aftercall string. There is also 5s timeout.
@endnode

@node bcfg705 "Local: Modem: Start baud"
Initialize modem with this baud rate. Usually the maximum baud rate your modem can handle.

This is not the maximum baud rate your modem can transfer data with another modem (like 14400 bps, DCE speed), but the maximum baud rate your modem and and your computer can talk (like 38400 or 57600 bps, DTE speed).

BBBS/D supports only baud rates up to 115200.

In BBBS/L you should also give "setserial /dev/ttyS? spd_vhi" command for correct tty before starting BBBS.
@endnode

@node bcfg706 "Local: Modem: Base address"
Base address (port) for your comport entered as a hexadecimal number.

The default comport setup is (you can specify different, of course):

        @{b}Port   Base  IRQ@{ub}
        @{b}================@{ub}
        COM1   03f8    4
        COM2   02f8    3
        COM3   03e8    4
        COM4   02e8    3

This option is used only in BBBS/D.
@endnode

@node bcfg707 "Local: Modem: IRQ"
IRQ for your comport.

The default comport setup is (you can specify different, of course):

        @{b}Port   Base  IRQ@{ub}
        @{b}================@{ub}
        COM1   03f8    4
        COM2   02f8    3
        COM3   03e8    4
        COM4   02e8    3

This option is used only in BBBS/D.
@endnode

@node bcfg708 "Local: Modem: Ring count"
Answer to @{i}count@{ui}th call, usually 1. If you want the caller id information to be recorded this must be set to 2.
@endnode

@node bcfg730 "Local: Modem: Ringing count"
Remote is considered as down after this many number of RINGING messages.
@endnode

@node bcfg709 "Local: Modem: Reset to connect speed"
If you want to run at constant speed between your modem and the computer (and have set the modem up correctly) you must turn off this option (and most probably RTS/CTS handshake on to ensure that data is not lost).
@endnode

@node bcfg710 "Local: Modem: Hangup at logout"
Hang up the phone after user logs off.
@endnode

@node bcfg711 "Local: Modem: NS16550 FIFO buffer"
Enables NS16550 FIFO buffering. If you don't know what it is, don't.
@endnode

@node bcfg712 "Local: Modem: RTS/CTS handshake"
RTS/CTS handshake is used in certain cases to ensure that the modem does not feed BBBS faster than it can handle, or more likely, especially when using a constant speed interface, that BBBS does not feed the modem faster than it can handle. If you are using speed reseted to connect speed you probably don't need handshaking.
@endnode

@node bcfg713 "Local: Modem: Null modem login"
If this node is connected to other computer via null-modem cable, you can enable this option to allow users to log in by just pressing enter.

Normally this option should be disabled.
@endnode

@node bcfg716 "Local: Modem: No carrier check"
Don't check carrier while user is logged in. If you enable this, BBBS does not notice if user hang ups. You should only use it for null modem nodes and if your modem does not present DCD pin correctly.
@endnode

@node bcfg717 "Local: Modem: NO CARRIER is BUSY"
If your modem does not detect BUSY signal correctly turn this option on. If turned off, NO CARRIER means error in mail sessions.
@endnode

@node bcfg714 "Local: Modem: Fast FAX"
Enable this option if you have a FAXmodem with "fast" negation, ie. ignores "FAX" result and waits for "+FCON". Most V.34 modems should use this option, for example Nokia ECM FAST requires it.
@endnode

@node bcfg801 "Local: Macros: Keyboard Macros"
Macro for local key Alt-\{num\}.

You can use caret to simulate control-keys and run script. For example:

@{b}^M@{ub}             Enter
@{b}^^@{ub}             Caret
@{b}^\@script\@@{ub}      Run script called "script"
@endnode

@node bcfg802 "Local: Macros: Hotlogins"
Hot string logins can be used to identify mail sessions not supported by BBBS. When hotlogin string is received from modem at login state, the hotlog-script is run with string number as a parameter. You should use long enough hotlogin string for users not to type them by accident.
@endnode

@node bcfg901 "Local: Rush Hour: Rush Hour Timelimits"
If you have a very busy system, then you may wish to limit the amount of time users are permitted to use the system at certain times during the day. This section allows you to set the maximum time a user will be allowed to use the system, depending upon what time they logged in. Users who have less time left than is specified here will of course only be allowed the actual time they have left. For periods during the day where you don't want an extra time limit to apply, just enter a zero.
@endnode

@node bcfg1001 "Local: Events: Sunday"
Run this event on Sunday.
@endnode

@node bcfg1002 "Local: Events: Monday"
Run this event on Monday.
@endnode

@node bcfg1003 "Local: Events: Tuesday"
Run this event on Tuesday.
@endnode

@node bcfg1004 "Local: Events: Wednesday"
Run this event on Wednesday.
@endnode

@node bcfg1005 "Local: Events: Thursday"
Run this event on Thursday.
@endnode

@node bcfg1006 "Local: Events: Friday"
Run this event on Friday.
@endnode

@node bcfg1007 "Local: Events: Saturday"
Run this event on Saturday.
@endnode

@node bcfg1008 "Local: Events: Start hour"
The start hour for this event.

@{b}See Also@{ub}: @{"Dial-event" link bcfg1016}
@endnode

@node bcfg1009 "Local: Events: Start min"
The start minute for this event.

@{b}See Also@{ub}: @{"Dial-event" link bcfg1016}
@endnode

@node bcfg1010 "Local: Events: End hour"
The end hour for this event. Event may not cross day boundary!

@{b}See Also@{ub}: @{"Dial-event" link bcfg1016}
@endnode

@node bcfg1011 "Local: Events: End min"
The end minute for this event.

@{b}See Also@{ub}: @{"Dial-event" link bcfg1016}
@endnode

@node bcfg1012 "Local: Events: Errorlevel"
Shell to OS with this errorlevel. BBBS does not start any BATch file itself, you should start BBBS from BATch and check these errorlevels.

@{b}0@{ub}       Don't shell

@{b}See Also@{ub}: @{"Dial-event" link bcfg1016}
@endnode

@node bcfg1013 "Local: Events: Don't allow users during event"
Don't allow users to log in when this event in running.
@endnode

@node bcfg1014 "Local: Events: Flexible even"
Event can "slide" if users logs in.
@endnode

@node bcfg1015 "Local: Events: Event is a 'must'"
Force event to be run once a day, even if the time has already elapsed.
@endnode

@node bcfg1017 "Local: Events: Don't allow incoming mail calls"
Don't allow remote systems to call you and send mail to you during the event.
@endnode

@node bcfg1018 "Local: Events: Don't allow mail pickup"
Send remote's mail to them when they call you during this event. If you enable this and allow incoming mail calls, system is in receive only mode.
@endnode

@node bcfg1019 "Local: Events: Don't send crashmail to CM systems"
Don't try to poll crashmail to CM systems during this event.
@endnode

@node bcfg1020 "Local: Events: Send crashmail to all systems"
Try to poll crashmail to all systems during this event.
@endnode

@node bcfg1021 "Local: Events: Don't allow file requests"
Don't allow remote systems to requests files from you during this event.
@endnode

@node bcfg1016 "Local: Events: Dial to node"
Dials to this node in this event.

Don't use overlapped events. You can define both Dial to node and Errorlevel for one event. First BBBS exits with errorlevel and then dials.

First BBBS tries to run event #1, then #2, and so on... While (dial)event is running, other events can force exit with errorlevel, but not polling (except if new event has smaller number than current event).
@endnode

@node bcfg1100 "Local: OS: OS/2 Priority"
BBBS/2 can change it's priority according the activities of user. Here you can specify priorities for different places in BBBS.

@{b}Name             Activity                             Default@{ub}
@{b}========================================================================@{ub}
Modem thread     Routine handling comport activity    FOREGROUNDSERVER 0
Protocols        Upload and download                  FOREGROUNDSERVER 0
Arcers, grab     (Un)Packing files and grabbing       REGULAR 0
Message search   Mark and Search menus                REGULAR 0
File search      Keyword, Wildcard, New files         REGULAR 0
List search      Jargon, Nodelist browser, Whodown    REGULAR 0
Idle             Waiting for a caller                 REGULAR 0
Normal           All others                           REGULAR 0

The value you should type in can be calculated as following:

@{b}value@{ub} = @{i}class * 64 + delta + 32@{ui},

where @{i}delta@{ui} is a number between -31 .. 31 and class is one the followings:

0 = IDLETIME
1 = REGULAR
2 = TIMECRITICAL
3 = FOREGROUNDSERVER

For example, if you want to specify priority TIMECRITICAL 16, the value is 2 * 64 + 16 + 32 = 176.

Windows NT users should use the @{"NT priority" link bcfg1108}-field insted.
@endnode

@node bcfg1108 "Local: OS: NT Priority"
BBBS/NT can change it's priority according the activities of user. Here you can specify priorities for different places in BBBS.

@{b}Name             Activity                             Default@{ub}
@{b}========================================================================@{ub}
Modem thread     Routine handling comport activity    HIGHEST
Protocols        Upload and download                  HIGHEST
Arcers, grab     (Un)Packing files and grabbing       NORMAL
Message search   Mark and Search menus                NORMAL
File search      Keyword, Wildcard, New files         NORMAL
List search      Jargon, Nodelist browser, Whodown    NORMAL
Idle             Waiting for a caller                 NORMAL
Normal           All others                           NORMAL

The value you should type in can be calculated as following:

@{b}value@{ub} = @{i}delta + 15@{ui},

where @{i}delta@{ui} is a number between -15 .. 15.

-15 = IDLE
 -2 = LOWEST
 -1 = BELOW_NORMAL
  0 = NORMAL
  1 = ABOVE_NORMAL
  2 = HIGHEST
 15 = TIME_CRITICAL

For example, if you want to specify priority NORMAL, the value is 0 + 15 = 15.

OS/2 users should use the @{"OS/2 priority" link bcfg1100}-field insted.
@endnode

@node bcfg1101 "Local: OS: Show shell output"
If this toggle is on, BBBS will redirect outputs of external (un)packers to user. BBBS can redirect only stdout and stderr streams, not direct screen writes.
@endnode

@node bcfg1102 "Local: OS: Allow break in shell"
If this toggle is on, BBBS will check carrier and monitors incoming characters while spawning to the external (un)packer. If carrier is drop or C-c pressed, BBBS tries to abort (un)packer.
@endnode

@node bcfg1103 "Local: OS: Buffered output"
This setting should be disabled.

If you have DigiBoard or other similar serial communication device with braindead driver with very small buffers you should turn this option on.
@endnode

@node bcfg1104 "Local: OS: Rockwell modem"
Some Rockwell chipset based modems have very poor performance on full duplex high speed transfers, like with HYDRA. If your modem is Rockwell based (like Best or Well), you should turn this option on.

This option will slow down BBBS's modem routines and add echo delay (not very notable, though). If you are sure your modem doesn't need it, turn this option off.
@endnode

@node bcfg1107 "Local: OS: Fix RAR's 'feature'"
The packing program @{b}RAR@{ub} has an evil feature: it always displays its header (containing registeration info) and the absolute directories of the archives it processes. This is a major security issue. You should enable this option, if you are using RAR. It will disable packer output for the packer number 7 defined in @{b}external.bbb@{ub}.
@endnode

@node bcfg1105 "Global: General: Organization"
This can be empty if you are not sending messages to NNTP/SMTP hosts.

This is one line organization name included to outgoing NNTP/SMTP message header. Usually it tells the name of your BBBS.
@endnode

@node bcfg1106 "Global: General: Hostname"
This can be empty if you are not sending messages to NNTP/SMTP hosts.

This is your computers InterNet hostname. Outgoing NNTP/SMTP messages are addressed from User.Name\@hostname.
@endnode

@node bcfg3010 "Global: General: Remote domain"
This can be empty if you are not sending messages to NNTP/SMTP hosts or if you are not NNTP/SMTP gateway.

This is a format string for remote user names for messages sent via your gateway system. BBBS can recognize following incoming addresses:

        %d\@p%p.f%f.n%n.z%z.fidonet.org
        %d!%z.%n.%f.%p\@myhost.mynet.myorg

Metastrings:

        %%      '%'
        %d      Senders name in "User.Name" format
        %z      Origin zone number
        %n      Origin net number
        %f      Origin node number
        %p      Origin point number
        x       'x'
@endnode

@node bcfg3011 "Global: FidoNet: BOGUS: NNTP gateway"
Act as a NNTP (news) gateway, convert remotely (net) enter messages to remote domain form.
@endnode

@node bcfg3012 "Global: FidoNet: BOGUS: SMTP gateway"
Act as a SMTP (email) gateway. If this toggle is on, net users may send and receive email messages via your system.

Remote users must sent the email messages to you as a normal NetMail message, receiver must be "receiver\@remote.host".
@endnode

@node bcfg3013 "Global: FidoNet: BOGUS: NNTP save headers"
If this toggle is on all the headers in incoming NNTP (news) messages are saved to message as kludges.

Should be used for debugging purposes only.
@endnode

@node bcfg3014 "Global: FidoNet: BOGUS: SMTP save headers"
If this toggle is on all the headers in incoming SMTP (email) messages are saved to message as kludges.

Should be used for debugging purposes only.
@endnode

@node bcfg1200 "Local: Dial"
When dialing to the remote system, BBBS tries to match remote's nodelist entry to case sensitive regexp given here. If none matches, it uses #1.

Matching predial string will be sent to the modem before the number and postdial right after the number.

Normal command strings modifiers can be used (see Local: Modem)
@endnode

@node bcfg1300 "Global: FidoNet: BOGUS: Temporary in pkt"
When processing incoming mail bundles BOGUS unpacks them here.
@endnode

@node bcfg1301 "Global: FidoNet: BOGUS: Temporary out pkt"
Outgoing packets are temporarily created here.
@endnode

@node bcfg1302 "Global: FidoNet: BOGUS: Outbound"
Outgoing mail bundles are stored here.
@endnode

@node bcfg1303 "Global: FidoNet: BOGUS: Badecho: area"
Incoming messages to unknown area are stored here in FTS-0001 format.
@endnode

@node bcfg1304 "Global: FidoNet: BOGUS: Badecho: secure"
Incoming messages to secure area with access are stored here in FTS-0001 format.
@endnode

@node bcfg1305 "Global: FidoNet: BOGUS: Max open files"
Maximum number of files BOGUS may open. Bigger number is faster.

In BBBS/D this number must be limited to 7.
In BBBS/2 this number should be limited to about 20, but can be as big as 70. If you increase this number, your unpackers must can handle many files too!
In BBBS/L good number is 20.
@endnode

@node bcfg1310 "Global: FidoNet: BOGUS: BOGUS dupes"
BOGUS will remember n*1024 last messages for dupe checking. 0 disables this feature. Bigger number is slower, uses more memory and disk space, but also will prevent duplicates better.

In BBBS/D this number must be limited to 15.
@endnode

@node bcfg1330 "Global: FidoNet: BOGUS: Max. SMTP message size"
Here you can limit the maximum size of the message in kilobytes that bbbs.smtpd.exe will import. This option can be used to disable flood-bombs and binary file transfers.

0 disables this feature.
@endnode

@node bcfg1311 "Global: FidoNet: BOGUS: Max. out pkt size"
Maximum size for outgoing pkt file in kilobytes. 0 is unlimited. Normally this should be about 512.
@endnode

@node bcfg1320 "Global: FidoNet: BOGUS: Max. out bundle size"
Maximum size for outgoing bundle file in kilobytes. 0 is unlimited. Normally this should be about 2048.
@endnode

@node bcfg1306 "Global: FidoNet: BOGUS: Save badecho: area"
Toggle for saving messages to unknown area.
@endnode

@node bcfg1307 "Global: FidoNet: BOGUS: Save badecho: secure"
Toggle for saving messages violating secure setting.
@endnode

@node bcfg1340 "Global: FidoNet: BOGUS: Save all NetMail msgs"
Toggle for saving all NetMail messages passing through your system.
@endnode

@node bcfg1313 "Global: FidoNet: BOGUS: Log headers(BMT)"
If this option is enabled, BMT will log info about messages passing your system.
@endnode

@node bcfg1312 "Global: FidoNet: BOGUS: Check destination (BMT)"
If this option is enabled, BMT will check that destination node is listed in your nodelist. If not it will be returned to the sender. If sender is not listed, the message will be deleted.

Don't enable this unless you compile full nodelists.
@endnode

@node bcfg1700 "Local: Voice"
You can move in this menu by pressing @{i}up@{ui} and @{i}down @{ui} keys. Select the item to configure by pressing @{i}enter@{ui}.
@endnode

@node bcfg1701 "Local: Voice: Data/fax answer string"
Modem command string to change from voice mode to data/fax mode.

ZyXEL: ATS2=255+FCLASS=0A|
Rockwell: AT#CLS=0;A|

Refer to your voice modem manual for more information.
@endnode

@node bcfg1720 "Local: Voice: Init string"
Modem command string to be sent before record and playback.

It must contain two "%d" substrings, first one for compression and second one for device.

ZyXEL: AT+VSM=%d;+VLS=%d;+FLO=2;S39.7=0;+VIT=45;+VSD=16,70|
Rockwell: AT#VBS=%d;#VLS=%d;#VSD=1|

Refer to your voice modem manual for more information.
@endnode

@node bcfg1721 "Local: Voice: Beep string"
Modem command string which produces small beep sound.

ZyXEL: AT+VTS=[800,0,42]|
Rockwell: AT#VTS=[800,0,4]|

Refer to your voice modem manual for more information.
@endnode

@node bcfg1722 "Local: Voice: Playback string"
Modem command string to start voice playbacking.

ZyXEL: AT+VTX|
Rockwell: AT#VTX|

Refer to your voice modem manual for more information.
@endnode

@node bcfg1723 "Local: Voice: Record string"
Modem command string to start voice recording.

ZyXEL: AT+VRX|
Rockwell: AT#VRX|

Refer to your voice modem manual for more information.
@endnode

@node bcfg1724 "Local: Voice: Modem device"
Device number for telephone line.

ZyXEL: 2
Rockwell: 0

Refer to your voice modem manual for more information.
@endnode

@node bcfg1725 "Local: Voice: Speaker device"
Device number for internal/external speaker.

ZyXEL: 16
Rockwell: 2

Refer to your voice modem manual for more information.
@endnode

@node bcfg1726 "Local: Voice: Mic device"
Device number for internal/external microphone.

ZyXEL: 8
Rockwell: 3

Refer to your voice modem manual for more information.
@endnode

@node bcfg1727 "Local: Voice: Go voice mode"
Modem command string to enter voice mode.

ZyXEL: AT+FCLASS=8|
Rockwell: AT#CLS=8|

Refer to your voice modem manual for more information.
@endnode

@node bcfg1728 "Local: Voice: Go data mode"
Modem command string to enter data mode.

ZyXEL: AT+FCLASS=0|
Rockwell: AT#CLS=0|

Refer to your voice modem manual for more information.
@endnode

@node bcfg1704 "Local: Voice: Compression method"
Compression method number to be used to record voice calls.

ZyXEL: 3
Rockwell: 4

Refer to your voice modem manual for more information.
@endnode

@node bcfg1730 "Local: Voice: Minimum filesize to keep"
The minimum size of a recorded voice file to keep. You can use this to avoid storing "empty" messages. Units are in kilobytes.
@endnode

@node bcfg1705 "Local: Voice: Voice receive dir"
Directory where to store recorded voice calls.
@endnode

@node bcfg1706 "Local: Voice: Greetings file"
Greetings file to be played to called.
@endnode

@node bcfg1707 "Local: Voice: Remote password"
Remote password (DTMF) for listening messages.
@endnode

@node bcfg3000 "Main: CD-ROM installer"
You can move in this menu by pressing @{i}up@{ui} and @{i}down @{ui} keys. Select the item to configure by pressing @{i}enter@{ui}.
@endnode

@node bcfg3001 "CD-ROM installer: OK to process"
CD-ROM installer can be used to install a CD-ROM disk to your file areas easily.

After you have checked these questions and you are ready to process with CD-ROM install, turn this toggle on and press @{i}ESC@{ui}.
@endnode

@node bcfg3002 "CD-ROM installer: CD-ROM path"
OS path for your CD-ROM drive.
@endnode

@node bcfg3003 "CD-ROM installer: Description path in CD-ROM"
Path in the CD-ROM to PCBoard-type description files (dirname.DIR files). May be left empty.
@endnode

@node bcfg3004 "CD-ROM installer: Virtual base directory in BBBS"
Virtual base directory in BBBS where to install these files.
@endnode

@node bcfg3005 "CD-ROM installer: Filedirg name"
Name of filedirg file. See @{b}sysop.gui@{ub} for more information about these files.
@endnode

@node bcfg3006 "CD-ROM installer: Description save directory"
Path where to store descriptions in your hard disk. It is a good idea to store descriptions of one CD-ROM in it's own unique directory.
@endnode

@node bcfg3007 "CD-ROM installer: Description file extension"
Extension for description files. May be left empty.
@endnode

@node bcfg3008 "CD-ROM installer: Lower directory names"
Turn case of directories into lower case.
@endnode

@node bcfg3009 "CD-ROM installer: Lower file names"
Turn case of files into lower case.
@endnode

@node bcfg3015 "CD-ROM installer: Convert all chars"
Don't turn this toggle off, unless you want to keep \@ chars in descs as they are (not recommended).
@endnode

@remark =======================================================================
@remark
@remark   You have reached the end of the BBBS SysOp manual. Have a nice day!
@remark   This .guide was brought to you by Kalle Soiha in the spring of 1997
@remark
@remark          BBBS is a copyright of Kim Heino and Tapani T. Salmi.
@remark
@remark =======================================================================

