[0001]
[0002]
[0003]
[0004]
[0005]
[0006]
[0007]
[0008]
[0009]
[0010]
[0011]
[0012]
[0013]
[0014]
[0015]
[0016]
[0017]
[0018]
[0019]
[0020]
[0021]
[0022]
[0023]
[0024]
[0025]
[0026]
[0027]
[0028]
[0029]
[0030]
[0031]
[0032]
[0033]
[0034]
[0035]
[0036]
[0037]
[0038]
[0039]
[0040]
[0041]
[0042]
[0043]
[0044]
[0045]
[0046]
[0047]
[0048]
[0049]
[0050]
[0051]
[0052]
[0053]
[0054]
[0055]
[0056]
[0057]
[0058]
[0059]
[0060]
[0061]
[0062]
[0063]
[0064]
[0065]
[0066]
[0067]
[0068]
[0069]
[0070]
[0071]
[0072]
[0073]
[0074]
[0075]
[0076]
[0077]
[0078]
[0079]
[0080]
[0081]
[0082]
[0083]
[0084]
[0085]
[0086]
[0087]
[0088]
[0089]
[0090]
[0091]
[0092]
[0093]
[0094]
[0095]
[0096]
[0097]
[0098]
[0099]
[0100]
[0101]
[0102]
[0103]
[0104]
[0105]
[0106]
[0107]
[0108]
[0109]
[0110]
[0111]
[0112]
[0113]
[0114]
[0115]
[0116]
[0117]
[0118]
[0119]
[0120]
[0121]
[0122]
[0123]
[0124]
[0125]
[0126]
[0127]
[0128]
[0129]
[0130]
[0131]
[0132]
[0133]
[0134]
[0135]
[0136]
[0137]
[0138]
[0139]
[0140]
[0141]
[0142]
[0143]
[0144]
[0145]
[0146]
[0147]
[0148]
[0149]
[0150]
[0151]
[0152]
[0153]
[0154]
[0155]
[0156]
[0157]
[0158]
[0159]
[0160]
[0161]
[0162]
[0163]
[0164]
[0165]
[0166]
[0167]
[0168]
[0169]
[0170]
[0171]
[0172]
[0173]
[0174]
[0175]
[0176]
[0177]
[0178]
[0179]
[0180]
[0181]
[0182]
[0183]
[0184]
[0185]
[0186]
[0187]
[0188]
[0189]
[0190]
[0191]
[0192]
[0193]
[0194]
[0195]
[0196]
[0197]
[0198]
[0199]
[0200]
[0201]
[0202]
[0203]
[0204]
[0205]
[0206]
[0207]
[0208]
[0209]
[0210]
[0211]
[0212]
[0213]
[0214]
[0215]
[0216]
[0217]
[0218]
[0219]
[0220]
[0221]
[0222]
[0223]
[0224]
[0225]
[0226]
[0227]
[0228]
[0229]
[0230]
[0231]
[0232]
[0233]
[0234]
[0235]
[0236]
[0237]
[0238]
[0239]
[0240]
[0241]
[0242]
[0243]
[0244]
[0245]
[0246]
[0247]
[0248]
[0249]
[0250]
[0251]
[0252]
[0253]
[0254]
[0255]
[0256]
[0257]
[0258]
[0259]
[0260]
[0261]
[0262]
[0263]
[0264]
[0265]
[0266]
[0267]
[0268]
[0269]
[0270]
[0271]
[0272]
[0273]
[0274]
[0275]
[0276]
[0277]
[0278]
[0279]
[0280]
[0281]
[0282]
[0283]
[0284]
[0285]
[0286]
[0287]
[0288]
[0289]
[0290]
[0291]
[0292]
[0293]
[0294]
[0295]
[0296]
[0297]
[0298]
[0299]
[0300]
[0301]
[0302]
[0303]
[0304]
[0305]
[0306]
[0307]
[0308]
[0309]
[0310]
[0311]
[0312]
[0313]
[0314]
[0315]
[0316]
[0317]
[0318]
[0319]
[0320]
[0321]
[0322]
[0323]
[0324]
[0325]
[0326]
[0327]
[0328]
[0329]
[0330]
[0331]
[0332]
[0333]
[0334]
[0335]
[0336]
[0337]
[0338]
[0339]
[0340]
[0341]
[0342]
[0343]
[0344]
[0345]
[0346]
[0347]
[0348]
[0349]
[0350]
[0351]
[0352]
[0353]
[0354]
[0355]
[0356]
[0357]
[0358]
[0359]
[0360]
[0361]
[0362]
[0363]
[0364]
[0365]
[0366]
[0367]
[0368]
[0369]
[0370]
[0371]
[0372]
[0373]
[0374]
[0375]
[0376]
[0377]
[0378]
[0379]
[0380]
[0381]
[0382]
[0383]
[0384]
[0385]
[0386]
[0387]
[0388]
[0389]
[0390]
[0391]
[0392]
[0393]
[0394]
[0395]
[0396]
[0397]
[0398]
[0399]
[0400]
[0401]
[0402]
[0403]
[0404]
[0405]
[0406]
[0407]
[0408]
[0409]
[0410]
[0411]
[0412]
[0413]
[0414]
[0415]
[0416]
[0417]
[0418]
[0419]
[0420]
[0421]
[0422]
[0423]
[0424]
[0425]
[0426]
[0427]
[0428]
[0429]
[0430]
[0431]
[0432]
[0433]
[0434]
[0435]
[0436]
[0437]
[0438]
[0439]
[0440]
[0441]
[0442]
[0443]
[0444]
[0445]
[0446]
[0447]
[0448]
[0449]
[0450]
[0451]
[0452]
[0453]
[0454]
[0455]
[0456]
[0457]
[0458]
[0459]
[0460]
[0461]
[0462]
[0463]
[0464]
[0465]
[0466]
[0467]
[0468]
[0469]
[0470]
[0471]
[0472]
[0473]
[0474]
[0475]
[0476]
[0477]
[0478]
[0479]
[0480]
[0481]
[0482]
[0483]
[0484]
[0485]
[0486]
[0487]
[0488]
[0489]
[0490]
[0491]
[0492]
[0493]
[0494]
[0495]
[0496]
[0497]
[0498]
[0499]
[0500]
[0501]
[0502]
[0503]
[0504]
[0505]
[0506]
[0507]
[0508]
[0509]
[0510]
[0511]
[0512]
[0513]
[0514]
[0515]
[0516]
[0517]
[0518]
[0519]
[0520]
[0521]
[0522]
[0523]
[0524]
[0525]
[0526]
[0527]
[0528]
[0529]
[0530]
[0531]
[0532]
[0533]
[0534]
[0535]
[0536]
[0537]
[0538]
[0539]
[0540]
[0541]
[0542]
[0543]
[0544]
[0545]
[0546]
[0547]
[0548]
[0549]
[0550]
[0551]
[0552]
[0553]
[0554]
[0555]
[0556]
[0557]
[0558]
[0559]
[0560]
[0561]
[0562]
[0563]
[0564]
[0565]
[0566]
[0567]
[0568]
[0569]
[0570]
[0571]
[0572]
[0573]
[0574]
[0575]
[0576]
[0577]
[0578]
[0579]
[0580]
[0581]
[0582]
[0583]
[0584]
[0585]
[0586]
[0587]
[0588]
[0589]
[0590]
[0591]
[0592]
[0593]
[0594]
[0595]
[0596]
[0597]
[0598]
[0599]
[0600]
[0601]
[0602]
[0603]
[0604]
[0605]
[0606]
[0607]
[0608]
[0609]
[0610]
[0611]
[0612]
[0613]
[0614]
[0615]
[0616]
[0617]
[0618]
[0619]
[0620]
[0621]
[0622]
[0623]
[0624]
[0625]
[0626]
[0627]
[0628]
[0629]
[0630]
[0631]
[0632]
[0633]
[0634]
[0635]
[0636]
[0637]
[0638]
[0639]
[0640]
[0641]
[0642]
[0643]
[0644]
[0645]
[0646]
[0647]
[0648]
[0649]
[0650]
[0651]
[0652]
[0653]
[0654]
[0655]
[0656]
[0657]
[0658]
[0659]
[0660]
[0661]
[0662]
[0663]
[0664]
[0665]
[0666]
[0667]
[0668]
[0669]
[0670]
[0671]
[0672]
[0673]
[0674]
[0675]
[0676]
[0677]
[0678]
[0679]
[0680]
[0681]
[0682]
[0683]
[0684]
[0685]
[0686]
[0687]
[0688]
[0689]
[0690]
[0691]
[0692]
[0693]
[0694]
[0695]
[0696]
[0697]
[0698]
[0699]
[0700]
[0701]
[0702]
[0703]
[0704]
[0705]
[0706]
[0707]
[0708]
[0709]
[0710]
[0711]
[0712]
[0713]
[0714]
[0715]
[0716]
[0717]
[0718]
[0719]
[0720]
[0721]
[0722]
[0723]
[0724]
[0725]
[0726]
[0727]
[0728]
[0729]
[0730]
[0731]
[0732]
[0733]
[0734]
[0735]
[0736]
[0737]
[0738]
[0739]
[0740]
[0741]
[0742]
[0743]
[0744]
[0745]
[0746]
[0747]
[0748]
[0749]
[0750]
[0751]
[0752]
[0753]
[0754]
[0755]
[0756]
[0757]
[0758]
[0759]
[0760]
[0761]
[0762]
[0763]
[0764]
[0765]
[0766]
[0767]
[0768]
[0769]
[0770]
[0771]
[0772]
[0773]
[0774]
[0775]
[0776]
[0777]
[0778]
[0779]
[0780]
[0781]
[0782]
[0783]
[0784]
[0785]
[0786]
[0787]
[0788]
[0789]
[0790]
[0791]
[0792]
[0793]
[0794]
[0795]
[0796]
[0797]
[0798]
[0799]
[0800]
[0801]
[0802]
[0803]
[0804]
[0805]
[0806]
[0807]
[0808]
[0809]
[0810]
[0811]
[0812]
[0813]
[0814]
[0815]
[0816]
[0817]
[0818]
[0819]
[0820]
[0821]
[0822]
[0823]
[0824]
[0825]
[0826]
[0827]
[0828]
[0829]
[0830]
[0831]
[0832]
[0833]
[0834]
[0835]
[0836]
[0837]
[0838]
[0839]
[0840]
[0841]
[0842]
[0843]
[0844]
[0845]
[0846]
[0847]
[0848]
[0849]
[0850]
[0851]
[0852]
[0853]
[0854]
[0855]
[0856]
[0857]
[0858]
[0859]
[0860]
[0861]
[0862]
[0863]
[0864]
[0865]
[0866]
[0867]
[0868]
[0869]
[0870]
[0871]
[0872]
[0873]
[0874]
[0875]
[0876]
[0877]
[0878]
[0879]
[0880]
[0881]
[0882]
[0883]
[0884]
[0885]
[0886]
[0887]
[0888]
[0889]
[0890]
[0891]
[0892]
[0893]
[0894]
[0895]
[0896]
[0897]
[0898]
[0899]
[0900]
[0901]
[0902]
[0903]
[0904]
[0905]
[0906]
[0907]
[0908]
[0909]
[0910]
[0911]
[0912]
[0913]
[0914]
[0915]
[0916]
[0917]
[0918]
[0919]
[0920]
[0921]
[0922]
[0923]
[0924]
[0925]
[0926]
[0927]
[0928]
[0929]
[0930]
[0931]
[0932]
[0933]
[0934]
[0935]
[0936]
[0937]
[0938]
[0939]
[0940]
[0941]
[0942]
[0943]
[0944]
[0945]
[0946]
[0947]
[0948]
[0949]
[0950]
[0951]
[0952]
[0953]
[0954]
[0955]
[0956]
[0957]
[0958]
[0959]
[0960]
[0961]
[0962]
[0963]
[0964]
[0965]
[0966]
[0967]
[0968]
[0969]
[0970]
[0971]
[0972]
[0973]
[0974]
[0975]
/*****************************************************************************/
/*
                               ProxyMaint.c

See PROXYCACHE.C for commentary.  This module implements both the ROUTINE and
REACTIVE purge maintenance for the proxy file cache.  See PROXYCACHE.C module
for information on cache management strategy.


VERSION HISTORY
---------------
20-MAR-2021  MGD  reduced to a shadow of its former self (caching obsolete)
28-APR-2018  MGD  refactor Admin..() AST delivery
18-JAN-2010  JPP  bugfix; ProxyMaintInit() use v10orPrev10() for scan spec
19-AUG-2007  MGD  use PercentOf() to avoid divide-by-zero exceptions
12-APR-2005  MGD  ProxyMaintSupervisor() return if caching not enabled
04-SEP-2004  MGD  PROXYCACHE.C v9.0.0 cache file header date/time usage 
30-APR-2004  MGD  use QIO to erase cache file (save a few cycles)
13-JAN-2004  MGD  DECC 6.2 objected to '$DESCRIPTOR(name,ptr->string)'
11-JUN-2003  MGD  bugfix; ProxyMaintDeviceStats() volume count (set) handling
11-MAY-2003  MGD  proxy unknown request fields
29-APR-2003  MGD  add proxy cache device error count statistics
02-APR-2003  MGD  maintain 'ProxyXForwardedFor',
                  modify for 'ProxyForwarded'
20-FEB-2003  MGD  ProxytMaintSupervisor() used instead of timers,
                  background purge (set with '[ProxyCacheRoutineHourOfDay] 24')
03-JUN-2002  MGD  bugfix; ensure sys$search() RMS channel is released
15-MAY-2002  MGD  proxy gateway statistics
11-APR-2002  MGD  make a reactive purge initially more agressive,
                  bugfix; switch return not break with next reactive scan
04-APR-2002  MGD  add command-line and menu STOP to cache scans,
                  update admin and monitor status string with scan progress,
                  bugfix; command-line cache maintenance reporting
02-FEB-2002  MGD  rework POSTed query due to request body processing changes
22-SEP-2001  MGD  InstanceLock/UnLock() to control access to cache
04-AUG-2001  MGD  support module WATCHing
07-MAY-2001  MGD  monitor global section accounting changes
05-APR-2001  MGD  add boolean to prevent ProxyMaintCacheLock() lock status
                  block overwriting if multiple scans intiated from Admin Menu
20-DEC-2000  MGD  routine proxy maintainence optionally disabled/external
13-SEP-2000  MGD  ProxyMaintReport() call refined to optionally provide
                  host name cache entries
08-JUL-2000  MGD  add VMS locking around cache scan (for clusters)
04-MAR-2000  MGD  use FaolToBuffer(), et.al.
03-JAN-2000  MGD  no changes required for ODS-5 compliance ... it's not
                  (see note in PROXYCACHE.C)
30-DEC-1999  MGD  change $GETDVI() to $GETDVIW() (potential bugfix)
04-DEC-1999  MGD  rework startup cache device and report details
22-OCT-1999  MGD  inaccessable cache device non-fatal during startup
20-JUN-1999  MGD  allow for cache devices >9GB in space calculations,
                  some refinement to statistics report
19-AUG-1998  MGD  initial development (recommenced DEC 1998)
*/
/*****************************************************************************/

