Imported Upstream version 3.1.0
[debian/amanda] / ndmp-src / ndmprotocol.c
diff --git a/ndmp-src/ndmprotocol.c b/ndmp-src/ndmprotocol.c
new file mode 100644 (file)
index 0000000..54c5f1d
--- /dev/null
@@ -0,0 +1,281 @@
+/*
+ * 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;
+       }
+}