From e8b3fbfa3d6a11eee25db2dc0f31f439aaf0b65a Mon Sep 17 00:00:00 2001
From: Gustavo Sverzut Barbieri <barbieri@profusion.mobi>
Date: Thu, 26 May 2011 17:30:04 -0300
Subject: [PATCH] Allow disabling atasmart, lvm2 and devicemapper support.

https://bugs.freedesktop.org/show_bug.cgi?id=37647

---
 configure.ac            | 53 +++++++++++++++++++++++++++++++++++++++----------
 src/adapter-private.h   |  1 -
 src/adapter.c           |  1 -
 src/daemon.c            |  4 ++++
 src/device-private.c    |  2 +-
 src/device-private.h    |  5 ++---
 src/device.c            | 23 +++++++++++++++++----
 src/expander-private.h  |  1 -
 src/expander.c          |  1 -
 src/helpers/Makefile.am | 20 +++++++++++++------
 src/helpers/partutil.c  |  3 ++-
 src/port-private.h      |  1 -
 src/probers/Makefile.am |  8 ++++++--
 tools/udisks.c          | 10 ++++++++--
 14 files changed, 99 insertions(+), 34 deletions(-)

diff --git a/configure.ac b/configure.ac
index 9454423..8c4e4c2 100644
--- a/configure.ac
+++ b/configure.ac
@@ -155,13 +155,33 @@ PKG_CHECK_MODULES(POLKIT_GOBJECT_1, [polkit-gobject-1 >= 0.97])
 AC_SUBST(POLKIT_GOBJECT_1_CFLAGS)
 AC_SUBST(POLKIT_GOBJECT_1_LIBS)
 
-PKG_CHECK_MODULES(LIBPARTED, [libparted >= 1.8.8])
-AC_SUBST(LIBPARTED_CFLAGS)
-AC_SUBST(LIBPARTED_LIBS)
-
-PKG_CHECK_MODULES(DEVMAPPER, [devmapper >= 1.02])
-AC_SUBST(DEVMAPPER_CFLAGS)
-AC_SUBST(DEVMAPPER_LIBS)
+have_parted=no
+AC_ARG_ENABLE(parted, AS_HELP_STRING([--disable-parted], [disable disk partitioning]))
+if test "x$enable_parted" != "xno"; then
+  PKG_CHECK_MODULES(LIBPARTED, [libparted >= 1.8.8],
+                    [AC_DEFINE(USE_PARTED, 1, [Define if parted should be used]) have_parted=yes],
+                    have_parted=no)
+  AC_SUBST(LIBPARTED_CFLAGS)
+  AC_SUBST(LIBPARTED_LIBS)
+  if test "x$have_parted" = xno -a "x$enable_parted" = xyes; then
+    AC_MSG_ERROR([parted support requested but libraries not found])
+  fi
+fi
+AM_CONDITIONAL(HAVE_PARTED, [test "$have_parted" = "yes"])
+
+have_devmapper=no
+AC_ARG_ENABLE(devmapper, AS_HELP_STRING([--disable-devmapper], [disable device mapper support]))
+if test "x$enable_devmapper" != "xno"; then
+  PKG_CHECK_MODULES(DEVMAPPER, [devmapper >= 1.02],
+                    [AC_DEFINE(HAVE_DEVMAPPER, 1, [Define if device mapper is available]) have_devmapper=yes],
+                    have_devmapper=no)
+  AC_SUBST(DEVMAPPER_CFLAGS)
+  AC_SUBST(DEVMAPPER_LIBS)
+  if test "x$have_devmapper" = xno -a "x$enable_devmapper" = xyes; then
+    AC_MSG_ERROR([devmapper support requested but libraries not found])
+  fi
+fi
+AM_CONDITIONAL(HAVE_DEVMAPPER, [test "$have_devmapper" = "yes"])
 
 have_lvm2=no
 AC_ARG_ENABLE(lvm2, AS_HELP_STRING([--enable-lvm2], [enable LVM2 support]))
@@ -185,9 +205,19 @@ if test "x$enable_dmmp" = "xyes"; then
 fi
 AM_CONDITIONAL(HAVE_DMMP, [test "$have_dmmp" = "yes"])
 
