Imported Upstream version 3.1.0
[debian/amanda] / ndmp-src / ndmpconnobj.h
diff --git a/ndmp-src/ndmpconnobj.h b/ndmp-src/ndmpconnobj.h
new file mode 100644 (file)
index 0000000..ff03751
--- /dev/null
@@ -0,0 +1,244 @@
+/*
+ * Copyright (c) 2009, 2010 Zmanda, Inc.  All Rights Reserved.
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 as published
+ * by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
+ *
+ * Contact information: Zmanda Inc., 465 N Mathlida Ave, Suite 300
+ * Sunnyvale, CA 94085, USA, or: http://www.zmanda.com
+ */
+
+/* An interface for devices that support direct-tcp access to a the device */
+
+#ifndef NDMCONNOBJ_H
+#define NDMCONNOBJ_H
+
+#include "amanda.h"
+#include "ndmlib.h"
+#include "directtcp.h"
+#include <glib-object.h>
+
+GType  ndmp_connection_get_type        (void);
+#define TYPE_NDMP_CONNECTION   (ndmp_connection_get_type())
+#define NDMP_CONNECTION(obj)   G_TYPE_CHECK_INSTANCE_CAST((obj), ndmp_connection_get_type(), NDMPConnection)
+#define IS_NDMP_CONNECTION(obj) G_TYPE_CHECK_INSTANCE_TYPE((obj), ndmp_connection_get_type ())
+#define NDMP_CONNECTION_GET_CLASS(obj) G_TYPE_INSTANCE_GET_CLASS((obj), ndmp_connection_get_type(), NDMPConnectionClass)
+
+/*
+ * Parent class for connections
+ */
+
+typedef struct NDMPConnection_ {
+    GObject __parent__;
+
+    /* the ndmconn - interface to ndmlib */
+    struct ndmconn *conn;
+
+    /* integer to identify this connection */
+    int connid;
+
+    /* received notifications; note that this does not include all possible
+     * notifications, and that only one "queued" version of each notification
+     * is possible.  Each reason is 0 if no such notification has been
+     * received.  */
+    ndmp9_data_halt_reason data_halt_reason;
+    ndmp9_mover_halt_reason mover_halt_reason;
+    ndmp9_mover_pause_reason mover_pause_reason;
+    guint64 mover_pause_seek_position;
+
+    /* log state, if using verbose logging (private) */
+    gpointer log_state;
+
+    /* error info */
+    int last_rc;
+    gchar *startup_err;
+} NDMPConnection;
+
+typedef struct NDMPConnectionClass_ {
+    GObjectClass __parent__;
+
+    /* NOTE: this class is not subclassed, so its "methods" are not
+     * implemented via the usual GObject function-pointer mechanism,
+     * but are simple C functions. */
+} NDMPConnectionClass;
+
+/* Error handling */
+
+/* Get the last NDMP error on this connection; returns NDMP4_NO_ERR (0)
+ * if no error occurred, or if there was a communications error.  This
+ * will also detect errors from the constructor.
+ *
+ * @param self: object
+ * @returns: error code
+ */
+ndmp4_error ndmp_connection_err_code(
+    NDMPConnection *self);
+
+/* Get the error message describing the most recent error on this object.
+ * This will always return a non-NULL string.  The result must be freed
+ * by the caller.
+ *
+ * @param self: object
+ * @returns: heap-allocated error message
+ */
+gchar *ndmp_connection_err_msg(
+    NDMPConnection *self);
+
+/* Set the verbose flag for this connection
+ *
+ * @param self: object
+ * @param verbose: TRUE for verbose logging
+ */
+void ndmp_connection_set_verbose(
+    NDMPConnection *self,
+    gboolean verbose);
+
+/*
+ * basic NDMP protocol operations
+ *
+ * All of these functions return TRUE on success.
+ */
+
+gboolean ndmp_connection_scsi_open(
+       NDMPConnection *self,
+       gchar *device);
+
+gboolean ndmp_connection_scsi_close(
+       NDMPConnection *self);
+
+gboolean ndmp_connection_scsi_execute_cdb(
+       NDMPConnection *self,
+       guint32 flags, /* bitmask: NDMP9_SCSI_DATA_DIR_{IN,OUT}; OUT = to device */
+       guint32 timeout, /* in ms */
+       gpointer cdb,
+       gsize cdb_len,
+       gpointer dataout,
+       gsize dataout_len,
+       gsize *actual_dataout_len, /* output */
+       gpointer datain, /* output */
+       gsize datain_max_len, /* output buffer size */
+       gsize *actual_datain_len, /* output */
+       guint8 *status, /* output */
+       gpointer ext_sense, /* output */
+       gsize ext_sense_max_len, /* output buffer size */
+       gsize *actual_ext_sense_len /* output */
+       );
+
+gboolean ndmp_connection_tape_open(
+       NDMPConnection *self,
+       gchar *device,
+       ndmp9_tape_open_mode mode);
+
+gboolean ndmp_connection_tape_close(
+       NDMPConnection *self);
+
+gboolean ndmp_connection_tape_mtio(
+       NDMPConnection *self,
+       ndmp9_tape_mtio_op tape_op,
+       gint count,
+       guint *resid_count);
+
+gboolean ndmp_connection_tape_write(
+       NDMPConnection *self,
+       gpointer buf,
+       guint64 len,
+       guint64 *count); /* output */
+
+gboolean ndmp_connection_tape_read(
+       NDMPConnection *self,
+       gpointer buf, /* output */
+       guint64 count, /* buffer size/requested read size */
+       guint64 *out_count); /* bytes read */
+
+gboolean ndmp_connection_tape_get_state(
+       NDMPConnection *self,
+       guint64 *blocksize, /* 0 if not supported */
+       guint64 *file_num, /* all 1's if not supported */
+       guint64 *blockno); /* all 1's if not supported */
+       /* (other state variables should be added as needed) */
+
+gboolean ndmp_connection_mover_set_record_size(
+       NDMPConnection *self,
+       guint32 record_size);
+
+gboolean ndmp_connection_mover_set_window(
+       NDMPConnection *self,
+       guint64 offset,
+       guint64 length);
+
+gboolean ndmp_connection_mover_read(
+       NDMPConnection *self,
+       guint64 offset,
+       guint64 length);
+
+gboolean ndmp_connection_mover_continue(
+       NDMPConnection *self);
+
+gboolean ndmp_connection_mover_listen(
+       NDMPConnection *self,
+       ndmp9_mover_mode mode,
+       ndmp9_addr_type addr_type,
+       DirectTCPAddr **addrs);
+
+gboolean ndmp_connection_mover_abort(
+       NDMPConnection *self);
+
+gboolean ndmp_connection_mover_stop(
+       NDMPConnection *self);
+
+gboolean ndmp_connection_mover_close(
+       NDMPConnection *self);
+
+gboolean ndmp_connection_mover_get_state(
+       NDMPConnection *self,
+       ndmp9_mover_state *state,
+       guint64 *bytes_moved,
+       guint64 *window_offset,
+       guint64 *window_length);
+       /* (other state variables should be added as needed) */
+
+/* Synchronous notification interface.  This handles all types of notification,
+ * returning the result in the appropriate output parameter. */
+gboolean ndmp_connection_wait_for_notify(
+       NDMPConnection *self,
+       /* NDMP_NOTIFY_DATA_HALTED */
+       ndmp9_data_halt_reason *data_halt_reason,
+       /* NDMP_NOTIFY_MOVER_HALTED */
+       ndmp9_mover_halt_reason *mover_halt_reason,
+       /* NDMP_NOTIFY_MOVER_PAUSED */
+       ndmp9_mover_pause_reason *mover_pause_reason,
+       guint64 *mover_pause_seek_position);
+
+/*
+ * Constructor
+ */
+
+/* Get a new NDMP connection. If an error occurs, this returns an empty object
+ * with its err_msg and err_code set appropriately.
+ *
+ * @param hostname: hostname to connect to
+ * @param port: port to connect on
+ * @param username: username to login with
+ * @param password: password to login with
+ * @param auth: authentication method to use ("MD5", "TEXT", "NONE", or "VOID")
+ * @returns: NDMPConnection object
+ */
+NDMPConnection *
+ndmp_connection_new(
+    gchar *hostname,
+    gint port,
+    gchar *username,
+    gchar *password,
+    gchar *auth);
+
+#endif