[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]
/*****************************************************************************/
/*
                                 Watch.h
*/
/*****************************************************************************/

#ifndef WATCH_H_LOADED
#define WATCH_H_LOADED 1

#include "wasd.h"
#include <stdarg.h>

/**********/
/* macros */
/**********/

/*
   True should cause the compiler to include the module watch statements.
   False should cause the compile to optimize the module statements out.
   This would confer some (perhaps limited) performance benefits.
*/

/* unless otherwise specified the default for category WATCHing is AVAILABLE */
#ifndef WATCH_CAT
#  define WATCH_CAT 1
#endif
/* unless otherwise specified the default for module WATCHing is NONE */
#ifndef WATCH_MOD
#  define WATCH_MOD 0
#endif
/* cannot have WATCH_MOD without WATCH_CAT !!! */
#if WATCH_MOD
#  undef WATCH_CAT
#  define WATCH_CAT 1
#endif

/* number of decimal digits displayed for WATCH item (must be 4, 6, 8, etc.) */
#define WATCH_ITEM_DIGITS 8

/* generate a new item number */
#define WATCH_NEW_ITEM -1

/* all WATCH category/module bits set */
#define WATCH_THIS 0xffffffff

/* for the above examples will be 100, 1000, 10000, etc. &/
#define WATCH_ITEM_STREAMID ((int)(pow(10.0,((double)WATCH_ITEM_DIGITS)/2.0)))

/* watch on all occasions */
#define WATCHALL -1, FI_LI

/* test whether this is being WATCHed */
#define WATCHPNT(ptr) (ptr != NULL && (ptr)->WatchItem)

/* test whether this and category item(s) is being WATCHed */
#define WATCHING(ptr,itm) (WATCH_CAT && \
                          (ptr) != NULL && \
                          (ptr)->WatchItem && \
                          (Watch.Category & (itm)))
                          
/* test whether this and module item(s) is being WATCHed */
#define WATCHMOD(ptr,itm) (WATCH_MOD && \
                           (ptr) != NULL && \
                           (ptr)->WatchItem && \
                           ((Watch.Module & (itm)) == itm))

/* dereference the WATCH item number (Include FI_LI) */
#define WATCHITM(ptr) (ptr != NULL ? (ptr)->WatchItem : 0), FI_LI

/* watching the HTTP/2 stream */
#define WATCHING2(ptr) (WATCH_CAT && \
                        (ptr) != NULL && \
                        ((ptr)->WatchItem & WATCH_ITEM_HTTP2_FLAG))

/* watching the one (shot) request */
#define WATCHING1S(ptr) (WATCH_CAT && \
                         (ptr) != NULL && \
                         ((ptr)->WatchItem & WATCH_ITEM_ONE_SHOT_FLAG))

/* dereference the WATCH item number (Exclude FI_LI) */
#define WATCH_ITM(ptr) (ptr != NULL ? (ptr)->WatchItem : 0)

/* bit set in the item number indicates WATCHing the HTTP/2 connection */
#define WATCH_ITEM_HTTP2_FLAG   0x08000000

/* bit set in the item number indicates WATCHing the HTTP/2 connection */
#define WATCH_ITEM_ONE_SHOT_FLAG   0x10000000

/* mask off the item number from the flag bits */
#define WATCH_ITEM_NUMBER_MASK 0x00fffffff

#define WATCH_CATEGORY(itm) (WATCH_CAT && (Watch.Category & itm))
#define WATCH_MODULE(itm) (WATCH_MOD && ((Watch.Module & itm) == itm))

