Imported Upstream version 3.3.3
[debian/amanda] / device-src / null-device.c
index 5365e322408231f4dc4f6a1283f7b7a2991957b3..0814dfbcc2b58151ef20b6855ec89290849408bf 100644 (file)
@@ -1,9 +1,10 @@
 /*
- * Copyright (c) 2007,2008,2009 Zmanda, Inc.  All Rights Reserved.
+ * Copyright (c) 2007-2012 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 free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
  *
  * This program is distributed in the hope that it will be useful, but
  * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
@@ -50,7 +51,6 @@ struct _NullDevice {
 typedef struct _NullDeviceClass NullDeviceClass;
 struct _NullDeviceClass {
     DeviceClass __parent__;
-    gboolean in_file;
 };
 
 void null_device_register(void);
@@ -144,6 +144,12 @@ null_device_init (NullDevice * self)
            &response, PROPERTY_SURETY_GOOD, PROPERTY_SOURCE_DETECTED);
     g_value_unset(&response);
 
+    g_value_init(&response, G_TYPE_BOOLEAN);
+    g_value_set_boolean(&response, FALSE);
+    device_set_simple_property(dself, PROPERTY_LEOM,
+           &response, PROPERTY_SURETY_GOOD, PROPERTY_SOURCE_DETECTED);
+    g_value_unset(&response);
+
     /* this device's canonical name is always "null:", regardless of
      * the name the user supplies; note that we install the simple
      * getter in null_device_class_init. */
@@ -205,7 +211,7 @@ null_device_read_label(Device * dself) {
 
     device_set_error(dself,
        stralloc(_("Can't open NULL device for reading or appending.")),
-       DEVICE_STATUS_DEVICE_ERROR);
+       DEVICE_STATUS_VOLUME_UNLABELED | DEVICE_STATUS_VOLUME_ERROR);
     return FALSE;
 }
 
@@ -231,16 +237,19 @@ null_device_start (Device * pself, DeviceAccessMode mode,
     if (device_in_error(self)) return FALSE;
 
     pself->access_mode = mode;
+    g_mutex_lock(pself->device_mutex);
     pself->in_file = FALSE;
+    g_mutex_unlock(pself->device_mutex);
 
     if (mode == ACCESS_WRITE) {
         pself->volume_label = newstralloc(pself->volume_label, label);
         pself->volume_time = newstralloc(pself->volume_time, timestamp);
+       pself->header_block_size = 32768;
        return TRUE;
     } else {
        device_set_error(pself,
            stralloc(_("Can't open NULL device for reading or appending.")),
-           DEVICE_STATUS_DEVICE_ERROR);
+           DEVICE_STATUS_VOLUME_UNLABELED | DEVICE_STATUS_VOLUME_ERROR);
         return FALSE;
     }
 }
@@ -248,9 +257,10 @@ null_device_start (Device * pself, DeviceAccessMode mode,
 /* This default implementation does very little. */
 static gboolean
 null_device_finish (Device * pself) {
+    pself->access_mode = ACCESS_NULL;
+
     if (device_in_error(pself)) return FALSE;
 
-    pself->access_mode = ACCESS_NULL;
     return TRUE;
 }
 
@@ -258,7 +268,9 @@ static gboolean
 null_device_start_file(Device * d_self,
                    dumpfile_t * jobInfo G_GNUC_UNUSED)
 {
+    g_mutex_lock(d_self->device_mutex);
     d_self->in_file = TRUE;
+    g_mutex_unlock(d_self->device_mutex);
     d_self->is_eom = FALSE;
     d_self->block = 0;
     if (d_self->file <= 0)
@@ -286,6 +298,8 @@ static gboolean
 null_device_finish_file(Device * pself) {
     if (device_in_error(pself)) return FALSE;
 
+    g_mutex_lock(pself->device_mutex);
     pself->in_file = FALSE;
+    g_mutex_unlock(pself->device_mutex);
     return TRUE;
 }