⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 recmgr.c

📁 linux集群服务器软件代码包
💻 C
字号:
/* $Id: recmgr.c,v 1.6 2004/11/08 09:07:51 sunjd Exp $ *//* * recmgr.c: Recovery manager client plug-in implementation *  * Copyright 2002 Intel Corporation  *  * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either *  version 2.1 of the License, or (at your option) any later version. *  * This library 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 * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA * * * This plugin is intended to provide an interface to the * apphbd so that when an application misses a heartbeat an  * external executable can be notified.  This external component * can then fork a process to restart the application, or * preform other actions when an application misses a heartbeat * (or otherwise causes the apphbd to generate an event for it). * * The plugin permits the recovery component to be separate * from the apphbd.  Thus the forking of processes and recovery * is done outside the apphbd.  The recovery component will * need to be registered with the apphbd like any other  * application. However, it should be recovered differently. * * We will probably need a special case in apphb to handle * recovery of the recovery manager.  In this implementation * the plugin (i.e. apphbd) is a client of the recovery  * manager) thus, if the recovery manager dies, the  * plugin can no longer forward recovery requests to it * until *something* restarts it. * */#include <portability.h>#include <stdio.h>#include <sys/types.h>#include <sys/stat.h>#include <unistd.h>#include <fcntl.h>#include <string.h>#include <errno.h>#include <clplumbing/cl_log.h>#include <clplumbing/cl_signal.h>#define PIL_PLUGINTYPE          APPHB_NOTIFY#define PIL_PLUGINTYPE_S        APPHB_NOTIFY_S#define PIL_PLUGIN              recmgr#define PIL_PLUGIN_S	        "recmgr"#define PIL_PLUGINLICENSE       LICENSE_LGPL#define PIL_PLUGINLICENSEURL    URL_LGPL#define DBGMIN		1#define DBGDETAIL	7int	debug = 0;/* * Make this plugin the manager for AppHBNotification * plugin types  *//* #define ENABLE_PLUGIN_MANAGER_PRIVATE */#include <pils/interface.h>#include <apphb.h>#include <apphb_notify.h>#include <recoverymgr.h>#include <clplumbing/recoverymgr_cs.h>#include <clplumbing/GSource.h>#include <clplumbing/ipc.h>/*  * use the built-in definitions for PILPluginOps  */PIL_PLUGIN_BOILERPLATE2("1.0", Debug)/*  * Locations to store info aquired during registration  */static const PILPluginImports* 	PluginImports;static PILPlugin*              	OurPlugin;static PILInterface*           	OurInterface;static void*                   	OurImports;static void*                   	interfprivate;/*  * notification plugin operations */static int our_cregister(pid_t pid, const char *appname, const char *appinst,		const char * curdir, uid_t uid, gid_t gid, void *handle);static int our_status(const char *appname, const char *appinst,		const char * curdir, pid_t pid, uid_t uid, gid_t gid, 		apphb_event_t event);static struct AppHBNotifyOps_s  recmgrops = {	our_cregister, 	our_status	};/** plug-in specific structures */typedef struct recoverymgr_client recoverymgr_client_t;/* * prototypes for internal functions *//**  * If there was any global data allocated, or file  * descriptors opened, etc. clean it up here. *  * @todo Need to destroy the wait for connection object  */static PIL_rc recmgrcloseintf(PILInterface* pi, void* pd){	recoverymgr_disconnect();	return PIL_OK;}PIL_rcPIL_PLUGIN_INIT(PILPlugin*us, const PILPluginImports* imports, void *);/** *   * Our plugin initialization and registration function * It gets called when the plugin gets loaded. */PIL_rcPIL_PLUGIN_INIT(PILPlugin*us, const PILPluginImports* imports, void *user_ptr){	PIL_rc			ret;	/*PILPluginInitFun   	fun = &PIL_PLUGIN_INIT; (void)fun; */	PluginImports = imports;	OurPlugin = us;	/* Register as a plugin */	imports->register_plugin(us, &OurPIExports);	/* Register interfaces */	ret = imports->register_interface	(	us	,	PIL_PLUGINTYPE_S	,	PIL_PLUGIN_S	, 	&recmgrops	,	recmgrcloseintf	, 	&OurInterface	, 	(void**)&OurImports	, 	interfprivate); /*TODO: do we need this?? */	return ret;}/** *  This function is called for every process that *  registers with apphbd.  It is currently not  *  used in the plugin. */static int our_cregister(pid_t pid, const char *appname, const char *appinst,		const char * curdir, uid_t uid, gid_t gid, void *handle){	return 0;}/** * This function is called on every event. * We must forward the message to the recovery manager * to let it determine how to handle it. * * @return zero on success, non-zero on error */static int our_status(const char *appname, const char *appinst,		const char * curdir, pid_t pid, uid_t uid, gid_t gid,		apphb_event_t event){	int rc;	/* attempt to connect to the recovery manager	 * We may have already connected, if so, this	 * will return an error of EEXIST.	 * This is done in case the recovery manager dies 	 * and is restarted.  This way we can make sure	 * we are connected.	 */	rc = recoverymgr_connect("apphbd","recmgr-plugin");	if (rc == EEXIST) 	{		rc = 0;		errno = 0;		}		if (rc != 0)	{		cl_perror("failed to connect to recovery manager");		return 1;		}	errno = 0;	/* we are connected, so send the message */	rc = recoverymgr_send_event(appname, appinst,			pid, uid, gid, event);	if (rc != 0)	{	   cl_perror("error sending message to recovery manager daemon");	}	return 0;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -