$CONTROL MAP,CODE,USLINIT                                               00010000
<< pvsys -- module 81 >>                                       <<01000>>00012000
<< hp32002c mpe source c.00.00 >>                                       00014000
$copyright     "(C) COPYRIGHT HEWLETT-PACKARD CO. 1980. ",            & 00016000
$     "THIS PROGRAM MAY BE USED WITH ONE COMPUTER SYSTEM AT A ",      & 00018000
$     "TIME AND SHALL NOT OTHERWISE BE RECORDED, TRANSMITTED OR ",    & 00020000
$     "STORED IN A RETRIEVAL SYSTEM.  COPYING OR OTHER REPRODUCTION ",& 00022000
$     "OF THIS PROGRAM EXCEPT FOR ARCHIVAL PURPOSES IS PROHIBITED ",  & 00024000
$     "WITHOUT THE PRIOR WRITTEN CONSENT OF HEWLETT-PACKARD COMPANY."   00026000
$set x0=off <<if on then monitoring code compiled>>                     00028000
$set x1=off <<if on then bug catching code compiled>>                   00030000
$set x2=off <<if on then dup mount check code compiled>>                00032000
$control privileged                                                     00034000
                                                               <<04278>>00036000
<< change all references to the now defunct 7935 to 7933.    >><<04278>>00038000
                                                                        00040000
$title "PVSYS - GLOBAL DECLARATIONS"                                    00042000
                                                                        00044000
begin                                                                   00046000
                                                                        00048000
$set x8=on                                                     <<p7519>>00050000
$include incllpdt                                              <<06275>>00052000
$include inclldt5                                              <<06275>>00054000
$page "INCLPCB - PROCESS CONTROL BLOCK INCLUDE FILE"           <<l7751>>00056000
$include inclpcb5                                              <<06467>>00058000
$include inclpvu                                               <<06466>>00060000
$page "INCLPXG - PXGLOBAL INCLUDE FILE"                        <<l7751>>00062000
$include inclpxg                                               <<06530>>00064000
$page "INCLJMAT - JOB MASTER TABLE INCLUDE FILE"               <<l7751>>00066000
$include incljmat                                              <<06530>>00068000
$page "INCLJIT - JOB INFORMATION TABLE INCLUDE FILE"           <<l7751>>00070000
$include incljit                                               <<06530>>00072000
$page "PVSYS - GLOBAL DECLARATIONS"                            <<l7751>>00074000
<<************************* pvsys (81) *************************>>      00076000
                                                                        00078000
logical stat=q-1;                                                       00080000
integer deltap = q-2;                                          <<monit>>00082000
integer x=x;                                                            00084000
integer s0=s-0,s1=s-1,s2=s-2,s3=s-3,s4=s-4,s5=s-5;                      00086000
integer qm0=q-0,qm5=q-5;                                                00088000
logical ls0=s-0;                                                        00090000
double ds1=s-1,ds3=s-3,ds6=s-6;                                         00092000
logical pointer ps0 = s-0;                                              00094000
byte pointer bps0 = s-0;                                                00096000
                                                                        00098000
<< ** devlist array **                                                  00100000
   the devlist array is an array of logical devices which have been     00102000
   assigned to hold a mounted volume set. while the contents of the     00104000
   array vary during the sequence of procedures called to mount or      00106000
   dismount a volume set, the format is fixed. the initial contents     00108000
   are determined from the volume set definition.                       00110000
                                                                        00112000
   format -                                                             00114000
                                                                        00116000
      devlist( 0):                                                      00118000
          ( 0:8) - unused                                               00120000
          ( 8:8) - vmask, a logical bit mask indicating which volumes   00122000
                   of the set are to be mounted. if a volume class is   00124000
                   being mounted then vmask may represent only a subset 00126000
                   of the total volumes in the set. if a volume set is  00128000
      devlist( 1):                                                      00130000
          ( 0:8) - the number of drives obtained for the mount.         00132000
          ( 8:8) - the number of drives required for the mount.         00134000
      devlist( 2): volume 1 information (master volume)                 00136000
          ( 0:1) - bit identifying the contents of bits (1:7).          00138000
                   (see following definition).                          00140000
          ( 1:7) - subtype of the drive required or the vtab index      00142000
                   of the drive assigned to this volume. if bit         00144000
                   (0:1) is set, the field represents the subtype       00146000
                   of the drive required.                               00148000
          ( 8:8) - the logical device which has been assigned to the    00150000
      devlist( 3): volume 2 information (may be zero)                   00152000
          ( 0:1) - bit identifying the contents of bits (1:7).          00154000
          ( 1:7) - subtype/vtab index.                                  00156000
          ( 8:8) - the logical device which has been assigned to the    00158000
                   volume.                                              00160000
      devlist( 4): volume 3 information (may be zero)                   00162000
          ( 0:1) - bit identifying the contents of bits (1:7).          00164000
          ( 1:7) - subtype/vtab index.                                  00166000
          ( 8:8) - the logical device which has been assigned to the    00168000
                   volume.                                              00170000
      devlist( 5): volume 4 information (may be zero)                   00172000
          ( 0:1) - bit identifying the contents of bits (1:7).          00174000
          ( 1:7) - subtype/vtab index.                                  00176000
          ( 8:8) - the logical device which has been assigned to the    00178000
                   volume.                                              00180000
      devlist( 6): volume 5 information (may be zero)                   00182000
          ( 0:1) - bit identifying the contents of bits (1:7).          00184000
          ( 1:7) - subtype/vtab index.                                  00186000
          ( 8:8) - the logical device which has been assigned to the    00188000
                   volume.                                              00190000
      devlist( 7): volume 6 information (may be zero)                   00192000
          ( 0:1) - bit identifying the contents of bits (1:7).          00194000
          ( 1:7) - subtype/vtab index.          .                       00196000
          ( 8:8) - the logical device which has been assigned to the    00198000
                   volume.                                              00200000
      devlist( 8): volume 7 information (may be zero)                   00202000
          ( 0:1) - bit identifying the contents of bits (1:7).          00204000
          ( 1:7) - subtype/vtab index.                                  00206000
          ( 8:8) - the logical device which has been assigned to the    00208000
                   volume.                                              00210000
      devlist( 9): volume 8 information (may be zero)                   00212000
          ( 0:1) - bit identifying the contents of bits (1:7).          00214000
          ( 1:7) - subtype/vtab index.                                  00216000
          ( 8:8) - the logical device which has been assigned to the    00218000
                   volume.                                              00220000
   a volume information will be zero only when a volume class is        00222000
   being mounted and the volume is not a member of the class. a         00224000
   zero entry will not occur when a volume set is being mounted         00226000
   unless the set has less than the maximum number of members.          00228000
>>                                                                      00230000
                                                                        00232000
equate  << mount/dismount request types >>                              00234000
     userreq1 = 0,  << :mount/:dismount with (un)binding >>             00236000
     userreq2 = 1,  << :mount/:dismount with no (un)binding >>          00238000
     sysreq1  = 2,  << system mount/dismount with (un)binding >>        00240000
     sysreq2  = 3,  << conditional system mount >>                      00242000
     sysreq3  = -3, << conditional system mount with binding>>          00244000
     sysreq4  = -2, << system mount with no (un)binding>>               00246000
     opreq    = 4,                                                      00248000
     byereq   = 5;  << dismount due to :bye>>                           00250000
                                                                        00252000
equate     << usertable functions >>                           <<*8864>>00254000
     adduser    = 0,                                           <<*8864>>00256000
     deluser    = 1,                                           <<*8864>>00258000
     getmvtabxs = 2,                                           <<*8864>>00260000
     getpins    = 3,                                           <<*8864>>00262000
     getuser    = 4;                                           <<*8864>>00264000
                                                               <<*8864>>00266000
logical pointer                                                         00268000
     pcb  = 3;                                                 <<06275>>00270000
                                                                        00272000
array mvtab(*) = db+0;                                                  00274000
                                                                        00276000
equate                                                                  00278000
       vdrefcnt    =  54,                                               00280000
       maxvolnum   =  8,  <<max. volumes per volume set>>               00282000
       devlistsize = maxvolnum + 2;                                     00284000
                                                                        00286000
                                                                        00288000
equate  << volume set definition (vsdefn) >>                            00290000
     vdmisc     =  4,  <<mvtab index>>                                  00292000
     vdinfo     =  5;  <<num. vols., vol. mask>>                        00294000
                                                                        00296000
equate  << volume label information >>                                  00298000
     ldevinfo     =  6,                                                 00300000
     lgenindex    =  7,                                                 00302000
     lsysid1      =  8,                                                 00304000
     lsysid2      =  9,                                                 00306000
     lvnameloc'   = 10,                                                 00308000
     linitdate    = 14,                                                 00310000
     ldirbase     = 15,                                                 00312000
     ldirsize     = 16,                                                 00314000
     lvsaccntloc' = 17,                                                 00316000
     lsysidloc    = 16,  <<bytes>>                                      00318000
     lvnameloc    = 20,  <<bytes>>                                      00320000
     lvdirinfo    = 30,                                                 00322000
     lvsaccntloc  = 34,  <<bytes>>                                      00324000
     lvsgrouploc  = 42,  <<bytes>>                                      00326000
     lvoldir      = 25,                                                 00328000
     lvoldirloc   = 50,  <<bytes>>                                      00330000
     lvsnameloc   = 50;  <<bytes>>                                      00332000
                                                                        00334000
equate  << data segments/sirs >>                                        00336000
     dirsir    = 8,                                                     00338000
     vtabdst   = 29,                                                    00340000
     vtabsir   = 22,                                                    00342000
     mvtabdst  = 53,                                                    00344000
     mvtabsir  = 27;                                           <<06466>>00346000
                                                                        00348000
equate  << table/entry sizes >>                                         00350000
     vdcentsize   = 56,  <<class definition entry>>                     00352000
     vdsentsize   = 56,  <<(maxvolnum+1)*vdventsize>>                   00354000
     vdventsize   =  6,                                                 00356000
     vdventsizeb  = 12,                                                 00358000
     mvtabentsize = 21,                                        <<*8864>>00360000
     mountcnt     =  1;                                        <<*8864>>00362000
                                                                        00364000
equate  << condition codes >>                                           00366000
     ccg = 0,                                                           00368000
     ccl = 1,                                                           00370000
     cce = 2;                                                           00372000
                                                               <<03511>>00374000
equate       << attachio parameter values >>                   <<03511>>00376000
  lock     = 16,       << function code to lock drive >>       <<03511>>00378000
  unlock   = 17,       << function code to unlock drive >>     <<03511>>00380000
  blockedio= 1;        << wait i/o >>                          <<03511>>00382000
                                                               <<03511>>00384000
  define  d7905r     = ( type=0 land stype= 4 )#,              <<03511>>00386000
          d7905f     = ( type=0 land stype= 5 )#,              <<03511>>00388000
          d7920      = ( type=0 land stype= 8 )#,              <<03511>>00390000
          d7925      = ( type=0 land stype= 9 )#,              <<03511>>00392000
          d7906r     = ( type=0 land stype=10 )#,              <<03511>>00394000
          d7906f     = ( type=0 land stype=11 )#,              <<03511>>00396000
          floppy     = ( type=2 )#,                            <<03511>>00398000
          d7911      = ( type=3 land stype= 1 )#,              <<06060>>00400000
          d7912      = ( type=3 land stype= 2 )#,              <<06060>>00402000
          d7914      = ( type=3 land stype= 4 )#,              <<06060>>00404000
          d7945      = ( type=3 land stype= 5 )#,              <<*8836>>00406000
          d7933      = ( type=3 land stype= 8 )#,              <<04278>>00408000
          linus      = ( type=3 land stype=0 )#,               <<03511>>00410000
          buffalo    = ( type=3 land stype=3 )#,               <<b8160>>00412000
          remvble    = (d7920 lor d7925 lor d7905r lor d7906r  <<07336>>00414000
                        lor floppy lor d7933                   <<b8160>>00416000
                        lor linus lor buffalo)#,               <<b8160>>00418000
          mhdisc     = ( (type=0 lor type=2 lor type=3) ) #;   <<03511>>00420000
                                                               <<03511>>00422000
equate                                                                  00424000
     r            =    0,  <<read i/o request>>                         00426000
     w            =    1,  <<write i/o request>>                        00428000
     f            =    8,  <<format track i/o request>>                 00430000
     in           =    9,  <<initialize track i/o request>>             00432000
     wl           =   11,  <<write label (sector 0) request>>           00434000
     rfs          =   10,  <<read full sector i/o request>>             00436000
     add          =    0,  <<mvtable - add entry>>                      00438000
     remove       =    1,  <<mvtable - remove entry>>                   00440000
     preserve     =    2,  <<mvtable - preserve entry>>                 00442000
     sysldev      =    1,  <<system disc logical device>>               00444000
     pvpmount     =   12,  <<log rec type - physical mount>>            00446000
     pvlmount     =   13;  <<log rec type - logical mount >>            00448000
                                                                        00450000
                                                                        00452000
define  << system global cells >>                                       00454000
     sysdb        = %1000#,                                             00456000
     vmountinfo   = absolute(sysdb+%365)#;                              00458000
                                                                        00460000
                                                                        00462000
define  << partial fields >>                                            00464000
     mvf        = ( 1:1)#,  <<master volume (volume label)>>            00466000
     downf      = ( 8:8)#,  <<mvtab entry - down pending mask>>         00468000
     ldevf      = ( 0:8)#,  <<vtab/mvtab entry ldev field>>             00470000
     headf      = ( 3:5)#,  <<head field of sector preamble>>           00472000
     inuse      = ( 0:1)#,  <<mvtab entry in use>>                      00474000
     hvolf      = ( 0:4)#,  <<mvtab entry hvol field>>                  00476000
     nvolf      = ( 4:4)#,  <<mvtab entry nvol field>>                  00478000
     usecntf    = ( 8:8)#,  <<mvtab use count field.        >> <<07177>>00480000
     numvol     = ( 0:4)#,  <<vs defn entry - vols in vs>>              00482000
     initallocf = ( 1:1)#,  <<vs defn entry - allocation flag>>         00484000
     mvtabxf    = ( 8:8)#,                                              00486000
     volmask    = ( 8:8)#,  <<vc defn entry - vols in class>>           00488000
     qstatus    = ( 8:5)#,                                              00490000
     gstatus    = (13:3)#,                                              00492000
     tstatus    = ( 8:8)#,                                              00494000
     scratchf   = ( 0:1)#,  <<scratch volume (volume label)>>           00496000
     serialf    = ( 2:1)#,  <<serial  volume (volume label)>>           00498000
     entsizef   = ( 8:8)#,  <<size field - system tables>>              00500000
     vtentnum   = ( 0:8)#,                                              00502000
     vtentsize  = ( 8:8)#,                                              00504000
     mvtentsize = ( 0:8)#;                                              00506000
                                                                        00508000
define  << user table mount and bind fields >>                          00510000
     ubndf   = ( 0:8)#,  << user bind  count >>                         00512000
     ucntf   = ( 8:8)#,  << user mount count >>                         00514000
     sbndf   = ( 0:8)#,  << system bind count >>                        00516000
     scntf   = ( 8:8)#;  << system mount count >>                       00518000
define  << vmount partial fields >>                                     00520000
     onf    = (15:1)#,                                                  00522000
     allf   = (14:1)#,                                                  00524000
     autof  = (13:1)#;                                                  00526000
                                                                        00528000
                                                               <<03504>>00530000
define cc=stat.(6:2)#;                                                  00532000
define duplicate = assemble(dup)#;                                      00534000
define delete = assemble(del)#;                                         00536000
define deletedbl = assemble(ddel)#;                                     00538000
define hardhalt = assemble(halt 0;br*-1)#;                              00540000
define disable = assemble (sed 0) #;                           <<06275>>00542000
define enable = assemble (sed 1)#;                             <<06275>>00544000
                                                                        00546000
equate pverrmsgset = 15;                                                00548000
                                                                        00550000
equate  << private volume errors (indices into pverrmsgset) >>          00552000
     okexit       =   0,                                                00554000
     vmountoff    =  20,                                                00556000
     opreject     =  21,                                                00558000
     notavail     =  22,                                                00560000
     systemuse    =  23,                                                00562000
     nodgroup     =  24,                                                00564000
     nodaccnt     =  25,                                                00566000
     notmounted   =  26,                                                00568000
     nodvset      =  27,                                                00570000
     nohvset      =  28,                                                00572000
     nohgroup     =  29,                                                00574000
     nohaccnt     =  30,                                                00576000
     novgroup     =  31,                                                00578000
     novaccnt     =  32,                                                00580000
     dupmount     =  33,                                                00582000
     notvalduser  =  34,                                                00584000
     downset      =  35,                                                00586000
     downvol      =  36,                                                00588000
     diffclass    =  37,                                                00590000
     usererr1     =  38,                                                00592000
     usererr2     =  39,                                                00594000
     discerr      =  40,                                                00596000
     wrongen      =  41,                                                00598000
     dupbind      =  42,                                                00600000
     invname      =  43,                                                00602000
     opcan'wait   =  44,                                                00604000
     stackovf     =  44,                                       <<01000>>00606000
                                                                        00608000
     mvtaberr     =  50,    << pverr 50 >>                              00610000
     pvusererr    =  51,                                                00612000
     direcerr     =  52,                                                00614000
     dsegerr      =  53,                                                00616000
     pvsegerr     =  54,                                       <<01106>>00618000
     noroom       =  55,                                       <<01106>>00620000
                                                                        00622000
     deverr1      =  60,  <<device out of range>>                       00624000
     deverr2      =  61,  <<device not configured>>                     00626000
     deverr3      =  62,  <<device is not a disc>>                      00628000
     deverr4      =  63,  <<device is not removable>>                   00630000
     deverr5      =  64,  <<device not in user domain>>                 00632000
     deverr6      =  65,  <<device is not on-line>>                     00634000
     deverr7      =  66,  <<device is reserved by system>>     <<01601>>00636000
     deverr10     =  73;  <<device is read-only>>              <<01601>>00638000
                                                                        00640000
                                                               <<06275>>00642000
<< subroutine definitions for move'from'dst and move'to'dst. >><<06275>>00644000
<< usage: declare "SUBROUTINE DEF'MOVE'xx'DST" in each pro-  >><<06275>>00646000
<< cedure requiring it. note that dbsource and dbtarget are  >><<06275>>00648000
<< logical only. use the "@" when either one is a pointer.   >><<06275>>00650000
                                                               <<06275>>00652000
define                                                         <<06275>>00654000
   def'move'from'dst =                                         <<06275>>00656000
      move'from'dst (dbtarget, dstn, dstoffset, word'count);   <<06275>>00658000
         value   dbtarget, dstn, dstoffset, word'count;        <<06275>>00660000
         logical dbtarget, dstn, dstoffset, word'count;        <<06275>>00662000
      begin                                                    <<06275>>00664000
      x := tos;   << save return address >>                    <<06275>>00666000
      assemble (mfds 0);                                       <<06275>>00668000
      tos := x;                                                <<06275>>00670000
      end #,                                                   <<06275>>00672000
                                                               <<06275>>00674000
   def'move'to'dst =                                           <<06275>>00676000
      move'to'dst (dstn, dstoffset, dbsource, word'count);     <<06275>>00678000
         value   dstn, dstoffset, dbsource, word'count;        <<06275>>00680000
         logical dstn, dstoffset, dbsource, word'count;        <<06275>>00682000
      begin                                                    <<06275>>00684000
      x := tos;                                                <<06275>>00686000
      assemble (mtds 0);                                       <<06275>>00688000
      tos := x;                                                <<06275>>00690000
      end #;                                                   <<06275>>00692000
$page  "FORWARD AND EXTERNAL PROCEDURE DECLARATIONS"           <<*8864>>00694000
procedure suddendeath (sdnumber);                              <<debug>>00696000
    value sdnumber; integer sdnumber;                          <<debug>>00698000
    option external;                                           <<debug>>00700000
                                                               <<*8864>>00702000
logical procedure getsir(n);                                            00704000
value n; logical n;                                                     00706000
option external;                                                        00708000
                                                                        00710000
procedure relsir(n,b);                                                  00712000
value n,b; logical n,b;                                                 00714000
option external;                                                        00716000
                                                                        00718000
integer procedure getdataseg(msize,vmsize);                             00720000
value msize,vmsize;                                                     00722000
integer msize,vmsize;                                                   00724000
option external;                                                        00726000
                                                               <<*8864>>00728000
integer procedure altdsegsize (en,size);                                00730000
    value   en,size;                                                    00732000
    integer en,size;                                                    00734000
    option  external;                                                   00736000
                                                               <<*8864>>00738000
procedure reldataseg(en);                                               00740000
value en;                                                               00742000
integer en;                                                             00744000
option external;                                                        00746000
                                                                        00748000
logical procedure setsysdb;                                             00750000
option external;                                                        00752000
                                                                        00754000
procedure resetdb(d);                                                   00756000
value d; logical d;                                                     00758000
option external;                                                        00760000
                                                                        00762000
integer procedure exchangedb(d);                                        00764000
value d; logical d;                                                     00766000
option external;                                                        00768000
                                                                        00770000
intrinsic print,ascii,binary,dascii,mycommand,zsize;           <<01000>>00772000
                                                                        00774000
procedure log13(minfo,uinfo,uname,ulen,vname,vlen,devlist,dlen,         00776000
   rectype);                                                            00778000
value minfo,uinfo,ulen,vlen,dlen,rectype;                               00780000
logical minfo,uinfo;                                                    00782000
integer ulen,vlen,dlen,rectype;                                         00784000
array uname,vname,devlist;                                              00786000
option external;                                                        00788000
                                                                        00790000
integer procedure genmsg(setno,msgno,mask,parm1,parm2,                  00792000
   parm3,parm4,parm5,dest,reply,offset,dst,iotype);                     00794000
value setno,msgno,mask,parm1,parm2,parm3,parm4,parm5,                   00796000
   dest,reply,offset,dst,iotype;                                        00798000
integer setno,msgno,dest,dst;                                           00800000
logical mask,parm1,parm2,parm3,parm4,parm5,reply,offset,                00802000
   iotype;                                                              00804000
option variable,external;                                               00806000
                                                                        00808000
double procedure p'attachio (ldnum, qmisc, dstx, offset,                00810000
                 function, count, p1, p2, flags,                        00812000
                 extent'base, extent'length);                           00814000
   value   ldnum, qmisc, dstx, offset, function, count, p1,             00816000
           p2, flags, extent'base, extent'length;                       00818000
   integer ldnum, qmisc, dstx, offset, function, count, p1,             00820000
           p2, flags, extent'length;                                    00822000
   double extent'base;                                                  00824000
   option privileged, uncallable, external, variable;                   00826000
                                                                        00828000
double procedure reqstatus(ldn);                                        00830000
value ldn; integer ldn;                                                 00832000
option external;                                                        00834000
                                                                        00836000
integer procedure disctype(ldev, vlab);                        <<01115>>00838000
value ldev;                                                    <<01115>>00840000
integer ldev;                                                  <<01115>>00842000
array vlab;                                                    <<01115>>00844000
option forward;                                                <<01115>>00846000
                                                               <<01115>>00848000
double procedure direcfind (type,linkage'indexp,aname,                  00850000
                            guname,fname,preturn);                      00852000
value type,linkage'indexp;                                              00854000
logical type;                                                           00856000
double  linkage'indexp;                                                 00858000
array aname,guname,fname,preturn;                                       00860000
option external;                                                        00862000
                                                                        00864000
double procedure direcscan (type,linkage'indexp,aname,guname,           00866000
                            fname,recip,parms,mvtabx);                  00868000
value type,linkage'indexp,mvtabx;                                       00870000
integer type,mvtabx;                                                    00872000
double  linkage'indexp;                                                 00874000
array aname,guname,fname,parms;                                         00876000
integer procedure recip;                                                00878000
                                                               <<*8864>>00880000
option external,variable;                                               00882000
double procedure direcbind (type,linkage'indexp,aname,                  00884000
                            gname,gfipntr,mvtabx);                      00886000
value type,linkage'indexp,mvtabx;                                       00888000
integer type,gfipntr,mvtabx;                                            00890000
double  linkage'indexp;                                                 00892000
array aname,gname;                                                      00894000
option variable,external;                                               00896000
                                                               <<*8864>>00898000
double procedure direcunbind (type,linkage'indexp,aname,                00900000
                              gname,mvtabx);                            00902000
value type,linkage'indexp,mvtabx;                                       00904000
integer type,mvtabx;                                                    00906000
double  linkage'indexp;                                                 00908000
array aname,gname;                                                      00910000
option variable,external;                                               00912000
                                                                        00914000
procedure delay (time);                                                 00916000
    value time;  double time;                                           00918000
    option external;                                                    00920000
                                                                        00922000
procedure debug;                                                        00924000
option external;                                                        00926000
                                                                        00928000
procedure getmvtabentry(mvtabx,mvtabent);                               00930000
value mvtabx;                                                           00932000
integer mvtabx;                                                         00934000
array mvtabent;                                                         00936000
option forward;                                                         00938000
                                                                        00940000
integer procedure usertable(funct,pininfo,mvtabx,retinfo,retsize);      00942000
value funct,pininfo,mvtabx,retsize;                                     00944000
integer funct,pininfo,mvtabx,retsize;                                   00946000
array retinfo;                                                          00948000
option variable,forward;                                                00950000
                                                                        00952000
procedure mmstat (eventnum,p1,p2,p3);                          <<monit>>00954000
    value   eventnum,p1,p2,p3;                                 <<monit>>00956000
    integer eventnum,p1,p2,p3;                                 <<monit>>00958000
    option  external;                                          <<monit>>00960000
                                                               <<monit>>00962000
                                                               <<03504>>00964000
<< procedures for disc free space data segment management >>   <<03504>>00966000
                                                               <<03504>>00968000
logical procedure allocate'dfs'data'seg (ldev);                <<03504>>00970000
   value ldev;                                                 <<03504>>00972000
   integer ldev;                                               <<03504>>00974000
   option external;                                            <<03504>>00976000
                                                               <<03504>>00978000
logical procedure deallocate'dfs'data'seg (ldev);              <<03504>>00980000
   value ldev;                                                 <<03504>>00982000
   integer ldev;                                               <<03504>>00984000
   option external;                                            <<03504>>00986000
                                                               <<03504>>00988000
procedure send'process'dfs'error (ldev, error'status,          <<03504>>00990000
                             type'of'error);                   <<03504>>00992000
   value ldev, error'status, type'of'error;                    <<03504>>00994000
   integer ldev, type'of'error;                                <<03504>>00996000
   logical error'status;                                       <<03504>>00998000
   option external;                                            <<03504>>01000000
                                                               <<03504>>01002000
procedure delete'dfs'data'seg (ldev);                          <<03504>>01004000
   value ldev;                                                 <<03504>>01006000
   integer ldev;                                               <<03504>>01008000
   option external;                                            <<03504>>01010000
                                                               <<03504>>01012000
                                                               <<03511>>01014000
                                                               <<03511>>01016000
                                                               <<03511>>01018000
integer procedure ldevtotype (ldev);                           <<03511>>01020000
   value ldev;                                                 <<03511>>01022000
   integer ldev;                                               <<03511>>01024000
   option external;                                            <<03511>>01026000
                                                               <<03511>>01028000
                                                               <<03511>>01030000
                                                               <<03511>>01032000
integer procedure ldevtosubtype (ldev);                        <<03511>>01034000
   value ldev;                                                 <<03511>>01036000
   integer ldev;                                               <<03511>>01038000
   option external;                                            <<03511>>01040000
                                                               <<03511>>01042000
                                                               <<03511>>01044000
integer procedure flush'cache (ldev, start'addr, end'addr);    <<07337>>01046000
   value  ldev, start'addr, end'addr;                          <<07337>>01048000
   integer ldev;                                               <<07337>>01050000
   double  start'addr, end'addr;                               <<07337>>01052000
   option external;                                            <<07337>>01054000
                                                               <<03511>>01056000
$page "PVSYS - DISC UTILITIES"                                          01058000
$control segment = pvsysm                                               01060000
                                                                        01062000
integer procedure getsubtype (ldn);                            <<06275>>01064000
value ldn; integer ldn;                                                 01066000
option privileged,uncallable;                                           01068000
                                                               <<*8832>>01070000
<<----------------------------------------------------------->><<*8832>>01072000
<<                                                           >><<*8832>>01074000
<< procedure getsubtype returns the subtype of the device    >><<*8832>>01076000
<< specified in ldn, as found in the lpdt.                   >><<*8832>>01078000
<<                                                           >><<*8832>>01080000
<< callers:  dismount                                        >><<*8832>>01082000
<<           dstatcom                                        >><<*8832>>01084000
<<           mount                                           >><<*8832>>01086000
<<                                                           >><<*8832>>01088000
<<----------------------------------------------------------->><<*8832>>01090000
                                                               <<*8832>>01092000
begin                                                                   01094000
   integer lpdt'index;                                         <<06275>>01096000
   lpdt'index := ldn * integer (lpdt'entry'size);              <<06275>>01098000
   getsubtype := lpdt'subtype;                                 <<06275>>01100000
end  << getsubtype >>;                                                  01102000
                                                                        01104000
$page                                                          <<*8832>>01106000
$control segment = pvsysm                                               01108000
procedure discerror(ldn,fnct,iostat,addr);                              01110000
value ldn,fnct,iostat,addr;                                             01112000
integer ldn,fnct;                                                       01114000
logical iostat;                                                         01116000
double addr;                                                            01118000
option privileged,uncallable;                                           01120000
                                                               <<*8832>>01122000
<<----------------------------------------------------------->><<*8832>>01124000
<<                                                           >><<*8832>>01126000
<< this procedure causes a disc error message to be formatted>><<*8832>>01128000
<< and printed.                                              >><<*8832>>01130000
<<                                                           >><<*8832>>01132000
<< callers:  discio                                          >><<*8832>>01134000
<<                                                           >><<*8832>>01136000
<< ---------------------------------------------------------->><<*8832>>01138000
                                                               <<*8832>>01140000
begin                                                                   01142000
     integer len,loc;                                                   01144000
     array wmsg (0:35);                                        <<03511>>01146000
     byte array msg(*)=wmsg;                                   <<03511>>01148000
     byte array temp(0:13);                                             01150000
                                                                        01152000
     move msg:=" DISC ",2;                                              01154000
     case * fnct of                                                     01156000
     begin                                                              01158000
          move * :="READ",2;                                            01160000
          move * :="WRITE",2;                                           01162000
     end;                                                               01164000
     move * :=" ERROR ON LDEV# ",2;                                     01166000
     loc:=tos-@msg;                                                     01168000
     loc:=loc+ascii(ldn,10,msg(loc));                                   01170000
     move msg(loc):=", STATUS=%",2;                                     01172000
     len:=ascii(iostat.tstatus,8,temp);                                 01174000
     move * :=temp(6-len),(len),2;                                      01176000
     move * :=", ADDRESS=%",2;                                          01178000
     len:=dascii(addr,8,temp);                                          01180000
     move * :=temp(11-len),(len),2;                                     01182000
     len:=tos-@msg;                                                     01184000
     print(wmsg,-len,0);                                       <<03511>>01186000
end << discerror >>;                                                    01188000
$page                                                          <<*8832>>01190000
$control segment = pvsysm                                               01192000
procedure discio(ldn,funct,buf,addr,wc,errinfo);                        01194000
value ldn,funct,addr,wc;                                                01196000
integer ldn,funct,wc;                                                   01198000
logical errinfo;                                                        01200000
double addr;                                                            01202000
array buf;                                                              01204000
option variable;                                                        01206000
option privileged,uncallable;                                           01208000
                                                               <<*8832>>01210000
<<----------------------------------------------------------->><<*8832>>01212000
<<                                                           >><<*8832>>01214000
<< procedure discio performs all disc i/o operations for this>><<*8832>>01216000
<< module, calling attachio to do the actual transfer.       >><<*8832>>01218000
<<                                                           >><<*8832>>01220000
<< parameters:  ldn,funct,buf,addr,wc -                      >><<*8832>>01222000
<<              as used in the call to attachio              >><<*8832>>01224000
<<              errinfo (optional) -                         >><<*8832>>01226000
<<                on input, specifies error handling flags:  >><<*8832>>01228000
<<                 (15:1) = 0 - omit disc error message      >><<*8832>>01230000
<<                          1 - print disc error message.    >><<*8832>>01232000
<<                 (14:1) = 0 - don't return error status    >><<*8832>>01234000
<<                        = 1 - return error to caller.      >><<*8832>>01236000
<<                on output, may contain error status        >><<*8832>>01238000
<<              returned from attachio.                      >><<*8832>>01240000
<<                                                           >><<*8832>>01242000
<< returns:     cce - successful.                            >><<*8832>>01244000
<<              ccl - unsuccessful.                          >><<*8832>>01246000
<<                                                           >><<*8832>>01248000
<< callers:     dstatcom                                     >><<*8832>>01250000
<<              mvtable                                      >><<*8832>>01252000
<<              vsusercom                                    >><<*8832>>01254000
<<              vtabindex                                    >><<*8832>>01256000
<<                                                           >><<*8832>>01258000
<<----------------------------------------------------------->><<*8832>>01260000
                                                               <<*8832>>01262000
begin                                                          <<*8832>>01264000
     logical pmap = q-4;                                                01266000
     logical iostat,errflags;                                           01268000
     integer                                                            01270000
          addr1 = addr,                                                 01272000
          addr2 = addr+1;                                               01274000
     integer pointer bufp = buf;                                        01276000
     define  lpdt'index = ldn * integer (lpdt'entry'size) #;   <<06275>>01278000
                                                                        01280000
     cc:=cce;                                                           01282000
     errflags:=if pmap then errinfo else 1;                             01284000
     tos:=p'attachio(ldn,0,0,@bufp,funct,wc,addr1,addr2,1);             01286000
     delete;                                                            01288000
     iostat:=tos;                                                       01290000
     if iostat.gstatus <> 1 then  <<unsucessful i/o>>                   01292000
     begin                                                              01294000
          cc:=ccl;                                                      01296000
          if errflags then discerror(ldn,funct,iostat,addr);            01298000
          if errflags.(14:1) then errinfo:=iostat;                      01300000
     end;                                                               01302000
end << discio >>;                                                       01304000
                                                                        01306000
$page "PVSYS - PV USER/CONSOLE COMMAND PROCEDURES"                      01308000
                                                                        01310000
$control segment = pvsysm                                               01312000
                                                                        01314000
procedure getvsdefn(vsid,vsdefn,vsdef,pverr);                           01316000
logical vsdef;                                                          01318000
integer pverr;                                                          01320000
array vsid,vsdefn;                                                      01322000
option variable;                                                        01324000
option privileged,uncallable;                                           01326000
                                                               <<*8832>>01328000
