1 /*---------------------------------------------------------------------\
3 | |__ / \ / / . \ . \ |
8 \---------------------------------------------------------------------*/
9 /** \file zypp/target/hal/HalContext.cc
11 * \brief Hardware abstaction layer library wrapper implementation.
13 #ifndef FAKE_HAL // disables zypp's HAL dependency
15 #include <zypp/target/hal/HalContext.h>
16 #include <zypp/thread/Mutex.h>
17 #include <zypp/thread/MutexLock.h>
18 #include <zypp/base/NonCopyable.h>
19 #include <zypp/base/Logger.h>
20 #include <zypp/base/String.h>
21 #include <zypp/base/Gettext.h>
23 #include <hal/libhal.h>
24 #include <hal/libhal-storage.h>
30 //////////////////////////////////////////////////////////////////////
32 { ////////////////////////////////////////////////////////////////////
33 ////////////////////////////////////////////////////////////////////
35 { //////////////////////////////////////////////////////////////////
36 //////////////////////////////////////////////////////////////////
38 { ////////////////////////////////////////////////////////////////
40 using zypp::thread::Mutex;
41 using zypp::thread::MutexLock;
43 ////////////////////////////////////////////////////////////////
44 namespace // anonymous
45 { //////////////////////////////////////////////////////////////
48 //////////////////////////////////////////////////////////////
51 ** hmm... currently a global one..
56 //////////////////////////////////////////////////////////////
58 * Internal hal (dbus ) error helper class.
65 HalError() { dbus_error_init(&error); }
66 ~HalError() { dbus_error_free(&error); }
68 inline bool isSet() const
70 return dbus_error_is_set(&error);
73 inline HalException halException(const std::string &msg = std::string()) const
75 if( isSet() && error.name != NULL && error.message != NULL) {
76 return HalException(error.name, error.message);
78 else if( !msg.empty()) {
79 return HalException(msg);
82 return HalException();
88 // -----------------------------------------------------------
90 VERIFY_CONTEXT(const zypp::RW_pointer<HalContext_Impl> &h)
94 ZYPP_THROW(HalException(_("HalContext not connected")));
98 // -----------------------------------------------------------
100 VERIFY_DRIVE(const zypp::RW_pointer<HalDrive_Impl> &d)
104 ZYPP_THROW(HalException(_("HalDrive not initialized")));
108 // -----------------------------------------------------------
110 VERIFY_VOLUME(const zypp::RW_pointer<HalVolume_Impl> &v)
114 ZYPP_THROW(HalException(_("HalVolume not initialized")));
118 //////////////////////////////////////////////////////////////
120 ////////////////////////////////////////////////////////////////
122 ////////////////////////////////////////////////////////////////
124 HalException::dumpOn( std::ostream & str ) const
126 if(!e_name.empty() && !e_msg.empty())
127 return str << msg() << ": " << e_msg << " (" << e_name << ")";
128 else if(!e_msg.empty())
129 return str << msg() << ": " << e_msg;
134 ////////////////////////////////////////////////////////////////
135 class HalContext_Impl
141 DBusConnection *conn;
143 bool pcon; // private connection
147 ////////////////////////////////////////////////////////////////
151 zypp::RW_pointer<HalContext_Impl> hal;
159 HalDrive_Impl(const zypp::RW_pointer<HalContext_Impl> &r,
168 libhal_drive_free(drv);
173 ////////////////////////////////////////////////////////////////
179 HalVolume_Impl(LibHalVolume *v=NULL)
187 libhal_volume_free(vol);
192 ////////////////////////////////////////////////////////////////
193 HalContext_Impl::HalContext_Impl()
196 , pcon(false) // we allways use shared connections at the moment
201 conn = dbus_bus_get_private(DBUS_BUS_SYSTEM, &err.error);
203 conn = dbus_bus_get(DBUS_BUS_SYSTEM, &err.error);
205 ZYPP_THROW(err.halException(
206 _("Unable to create dbus connection")
210 hctx = libhal_ctx_new();
214 dbus_connection_close(conn);
215 dbus_connection_unref(conn);
218 ZYPP_THROW(HalException(
219 _("libhal_ctx_new: Can't create libhal context")
223 if( !libhal_ctx_set_dbus_connection(hctx, conn))
225 libhal_ctx_free(hctx);
229 dbus_connection_close(conn);
230 dbus_connection_unref(conn);
233 ZYPP_THROW(HalException(
234 _("libhal_set_dbus_connection: Can't set dbus connection")
238 if( !libhal_ctx_init(hctx, &err.error))
240 libhal_ctx_free(hctx);
244 dbus_connection_close(conn);
245 dbus_connection_unref(conn);
248 ZYPP_THROW(err.halException(
249 _("Unable to initalize HAL context -- hald not running?")
254 // -------------------------------------------------------------
255 HalContext_Impl::~HalContext_Impl()
260 libhal_ctx_shutdown(hctx, &err.error);
261 libhal_ctx_free( hctx);
266 dbus_connection_close(conn);
267 dbus_connection_unref(conn);
272 ////////////////////////////////////////////////////////////////
273 HalContext::HalContext(bool autoconnect)
276 MutexLock lock(g_Mutex);
279 h_impl.reset( new HalContext_Impl());
282 // -------------------------------------------------------------
283 HalContext::HalContext(const HalContext &context)
286 MutexLock lock(g_Mutex);
288 zypp::RW_pointer<HalContext_Impl>(context.h_impl).swap(h_impl);
291 // -------------------------------------------------------------
292 HalContext::~HalContext()
294 MutexLock lock(g_Mutex);
299 // --------------------------------------------------------------
301 HalContext::operator=(const HalContext &context)
303 MutexLock lock(g_Mutex);
305 if( this == &context)
308 zypp::RW_pointer<HalContext_Impl>(context.h_impl).swap(h_impl);
312 // --------------------------------------------------------------
313 HalContext::operator HalContext::bool_type() const
315 MutexLock lock(g_Mutex);
320 // --------------------------------------------------------------
322 HalContext::connect()
324 MutexLock lock(g_Mutex);
327 h_impl.reset( new HalContext_Impl());
330 // --------------------------------------------------------------
331 std::vector<std::string>
332 HalContext::getAllDevices() const
334 MutexLock lock(g_Mutex);
335 VERIFY_CONTEXT(h_impl);
341 names = libhal_get_all_devices( h_impl->hctx, &count, &err.error);
344 ZYPP_THROW(err.halException());
347 std::vector<std::string> ret(names, names + count);
348 libhal_free_string_array(names);
352 // --------------------------------------------------------------
354 HalContext::getDriveFromUDI(const std::string &udi) const
356 MutexLock lock(g_Mutex);
357 VERIFY_CONTEXT(h_impl);
359 LibHalDrive *drv = libhal_drive_from_udi(h_impl->hctx, udi.c_str());
361 return HalDrive(new HalDrive_Impl( h_impl, drv));
366 // --------------------------------------------------------------
368 HalContext::getVolumeFromUDI(const std::string &udi) const
370 MutexLock lock(g_Mutex);
371 VERIFY_CONTEXT(h_impl);
373 LibHalVolume *vol = libhal_volume_from_udi(h_impl->hctx, udi.c_str());
375 return HalVolume( new HalVolume_Impl(vol));
380 // --------------------------------------------------------------
382 HalContext::getVolumeFromDeviceFile(const std::string &device_file) const
384 MutexLock lock(g_Mutex);
385 VERIFY_CONTEXT(h_impl);
387 LibHalVolume *vol = libhal_volume_from_device_file(h_impl->hctx,
388 device_file.c_str());
390 return HalVolume( new HalVolume_Impl(vol));
395 // --------------------------------------------------------------
396 std::vector<std::string>
397 HalContext::findDevicesByCapability(const std::string &capability) const
399 MutexLock lock(g_Mutex);
400 VERIFY_CONTEXT(h_impl);
406 names = libhal_find_device_by_capability(h_impl->hctx,
411 ZYPP_THROW(err.halException());
414 std::vector<std::string> ret(names, names + count);
415 libhal_free_string_array(names);
419 // --------------------------------------------------------------
421 HalContext::getDevicePropertyBool (const std::string &udi,
422 const std::string &key) const
424 MutexLock lock(g_Mutex);
425 VERIFY_CONTEXT(h_impl);
430 ret = libhal_device_get_property_bool (h_impl->hctx,
436 ZYPP_THROW(err.halException());
441 // --------------------------------------------------------------
443 HalContext::getDevicePropertyInt32 (const std::string &udi,
444 const std::string &key) const
446 MutexLock lock(g_Mutex);
447 VERIFY_CONTEXT(h_impl);
452 ret = libhal_device_get_property_int (h_impl->hctx,
458 ZYPP_THROW(err.halException());
463 // --------------------------------------------------------------
465 HalContext::getDevicePropertyUInt64(const std::string &udi,
466 const std::string &key) const
468 MutexLock lock(g_Mutex);
469 VERIFY_CONTEXT(h_impl);
474 ret = libhal_device_get_property_uint64(h_impl->hctx,
480 ZYPP_THROW(err.halException());
485 // --------------------------------------------------------------
487 HalContext::getDevicePropertyDouble(const std::string &udi,
488 const std::string &key) const
490 MutexLock lock(g_Mutex);
491 VERIFY_CONTEXT(h_impl);
496 ret = libhal_device_get_property_bool (h_impl->hctx,
502 ZYPP_THROW(err.halException());
508 // --------------------------------------------------------------
510 HalContext::getDevicePropertyString(const std::string &udi,
511 const std::string &key) const
513 MutexLock lock(g_Mutex);
514 VERIFY_CONTEXT(h_impl);
520 ptr = libhal_device_get_property_string(h_impl->hctx,
526 ZYPP_THROW(err.halException());
536 // --------------------------------------------------------------
538 HalContext::setDevicePropertyBool (const std::string &udi,
539 const std::string &key,
542 MutexLock lock(g_Mutex);
543 VERIFY_CONTEXT(h_impl);
548 ret = libhal_device_set_property_bool (h_impl->hctx,
555 ZYPP_THROW(err.halException());
559 // --------------------------------------------------------------
561 HalContext::setDevicePropertyInt32 (const std::string &udi,
562 const std::string &key,
565 MutexLock lock(g_Mutex);
566 VERIFY_CONTEXT(h_impl);
571 ret = libhal_device_set_property_int (h_impl->hctx,
578 ZYPP_THROW(err.halException());
582 // --------------------------------------------------------------
584 HalContext::setDevicePropertyUInt64(const std::string &udi,
585 const std::string &key,
588 MutexLock lock(g_Mutex);
589 VERIFY_CONTEXT(h_impl);
594 ret = libhal_device_set_property_uint64(h_impl->hctx,
601 ZYPP_THROW(err.halException());
605 // --------------------------------------------------------------
607 HalContext::setDevicePropertyDouble(const std::string &udi,
608 const std::string &key,
611 MutexLock lock(g_Mutex);
612 VERIFY_CONTEXT(h_impl);
617 ret = libhal_device_set_property_double(h_impl->hctx,
624 ZYPP_THROW(err.halException());
628 // --------------------------------------------------------------
630 HalContext::setDevicePropertyString(const std::string &udi,
631 const std::string &key,
632 const std::string &value)
634 MutexLock lock(g_Mutex);
635 VERIFY_CONTEXT(h_impl);
640 ret = libhal_device_set_property_string(h_impl->hctx,
647 ZYPP_THROW(err.halException());
651 // --------------------------------------------------------------
653 HalContext::removeDeviceProperty(const std::string &udi,
654 const std::string &key)
656 MutexLock lock(g_Mutex);
657 VERIFY_CONTEXT(h_impl);
662 ret = libhal_device_remove_property(h_impl->hctx,
668 ZYPP_THROW(err.halException());
672 ////////////////////////////////////////////////////////////////
678 // --------------------------------------------------------------
679 HalDrive::HalDrive(HalDrive_Impl *impl)
682 MutexLock lock(g_Mutex);
687 // --------------------------------------------------------------
688 HalDrive::HalDrive(const HalDrive &drive)
691 MutexLock lock(g_Mutex);
693 zypp::RW_pointer<HalDrive_Impl>(drive.d_impl).swap(d_impl);
696 // --------------------------------------------------------------
697 HalDrive::~HalDrive()
699 MutexLock lock(g_Mutex);
704 // --------------------------------------------------------------
706 HalDrive::operator=(const HalDrive &drive)
708 MutexLock lock(g_Mutex);
713 zypp::RW_pointer<HalDrive_Impl>(drive.d_impl).swap(d_impl);
717 // --------------------------------------------------------------
718 HalDrive::operator HalDrive::bool_type() const
720 MutexLock lock(g_Mutex);
725 // --------------------------------------------------------------
727 HalDrive::getUDI() const
729 MutexLock lock(g_Mutex);
730 VERIFY_DRIVE(d_impl);
732 const char *ptr = libhal_drive_get_udi(d_impl->drv);
733 return std::string(ptr ? ptr : "");
736 // --------------------------------------------------------------
738 HalDrive::getTypeName() const
740 MutexLock lock(g_Mutex);
741 VERIFY_DRIVE(d_impl);
743 const char *ptr = libhal_drive_get_type_textual(d_impl->drv);
744 return std::string(ptr ? ptr : "");
747 // --------------------------------------------------------------
749 HalDrive::getDeviceFile() const
751 MutexLock lock(g_Mutex);
752 VERIFY_DRIVE(d_impl);
754 return std::string(libhal_drive_get_device_file(d_impl->drv));
757 // --------------------------------------------------------------
759 HalDrive::getDeviceMajor() const
761 MutexLock lock(g_Mutex);
762 VERIFY_DRIVE(d_impl);
764 return libhal_drive_get_device_major(d_impl->drv);
767 // --------------------------------------------------------------
769 HalDrive::getDeviceMinor() const
771 MutexLock lock(g_Mutex);
772 VERIFY_DRIVE(d_impl);
774 return libhal_drive_get_device_minor(d_impl->drv);
777 // --------------------------------------------------------------
779 HalDrive::usesRemovableMedia() const
781 MutexLock lock(g_Mutex);
782 VERIFY_DRIVE(d_impl);
784 return libhal_drive_uses_removable_media(d_impl->drv);
787 // --------------------------------------------------------------
788 std::vector<std::string>
789 HalDrive::getCdromCapabilityNames() const
791 MutexLock lock(g_Mutex);
792 VERIFY_DRIVE(d_impl);
794 std::vector<std::string> ret;
795 LibHalDriveCdromCaps caps;
798 ** FIXME: there is no textual variant :-(
799 ** using property key names...
801 caps = libhal_drive_get_cdrom_caps(d_impl->drv);
803 if(caps & LIBHAL_DRIVE_CDROM_CAPS_CDROM)
804 ret.push_back("cdrom");
805 if(caps & LIBHAL_DRIVE_CDROM_CAPS_CDR)
806 ret.push_back("cdr");
807 if(caps & LIBHAL_DRIVE_CDROM_CAPS_CDRW)
808 ret.push_back("cdrw");
809 if(caps & LIBHAL_DRIVE_CDROM_CAPS_DVDRAM)
810 ret.push_back("dvdram");
811 if(caps & LIBHAL_DRIVE_CDROM_CAPS_DVDROM)
812 ret.push_back("dvd");
813 if(caps & LIBHAL_DRIVE_CDROM_CAPS_DVDR)
814 ret.push_back("dvdr");
815 if(caps & LIBHAL_DRIVE_CDROM_CAPS_DVDRW)
816 ret.push_back("dvdrw");
817 if(caps & LIBHAL_DRIVE_CDROM_CAPS_DVDPLUSR)
818 ret.push_back("dvdplusr");
819 if(caps & LIBHAL_DRIVE_CDROM_CAPS_DVDPLUSRW)
820 ret.push_back("dvdplusrw");
821 if(caps & LIBHAL_DRIVE_CDROM_CAPS_DVDPLUSRDL)
822 ret.push_back("dvdplusrdl");
827 if( libhal_drive_get_type(d_impl->drv) != LIBHAL_DRIVE_TYPE_CDROM)
828 ZYPP_THROW(HalException(_("Not a CDROM drive")));
831 ** FIXME: we use property keys matching
832 ** "storage.cdrom.cd*"
833 ** "storage.cdrom.dvd*"
834 ** but this may print other bool keys,
835 ** that are not CDROM caps.
837 LibHalPropertySet *props;
840 props = libhal_device_get_all_properties(d_impl->hal->hctx,
844 ZYPP_THROW(err.halException());
846 std::vector<std::string> ret(1, getTypeName());
848 std::string dvd("storage.cdrom.dvd");
849 std::string cd ("storage.cdrom.cd");
851 LibHalPropertySetIterator it;
852 for(libhal_psi_init(&it, props);
853 libhal_psi_has_more(&it);
854 libhal_psi_next(&it))
856 if( libhal_psi_get_type(&it) == LIBHAL_PROPERTY_TYPE_BOOLEAN &&
857 libhal_psi_get_bool(&it))
859 key = libhal_psi_get_key(&it);
860 if( key.compare(0, cd.size(), cd) == 0)
862 ret.push_back(key.substr(sizeof("storage.cdrom.")-1));
865 if( key.compare(0, dvd.size(), dvd) == 0)
867 ret.push_back(key.substr(sizeof("storage.cdrom.")-1));
871 libhal_free_property_set(props);
877 // --------------------------------------------------------------
878 std::vector<std::string>
879 HalDrive::findAllVolumes() const
881 MutexLock lock(g_Mutex);
882 VERIFY_DRIVE(d_impl);
887 names = libhal_drive_find_all_volumes(d_impl->hal->hctx,
891 std::vector<std::string> ret;
892 ret.assign(names, names + count);
893 libhal_free_string_array(names);
898 ////////////////////////////////////////////////////////////////
899 HalVolume::HalVolume()
903 HalVolume::HalVolume(HalVolume_Impl *impl)
906 MutexLock lock(g_Mutex);
911 // --------------------------------------------------------------
912 HalVolume::HalVolume(const HalVolume &volume)
915 MutexLock lock(g_Mutex);
917 zypp::RW_pointer<HalVolume_Impl>(volume.v_impl).swap(v_impl);
920 // --------------------------------------------------------------
921 HalVolume::~HalVolume()
923 MutexLock lock(g_Mutex);
928 // --------------------------------------------------------------
930 HalVolume::operator=(const HalVolume &volume)
932 MutexLock lock(g_Mutex);
937 zypp::RW_pointer<HalVolume_Impl>(volume.v_impl).swap(v_impl);
941 // --------------------------------------------------------------
942 HalVolume::operator HalVolume::bool_type() const
944 MutexLock lock(g_Mutex);
949 // --------------------------------------------------------------
951 HalVolume::getUDI() const
953 MutexLock lock(g_Mutex);
954 VERIFY_VOLUME(v_impl);
956 const char *ptr = libhal_volume_get_udi(v_impl->vol);
957 return std::string(ptr ? ptr : "");
960 // --------------------------------------------------------------
962 HalVolume::getDeviceFile() const
964 MutexLock lock(g_Mutex);
965 VERIFY_VOLUME(v_impl);
967 return std::string(libhal_volume_get_device_file(v_impl->vol));
970 // --------------------------------------------------------------
972 HalVolume::getDeviceMajor() const
974 MutexLock lock(g_Mutex);
975 VERIFY_VOLUME(v_impl);
977 return libhal_volume_get_device_major(v_impl->vol);
980 // --------------------------------------------------------------
982 HalVolume::getDeviceMinor() const
984 MutexLock lock(g_Mutex);
985 VERIFY_VOLUME(v_impl);
987 return libhal_volume_get_device_minor(v_impl->vol);
990 // --------------------------------------------------------------
992 HalVolume::isDisc() const
994 MutexLock lock(g_Mutex);
995 VERIFY_VOLUME(v_impl);
997 return libhal_volume_is_disc(v_impl->vol);
1000 // --------------------------------------------------------------
1002 HalVolume::isPartition() const
1004 MutexLock lock(g_Mutex);
1005 VERIFY_VOLUME(v_impl);
1007 return libhal_volume_is_partition(v_impl->vol);
1010 // --------------------------------------------------------------
1012 HalVolume::isMounted() const
1014 MutexLock lock(g_Mutex);
1015 VERIFY_VOLUME(v_impl);
1017 return libhal_volume_is_mounted(v_impl->vol);
1020 // --------------------------------------------------------------
1022 HalVolume::getFSType() const
1024 MutexLock lock(g_Mutex);
1025 VERIFY_VOLUME(v_impl);
1027 return std::string( libhal_volume_get_fstype(v_impl->vol));
1030 // --------------------------------------------------------------
1032 HalVolume::getFSUsage() const
1034 MutexLock lock(g_Mutex);
1035 VERIFY_VOLUME(v_impl);
1037 LibHalVolumeUsage usage( libhal_volume_get_fsusage(v_impl->vol));
1041 case LIBHAL_VOLUME_USAGE_MOUNTABLE_FILESYSTEM:
1044 case LIBHAL_VOLUME_USAGE_PARTITION_TABLE:
1045 ret = "partitiontable";
1047 case LIBHAL_VOLUME_USAGE_RAID_MEMBER:
1050 case LIBHAL_VOLUME_USAGE_CRYPTO:
1053 case LIBHAL_VOLUME_USAGE_UNKNOWN:
1060 // --------------------------------------------------------------
1062 HalVolume::getMountPoint() const
1064 VERIFY_VOLUME(v_impl);
1066 return std::string( libhal_volume_get_mount_point(v_impl->vol));
1070 ////////////////////////////////////////////////////////////////
1072 //////////////////////////////////////////////////////////////////
1073 //////////////////////////////////////////////////////////////////
1074 } // namespace target
1075 ////////////////////////////////////////////////////////////////////
1076 ////////////////////////////////////////////////////////////////////
1078 //////////////////////////////////////////////////////////////////////
1080 #include <zypp/target/hal/HalContext.h>
1081 #include <zypp/target/hal/HalException.h>
1083 { ////////////////////////////////////////////////////////////////////
1084 ////////////////////////////////////////////////////////////////////
1086 { //////////////////////////////////////////////////////////////////
1087 //////////////////////////////////////////////////////////////////
1089 { ////////////////////////////////////////////////////////////////
1092 HalException::dumpOn( std::ostream & str ) const
1095 // --------------------------------------------------------------
1096 class HalContext_Impl
1100 class HalVolume_Impl
1103 // --------------------------------------------------------------
1104 HalContext::HalContext(bool)
1106 HalContext::~HalContext()
1109 HalContext::operator=(const HalContext &)
1111 HalContext::operator HalContext::bool_type() const
1114 HalContext::connect()
1116 std::vector<std::string>
1117 HalContext::getAllDevices() const
1118 { return std::vector<std::string>(); }
1120 HalContext::getDriveFromUDI(const std::string &) const
1121 { return HalDrive(); }
1123 HalContext::getVolumeFromUDI(const std::string &) const
1124 { return HalVolume(); }
1126 HalContext::getVolumeFromDeviceFile(const std::string &) const
1127 { return HalVolume(); }
1128 std::vector<std::string>
1129 HalContext::findDevicesByCapability(const std::string &) const
1130 { return std::vector<std::string>(); }
1132 HalContext::getDevicePropertyBool(const std::string &, const std::string &) const
1135 HalContext::setDevicePropertyBool (const std::string &, const std::string &, bool value)
1138 HalContext::removeDeviceProperty(const std::string &, const std::string &)
1141 HalContext::getDevicePropertyString(const std::string &, const std::string &) const
1143 // --------------------------------------------------------------
1144 HalDrive::HalDrive()
1146 HalDrive::~HalDrive()
1149 HalDrive::operator=(const HalDrive &)
1151 HalDrive::operator HalDrive::bool_type() const
1154 HalDrive::getUDI() const
1155 { return std::string(); }
1157 HalDrive::getTypeName() const
1158 { return std::string(); }
1160 HalDrive::getDeviceFile() const
1161 { return std::string(); }
1163 HalDrive::getDeviceMinor() const
1166 HalDrive::getDeviceMajor() const
1169 HalDrive::usesRemovableMedia() const
1171 std::vector<std::string>
1172 HalDrive::getCdromCapabilityNames() const
1173 { return std::vector<std::string>(); }
1174 std::vector<std::string>
1175 HalDrive::findAllVolumes() const
1176 { return std::vector<std::string>(); }
1178 // --------------------------------------------------------------
1179 HalVolume::HalVolume()
1181 HalVolume::~HalVolume()
1184 HalVolume::operator=(const HalVolume &)
1186 HalVolume::operator HalVolume::bool_type() const
1189 HalVolume::getUDI() const
1190 { return std::string(); }
1192 HalVolume::getDeviceFile() const
1193 { return std::string(); }
1195 HalVolume::getDeviceMinor() const
1198 HalVolume::getDeviceMajor() const
1201 HalVolume::isDisc() const
1204 HalVolume::isPartition() const
1207 HalVolume::isMounted() const
1210 HalVolume::getFSType() const
1211 { return std::string(); }
1213 HalVolume::getFSUsage() const
1214 { return std::string(); }
1216 HalVolume::getMountPoint() const
1217 { return std::string(); }
1219 ////////////////////////////////////////////////////////////////
1221 //////////////////////////////////////////////////////////////////
1222 //////////////////////////////////////////////////////////////////
1223 } // namespace target
1224 ////////////////////////////////////////////////////////////////////
1225 ////////////////////////////////////////////////////////////////////
1227 //////////////////////////////////////////////////////////////////////
1231 ** vim: set ts=2 sts=2 sw=2 ai et: