/**************************************************************************** * * Copyright (c) 2001 Novell, Inc. All Rights Reserved. * * This program is free software; you can redistribute it and/or * modify it under the terms of version 2 of the GNU General Public License * as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, contact Novell, Inc. * * To contact Novell about this file by physical or electronic mail, you * may find current contact information at www.novell.com. * ****************************************************************************/ /* Helpers for agent implementation */ #ifndef BONGOAGENT_H #define BONGOAGENT_H #include #include #include #include #include #include #include /* FIXME: need to tweak these */ #define BONGO_QUEUE_AGENT_DEFAULT_STACK_SIZE (80 * 1024) #define BONGO_QUEUE_AGENT_MAX_CLIENTS 1024 #define BONGO_QUEUE_AGENT_MIN_THREADS 5 #define BONGO_QUEUE_AGENT_MAX_THREADS 20 #define BONGO_QUEUE_AGENT_MIN_SLEEP (5 * 60) /** Helpers for all agents **/ typedef struct _BongoAgent BongoAgent; typedef void (*BongoAgentConnectionHandler)(Connection *conn); typedef int (*BongoAgentClientHandler)(void *client, Connection *conn); typedef void (*BongoAgentClientFree)(void *client); typedef void (*BongoAgentMonitorCallback)(BongoAgent *agent); typedef enum _BongoAgentStates { BONGO_AGENT_STATE_RUNNING, BONGO_AGENT_STATE_UNLOADING, BONGO_AGENT_STATE_STOPPING, BONGO_AGENT_STATE_MAX_STATES } BongoAgentState; #define BA_STARTUP_XPL 0 #define BA_STARTUP_MSGLIB 1 #define BA_STARTUP_CONNIO 2 #define BA_STARTUP_NMAP 4 #define BA_STARTUP_LOGGER 8 #define BA_STARTUP_MSGAUTH 16 typedef struct { int interval; BongoAgentMonitorCallback callback; } BongoAgentMonitor; struct _BongoAgent { const char *name; unsigned short port; XplAtomic state; bongo_ssl_context *sslContext; unsigned char officialName[MAXEMAILNAMESIZE + 1]; int numMonitors; int maxMonitors; BongoAgentMonitor *monitors; XplThreadID monitorID; XplAtomic monitorRunning; BongoManagee *managee; }; #define BongoAgentGetState(agent) \ ((BongoAgentState)XplSafeRead((agent)->state)) #define BongoAgentSetState(agent, value) \ XplSafeWrite((agent)->state, (value)) /* Configuration file reading stuff */ typedef struct _BongoConfigItem { BongoJsonType type; char *source; void *destination; } BongoConfigItem; /* JSON represents every integral value as int, while agent configuration * structures also contain byte, short, long and time_t destinations. Keep * the actual destination width in the schema so the generic loader never * writes through an incorrectly typed or unaligned int pointer. */ typedef struct _BongoConfigIntegerDestination { void *pointer; size_t size; } BongoConfigIntegerDestination; #define BONGO_CONFIG_INT(source, destination) \ { BONGO_JSON_INT, (source), \ &(BongoConfigIntegerDestination){ (destination), sizeof(*(destination)) } } /* A leading question mark marks a schema source as optional. This lets * agents retain an in-code default while older stored configuration * documents are upgraded independently. */ #define BONGO_CONFIG_OPTIONAL_INT(source, destination) \ { BONGO_JSON_INT, "?" source, \ &(BongoConfigIntegerDestination){ (destination), sizeof(*(destination)) } } BOOL SetBongoConfigInteger(BongoConfigIntegerDestination *destination, int64_t value); BOOL ReadBongoConfiguration(BongoConfigItem *config, char *filename); BOOL ProcessBongoConfiguration(BongoConfigItem *config, BongoJsonNode *node); BOOL SetBongoConfigItem(BongoConfigItem *schema, BongoJsonNode *node); void FreeBongoConfiguration(BongoConfigItem *config); int BongoAgentInit(BongoAgent *agent, const char *agentName, const unsigned long timeOut, int startupResources); void BongoAgentHandleSignal(BongoAgent *agent, int sigtype); void BongoAgentShutdown(BongoAgent *agent); /** Helpers for Queue agents **/ Connection *BongoQueueConnectionInit(BongoAgent *agent, int queue); /* Monitor thread management */ /* Special case monitors, so we can tweak when they're called*/ void BongoAgentAddConfigMonitor(BongoAgent *agent, BongoAgentMonitorCallback configMonitor); void BongoAgentAddDiskMonitor(BongoAgent *agent, BongoAgentMonitorCallback configMonitor); void BongoAgentAddLoadMonitor(BongoAgent *agent, BongoAgentMonitorCallback configMonitor); void BongoAgentAddMonitor(BongoAgent *agent, BongoAgentMonitorCallback monitor, int interval); void BongoAgentStartMonitor(BongoAgent *agent); /* Listen on a socket, calling handler for each connection */ void BongoAgentListen(BongoAgent *agent, Connection *serverConn, BongoThreadPool *threadPool, BongoAgentConnectionHandler handler); /* Same for queue agents, calls QDONE when the handler is complete*/ void BongoQueueAgentListen(BongoAgent *agent, Connection *serverConn, BongoThreadPool *threadPool, BongoAgentConnectionHandler handler); /* Listen on a socket, call handler back with an allocated client * struct*/ void BongoAgentListenWithClientPool(BongoAgent *agent, Connection *serverConn, BongoThreadPool *threadPool, int clientSize, int maxClients, BongoAgentClientFree clientFree, BongoAgentClientHandler handler, void **memPool); /* Same for queue agents, calls QDONE when the handler is complete*/ void BongoQueueAgentListenWithClientPool(BongoAgent *agent, Connection *serverConn, BongoThreadPool *threadPool, int clientSize, BongoAgentClientFree clientFree, BongoAgentClientHandler handler, void **memPool); void BongoQueueAgentGetThreadPoolParameters(BongoAgent *agent, int *minThreads, int *maxThreads, int *minSleep); int BongoQueueAgentHandshake(Connection *conn, char *buffer, char *qID, int *envelopeLength, int *messageLength); char *BongoQueueAgentReadEnvelope(Connection *conn, char *buffer, int envelopeLength, int *Lines); /* BongoManagee Functions */ void BongoAgentShutdownFunc (BongoJsonRpcServer *server, BongoJsonRpc *rpc, int requestId, const char *method, GArray *args, void *userData); #ifndef _NO_BONGO_GLOBALS struct _BongoGlobals { char *hostname; char *hostaddr; char *postmaster; }; extern struct _BongoGlobals BongoGlobals; static BongoConfigItem GlobalConfig[] __attribute__((unused)) = { { BONGO_JSON_STRING, "o:hostname/s", &BongoGlobals.hostname }, { BONGO_JSON_STRING, "o:hostaddr/s", &BongoGlobals.hostaddr }, { BONGO_JSON_STRING, "o:postmaster/s", &BongoGlobals.postmaster }, { BONGO_JSON_NULL, NULL, NULL } }; #endif #define BONGO_ENVELOPE_NEXT(p) \ { (p) = (p) + strlen(p) + 1; \ if (*(p) == '\0') (p)++; \ } #endif