#define WATCH_CONNECT                   0x01
#define WATCH_REQUEST                   0x02
#define WATCH_REQUEST_BODY              0x04
#define WATCH_REQUEST_HEADER            0x08
#define WATCH_RESPONSE                 0x010
#define WATCH_RESPONSE_BODY            0x020
#define WATCH_RESPONSE_HEADER          0x040
#define WATCH_MAPPING                  0x080
#define WATCH_AUTH                    0x0100
#define WATCH_ERROR                   0x0200
#define WATCH_NETWORK                 0x0400
#define WATCH_NETWORK_OCTETS          0x0800
#define WATCH_INTERNAL               0x01000
#define WATCH_LOG                    0x02000
#define WATCH_SESOLA                 0x04000
#define WATCH_CGI                    0x08000
#define WATCH_DCL                   0x010000
#define WATCH_DECNET                0x020000
#define WATCH_FILTER                0x040000
#define WATCH_PROXY                 0x080000
#define WATCH_PROXY_REQU_HDR       0x0100000
#define WATCH_PROXY_REQU_BDY       0x0200000
#define WATCH_PROXY_RESP_HDR       0x0400000
#define WATCH_PROXY_RESP_BDY       0x0800000
#define WATCH_PROXY_REWORK        0x01000000
#define WATCH_SCRIPT              0x02000000
#define WATCH_HTTP2               0x04000000
#define WATCH_WEBDAV              0x08000000
#define WATCH_MATCH               0x10000000
#define WATCH_reserved1           0x20000000
#define WATCH_reserved2           0x40000000
#define WATCH_MODULE_FLAG         0x80000000

#define WATCH_MOD_FILE                 (0x01 | WATCH_MODULE_FLAG)
#define WATCH_MOD_CACHE                (0x02 | WATCH_MODULE_FLAG)
#define WATCH_MOD_ODS                  (0x04 | WATCH_MODULE_FLAG)
#define WATCH_MOD_REQUEST              (0x08 | WATCH_MODULE_FLAG)
#define WATCH_MOD_VM                  (0x010 | WATCH_MODULE_FLAG)
#define WATCH_MOD_SSI                 (0x020 | WATCH_MODULE_FLAG)
#define WATCH_MOD_DCL                 (0x040 | WATCH_MODULE_FLAG)
#define WATCH_MOD_DIR                 (0x080 | WATCH_MODULE_FLAG)
#define WATCH_MOD_AUTH               (0x0100 | WATCH_MODULE_FLAG)
#define WATCH_MOD_FAO                (0x0200 | WATCH_MODULE_FLAG)
#define WATCH_MOD_THROTTLE           (0x0400 | WATCH_MODULE_FLAG)
#define WATCH_MOD_INSTANCE           (0x0800 | WATCH_MODULE_FLAG)
#define WATCH_MOD_MAPURL            (0x01000 | WATCH_MODULE_FLAG)
#define WATCH_MOD_PROXY             (0x02000 | WATCH_MODULE_FLAG)
#define WATCH_MOD_NET               (0x04000 | WATCH_MODULE_FLAG)
#define WATCH_MOD_SESOLA            (0x08000 | WATCH_MODULE_FLAG)
#define WATCH_MOD_CGI              (0x010000 | WATCH_MODULE_FLAG)
#define WATCH_MOD_WEBDAV           (0x020000 | WATCH_MODULE_FLAG)
#define WATCH_MOD_HTADMIN          (0x040000 | WATCH_MODULE_FLAG)
#define WATCH_MOD_DECNET           (0x080000 | WATCH_MODULE_FLAG)
#define WATCH_MOD_UPD             (0x0100000 | WATCH_MODULE_FLAG)
#define WATCH_MOD_PUT             (0x0200000 | WATCH_MODULE_FLAG)
#define WATCH_MOD_MSG             (0x0400000 | WATCH_MODULE_FLAG)
#define WATCH_MOD_SERVICE         (0x0800000 | WATCH_MODULE_FLAG)
#define WATCH_MOD_CONFIG         (0x01000000 | WATCH_MODULE_FLAG)
#define WATCH_MOD_METACON        (0x02000000 | WATCH_MODULE_FLAG)
#define WATCH_MOD_RESPONSE       (0x04000000 | WATCH_MODULE_FLAG)
#define WATCH_MOD_BODY           (0x08000000 | WATCH_MODULE_FLAG)
#define WATCH_MOD_HTTP2          (0x10000000 | WATCH_MODULE_FLAG)
#define WATCH_MOD__DETAIL        (0x20000000 | WATCH_MODULE_FLAG)
#define WATCH_MOD__OTHER         (0x40000000 | WATCH_MODULE_FLAG)

/* reserve -1 as an easy way to use /WATCH= */
#define WATCH_ONE_SHOT_CAT        (-1)
#define WATCH_ONE_SHOT_MOD        (-1 & ~WATCH_MOD_FAO)

#define WATCH_CATEGORY_LIST_SIZE 1024
#define WATCH_FILTER_SIZE 128

/*************/
/* structure */
/*************/

