|
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 |
}
|