#ifdef WASD_VMS_V7
#undef _VMS__V6__SOURCE
#define _VMS__V6__SOURCE
#undef __VMS_VER
#define __VMS_VER 70000000
#undef __CRTL_VER
#define __CRTL_VER 70000000
#endif

/* standard C header files */
#include <ctype.h>
#include <errno.h>
#include <stdio.h>
#include <string.h>

/* VMS related header files */
#include <atrdef.h>
#include <descrip.h>
#include <dvidef.h>
#include <fibdef.h>
#include <iodef.h>
#include <lkidef.h>
#include <lckdef.h>
#include <prvdef.h>
#include <rmsdef.h>
#include <ssdef.h>
#include <stsdef.h>

/* application-related header files */
#include "wasd.h"

#define WASD_MODULE "PROXYMAINT"

/******************/
/* global storage */
/******************/

char ErrorProxyMaintTooManyDevices [] = "Volume set has too many members.";

BOOL  ProxyMaintChangeToReactive,
      ProxyMaintStopScan;

int  ProxyMaintAllocBlocks,
     ProxyMaintBackgroundFileCount,
     ProxyMaintBackgroundInterval,
     ProxyMaintBackgroundPurgeCount,
     ProxyMaintDeletedAllocBlocks,
     ProxyMaintDeletedCount,
     ProxyMaintDeletedUsedBlocks,
     ProxyMaintFileAllocBlocks,
     ProxyMaintFileCount,
     ProxyMaintFileUsedBlocks,
     ProxyMaintPurgeAtHour,
     ProxyMaintPurgeHoursIndex,
     ProxyMaintReactivePurgeCount,
     ProxyMaintResultFileNameLength,
     ProxyMaintRoutinePurgeCount,
     ProxyMaintRoutineHoursIndex,
     ProxyMaintScanFileSpecLength,
     ProxyMaintScanType,
     ProxyMaintStatScanCount,
     ProxyMaintTargetPercent;
     ProxyMaintUsedBlocks;

