--- /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:
+ *
+ */
+
+
+#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 */