<<----------------------------------------------------------->><<*8832>>01330000
<<                                                           >><<*8832>>01332000
<< procedure getvsdefn returns a volume set definition direc->><<*8832>>01334000
<< tory entry for the volume set specified.  the entry can be>><<*8832>>01336000
<< either a volume set definition, or a volume class entry.  >><<*8832>>01338000
<< if a home volume set specification is passed (vsid is "*")>><<*8832>>01340000
<< the home volume set name will be obtained from the group  >><<*8832>>01342000
<< directory entry.  if the entry is a volume class entry,   >><<*8832>>01344000
<< the master reference for the class will be obtained and   >><<*8832>>01346000
<< returned with the fifth (vdinfo) word overwritten to in-  >><<*8832>>01348000
<< dicate the volume mask of the class rather than the set.  >><<*8832>>01350000
<<                                                           >><<*8832>>01352000
<< parameters:  vsid - volume set name                       >><<*8832>>01354000
<<                                                           >><<*8832>>01356000
<< returns:     vsdefn - full volume set definition entry, as>><<*8832>>01358000
<<                       obtained from direcfind.            >><<*8832>>01360000
<<              vsdef - type of entry found:                 >><<*8832>>01362000
<<                       true: volume set definition         >><<*8832>>01364000
<<                       false: volume class definition      >><<*8832>>01366000
<<              pverr - if error, contains value of pv error >><<*8832>>01368000
<<                      message.                             >><<*8832>>01370000
<<                                                           >><<*8832>>01372000
<< callers:     dismount                                     >><<*8832>>01374000
<<              mount                                        >><<*8832>>01376000
<<              vsusercom                                    >><<*8832>>01378000
<<              pvinit (module 32)                           >><<*8832>>01380000
<<                                                           >><<*8832>>01382000
<<----------------------------------------------------------->><<*8832>>01384000
                                                               <<*8832>>01386000
begin                                                                   01388000
     logical pmap = q-4;                                                01390000
     logical classinfo,vsetdef:=true;                                   01392000
     double diresult;                                                   01394000
     integer                                                            01396000
          diresult1 = diresult,                                         01398000
          diresult2 = diresult+1;                                       01400000
     byte array vsidb(*) = vsid;                                        01402000
     byte array vsdefnb(*) = vsdefn;                                    01404000
     define classentry = vsdefn(4).(0:1)#;                              01406000
                                                                        01408000
     cc:=cce;  <<assume volume definition will be found>>               01410000
     if vsidb = "* " then  <<mount home volume set>>                    01412000
     begin   << get volume set name from group entry >>        <<*8864>>01414000
          diresult:=direcfind (%10,0d,vsid(8),vsid(4),                  01416000
                               vsid,vsdefn);                            01418000
          if <> then                                                    01420000
          begin                                                         01422000
               pverr:=if diresult2 = 2 then (diresult1+nohvset)         01424000
                      else direcerr;                                    01426000
               return;                                                  01428000
          end;                                                          01430000
          if vsdefnb(68) <> "  " then                                   01432000
          begin                                                         01434000
               move vsidb:=vsdefnb(68),(8),2;                           01436000
               move * :=vsdefnb(60),(8),2;                              01438000
               move * :=vsdefnb(52),(8);                                01440000
          end else                                                      01442000
          begin                                                         01444000
               cc:=ccg;                                                 01446000
               if pmap then pverr:=nohvset;                             01448000
               return;                                                  01450000
          end;                                                          01452000
     end;                                                               01454000
                                                               <<*8832>>01456000
     << get volume set name from group entry >>                <<*8832>>01458000
     diresult:=direcfind(%40,0d,vsid(8),vsid(4),vsid,vsdefn);           01460000
     if <> then                                                         01462000
     begin                                                              01464000
          cc:=ccl;                                                      01466000
          if pmap then                                                  01468000
          pverr:=if diresult2 = 2 then (systemuse+diresult1) else       01470000
                 direcerr;                                              01472000
          return;                                                       01474000
     end;                                                               01476000
     if classentry then  <<retrieve master entry>>                      01478000
     begin                                                              01480000
          vsetdef:=false;  <<vol class definition>>                     01482000
          move vsid:=vsdefn(14),(4),2;  <<set name>>                    01484000
          move   * :=vsdefn(10),(4),2;  <<group name>>                  01486000
          move   * :=vsdefn( 6),(4);    <<account name>>                01488000
          classinfo:=vsdefn(vdinfo);  <<mask/number of volumes>>        01490000
          diresult:=direcfind (%40,0d,vsdefn(6),vsdefn(10),             01492000
                               vsdefn(14),vsdefn);                      01494000
          if <> then                                                    01496000
          begin                                                         01498000
               cc:=ccl;                                                 01500000
               if pmap then                                             01502000
               pverr:=if diresult2 = 2 then (systemuse+diresult1) else  01504000
                      direcerr;                                         01506000
               return;                                                  01508000
          end else                                                      01510000
          vsdefn(vdinfo):=classinfo;                                    01512000
     end;                                                               01514000
     if pmap.(14:1) then vsdef:=vsetdef;  <<type of definition>>        01516000
end << getvsdefn >>;                                                    01518000
$page                                                          <<*8832>>01520000
$control segment = pvcomseg                                             01522000
procedure checkdisc(ldn,stat);                                          01524000
value ldn;                                                              01526000
integer ldn;                                                            01528000
logical stat;                                                           01530000
option privileged,uncallable;                                           01532000
                                                               <<*8832>>01534000
<<----------------------------------------------------------->><<*8832>>01536000
<<                                                           >><<*8832>>01538000
<< procedure checkdisc determines the disc status of a logi- >><<*8832>>01540000
<< cal device by looking in the ldt and lpdt.  if the device >><<*8832>>01542000
<< is a configure disc, the mask may have more than one bit  >><<*8832>>01544000
<< set.  if no bit is set, then the status is that of a pv   >><<*8832>>01546000
<< disc on-line and available.                               >><<*8832>>01548000
<<                                                           >><<*8832>>01550000
<< parameters:  ldn - logical device number                  >><<*8832>>01552000
<<                                                           >><<*8832>>01554000
<< returns:     stat - status returned as a bit map.         >><<*8832>>01556000
<<                                                           >><<*8832>>01558000
<< callers:     dstatcom                                     >><<*8832>>01560000
<<              cimgr (module 5c)                            >><<*8832>>01562000
<<              free5.pub.sys                                >><<*8832>>01564000
<<              pvinit (module 32)                           >><<*8832>>01566000
<<              pvproc (module 31)                           >><<*8832>>01568000
<<              sdisc (module 87)                            >><<*8832>>01570000
<<              s005.pub.sys                                 >><<*8832>>01572000
<<                                                           >><<*8832>>01574000
<<----------------------------------------------------------->><<*8832>>01576000
                                                               <<*8832>>01578000