unsigned long  ProxyMaintScanStartTime64 [2];

char  *ProxyMaintScanFileSpec;

char  ProxyMaintEraseFileName [256],
      ProxyMaintExpandedFileName [256],
      ProxyMaintStatusStringBckGrnd [128] = "<i>none</i>",
      ProxyMaintStatusStringReactive [196] = "<i>none</i>",
      ProxyMaintStatusStringRoutine [128] = "<i>none</i>",
      ProxyMaintStatusStringStatScan [128] = "<i>none</i>",
      ProxyMaintResultFileName [256];

/********************/
/* external storage */
/********************/

extern BOOL  ProxyServingEnabled,
             ProxyUnknownRequestFields;

extern int  EfnWait,
            EfnNoWait,
            HttpdTickSecond,
            OpcomMessages,
            ProxyConnectPersistMax,
            ProxyConnectPersistSeconds,
            ProxyConnectTimeoutSeconds,
            ProxyForwardedBy,
            ProxyHostLookupRetryCount,
            ProxyNetConnectCount,
            ProxyVerifyRecordMax,
            ProxyXForwardedFor;

extern int  ToLowerCase[],
            ToUpperCase[];

extern char  CliProxyMaint[],
             ErrorSanityCheck[],
             ServerHostPort[];

extern unsigned short HttpdTime7[];

extern ACCOUNTING_STRUCT  *AccountingPtr;
extern CONFIG_STRUCT  Config;
extern MSG_STRUCT  Msgs;
extern PROXY_ACCOUNTING_STRUCT  *ProxyAccountingPtr;
extern PROXYVERIFY_GBLSEC  *ProxyVerifyGblSecPtr;
extern WATCH_STRUCT  Watch;

/*****************************************************************************/
/*
Return a report and control menu related proxy serving.
*/ 

ProxyMaintReport (REQUEST_STRUCT *rqptr)

