diff --git a/dclish/dclish.go b/dclish/dclish.go
new file mode 100644
index 0000000000000000000000000000000000000000..aae284583a565a9b8f233989c170cfa0a0a7a3cb
--- /dev/null
+++ b/dclish/dclish.go
@@ -0,0 +1,49 @@
+// Package dclish A DCL-like command line parser.
+package dclish
+
+import (
+ "fmt"
+ "strings"
+)
+
+// ActionFunc is the function that a command runs.
+type ActionFunc func(string, *Command) error
+
+// Flag is a flag for a command.
+type Flag struct {
+ Name string
+ Value string
+ Description string
+}
+
+// Flags is the list of flags.
+type Flags []*Flag
+
+// Command contains the definition of a command, it's flags and subcommands.
+type Command struct {
+ Command string
+ Flags Flags
+ Args []string
+ Commands []*Command
+ Action ActionFunc
+ Description string
+}
+
+// Commands is the full list of commands.
+type Commands []*Command
+
+// ParseAndRun parses a command line and runs the command.
+func (c Commands) ParseAndRun(line string) error {
+ // TODO: this doesn't handle a DCL command line completely.
+ words := strings.Fields(line)
+ fmt.Printf("TODO ParseAndRun sees: %s\n", words)
+ cmd := strings.ToUpper(words[0])
+ for i := range c {
+ if c[i].Command == cmd {
+ fmt.Printf("Command help:\n%s\n", c[i].Description)
+ return nil
+ }
+ }
+ fmt.Printf("ERROR: Unknown command '%s'\n", cmd)
+ return nil
+}
diff --git a/repl/command.go b/repl/command.go
index 5567900ba7bf065af140e08863794346ad293653..dd0a2f9f385dcd50af33974b93f51351f96c22a6 100644
--- a/repl/command.go
+++ b/repl/command.go
@@ -1,412 +1,2661 @@
// Package repl implements the main event loop.
package repl
-type command struct {
- command string
- boolFlags []string
- strFlags []string
- args []string
- commands []*command
- action func(string, *command) error
- }
+import "git.lyda.ie/kevin/bulletin/dclish"
-var commands = []*command{
- {
- command: "ADD",
- boolFlags: []string{
- "/ALL",
- "/BELL",
- "/BROADCAST",
- "/CLUSTER",
- "/EDIT",
- "/EXPIRATION",
- "/EXTRACT",
- "/FOLDER",
- "/LOCAL",
- "/NODES",
- "/NOINDENT",
- "/PERMANENT",
- "/SUBJECT",
- "/SHUTDOWN",
- "/SYSTEM",
- "/USERNAME",
+var commands = dclish.Commands{
+ {
+ Command: "ADD",
+ Description: `Adds a message to the specified folder. A file can be specified which
+contains the message. Otherwise, BULLETIN will prompt for the text.
+BULLETIN will ask for an expiration date and a header to contain the
+topic of the message.
+
+ Format:
+ ADD [file-name]
+`,
+ Flags: dclish.Flags{
+ {
+ Name: "/ALL",
+ Description: `This option is restricted to privileged users. It is used in conjunction
+with the /BROADCAST qualifier. If specified, all terminals are sent the
+message. Otherwise, only users are sent the message.
+`,
+ },
+ {
+ Name: "/BELL",
+ Description: `This option is restricted to privileged users. It is used in conjunction
+with the /BROADCAST qualifier. If specified, the bell is rung on the
+terminals when the message is broadcasted.
+`,
+ },
+ {
+ Name: "/BROADCAST",
+ Description: `This option is restricted to privileged users and SYSTEM folders. If
+specified, a message is both stored and broadcasted to all users logged
+in at the time. If the folder is remote, a message will be broadcast on
+all nodes which are connected to that folder, unless /LOCAL is specified.
+A node which does not have BULLCP running cannot have a message
+broadcasted to it, (even though it is able to create a remote folder).
+
+See also /ALL and /BELL.
+`,
+ },
+ {
+ Name: "/CLUSTER",
+ Description: `/[NO]CLUSTER
+
+This option specifies that broadcasted messages should be sent to all
+nodes in the cluster. /CLUSTER is the default.
+`,
+ },
+ {
+ Name: "/EDIT",
+ Description: `/[NO]EDIT
+Determines whether or not the editor is invoked to edit the message
+you are adding. /EDIT is the default if you have added /EDIT to your
+BULLETIN command line.
+`,
+ },
+ {
+ Name: "/EXPIRATION",
+ Description: `/EXPIRATION=time
+
+Specifies the time at which the message is to expire. Either absolute
+time: [dd-mmm-yyyy] hh:mm:ss, or delta time: dddd [hh:mm:ss] can be
+used.
+`,
+ },
+ {
+ Name: "/EXTRACT",
+ Description: `Specifies that the text of the previously read message should be included
+at the beginning of the new message. The previous message must be in the
+same folder. This qualifier is valid only when used with /EDIT. The
+text is indented with > at the beginning of each line. This can be
+suppressed with /NOINDENT.
+`,
+ },
+ {
+ Name: "/FOLDER",
+ Description: `/FOLDER=(foldername,[...])
+
+Specifies the foldername into which the message is to be added. Does
+not change the current selected folder. Folders can be either local or
+remote folders. Thus, a nodename can precede the foldername (this
+assumes that the remote node is capable of supporting this feature, i.e.
+the BULLCP process is running on that node. If it is not, you will
+receive an error message). If the the foldername is specified with only
+a nodename, i.e. FOO::, the foldername is assumed to be GENERAL. NOTE:
+Specifying remote nodes is only possible if that remote node is running
+a special BULLCP process. If it isn't, the only way to add messages to
+that remote node is via the /NODE command. However, /FOLDER is a much
+quicker method, and much more versatile.
+
+You can specify logical names which translate to one or more folder
+names. I.e. $ DEFINE ALL_FOLDERS "VAX1,VAX2,VAX3", and then specify
+ALL_FOLDERS after /FOLDER=. Note that the quotation marks are required.
+
+When using /FOLDER for remote nodes, proxy logins are used to determine
+if privileged options are allowed. If they are not allowed, the message
+will still be added, but without the privileged settings.
+`,
+ },
+ {
+ Name: "/LOCAL",
+ Description: `Specifies that when /BROADCAST is specified for a remote folder, the
+message is broadcasted ONLY on the local node.
+`,
+ },
+ {
+ Name: "/NODES",
+ Description: `/NODES=(nodes[,...])
+
+Specifies to send the message to the listed DECNET nodes. The BULLETIN
+utility must be installed properly on the other nodes. (See
+installation notes). You can specify a different username to use at the
+other nodes by either using the USERNAME qualifier, or by specifying the
+nodename with 2 semi-colons followed by the username, i.e.
+nodename::username. If you specify a username, you will be prompted for
+the password of the account on the other nodes.
+
+Additionally, you can specify logical names which translate to one or
+more node names. I.e. $ DEFINE ALL_NODES "VAX1,VAX2,VAX3", and then
+specify /NODES=ALL_NODES. Note that the quotation marks are required.
+
+NOTE: It is preferable to use /FOLDER instead of /NODE if possible,
+since adding messages via /FOLDER is much quicker.
+`,
+ },
+ {
+ Name: "/NOINDENT",
+ Description: `See /EXTRACT for information on this qualifier.
+`,
+ },
+ {
+ Name: "/NOSIGNATURE",
+ Description: `Specifies to suppress the automatically appended signature, if one exists.
+Signatures are appended for postings to mailing lists and to responds.
+See the help topic POST Signature_file for signature information.
+`,
+ },
+ {
+ Name: "/PERMANENT",
+ Description: `If specified, message will be a permanent message and will never expire.
+If an expiration limit is set, then permament is not allowed unless
+user has privileges.
+`,
+ },
+ {
+ Name: "/SUBJECT",
+ Description: `/SUBJECT=description
+
+Specifies the subject of the message to be added.
+`,
+ },
+ {
+ Name: "/SHUTDOWN",
+ Description: `/SHUTDOWN[=nodename]
+This option is restricted to privileged users. If specified, message
+will be automatically deleted after a computer shutdown has occurred.
+This option is restricted to SYSTEM folders.
+
+If the bulletin files are shared between cluster nodes, the message
+will be deleted after the node on which the message was submitted from
+is rebooted. If you wish the message to be deleted after a different
+node reboots, you have the option of specifying that node name.
+
+NOTE: If the folder is a remote folder, the message will be deleted
+after the remote node reboots, not the node from which the message was
+added. The nodename cannot be specified with a remote folder.
+`,
+ },
+ {
+ Name: "/SYSTEM",
+ Description: `This option is restricted to privileged users. If specified, message
+is both saved in the folder and displayed in full as a system message
+when a user logs in. System messages should be as brief as possible to
+avoid the possibility that system messages could scroll off the screen.
+This option is restricted to SYSTEM folders.
+`,
+ },
+ {
+ Name: "/USERNAME",
+ Description: `Specifies username to be used at remote DECNET nodes when adding messages
+to DECNET nodes via the /NODE qualifier.
+`,
+ },
},
},
{
- command: "ATTACH",
- // 2 Parameters
- // 2 Qualifiers
- // 2 Examples
+ Command: "ATTACH",
+ Description: `Permits you to switch control of your terminal from your current
+process to another process in your job.
+
+The ATTACH command allows you to move quickly between processes that
+you have created with the SPAWN command. For example, while you are
+editing a file, you can SPAWN a subprocess to read a new message.
+Enter the ATTACH command to get back to back to the editing session.
+If you want to read another new message, you can use the ATTACH command
+to get back to the BULLETN subprocess you already created.
+
+ Format:
+
+ ATTACH [/PARENT] [process-name]
+`,
+ Flags: dclish.Flags{
+ {
+ Name: "Parameters",
+ Description: `process-name
+
+ Indicates the name of the subprocess to which the connection is to
+ be made. Only the /PARENT qualifier or a process-name may be specified.
+
+`,
+ },
+ {
+ Name: "Qualifiers",
+ Description: `/PARENT
+
+ Allows you to attach to your process' parent process.
+ If there is no parent process an error message is printed.
+
+
+`,
+ },
+ {
+ Name: "Examples",
+ Description: ` 1.
+ $ SPAWN BULLETIN
+ %DCL-S-SPAWNED, process MAGNANI_3 spawned
+ %DCL-S-ATTACHED, terminal now attached to process MAGNANI_3
+ BULLETIN> ATTACH MAGNANI_2
+ %DCL-S-RETURNED, control returned to process MAGNANI_2
+ $ ATTACH MAGNANI_3
+ BULLETIN>
+
+
+ This example shows how to spawn subprocesses (MAGNANI_2 and
+ MAGNANI_3) to move from BULLETIN to DCL back to BULLETIN. The ATTACH
+ command allows you to transfer control between subprocesses.
+
+
+ NOTE
+
+ You always SPAWN a new process and ATTACH to a process that
+ already exists.
+`,
+ },
+ },
},
{
- command: "BACK",
+ Command: "BACK",
+ Description: `Displays the message preceding the current message.
+`,
+ Flags: dclish.Flags{
+ {
+ Name: "/EDIT",
+ Description: `Specifies that the editor is to be used to read the message. This is
+useful for scanning a long message.
+`,
+ },
+ {
+ Name: "/HEADER",
+ Description: `/[NO]HEADER
+
+Specifies that if a message header exists, the header will be shown.
+If /HEADER or /NOHEADER is specified, the setting will apply for all
+further reads in the selected folder. The default is /HEADER for non-
+NEWS folders, /NOHEADER for NEWS folders. If the SET STRIP command
+is set for the folder, it will change the default to be /HEADER.
+`,
+ },
+ },
},
{
- command: "BULLETIN",
+ Command: "BULLETIN",
+ Description: `The BULLETIN utility permits a user to create a message for reading by
+all users. Users are notified upon logging in that new messages have
+been added, and what the topic of the messages are. Actual reading of
+the messages is optional. (See the command SET READNEW for info on
+automatic reading.) Messages are automatically deleted when their
+expiration date has passed.
+`,
},
{
- command: "CHANGE",
- boolFlags: []string{
- "/ALL",
- "/EDIT",
- "/EXPIRATION",
- "/GENERAL",
- "/HEADER",
- "/NEW",
- "/NUMBER",
- "/PERMANENT",
- "/SHUTDOWN[=nodename]",
- "/SUBJECT",
- "/SYSTEM",
- "/TEXT",
+ Command: "CHANGE",
+ Description: `Replaces or modifies existing stored message. This is for changing part
+or all of a message without causing users who have already seen the
+message to be notified of it a second time. You can select qualifiers so
+that either the message text, expiration date, or the header are to be
+changed. If no qualifier is added, the default is that all these parameters
+are to be changed. If the text of the message is to be changed, a file can
+be specified which contains the text. If the editor is used for changing
+the text, the old message text will be extracted. This can be suppressed
+by the qualifier /NEW.
+
+ Format:
+ CHANGE [file-name]
+`,
+ Flags: dclish.Flags{
+ {
+ Name: "/ALL",
+ Description: `Makes the changes to all the messages in the folder. Only the expiration
+date and message headers can be changed if this qualifier is specified.
+`,
+ },
+ {
+ Name: "/EDIT",
+ Description: `/[NO]EDIT
+Determines whether or not the editor is invoked to edit the message
+you are replacing. The old message text is read into the editor unless
+a file-name or /NEW is specified. /EDIT is the default if you have
+added /EDIT to your BULLETIN command line.
+`,
+ },
+ {
+ Name: "/EXPIRATION",
+ Description: `/EXPIRATION[=time]
+
+Specifies the time at which the message is to expire. Either absolute
+time: [dd-mmm-yyyy] hh:mm:ss, or delta time: dddd [hh:mm:ss] can be
+used. If no time is specified, you will be prompted for the time.
+`,
+ },
+ {
+ Name: "/GENERAL",
+ Description: `Specifies that the message is to be converted from a SYSTEM message to
+a GENERAL message. This only applies to the GENERAL folder.
+`,
+ },
+ {
+ Name: "/HEADER",
+ Description: `Specifies that the message header is to be replaced. You will be
+prompted for the new message description.
+`,
+ },
+ {
+ Name: "/NEW",
+ Description: `If the editor is to be used for replacing the text of the message,
+NEW specifies not to read in the old message text, and that a totally
+new text is to be read in.
+`,
+ },
+ {
+ Name: "/NUMBER",
+ Description: `/NUMBER=message_number[-message_number1]
+
+Specifies the message or messages to be replaced. If this qualifier is
+omitted, the message that is presently being read will be replaced.
+A range of messages can be specified, i.e. /NUMBER=1-5. Only the expiration
+date and message headers can be changed if a range is specified.
+
+The key words CURRENT and LAST can also be specified in the range,
+in place of an actual number, i.e. CURRENT-LAST, 1-CURRENT, etc.
+`,
+ },
+ {
+ Name: "/PERMANENT",
+ Description: `Specifies that the message is to be made permanent.
+`,
+ },
+ {
+ Name: "/SHUTDOWN[=nodename]",
+ Description: `Specifies that the message is to expire after the next computer
+shutdown. This option is restricted to SYSTEM folders.
+`,
+ },
+ {
+ Name: "/SUBJECT",
+ Description: `/SUBJECT=description
+
+Specifies the subject of the message to be added.
+`,
+ },
+ {
+ Name: "/SYSTEM",
+ Description: `Specifies that the message is to be made a SYSTEM message. This is a
+privileged command and is restricted to SYSTEM folders.
+`,
+ },
+ {
+ Name: "/TEXT",
+ Description: `Specifies that the message text is to be replaced.
+`,
+ },
},
},
{
- command: "COPY",
- boolFlags: []string{
- "/ALL",
- "/MERGE",
- "/ORIGINAL",
+ Command: "COPY",
+ Description: `Copies a message to another folder without deleting it from the
+current folder.
+
+ Format:
+
+ COPY folder-name [message_number][-message_number1]
+
+The folder-name is the name of the folder to which the message is to be
+copied to. Optionally, a range of messages which are to be copied can be
+specified following the folder name, i.e. COPY NEWFOLDER 2-5.
+
+The key words CURRENT and LAST can also be specified in the range,
+in place of an actual number, i.e. CURRENT-LAST, 1-CURRENT, etc.
+`,
+ Flags: dclish.Flags{
+ {
+ Name: "/ALL",
+ Description: `Specifies to copy all the messages in the old folder.
+`,
+ },
+ {
+ Name: "/GROUPS",
+ Description: `/GROUPS=(newsgroup,[...])
+
+Valid only if a NEWS group is selected. Specifies to send the message to
+the specified NEWS group(s) in addition to the selected NEWS group.
+`,
+ },
+ {
+ Name: "/HEADER",
+ Description: `/[NO]HEADER
+
+Valid only if destination folder is a news group. Specifies that header
+of message is to be included with the text when the text is copied.
+The default is /NOHEADER.
+`,
+ },
+ {
+ Name: "/MERGE",
+ Description: `Specifies that the original date and time of the copied messages are
+saved and that the messages are placed in correct chronological order
+in the new folder. This operation is lengthy if the new folder is large.
+`,
+ },
+ {
+ Name: "/ORIGINAL",
+ Description: `Specifies that the owner of the copied message will be the original owner
+of the message. The default is that the copied message will be owned by
+the person copying the message.
+`,
+ },
},
},
{
- command: "CREATE",
- boolFlags: []string{
- "/BRIEF",
- "/DESCRIPTION",
- "/ID",
- "/NODE",
- "/NOTIFY",
- "/OWNER",
- "/PRIVATE",
- "/READNEW",
- "/REMOTENAME",
- "/SHOWNEW",
- "/SEMIPRIVATE",
- "/SYSTEM",
+ Command: "CREATE",
+ Description: `Creates a folder of messages. This is similar to the folders in the VMS
+MAIL utility. Folders are often created so that messages of a similar
+topic are grouped separately, or to restrict reading of certain messages
+to specified users. Once created, that message is automatically
+selected (see information on SELECT command). The commands that can be
+used to modify the folder's characteristics are: MODIFY, REMOVE, SET
+ACCESS, SET BBOARD, SET NODE, and SET SYSTEM.
+
+ Format:
+ CREATE folder-name
+
+The folder-name is limited to 25 letters and must not include spaces or
+characters that are also invalid in filenames (this is because the
+folder is stored in a file name created with the folder name).
+
+NOTE: Creation of folders may be a restricted command if the installer
+has elected to install it as such. This is done by modifying
+BULLCOM.CLD.
+`,
+ Flags: dclish.Flags{
+ {
+ Name: "/ALWAYS",
+ Description: `Specifies that the folder has the ALWAYS attribute. This causes
+messages in the folder to be displayed differently when logging in.
+SYSTEM messages will be displayed every time a user logs in, rather than
+just once. Non-SYSTEM message will also be displayed every time (in
+whatever mode is selected, i.e. BRIEF, SHOWNEW, or READNEW) until the
+user actually reads that message (or a later one). This feature is
+meant for messages which are very important, and thus you want to make
+sure they are read.
+`,
+ },
+ {
+ Name: "/BRIEF",
+ Description: `Specifies that all users automatically have BRIEF set for this folder.
+Only a privileged user can use this qualifier. (See HELP SET BRIEF for
+more information.)
+`,
+ },
+ {
+ Name: "/DESCRIPTION",
+ Description: `/DESCRIPTION=description
+
+Specifies the description of the folder, which is displayed using the
+SHOW FOLDER command. If omitted, you are prompted for a description.
+
+If this folder is to receive messages from a network mailing list
+via the BBOARD feature, and you wish to use the POST and RESPOND/LIST
+commands, the address of the mailing list should be included in the
+description. This is done by enclosing the address using <> and
+placing it at the end of the description, i.e.
+
+ INFOVAX MAILING LIST <INFO-VAX@KL.SRI.COM>
+
+If a mailer protocol is needs to be added to the network address in
+order for it to be sent by VMS MAIL, i.e. protocol%"address", the
+appropriate protocol can be specified by either hardcoding it into the
+file BULLNEWS.INC before compiling BULLETIN, or by defining the system
+logical name BULL_NEWS_MAILER (it is the same protocol used by the NEWS
+feature in order to respond to NEWS messages). The default protocol is
+IN%. If desired, you can specify the protocol with the address, i.e.
+
+ INFOVAX MAILING LIST <IN%"INFO-VAX@KL.SRI.COM">
+`,
+ },
+ {
+ Name: "/ID",
+ Description: `Designates that the name specified as the owner name is a rights
+identifier. The creator's process must have the identifier presently
+assigned to it. Any process which has that identifier assigned to it
+will be able to control the folder as if it were the folder's owner.
+This is used to allow more than one use to control a folder.
+
+Note: This feature will not work during remote access to the folder.
+`,
+ },
+ {
+ Name: "/NODE",
+ Description: `/NODE=node
+
+Specifies that the folder is a remote folder at the specified node.
+A remote folder is a folder in which the messages are actually stored
+on a folder at a remote DECNET node. The specified node is checked to
+see if a folder of the same name is located on that node. If so, the
+folder will then be modified to point to that folder. For example if
+there was a folder on node A with name INFO, and you issued the command:
+ CREATE INFO/NODE=A
+from node B, then if INFO is selected on node B, you will actually
+obtain the folder INFO on node A. In this manner, a folder can be shared
+between more than one node. This capability is only present if the BULLCP
+process is running on the remote node via the BULL/STARTUP command.
+If the remote folder name is different from the local folder name, the
+remote folder name is specified using the /REMOTENAME qualifier.
+
+NOTE: If a message is added to a remote node, the message is stored
+immediately. However, a user logging into another node might not be
+immediately alerted that the message is present. That information is
+only updated every 15 minutes (same algorithm for updating BBOARD
+messages), or if a user accesses that folder. Thus, if the folder is
+located on node A, and the message is added from node B, and a user logs
+in to node C, the BULLETIN login notification might not notify the user
+of the message. However, if the message is added with /BROADCAST, the
+message will be broadcasted immediately to all nodes.
+`,
+ },
+ {
+ Name: "/NOTIFY",
+ Description: `Specifies that all users automatically have NOTIFY set for this folder.
+Only a privileged user can use this qualifier. (See HELP SET NOTIFY for
+more information.)
+`,
+ },
+ {
+ Name: "/OWNER",
+ Description: `/OWNER=username
+Specifies the owner of the folder. This is a privileged command.
+See also /ID.
+`,
+ },
+ {
+ Name: "/PRIVATE",
+ Description: `Specifies that the folder can only be accessed by users who have been
+granted access via the SET ACCESS command. Note: This option uses ACLs
+and users who are granted access must be entered into the Rights Data Base.
+If the RDB does not exist on your system, a privileged user will have to
+create it. If a user is not in the RDB, this program will automatically
+enter the user into it (unless this feature was disabled during the
+compilation of this program). NOTE: See HELP SET ACCESS for more info.
+`,
+ },
+ {
+ Name: "/READNEW",
+ Description: `Specifies that all users automatically have READNEW set for this folder.
+Only a privileged user can use this qualifier. (See HELP SET READNEW for
+more information.)
+`,
+ },
+ {
+ Name: "/REMOTENAME",
+ Description: `/REMOTENAME=foldername
+Valid only if /NODE is present, i.e. that the folder is a remote folder.
+Specifies the name of the remote folder name. If not specified, it is
+assumed that the remote name is the same as the local name.
+`,
+ },
+ {
+ Name: "/SHOWNEW",
+ Description: `Specifies that all users automatically have SHOWNEW set for this folder.
+Only a privileged user can use this qualifier. (See HELP SET SHOWNEW for
+more information.)
+`,
+ },
+ {
+ Name: "/SEMIPRIVATE",
+ Description: `Similar to /PRIVATE, except that the folder is restricted only with
+respect to adding or modifying messages. All users can read the folder.
+`,
+ },
+ {
+ Name: "/SYSTEM",
+ Description: `Specifies that the folder is a SYSTEM folder. A SYSTEM folder is
+allowed to have SYSTEM and SHUTDOWN messages added to it. By default,
+the GENERAL folder is a SYSTEM folder. This is a privileged command.
+
+If this is a remote folder, /SYSTEM cannot be specified unless the
+folder at the other node is also a SYSTEM folder.
+`,
+ },
},
},
{
- command: "CURRENT",
- boolFlags: []string{
- "/EDIT",
+ Command: "Ctrl-C",
+ Description: `Except for when BULLETIN is awaiting input from the terminal, a
+CTRL-C will cause BULLETIN to abort the execution of any command. If
+BULLETIN is waiting for terminal input, a CTRL-C will cause BULLETIN
+to return to the BULLETIN> prompt. If for some reason the user wishes
+to suspend BULLETIN, CTRL-Y will usually do so. However, this is not
+always true, as BULLETIN will ignore the CTRL-Y if it has a data file
+opened at the time. (Otherwise it would be possible to put the files
+in a state such that they would be inaccessible by other users.)
+`,
+ },
+ {
+ Command: "CURRENT",
+ Description: `Displays the beginning of the message you are currently reading. If
+you are reading a long message and want to display the first part
+of the message again, you can enter the CURRENT command.
+
+ Format:
+
+ CURRENT
+`,
+ Flags: dclish.Flags{
+ {
+ Name: "/EDIT",
+ Description: `Specifies that the editor is to be used to read the message. This is
+useful for scanning a long message.
+`,
+ },
+ {
+ Name: "/HEADER",
+ Description: `/[NO]HEADER
+
+Specifies that if a message header exists, the header will be shown.
+If /HEADER or /NOHEADER is specified, the setting will apply for all
+further reads in the selected folder. The default is /HEADER for non-
+NEWS folders, /NOHEADER for NEWS folders. If the SET STRIP command
+is set for the folder, it will change the default to be /HEADER.
+`,
+ },
},
},
{
- command: "DELETE",
- boolFlags: []string{
- "/ALL",
- "/IMMEDIATE",
- "/NODES",
- "/SUBJECT",
- "/USERNAME",
+ Command: "DELETE",
+ Description: `Deletes the specified message. If no message is specified, the current
+message is deleted. Only the original owner or a privileged user can
+delete a message. Note that the message is not deleted immediately, but
+its expiration is set 15 minutes in the future. This is to allow a user
+to recover the message using the UNDELETE command. If you want the
+message deleted immediately, use the /IMMEDIATE qualifier.
+
+ Format:
+ DELETE [message_number][-message_number1]
+
+The message's relative number is found by the DIRECTORY command. It is
+possible to delete a range of messages by specifying two numbers
+separated by a dash, i.e. DELETE 1-5. However, a range cannot be
+specified if the folder is remote.
+
+The key words CURRENT and LAST can also be specified in the range,
+in place of an actual number, i.e. CURRENT-LAST, 1-CURRENT, etc.
+`,
+ Flags: dclish.Flags{
+ {
+ Name: "/ALL",
+ Description: `Specifies to delete all the messages in the folder. Note: This will
+not work for remote folders. Only one message can be deleted from a
+remote folder at a time.
+`,
+ },
+ {
+ Name: "/IMMEDIATE",
+ Description: `Specifies that the message is to be deleted immediately.
+`,
+ },
+ {
+ Name: "/NODES",
+ Description: `/NODES=(nodes[,...])
+
+Specifies to delete the message at the listed DECNET nodes. The BULLETIN
+utility must be installed properly on the other nodes. You can specify
+a different username to use at the other nodes by either using the
+USERNAME qualifier, or by specifying the nodename with 2 semi-colons
+followed by the username, i.e. nodename::username. If you specify a
+username, you will be prompted for the password of the account on the
+other nodes. The /SUBJECT must be specified to identify the specific
+message that is to be deleted.
+
+Additionally, you can specify logical names which translate to one or
+more node names. I.e. $ DEFINE ALL_NODES "VAX1,VAX2,VAX3", and then
+specify /NODES=ALL_NODES. Note that the quotation marks are required.
+`,
+ },
+ {
+ Name: "/SUBJECT",
+ Description: `/SUBJECT=subject
+
+Specifies the subject of the bulletin to be deleted at a remote DECNET
+node. The DECNET node must be specified with the /NODE qualifier.
+The specified subject need not be the exact subject of the message.
+It can be a substring of the subject. This is in case you have forgotten
+the exact subject that was specified. Case is not critical either.
+You will be notified if the deletion was successful.
+`,
+ },
+ {
+ Name: "/USERNAME",
+ Description: `Specifies username to be used at remote DECNET nodes when deleting messages
+on other DECNET nodes via the /NODE qualifier.
+`,
+ },
},
},
{
- command: "DIRECTORY",
- boolFlags: []string{
- "/DESCRIBE",
- "/EXPIRATION",
- "/FOLDERS",
- "/MARKED",
- "/NEW",
- "/REPLY",
- "/SEARCH",
- "/SINCE",
- "/START",
- "/SUBJECT",
+ Command: "DIRECTORY",
+ Description: `Lists a summary of the messages. The message number, submitter's name,
+date, and subject of each message is displayed.
+
+ Format:
+
+ DIRECTORY [folder]
+
+If a folder is specified, that folder is selected before the directory
+is listed. Unless otherwise specified, listing starts with the first
+newest message. If there are no new messages, listing will start at the
+first message, or if a message has already been read, it will start at
+that message.
+`,
+ Flags: dclish.Flags{
+ {
+ Name: "/ALL",
+ Description: `Lists all messages. Used if the qualifiers /MARKED, /UNMARKED, /SEEN,
+or /UNSEEN were previously specified.
+`,
+ },
+ {
+ Name: "/DESCRIBE ",
+ Description: `Valid when used with /FOLDERS. Specifies to include description of
+folder.
+`,
+ },
+ {
+ Name: "/EXPIRATION",
+ Description: `Shows the message's expiration date rather than the creation date.
+`,
+ },
+ {
+ Name: "/END",
+ Description: `/END=message_number
+
+Indicates the last message number you want to display.
+`,
+ },
+ {
+ Name: "/FOLDERS",
+ Description: `Lists the available message folders. Shows last message date and number
+of messages in folder. An asterisk (*) next to foldername indicates
+that there are unread messages in that folder. This will not show
+newsgroups. To see newsgroups, use the NEWS command or DIR/NEWS.
+`,
+ },
+ {
+ Name: "/MARKED",
+ Description: `Lists messages that have been marked (indicated by an asterisk).
+This is equivalent to selecting the folder with /MARKED, i.e. only
+marked messages will be shown and be able to be read. To see all
+messages, use either /ALL, or reselect the folder.
+`,
+ },
+ {
+ Name: "/UNMARKED",
+ Description: `Lists messages that have not been marked (marked messages are indicated
+by an asterisk). Using /UNMARKED is equivalent to selecting the folder
+with /UNMARKED, i.e. only unmarked messages will be shown and be able
+to be read. To see all messages, use either /ALL, or reselect the
+folder.
+`,
+ },
+ {
+ Name: "/SEEN",
+ Description: `Lists messages that have been seen (indicated by a greater than sign).
+Using /SEEN is equivalent to selecting the folder with /SEEN, i.e. only
+seen messages will be shown and be able to be read. To see all
+messages, use either /ALL, or reselect the folder.
+`,
+ },
+ {
+ Name: "/UNSEEN",
+ Description: `Lists messages that have not been seen (seen message are indicated by a
+greater than sign). Using /UNSEEN is equivalent to selecting the folder
+with /UNSEEN, i.e. only unseen messages will be shown and be able to be
+read. To see all messages, use either /ALL, or reselect the folder.
+`,
+ },
+ {
+ Name: "/NEW",
+ Description: `Specifies to start the listing of messages with the first unread
+message.
+`,
+ },
+ {
+ Name: "/NEWS",
+ Description: `Lists the available news groups. This does the same thing as the NEWS
+command. See that command for qualifiers which apply.
+`,
+ },
+ {
+ Name: "/PRINT",
+ Description: `Specifies that the text of the messages which are found by the
+DIRECTORY command are to be printed. All qualifiers which are valid
+for the PRINT command are valid in conjunction with /PRINT. The list
+of messages to be printed will be displayed on the terminal (in
+nopaging format).
+`,
+ },
+ {
+ Name: "/REPLY",
+ Description: `Specifies that only messages which are replies to the current message
+are to be displayed. This cannot be used in conjunction with /MARKED.
+`,
+ },
+ {
+ Name: "/SEARCH",
+ Description: `/SEARCH=[string]
+
+Specifies that only messages which contain the specified string are
+to be displayed. This cannot be used in conjunction with /MARKED.
+If no string is specified, the previously specified string is used.
+`,
+ },
+ {
+ Name: "/SINCE",
+ Description: `/SINCE=date
+
+Displays a listing of all the messages created on or after the
+specified date. If no date is specified, the default is TODAY.
+`,
+ },
+ {
+ Name: "/START",
+ Description: `/START=message_number
+
+Indicates the first message number you want to display. For example,
+to display all the messages beginning with number three, enter the
+command line DIRECTORY/START=3. Not valid with /FOLDER.
+`,
+ },
+ {
+ Name: "/SUBJECT",
+ Description: `/SUBJECT=[string]
+
+Specifies that only messages which contain the specified string in it's
+subject header are to be displayed. This cannot be used in conjunction
+with /MARKED. If no string is specified, the previously specified string
+is used.
+`,
+ },
},
},
{
- command: "EXIT",
+ Command: "EXIT",
+ Description: `Exits the BULLETIN program.
+`,
},
{
- command: "EXTRACT",
+ Command: "EXTRACT",
+ Description: `Synonym for FILE command.
+`,
},
{
- command: "FILE",
- boolFlags: []string{
- "/ALL",
- "/FF",
- "/HEADER",
- "/NEW",
+ Command: "FILE",
+ Description: `Copies the current message to the named file. The file-name parameter
+is required. If the file exists, the message is appended to the file,
+unless the /NEW qualifier is specified.
+
+ Format:
+ FILE filename [message_number][-message_number1],[...]
+
+A range of messages to be copied can optionally be specified, i.e.
+FILE 2-5.
+
+The key words CURRENT and LAST can also be specified in the range,
+in place of an actual number, i.e. CURRENT-LAST, 1-CURRENT, etc.
+`,
+ Flags: dclish.Flags{
+ {
+ Name: "/ALL",
+ Description: `Copies all the messages in the current folder.
+`,
+ },
+ {
+ Name: "/FF",
+ Description: `Specifies that a form feed is placed between messages in the file.
+`,
+ },
+ {
+ Name: "/HEADER",
+ Description: `/[NO]HEADER
+
+Controls whether a header containing the owner, subject, and date of the
+message is written in the file. The default is to write the header.
+`,
+ },
+ {
+ Name: "/NEW",
+ Description: `Specifies that a new file is to be created. Otherwise, if the specified
+file exists, the file would be appended to that file.
+`,
+ },
},
},
{
- command: "Folders",
+ Command: "FIRST",
+ Description: `Specifies that the first message in the folder is to be read.
+`,
},
{
- command: "HELP",
+ Command: "FORWARD",
+ Description: `Synonym for MAIL command.
+`,
},
{
- command: "INDEX",
- boolFlags: []string{
- "/MARKED",
- "/NEW",
- "/RESTART",
+ Command: "Folders",
+ Description: `All messages are divided into separate folders. The default folder is
+GENERAL. New folders can be created by any user. As an example, the
+following creates a folder for GAMES related messages:
+
+BULLETIN> CREATE GAMES
+Enter a one line description of folder.
+GAMES
+
+To see the list of available folders, use DIRECTORY/FOLDERS. To select
+a specific folder, use the SELECT command.
+
+If a user selects a folder and enters the SET READNEW command, that
+user will be alerted of topics of new messages at login time, and will
+then be given the option of reading them. Similar to READNEW is SHOWNEW,
+which displays the topics but doesn't prompt to read them. Even less is
+SET BRIEF, which will cause only a one line output indicating that there
+are new messages in the folder. There also is the SET NOTIFY option,
+which will cause a message to be broadcast to a user's terminal alerting
+the user that a new message has been added. Any of these options can be
+the default for the folder by using the /DEFAULT switch on the command.
+
+A folder can be restricted to only certain users, if desired. This is
+done by specifying CREATE/PRIVATE. Afterwards, access to the folder is
+controlled by the creator by the SET [NO]ACCESS command. If /SEMIPRIVATE
+rather than /PRIVATE is specified, all users can read the messages in the
+folder, but only those give access can add messages.
+
+A folder can be converted into a remote folder using CREATE/NODE or SET
+NODE. A remote folder is one which points to a folder on a remote DECNET
+node. Messages added to a remote node are actually stored on the folder
+on the remote node. The BULLCP process (created by BULLETIN/STARTUP)
+must be running on the remote node for this option to be used.
+
+A folder can be specified as a SYSTEM folder, i.e. one in which SYSTEM/
+SHUTDOWN/BROADCAST messages can be added. By default, the GENERAL folder
+is a SYSTEM folder (and cannot be changed). One use for this is to create
+a remote SYSTEM folder which is shared by all nodes, so that the GENERAL
+folder is used for messages pertaining only to the local host, while the
+remote folder is used for messages pertaining to all nodes. Another
+use is to create a folder for posting SYSTEM messages only meant for a
+certain UIC group. This is done by creating a PRIVATE SYSTEM folder, and
+giving access to that UIC group. Only users in that UIC group will see
+the messages in that folder when they log in.
+`,
+ },
+ {
+ Command: "HELP",
+ Description: `To obtain help on any topic, type:
+
+ HELP topic
+`,
+ },
+ {
+ Command: "INDEX",
+ Description: `Gives directory listing of all folders in alphabetical order. If the
+INDEX command is re-entered while the listing is in progress, the listing
+will skip to the next folder. This is useful for skipping a particular
+folder. It also can be used to continue the listing from where one left
+off after one has read a message.
+
+ Format:
+ INDEX
+`,
+ Flags: dclish.Flags{
+ {
+ Name: "/MARKED",
+ Description: `Lists messages that have been marked (marked messages are indicated by
+an asterisk). This is equivalent to selecting the folder with /MARKED,
+i.e. only marked messages will be shown and be able to be read.
+`,
+ },
+ {
+ Name: "/UNMARKED",
+ Description: `Lists messages that have not been marked (marked messages are indicated
+by an asterisk). Using /UNMARKED is equivalent to selecting the folder
+with /UNMARKED, i.e. only unmarked messages will be shown and be able
+to be read.
+`,
+ },
+ {
+ Name: "/SEEN",
+ Description: `Lists messages that have been seen (indicated by a greater than sign).
+Using /SEEN is equivalent to selecting the folder with /SEEN, i.e. only
+seen messages will be shown and be able to be read.
+`,
+ },
+ {
+ Name: "/UNSEEN",
+ Description: `Lists messages that have not been seen (seen message are indicated by a
+greater than sign). Using /UNSEEN is equivalent to selecting the folder
+with /UNSEEN, i.e. only unseen messages will be shown and be able to be
+read.
+`,
+ },
+ {
+ Name: "/NEW",
+ Description: `Specifies to start the listing of each folder with the first unread message.
+Otherwise, the listing will start with the first message in the folder.
+If the INDEX command is re-entered for continuing the listing, /NEW must
+be respecified.
+`,
+ },
+ {
+ Name: "/RESTART",
+ Description: `If specified, causes the listing to be reinitialized and start from the
+first folder.
+`,
+ },
+ {
+ Name: "/SUBSCRIBE",
+ Description: `If specified, lists only those news folders which have been subscribed to.
+`,
+ },
},
},
{
- command: "KEYPAD",
+ Command: "KEYPAD",
+ Description: `+--------+--------+--------+--------+
+ | PF1 | PF2 | PF3 | PF4 |
+ | GOLD | HELP | EXTRACT|SHOW KEY|
+ | |ST NOKEY| FILE |SH KY/PR|
+ |--------|--------|--------|--------|
+ | 7 | 8 | 9 | -- |
+ | ADD | REPLY | MAIL |READ/NEW|
+ | ADD/EDI|RP/ED/EX|M/NOHEAD|SHOW NEW|
+ |--------|--------|--------|--------|
+ | 4 | 5 | 6 | , |
+ | CURRENT| RESPOND| LAST | DIR/NEW|
+ |CURR/EDI|RS/ED/EX| | INDEX |
+ |--------|--------|--------|--------|
+ | 1 | 2 | 3 |ENTER |
+ | BACK | PRINT | DIR | |
+ | NEXT |P/NONOTI|DIR/FOLD| |
+ |--------+--------|--------| ENTER |
+ | 0 | . | SELECT |
+ | SHOW FOLDER/FULL| DELETE | |
+ | SHOW FLAGS | UNDELE | |
+ +-----------------+--------+--------+
+`,
},
{
- command: "LAST",
+ Command: "LAST",
+ Description: `Displays the last message in the current folder.
+
+ Format:
+ LAST
+`,
+ Flags: dclish.Flags{
+ {
+ Name: "/EDIT",
+ Description: `Specifies that the editor is to be used to read the message. This is
+useful for scanning a long message.
+`,
+ },
+ {
+ Name: "/HEADER",
+ Description: `/[NO]HEADER
+
+Specifies that if a message header exists, the header will be shown.
+If /HEADER or /NOHEADER is specified, the setting will apply for all
+further reads in the selected folder. The default is /HEADER for non-
+NEWS folders, /NOHEADER for NEWS folders. If the SET STRIP command
+is set for the folder, it will change the default to be /HEADER.
+`,
+ },
+ },
},
{
- command: "MAIL",
- boolFlags: []string{
- "/HEADER",
- "/SUBJECT",
+ Command: "MAIL",
+ Description: `Invokes the VAX/VMS Personal Mail Utility (MAIL) to send the message
+which you are reading to the specified recipients.
+
+ Format:
+
+ MAIL recipient-name[s]
+
+The input for the recipient name is exactly the same format as used by
+the MAIL command at DCL level. Note that this means when specifying an
+address that has quotes, in order to pass the quotes you must specify
+triple quotes. I.e. a network address of the form xxx%"address" must
+be specified as xxx%"""address""".
+`,
+ Flags: dclish.Flags{
+ {
+ Name: "/EDIT",
+ Description: `Specifies that the editor is to be used to edit the message before
+mailing it.
+`,
+ },
+ {
+ Name: "/HEADER",
+ Description: `/[NO]HEADER
+
+Controls whether a header containing the owner, subject, and date of the
+message is written in the mail. The default is to write the header.
+`,
+ },
+ {
+ Name: "/SUBJECT",
+ Description: `/SUBJECT=text
+
+Specifies the subject of the mail message. If the text consists of more
+than one word, enclose the text in quotation marks (").
+
+If you omit this qualifier, the description of the message will be used
+as the subject.
+`,
+ },
},
},
{
- command: "MARK",
+ Command: "MARK",
+ Description: `Sets the current or message-id message as marked. Marked messages are
+displayed with an asterisk in the left hand column of the directory
+listing. A marked message can serve as a reminder of important
+information. The UNMARK command sets the current or message-id message
+as unmarked.
+
+ Format:
+
+ MARK [message-number or numbers]
+ UNMARK [message-number or numbers]
+
+NOTE: The list of marked messages for non-NEWS folders are stored in a
+file username.BULLMARK, and NEWS folders are stored in
+username.NEWSMARK. The files are created in the directory pointed to by
+the logical name BULL_MARK. If BULL_MARK is not defined, SYS$LOGIN
+will be used.
+`,
},
{
- command: "MODIFY",
- boolFlags: []string{
- "/DESCRIPTION",
- "/ID",
- "/NAME",
- "/OWNER",
+ Command: "MODIFY",
+ Description: `Modifies the database information for the current folder. Only the
+owner of the folder or a user with privileges can use this command.
+
+ Format:
+
+ MODIFY
+`,
+ Flags: dclish.Flags{
+ {
+ Name: "/DESCRIPTION",
+ Description: `Specifies a new description for the folder. You will be prompted for
+the text of the description.
+
+NOTE: If this folder is to receive messages from a network mailing list
+via the BBOARD feature, and you wish to use the POST and RESPOND/LIST
+commands, the address of the mailing list should be included in the
+description. This is done by enclosing the address using <> and
+placing it at the end of the description, i.e.
+
+ INFOVAX MAILING LIST <IN%"INFO-VAX@KL.SRI.COM">
+`,
+ },
+ {
+ Name: "/ID",
+ Description: `Designates that the name specified as the owner name is a rights
+identifier. The creator's process must have the identifier presently
+assigned to it. Any process which has that identifier assigned to it
+will be able to control the folder as if it were the folder's owner.
+This is used to allow more than one use to control a folder.
+
+Note: This feature will not work during remote access to the folder.
+`,
+ },
+ {
+ Name: "/NAME",
+ Description: `/NAME=foldername
+
+Specifies a new name for the folder.
+`,
+ },
+ {
+ Name: "/OWNER",
+ Description: `/OWNER=username
+
+Specifies a new owner for the folder. If the owner does not have
+privileges, BULLETIN will prompt for the password of the new owner
+account in order to okay the modification. See also /ID.
+`,
+ },
},
},
{
- command: "MOVE",
- boolFlags: []string{
- "/ALL",
- "/MERGE",
- "/ORIGINAL",
+ Command: "MOVE",
+ Description: `Moves a message to another folder and deletes it from the current
+folder.
+
+ Format:
+
+ MOVE folder-name [message_number][-message_number1]
+
+The folder-name is the name of the folder to which the message is to be
+be moved to. Optionally, a range of messages which are to be moved can be
+specified following the folder name, i.e. COPY NEWFOLDER 2-5. However,
+if the old folder is remote, they will be copied but not deleted, as
+only one message can be delted from a remote folder at a time.
+
+The key words CURRENT and LAST can also be specified in the range,
+in place of an actual number, i.e. CURRENT-LAST, 1-CURRENT, etc.
+`,
+ Flags: dclish.Flags{
+ {
+ Name: "/ALL",
+ Description: `Specifies to move all the messages from the old folder. Note: If the
+old folder is remote, they will be copied but not deleted, as only one
+message can be deleted from a remote folder at a time.
+`,
+ },
+ {
+ Name: "/GROUPS",
+ Description: `/GROUPS=(newsgroup,[...])
+
+Valid only if a NEWS group is selected. Specifies to send the message to
+the specified NEWS group(s) in addition to the selected NEWS group.
+`,
+ },
+ {
+ Name: "/HEADER",
+ Description: `/[NO]HEADER
+
+Valid only if destination folder is a news group. Specifies that header
+of message is to be included with the text when the text is copied.
+The default is /NOHEADER.
+`,
+ },
+ {
+ Name: "/MERGE",
+ Description: `Specifies that the original date and time of the moved messages are
+saved and that the messages are placed in correct chronological order
+in the new folder. This operation is lengthy if the new folder is large.
+`,
+ },
+ {
+ Name: "/ORIGINAL",
+ Description: `Specifies that the owner of the moved message will be the original owner
+of the message. The default is that the moved message will be owned by
+the person moving the message.
+`,
+ },
+ },
+ },
+ {
+ Command: "NEWS",
+ Description: `Displays the list of available news groups.
+
+Format:
+
+ NEWS [string]
+
+If the string is specified, lists news groups whose name contains that
+string. If the string contains an asterisk, a wild card match will be
+applied. I.e. if ALT* is specified, all groups starting with ALT will
+be displayed.
+
+The status column of the display shows the status of the news group.
+"y" means the news group is available. "m" means the news group is
+moderated, and posting may or may not be allowable. "x" means the news
+group has been deactived by the local server. "=" means the news group
+has been renamed. The new name is shown on the display line immediately
+following the old name.
+`,
+ Flags: dclish.Flags{
+ {
+ Name: "/NEWGROUP",
+ Description: `If specified, will list new news groups that have been added since the
+last time that a user has accessed a news group. If there are new
+groups, a user will see a message indicating that there are new groups
+when the user accesses a news group.
+`,
+ },
+ {
+ Name: "/START",
+ Description: `/START=string
+
+If specified, the list will start with the first group which follows
+alphabetically after that string. I.e. if /START=B is specified, the
+list will start with groups whose name starts with a B.
+`,
+ },
+ {
+ Name: "/SUBSCRIBE",
+ Description: `If specified, lists only those news folders which have been subscribed to.
+An asterisk before the group indicates that new messages are present for
+that folder.
+`,
+ },
},
},
{
- command: "NEXT",
+ Command: "NEXT",
+ Description: `Skips to the next message and displays it. This is useful when paging
+through the messages and you encounter a particularly long message
+that you would like to skip over.
+`,
+ Flags: dclish.Flags{
+ {
+ Name: "/EDIT",
+ Description: `Specifies that the editor is to be used to read the message. This is
+useful for scanning a long message.
+`,
+ },
+ {
+ Name: "/HEADER",
+ Description: `/[NO]HEADER
+
+Specifies that if a message header exists, the header will be shown.
+If /HEADER or /NOHEADER is specified, the setting will apply for all
+further reads in the selected folder. The default is /HEADER for non-
+NEWS folders, /NOHEADER for NEWS folders. If the SET STRIP command
+is set for the folder, it will change the default to be /HEADER.
+`,
+ },
+ },
},
{
- command: "POST",
- boolFlags: []string{
- "/CC",
- "/EDIT",
- "/EXTRACT",
- "/NOINDENT",
- "/SUBJECT",
+ Command: "POST",
+ Description: `If a NEWS group is selected, posts a message to that group. If a normal
+folder is selected, sends a message via MAIL to the network mailing list
+which is associated with the selected folder. The address of the
+mailing list must be stored using either CREATE/DESCRIPTION or
+MODIFY/DESCRIPTION. See help on those commands for more information.
+
+ Format:
+ POST [file-name]
+`,
+ Flags: dclish.Flags{
+ {
+ Name: "/CC",
+ Description: `/CC=user[s]
+Specifies additional users that should receive the mail message.
+`,
+ },
+ {
+ Name: "/EDIT",
+ Description: `Specifies that the editor is to be used for creating the mail message.
+`,
+ },
+ {
+ Name: "/EXTRACT",
+ Description: `Specifies that the text of the message that is being read should be
+included in the mail message. This qualifier is valid only when used
+with /EDIT. The text of the message is indented with > at the
+beginning of each line. This can be suppressed with /NOINDENT.
+`,
+ },
+ {
+ Name: "/GROUPS",
+ Description: `/GROUPS=(newsgroup,[...])
+
+Valid only if a NEWS group is selected. Specifies to send the message to
+the specified NEWS group(s) in addition to the selected NEWS group.
+`,
+ },
+ {
+ Name: "/NOINDENT",
+ Description: `See /EXTRACT for information on this qualifier.
+`,
+ },
+ {
+ Name: "/NOSIGNATURE",
+ Description: `Specifies to suppress the automatically appended signature, if one exists.
+Signatures are appended for postings to mailing lists and to responds.
+See the help topic POST Signature_file for signature information.
+`,
+ },
+ {
+ Name: "/SUBJECT",
+ Description: `/SUBJECT=text
+
+Specifies the subject of the mail message. If the text consists of more
+than one word, enclose the text in quotation marks (").
+
+If you omit this qualifier, you will prompted for the subject.
+`,
+ },
+ {
+ Name: "Signature_file",
+ Description: `It is possibly to have the contents of a file be automatically appended
+to the end of a message added with the POST and/or the RESPOND command.
+This file is known as a signature file, and it typically contains one's
+name, address, or perhaps a favorite quote. The name of the file should
+be SYS$LOGIN:BULL_SIGNATURE.TXT, and it should be a simple text file. In
+order to specify a different file to use, define the logical name
+BULL_SIGNATURE to point to the desired file.
+
+It is possible to specify that portions or all of the signature file are
+to be included only for specific folders or news groups. Simply surround
+the exclusive text starting with the line "START <folder-name>" and ending
+with the line "END", i.e.
+
+START INFOVAX
+This line will only appear in the INFOVAX folder.
+END
+START MISC.TEST
+This line will only appear in the news folder MISC.TEST.
+END
+This line will appear in all postings.
+
+Note that an empty line is automatically created to separate the text of
+the message and the contents of the signature file.
+`,
+ },
},
},
{
- command: "PRINT",
- boolFlags: []string{
- "/ALL",
- "/FORM",
- "/HEADER",
- "/NOTIFY",
- "/QUEUE",
+ Command: "PRINT",
+ Description: `Queues a copy of the message you are currently reading (or have
+just read) for printing. The file created by the PRINT command
+is not released to the print queue until you exit, unless you add
+the qualifier /NOW or change one of the print job's qualifiers.
+Multiple messages are concatenated into one print job.
+
+ Format:
+
+ PRINT [message_number][-message_number1],[...]
+
+A range of messages to be printed can optionally be specified, i.e.
+PRINT 2-5.
+
+The key words CURRENT and LAST can also be specified in the range,
+in place of an actual number, i.e. CURRENT-LAST, 1-CURRENT, etc.
+
+NOTE: The qualifier /PRINT is present on the DIRECTORY command. This
+provides more flexibility than is present with the PRINT command. For
+example, if you want to print all messages with a particular string in
+it's subject line, DIRECTORY/PRINT/SUBJ would allow you do it.
+`,
+ Flags: dclish.Flags{
+ {
+ Name: "/ALL",
+ Description: `Prints all the messages in the current folder.
+`,
+ },
+ {
+ Name: "/FORM",
+ Description: `Specifies the name or number of the form that you want for the print
+job. Codes for form types are installation-defined. You can use the
+SHOW QUEUE/FORM command at DCL level to find out the form types
+available for your system. Use the SHOW QUEUE/FULL command at DCL
+level to find out the name of the mounted form and the default form for
+a particular queue. If you specify a form whose stock is different
+from the stock of the form mounted on the queue, your job is placed in
+a pending state until the stock of the mounted form of the queue is
+set equal to the stock of the form associated with the job. (In order
+to have your job print, the system manager should stop the queue,
+physically change the paper stock on the output device, and restart the
+queue specifying the new form type as the mounted form.)
+`,
+ },
+ {
+ Name: "/HEADER",
+ Description: `/[NO]HEADER
+
+Controls whether a header containing the owner, subject, and date of the
+message is printed at the beginning. The default is to write the header.
+`,
+ },
+ {
+ Name: "/NOTIFY",
+ Description: `/[NO]NOTIFY
+
+Indicates that you will be notified by a broadcast message when the
+file or files have been printed. If /NONOTIFY is specified, there
+is no notification. The default is /NOTIFY.
+`,
+ },
+ {
+ Name: "/NOW",
+ Description: `Sends all messages that have been queued for printing with the PRINT
+command during this session to the printer.
+`,
+ },
+ {
+ Name: "/QUEUE",
+ Description: `/QUEUE=queue_name
+
+The name of the queue to which a message is to be sent. If the /QUEUE
+qualifier is not specified, the message is queued to SYS$PRINT.
+`,
+ },
},
},
{
- command: "READ",
- boolFlags: []string{
- "/EDIT",
- "/MARKED",
- "/NEW",
- "/PAGE",
- "/SINCE",
+ Command: "READ",
+ Description: `Displays the specified message. If you do not specify a message, then
+the first time you enter the command, the first message in the folder
+will be displayed. However, if there are new messages, the first new
+message will be displayed. Each time you enter the command, the next
+page, or if there are no more pages, the next message will be displayed.
+
+ Format:
+ READ [message-number]
+
+The message's relative number is found by the DIRECTORY command.
+If you specify a number greater than the number of messages in the
+folder, the last message in the folder will be displayed.
+
+NOTE: The READ command can be abbreviated by omitting the READ command,
+i.e. typing the command "2" is equivalent to "READ 2", and simply
+hitting the <RETURN> key is equivalent to "READ".
+
+BULLETIN normally stores only the latest message that has been read per
+folder. It can optionally store and display which messages have been
+read in a folder on a per message basis. For information on this, see
+the help on the SEEN command.
+`,
+ Flags: dclish.Flags{
+ {
+ Name: "/ALL",
+ Description: `Specifies to read all messages. Used after /MARKED, /UNMARKED, /SEEN,
+or /UNSEEN had been specified.
+`,
+ },
+ {
+ Name: "/EDIT",
+ Description: `Specifies that the editor is to be used to read the message. This is
+useful for scanning a long message.
+`,
+ },
+ {
+ Name: "/HEADER",
+ Description: `/[NO]HEADER
+
+Specifies that if a message header exists, the header will be shown.
+If /HEADER or /NOHEADER is specified, the setting will apply for all
+further reads in the selected folder. The default is /HEADER for non-
+NEWS folders, /NOHEADER for NEWS folders. If the SET STRIP command
+is set for the folder, it will change the default to be /HEADER.
+`,
+ },
+ {
+ Name: "/MARKED",
+ Description: `Specifies to read only messages that have been marked (marked messages
+are indicated by an asterisk). Using /MARKED is equivalent to
+selecting the folder with /MARKED, i.e. only marked messages will be
+shown and be able to be read. To see all messages, use either /ALL,
+or reselect the folder.
+`,
+ },
+ {
+ Name: "/UNMARKED",
+ Description: `Specifies to read only messages that have not been marked (marked
+messages are indicated by an asterisk). Using /UNMARKED is equivalent
+to selecting the folder with /UNMARKED, i.e. only unmarked messages
+will be shown and be able to be read. To see all messages, either
+reselect the folder or specify /ALL.
+`,
+ },
+ {
+ Name: "/SEEN",
+ Description: `Specifies to read only messages that have been seen (indicated by a
+greater than sign). Using /SEEN is equivalent to selecting the folder
+with /SEEN, i.e. only seen messages will be shown and be able to be
+read. To see all messages, use either /ALL, or reselect the folder.
+`,
+ },
+ {
+ Name: "/UNSEEN",
+ Description: `Specifies to read only messages that have not been seen (seen message
+are indicated by a greater than sign). Using /UNSEEN is equivalent to
+selecting the folder with /UNSEEN, i.e. only unseen messages will be
+shown and be able to be read. To see all messages, use either /ALL, or
+reselect the folder.
+`,
+ },
+ {
+ Name: "/NEW",
+ Description: `Specifies to read the first unread message.
+`,
+ },
+ {
+ Name: "/PAGE",
+ Description: `/[NO]PAGE
+
+Specifies that the display of the message will pause when it reaches the
+end of the page. If /NOPAGE is specified, the whole message will be
+displayed. This is useful for terminals that can store more than one
+screenful at a time, and that have a remote printer that can then print
+the contents of the terminal's memory.
+`,
+ },
+ {
+ Name: "/SINCE",
+ Description: `/SINCE=date
+
+Specifies to read the first message created on or after the specified
+date. If no date is specified, the default is TODAY.
+`,
+ },
},
},
{
- command: "REMOVE",
+ Command: "REMOVE",
+ Description: `Removes a folder. Only the owner of a folder or a privileged user can
+remove the folder.
+
+ Format:
+ REMOVE folder-name
+`,
},
{
- command: "REPLY",
- boolFlags: []string{
- "/EXTRACT",
- "/NOINDENT",
+ Command: "REPLY",
+ Description: `Adds message with subject of message being the subject of the currently
+read message with "RE:" preceeding it. Format and qualifiers is exactly
+the same as the ADD command except for /NOINDENT and /EXTRACT.
+
+ Format:
+ REPLY [file-name]
+`,
+ Flags: dclish.Flags{
+ {
+ Name: "/EXTRACT",
+ Description: `Specifies that the text of the message should be included in the reply
+mail message. This qualifier is valid only when used with /EDIT. The
+text of the message is indented with > at the beginning of each line.
+This can be suppressed with /NOINDENT.
+`,
+ },
+ {
+ Name: "/NOINDENT",
+ Description: `See /EXTRACT for information on this qualifier.
+`,
+ },
},
},
{
- command: "RESPOND",
- boolFlags: []string{
- "/CC",
- "/EDIT",
- "/EXTRACT",
- "/LIST",
- "/NOINDENT",
- "/SUBJECT",
+ Command: "RESPOND",
+ Description: `Invokes the VAX/VMS Personal Mail Utility (MAIL) to send a reply mail
+message to the owner of the currently read message.
+
+ Format:
+ RESPOND [file-name]
+
+If you wish to use another method for sending the mail, define BULL_MAILER
+to point to a command procedure. This procedure will then be executed in
+place of MAIL, and the parameters passed to it are the username and subject
+of the message.
+`,
+ Flags: dclish.Flags{
+ {
+ Name: "/CC",
+ Description: `/CC=user[s]
+Specifies additional users that should receive the reply.
+`,
+ },
+ {
+ Name: "/EDIT",
+ Description: `Specifies that the editor is to be used for creating the reply mail
+message.
+`,
+ },
+ {
+ Name: "/EXTRACT",
+ Description: `Specifies that the text of the message should be included in the reply
+mail message. This qualifier is valid only when used with /EDIT. The
+text of the message is indented with > at the beginning of each line.
+This can be suppressed with /NOINDENT.
+`,
+ },
+ {
+ Name: "/GROUPS",
+ Description: `/GROUPS=(newsgroup,[...])
+
+Valid only if a NEWS group is selected and /LIST is present. Specifies
+to send the message to the specified NEWS group(s) in addition to the
+selected NEWS group.
+`,
+ },
+ {
+ Name: "/LIST",
+ Description: `Specifies that the reply should also be sent to the network mailing list
+associated with the folder. The mailing list address should be stored
+in the folder description. See CREATE/DESCRIPTION or MODIFY/DESCRIPTION
+for more informaton.
+`,
+ },
+ {
+ Name: "/NOINDENT",
+ Description: `See /EXTRACT for information on this qualifier.
+`,
+ },
+ {
+ Name: "/NOSIGNATURE",
+ Description: `Specifies to suppress the automatically appended signature, if one exists.
+Signatures are appended for postings to mailing lists and to responds.
+See the help topic POST Signature_file for signature information.
+`,
+ },
+ {
+ Name: "/SUBJECT",
+ Description: `/SUBJECT=text
+
+Specifies the subject of the mail message. If the text consists of more
+than one word, enclose the text in quotation marks (").
+
+If you omit this qualifier, the description of the message will be used
+as the subject preceeded by "RE: ".
+`,
+ },
},
},
{
- command: "QUIT",
+ Command: "QUIT",
+ Description: `Exits the BULLETIN program.
+`,
},
{
- command: "SEARCH",
- boolFlags: []string{
- "/REPLY",
- "/REVERSE",
- "/START",
- "/SUBJECT",
+ Command: "SEARCH",
+ Description: `Searches the currently selected folder for the message containing the
+first occurrence of the specified text string.
+
+ Format:
+
+ SEARCH [search-string]
+
+The search starts from the first message in the current folder. The
+search includes both the text of the message, and the description header.
+If a "search-string" is not specified, a search is made using the
+previously specified string, starting with the message following the
+one you are currently reading (or have just read). Once started, a
+search can be aborted by typing a CTRL-C.
+`,
+ Flags: dclish.Flags{
+ {
+ Name: "/EDIT",
+ Description: `Specifies that the editor is to be used for reading the message.
+`,
+ },
+ {
+ Name: "/FOLDER",
+ Description: `/FOLDER=(folder,[...])
+
+Specifies a list of folders to be searched. The search will start by
+selecting the first folder in the list and searching the messages for
+a match. If, during a search, no more matches or messages are found,
+the next folder in the list is automatically selected. The presently
+selected folder can be included in the search by specifying "" as the
+first folder in the list.
+`,
+ },
+ {
+ Name: "/REPLY",
+ Description: `Specifies that messages are to be searched for that are replies to the
+currently read message, or the message specified by /START. Replies are
+messages which have subject of the original message prefaced by "Re:".
+`,
+ },
+ {
+ Name: "/REVERSE",
+ Description: `Specifies that the messages are to be searched in reverse order. If
+no starting message is specified, the search is started from the last
+message.
+`,
+ },
+ {
+ Name: "/START",
+ Description: `/START=message_number
+
+Specifies the message number to start the search at.
+`,
+ },
+ {
+ Name: "/SUBJECT",
+ Description: `Specifies that only the subject of the messages are to be searched.
+`,
+ },
},
},
{
- command: "SELECT",
- boolFlags: []string{
- "/MARKED",
- },
+ Command: "SEEN",
+ Description: `Sets the current or message-id message as seen. This allows you to keep
+track of messages on a per message basis. Seen messages are displayed
+with a greater than sign in the left hand column of the directory
+listing. Once you have used the SEEN command once, messages will be
+automatically be set as being SEEN when they are read. The UNSEEN
+command sets the current or message-id message as unseen.
+
+ Format:
+
+ SEEN [message-number or numbers]
+ UNSEEN [message-number or numbers]
+
+Keeping track of seen messages requires very little overhead for NEWS
+folders. However, there is a moderate overhead for regular non-NEWS
+folders. If you have used the SEEN command and wish to disable the
+automatic marking of messages in regular folders as SEEN when they are
+read, type the command SEEN/NOREAD. To reenable, simply use the SEEN
+command again.
+
+NOTE: The list of SEEN messages for non-NEWS folders are stored in a
+file username.BULLMARK, and NEWS folders are stored in
+username.NEWSMARK. The files are created in the directory pointed to by
+the logical name BULL_MARK. If BULL_MARK is not defined, SYS$LOGIN
+will be used.
+`,
},
{
- command: "SET",
- commands: []*command{
+ Command: "SELECT",
+ Description: `Selects a folder of messages. See HELP Folders for a description of a
+folder. Once a folder has been selected, all commands, i.e. DIRECTORY,
+READ, etc. will apply only to those messages. Use the CREATE command to
+create a folder. Use the DIRECTORY/FOLDER command to see the list of
+folders that have been created.
+
+ Format:
+
+ SELECT [node-name::][folder-name]
+
+The complete folder name need not be specified. BULLETIN will try to
+find the closest matching name. I.e. INFOV can be used for INFOVAX.
+
+Omitting the folder name will select the default general messages.
+
+The node name can be specified only if the remote node has the special
+BULLCP process running (invoked by BULLETIN/STARTUP command.)
+
+After selecting a folder, the user will notified of the number of unread
+messages, and the message pointer will be placed at the first unread
+message.
+
+BULLETIN automatically determines if the selcted name is a NEWS group by
+detecting if a period is present in the name being specified, as most
+NEWS groups contain a period, whereas a real folder cannot. A few
+special NEWS groups, i.e. JUNK and CONTROL, do not contain a period. If
+desired, you can select these groups by enclosing them in double quotes
+("), and typing the name in lower case.
+`,
+ Flags: dclish.Flags{
{
- command: "ACCESS",
- boolFlags: []string{
- //3 id
- "/ALL",
- "/READ",
- //3 Warning
- },
+ Name: "/MARKED",
+ Description: `Selects only messages that have been marked (indicated by an asterisk).
+After using /MARKED, in order to see all messages, the folder will have
+to be reselected.
+`,
},
+ },
+ },
+ {
+ Command: "SET",
+ Description: `The SET command is used with other commands to define or change
+characteristics of the BULLETIN Utility.
+
+ Format:
+
+ SET option
+`,
+ Flags: dclish.Flags{
{
- command: "BBOARD",
- boolFlags: []string{
- "/EXPIRATION",
- "/SPECIAL",
- "/VMSMAIL",
- //3 More_information
- },
+ Name: "ACCESS",
+ Description: `Controls access to a private folder. A private folder can only be
+selected by users who have been granted access. Only the owner of that
+folder is allowed to grant access.
+
+ Format:
+
+ SET [NO]ACCESS id-name [folder-name]
+
+The id-name can be one or more ids from the system Rights Database for
+which access is being modified. It can also be a file name which
+contains a list of ids. For more information concerning usage of
+private folders, see HELP CREATE /PRIVATE. NOTE: Access is created via
+ACLs. If a user's process privileges are set to override ACLs, that
+user will be able to access the folder even if access has not been
+granted.
+
+It is suggested that if you plan on granting access to many users, that
+you create an id using the AUTHORIZE utility and then use the SET ACCESS
+command to grant access to that id. Then, you can use the GRANT/ID
+command in AUTHORIZE to grant the id to users, and this will give those
+users access to the folder. This is preferred because of problems with
+running into system quota when checking for acls on a file with a large
+amount of acls. It is also means that you don't have to remember to
+remove the access for that user from a folder if that user is removed
+from the system.
+
+A user with BULLETIN privileges (see HELP SET PRIV) will be able to
+select a protected folder regardless of the access settings. However, a
+user without explicit access will not receive login notifications of new
+messages, and thus will not be able to set any login flags. (NOTE: If
+such a user selects such a folder and then uses SET ACCESS to grant him
+or herself access, the user must reselect the folder in order for the
+new access to take affect in order to be able to set login flags.)
+3 id
+The id-name can be one or more ids contained in the system Rights
+Database. This includes usernames and UICs. A UIC that contains a
+comma must be enclosed in quotes. UICs can contain wildcards, i.e.
+"[130,*]". Note that by default, a process is given the process rights
+id SYS$NODE_nodename, where nodename is the decnet nodename. Thus, by
+specifing this id, a folder can be restricted to a specific node, which
+is useful when the folder is shared among nodes in a cluster.
+
+Alternatively, the id-name can be a filename which contains a list of
+ids. The filename should be preceeded by a "@". If the suffix is not
+specified, it will be assumed that the suffix is ".DIS" .
+3 /ALL
+Specifies that access to the folder is granted to all users. If /READ
+is not specified, the folder will no longer be private. If /READ is
+specified, all users will have read access, but only privileged users
+will have write access (of course non-privileged users can gain access
+via a later SET ACCESS command.)
+
+Format:
+
+ SET ACCESS /ALL [folder-name]
+3 /READ
+Specifies that access to the folder will be limited to being able to
+read the messages.
+3 Warning
+If a user logs in after a private folder has been created but before
+being given access, and then is given access, any defaults that the
+folder has, i.e. /BRIEF, /READNEW, & /NOTIFY, will not be set for that
+user. This is because if the id is not a username, it becomes an
+extremely lengthy operation to check each user to see if have that id
+assigned to them. The alternative is to set the defaults for all users
+after every SET ACCESS, but that might cause problems with users who
+have manually reset those defaults. The correct solution requires a
+large programming modification, which will be done in a later version.
+`,
},
{
- command: "BRIEF",
- boolFlags: []string{
- "/ALL",
- "/DEFAULT",
- "/FOLDER",
- "/PERMANENT",
- },
+ Name: "ALWAYS",
+ Description: `Specifies that the selected folder has the ALWAYS attribute. This
+causes messages in the folder to be displayed differently when logging
+in. SYSTEM messages will be displayed every time a user logs in, rather
+than just once. Non-SYSTEM message will also be displayed every time
+(in whatever mode is selected, i.e. BRIEF, SHOWNEW, or READNEW) until
+the user actually reads that message (or a later one). This feature is
+meant for messages which are very important, and thus you want to make
+sure they are read.
+
+ Format:
+
+ SET [NO]ALWAYS
+`,
},
{
- command: "CONTINUOUS_BRIEF",
+ Name: "BBOARD",
+ Description: `Specifies a username to be used as a BBOARD destination. Mail which is
+sent to that user are converted into messages. This command will apply
+to the selected folder, and each folder can have its own BBOARD. Only
+privileged users or owners of the folders can set BBOARD. Note: The
+specified account must have the DISUSER flag specified in the system
+authorization file, and it either must be given SYSPRV privileges, or
+the scratch bboard_directory (specified when compiling BULLETIN) must
+have world rwed protection. Also, certain system parameters which
+affect detached subprocesses are usually too low for the subprocess
+which is spawned to read the mail. The parameters and the suggested
+values are: PQL_DPGFLQUOTA = 10000, PQL_DWSQUOTA = 500, and PQL_DFILLM
+= 30. If you are not using the BULLCP process, the subprocess limit for
+users must be at least 2.
+
+ Format:
+
+ SET BBOARD [username]
+
+BBOARD cannot be set for remote folders. See also the commands SET
+STRIP and SET DIGEST for options on formatting BBOARD messages.
+
+If BULLCP is running, BBOARD is updated every 15 minutes. If you want
+to length this period, define BULL_BBOARD_UPDATE to be the number of
+minutes, between updates. I.e. DEFINE/SYSTEM BULL_BBOARD_UPDATE "30"
+will cause the updates to be don every 30 minutes.
+
+NOTE: If you want to control the expiration date on a per message basis,
+you can do so by adding a special header line to the message. The form
+is Expires: or X-Expires: followed by the date in the form DD MMM YYYY.
+The time will always be 00:00, even if the time is specified on the line.
+3 /EXPIRATION
+ /EXPIRATION=days
+ /NOEXPIRATION
+
+Specifies the number of days the message created by the BBOARD is to be
+retained. The default is 14 days. The highest limit that can be
+specified is 30 days. This can be overridden by a user with privileges.
+If /NOEXPIRATION is specified, messages will become permanent.
+
+NOTE: This value is the same value as specified by SET DEFAULT_EXPIRE.
+If one is changed, the other will change also.
+3 /SPECIAL
+Specifies that the input should be processed using a special command
+procedure, and not to use the simple VMS MAIL to message conversion.
+Specifying a username is optional. To remove this feature, you must
+either SET NOBBOARD, or SET BBOARD and specify a username. See
+installation notes for exactly how to use this feature.
+3 /VMSMAIL
+Used in conjunction with /SPECIAL. If /SPECIAL and a username is
+specified, and the conversion still takes its input from VMS MAIL, then
+the VMS system mail file is checked to see if new mail exists for the
+specified user before running the command procedure. This saves time
+and avoids creating subprocesses. (Useful if input is digest format.)
+3 Listserv
+For a LISTSERV mailing list, only a subscribed user can post to it. If
+the BBOARD account is subscribed to the list in order for BULLETIN to
+receive the list, only the BBOARD account will be able to post to it.
+This problem is solved by placing the word LISTSERV in the folder
+description line. Then, messages sent to the mailing list by the POST
+command will be sent from the BBOARD account rather than from the user's
+account. For example, the folder description might be:
+
+FAKE MAILING LIST <FAKELIST@FAKENODE.BITNET> LISTSERV.
+
+If you have PMDF or MX installed, the corresponding logical name
+PMDF_REPLY_TO or MX_REPLY_TO will be temporarily defined in order to add
+a REPLY-TO: line to the message header to display the real user's
+address.
+
+Users who use the method described in HELP SET BBOARD MORE_INFORMATION
+should note the following: When using this LISTSERV feature, the BBOARD
+account must be a real account, not simply a VMS MAIL forwarding entry.
+Mail can only be sent from a real account. However, if mail forwarding
+is set for that the account, the account does not need a real directory
+or a unique uic, since it will not need space to store mail.
+
+In order to be able to send LISTSERV commands from the BBOARD account
+without having to actually login to the BBOARD account, there is a
+utility included with BULLETIN called SETUSER. This requires privileges
+to use. After compiling it, use the link command:
+
+ LINK SETUSER,SYS$SYSTEM:SYS.STB/SELECT
+
+When you run it, it will prompt for a username. After verifying that
+the given username is a valid account, it will then change your
+process's username. You can then send mail from that account.
+
+If you are using PMDF or MX, and wish to use this feature, you can still
+do so by setting BBOARD. As long as the BBOARD account is not a real
+account, it will work properly, even though the mail feed is not really
+coming from the BBOARD account.
+
+In order to find out if the LISTSERV mailing list will accept posts only
+from subscribed users, send the command 'REV listname'. This will
+retrieve the file listname.LIST. It begins with a list of keywords. If
+the keyword 'send' is set to 'public', you don't need to set the
+LISTSERV switch. If it's set to 'private', you do. For a description
+of the keywords and the meaning of their settings, send any LISTSERV the
+command 'INFO KEY'. Note that the 'listname.LIST' files include a list
+of owners and subscribers. If 'send' is set to 'owners', then neither
+the public nor the subscribers can post to the list.
+
+3 More_information
+If more than one folder is to have a BBOARD setting, only one of the
+BBOARD names need be a real account. All other names could be names
+whose mail is forwarded to the real account. BULLETIN will then
+determine from the mail header which folder the mail is to be sent to.
+Forwarding can be enabled for any name within MAIL by the command:
+
+ MAIL> SET FORWARD/USER=from_name to_name
+
+Any mail sent to FROM_NAME will be forwarded to TO_NAME. Thus, only
+TO_NAME need be a real account. For example, if you have INFOVAX and
+LASER-LOVERS folders, you need create only a INFOVAX account, and then
+forward LASER-LOVERS mail to INFOVAX within mail using the command SET
+FORWARD/USER=LASER-LOVERS INFOVAX. You would then do a SET BBOARD
+INFOVAX for the INFOVAX folder, and SET BBOARD LASER-LOVERS for the
+LASER-LOVERS folder. This method will speed up the BBOARD conversion,
+since mail need be read only from one account. NOTE: Folders that have
+the /SPECIAL set on their BBOARD accounts cannot have their mail
+forwarded to BBOARD accounts that don't have /SPECIAL set. Folders of
+the same type, i.e. that use the same /SPECIAL command procedure, must
+be grouped separately.
+
+The BBOARD account must match the mailing list name. If you prefer not
+to have them match, then you must include the actual address of the
+mailing list in the folder description in the format described under
+HELP CREATE /DESCRIPTION.
+`,
},
{
- command: "DEFAULT_EXPIRE",
+ Name: "BRIEF",
+ Description: `Controls whether you will be alerted upon logging that there are new
+messages in the currently selected folder. A new message is defined as
+one that has been created since the last time you logged in or accessed
+BULLETIN. Note the difference between BRIEF and READNEW. The latter
+causes a listing of the description of the new messages to be displayed
+and prompts the user to read the messages. Setting BRIEF will clear a
+READNEW setting (and visa versa).
+
+ Format:
+
+ SET [NO]BRIEF
+3 /ALL
+Specifies that the SET [NO]BRIEF option is the default for all users for
+the specified folder. This is a privileged qualifier.
+3 /DEFAULT
+Specifies that the [NO]BRIEF option is the default for the specified
+folder. This is a privileged qualifier. It will only affect brand new
+users (or those that have never logged in). Use /ALL to modify all users.
+3 /FOLDER
+ /FOLDER=foldername
+
+Specifies the folder for which the option is to modified. If not
+specified, the selected folder is modified. Valid only with NOBRIEF.
+3 /PERMANENT
+ /[NO]PERMANENT
+
+Specifies that BRIEF is a permanent flag and cannot be changed by the
+individual, except if changing to SHOWNEW or READNEW. This is a
+privileged qualifier.
+`,
},
{
- command: "DIGEST",
+ Name: "CONTINUOUS_BRIEF",
+ Description: `Specifies that if BRIEF is set for a folder, and there are new messages,
+the notification message "there are new messages" will be displayed every
+time when logging in, until the new messages are read. Normally, the
+BRIEF setting causes notification only at the first time that new messages
+are detected.
+
+ Format:
+
+ SET [NO]CONTINUOUS_BRIEF
+
+NOTE: Both SET GENERIC and SET CONTINUOUS_BRIEF cannot be set for the
+same user.
+`,
},
{
- command: "DUMP",
+ Name: "DEFAULT_EXPIRE",
+ Description: `Specifies the number of days the message created by BBOARD (or direct
+PMDF path) is to be retained. The default is 14 days. The highest
+limit that can be specified is 30 days. This can be overridden by a
+user with privileges.
+
+This also specifies the default expiration date when adding a message.
+If no expiration date is entered when prompted for a date, or if
+prompting has been disabled via SET NOPROMPT_EXPIRE, this value will be
+used.
+
+ Format:
+
+ SET DEFAULT_EXPIRE days
+
+If -1 is specified, messages will become permanent. If 0 is specified,
+no default expiration date will be present. The latter should never be
+specified for a folder with a BBOARD, or else the messages will
+disappear.
+
+NOTE: This value is the same value that SET BBOARD/EXPIRATION specifies.
+If one is changed, the other will change also.
+`,
},
{
- command: "EXPIRE_LIMIT",
+ Name: "DIGEST",
+ Description: `Affect only messages which are added via either the BBOARD option, or
+written directly from a network mailing program (i.e. PMDF). Several
+mailing lists use digest format to send their messages, i.e. the
+messages are concatenated into one long message. If DIGEST is set, the
+messages will be separated into individual BULLETIN messages.
+
+ Format:
+
+ SET [NO]DIGEST
+
+The command SHOW FOLDER/FULL will show if DIGEST has been set.
+
+`,
},
{
- command: "FOLDER",
- boolFlags: []string{
- "/MARKED",
- },
+ Name: "DUMP",
+ Description: `Specifies that messages deleted from the selected folder are written
+into a dump (or log) file. The name of the log file is foldername.LOG,
+and it is located in the folder directory.
+
+ Format:
+
+ SET [NO]DUMP
+
+The command SHOW FOLDER/FULL will show if dump has been set. (NOTE:
+SHOW FOLDER/FULL is a privileged command.)
+`,
},
{
- command: "GENERIC",
- boolFlags: []string{
- "/DAYS",
- },
+ Name: "EXPIRE_LIMIT",
+ Description: `Specifies expiration limit that is allowed for messages. Non-privileged
+users cannot specify an expiration that exceeds the number of days
+specified. Privileged users can exceed the limit.
+
+ SET [NO]EXPIRE_LIMIT [days]
+
+The command SHOW FOLDER/FULL will show the expiration limit, if one
+exists. (NOTE: SHOW FOLDER/FULL is a privileged command.)
+`,
},
{
- command: "KEYPAD",
+ Name: "FOLDER",
+ Description: `Select a folder of messages. Identical to the SELECT command. See help
+on that command for more information.
+
+ Format:
+
+ SET FOLDER [node-name::][folder-name]
+3 /MARKED
+Selects messages that have been marked (indicated by an asterisk).
+After using /MARKED, in order to see all messages, the folder will have
+to be reselected.
+`,
},
{
- command: "LOGIN",
+ Name: "GENERIC",
+ Description: `Specifies that the given account is a "generic" account, i.e used by
+many different people. If an account is specified as GENERIC, new
+messages placed in the GENERAL folder will be displayed upon logging in
+for a specific number of days, rather than only once. The default
+period is 7 days. This command is a privileged command.
+
+ Format:
+
+ SET [NO]GENERIC username
+
+NOTE: Both SET GENERIC and SET CONTINUOUS_BRIEF cannot be set for the
+same user.
+3 /DAYS
+ /DAYS=number_of_days
+
+Specifies the number days that new GENERAL messages will be displayed
+for upon logging in.
+`,
},
{
- command: "NODE",
- boolFlags: []string{
- "/FOLDER",
- },
+ Name: "KEYPAD",
+ Description: `Controls whether the keypad has been enabled such that the keys on the
+keypad correspond to command definitions. These definitions can be seen
+via the SHOW KEYPAD command. The default is NOKEYPAD unless the /KEYPAD
+qualifier has been added to the BULLETIN command line.
+
+ Format:
+
+ SET [NO]KEYPAD
+`,
},
{
- command: "NOTIFY",
- boolFlags: []string{
- "/ALL",
- "/DEFAULT",
- "/FOLDER",
- "/PERMANENT",
- },
+ Name: "LOGIN",
+ Description: `Controls whether the specified user will be alerted of any messages,
+whether system or non-system, upon logging in. If an account has the
+DISMAIL flag set, SET NOLOGIN is automatically applied to that account
+during the first time that the account logs in. However, this will not
+occur if DISMAIL is set for an old account. Additionally, removing the
+DISMAIL flag will not automatically enable LOGIN. (The reason for the
+above was to avoid extra overhead for constant checking for the DISMAIL
+flag.) This command is a privileged command.
+
+ Format:
+
+ SET [NO]LOGIN username
+`,
},
{
- command: "PAGE",
+ Name: "NODE",
+ Description: `Modifies the selected folder from a local folder to a remote folder. A
+remote folder is a folder in which the messages are actually stored on a
+folder at a remote DECNET node. The SET NODE command specifies the name
+of the remote node, and optionally the name of the remote folder. If
+the remote folder name is not included, it is assumed to be the same as
+the local folder. When the command is executed, the selected folder
+will then point to the remote folder. If there were messages in the
+local folder, they will be deleted. This feature is present only if the
+BULLCP process is running on the remote node.
+
+ Format:
+ SET NODE nodename [remotename]
+ SET NONODE
+
+NOTE: If one node adds a message to a remote node, other nodes connected
+to the same folder will not immediately be aware of the new message.
+This info is updated every 15 minutes, or if a user accesses that
+folder.
+3 /FOLDER
+ /FOLDER=foldername
+
+Specifies the folder for which the node information is to modified.
+If not specified, the selected folder is modified.
+`,
},
{
- command: "PRIVILEGES",
- boolFlags: []string{
- "/ID",
- },
+ Name: "NOTIFY",
+ Description: `Specifies whether you will be notified via a broadcast message when a
+message is added to the selected folder.
+
+ Format:
+
+ SET [NO]NOTIFY
+
+In a cluster, if the logical name MAIL$SYSTEM_FLAGS is defined so that
+bit 1 is set, users will be notified no matter which node they are logged
+in to. If you wish to disable this, you should define BULL_SYSTEM_FLAGS
+so that bit 1 is cleared.
+3 /ALL
+Specifies that the SET [NO]NOTIFY option is the default for all users for
+the specified folder. This is a privileged qualifier.
+3 /DEFAULT
+Specifies that the [NO]NOTIFY option is the default for the specified
+folder. This is a privileged qualifier. It will only affect brand new
+users (or those that have never logged in). Use /ALL to modify all users.
+3 /FOLDER
+ /FOLDER=foldername
+
+Specifies the folder for which the option is to modified. If not
+specified, the selected folder is modified. Valid only with NONOTIFY.
+3 /PERMANENT
+ /[NO]PERMANENT
+
+Specifies that NOTIFY is a permanent flag and cannot be changed by the
+individual. /DEFAULT must be specified. This is a privileged qualifier.
+`,
},
{
- command: "PROMPT_EXPIRE",
+ Name: "PAGE",
+ Description: `Specifies whether any directory listing or message reading output will
+pause when it reaches the end of the page or not. Setting NOPAGE is
+useful for terminals that can store more than one screenful at a time,
+and that have a remote printer that can then print the contents of the
+terminal's memory. The default is PAGE, unless the default was changed
+by specifying /NOPAGE on the command line to invoke BULLETIN.
+
+ Format:
+
+ SET [NO]PAGE
+`,
},
{
- command: "READNEW",
- boolFlags: []string{
- "/ALL",
- "/DEFAULT",
- "/FOLDER",
- "/PERMANENT",
- },
+ Name: "PRIVILEGES",
+ Description: `Specifies either process privileges or rights identifiers that are
+necessary to use privileged commands. Use the SHOW PRIVILEGES command
+to see what is presently set. This is a privileged command.
+
+ Format:
+
+ SET PRIVILEGES parameters
+
+The parameters are one or more privileges separated by commas. To
+remove a privilege, specify the privilege preceeded by "NO". If /ID is
+specified, the parameters are rights identifiers.
+3 /ID
+ /[NO]ID
+
+If specified, then the rights identifier which is specified as the
+parameter will allow users holding that rights identifier to execute
+privileged commands. If /NOID is specified, the identifier is removed.
+`,
},
{
- command: "SHOWNEW",
- boolFlags: []string{
- "/ALL",
- "/DEFAULT",
- "/FOLDER",
- "/PERMANENT",
- },
+ Name: "PROMPT_EXPIRE",
+ Description: `Specifies that a user will be prompted for an expiration date when
+adding a message. If NOPROMPT_EXPIRE is specified, the user will not be
+prompted, and the default expiration (which is set by SET DEFAULT_EXPIRE
+or SET BBOARD/EXPIRATION) will be used. If the value specified is
+greater than the expiration limit, and the user does not have
+privileges, then the expiration limit will be used as the default
+expiration. (If there is no expiration limit, and the user doesn't have
+privileges, then an error will result.) PROMPT_EXPIRE is the default.
+
+ Format:
+
+ SET [NO]PROMPT_EXPIRE
+`,
},
{
- command: "STRIP",
+ Name: "READNEW",
+ Description: `Controls whether you will be prompted upon logging in if you wish to
+read new non-system or folder messages (if any exist). A new message is
+defined as one that has been added since the last login, or since
+accessing BULLETIN. The default setting for READNEW is dependent on how
+the folder was created by the owner.
+
+In order to apply this to a specific folder, first select the folder
+(using the SELECT command), and then enter the SET READNEW command.
+
+ Format:
+
+ SET [NO]READNEW
+
+NOTE: If you have several folders with READNEW enabled, each folder's
+messages will be displayed separately. However, if you EXIT the READNEW
+mode before all the folders have been displayed, you will not be alerted
+of the new messages in the undisplayed folders the next time you login.
+However, if you enter BULLETIN, you will be told that new messages are
+present in those other folders. Also, it is not possible to EXIT the
+READNEW mode if there are SYSTEM folders which have new messages. Typing
+the EXIT command will cause you to skip to those folders. (See HELP SET
+SYSTEM for a description of a SYSTEM folder).
+3 /ALL
+Specifies that the SET [NO]READNEW option is the default for all users for
+the specified folder. This is a privileged qualifier. The difference
+between this and /DEFAULT is that the latter will only apply to new users
+(i.e. any users which have never executed BULLETIN).
+3 /DEFAULT
+Specifies that the [NO]READNEW option is the default for the specified
+folder. This is a privileged qualifier. It will only affect brand new
+users (or those that have never logged in). Use /ALL to modify all users.
+3 /FOLDER
+ /FOLDER=foldername
+
+Specifies the folder for which the option is to modified. If not
+specified, the selected folder is modified. Valid only with NOREADNEW.
+3 /PERMANENT
+ /[NO]PERMANENT
+
+Specifies that READNEW is a permanent flag and cannot be changed by the
+individual. This is a privileged qualifier.
+`,
},
{
- command: "SYSTEM",
+ Name: "SHOWNEW",
+ Description: `Controls whether a directory listing of new messages for the current
+folder will be displayed when logging in. This is similar to READNEW,
+except you will not be prompted to read the messages. The default is
+dependent on how the folder was created by the owner. A new message is
+defined as one that has been added since the last login, or since
+accessing BULLETIN.
+
+In order to apply this to a specific folder, first select the folder
+(using the SELECT command), and then enter the SET SHOWNEW command.
+
+ Format:
+
+ SET [NO]SHOWNEW
+3 /ALL
+Specifies that the SET [NO]SHOWNEW option is the default for all users for
+the specified folder. This is a privileged qualifier. The difference
+between this and /DEFAULT is that the latter will only apply to new users
+(i.e. any users which have never executed BULLETIN).
+3 /DEFAULT
+Specifies that the [NO]SHOWNEW option is the default for the specified
+folder. This is a privileged qualifier. It will only affect brand new
+users (or those that have never logged in). Use /ALL to modify all users.
+3 /FOLDER
+ /FOLDER=foldername
+
+Specifies the folder for which the option is to modified. If not
+specified, the selected folder is modified. Valid only with NOSHOWNEW.
+3 /PERMANENT
+ /[NO]PERMANENT
+
+Specifies that SHOWNEW is a permanent flag and cannot be changed by the
+individual, except if changing to READNEW. This is a privileged qualifier.
+`,
},
- },
- },
- {
- command: "SHOW",
- commands: []*command{
{
- command: "FLAGS",
+ Name: "STRIP",
+ Description: `Affect only messages which are added via either the BBOARD option, or
+written directly from a network mailing program (i.e. PMDF). If
+STRIP is set, the header of the mail message will be stripped off
+before it is stored as a BULLETIN message.
+
+ Format:
+
+ SET [NO]STRIP
+
+The command SHOW FOLDER/FULL will show if STRIP has been set.
+`,
},
{
- command: "FOLDER",
- boolFlags: []string{
- "/FULL",
- },
+ Name: "SYSTEM",
+ Description: `Specifies that the selected folder is a SYSTEM folder. A SYSTEM folder
+is allowed to have SYSTEM and SHUTDOWN messages added to it. This is a
+privileged command.
+
+ Format:
+
+ SET [NO]SYSTEM
+
+By default, the GENERAL folder is a SYSTEM folder, and the setting for
+that folder cannot be removed.
+
+If the selected folder is remote, /SYSTEM cannot be specified unless the
+folder at the other node is also a SYSTEM folder.
+`,
},
+ },
+ },
+ {
+ Command: "SHOW",
+ Description: `The SHOW command displays information about certain characteristics.
+`,
+ Flags: dclish.Flags{
{
- command: "KEYPAD",
- boolFlags: []string{
- "/PRINT",
- },
+ Name: "FLAGS",
+ Description: `Shows whether BRIEF, NOTIFY, READNEW, or SHOWNEW has been set for the
+currently selected folder.
+`,
},
{
- command: "NEW",
+ Name: "FOLDER",
+ Description: `Shows information about a folder of messages. Owner and description are
+shown. If the folder name is omitted, and a folder has been selected via
+the SELECT command, information about that folder is shown.
+
+ Format:
+
+ SHOW FOLDER [folder-name]
+3 /FULL
+Control whether all information of the folder is displayed. This
+includes DUMP & SYSTEM settings, the access list if the folder is
+private, and BBOARD information. This information is only those who
+have access to that folder.
+`,
},
{
- command: "PRIVILEGES",
+ Name: "KEYPAD",
+ Description: `Displays the keypad command definitions. If the keypad has been enabled
+by either the SET KEYPAD COMMAND, or /KEYPAD is specified on the command
+line, the keypad keys will be defined as commands. SHOW KEYPAD is the
+equivalent of HELP KEYPAD.
+
+NOTE: If the keypad is not enabled, PF2 is defined to be SET KEYPAD.
+3 /PRINT
+Prints the keypad definitions on the default printer (SYS$PRINT).
+`,
},
{
- command: "USER",
- boolFlags: []string{
- "/ALL",
- "/LOGIN",
- },
+ Name: "NEW",
+ Description: `Shows folders which have new unread messages for which BRIEF or READNEW
+have been set. (Note: If you enter BULLETIN but do not read new unread
+messages, you will not be notified about them the next time you enter
+BULLETIN. This is a design "feature" and cannot easily be changed.)
+`,
},
{
- command: "VERSION",
+ Name: "PRIVILEGES",
+ Description: `Shows the privileges necessary to use privileged commands. Also shows
+any rights identifiers that would also give a user privileges. (The
+latter are ACLs which are set on the BULLUSER.DAT file.)
+`,
},
{
- command: "SPAWN",
+ Name: "USER",
+ Description: `Shows the last time that a user logged in, or if /FOLDER is specified,
+the latest message which a user has read in the folder. If NOLOGIN is
+set for a user, this information will be displayed. This is a
+privileged command. Non-privileged users will only be able to display
+the information for their own account.
+
+ Format:
+ SHOW USER [username]
+
+The username is optional. If omitted, the process's username is used.
+The username should not be included if /ALL or /[NO]LOGIN is specified.
+
+NOTE: The last logged in time displayed is that which is stored when the
+BULLETIN/LOGIN command is executed, not that which VMS stores. Some
+sites make BULLETIN/LOGIN an optional command for users to store in
+their own LOGIN.COM, so this command can be used to show which users
+have done this.
+3 /ALL
+Specifies that information for all users is to be displayed. This is a
+privileged command.
+3 /LOGIN
+ /[NO]LOGIN
+
+Specifies that only those users which do not have NOLOGIN set are to be
+displayed. If negated, only those users with NOLOGIN set are displayed.
+This is a privileged command. The qualifier /ALL need not be specified.
+3 /FOLDER
+ /FOLDER=[foldername]
+
+Specifies to display the latest message that was read by the user(s) for
+the specified foldername. A newsgroup can be specified, but the info
+can only be shown if the user has subscribed to the newsgroup. If the
+foldername is not specified, the selected folder will be used.
+3 /SINCE
+ /SINCE=[date]
+
+Specifies to display only those users whose latest read message date is
+the same date or later than the specified date. If no date is
+specified, the date of the current message is used. Only valid for
+folders or with /LOGIN. Use /START for newsgroups.
+3 /START
+ /START=[number]
+
+Specifies to display only those users whose latest read message number
+is equal to or greather than the specified number. If no number is
+specified, the message number of the current message is used. Only
+valid for newsgroups. Use /SINCE for folders and with /LOGIN.
+`,
},
{
- command: "UNDELETE",
+ Name: "VERSION",
+ Description: `Shows the version of BULLETIN and the date that the executable was
+linked.
+`,
},
},
},
+ {
+ Command: "SPAWN",
+ Description: `Creates a subprocess of the current process. To return to BULLETIN,
+type LOGOUT.
+
+ Format:
+ SPAWN [command-string]
+
+NOTE: BULLETIN disables the use of CONTROL-C, so that you must use
+CONTROL-Y if you wish to break out of a spawned command.
+`,
+ },
+ {
+ Command: "SUBSCRIBE",
+ Description: `Used only for NEWS folders. Specifies that BULLETIN will keep track of
+the newest message that has been read for that NEWS folder. When the
+NEWS folder is selected, the message pointer will automatically point to
+the next newest message that has not been read.
+`,
+ },
+ {
+ Command: "UNDELETE",
+ Description: `Undeletes he specified message if the message was deleted using the
+DELETE command. Deleted messages are not actually deleted but have
+their expiration date set to 15 minutes in the future and are deleted
+then. Undeleting the message will reset the expiration date back to its
+original value. Deleted messages will be indicated as such by the
+string (DELETED) when either reading or doing a directory listing.
+
+ Format:
+ UNDELETE [message-number]
+`,
+ },
+ {
+ Command: "UNSUBSCRIBE",
+ Description: `Used only for NEWS folders. Specifies that BULLETIN will no longer keep
+track of the newest message that has been read for that NEWS folder. See the
+SUBSCRIBE command for further info.
+`,
+ },
}
diff --git a/repl/repl.go b/repl/repl.go
index ce2ecd2db47cb41cb60c7abbcc7d146c8993a198..96683609cd0177fa42e88c9458570a2772b42bfc 100644
--- a/repl/repl.go
+++ b/repl/repl.go
@@ -3,7 +3,6 @@ package repl
import (
"fmt"
- "strings"
"github.com/chzyer/readline"
)
@@ -22,13 +21,12 @@ func Loop(user string) error {
if err != nil {
return err
}
- words := strings.Field(strings.ReplaceAll(line, "/", " /"))
- if len(words) {
+ if len(line) == 0 {
continue
}
- switch strings.ToUpper(words[0]) {
- case "ADD":
- commandAdd()
+ err = commands.ParseAndRun(line)
+ if err != nil {
+ return err
}
}