Blame ndmp-src/ndml_nmb.c

Packit Service 392537
/*
Packit Service 392537
 * Copyright (c) 1998,1999,2000
Packit Service 392537
 *	Traakan, Inc., Los Altos, CA
Packit Service 392537
 *	All rights reserved.
Packit Service 392537
 *
Packit Service 392537
 * Redistribution and use in source and binary forms, with or without
Packit Service 392537
 * modification, are permitted provided that the following conditions
Packit Service 392537
 * are met:
Packit Service 392537
 * 1. Redistributions of source code must retain the above copyright
Packit Service 392537
 *    notice unmodified, this list of conditions, and the following
Packit Service 392537
 *    disclaimer.
Packit Service 392537
 * 2. Redistributions in binary form must reproduce the above copyright
Packit Service 392537
 *    notice, this list of conditions and the following disclaimer in the
Packit Service 392537
 *    documentation and/or other materials provided with the distribution.
Packit Service 392537
 *
Packit Service 392537
 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
Packit Service 392537
 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
Packit Service 392537
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
Packit Service 392537
 * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
Packit Service 392537
 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
Packit Service 392537
 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
Packit Service 392537
 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
Packit Service 392537
 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
Packit Service 392537
 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
Packit Service 392537
 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
Packit Service 392537
 * SUCH DAMAGE.
Packit Service 392537
 */
Packit Service 392537
Packit Service 392537
/*
Packit Service 392537
 * Project:  NDMJOB
Packit Service 392537
 * Ident:    $Id: $
Packit Service 392537
 *
Packit Service 392537
 * Description:
Packit Service 392537
 *
Packit Service 392537
 */
Packit Service 392537
Packit Service 392537
Packit Service 392537
#include "ndmlib.h"
Packit Service 392537
Packit Service 392537
Packit Service 392537
Packit Service 392537
xdrproc_t
Packit Service 392537
ndmnmb_find_xdrproc (struct ndmp_msg_buf *nmb)
Packit Service 392537
{
Packit Service 392537
	struct ndmp_xdr_message_table *	xmte;
Packit Service 392537
Packit Service 392537
	xmte = ndmp_xmt_lookup (nmb->protocol_version, nmb->header.message);
Packit Service 392537
Packit Service 392537
	if (!xmte) {
Packit Service 392537
		return 0;
Packit Service 392537
	}
Packit Service 392537
Packit Service 392537
	if (nmb->header.message_type == NDMP0_MESSAGE_REQUEST) {
Packit Service 392537
		return (xdrproc_t) xmte->xdr_request;
Packit Service 392537
	}
Packit Service 392537
Packit Service 392537
	if (nmb->header.message_type == NDMP0_MESSAGE_REPLY) {
Packit Service 392537
		return (xdrproc_t) xmte->xdr_reply;
Packit Service 392537
	}
Packit Service 392537
Packit Service 392537
	return 0;
Packit Service 392537
}
Packit Service 392537
Packit Service 392537
void
Packit Service 392537
ndmnmb_free (struct ndmp_msg_buf *nmb)
Packit Service 392537
{
Packit Service 392537
	xdrproc_t xdr_body = ndmnmb_find_xdrproc (nmb);
Packit Service 392537
Packit Service 392537
	if (nmb->flags & NDMNMB_FLAG_NO_FREE)
Packit Service 392537
		return;
Packit Service 392537
Packit Service 392537
	if (xdr_body) {
Packit Service 392537
		xdr_free (xdr_body, (void*) &nmb->body);
Packit Service 392537
	}
Packit Service 392537
}
Packit Service 392537
Packit Service 392537
void
Packit Service 392537
ndmnmb_snoop (
Packit Service 392537
  struct ndmlog *log,
Packit Service 392537
  char *tag,
Packit Service 392537
  int level,
Packit Service 392537
  struct ndmp_msg_buf *nmb,
Packit Service 392537
  char *whence)