{
   int  status;

   /*********/
   /* begin */
   /*********/

   if (WATCHMOD (rqptr, WATCH_MOD_PROXY))
      WatchThis (WATCHITM(rqptr), WATCH_MOD_PROXY, "ProxyMaintReport()");

   AdminPageTitle (rqptr, "Proxy Report");

   status = ProxyMaintStatsReport (rqptr, true);
   if (VMSnok (status))
   {
      rqptr->rqResponse.ErrorTextPtr = "ProxyMaintStatisticsReport()";
      ErrorVmsStatus (rqptr, status, FI_LI);
      AdminEnd (rqptr);
      return;
   }

   status = ProxyMaintFunctionReport (rqptr);
   if (VMSnok (status))
   {
      rqptr->rqResponse.ErrorTextPtr = "ProxyMaintFunctionReport()";
      ErrorVmsStatus (rqptr, status, FI_LI);
      AdminEnd (rqptr);
      return;
   }

   rqptr->rqResponse.PreExpired = PRE_EXPIRE_ADMIN;
   ResponseHeader200 (rqptr, "text/html", &rqptr->NetWriteBufferDsc);

   AdminEnd (rqptr);
}

/*****************************************************************************/
/*
Return a report on proxy serving.
*/ 

int ProxyMaintStatsReport
(
REQUEST_STRUCT *rqptr,
BOOL StatisticsReport
)
{
   static char  ResponseFao [] =
"<p><table class=\"ctgry\">\n\
<tr><th class=\"ctttl\" colspan=\"2\">Statistics!AZ</th></tr>\n\
<tr><td>\n\
<table class=\"rghtlft\">\n\
\
<tr><td>\n\
<table cellpadding=\"0\" cellspacing=\"5\" border=\"0\">\n\
<tr><th class=\"sbttl\">Proxy&nbsp;Total</th>\
<tr><th>Requests:</th><td>!&L</td></tr>\n\
<tr><th>Bytes:</th><td colspan=\"2\" align=\"left\">!&,@SQ</td></tr>\n\
</table>\n\
</td></tr>\n\
\
<tr><td>&nbsp;</td></tr>\n\
\
<tr><td>\n\
<table cellpadding=\"0\" cellspacing=\"5\" border=\"0\">\n\
<tr><th class=\"sbttl\">Method</th>\
<tr><th>CONNECT:</th><td>!&L</td></tr>\n\
<tr><th>DELETE:</th><td>!&L</td></tr>\n\
<tr><th>GET:</th><td>!&L</td></tr>\n\
<tr><th>HEAD:</th><td>!&L</td></tr>\n\
<tr><th>OPTIONS:</th><td>!&L</td></tr>\n\
<tr><th>POST:</th><td>!&L</td></tr>\n\
<tr><th>PUT:</th><td>!&L</td></tr>\n\
<tr><th>TRACE:</th><td>!&L</td></tr>\n\
<tr><th>WebDAV:</th><td>!&L</td></tr>\n\
<tr><th>Extension:</th><td>!&L</td></tr>\n\
<tr><th>(SSH):</th><td>!&L</td></tr>\n\
</table>\n\
</td></tr>\n\
\
<tr><td>&nbsp;</td></tr>\n\
\
<tr><td style=\"padding-left:1em;\">\n\
<table cellpadding=\"0\" cellspacing=\"5\" border=\"0\">\n\
<tr><th class=\"sbttl\">SOCKS5</th>\
<tr><th>Total:</th><td>!&L</td></tr>\n\
<tr><th>Success:</th><td>!&L</td></tr>\n\
<tr><th>Fail:</th><td>!&L</td></tr>\n\
</table>\n\
</td></tr>\n\
\
</table>\n\
</td>\
\
<td>\n\
<table class=\"rghtlft\">\n\
\
<tr><td>\n\
<table cellpadding=\"0\" cellspacing=\"5\" border=\"0\">\n\
<tr><th class=\"sbttl\">Network</th></tr>\n\
<tr><th>Requested:</th><td>!&L</td></tr>\n\
<tr><th>IPv4:</th><td>!&L</td><td>(!UL%)</td></tr>\n\
<tr><th>IPv6:</th><td>!&L</td><td>(!UL%)</td></tr>\n\
<tr><th>Persistent&nbsp;&nbsp;/Current</th>\
<td>!&L</td>!&@</tr>\n\
<tr><th>/Peak</th><td>!&L</td></tr>\n\
<tr><th>/Count</th><td>!&L</td><td>(!UL%)</td></tr>\n\
<tr><th>Rx:</th><td>!&,@SQ</td>\
<td rowspan=\"2\" valign=\"middle\" \
style=\"vertical-align:center;\">(!UL%)</td></tr>\n\
<tr><th>Tx:</th><td>!&,@SQ</td></tr>\n\
<tr><th>1nn:</th><td>!&L</td></tr>\n\
<tr><th>2nn:</th><td>!&L</td></tr>\n\
<tr><th>3nn:</th><td>!&L</td></tr>\n\
<tr><th>4nn:</th><td>!&L</td></tr>\n\
<tr><th>5nn:</th><td>!&L</td></tr>\n\
<tr><th><i>none</i>:</th><td>!&L</td></tr>\n\
</td></tr>\n\
\
<tr><td>&nbsp;</td></tr>\n\
\
<tr><td>\
<tr><th class=\"sbttl\">Host&nbsp;Resolution</th>\
<tr><th>Literal:</th><td>!&L</td></tr>\n\
<tr><th>DNS:</th><td>!&L</td><td>(!UL%)</td></tr>\n\
<tr><th>Cache:</th><td>!&L</td></tr>\n\
<tr><th>Error:</th><td>!&L</td></tr>\n\
</td></tr>\n\
\
</table>\n\
</td></tr>\n\
\
</table>\n\
</td></tr>\n\
</table>\n";

   int  status,
        ConnectCountNetwork,
        PercentBytesNetwork,
        PercentCountIpv4,
        PercentCountIpv6,
        PercentCountNetwork,
        PercentCountPersist,
        PercentDnsName,
        TotalCount;
   int64  BytesRaw64,
          BytesRawRx64,
          BytesRawTx64,
          BytesTotal64;
   unsigned short  Length;
   unsigned long  FaoVector [64];
   unsigned long  *vecptr;
   char  Buffer [2048];
   $DESCRIPTOR (BufferDsc, Buffer);

   /*********/
   /* begin */
   /*********/

   if (WATCHMOD (rqptr, WATCH_MOD_PROXY))
      WatchThis (WATCHITM(rqptr), WATCH_MOD_PROXY, "ProxyMaintStatsReport()");

   InstanceMutexLock (INSTANCE_MUTEX_HTTPD);

   /*********/
   /* bytes */
   /*********/

   BytesRaw64 = ProxyAccountingPtr->BytesRawRx64 +
                ProxyAccountingPtr->BytesRawTx64;

   PercentBytesNetwork = PercentOf64 (&BytesRaw64, &BytesTotal64);

   /*********************/
   /* counts percentage */
   /*********************/

   ConnectCountNetwork = ProxyAccountingPtr->ConnectIpv4Count +
                         ProxyAccountingPtr->ConnectIpv6Count;
   PercentCountIpv4 = PercentOf32 (&ProxyAccountingPtr->ConnectIpv4Count,
                                   &ConnectCountNetwork);
   PercentCountIpv6 = PercentOf32 (&ProxyAccountingPtr->ConnectIpv6Count,
                                   &ConnectCountNetwork);
   PercentCountPersist = PercentOf32 (&ProxyAccountingPtr->ConnectPersistCount,
                                      &ConnectCountNetwork);

   /* get these values because of the locking requirements */
   BytesRawRx64 = ProxyAccountingPtr->BytesRawRx64;
   BytesRawTx64 = ProxyAccountingPtr->BytesRawTx64;

   TotalCount = AccountingPtr->LookupDnsNameCount +
                AccountingPtr->LookupCacheNameCount;
   if (TotalCount)
      PercentDnsName = AccountingPtr->LookupDnsNameCount * 100 / TotalCount;
   else
      PercentDnsName = 0;

   /***********/
   /* display */
   /***********/

   vecptr = FaoVector;

   if (ProxyServingEnabled)
      *vecptr++ = "";
   else
      *vecptr++ = "<span style=\"color:#ff0000\"> ... DISABLED</span>";

   *vecptr++ = AccountingPtr->DoProxyCount;
   *vecptr++ = &BytesRaw64;

   *vecptr++ = ProxyAccountingPtr->MethodConnectCount;
   *vecptr++ = ProxyAccountingPtr->MethodDeleteCount;
   *vecptr++ = ProxyAccountingPtr->MethodGetCount;
   *vecptr++ = ProxyAccountingPtr->MethodHeadCount;
   *vecptr++ = ProxyAccountingPtr->MethodOptionsCount;
   *vecptr++ = ProxyAccountingPtr->MethodPostCount;
   *vecptr++ = ProxyAccountingPtr->MethodPutCount;
   *vecptr++ = ProxyAccountingPtr->MethodTraceCount;
   *vecptr++ = ProxyAccountingPtr->MethodWebDavCopyCount +
               ProxyAccountingPtr->MethodWebDavLockCount +
               ProxyAccountingPtr->MethodWebDavMkColCount +
               ProxyAccountingPtr->MethodWebDavMoveCount +
               ProxyAccountingPtr->MethodWebDavPropFindCount +
               ProxyAccountingPtr->MethodWebDavPropPatchCount +
               ProxyAccountingPtr->MethodWebDavUnLockCount;
   *vecptr++ = ProxyAccountingPtr->MethodExtensionCount;
   *vecptr++ = ProxyAccountingPtr->MethodSshCount;

   *vecptr++ = ProxyAccountingPtr->Socks5Count;
   *vecptr++ = ProxyAccountingPtr->Socks5SuccessCount;
   *vecptr++ = ProxyAccountingPtr->Socks5FailCount;

   *vecptr++ = ConnectCountNetwork;
   *vecptr++ = ProxyAccountingPtr->ConnectIpv4Count;
   *vecptr++ = PercentCountIpv4;
   *vecptr++ = ProxyAccountingPtr->ConnectIpv6Count;
   *vecptr++ = PercentCountIpv6;

   *vecptr++ = ProxyNetConnectCount;
   if (StatisticsReport)
   {
      *vecptr++ = "<td colspan=\"2\">\
<a class=\"abttn bttn300\" href=\"!AZ\">Report</a></td>";
      *vecptr++ = ADMIN_REPORT_PROXY_PERSISTENT;
   }
   else
      *vecptr++ = "";
   *vecptr++ = ProxyAccountingPtr->ConnectPersistPeak;
   *vecptr++ = ProxyAccountingPtr->ConnectPersistCount;
   *vecptr++ = PercentCountPersist;

   *vecptr++ = &BytesRawRx64;
   *vecptr++ = PercentBytesNetwork;
   *vecptr++ = &BytesRawTx64;

   *vecptr++ = ProxyAccountingPtr->NetStatusCodeCount[1];
   *vecptr++ = ProxyAccountingPtr->NetStatusCodeCount[2];
   *vecptr++ = ProxyAccountingPtr->NetStatusCodeCount[3];
   *vecptr++ = ProxyAccountingPtr->NetStatusCodeCount[4];
   *vecptr++ = ProxyAccountingPtr->NetStatusCodeCount[5];
   *vecptr++ = ProxyAccountingPtr->NetStatusCodeCount[0];

   *vecptr++ = AccountingPtr->LookupLiteralCount;
   *vecptr++ = AccountingPtr->LookupDnsNameCount;
   *vecptr++ = PercentDnsName;
   *vecptr++ = AccountingPtr->LookupCacheNameCount;
   *vecptr++ = AccountingPtr->LookupDnsNameErrorCount;

   InstanceMutexUnLock (INSTANCE_MUTEX_HTTPD);

   *vecptr++ = AdminRefresh();

   status = FaolToNet (rqptr, ResponseFao, &FaoVector);
   if (VMSnok (status)) ErrorNoticed (rqptr, status, NULL, FI_LI);

   return (status);
}

