home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Spezial / SPEZIAL2_97.zip / SPEZIAL2_97.iso / ANWEND / ONLINE / SREFV12J / VIRTCHK.RXX < prev    next >
Text File  |  1997-07-23  |  9KB  |  343 lines

  1. /* Check virtual dir module for SRE-FILTER. Uses contents of virtualfile
  2.   call with queue containing:
  3.        newq, newsem , SEL DEFDIR
  4.   returns
  5.        mapped_file_name  (or 0 if error )
  6.  */
  7.  
  8. parse upper arg stuff,  usequeue , USESEM, max_semwait
  9. parse upper var stuff virtualfile dlist
  10.  
  11. call pmprintf_sref(' SRE-FILTER virtual thread: virtualfile='||virtualfile)
  12.  
  13. virtualfile=strip(virtualfile)
  14. standards=" !UPLOAD !CGI-BIN !ADDONS !HTML "  /* shorthands used in limitation list */
  15.  
  16.  
  17.  
  18. mytid=dostid()
  19. call pmprintf_sref(' SRE-FILTER virtual thread: queue='||usequeue)
  20. call pmprintf_sref(' SRE-FILTER virtual thread: semaphore='||usesem)
  21. call pmprintf_sref(' SRE-FILTER virtual thread: thread id ='||mytid)
  22.  
  23. resetit:
  24. if virtualfile="" | usequeue="" | USESEM="" then do
  25.    call pmprintf_sref('SRE-FILTER virtual thread: initialization ERROR: '||usequeue)
  26.    exit
  27. end
  28.  
  29. call set_virtual(virtualfile)
  30.  
  31.  
  32. /*
  33. do mm=1 to nvirtuals
  34.   call pmprintf_sref(virturl.mm||' == '||virtdir.mm' -- 'virtdir.mm.limitlist)
  35. end
  36. */
  37.  
  38.  
  39. if nvirtuals=0 then do
  40.    call pmprintf_sref(' SRE-FILTER virtual thread: Warning: No valid entries in virtual file:'||virtualfile)
  41. end
  42. else do
  43.    call pmprintf_sref(' SRE-FILTER virtual thread:  #virtual dirs= '||nvirtuals)
  44. end
  45.  
  46.  
  47. /* Initialization now done == start waiting for requests for virtual info */
  48.  
  49. signal on error name iserror
  50. signal on syntax name iserror
  51. idid=0
  52.  
  53. bakme:
  54.  a=rxqueue('s',usequeue)
  55.  aq=queued()
  56.  if aq=0 then do
  57.     WOW=EVENTSEM_WAIT(USESEM,max_semwait)
  58.     aq=-1
  59.     if wow=640 then do
  60.          signal bakme
  61.     end
  62.     IF WOW<>0 THEN do         /* FATAL ERROR */
  63.         call pmprintf_sref(' SRE-Filter Virtual Thread: fatal semaphore error: 'wow)
  64.         EXIT
  65.     end
  66.  end
  67.  wow=EVENTSEM_RESET(usesem)
  68.  
  69.  if aq=-1 then
  70.    if queued()=0 then signal bakme
  71.  PARSE pull isit0
  72.  
  73.  
  74.  isit0=translate(isit0,' ','000d0a09'x)
  75.  if isit0=" " then signal bakme
  76.  
  77. /* die command? */
  78.      if abbrev(isit0,'*DIE*')=1 then
  79.           exit
  80. goobs:
  81.      parse var isit0  idnum ',' newq ',' newsem ',' GOOFER
  82.      A=WORDS(GOOFER)
  83.      DEFDIR=STRIP(WORD(GOOFER,WORDS(GOOFER)))
  84.      ISIT=STRIP(DELWORD(GOOFER,WORDS(GOOFER)))
  85.      parse var idnum idnum host_nickname
  86.      host_nickname=strip(upper(host_nickname))
  87.      isitorig=isit
  88.      if newq="" | newsem="" then do
  89.         call pmprintf_sref(' SRE-FILTER virtual thread: missing queue or semaphore ')
  90.         exit
  91.      end
  92.      newq=upper(strip(newq)); newsem=upper(strip(newsem))
  93.      defdir=strip(defdir) ; isit=strip(isit)
  94.  
  95.     if abbrev(isit,'*RESET*') then do
  96.        newfile=defdir
  97.        if newfile<>' ' then virtualfile=newfile
  98.        call set_virtual(virtualfile)
  99.        call pmprintf_sref(' SRE-Filter Virtual Thread:Reread virtual file: 'virtualfile)
  100.    end
  101.    else do
  102.       if isit=" " then
  103.            dog1=' 0 '
  104.       else do
  105.         isit=translate(isit,'\','/')
  106.         isit=strip(isit,'l','\')
  107.         defdir=translate(defdir,'\','/')
  108.         defdir=strip(defdir,,'\')
  109.         dog1=fig_virtual(isit,defdir,host_nickname)
  110.       end
  111.       a=rxqueue('s',newq)
  112.       push idnum ',' dog1
  113.       wow=eventsem_post(newsem)
  114.    end
  115.  
  116. signal bakme
  117.  
  118.  
  119. iserror:
  120. signal off error ; signal off syntax
  121. foo=condition('d')
  122. call pmprintf_sref(' SRE-FIlter: error in virtual thread 'SIGL','RC)
  123.  
  124. n1=queued()
  125. a=rxqueue('d',usequeue)
  126. a=rxqueue('c',usequeue)
  127. foo=eventsem_reset(usesem)
  128. a=eventsem_close(usesem)
  129. a=eventsem_create(usesem)
  130. a=rxqueue('s',newq)
  131. push idnum ', 0 '
  132. wow=eventsem_post(newsem)
  133. call pmprintf_sref('SRE-Filter: done resetting virtual thread ')
  134. signal on error name iserror
  135. signal on syntax name iserror
  136. signal bakme
  137.  
  138. exit
  139.  
  140. /*---------------------*/
  141. fig_virtual:procedure  expose virturl. virtdir. virtsubs. virthosts.
  142.  
  143. parse UPPER arg ACTION, ddir,host_nickname
  144.  
  145. ddir2=translate(ddir,'\','/')
  146. ddir2=strip(ddir2,'t','\')||'\'
  147.  
  148. ACTION=STRIP(TRANSLATE(ACTION,'/','\'))
  149. /* check for illegal action (with .. in it) */
  150. if pos("..",action)>0 then return 0
  151.  
  152.  
  153. gotit=0 ; starat=0
  154. do ii =1 to virturl.0
  155.   if host_nickname<>virthosts.ii & virthosts.ii<>' ' then iterate
  156.  
  157.   if virtdir.ii.limitlist>' ' then do
  158.        if wordpos(ddir2,virtdir.ii.limitlist)=0 then iterate
  159.   end
  160.  
  161.   alabel=virturl.ii
  162.   if abbrev(action,upper(alabel))=1 then do
  163.          if length(alabel)< starat then iterate
  164.          t1=STRIP(delstr(action,1,length(alabel)))
  165.          t1=translate(t1,'\','/')
  166.          tadir=virtdir.ii
  167.          taupwd=virtdir.ii.!upwd
  168.  
  169.          if VIRTsubs.ii=1 then do 
  170.              gotit=1
  171.              adir=tadir
  172.              aupwd=taupwd
  173.              starat=length(alabel)
  174.              tryfile=adir||t1
  175.              iterate
  176.          end
  177.          else do
  178.             if pos('\',t1)>0 then do
  179.                  iterate                /* violation of no subdirs */
  180.             end
  181.             else do
  182.                gotit=1
  183.                adir=tadir
  184.                aupwd=taupwd
  185.                starat=length(alabel)
  186.                tryfile=adir||t1
  187.                iterate
  188.              end
  189.          end
  190.    end
  191. end
  192. /*  append to data dir ? */
  193.  if gotit=0 then do
  194.       t1=strip(strip(translate(ddir,'\','/')),,'\')||'\'
  195.       action=translate(action,'\','/')
  196.       action=strip(action,'l','\')
  197.       tryfile=t1||action
  198.  end
  199.  
  200.  tryfile=translate(tryfile,'\','/')
  201. if pos('HTTP:',upper(tryfile))>0 & aupwd<>' ' then
  202.   tryfile=tryfile||' '||MK_BASE64(aupwd)
  203.  
  204. /*if gotit=1 then
  205.     call pmprintf_sref(" Virtual directory replacement yields: "|| tryfile)
  206. */
  207.  
  208.  return  tryfile  /* success */
  209.  
  210.  
  211.  
  212.  
  213. /* ---------------- */
  214. /* read and set up virtual dir */
  215. set_virtual:
  216. parse arg afile
  217.  
  218. nvirtuals=0 ; virturl.0=0
  219. a=sref_fileread(afile,'ulines',,'E')   /* read it to a stem variable */
  220. foo=do_extends(1)
  221.  
  222. if a=0 then do
  223.       call pmprintf_sref(' SRE-FILTER virtual thread: ERROR reading virtual-file: '||afile)
  224.       exit
  225. end
  226. do mm=1 to ulines.0
  227.   t1=strip(ulines.mm)
  228.   if t1="" then iterate
  229.   if abbrev(t1,';')=1 then iterate
  230.  
  231.   tm1=strip(word(t1,1)) ; ahost=' '
  232.   if right(tm1,2)='//' then do
  233.         ahost=upper(left(tm1,length(tm1)-2))
  234.         parse var t1 foo t1a t1b t1c ',' upwd
  235.   end
  236.   else
  237.          parse var t1 t1a t1b t1c ',' upwd
  238.  
  239.   upwd=strip(upwd); t1c=strip(t1c)
  240.  
  241. /* fix and addd / to candidate url */
  242.   t1a=strip(translate(strip(t1a),'/','\'),,'/')||'/'
  243.  
  244.   t1b=strip(t1b)              /* subdirectories ok ? */
  245.   subok=0
  246.   if right(t1b,1)='*' then do
  247.         t1b=left(t1b,length(t1b)-1)
  248.         subok=1
  249.   end
  250.  
  251. /* fix and add \ to candidate dir */
  252.   adir=strip(translate(strip(t1b),'\','/'),'t','\')||'\'
  253.   mdir=filespec('p',adir)
  254.   mdrv=filespec('d',adir)
  255.   if drv="" then drv=filespec('d',ddir)
  256.   t1b=mdrv||mdir
  257.  
  258.   t4=" "
  259.   if t1c<>' ' then do
  260.        do mm9=1 to words(t1c)
  261.           tmp=upper(strip(word(t1c,mm9)))
  262. /* check if tmp is one of the !standard items */
  263.           imu=wordpos(tmp,standards)
  264.           if imu>0 then tmp=strip(word(dlist,imu))
  265.           tmp=translate(tmp,'\','/')
  266.           tmp=strip(tmp,'t','\')||'\'
  267.           t4=t4||' '||upper(tmp)
  268.        end
  269.   end
  270.   nvirtuals=nvirtuals+1
  271.   virtsubs.nvirtuals=subok
  272.   virturl.nvirtuals=STRIP(TRANSLATE(t1a,' ','000D0A'X))
  273.   virtdir.nvirtuals=STRIP(t1b)
  274.   virtdir.nvirtuals.limitlist=t4
  275.   virtdir.nvirtuals.!upwd=upwd
  276.   virthosts.nvirtuals=ahost
  277. end
  278. virturl.0=nvirtuals
  279. return 0
  280.  
  281.                                                                              
  282.                                                                              
  283. /************/
  284. /* Redo ulines, by treating lines starting with , as continuation lines */
  285. do_extends:procedure expose ulines.
  286.  
  287. if ulines.0=0 then return
  288. isnew=1
  289. tmps.1=ulines.1
  290. do mm=2 to ulines.0
  291.    ali=strip(ulines.mm)
  292.    if abbrev(ali,',')=0 then do
  293.         isnew=isnew+1
  294.         tmps.isnew=ulines.mm
  295.     end
  296.     else do
  297.         tmps.isnew=tmps.isnew||substr(ali,2)
  298.     end
  299. end
  300. do mm=1 to isnew
  301.     ulines.mm=tmps.mm
  302. end
  303. ulines.0=isnew
  304. return 0
  305.  
  306.  
  307.  
  308. /************/
  309. /* create a base64 packing of a message */
  310. mk_base64:procedure
  311.  
  312. do mm=0 to 25           /* set base 64 encoding keys */
  313.    a.mm=d2c(65+mm)
  314. end /* do */
  315. do mm=26 to 51
  316.    a.mm=d2c(97+mm-26)
  317. end /* do */
  318. do mm=52 to 61
  319.    a.mm=d2c(48+mm-52)
  320. end /* do */
  321. a.62='+'
  322. a.63='/'
  323.  
  324. parse arg mess
  325. s2=x2b(c2x(mess))
  326. ith=0
  327. do forever
  328.    ith=ith+1
  329.    a1=substr(s2,1,6,0)
  330.    ms.ith=x2d(b2x(a1))
  331.    if length(s2)<7 then leave
  332.    s2=substr(s2,7)
  333. end /* do */
  334. pint=""
  335. do kk=1 to ith
  336.     oi=ms.kk ; pint=pint||a.oi
  337. end /* do */
  338. j1=length(pint)//4
  339. if j1<>0 then pint=pint||copies('=',4-j1)
  340. return pint
  341.  
  342.  
  343.