home *** CD-ROM | disk | FTP | other *** search
/ CP/M / CPM_CDROM.iso / jsage / znode3 / tcj / tcj38.ws < prev    next >
Encoding:
Text File  |  1994-09-02  |  25.1 KB  |  461 lines

  1. The Z-System Corner
  2. TCJ Issue 38
  3. Jay Sage
  4.  
  5.  
  6.    True, February is a short month, but somehow I don't think that explainsì
  7. why the beginning of February (the due date for this column) came quickerì
  8. than usual.  It is probably a good thing that I have convinced severalì
  9. others to start contributing regular columns to TCJ.  That way, Art Carlsonì
  10. may be busy enough not to notice that the deadline passed without my column. ì
  11. Because it is late and because we now have quite a few prolific writersì
  12. joining the TCJ ranks, I'm going to keep my column shorter than usual thisì
  13. time (I know I have said that before, but this time I think it really willì
  14. be true).
  15.  
  16.    For this issue I will be catching up on some correspondence, informingì
  17. you of the imminent release of the first high level language for Z-Systemì
  18. programming, bringing you up to date on Z-Node developments (there is a newì
  19. Z-Node Central), and beginning a discussion of issues related to bringing upì
  20. a remote access system (so that more of you might decide to set up a Z¡
  21. Node).
  22.  
  23.  
  24.                                   Letters
  25.  
  26.    Despite our requests for letters with your comments and suggestions, weì
  27. don't get very many.  Recently, however, Art forwarded to me two lengthy andì
  28. thoughtful letters from James Ott.  I would like to begin by addressing someì
  29. of his comments and questions.
  30.  
  31.  
  32. The ZCPR33 Programmer's Reference Manual
  33.  
  34.    First, Mr. Ott asked about the "Programmer's Reference Manual" to which Iì
  35. made reference in my ZCPR33 User's Guide.  Well, the truth is that afterì
  36. writing the user's guide, I really didn't have energy left for another majorì
  37. manual.  Instead, I started to release programming notes one at a time asì
  38. files on the Z-Nodes.  Even at that, I only got to three of them.  The filesì
  39. have names of the form Z33PNOTE.###, where "###" is a sequence number.  Noteì
  40. 001 deals with the command status flag in the message buffer and theì
  41. extensions in its use introduced with ZCPR33.  Note 002 discusses properì
  42. coding techniques for shells under ZCPR33 and later.  The third note coversì
  43. the parsing of files by the Z33 and Z34 command processors.  I am tempted toì
  44. reproduce some of that material here, but then I would surely fail in myì
  45. resolve to keep this column to a reasonable length.  So you will just haveì
  46. to look for them at the Z-Node in your neighborhood.  If it is not there,ì
  47. see if the sysop will get a copy from Z-Node #3.
  48.  
  49.  
  50. Shells and ZEX
  51.  
  52.    Mr. Ott continued: "The User's Guide mentions an addition to shell codingì
  53. necessary to ensure the shell pushes its name onto the shell stack when itì
  54. is called by ZEX."  I think there is some misunderstanding here.  It wasì
  55. under previous versions of ZCPR3 that special code was required in shells toì
  56. deal with ZEX (and it never had to do with pushing anything onto the shellì
  57. stack).  Under Z33 and later, this code can (and, to make the programsì
  58. smaller, should) be removed.  It has now been quite some time since theì
  59. release of ZCPR33, and I think that most shells are now coded in the moreì
  60. efficient way.
  61.  
  62.    As we have discussed in previous columns, a shell command comes into playì
  63. when the command line buffer becomes empty.  In that case, if there is aì
  64. command on the shell stack, the command processor invokes that commandì
  65. instead of asking the user for the next command line.  In this way, theì
  66. shell takes over the function of the command processor.
  67.  
  68.    ZEX's function is similar to that of SUBMIT and XSUB together.  Whileì
  69. SUBMIT stores its script data in a disk file, ZEX keeps it in memory.  Thisì
  70. enables ZEX to run much faster, but it reduces the memory available toì
  71. programs.  A simple SUBMIT script feeds a series of commands to the commandì
  72. processor, thus doing under CP/M what the multiple command line of ZCPRì
  73. does.  SUBMIT can be useful even under ZCPR, however, because it can supplyì
  74. a longer string of commands than could fit into the command line buffer.
  75.  
  76.    XSUB running under SUBMIT allows characters in the script to be fed notì
  77. only to the command processor but also to programs as they run.  This isì
  78. what is called input/output (I/O) redirection.  In this case it is inputì
  79. redirection; the operating system is made to take its characters not fromì
  80. its normal source -- the keyboard -- but from a disk file (SUBMIT) or aì
  81. memory buffer (ZEX).  This is both extraordinarily useful andì
  82. extraordinarily tricky.  Long ago I promised to discuss this subject atì
  83. length in this column, but I have never gotten around to it.  Bridgerì
  84. Mitchell, Joe Wright, and I are now engaged in a joint project to perform aì
  85. major upgrading of ZEX, and I am sure it will be the subject of TCJ columnsì
  86. by one or more of us.
  87.  
  88.      The ZCPR33 command processor observes the following hierarchy forì
  89. acquiring new commands, where step 1 has the highest priority and step 5 theì
  90. lowest.  The way this hierarchy functions is described in more detail in theì
  91. ZCPR33 User's Guide.
  92.  
  93.     1.    Commands pending in the multiple command line buffer
  94.     2.    Commands from a ZEX script
  95.     3.    Commands from a SUBMIT script
  96.     4.    A shell command
  97.     5.    User input
  98.  
  99.    Under ZCPR30, ZEX did not appear explicitly in this hierarchy; it cameì
  100. into play only by virtue of its ability to redirect input at step 5.  Thisì
  101. posed a serious problem when a ZEX command was issued under a shell.    ì
  102. Although the user intended the script to be performed as commands, the shellì
  103. would take it as input to the shell instead.  To avoid this, rather lengthyì
  104. code had to be included in every shell to see if ZEX was running and, if so,ì
  105. to feed its input directly to the multiple command line buffer.  Thisì
  106. resulted in completely useless loads of the shell code for each line of theì
  107. ZEX script.  Execution was so slow and annoying that for all practicalì
  108. purposes ZEX scripts could not be run under shells.
  109.  
  110.    The ZCPR33 command processor was redesigned to deal with ZEX explicitlyì
  111. just as ZCPR30 always did with SUBMIT.  ZEX was placed above SUBMIT in theì
  112. hierarchy so that ZEX scripts would function like arbitrarily long commandì
  113. lines and could be invoked from SUBMIT scripts.
  114.  
  115.  
  116. The New Libraries
  117.  
  118.    Mr. Ott had several questions about the assembly-language libraries thatì
  119. support the Z-System.  I will not comment extensively here, but I would likeì
  120. to announce that new versions of the libraries, which have been in use by aì
  121. number of us for many months already, will soon be made available to theì
  122. public.  I had expected them to be a commercial product, but, for severalì
  123. reasons, it now appears that the code will be made available at no charge. ì
  124. Only the manual, which will be quite a large book, will be sold.  This isì
  125. good news.
  126.  
  127.    One of Mr. Ott's suggestions was that the Z3LIB routine called PRGLOAD,ì
  128. which is used for chaining from one program to another, be updated to allowì
  129. for type-3 programs.  This probably could be done without a great deal ofì
  130. difficulty, but I am not sure that it is worth the trouble.  What aboutì
  131. type-4 programs?  Loading them is much more complex because of the need toì
  132. compute the relocation to a run-time address.  It seems to me that a betterì
  133. way for programs to chain to other programs is via the multiple command lineì
  134. buffer.  If anyone can suggest any advantages of a direct load, I would beì
  135. interested in hearing them.
  136.  
  137.  
  138. The Command Line Tail
  139.  
  140.    One of the mistakes in ZCPR30 was its failure to check for command lineì
  141. tails that would not fit in the buffer from 80H to FFH.  CP/M had no problemì
  142. with this because the whole command line was not long enough to allow thisì
  143. to occur.  With a 200-or-more-character command line buffer, there isì
  144. nothing to stop a user from entering a command with a tail longer than 128ì
  145. bytes.  Under Z30 this caused a catastrophe, because the tail was copiedì
  146. into the buffer after the program was loaded, and then the tail couldì
  147. overwrite the beginning of the code.  Z33 and later monitor the length ofì
  148. the tail and stop copying before this can happen.
  149.  
  150.    With type-3 programs that load at addresses higher than 100H, longerì
  151. tails could be copied without damaging the code, and Mr. Ott requested thatì
  152. this be implemented in future versions of the command processor.  I thinkì
  153. this would be a very bad idea.  One of the reasons for using type-3 programsì
  154. is so that any code residing at 100H can be run again later using the GOì
  155. command.  If the type-3 program's tail overwrote the TPA, then trouble wouldì
  156. occur when the GO command was executed.
  157.  
  158.    Moreover, there is absolutely no need for such a feature.  If a programì
  159. wants to support a tail longer than 126 bytes (it doesn't even have to be aì
  160. type-3 program), it can simply read its arguments not from the buffer at 80Hì
  161. but directly from the multiple command line buffer.  As an aside, I haveì
  162. thought of making the command processor not convert the command line bufferì
  163. to upper case.  Then programs could process lower case input directly (as inì
  164. MS-DOS) without the special symbols to indicate case shifts as in the ECHOì
  165. and IF INPUT commands.  The command tail buffer at 80H must be converted toì
  166. upper case for compatibility with CP/M programs, which assume that that willì
  167. be done.  Besides the fact that there might be a significant code penaltyì
  168. (the command tail buffer and the command file control block would both haveì
  169. to be individually case shifted), I worry that there may be a number of Z¡
  170. System programs that either rely on the command line being in upper case or,ì
  171. worse, convert it to upper case.  I'd be interested in hearing any opinionsì
  172. on this topic.
  173.  
  174.  
  175. Still More on Z3 vs. Z2 Shells
  176.  
  177.    Mr. Ott sent me a lengthy letter with some interesting examples of theì
  178. use of the shell stack.  I think his is the first response I have receivedì
  179. that pointed out an aspect of the shell stack that I had not previouslyì
  180. appreciated.
  181.  
  182.    I don't think about shell command lines with more than one command, soì
  183. the following distinction never occurred to me.  One can think of the shellì
  184. stack as containing not just, say, four commands but rather four groups ofì
  185. commands.  The shell stack not only holds these commands; it also providesì
  186. the mechanism for grouping them, for providing parentheses, if you will. ì
  187. The Z2 approach to shelling would have a very hard time doing this.  Forì
  188. example, if the first element on the shell stack contains the command lineì
  189. "CMD1A;CMD1B" and the next lower element the line "CMD2A;CMD2B;CMD2C", theì
  190. equivalent Z2 situation would have the command line
  191.  
  192.     CMD1A;CMD1B;CMD2A;CMD2B;CMD2C
  193.  
  194. The SHCTRL POP command removes an entire Z3 shell entry, containingì
  195. possible multiple commands.  How could we implement this function with aì
  196. Z2-style shell?  Even if each command were marked with a "/s" token, oneì
  197. could still not tell which ones were grouped with which.  There might be aì
  198. solution to this problem, but the Z3 shell approach certainly handles itì
  199. nicely.
  200.  
  201.    Mr. Ott's letter included a very interesting application example.  I'veì
  202. made a few changes that, I hope, do not harm its essence.  When the computerì
  203. is booted, the STARTUP alias loads the command sequence "FIRSTSH;MENU",ì
  204. where FIRSTSH is a special utility that places the following commandì
  205. sequence onto the shell stack:
  206.  
  207.     PARK;VID RST.MSG;STOP
  208.  
  209. When this sequence runs, it will park the heads on the disk drive, display aì
  210. message to shut off the computer, and run a program called STOP that locksì
  211. the machine.  Of course, this multiple-command shell could easily beì
  212. replaced by an alias SHUTDOWN.
  213.  
  214.    This termination shell does not run immediately because of the commandì
  215. MENU following it in the command sequence.  This loads a second shell ontoì
  216. the shell stack.  The user then lives inside the MENU shell for some time. ì
  217. At some point, the user may make a selection that generates the command "CDì
  218. WORK:".  This would log into the WORK: directory and issue an automatic STì
  219. command there.  The ST alias might have the script
  220.  
  221.     LDR WORK.NDR;SHCTRL POP;ZFILER
  222.  
  223. This would install a new set of named directories, pop MENU off the shellì
  224. stack, and replace it with the ZFILER shell.  The user could then do someì
  225. work using ZFILER.  From ZFILER, a macro command might make another shellì
  226. change by popping the shell stack and installing another shell.
  227.  
  228.    The above process would continue until the user made an exit selection. ì
  229. This would pop the shell stack without installing a new shell.  As a result,ì
  230. that first line we put on the shell stack would become active, forcing theì
  231. computer to be shut down in an orderly, preplanned way.  Of course, thisì
  232. approach is not totally foolproof if the user has access to the power switchì
  233. or power cord.  But it certainly helps.
  234.  
  235.    Mr. Ott worried that this example could not be achieved using a Z2 shellì
  236. system.  I think it could, though not with quite the same ease and elegance. ì
  237. The STARTUP alias would contain the line
  238.  
  239.     MENU;SHUTDOWN
  240.  
  241. When MENU ran, it would substitute for itself in the command line theì
  242. desired command line plus its own reinvocation command with the flag "/S" toì
  243. mark it as a shell.  Thus the command line would become
  244.  
  245.     USERCMD;MENU /S;SHUTDOWN
  246.  
  247. For the user command CD WORK:, the command buffer would evolve as follows:
  248.  
  249.     CD WORK:;MENU /S;SHUTDOWN
  250.     ST;MENU /S;SHUTDOWN
  251.     LDR WORK.NDR;SHCTRL POP;ZFILER;MENU /S;SHUTDOWN
  252.  
  253. When the SHCTRL command ran, it would scan the command line for the nextì
  254. shell command as marked by the "/S" flag and remove it from the commandì
  255. line.  This would leave one with
  256.  
  257.     ZFILER;SHUTDOWN
  258.  
  259. When ZFILER generates a macro command, the command buffer would have
  260.  
  261.     MACROCMD;ZFILER /S;SHUTDOWN
  262.  
  263. This would continue until one cancelled the shell.  Then the SHUTDOWN aliasì
  264. would run.
  265.  
  266.    Mr. Ott was concerned that the command line would grow longer and longerì
  267. as old shell commands piled up.  Indeed, this would happen if there were noì
  268. 'popping' mechanism.  The "/S" marker I proposed in my previous columns isì
  269. critical here, since without it there would be no way to tell which commandì
  270. to pop.  This approach, I think, would fail with aliases as shell commands. ì
  271. The Z3-type shell really helps us in this case.
  272.  
  273.  
  274.                   High-Level-Language Support for Z-System
  275.  
  276.    I have some especially exciting news about the first high level languageì
  277. specially designed for Z-System.  In late January, I got a phone call fromì
  278. Leor Zolman, author of BDS C.  He was interested in bringing out a newì
  279. version of his C compiler for the modern 8-bit market.  After someì
  280. consultation with me on what was needed to support Z-System, Leor went toì
  281. work on the run-time code, and in less than two weeks he had a version readyì
  282. for beta testing
  283.  
  284.    He came over to my house to demonstrate the result, and I was amazed toì
  285. see how easily one could write a utility, complete with named-directoryì
  286. support, even including password protection.  A little fine-tuning is stillì
  287. needed, but I am already excited about the impact that the availability ofì
  288. this quality high level language will have on Z-System development. ì
  289. Marketing details have not been worked out at this point, but you can expectì
  290. the new BDS C to be available at an attractive price through Z Systemsì
  291. Associates (ZSA) channels (Plu*Perfect Systems, Sage Microsystems East, Z¡
  292. Nodes, and Z-Plan user groups).
  293.  
  294.  
  295.                            The New Z-Node Central
  296.  
  297.    Ron Bardarson, who had operated Z-Node Central after David McCord retiredì
  298. as the sysop, decided to change the focus of his system and his nodeì
  299. designation from Z-Node to X-Node.  This was to indicate its experimentalì
  300. nature and its focus on software and systems development rather than on theì
  301. distribution of Z-System software.  Its number remains 408-432-0821 (CASJOì
  302. on PC-Pursuit).
  303.  
  304.    To maintain a center of support for Z-System users and for Z-Node sysops,ì
  305. we have established a new Z-Node Central.  Richard Jacobson, whose Lilliputeì
  306. Z-Node in Chicago has long been, in my opinion, the premier Z-Node in theì
  307. country, has agreed to take on this new role.  He will continue to use theì
  308. delightfully ironic Gulliverian name (at over 100 Mbytes, his is the leastì
  309. Lilliputian of the Z-Nodes), but his node number now drops from 15 to 1.
  310.  
  311.    This new function is added to several special services that Lilliputeì
  312. already provides.  It is the official bulletin board and remote accessì
  313. system for both the North American One Eighty Group (NAOG) and TCJ.  Theì
  314. full system, comprising two independent computers, is available on aì
  315. subscription basis.  All users who provide registration information will getì
  316. 15 minutes per day of free access.  Unlimited access to both computersì
  317. (within reason) is available at a rate of $25 for six months or $40 for aì
  318. full year.  TCJ subscribers and NAOG members get free access to limitedì
  319. areas and can upgrade to full subscriber privileges at $5 less than theì
  320. standard rates.  Z-Node sysops will have free access to the full system. ì
  321. The phone numbers are 312-649-1730 and 312-664-1730, accessible via theì
  322. ILCHI outdial of PC-Pursuit.
  323.  
  324.  
  325.                        System Security Under Z-System
  326.  
  327.    As part of my plan to build up the network of Z-Nodes, I would like toì
  328. begin a series on issues related to setting up a remote access system (RAS)ì
  329. using Z-System.  Many people do not realize it, but NZCOM and Z3PLUS (theì
  330. automatic Z-Systems for CP/M-2 and CP/M-Plus, respectively) create systemsì
  331. with the full security capability necessary for a RAS.  It just takes a fewì
  332. simple operations to engage it.
  333.  
  334.    These issues have been brought to my attention recently because I haveì
  335. been in the process of setting up a second remote access system at my house. ì
  336. This one is for the BOSKUG group of the Boston Computer Society.  It will beì
  337. a two-line system running on a very powerful 16 MHz Kaypro 286 computer withì
  338. multitasking software.  For all this power, however, I was struck by theì
  339. tremendous complexity of setting up a remote system on such a computer, allì
  340. because of the lack of a secure operating system.
  341.  
  342.    With MS-DOS, a remote system absolutely cannot allow a caller to gainì
  343. direct access to the operating system command prompt, because once he hasì
  344. that access, there is no way to limit what he can do.  It made me realizeì
  345. how fortunate we are with Z-System to have an operating system with enoughì
  346. security to permit callers on a remote system to run the system more or lessì
  347. as if they were sitting at the keyboard of their personal machine.  Theyì
  348. don't have to have an elaborate apparatus standing between them and theì
  349. system.
  350.  
  351.    There are two main aspects of that security.  One is the wheel byte. ì
  352. This system flag is tested by many Z-System programs to determine whetherì
  353. certain operations should be permitted or denied.  Commands for doing thingsì
  354. like erasing, renaming, or copying files typically require that wheel statusì
  355. be in force.  Other commands will allow some operations to non-wheel usersì
  356. but deny other operations.  For example, some directory programs allowì
  357. writing an image of the directory to disk or to the printer.  These optionsì
  358. are (or should be) restricted to 'wheel' users.  The wheel byte itself isì
  359. set and cleared by special commands, such as the WHL command of the RCP. ì
  360. Obviously, a password must be entered correctly before WHL will set theì
  361. wheel byte.
  362.  
  363.    The second and more complex security feature in Z-System concerns theì
  364. facilities for limiting the disk areas which a user can access.  Many usersì
  365. are unaware of these features, and even those who are aware of them often doì
  366. not understand them fully and clearly.  I will cover the major points here.
  367.  
  368.    With version 3.3 of ZCPR, I introduced extensive and significant changesì
  369. in the way directory references and security are handled.  These changesì
  370. made understanding security more complex for the system implementor but muchì
  371. easier and less intrusive for the user.
  372.  
  373.    ZCPR3 supports two basic forms of directory reference, the disk/user orì
  374. DU form and the named directory or DIR form.  We will assume that the readerì
  375. is already somewhat familiar with the basic concepts.  The DU form is nativeì
  376. to CP/M, which knows about disk drives from 'A' to 'P' and user numbers fromì
  377. 0 to 31 (though there are restrictions on user numbers above 15).  The DUì
  378. form of directory reference is basically physical in nature.  Drive lettersì
  379. are associated with real physical devices, and the files in all user areasì
  380. associated with a given drive letter are stored on the same physical device. ì
  381. One can think of this directory structure as spanning a flat, two¡
  382. dimensional space (in contrast to the hierarchical tree-structuredì
  383. directories of Unix or MS-DOS).
  384.  
  385.    While the DU directories are basically physical, named directories areì
  386. purely logical constructs.  The named directory register (NDR) module in aì
  387. Z-System contains a mapping of directory names to drive/user values.  Theì
  388. user can load different sets of directory associations at different times. ì
  389. Thus, unlike the static (fixed in time) directory structure of Unix and MS¡
  390. DOS, the directory structure of Z-System can be dynamic (changing in time).
  391.  
  392.    When the DIR form is used, the command processor or a Z-System programì
  393. looks for the name in the NDR and substitutes the drive and user values. ì
  394. Only drive/user values are used in the actual file references processed byì
  395. the disk operating system (DOS).  Named directories provide two differentì
  396. and important functions.  One is convenience.  It is much easier to rememberì
  397. that one's assembly language tools are in ASM and one's wordprocessing filesì
  398. in TEXT than it is to remember that the directories are A7 and B13.  Theì
  399. second purpose of named directories is to provide security.
  400.  
  401.    Access to directory areas in a Z-System is controlled in both the DU andì
  402. DIR domains.  Under Z30 these two control mechanisms were completelyì
  403. independent; under Z33 and later, as we shall see, they are very closelyì
  404. coupled.  The limits in the DU domain are set by values in the environmentì
  405. descriptor (ENV) called max-drive and max-user.  They define a rectangularì
  406. area of allowed directories in the flat directory space, with drive valuesì
  407. ranging from 'A' to the drive specified by max-drive and user numbersì
  408. ranging from 0 to the number specified by max-user.  The smallest spaceì
  409. still includes the boot directory A0.
  410.  
  411.    Named directories offer a more flexible means of controlling access toì
  412. areas on a system.  The user can access a named directory even if it refersì
  413. to a DU area that is beyond the bounds defined above.  Each directory nameì
  414. can have an optional password associated with it.  Whenever a reference isì
  415. made to such a directory, the password is (should be) asked for and accessì
  416. granted only if it is entered correctly.
  417.  
  418.    There are a number of important exceptions to the two security limitsì
  419. described above.  One concerns the command search path specified in the Z¡
  420. System PATH module.  No restrictions whatever are imposed on the DU areasì
  421. specified there.  If the user was able to place a directory into the path,ì
  422. then it will always be scanned as necessary by the command processor, evenì
  423. if it would no longer be explicitly accessible.
  424.  
  425.    Another general exception occurs for the standard (but optional)ì
  426. configuration of the command processor called WPASS.  With this option, whenì
  427. the wheel byte is set, directory passwords are ignored.  The user can thenì
  428. freely make reference to any directories either within the specified DUì
  429. range or associated with a named directory (with or without a password).
  430.  
  431.    Versions of the command processor since Z33 also make the assumption thatì
  432. if a user is in a given directory at the present time he must have had theì
  433. authority to get there.  Therefore, the command processor will always acceptì
  434. any reference to the currently logged directory, even if the DU is out ofì
  435. range and it has no unprotected directory name.
  436.  
  437.    Another set of exceptions relates to the interplay of the DU and DIRì
  438. limits.  Recent versions of the command process act on the principle that ifì
  439. reference to a directory in one form (DU or DIR) would be allowed thenì
  440. references using the alternative form should be equally allowed.  Forì
  441. example, suppose that the max DU limit is set to B3 and that directory C4ì
  442. has the name DIRNAME with no password.  Z30 would have refused to accept aì
  443. reference to C4:, even though it would have no complaints about DIRNAME:. ì
  444. Under Z34, either would work.  Conversely, if directory area A3 in theì
  445. example had a directory name PRIVATE with password SECRET, Z30 would allow aì
  446. reference to A3: but would insist on correct password entry if the referenceì
  447. was made as PRIVATE:.  Again, Z34 always checks the alternate form ofì
  448. reference, and if either meets the security restrictions, then both areì
  449. accepted.
  450.  
  451.    The standard version of Z-System created by NZCOM or Z3PLUS has the maxì
  452. DU limit set to P31.  Thus all directories are allowed using the DU format. ì
  453. As a result, even when named directories with passwords are created, theyì
  454. are accepted freely.  In order to create a secure system, the values of max¡
  455. drive and max-user must be reduced.  Also, since password checking isì
  456. bypassed when the wheel byte is set, the wheel byte must be cleared beforeì
  457. the security limits imposed by directory passwords will take effect.  Onceì
  458. those two changes have been made, your NZCOM/Z3PLUS system is ready to serveì
  459. as a remote access system.
  460.  
  461.