4a6822d07d6d3f9ffe6907ef5f10d11dcadd75c6willard/*
4a6822d07d6d3f9ffe6907ef5f10d11dcadd75c6willard * CDDL HEADER START
4a6822d07d6d3f9ffe6907ef5f10d11dcadd75c6willard *
4a6822d07d6d3f9ffe6907ef5f10d11dcadd75c6willard * The contents of this file are subject to the terms of the
4a6822d07d6d3f9ffe6907ef5f10d11dcadd75c6willard * Common Development and Distribution License (the "License").
4a6822d07d6d3f9ffe6907ef5f10d11dcadd75c6willard * You may not use this file except in compliance with the License.
4a6822d07d6d3f9ffe6907ef5f10d11dcadd75c6willard *
4a6822d07d6d3f9ffe6907ef5f10d11dcadd75c6willard * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
4a6822d07d6d3f9ffe6907ef5f10d11dcadd75c6willard * or http://www.opensolaris.org/os/licensing.
4a6822d07d6d3f9ffe6907ef5f10d11dcadd75c6willard * See the License for the specific language governing permissions
4a6822d07d6d3f9ffe6907ef5f10d11dcadd75c6willard * and limitations under the License.
4a6822d07d6d3f9ffe6907ef5f10d11dcadd75c6willard *
4a6822d07d6d3f9ffe6907ef5f10d11dcadd75c6willard * When distributing Covered Code, include this CDDL HEADER in each
4a6822d07d6d3f9ffe6907ef5f10d11dcadd75c6willard * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
4a6822d07d6d3f9ffe6907ef5f10d11dcadd75c6willard * If applicable, add the following below this CDDL HEADER, with the
4a6822d07d6d3f9ffe6907ef5f10d11dcadd75c6willard * fields enclosed by brackets "[]" replaced with your own identifying
4a6822d07d6d3f9ffe6907ef5f10d11dcadd75c6willard * information: Portions Copyright [yyyy] [name of copyright owner]
4a6822d07d6d3f9ffe6907ef5f10d11dcadd75c6willard *
4a6822d07d6d3f9ffe6907ef5f10d11dcadd75c6willard * CDDL HEADER END
4a6822d07d6d3f9ffe6907ef5f10d11dcadd75c6willard */
4a6822d07d6d3f9ffe6907ef5f10d11dcadd75c6willard/*
dc5982c9e1ebe3315aac975f1c4f1ad46c83c2d2Carl Chesbrough * Copyright (c) 2007, 2010, Oracle and/or its affiliates. All rights reserved.
4a6822d07d6d3f9ffe6907ef5f10d11dcadd75c6willard */
4a6822d07d6d3f9ffe6907ef5f10d11dcadd75c6willard
4a6822d07d6d3f9ffe6907ef5f10d11dcadd75c6willard/*
4a6822d07d6d3f9ffe6907ef5f10d11dcadd75c6willard * Telco-alarm library, which communicates through libpcp to set/get
4a6822d07d6d3f9ffe6907ef5f10d11dcadd75c6willard * alarms.
4a6822d07d6d3f9ffe6907ef5f10d11dcadd75c6willard */
4a6822d07d6d3f9ffe6907ef5f10d11dcadd75c6willard
4a6822d07d6d3f9ffe6907ef5f10d11dcadd75c6willard#include <stdio.h>
4a6822d07d6d3f9ffe6907ef5f10d11dcadd75c6willard#include <stdlib.h>
4a6822d07d6d3f9ffe6907ef5f10d11dcadd75c6willard#include <sys/types.h>
4a6822d07d6d3f9ffe6907ef5f10d11dcadd75c6willard#include <unistd.h>
4a6822d07d6d3f9ffe6907ef5f10d11dcadd75c6willard#include <libpcp.h>
4a6822d07d6d3f9ffe6907ef5f10d11dcadd75c6willard
4a6822d07d6d3f9ffe6907ef5f10d11dcadd75c6willard#include "tsalarm.h"
4a6822d07d6d3f9ffe6907ef5f10d11dcadd75c6willard
4a6822d07d6d3f9ffe6907ef5f10d11dcadd75c6willard/* Message Types */
4a6822d07d6d3f9ffe6907ef5f10d11dcadd75c6willard#define TSALARM_CONTROL 15
4a6822d07d6d3f9ffe6907ef5f10d11dcadd75c6willard#define TSALARM_CONTROL_R 16
4a6822d07d6d3f9ffe6907ef5f10d11dcadd75c6willard
4a6822d07d6d3f9ffe6907ef5f10d11dcadd75c6willard#define TSALARM_CHANNEL_TIMEOUT 20
4a6822d07d6d3f9ffe6907ef5f10d11dcadd75c6willard#define TSALARM_MAX_RETRIES 3
4a6822d07d6d3f9ffe6907ef5f10d11dcadd75c6willard#define TSALARM_SERVICE_NAME "SUNW,sun4v-telco-alarm"
4a6822d07d6d3f9ffe6907ef5f10d11dcadd75c6willard
4a6822d07d6d3f9ffe6907ef5f10d11dcadd75c6willardint
4a6822d07d6d3f9ffe6907ef5f10d11dcadd75c6willardtsalarm_get(uint32_t alarm_type, uint32_t *alarm_state)
4a6822d07d6d3f9ffe6907ef5f10d11dcadd75c6willard{
4a6822d07d6d3f9ffe6907ef5f10d11dcadd75c6willard int chnl_fd;
4a6822d07d6d3f9ffe6907ef5f10d11dcadd75c6willard tsalarm_req_t *req_ptr = NULL;
4a6822d07d6d3f9ffe6907ef5f10d11dcadd75c6willard tsalarm_resp_t *resp_ptr = NULL;
4a6822d07d6d3f9ffe6907ef5f10d11dcadd75c6willard pcp_msg_t send_msg;
4a6822d07d6d3f9ffe6907ef5f10d11dcadd75c6willard pcp_msg_t recv_msg;
4a6822d07d6d3f9ffe6907ef5f10d11dcadd75c6willard int rc = TSALARM_SUCCESS;
4a6822d07d6d3f9ffe6907ef5f10d11dcadd75c6willard int retries;
4a6822d07d6d3f9ffe6907ef5f10d11dcadd75c6willard
4a6822d07d6d3f9ffe6907ef5f10d11dcadd75c6willard /* initialize virtual channel */
4a6822d07d6d3f9ffe6907ef5f10d11dcadd75c6willard for (retries = 1; retries <= TSALARM_MAX_RETRIES; retries++) {
4a6822d07d6d3f9ffe6907ef5f10d11dcadd75c6willard if ((chnl_fd = pcp_init(TSALARM_SERVICE_NAME)) < 0) {
4a6822d07d6d3f9ffe6907ef5f10d11dcadd75c6willard if (retries == TSALARM_MAX_RETRIES) {
4a6822d07d6d3f9ffe6907ef5f10d11dcadd75c6willard rc = TSALARM_CHANNEL_INIT_FAILURE;
4a6822d07d6d3f9ffe6907ef5f10d11dcadd75c6willard goto cleanup;
4a6822d07d6d3f9ffe6907ef5f10d11dcadd75c6willard }
4a6822d07d6d3f9ffe6907ef5f10d11dcadd75c6willard (void) sleep(TSALARM_CHANNEL_TIMEOUT);
4a6822d07d6d3f9ffe6907ef5f10d11dcadd75c6willard } else
4a6822d07d6d3f9ffe6907ef5f10d11dcadd75c6willard break;
4a6822d07d6d3f9ffe6907ef5f10d11dcadd75c6willard }
4a6822d07d6d3f9ffe6907ef5f10d11dcadd75c6willard
4a6822d07d6d3f9ffe6907ef5f10d11dcadd75c6willard /* create request message data */
4a6822d07d6d3f9ffe6907ef5f10d11dcadd75c6willard req_ptr = malloc(sizeof (tsalarm_req_t));
4a6822d07d6d3f9ffe6907ef5f10d11dcadd75c6willard if (req_ptr == NULL) {
4a6822d07d6d3f9ffe6907ef5f10d11dcadd75c6willard rc = TSALARM_NULL_REQ_DATA;
4a6822d07d6d3f9ffe6907ef5f10d11dcadd75c6willard goto cleanup;
4a6822d07d6d3f9ffe6907ef5f10d11dcadd75c6willard }
4a6822d07d6d3f9ffe6907ef5f10d11dcadd75c6willard req_ptr->alarm_action = TSALARM_STATUS;
4a6822d07d6d3f9ffe6907ef5f10d11dcadd75c6willard req_ptr->alarm_id = alarm_type;
4a6822d07d6d3f9ffe6907ef5f10d11dcadd75c6willard
4a6822d07d6d3f9ffe6907ef5f10d11dcadd75c6willard send_msg.msg_type = TSALARM_CONTROL;
4a6822d07d6d3f9ffe6907ef5f10d11dcadd75c6willard send_msg.sub_type = NULL;
4a6822d07d6d3f9ffe6907ef5f10d11dcadd75c6willard send_msg.msg_len = sizeof (tsalarm_req_t);
4a6822d07d6d3f9ffe6907ef5f10d11dcadd75c6willard send_msg.msg_data = (uint8_t *)req_ptr;
4a6822d07d6d3f9ffe6907ef5f10d11dcadd75c6willard
4a6822d07d6d3f9ffe6907ef5f10d11dcadd75c6willard /*
4a6822d07d6d3f9ffe6907ef5f10d11dcadd75c6willard * Send the request and receive the response.
4a6822d07d6d3f9ffe6907ef5f10d11dcadd75c6willard */
4a6822d07d6d3f9ffe6907ef5f10d11dcadd75c6willard if (pcp_send_recv(chnl_fd, &send_msg, &recv_msg,
4a6822d07d6d3f9ffe6907ef5f10d11dcadd75c6willard TSALARM_CHANNEL_TIMEOUT) < 0) {
4a6822d07d6d3f9ffe6907ef5f10d11dcadd75c6willard /* we either timed out or erred; either way try again */
4a6822d07d6d3f9ffe6907ef5f10d11dcadd75c6willard (void) sleep(TSALARM_CHANNEL_TIMEOUT);
4a6822d07d6d3f9ffe6907ef5f10d11dcadd75c6willard
4a6822d07d6d3f9ffe6907ef5f10d11dcadd75c6willard if (pcp_send_recv(chnl_fd, &send_msg, &recv_msg,
4a6822d07d6d3f9ffe6907ef5f10d11dcadd75c6willard TSALARM_CHANNEL_TIMEOUT) < 0) {
4a6822d07d6d3f9ffe6907ef5f10d11dcadd75c6willard rc = TSALARM_COMM_FAILURE;
4a6822d07d6d3f9ffe6907ef5f10d11dcadd75c6willard goto cleanup;
4a6822d07d6d3f9ffe6907ef5f10d11dcadd75c6willard }
4a6822d07d6d3f9ffe6907ef5f10d11dcadd75c6willard }
4a6822d07d6d3f9ffe6907ef5f10d11dcadd75c6willard
4a6822d07d6d3f9ffe6907ef5f10d11dcadd75c6willard /*
dc5982c9e1ebe3315aac975f1c4f1ad46c83c2d2Carl Chesbrough * verify that the Alarm action has taken place
4a6822d07d6d3f9ffe6907ef5f10d11dcadd75c6willard */
dc5982c9e1ebe3315aac975f1c4f1ad46c83c2d2Carl Chesbrough if ((resp_ptr = (tsalarm_resp_t *)recv_msg.msg_data) == NULL)
4a6822d07d6d3f9ffe6907ef5f10d11dcadd75c6willard goto cleanup;
4a6822d07d6d3f9ffe6907ef5f10d11dcadd75c6willard
4a6822d07d6d3f9ffe6907ef5f10d11dcadd75c6willard /*
dc5982c9e1ebe3315aac975f1c4f1ad46c83c2d2Carl Chesbrough * validate that this data was meant for us
4a6822d07d6d3f9ffe6907ef5f10d11dcadd75c6willard */
dc5982c9e1ebe3315aac975f1c4f1ad46c83c2d2Carl Chesbrough if (recv_msg.msg_type != TSALARM_CONTROL_R) {
dc5982c9e1ebe3315aac975f1c4f1ad46c83c2d2Carl Chesbrough rc = TSALARM_UNBOUND_PACKET_RECVD;
4a6822d07d6d3f9ffe6907ef5f10d11dcadd75c6willard goto cleanup;
dc5982c9e1ebe3315aac975f1c4f1ad46c83c2d2Carl Chesbrough }
4a6822d07d6d3f9ffe6907ef5f10d11dcadd75c6willard
4a6822d07d6d3f9ffe6907ef5f10d11dcadd75c6willard if (resp_ptr->status == TSALARM_ERROR) {
4a6822d07d6d3f9ffe6907ef5f10d11dcadd75c6willard rc = TSALARM_GET_ERROR;
4a6822d07d6d3f9ffe6907ef5f10d11dcadd75c6willard goto cleanup;
4a6822d07d6d3f9ffe6907ef5f10d11dcadd75c6willard }
4a6822d07d6d3f9ffe6907ef5f10d11dcadd75c6willard
4a6822d07d6d3f9ffe6907ef5f10d11dcadd75c6willard if (resp_ptr->alarm_state == TSALARM_STATE_UNKNOWN) {
4a6822d07d6d3f9ffe6907ef5f10d11dcadd75c6willard rc = TSALARM_GET_ERROR;
4a6822d07d6d3f9ffe6907ef5f10d11dcadd75c6willard goto cleanup;
4a6822d07d6d3f9ffe6907ef5f10d11dcadd75c6willard }
4a6822d07d6d3f9ffe6907ef5f10d11dcadd75c6willard
4a6822d07d6d3f9ffe6907ef5f10d11dcadd75c6willard *alarm_state = resp_ptr->alarm_state;
4a6822d07d6d3f9ffe6907ef5f10d11dcadd75c6willard
4a6822d07d6d3f9ffe6907ef5f10d11dcadd75c6willardcleanup:
4a6822d07d6d3f9ffe6907ef5f10d11dcadd75c6willard if (req_ptr != NULL)
4a6822d07d6d3f9ffe6907ef5f10d11dcadd75c6willard free(req_ptr);
dc5982c9e1ebe3315aac975f1c4f1ad46c83c2d2Carl Chesbrough
dc5982c9e1ebe3315aac975f1c4f1ad46c83c2d2Carl Chesbrough /* free recv_msg.msg_data through pointer to make sure it is valid */
dc5982c9e1ebe3315aac975f1c4f1ad46c83c2d2Carl Chesbrough if (resp_ptr != NULL)
dc5982c9e1ebe3315aac975f1c4f1ad46c83c2d2Carl Chesbrough free(resp_ptr);
4a6822d07d6d3f9ffe6907ef5f10d11dcadd75c6willard
4a6822d07d6d3f9ffe6907ef5f10d11dcadd75c6willard /* close virtual channel fd */
4a6822d07d6d3f9ffe6907ef5f10d11dcadd75c6willard (void) pcp_close(chnl_fd);
4a6822d07d6d3f9ffe6907ef5f10d11dcadd75c6willard
4a6822d07d6d3f9ffe6907ef5f10d11dcadd75c6willard return (rc);
4a6822d07d6d3f9ffe6907ef5f10d11dcadd75c6willard}
4a6822d07d6d3f9ffe6907ef5f10d11dcadd75c6willard
4a6822d07d6d3f9ffe6907ef5f10d11dcadd75c6willardint
4a6822d07d6d3f9ffe6907ef5f10d11dcadd75c6willardtsalarm_set(uint32_t alarm_type, uint32_t alarm_state)
4a6822d07d6d3f9ffe6907ef5f10d11dcadd75c6willard{
4a6822d07d6d3f9ffe6907ef5f10d11dcadd75c6willard int chnl_fd;
4a6822d07d6d3f9ffe6907ef5f10d11dcadd75c6willard tsalarm_req_t *req_ptr = NULL;
4a6822d07d6d3f9ffe6907ef5f10d11dcadd75c6willard tsalarm_resp_t *resp_ptr = NULL;
4a6822d07d6d3f9ffe6907ef5f10d11dcadd75c6willard pcp_msg_t send_msg;
4a6822d07d6d3f9ffe6907ef5f10d11dcadd75c6willard pcp_msg_t recv_msg;
4a6822d07d6d3f9ffe6907ef5f10d11dcadd75c6willard int rc = TSALARM_SUCCESS;
4a6822d07d6d3f9ffe6907ef5f10d11dcadd75c6willard int retries;
4a6822d07d6d3f9ffe6907ef5f10d11dcadd75c6willard
4a6822d07d6d3f9ffe6907ef5f10d11dcadd75c6willard /* initialize virtual channel */
4a6822d07d6d3f9ffe6907ef5f10d11dcadd75c6willard for (retries = 1; retries <= TSALARM_MAX_RETRIES; retries++) {
4a6822d07d6d3f9ffe6907ef5f10d11dcadd75c6willard if ((chnl_fd = pcp_init(TSALARM_SERVICE_NAME)) < 0) {
4a6822d07d6d3f9ffe6907ef5f10d11dcadd75c6willard if (retries == TSALARM_MAX_RETRIES) {
4a6822d07d6d3f9ffe6907ef5f10d11dcadd75c6willard rc = TSALARM_CHANNEL_INIT_FAILURE;
4a6822d07d6d3f9ffe6907ef5f10d11dcadd75c6willard goto cleanup;
4a6822d07d6d3f9ffe6907ef5f10d11dcadd75c6willard }
4a6822d07d6d3f9ffe6907ef5f10d11dcadd75c6willard (void) sleep(TSALARM_CHANNEL_TIMEOUT);
4a6822d07d6d3f9ffe6907ef5f10d11dcadd75c6willard } else
4a6822d07d6d3f9ffe6907ef5f10d11dcadd75c6willard break;
4a6822d07d6d3f9ffe6907ef5f10d11dcadd75c6willard }
4a6822d07d6d3f9ffe6907ef5f10d11dcadd75c6willard
4a6822d07d6d3f9ffe6907ef5f10d11dcadd75c6willard /* create request message data */
4a6822d07d6d3f9ffe6907ef5f10d11dcadd75c6willard req_ptr = malloc(sizeof (tsalarm_req_t));
4a6822d07d6d3f9ffe6907ef5f10d11dcadd75c6willard if (req_ptr == NULL) {
4a6822d07d6d3f9ffe6907ef5f10d11dcadd75c6willard rc = TSALARM_NULL_REQ_DATA;
4a6822d07d6d3f9ffe6907ef5f10d11dcadd75c6willard goto cleanup;
4a6822d07d6d3f9ffe6907ef5f10d11dcadd75c6willard }
4a6822d07d6d3f9ffe6907ef5f10d11dcadd75c6willard req_ptr->alarm_id = alarm_type;
4a6822d07d6d3f9ffe6907ef5f10d11dcadd75c6willard if (alarm_state == TSALARM_STATE_ON)
4a6822d07d6d3f9ffe6907ef5f10d11dcadd75c6willard req_ptr->alarm_action = TSALARM_ENABLE;
4a6822d07d6d3f9ffe6907ef5f10d11dcadd75c6willard else if (alarm_state == TSALARM_STATE_OFF)
4a6822d07d6d3f9ffe6907ef5f10d11dcadd75c6willard req_ptr->alarm_action = TSALARM_DISABLE;
4a6822d07d6d3f9ffe6907ef5f10d11dcadd75c6willard
4a6822d07d6d3f9ffe6907ef5f10d11dcadd75c6willard send_msg.msg_type = TSALARM_CONTROL;
4a6822d07d6d3f9ffe6907ef5f10d11dcadd75c6willard send_msg.sub_type = NULL;
4a6822d07d6d3f9ffe6907ef5f10d11dcadd75c6willard send_msg.msg_len = sizeof (tsalarm_req_t);
4a6822d07d6d3f9ffe6907ef5f10d11dcadd75c6willard send_msg.msg_data = (uint8_t *)req_ptr;
4a6822d07d6d3f9ffe6907ef5f10d11dcadd75c6willard
4a6822d07d6d3f9ffe6907ef5f10d11dcadd75c6willard /*
4a6822d07d6d3f9ffe6907ef5f10d11dcadd75c6willard * Send the request and receive the response.
4a6822d07d6d3f9ffe6907ef5f10d11dcadd75c6willard */
4a6822d07d6d3f9ffe6907ef5f10d11dcadd75c6willard if (pcp_send_recv(chnl_fd, &send_msg, &recv_msg,
4a6822d07d6d3f9ffe6907ef5f10d11dcadd75c6willard TSALARM_CHANNEL_TIMEOUT) < 0) {
4a6822d07d6d3f9ffe6907ef5f10d11dcadd75c6willard /* we either timed out or erred; either way try again */
4a6822d07d6d3f9ffe6907ef5f10d11dcadd75c6willard (void) sleep(TSALARM_CHANNEL_TIMEOUT);
4a6822d07d6d3f9ffe6907ef5f10d11dcadd75c6willard
4a6822d07d6d3f9ffe6907ef5f10d11dcadd75c6willard if (pcp_send_recv(chnl_fd, &send_msg, &recv_msg,
4a6822d07d6d3f9ffe6907ef5f10d11dcadd75c6willard TSALARM_CHANNEL_TIMEOUT) < 0) {
4a6822d07d6d3f9ffe6907ef5f10d11dcadd75c6willard rc = TSALARM_COMM_FAILURE;
4a6822d07d6d3f9ffe6907ef5f10d11dcadd75c6willard goto cleanup;
4a6822d07d6d3f9ffe6907ef5f10d11dcadd75c6willard }
4a6822d07d6d3f9ffe6907ef5f10d11dcadd75c6willard }
4a6822d07d6d3f9ffe6907ef5f10d11dcadd75c6willard
4a6822d07d6d3f9ffe6907ef5f10d11dcadd75c6willard /*
dc5982c9e1ebe3315aac975f1c4f1ad46c83c2d2Carl Chesbrough * verify that the Alarm action has taken place
4a6822d07d6d3f9ffe6907ef5f10d11dcadd75c6willard */
dc5982c9e1ebe3315aac975f1c4f1ad46c83c2d2Carl Chesbrough if ((resp_ptr = (tsalarm_resp_t *)recv_msg.msg_data) == NULL)
4a6822d07d6d3f9ffe6907ef5f10d11dcadd75c6willard goto cleanup;
4a6822d07d6d3f9ffe6907ef5f10d11dcadd75c6willard
4a6822d07d6d3f9ffe6907ef5f10d11dcadd75c6willard /*
dc5982c9e1ebe3315aac975f1c4f1ad46c83c2d2Carl Chesbrough * validate that this data was meant for us
4a6822d07d6d3f9ffe6907ef5f10d11dcadd75c6willard */
dc5982c9e1ebe3315aac975f1c4f1ad46c83c2d2Carl Chesbrough if (recv_msg.msg_type != TSALARM_CONTROL_R) {
dc5982c9e1ebe3315aac975f1c4f1ad46c83c2d2Carl Chesbrough rc = TSALARM_UNBOUND_PACKET_RECVD;
4a6822d07d6d3f9ffe6907ef5f10d11dcadd75c6willard goto cleanup;
dc5982c9e1ebe3315aac975f1c4f1ad46c83c2d2Carl Chesbrough }
4a6822d07d6d3f9ffe6907ef5f10d11dcadd75c6willard
4a6822d07d6d3f9ffe6907ef5f10d11dcadd75c6willard if (resp_ptr->status == TSALARM_ERROR) {
4a6822d07d6d3f9ffe6907ef5f10d11dcadd75c6willard rc = TSALARM_SET_ERROR;
4a6822d07d6d3f9ffe6907ef5f10d11dcadd75c6willard goto cleanup;
4a6822d07d6d3f9ffe6907ef5f10d11dcadd75c6willard }
4a6822d07d6d3f9ffe6907ef5f10d11dcadd75c6willard
4a6822d07d6d3f9ffe6907ef5f10d11dcadd75c6willard /*
4a6822d07d6d3f9ffe6907ef5f10d11dcadd75c6willard * ensure the Alarm action taken is the one requested
4a6822d07d6d3f9ffe6907ef5f10d11dcadd75c6willard */
4a6822d07d6d3f9ffe6907ef5f10d11dcadd75c6willard if ((req_ptr->alarm_action == TSALARM_DISABLE) &&
4a6822d07d6d3f9ffe6907ef5f10d11dcadd75c6willard (resp_ptr->alarm_state != TSALARM_STATE_OFF)) {
4a6822d07d6d3f9ffe6907ef5f10d11dcadd75c6willard rc = TSALARM_SET_ERROR;
4a6822d07d6d3f9ffe6907ef5f10d11dcadd75c6willard goto cleanup;
4a6822d07d6d3f9ffe6907ef5f10d11dcadd75c6willard } else if ((req_ptr->alarm_action == TSALARM_ENABLE) &&
4a6822d07d6d3f9ffe6907ef5f10d11dcadd75c6willard (resp_ptr->alarm_state != TSALARM_STATE_ON)) {
4a6822d07d6d3f9ffe6907ef5f10d11dcadd75c6willard rc = TSALARM_SET_ERROR;
4a6822d07d6d3f9ffe6907ef5f10d11dcadd75c6willard goto cleanup;
4a6822d07d6d3f9ffe6907ef5f10d11dcadd75c6willard } else if (resp_ptr->alarm_state == TSALARM_STATE_UNKNOWN) {
4a6822d07d6d3f9ffe6907ef5f10d11dcadd75c6willard rc = TSALARM_SET_ERROR;
4a6822d07d6d3f9ffe6907ef5f10d11dcadd75c6willard goto cleanup;
4a6822d07d6d3f9ffe6907ef5f10d11dcadd75c6willard }
4a6822d07d6d3f9ffe6907ef5f10d11dcadd75c6willard
4a6822d07d6d3f9ffe6907ef5f10d11dcadd75c6willardcleanup:
4a6822d07d6d3f9ffe6907ef5f10d11dcadd75c6willard if (req_ptr != NULL)
4a6822d07d6d3f9ffe6907ef5f10d11dcadd75c6willard free(req_ptr);
dc5982c9e1ebe3315aac975f1c4f1ad46c83c2d2Carl Chesbrough
dc5982c9e1ebe3315aac975f1c4f1ad46c83c2d2Carl Chesbrough /* free recv_msg.msg_data through pointer to make sure it is valid */
dc5982c9e1ebe3315aac975f1c4f1ad46c83c2d2Carl Chesbrough if (resp_ptr != NULL)
dc5982c9e1ebe3315aac975f1c4f1ad46c83c2d2Carl Chesbrough free(resp_ptr);
4a6822d07d6d3f9ffe6907ef5f10d11dcadd75c6willard
4a6822d07d6d3f9ffe6907ef5f10d11dcadd75c6willard /* close virtual channel fd */
4a6822d07d6d3f9ffe6907ef5f10d11dcadd75c6willard (void) pcp_close(chnl_fd);
4a6822d07d6d3f9ffe6907ef5f10d11dcadd75c6willard
4a6822d07d6d3f9ffe6907ef5f10d11dcadd75c6willard return (rc);
4a6822d07d6d3f9ffe6907ef5f10d11dcadd75c6willard}