/*****************************************************************************/
/*
Return a report on proxy special functionality.
*/ 

int ProxyMaintFunctionReport (REQUEST_STRUCT *rqptr)

{
   static char  ResponseFao [] =
"<p><table class=\"ctgry\">\n\
<tr><th class=\"ctttl\">Function!AZ</th></tr>\n\
<tr><td>\n\
<table class=\"rghtlft\">\n\
<tr><td>\n\
\
<table class=\"rghtlft\">\n\
<tr><th class=\"sbttl tacnt\" colspan=\"4\">Gateway</th></tr>\n\
<tr><th class=\"tacnt\">Out&nbsp;\\&nbsp;In:</th>\
<th class=\"talft\">HTTP</th>\
<th class=\"talft\">HTTPS</th>\
</tr>\n\
<tr>\
<th>HTTP</th>\
<td>!&L</td>\
<td>!&L</td>\
</tr>\n\
<tr>\
<th>HTTPS</th>\
<td>!&L</td>\
<td>!&L</td>\
</tr>\n\
<tr>\
<th>FTP</th>\
<td>!&L</td>\
<td>!&L</td>\
</tr>\n\
\
<tr><th class=\"tacnt\">Out&nbsp;\\&nbsp;In:</th>\
<th class=\"talft\">IPv4</th>\
<th class=\"talft\">IPv6</th>\
</tr>\n\
<tr>\
<th>IPv4</th>\
<td>!&L</td>\
<td>!&L</td>\
</tr>\n\
<tr>\
<th>IPv6</th>\
<td>!&L</td>\
<td>!&L</td>\
</tr>\n\
</table>\n\
</td>\
\
<td>&nbsp;&nbsp;</td>\n\
\
<td colspan=\"3\">\n\
<table class=\"rghtlft\">\n\
<tr><th class=\"sbttl tacnt\" colspan=\"7\">Tunnel</th></tr>\n\
<tr><th class=\"tacnt\">Out&nbsp;\\&nbsp;In:</th>\
<th class=\"talft\">CONNECT</th>\
<th class=\"talft\">Firewall</th>\
<th class=\"talft\">Raw</th>\
</tr>\n\
<tr>\
<th>CONNECT</th>\
<td>!&L</td>\
<td>!&L</td>\
<td>!&L</td>\
</tr>\n\
<tr>\
<th>HTTP</th>\
<td>!&L</td>\
<td>!&L</td>\
<td>!&L</td>\
</tr>\n\
<tr>\
<th>HTTPS</th>\
<td>!&L</td>\
<td>!&L</td>\
<td>!&L</td>\
</tr>\n\
<tr>\
<th>Raw</th>\
<td>!&L</td>\
<td>!&L</td>\
<td>!&L</td>\
</tr>\n\
<tr><td></td></tr>\n\
<tr><th>Current:</th><td>!&L</td></tr>\n\
</table>\n\
</td>\n\
\
</tr>\n\
\
<tr><td></td></tr>\n\
\
<tr><td>\n\
\
<table class=\"rghtrght\">\n\
<tr><th class=\"sbttl tacnt\" colspan=\"6\">FTP</th></tr>\n\
<tr><th>Total:</th><td>!&L</td>\n\
<th>DELE:</th><td>!&L</td>\n\
<th>DOS:</th><td>!&L</td></tr>\n\
<tr><th>Login&nbsp;Fail:</th><td>!&L</td>\n\
<th>LIST:</th><td>!&L</td>\n\
<th>Unix:</th><td>!&L</td></tr>\n\
<tr><th></th><td></td>\n\
<th>RETR:</th><td>!&L</td>\n\
<th>VMS:</th><td>!&L</td></tr>\n\
<tr><th></th><td></td>\n\
<th>STOR:</th><td>!&L</td>\n\
<th>?:</th><td>!&L</td></tr>\n\
</table>\n\
</td>\
\
<td>&nbsp;&nbsp;</td>\n\
\
<td>\n\
<table class=\"rghtrght\">\n\
<tr><th class=\"sbttl tacnt\" colspan=\"4\">Verify</th></tr>\n\
<tr><th>Max:</th><td>!&L</td>\n\
<th>Full:</th><td>!&L</td></tr>\n\
<tr><th>Current:</th><td>!&L</td>\n\
<th>200:</th><td>!&L</td></tr>\n\
<tr><th>Set:</th><td>!&L</td>\n\
<th>403:</th><td>!&L</td></tr>\n\
<tr><th>Find:</th><td>!&L</td>\n\
<th>404:</th><td>!&L</td></tr>\n\
</table>\n\
</td>\n\
\
<td>&nbsp;&nbsp;</td>\n\
\
<td>\n\
<table class=\"rghtrght\">\n\
<tr><th class=\"sbttl tacnt\" colspan=\"4\">Rework</th></tr>\n\
<tr><th>Count:</th><td>!&L</td></tr>\n\
<tr><th>No&nbsp;Type:</th><td>!&L</td></tr>\n\
<tr><th>Search:</th><td>!&L</td></tr>\n\
<tr><th>Replace:</th><td>!&L</td></tr>\n\
<tr><th>Too&nbsp;Big:</th><td>!&L</td></tr>\n\
</table>\n\
\
</td></tr>\n\
</table>\n\
</td></tr>\n\
</table>\n";

   int  in, out, status;
   unsigned short  Length;
   unsigned long  FaoVector [64];
   unsigned long  *vecptr;
   char  Buffer [2048];
   $DESCRIPTOR (BufferDsc, Buffer);

   /*********/
   /* begin */
   /*********/

   if (WATCHMOD (rqptr, WATCH_MOD_PROXY))
      WatchThis (WATCHITM(rqptr), WATCH_MOD_PROXY,
                 "ProxyMaintFunctionReport()");

   InstanceMutexLock (INSTANCE_MUTEX_HTTPD);

   vecptr = FaoVector;

   if (ProxyServingEnabled)
      *vecptr++ = "";
   else
      *vecptr++ = "<span style=\"color:#ff0000\"> ... DISABLED</span>";

   /* [http=0,https=1,ftp=2][http=0,https=1] */
   *vecptr++ = ProxyAccountingPtr->GatewaySchemeCount[0][0];
   *vecptr++ = ProxyAccountingPtr->GatewaySchemeCount[1][0];
   *vecptr++ = ProxyAccountingPtr->GatewaySchemeCount[0][1];
   *vecptr++ = ProxyAccountingPtr->GatewaySchemeCount[1][1];
   *vecptr++ = ProxyAccountingPtr->GatewaySchemeCount[0][2];
   *vecptr++ = ProxyAccountingPtr->GatewaySchemeCount[1][2];

   /* [ipv4=0,ipv6=1][ipv4=0,ipv6=1] */
   *vecptr++ = ProxyAccountingPtr->GatewayIpvCount[0][0];
   *vecptr++ = ProxyAccountingPtr->GatewayIpvCount[1][0];
   *vecptr++ = ProxyAccountingPtr->GatewayIpvCount[0][1];
   *vecptr++ = ProxyAccountingPtr->GatewayIpvCount[1][1];

   for (out = 0; out < TUNNEL_COUNT_MAX; out++)
   {
      if (out+1 == PROXY_TUNNEL_FIREWALL) continue;
      for (in = 0; in < TUNNEL_COUNT_MAX; in++)
      {
         if (in+1 == PROXY_TUNNEL_HTTP || in+1 == PROXY_TUNNEL_HTTPS) continue;
         *vecptr++ = ProxyAccountingPtr->TunnelCount[in][out];
      }
   }

   *vecptr++ = ProxyAccountingPtr->TunnelCurrent;

   *vecptr++ = ProxyAccountingPtr->FtpCount;
   *vecptr++ = ProxyAccountingPtr->FtpDeleCount;
   *vecptr++ = ProxyAccountingPtr->FtpDosCount;
   *vecptr++ = ProxyAccountingPtr->FtpLoginFailCount;
   *vecptr++ = ProxyAccountingPtr->FtpListCount;
   *vecptr++ = ProxyAccountingPtr->FtpUnixCount;
   *vecptr++ = ProxyAccountingPtr->FtpRetrCount;
   *vecptr++ = ProxyAccountingPtr->FtpVmsCount;
   *vecptr++ = ProxyAccountingPtr->FtpStorCount;
   *vecptr++ = ProxyAccountingPtr->FtpUnknownCount;

   *vecptr++ = ProxyVerifyRecordMax;
   *vecptr++ = ProxyAccountingPtr->VerifyFullCount;
   *vecptr++ = ProxyAccountingPtr->VerifyCurrentCount;
   *vecptr++ = ProxyAccountingPtr->Verify200Count;
   *vecptr++ = ProxyAccountingPtr->VerifySetRecordCount;
   *vecptr++ = ProxyAccountingPtr->Verify403Count;
   *vecptr++ = ProxyAccountingPtr->VerifyFindRecordCount;
   *vecptr++ = ProxyAccountingPtr->Verify404Count;

   *vecptr++ = ProxyAccountingPtr->ReworkCount;
   *vecptr++ = ProxyAccountingPtr->ReworkNoType;
   *vecptr++ = ProxyAccountingPtr->ReworkReplaceSearch;
   *vecptr++ = ProxyAccountingPtr->ReworkReplaceCount;
   *vecptr++ = ProxyAccountingPtr->ReworkTooBig;

   InstanceMutexUnLock (INSTANCE_MUTEX_HTTPD);

   status = FaolToNet (rqptr, ResponseFao, &FaoVector);
   if (VMSnok (status)) ErrorNoticed (rqptr, status, NULL, FI_LI);

   return (status);
}

