home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 35 Internet / 35-Internet.zip / srev13h.zip / srealm.rxx < prev    next >
Text File  |  2001-03-15  |  9KB  |  319 lines

  1. /* Daemon to check for superceding realm entries */
  2.  
  3. parse upper arg defrealm_file_temp,  usequeue , USESEM, max_semwait,sport
  4.  
  5. mytid=dostid()
  6.  
  7. foo=pmprintf_sref(' SRE-http S_Realm:  thread, file and queue: 'mytid ', 'defrealm_file_temp', 'usequeue,,sport)
  8.  
  9.  
  10. resetit:
  11. if usequeue="" | USESEM="" then do
  12.    call pmprintf('SRE-http S_Realm ERROR: initialization ERROR: '||usequeue)
  13.    exit
  14. end
  15.  
  16. call set_realm(defrealm_file_temp)
  17. oo=value('SREF_NO_SUPERCEDING_REALM','0 '||realms.0,'os2environment') 
  18.  
  19.  
  20. foo=pmprintf_sref(' SRE-http S_Realm:  #superceding realms= '||realms.0,,sport)
  21.  
  22.  
  23. /* Initialization now done == start waiting for requests for realm info */
  24. signal on error name iserror
  25. signal on syntax name iserror
  26. bakme:
  27.  a=rxqueue('s',usequeue)
  28.  aq=queued()
  29.  if aq=0 then do
  30.     WOW=EVENTSEM_WAIT(USESEM,max_semwait)
  31.     aq=-1
  32.     if wow=640 then do
  33.          signal bakme
  34.     end
  35.  
  36.     IF WOW<>0 THEN do         /* FATAL ERROR */
  37.        call pmprintf(' SRE-http S_Realm ERROR:  fatal semaphore error ')
  38.        exit
  39.     end
  40.  end
  41.  wow=EVENTSEM_RESET(usesem)
  42.  if aq=-1 then
  43.     if queued()=0 then    signal bakme
  44.  
  45.   PARSE pull isit0
  46.  
  47.   isit0=translate(isit0,' ','000d0a09'x)
  48.   if isit0="" then signal bakme
  49.  
  50. /* die command? */
  51.      if abbrev(isit0,'*DIE*')=1 then
  52.           exit
  53.  
  54.      parse var isit0  idnum ',' newq ',' newsem ',' ISIT
  55.      parse var idnum idnum host_nickname
  56.      isitorig=isit
  57.      if newq="" | newsem=""  then do
  58.         foo=pmprintf_sref(' SRE-http S_Realm ERROR: missing queue or semaphore ',,sport)
  59.         signal bakme
  60.      end
  61.      newq=upper(strip(newq)); newsem=upper(strip(newsem))
  62.      ISIT=STRIP(ISIT)
  63.  
  64.  
  65.    if abbrev(isit,'*LIST*') then do
  66.         dog1=''
  67.         do mm=1 to realms.0
  68.             dog1=dog1||realms.mm.!host'// 'realms.mm.!realm' 'realms.mm||'0d0a'x
  69.         end
  70.       a=rxqueue('s',newq)
  71.       push idnum ',' dog1
  72.       wow=eventsem_post(newsem)
  73.       signal bakme
  74.    end
  75.  
  76.   if abbrev(isit,'*RESET*') then do
  77.           call set_realm(defrealm_file_temp)
  78.           oo=value('SREF_NO_SUPERCEDING_REALM','0 '||realms.0,'os2environment') 
  79.           foo=pmprintf_sref(' SRE-http S_Realm reset:  #superceding realms= '||realms.0,,sport)
  80.    end
  81.    else do
  82.        if  realms.0=0 then do
  83.            dog1=' '
  84.        end
  85.        else do
  86.          dog1=fig_realms(isit,host_nickname)
  87.       end
  88.       a=rxqueue('s',newq)
  89.       push idnum ',' dog1
  90.       wow=eventsem_post(newsem)
  91.    end
  92.  
  93. signal bakme
  94.  
  95. iserror:                /* jump here on an error */
  96. signal off error ; signal off syntax
  97. call pmprintf_sref(' Error in daemon ('usequeue'), exiting: 'sigl','rc)
  98. a=rxqueue('d',usequeue)
  99. call pmprintf("   Status= "a " shutting down "usequeue)
  100. a=eventsem_close(usesem)
  101. call pmprintf("   Status= "a " shutting down "usesem)
  102. foo=value('SREF_REDO',1,'os2environment')
  103. badt=value('SREF_SREALM_BAD',1,'os2environment')
  104. exit
  105.  
  106.  
  107.  
  108.  
  109.  
  110. /* ---------- */
  111. fig_realms:procedure expose realms. xrealms. usesem usequeue
  112.  
  113. parse arg isit , host_nickname,isit0
  114.  
  115. crlf='0d0a'x
  116.  
  117.  isit=strip(isit,'l','/')        
  118.  if pos('?',isit)>0 then do
  119.             parse var isit a1 '?' a2
  120.             a1=translate(a1,'/','\')
  121.             tsel=a1'?'||a2
  122.  end
  123.  else do
  124.            tsel=translate(isit,'/','\')
  125.  end
  126.  tsel=strip(translate(tsel))
  127.  
  128.  host_nickname=strip(upper(host_nickname))
  129.  
  130.  doexact=0
  131.  gotit=0 ; resu=' '; gotit2=''
  132.  
  133. /* is this an exact match, for a specific host? */
  134. if length(tsel)<70 & (pos('*',tsel)+pos('?',tsel)=0) & host_nickname<>'' then do
  135.      al=host_nickname'//'tsel
  136.      gotit=xrealms.al
  137.  
  138. end
  139.  
  140. /* not an exact match, check superceding host specific matches first? */
  141. if gotit=0 then do
  142. if abbrev(host_nickname,'_!')=1 then do   /* check superceding-host specific matches first */
  143.  
  144.   do m=1 to realms.0
  145.       if realms.m.!x=1 then iterate     /* not an exact match */
  146.       if host_nickname<>realms.m.!host then iterate  /* not for this host */
  147.       jlias=strip(realms.m)
  148.       aresu=sref_wild_match(tsel,jlias,resu)
  149.       if aresu=0 then iterate     /* no match */
  150.       if aresu=-1 then do  /* exact match */
  151.           resu=-1
  152.           gotit=m
  153.           gotit2=jlias
  154.           leave
  155.       end
  156.       resu=aresu
  157.       GOTIT=M
  158.       gotit2=jlias
  159.       iterate
  160.   end
  161. end
  162. end
  163.  
  164. /* no host specfic and not "strict-superceding host", try a generic match? */
  165. if gotit=0 & abbrev(host_nickname,'_!!')=0 then do
  166.  
  167. /* is this an exact match, default host? */
  168.   if length(tsel)<70 & (pos('*',tsel)+pos('?',tsel)=0) then do
  169.       al='//'tsel
  170.       gotit=xrealms.al
  171.  
  172.    end
  173.  
  174.   if gotit=0 then do
  175.   do m=1 to realms.0               
  176.       if realms.m.!x=1 then iterate     /* not an exact match */
  177.       if abbrev(host_nickname,'_!')=1 & realms.m.!host>'' then iterate  /* do not check superceding hosts */
  178.       if (realms.m.!host<>'' & realms.m.!host<>host_nickname) then iterate
  179.       jlias=strip(realms.m)
  180.       aresu=sref_wild_match(tsel,jlias,resu)
  181.       if aresu=0 then iterate     /* no match */
  182.       if aresu=-1 then do  /* exact match */
  183.           resu=-1
  184.           gotit=m
  185.           gotit2=jlias
  186.           leave
  187.       end
  188.       resu=aresu
  189.       GOTIT=M
  190.       gotit2=jlias
  191.      iterate 
  192.   end
  193.   end
  194. end
  195. if gotit=0 then return ''               /* no match */
  196.  
  197. if pos('*',gotit2)=0 then do
  198.    dalias=realms.gotit.!alias
  199. end
  200. else do
  201.    dalias=sref_wildcard(tsel,gotit2' 'realms.gotit.!alias,0)
  202.    parse var dalias ii ' , 'dalias
  203.    if ii=0 then return dalias=''        /* should never happen */
  204. end
  205.  
  206. oof=realms.gotit.!realm||crlf||realms.gotit.!origrule||crlf
  207. oof=oof||realms.gotit.!access||crlf||dalias||crlf
  208. oof=oof||realms.gotit.!puburls||crlf||realms.gotit.!virtual
  209. return oof
  210.  
  211.  
  212. /* ---------------- */
  213. /* read and set up aliases */
  214. set_realm: 
  215. parse arg defrealm
  216.  
  217. realms.=''
  218. realms.0=0
  219. crlf='0d0a'x
  220.  
  221. do mm=1 to 20
  222.   aa=sref_open_read(defrealm,15,'READ')
  223.   if aa<=0 then do
  224.      if mm=20 then do
  225.        call pmprintf(' SRE-http SREALM: Final WARNING:  unable to open ('aa') 'defrealm)
  226.        return 0
  227.      end
  228.      else do
  229.         call pmprintf(' SRE-http SREALM: #'mm' WARNING:  unable to open ('aa') 'defrealm)
  230.         call syssleep(10)
  231.         iterate            /* try again */
  232.      end
  233.  end
  234.  leave  /* if here, okay */
  235. end
  236.  
  237. ii=stream(defrealm,'c','query size')
  238. if ii=0 | ii='' then do 
  239.   call pmprintf(' SRE-http SREALM: WARNING, bad size  ('aa') 'defrealm)
  240.   return 0
  241. end
  242.  
  243. stuff=charin(defrealm,1,ii)
  244. foo=stream(defrealm,'c','close')
  245.  
  246. /* skip first two lines */
  247. parse var stuff . (crlf) . (crlf) stuff
  248.  
  249. do forever
  250.   if stuff="" then leave
  251.   parse var stuff aline (crlf) stuff
  252.   if abbrev(aline,';C_REALM')=1 then do
  253.      parse var aline . rname . 'rule=' arule
  254.      iat=realms.0+1
  255.      realms.0=iat
  256.      realms.iat=arule
  257.      realms.iat.!origrule=arule
  258.      realms.iat.!realm=rname
  259.      realms.iat.!alias='' ;realms.iat.!puburls=0 ;realms.iat.!alias=0
  260.      realms.iat.!virtual=0
  261.      do forever                         /* get alias access puburls virtual */
  262.         if stuff='' then leave
  263.         parse var stuff aline (crlf) stuff
  264.         if aline='' then leave
  265.         parse var aline atype ':' ainfo ; atype=strip(translate(atype))
  266.         parse var ainfo ahost .
  267.         if right(strip(ahost),2)='//' then do
  268.             parse var ainfo realms.iat.!host '//' ainfo
  269.         end        
  270.         aatype='!'||atype
  271.         if atype<>'VIRTUAL' then  parse var ainfo . ainfo  /* get rid of rule */
  272.         realms.iat.aatype=ainfo
  273.      end
  274.   end
  275.   else do       /* scan till next blank line */
  276.      do forever
  277.         if stuff='' then leave
  278.         parse var stuff aline (crlf) stuff
  279.         if aline='' then leave
  280.      end
  281.   end 
  282. end
  283.  
  284. /* clean up rules, and create list of exact entries */
  285. xrealms.=0
  286. do mm=1 to realms.0
  287.   arr=realms.mm
  288.   arr=translate(strip(realms.mm))
  289.   arr=strip(arr,'l','/')        
  290.   if pos('?',arr)>0 then do
  291.       parse var arr a1 '?' a2
  292.       a1=translate(a1,'/','\')
  293.       arr=a1'?'||a2
  294.   end
  295.   else do
  296.       arr=translate(arr,'/','\')
  297.   end
  298.   realms.mm=arr
  299.   if pos('*',arr)>0 | pos('?',arr)>0 | length(arr)>50 then iterate
  300.   realms.mm.!x=1
  301.   arr=strip(realms.mm.!host)'//'arr
  302.   xrealms.arr=mm
  303. end
  304.  
  305.  
  306.  
  307. /*
  308. do mm=1 to realms.0
  309. call pmprintf(mm' 'realms.mm.!realm' 'realms.mm.!host'//--'realms.mm' == 'realms.mm.!alias)
  310. end
  311. */
  312.  
  313. return 1
  314.   
  315.  
  316.  
  317.  
  318.  
  319.