Imported Upstream version 3.1.0
[debian/amanda] / ndmp-src / ndma_noti_calls.c
diff --git a/ndmp-src/ndma_noti_calls.c b/ndmp-src/ndma_noti_calls.c
new file mode 100644 (file)
index 0000000..b728c8a
--- /dev/null
@@ -0,0 +1,224 @@
+/*
+ * 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:
+ *
+ */
+
+
+#include "ndmagents.h"
+
+
+#ifndef NDMOS_OPTION_NO_DATA_AGENT
+
+
+/*
+ * DATA Agent originated calls
+ ****************************************************************
+ */
+
+int
+ndma_notify_data_halted (struct ndm_session *sess)
+{
+       struct ndmconn *        conn = sess->plumb.control;
+       struct ndm_data_agent * da = &sess->data_acb;
+
+       assert (da->data_state.state == NDMP9_DATA_STATE_HALTED);
+       assert (da->data_state.halt_reason != NDMP9_DATA_HALT_NA);
+
+       NDMC_WITH_NO_REPLY(ndmp9_notify_data_halted, NDMP9VER)
+               request->reason = da->data_state.halt_reason;
+               ndma_send_to_control (sess, xa, sess->plumb.data);
+       NDMC_ENDWITH
+
+       return 0;
+}
+
+int
+ndma_notify_data_read (struct ndm_session *sess,
+  unsigned long long offset, unsigned long long length)
+{
+       struct ndmconn *        conn = sess->plumb.control;
+
+       NDMC_WITH_NO_REPLY(ndmp9_notify_data_read, NDMP9VER)
+               request->offset = offset;
+               request->length = length;
+               ndma_send_to_control (sess, xa, sess->plumb.data);
+       NDMC_ENDWITH
+
+       return 0;
+}
+
+#endif /* !NDMOS_OPTION_NO_DATA_AGENT */
+
+
+#ifndef NDMOS_OPTION_NO_TAPE_AGENT
+
+int
+ndma_notify_mover_halted (struct ndm_session *sess)
+{
+       struct ndmconn *        conn = sess->plumb.control;
+       struct ndm_tape_agent * ta = &sess->tape_acb;
+
+       assert (ta->mover_state.state == NDMP9_MOVER_STATE_HALTED);
+       assert (ta->mover_state.halt_reason != NDMP9_MOVER_HALT_NA);
+
+       NDMC_WITH_NO_REPLY(ndmp9_notify_mover_halted, NDMP9VER)
+               request->reason = ta->mover_state.halt_reason;
+               ndma_send_to_control (sess, xa, sess->plumb.tape);
+       NDMC_ENDWITH
+
+       return 0;
+}
+
+int
+ndma_notify_mover_paused (struct ndm_session *sess)
+{
+       struct ndmconn *        conn = sess->plumb.control;
+       struct ndm_tape_agent * ta = &sess->tape_acb;
+
+       assert (ta->mover_state.state == NDMP9_MOVER_STATE_PAUSED);
+       assert (ta->mover_state.pause_reason != NDMP9_MOVER_PAUSE_NA);
+
+       NDMC_WITH_NO_REPLY(ndmp9_notify_mover_paused, NDMP9VER)
+               request->reason = ta->mover_state.pause_reason;
+               request->seek_position = ta->mover_want_pos;
+               ndma_send_to_control (sess, xa, sess->plumb.tape);
+       NDMC_ENDWITH
+
+       return 0;
+}
+
+#endif /* !NDMOS_OPTION_NO_TAPE_AGENT */
+
+
+#ifndef NDMOS_EFFECT_NO_SERVER_AGENTS
+
+void
+ndma_send_logmsg (struct ndm_session *sess, ndmp9_log_type ltype,
+  struct ndmconn *from_conn,
+  char *fmt, ...)
+{
+       struct ndmconn *        conn = from_conn;
+       char                    buf[4096];
+       va_list                 ap;
+
+       va_start (ap, fmt);
+       vsnprintf (buf, sizeof(buf), fmt, ap);
+       va_end (ap);
+
+       switch (from_conn->protocol_version) {
+#ifndef NDMOS_OPTION_NO_NDMP2
+       case NDMP2VER:
+               switch (ltype) {
+               default:
+               case NDMP9_LOG_NORMAL:
+               case NDMP9_LOG_ERROR:
+               case NDMP9_LOG_WARNING:
+                   NDMC_WITH_NO_REPLY(ndmp2_log_log, NDMP2VER)
+                       request->entry = buf;
+                       ndma_send_to_control (sess, xa, from_conn);
+                   NDMC_ENDWITH
+                   break;
+
+               case NDMP9_LOG_DEBUG:
+                   NDMC_WITH_NO_REPLY(ndmp2_log_debug, NDMP2VER)
+                       request->level = NDMP2_DBG_USER_INFO;
+                       request->message = buf;
+                       ndma_send_to_control (sess, xa, from_conn);
+                   NDMC_ENDWITH
+                   break;
+               }
+           break;
+#endif /* !NDMOS_OPTION_NO_NDMP2 */
+#ifndef NDMOS_OPTION_NO_NDMP3
+       case NDMP3VER:
+           NDMC_WITH_NO_REPLY(ndmp3_log_message, NDMP3VER)
+               switch (ltype) {
+               default:
+               case NDMP9_LOG_NORMAL:
+                       request->log_type = NDMP3_LOG_NORMAL;
+                       break;
+
+               case NDMP9_LOG_DEBUG:
+                       request->log_type = NDMP3_LOG_DEBUG;
+                       break;
+
+               case NDMP9_LOG_ERROR:
+                       request->log_type = NDMP3_LOG_ERROR;
+                       break;
+
+               case NDMP9_LOG_WARNING:
+                       request->log_type = NDMP3_LOG_WARNING;
+                       break;
+               }
+               request->message_id = time(0);
+               request->entry = buf;
+               ndma_send_to_control (sess, xa, from_conn);
+           NDMC_ENDWITH
+           break;
+#endif /* !NDMOS_OPTION_NO_NDMP3 */
+#ifndef NDMOS_OPTION_NO_NDMP4
+       case NDMP4VER:
+           NDMC_WITH_POST(ndmp4_log_message, NDMP4VER)
+               switch (ltype) {
+               default:
+               case NDMP9_LOG_NORMAL:
+                       request->log_type = NDMP4_LOG_NORMAL;
+                       break;
+
+               case NDMP9_LOG_DEBUG:
+                       request->log_type = NDMP4_LOG_DEBUG;
+                       break;
+
+               case NDMP9_LOG_ERROR:
+                       request->log_type = NDMP4_LOG_ERROR;
+                       break;
+
+               case NDMP9_LOG_WARNING:
+                       request->log_type = NDMP4_LOG_WARNING;
+                       break;
+               }
+               request->message_id = time(0);
+               request->entry = buf;
+               ndma_send_to_control (sess, xa, from_conn);
+           NDMC_ENDWITH
+           break;
+#endif /* !NDMOS_OPTION_NO_NDMP4 */
+
+       default:
+               /* BOGUS */
+               break;
+       }
+}
+
+#endif /* !NDMOS_EFFECT_NO_SERVER_AGENTS */