-PKG_CHECK_MODULES(LIBATASMART, [libatasmart >= 0.14])
-AC_SUBST(LIBATASMART_CFLAGS)
-AC_SUBST(LIBATASMART_LIBS)
+have_libatasmart=no
+AC_ARG_ENABLE(libatasmart, AS_HELP_STRING([--disable-libatasmart], [disable libatasmart support]))
+if test "x$enable_libatasmart" != "xno"; then
+  PKG_CHECK_MODULES(LIBATASMART, [libatasmart >= 0.14],
+                    [AC_DEFINE(HAVE_LIBATASMART, 1, [Define if libatasmart is available]) have_libatasmart=yes],
+                    have_libatasmart=no)
+  AC_SUBST(LIBATASMART_CFLAGS)
+  AC_SUBST(LIBATASMART_LIBS)
+  if test "x$have_libatasmart" = xno -a "x$enable_libatasmart" = xyes; then
+    AC_MSG_ERROR([libatasmart support requested but libraries not found])
+  fi
+fi
+AM_CONDITIONAL(HAVE_LIBATASMART, [test "$have_libatasmart" = "yes"])
 
 PKG_CHECK_MODULES(LIBUDEV, [libudev >= 143])
 AC_SUBST(LIBUDEV_CFLAGS)
@@ -278,9 +308,12 @@ echo "
         cppflags:                   ${CPPFLAGS}
         xsltproc:                   ${XSLTPROC}
 
+        Parted support:             ${have_parted}
+        Device Mapper support:      ${have_devmapper}
         LVM2 support:               ${have_lvm2}
         dm-multipath:               ${have_dmmp}
         Remote Access:              ${remote_access}
+        libatasmart support:        ${have_libatasmart}
 
         Maintainer mode:            ${USE_MAINTAINER_MODE}
         Profiling:                  ${enable_profiling}
diff --git a/src/adapter-private.h b/src/adapter-private.h
index 3409e21..ef584e3 100644
--- a/src/adapter-private.h
+++ b/src/adapter-private.h
@@ -23,7 +23,6 @@
 
 #include <dbus/dbus-glib.h>
 #include <gudev/gudev.h>
-#include <atasmart.h>
 
 #include "types.h"
 
diff --git a/src/adapter.c b/src/adapter.c
index 65e05b0..45db8c8 100644
--- a/src/adapter.c
+++ b/src/adapter.c
@@ -30,7 +30,6 @@
 #include <dbus/dbus-glib.h>
 #include <dbus/dbus-glib-lowlevel.h>
 #include <gudev/gudev.h>
-#include <atasmart.h>
 
 #include "daemon.h"
 #include "adapter.h"
diff --git a/src/daemon.c b/src/daemon.c
index fafcf9a..14e952f 100644
--- a/src/daemon.c
+++ b/src/daemon.c
@@ -1748,6 +1748,7 @@ mdstat_changed_event (GIOChannel *channel,
   return TRUE;
 }
 
+#ifdef HAVE_LIBATASMART
 static gboolean
 refresh_ata_smart_data (Daemon *daemon)
 {
@@ -1776,6 +1777,7 @@ refresh_ata_smart_data (Daemon *daemon)
 
   return FALSE;
 }
+#endif
 
 static gboolean
 register_disks_daemon (Daemon *daemon)
@@ -1987,12 +1989,14 @@ daemon_new (void)
   mount_file_clean_stale (l);
   g_list_free (l);
 
+#ifdef HAVE_LIBATASMART
   /* set up timer for refreshing ATA SMART data - we don't want to refresh immediately because
    * when adding a device we also do this...
    */
   daemon->priv->ata_smart_refresh_timer_id = g_timeout_add_seconds (ATA_SMART_REFRESH_INTERVAL_SECONDS,
                                                                     (GSourceFunc) refresh_ata_smart_data,
                                                                     daemon);
+#endif
 
   PROFILE ("daemon_new(): end");
   return daemon;
