watcher.c revision cee0fb94c0d4227de0a00efc162fb2739844b641
2a9ee4116a7df31d9482821f64c837315c8e2aa0jeff.schenk * CDDL HEADER START
2a9ee4116a7df31d9482821f64c837315c8e2aa0jeff.schenk * The contents of this file are subject to the terms of the
2a9ee4116a7df31d9482821f64c837315c8e2aa0jeff.schenk * Common Development and Distribution License (the "License").
2a9ee4116a7df31d9482821f64c837315c8e2aa0jeff.schenk * You may not use this file except in compliance with the License.
2a9ee4116a7df31d9482821f64c837315c8e2aa0jeff.schenk * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
2a9ee4116a7df31d9482821f64c837315c8e2aa0jeff.schenk * See the License for the specific language governing permissions
2a9ee4116a7df31d9482821f64c837315c8e2aa0jeff.schenk * and limitations under the License.
2a9ee4116a7df31d9482821f64c837315c8e2aa0jeff.schenk * When distributing Covered Code, include this CDDL HEADER in each
2a9ee4116a7df31d9482821f64c837315c8e2aa0jeff.schenk * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
2a9ee4116a7df31d9482821f64c837315c8e2aa0jeff.schenk * If applicable, add the following below this CDDL HEADER, with the
2a9ee4116a7df31d9482821f64c837315c8e2aa0jeff.schenk * fields enclosed by brackets "[]" replaced with your own identifying
2a9ee4116a7df31d9482821f64c837315c8e2aa0jeff.schenk * information: Portions Copyright [yyyy] [name of copyright owner]
2a9ee4116a7df31d9482821f64c837315c8e2aa0jeff.schenk * CDDL HEADER END
2a9ee4116a7df31d9482821f64c837315c8e2aa0jeff.schenk * Copyright 2008 Sun Microsystems, Inc. All rights reserved.
2a9ee4116a7df31d9482821f64c837315c8e2aa0jeff.schenk * Use is subject to license terms.
2a9ee4116a7df31d9482821f64c837315c8e2aa0jeff.schenk * wcr_free_DM_LM
2a9ee4116a7df31d9482821f64c837315c8e2aa0jeff.schenk * Parameters:
2a9ee4116a7df31d9482821f64c837315c8e2aa0jeff.schenk * - DM_LM : ptr to wcr_DM_LM_t
2a9ee4116a7df31d9482821f64c837315c8e2aa0jeff.schenk * Free's memory inside a wcr_DM_LM_t
2a9ee4116a7df31d9482821f64c837315c8e2aa0jeff.schenk * sets ptrs = NULL
2a9ee4116a7df31d9482821f64c837315c8e2aa0jeff.schenk * caller should free struct itself if desired
2a9ee4116a7df31d9482821f64c837315c8e2aa0jeff.schenk * Return Values:
2a9ee4116a7df31d9482821f64c837315c8e2aa0jeff.schenk * wcr_alloc_DM_LM
2a9ee4116a7df31d9482821f64c837315c8e2aa0jeff.schenk * Parameters:
2a9ee4116a7df31d9482821f64c837315c8e2aa0jeff.schenk * allocate a new wcr_DM_LM_t struct
2a9ee4116a7df31d9482821f64c837315c8e2aa0jeff.schenk * initialize all pointers
2a9ee4116a7df31d9482821f64c837315c8e2aa0jeff.schenk * Return Values:
2a9ee4116a7df31d9482821f64c837315c8e2aa0jeff.schenk * NULL : if alloc failed
2a9ee4116a7df31d9482821f64c837315c8e2aa0jeff.schenk * ptr to new wcr_DM_LM_t : if alloc is successful
2a9ee4116a7df31d9482821f64c837315c8e2aa0jeff.schenk "Unable to mallor wcr_DM_LM_t: %s",
2a9ee4116a7df31d9482821f64c837315c8e2aa0jeff.schenk /* Initialize pointers */
2a9ee4116a7df31d9482821f64c837315c8e2aa0jeff.schenk * wcr_ssi_is_running()
2a9ee4116a7df31d9482821f64c837315c8e2aa0jeff.schenk * checks to see if ssi process (prog) with owner (user) is running
2a9ee4116a7df31d9482821f64c837315c8e2aa0jeff.schenk * returns true if the process is running, false if it is not.
2a9ee4116a7df31d9482821f64c837315c8e2aa0jeff.schenk * passes back the pid of the running process
2a9ee4116a7df31d9482821f64c837315c8e2aa0jeff.schenkwcr_ssi_is_running(char *prog, int *pid, int ssi_port)
2a9ee4116a7df31d9482821f64c837315c8e2aa0jeff.schenk "wcr_ssi_is_running: "
2a9ee4116a7df31d9482821f64c837315c8e2aa0jeff.schenk "check if %s is running on port %d",
2a9ee4116a7df31d9482821f64c837315c8e2aa0jeff.schenk mms_trace(MMS_ERR, "opendir failure: %s\n", strerror(errno));
2a9ee4116a7df31d9482821f64c837315c8e2aa0jeff.schenk /* Look for the ssi process psinfo file */
2a9ee4116a7df31d9482821f64c837315c8e2aa0jeff.schenk /* ssi found, get the ssi's port */
2a9ee4116a7df31d9482821f64c837315c8e2aa0jeff.schenk for (i = 0; i < 2; i++)
2a9ee4116a7df31d9482821f64c837315c8e2aa0jeff.schenk /* ssi wasn't found running on the port */
2a9ee4116a7df31d9482821f64c837315c8e2aa0jeff.schenk "didn't find a ssi running");
2a9ee4116a7df31d9482821f64c837315c8e2aa0jeff.schenk * Initialize message logging.
2a9ee4116a7df31d9482821f64c837315c8e2aa0jeff.schenk if (mms_trace_open(WCR_TRACE_FILE, MMS_ID_WCR, wcr_debug, -1, 1, 1)) {
2a9ee4116a7df31d9482821f64c837315c8e2aa0jeff.schenk mms_trace(MMS_NOTICE, "Unable to open mms_trace file \"%s\"",
2a9ee4116a7df31d9482821f64c837315c8e2aa0jeff.schenk * wcr_init_wka()
2a9ee4116a7df31d9482821f64c837315c8e2aa0jeff.schenk * -Initializes the watcher's work area.
2a9ee4116a7df31d9482821f64c837315c8e2aa0jeff.schenk * -Creates 2 lists, 1 list of wcr_dev type
2a9ee4116a7df31d9482821f64c837315c8e2aa0jeff.schenk * and 1 list of wcr_wka_DM_LM type
2a9ee4116a7df31d9482821f64c837315c8e2aa0jeff.schenk * -Saves the first device ordinal
2a9ee4116a7df31d9482821f64c837315c8e2aa0jeff.schenk * -Saves the host name of this watcher's host
2a9ee4116a7df31d9482821f64c837315c8e2aa0jeff.schenk mms_list_create(&wka->wcr_wka_DM_LM_list, sizeof (wcr_DM_LM_t),
2a9ee4116a7df31d9482821f64c837315c8e2aa0jeff.schenk mms_list_create(&wka->wcr_old_DM_LM_list, sizeof (wcr_DM_LM_t),
2a9ee4116a7df31d9482821f64c837315c8e2aa0jeff.schenk mms_list_create(&wka->wcr_events, sizeof (wcr_event_t),
2a9ee4116a7df31d9482821f64c837315c8e2aa0jeff.schenk mms_list_create(&wka->wcr_net_LM_list, sizeof (wcr_net_LM_t),
2a9ee4116a7df31d9482821f64c837315c8e2aa0jeff.schenk wka->wcr_wka_next_ordinal = WCR_FIRST_DEV_ORDINAL;
2a9ee4116a7df31d9482821f64c837315c8e2aa0jeff.schenk gethostname(wka->wcr_host_name, MAXHOSTNAMELEN);
2a9ee4116a7df31d9482821f64c837315c8e2aa0jeff.schenkwcr_net_cfg_free(mms_network_cfg_t *net_cfg, mms_list_t **mm_list)
2a9ee4116a7df31d9482821f64c837315c8e2aa0jeff.schenk (void) memset(net_cfg, 0, sizeof (mms_network_cfg_t));
2a9ee4116a7df31d9482821f64c837315c8e2aa0jeff.schenk * Read watcher network configuration file
2a9ee4116a7df31d9482821f64c837315c8e2aa0jeff.schenkwcr_net_cfg_read(mms_network_cfg_t *net_cfg, mms_list_t **mm_list)
2a9ee4116a7df31d9482821f64c837315c8e2aa0jeff.schenk if (mms_net_cfg_service(net_cfg, "watcher", "MMP", "1.0")) {
2a9ee4116a7df31d9482821f64c837315c8e2aa0jeff.schenk *mm_list = (mms_list_t *)calloc(1, sizeof (mms_list_t));
2a9ee4116a7df31d9482821f64c837315c8e2aa0jeff.schenk while (p != NULL) {
2a9ee4116a7df31d9482821f64c837315c8e2aa0jeff.schenk mms_trace(MMS_DEVP, "mm host %s port %s", p, net_cfg->cli_port);
2a9ee4116a7df31d9482821f64c837315c8e2aa0jeff.schenk (void) snprintf(mm->wcr_mm_host, MAXHOSTNAMELEN, "%s", p);
2a9ee4116a7df31d9482821f64c837315c8e2aa0jeff.schenk * Initialize the watcher
2a9ee4116a7df31d9482821f64c837315c8e2aa0jeff.schenk * This requires that the driver dmd must have been properly installed.
2a9ee4116a7df31d9482821f64c837315c8e2aa0jeff.schenk * The config file dmd.conf has only one entry for instance 0.
2a9ee4116a7df31d9482821f64c837315c8e2aa0jeff.schenk * -Makes call to initialize the watcher's workarea
2a9ee4116a7df31d9482821f64c837315c8e2aa0jeff.schenk * -Fork and exit from parent to become daemon
2a9ee4116a7df31d9482821f64c837315c8e2aa0jeff.schenk * -Fill in wka_net_cfg struct with values from watcher's
2a9ee4116a7df31d9482821f64c837315c8e2aa0jeff.schenk * network config file
2a9ee4116a7df31d9482821f64c837315c8e2aa0jeff.schenk * -Open the watcher device
2a9ee4116a7df31d9482821f64c837315c8e2aa0jeff.schenk * Init work area
2a9ee4116a7df31d9482821f64c837315c8e2aa0jeff.schenk * Init message logging
2a9ee4116a7df31d9482821f64c837315c8e2aa0jeff.schenk mms_trace(MMS_ERR, "core setup %s", strerror(errno));
2a9ee4116a7df31d9482821f64c837315c8e2aa0jeff.schenk /* Check to see how many core files exist */
2a9ee4116a7df31d9482821f64c837315c8e2aa0jeff.schenk "wcr_init_watcher: mms_man_cores failed %s",
2a9ee4116a7df31d9482821f64c837315c8e2aa0jeff.schenk * Read config before becoming smf daemon
2a9ee4116a7df31d9482821f64c837315c8e2aa0jeff.schenk if (wcr_net_cfg_read(&wka->wcr_wka_net_cfg, &wka->wcr_wka_MM_list)) {
2a9ee4116a7df31d9482821f64c837315c8e2aa0jeff.schenk mms_trace(MMS_ERR, "Read network configuration failed");
2a9ee4116a7df31d9482821f64c837315c8e2aa0jeff.schenk * Become a smf daemon
2a9ee4116a7df31d9482821f64c837315c8e2aa0jeff.schenk * Parent process
2a9ee4116a7df31d9482821f64c837315c8e2aa0jeff.schenk mms_trace(MMS_ERR, "fork - %s\n", strerror(errno));
2a9ee4116a7df31d9482821f64c837315c8e2aa0jeff.schenk /* Successfully forked, parent exits */
2a9ee4116a7df31d9482821f64c837315c8e2aa0jeff.schenk * Close all opened files except mms_trace
2a9ee4116a7df31d9482821f64c837315c8e2aa0jeff.schenk for (i = 0; i < OPEN_MAX; i++) {
2a9ee4116a7df31d9482821f64c837315c8e2aa0jeff.schenk * Become session leader
2a9ee4116a7df31d9482821f64c837315c8e2aa0jeff.schenk * Clear file mode create mask
2a9ee4116a7df31d9482821f64c837315c8e2aa0jeff.schenk * Open the watcher device
2a9ee4116a7df31d9482821f64c837315c8e2aa0jeff.schenk mms_trace(MMS_ERR, "A watcher is already active");
2a9ee4116a7df31d9482821f64c837315c8e2aa0jeff.schenk mms_trace(MMS_ERR, "Unable to open watcher device: %s",
2a9ee4116a7df31d9482821f64c837315c8e2aa0jeff.schenk if (mms_ssl_client(&wka->wcr_wka_net_cfg, &wka->wcr_ssl_data, &err)) {
2a9ee4116a7df31d9482821f64c837315c8e2aa0jeff.schenk#endif /* MMS_OPENSSL */
2a9ee4116a7df31d9482821f64c837315c8e2aa0jeff.schenk * Initiate a session with MMS
2a9ee4116a7df31d9482821f64c837315c8e2aa0jeff.schenk * -Use mms_mmconnect to connect a mm from a mm list
2a9ee4116a7df31d9482821f64c837315c8e2aa0jeff.schenk * -Store the file descriptor
2a9ee4116a7df31d9482821f64c837315c8e2aa0jeff.schenk /* Get first mm from list */
2a9ee4116a7df31d9482821f64c837315c8e2aa0jeff.schenk (mm = mms_list_head(wka->wcr_wka_MM_list)) == NULL ||
2a9ee4116a7df31d9482821f64c837315c8e2aa0jeff.schenk /* Connect to MM */
2a9ee4116a7df31d9482821f64c837315c8e2aa0jeff.schenk wka->wcr_wka_net_cfg.cli_host = mm->wcr_mm_host;
2a9ee4116a7df31d9482821f64c837315c8e2aa0jeff.schenk mms_get_error_string(&wka->wcr_mms_conn.mms_err,
2a9ee4116a7df31d9482821f64c837315c8e2aa0jeff.schenk "to %s MM: (%d) %s",
2a9ee4116a7df31d9482821f64c837315c8e2aa0jeff.schenk /* Get next mm from list */
2a9ee4116a7df31d9482821f64c837315c8e2aa0jeff.schenk /* Reached end of mm list, start over */
2a9ee4116a7df31d9482821f64c837315c8e2aa0jeff.schenk strcpy(wka->wcr_mm_host, wka->wcr_wka_net_cfg.cli_host);
2a9ee4116a7df31d9482821f64c837315c8e2aa0jeff.schenk/* LINTED: wka may be used in the future */
2a9ee4116a7df31d9482821f64c837315c8e2aa0jeff.schenkwcr_build_struct(mms_par_node_t *attr, wcr_DM_LM_t *DM_LM_dev, wcr_wka_t *wka)
2a9ee4116a7df31d9482821f64c837315c8e2aa0jeff.schenk /* mms_trace(MMS_NOTICE,"*SET DMName*\n"); */
2a9ee4116a7df31d9482821f64c837315c8e2aa0jeff.schenk /* mms_trace(MMS_NOTICE, "*SET DriveName*\n"); */
2a9ee4116a7df31d9482821f64c837315c8e2aa0jeff.schenk /* mms_trace(MMS_NOTICE, "*SET Hostname*\n"); */
2a9ee4116a7df31d9482821f64c837315c8e2aa0jeff.schenk /* mms_trace(MMS_NOTICE, "*SET Path*\n"); */
2a9ee4116a7df31d9482821f64c837315c8e2aa0jeff.schenk /* mms_trace(MMS_NOTICE, "*SET DMDisabled*\n"); */
2a9ee4116a7df31d9482821f64c837315c8e2aa0jeff.schenk /* mms_trace(MMS_NOTICE, "*SET LMName*\n"); */
2a9ee4116a7df31d9482821f64c837315c8e2aa0jeff.schenk /* mms_trace(MMS_NOTICE, "*SET Hostname*\n"); */
2a9ee4116a7df31d9482821f64c837315c8e2aa0jeff.schenk /* mms_trace(MMS_NOTICE, "*SET LibraryName*\n"); */
2a9ee4116a7df31d9482821f64c837315c8e2aa0jeff.schenk /* mms_trace(MMS_NOTICE, "*SET LMDisabled*\n"); */
2a9ee4116a7df31d9482821f64c837315c8e2aa0jeff.schenk * wcr_attrlist()
2a9ee4116a7df31d9482821f64c837315c8e2aa0jeff.schenk * -This function takes a parsed node tree of the attrlist portion of a
2a9ee4116a7df31d9482821f64c837315c8e2aa0jeff.schenk * resonse from MM and adds the correct struct obj to the
2a9ee4116a7df31d9482821f64c837315c8e2aa0jeff.schenk * wcr_wka_DM_LM_list in the watcher work area
2a9ee4116a7df31d9482821f64c837315c8e2aa0jeff.schenkwcr_attrlist(mms_par_node_t *cmd, wcr_wka_t *wka)
2a9ee4116a7df31d9482821f64c837315c8e2aa0jeff.schenk for (text = mms_pn_lookup(cmd, "text", MMS_PN_CLAUSE, &tw);
2a9ee4116a7df31d9482821f64c837315c8e2aa0jeff.schenk text = mms_pn_lookup(cmd, "text", MMS_PN_CLAUSE, &tw)) {
2a9ee4116a7df31d9482821f64c837315c8e2aa0jeff.schenk /* Create a new list node */
2a9ee4116a7df31d9482821f64c837315c8e2aa0jeff.schenk "Unable to mallor wcr_DM_LM_t: %s",
int rc;
if (rc) {
return (MMS_ERROR);
return (rc);
for (i = 0; i < level; i++) {
* -files are named by the instance name followed by "_cfg.xml"
* (ex. dm1_cfg.xml)
if (welcome) {
* -files are named by the instance name followed by "_cfg.xml"
* (ex. lm1_cfg.xml)
if (welcome) {
int debug = 0;
if (debug) {
MMS_PN_CLAUSE, 0);
if (arg) {
if (debug) {
&work))) {
if (debug) {
NULL,
&work))) {
if (debug) {
&work)) {
if (debug) {
NULL,
&work))) {
if (debug) {
&work))) {
if (debug) {
int len;
int rc;
return (NULL);
while (go) {
return (NULL);
if (rc) {
return (NULL);
== NULL) {
return (NULL);
go = 0;
return (rsp);
int num_dev = 0;
num_dev ++;
cur_net_LM) {
net_LM);
== NULL) {
int rc;
if (rc) {
if (cur_lmname)
if (cur_libraryip)
if (cur_acslsport)
if (cur_ssiport)
if (cur_lmname)
if (cur_libraryip)
if (cur_acslsport)
if (cur_ssiport)
int rc;
goto prefork_error;
CT_PR_EV_HWERR)) {
goto prefork_error;
goto prefork_error;
goto prefork_error;
goto prefork_error;
int rc;
int rc;
int fd;
cfg_name, (char *)0)) {
cmd_name);
cfg_name, (char *)0)) {
cmd_name);
int proc;
int ssi_port = 0;
ssi_path);
/* Pass the port number as an argument to t_ssi.sh */
if (ssi_port == 0) {
ssi_path);
ssi_path);
cmd_name);
lm_name);
exit(0);
int printone = 0;
if (!printone) {
int number_of_dev = 0;
int match = 0;
int use = 0;
number_of_dev ++;
match = 0;
if (i == LM_DM->
if (!match) {
use = i;
return (use);
int rc;
int found;
int disabled;
if (rc) {
found = 0;
disabled = 0;
value) {
int rc;
if (cur_LM_DM->
num_dev) < 0) {
num_dev);
= num_dev;
int changed = 0;
return (changed);
int rc;
int changed = 0;
old_name);
if (rc) {
tw = 0;
&work);
&work)) {
if (changed) {
if (DM_LM_dev) {
int rc;
if (rc) {
return (MMS_ERROR);
return (rc);
int rc;
level);
int rc;
int rc;
int status;
} else if (pid == 0) {
if (new_LM_DM->
int rc;
if (rc) {
object);
int found_not_done = 0;
int remove;
while (go) {
remove = 0;
if (remove) {
} else { go = 0; }
return (found_not_done);
sizeof (mms_network_cfg_t));
int rc;
if (rc) {
goto cleanup;
goto cleanup;
int found;
int rc;
int mm_changed;
goto cleanup;
found = 0;
LM_DM);
if (mm_changed) {
goto cleanup;
goto cleanup;
rc = 0;
return (rc);
int rc = 0;
} while (rc);
int rc;
while (go) {
if (rc > 0) {
#ifdef MMS_OPENSSL