OpenSolaris_b135/cmd/rcm_daemon/common/rcm_script_impl.h

Compare this file to the similar file:
Show the results in this format:

/*
 * CDDL HEADER START
 *
 * The contents of this file are subject to the terms of the
 * Common Development and Distribution License, Version 1.0 only
 * (the "License").  You may not use this file except in compliance
 * with the License.
 *
 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
 * or http://www.opensolaris.org/os/licensing.
 * See the License for the specific language governing permissions
 * and limitations under the License.
 *
 * When distributing Covered Code, include this CDDL HEADER in each
 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
 * If applicable, add the following below this CDDL HEADER, with the
 * fields enclosed by brackets "[]" replaced with your own identifying
 * information: Portions Copyright [yyyy] [name of copyright owner]
 *
 * CDDL HEADER END
 */
/*
 * Copyright (c) 2000-2001 by Sun Microsystems, Inc.
 * All rights reserved.
 */

#ifndef _RCM_SCRIPT_IMPL_H
#define	_RCM_SCRIPT_IMPL_H

#pragma ident	"%Z%%M%	%I%	%E% SMI"

#ifdef	__cplusplus
extern "C" {
#endif

#define	TRUE	1
#define	FALSE	0

/* Minimum and maximum rcm scripting API version supported. */
#define	SCRIPT_API_MIN_VER		1
#define	SCRIPT_API_MAX_VER		1

/*
 * Default maximum time (in seconds) allocated for an rcm command
 * before SIGABRT is sent.
 */
#define	SCRIPT_CMD_TIMEOUT		60

/*
 * Maximum time (in seconds) allocated after sending SIGABRT before
 * the script is killed.
 */
#define	SCRIPT_ABORT_TIMEOUT		10

/*
 * Maximum time (in seconds) for which the rcm daemon checks whether
 * a script is killed or not after the rcm daemon kills the script.
 */
#define	SCRIPT_KILL_TIMEOUT		3

/* Maximum number of command line parameters passed to a script */
#define	MAX_ARGS			16

/* Maximum number of environment parameters passed to a script */
#define	MAX_ENV_PARAMS			64

#define	MAX_LINE_LEN			(4*1024)
#define	MAX_FLAGS_NAME_LEN		64

/* exit codes */
typedef enum {
	E_SUCCESS,
	E_FAILURE,
	E_UNSUPPORTED_CMD,
	E_REFUSE
} script_exit_codes_t;

/* This structure is used to maintain a list of current dr'ed resources */
typedef struct {
	rcm_queue_t queue;
	char *resource_name;
} drreq_t;

/*
 * Main data structure for rcm scripting. There will be one instance of
 * this structure for every rcm script. A pointer to this structure is
 * kept in module structure.
 */
typedef struct script_info {
	/*
	 * Used to maintain a queue of script_info structures
	 * Global variable script_info_q is the head of the queue.
	 */
	rcm_queue_t queue;

	rcm_queue_t drreq_q;	/* queue head for current dr'ed resources */

	module_t *module;
	rcm_handle_t *hdl;

	char *script_full_name;	/* name of the script including path */
	char *script_name;	/* name of the script without path component */

	/*
	 * file descriptors used to communicate with the script
	 * pipe1 is used to capture script's stdout
	 * pipe2 is used to capture script's stderr
	 */
	int pipe1[2];
	int pipe2[2];

	pid_t pid;		/* process id of the script process */
	thread_t tid;		/* thread id of the stderr reader thread */

	/*
	 * Lock to protect the fileds in this structure and also to protect
	 * the communication channel to the script.
	 */
	mutex_t channel_lock;

	int ver;		/* scripting api version of the script */
	int cmd;		/* current rcm scripting command */
	int cmd_timeout;	/* timeout value in seconds */
	int exit_status;	/* exit status of the script */

	/* time stamp of the script when it was last run */
	time_t lastrun;

	char *func_info_buf;
	char *func_info_buf_curptr;
	int func_info_buf_len;

	char *resource_usage_info_buf;
	char *resource_usage_info_buf_curptr;
	int resource_usage_info_buf_len;

	char *failure_reason_buf;
	char *failure_reason_buf_curptr;
	int failure_reason_buf_len;
	uint_t flags;
} script_info_t;

/*
 * script_info_t:flags
 */
#define	STDERR_THREAD_CREATED	1

#define	PARENT_END_OF_PIPE	0
#define	CHILD_END_OF_PIPE	1

#define	PS_STATE_FILE_VER	1

typedef struct state_element {
	uint32_t flags;
	uint32_t reserved;	/* for 64 bit alignment */
	/* followed by actual state element */
} state_element_t;

/*
 * state_element_t:flags
 * The following flag when set indicates that the state element is
 * currently in use. When not set indicates that the state element is free.
 */
#define	STATE_ELEMENT_IN_USE	0x1

/*
 * This structure defines the layout of state file used by rcm scripting
 */
typedef struct state_file {
	uint32_t version;
	uint32_t max_elements;	/* number of state elements */
	/* followed by an array of state elements of type state_element_t */
} state_file_t;

typedef struct state_file_descr {
	uint32_t version;
	int fd;			/* file descriptor to the state file */
	size_t element_size;	/* size of one state element */

	/*
	 * number of state elements to allocate at a time when the state file
	 * grows.
	 */
	int chunk_size;

	/*
	 * index into the state element array where the next search will
	 * begin for an empty slot.
	 */
	int index;

	/* pointer to mmapped state file */
	state_file_t *state_file;
} state_file_descr_t;

/* round up to n byte boundary. n must be power of 2 for this macro to work */
#define	RSCR_ROUNDUP(x, n)	(((x) + ((n) - 1)) & (~((n) - 1)))

typedef struct ps_state_element {
	pid_t pid;
	char script_name[MAXNAMELEN];
} ps_state_element_t;

/* maximum number of additional env variables for capacity specific stuff */
#define	MAX_CAPACITY_PARAMS	10

typedef struct capacity_descr {
	char *resource_name;
	int match_type;
	struct {
		char *nvname;
		char *envname;
	} param[MAX_CAPACITY_PARAMS];
} capacity_descr_t;

/* capacity_descr_t:match_type */
#define	MATCH_INVALID		0
#define	MATCH_EXACT		1
#define	MATCH_PREFIX		2

#ifdef	__cplusplus
}
#endif

#endif /* _RCM_SCRIPT_IMPL_H */