Merge branch 'master' into squeeze
[debian/amanda] / ndmp-src / ndma_data_fh.c
diff --git a/ndmp-src/ndma_data_fh.c b/ndmp-src/ndma_data_fh.c
new file mode 100644 (file)
index 0000000..f1a4c48
--- /dev/null
@@ -0,0 +1,214 @@
+/*
+ * 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
+
+
+/*
+ * Initialization and Cleanup
+ ****************************************************************
+ */
+
+/* Initialize -- Set data structure to know value, ignore current value */
+int
+ndmda_fh_initialize (struct ndm_session *sess)
+{
+       struct ndm_data_agent * da = &sess->data_acb;
+       struct ndmfhheap *      fhh = &da->fhh;
+
+       ndmfhh_initialize (fhh);
+
+       return 0;
+}
+
+/* Commission -- Get agent ready. Entire session has been initialize()d */
+int
+ndmda_fh_commission (struct ndm_session *sess)
+{
+       struct ndm_data_agent * da = &sess->data_acb;
+       struct ndmfhheap *      fhh = &da->fhh;
+
+       ndmfhh_commission (fhh, &da->fhh_buf, sizeof da->fhh_buf);
+
+       return 0;
+}
+
+/* Decommission -- Discard agent */
+int
+ndmda_fh_decommission (struct ndm_session *sess)
+{
+       return 0;
+}
+
+/* Belay -- Cancel partially issued activation/start */
+int
+ndmda_fh_belay (struct ndm_session *sess)
+{
+       return 0;
+}
+
+
+
+
+/*
+ * Semantic actions -- called from ndmda_XXX() butype formatters
+ ****************************************************************
+ */
+
+void
+ndmda_fh_add_file (struct ndm_session *sess,
+  ndmp9_file_stat *filestat, char *name)
+{
+       struct ndm_data_agent * da = &sess->data_acb;
+       int                     nlen = strlen (name) + 1;
+       ndmp9_file *            file9;
+       int                     rc;
+
+       rc = ndmda_fh_prepare (sess, NDMP9VER, NDMP9_FH_ADD_FILE,
+                       sizeof (ndmp9_file), 1, nlen);
+
+       if (rc != NDMFHH_RET_OK)
+               return;
+
+       file9 = ndmfhh_add_entry (&da->fhh);
+       file9->fstat = *filestat;
+       file9->unix_path = ndmfhh_save_item (&da->fhh, name, nlen);
+}
+
+void
+ndmda_fh_add_dir (struct ndm_session *sess,
+  unsigned long long dir_fileno, char *name, unsigned long long fileno)
+{
+       struct ndm_data_agent * da = &sess->data_acb;
+       int                     nlen = strlen (name) + 1;
+       ndmp9_dir *             dir9;
+       int                     rc;
+
+       rc = ndmda_fh_prepare (sess, NDMP9VER, NDMP9_FH_ADD_DIR,
+                       sizeof (ndmp9_dir), 1, nlen);
+
+       if (rc != NDMFHH_RET_OK)
+               return;
+
+       dir9 = ndmfhh_add_entry (&da->fhh);
+       dir9->unix_name = ndmfhh_save_item (&da->fhh, name, nlen);
+       dir9->parent = dir_fileno;
+       dir9->node = fileno;
+}
+
+void
+ndmda_fh_add_node (struct ndm_session *sess, ndmp9_file_stat *filestat)
+{
+       struct ndm_data_agent * da = &sess->data_acb;
+       ndmp9_node *            node9;
+       int                     rc;
+
+       rc = ndmda_fh_prepare (sess, NDMP9VER, NDMP9_FH_ADD_NODE,
+                       sizeof (ndmp9_node), 1, 0);
+
+       if (rc != NDMFHH_RET_OK)
+               return;
+
+       node9 = ndmfhh_add_entry (&da->fhh);
+       node9->fstat = *filestat;
+}
+
+
+
+
+/*
+ * Helpers -- prepare/flush
+ ****************************************************************
+ */
+
+int
+ndmda_fh_prepare (struct ndm_session *sess,
+  int vers, int msg, int entry_size,
+  unsigned n_item, unsigned total_size_of_items)
+{
+       struct ndm_data_agent * da = &sess->data_acb;
+       struct ndmfhheap *      fhh = &da->fhh;
+       int                     fhtype = (vers<<16) + msg;
+       int                     rc;
+
+       rc = ndmfhh_prepare (fhh, fhtype, entry_size,
+                               n_item, total_size_of_items);
+
+       if (rc == NDMFHH_RET_OK)
+               return NDMFHH_RET_OK;
+
+       ndmda_fh_flush (sess);
+
+       rc = ndmfhh_prepare (fhh, fhtype, entry_size,
+                               n_item, total_size_of_items);
+
+       return rc;
+}
+
+void
+ndmda_fh_flush (struct ndm_session *sess)
+{
+       struct ndm_data_agent * da = &sess->data_acb;
+       struct ndmfhheap *      fhh = &da->fhh;
+       int                     rc;
+       int                     fhtype;
+       void *                  table;
+       unsigned                n_entry;
+
+       rc = ndmfhh_get_table (fhh, &fhtype, &table, &n_entry);
+       if (rc == NDMFHH_RET_OK && n_entry > 0) {
+               struct ndmp_xa_buf      xa;
+               struct ndmfhh_generic_table *request;
+
+               request = (void *) &xa.request.body;
+               NDMOS_MACRO_ZEROFILL (&xa);
+
+               xa.request.protocol_version = fhtype >> 16;
+               xa.request.header.message = fhtype & 0xFFFF;
+
+               request->table_len = n_entry;
+               request->table_val = table;
+
+               ndma_send_to_control (sess, &xa, sess->plumb.data);
+       }
+
+       ndmfhh_reset (fhh);
+}
+
+#endif /* !NDMOS_OPTION_NO_DATA_AGENT */