Packit Service 392537
{
Packit Service 392537
	int		rc, nl, i;
Packit Service 392537
	char		buf[2048];
Packit Service 392537
	int		(*ndmpp)();
Packit Service 392537
	int		level5 = 5;
Packit Service 392537
	int		level6 = 6;
Packit Service 392537
Packit Service 392537
	 if (level < 6 && nmb->protocol_version == 4) {
Packit Service 392537
		ndmp4_header *header = (ndmp4_header *)&nmb->header;
Packit Service 392537
		if ((header->message_code == NDMP4_NOTIFY_DATA_HALTED &&
Packit Service 392537
		     header->error_code == NDMP4_DATA_HALT_SUCCESSFUL) ||
Packit Service 392537
		    (header->message_code == NDMP4_NOTIFY_MOVER_HALTED &&
Packit Service 392537
		     header->error_code == NDMP4_MOVER_HALT_CONNECT_CLOSED)) {
Packit Service 392537
			level = 6;
Packit Service 392537
			level5 = 0;
Packit Service 392537
			level6 = 0;
Packit Service 392537
		}
Packit Service 392537
	}
Packit Service 392537
Packit Service 392537
	if (!log || level < 5) {
Packit Service 392537
		return;
Packit Service 392537
	}
Packit Service 392537
Packit Service 392537
	rc = ndmp_pp_header (nmb->protocol_version, &nmb->header, buf);
Packit Service 392537
#if 0
Packit Service 392537
	ndmlogf (log, tag, level5, "%s %s", buf, whence);
Packit Service 392537
#else
Packit Service 392537
	{
Packit Service 392537
		char combo[3];
Packit Service 392537
Packit Service 392537
		if (*whence == 'R') {
Packit Service 392537
			combo[0] = '>';
Packit Service 392537
			combo[1] = buf[0];
Packit Service 392537
		} else {
Packit Service 392537
			combo[0] = buf[0];
Packit Service 392537
			combo[1] = '>';
Packit Service 392537
		}
Packit Service 392537
		combo[2] = 0;
Packit Service 392537
Packit Service 392537
		ndmlogf (log, tag, level5, "%s %s", combo, buf+2);
Packit Service 392537
	}
Packit Service 392537
#endif
Packit Service 392537
Packit Service 392537
	if (level < 6) {
Packit Service 392537
		return;
Packit Service 392537
	}
Packit Service 392537
	if (rc <= 0) {		/* no body */
Packit Service 392537
		return;
Packit Service 392537
	}
Packit Service 392537
Packit Service 392537
	if (nmb->header.message_type == NDMP0_MESSAGE_REQUEST) {
Packit Service 392537
		ndmpp = ndmp_pp_request;
Packit Service 392537
	} else if (nmb->header.message_type == NDMP0_MESSAGE_REPLY) {
Packit Service 392537
		ndmpp = ndmp_pp_reply;
Packit Service 392537
	} else {
Packit Service 392537
		return;		/* should not happen */
Packit Service 392537
	}
Packit Service 392537
Packit Service 392537
	nl = 1;
Packit Service 392537
	for (i = 0; i < nl; i++) {
Packit Service 392537
		nl = (*ndmpp)(nmb->protocol_version,
Packit Service 392537
			nmb->header.message, &nmb->body, i, buf);
Packit Service 392537
		if (nl == 0)
Packit Service 392537
			break;		/* no printable body (void) */
Packit Service 392537
Packit Service 392537
		ndmlogf (log, tag, level6, "   %s", buf);
Packit Service 392537
	}
Packit Service 392537
}
Packit Service 392537
Packit Service 392537
unsigned
Packit Service 392537
ndmnmb_get_reply_error_raw (struct ndmp_msg_buf *nmb)
Packit Service 392537
{
Packit Service 392537
	unsigned	protocol_version = nmb->protocol_version;
Packit Service 392537
	unsigned	msg = nmb->header.message;
Packit Service 392537
	unsigned	raw_error;
Packit Service 392537
Packit Service 392537
	if (NDMNMB_IS_UNFORTUNATE_REPLY_TYPE(protocol_version, msg)) {
Packit Service 392537
		raw_error = nmb->body.unf3_error.error;
Packit Service 392537
	} else {
Packit Service 392537
		raw_error = nmb->body.error;
Packit Service 392537
	}
Packit Service 392537
Packit Service 392537
	return raw_error;
Packit Service 392537
}
Packit Service 392537
Packit Service 392537
ndmp9_error
Packit Service 392537
ndmnmb_get_reply_error (struct ndmp_msg_buf *nmb)
Packit Service 392537
{
Packit Service 392537
	unsigned	protocol_version = nmb->protocol_version;
Packit Service 392537
	unsigned	raw_error = ndmnmb_get_reply_error_raw (nmb);
Packit Service 392537
	ndmp9_error	error;
Packit Service 392537
Packit Service 392537
	switch (protocol_version) {
Packit Service 392537
	default:
Packit Service 392537
		/* best effort */
Packit Service 392537
		error = (ndmp9_error) raw_error;
Packit Service 392537
		break;
Packit Service 392537
Packit Service 392537
#ifndef NDMOS_OPTION_NO_NDMP2
Packit Service 392537
	case NDMP2VER:
Packit Service 392537
		{
Packit Service 392537
			ndmp2_error	error2 = raw_error;
Packit Service 392537
Packit Service 392537
			ndmp_2to9_error (&error2, &error);
Packit Service 392537
		}
Packit Service 392537
		break;
Packit Service 392537
#endif /* !NDMOS_OPTION_NO_NDMP2 */
Packit Service 392537
Packit Service 392537
#ifndef NDMOS_OPTION_NO_NDMP3
Packit Service 392537
	case NDMP3VER:
Packit Service 392537
		{
Packit Service 392537
			ndmp3_error	error3 = raw_error;
Packit Service 392537
Packit Service 392537
			ndmp_3to9_error (&error3, &error);
Packit Service 392537
		}
Packit Service 392537
		break;
Packit Service 392537
#endif /* !NDMOS_OPTION_NO_NDMP3 */
Packit Service 392537
Packit Service 392537
#ifndef NDMOS_OPTION_NO_NDMP4
Packit Service 392537
	case NDMP4VER:
Packit Service 392537
		{
Packit Service 392537
			ndmp4_error	error4 = raw_error;
Packit Service 392537
Packit Service 392537
			ndmp_4to9_error (&error4, &error);
Packit Service 392537
		}
Packit Service 392537
		break;
Packit Service 392537
#endif /* !NDMOS_OPTION_NO_NDMP4 */
Packit Service 392537
	}
Packit Service 392537
Packit Service 392537
	return error;
Packit Service 392537
}
Packit Service 392537
Packit Service 392537
int
Packit Service 392537
ndmnmb_set_reply_error_raw (struct ndmp_msg_buf *nmb, unsigned raw_error)
Packit Service 392537
{
Packit Service 392537
	unsigned	protocol_version = nmb->protocol_version;
Packit Service 392537
	unsigned	msg = nmb->header.message;
Packit Service 392537
Packit Service 392537
	if (NDMNMB_IS_UNFORTUNATE_REPLY_TYPE(protocol_version, msg)) {
Packit Service 392537
		nmb->body.unf3_error.error = raw_error;
Packit Service 392537
	} else {
Packit Service 392537
		nmb->body.error = raw_error;
Packit Service 392537
	}
Packit Service 392537
Packit Service 392537
	return 0;
Packit Service 392537
}
Packit Service 392537
Packit Service 392537
int
Packit Service 392537
ndmnmb_set_reply_error (struct ndmp_msg_buf *nmb, ndmp9_error error)
Packit Service 392537
{
Packit Service 392537
	unsigned	protocol_version = nmb->protocol_version;
Packit Service 392537
	unsigned	raw_error;
Packit Service 392537
Packit Service 392537
	switch (protocol_version) {
Packit Service 392537
	default:
Packit Service 392537
		/* best effort */
Packit Service 392537
		raw_error = (unsigned) error;
Packit Service 392537
		break;
Packit Service 392537
Packit Service 392537
#ifndef NDMOS_OPTION_NO_NDMP2
Packit Service 392537
	case NDMP2VER:
Packit Service 392537
		{
Packit Service 392537
			ndmp2_error	error2;
Packit Service 392537
Packit Service 392537
			ndmp_9to2_error (&error, &error2);
Packit Service 392537
			raw_error = (unsigned) error2;
Packit Service 392537
		}
Packit Service 392537
		break;
Packit Service 392537
#endif /* !NDMOS_OPTION_NO_NDMP2 */
Packit Service 392537
Packit Service 392537
#ifndef NDMOS_OPTION_NO_NDMP3
Packit Service 392537
	case NDMP3VER:
Packit Service 392537
		{
Packit Service 392537
			ndmp3_error	error3;
Packit Service 392537
Packit Service 392537
			ndmp_9to3_error (&error, &error3);
Packit Service 392537
			raw_error = (unsigned) error3;
Packit Service 392537
		}
Packit Service 392537
		break;
Packit Service 392537
#endif /* !NDMOS_OPTION_NO_NDMP3 */
Packit Service 392537
Packit Service 392537
#ifndef NDMOS_OPTION_NO_NDMP4
Packit Service 392537
	case NDMP4VER:
Packit Service 392537
		{
Packit Service 392537
			ndmp4_error	error4;
Packit Service 392537
Packit Service 392537
			ndmp_9to4_error (&error, &error4);
Packit Service 392537
			raw_error = (unsigned) error4;
Packit Service 392537
		}
Packit Service 392537
		break;
Packit Service 392537
#endif /* !NDMOS_OPTION_NO_NDMP4 */
Packit Service 392537
	}
Packit Service 392537
Packit Service 392537
	return ndmnmb_set_reply_error_raw (nmb, raw_error);
Packit Service 392537
}