typedef struct WatchEnableStruct WATCH_STRUCT;

struct WatchEnableStruct
{
   BOOL  CliEnabled,
         CliNoStartup,
         Disabled,
         DoPeek,
         DoWatch,
         EndWatch,
         FilterSet,
         FilterOutClient,
         FilterOutHttp,
         FilterOutRealm,
         FilterOutRequest,
         FilterOutService,
         FilterOutURI,
         FilterOutUser,
         HttpFilter09,
         HttpFilter10,
         HttpFilter11,
         HttpFilter2,
         StdoutOnly,
         StdoutToo;

   int  Category,
        Category2,
        ConnectNumber,
        DurationSeconds,
        ItemCount,
        ItemDigits,
        ItemPower2,
        ItemWidth,
        Module,
        Module2,
        StatusFilter;

   char  ClientFilter [WATCH_FILTER_SIZE],
         PathFilter [WATCH_FILTER_SIZE],
         RealmFilter [WATCH_FILTER_SIZE],
         RequestFilter [WATCH_FILTER_SIZE],
         ServiceFilter [WATCH_FILTER_SIZE],
         UserFilter [WATCH_FILTER_SIZE];

   STR_DSC  BufferDsc;

   /* when non-NULL WATCH has an outstanding AST */
   REQUEST_AST  AstInUse;

   REQUEST_STRUCT  *RequestPtr;
};

/***********************/
/* function prototypes */
/***********************/

void WatchAlertQuotas ();
void WatchBegin (REQUEST_STRUCT*);
void WatchBegin2 (REQUEST_STRUCT*);
void WatchBreakDetect (REQUEST_STRUCT*);
BOOL WatchCliParse (char*);
void WatchCliSettings (BOOL);
void WatchData (char*, int);
void WatchDataDump (char*, int);
void WatchDataFormatted (char*, ...);
void WatchDuration (int64*, char*, int);
void WatchEnd ();
void WatchFilterAdd (REQUEST_STRUCT*, char*);
void WatchFilterClientService (REQUEST_STRUCT*);
void WatchFilterDrop (REQUEST_STRUCT*, char*);
void WatchFilterHttpProtocol (REQUEST_STRUCT*);
void WatchFilterHttpStatus (REQUEST_STRUCT*);
void WatchFilterPathTrack (REQUEST_STRUCT*);
void WatchFilterRealmUser (REQUEST_STRUCT*);
void WatchFilterRequestHeader (REQUEST_STRUCT*);
char* WatchFunction (void*);
BOOL WatchInUse (REQUEST_STRUCT*, BOOL);
void WatchItemSize (REQUEST_STRUCT*);
void WatchNone (int);
void WatchPeek (REQUEST_STRUCT*, REQUEST_STRUCT*);
void WatchPeekNetIo (REQUEST_STRUCT*, NETIO_STRUCT*, char*);
void WatchPeekDcl (REQUEST_STRUCT*, DCL_TASK*);
void WatchPeekHttp2 (REQUEST_STRUCT*, HTTP2_STRUCT*, char*);
BOOL WatchRabbitHole (WATCH_STRUCT*, REQUEST_STRUCT*);
void WatchReport (REQUEST_STRUCT*);
void WatchReportStruct (REQUEST_STRUCT*);
void WatchReset ();
uint64 WatchRPCC (NETIO_STRUCT*, int, char*, int);
char* WatchServerQuotas (int);
void WatchServerAlertQuotas ();
int WatchSetWatch (REQUEST_STRUCT*, int);
void WatchShowCluster (REQUEST_STRUCT*);
void WatchShowEnd (REQUEST_STRUCT*);
void WatchShowProcess (REQUEST_STRUCT*, char*, char*);
void WatchShowProcessDeleteEnd (REQUEST_STRUCT*);
void WatchShowSystem (REQUEST_STRUCT*);
void WatchThis (int, char*, int, int, char*, ...);
int WatchVmWrite (struct dsc$descriptor*, REQUEST_STRUCT*);
void WatchVmZone (REQUEST_STRUCT*, ulong);
char* WatchWhatCategory (uint);
char* WatchWhatModule (uint);
void WatchWrite (void*, uint);
void WatchWriteAst (REQUEST_STRUCT*);

#endif /* WATCH_H_LOADED */

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