home *** CD-ROM | disk | FTP | other *** search
/ rtsi.com / 2014.01.www.rtsi.com.tar / www.rtsi.com / UNIFLEX / UNIFLEX / UniFLEX_Std.Utils1.tar.Z / UniFLEX_Std.Utils1.tar / utils1 / crdir < prev    next >
Text File  |  1984-05-02  |  4KB  |  212 lines

  1.  opt pag,nol
  2.  ttl Create Dir Utility
  3.  lib sysdef
  4.  lib syserrors
  5.  opt lis
  6.  pag
  7.  info UniFLEX crdir
  8.  info Version 1.05, Released March 27, 1984
  9.  info Copyright, (C) 1983, by
  10.  info Technical Systems Consultants, Inc.
  11.  info All rights reserved.
  12.  org 0
  13.  
  14. crd sys cpint,1,1
  15.  sys cpint,2,1
  16.  sys cpint,3,1
  17.  ldd 0,s get arg count
  18.  cmpd #1
  19.  lbls synerr if null, report error
  20.  leax 4,s point to arg list
  21.  leay 4,s point y to arg list too
  22.  clr q_opt
  23. crd1 ldd 0,y check for end of args
  24.  beq crd2 skip if so
  25.  ldd [0,y++] get two chars from arg
  26.  cmpd #('+<<8)+('q) see if "+q"
  27.  bne crd1 loop if not
  28.  inc q_opt set quiet option if so
  29.  ldd 0,s re-check argument count
  30.  cmpd #2
  31.  lbls synerr
  32. crd2 pshs x save ptr
  33.  ldd [0,s] get arg ptr
  34.  lbeq crd8 if null, we are done
  35.  std icdir2 set up os call
  36.  std ilnk2
  37.  std ichon2
  38.  ldx icdir2 get argument pointer
  39.  ldd 0,x check first two chars
  40.  cmpd #('+<<8)+('q) see if "+q"
  41.  bne crd3 continue if not
  42.  puls x else go to next argument
  43.  leax 2,x
  44.  bra crd2
  45. crd3 jsr chdp check dir perms
  46.  bes prter error?
  47.  sys ind,icdir do ind call to create dir
  48.  bec crd35 skip if no error
  49.  cmpd #EFLX see if file already existed
  50.  bne prter
  51.  tst q_opt if file exists, is quiet option on?
  52.  beq prter if not quiet, report error
  53.  puls x else go to next argument
  54.  leax 2,x
  55.  bra crd2
  56. crd35 sys guid get user's id
  57.  std ichon3 set in os call
  58.  sys ind,ichon change file owner
  59.  ldx [0,s] get arg ptr
  60.  ldy #buffer point to buffer
  61. crd4 lda 0,x+ copy name to buffer
  62.  sta 0,y+
  63.  bne crd4 repeat til null char
  64.  leax -1,x back up one
  65.  pshs x save end position
  66.  leay -1,y
  67.  ldd #('/<<8)|'. set up '.' dir
  68.  std 0,y++ save in name
  69.  clr 0,y set null term
  70.  pshs y
  71.  sys ind,ilnk do ind link call
  72.  puls x get name end pointer
  73.  bes prter report errors
  74.  ldd #'.<<8 set up '..' name
  75.  std 0,x
  76.  puls x get name end
  77. crd6 lda -1,x look for name begin
  78.  cmpa #'/ is it '/'?
  79.  beq crd7
  80.  leax -1,x
  81.  cmpx [0,s] hit begin?
  82.  bne crd6
  83. crd7 clr 0,x set null end
  84.  sys ind,ilnk do ind link
  85.  puls x get end name ptr
  86.  bes prter report errors
  87.  leax 2,x bump to next arg
  88.  lbra crd2 repeat
  89. crd8 ldd #0 set ok status
  90.  sys term return
  91.  
  92.  pag
  93.  
  94. *
  95. * prter
  96. *
  97. * Print error message.
  98. *
  99.  
  100. prter std erno save error number
  101.  ldd #2 set file desc
  102.  sys write,ermsg1,ERSZ1
  103.  ldx icdir2 get file name
  104.  stx iwrt2 set in os call
  105.  clrb set count to 0
  106. prter2 lda 0,x+ look for name end
  107.  beq prter4
  108.  incb bump char count
  109.  bra prter2
  110. prter4 std iwrt3 save count in call
  111.  ldd #2 set up file desc
  112.  sys ind,iwrt output file name
  113.  ldd #2 set file desc
  114.  sys write,ermsg2,ERSZ2 output rest of message
  115.  ldd erno get error status
  116.  sys term task
  117.  
  118. *
  119. * synerr
  120. *
  121. * Report syntax error.
  122. *
  123.  
  124. synerr ldd #2 set file desc
  125.  sys write,synmsg,SYSZ output message
  126.  ldd #$ff set status
  127.  sys term term task
  128.  
  129. *
  130. * Check for write permissions in dir
  131. *
  132.  
  133. chdp ldy #tdbuf point to temp name buffer
  134. chdp2 lda 0,x+ transfer file name to buffer
  135.  sta 0,y+
  136.  bne chdp2
  137.  leay -1,y eat null
  138. chdp3 cmpy #tdbuf beginning of buffer
  139.  beq chdp4
  140.  lda 0,-y get character
  141.  cmpa #'/ is it slash?
  142.  bne chdp3
  143.  leay 1,y
  144. chdp4 ldd #('.<<8)+0 put period and null terminator
  145.  std 0,y
  146.  sys guid get user id
  147.  pshs d
  148.  sys status,tdbuf,cpbuf get file status
  149.  puls d
  150.  bes chdp7 error?
  151.  cmpd cpbuf+7 check if this guy owns file
  152.  beq chdp5
  153.  cmpd #0 is it system man?
  154.  beq chdp55
  155.  lda cpbuf+5 get perms byte
  156.  bita #$10 check write perms - others
  157.  beq chdp6
  158.  bita #$20 check exec permission
  159.  beq chdp6
  160.  clc set ok status
  161.  rts return
  162. chdp5 lda cpbuf+5 get perms byte
  163.  bita #2 check owner perms
  164.  beq chdp6
  165. chdp55 clc set ok status
  166.  rts return
  167. chdp6 ldd #10 set EPRM error
  168. chdp7 sec set error status
  169.  rts return
  170.  
  171.  
  172. synmsg fcc 'Command syntax error.',$d
  173. SYSZ equ *-synmsg
  174.  
  175.  
  176.  pag
  177.  
  178. * indirection calls
  179.  
  180. icdir fcb crtsd
  181. icdir2 fdb 0,$083F,0
  182.  
  183. ilnk fcb link
  184. ilnk2 fdb 0,buffer
  185.  
  186. ichon fcb chown
  187. ichon2 fdb 0
  188. ichon3 fdb 0
  189.  
  190. iwrt fcb write
  191. iwrt2 fdb 0
  192. iwrt3 fdb 0
  193.  
  194. * strings
  195.  
  196. ermsg1 fcc "Can't create '"
  197. ERSZ1 equ *-ermsg1
  198. ermsg2 fcc "'.",$d
  199. ERSZ2 equ *-ermsg2
  200.  
  201. * storage and buffers
  202.  
  203. q_opt rmb 1
  204.  
  205. cpbuf rmb 22 status buffer
  206. tdbuf rmb 100 name buffer
  207. buffer rmb 64 name buffer
  208. erno rmb 1 error number
  209.  
  210.  
  211.  end crd
  212.