.title tempdir Create Temporary Directory .ident /V1.0/ ; ; Author: Rodrick A. Eldridge ; 104 Computer Science ; Iowa State University ; Ames, Iowa 50011 ; (515) 294-5659 ; ; Created: January, 1986 ; ; Modification History: ; ; January 1986 ; Translate ISU_SCRATCH from system logical name table ; and use this translated name for all access to the ; scratch disk. ; ; April 1986 ; Set protection on created directory and define logical name ; SYS$SCRATCH to point to this directory. ; Converted to MLR. ; ; March 1987 ; Parse the directory name found in the uaf file to get the ; main directory to use as the directory name to create on ; the scratch disk. ; ; Description: The program will do the following: ; ; (1) Get username and uic. ; ; (2) Reads the username record in the uaf file. ; ; (3) Checks the QUOTA.SYS file on ISU_SCRATCH for an ; entry for this user and if an entry does not exist, ; it will add an entry for this user. ; ; (4) Creates a directory for this user on ISU_SCRATCH. ; global module tempdir - mask= external module disk_quota external module create_dir const $ssdef ; system services definitions $dscdef ; descriptor definitions $dqfdef ; diskquota definitions $fibdef ; file information block definitions $lnmdef ; logical name defintions $psldef ; access mode definitions $uafdef ; uaf file definitions record disk_quota disk_quota.io_chan: .blkw 1 ; i/o channel disk_quota.func: .blkw 1 ; function disk_quota.cntrl: .blkl 1 ; control value disk_quota.length = .-disk_quota.io_chan end var fab_uaf: $fab fnm=,- fac=,- org=idx,- shr=,- xab=key_uaf rab_uaf: $rab fab=fab_uaf,- ubf=uaf,- usz=uaf$k_length,- rac=key key_uaf: $xabkey ref=0,- pos=0,- siz=12 uaf: .blkb uaf$k_length diskquota: .blkb dqf$k_length work_area: .blkb disk_quota.length device_descr: stdescr .blkb lnm$c_namlength device * directory_descr: stdescr .blkb lnm$c_namlength directory * default_length: .blkw 1 default_directory: .blkb lnm$c_namlength username: .blkb 12 username_length: .blkw 1 uic: .blkl 1 uic_length: .blkw 1 system_table_descr: .ascid /LNM$SYSTEM/ isu_scratch_descr: .ascid /ISU_SCRATCH/ process_table_descr: .ascid /LNM$PROCESS/ sys_scratch_descr: .ascid /SYS$SCRATCH/ get_jpi_list: item 12,jpi$_username,- username,username_length item 4,jpi$_uic,uic,uic_length .long 0 translate_attribute: .long lnm$m_case_blind translate_list: item lnm$c_namlength,lnm$_string,- device,device_descr .long 0 create_attribute: .long lnm$m_terminal create_list: item lnm$s_lnmdef,lnm$_attributes,- create_attribute,0 create_length: item 0,lnm$_string,directory,0 .long 0 supervisor: .byte psl$c_super protection: .word ^xFF88 procedure translate_logical - psect=tempdir begin $trnlnm_s - lognam= isu_scratch_descr,- tabnam= system_table_descr,- attr= translate_attribute,- itmlst= translate_list exit_if_error return end procedure read_uaf - psect=tempdir begin $getjpi_s - itmlst= get_jpi_list exit_if_error $open - fab= fab_uaf exit_if_error $connect - rab= rab_uaf exit_if_error $rab_store - rab= rab_uaf,- kbf= username,- ksz= username_length,- krf= #0 $get - rab= rab_uaf exit_if_error $close - fab= fab_uaf exit_if_error return end procedure examine_diskquota - psect=tempdir begin movw #fib$c_exa_quota,disk_quota.func(r11) movl uic,dqf$l_uic(r9) disk_quota - work_area= l^work_area,- device= q^device_descr,- buffer= l^diskquota return end procedure add_diskquota - psect=tempdir begin movw #fib$c_exa_quota,disk_quota.func(r11) clrl dqf$l_uic(r9) disk_quota - work_area= l^work_area,- device= q^device_descr,- buffer= l^diskquota exit_if_error movw #fib$c_add_quota,disk_quota.func(r11) movl uic,dqf$l_uic(r9) disk_quota - work_area= l^work_area,- device= q^device_descr,- buffer= l^diskquota exit_if_error return end procedure parse_directory - psect=tempdir begin movzbl uaf$t_defdir(r10),r6 ; r6=length locc #^a/./,r6,uaf$t_defdir+1(r10) ; subdirectory? if neq then ; yes, subdirectory found subl r0,r6 ; r6=new length incl r6 ; count for "." movb #^a/]/,(r1) ; replace "." with "]" end movc3 r6,uaf$t_defdir+1(r10),default_directory movw r6,default_length return end procedure create_directory - psect=tempdir begin parse_directory ; find main directory movzwl device_descr,r6 ; r6=length moval directory,r7 ; r7=address movc3 r6,device,(r7) ; move device to directory descr movw r6,directory_descr ; set descriptor length addw r6,r7 ; r7=address of end of device movzwl default_length,r6 ; r6=length movc3 r6,default_directory,(r7) ; append directory to descr addw r6,directory_descr ; update descriptor length create_dir - dev_dir_spec= q^directory_descr,- owner_uic= l^uic,- prot_value= w^protection if neq then exit_if_error else movl #ss$_normal,r0 ; change "created" to "normal" end return end procedure create_logical - psect=tempdir begin movw directory_descr,create_length $crelnm_s - lognam= sys_scratch_descr,- tabnam= process_table_descr,- acmode= supervisor,- itmlst= create_list exit_if_error return end procedure initialize - psect=tempdir begin moval diskquota,r9 ; r9=address of diskquota buffer moval uaf,r10 ; r10=address of uaf buffer moval work_area,r11 ; r11=address of work_area clrw disk_quota.io_chan(r11) clrl disk_quota.cntrl(r11) return end begin initialize read_uaf translate_logical examine_diskquota if eql then add_diskquota end create_directory create_logical exit: if neq then pushr #^m clrw disk_quota.func(r11) disk_quota - work_area= l^work_area,- device= q^device_descr,- buffer= l^diskquota popr #^m end $exit_s r0 return .end tempdir