diff --git a/src/device-private.c b/src/device-private.c
index 45418ce..fb1d959 100644
--- a/src/device-private.c
+++ b/src/device-private.c
@@ -1390,7 +1390,7 @@ device_set_drive_ata_smart_time_collected (Device *device,
 
 void
 device_set_drive_ata_smart_status (Device *device,
-                                   SkSmartOverall value)
+                                   guint value)
 {
   if (G_UNLIKELY (device->priv->drive_ata_smart_status != value))
     {
diff --git a/src/device-private.h b/src/device-private.h
index 32a9bd0..8c57c13 100644
--- a/src/device-private.h
+++ b/src/device-private.h
@@ -23,7 +23,6 @@
 
 #include <dbus/dbus-glib.h>
 #include <gudev/gudev.h>
-#include <atasmart.h>
 
 #include "types.h"
 
@@ -228,7 +227,7 @@ struct DevicePrivate
 
   gboolean drive_ata_smart_is_available;
   guint64 drive_ata_smart_time_collected;
-  SkSmartOverall drive_ata_smart_status;
+  guint drive_ata_smart_status;
   void *drive_ata_smart_blob;
   gsize drive_ata_smart_blob_size;
 
@@ -396,7 +395,7 @@ void device_set_holders_objpath (Device *device, GStrv value);
 
 void device_set_drive_ata_smart_is_available (Device *device, gboolean value);
 void device_set_drive_ata_smart_time_collected (Device *device, guint64 value);
-void device_set_drive_ata_smart_status (Device *device, SkSmartOverall value);
+void device_set_drive_ata_smart_status (Device *device, guint value);
 void device_set_drive_ata_smart_blob_steal (Device *device, gchar *blob, gsize blob_size);
 
 G_END_DECLS
diff --git a/src/device.c b/src/device.c
index 2ae7f38..d73f9d6 100644
--- a/src/device.c
+++ b/src/device.c
@@ -50,7 +50,9 @@
 #include <dbus/dbus-glib.h>
 #include <dbus/dbus-glib-lowlevel.h>
 #include <gudev/gudev.h>
+#ifdef HAVE_LIBATASMART
 #include <atasmart.h>
+#endif
 
 #include "daemon.h"
 #include "device.h"
@@ -664,10 +666,14 @@ get_property (GObject *object,
     case PROP_DRIVE_ATA_SMART_STATUS:
       {
         const gchar *status;
-        if (device->priv->drive_ata_smart_status == (SkSmartOverall) - 1)
+#ifdef HAVE_LIBATASMART
+        if (device->priv->drive_ata_smart_status == (guint) - 1)
           status = "";
         else
           status = sk_smart_overall_to_string (device->priv->drive_ata_smart_status);
+#else
+        status = "";
+#endif
         g_value_set_string (value, status);
       }
       break;
@@ -5144,6 +5150,7 @@ device_new (Daemon *daemon,
       goto out;
     }
 
+#ifdef HAVE_LIBATASMART
   /* if just added, update the smart data if applicable */
   if (device->priv->drive_ata_smart_is_available)
     {
@@ -5151,6 +5158,7 @@ device_new (Daemon *daemon,
       gchar *ata_smart_refresh_data_options[] = { NULL };
       device_drive_ata_smart_refresh_data (device, ata_smart_refresh_data_options, NULL);
     }
+#endif
 
   PROFILE ("device_new(native_path=%s): end", native_path);
  out:
@@ -9840,16 +9848,18 @@ drive_ata_smart_refresh_data_completed_cb (DBusGMethodInvocation *context,
                                            const char *stdout,
                                            gpointer user_data)
 {
+#ifdef HAVE_LIBATASMART
   gint rc;
-  SkDisk *d;
+  SkDisk *d = NULL;
+  SkSmartOverall overall;
   gchar *blob;
   gsize blob_size;
   time_t time_collected;
-  SkSmartOverall overall;
+#endif
 
   PROFILE ("drive_ata_smart_refresh_data_completed_cb(device=%s) start", device->priv->native_path);
 
-  d = NULL;
+#ifdef HAVE_LIBATASMART
   blob = NULL;
 
   if (job_was_cancelled || stdout == NULL)
@@ -9953,6 +9963,11 @@ drive_ata_smart_refresh_data_completed_cb (DBusGMethodInvocation *context,
   g_free (blob);
   if (d != NULL)
     sk_disk_free (d);
+
+#else
+  throw_error (context, ERROR_FAILED, "libatasmart support disabled");
+#endif
+
   PROFILE ("drive_ata_smart_refresh_data_completed_cb(device=%s) end", device->priv->native_path);
 }
 
diff --git a/src/expander-private.h b/src/expander-private.h
index ef4f440..98a8300 100644
--- a/src/expander-private.h
+++ b/src/expander-private.h
@@ -23,7 +23,6 @@
 
 #include <dbus/dbus-glib.h>
 #include <gudev/gudev.h>
-#include <atasmart.h>
 
 #include "types.h"
 
diff --git a/src/expander.c b/src/expander.c
index 734ec0a..e799f13 100644
--- a/src/expander.c
+++ b/src/expander.c
@@ -34,7 +34,6 @@
 #include <dbus/dbus-glib.h>
 #include <dbus/dbus-glib-lowlevel.h>
 #include <gudev/gudev.h>
-#include <atasmart.h>
 #include <stdlib.h>
 
 #include "daemon.h"
diff --git a/src/helpers/Makefile.am b/src/helpers/Makefile.am
index 4b863c0..d3ec4e9 100644
--- a/src/helpers/Makefile.am
+++ b/src/helpers/Makefile.am
@@ -19,15 +19,9 @@ INCLUDES = \
 
 libexec_PROGRAMS = 					\
 	udisks-helper-mkfs                    		\
-	udisks-helper-delete-partition        		\
-	udisks-helper-create-partition        		\
-	udisks-helper-modify-partition        		\
-	udisks-helper-create-partition-table		\
 	udisks-helper-change-filesystem-label 		\
 	udisks-helper-linux-md-remove-component		\
 	udisks-helper-fstab-mounter			\
-	udisks-helper-ata-smart-collect			\
-	udisks-helper-ata-smart-selftest		\
 	udisks-helper-drive-detach			\
 	udisks-helper-drive-poll			\
 	udisks-helper-linux-md-check			\
@@ -48,6 +42,13 @@ udisks_helper_mkfs_SOURCES = job-shared.h job-mkfs.c
 udisks_helper_mkfs_CPPFLAGS = $(AM_CPPFLAGS)
 udisks_helper_mkfs_LDADD = $(GLIB_LIBS)
 
+if HAVE_PARTED
+libexec_PROGRAMS +=                                     \
+	udisks-helper-delete-partition        		\
+	udisks-helper-create-partition        		\
+	udisks-helper-modify-partition        		\
+	udisks-helper-create-partition-table
+
 udisks_helper_delete_partition_SOURCES = job-shared.h job-delete-partition.c
 udisks_helper_delete_partition_CPPFLAGS = $(AM_CPPFLAGS)
 udisks_helper_delete_partition_LDADD = $(GLIB_LIBS) libpartutil.la
@@ -63,11 +64,17 @@ udisks_helper_modify_partition_LDADD = $(GLIB_LIBS) libpartutil.la
 udisks_helper_create_partition_table_SOURCES = job-shared.h job-create-partition-table.c
 udisks_helper_create_partition_table_CPPFLAGS = $(AM_CPPFLAGS)
 udisks_helper_create_partition_table_LDADD = $(GLIB_LIBS) libpartutil.la
+endif
 
 udisks_helper_change_filesystem_label_SOURCES = job-shared.h job-change-filesystem-label.c
 udisks_helper_change_filesystem_label_CPPFLAGS = $(AM_CPPFLAGS)
 udisks_helper_change_filesystem_label_LDADD = $(GLIB_LIBS)
 
+if HAVE_LIBATASMART
+libexec_PROGRAMS +=                                     \
+	udisks-helper-ata-smart-collect			\
+	udisks-helper-ata-smart-selftest
+
 udisks_helper_ata_smart_selftest_SOURCES = job-shared.h job-ata-smart-selftest.c
 udisks_helper_ata_smart_selftest_CPPFLAGS = $(AM_CPPFLAGS) $(LIBATASMART_CFLAGS) $(GLIB_CFLAGS)
 udisks_helper_ata_smart_selftest_LDADD = $(LIBATASMART_LIBS) $(GLIB_LIBS)
@@ -75,6 +82,7 @@ udisks_helper_ata_smart_selftest_LDADD = $(LIBATASMART_LIBS) $(GLIB_LIBS)
 udisks_helper_ata_smart_collect_SOURCES = job-ata-smart-collect.c
 udisks_helper_ata_smart_collect_CPPFLAGS = $(AM_CPPFLAGS) $(LIBATASMART_CFLAGS) $(GLIB_CFLAGS)
 udisks_helper_ata_smart_collect_LDADD = $(LIBATASMART_LIBS) $(GLIB_LIBS)
+endif
 
 udisks_helper_linux_md_remove_component_SOURCES = job-shared.h job-linux-md-remove-component.c
 udisks_helper_linux_md_remove_component_CPPFLAGS = $(AM_CPPFLAGS)
diff --git a/src/helpers/partutil.c b/src/helpers/partutil.c
index 72a8fe3..8893a39 100644
--- a/src/helpers/partutil.c
+++ b/src/helpers/partutil.c
@@ -62,7 +62,6 @@ DEBUG (const gchar *format,
 #  include <config.h>
 #endif
 
-#define USE_PARTED
 #ifdef USE_PARTED
 #include <parted/parted.h>
 #endif
@@ -928,6 +927,7 @@ part_table_parse_apple (int fd,
   return p;
 }
 
+#ifdef USE_PARTED
 static PartitionTable *
 part_table_load_from_disk_from_file (char *device_file)
 {
@@ -948,6 +948,7 @@ part_table_load_from_disk_from_file (char *device_file)
  out:
   return ret;
 }
+#endif
 
 PartitionTable *
 part_table_load_from_disk (int fd)
diff --git a/src/port-private.h b/src/port-private.h
index cc48376..a91532f 100644
--- a/src/port-private.h
+++ b/src/port-private.h
@@ -23,7 +23,6 @@
 
 #include <dbus/dbus-glib.h>
 #include <gudev/gudev.h>
-#include <atasmart.h>
 
 #include "types.h"
 
diff --git a/src/probers/Makefile.am b/src/probers/Makefile.am
index 06bb566..01c693b 100644
--- a/src/probers/Makefile.am
+++ b/src/probers/Makefile.am
@@ -22,8 +22,6 @@ INCLUDES = \
 
 udevhelperdir = $(slashlibdir)/udev
 udevhelper_PROGRAMS =	udisks-part-id 			\
-			udisks-dm-export 		\
-		      	udisks-probe-ata-smart 		\
 			udisks-probe-sas-expander 	\
 			$(NULL)
 
@@ -35,17 +33,23 @@ udisks_part_id_SOURCES = part-id.c
 udisks_part_id_CPPFLAGS = $(AM_CPPFLAGS) $(LIBUDEV_CFLAGS)
 udisks_part_id_LDADD = $(GLIB_LIBS) $(LIBUDEV_LIBS) $(top_builddir)/src/helpers/libpartutil.la
 
+if HAVE_DEVMAPPER
+udevhelper_PROGRAMS += udisks-dm-export
 udisks_dm_export_SOURCES = udisks-dm-export.c
 udisks_dm_export_CPPFLAGS = $(AM_CPPFLAGS) $(DEVMAPPER_CFLAGS) $(GLIB_CFLAGS)
 udisks_dm_export_LDADD = $(DEVMAPPER_LIBS) $(GLIB_LIBS)
+endif
 
 udisks_lvm_pv_export_SOURCES = udisks-lvm-pv-export.c
 udisks_lvm_pv_export_CPPFLAGS = $(AM_CPPFLAGS) $(DEVMAPPER_CFLAGS) $(LVM2_CFLAGS) $(GLIB_CFLAGS)
 udisks_lvm_pv_export_LDADD = $(DEVMAPPER_LIBS) $(LVM2_LIBS) $(GLIB_LIBS)
 
+if HAVE_LIBATASMART
+udevhelper_PROGRAMS += udisks-probe-ata-smart
 udisks_probe_ata_smart_SOURCES = udisks-probe-ata-smart.c
 udisks_probe_ata_smart_CPPFLAGS = $(AM_CPPFLAGS) $(LIBATASMART_CFLAGS)
 udisks_probe_ata_smart_LDADD = $(LIBATASMART_LIBS)
+endif
 
 udisks_probe_sas_expander_SOURCES = udisks-probe-sas-expander.c
 udisks_probe_sas_expander_CPPFLAGS = $(AM_CPPFLAGS) $(GLIB_CFLAGS)
diff --git a/tools/udisks.c b/tools/udisks.c
index 97e80d7..d30159b 100644
--- a/tools/udisks.c
+++ b/tools/udisks.c
@@ -43,7 +43,9 @@
 #include <dbus/dbus-glib.h>
 #include <dbus/dbus-glib-lowlevel.h>
 
+#ifdef HAVE_LIBATASMART
 #include <atasmart.h>
+#endif
 
 #include "udisks-daemon-glue.h"
 #include "udisks-device-glue.h"
@@ -983,6 +985,7 @@ end_highlight (void)
     g_print ("\x1B[0m");
 }
 
+#ifdef HAVE_LIBATASMART
 static const gchar *
 ata_smart_status_to_desc (const gchar *status,
                           gboolean *out_highlight)
@@ -1163,6 +1166,7 @@ print_ata_smart_attr (SkDisk *d,
   g_free (threshold_str);
   g_free (pretty);
 }
+#endif
 
 static void
 do_show_info (const char *object_path)
@@ -1445,7 +1449,7 @@ do_show_info (const char *object_path)
         g_print ("    if speed:                  %" G_GINT64_FORMAT " bits/s\n", props->drive_connection_speed);
 
       /* ------------------------------------------------------------------------------------------------- */
-
+#ifdef HAVE_LIBATASMART
       if (!props->drive_ata_smart_is_available)
         {
           g_print ("    ATA SMART:                 not available\n");
@@ -1498,7 +1502,9 @@ do_show_info (const char *object_path)
             }
 
         }
-
+#else
+          g_print ("    ATA SMART:                 not supported\n");
+#endif
       /* ------------------------------------------------------------------------------------------------- */
 
     }
