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 } }