/*****************************************************************************/
/*
Return a ontrol menu for dynamically adjusting proxy serving.
*/ 

ProxyMaintAdjust (REQUEST_STRUCT *rqptr)

{
   static char  ResponseFao [] =
"!AZ\
<html>\n\
<head>\n\
!AZ\
!AZ\
<title>WASD !AZ ... Proxy Report/Maintenance</title>\n\
</head>\n\
!AZ\n\
<div class=\"wasd\">\n\
<h2><nobr>WASD !AZ</nobr></h2>\n\
<h3>Proxy Report/Maintenance</h3>\n\
!20&W\n\
\
<form method=\"POST\" action=\"!AZ\">\n\
\
<p><table class=\"ctgry\">\n\
<tr><th class=\"ctttl\">Adjust Executing Server</th></tr>\n\
<tr><td>\n\
<table class=\"rghtlft\">\n\
<tr><th>Serving:</th><td>\n\
<input type=\"radio\" name=\"ProxyServingEnabled\" value=\"enabled\"!AZ>enabled\n\
<input type=\"radio\" name=\"ProxyServingEnabled\" value=\"disabled\"!AZ>disabled\n\
</td></tr>\n\
<tr><th>Unknown Request Fields:</th><td>\n\
<input type=\"radio\" name=\"ProxyUnknownRequestFields\" value=\"enabled\"!AZ>enabled\n\
<input type=\"radio\" name=\"ProxyUnknownRequestFields\" value=\"disabled\"!AZ>disabled\n\
</td></tr>\n\
<tr><th>Add &quot;Forwarded: by&quot;:</th><td>\n\
<input type=\"text\" size=\"10\" name=\"ProxyForwarded\" value=\"!AZ\">\n\
</td></tr>\n\
<tr><th>Add &quot;X-Forwarded-For:&quot;:</th><td>\n\
<input type=\"text\" size=\"10\" name=\"ProxyXForwardedFor\" value=\"!AZ\">\n\
</td></tr>\n\
<tr><th>Host Name Lookup Retry:</th><td>\n\
<input type=\"text\" size=\"3\" name=\"ProxyHostLookupRetryCount\" value=\"!UL\">\n\
attempts</td></tr>\n\
<tr><th>Connect Timeout Seconds:</th><td>\n\
<input type=\"text\" size=\"7\" name=\"ProxyConnectTimeoutSeconds\" value=\"!AZ\">\n\
hh:mm:ss</td></tr>\n\
<tr><th>Connect Persist Max:</th><td>\n\
<input type=\"text\" size=\"3\" name=\"ProxyConnectPersistMax\" value=\"!UL\">\n\
connections</td></tr>\n\
<tr><th>Connect Persist Seconds:</th><td>\n\
<input type=\"text\" size=\"7\" name=\"ProxyConnectPersistSeconds\" value=\"!AZ\">\n\
hh:mm:ss</td></tr>\n\
<tr><td colspan=\"3\"><br>\n\
<input type=\"submit\" name=\"makechanges\" value=\" Make Changes \">\n\
<input type=reset value=\" Reset \">\n\
</td></tr>\n\
</table>\n\
</td></tr>\n\
</table>\n\
\
</form>\n\
\
</body>\n\
</html>\n";

#define REPBOOL(b)\
if (b)\
{\
   *vecptr++ = RadioButtonChecked;\
   *vecptr++ = RadioButtonUnchecked;\
}\
else\
{\
   *vecptr++ = RadioButtonUnchecked;\
   *vecptr++ = RadioButtonChecked;\
}

   static char  RadioButtonChecked [] = " CHECKED",
                RadioButtonUnchecked [] = "";

   int  status;
   unsigned long  FaoVector [64];
   unsigned long  *vecptr;

   /*********/
   /* begin */
   /*********/

   if (WATCHMOD (rqptr, WATCH_MOD_PROXY))
      WatchThis (WATCHITM(rqptr), WATCH_MOD_PROXY,
                 "ProxyMaintAdjustMenu()");

   vecptr = FaoVector;

   *vecptr++ = WASD_DOCTYPE;
   *vecptr++ = HtmlMetaInfo (rqptr, NULL);
   *vecptr++ = AdminWasdCss ();
   *vecptr++ = ServerHostPort;
   *vecptr++ = ADMIN_BODY_TAG;
   *vecptr++ = ServerHostPort;
   *vecptr++ = &rqptr->rqTime.BeginTime64;

   *vecptr++ = ADMIN_CONTROL_PROXY_ADJUST_NOW;

   REPBOOL (ProxyServingEnabled)
   REPBOOL (ProxyUnknownRequestFields)
   if (ProxyForwardedBy == PROXY_FORWARDED_BY)
      *vecptr++ = "BY";
   else
   if (ProxyForwardedBy == PROXY_FORWARDED_FOR)
      *vecptr++ = "FOR";
   else
      *vecptr++ = "disabled";
   if (ProxyXForwardedFor == PROXY_XFORWARDEDFOR_ENABLED)
      *vecptr++ = "ENABLED";
   else
   if (ProxyXForwardedFor == PROXY_XFORWARDEDFOR_ADDRESS)
      *vecptr++ = "ADDRESS";
   else
   if (ProxyXForwardedFor == PROXY_XFORWARDEDFOR_UNKNOWN)
      *vecptr++ = "UNKNOWN";
   else
      *vecptr++ = "disabled";
   *vecptr++ = ProxyHostLookupRetryCount;
   *vecptr++ = MetaConShowSeconds (rqptr, ProxyConnectTimeoutSeconds);
   *vecptr++ = ProxyConnectPersistMax;
   *vecptr++ = MetaConShowSeconds (rqptr, ProxyConnectPersistSeconds);

   status = FaolToNet (rqptr, ResponseFao, &FaoVector);
   if (VMSnok (status)) ErrorNoticed (rqptr, status, NULL, FI_LI);

   rqptr->rqResponse.PreExpired = PRE_EXPIRE_ADMIN;
   ResponseHeader200 (rqptr, "text/html", &rqptr->NetWriteBufferDsc);

   AdminEnd (rqptr);
}

