--- /dev/null
+/*
+ * Copyright (c) 1998,1999,2000
+ * Traakan, Inc., Los Altos, CA
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice unmodified, this list of conditions, and the following
+ * disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+/*
+ * Project: NDMJOB
+ * Ident: $Id: $
+ *
+ * Description:
+ * Miscellaneous C functions to support protocol versions.
+ * See ndmprotocol.h for explanation.
+ */
+
+
+#include "ndmos.h"
+#include "ndmprotocol.h"
+
+
+
+
+/*
+ * XDR MESSAGE TABLES
+ ****************************************************************
+ */
+
+struct ndmp_xdr_message_table *
+ndmp_xmt_lookup (int protocol_version, int msg)
+{
+ struct ndmp_xdr_message_table * table;
+ struct ndmp_xdr_message_table * ent;
+
+ switch (protocol_version) {
+ case 0:
+ table = ndmp0_xdr_message_table;
+ break;
+
+#ifndef NDMOS_OPTION_NO_NDMP2
+ case NDMP2VER:
+ table = ndmp2_xdr_message_table;
+ break;
+#endif /* !NDMOS_OPTION_NO_NDMP2 */
+
+#ifndef NDMOS_OPTION_NO_NDMP3
+ case NDMP3VER:
+ table = ndmp3_xdr_message_table;
+ break;
+#endif /* !NDMOS_OPTION_NO_NDMP3 */
+
+#ifndef NDMOS_OPTION_NO_NDMP4
+ case NDMP4VER:
+ table = ndmp4_xdr_message_table;
+ break;
+#endif /* !NDMOS_OPTION_NO_NDMP4 */
+
+ default:
+ return 0;
+ }
+
+ for (ent = table; ent->msg; ent++) {
+ if (ent->msg == msg) {
+ return ent;
+ }
+ }
+
+ return 0;
+}
+
+
+
+
+/*
+ * ENUM STRING TABLES
+ ****************************************************************
+ */
+
+char *
+ndmp_enum_to_str (int val, struct ndmp_enum_str_table *table)
+{
+ static char vbuf[8][32];
+ static int vbix;
+ char * vbp;
+
+ for (; table->name; table++)
+ if (table->value == val)
+ return table->name;
+
+ vbp = vbuf[vbix&7];
+ vbix++;
+
+ sprintf (vbp, "?0x%x?", val);
+ return vbp;
+}
+
+int
+ndmp_enum_from_str (int *valp, char *str, struct ndmp_enum_str_table *table)
+{
+ for (; table->name; table++) {
+ if (strcmp(table->name, str) == 0) {
+ *valp = table->value;
+ return 1;
+ }
+ }
+
+ return 0;
+}
+
+
+
+
+/*
+ * MULTI-VERSION ENUM TO STRING CONVERTERS
+ ****************************************************************
+ */
+
+char *
+ndmp_message_to_str (int protocol_version, int msg)
+{
+ static char yikes_buf[40]; /* non-reentrant */
+
+ switch (protocol_version) {
+ case 0: return ndmp0_message_to_str (msg);
+#ifndef NDMOS_OPTION_NO_NDMP2
+ case NDMP2VER: return ndmp2_message_to_str (msg);
+#endif /* !NDMOS_OPTION_NO_NDMP2 */
+
+#ifndef NDMOS_OPTION_NO_NDMP3
+ case NDMP3VER: return ndmp3_message_to_str (msg);
+#endif /* !NDMOS_OPTION_NO_NDMP3 */
+
+#ifndef NDMOS_OPTION_NO_NDMP4
+ case NDMP4VER: return ndmp4_message_to_str (msg);
+#endif /* !NDMOS_OPTION_NO_NDMP4 */
+
+ default: /* should never happen, if so should be rare */
+ sprintf (yikes_buf, "v%dmsg0x%04x", protocol_version, msg);
+ return yikes_buf;
+ }
+}
+
+char *
+ndmp_error_to_str (int protocol_version, int err)
+{
+ static char yikes_buf[40]; /* non-reentrant */
+
+ switch (protocol_version) {
+ case 0: return ndmp0_error_to_str (err);
+ case 9: return ndmp9_error_to_str (err);
+#ifndef NDMOS_OPTION_NO_NDMP2
+ case NDMP2VER: return ndmp2_error_to_str (err);
+#endif /* !NDMOS_OPTION_NO_NDMP2 */
+
+#ifndef NDMOS_OPTION_NO_NDMP3
+ case NDMP3VER: return ndmp3_error_to_str (err);
+#endif /* !NDMOS_OPTION_NO_NDMP3 */
+
+#ifndef NDMOS_OPTION_NO_NDMP4
+ case NDMP4VER: return ndmp4_error_to_str (err);
+#endif /* !NDMOS_OPTION_NO_NDMP4 */
+
+ default: /* should never happen, if so should be rare */
+ sprintf (yikes_buf, "v%derr%d", protocol_version, err);
+ return yikes_buf;
+ }
+}
+
+
+
+
+
+/*
+ * PRETTY PRINTERS
+ ****************************************************************
+ */
+
+int
+ndmp_pp_header (int vers, void *data, char *buf)
+{
+ switch (vers) {
+ case 0:
+ return ndmp0_pp_header (data, buf);
+
+#ifndef NDMOS_OPTION_NO_NDMP2
+ case NDMP2VER:
+ return ndmp2_pp_header (data, buf);
+#endif /* !NDMOS_OPTION_NO_NDMP2 */
+
+#ifndef NDMOS_OPTION_NO_NDMP3
+ case NDMP3VER:
+ return ndmp3_pp_header (data, buf);
+#endif /* !NDMOS_OPTION_NO_NDMP3 */
+
+#ifndef NDMOS_OPTION_NO_NDMP4
+ case NDMP4VER:
+ return ndmp4_pp_header (data, buf);
+#endif /* !NDMOS_OPTION_NO_NDMP4 */
+
+ default:
+ sprintf (buf, "V%d? ", vers);
+ return ndmp0_pp_header (data, NDMOS_API_STREND(buf));
+ }
+}
+
+int
+ndmp_pp_request (int vers, int msg, void *data, int lineno, char *buf)
+{
+ switch (vers) {
+ case 0:
+ return ndmp0_pp_request (msg, data, lineno, buf);
+
+#ifndef NDMOS_OPTION_NO_NDMP2
+ case NDMP2VER:
+ return ndmp2_pp_request (msg, data, lineno, buf);
+#endif /* !NDMOS_OPTION_NO_NDMP2 */
+
+#ifndef NDMOS_OPTION_NO_NDMP3
+ case NDMP3VER:
+ return ndmp3_pp_request (msg, data, lineno, buf);
+#endif /* !NDMOS_OPTION_NO_NDMP3 */
+
+#ifndef NDMOS_OPTION_NO_NDMP4
+ case NDMP4VER:
+ return ndmp4_pp_request (msg, data, lineno, buf);
+#endif /* !NDMOS_OPTION_NO_NDMP4 */
+
+ default:
+ sprintf (buf, "<<INVALID MSG VERS=%d>>", vers);
+ return -1;
+ }
+}
+
+int
+ndmp_pp_reply (int vers, int msg, void *data, int lineno, char *buf)
+{
+ switch (vers) {
+ case 0:
+ return ndmp0_pp_reply (msg, data, lineno, buf);
+
+#ifndef NDMOS_OPTION_NO_NDMP2
+ case NDMP2VER:
+ return ndmp2_pp_reply (msg, data, lineno, buf);
+#endif /* !NDMOS_OPTION_NO_NDMP2 */
+
+#ifndef NDMOS_OPTION_NO_NDMP3
+ case NDMP3VER:
+ return ndmp3_pp_reply (msg, data, lineno, buf);
+#endif /* !NDMOS_OPTION_NO_NDMP3 */
+
+#ifndef NDMOS_OPTION_NO_NDMP4
+ case NDMP4VER:
+ return ndmp4_pp_reply (msg, data, lineno, buf);
+#endif /* !NDMOS_OPTION_NO_NDMP4 */
+
+ default:
+ sprintf (buf, "<<INVALID MSG VERS=%d>>", vers);
+ return -1;
+ }
+}