Viewing file: vsl.h (14.33 KB) -rw-r--r-- Select action/file-type: (+) | (+) | (+) | Code (+) | Session (+) | (+) | SDB (+) | (+) | (+) | (+) | (+) | (+) |
/*- * Copyright (c) 2006 Verdens Gang AS * Copyright (c) 2006-2015 Varnish Software AS * All rights reserved. * * Author: Poul-Henning Kamp <phk@phk.freebsd.dk> * Author: Martin Blix Grydeland <martin@varnish-software.com> * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL AUTHOR OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * * This is the public API for the VSL access. * */
#ifndef VAPI_VSL_H_INCLUDED #define VAPI_VSL_H_INCLUDED
#include <stdint.h>
#include "vapi/vsl_int.h"
struct vsm;
/* * enum VSL_tag_e enumerates the SHM log tags, where the identifiers are * "SLT_" + XML tag, as defined in tbl/vsl_tags.h. Use the macro SLT__MAX * for the highest possible value of the enum. * (VSL_tag_e and SLT__MAX included from vsl_int.h) */
struct VSL_data; struct VSLQ;
struct VSLC_ptr { const uint32_t *ptr; /* Record pointer */ unsigned priv; }; /* * Use these macros to access fields of a VSLC_ptr record * (included from vsl_int.h): * * VSL_TAG(ptr) * SLT tag (enum VSL_tag_e) * * VSL_ID(ptr) * VXID * * VSL_CDATA(ptr) * Payload (as const char *) * * VSL_LEN(ptr) * Length of the payload in bytes * * VSL_CLIENT(ptr) * Non-zero if this is a client transaction * * VSL_BACKEND(ptr) * Non-zero if this is a backend transaction */
struct VSL_cursor { /* The record this cursor points to */ struct VSLC_ptr rec;
/* Private data */ const void *priv_tbl; void *priv_data; };
enum VSL_transaction_e { VSL_t_unknown, VSL_t_sess, VSL_t_req, VSL_t_bereq, VSL_t_raw, VSL_t__MAX, };
enum VSL_reason_e { VSL_r_unknown, VSL_r_http_1, VSL_r_rxreq, VSL_r_esi, VSL_r_restart, VSL_r_pass, VSL_r_fetch, VSL_r_bgfetch, VSL_r_pipe, VSL_r__MAX, };
struct VSL_transaction { unsigned level; uint32_t vxid; uint32_t vxid_parent; enum VSL_transaction_e type; enum VSL_reason_e reason; struct VSL_cursor *c; };
enum VSL_grouping_e { VSL_g_raw, VSL_g_vxid, VSL_g_request, VSL_g_session, VSL_g__MAX, };
typedef int VSLQ_dispatch_f(struct VSL_data *vsl, struct VSL_transaction * const trans[], void *priv); /* * The callback function type for use with VSLQ_Dispatch. * * Arguments: * vsl: The VSL_data context * trans[]: A NULL terminated array of pointers to VSL_transaction. * priv: The priv argument from VSL_Dispatch * * Return value: * 0: OK - continue * !=0: Makes VSLQ_Dispatch return with this return value immediatly * * Return values of the callback function should be distinct from the * values of enum vsl_status except for 0 */
typedef void VSL_tagfind_f(int tag, void *priv); /* * The callback function type for use with VSL_Glob2Tags and * VSL_List2Tags.. * * Arguments: * tag: Tag number (= enum VSL_tag_e) * priv: The priv argument */
extern const char * const VSL_tags[SLT__MAX]; /* * Tag to string array. Contains NULL for invalid tags. */
extern const unsigned VSL_tagflags[SLT__MAX]; /* * Tag flags array. * Use these macros with VSL_tagflags (included from vsl_int.h): * * VSL_tagflags[tag] & SLT_F_BINARY * Non-zero if the payload is binary data * * VSL_tagflags[tag] & SLT_F_UNSAFE * Non-zero if the payload with this tag may include * non-printable characters * * VSL_tagflags[tag] & SLT_F_UNUSED * Non-zero if this tag is reserved for future use */
int VSL_Name2Tag(const char *name, int l); /* * Convert string to tag number (= enum VSL_tag_e). Name can be a * substring from the beginning of a tag when that substring is * unique. Matching is case insensitive. * * Arguments: * name: A tag name (or substring) to match against * l: The length of name, or -1 to use strlen. * * Return values: * >=0: Tag number * -1: No tag matches * -2: Multiple tags match substring */
int VSL_Glob2Tags(const char *glob, int l, VSL_tagfind_f *func, void *priv); /* * Convert a string to multiple tag matches. The string can have * either a prefix or postfix wildcard (*) character. For each * matching tag func is called. Matching is done case insensitive. * * Arguments: * glob: The string to match * l: The length of glob. -1 to use strlen. * func: The function to call (can be NULL) * priv: An argument that will be passed to func. * * Return values: * >0: Number of times func was called for matching tags. * -1: No tag matches * -2: Multiple tags match non-glob input * -3: Syntax error */
int VSL_List2Tags(const char *list, int l, VSL_tagfind_f *func, void *priv); /* * Convert a comma-separated list of tag globs to tag * matches. Calls VSL_Glob2Tags for each comma-separated part of * list. * * Arguments: * list: The list of globs * l: The length of list. -1 to use strlen * func: The function to call (can be NULL) * priv: An argument that will be passed to func. * * Return values: * >0: Number of times func was called for matching tags. * -1: No tag matches for list element * -2: Multiple tags match non-glob list element * -3: Syntax error */
extern const char *VSLQ_grouping[VSL_g__MAX]; /* * Grouping mode to string array. */
int VSLQ_Name2Grouping(const char *name, int l); /* * Convert string to grouping (= enum VSL_grouping_e) * * Return values: * >=0: Grouping value * -1: No grouping type matches * -2: Multiple grouping types match substring */
struct VSL_data *VSL_New(void); int VSL_Arg(struct VSL_data *vsl, int opt, const char *arg); /* * Handle standard log-presenter arguments * Return: * -1 error, VSL_Error() returns diagnostic string * 0 not handled * 1 Handled. */
void VSL_Delete(struct VSL_data *vsl); /* * Delete a VSL context, freeing up the resources */
const char *VSL_Error(const struct VSL_data *vsl); /* * Return the latest error message. */
void VSL_ResetError(struct VSL_data *vsl); /* * Reset any error message. */
#define VSL_COPT_TAIL (1 << 0) #define VSL_COPT_BATCH (1 << 1) #define VSL_COPT_TAILSTOP (1 << 2) struct VSL_cursor *VSL_CursorVSM(struct VSL_data *vsl, struct vsm *vsm, unsigned options); /* * Set the cursor pointed to by cursor up as a raw cursor in the * log. Cursor points at the current log head. * * Options: * VSL_COPT_TAIL Start cursor at log tail * VSL_COPT_BATCH Return batch records * VSL_COPT_TAILSTOP Return EOF when reaching the log tail * * Return values: * non-NULL: Pointer to cursor * NULL: Error, see VSL_Error */
struct VSL_cursor *VSL_CursorFile(struct VSL_data *vsl, const char *name, unsigned options); /* * Create a cursor pointing to the beginning of the binary VSL log * in file name. If name is '-' reads from stdin. * * Options: * NONE * * Return values: * non-NULL: Pointer to cursor * NULL: Error, see VSL_Error */
void VSL_DeleteCursor(const struct VSL_cursor *c); /* * Delete the cursor pointed to by c */
enum vsl_status VSL_ResetCursor(const struct VSL_cursor *c); /* * Reset the cursor position to the head, so that the next call to * VSL_Next returns the first record. For VSM cursor, it will * point close to the head of the log, but at least 2 segments away * from the tail. * * Return values: * - vsl_end == success * - and see enum vsl_status * */
enum vsl_check { vsl_check_e_notsupp = -1, vsl_check_e_inval = 0, vsl_check_warn = 1, vsl_check_valid = 2 };
enum vsl_check VSL_Check(const struct VSL_cursor *c, const struct VSLC_ptr *ptr); /* * Check if the VSLC_ptr structure points to a value that is still * valid: * * Return values: * -1: Operation not supported * 0: Not valid * 1: Valid - warning level * 2: Valid */
enum vsl_status { vsl_e_write = -5, // Error from VSL_Write etc. vsl_e_io = -4, // I/O read error - see errno vsl_e_overrun = -3, // Overrun vsl_e_abandon = -2, // Remote abandoned or closed vsl_e_eof = -1, // End of file vsl_end = 0, // End of log/cursor vsl_more = 1 // Cursor points to next log record };
enum vsl_status VSL_Next(const struct VSL_cursor *c); /* * Return raw pointer to next VSL record. * * Return values: see enum vsl_status */
int VSL_Match(struct VSL_data *vsl, const struct VSL_cursor *c); /* * Returns true if the record pointed to by cursor matches the * record current record selectors * * Return value: * 1: Match * 0: No match */
int VSL_Print(const struct VSL_data *vsl, const struct VSL_cursor *c, void *fo); /* * Print the log record pointed to by cursor to stream. * * Format: (t=type) * 1234567890 12345678901234 1 ... * vxid tag t content * * Arguments: * vsl: The VSL_data context * c: A VSL_cursor * fo: A FILE* pointer * * Return values: * 0: OK * -5: I/O write error - see errno */
int VSL_PrintTerse(const struct VSL_data *vsl, const struct VSL_cursor *c, void *fo); /* * Print the log record pointed to by cursor to stream. * * Format: * 12345678901234 ... * tag content * * Arguments: * vsl: The VSL_data context * c: A VSL_cursor * fo: A FILE* pointer * * Return values: * 0: OK * -5: I/O write error - see errno */
int VSL_PrintAll(struct VSL_data *vsl, const struct VSL_cursor *c, void *fo); /* * Calls VSL_Next on c until c is exhausted. In turn calls * VSL_Print on all records where VSL_Match returns true. * * Arguments: * vsl: The VSL_data context * c: A VSL_cursor * fo: A FILE* pointer, stdout if NULL * * Return values: * 0: OK * !=0: Return value from either VSL_Next or VSL_Print */
VSLQ_dispatch_f VSL_PrintTransactions; /* * Prints out each transaction in the array ptrans. For * transactions of level > 0 it will print a header before the log * records. The records will for level == 0 (single records) or if * v_opt is set, be printed by VSL_Print. Else VSL_PrintTerse is * used. * * Arguments: * vsl: The VSL_data context * cp: A NULL-terminated array of VSL_cursor pointers * fo: A FILE* pointer, stdout if NULL * * Return values: * 0: OK * !=0: Return value from either VSL_Next or VSL_Print */
FILE *VSL_WriteOpen(struct VSL_data *vsl, const char *name, int append, int unbuffered); /* * Open file name for writing using the VSL_Write* functions. If * append is true, the file will be opened for appending. * * Arguments: * vsl: The VSL data context * name: The file name * append: If true, the file will be appended instead of truncated * unbuf: If true, use unbuffered mode * * Return values: * NULL: Error - see VSL_Error * non-NULL: Success */
int VSL_Write(const struct VSL_data *vsl, const struct VSL_cursor *c, void *fo); /* * Write the currect record pointed to be c to the FILE* fo * * Return values: * 0: Success * -5: I/O error - see VSL_Error */
int VSL_WriteAll(struct VSL_data *vsl, const struct VSL_cursor *c, void *fo); /* * Calls VSL_Next on c until c is exhausted. In turn calls * VSL_Write on all records where VSL_Match returns true. * * Return values: * 0: OK * !=0: Return value from either VSL_Next or VSL_Write */
VSLQ_dispatch_f VSL_WriteTransactions; /* * Write all transactions in ptrans using VSL_WriteAll * Return values: * 0: OK * !=0: Return value from either VSL_Next or VSL_Write */
struct VSLQ *VSLQ_New(struct VSL_data *vsl, struct VSL_cursor **cp, enum VSL_grouping_e grouping, const char *query); /* * Create a new query context. * * If cp is not NULL, the cursor pointed to by cp will be * transferred to the query, and *cp set to NULL. * * Arguments: * vsl: The VSL_data context * cp: Pointer to the cursor to use or NULL * grouping: VXID grouping to report on * query: Query match expression * * Return values: * non-NULL: OK * NULL: Error - see VSL_Error */
void VSLQ_Delete(struct VSLQ **pvslq); /* * Delete the query pointed to by pvslq, freeing up the resources. * * Any cursor owned by the query will be deleted. */
void VSLQ_SetCursor(struct VSLQ *vslq, struct VSL_cursor **cp); /* * Set the cursor to use. * * Any previous cursor owned by the query will be deleted. Will * call VSLQ_Flush. * * Arguments: * vslq: The VSLQ query * cp: Pointer to the cursor to use or NULL */
int VSLQ_Dispatch(struct VSLQ *vslq, VSLQ_dispatch_f *func, void *priv); /* * Process log and call func for each set matching the specified * query * * Arguments: * vslq: The VSLQ query * func: The callback function to call. Can be NULL to ignore records. * priv: An argument passed to func * * Return values: * 1: Call again * 0: No more log records available * !=0: func returned non-zero or enum vsl_status */
int VSLQ_Flush(struct VSLQ *vslq, VSLQ_dispatch_f *func, void *priv); /* * Flush any pending record sets from the query until func * (if given) returns non-zero. * * Arguments: * vslq: The VSL context * func: The callback function to call. Pass NULL to discard the * pending messages or call repeatedly until 0 is returned. * priv: An argument passed to func * * Return values: * 0: OK * !=0: The return value from func */
#endif /* VAPI_VSL_H_INCLUDED */
|