/*****************************************************************************/
/*
*/ 

ProxyMaintControl (REQUEST_STRUCT *rqptr)

{
   BOOL  MakeChanges;
   int  status;
   unsigned short  Length;
   char  *cptr, *qptr, *sptr, *zptr;
   char  FieldName [128],
         FieldValue [256];

   /*********/
   /* begin */
   /*********/

   if (WATCHMOD (rqptr, WATCH_MOD_PROXY))
      WatchThis (WATCHITM(rqptr), WATCH_MOD_PROXY, "ProxyMaintControl()");

   MakeChanges = false;

   /**********************/
   /* parse content body */
   /**********************/

   if (rqptr->rqHeader.Method == HTTP_METHOD_POST)
   {
      if (!rqptr->rqBody.DataPtr)
      {
         /* read all the request body (special case) then AST back */
         BodyReadBegin (rqptr, &ProxyMaintControl, &BodyProcessReadAll);
         return;
      }
      qptr = rqptr->rqBody.DataPtr;
   }
   else
      qptr = rqptr->rqHeader.QueryStringPtr;

   while (*qptr)
   {
      status = StringParseQuery (&qptr, FieldName, sizeof(FieldName),
                                        FieldValue, sizeof(FieldValue));
      if (VMSnok (status))
      {
         /* error occured */
         if (status == SS$_IVCHAR) rqptr->rqResponse.HttpStatus = 400;
         rqptr->rqResponse.ErrorTextPtr = "parsing query string";
         ErrorVmsStatus (rqptr, status, FI_LI);
         AdminEnd (rqptr);
         return;
      }

      /************************/
      /* action button fields */
      /************************/

      if (strsame (FieldName, "hostname", -1))
      {
         TcpIpHostCacheSupervisor ((unsigned int)-1);
         ReportSuccess (rqptr, "Server !AZ host name cache purged.",
                        ServerHostPort);
      }
      else
      if (strsame (FieldName, "makechanges", -1))
         MakeChanges = true;
      else
      if (strsame (FieldName, "ProxyForwarded", -1))
      {
         if (TOUP(FieldValue[0]) == 'B')
            ProxyForwardedBy = PROXY_FORWARDED_BY;
         else
         if (TOUP(FieldValue[0]) == 'F')
            ProxyForwardedBy = PROXY_FORWARDED_FOR;
         else
            ProxyForwardedBy = PROXY_FORWARDED_DISABLED;
      }
      else
      if (strsame (FieldName, "ProxyXForwardedFor", -1))
      {
          if (TOUP(FieldValue[0]) == 'A')
            ProxyXForwardedFor = PROXY_XFORWARDEDFOR_ADDRESS;
          else
          if (TOUP(FieldValue[0]) == 'E')
            ProxyXForwardedFor = PROXY_XFORWARDEDFOR_ENABLED;
          else
          if (TOUP(FieldValue[0]) == 'U')
            ProxyXForwardedFor = PROXY_XFORWARDEDFOR_UNKNOWN;
          else
            ProxyXForwardedFor = PROXY_XFORWARDEDFOR_DISABLED;
      }
      else
      if (strsame (FieldName, "ProxyServingEnabled", -1))
      {
         InstanceMutexLock (INSTANCE_MUTEX_HTTPD);
         if (TOUP(FieldValue[0]) == 'E')
            ProxyServingEnabled = ProxyAccountingPtr->ServingEnabled = true;
         else
         if (TOUP(FieldValue[0]) == 'D')
            ProxyServingEnabled = ProxyAccountingPtr->ServingEnabled = false;
         InstanceMutexUnLock (INSTANCE_MUTEX_HTTPD);
      }
      else
      if (strsame (FieldName, "ProxyHostLookupRetryCount", -1))
      {
         ProxyHostLookupRetryCount = atoi(FieldValue);
         if (ProxyHostLookupRetryCount < 0 || ProxyHostLookupRetryCount > 100)
            ProxyHostLookupRetryCount = 0;
      }
      else
      if (strsame (FieldName, "ProxyConnectPersistMax", -1))
         ProxyConnectPersistMax = atoi(FieldValue);
      else
      if (strsame (FieldName, "ProxyConnectPersistSeconds", -1))
         ProxyConnectPersistSeconds = MetaConSetSeconds (NULL, FieldValue, 1);
      else
      if (strsame (FieldName, "ProxyConnectTimeoutSeconds", -1))
         ProxyConnectTimeoutSeconds = MetaConSetSeconds (NULL, FieldValue, 1);
      else
      if (strsame (FieldName, "ProxyUnknownRequestFields", -1))
      {
         if (TOUP(FieldValue[0]) == 'E')
            ProxyUnknownRequestFields = true;
         else
         if (TOUP(FieldValue[0]) == 'D')
            ProxyUnknownRequestFields = false;
      }
      else
      {
         /***********/
         /* unknown */
         /***********/

         ErrorGeneral (rqptr, "Unknown query field.", FI_LI);
         return;
      }
   }

   if (MakeChanges)
   {
      ProxyNetInit ();
      ReportSuccess (rqptr, "Server !AZ new proxy values loaded.",
                     ServerHostPort);
   }

   AdminEnd (rqptr);
}

/****************************************************************************/