begin                                                          <<*8832>>01580000
                                                               <<06275>>01582000
   integer dst,type,stype,lpdt'index,ldt'index;                <<06275>>01584000
   logical mask:=0;  << assume valid private volume device >>  <<06275>>01586000
   double rstatus;                                             <<06275>>01588000
   integer                                                     <<06275>>01590000
      rstatus1 = rstatus,                                      <<06275>>01592000
      rstatus2 = rstatus+1;                                    <<06275>>01594000
   logical array ldt(*) = db+0;                                <<06275>>01596000
   define                                                      <<06275>>01598000
      nreadyf  = (14:1)#;  <<not-ready bit of drive status>>   <<06275>>01600000
   define                                                      <<06275>>01602000
      serial  = ( lpdt'dev'own'state = lpdt'owned lor          <<06275>>01604000
                  lpdt'rdy'ser'frn'disc land                   <<06275>>01606000
                  lpdt'serial'or'foreign = lpdt'serial )#,     <<06275>>01608000
      foreign = ( lpdt'rdy'ser'frn'disc land                   <<06275>>01610000
                  lpdt'serial'or'foreign = lpdt'foreign)#;     <<06275>>01612000
                                                               <<06275>>01614000
   logical subroutine offline;                                 <<06275>>01616000
                                                               <<06275>>01618000
   << check if device is on-line >>                            <<06275>>01620000
                                                               <<06275>>01622000
   begin                                                       <<06275>>01624000
      if mask.(11:1) then                                      <<06275>>01626000
         return;                                               <<06275>>01628000
      exchangedb (dst);  <<db back to entry cond. >>           <<06275>>01630000
      rstatus := reqstatus (ldn);                              <<06275>>01632000
      if <> then                                               <<06275>>01634000
         offline := true                                       <<06275>>01636000
      else                                                     <<06275>>01638000
         offline := rstatus2.nreadyf;                          <<06275>>01640000
      dst := exchangedb (ldt'dst);                             <<06275>>01642000
   end <<offline>>;                                            <<06275>>01644000
                                                               <<06275>>01646000
                                                               <<06275>>01648000
   dst := exchangedb (ldt'dst);                                <<06275>>01650000
                                                               <<06275>>01652000
   lpdt'index := ldn * integer (lpdt'entry'size);              <<06275>>01654000
   ldt'index := ldn * integer (ldt'entry'size);                <<06275>>01656000
   stype := lpdt'subtype;                                      <<06275>>01658000
   type := ldt'device'type;                                    <<06275>>01660000
                                                               <<06275>>01662000
   if not ( sysldev <= ldn <= integer(ldt'num'entries) ) then  <<06275>>01664000
      mask.(15:1) := true            << invalid ldev >>        <<06275>>01666000
   else                                                        <<06275>>01668000
      if ( lpdt'virtual'device lor lpdt'dit'ptr = 0 ) then     <<06275>>01670000
         mask.(14:1) := true         << virtual device >>      <<06275>>01672000
      else                                                     <<06275>>01674000
                                                               <<06275>>01676000
         << real device >>                                     <<06275>>01678000
                                                               <<06275>>01680000
         if not (ldt'13037'disc <= integer(ldt'device'type) <= <<06275>>01682000
                 ldt'cs80'device) then                         <<06275>>01684000
            mask.(13:1) := true      << non-disc device >>     <<06275>>01686000
         else                                                  <<06275>>01688000
            begin                                              <<06275>>01690000
                                                               <<06275>>01692000
            << disc >>                                         <<06275>>01694000
                                                               <<06275>>01696000
            if not mhdisc then                                 <<06275>>01698000
               mask.(12:1) := true;  << non-disc device >>     <<06275>>01700000
            if not remvble then                                <<06275>>01702000
               mask.(11:1) := true;  << valid disc type >>     <<06275>>01704000
            if not lpdt'non'sys'domain then                    <<06275>>01706000
               mask.(10:1) := true;  << system domain >>       <<06275>>01708000
            if ldt'avail'to'sys and offline then               <<06275>>01710000
               mask.(9:1) := true;   << device off-line >>     <<06275>>01712000
            if serial and ldt'avail'to'sys then                <<06275>>01714000
               mask.(8:1) := true;   << serial disc >>         <<06275>>01716000
            if lpdt'reserved'pv then                           <<06275>>01718000
               mask.(7:1) := true;   << reserved p.v. >>       <<06275>>01720000
            if not ldt'avail'to'sys then                       <<06275>>01722000
               mask.(6:1) := true;   << downed device >>       <<06275>>01724000
            if ldt'down'pending then                           <<06275>>01726000
               mask.(5:1) := true;   << down req. pending >>   <<06275>>01728000
            if lpdt'mounted'pv then                            <<06275>>01730000
               mask.(4:1) := true;   << mounted p.v. >>        <<06275>>01732000
            if foreign and ldt'avail'to'sys then               <<06275>>01734000
               mask.(3:1) := true;   << foreign volume >>      <<06275>>01736000
            end;                                               <<06275>>01738000
                                                               <<06275>>01740000
   exchangedb (dst);                                           <<06275>>01742000
   stat := mask;                                               <<06275>>01744000
end;  << checkdisc >>                                          <<06275>>01746000
$control segment=pvcomseg                                               01748000
$page                                                                   01750000
procedure print'dfs'problems (ldev);                           <<03504>>01752000
   value ldev;                                                          01754000
   integer ldev;                                                        01756000
   option uncallable;                                          <<*7871>>01758000
                                                                        01760000
<<==============================================================        01762000
                                                                        01764000
      this procedure checks to see if disc free space al-               01766000
   location is disabled on the specified ldev, and if it is             01768000
   prints the reason on $stdlist.                                       01770000
                                                                        01772000
   parameters:                                                          01774000
      ldev - logical device number.                                     01776000
                                                                        01778000
   assumptions on entry:                                                01780000
      db is at the stack.                                               01782000
                                                                        01784000
   exit conditions:                                                     01786000
      db is unchanged.                                                  01788000
                                                                        01790000
   globals:                                                             01792000
                                                                        01794000
      input:                                                            01796000
         ldtx dfs'error'word                                            01798000
                                                                        01800000
      equates:                                                          01802000
         dfs'error'word                                                 01804000
         disc'label'read'error {incldfs2}                               01806000
         dmsg'read'disc'label'error {incldfs2}                          01808000
         disc'label'write'error {incldfs2}                              01810000
         dmsg'write'disc'label'error {incldfs2}                         01812000
         dtt'read'error {incldfs2}                                      01814000
         dmsg'dtt'read'error {incldfs2}                                 01816000
         old'dfs'error {incldfs2}                                       01818000
         dmsg'old'dfs'msg {incldfs2}                                    01820000
         get'dst'error {incldfs2}                                       01822000
         dmsg'get'dfs'error {incldfs2}                                  01824000
         dt'read'error {incldfs2}                                       01826000
         dmsg'dt'read'error {incldfs2}                                  01828000
         dt'write'error {incldfs2}                                      01830000
         dmsg'dt'write'error {incldfs2}                                 01832000
         get'vm'error {incldfs2}                                        01834000
         dmsg'get'vm'error {incldfs2}                                   01836000
         map'damaged'error {incldfs2}                                   01838000
         space'already'free'error {incldfs2}                            01840000
         dmsg'space'already'free'error {incldfs2}                       01842000
         space'not'free'error {incldfs2}                                01844000
         dmsg'space'not'free'error {incldfs2}                           01846000
         dmsg'unexpected'dfs'error {incldfs2}                           01848000
         vinit'error {incldfs2}                                         01850000
         dmsg'vinit'error {incldfs2}                                    01852000
         dfs'msg'set'num {incldfs2}                                     01854000
                                                                        01856000
      defines:                                                          01858000
         error'type {incldfs2}                                          01860000
                                                                        01862000
   externals:                                                           01864000
      genmsg                                                            01866000
                                                                        01868000
   intrinsics:                                                          01870000
      none.                                                             01872000
                                                                        01874000
   callers:                                                             01876000
      dstatcom                                                          01878000
                                                                        01880000
   fix id:                                                              01882000
         this procedure was added as part of the new disc               01884000
      free space map changes.  the fix number on the                    01886000
      procedure header applies to the whole procedure.                  01888000
                                                                        01890000
   changes:                                                             01892000
                                                                        01894000
                                                                        01896000
==============================================================>>        01898000
                                                                        01900000
begin                                                                   01902000
                                                                        01904000
   logical array ldt (0:size'of'ldt'entry - 1);                <<06275>>01906000
   logical array ldtx (0:size'of'ldtx'entry - 1);              <<06275>>01908000
   logical dfs'error;                                                   01910000
   integer error'msg'number;                                            01912000
   define ldtx'index = 0 #;                                    <<06275>>01914000
                                                                        01916000
$include incldfs2                                                       01918000
                                                                        01920000
   subroutine def'move'from'dst;                               <<06275>>01922000
                                                               <<06275>>01924000
   << - - - - - - - - - - >>                                            01926000
                                                                        01928000
   << check ldtx to see if there is any problems with the >>            01930000
   << disc free space table on this device.               >>            01932000
                                                                        01934000
   move'from'dst (@ldt, ldt'dst, 0, size'of'ldt'entry);        <<06275>>01936000
                                                               <<06275>>01938000
   move'from'dst (@ldtx, ldt'dst, ldev * size'of'ldtx'entry +  <<06275>>01940000
      ldtx'base, size'of'ldtx'entry);                          <<06275>>01942000
                                                                        01944000
   << check if free space map is o.k. >>                                01946000
                                                                        01948000
   dfs'error := ldtx'dfs'err;                                  <<06275>>01950000
                                                                        01952000
   if dfs'error then                                                    01954000
      return;  << all's o.k. >>                                         01956000
                                                                        01958000
   << get error msg number according to type of error >>                01960000
                                                                        01962000
   if dfs'error = disc'label'read'error then                            01964000
      error'msg'number := dmsg'read'disc'label'error                    01966000
   else                                                                 01968000
   if dfs'error = disc'label'write'error then                           01970000
      error'msg'number := dmsg'write'disc'label'error                   01972000
   else                                                                 01974000
   if dfs'error = dtt'read'error then                                   01976000
      error'msg'number := dmsg'dtt'read'error                           01978000
   else                                                                 01980000
   if dfs'error = old'dfs'error then                                    01982000
      error'msg'number := dmsg'old'dfs'msg                              01984000
   else                                                                 01986000
   if dfs'error = get'dst'error then                                    01988000
      error'msg'number := dmsg'get'dst'error                            01990000
   else                                                                 01992000
   if dfs'error = dt'read'error then                                    01994000
      error'msg'number := dmsg'dt'read'error                            01996000
   else                                                                 01998000
   if dfs'error = dt'write'error then                                   02000000
      error'msg'number := dmsg'dt'write'error                           02002000
   else                                                                 02004000
   if dfs'error = get'vm'error then                                     02006000
      error'msg'number := dmsg'get'vm'error                             02008000
   else                                                                 02010000
   if dfs'error = map'damaged'error then                                02012000
      error'msg'number := dmsg'map'damaged'error                        02014000
   else                                                                 02016000
   if dfs'error = space'already'free'error then                         02018000
      error'msg'number := dmsg'space'already'free'error                 02020000
   else                                                                 02022000
   if dfs'error = space'not'free'error then                             02024000
      error'msg'number := dmsg'space'not'free'error                     02026000
   else                                                                 02028000
   if dfs'error = vinit'error then                                      02030000
      error'msg'number := dmsg'vinit'error                              02032000
   else                                                                 02034000
      error'msg'number := dmsg'unexpected'dfs'error;                    02036000
                                                                        02038000
   genmsg (dfs'msg'set'num, error'msg'number, [1/0,3/1,12/0],           02040000
           ldev);                                                       02042000
                                                                        02044000
end;  << print'dfs'problems >>                                          02046000
$page                                                          <<*8832>>02048000
$control segment = pvcomseg                                             02050000
integer procedure dstatcom(reqtype,ldev);                               02052000
value reqtype,ldev;                                                     02054000
integer reqtype,ldev;                                                   02056000
option privileged,uncallable;                                           02058000
                                                               <<*8832>>02060000
<<----------------------------------------------------------->><<*8832>>02062000
<<                                                           >><<*8832>>02064000
<< procedure dstatcom processes the :dstat, =dstat, and      >><<*8832>>02066000
<< >dstat (vinit) commands.  the parsing of the command is   >><<*8832>>02068000
<< assumed to have been done by the caller.  the status of   >><<*8832>>02070000
<< the devices is determined by calling procedure checkdisc. >><<*8832>>02072000
<< if the device is an on-line configured disc, its volume   >><<*8832>>02074000
<< label will be read and the volume name printed in the     >><<*8832>>02076000
<< output.                                                   >><<*8832>>02078000
<<                                                           >><<*8832>>02080000
<< parameters:  reqtype - no damn good reason.               >><<*8832>>02082000
<<              ldev - =0 look at p.v. devices only          >><<*8832>>02084000
<<                     >0 look at specific device            >><<*8832>>02086000
<<                     <0 look at all discs configured       >><<*8832>>02088000
<<                                                           >><<*8832>>02090000
<< returns:     if ldev > 0 (specific device), state of      >><<*8832>>02092000
<<              device.                                      >><<*8832>>02094000
<<              otherwise, 0 (okexit) if normal.             >><<*8832>>02096000
<<                                                           >><<*8832>>02098000
<< note:        user traps are disabled because of a pos-    >><<*8832>>02100000
<<              sible call to attachio.  address calculations>><<*8832>>02102000
<<              performed by attachio may result in an in-   >><<*8832>>02104000
<<              teger overflow, and such a trap while exec-  >><<*8832>>02106000
<<              uting tem code would cause a system failure. >><<*8832>>02108000
<<              this procedure cannot be called in split     >><<*8832>>02110000
<<              stack mode as an mfds instruction is executed>><<*8832>>02112000
<<              to determine the disc type.                  >><<*8832>>02114000
<<                                                           >><<*8832>>02116000
<< callers:     cimain (module 5b)                           >><<*8832>>02118000
<<              pvinit (module 32)                           >><<*8832>>02120000
<<                                                           >><<*8832>>02122000
<<----------------------------------------------------------->><<*8832>>02124000
                                                               <<*8832>>02126000
begin                                                                   02128000
     integer i,dev,len,loc,lowd,highd,stype,statn;                      02130000
     logical mask,status,firstime:=true;                       <<03677>>02132000
     logical check'dfs'status;  << flag to indicating the >>   <<03504>>02134000
                                << need to check on disc  >>   <<03504>>02136000
                                << free space problems    >>   <<03504>>02138000
                                << for the current ldev.  >>   <<03504>>02140000
     logical array ldt (0:size'of'ldt'entry - 1) = q;          <<06275>>02142000
     define                                                    <<06275>>02144000
        lpdt'index = dev * integer (lpdt'entry'size) #,        <<06275>>02146000
        ldt'index  = 0 #;                                      <<06275>>02148000
                                                               <<06275>>02150000
     array vlab(0:127);  <<volume label buffer>>                        02152000
     byte array vlabb(*) = vlab;                                        02154000
     define                                                             02156000
          mv      = vlab(ldevinfo).mvf#,                                02158000
          scratch = vlab(ldevinfo).scratchf#;                           02160000
     byte array name(0:9);                                              02162000
     array  wpbuf(0:32);                                       <<03511>>02164000
     byte array pbuf(*) = wpbuf;     << print buffer >>        <<03511>>02166000
     byte array head1(*)=pb:=                                           02168000
          "  LDEV-TYPE     STATUS      VOLUME (VOLUME SET-GEN)";        02170000
     byte array head2(*)=pb:=                                           02172000
          " ------------  ---------   -----------------------",<<06060>>02174000
          "--";                                                <<06060>>02176000
                                                                        02178000
                                                               <<03511>>02180000
     equate typelen = 8;                                                02182000
     equate numdiscstypes=14;                                  <<03511>>02184000
     byte array typekey(*)=pb:=                                         02186000
          "FIXED HD",                                                   02188000
          "7900(L) ",                                                   02190000
          "7900(U) ",                                                   02192000
          "7900    ",                                                   02194000
          "ISS     ",                                                   02196000
          "7905(R) ",                                                   02198000
          "7905(F) ",                                                   02200000
          "7905(T) ",                                                   02202000
          "7905(SD)",                                                   02204000
          "7920    ",                                                   02206000
          "7925    ",                                          <<00078>>02208000
          "7906(R) ",                                          <<00078>>02210000
          "7906(F) ",                                          <<00078>>02212000
          "7906(T) ",                                          <<00078>>02214000
          "7902    ",                                          <<03511>>02216000
          "9110    ",      << linus >>                         <<03547>>02218000
          "7911    ",                                          <<03511>>02220000
          "7912    ",                                          <<03511>>02222000
          "9144    ",                                          <<*8701>>02224000
          "7914    ",                                          <<06060>>02226000
          "7945    ",                                          <<*8836>>02228000
        2("        "),                                         <<*8836>>02230000
          "7933    ";                                          <<04278>>02232000
     equate statlen = 8;                                                02234000
     byte array statkey(*)=pb:=                                         02236000
          "SYSTEM  ",                                                   02238000
          "OFF-LINE",                                                   02240000
          "SERIAL  ",                                                   02242000
          "RESERVED",                                                   02244000
          "DOWNED  ",                                                   02246000
          "DOWN-PND",                                                   02248000
          "MOUNTED ",                                                   02250000
          "AVAIL   ",                                          <<03677>>02252000
          "FOREIGN ";                                          <<01115>>02254000
     equate                                                             02256000
          okexit = 0;                                                   02258000
     define  <<status bits>>                                            02260000
          sysdev   = (10:1)#,                                           02262000
          fixhd    = (12:1)#,                                           02264000
          offline  = ( 9:1)#,                                           02266000
          serial   = ( 8:1)#,                                           02268000
          downed   = ( 6:1)#,                                  <<03504>>02270000
          availf   = ( 3:1)#,  << a real kludge >>             <<01115>>02272000
          foreign  = ( 3:1)#;                                  <<01115>>02274000
     define                                                             02276000
          scratchvol = (disctype(dev,vlab)=3)#,                <<01115>>02278000
          serialvol  = (disctype(dev,vlab)=2)#,                <<01115>>02280000
          systemvol  = (disctype(dev,vlab)=0)#,                <<01115>>02282000
          foreignvol = (disctype(dev,vlab)=4)#;                <<01115>>02284000
     define                                                             02286000
          pvdisc     = (ldev= 0 land not status.sysdev)#,               02288000
          thisdisc   = (dev= ldev)#,                                    02290000
          alldiscs   = (ldev= -1)#,                                     02292000
          systemdisc = (status.sysdev)#,                                02294000
          validevice = ((status land %7)= 0)#;                          02296000
                                                                        02298000
     subroutine pexit(exitype);                                         02300000
     value exitype; integer exitype;                                    02302000
     begin                                                              02304000
          cc:=if exitype = okexit then cce else ccl;                    02306000
          dstatcom:=exitype;                                            02308000
          assemble(exit 2);                                             02310000
     end <<pexit>>;                                                     02312000
                                                               <<06275>>02314000
     subroutine def'move'from'dst;                             <<06275>>02316000
                                                               <<06275>>02318000
                                                                        02320000
     push(status);                                                      02322000
     tos.(2:1):=0;  <<reset user traps - avoid attachio problems>>      02324000
     set(status);                                                       02326000
                                                                        02328000
     lowd:=if ldev > 0 then ldev else 1;                                02330000
     if ldev > 0 then                                          <<06275>>02332000
        highd := ldev                                          <<06275>>02334000
     else                                                      <<06275>>02336000
        highd := lpdt'max'entries;                             <<06275>>02338000
     for dev:=lowd until highd do  <<check dev status>>                 02340000
     begin                                                              02342000
                                                               <<03504>>02344000
          check'dfs'status := false;                           <<03504>>02346000
                                                               <<03504>>02348000
          status:=0;                                                    02350000
          checkdisc(dev,status);                                        02352000
          if status.foreign then statn:=2                      <<01115>>02354000
           else                                                <<01115>>02356000
            begin                                              <<01115>>02358000
              statn:=15;  <<bit position in status>>           <<01115>>02360000
              if status.(11:1) then status.(11:1):=%0;         <<d8215>>02362000
              if status.( 5:1) then status.( 5:2):=%2;         <<01115>>02364000
              mask:=status;  <<mask will be shifted>>          <<01115>>02366000
              mask.availf:=1;  <<assume pv avail>>             <<01115>>02368000
              while not mask do                                <<01115>>02370000
              begin                                            <<01115>>02372000
                   statn:=statn-1;                             <<01115>>02374000
                   mask:=mask & lsr(1);                        <<01115>>02376000
              end;                                             <<01115>>02378000
            end;                                               <<01115>>02380000
                                                               <<03511>>02382000
          if statn > 10 then status.(13:1) := 1;  << invalid >><<03511>>02384000
                                                               <<03511>>02386000
          if validevice then  <<its a configured disc>>                 02388000
          if alldiscs or thisdisc or pvdisc then                        02390000
          begin  <<print dev status info>>                              02392000
               statn:=10-statn;  <<index into statkey>>                 02394000
               if firstime then  <<print heading>>                      02396000
               begin                                                    02398000
                    firstime:=false;                                    02400000
                    move pbuf:=head1,(51);                              02402000
                    print(wpbuf,-51,0);                        <<03511>>02404000
                    move pbuf:=head2,(52);                              02406000
                    print(wpbuf,-52,0);                        <<03511>>02408000
               end;                                                     02410000
                                                               <<03511>>02412000
               len:=25;  <<assume no volume name to be printed>>        02414000
                                                               <<03511>>02416000
               wpbuf := "  ";                                  <<03511>>02418000
               move wpbuf(1) := wpbuf, (32);                   <<03511>>02420000
                                                               <<03511>>02422000
               stype:=getsubtype(dev)+1; <<index into typekey>><<03511>>02424000
                                                               <<06275>>02426000
               << extract ldt entry >>                         <<06275>>02428000
                                                               <<06275>>02430000
               move'from'dst (@ldt, ldt'dst,                   <<06275>>02432000
                  dev * size'of'ldt'entry, size'of'ldt'entry); <<06275>>02434000
                                                               <<03511>>02436000
               << need to alter stype to properly index into >><<03511>>02438000
               << typekey list.                              >><<03511>>02440000
                                                               <<03511>>02442000
               if ldt'device'type = ldt'floppy'disc then       <<06275>>02444000
                  stype := numdiscstypes;                      <<06275>>02446000
               if ldt'device'type = ldt'cs80'device then       <<06275>>02448000
                  stype := stype + numdiscstypes;              <<06275>>02450000
                                                               <<03511>>02452000
                                                               <<03511>>02454000
               if status.fixhd then                                     02456000
               begin                                                    02458000
                    stype:=0;                                           02460000
                    statn:=0;  <<fixed head = system disc>>             02462000
                    status.sysdev:=1;  <<mark as system disc>>          02464000
               end;                                                     02466000
               ascii(dev,-10,pbuf(2));                                  02468000
               move pbuf(3):="-",2;                                     02470000
               move * := typekey(stype*typelen), (typelen);    <<03511>>02472000
                                                               <<03511>>02474000
               << want to print product number for both kinds ><<03511>>02476000
               << of floppies --  "7902/9895"                 ><<03511>>02478000
                                                               <<03511>>02480000
               if ldt'device'type = ldt'floppy'disc then       <<06275>>02482000
                  move pbuf (8) := "/9895";                    <<06275>>02484000
                                                               <<06060>>02486000
               << print for two types of cs/80 - 7933/7935 >>  <<06060>>02488000
                                                               <<06060>>02490000
               if ldt'device'type = ldt'cs80'device and        <<06275>>02492000
                  ( stype - numdiscstypes - 1 ) = 8 then       <<06275>>02494000
               move pbuf (8) := "/7935";                       <<07336>>02496000
                                                               <<03511>>02498000
               move pbuf(16):=statkey(statn*statlen),(statlen);         02500000
               <<to avoid a delay when the device is downed, >><<03677>>02502000
               <<dstat will not read a volume label to       >><<03677>>02504000
               <<determent type of media.for example in linus>><<03677>>02506000
               <<case when device is downed and vinit        >><<03677>>02508000
               <<performs a format or verify function a read >><<03677>>02510000
               <<request can be delayed in worst case for    >><<03677>>02512000
               <<about 40 minutes. for a serial disc is      >><<03677>>02514000
               <<unneccessary to read a volume label to      >><<03677>>02516000
               <<check if the media is not scratch.          >><<03677>>02518000
               if not (status.offline lor status.serial lor    <<01115>>02520000
                         status.foreign lor status.downed) then<<03677>>02522000
               begin                                                    02524000
                    mask:=0;  <<no error message>>                      02526000
                    discio(dev,r,vlab,0d,128,mask);                     02528000
                    if <> then                                          02530000
                    begin                                               02532000
                         len := 48;                            <<03677>>02534000
                         move pbuf(28):="* UNREADABLE LABEL *";<<03677>>02536000
                    end else                                   <<03677>>02538000
                    if systemdisc then  <<system volume>>               02540000
                    begin                                               02542000
                         len:=36;                                       02544000
                         move pbuf(28):=vlabb(lvnameloc),(8);           02546000
                                                               <<03504>>02548000
                         if not status.downed then             <<03504>>02550000
                            check'dfs'status := true;          <<03504>>02552000
                                                               <<03504>>02554000
                    end else                                            02556000
                    begin                                               02558000
                         if scratchvol then                             02560000
                         begin                                          02562000
                              len:=38;                                  02564000
                              move pbuf(28):="*SCRATCH*";               02566000
                         end else                                       02568000
                         if serialvol then                              02570000
                         begin                                          02572000
                              len:=41;                                  02574000
                              move pbuf(28):="*SERIAL DISC*";           02576000
                         end else                                       02578000
                         if foreignvol then                    <<01115>>02580000
                         begin                                 <<01115>>02582000
                              len:=42;                         <<01115>>02584000
                              move pbuf(28):="*FOREIGN DISC*"; <<01115>>02586000
                         end else                              <<01115>>02588000
                         begin                                          02590000
                              move pbuf(28):=vlabb(lvnameloc),(8);      02592000
                              if systemvol then                         02594000
                              begin                                     02596000
                                   len:=54;                             02598000
                                   move pbuf(36):=" (SYSTEM VOLUME)";   02600000
                              end else                                  02602000
                              begin                                     02604000
                                   i:=-1;                               02606000
                                   loc:=lvoldirloc;                     02608000
                                   move pbuf(36):=" (",2;               02610000
                                   while (i:=i+1) < 3 do                02612000
                                   begin                                02614000
                                        move name:="         ";         02616000
                                        move name:=vlabb(loc),(8);      02618000
                                        move * := name while an,1;      02620000
                                        if i < 2 then                   02622000
                                           move * :=".",2               02624000
                                        else                            02626000
                                           move * :="-",2;              02628000
                                        loc:=loc-8;  <<next name>>      02630000
                                   end;                                 02632000
                                   len:=tos-@pbuf;                      02634000
                                   len:=len+ascii(vlab(lgenindex),10,   02636000
                                                  pbuf(len));           02638000
                                   pbuf(len):=")";                      02640000
                                   len:=len+1;                          02642000
                                                               <<03504>>02644000
                                   if not status.downed then   <<03504>>02646000
                                      check'dfs'status := true;<<03504>>02648000
                                                               <<03504>>02650000
                              end;                                      02652000
                         end;                                           02654000
                    end;                                                02656000
               end;                                                     02658000
               if status.serial lor status.foreign then        <<01115>>02660000
               begin                                                    02662000
                    if lpdt'dev'own'state <> lpdt'owned then   <<06275>>02664000
                    begin                                               02666000
                         len:=41;                                       02668000
                         move pbuf(28):=                                02670000
                         "*UNALLOCATED*";                               02672000
                    end else                                            02674000
                    if not lpdt'rdy'ser'frn'disc then          <<06275>>02676000
                    begin                                               02678000
                         len:=38;                                       02680000
                         move pbuf(28):=                                02682000
                         "*UNLOADED*";                                  02684000
                    end;                                                02686000
               end;                                                     02688000
               print(wpbuf,-len,0);                            <<03511>>02690000
                                                               <<03504>>02692000
               if check'dfs'status then                        <<03504>>02694000
                  print'dfs'problems (dev);                    <<03504>>02696000
                                                               <<03504>>02698000
          end else else                                                 02700000
          if thisdisc then pexit(60+(15-statn));                        02702000
     end;                                                               02704000
     pexit(okexit);                                                     02706000
end << dstatcom >>;                                                     02708000
$page                                                          <<*8832>>02710000
$control segment=pvsysm                                        <<00776>>02712000
integer procedure get'jsmpin (pcbpt);                          <<06532>>02714000
value pcbpt;                                                   <<*8832>>02716000
integer pcbpt;                                                 <<*8832>>02718000
option privileged,uncallable;                                  <<*8832>>02720000
                                                               <<*8832>>02722000
<<----------------------------------------------------------->><<*8832>>02724000
<<                                                           >><<*8832>>02726000
<< get'jsmpin returns the pin number of the first process    >><<*8832>>02728000
<< which is an ancestor of pcbpt and is not either a type    >><<*8832>>02730000
<< "user" or "user, son of main".  the search starts at pcbpt>><<*8832>>02732000
<< and scans backward through the hierarchy of pcbpt's       >><<*8832>>02734000
<< family.                                                   >><<*8832>>02736000
<<                                                           >><<*8832>>02738000
<< parameters:  pcbpt - pin number to begin search at.       >><<*8832>>02740000
<<                                                           >><<*8832>>02742000
<< returns:     integer value of ancestor pin found.         >><<*8832>>02744000
<<                                                           >><<*8832>>02746000
<< callers:     vsusercom                                    >><<*8832>>02748000
<<                                                           >><<*8832>>02750000
<<----------------------------------------------------------->><<*8832>>02752000
                                                               <<*8832>>02754000
    begin                                                      <<*8832>>02756000
        while (pcbpt <> 0) and (spcbptype < main) do           <<06532>>02758000
            pcbpt := fatherinfo;                               <<06532>>02760000
        get'jsmpin := pcbpt;                                   <<06532>>02762000
     end;  << get'jsmpin >>                                    <<06532>>02764000
                                                                        02766000
$control segment = pvcomseg                                             02768000
integer procedure vsusercom(reqtype,numparms,vsname);                   02770000
value reqtype,numparms;                                                 02772000
integer reqtype,numparms;                                               02774000
byte array vsname;                                                      02776000
option privileged,uncallable;                                           02778000
                                                               <<*8832>>02780000
<<----------------------------------------------------------->><<*8832>>02782000
<<                                                           >><<*8832>>02784000
<< this procedure processes the :vsuser and =vsuser commands.>><<*8832>>02786000
<< parsing of the command is assumed to have been done by the>><<*8832>>02788000
<< caller.  if a volume set is currently mounted, the mvtabx >><<*8832>>02790000
<< field of the fourth word (vdmisc) of the volume set defi- >><<*8832>>02792000
<< nition entry will contain the index into the mounted vol- >><<*8832>>02794000
<< ume table.  the name of the volume set mounted is deter-  >><<*8832>>02796000
<< mined from the volume label of the master volume of the   >><<*8832>>02798000
<< set.  the master ldev is determined from the mvtab entry  >><<*8832>>02800000
<< for the set.  the users of a volume set can be found by   >><<*8832>>02802000
<< calling usertable.  this procedure will return a list of  >><<*8832>>02804000
<< pins.  vsusercom will compare the pins with those of run- >><<*8832>>02806000
<< ning jobs as contained in the jmat.                       >><<*8832>>02808000
<<                                                           >><<*8832>>02810000
<< parameters:  reqtype - no damn good reason.               >><<*8832>>02812000
<<              numparms - =0, print list of all users of all>><<*8832>>02814000
<<                             mounted volume sets           >><<*8832>>02816000
<<                        <>0, print volume set definition   >><<*8832>>02818000
<<                             for set specified             >><<*8832>>02820000
<<              vsname  - volume set name                    >><<*8832>>02822000
<<                                                           >><<*8832>>02824000
<< returns:     0 (okexit) - normal.                         >><<*8832>>02826000
<<              44 (stackovf) - stack overflow.              >><<*8832>>02828000
<<              - directory error from getvsdefn.            >><<*8832>>02830000
<<              - pvu table error from usertable.            >><<*8832>>02832000
<<                                                           >><<*8832>>02834000
<< callers:     cimain (module 5b)                           >><<*8832>>02836000
<<                                                           >><<*8832>>02838000
<< notes:       same notes as in dstatcom regarding attachio >><<*8832>>02840000
<<              and user traps.                              >><<*8832>>02842000
<<                                                           >><<*8832>>02844000
<<----------------------------------------------------------->><<*8832>>02846000
                                                               <<*8832>>02848000
begin                                                          <<*8832>>02850000
     integer jmatsize:=0;                                               02852000
     integer i,j,k,len,loc,pin,ucnt,mvdev,mvtabx,parserr,               02854000
             namelen,nameloc;                                           02856000
     integer                                                            02858000
          lowmvtabx  :=  1,  <<lowest valid mvtab index>>               02860000
          highmvtabx := 16;  <<highest valid mvtab index>>              02862000
     logical a,b,scanjmat:=true,noneinuse:=true;               <<00786>>02864000
     integer entaddr,lastaddr;                                          02866000
     equate infosize = 255;                                    <<00786>>02868000
     integer array info(0:infosize-1);                                  02870000
     equate usize = 13;  <<users array entry size>>            <<06530>>02872000
     logical zsize'called := false; <<set if zreg altered>>    <<01000>>02874000
     integer lastusersize := 0; <<current space for users>>    <<01000>>02876000
     integer usersize,sreg,zreg,orig'zreg,spaceneeded;         <<01000>>02878000
     integer pointer users;                                    <<01000>>02880000
     byte pointer usersb;                                      <<01000>>02882000
     equate vsdefnsize = 56;<<volume set definition entrysize>><<01000>>02884000
     array vsdefn(0:vsdefnsize-1);                                      02886000
     array jmatarr (*) = vsdefn;                               <<06530>>02888000
     array mvtabent(*) = vsdefn;                                        02890000
     array vlab(*) = vsdefn;                                            02892000
     byte array vlabb(*) = vlab;                                        02894000
     byte array vsid(0:23);                                             02896000
     array wpbuf(0:31);                                        <<03511>>02898000
     byte array                                                         02900000
          name(0:9),                                                    02902000
          pbuf(*) = wpbuf;                                     <<03511>>02904000
     byte array head1(*)=pb:=                                           02906000
          " VOLUME SET NAME            JOBNUM   JOB NAME";              02908000
     byte array head2(*)=pb:=                                           02910000
          " ---------------            ------   ----------";            02912000
     equate                                                             02914000
          job      =  2;                                                02916000
     define  <<jmat fields>>                                            02918000
          ty        = (0: 2)#,                                          02920000
          jnumber   = (2:14)#;                                 <<06530>>02922000
     define                                                             02924000
          jmatinx       = 0#,                                  <<06530>>02926000
          jobexecuting  = (jmatjobstate = 2)#,                 <<06530>>02928000
          jobsuspended  = (jmatjobstate = 4)#,                 <<06530>>02930000
          jobterminating= (jmatjobstate = 3)#;                 <<06530>>02932000
                                                                        02934000
     subroutine def'move'from'dst;                             <<06530>>02936000
<<...........................................................>><<*8832>>02938000
                                                               <<06530>>02940000
     subroutine pexit(exitype);                                         02942000
     value exitype; integer exitype;                                    02944000
                                                               <<*8832>>02946000
     << sole exit point from this procedure >>                 <<*8832>>02948000
                                                               <<*8832>>02950000
     begin                                                              02952000
          cc:=if exitype = okexit then cce else ccl;                    02954000
          vsusercom:=exitype;                                           02956000
          if zsize'called then zsize(orig'zreg); <<restore z>> <<01000>>02958000
          assemble(exit 3);                                             02960000
     end <<pexit>>;                                                     02962000
<<...........................................................>><<*8832>>02964000
                                                               <<*8832>>02966000
     subroutine getheaderinfo;                                 <<01000>>02968000
     begin                                                     <<01000>>02970000
     move'from'dst (@jmatarr, jmatdst, 0, jmatheadersize);     <<06530>>02972000
     jmatsize := jmatentsize;      <<entry size>>              <<06530>>02974000
     entaddr  := jmatentryptr;     <<addr of first entry>>     <<06530>>02976000
     lastaddr := integer (jmatcursize * 128) - jmatsize;       <<06530>>02978000
     usersize := (jmatsnum + jmatjnum) * usize;  << space >>   <<06530>>02980000
     end <<getheaderinfo>>;                                    <<01000>>02982000
                                                               <<01000>>02984000
<<...........................................................>><<*8832>>02986000
                                                               <<*8832>>02988000
     logical subroutine enuf'stackspace(spaceneeded);          <<01000>>02990000
     value spaceneeded;                                        <<01000>>02992000
     integer spaceneeded;                                      <<01000>>02994000
                                                               <<*8832>>02996000
     << this subroutine determines whether there is enough  >> <<*8832>>02998000
     << stack space to expand a user array by spaceneeded.  >> <<*8832>>03000000
     << note that spaceneeded may be negative.              >> <<*8832>>03002000
                                                               <<*8832>>03004000
     begin                                                     <<*8832>>03006000
         enuf'stackspace := true;                              <<01000>>03008000
         if spaceneeded > 0 then                               <<01000>>03010000
            begin                                              <<01000>>03012000
            push(s,z);                                         <<01000>>03014000
            zreg := tos;                                       <<01000>>03016000
            sreg := tos;                                       <<01000>>03018000
            if zreg-sreg < spaceneeded then                    <<01000>>03020000
               begin                                           <<01000>>03022000
               zsize'called := true;                           <<01000>>03024000
               zsize(sreg+spaceneeded);                        <<01000>>03026000
               if > then enuf'stackspace := false;             <<01000>>03028000
               end;                                            <<01000>>03030000
            end;                                               <<01000>>03032000
     end <<enuf'stackspace>>;                                  <<01000>>03034000
                                                               <<01000>>03036000
<<...........................................................>><<*8832>>03038000
                                                                        03040000
     subroutine printhead;                                              03042000
                                                               <<*8832>>03044000
     << this subroutine prints the fixed headings displayed  >><<*8832>>03046000
     << as part of the vsuser output.                        >><<*8832>>03048000
                                                               <<*8832>>03050000
     begin                                                              03052000
          print (wpbuf,0,"1");                                 <<03511>>03054000
          move pbuf:=head1,(45);                                        03056000
          print(wpbuf,-45,0);                                  <<03511>>03058000
          move pbuf:=head2,(47);                                        03060000
          print(wpbuf,-47,0);                                  <<03511>>03062000
     end <<printhead>>;                                                 03064000
                                                                        03066000
<<...........................................................>><<*8832>>03068000
                                                               <<*8832>>03070000
     subroutine fillname;                                               03072000
                                                               <<*8832>>03074000
     << this subroutine formats a volume set name which was  >><<*8832>>03076000
     << obtained from the volume label of the master volume  >><<*8832>>03078000
     << of a mounted volume set.                             >><<*8832>>03080000
                                                               <<*8832>>03082000
     begin                                                              03084000
          name (8) := " ";  <<non-alpha stopper>>              <<00776>>03086000
          j:=-1;                                                        03088000
          tos:=@pbuf(1);                                                03090000
          pbuf:=" "; move pbuf(1):=pbuf,(63);                           03092000
          while (j:=j+1) < 3 do  <<format name for print>>              03094000
          begin                                                         03096000
               move name:=vsid(j*8),(8);                                03098000
               move * :=name while an,1;                                03100000
               if j < 2 then                                            03102000
                  move * :=".",2                                        03104000
               else                                                     03106000
                  move * :=" ",2;                                       03108000
          end;                                                          03110000
          namelen:=tos-@pbuf;                                           03112000
     end <<fillname>>;                                                  03114000
                                                                        03116000
<<...........................................................>><<*8832>>03118000
                                                               <<*8832>>03120000
     subroutine printusers;                                             03122000
                                                               <<*8832>>03124000
     << this subroutine formats pin related information from >><<*8832>>03126000
     << the jmat and prints it along with the volume set     >><<*8832>>03128000
     << name if the user is the first user to be listed for  >><<*8832>>03130000
     << the set.                                             >><<*8832>>03132000
                                                               <<*8832>>03134000
     begin                                                              03136000
          i:=-1;                                                        03138000
          fillname;                                                     03140000
          name(8):=" ";  <<non-alpha stopper>>                          03142000
          while (i:=i+1) <= ucnt do                                     03144000
          begin                                                         03146000
               j:=-1;                                                   03148000
               loc:=i * usize;                                          03150000
               nameloc:=(loc+1) & lsl(1);  <<byte pointer>>             03152000
               pbuf(28):="#";                                           03154000
               pbuf(29):=if users(loc).ty = job then "J" else "S";      03156000
               ascii(users(loc).jnumber,10,pbuf(30));                   03158000
               tos:=@pbuf(37);                                          03160000
               while (j:=j+1) < 3 do  <<format job name>>               03162000
               begin                                                    03164000
                    move name:=usersb(nameloc+(j*8)),(8);               03166000
                    if name <> " " then  <<not null name>>              03168000
                    begin                                               03170000
                        move * :=name while an,1;                       03172000
                        if j > 0 then                          <<00776>>03174000
                           move * :=".",2                               03176000
                        else                                            03178000
                           move * :=",",2;                              03180000
                    end;                                                03182000
               end;                                                     03184000
               len:=tos-@pbuf-1;                                        03186000
               print(wpbuf,-len,0);                            <<03511>>03188000
               move pbuf(1):=pbuf,(63);                                 03190000
          end;                                                          03192000
     end <<printusers>>;                                                03194000
                                                                        03196000
<<...........................................................>><<*8832>>03198000
                                                               <<*8832>>03200000
     logical subroutine mainpinmatch;                                   03202000
                                                               <<*8832>>03204000
     << this subroutine determines if the pin contained in   >><<*8832>>03206000
     << the current jmat entry matches any pin in the list   >><<*8832>>03208000
     << returned by usertable.  if a match is found, the pin >><<*8832>>03210000
     << is removed from the list and the list is compacted.  >><<*8832>>03212000
                                                               <<*8832>>03214000
     begin                                                              03216000
          k:=0;                                                         03218000
          pin := integer (jmatmainpin) * pcbsize;<<pcb offset>><<06530>>03220000
          while (k:=k+1) <= info do                                     03222000
          if info(k) = pin then  <<pin match>>                          03224000
          begin                                                         03226000
               mainpinmatch:=true;                                      03228000
               move info(k):=info(k+1),(info-k);                        03230000
               info:=info-1;                                            03232000
               k:=info;  <<stop loop>>                                  03234000
          end;                                                          03236000
     end <<mainpinmatch>>;                                              03238000
                                                                        03240000
<<...........................................................>><<*8832>>03242000
                                                               <<*8832>>03244000
<< begin procedure vsusercom >>                                <<*8832>>03246000
                                                               <<*8832>>03248000
     push(status,z);                                           <<01000>>03250000
     orig'zreg := tos; << save z in case call zsize >>         <<01000>>03252000
     tos.(2:1):=0;  <<reset user traps - avoid attachio problems>>      03254000
     set(status);                                                       03256000
                                                                        03258000
     if numparms <> 0 then  <<specific vs specified>>                   03260000
     begin                                                              03262000
          tos := @vsname & lsr (1);                                     03264000
          getvsdefn (*,vsdefn,i,j);                                     03266000
          if <> then pexit(j);  <<directory error>>                     03268000
          mvtabx:=vsdefn(vdmisc).mvtabxf;                               03270000
          lowmvtabx:=highmvtabx:=mvtabx;                                03272000
          move vsid:=vsname,(24); <<for not-in-use message>>            03274000
     end;                                                               03276000
     if (mvtabx:=lowmvtabx) <> 0 then                          <<01000>>03278000
     << not unmounted, specific vs >>                          <<01000>>03280000
     while mvtabx <= highmvtabx do                             <<01000>>03282000
     begin                                                              03284000
          info:=0; ucnt:=-1;                                            03286000
          b := getsir (pvu'sir);                               <<06466>>03288000
          if (k:=usertable(getpins,0,mvtabx,info,infosize))<>0 <<*8864>>03290000
              then begin   << error in pvuser table >>         <<01197>>03292000
                       relsir (pvu'sir,b);                     <<06466>>03294000
                       pexit(k);                               <<01197>>03296000
                   end;                                        <<01197>>03298000
          if info <> 0 then  <<someone using this mvtabx>>              03300000
          begin                                                         03302000
               k := 0;                                         <<00776>>03304000
               while (k:=k+1) <= info do                       <<00776>>03306000
               <<remap pin to pin's jsmp pin>>                 <<00776>>03308000
                info (k) := get'jsmpin (info (k));             <<00776>>03310000
               jmatsize := 0; <<force re-init of variables>>   <<00776>>03312000
               scanjmat:=true;                                          03314000
               a:=getsir(jmatsir);                                      03316000
               getheaderinfo;                                  <<01000>>03318000
               comment: get space for users array and          <<01000>>03320000
                  initialize users pointers.;                  <<01000>>03322000
               spaceneeded := usersize-lastusersize;           <<01000>>03324000
               if not enuf'stackspace(spaceneeded) then        <<01000>>03326000
               begin                                           <<01000>>03328000
                    relsir(jmatsir,a);                         <<01000>>03330000
                    relsir (pvu'sir,b);                        <<06466>>03332000
                    pexit(stackovf);                           <<01000>>03334000
               end                                             <<01000>>03336000
               else if spaceneeded > 0 then                    <<01000>>03338000
               begin                                           <<01000>>03340000
                    << get space >>                            <<01000>>03342000
                    tos := spaceneeded;                        <<01000>>03344000
                    if lastusersize = 0 then                   <<01000>>03346000
                       begin << initialize pointers >>         <<01000>>03348000
                       @users := @s0;                          <<01000>>03350000
                       @usersb := @users & lsl(1);             <<01000>>03352000
                       end;                                    <<01000>>03354000
                    assemble(adds 0);                          <<01000>>03356000
               end;                                            <<01000>>03358000
               lastusersize := usersize;                       <<01000>>03360000
               while scanjmat do                                        03362000
               begin                                                    03364000
                         move'from'dst (@jmatarr, jmatdst,     <<*8864>>03366000
                                         entaddr, jmatsize);   <<*8864>>03368000
                    if jobexecuting or jobsuspended or         <<01000>>03370000
                       jobterminating then                     <<01000>>03372000
                    if mainpinmatch then <<found volume set user>>      03374000
                    begin                                               03376000
                         noneinuse:=false;  <<at least one user>>       03378000
                         ucnt:=ucnt+1;                                  03380000
                         loc:=ucnt*usize;                               03382000
                         users (loc) := jmatarr (jmatjsnooff); <<06530>>03384000
                         move users (loc+1) :=                 <<00776>>03386000
                            jmatjobname, (4), 2;               <<06530>>03388000
                         move * := jmatusername, (8);          <<06530>>03390000
                    end;                                                03392000
                    entaddr:=entaddr+jmatsize;                          03394000
                    scanjmat:=if info = 0 or (entaddr >= lastaddr)      03396000
                              then false else true;                     03398000
               end;                                                     03400000
               relsir(jmatsir,a);                                       03402000
               getmvtabentry(mvtabx,mvtabent);                          03404000
               if (mvdev:=mvtabent(2).(0:8)) <> 0 then                  03406000
               begin                                                    03408000
                    discio(mvdev,r,vlab,0d,30);                         03410000
                    if = then                                           03412000
                    begin                                               03414000
                         move vsid:=vlabb(lvoldirloc),(8),2;            03416000
                         move   * :=vlabb(lvsgrouploc),(8),2;           03418000
                         move   * :=vlabb(lvsaccntloc),(8);             03420000
                         printhead;                                     03422000
                         printusers;                                    03424000
                    end;                                                03426000
               end;                                                     03428000
          end;                                                          03430000
          relsir (pvu'sir,b);                                  <<06466>>03432000
          mvtabx := mvtabx + 1;                                <<01000>>03434000
     end;                                                               03436000
     if noneinuse then  <<print not in use messages>>                   03438000
     begin                                                              03440000
          if numparms <> 0 then  <<specific volume set>>                03442000
          begin                                                         03444000
               fillname;                                                03446000
               move pbuf(namelen):="NOT IN USE ",2;                     03448000
               len:=tos-@pbuf;                                          03450000
          end else                                                      03452000
          begin                                                         03454000
               move pbuf:=" NO VOLUME SETS IN USE ",2;                  03456000
               len:=tos-@pbuf;                                          03458000
          end;                                                          03460000
          print(wpbuf,-len,0);                                 <<03511>>03462000
     end;                                                               03464000
     pexit(okexit);                                                     03466000
end <<vsusercom>>;                                                      03468000
$page                                                          <<*8832>>03470000
                                                               <<01115>>03472000
$control segment=pvsysm                                        <<01115>>03474000
   integer procedure disctype(ldev,labl);                      <<01115>>03476000
value ldev;                                                    <<*8832>>03478000
integer ldev;                                                  <<*8832>>03480000
array labl;                                                    <<*8832>>03482000
option privileged,uncallable;                                  <<*8832>>03484000
                                                               <<*8832>>03486000
<<----------------------------------------------------------->><<*8832>>03488000
<<                                                           >><<*8832>>03490000
<< this procedure examines a volume label to determine what  >><<*8832>>03492000
<< disc type it is.  it is compared with information from    >><<*8832>>03494000
<< the ldt and lpdt to determine if the disc is foreign.     >><<*8832>>03496000
<<                                                           >><<*8832>>03498000
<< parameters:  ldev - the logical device number of the disc.>><<*8832>>03500000
<<              labl - array containing the volume label.    >><<*8832>>03502000
<<                                                           >><<*8832>>03504000
<< returns:     disc type -                                  >><<*8832>>03506000
<<                 0 - system disc                           >><<*8832>>03508000
<<                 1 - private volume                        >><<*8832>>03510000
<<                 2 - serial disc                           >><<*8832>>03512000
<<                 3 - scratch volume                        >><<*8832>>03514000
<<                 4 - foreign volume                        >><<*8832>>03516000
<<                                                           >><<*8832>>03518000
<<                                                           >><<*8832>>03520000
<< callers:     dstatcom                                     >><<*8832>>03522000
<<              pvinit (module 32)                           >><<*8832>>03524000
<<              pvproc (module 31)                           >><<*8832>>03526000
<<                                                           >><<*8832>>03528000
<<----------------------------------------------------------->><<*8832>>03530000
                                                               <<*8832>>03532000
     begin                                                     <<*8832>>03534000
                                                               <<01115>>03536000
                                                               <<01115>>03538000
         define   <<returns>>                                  <<01115>>03540000
                                                               <<01115>>03542000
            system  = begin disctype:=0; return end#,          <<01115>>03544000
            private = begin disctype:=1; return end#,          <<01115>>03546000
            serial  = begin disctype:=2; return end#,          <<01115>>03548000
            scratch = begin disctype:=3; return end#,          <<01115>>03550000
            foreign = begin disctype:=4; return end#;          <<01115>>03552000
                                                               <<01115>>03554000
         define                                                <<06275>>03556000
                ldt'index = 0 #,                               <<06275>>03558000
                lpdt'index = ldev * integer(lpdt'entry'size)#, <<06275>>03560000
                labl'subtype=labl(6).(12:4)#;                  <<01115>>03562000
                                                               <<01115>>03564000
         define labl'type=labl(6).(6:6)#;                      <<01115>>03566000
                                                               <<01115>>03568000
         define vol'name=blabl(20)#;                           <<01115>>03570000
         byte pointer blabl;                                   <<01115>>03572000
         logical errinfo;                                      <<01115>>03574000
         integer i, lpdt's, labl's;                            <<01192>>03576000
         logical array ldt (0:size'of'ldt'entry - 1);          <<06275>>03578000
                                                               <<06275>>03580000
            subroutine def'move'from'dst;                      <<06275>>03582000
                                                               <<01115>>03584000
         logical subroutine name(ptr);                         <<01115>>03586000
            value ptr; byte pointer ptr;                       <<01115>>03588000
            begin                                              <<01115>>03590000
               name:=true;                                     <<01115>>03592000
               if ptr=alpha then                               <<01115>>03594000
                  begin                                        <<01115>>03596000
                     i:=1;                                     <<01115>>03598000
                     while (i<=7) and (ptr(i)=alpha or         <<01115>>03600000
                                       ptr(i)=numeric)         <<01115>>03602000
                        do i:=i+1;                             <<01115>>03604000
                     while (i<=7) do                           <<01115>>03606000
                        begin                                  <<01115>>03608000
                           if ptr(i)<>" " then name:=false;    <<01115>>03610000
                           i:=i+1;                             <<01115>>03612000
                        end;                                   <<01115>>03614000
                  end                                          <<01115>>03616000
                 else name:=false;                             <<01115>>03618000
            end;                                               <<01115>>03620000
                                                               <<01115>>03622000
                                                               <<01115>>03624000
         @blabl:=@labl&lsl(1);                                 <<01115>>03626000
                                                               <<01115>>03628000
         << extract ldt entry >>                               <<06275>>03630000
                                                               <<06275>>03632000
         move'from'dst (@ldt,ldt'dst,ldev * size'of'ldt'entry, <<06275>>03634000
                        size'of'ldt'entry);                    <<06275>>03636000
                                                               <<06275>>03638000
         if (lpdt's:=lpdt'subtype)<>(labl's:=labl'subtype) and <<01192>>03640000
            (lpdt's<>4 or labl's<>10) and                      <<01192>>03642000
            (lpdt's<>10 or labl's<>4) then                     <<*8701>>03644000
            << linus (hp9110, type 3, subtype 0) and buffalo >><<*8701>>03646000
            << (hp9144, type 3, subtype 3) cartridges are    >><<*8701>>03648000
            << compatible.                                   >><<*8701>>03650000
            if (labl'type = 3) and ((lpdt's=0 land labl's=3)   <<*8701>>03652000
               or (lpdt's=3 land labl's=0)) then               <<*8701>>03654000
               << null; >>                                     <<*8701>>03656000
            else                                               <<*8701>>03658000
               foreign;                                        <<*8701>>03660000
         if ( ldt'device'type <> labl'type ) and               <<06275>>03662000
            ( labl'type <> 1 or                                <<06275>>03664000
              ldt'device'type <> ldt'floppy'disc ) then        <<06275>>03666000
            foreign;                                           <<06275>>03668000
         if not name(vol'name) then foreign;                   <<01115>>03670000
         if blabl(16) = "3000" then system;                    <<01115>>03672000
         if labl(6).(0:1)=1 then                               <<01192>>03674000
            if (blabl(16)="3001") or                           <<01192>>03676000
               (labl(8)=0) and (labl(9)=1)                     <<01192>>03678000
               then scratch;                                   <<01192>>03680000
         if labl(8)<>0 or labl(9)<>0 then foreign;             <<01115>>03682000
         if labl(6).(0:1) = 1 then scratch;                    <<01115>>03684000
         if labl(6).(0:3) = 1 then                             <<01115>>03686000
            begin                                              <<01115>>03688000
               if vol'name = "SERDISC" then serial             <<01115>>03690000
                                       else foreign            <<01115>>03692000
            end;                                               <<01115>>03694000
         if (labl(6).(0:3) = 0 or labl(6).(0:3) = 2) and       <<01115>>03696000
            name(blabl(34)) and                                <<01115>>03698000
            name(blabl(42)) and                                <<01115>>03700000
            name(blabl(50))  then private;                     <<01115>>03702000
         foreign;                                              <<01115>>03704000
      end;                                                     <<01115>>03706000
$page "PVSYS - UTILITY PROCEDURES"                                      03708000
                                                                        03710000
$control segment = pvsysm                                               03712000
                                                                        03714000
integer procedure pvrecip(ntry,level,inx,sirs);                         03716000
value level,inx,sirs;                                                   03718000
integer level,inx;                                                      03720000
double sirs;                                                            03722000
integer array ntry;                                                     03724000
option privileged,uncallable;                                           03726000
                                                               <<*8832>>03728000
<<----------------------------------------------------------->><<*8832>>03730000
<<                                                           >><<*8832>>03732000
<< this is the recipient "RECIP" procedure passed to the     >><<*8832>>03734000
<< directory when calling direcscan.  its function is to up- >><<*8832>>03736000
<< date the mvtabx field of the vdmisc word (4th) of a volume>><<*8832>>03738000
<< set definition entry with a new mvtab index.  the field   >><<*8832>>03740000
<< will be set to a non-zero value by the mount procedure    >><<*8832>>03742000
<< when the first successful mount operation is performed by >><<*8832>>03744000
<< the set.  the field will be set to zero by dismount when  >><<*8832>>03746000
<< the last user dismounts the set.                          >><<*8832>>03748000
<<                                                           >><<*8832>>03750000
<< parameters:  ntry - full volume set definition entry.     >><<*8832>>03752000
<<              level - level of search in directory.        >><<*8832>>03754000
<<              inx -                                        >><<*8832>>03756000
<<              sirs -                                       >><<*8832>>03758000
<<              format of ownary -                           >><<*8832>>03760000
<<              ownary(0) - 0 - deallocate vs defn.          >><<*8832>>03762000
<<                          1 - allocate vs defn.            >><<*8832>>03764000
<<                    (1) - mvtab index                      >><<*8832>>03766000
<<                    (2) - value to add to vs defn refer-   >><<*8832>>03768000
<<                          ence count to inc/decrement      >><<*8832>>03770000
<<                    (3) - 0 - not first user of set        >><<*8832>>03772000
<<                          1 - first user of set allocating >><<*8832>>03774000
<<                              resources                    >><<*8832>>03776000
<<                                                           >><<*8832>>03778000
<< returns:     5 - directory sir not released; stop scan    >><<*8832>>03780000
<<                  through directory.                       >><<*8832>>03782000
<<                                                           >><<*8832>>03784000
<< callers: (of direcscan)                                   >><<*8832>>03786000
<<          mount                                            >><<*8832>>03788000
<<          dismount                                         >><<*8832>>03790000
<<                                                           >><<*8832>>03792000
<< note:  db is at the directory data segment upon entry to  >><<*8832>>03794000
<<        this procedure.                                    >><<*8832>>03796000
<<                                                           >><<*8832>>03798000
<<---------------------------------------------------------- >><<*8832>>03800000
                                                               <<*8832>>03802000
begin                                                          <<*8832>>03804000
     integer deltaq = q+0;                                              03806000
     array dds(*) = db+0;                                               03808000
     integer array ownary(*) = q+0;                                     03810000
                                                                        03812000
     equate                                                             03814000
          dadirty     = %221,                                           03816000
          defnlevel   =    4,                                           03818000
          grouplevel  =    1;                                           03820000
                                                                        03822000
     define dirtyf = (15:1)#;                                           03824000
                                                                        03826000
     inx:=inx-deltaq;                                                   03828000
     case * ownary(inx+0) of                                            03830000
     begin                                                              03832000
         begin  <<0 - deallocate vsdefn>>                               03834000
             if ntry (vdmisc).mvtabxf = 0 then suddendeath (419);       03836000
             ntry (vdrefcnt) := ntry (vdrefcnt)+ownary (inx+2);         03838000
             if ntry (x) <= 0 then                                      03840000
              if < then suddendeath (419)                               03842000
              else                                                      03844000
               ntry (vdmisc).mvtabxf := ownary (inx+1);                 03846000
             ntry (vdmisc).initallocf := ownary (inx+3);                03848000
         end;                                                           03850000
         begin  <<1 - allocate vsdefn>>                                 03852000
             if ntry (vdmisc).mvtabxf <> 0 then                         03854000
              if ntry (vdmisc).mvtabxf <> ownary (inx+1) then           03856000
               suddendeath (419);                                       03858000
             ntry (vdmisc).mvtabxf := ownary (inx+1);                   03860000
             ntry (vdmisc).initallocf := ownary (inx+3);                03862000
             ntry (vdrefcnt):=ntry (vdrefcnt)+ownary (inx+2);           03864000
         end;                                                           03866000
     end  <<case>>;                                                     03868000
     dds(dadirty).dirtyf:=1;                                            03870000
     pvrecip:=%5;  <<sirs not released, stop scan>>                     03872000
end << pvrecip >>;                                                      03874000
$page                                                          <<*8832>>03876000
$control segment = pvsysm                                               03878000
procedure getjitinfo (name);                                   <<06530>>03880000
array name;                                                    <<06530>>03882000
option privileged,uncallable;                                           03884000
                                                               <<*8832>>03886000
<<----------------------------------------------------------->><<*8832>>03888000
<<                                                           >><<*8832>>03890000
<<this procedure extracts the following info from the jit:   >><<*8832>>03892000
<<     name (0: 3) - user        name,                       >><<*8832>>03894000
<<     name (4: 7) - logon group name,                       >><<*8832>>03896000
<<     name (8:12) - account     name.                       >><<*8832>>03898000
<<                                                           >><<*8832>>03900000
<<callers:  dismount                                         >><<*8832>>03902000
<<          mount                                            >><<*8832>>03904000
<<                                                           >><<*8832>>03906000
<<----------------------------------------------------------->><<*8832>>03908000
                                                               <<*8832>>03910000
begin                                                                   03912000
integer jit'dst, pcbglobloc;                                   <<06530>>03914000
logical array qarray (*) = q + 0;                              <<06530>>03916000
                                                               <<06530>>03918000
subroutine def'move'from'dst;                                  <<06530>>03920000
pxglobal;                                                      <<06530>>03922000
jit'dst := pxg'jitdst;                                         <<06530>>03924000
move'from'dst (@name,    jit'dst, jit'uname'ptr, 4);           <<p7519>>03926000
move'from'dst (@name(4), jit'dst, jit'gname'ptr, 4);           <<p7519>>03928000
move'from'dst (@name(8), jit'dst, jit'aname'ptr, 4);           <<p7519>>03930000
end <<getjitinfo>>;                                                     03932000
$page                                                          <<*8832>>03934000
$control segment = pvsysd                                               03936000
procedure jitbind(mvtabx,gfipntr);                                      03938000
value mvtabx,gfipntr;                                                   03940000
integer mvtabx,gfipntr;                                                 03942000
option uncallable,privileged;                                           03944000
                                                               <<*8832>>03946000
<<----------------------------------------------------------->><<*8832>>03948000
<<                                                           >><<*8832>>03950000
<< jitbind first obtains the job jit dst from the pxglob     >><<*8832>>03952000
<< area of the stack.  the private volume releated fields in >><<*8832>>03954000
<< the jit are set depending in whether this is a mount or   >><<*8832>>03956000
<< dismount.                                                 >><<*8832>>03958000
<<                                                           >><<*8832>>03960000
<< parameters:  mvtabx - <>0 - mounting a private volume     >><<*8832>>03962000
<<                             with this mvtab index.        >><<*8832>>03964000
<<                       = 0 - dismount                      >><<*8832>>03966000
<<             gfipntr - pv group file index pointer from    >><<*8832>>03968000
<<                       directory                           >><<*8832>>03970000
<<                                                           >><<*8832>>03972000
<< callers:  dismount                                        >><<*8832>>03974000
<<           mount                                           >><<*8832>>03976000
<<                                                           >><<*8832>>03978000
<<----------------------------------------------------------->><<*8832>>03980000
                                                               <<*8832>>03982000
begin                                                                   03984000
integer pcbglobloc;                                            <<06530>>03986000
logical array qarray (*) = q + 0;                              <<06530>>03988000
logical array jitarr (*) = db + 0;                             <<06530>>03990000
                                                               <<06530>>03992000
pxglobal;                                                      <<06530>>03994000
exchangedb (pxg'jitdst);                                       <<06530>>03996000
if mvtabx <> 0 then                                            <<06530>>03998000
   begin                                                       <<06530>>04000000
   << mount >>                                                 <<06530>>04002000
   jitgipvf := true;     << home group is on pv >>             <<*8864>>04004000
   jitgimvf := true;     << private volume is mounted >>       <<*8864>>04006000
   end                                                         <<06530>>04008000
else                                                           <<06530>>04010000
   jitgimvf := false;   << dismount >>                         <<06530>>04012000
jitmvtabx := mvtabx;     << mvtab index of pv >>               <<*8864>>04014000
jitpvgip2 := gfipntr;    << pv group file index pointer >>     <<*8864>>04016000
exchangedb (0);                                                <<06530>>04018000
end << jitbind >>;                                                      04020000
$page                                                          <<*8832>>04022000
$control segment = pvsysd                                               04024000
procedure getabentry(tabdst,index,tabent);                              04026000
value tabdst,index;                                                     04028000
integer tabdst,index;                                                   04030000
array tabent;                                                           04032000
option privileged,uncallable;                                           04034000
                                                               <<*8832>>04036000
<<----------------------------------------------------------->><<*8832>>04038000
<<                                                           >><<*8832>>04040000
<< this procedure obtains an entry in a system table.  it    >><<*8832>>04042000
<< should not be used to retrieve an mvtab entry.  (use      >><<*8832>>04044000
<< getmvtabentry instead).                                   >><<*8832>>04046000
<<                                                           >><<*8832>>04048000
<< callers:  dismount                                        >><<*8832>>04050000
<<           mvtable                                         >><<*8832>>04052000
<<           pvinit (module 32)                              >><<*8832>>04054000
<<                                                           >><<*8832>>04056000
<<----------------------------------------------------------->><<*8832>>04058000
                                                               <<*8832>>04060000
begin                                                                   04062000
     integer entsize;                                                   04064000
                                                                        04066000
     <<get table entry size>>                                           04068000
     tos:=@entsize;                                                     04070000
     tos:=tabdst;                                                       04072000
     tos:=0;                                                            04074000
     tos:=1;                                                            04076000
     assemble(mfds 0);                                                  04078000
     entsize:=entsize.entsizef;                                         04080000
     <<get table entry>>                                                04082000
     s3:=@tabent;                                                       04084000
     s1:=entsize*index;                                                 04086000
     s0:=entsize;                                                       04088000
     assemble(mfds 4);                                                  04090000
end << getabentry >>;                                                   04092000
$page                                                          <<*8832>>04094000
$control segment = pvsysd                                               04096000
procedure putabentry(tabdst,index,tabent);                              04098000
value tabdst,index;                                                     04100000
integer tabdst,index;                                                   04102000
array tabent;                                                           04104000
option privileged,uncallable;                                           04106000
                                                               <<*8832>>04108000
<<----------------------------------------------------------->><<*8832>>04110000
<<                                                           >><<*8832>>04112000
<< this procedure replaces an entry in a system table.  it   >><<*8832>>04114000
<< should not be used to replace an mvtab entry.  (use       >><<*8832>>04116000
<< putmvtabentry instead)                                    >><<*8832>>04118000
<<                                                           >><<*8832>>04120000
<< callers:  mvtable                                         >><<*8832>>04122000
<<           pvinit (module 32)                              >><<*8832>>04124000
<<                                                           >><<*8832>>04126000
<<----------------------------------------------------------->><<*8832>>04128000
                                                               <<*8832>>04130000
begin                                                                   04132000
     integer entsize;                                                   04134000
                                                                        04136000
     <<get table entry size>>                                           04138000
     tos:=@entsize;                                                     04140000
     tos:=tabdst;                                                       04142000
     tos:=0;                                                            04144000
     tos:=1;                                                            04146000
     assemble(mfds 4);                                                  04148000
     entsize:=entsize.entsizef;                                         04150000
     <<write table entry>>                                              04152000
     tos:=tabdst;                                                       04154000
     tos:=entsize*index;                                                04156000
     tos:=@tabent;                                                      04158000
     tos:=entsize;                                                      04160000
     assemble(mtds 4);                                                  04162000
end << putabentry >>;                                                   04164000
$page                                                          <<*8832>>04166000
                                                                        04168000
$control segment = pvsysd                                               04170000
procedure getmvtabentry(mvtabx,mvtabent);                               04172000
value mvtabx;                                                           04174000
integer mvtabx;                                                         04176000
array mvtabent;                                                         04178000
option privileged,uncallable;                                           04180000
                                                               <<*8832>>04182000
<<----------------------------------------------------------->><<*8832>>04184000
<<                                                           >><<*8832>>04186000
<< this procedure obtains an mvtab entry with the index      >><<*8832>>04188000
<< mvtabx.                                                   >><<*8832>>04190000
<<                                                           >><<*8832>>04192000
<< callers:  dismount                                        >><<*8832>>04194000
<<           mount                                           >><<*8832>>04196000
<<           mvtable                                         >><<*8832>>04198000
<<           vsusercom                                       >><<*8832>>04200000
<<           pvinit (module 32)                              >><<*8832>>04202000
<<                                                           >><<*8832>>04204000
<<----------------------------------------------------------->><<*8832>>04206000
                                                               <<*8832>>04208000
begin                                                                   04210000
     integer entsize;                                                   04212000
                                                                        04214000
     <<get mvtab entry size>>                                           04216000
     tos:=@entsize;                                                     04218000
     tos:=mvtabdst;                                                     04220000
     tos:=0;                                                            04222000
     tos:=1;                                                            04224000
     assemble(mfds 0);                                                  04226000
     entsize:=entsize.mvtentsize;                                       04228000
     s3:=@mvtabent;                                                     04230000
     s1:=mvtabx * entsize;                                              04232000
     s0:=entsize;                                                       04234000
     assemble(mfds 4);                                                  04236000
end << getmvtabentry >>;                                                04238000
$page                                                          <<*8832>>04240000
$control segment = pvsysd                                               04242000
procedure putmvtabentry(mvtabx,mvtabent);                               04244000
value mvtabx;                                                           04246000
integer mvtabx;                                                         04248000
array mvtabent;                                                         04250000
option privileged,uncallable;                                           04252000
                                                               <<*8832>>04254000
<<----------------------------------------------------------->><<*8832>>04256000
<<                                                           >><<*8832>>04258000
<< this procedure replaces an mvtab entry with the index     >><<*8832>>04260000
<< mvtabx.                                                   >><<*8832>>04262000
<<                                                           >><<*8832>>04264000
<< callers:  mvtable                                         >><<*8832>>04266000
<<                                                           >><<*8832>>04268000
<<----------------------------------------------------------->><<*8832>>04270000
                                                               <<*8832>>04272000
begin                                                                   04274000
     integer entsize;                                                   04276000
                                                                        04278000
     <<get mvtab entry size>>                                           04280000
     tos:=@entsize;                                                     04282000
     tos:=mvtabdst;                                                     04284000
     tos:=0;                                                            04286000
     tos:=1;                                                            04288000
     assemble(mfds 4);                                                  04290000
     entsize:=entsize.mvtentsize;                                       04292000
     tos:=mvtabdst;                                                     04294000
     tos:=mvtabx * entsize;                                             04296000
     tos:=@mvtabent;                                                    04298000
     tos:=entsize;                                                      04300000
     assemble(mtds 4);                                                  04302000
end << putmvtabentry >>;                                                04304000
$page                                                          <<03511>>04306000
$control segment = pvsysd                                      <<03547>>04308000
procedure get'or'rel'pack (ldev,func);                         <<03547>>04310000
   value ldev,func;                                            <<03547>>04312000
   integer ldev,func;                                          <<03547>>04314000
   option internal;                                            <<03547>>04316000
                                                               <<03547>>04318000
<<----------------------------------------------------------->><<*8832>>04320000
<<                                                           >><<*8832>>04322000
<< procedure get'or'rel'pack will lock or unlock a cs80      >><<*8832>>04324000
<< (type=3) drive, depending on the value of func.  at this  >><<*8832>>04326000
<< time, the only cs80 drive available for pv operations is  >><<*8832>>04328000
<< the hp 7933/7935.                                         >><<*8832>>04330000
<<                                                           >><<*8832>>04332000
<< parameters:  func - lock - if mvtable finds mvtab=1       >><<*8832>>04334000
<<                            (first time accessing ldev).   >><<*8832>>04336000
<<                     unlock-if mvtable finds mvtab=0       >><<*8832>>04338000
<<                            last time accessing this ldev).>><<*8832>>04340000
<<                                                           >><<*8832>>04342000
<< returns:     cce - all ok.                                >><<*8832>>04344000
<<              ccl - attachio error trying to lock/unlock   >><<*8832>>04346000
<<                    ldev.                                  >><<*8832>>04348000
<<                                                           >><<*8832>>04350000
<< callers:     mvtable                                      >><<*8832>>04352000
<<                                                           >><<*8832>>04354000
<< note:  db must be at stack.                               >><<*8832>>04356000
<<                                                           >><<*8832>>04358000
<<----------------------------------------------------------->><<*8832>>04360000
                                                               <<*8832>>04362000
begin                                                          <<*8832>>04364000
                                                               <<03547>>04366000
                                                               <<03547>>04368000
define                                                         <<03547>>04370000
   cs'80  =  (type = 3)#;                                      <<03547>>04372000
                                                               <<03547>>04374000
integer                                                        <<03547>>04376000
   len,            << length of message buffer >>              <<03547>>04378000
   type,           << device type              >>              <<03547>>04380000
   stype;          << device sub-type          >>              <<03547>>04382000
                                                               <<03547>>04384000
cc := cce;                                                     <<03547>>04386000
                                                               <<03547>>04388000
type := ldevtotype (ldev);                                     <<03547>>04390000
if not cs'80 then return;     << only works for cs'80 drives >><<03547>>04392000
                                                               <<03547>>04394000
stype := ldevtosubtype(ldev);                                  <<03547>>04396000
if not d7933 then return;     << only 7933 for pv operations >><<04278>>04398000
                                                               <<03547>>04400000
                                                               <<03547>>04402000
tos := p'attachio(ldev,0,0,0,func,0,0,0,blockedio);                     04404000
del;                                                           <<03547>>04406000
if s0.(8:8) <> 1 then cc := ccl;                               <<03547>>04408000
                                                               <<03547>>04410000
end;        << get'or'rel'pack >>                              <<03547>>04412000
                                                                        04414000
$page "PVSYS - MOUNTED VOLUME TABLE (MVTAB) HANDLER"                    04416000
                                                                        04418000
$control segment = pvsysd                                               04420000
procedure mvtable(funct,mvtabx,devlist,vmask,usecount,fmask);  <<07110>>04422000
value funct,vmask;                                                      04424000
integer funct,mvtabx,usecount;                                 <<*8832>>04426000
logical vmask,fmask;                                           <<*8832>>04428000
array devlist;                                                 <<*8832>>04430000
option variable;                                               <<*8832>>04432000
option privileged,uncallable;                                  <<*8832>>04434000
                                                               <<*8832>>04436000
<<----------------------------------------------------------->><<*8832>>04438000
<<                                                           >><<*8832>>04440000
<< this procedure performs all mounted volume table changes. >><<*8832>>04442000
<< an mvtab entry is created when the first user causes a set>><<*8832>>04444000
<< to be mounted, and deleted when the last user causes the  >><<*8832>>04446000
<< set to be dismounted.  if a set is mounted by more than   >><<*8832>>04448000
<< one user, subsequent users will cause various use counts  >><<*8832>>04450000
<< to be incremented but not create new mvtab entries for    >><<*8832>>04452000
<< the set.                                                  >><<*8832>>04454000
<<                                                           >><<*8832>>04456000
<< parameters:  funct - 0 (delete)                           >><<*8832>>04458000
<<                      if use count is still greater than 0 >><<*8832>>04460000
<<                      after decrementing, the entry will   >><<*8832>>04462000
<<                      not be deleted.                      >><<*8832>>04464000
<<                      1 (add)                              >><<*8832>>04466000
<<                      if mvtabx is non-zero, then set and  >><<*8832>>04468000
<<                      volume use counts will be incre-     >><<*8832>>04470000
<<                      mented.                              >><<*8832>>04472000
<<                      2 (preserve)                         >><<*8832>>04474000
<<                      only increasing the user count and   >><<*8832>>04476000
<<                      volume count so that another dismount>><<*8832>>04478000
<<                      will not remove the entry.           >><<*8832>>04480000
<<              mvtabx- = 0 allocate and format new mvtab    >><<*8832>>04482000
<<                          entry.                           >><<*8832>>04484000
<<                      < 0 format new mvtab entry.          >><<*8832>>04486000
<<                      > 0 logical mount for volume with    >><<*8832>>04488000
<<                          mvtab index mvtabx.              >><<*8832>>04490000
<<              devlist-list of logical device numbers.      >><<*8832>>04492000
<<              vmask - bit mask of volume member usage,     >><<*8832>>04494000
<<                      from the volume set def. entry.      >><<*8832>>04496000
<<                                                           >><<*8832>>04498000
<< returns:     (both optional)                              >><<*8832>>04500000
<<              fmask - bit map indicating which index into  >><<*8832>>04502000
<<                      the mvtab we accessed.               >><<*8832>>04504000
<<              usecount - volume set use count from mvtab   >><<*8832>>04506000
<<                         entry.                            >><<*8832>>04508000
<< callers:  mount                                           >><<*8832>>04510000
<<           dismount                                        >><<*8832>>04512000
<<                                                           >><<*8832>>04514000
<<----------------------------------------------------------->><<*8832>>04516000
                                                               <<*8832>>04518000
begin                                                                   04520000
     logical pmap = q-4;                                                04522000
     logical dfs'status;                                       <<03504>>04524000
     integer                                                   <<*8864>>04526000
          v,       << volume index into mvtabent >>            <<*8864>>04528000
          hvol,    << highest volume number mounted >>         <<*8864>>04530000
          nvol,    << number of volumes mounted >>             <<*8864>>04532000
          entnum,  << maximum number of entries in mvtab >>    <<*8864>>04534000
          entsize; << mvtab entry size >>                      <<*8864>>04536000
     logical                                                   <<*8864>>04538000
          a, d,     << saving sir returns >>                   <<*8864>>04540000
          cmask:=0; << bit map of mvtab index usage >>         <<*8864>>04542000
     array mvtabent(0:mvtabentsize);                                    04544000
     double array mvtabentd(*) = mvtabent(5);                           04546000
     array vlab(0:127);                                                 04548000
     array vtabent(*) = vlab;  <<double use of vlab area>>              04550000
     define pucount = pmap.(14:1)#;                            <<07110>>04552000
     define pcmask  = pmap.(15:1)#;                            <<07110>>04554000
                                                                        04556000
                                                               <<*8832>>04558000
<<...........................................................>><<*8832>>04560000
                                                               <<*8832>>04562000
     subroutine leave;                                                  04564000
                                                               <<*8832>>04566000
     << sole exit point from this procedure >>                 <<*8832>>04568000
                                                               <<*8832>>04570000
     begin                                                              04572000
          relsir(vtabsir,a);                                            04574000
          assemble(exit 6);                                             04576000
     end <<leave>>;                                                     04578000
                                                                        04580000
<<...........................................................>><<*8832>>04582000
                                                               <<*8832>>04584000
     subroutine updatevtab(vx,mx,volx);                                 04586000
     value vx,mx,volx;                                                  04588000
     integer vx,mx,volx;                                                04590000
                                                               <<*8832>>04592000
     << this subroutine updates the volume table entry for a >><<*8832>>04594000
     << volume which is a member of a volume set being       >><<*8832>>04596000
     << mounted by the first user of the set.                >><<*8832>>04598000
                                                               <<*8832>>04600000
     begin                                                              04602000
          getabentry(vtabdst,vx,vtabent);                               04604000
          vtabent(13).(4:4):=volx;  <<local vol. index>>                04606000
          vtabent(13).(8:8):=mx;    <<mvtab index     >>                04608000
          putabentry(vtabdst,vx,vtabent);                               04610000
     end <<updatevtab>>;                                                04612000
                                                                        04614000
<<...........................................................>><<*8832>>04616000
                                                               <<*8832>>04618000
     integer subroutine getmvtabx;                                      04620000
                                                               <<*8832>>04622000
     << this subroutine obtains an mvtab index for a new     >><<*8832>>04624000
     << entry.  the entire mvtab is searched until an entry  >><<*8832>>04626000
     << not in use is found.  the entry is then marked in use>><<*8832>>04628000
     << and its index returned to the caller.                >><<*8832>>04630000
                                                               <<*8832>>04632000
     begin                                                              04634000
          v:=0;                                                         04636000
          d:=exchangedb(mvtabdst);                                      04638000
          entsize:=mvtab.(0:8);                                         04640000
          entnum:=mvtab.(8:8);                                          04642000
          while (v:=v+1) <= entnum do  <<run thru table>>               04644000
          if not mvtab(v*entsize).inuse then                            04646000
          begin                                                         04648000
               mvtab(x):=mvtab(mountcnt)+1;                             04650000
               mvtab(v*entsize).inuse:=true;                            04652000
               getmvtabx:=v;                                            04654000
               v:=entnum;  <<stop loop>>                                04656000
          end;                                                          04658000
          exchangedb(d);                                                04660000
     end <<getmvtabx>>;                                                 04662000
                                                                        04664000
<<...........................................................>><<*8832>>04666000
                                                               <<*8832>>04668000
     subroutine delmvtabent(index);                                     04670000
     value index; integer index;                                        04672000
                                                               <<*8832>>04674000
     << this subroutine deletes an entry from the mvtab.     >><<*8832>>04676000
     << the entry is zeroed but the table is not compacted.  >><<*8832>>04678000
                                                               <<*8832>>04680000
     begin                                                              04682000
          <<decrement number of mounted volume sets>>                   04684000
          getmvtabentry(0,mvtabent);                                    04686000
          mvtabent(x):=mvtabent(mountcnt)-1;                            04688000
          putmvtabentry(0,mvtabent);                                    04690000
          <<zero entry to delete it from mvtab>>                        04692000
          mvtabent:=0; move mvtabent(1):=mvtabent,(mvtabentsize-1);     04694000
          putmvtabentry(index,mvtabent);                                04696000
     end <<delmvtabent>>;                                               04698000
                                                                        04700000
<<...........................................................>><<*8832>>04702000
                                                               <<*8832>>04704000
     subroutine addvolentry;                                            04706000
                                                               <<*8832>>04708000
     << this subroutine adds a volume entry into an existing >><<*8832>>04710000
     << mvtab entry.  there will be a volume entry for each  >><<*8832>>04712000
     << volume of a currently mounted volume set.  all the   >><<*8832>>04714000
     << members of a volume set need not be mounted simul-   >><<*8832>>04716000
     << taneously.  a volume class may be mounted which is a >><<*8832>>04718000
     << subset of the members of a set.  individual volume   >><<*8832>>04720000
     << information is kept primarily because of volume      >><<*8832>>04722000
     << classes.  note that v must contain a volume index    >><<*8832>>04724000
     << into mvtabent.                                       >><<*8832>>04726000
                                                               <<*8832>>04728000
     begin                                                     <<*8832>>04730000
          tos:=devlist(v+2).(0:8) + devlist(v+2)&lsl(8);                04732000
          if <> then  <<valid member of set>>                           04734000
          begin                                                         04736000
               cmask:=cmask lor (1 & lsl(v));                           04738000
               nvol:=nvol+1;                                            04740000
               if v > hvol then hvol:=v;                                04742000
               updatevtab(devlist(v+2).(0:8),mvtabx,v+1);               04744000
               tos:=1;  <<volume-use count>>                            04746000
                                                               <<03504>>04748000
               << allocate disc free space data segment >>     <<03504>>04750000
               << for this ldev.                        >>     <<03504>>04752000
                                                               <<03504>>04754000
               dfs'status := allocate'dfs'data'seg             <<03504>>04756000
                                (devlist(v+2).(8:8));          <<03504>>04758000
                                                               <<03504>>04760000
               if not dfs'status then                          <<03504>>04762000
                  send'process'dfs'error (devlist(v+2).(8:8),  <<03504>>04764000
                                     dfs'status, 1);           <<03504>>04766000
                                                               <<03504>>04768000
          end else                                                      04770000
          tos:=0;  <<null volume-use count>>                            04772000
          mvtabentd(v):=tos;                                            04774000
     end <<addvolentry>>;                                               04776000
                                                                        04778000
<<...........................................................>><<*8832>>04780000
                                                               <<*8832>>04782000
     subroutine delvolentry(fixup);                                     04784000
     value fixup; logical fixup;                                        04786000
                                                               <<*8832>>04788000
     << this subroutine deletes a volume entry from an exis- >><<*8832>>04790000
     << ting mvtab entry.  because of volume classes, it is  >><<*8832>>04792000
     << possible to have a member volume no longer mounted   >><<*8832>>04794000
     << while the set itself remains mounted.  however, the  >><<*8832>>04796000
     << master volume of the set must always be mounted when >><<*8832>>04798000
     << the set is.  note that v must contain a volume index >><<*8832>>04800000
     << into mvtabent.                                       >><<*8832>>04802000
                                                               <<*8832>>04804000
     begin                                                     <<*8832>>04806000
          if mvtabentd(v) <> 0d then                                    04808000
          begin                                                         04810000
               cmask:=cmask lor (1 & lsl(v));                           04812000
               if fixup then  <<not deleting entire mvtab ent>>         04814000
               begin                                                    04816000
                    nvol:=nvol-1;                                       04818000
                    if v = hvol then  <<find new hvol>>                 04820000
                    while mvtabentd(hvol) = 0d do hvol:=hvol-1;         04822000
               end;                                                     04824000
               updatevtab(mvtabent((v&lsl(1))+5).(8:8),0,0);            04826000
                                                               <<03504>>04828000
          << deallocate disc free space data segment for >>    <<03504>>04830000
          << this ldev, as there are no more users.      >>    <<03504>>04832000
                                                               <<03504>>04834000
          tos := 0;   << leave room for return value >>        <<03504>>04836000
          tos := mvtabentd (v);   << extract ldev >>           <<03504>>04838000
          del;                                                 <<03504>>04840000
          tos := tos.(0:8);                                    <<03504>>04842000
          tos := deallocate'dfs'data'seg (*);                  <<03504>>04844000
          dfs'status := tos;                                   <<03504>>04846000
                                                               <<03504>>04848000
          if not dfs'status then                               <<03504>>04850000
             begin  << deallocation error >>                   <<03504>>04852000
                                                               <<03504>>04854000
                tos := mvtabentd (v);   << extract ldev >>     <<03504>>04856000
                del;                                           <<03504>>04858000
                tos := tos.(0:8);                              <<03504>>04860000
                tos := dfs'status;      << second parm >>      <<03504>>04862000
                tos := 2;               << type parm   >>      <<03504>>04864000
                send'process'dfs'error (*, *, *);              <<03504>>04866000
                                                               <<03504>>04868000
             end;   << deallocation error >>                   <<03504>>04870000
                                                               <<03504>>04872000
          << release memory used by cache                    >><<07337>>04874000
                                                               <<07337>>04876000
          tos := mvtabentd (v);                                <<07337>>04878000
          assemble (xch);                                      <<07337>>04880000
          tos := tos.(0:8);                                    <<07337>>04882000
          flush'cache (*, 0d, %17777777777 d);                 <<07337>>04884000
          end;                                                          04886000
          mvtabentd(v):=0d;  <<null volume entry>>                      04888000
     end <<delvolentry>>;                                               04890000
                                                                        04892000
<<...........................................................>><<*8832>>04894000
                                                               <<*8832>>04896000
     subroutine buildmvtabent;                                          04898000
                                                               <<*8832>>04900000
     << this subroutine formats and adds a new mvtab entry.  >><<*8832>>04902000
     << the basic configuration of the entry is determined by>><<*8832>>04904000
     << the devlist array constructed by the mount procedure >><<*8832>>04906000
     << from the volume set definition entry.                >><<*8832>>04908000
                                                               <<*8832>>04910000
     begin                                                              04912000
          hvol:=nvol:=0;                                                04914000
          mvtabent:=%100000;  <<in-use,dismount/down fields = 0>>       04916000
          mvtabent(1):=1;  <<use count>>                                04918000
          mvtabent(2):=0 cat devlist(2)(0:8:8);  <<mv ldev>>            04920000
          get'or'rel'pack (devlist(2).(8:8),lock);             <<03584>>04922000
          if <> then leave;                                    <<03584>>04924000
                                                               <<03584>>04926000
          discio(devlist(2).(8:8),r,vlab,0d,128);  <<mv label>>         04928000
          if <> then                                                    04930000
          begin                                                         04932000
               cc:=ccl;                                                 04934000
               leave;                                                   04936000
          end;                                                          04938000
          mvtabent(3):=vlab(ldirbase);                                  04940000
          mvtabent(4):=vlab(lgenindex);                                 04942000
          for v:=0 until (maxvolnum-1) do addvolentry;                  04944000
          mvtabent(1).hvolf:=hvol;  <<highest vol. num mounted>>        04946000
          mvtabent(1).nvolf:=nvol;  <<number of volumes mounted>>       04948000
                                                               <<07109>>04950000
          <<------------------------------------------------->><<07109>>04952000
          << keep dir. size in compact form (multiple of 32) >><<07109>>04954000
          << in first word of mounted volume table entry.    >><<07109>>04956000
          << this word has only 11 bits available. the dir.  >><<07109>>04958000
          << size should be a multiple of 32 otherwise it    >><<07109>>04960000
          << will be truncated. it is used as a limiter of   >><<07109>>04962000
          << directory by directory space management.        >><<07109>>04964000
          <<------------------------------------------------->><<07109>>04966000
          mvtabent.(5:11) := vlab(ldirsize) &lsr(5);           <<07109>>04968000
                                                               <<07109>>04970000
          mvtabent(6).(8:8) := 1;  << volume use count = 1. >>          04972000
     end <<buildmvtabent>>;                                             04974000
                                                                        04976000
<<...........................................................>><<*8832>>04978000
                                                               <<*8832>>04980000
     subroutine fixvolinfo;                                             04982000
                                                               <<*8832>>04984000
     << this subroutine updates use counts for individual    >><<*8832>>04986000
     << volumes mounted as part of the set.                  >><<*8832>>04988000
                                                               <<*8832>>04990000
     begin                                                              04992000
          v:=0;  <<volume pointer into mvtab entry>>                    04994000
          hvol:=mvtabent(1).hvolf;                                      04996000
          nvol:=mvtabent(1).nvolf;                                      04998000
          while vmask <> 0 do                                           05000000
          begin                                                         05002000
               if vmask then  <<a volume to process>>                   05004000
               begin                                                    05006000
                    if funct = add or funct = preserve then             05008000
                    begin                                               05010000
                         if mvtabentd(v) = 0d then addvolentry else     05012000
                         begin                                          05014000
                              <<bump vol use count>>                    05016000
                              tos:=mvtabentd(v);                        05018000
                              tos:=tos+1;  <<bump vol use count>>       05020000
                              if s0.usecntf = 1 then           <<07177>>05022000
                              begin                            <<03511>>05024000
                                get'or'rel'pack(s1.ldevf,lock);<<03511>>05026000
                                if <> then leave;              <<03511>>05028000
                              end;                             <<03511>>05030000
                                                               <<03511>>05032000
                              mvtabentd(v):=tos;                        05034000
                         end;                                           05036000
                    end                                        <<*8864>>05038000
                    else   << funct=delete >>                  <<*8864>>05040000
                    begin                                               05042000
                         if mvtabentd(v) <> 0d then <<fix ent>>         05044000
                         begin                                          05046000
                              tos:=mvtabentd(v);                        05048000
                              tos:=tos-1;  <<decr use count>>           05050000
                              if s0.usecntf = 0 then           <<07177>>05052000
                              begin                                     05054000
                              get'or'rel'pack(s1.ldevf,unlock);<<03511>>05056000
                              if <> then leave;                <<03511>>05058000
                                                               <<03511>>05060000
                                   delvolentry(true);                   05062000
                                   assemble(ddel);                      05064000
                              end else                                  05066000
                              mvtabentd(v):=tos;                        05068000
                         end;                                           05070000
                    end;                                                05072000
               end;                                                     05074000
               v:=v+1;                                                  05076000
               vmask:=vmask & lsr(1);                                   05078000
          end;                                                          05080000
          mvtabent(1).hvolf:=hvol;                                      05082000
          mvtabent(1).nvolf:=nvol;                                      05084000
     end <<fixvolinfo>>;                                                05086000
                                                                        05088000
<<...........................................................>><<*8832>>05090000
                                                               <<*8832>>05092000
<< begin procedure mvtable >>                                  <<*8832>>05094000
                                                               <<*8832>>05096000
$if x0=on                                                               05098000
     mmstat (-200,funct,mvtabx,deltap);                        <<monit>>05100000
$if                                                                     05102000
     cc:=cce;                                                           05104000
     a:=getsir(vtabsir);                                                05106000
     if funct = add or funct = preserve then  <<add or bump use count>> 05108000
     begin                                                              05110000
          if mvtabx > 0 then  <<logical mount>>                         05112000
          begin                                                         05114000
               getmvtabentry(mvtabx,mvtabent);                          05116000
               if not mvtabent.inuse then                               05118000
               begin                                                    05120000
                    cc:=ccg;                                            05122000
                    leave;                                              05124000
               end;                                                     05126000
               if funct = preserve then                                 05128000
                mvtabent(1).usecntf := mvtabent(1).usecntf+1;  <<07177>>05130000
                if mvtabent(1).usecntf = 1 then                <<07177>>05132000
                begin                                          <<03584>>05134000
                   get'or'rel'pack(mvtabent(2).ldevf,lock);    <<03584>>05136000
                   if <> then leave;                           <<03584>>05138000
                end;                                           <<03584>>05140000
                                                               <<03584>>05142000
               fixvolinfo;                                              05144000
          end                                                  <<*8864>>05146000
          else    << allocate and/or format mvtab entry >>     <<*8864>>05148000
          begin                                                         05150000
               if (mvtabx :=                                            05152000
                if mvtabx < 0 then -mvtabx else getmvtabx) = 0 then     05154000
                begin                                                   05156000
                     cc:=ccl;                                           05158000
                     leave;                                             05160000
                end;                                                    05162000
               buildmvtabent;                                           05164000
          end;                                                          05166000
          putmvtabentry(mvtabx,mvtabent);                               05168000
     end                                                       <<*8864>>05170000
     else   << funct=delete, remove or decrement use count >>  <<*8864>>05172000
     begin                                                              05174000
          getmvtabentry(mvtabx,mvtabent);                               05176000
          if not mvtabent.inuse then                                    05178000
          begin                                                         05180000
               cc:=ccg;                                                 05182000
               leave;                                                   05184000
          end;                                                          05186000
          mvtabent(1).usecntf := mvtabent(1).usecntf - 1;      <<07177>>05188000
          if mvtabent(1).usecntf = 0 then << no more users. >> <<07177>>05190000
          begin                                                         05192000
               for v:=0 until (maxvolnum-1) do delvolentry(false);      05194000
               get'or'rel'pack(mvtabent(2).ldevf,unlock);      <<03584>>05196000
               if <> then leave;                               <<03584>>05198000
                                                               <<03584>>05200000
               delmvtabent(mvtabx);                                     05202000
          end else                                                      05204000
          begin                                                         05206000
               fixvolinfo;                                              05208000
               putmvtabentry(mvtabx,mvtabent);                          05210000
          end;                                                          05212000
     end;                                                               05214000
     if pucount then                                           <<07110>>05216000
        usecount := mvtabent(1).usecntf;                       <<07177>>05218000
     if pcmask then                                            <<07110>>05220000
        fmask := cmask;                                        <<07110>>05222000
     leave;                                                             05224000
end << mvtable >>;                                                      05226000
                                                                        05228000
$page "PVSYS - USER TABLE (PVUSER) HANDLER"                             05230000
                                                                        05232000
$control segment = pvsysd                                               05234000
integer procedure usertable (funct,pcbpt,vmask'mvtabx,         <<06533>>05236000
                             retinfo,retsize);                 <<06533>>05238000
value funct,pcbpt,vmask'mvtabx,retsize;                        <<06533>>05240000
integer funct,pcbpt,vmask'mvtabx,retsize;                      <<06533>>05242000
array retinfo;                                                 <<06533>>05244000
option variable,privileged,uncallable;                         <<06533>>05246000
begin                                                          <<06533>>05248000
                                                               <<06533>>05250000
<<**********************************************************>> <<06533>>05252000
<<                                                          >> <<06533>>05254000
<< this procedure performs following functions :            >> <<06533>>05256000
<< 0 - create user entry in private volume user table,      >> <<06533>>05258000
<< 1 - remove user entry form private volume user table,    >> <<06533>>05260000
<< 2 - returns all mvtabx used by a specific pcb,           >> <<06533>>05262000
<< 3 - returns all pcb pointers using a specific mvtabx,    >> <<06533>>05264000
<< 4 - extracts user entry from private volume user table.  >> <<06533>>05266000
<<                                                          >> <<06533>>05268000
<<**********************************************************>> <<06533>>05270000
                                                               <<06533>>05272000
<<---------------------------------------------------------->> <<06533>>05274000
<<                                                          >> <<06533>>05276000
<< input :                                                  >> <<06533>>05278000
<<         funct - function                                 >> <<06533>>05280000
<<         pcbpt - pcb pointer (function : 0,1,2,4)         >> <<06533>>05282000
<<         vmask'mvtabx - (0:8) - volume mask,              >> <<06533>>05284000
<<                        (8:8) - mvtabx (funct : 0,1,3,4)  >> <<06533>>05286000
<<         retinfo      - retinfo (0) - mount/bind mask,    >> <<06533>>05288000
<<                      - retinfo (1) - bind name dst       >> <<06533>>05290000
<<                      - retinfo (2) - bind name count,    >> <<06533>>05292000
<<                        (funct : 0,1),                    >> <<06533>>05294000
<<         retsize      - returned table size (funct : 2,3) >> <<06533>>05296000
<<                                                          >> <<06533>>05298000
<< output :                                                 >> <<06533>>05300000
<<         retinfo      - retinfo (0) - count (funct : 2,3) >> <<06533>>05302000
<<                      - retinfo (x) - pcb   (funct : 3)   >> <<06533>>05304000
<<                      - retinfo (x) - mvtabx (funct : 2)  >> <<06533>>05306000
<<                      - retinfo     - user entry (funct:4)>> <<06533>>05308000
<<                                                          >> <<06533>>05310000
<< callers :  dismount                                      >> <<*8832>>05312000
<<            mount                                         >> <<*8832>>05314000
<<            vsusercom                                     >> <<*8832>>05316000
<<            morgue (module 64)                            >> <<*8832>>05318000
<<                                                          >> <<*8832>>05320000
<< note:                                                    >> <<06533>>05322000
<<                                                          >> <<06533>>05324000
<< usertable entry headers for each mounted volume current- >> <<06533>>05326000
<<ly use the last word (bit 15) to record operator logical  >> <<06533>>05328000
<<mounts (bit on) and dismounts (bit zero).  this should be >> <<06533>>05330000
<<changed to include a user sub-entry as any other user to  >> <<06533>>05332000
<<the table for each operator mount by process pin number.  >> <<06533>>05334000
<<---------------------------------------------------------->> <<06533>>05336000
                                                               <<06533>>05338000
logical pmap = q-4;  <<optional prameters map>>                <<06533>>05340000
double nameinfo;                                               <<06533>>05342000
integer uc,ub,sc,sb;  <<mount and bind increments>>            <<06533>>05344000
integer i,j,cnt,cnt1,dst,pin,incr,size,esize,index,pinloc,     <<06533>>05346000
        pvcount,maxcount,actusers,maxusers,pvue'index;         <<06533>>05348000
logical a,mask,umask,vmask,mvtabx,                             <<06533>>05350000
        nameinfo1 = nameinfo,                                  <<06533>>05352000
        nameinfo2 = nameinfo1+1;                               <<06533>>05354000
integer array pvuser(*) = db+0;                                <<06533>>05356000
integer pointer pvuent;                                        <<06533>>05358000
equate byemask = %17;                                          <<06533>>05360000
equate                                                         <<06533>>05362000
     addpin    = 0,                                            <<06533>>05364000
     delpin    = 1;                                            <<06533>>05366000
define                                                         <<06533>>05368000
     pvmask  = logical (pvu'mvtab'mask)#,                      <<06533>>05370000
     opmount = logical (pvu'vs'opmask <> 0)#;                  <<06533>>05372000
                                                               <<06533>>05374000
<<**********************************************************>> <<06533>>05376000
                                                               <<06533>>05378000
subroutine pexit (exittype);                                   <<06533>>05380000
value exittype;  integer exittype;                             <<06533>>05382000
   begin                                                       <<06533>>05384000
   if (exittype<>okexit) and (cc=cce) then                     <<06533>>05386000
      cc := ccl;                                               <<06533>>05388000
   usertable := exittype;                                      <<06533>>05390000
   if dst >= 0 then                                            <<06533>>05392000
      exchangedb (dst);                                        <<06533>>05394000
   relsir (pvu'sir, a);                                        <<06533>>05396000
   assemble (exit 6);                                          <<06533>>05398000
   end <<pexit>>;                                              <<06533>>05400000
                                                               <<06533>>05402000
<<**********************************************************>> <<06533>>05404000
                                                               <<06533>>05406000
                                                               <<06533>>05408000
subroutine expandpvutab;                                       <<06533>>05410000
                                                               <<06533>>05412000
<< this subroutine expands pv user data segment.            >> <<06533>>05414000
                                                               <<06533>>05416000
begin << expand segment length >>                              <<06533>>05418000
<< expand up to 64 kb if necessary.                         >> <<06533>>05420000
<<if (pvu'size + pvu'dst'inc) >= pvu'max'size then>>           <<06533>>05422000
<<  pexit (noroom);>>                                          <<06533>>05424000
i := altdsegsize (pvu'dst, pvu'dst'inc);                       <<06533>>05426000
if <> then                                                     <<06533>>05428000
    begin << expansion failure >>                              <<06533>>05430000
    if ccg then                                                <<06533>>05432000
       tos := noroom                                           <<06533>>05434000
    else                                                       <<06533>>05436000
       tos := pvsegerr;                                        <<06533>>05438000
    pexit(*);                                                  <<06533>>05440000
    end;                                                       <<06533>>05442000
pvuser (pvu'size) := 0;                                        <<06533>>05444000
move pvuser (pvu'size+1) := pvuser (pvu'size),                 <<06533>>05446000
     ((i - pvu'size) - 1);                                     <<06533>>05448000
pvu'size := i;  << new segment length >>                       <<06533>>05450000
end << expandpvutab >>;                                        <<06533>>05452000
                                                               <<06533>>05454000
<<**********************************************************>> <<06533>>05456000
                                                               <<06533>>05458000
logical subroutine checkpin;                                   <<06533>>05460000
                                                               <<06533>>05462000
<< this subroutine determines if a user identified by pin    >><<*8832>>05464000
<< is currently using the volume set identified by mvtabx.   >><<*8832>>05466000
<< if pin has a value of 0, the operator is the user in ques->><<*8832>>05468000
<< tion.  if in use, the user entry offset is returned.      >><<*8832>>05470000
                                                               <<06533>>05472000
begin                                                          <<06533>>05474000
pinloc := -1;  <<assume op pin>>                               <<06533>>05476000
pvcount := pvu'count;                                          <<06533>>05478000
@pvuent := pvu'header;                                         <<06533>>05480000
i := 0;                                                        <<06533>>05482000
<< find volume set entry                                    >> <<06533>>05484000
while (i := i + 1) <= pvcount do                               <<06533>>05486000
   if pvu'vs'mvtabx = integer (mvtabx) then                    <<06533>>05488000
      << volume set entry found                             >> <<06533>>05490000
      begin                                                    <<06533>>05492000
      if pin <> 0 then                                         <<06533>>05494000
         begin                                                 <<06533>>05496000
         maxcount := pvu'vs'max'user;                          <<06533>>05498000
         j := -1;                                              <<06533>>05500000
         while (j := j + 1) < maxcount do                      <<06533>>05502000
            << find user entry in the volume set entry      >> <<06533>>05504000
            begin                                              <<06533>>05506000
            pvue'index := j * pvu'ent'size + pvu'vs'header;    <<06533>>05508000
            if pvu'ent'pin = pin then                          <<06533>>05510000
               begin                                           <<06533>>05512000
               checkpin := true;                               <<06533>>05514000
               pinloc := pvue'index;                           <<06533>>05516000
               j := maxcount;  <<stop loop>>                   <<06533>>05518000
               end;                                            <<06533>>05520000
            end;                                               <<06533>>05522000
         end                                                   <<06533>>05524000
      else                                                     <<06533>>05526000
         if opmount then                                       <<06533>>05528000
            << operator request                             >> <<06533>>05530000
            begin                                              <<06533>>05532000
            checkpin := true;                                  <<06533>>05534000
            pvu'vs'mount := 1; << logical mount >>             <<06533>>05536000
            pinloc := 0;  <<mark as op entry>>                 <<06533>>05538000
            end;                                               <<06533>>05540000
      i := pvcount;  <<stop loop>>                             <<06533>>05542000
      end                                                      <<06533>>05544000
   else                                                        <<06533>>05546000
      << set to next volume set entry                       >> <<06533>>05548000
      @pvuent := @pvuent + pvu'vs'size;                        <<07335>>05550000
pvue'index := pinloc;                                          <<06533>>05552000
end <<checkpin>>;                                              <<06533>>05554000
                                                               <<06533>>05556000
<<**********************************************************>> <<06533>>05558000
                                                               <<06533>>05560000
subroutine addentry;                                           <<06533>>05562000
                                                               <<06533>>05564000
<< this subroutine creates a new volume set entry in the     >><<*8832>>05566000
<< private volume user table.  the table is always in a com- >><<*8832>>05568000
<< pacted form.  word 2 of the volume set entry header con-  >><<*8832>>05570000
<< tains a bit mask where each bit position refers to the    >><<*8832>>05572000
<< presence of an entry in the table for that mvtab index.   >><<*8832>>05574000
<< space for the new entry is obtained from the end of the   >><<*8832>>05576000
<< table.                                                    >><<*8832>>05578000
                                                               <<*8832>>05580000
                                                               <<06533>>05582000
begin                                                          <<06533>>05584000
incr := pvu'vs'ent'sz;                                         <<06533>>05586000
if (pvu'size-pvu'avail'ent) <= pvu'vs'ent'sz                   <<06533>>05588000
    then expandpvutab;                                         <<06533>>05590000
                                                               <<06533>>05592000
@pvuent := pvu'avail'ent;                                      <<06533>>05594000
pvuent := 0; move pvuent(1) := pvuent,(incr-1);                <<06533>>05596000
pvuent := mvtabx;                                              <<06533>>05598000
pvu'vs'max'user := (incr-pvu'vs'header)/pvu'ent'size;          <<06533>>05600000
pvu'vs'size := incr;                                           <<06533>>05602000
                                                               <<06533>>05604000
<< update global table information >>                          <<06533>>05606000
                                                               <<06533>>05608000
pvu'count := pvu'count+1;                                      <<06533>>05610000
pvu'avail'ent := pvu'avail'ent+incr;                           <<06533>>05612000
pvu'mvtab'mask := pvmask lor (1 & lsl(mvtabx));                <<06533>>05614000
                                                               <<06533>>05616000
end  <<addentry>>;                                             <<06533>>05618000
                                                               <<06533>>05620000
<<**********************************************************>> <<06533>>05622000
                                                               <<06533>>05624000
                                                               <<06533>>05626000
subroutine delentry;                                           <<06533>>05628000
                                                               <<06533>>05630000
<< this suboutine deletes a volume set entry from the user   >><<*8832>>05632000
<< table.  the entry is zeroed and the table compacted if    >><<*8832>>05634000
<< necessary.  word 2 of the volume set entry header is up-  >><<*8832>>05636000
<< dated by resetting the bit corresponding to the mvtab     >><<*8832>>05638000
<< index for the deleted entry.                              >><<*8832>>05640000
                                                               <<06533>>05642000
begin                                                          <<06533>>05644000
esize := pvu'vs'size;  <<size of entry to be deleted>>         <<06533>>05646000
size := pvu'avail'ent - @pvuent (esize);                       <<06533>>05648000
                                                               <<06533>>05650000
<< compact user table                                       >> <<06533>>05652000
                                                               <<06533>>05654000
move pvuent := pvuent (esize), (size);                         <<06533>>05656000
<< zero residue after compaction                            >> <<06533>>05658000
pvuent (size) := 0;                                            <<06533>>05660000
move pvuent (size+1) := pvuent (size), (esize - 1);            <<06533>>05662000
                                                               <<06533>>05664000
<< update global table information                          >> <<06533>>05666000
                                                               <<06533>>05668000
pvu'count := pvu'count - 1;                                    <<06533>>05670000
pvu'avail'ent := pvu'avail'ent - esize;                        <<06533>>05672000
tos := pvmask land not (1 & lsl(mvtabx));                      <<06533>>05674000
pvu'mvtab'mask := tos;                                         <<06533>>05676000
end <<delentry>>;                                              <<06533>>05678000
                                                               <<06533>>05680000
<<**********************************************************>> <<06533>>05682000
                                                               <<06533>>05684000
subroutine adduser(mx);                                        <<06533>>05686000
                                                               <<06533>>05688000
<< this subroutine adds a user entry to a volume set entry.  >><<*8832>>05690000
<< if the pin is already a user of the set, its use count    >><<*8832>>05692000
<< will be incremented.  if there is no space for the user   >><<*8832>>05694000
<< entry, the volume set entry will be expanded to accomo-   >><<*8832>>05696000
<< date the entry.  at this time, sufficient space will be   >><<*8832>>05698000
<< obtained to contain five more user entries.               >><<*8832>>05700000
                                                               <<06533>>05702000
value mx; integer mx;                                          <<06533>>05704000
begin                                                          <<06533>>05706000
if mx = 0 then addentry;  <<create new pvuser entry>>          <<06533>>05708000
if pin = 0 then                                                <<06533>>05710000
                                                               <<06533>>05712000
   << operator mount request                                >> <<06533>>05714000
                                                               <<06533>>05716000
   begin                                                       <<06533>>05718000
   pvu'vs'opmask := vmask;                                     <<06533>>05720000
   pvu'vs'mount := 1;  << logical mount >>                     <<06533>>05722000
   return;                                                     <<06533>>05724000
   end;                                                        <<06533>>05726000
                                                               <<06533>>05728000
if checkpin then                                               <<06533>>05730000
                                                               <<06533>>05732000
   << pcb has already entry. updates counts only.           >> <<06533>>05734000
                                                               <<06533>>05736000
   begin                                                       <<06533>>05738000
   pvu'ent'ubind'c := pvu'ent'ubind'c+ub;                      <<06533>>05740000
   pvu'ent'umnt'c := pvu'ent'umnt'c+uc;                        <<06533>>05742000
   pvu'ent'sbind'c := pvu'ent'sbind'c+sb;                      <<06533>>05744000
   pvu'ent'smnt'c := pvu'ent'smnt'c+sc;                        <<06533>>05746000
   tos := nameinfo;                                            <<06533>>05748000
   pvu'ent'name'd := tos;                                      <<06533>>05750000
   pvu'ent'name'c := tos;                                      <<06533>>05752000
   return;                                                     <<06533>>05754000
   end;                                                        <<06533>>05756000
                                                               <<06533>>05758000
maxusers := pvu'vs'max'user;                                   <<06533>>05760000
actusers := pvu'vs'num'user;                                   <<06533>>05762000
if actusers = maxusers then                                    <<06533>>05764000
                                                               <<06533>>05766000
   << vs entry is full - expand                             >> <<06533>>05768000
                                                               <<06533>>05770000
   begin                                                       <<06533>>05772000
   incr := pvu'vs'inc;                                         <<06533>>05774000
   if (pvu'size-pvu'avail'ent) <= pvu'vs'inc                   <<06533>>05776000
        then expandpvutab;                                     <<06533>>05778000
   move pvuser (pvu'avail'ent+incr-1) :=                       <<06533>>05780000
        pvuser (pvu'avail'ent-1),                              <<06533>>05782000
        (-(pvu'avail'ent-(@pvuent+pvu'vs'size)));              <<06533>>05784000
   pvu'avail'ent := pvu'avail'ent+incr;                        <<06533>>05786000
   pvuent (pvu'vs'size) := 0;                                  <<06533>>05788000
   move pvuent (pvu'vs'size+1) :=                              <<06533>>05790000
        pvuent (pvu'vs'size), (incr-1);                        <<06533>>05792000
   pvu'vs'size := pvu'vs'size+incr;                            <<06533>>05794000
   pvu'vs'max'user := pvu'vs'max'user +                        <<06533>>05796000
      incr / pvu'ent'size;                                     <<06533>>05798000
   end;                                                        <<06533>>05800000
                                                               <<06533>>05802000
<< find new entry                                          >>  <<06533>>05804000
                                                               <<06533>>05806000
pvue'index := pvu'vs'header;                                   <<06533>>05808000
while pvuent (pvue'index) <> 0 do                              <<06533>>05810000
   pvue'index := pvue'index + pvu'ent'size;                    <<06533>>05812000
                                                               <<06533>>05814000
<< set new entry                                           >>  <<06533>>05816000
                                                               <<06533>>05818000
pvu'ent'vmask := vmask;   << save volume mask >>               <<06533>>05820000
pvu'ent'pin := pcbpt;   << save user pin >>                    <<06533>>05822000
pvu'ent'ubind'c := ub;    <<initial user bind count>>          <<06533>>05824000
pvu'ent'umnt'c := uc;     <<initial user mount count>>         <<06533>>05826000
pvu'ent'sbind'c := sb;    <<initial system bind count>>        <<06533>>05828000
pvu'ent'smnt'c := sc;     <<initial system mount count>>       <<06533>>05830000
tos := nameinfo;                                               <<06533>>05832000
pvu'ent'name'd := tos;                                         <<06533>>05834000
pvu'ent'name'c := tos;                                         <<06533>>05836000
pvu'vs'num'user := pvu'vs'num'user+1;                          <<06533>>05838000
end  <<adduser>>;                                              <<06533>>05840000
                                                               <<06533>>05842000
<<**********************************************************>> <<06533>>05844000
                                                               <<06533>>05846000
subroutine deluser(mx);                                        <<06533>>05848000
                                                               <<06533>>05850000
<< this subroutine deletes a user entry from volume set      >><<*8832>>05852000
<< entry.  if the use count for the pin is greater than 0    >><<*8832>>05854000
<< after decrementing, the user entry is not deleted.  when  >><<*8832>>05856000
<< a user entry is deleted it is set to zero; the volume set >><<*8832>>05858000
<< entry is not compacted.                                   >><<*8832>>05860000
                                                               <<06533>>05862000
value mx; integer mx;                                          <<06533>>05864000
begin                                                          <<06533>>05866000
cc := ccl;                                                     <<06533>>05868000
if mx = 0 then return;  <<incorrect mvtabx>>                   <<06533>>05870000
if checkpin then                                               <<06533>>05872000
                                                               <<06533>>05874000
   << user entry exist                                      >> <<06533>>05876000
                                                               <<06533>>05878000
   begin                                                       <<06533>>05880000
   cc := cce;  <<delete successful>>                           <<06533>>05882000
   if pin = 0 then                                             <<06533>>05884000
                                                               <<06533>>05886000
      << operator request                                   >> <<06533>>05888000
                                                               <<06533>>05890000
      begin                                                    <<06533>>05892000
      pvu'vs'mount := 0;                                       <<06533>>05894000
      pvu'vs'opmask  := 0;                                     <<06533>>05896000
      end                                                      <<06533>>05898000
   else                                                        <<06533>>05900000
      begin                                                    <<06533>>05902000
      pvu'ent'umnt'c := pvu'ent'umnt'c - uc;                   <<06533>>05904000
      pvu'ent'smnt'c := pvu'ent'smnt'c - sc;                   <<06533>>05906000
      cnt := pvu'ent'umnt'c+pvu'ent'smnt'c;                    <<06533>>05908000
      if cnt = 0 or umask = byemask then                       <<06533>>05910000
                                                               <<06533>>05912000
         << remove entry                                    >> <<06533>>05914000
                                                               <<06533>>05916000
         begin                                                 <<06533>>05918000
         pvuent(pinloc) := 0;  <<mark available>>              <<06533>>05920000
         move pvuent (pinloc+1) :=                             <<06533>>05922000
         pvuent (pinloc), (pvu'ent'size - 1);                  <<06533>>05924000
         pvu'vs'num'user := pvu'vs'num'user - 1;               <<06533>>05926000
         end                                                   <<06533>>05928000
      else                                                     <<06533>>05930000
                                                               <<06533>>05932000
         << adjust bind counts                              >> <<06533>>05934000
                                                               <<06533>>05936000
         begin                                                 <<06533>>05938000
         tos := nameinfo;                                      <<06533>>05940000
         pvu'ent'name'd := tos;                                <<06533>>05942000
         pvu'ent'name'c := tos;                                <<06533>>05944000
         pvu'ent'ubind'c := pvu'ent'ubind'c - ub;              <<06533>>05946000
         pvu'ent'sbind'c := pvu'ent'sbind'c - sb;              <<06533>>05948000
         end;                                                  <<06533>>05950000
      end;                                                     <<06533>>05952000
   if pvu'vs'num'user = 0 and not opmount then                 <<06533>>05954000
                                                               <<06533>>05956000
      << remove vs entry                                    >> <<06533>>05958000
                                                               <<06533>>05960000
      delentry;                                                <<06533>>05962000
   end;                                                        <<06533>>05964000
end <<deluser>>;                                               <<06533>>05966000
                                                               <<06533>>05968000
<<**********************************************************>> <<06533>>05970000
<<                                                          >> <<06533>>05972000
<< create or purge user entry                               >> <<06533>>05974000
<<                                                          >> <<06533>>05976000
<<**********************************************************>> <<06533>>05978000
                                                               <<06533>>05980000
subroutine updatepvuser (fnct);                                <<06533>>05982000
value fnct; integer fnct;                                      <<06533>>05984000
                                                               <<06533>>05986000
<< create user entry - funct = 0                            >> <<06533>>05988000
<< purge user entry  - funct = 1                            >> <<06533>>05990000
<< input : retinfo array                                    >> <<06533>>05992000
<<         retinfo (0) - mask (bind and mount counts)       >> <<06533>>05994000
<<         retinfo (1) - bind name dst                      >> <<06533>>05996000
<<         retinfo (2) - bind name count                    >> <<06533>>05998000
                                                               <<06533>>06000000
begin                                                          <<06533>>06002000
if mvtabx = 0 then                                             <<06533>>06004000
   begin                                                       <<06533>>06006000
   cc := ccl;                                                  <<06533>>06008000
   debug;                                                      <<06533>>06010000
   end;                                                        <<06533>>06012000
index := 0;                                                    <<06533>>06014000
umask := retinfo;  <<set use mask>>                            <<06533>>06016000
tos := retinfo (1);  tos := retinfo (2);                       <<06533>>06018000
nameinfo := tos;  <<names segment info>>                       <<06533>>06020000
dst := exchangedb (pvu'dst);                                   <<06533>>06022000
pvcount := pvu'count;                                          <<06533>>06024000
@pvuent := pvu'header;                                         <<06533>>06026000
                                                               <<06533>>06028000
<< find volume set entry                                    >> <<06533>>06030000
                                                               <<06533>>06032000
i := 0;                                                        <<06533>>06034000
while (i := i+1) <= pvcount do                                 <<06533>>06036000
if logical (pvu'vs'mvtabx) = mvtabx then                       <<06533>>06038000
   begin                                                       <<06533>>06040000
   index := mvtabx;                                            <<06533>>06042000
   i := pvcount;  <<stop loop>>                                <<06533>>06044000
   end                                                         <<06533>>06046000
else                                                           <<06533>>06048000
   @pvuent := @pvuent+pvu'vs'size;                             <<06533>>06050000
                                                               <<06533>>06052000
if index=0 and fnct = delpin then debug;                       <<06533>>06054000
uc := if umask. (12:1) then 1 else 0;                          <<06533>>06056000
ub := if umask. (13:1) then 1 else 0;                          <<06533>>06058000
sc := if umask. (14:1) then 1 else 0;                          <<06533>>06060000
sb := if umask. (15:1) then 1 else 0;                          <<06533>>06062000
                                                               <<06533>>06064000
if fnct = addpin then                                          <<06533>>06066000
   adduser (index)                                             <<06533>>06068000
else                                                           <<06533>>06070000
   deluser (index);                                            <<06533>>06072000
if pvu'size = 0 then debug;                                    <<06533>>06074000
exchangedb (dst);   dst := -1;                                 <<06533>>06076000
end <<updatepvuser>>;                                          <<06533>>06078000
                                                               <<06533>>06080000
                                                               <<06533>>06082000
<<**********************************************************>> <<06533>>06084000
<<                                                          >> <<06533>>06086000
<< return all mvtabxs used by a specified pcb               >> <<06533>>06088000
<<                                                          >> <<06533>>06090000
<<**********************************************************>> <<06533>>06092000
                                                               <<06533>>06094000
subroutine retuserinfo;                                        <<06533>>06096000
                                                               <<06533>>06098000
<< this subroutine returns a list of mvtabx indices for vol- >><<*8832>>06100000
<< ume sets of which pin is a user.  it calls checkpin to    ><<*8832>>06102000
<< scan through the user table looking for an entry contain- >><<*8832>>06104000
<< ing pin.  the list is returned in array retinfo in the    >><<*8832>>06106000
<< following format:                                         >><<*8832>>06108000
<<   retinfo(0)       - number of entries being returned     >><<*8832>>06110000
<<          (1).(4:4) - mvtabx for volume set 1              >><<*8832>>06112000
<<             .(8:8) - volume mask for volume set 1         >><<*8832>>06114000
<<       .                                                   >><<*8832>>06116000
<<       .                                                   >><<*8832>>06118000
<<          (n).(4:4)                                        >><<*8832>>06120000
                                                               <<06533>>06122000
begin                                                          <<06533>>06124000
cnt := cnt1 := mvtabx := retinfo := 0;                         <<06533>>06126000
dst := exchangedb (pvu'dst);                                   <<06533>>06128000
mask := pvu'mvtab'mask;                                        <<06533>>06130000
while mask <> 0 do                                             <<06533>>06132000
   begin                                                       <<06533>>06134000
   mvtabx := integer (mvtabx) + 1;                             <<06533>>06136000
   if (mask := mask & lsr (1)) then                            <<06533>>06138000
                                                               <<06533>>06140000
      << vs in use                                          >> <<06533>>06142000
                                                               <<06533>>06144000
      begin                                                    <<06533>>06146000
      if checkpin then  <<pin is using mvtabx>>                <<06533>>06148000
                                                               <<06533>>06150000
         << pcb has entry                                   >> <<06533>>06152000
                                                               <<06533>>06154000
         begin                                                 <<06533>>06156000
         cnt := cnt + 1;                                       <<06533>>06158000
         if cnt <= retsize then                                <<06533>>06160000
            begin                                              <<06533>>06162000
            cnt1 := cnt1 + 1;                                  <<06533>>06164000
            << put value on stack because in split stack mod>> <<06533>>06166000
            tos := pvu'ent'vmask cat mvtabx (4:12:4);          <<06533>>06168000
            end;                                               <<06533>>06170000
         end;                                                  <<06533>>06172000
      end;                                                     <<06533>>06174000
   end;                                                        <<06533>>06176000
if pvu'size = 0 then debug;                                    <<06533>>06178000
exchangedb (dst);   dst := -1;                                 <<06533>>06180000
                                                               <<06533>>06182000
<< return values in retinfo array                           >> <<06533>>06184000
                                                               <<06533>>06186000
retinfo := cnt;                                                <<06533>>06188000
while cnt1 > 0 do                                              <<06533>>06190000
   begin                                                       <<06533>>06192000
   retinfo (cnt1) := tos;                                      <<06533>>06194000
   cnt1 := cnt1-1;                                             <<06533>>06196000
   end;                                                        <<06533>>06198000
end <<retuserinfo>>;                                           <<06533>>06200000
                                                               <<06533>>06202000
<<**********************************************************>> <<06533>>06204000
<<                                                          >> <<06533>>06206000
<< return all pcb pointers using a specific mvtabx          >> <<06533>>06208000
<<                                                          >> <<06533>>06210000
<<**********************************************************>> <<06533>>06212000
                                                               <<06533>>06214000
subroutine retvsetinfo;                                        <<06533>>06216000
                                                               <<06533>>06218000
<< this subroutine returns a list of pins using a particular >><<*8832>>06220000
<< volume set.  all the pins contained in the user table is  >><<*8832>>06222000
<< returned in retinfo in the following format:              >><<*8832>>06224000
<<                                                           >><<*8832>>06226000
<<   retinfo(0) - number of entries being returned           >><<*8832>>06228000
<<          (1) - pin of first user of set                   >><<*8832>>06230000
<<      .                                                    >><<*8832>>06232000
<<          (n) - pin of nth user of set                     >><<*8832>>06234000
                                                               <<06533>>06236000
begin                                                          <<06533>>06238000
cnt := cnt1  := 0; <<assume no users of this mvtab index>>     <<06533>>06240000
if mvtabx = 0 then return;                                     <<06533>>06242000
dst := exchangedb (pvu'dst);                                   <<06533>>06244000
if (pvmask land (1 & lsl (mvtabx))) <> 0 then                  <<06533>>06246000
                                                               <<06533>>06248000
   << volume set mounted                                    >> <<06533>>06250000
                                                               <<06533>>06252000
   begin                                                       <<06533>>06254000
   pvcount := pvu'count;                                       <<06533>>06256000
   @pvuent := pvu'header;                                      <<06533>>06258000
   i := 0;                                                     <<06533>>06260000
   while (i := i + 1) <= pvcount do                            <<06533>>06262000
   if logical (pvu'vs'mvtabx) = mvtabx then                    <<06533>>06264000
                                                               <<06533>>06266000
      << volume set entry found                             >> <<06533>>06268000
                                                               <<06533>>06270000
      begin <<found required mvtabx>>                          <<06533>>06272000
      i := pvcount; <<stop loop>>                              <<06533>>06274000
      cnt := 0;                                                <<06533>>06276000
      maxcount := pvu'vs'max'user;                             <<06533>>06278000
      j := -1;                                                 <<06533>>06280000
      while (j := j + 1) < maxcount do                         <<06533>>06282000
         begin                                                 <<06533>>06284000
         pvue'index := j * pvu'ent'size +                      <<06533>>06286000
            pvu'vs'header;                                     <<06533>>06288000
         if pvu'ent'pin <> 0 then                              <<06533>>06290000
            begin                                              <<06533>>06292000
            cnt := cnt + 1;                                    <<06533>>06294000
            if  cnt <= retsize then                            <<06533>>06296000
               begin                                           <<06533>>06298000
               cnt1 := cnt1 + 1;                               <<06533>>06300000
               tos := pvu'ent'pin;                             <<06533>>06302000
               end;                                            <<06533>>06304000
            end;                                               <<06533>>06306000
         end;                                                  <<06533>>06308000
      end                                                      <<06533>>06310000
   else                                                        <<06533>>06312000
      @pvuent := @pvuent + pvu'vs'size;                        <<06533>>06314000
   end;                                                        <<06533>>06316000
if pvu'size = 0 then debug;                                    <<06533>>06318000
exchangedb (dst);   dst := -1;                                 <<06533>>06320000
                                                               <<06533>>06322000
<< return values in retinfo array                           >> <<06533>>06324000
                                                               <<06533>>06326000
retinfo := cnt;                                                <<06533>>06328000
while cnt1 > 0 do                                              <<06533>>06330000
   begin                                                       <<06533>>06332000
   retinfo (cnt1) := tos;                                      <<06533>>06334000
   cnt1 := cnt1 - 1;                                           <<06533>>06336000
   end;                                                        <<06533>>06338000
end  <<retvsetinfo>>;                                          <<06533>>06340000
                                                               <<06533>>06342000
<<**********************************************************>> <<06533>>06344000
<<                                                          >> <<06533>>06346000
<< extract user entry                                       >> <<06533>>06348000
<<                                                          >> <<06533>>06350000
<<**********************************************************>> <<06533>>06352000
                                                               <<06533>>06354000
subroutine checkuser;                                          <<06533>>06356000
                                                               <<*8832>>06358000
<< this subroutine determines if a user identified by pin is >><<*8832>>06360000
<< using a particular volume set.  if so, a cce is returned  >><<*8832>>06362000
<< along with the following information:                     >><<*8832>>06364000
<<                                                           >><<*8832>>06366000
<<   retinfo(0).(0:8) - volume member mask                   >><<*8832>>06368000
<<             .(8:8) - user session main pin                >><<*8832>>06370000
<<   retinfo(1)       - user bind count                      >><<*8832>>06372000
<<          (2)       - user mount count                     >><<*8832>>06374000
<<          (3)       - system bind count                    >><<*8832>>06376000
<<          (4)       - system mount count                   >><<*8832>>06378000
<<          (5)       - bind name count                      >><<*8832>>06380000
<<          (6)       - dst # of bind name segment           >><<*8832>>06382000
                                                               <<*8832>>06384000
begin                                                          <<06533>>06386000
pvue'index := -1;  <<assume pin not using volume set>>         <<06533>>06388000
cc := ccg;  <<assume user not using volume set>>               <<06533>>06390000
if mvtabx = 0 then return;                                     <<06533>>06392000
dst := exchangedb (pvu'dst);                                   <<06533>>06394000
                                                               <<06533>>06396000
if (pvmask land (1 & lsl (mvtabx))) <> 0 then                  <<06533>>06398000
                                                               <<06533>>06400000
   << volume set is mounted                                 >> <<06533>>06402000
                                                               <<06533>>06404000
   begin                                                       <<06533>>06406000
   if checkpin then  <<found pin - stack info>>                <<06533>>06408000
      begin                                                    <<06533>>06410000
      cc := cce;                                               <<06533>>06412000
      if pmap.(14:1) then                                      <<06533>>06414000
         if pvue'index > 0 then                                <<06533>>06416000
                                                               <<06533>>06418000
            << user entry found                             >> <<06533>>06420000
                                                               <<06533>>06422000
            begin                                              <<06533>>06424000
            tos := pvu'ent'vmask;                              <<06533>>06426000
            tos := pvu'ent'pin;                                <<06533>>06428000
            tos := pvu'ent'ubind'c;                            <<06533>>06430000
            tos := pvu'ent'umnt'c;                             <<06533>>06432000
            tos := pvu'ent'sbind'c;                            <<06533>>06434000
            tos := pvu'ent'smnt'c;                             <<06533>>06436000
            tos := pvu'ent'name'c;                             <<06533>>06438000
            tos := pvu'ent'name'd;                             <<06533>>06440000
            end                                                <<06533>>06442000
         else                                                  <<06533>>06444000
                                                               <<06533>>06446000
            << operator request                             >> <<06533>>06448000
                                                               <<06533>>06450000
            begin                                              <<06533>>06452000
            pvue'index := 0;                                   <<06533>>06454000
            tos := pvu'vs'opmask;                              <<06533>>06456000
            tos := pin;                                        <<06533>>06458000
            tos := 0;  <<op user binds>>                       <<06533>>06460000
            tos := 1;  <<op user mounts>>                      <<06533>>06462000
            tos := 0;  <<op system binds>>                     <<06533>>06464000
            tos := 0;  <<op system mounts>>                    <<06533>>06466000
            tos := 0;  << names count >>                       <<06533>>06468000
            tos := 0;  << names dst >>                         <<06533>>06470000
            end;                                               <<06533>>06472000
      end;                                                     <<06533>>06474000
   end                                                         <<06533>>06476000
else                                                           <<06533>>06478000
   if pvu'vs'mount=1 then                                      <<06533>>06480000
      cc := cce    << operator mount                        >> <<06533>>06482000
   else                                                        <<06533>>06484000
      cc := ccl;   << user table error                      >> <<06533>>06486000
                                                               <<06533>>06488000
if pvu'size = 0 then debug;                                    <<06533>>06490000
exchangedb (dst);   dst := -1;                                 <<06533>>06492000
if pmap. (14:1) and pvue'index >= 0 then  <<return info>>      <<06533>>06494000
   begin                                                       <<06533>>06496000
   retinfo (7) := tos;  << bind name dst                    >> <<06533>>06498000
   retinfo (6) := tos;  << bind name count                  >> <<06533>>06500000
   retinfo (5) := tos;  << system mount count               >> <<06533>>06502000
   retinfo (4) := tos;  << system bind count                >> <<06533>>06504000
   retinfo (3) := tos;  << user mount count                 >> <<06533>>06506000
   retinfo (2) := tos;  << user bind count                  >> <<06533>>06508000
   retinfo (1) := tos;  << user pcb pointer                 >> <<06533>>06510000
   retinfo := tos;      << volume mask                      >> <<06533>>06512000
   end;                                                        <<06533>>06514000
end <<checkuser>>;                                             <<06533>>06516000
                                                               <<06533>>06518000
<<**********************************************************>> <<06533>>06520000
<<                                                          >> <<06533>>06522000
<<                        main                              >> <<06533>>06524000
<<                                                          >> <<06533>>06526000
<<**********************************************************>> <<06533>>06528000
                                                               <<06533>>06530000
$if x0 = on                                                    <<06533>>06532000
   mmstat (-201,funct,mvtabx,deltap);                          <<06533>>06534000
$if                                                            <<06533>>06536000
cc := cce;   usertable := 0;                                   <<06533>>06538000
dst := -1; <<dst set to -1 if noexchg req to get back>>        <<06533>>06540000
pin := pcbpt;                                                  <<06533>>06542000
vmask := vmask'mvtabx. (0:8);                                  <<06533>>06544000
mvtabx := vmask'mvtabx. (8:8);                                 <<06533>>06546000
a := getsir (pvu'sir);                                         <<06533>>06548000
                                                               <<06533>>06550000
case * funct of                                                <<06533>>06552000
   begin                                                       <<06533>>06554000
                                                               <<06533>>06556000
   << funct = 0  -  create user entry                       >> <<06533>>06558000
                                                               <<06533>>06560000
   updatepvuser (addpin);                                      <<06533>>06562000
                                                               <<06533>>06564000
   << funct = 1  -  remove user entry                       >> <<06533>>06566000
                                                               <<06533>>06568000
   updatepvuser (delpin);                                      <<06533>>06570000
                                                               <<06533>>06572000
   << funct = 2  -  returns all mvtabx used by pcb          >> <<06533>>06574000
                                                               <<06533>>06576000
   retuserinfo;                                                <<06533>>06578000
                                                               <<06533>>06580000
   << funct = 3  -  returns all pcb pointers using mvtabx   >> <<06533>>06582000
                                                               <<06533>>06584000
   retvsetinfo;                                                <<06533>>06586000
                                                               <<06533>>06588000
   << funct = 4  -  extracts user entry                     >> <<06533>>06590000
                                                               <<06533>>06592000
   checkuser;                                                  <<06533>>06594000
   end;                                                        <<06533>>06596000
                                                               <<06533>>06598000
pexit (okexit);                                                <<06533>>06600000
end  << usertable >>;                                          <<06533>>06602000
                                                                        06604000
$page "PVSYS - PHYSICAL MOUNT UTILITIES"                                06606000
                                                                        06608000
$control segment = pvsysm                                               06610000
double procedure vtabindex(vid,vsid,ldn,gen);                           06612000
value ldn;                                                              06614000
byte array vid,vsid;                                                    06616000
integer ldn,gen;                                                        06618000
option variable;                                                        06620000
option privileged,uncallable;                                           06622000
                                                               <<*8832>>06624000
<<----------------------------------------------------------->><<*8832>>06626000
<<                                                           >><<*8832>>06628000
<< procedure vtabindex scans the volume table to determine if>><<*8832>>06630000
<< the named volume or specified logical device has an entry >><<*8832>>06632000
<< in the table.                                             >><<*8832>>06634000
<<                                                           >><<*8832>>06636000
<< parameters:  vid - volume name (8 bytes)                  >><<*8832>>06638000
<<              vsid- vsname.vsgroup.vsaccount (24 byte max) >><<*8832>>06640000
<<              ldn - logical device number                  >><<*8832>>06642000
<<              gen - generation number                      >><<*8832>>06644000
<<                                                           >><<*8832>>06646000
<< returns:     if volume not found, zero (double word)      >><<*8832>>06648000
<<              if volume found --                           >><<*8832>>06650000
<<                                                           >><<*8832>>06652000
<<           .........................                       >><<*8832>>06654000
<<           .           .           .                       >><<*8832>>06656000
<<       s-1 .   ldev    .   vtabx   .                       >><<*8832>>06658000
<<           .           .           .                       >><<*8832>>06660000
<<           .........................                       >><<*8832>>06662000
<<           .s.    .    .           .                       >><<*8832>>06664000
<<       s-0 .c.    . vol.   mvtabx  .                       >><<*8832>>06666000
<<           .r.    .indx.           .                       >><<*8832>>06668000
<<           .........................                       >><<*8832>>06670000
<<            0      4    8         15                       >><<*8832>>06672000
<<                                                           >><<*8832>>06674000
<< notes:       "SCR" indicates the volume is a scratch pack.>><<*8832>>06676000
<<                                                           >><<*8832>>06678000
<< callers:     pmounted                                     >><<*8832>>06680000
<<              cimgr (module 5c)                            >><<*8832>>06682000
<<              pvinit (module 32)                           >><<*8832>>06684000
<<                                                           >><<*8832>>06686000
<<----------------------------------------------------------->><<*8832>>06688000
                                                               <<*8832>>06690000
begin                                                          <<*8832>>06692000
     logical pmap = q-4;                                                06694000
     integer                                                            06696000
          vtabindexs1 = vtabindex,                                      06698000
          vtabindexs0 = vtabindex+1;                                    06700000
     integer ldev,index,entloc,entnum,entsize,nameloc,                  06702000
             vtabinfo,returnloc;                                        06704000
     logical a;                                                         06706000
     array vlab(0:127);                                                 06708000
     byte array vlabb(*) = vlab;                                        06710000
     byte array volid(0:23);                                            06712000
     integer pointer vtab;                                              06714000
     byte pointer vtabb;                                                06716000
                                                                        06718000
                                                               <<*8832>>06720000
<<...........................................................>><<*8832>>06722000
                                                               <<*8832>>06724000
     subroutine getvtab;                                                06726000
                                                               <<*8832>>06728000
     << this subroutine moves the entire volume table onto   >><<*8832>>06730000
     << the stack.                                           >><<*8832>>06732000
                                                               <<*8832>>06734000
     begin                                                              06736000
          returnloc:=tos;  <<subroutine return location>>               06738000
          tos:=@vtabinfo;                                               06740000
          tos:=vtabdst;                                                 06742000
          tos:=0;                                                       06744000
          tos:=1;                                                       06746000
          assemble(mfds 4);                                             06748000
          entnum:=vtabinfo.vtentnum;                                    06750000
          entsize:=vtabinfo.vtentsize;                                  06752000
          push(s);                                                      06754000
          @vtab:=tos+1;                                                 06756000
          @vtabb:=@vtab & lsl(1);                                       06758000
          tos:=((entnum+1)*entsize)+1;                                  06760000
          assemble(adds 0);                                             06762000
          tos:=@vtab;                                                   06764000
          tos:=vtabdst;                                                 06766000
          tos:=0;                                                       06768000
          tos:=(entnum+1)*entsize;                                      06770000
          assemble(mfds 4);                                             06772000
          tos:=returnloc;  <<assure valid subroutine return>>           06774000
     end <<getvtab>>;                                                   06776000
                                                                        06778000
                                                               <<*8832>>06780000
<<...........................................................>><<*8832>>06782000
                                                               <<*8832>>06784000
     << begin procedure vtabindex >>                           <<*8832>>06786000
                                                               <<*8832>>06788000
     cc:=cce;  <<assume no disc errors>>                                06790000
     ldn:=if (not pmap lor ldn=0) then -1 else ldn;                     06792000
     move volid:=vid,(8),2;                                             06794000
     move * :=vsid(8),(16);                                             06796000
     getvtab;                                                           06798000
     for index:=1 until entnum do                                       06800000
     begin                                                              06802000
          entloc:=index * entsize;                                      06804000
          nameloc:=(entloc) & lsl(1);                                   06806000
          ldev:=vtab(entloc+12).(0:8);                                  06808000
          if ldev = ldn or  <<ldev search>>                             06810000
          volid = vtabb(nameloc),(24) then                              06812000
          begin                                                         06814000
               discio(ldev,r,vlab,0d,128);                              06816000
               if <> then                                               06818000
               begin                                                    06820000
                    cc:=ccl;                                            06822000
                    return;                                             06824000
               end;                                                     06826000
               if ldev = ldn or  <<ldev search>>                        06828000
               vsid=vlabb(lvsnameloc),(8) then  <<found>>               06830000
               if gen < 0 or gen = integer(vlab(lgenindex)) then        06832000
               begin                                                    06834000
                    if gen < 0 then gen:=vlab(lgenindex);               06836000
                    vtabindexs1:=index cat ldev(0:8:8);                 06838000
                    vtabindexs0:=vtab(entloc+13) cat                    06840000
                                 vtab(entloc+12)(0:15:1);  <<scratch>>  06842000
                    index:=entnum;  <<stop loop>>                       06844000
               end;                                                     06846000
          end;                                                          06848000
     end;                                                               06850000
end << vtabindex >>;                                                    06852000
$page                                                          <<*8832>>06854000
$control segment = pvsysm                                               06856000
logical procedure pmounted(vsid,vsdefn,devlist,gen);                    06858000
array vsid;  <<fully qualified vs identifier>>                          06860000
array vsdefn,devlist;                                                   06862000
integer gen;  <<master volume mvtab and vtab indices>>                  06864000
option privileged,uncallable;                                           06866000
                                                               <<*8832>>06868000
<<----------------------------------------------------------->><<*8832>>06870000
<<                                                           >><<*8832>>06872000
<< procedure pmounted determines whether all the volumes re- >><<*8832>>06874000
<< quired to successfully mount a volume set or class are    >><<*8832>>06876000
<< physically present on the system and available for use.   >><<*8832>>06878000
<< for each member in the volume set (as found in the volume >><<*8832>>06880000
<< set definition entry), vtabindex is called to determine if>><<*8832>>06882000
<< the volume is present.  if the volume is in the volume    >><<*8832>>06884000
<< table and available, the devlist array will be updated    >><<*8832>>06886000
<< with the ldev number on which the volume resides.         >><<*8832>>06888000
<< (pmounted finishes up the job of initializing the devlist >><<*8832>>06890000
<< array, which mount had started.)                          >><<*8832>>06892000
<<                                                           >><<*8832>>06894000
<< parameters:  vsid - full volume set identifier            >><<*8832>>06896000
<<              vsdefn - full volume set definition entry    >><<*8832>>06898000
<<              devlist(1).(8:8) - drives needed             >><<*8832>>06900000
<<              gen - master volume mvtab and vtab indices   >><<*8832>>06902000
<<                                                           >><<*8832>>06904000
<< returns:     true - all volumes mounted.                  >><<*8832>>06906000
<<              false - otherwise.                           >><<*8832>>06908000
<<              devlist(1).(0:8) - drives obtained           >><<*8832>>06910000
<<              devlist(n).(8:8) - ldev# of obtained drive.  >><<*8832>>06912000
<<                                                           >><<*8832>>06914000
<< callers:     mount                                        >><<*8832>>06916000
<<                                                           >><<*8832>>06918000
<<----------------------------------------------------------->><<*8832>>06920000
                                                               <<*8832>>06922000
begin                                                                   06924000
     integer i:=1,cnt:=0,ldev,genx,nameloc;                             06926000
     logical a,b,c,mask;                                                06928000
     logical array ldt (0:size'of'ldt'entry - 1);              <<06275>>06930000
     byte array volid(0:23);                                            06932000
     byte array vsdefnb(*) = vsdefn;                                    06934000
     define                                                    <<06275>>06936000
        ldt'index = 0 #,                                       <<06275>>06938000
        lpdt'index = ldev * integer (lpdt'entry'size) #;       <<06275>>06940000
                                                               <<06275>>06942000
     subroutine def'move'from'dst;                             <<06275>>06944000
                                                               <<06275>>06946000
                                                                        06948000
     mask:=devlist.volmask;                                             06950000
     nameloc:=vdventsizeb;                                              06952000
     a:=getsir(vtabsir);                                                06954000
     while mask <> 0 do  <<check for volumes in vtab>>                  06956000
     begin                                                              06958000
          i:=i+1;  <<ordinal volume counter>>                           06960000
          if mask then  <<this ordinal volume should be checked>>       06962000
          if devlist(i).(0:1) then  <<drive still needed>>              06964000
          begin                                                         06966000
               genx:=gen;                                               06968000
               move volid:=vsdefnb(nameloc),(8);                        06970000
               tos:=vtabindex(volid,vsid,devlist(i).(8:8),genx);        06972000
               if ds1 <> 0d then  <<vtab entry exists - volume mounted>>06974000
                  begin                                        <<06275>>06976000
                  delete;  <<delete volx/mvtabx>>              <<06275>>06978000
                  ldev:=s0.(0:8);                              <<06275>>06980000
                  b := getsir (ldt'sir);                       <<06275>>06982000
                  c := getsir (lpdt'sir);                      <<06275>>06984000
                  move'from'dst (@ldt,ldt'dst,                 <<06275>>06986000
                  ldev*size'of'ldt'entry,size'of'ldt'entry);   <<06275>>06988000
                                                               <<06275>>06990000
                  if not (lpdt'reserved'pv lor                 <<06275>>06992000
                     lpdt'mounted'pv lor                       <<06275>>06994000
                     (lpdt'rdy'ser'frn'disc land               <<06275>>06996000
                     lpdt'serial'or'foreign = lpdt'serial))    <<06275>>06998000
                     and ldt'file'use'cnt = 0 and              <<06275>>07000000
                     ldt'avail'to'sys and                      <<06275>>07002000
                     lpdt'dev'own'state = lpdt'not'owned       <<06275>>07004000
                     then                                      <<06275>>07006000
                     begin                                     <<06275>>07008000
                     if i = 2 then  <<master volume>>          <<06275>>07010000
                        if gen < 0 then                        <<06275>>07012000
                           gen := genx;                        <<06275>>07014000
                                                               <<06275>>07016000
                     devlist(i):=(tos & lsl(8))+ldev;          <<06275>>07018000
                     end                                       <<06275>>07020000
                  else                                         <<06275>>07022000
                     delete;                                   <<06275>>07024000
                  relsir (lpdt'sir, c);                        <<06275>>07026000
                  relsir (ldt'sir, b);                         <<06275>>07028000
                  end                                          <<06275>>07030000
               else                                            <<06275>>07032000
               deletedbl;                                               07034000
          end;                                                          07036000
          mask:=mask & lsr(1);                                          07038000
          nameloc:=nameloc+vdventsizeb;                                 07040000
     end;                                                               07042000
     relsir(vtabsir,a);                                                 07044000
     for i:=2 until (maxvolnum+1) do                                    07046000
     if devlist(i).(8:8) <> 0 then cnt:=cnt+1;  <<drive assigned>>      07048000
     if cnt = integer(devlist(1).(8:8)) then  <<all volumes mounted>>   07050000
     begin                                                              07052000
          cc:=cce;                                                      07054000
          pmounted:=true;                                               07056000
     end;                                                               07058000
     devlist(1).(0:8):=cnt;                                             07060000
     cc:=if cnt = 0 then ccl else ccg;                                  07062000
end << pmounted >>;                                                     07064000
$page                                                          <<*8832>>07066000
$control segment = pvsysm                                               07068000
logical procedure available(sname,snamelen,devlist);                    07070000
value snamelen; integer snamelen;                                       07072000
byte array sname;                                                       07074000
array devlist;                                                          07076000
option privileged,uncallable;                                           07078000
                                                               <<*8832>>07080000
<<----------------------------------------------------------->><<*8832>>07082000
<<                                                           >><<*8832>>07084000
<< this procedure determines which available drives can be   >><<*8832>>07086000
<< used to contain members of a volume set which were not    >><<*8832>>07088000
<< all physically mounted when a mount of the volume set was >><<*8832>>07090000
<< requested.  it will scan all configured discs on the sys- >><<*8832>>07092000
<< tem for available drives of the appropriate subtype (as   >><<*8832>>07094000
<< determined from the volume set definition entry and the   >><<*8832>>07096000
<< devlist array).  the procedure will reserve (through the  >><<*8832>>07098000
<< resv bit in the lpdt) each drive that will be used to     >><<*8832>>07100000
<< satisfy the request.  if enough drives cannot be found,   >><<*8832>>07102000
<< the operator will be notified that free drives are still  >><<*8832>>07104000
<< required.  after the operator has replied, available re-  >><<*8832>>07106000
<< turns to mount without determining whether drives are then>><<*8832>>07108000
<< available.  it is left up to mount to repeat the pmounted->><<*8832>>07110000
<< available loop if necessary.  mount will reset the resv   >><<*8832>>07112000
<< field of the lpdt at the appropriate time.                >><<*8832>>07114000
<<                                                           >><<*8832>>07116000
<< parameters:  sname   - volume set name                    >><<*8832>>07118000
<<              snamelen- length of name                     >><<*8832>>07120000
<<              devlist - list of logical device numbers,    >><<*8832>>07122000
<<                        along with:                        >><<*8832>>07124000
<<                        devlist(1).(0:8) - drives obtained >><<*8832>>07126000
<<                        devlist(1).(8:8) - drives needed   >><<*8832>>07128000
<<                                                           >><<*8832>>07130000
<< returns:     true - enough drives available.              >><<*8832>>07132000
<<              false - otherwise.                           >><<*8832>>07134000
<<              devlist(1).(0:8) - drives obtained           >><<*8832>>07136000
<<              devlist(n).(8:8) - ldev# of obtained drive.  >><<*8832>>07138000
<<                                                           >><<*8832>>07140000
<< callers:     mount                                        >><<*8832>>07142000
<<                                                           >><<*8832>>07144000
<<----------------------------------------------------------->><<*8832>>07146000
                                                               <<*8832>>07148000
begin                                                                   07150000
     integer i,dev,dst,len,loc,ldev,entnum,entsize,leftoff;             07152000
     logical a,b,mask,vmask,reply;                                      07154000
     logical                                                   <<00244>>07156000
         count,                                                <<00244>>07158000
         subtype,                                              <<00244>>07160000
         mmask,                                                <<00244>>07162000
         tmask;                                                <<00244>>07164000
     logical array ldt (0:size'of'ldt'entry - 1);              <<06275>>07166000
     logical array                                             <<00244>>07168000
         devlistq (0:devlistsize) = q,                         <<00244>>07170000
         devs (*) = devlistq (2);                              <<00244>>07172000
     byte array msg(0:72);                                              07174000
                                                               <<00244>>07176000
     equate                                                    <<00244>>07178000
         disctypesl = 61;                                      <<*8836>>07180000
                                                               <<00244>>07182000
    comment:                                                   <<00244>>07184000
                                                               <<00244>>07186000
    psuedo subtypes for the different types of discs           <<00244>>07188000
    defined below are developed as follows:                    <<00244>>07190000
                                                               <<00244>>07192000
    [psuedo subtype] = ([actual type] * 16) + [actual subtype] <<00244>>07194000
                                                               <<00244>>07196000
    ;                                                          <<00244>>07198000
                                                               <<00244>>07200000
     byte array disctypesx (0:disctypesl-1) = pb :=            <<00244>>07202000
         6, 4,  "7905",                                        <<00244>>07204000
         6, 8,  "7920",                                        <<00244>>07206000
         6, 9,  "7925",                                        <<00244>>07208000
         6, 10, "7906",                                        <<00244>>07210000
         6, 32, "7902",                                        <<00244>>07212000
         6, 49, "7911",                                        <<06060>>07214000
         6, 50, "7912",                                        <<06060>>07216000
         6, 52, "7914",                                        <<06060>>07218000
         6, 53, "7945",                                        <<*8836>>07220000
         6, 56, "7933",                                        <<04278>>07222000
         0;                                                    <<00244>>07224000
     byte array disctypes (0:disctypesl-1);                    <<00244>>07226000
     byte pointer                                              <<00244>>07228000
         bps0 = s-0,                                           <<00244>>07230000
         defn,                                                 <<00244>>07232000
         msgend;                                               <<00244>>07234000
     define                                                             07236000
          ldt'index   = 0 #,                                   <<06275>>07238000
          lpdt'index  = ldev * integer (lpdt'entry'size) #,    <<06275>>07240000
          same'type    = ldt'device'type =                     <<06275>>07242000
                         (devlistq (dev).(1:7)) / 16 #,        <<00244>>07244000
          owned        = ( lpdt'dev'own'state <>               <<06275>>07246000
                           lpdt'owned )#,                      <<06275>>07248000
          usecount     = ldt'file'use'cnt #,                   <<06275>>07250000
          same'subtype = lpdt'subtype =                        <<06275>>07252000
                         devlistq (dev).(1:7) mod 16 #,        <<00244>>07254000
          mounted      = lpdt'mounted'pv #,                    <<06275>>07256000
          reserved     = lpdt'reserved'pv #,                   <<06275>>07258000
          availtosys   = ldt'avail'to'sys #,                   <<06275>>07260000
          nonsysdomain = lpdt'non'sys'domain #;                <<06275>>07262000
     define                                                             07264000
          drives'needed   = devlist(1).(8:8)#,                          07266000
          drives'obtained = devlistq(1).(0:8)#;                         07268000
                                                                        07270000
     integer subroutine finddisctype (bsubtype);               <<00244>>07272000
         value   bsubtype;                                     <<00244>>07274000
         byte    bsubtype;                                     <<00244>>07276000
         begin                                                 <<00244>>07278000
             i := 0;                                           <<00244>>07280000
             while disctypes (i) <> 0 do                       <<00244>>07282000
             begin                                             <<00244>>07284000
                 if bsubtype = disctypes (i+1), (1)  then      <<00244>>07286000
                 begin                                         <<00244>>07288000
                     finddisctype := i+2;                      <<00244>>07290000
                     i := disctypesl - 1;      << end of list ><<03511>>07292000
                 end else i := i + integer (disctypes (i));    <<00244>>07294000
             end;                                              <<00244>>07296000
         end <<of finddisctype>>;                              <<00244>>07298000
                                                               <<06275>>07300000
         subroutine def'move'from'dst;                         <<06275>>07302000
                                                               <<00244>>07304000
     vmask:=devlist;                                                    07306000
     move devlistq:=devlist,(devlistsize);  <<init q-rel array>>        07308000
     if drives'needed <> drives'obtained then  <<look for some drives>> 07310000
     begin                                                              07312000
          dev:=1;                                                       07314000
          leftoff:=2;  <<ldev pointer>>                                 07316000
          mask:=vmask;                                                  07318000
          entnum := lpdt'max'entries;                          <<06275>>07320000
          a := getsir (ldt'sir);                               <<06275>>07322000
          b := getsir (lpdt'sir);                              <<06275>>07324000
          while mask <> 0 do                                            07326000
          begin                                                         07328000
               dev:=dev+1;                                              07330000
               if mask and devlistq(dev).(8:8) = 0 then  <<get drive>>  07332000
               begin                                                    07334000
                    ldev:=leftoff-1;                                    07336000
                    while (ldev:=ldev+1) < entnum do                    07338000
                    begin                                               07340000
                         move'from'dst (@ldt, ldt'dst,         <<06275>>07342000
                            ldev * size'of'ldt'entry,          <<06275>>07344000
                            size'of'ldt'entry);                <<06275>>07346000
                         if same'type and                      <<06275>>07348000
                            same'subtype and                   <<06275>>07350000
                            nonsysdomain and                   <<06275>>07352000
                            not (reserved lor mounted) and     <<06275>>07354000
                            usecount = 0 and availtosys and    <<06275>>07356000
                            not owned then                     <<06275>>07358000
                         begin                                          07360000
                              leftoff:=ldev+1;  <<point to next dev>>   07362000
                              disable;                         <<06275>>07364000
                              lpdt'reserved'pv := true;        <<06275>>07366000
                              enable;                          <<06275>>07368000
                              devlistq(1).(0:8):=devlistq(1).(0:8)+1;   07370000
                              devlistq(dev).(8:8):=ldev;                07372000
                              ldev:=entnum;  <<stop loop>>              07374000
                         end;                                           07376000
                    end;                                                07378000
               end;                                                     07380000
               mask:=mask & lsr(1);                                     07382000
          end;                                                          07384000
          relsir (lpdt'sir, b);                                <<06275>>07386000
          relsir (ldt'sir, a);                                 <<06275>>07388000
          if drives'needed <> drives'obtained then  <<more needed>>     07390000
          begin                                                         07392000
               move disctypes := disctypesx, (disctypesl);     <<00244>>07394000
               move msg:="DRIVES FOR ",2;                               07396000
               i:=0;                                                    07398000
               move * :=sname,(snamelen),2;                             07400000
               move * :=": ",2;                                         07402000
               dev:=0;                                         <<00244>>07404000
               mask:=devlist;                                           07406000
               @msgend := tos; <<save where message ended>>    <<00244>>07408000
               while mask <> 0 do                                       07410000
               begin                                                    07412000
                   if mask and devs (dev).(8:8) = 0 then       <<00244>>07414000
                   begin                                       <<00244>>07416000
                       count := 1;                             <<00244>>07418000
                       leftoff := dev;                         <<00244>>07420000
                       subtype := devs (dev).(1:7);            <<00244>>07422000
                       tmask := (1 & lsl (dev));               <<00244>>07424000
                       mmask := mask;                          <<00244>>07426000
                       while (mmask := mmask & lsr (1)) <> 0 do<<00244>>07428000
                       begin <<find and count others if same>> <<00244>>07430000
                           dev := dev+1;                       <<00244>>07432000
                           if devs (dev).(1:7) = subtype then  <<00244>>07434000
                           begin                               <<00244>>07436000
                               count := count+1;               <<00244>>07438000
                               tmask:=tmask lor (1&lsl(dev));  <<00244>>07440000
                           end;                                <<00244>>07442000
                       end;                                    <<00244>>07444000
                       defn := finddisctype (byte (subtype));  <<00244>>07446000
                       tos := @msgend;                         <<00244>>07448000
                       move * := disctypes (defn), (4),2;      <<00244>>07450000
                       move * := " (",2;                       <<00244>>07452000
                       ascii (count,10,bps0);                  <<00244>>07454000
                       @bps0 := @bps0+1;                       <<00244>>07456000
                       move * := "),",2;                       <<00244>>07458000
                       @msgend := tos;                         <<00244>>07460000
                       dev := leftoff;                         <<00244>>07462000
                       mask := mask xor (tmask & lsr (dev));   <<00244>>07464000
                   end;                                        <<00244>>07466000
                   dev := dev+1;                               <<00244>>07468000
                   mask := mask & lsr (1);                     <<00244>>07470000
               end;                                                     07472000
               tos := @msgend -1;  <<eliminate trailing comma>><<00244>>07474000
               move *:=" (Y/N)?",2;                                     07476000
               len:=tos-@msg;                                           07478000
               msg(len):=0;  <<genmsg stop>>                            07480000
               genmsg(-1,@msg,,,,,,,0,%1,@reply);                       07482000
               if not reply then  <<operator rejected>>                 07484000
               begin                                                    07486000
                    return;                                             07488000
               end;                                                     07490000
          end;                                                          07492000
     end;                                                               07494000
     move devlist:=devlistq,(devlistsize);                              07496000
     available:=true;                                                   07498000
end << available >>;                                                    07500000
                                                                        07502000
$page "PVSYS - MOUNT PROCEDURE"                                         07504000
                                                                        07506000
$control segment = pvsysm                                               07508000
procedure mount (vsname,vsgroup,vsaccnt,reqtype,               <<00211>>07510000
                 gen,pvinfo,different'pin);                    <<00211>>07512000
value gen,different'pin;                                       <<00211>>07514000
integer reqtype,gen,pvinfo,different'pin;                      <<00211>>07516000
byte array vsname,vsgroup,vsaccnt;                                      07518000
option variable;                                                        07520000
option privileged,uncallable;                                           07522000
                                                               <<*8832>>07524000
<<----------------------------------------------------------->><<*8832>>07526000
<<                                                           >><<*8832>>07528000
<< mount processes a volume set mount request.  the result of>><<*8832>>07530000
<< a successful call to mount is the presence of an mvtab en->><<*8832>>07532000
<< try reflecting the mounted status of the set.  mount may  >><<*8832>>07534000
<< also cause the directories of the mounted volume set and  >><<*8832>>07536000
<< the system to be bound together if the set was to be      >><<*8832>>07538000
<< treated as the home volume set for a particular group.    >><<*8832>>07540000
<<                                                           >><<*8832>>07542000
<< parameters: vsname - volume set name                      >><<*8832>>07544000
<<             vsgroup- volume set group                     >><<*8832>>07546000
<<             vsaccnt- volume set account                   >><<*8832>>07548000
<<             reqtype - request type:                       >><<*8832>>07550000
<<    (sysreq3)  -3 : system mount (conditional) - binding   >><<*8832>>07552000
<<    (sysreq4)  -2 : system mount - no binding              >><<*8832>>07554000
<<               -1 : unused                                 >><<*8832>>07556000
<<    (userreq1)  0 : user mount - binding                   >><<*8832>>07558000
<<    (userreq2)  1 : user mount - no binding                >><<*8832>>07560000
<<    (sysreq1)   2 : system mount - binding                 >><<*8832>>07562000
<<    (sysreq2)   3 : system mount - no binding              >><<*8832>>07564000
<<    (opreq)     4 : operator mount - no binding            >><<*8832>>07566000
<<             gen - generation number of volume set         >><<*8832>>07568000
<<             different'pin - pin, if for process other than>><<*8832>>07570000
<<                             current process               >><<*8832>>07572000
<<                                                           >><<*8832>>07574000
<< returns:    cce - successful                              >><<*8832>>07576000
<<             ccg - duplicate mount                         >><<*8832>>07578000
<<             ccl - other errors                            >><<*8832>>07580000
<<             pvinfo -                                      >><<*8832>>07582000
<<               .(0:8) - volume mask                        >><<*8832>>07584000
<<               .(8:8) - mvtab index                        >><<*8832>>07586000
<<               the volume mask indicates which members of a>><<*8832>>07588000
<<               set were mounted as a result of the call to >><<*8832>>07590000
<<               mount.  pvinfo can be passed to dismount in >><<*8832>>07592000
<<               lieu of a volume set name to have a set dis->><<*8832>>07594000
<<               mounted.  pvinfo is used mainly by system   >><<*8832>>07596000
<<               callers of mount when implicit mounts are   >><<*8832>>07598000
<<               being performed.                            >><<*8832>>07600000
<<                                                           >><<*8832>>07602000
<< callers:    cimain (module 5b)                            >><<*8832>>07604000
<<             cimgr (module 5c)                             >><<*8832>>07606000
<<             fileacc (module 50)                           >><<*8832>>07608000
<<             loader1 (module 72)                           >><<*8832>>07610000
<<             morgue (module 64)                            >><<*8832>>07612000
<<             opcommand (module 85)                         >><<*8832>>07614000
<<             store/restore (module 6)                      >><<*8832>>07616000
<<             listdir5.pub.sys                              >><<*8832>>07618000
<<                                                           >><<*8832>>07620000
<< notes:      db must be at stack upon entry to mount.      >><<*8832>>07622000
<<             arrays are explicitly declared                >><<*8832>>07624000
<<             the process cannot have the directory sir     >><<*8832>>07626000
<<             locked upon entry to mount (potential for     >><<*8832>>07628000
<<             deadlock).                                    >><<*8832>>07630000
<<             order of sir acquisition is as follows:       >><<*8832>>07632000
<<               directory => mvtab => ldt                   >><<*8832>>07634000
<<                                                           >><<*8832>>07636000
<<----------------------------------------------------------->><<*8832>>07638000
                                                               <<*8832>>07640000
begin                                                          <<*8832>>07642000
                                                               <<*8864>>07644000
     logical pmap = q-4;   << optional parameters map >>       <<*8864>>07646000
     integer genx:=-1;  <<assume gen index to be ignored>>              07648000
     integer i,n,pin,dev,dst,len,loc,type,msglen,entsize,               07650000
             usecount,vtabindex,mvtabindex,uret,gipntr,        <<*8864>>07652000
             setnamelen,useracctlen,entnum,olddst,dsir;                 07654000
     logical a,b,vsdef,reply,vmount,dupname,                            07656000
             pmountreqd;                                                07658000
     logical msir:=3,bind:=false,mounted:=false,                        07660000
             bindjit:=false,alreadymounted:=false;                      07662000
     logical resources := false;                                        07664000
                                                               <<*8864>>07666000
     << pvuser table & bind names segment >>                   <<*8864>>07668000
                                                               <<*8864>>07670000
     double nameinfo;                                          <<*8864>>07672000
     integer namecount = nameinfo,                             <<*8864>>07674000
             namedst   = namecount+1;                          <<*8864>>07676000
     integer array nameseg (*) = db+0;                         <<*8864>>07678000
     define                                                    <<*8864>>07680000
        maxnamesegln   = nameseg(0)#,                          <<*8864>>07682000
        currnamesegln  = nameseg(1)#;                          <<*8864>>07684000
     equate                                                    <<*8864>>07686000
        namentsize        =    9, << name entry size (words) >><<*8864>>07688000
        maxnamesegln'init = 4096, << max name segment length >><<*8864>>07690000
        namesegln'init    =  128, << initial nameseg length >> <<*8864>>07692000
        namesegln'incr    =  128; << expansion increment >>    <<*8864>>07694000
                                                               <<*8864>>07696000
                                                               <<*8864>>07698000
     integer array nameq (0:7) = q;                            <<*8864>>07700000
     byte array nameqb(*) = nameq;                             <<*8864>>07702000
     array retinfo (0 : pvu'ent'size - 1) = q;                 <<*8864>>07704000
     double retinfod = retinfo;                                <<*8864>>07706000
     integer array pvuent (*) = retinfo;                       <<*8864>>07708000
     define                                                    <<*8864>>07710000
        pvue'index = 0#;                                       <<*8864>>07712000
                                                               <<*8864>>07714000
     define                                                             07716000
         havedsir              = resources.(15:1) #,                    07718000
         havemsir              = resources.(14:1) #,                    07720000
         havemvtabntry         = resources.(13:1) #,                    07722000
         mvtableupdated        = resources.(12:1) #,                    07724000
         usertableupdate       = resources.(11:1) #,                    07726000
         logicalmount          = resources.(10:1) #;                    07728000
     logical attributes := false;                                       07730000
     define                                                             07732000
         firstuserofset        = attributes.(15:1) #,                   07734000
         newuserofset          = attributes.(14:1) #,                   07736000
         olduserofset          = attributes.(13:1) #;                   07738000
     logical firstimetogs:=true;                                        07740000
     define                                                             07742000
          firstimethru    = firstimetogs.(15:1)#,                       07744000
          firstaccessmsg  = firstimetogs.(14:1)#;                       07746000
                                                                        07748000
     << various masks >>                                       <<*8864>>07750000
                                                               <<*8864>>07752000
     logical umask:=0;        << request types >>              <<*8864>>07754000
     define                                                             07756000
          userreq  = umask.(12:1)#,                                     07758000
          userbind   = umask.(13:1)#,                                   07760000
          sysreq   = umask.(14:1)#,                                     07762000
          sysbind    = umask.(15:1)#;                                   07764000
     logical array umask'(-3:4);                                        07766000
     logical array umask'pb(*)=pb:=                                     07768000
          %03,  <<system mount (conditional) - binding       >>         07770000
          %02,  <<system mount - no binding                  >>         07772000
          %00,  <<unused>>                                              07774000
          %14,  <<user mount - binding       >>                         07776000
          %10,  <<user mount - no binding    >>                         07778000
          %03,  <<system mount - binding     >>                         07780000
          %02,  <<system mount - no binding  >>                         07782000
          %00;  <<operator mount - no binding>>                         07784000
                                                                        07786000
     logical cmask:=0,                                         <<*8864>>07788000
             tmask:=0, << bit map of volumes already mounted >><<*8864>>07790000
             vmask:=0, << bit map of volumes requiring mount >><<*8864>>07792000
             mmask:=0;                                         <<*8864>>07794000
     array                                                              07796000
          vlab(0:127),                                                  07798000
          ldt (*) = vlab,                                      <<06275>>07800000
          vtabent(*) = vlab,                                            07802000
          vsdefn(0:vdsentsize),                                         07804000
          devlist(0:devlistsize),                                       07806000
          mvtabent(0:mvtabentsize);                                     07808000
     array dirparms(*) = vlab;                                          07810000
     array dirent(*) = vlab;                                            07812000
     byte array direntb(*) = vlab;                                      07814000
     array                                                              07816000
         origvsid (0:11);                                               07818000
     array vsid(0:11);                                                  07820000
     byte array vsidb(*) = vsid;                                        07822000
     array uganame(0:11);  <<user/group/account name>>                  07824000
     byte array uganameb(*) = uganame;                                  07826000
     byte array msg(0:72);                                              07828000
     byte array setname(0:27);                                          07830000
     byte array useracct(0:17);  <<user/account names>>                 07832000
     double array mvtabentd(*) = mvtabent(5);                           07834000
     array                                                              07836000
         vsnamew (*),                                                   07838000
         vsgroupw (*),                                                  07840000
         vsaccntw (*);                                                  07842000
                                                                        07844000
     define                                                             07846000
          drives'needed   = devlist(1).(8:8)#,                          07848000
          drives'obtained = devlist(1).(0:8)#;                          07850000
                                                               <<06275>>07852000
     define                                                    <<06275>>07854000
          ldt'index = 0 #,                                     <<06275>>07856000
          lpdt'index = dev * integer (lpdt'entry'size) #;      <<06275>>07858000
                                                               <<06275>>07860000
                                                               <<06275>>07862000
                                                                        07864000
     double rstatus;                                           <<06136>>07866000
     integer rstatus1=rstatus;                                 <<06136>>07868000
     integer rstatus2=rstatus1+1;                              <<06136>>07870000
                                                               <<06136>>07872000
     subroutine def'move'from'dst;                             <<06275>>07874000
<<...........................................................>><<*8832>>07876000
                                                               <<06275>>07878000
     integer subroutine allocmvtabx;                                    07880000
                                                               <<*8832>>07882000
     << allocmvtabx searches the mounted volume table for an >><<*8832>>07884000
     << an unused mvtab entry.  if found, it sets the entry  >><<*8832>>07886000
     << as used.  the number of mounted volume sets is in-   >><<*8832>>07888000
     << cremented by 1.                                      >><<*8832>>07890000
                                                               <<*8832>>07892000
         begin                                                          07894000
             olddst := exchangedb (mvtabdst);                           07896000
             entsize := mvtab.(0:8);                                    07898000
             entnum := mvtab.(8:8);                                     07900000
             i := 0;                                                    07902000
             while (i:=i+1) <= entnum do                                07904000
              if not mvtab (i*entsize).inuse then                       07906000
              begin                                                     07908000
                  mvtab (x).inuse := true;                              07910000
                  mvtab (x) := mvtab (mountcnt) + 1;                    07912000
                  allocmvtabx := i;                                     07914000
                  i := entnum;  <<stop loop>>                           07916000
              end;                                                      07918000
             exchangedb (olddst);                                       07920000
         end;<<of allocmvtabx>>                                         07922000
                                                                        07924000
<<...........................................................>><<*8832>>07926000
                                                               <<*8832>>07928000
     logical subroutine deallocmvtabx (mvtabx');                        07930000
         value mvtabx';  integer mvtabx';                               07932000
                                                               <<*8832>>07934000
     << deallocmvtabx deallocates a mvtab entry whose index  >><<*8832>>07936000
     << is given by mvtabx'.  if the entry is not marked in  >><<*8832>>07938000
     << use, sf 419 occurs.  otherwise, the entry is set     >><<*8832>>07940000
     << free and the number of mounted volume sets is decre- >><<*8832>>07942000
     << mented.                                              >><<*8832>>07944000
                                                               <<*8832>>07946000
         begin                                                          07948000
             olddst := exchangedb (mvtabdst);                           07950000
             entsize := mvtab.(0:8);                                    07952000
             entnum := mvtab.(8:8);                                     07954000
             if not mvtab (mvtabx'*entsize).inuse then                  07956000
              suddendeath (419);                                        07958000
             mvtab (x) := 0;                                            07960000
             mvtab (x) := mvtab (mountcnt) - 1;                         07962000
             exchangedb (olddst);                                       07964000
         end;<<of deallocmvtabx>>                                       07966000
                                                               <<*8864>>07968000
<<...........................................................>><<*8864>>07970000
                                                               <<*8864>>07972000
     subroutine get'dir'n'mvtab'sirs;                          <<*8864>>07974000
                                                               <<*8864>>07976000
     << this subroutine obtains the directory and mounted    >><<*8864>>07978000
     << volume table sirs, setting the appropriate flags in  >><<*8864>>07980000
     << resources.                                           >><<*8864>>07982000
                                                               <<*8864>>07984000
     begin                                                     <<*8864>>07986000
        dsir := getsir (dirsir);                               <<*8864>>07988000
        havedsir := true;                                      <<*8864>>07990000
        msir:=getsir(mvtabsir);                                <<*8864>>07992000
        havemsir := true;                                      <<*8864>>07994000
     end;                                                      <<*8864>>07996000
                                                               <<*8864>>07998000
<<...........................................................>><<*8864>>08000000
                                                               <<*8864>>08002000
     subroutine rel'mvtab'n'dir'sirs;                          <<*8864>>08004000
                                                               <<*8864>>08006000
     << this subroutine releases the mounted volume table    >><<*8864>>08008000
     << and directory sirs, setting the appropriate flags in >><<*8864>>08010000
     << resources.                                           >><<*8864>>08012000
                                                               <<*8864>>08014000
     begin                                                     <<*8864>>08016000
        relsir (mvtabsir,msir);                                <<*8864>>08018000
        havemsir := false;                                     <<*8864>>08020000
        relsir (dirsir,dsir);                                  <<*8864>>08022000
        havedsir := false;                                     <<*8864>>08024000
     end;                                                      <<*8864>>08026000
                                                                        08028000
<<...........................................................>><<*8832>>08030000
                                                               <<*8832>>08032000
     subroutine movename;                                               08034000
                                                               <<*8832>>08036000
     << movename moves a name from q-relative nameq to       >><<*8832>>08038000
     << nameseg in the bind names data segment.              >><<*8832>>08040000
                                                               <<*8832>>08042000
     begin                                                              08044000
          n:=-1;                                                        08046000
          while (n:=n+1) < 8 do                                         08048000
          nameseg(loc+n+1):=nameq(n);                                   08050000
     end <<movename>>;                                                  08052000
                                                                        08054000
<<...........................................................>><<*8832>>08056000
                                                               <<*8832>>08058000
     logical subroutine compname;                                       08060000
                                                               <<*8832>>08062000
     << compname tries to match a name in q-relative nameq   >><<*8832>>08064000
     << to nameseg in the bind names dst.  it returns true   >><<*8832>>08066000
     << if the names matched.                                >><<*8832>>08068000
                                                               <<*8832>>08070000
     begin                                                              08072000
          n:=-1;                                                        08074000
          compname:=true;                                               08076000
          while (n:=n+1) < 8 do                                         08078000
          if nameseg(loc+n+1) <> nameq(n) then                          08080000
          begin                                                         08082000
               compname:=false;                                         08084000
               n:=8;  <<stop loop>>                                     08086000
          end;                                                          08088000
     end <<compname>>;                                                  08090000
                                                                        08092000
<<...........................................................>><<*8832>>08094000
                                                               <<*8832>>08096000
     subroutine delname;                                                08098000
                                                               <<*8832>>08100000
     << delname looks for an entry to delete (named by group.>><<*8832>>08102000
     << account) in the bind names data segment.  if the     >><<*8832>>08104000
     << name is found, it deletes that entry and compacts the>><<*8832>>08106000
     << name segment if needed.  the bind names count in the >><<*8832>>08108000
     << pvuser table is decremented.  if it is then 0, the   >><<*8832>>08110000
     << bind names dst is freed.                             >><<*8832>>08112000
                                                               <<*8832>>08114000
     begin                                                              08116000
          i := 0;                                                       08118000
          dupname:=false;                                               08120000
          retinfo:=umask;                                               08122000
          retinfo (1) := namecount;  retinfo (2) := namedst;   <<*8864>>08124000
          if not bind or namecount = 0 then return;                     08126000
          move nameqb:=vsgroup,(8),2;                                   08128000
          move   *  :=vsaccnt,(8);                                      08130000
          dst:=exchangedb(namedst);                                     08132000
          while (i:=i+1) <= integer (namecount) do                      08134000
          begin                                                         08136000
               loc:= i * namentsize;                                    08138000
               if compname then                                         08140000
               begin                                                    08142000
                    dupname:=true;                                      08144000
                    i:=namecount+1;  <<stop loop>>                      08146000
               end;                                                     08148000
          end;                                                          08150000
          if dupname then                                               08152000
          begin                                                         08154000
               if (nameseg(loc):=nameseg(loc)-1) = 0 then               08156000
               begin                                                    08158000
                    if (namecount+1) > 0 then  <<more names>>           08160000
                    begin                                               08162000
                         <<compact name segment>>                       08164000
                         move nameseg(loc):=nameseg(loc+namentsize),    08166000
                              ((namecount*namentsize)-loc);             08168000
                         loc:=namecount*namentsize;                     08170000
                         nameseg(loc):=0;                               08172000
                         move  <<zero old area>>                        08174000
                         nameseg(loc+1):=nameseg(loc),                  08176000
                                         (namentsize-1);                08178000
                    end;                                                08180000
                    namecount:=namecount-1;                             08182000
               end;                                                     08184000
          end;                                                          08186000
          exchangedb(dst);                                              08188000
          if namecount = 0 then                                         08190000
          begin                                                         08192000
               reldataseg(namedst);                                     08194000
               nameinfo := 0d;  <<null names>>                          08196000
          end;                                                          08198000
          retinfo (1) := namecount;  retinfo (2) := namedst;   <<*8864>>08200000
     end <<delname>>;                                                   08202000
                                                               <<*8832>>08204000
<<...........................................................>><<*8832>>08206000
                                                               <<*8832>>08208000
     subroutine resetlpdt;                                              08210000
     begin                                                              08212000
          i:=1;  <<loop variable through devlist>>                      08214000
          while (i:=i+1) <= (devlistsize-1) do                          08216000
          if (dev:=devlist(i).(8:8)) <> 0 then                          08218000
          begin                                                         08220000
             disable;                                          <<06275>>08222000
             lpdt'reserved'pv := false;                        <<06275>>08224000
             if (cmask land (1 & lsl(i-2))) <> 0 then          <<06275>>08226000
                lpdt'mounted'pv := true;                       <<06275>>08228000
             enable;                                           <<06275>>08230000
          end;                                                          08232000
     end <<resetlpdt>>;                                                 08234000
                                                                        08236000
<<...........................................................>><<*8832>>08238000
                                                               <<*8832>>08240000
     subroutine exit'(exitype);                                         08242000
     value exitype; integer exitype;                                    08244000
                                                               <<*8832>>08246000
     << this subroutine is the sole exit point from mount.   >><<*8832>>08248000
     << all resources (e.g., table entries, sirs) acquired   >><<*8832>>08250000
     << during course of processing still outstanding will be>><<*8832>>08252000
     << released here before exiting the procedure.  if the  >><<*8832>>08254000
     << mount was successful (exitype=okexit) then a message >><<*8832>>08256000
     << will be sent to the operator if vmount.allf is true, >><<*8832>>08258000
     << and a volume set mount log entry will be entered.    >><<*8832>>08260000
                                                               <<*8832>>08262000
     begin                                                              08264000
          if exitype <> okexit then                                     08266000
          begin                                                         08268000
              cmask := 0; <<for resetlpdt>>                             08270000
              if not havemsir then msir := getsir (mvtabsir);           08272000
              if havemvtabntry then deallocmvtabx (mvtabindex);         08274000
              if mvtableupdated then mvtable (remove,mvtabindex,        08276000
                                              devlist,vmask);           08278000
              if usertableupdate then                                   08280000
          begin  << remove user entry from pvuser table >>     <<*8864>>08282000
                  delname;                                              08284000
                  retinfo (1) := namecount;                    <<*8864>>08286000
                  retinfo (2) := namedst;                      <<*8864>>08288000
                  if reqtype<>opreq then                       <<01197>>08290000
                     usertable(deluser,pin,mvtabindex,retinfo);<<*8864>>08292000
              end;                                                      08294000
              relsir (mvtabsir,msir);                                   08296000
              if havedsir then relsir (dirsir,dsir);                    08298000
              if logicalmount then                                      08300000
              begin                                                     08302000
                  dirparms (0) := 0;; <<deallocate>>                    08304000
                  dirparms (1) := 0;                                    08306000
                  dirparms (2) := -1;                                   08308000
                  dirparms (3) := false;  <<always reset flag>>         08310000
                  direcscan (%40,0d,vsid (8),vsid (4),vsid,             08312000
                             pvrecip,dirparms);                         08314000
              end;                                                      08316000
              havemsir := false;                                        08318000
              havedsir := false;                                        08320000
              havemvtabntry := false;                                   08322000
              mvtableupdated := false;                                  08324000
              usertableupdate := false;                                 08326000
          end;                                                          08328000
          if havemsir then relsir (mvtabsir,msir);                      08330000
          if havedsir then relsir (dirsir,dsir);                        08332000
          if drives'obtained <> 0 then resetlpdt;  <<reset resf>>       08334000
          cc:=if exitype = okexit then cce else                         08336000
              if exitype = dupmount then ccg else ccl;                  08338000
          if exitype = okexit then  <<set actually mounted>>            08340000
          begin                                                         08342000
               <<notify operator of mount if necessary>>                08344000
               if vmount.autof then  <<no reply required>>              08346000
               if vmount.allf then   <<let operator know>>              08348000
               if reqtype <> opreq and reqtype <> sysreq2 and           08350000
                  reqtype <> sysreq3 then                               08352000
               if not alreadymounted then  <<first time this user>>     08354000
               begin                                                    08356000
                    move msg:=setname,(setnamelen),2;                   08358000
                    move * :="IN USE BY ",2;                            08360000
                    move * :=useracct,(useracctlen),2;                  08362000
                    msglen:=tos-@msg;                                   08364000
                    msg(msglen):=0;  <<genmsg stop>>                    08366000
                    genmsg(-1,@msg,,,,,,,0);                            08368000
               end;                                                     08370000
               <<add log entry for the mount>>                          08372000
               tmask:=vmask;  <<use temporary mask>>                    08374000
               i:=mvtabent:=0;                                          08376000
               tos := 0 cat reqtype(12:13:3)                   <<06530>>08378000
                        cat usecount (0:4:12);                 <<06530>>08380000
               tos := pin;                                     <<06530>>08382000
               while tmask <> 0 do  <<log volume action>>               08384000
               begin                                                    08386000
                    if tmask then  <<this volume associated with user>> 08388000
                    begin                                               08390000
                         mvtabent:=mvtabent+1;                          08392000
                         dev:=mvtabent((i&lsl(1))+5).(0:8);             08394000
                         mvtabent(mvtabent):=dev cat                    08396000
                                             getsubtype(dev)(0:8:8);    08398000
                    end;                                                08400000
                    i:=i+1;                                             08402000
                    tmask:=tmask & lsr(1);                              08404000
               end;                                                     08406000
               mvtabent(mvtabent+1):=0;                                 08408000
               move mvtabent(mvtabent+2):=mvtabent(mvtabent+1),         08410000
                                          (maxvolnum-mvtabent);         08412000
               if not vsdef then  << volume class defn >>      <<*8864>>08414000
               begin                                                    08416000
                    move vsidb:=vsname,(8),2;                           08418000
                    move * :=vsgroup,(8),2;                             08420000
                    move * :=vsaccnt,(8);                               08422000
               end;                                                     08424000
               log13(*,*,uganame,12,vsid,12,mvtabent,maxvolnum+1,       08426000
                     pvlmount);                                         08428000
          end;                                                          08430000
          reqtype:=exitype;                                             08432000
          if pmap.(14:1) and  <<relevant exit type>>           <<00211>>08434000
          (exitype = okexit lor exitype = dupmount) then                08436000
          pvinfo:=vmask cat mvtabindex(4:12:4);                         08438000
          assemble (exit 8);                                   <<00211>>08440000
     end <<exit'>>;                                                     08442000
<<...........................................................>><<*8832>>08444000
                                                                        08446000
     subroutine checkvmount;  << =vmount console message >>             08448000
     begin                                                              08450000
                                                               <<*8832>>08452000
     << checkvmount prints a console message stating that a  >><<*8832>>08454000
     << mount request was rejected if the private volumes    >><<*8832>>08456000
     << facility has not been invoked, and vmount.allf was   >><<*8832>>08458000
     << set (relay all p.v. related messages to the console).>><<*8832>>08460000
                                                               <<*8832>>08462000
          vmount:=vmountinfo;                                           08464000
          if not vmount.onf then <<reject all user mount requests>>     08466000
          if reqtype <> opreq then  <<its a user request>>              08468000
          begin                                                         08470000
               if vmount.allf then                                      08472000
               begin                                                    08474000
                    msg(useracctlen+31):=0;  <<genmsg stop>>            08476000
                    move msg:="MOUNT FOR ",2;                           08478000
                    move * := useracct,(useracctlen),2;                 08480000
                    move * :="REJECTED (VMOUNT OFF)";                   08482000
                    genmsg(-1,@msg,,,,,,,0);                            08484000
               end;                                                     08486000
               exit'(vmountoff);                                        08488000
          end;                                                          08490000
     end <<checkvmount>>;                                               08492000
                                                                        08494000
<<...........................................................>><<*8832>>08496000
                                                               <<*8832>>08498000
     subroutine formatnames;                                            08500000
                                                               <<*8832>>08502000
     << formatnames sets up the user and volume set names in >><<*8832>>08504000
     << in a format suitable for printing on the console.    >><<*8832>>08506000
                                                               <<*8832>>08508000
     begin                                                              08510000
          move useracct := " ";                                         08512000
          move useracct (1) := useracct, (17);                          08514000
          move useracct := uganameb, (8);                               08516000
          move useracct := useracct while an, 1;                        08518000
          move * := ".", 2;                                             08520000
          assemble (dup);                                               08522000
          move * := uganameb (16), (8);                                 08524000
          assemble (dup);                                               08526000
          move * := * while an, 1;                                      08528000
          move * := " ",2;                                              08530000
          useracctlen:=tos-@useracct;                                   08532000
          i:=-1;                                                        08534000
          tos:=@setname;                                                08536000
          move msg(8):=" ";  <<stopper>>                                08538000
          while (i:=i+1) < 3 do                                         08540000
          begin                                                         08542000
               move msg:=vsidb(i*8),(8);                                08544000
               move * := msg while an,1;                                08546000
               if i < 2 then  <<not last name>>                         08548000
                  move * :=".",2                                        08550000
               else                                                     08552000
                  move * :=" ",2;                                       08554000
          end;                                                          08556000
          setnamelen:=tos-@setname;                                     08558000
     end <<formatnames>>;                                               08560000
                                                                        08562000
<<...........................................................>><<*8832>>08564000
                                                               <<*8832>>08566000
     logical subroutine vsetdowned;                                     08568000
                                                               <<*8832>>08570000
     << vsetdowned determines whether a volume set is cur-   >><<*8832>>08572000
     << rently downed even though it may mounted.  a volume  >><<*8832>>08574000
     << set is considered downed when the device containing  >><<*8832>>08576000
     << the master volume has been downed by the operator.   >><<*8832>>08578000
     << if so, vsetdowned will return true and the request   >><<*8832>>08580000
     << will be rejected.                                    >><<*8832>>08582000
                                                               <<*8832>>08584000
     begin                                                     <<*8832>>08586000
          dev:=mvtabent(5).ldevf;  <<master volume ldev>>               08588000
          move'from'dst (@ldt,ldt'dst,dev * size'of'ldt'entry, <<06275>>08590000
                         size'of'ldt'entry);                   <<06275>>08592000
          vsetdowned := not ldt'avail'to'sys;                  <<06275>>08594000
     end <<vsetdowned>>;                                                08596000
                                                                        08598000
<<...........................................................>><<*8832>>08600000
                                                               <<*8832>>08602000
     subroutine builddevlist;                                           08604000
                                                               <<*8832>>08606000
     << builddevlist bulds the devlist array from the infor- >><<*8832>>08608000
     << mation contained in the volume set definition entry  >><<*8832>>08610000
     << (if the volume set is already mounted).  if the set  >><<*8832>>08612000
     << is not mounted, the ldev fields of devlist will be   >><<*8832>>08614000
     << supplied by the pmounted and available procedures.   >><<*8832>>08616000
     << the format of the devlist array is as follows:       >><<*8832>>08618000
     <<                                                      >><<*8832>>08620000
     << devlist(0) - bit mask of volume member usage, from   >><<*8832>>08622000
     <<              gvsinfo field of volume set defn. entry >><<*8832>>08624000
     << devlist(1) - number of volumes in set, from gvsinfo  >><<*8832>>08626000
     <<              field of volume set defn. entry         >><<*8832>>08628000
     << devlist(2).(0:8) - vtab index, obtained from         >><<*8832>>08630000
     <<                    gvsvolinfo of vsd entry           >><<*8832>>08632000
     << devlist(2).(8:8) - ldev # of member volume, obtained >><<*8832>>08634000
     <<         .          from mvtab entry                  >><<*8832>>08636000
     <<         .                                            >><<*8832>>08638000
     <<          (up to 8 volumes/volume set)                >><<*8832>>08640000
     <<         .                                            >><<*8832>>08642000
     << devlist(n).(0:8) - as devlist(2).(0:8)               >><<*8832>>08644000
     << devlist(n).(8:8) - as devlist(2).(8:8)               >><<*8832>>08646000
                                                               <<*8832>>08648000
     begin                                                              08650000
          tmask:=0;  <<set all mask bits off>>                          08652000
          pmountreqd:=false;  <<assume no physical mounts>>             08654000
          tos:=vmask:=vsdefn(vdinfo).volmask;  <<full set mask>>        08656000
          devlist:=vmask;                                               08658000
          if newuserofset or olduserofset then                          08660000
          begin  <<some members already mounted>>                       08662000
               i:=0;                                                    08664000
               getmvtabentry(mvtabindex,mvtabent);                      08666000
               for i:=0 until integer(mvtabent(1).hvolf) do             08668000
               if mvtabentd(i) <> 0d then  <<this vol is mounted>>      08670000
               tmask:=tmask lor (1 & lsl(i));                           08672000
               mmask := tmask; <<were already mounted>>                 08674000
          end;                                                          08676000
          devlist(1):=vsdefn(vdinfo).numvol;                            08678000
          for i:=2 until (maxvolnum+1) do                               08680000
          begin                                                         08682000
               if vmask then  <<this volume should be mounted>>         08684000
               if tmask then  <<volume already mounted>>                08686000
               begin                                                    08688000
                    devlist(i):=mvtabent(((i-2)&lsl(1))+5).ldevf;       08690000
                    devlist:=devlist land not (1 & lsl(i-2));           08692000
               end else                                                 08694000
               begin                                                    08696000
                    pmountreqd:=true;  <<at least one phys. mount>>     08698000
                    devlist(i):=%100000 cat                             08700000
                                vsdefn(((i-1)*vdventsize)+5)(1:1:7);    08702000
               end else devlist(i):=0;  <<volume need not be mounted>>  08704000
               vmask:=vmask & lsr(1);                                   08706000
               tmask:=tmask & lsr(1);                                   08708000
          end;                                                          08710000
          vmask:=tos;  <<full volume mask>>                             08712000
     end <<builddevlist>>;                                              08714000
                                                                        08716000
<<...........................................................>><<*8832>>08718000
                                                               <<*8832>>08720000
     subroutine addname;                                                08722000
                                                               <<*8832>>08724000
     << addname first adds a name entry to the bind names    >><<*8832>>08726000
     << data segment.  if this is the first entry, a new data>><<*8832>>08728000
     << segment is allocated and the dst# stored in namedst. >><<*8832>>08730000
     << an already existing data segment is expanded if nec- >><<*8832>>08732000
     << essary in increments of namesegln'incr.  the new     >><<*8832>>08734000
     << name entry is added at the end.  finally, a new user >><<*8832>>08736000
     << entry is created for this name in the private volume >><<*8832>>08738000
     << user table.                                          >><<*8832>>08740000
                                                               <<*8832>>08742000
     begin                                                              08744000
        i := 0;                                                <<*8864>>08746000
        type := reqtype;    << save q-relative >>              <<*8864>>08748000
        dupname := false;                                      <<*8864>>08750000
        if bind then                                           <<*8864>>08752000
          begin                                                <<*8864>>08754000
          move nameqb:=vsgroup,(8),2;                                   08756000
          move   *  :=vsaccnt,(8);                                      08758000
          if namecount = 0 then                                         08760000
          begin                                                         08762000
               if (namedst := getdataseg (namesegln'init,               08764000
                   maxnamesegln'init)) = 0 then                         08766000
               exit'(dsegerr);                                          08768000
          end;                                                          08770000
          dst:=exchangedb(namedst);                                     08772000
          if namecount = 0 then  <<zero segment>>                       08774000
          begin                                                         08776000
               nameseg:=0;                                              08778000
               move nameseg (1) := nameseg,(namesegln'init-1);          08780000
               maxnamesegln := maxnamesegln'init;                       08782000
               currnamesegln := namesegln'init;                         08784000
          end;                                                          08786000
          while (i:=i+1) <= integer (namecount) do                      08788000
          begin                                                         08790000
               loc:=i * namentsize;                                     08792000
               if compname then                                         08794000
               begin                                                    08796000
                    dupname:=true;                                      08798000
                    i:=namecount+1;  <<stop loop>>                      08800000
               end;                                                     08802000
          end;                                                          08804000
          if dupname then                                               08806000
$if x3=on                                                               08808000
           if type = userreq1 then                                      08810000
           begin                                                        08812000
                exchangedb(dst);                                        08814000
                exit'(dupbind);                                         08816000
           end else                                                     08818000
$if                                                                     08820000
          else                                                          08822000
          begin <<not dupname>>                                         08824000
              while (namecount+1) >                                     08826000
                    ((currnamesegln/namentsize)-1) do                   08828000
              begin <<need to expand segment>>                          08830000
                  if (currnamesegln+namentsize) >=                      08832000
                     maxnamesegln then exit' (noroom);                  08834000
                  i := altdsegsize (namedst,namesegln'incr);            08836000
                  if <> then                                            08838000
                  begin  <<failure of some kind>>                       08840000
                      tos := if ccg then noroom else dsegerr;           08842000
                      exchangedb (dst);                                 08844000
                      exit' (*);                                        08846000
                  end;                                                  08848000
                  nameseg (currnamesegln) := 0;                         08850000
                  move nameseg (currnamesegln+1) :=                     08852000
                       nameseg (currnamesegln),                         08854000
                       ((i-currnamesegln)-1);                           08856000
                  currnamesegln := i; <<new segment size>>              08858000
              end;                                                      08860000
              namecount:=namecount+1;                                   08862000
              nameseg (loc:=namecount*namentsize) := 0;                 08864000
              movename;  <<from q-rel.>>                                08866000
          end;                                                          08868000
          nameseg(loc):=nameseg(loc)+1;                                 08870000
          exchangedb(dst);                                              08872000
          end;          << if bind >>                          <<*8864>>08874000
                                                               <<*8864>>08876000
        << call usertable to create new user entry >>          <<*8864>>08878000
        retinfo := umask;                                      <<*8864>>08880000
        retinfo (1) := namecount; retinfo (2) := namedst;      <<*8864>>08882000
        uret:=usertable(adduser, pin, mvtabindex               <<*8864>>08884000
                        cat vmask (0:8:8), retinfo);           <<*8864>>08886000
        if <> then                                             <<*8864>>08888000
        begin                                                  <<*8864>>08890000
            delname;                                           <<*8864>>08892000
            exit' (uret);                                      <<*8864>>08894000
        end;                                                   <<*8864>>08896000
        usertableupdate := true;                               <<*8864>>08898000
     end <<addname>>;                                                   08900000
                                                                        08902000
<<...........................................................>><<*8832>>08904000
                                                                        08906000
<< begin procedure mount >>                                    <<*8832>>08908000
                                                                        08910000
     push(status);                                                      08912000
     tos.(2:1):=0;  <<reset user traps - avoid attachio problems>>      08914000
     set(status);                                                       08916000
                                                                        08918000
     devlist(1):=0;  << drives'obtained = 0 >>                          08920000
     move umask' (-3):=umask'pb,(8); <<set up usertable mask>>          08922000
     @vsnamew := @vsname & lsr (1);                                     08924000
     @vsgroupw := @vsgroup & lsr (1);                                   08926000
     @vsaccntw := @vsaccnt & lsr (1);                                   08928000
     if reqtype = opreq then                                   <<06530>>08930000
        pin := 0                                               <<06530>>08932000
     else                                                      <<06530>>08934000
        begin                                                  <<06530>>08936000
        getjitinfo (uganame);                                  <<06530>>08938000
        if pmap then                                           <<06530>>08940000
           pin := different'pin                                <<06530>>08942000
        else                                                   <<06530>>08944000
           pin := curprc;                                      <<06530>>08946000
        end;                                                   <<06530>>08948000
                                                               <<06532>>08950000
     bind := (reqtype = sysreq1 lor reqtype = sysreq3 lor               08952000
              reqtype = userreq1);                                      08954000
                                                               <<*8832>>08956000
     if vsname = "* " then  <<mount home volume set>>                   08958000
     begin                                                              08960000
          << find group entry for home group in directory >>   <<*8832>>08962000
          retinfod:=direcfind (%10,0d,vsaccntw,vsgroupw,                08964000
                               vsnamew,dirent);                         08966000
          if <> then                                                    08968000
          begin                                                         08970000
               tos:=if retinfo(1) = 2 then (retinfo+nohvset)            08972000
                    else direcerr;                                      08974000
               exit'(*);                                                08976000
          end;                                                          08978000
          if direntb(68) <> "  " then                                   08980000
          begin                                                         08982000
               move vsidb:=direntb(68),(8),2;                           08984000
               move * :=direntb(60),(8),2;                              08986000
               move * :=direntb(52),(8);                                08988000
          end else                                                      08990000
          exit'(nohvset);                                               08992000
          if uganameb(16) = vsaccnt,(8) then                            08994000
          if uganameb(8) = vsgroup,(8) then                             08996000
          begin                                                         08998000
               bindjit:=(reqtype=userreq1);                             09000000
          end;                                                          09002000
     end                                                       <<*8864>>09004000
     else     << passed volume set name.group.account >>       <<*8864>>09006000
     begin                                                              09008000
          move vsidb:=vsname,(8),2;                                     09010000
          move * :=vsgroup,(8),2;                                       09012000
          move * :=vsaccnt,(8);                                         09014000
     end;                                                               09016000
                                                               <<*8864>>09018000
     move origvsid := vsid, (12); <<preserve it>>                       09020000
     formatnames;                                                       09022000
     checkvmount;                                                       09024000
     umask:=umask'(reqtype);                                            09026000
     do begin                                                           09028000
            get'dir'n'mvtab'sirs;                              <<*8864>>09030000
            getvsdefn (vsid,vsdefn,vsdef,i);                            09032000
            if <> then exit' (i);                                       09034000
            if vsdefn (vdmisc).initallocf then                          09036000
            begin <<being allocated by someone for 1st time>>           09038000
                rel'mvtab'n'dir'sirs;                          <<*8864>>09040000
                if reqtype = opreq then                                 09042000
                begin                                                   09044000
                    move msg :=                                         09046000
                ("OPERATOR MOUNT REJECTED (OPERATOR CANNOT WAIT)",0);   09048000
                    genmsg (-1,@msg,,,,,,,0);                           09050000
                    exit' (opcan'wait);                                 09052000
                end;                                                    09054000
                delay (1000d);                                          09056000
                move vsid := origvsid, (12); <<re-initialize>>          09058000
            end;                                                        09060000
        end until not vsdefn (vdmisc).initallocf;                       09062000
                                                               <<*8864>>09064000
     << allocate a new mvtab entry and/or a pv user entry >>   <<*8864>>09066000
     if (mvtabindex := vsdefn (vdmisc).mvtabxf) = 0 then                09068000
     begin <<need to allocate a mvtab entry>>                           09070000
         if (mvtabindex:=allocmvtabx)=0 then exit' (mvtaberr);          09072000
         havemvtabntry := true;                                         09074000
         firstuserofset := dirparms (3) := true;                        09076000
         builddevlist;                                                  09078000
     end else                                                           09080000
     begin <<volume set definition in-use>>                             09082000
         newuserofset := true;                                          09084000
         olduserofset := true;                                          09086000
         builddevlist;                                                  09088000
         dirparms (3) := false;                                         09090000
         uret:=usertable(getuser,pin,mvtabindex,pvuent);       <<*8864>>09092000
         if <> then                                                     09094000
          if < then exit' (mvtaberr)                                    09096000
          else                                                          09098000
          begin   << ccg, user not using volume set >>         <<*8864>>09100000
              olduserofset := false;                                    09102000
              <<mark entry as in use to prevent dismount>>     <<01500>>09104000
              mvtable(preserve,mvtabindex,devlist,             <<01500>>09106000
                     (vmask land mmask));                      <<01500>>09108000
              mvtableupdated := true;                                   09110000
              nameinfo := 0d;                                           09112000
          end                                                           09114000
         else   << cce, user entry already in pvu table >>     <<*8864>>09116000
         begin                                                          09118000
             newuserofset := false;                                     09120000
             if logical (pvu'ent'vmask) <> vmask then          <<06466>>09122000
                exit' (diffclass);                             <<06466>>09124000
                                                               <<06466>>09126000
             tos := pvu'ent'name'c;                            <<06466>>09128000
             tos := pvu'ent'name'd;                            <<06466>>09130000
             nameinfo := tos;                                           09132000
         end;                                                           09134000
         addname;                                                       09136000
     end;                                                               09138000
                                                               <<*8864>>09140000
     << increment vs defn entry reference count if new user  >><<*8864>>09142000
     << of set.  release mvtab and directory sirs when done. >><<*8864>>09144000
                                                               <<*8864>>09146000
     if not olduserofset then                                           09148000
     begin <<update ref count once per user>>                           09150000
         dirparms (0) := 1;  <<allocate vsdefn>>                        09152000
         dirparms (1) := mvtabindex;                                    09154000
         dirparms (2) := 1; <<incr vsdefn reference count>>             09156000
         direcscan (%40,0d,vsid (8),vsid (4),vsid,                      09158000
                    pvrecip,dirparms);                                  09160000
         if <> then exit' (direcerr);                                   09162000
         logicalmount := true;                                          09164000
     end;                                                               09166000
     rel'mvtab'n'dir'sirs;                                     <<*8864>>09168000
                                                               <<*8864>>09170000
     << loop through until all members of the volume set/    >><<*8864>>09172000
     << class are physically mounted.  we call pmounted to   >><<*8864>>09174000
     << check this for us.                                   >><<*8864>>09176000
                                                               <<*8864>>09178000
     while not mounted do  <<check for correct physical mount>>         09180000
     begin                                                              09182000
          if not firstimethru then resetlpdt;                           09184000
          genx:=if gen < 0 then genx else gen;                          09186000
          mounted:=if not pmountreqd then true else                     09188000
                   pmounted(vsid,vsdefn,devlist,genx);                  09190000
          if mounted then  <<entire set physically mounted>>            09192000
          begin                                                         09194000
               if not firstuserofset then                               09196000
               begin                                                    09198000
                    if vsetdowned then exit'(downset);                  09200000
                    if olduserofset then                                09202000
                    begin <<old user of set>>                           09204000
                         alreadymounted:=true;                          09206000
                         if dupname then                                09208000
                         begin                                          09210000
                              if reqtype = opreq                        09212000
$if x3=on                                                               09214000
                              or (userreq1<=reqtype<=userreq2)          09216000
$if                                                                     09218000
                              then                                      09220000
                              begin                                     09222000
                                   delname;                             09224000
                                   exit'(dupmount);                     09226000
                              end;                                      09228000
                         end;                                           09230000
                         if reqtype = sysreq2 or                        09232000
                            reqtype = sysreq4 or                        09234000
                            reqtype = userreq2 then exit'(okexit);      09236000
                         rstatus:=reqstatus(devlist(2).(8:8)); <<06136>>09238000
                         if rstatus2.(9:1) = 1                 <<06136>>09240000
                            then exit'(deverr10);              <<06136>>09242000
                         retinfod:=direcbind (%10,0d,vsaccntw,          09244000
                                      vsgroupw,gipntr,         <<*8864>>09246000
                                      mvtabindex);             <<*8864>>09248000
                         if <> then                                     09250000
                         begin                                          09252000
                              tos:=if retinfo(1) = 2 then               09254000
                                   if integer (retinfo) < 0 then        09256000
                                      (nohaccnt-retinfo)                09258000
                                   else                                 09260000
                                      (retinfo+nohvset)                 09262000
                                   else                                 09264000
                                      direcerr;                         09266000
                              exit'(*);                                 09268000
                         end;                                           09270000
                         if bindjit then                       <<*8864>>09272000
                            jitbind(mvtabindex,gipntr);        <<*8864>>09274000
                         exit'(okexit);                                 09276000
                    end;                                                09278000
                    if gen >= 0 then  <<gen specified>>                 09280000
                       if gen <> integer(mvtabent(4)) then  <<mismatch>>09282000
                          exit'(wrongen);  <<bad gen on logical mount>> 09284000
               end;   << not first user of set >>              <<*8864>>09286000
                                                               <<*8864>>09288000
               << if this is a user mount request and vmount >><<*8864>>09290000
               << auto is not on, request operator for access>><<*8864>>09292000
               << to volume set and wait for reply.          >><<*8864>>09294000
                                                               <<*8864>>09296000
               rstatus := reqstatus(devlist(2).(8:8));         <<06136>>09298000
               if rstatus2.(9:1) = 1                           <<06136>>09300000
                  then exit'(deverr10);                        <<06136>>09302000
               if firstaccessmsg then                                   09304000
               if not vmount.autof then << op reply required >><<*8864>>09306000
               if reqtype <> opreq then  <<user mount request>>         09308000
               begin                                                    09310000
                    i:=0;                                               09312000
                    move msg:="ACCESS TO ",2;                           09314000
                    move * :=setname,(setnamelen),2;                    09316000
                    move * :="BY ",2;                                   09318000
                    move * :=useracct,(useracctlen),2;                  09320000
                    move * :=" (Y/N)?",2;                               09322000
                    msglen:=tos-@msg;                                   09324000
                    msg(msglen):=0;  <<genmsg stop>>                    09326000
                    genmsg(-1,@msg,,,,,,,0,%1,@reply);                  09328000
                    if not reply then  <<operator rejected>>            09330000
                    begin                                               09332000
                         exit'(opreject);                               09334000
                    end;                                                09336000
               end;                                                     09338000
               firstaccessmsg:=false;                                   09340000
          end                                                  <<*8864>>09342000
                                                               <<*8864>>09344000
          else     << entire set not physically mounted >>     <<*8864>>09346000
          begin                                                         09348000
               << if vmount all is on and this is a condi-   >><<*8864>>09350000
               << tional system mount with binding, relay    >><<*8864>>09352000
               << mount reject to console.                   >><<*8864>>09354000
                                                               <<*8864>>09356000
               if vmountinfo.autof or  <<don't bother operator>>        09358000
               reqtype = sysreq2 or reqtype = sysreq3 or                09360000
               reqtype = opreq then                                     09362000
               begin                                                    09364000
                    if vmount.allf then  <<op wants to know>>           09366000
                    if not (sysreq2<=reqtype<=opreq) then  <<tell op>>  09368000
                    begin                                               09370000
                         msg(useracctlen+31):=0;  <<genmsg stop>>       09372000
                         move msg:="MOUNT FOR ",2;                      09374000
                         move * := useracct,(useracctlen),2;            09376000
                         move * :="REJECTED (SET ABSENT)";              09378000
                         genmsg(-1,@msg,,,,,,,0);                       09380000
                    end;                                                09382000
                    exit'(notmounted);  <<auto reject>>                 09384000
               end;                                                     09386000
                                                               <<*8864>>09388000
            << look for more drives to satisfy mount request >><<*8864>>09390000
               if available(setname,setnamelen,devlist) then            09392000
               if drives'needed = drives'obtained then  <<found enough>>09394000
               begin                                                    09396000
                    i:=0;                                               09398000
                    move msg:="MOUNT ",2;                               09400000
                    move * :=setname,(setnamelen),2;                    09402000
                    if genx > 0 then                                    09404000
                    begin                                               09406000
                         move * :="(",2;                                09408000
                         tos:=ascii(genx,10,bps0);                      09410000
                         assemble(add);                                 09412000
                         move * :=") ",2;                               09414000
                    end;                                                09416000
                    move * :="ON LDEV# ",2;                             09418000
                    msglen:=loc:=tos-@msg;                              09420000
                    for i:=2 until (maxvolnum+1) do                     09422000
                    if devlist(i).(8:8) <> 0 then  <<mount on it>>      09424000
                    begin                                               09426000
                         len:=ascii(devlist(i).(8:8),10,msg(loc));      09428000
                         msg(loc+len):=",";                             09430000
                         loc:=loc+(len:=len+1);                         09432000
                         msglen:=msglen+len;                            09434000
                    end;                                                09436000
                    move msg(msglen-1):=" (Y/N)?",2;                    09438000
                    msglen:=tos-@msg;                                   09440000
                    msg(msglen):=0;  <<genmsg stop>>                    09442000
                    genmsg(-1,@msg,,,,,,,0,%1,@reply);                  09444000
                    if not reply then  <<operator rejected>>            09446000
                    begin                                               09448000
                         exit'(opreject);                               09450000
                    end;                                                09452000
               end else else                                            09454000
               exit'(notavail);                                         09456000
          end;                                                          09458000
          firstimethru:=false;                                          09460000
     end;    << while not mounted do >>                        <<*8864>>09462000
                                                               <<*8864>>09464000
     get'dir'n'mvtab'sirs;                                     <<*8864>>09466000
                                                               <<*8864>>09468000
     if firstuserofset then                                             09470000
     begin                                                              09472000
         i := -mvtabindex;                                              09474000
         mvtable (add,i,devlist,vmask,usecount,cmask);         <<07110>>09476000
         if <> then exit'(mvtaberr);                                    09478000
         mvtableupdated := true;                                        09480000
         havemvtabntry := false;                                        09482000
         << initialize mvtabent now >>                         <<*8995>>09484000
         getmvtabentry(mvtabindex,mvtabent);                   <<*8995>>09486000
         nameinfo := 0d;                                       <<*8864>>09488000
         addname;                                              <<*8864>>09490000
         dirparms (0) := 1;  <<allocate vsdefn>>                        09492000
         dirparms (1) := mvtabindex;                                    09494000
         dirparms (2) := 0; <<pseudo ref count incr>>                   09496000
         dirparms (3) := false;                                         09498000
         direcscan (%40,0d,vsid (8),vsid (4),vsid,                      09500000
                    pvrecip,dirparms);                                  09502000
         if <> then                                                     09504000
         begin                                                          09506000
             delname;                                                   09508000
             exit' (direcerr);                                          09510000
         end;                                                           09512000
         firstuserofset := false;                                       09514000
     end else                                                           09516000
     begin <<newuserofset>>                                             09518000
         mvtable(add,mvtabindex,devlist,                       <<01500>>09520000
                (vmask land not mmask), usecount, cmask);      <<07110>>09522000
         if <> then                                                     09524000
         begin                                                          09526000
             mvtable (remove,mvtabindex,devlist,0);                     09528000
             mvtableupdated := false;                                   09530000
             exit' (mvtaberr);                                          09532000
         end;                                                           09534000
     end;                                                               09536000
                                                               <<*8864>>09538000
     << if binding is specified, bind system and private     >><<*8864>>09540000
     << volume directories.                                  >><<*8864>>09542000
                                                               <<*8864>>09544000
     if bind then  <<bind system and vs directories>>                   09546000
     begin                                                              09548000
          tos:=reqstatus(devlist(2).(0:8));                    <<06136>>09550000
          if tos.(9:1) = 1    << device is read only >>        <<*8864>>09552000
             then exit'(deverr10);                             <<06136>>09554000
          retinfod:=direcbind (%10,0d,vsaccntw,vsgroupw,                09556000
                              gipntr,mvtabindex);              <<*8864>>09558000
          if <> then                                                    09560000
          begin                                                         09562000
               tos:=if retinfo(1) = 2 then                              09564000
                    if integer (retinfo) < 0 then                       09566000
                       (nohaccnt-retinfo)                               09568000
                    else                                                09570000
                       (retinfo+nohvset)                                09572000
                    else                                                09574000
                       direcerr;                                        09576000
               exit'(*);                                                09578000
          end;                                                          09580000
          if bindjit then jitbind(mvtabindex,gipntr);          <<*8864>>09582000
     end;                                                               09584000
     rel'mvtab'n'dir'sirs;                                     <<*8864>>09586000
     exit'(okexit);                                                     09588000
end << mount >>;                                                        09590000
                                                                        09592000
$page "PVSYS - DISMOUNT PROCEDURE"                                      09594000
                                                                        09596000
$control segment = pvsysd                                               09598000
procedure dismount (vsname,vsgroup,vsaccnt,reqtype,            <<00211>>09600000
                    pvinfo,different'pin);                     <<00211>>09602000
value pvinfo,different'pin;                                    <<00211>>09604000
integer reqtype,pvinfo,different'pin;                          <<00211>>09606000
byte array vsname,vsgroup,vsaccnt;                                      09608000
option variable;                                                        09610000
option privileged,uncallable;                                           09612000
                                                               <<*8832>>09614000
<<----------------------------------------------------------->><<*8832>>09616000
<<                                                           >><<*8832>>09618000
<< dismount causes a currently mounted volume set or class to>><<*8832>>09620000
<< be dismounted.  the result of a successful dismount is to >><<*8832>>09622000
<< have an mvtab entry deleted from the table.  the volume   >><<*8832>>09624000
<< set to be dismounted is determined from either the volume >><<*8832>>09626000
<< set name passed to the procedure or the value of pvinfo.  >><<*8832>>09628000
<< if the user requesting the dismount is the only user      >><<*8832>>09630000
<< having the set mounted, the set's mvtab entry will be     >><<*8832>>09632000
<< deleted.  otherwise, the use counts will be decremented   >><<*8832>>09634000
<< and the set will remain mounted.                          >><<*8832>>09636000
<<                                                           >><<*8832>>09638000
<< parameters: vsname - volume set name                      >><<*8832>>09640000
<<             vsgroup- volume set group                     >><<*8832>>09642000
<<             vsaccnt- volume set account                   >><<*8832>>09644000
<<             reqtype - request type:                       >><<*8832>>09646000
<<    (sysreq3)  -3 : system mount (conditional) - binding   >><<*8832>>09648000
<<    (sysreq4)  -2 : system mount - no binding              >><<*8832>>09650000
<<               -1 : unused                                 >><<*8832>>09652000
<<    (userreq1)  0 : user mount - binding                   >><<*8832>>09654000
<<    (userreq2)  1 : user mount - no binding                >><<*8832>>09656000
<<    (sysreq1)   2 : system mount - binding                 >><<*8832>>09658000
<<    (sysreq2)   3 : system mount - no binding              >><<*8832>>09660000
<<    (opreq)     4 : operator mount - no binding            >><<*8832>>09662000
<<             pvinfo -                                      >><<*8832>>09664000
<<               .(0:8) - volume mask                        >><<*8832>>09666000
<<               .(8:8) - mvtab index                        >><<*8832>>09668000
<<               the volume mask indicates which members of a>><<*8832>>09670000
<<               set were mounted as a result of a call to   >><<*8832>>09672000
<<               mount.  pvinfo can be passed to dismount in >><<*8832>>09674000
<<               lieu of a volume set name to have a set dis->><<*8832>>09676000
<<               mounted.  pvinfo is used mainly by system   >><<*8832>>09678000
<<               callers of mount when implicit mounts/dis-  >><<*8832>>09680000
<<               mounts are being performed.                 >><<*8832>>09682000
<<             different'pin - pin, if for process other than>><<*8832>>09684000
<<                             current process               >><<*8832>>09686000
<<                                                           >><<*8832>>09688000
<< returns:    cce - successful.                             >><<*8832>>09690000
<<             ccl - otherwise.                              >><<*8832>>09692000
<<                                                           >><<*8832>>09694000
<< callers:    cifiles (module 5a)                           >><<*8832>>09696000
<<             cimain (module 5b)                            >><<*8832>>09698000
<<             cimgr (module 5c)                             >><<*8832>>09700000
<<             fileacc (module 50)                           >><<*8832>>09702000
<<             loader1 (module 72)                           >><<*8832>>09704000
<<             morgue (module 64)                            >><<*8832>>09706000
<<             opcommand (module 85)                         >><<*8832>>09708000
<<             store/restore (module 6)                      >><<*8832>>09710000
<<             listdir5.pub.sys                              >><<*8832>>09712000
<<                                                           >><<*8832>>09714000
<<----------------------------------------------------------->><<*8832>>09716000
                                                               <<*8832>>09718000
begin                                                                   09720000
     logical pmap = q-4;  <<optional parameters map>>                   09722000
     logical msir := 3, dsir := 3;                             <<*8864>>09724000
     integer i,n,pin,dev,dst,len,loc,mvtabindex;               <<*8864>>09726000
                                                               <<*8864>>09728000
     << pvuser table and bind names segment declarations >>    <<*8864>>09730000
                                                               <<*8864>>09732000
     double  nameinfo;                                         <<*8864>>09734000
     integer namecount = nameinfo,                             <<*8864>>09736000
             namedst   = nameinfo+1,                           <<*8864>>09738000
             bindcount,                                        <<*8864>>09740000
             usecount,                                         <<*8864>>09742000
             uret;                                             <<*8864>>09744000
     logical a,                                                <<*8864>>09746000
             dupname,                                          <<*8864>>09748000
             morenames,                                        <<*8864>>09750000
             unbindit;                                         <<*8864>>09752000
     equate                                                    <<*8864>>09754000
             namentsize = 9;                                   <<*8864>>09756000
                                                               <<*8864>>09758000
         << various masks >>                                   <<*8864>>09760000
                                                               <<*8864>>09762000
     logical                                                   <<*8864>>09764000
          cmask:=0,   << bit mask of dismounted volumes >>     <<*8864>>09766000
          tmask:=0,   << copy of cmask >>                      <<*8864>>09768000
          umask:=0,   << stores information from usertable >>  <<*8864>>09770000
          vmask:=0;   << bit mask of volume member usage >>    <<*8864>>09772000
     logical                                                   <<*8864>>09774000
          vsdef:=0,                                            <<*8864>>09776000
          resources := false;                                  <<*8864>>09778000
     define                                                             09780000
         havedsir              = resources.(15:1) #,                    09782000
         havemsir              = resources.(14:1) #;                    09784000
     define                                                             09786000
          userreq  = umask.(12:1)#,                                     09788000
          userbind = umask.(13:1)#,                                     09790000
          sysreq   = umask.(14:1)#,                                     09792000
          sysbind  = umask.(15:1)#;                                     09794000
     logical array umask'(-3:5);                                        09796000
     logical array umask'pb(*)=pb:=                                     09798000
          %03,  <<system dismount (conditional) - binding>>             09800000
          %02,  <<system dismount - no binding               >>         09802000
          %00,  <<unused>>                                              09804000
          %14,  <<user dismount - binding       >>                      09806000
          %10,  <<user dismount - no binding    >>                      09808000
          %03,  <<system dismount - binding     >>                      09810000
          %02,  <<system dismount - no binding  >>                      09812000
          %00,  <<operator dismount - no binding>>                      09814000
          %17;  <<morgue dismount (:bye)        >>                      09816000
                                                                        09818000
     logical array ldt (0:size'of'ldt'entry - 1);              <<06275>>09820000
     array retinfo (0 : pvu'ent'size - 1) = q;                 <<06466>>09822000
     double retinfod = retinfo;                                         09824000
     integer array pvuent (*) = retinfo;                       <<06466>>09826000
     define                                                    <<06466>>09828000
        pvue'index = 0#;                                       <<06466>>09830000
     array dirent(0:39);                                                09832000
     byte array direntb(*) = dirent;                                    09834000
     array vtabent(*)  = dirent;                                        09836000
     array dirparms(*) = dirent;                                        09838000
     array vsdefn(0:vdsentsize);                                        09840000
     array mvtabent(*) = vsdefn;                                        09842000
     double array mvtabentd(*) = mvtabent(5);                           09844000
     array nameq(0:7) = q;                                              09846000
     byte array nameqb(*) = nameq;                                      09848000
     array nameseg(*) = db+0;                                           09850000
     array uganame(0:11);  <<user/group/account name>>                  09852000
     byte array uganameb(*) = uganame;                                  09854000
     byte array setname(0:27);                                          09856000
     byte array msg(0:72);                                              09858000
     array vsid(0:11);                                                  09860000
     byte array vsidb(*) = vsid;                                        09862000
     array                                                              09864000
         vsnamew (*),                                                   09866000
         vsgroupw (*),                                                  09868000
         vsaccntw (*);                                                  09870000
     define                                                    <<00174>>09872000
         ldt'index = 0 #,                                      <<06275>>09874000
         lpdt'index = dev * integer (lpdt'entry'size) #;       <<06275>>09876000
                                                                        09878000
     define                                                             09880000
          mvtabx  = pvinfo.(4:4)#,                                      09882000
          vmaskx  = pvinfo.(8:8)#;                                      09884000
                                                                        09886000
                                                               <<06275>>09888000
     subroutine def'move'from'dst;                             <<06275>>09890000
                                                               <<06275>>09892000
     subroutine def'move'to'dst;                               <<06275>>09894000
<<...........................................................>><<*8864>>09896000
                                                               <<*8864>>09898000
     subroutine get'dir'n'mvtab'sirs;                          <<*8864>>09900000
                                                               <<*8864>>09902000
     << this subroutine obtains the directory and mounted    >><<*8864>>09904000
     << volume table sirs, setting the appropriate flags in  >><<*8864>>09906000
     << resources.                                           >><<*8864>>09908000
                                                               <<*8864>>09910000
     begin                                                     <<*8864>>09912000
        dsir := getsir (dirsir);                               <<*8864>>09914000
        havedsir := true;                                      <<*8864>>09916000
        msir:=getsir(mvtabsir);                                <<*8864>>09918000
        havemsir := true;                                      <<*8864>>09920000
     end;                                                      <<*8864>>09922000
                                                               <<*8864>>09924000
<<...........................................................>><<*8864>>09926000
                                                               <<*8864>>09928000
     subroutine rel'mvtab'n'dir'sirs;                          <<*8864>>09930000
                                                               <<*8864>>09932000
     << this subroutine releases the mounted volume table    >><<*8864>>09934000
     << and directory sirs, setting the appropriate flags in >><<*8864>>09936000
     << resources.                                           >><<*8864>>09938000
                                                               <<*8864>>09940000
     begin                                                     <<*8864>>09942000
        relsir (mvtabsir,msir);                                <<*8864>>09944000
        havemsir := false;                                     <<*8864>>09946000
        relsir (dirsir,dsir);                                  <<*8864>>09948000
        havedsir := false;                                     <<*8864>>09950000
     end;                                                      <<*8864>>09952000
                                                               <<*8864>>09954000
<<...........................................................>><<*8864>>09956000
                                                                        09958000
     subroutine exit'(exitype);                                         09960000
     value exitype; integer exitype;                                    09962000
     begin                                                              09964000
          cc:=if exitype = okexit then cce else ccl;                    09966000
          if exitype = okexit then                                      09968000
          begin                                                         09970000
               if cmask <> 0 then  <<some volumes were dismounted>>     09972000
               begin                                                    09974000
                    i:=0;                                               09976000
                    tmask:=cmask;                                       09978000
                    a := getsir (ldt'sir);                     <<06275>>09980000
                    while tmask <> 0 do                                 09982000
                    begin                                               09984000
                         if tmask then  <<volume was dismounted>>       09986000
                         begin                                          09988000
                              tos:=mvtabent((i&lsl(1))+5).ldevf;        09990000
                              if (dev:=tos) <> 0 then                   09992000
                                 begin                         <<06275>>09994000
                                 disable;                      <<06275>>09996000
                                 lpdt'mounted'pv := false;     <<06275>>09998000
                                 enable;                       <<06275>>10000000
                                 end;                          <<06275>>10002000
                              move'from'dst (@ldt, ldt'dst,    <<06275>>10004000
                                 dev * size'of'ldt'entry,      <<06275>>10006000
                                 size'of'ldt'entry);           <<06275>>10008000
                              if ldt'down'pending and          <<06275>>10010000
                                 ldt'file'use'cnt = 0 then     <<06275>>10012000
                                 begin                         <<06275>>10014000
                                 ldt'avail'to'sys := false;    <<06275>>10016000
                                 ldt'down'pending := false;    <<06275>>10018000
                                 move'to'dst (ldt'dst,         <<06275>>10020000
                                    dev * size'of'ldt'entry,   <<06275>>10022000
                                    @ldt, size'of'ldt'entry);  <<06275>>10024000
                                                               <<03504>>10026000
                                   << deallocate and delete >> <<03504>>10028000
                                   << disc free space data  >> <<03504>>10030000
                                   << seg, ignore errors.   >> <<03504>>10032000
                                                               <<03504>>10034000
                                   deallocate'dfs'data'seg     <<03504>>10036000
                                          (dev);               <<03504>>10038000
                                   delete'dfs'data'seg (dev);  <<03504>>10040000
                                                               <<03504>>10042000
                                   genmsg (1,250,              <<00174>>10044000
                                           %10000,dev,,,,,0);  <<00174>>10046000
                                 end;                          <<06275>>10048000
                         end;                                           10050000
                         i:=i+1;                                        10052000
                         tmask:=tmask & lsr(1);                         10054000
                    end;                                                10056000
                    relsir (ldt'sir, a);                       <<06275>>10058000
               end;    << volumes dismounted >>                <<*8864>>10060000
               rel'mvtab'n'dir'sirs;                           <<*8864>>10062000
               i:=mvtabent:=0;                                          10064000
               tos := 1 cat reqtype (12:13:3)                  <<06530>>10066000
                        cat usecount (0:4:12);                 <<06530>>10068000
               tos := pin;                                     <<06530>>10070000
               while vmask <> 0 do  <<log volume action>>               10072000
               begin                                                    10074000
                    if vmask then  <<this volume disassociated>>        10076000
                    begin                                               10078000
                         mvtabent:=mvtabent+1;                          10080000
                         dev:=mvtabent((i&lsl(1))+5).(0:8);             10082000
                         mvtabent(mvtabent):=dev cat                    10084000
                                             getsubtype(dev)(0:8:8);    10086000
                    end;                                                10088000
                    i:=i+1;                                             10090000
                    vmask:=vmask & lsr(1);                              10092000
               end;                                                     10094000
               mvtabent(mvtabent+1):=0;                                 10096000
               move mvtabent(mvtabent+2):=mvtabent(mvtabent+1),         10098000
                                          (maxvolnum-mvtabent);         10100000
               if not vsdef then <<class definition >>         <<*8864>>10102000
               begin                                                    10104000
                    move vsidb:=vsname,(8),2;                           10106000
                    move * :=vsgroup,(8),2;                             10108000
                    move * :=vsaccnt,(8);                               10110000
               end;                                                     10112000
               log13(*,*,uganame,12,vsid,12,mvtabent,maxvolnum+1,       10114000
                     pvlmount);                                         10116000
          end                                                  <<*8864>>10118000
          else    << exittype <> okexit >>                     <<*8864>>10120000
          begin                                                <<00211>>10122000
              if havemsir then relsir (mvtabsir,msir);         <<00211>>10124000
              if havedsir then relsir (dirsir,dsir);           <<00211>>10126000
          end;                                                 <<00211>>10128000
          reqtype:=exitype;                                             10130000
          assemble (exit 7);                                   <<00211>>10132000
     end <<exit'>>;                                                     10134000
<<...........................................................>><<*8832>>10136000
                                                                        10138000
     subroutine movename;                                               10140000
                                                               <<*8832>>10142000
     << movename moves a name from q-relative nameq to       >><<*8832>>10144000
     << nameseg in the bind names data segment.              >><<*8832>>10146000
                                                               <<*8832>>10148000
     begin                                                              10150000
          n:=-1;                                                        10152000
          while (n:=n+1) < 8 do                                         10154000
          nameq(n):=nameseg(loc+n+1);                                   10156000
     end <<movename>>;                                                  10158000
                                                                        10160000
<<...........................................................>><<*8832>>10162000
                                                               <<*8832>>10164000
     logical subroutine compname;                                       10166000
                                                               <<*8832>>10168000
     << compname tries to match a name in q-relative nameq   >><<*8832>>10170000
     << to nameseg in the bind names dst.  it returns true   >><<*8832>>10172000
     << if the names matched.                                >><<*8832>>10174000
                                                               <<*8832>>10176000
     begin                                                              10178000
          n:=-1;                                                        10180000
          compname:=true;                                               10182000
          while (n:=n+1) < 8 do                                         10184000
          if nameseg(loc+n+1) <> nameq(n) then                          10186000
          begin                                                         10188000
               compname:=false;                                         10190000
               n:=8;  <<stop loop>>                                     10192000
          end;                                                          10194000
     end <<compname>>;                                                  10196000
                                                                        10198000
<<...........................................................>><<*8832>>10200000
                                                               <<*8832>>10202000
     subroutine delname(all);                                           10204000
     value all;                                                         10206000
     logical all;                                                       10208000
                                                               <<*8832>>10210000
     << delname looks for one or more names to delete in the >><<*8832>>10212000
     << bind names data segment associated with a user entry >><<*8832>>10214000
     << in the private volume user table.  if all is true,   >><<*8832>>10216000
     << all users of the volume are deleted.  otherwise, the >><<*8832>>10218000
     << entry (specified by group.account) in nameseg is     >><<*8832>>10220000
     << deleted.  the bind names data segment is compacted   >><<*8832>>10222000
     << if possible.  logical binding is undone by restoring >><<*8832>>10224000
     << the gfipntr in the directory group entry.  if the    >><<*8832>>10226000
     << bind names count is 0, the segment is freed.         >><<*8832>>10228000
                                                               <<*8832>>10230000
     begin                                                              10232000
          i := 0;                                                       10234000
          dupname:=false;                                               10236000
          morenames:=true;                                              10238000
          if namecount = 0 then return;  <<nothing bound>>              10240000
          move nameqb:=vsgroup,(8),2;                                   10242000
          move    *  :=vsaccnt,(8);                                     10244000
          while morenames do                                            10246000
          begin                                                         10248000
               i:=i+1;                                                  10250000
               unbindit:=false;                                         10252000
               loc:= i * namentsize;                                    10254000
               dst:=exchangedb(namedst);                                10256000
               if not all then                                          10258000
                  if compname then dupname:=true;              <<*8864>>10260000
               if all or dupname then                                   10262000
               begin                                                    10264000
                    movename;                                           10266000
                    unbindit:=true;                                     10268000
                    if (nameseg(loc):=nameseg(loc)-1) = 0 then          10270000
                    begin                                               10272000
                         if (namecount-1)>0 then <<more names>>         10274000
                         begin                                          10276000
                              i:=i-1;                                   10278000
                              move  <<compact name segment>>            10280000
                              nameseg(loc):=nameseg(loc+namentsize),    10282000
                                  ((namecount*namentsize)-loc);         10284000
                              loc:=namecount*namentsize;                10286000
                              nameseg(loc):=0;                          10288000
                              move  <<zero old area>>                   10290000
                              nameseg(loc+1):=nameseg(loc),             10292000
                                              (namentsize-1);           10294000
                         end;                                           10296000
                         namecount:=namecount-1;                        10298000
                    end else if all then <<more for same name>> i:=i-1; 10300000
               end;                                                     10302000
                                                               <<*8864>>10304000
               exchangedb(dst);                                         10306000
               if unbindit then                                         10308000
               begin    << unbind the group >>                 <<*8864>>10310000
                    direcunbind(%10,0d,nameq(4),nameq,mvtabindex);      10312000
                    if <> then exit'(direcerr);                         10314000
                    if uganameb(16) = vsaccnt,(8) and                   10316000
                       uganameb( 8) = vsgroup,(8) and                   10318000
                       reqtype = userreq1 and                           10320000
                       not all then jitbind (0,0);                      10322000
               end;                                                     10324000
               morenames :=                                             10326000
                if all then                                             10328000
                 if namecount = 0 then false else true                  10330000
                else <<a specific name being sought>>                   10332000
                 if dupname then false                                  10334000
                 else                                                   10336000
                  if i <= namecount then true else false;               10338000
          end;                                                          10340000
          if not all and not dupname then exit'(invname);               10342000
          if all then jitbind (0,0);                                    10344000
          if namecount = 0 then                                         10346000
          begin                                                         10348000
               reldataseg(namedst);                                     10350000
               nameinfo := 0d;  <<null names>>                          10352000
          end;                                                          10354000
     end <<delname>>;                                                   10356000
<<...........................................................>><<*8832>>10358000
                                                                        10360000
     subroutine checknset;                                              10362000
                                                               <<*8832>>10364000
     << checknset looks at the information returned from     >><<*8832>>10366000
     << usertable (as stored in the pv user entry) and tran- >><<*8832>>10368000
     << scribes the information to umask, usecount, bind-    >><<*8832>>10370000
     << count, and nameinfo.                                 >><<*8832>>10372000
                                                               <<*8832>>10374000
     begin                                                              10376000
          if logical (pvu'ent'vmask) <> vmask then             <<06466>>10378000
             exit' (diffclass);                                <<06466>>10380000
                                                               <<*8832>>10382000
          << set up umask bits >>                              <<*8832>>10384000
          userreq  := if pvu'ent'umnt'c <> 0 then 1 else 0;    <<*8864>>10386000
          userbind := if pvu'ent'ubind'c <> 0 then 1 else 0;   <<*8864>>10388000
          sysreq   := if pvu'ent'smnt'c <> 0 then 1 else 0;    <<*8864>>10390000
          sysbind  := if pvu'ent'sbind'c <> 0 then 1 else 0;   <<*8864>>10392000
                                                               <<*8832>>10394000
          usecount := pvu'ent'umnt'c + pvu'ent'smnt'c;         <<06466>>10396000
          bindcount := pvu'ent'ubind'c + pvu'ent'sbind'c;      <<06466>>10398000
          namecount := pvu'ent'name'c;                         <<*8864>>10400000
          namedst := pvu'ent'name'd;                           <<*8864>>10402000
     end <<checknset>>;                                                 10404000
                                                                        10406000
<<...........................................................>><<*8832>>10408000
                                                               <<*8832>>10410000
<< begin procedure dismount >>                                 <<*8832>>10412000
                                                               <<*8832>>10414000
     push(status);                                                      10416000
     tos.(2:1):=0;  <<reset user traps - avoid attachio problems>>      10418000
     set(status);                                                       10420000
                                                                        10422000
     if not pmap.(10:1) then                                   <<00251>>10424000
     begin <<name descriptors not supplied>>                   <<00251>>10426000
         @vsname := @vsidb;                                    <<00251>>10428000
         @vsgroup := @vsidb (8);                               <<00251>>10430000
         @vsaccnt := @vsidb (16);                              <<00251>>10432000
     end; <<of initializing descriptors>>                      <<00251>>10434000
     @vsnamew := @vsname & lsr (1);                                     10436000
     @vsgroupw := @vsgroup & lsr (1);                                   10438000
     @vsaccntw := @vsaccnt & lsr (1);                                   10440000
     move umask' (-3):=umask'pb,(9); <<set up usertable mask>>          10442000
     mvtabx:=if pmap.(14:1) then mvtabx else 0;                <<00211>>10444000
     if reqtype = opreq then                                   <<06530>>10446000
        pin := 0                                               <<06530>>10448000
     else                                                      <<06530>>10450000
         begin                                                 <<06530>>10452000
         getjitinfo (uganame);                                 <<06530>>10454000
         if pmap then                                          <<06530>>10456000
            pin := different'pin                               <<06530>>10458000
         else                                                  <<06530>>10460000
            pin := curprc;                                     <<06530>>10462000
         end;                                                  <<06530>>10464000
                                                               <<*8864>>10466000
     get'dir'n'mvtab'sirs;                                     <<*8864>>10468000
                                                               <<*8864>>10470000
     if (mvtabindex:=mvtabx) = 0 then  <<use vs name specification>>    10472000
     begin                                                              10474000
          vsid:="  "; move vsid(1):=vsid,(11);                          10476000
          if vsname = "* " then  <<dismount home volume set>>           10478000
          begin     << get volume set name from group entry >> <<*8864>>10480000
               retinfod := direcfind (%10,0d,vsaccntw,vsgroupw,         10482000
                                      vsnamew,dirent);                  10484000
               if <> then                                               10486000
               begin                                                    10488000
                    tos:=if retinfo(1) = 2 then (retinfo+nohvset)       10490000
                         else direcerr;                                 10492000
                    exit'(*);                                           10494000
               end;                                                     10496000
               if direntb(68) <> "  " then                              10498000
               begin                                                    10500000
                    move vsidb:=direntb(68),(8),2;  <<name>>            10502000
                    move * :=direntb(60),(8),2;  <<group>>              10504000
                    move * :=direntb(52),(8);    <<account>>            10506000
               end else                                                 10508000
               exit'(nohvset);                                          10510000
          end                                                  <<*8864>>10512000
          else   << use passed volume set name >>              <<*8864>>10514000
          begin                                                         10516000
               move vsidb:=vsname,(8),2;                                10518000
               move * :=vsgroup,(8),2;                                  10520000
               move * :=vsaccnt,(8);                                    10522000
          end;                                                          10524000
          getvsdefn(vsid,vsdefn,vsdef,i);                               10526000
          if <> then exit'(i);  <<directory problem>>                   10528000
          if (mvtabindex:=vsdefn(vdmisc).mvtabxf) = 0 then              10530000
               exit'(notmounted);                              <<*8864>>10532000
          vmask:=vsdefn(vdinfo).volmask;                       <<*8864>>10534000
          getmvtabentry(mvtabindex,mvtabent);                  <<*8864>>10536000
     end                                                       <<*8864>>10538000
                                                               <<*8864>>10540000
     else    << use volume mask and mvtabx from pvinfo >>      <<*8864>>10542000
     begin                                                              10544000
          vmask:=vmaskx;                                                10546000
          getmvtabentry(mvtabindex,mvtabent);                           10548000
          i:=mvtabent(5).(8:8);  <<vtab index of master volume>>        10550000
          getabentry(vtabdst,i,vtabent);                                10552000
          move vsid:=vtabent,(12);                                      10554000
     end;                                                               10556000
                                                               <<*8864>>10558000
     uret:=usertable(getuser,pin,mvtabindex,pvuent);           <<*8864>>10560000
     if <> then exit'(notvalduser);                                     10562000
     checknset;  << look at usertable returned info >>                  10564000
     if reqtype <> byereq then  <<check request/binding compat.>>       10566000
        if ((umask land umask'(reqtype)) <> umask'(reqtype)) then       10568000
           exit'(usererr1);  <<mount/dismount request incompatibility>> 10570000
                                                               <<*8864>>10572000
     if (umask'(reqtype) land %5) <> 0 then  <<unbind type>>   <<*8864>>10574000
        if bindcount <> 0 then  << bind count is ok >>         <<*8864>>10576000
          if reqtype <> byereq then                                     10578000
             delname(0)                                                 10580000
          else                                                          10582000
             delname(1);  <<unbind all>>                                10584000
                                                               <<*8864>>10586000
     retinfo:=umask'(reqtype);                                          10588000
     retinfo (1) := namecount;  retinfo (2) := namedst;        <<*8864>>10590000
     uret:=usertable(deluser,pin,mvtabindex,retinfo);          <<*8864>>10592000
     if <> then exit' (uret);                                  <<01106>>10594000
     if reqtype <> byereq and usecount > 1 then                         10596000
        exit'(okexit);  << logical dismount >>                 <<*8864>>10598000
     mvtable(remove,mvtabindex,,vmask,usecount,cmask);         <<07110>>10600000
     if <> then exit'(mvtaberr);                                        10602000
                                                               <<*8864>>10604000
     << deallocate volume set definition entry >>              <<*8864>>10606000
     dirparms (0) := 0;  <<logical deallocate of vsdefn>>               10608000
     dirparms (1) := 0;  <<reset mvtab index>>                          10610000
     dirparms (2) := -1; <<decr ref counter>>                           10612000
     dirparms (3) := false;                                             10614000
     direcscan (%40,0d,vsid (8),vsid (4),vsid,                          10616000
                pvrecip,dirparms);                                      10618000
     if <> then exit' (direcerr);                                       10620000
     if cmask <> 0 then  <<some drives made available>>                 10622000
     if vmountinfo.allf then  <<operator wants to know>>                10624000
     begin                                                              10626000
          i:=0;                                                         10628000
          tmask:=cmask;  <<set temporary mask>>                         10630000
          move msg:="AVAILABLE DRIVE ON LDEV# ",2;                      10632000
          while tmask <> 0 do                                           10634000
          begin                                                         10636000
               if tmask then                                            10638000
               begin                                                    10640000
                    tos:=ascii(mvtabent((i&lsl(1))+5).(0:8),10,bps0);   10642000
                    assemble(add);                                      10644000
                    move * :=",",2;                                     10646000
               end;                                                     10648000
               i:=i+1;                                                  10650000
               tmask:=tmask & lsr(1);                                   10652000
          end;                                                          10654000
          len:=tos-@msg-1;                                              10656000
          msg(len):=0;  <<genmsg stop>>                                 10658000
          genmsg(-1,@msg,,,,,,,0);                                      10660000
     end;                                                               10662000
     exit'(okexit);                                                     10664000
end << dismount>>;                                                      10666000
                                                                        10668000
                                                                        10670000
$control segment = seg'                                                 10672000
                                                                        10674000
end.                                                                    10676000
