xref: /onnv-gate/usr/src/lib/hal/libhal-storage/common/libhal-storage.c (revision 9823:d1a95ad35c68)
12912Sartem /***************************************************************************
22912Sartem  * CVSID: $Id$
32912Sartem  *
42912Sartem  * libhal-storage.c : HAL convenience library for storage devices and volumes
52912Sartem  *
62912Sartem  * Copyright (C) 2004 Red Hat, Inc.
72912Sartem  *
82912Sartem  * Author: David Zeuthen <davidz@redhat.com>
92912Sartem  *
102912Sartem  * Licensed under the Academic Free License version 2.1
112912Sartem  *
122912Sartem  * This program is free software; you can redistribute it and/or modify
132912Sartem  * it under the terms of the GNU General Public License as published by
142912Sartem  * the Free Software Foundation; either version 2 of the License, or
152912Sartem  * (at your option) any later version.
162912Sartem  *
172912Sartem  * This program is distributed in the hope that it will be useful,
182912Sartem  * but WITHOUT ANY WARRANTY; without even the implied warranty of
192912Sartem  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.	 See the
202912Sartem  * GNU General Public License for more details.
212912Sartem  *
222912Sartem  * You should have received a copy of the GNU General Public License
232912Sartem  * along with this program; if not, write to the Free Software
242912Sartem  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307	 USA
252912Sartem  *
262912Sartem  **************************************************************************/
272912Sartem 
282912Sartem #ifdef HAVE_CONFIG_H
292912Sartem #  include <config.h>
302912Sartem #endif
312912Sartem 
322912Sartem #include <stdio.h>
332912Sartem #include <stdlib.h>
342912Sartem #include <string.h>
352912Sartem #include <dbus/dbus.h>
362912Sartem 
372912Sartem #include <libhal.h>
382912Sartem #include "libhal-storage.h"
392912Sartem 
402912Sartem 
412912Sartem #ifdef ENABLE_NLS
422912Sartem # include <libintl.h>
432912Sartem # define _(String) dgettext (GETTEXT_PACKAGE, String)
442912Sartem # ifdef gettext_noop
452912Sartem #   define N_(String) gettext_noop (String)
462912Sartem # else
472912Sartem #   define N_(String) (String)
482912Sartem # endif
492912Sartem #else
502912Sartem /* Stubs that do something close enough.  */
512912Sartem # define textdomain(String) (String)
522912Sartem # define gettext(String) (String)
532912Sartem # define dgettext(Domain,Message) (Message)
542912Sartem # define dcgettext(Domain,Message,Type) (Message)
552912Sartem # define bindtextdomain(Domain,Directory) (Domain)
562912Sartem # define _(String) (String)
572912Sartem # define N_(String) (String)
582912Sartem #endif
592912Sartem 
602912Sartem typedef struct IconMappingEntry_s {
612912Sartem 	LibHalStoragePolicyIcon icon;
622912Sartem 	char *path;
632912Sartem 	struct IconMappingEntry_s *next;
642912Sartem } IconMappingEntry;
652912Sartem 
662912Sartem struct LibHalStoragePolicy_s {
672912Sartem 	IconMappingEntry *icon_mappings;
682912Sartem };
692912Sartem 
702912Sartem LibHalStoragePolicy *
libhal_storage_policy_new()712912Sartem libhal_storage_policy_new ()
722912Sartem {
732912Sartem 	LibHalStoragePolicy *p;
742912Sartem 
752912Sartem 	p = malloc (sizeof (LibHalStoragePolicy));
762912Sartem 	if (p == NULL)
772912Sartem 		goto out;
782912Sartem 
792912Sartem 	p->icon_mappings = NULL;
802912Sartem out:
812912Sartem 	return p;
822912Sartem }
832912Sartem 
842912Sartem void
libhal_storage_policy_free(LibHalStoragePolicy * policy)852912Sartem libhal_storage_policy_free (LibHalStoragePolicy *policy)
862912Sartem {
872912Sartem 	IconMappingEntry *i;
882912Sartem 	IconMappingEntry *j;
892912Sartem 
902912Sartem 	/* free all icon mappings */
912912Sartem 	for (i = policy->icon_mappings; i != NULL; i = j) {
922912Sartem 		j = i->next;
932912Sartem 		free (i->path);
942912Sartem 		free (i);
952912Sartem 	}
962912Sartem 
972912Sartem 	free (policy);
982912Sartem }
992912Sartem 
1002912Sartem void
libhal_storage_policy_set_icon_path(LibHalStoragePolicy * policy,LibHalStoragePolicyIcon icon,const char * path)1012912Sartem libhal_storage_policy_set_icon_path (LibHalStoragePolicy *policy, LibHalStoragePolicyIcon icon, const char *path)
1022912Sartem {
1032912Sartem 	IconMappingEntry *i;
1042912Sartem 
1052912Sartem 	/* see if it already exist */
1062912Sartem 	for (i = policy->icon_mappings; i != NULL; i = i->next) {
1072912Sartem 		if (i->icon == icon) {
1082912Sartem 			free (i->path);
1092912Sartem 			i->path = strdup (path);
1102912Sartem 			goto out;
1112912Sartem 		}
1122912Sartem 	}
1132912Sartem 
1142912Sartem 	i = malloc (sizeof (IconMappingEntry));
1152912Sartem 	if (i == NULL)
1162912Sartem 		goto out;
1172912Sartem 	i->icon = icon;
1182912Sartem 	i->path = strdup (path);
1192912Sartem 	i->next = policy->icon_mappings;
1202912Sartem 	policy->icon_mappings = i;
1212912Sartem 
1222912Sartem out:
1232912Sartem 	return;
1242912Sartem }
1252912Sartem 
1262912Sartem void
libhal_storage_policy_set_icon_mapping(LibHalStoragePolicy * policy,LibHalStoragePolicyIconPair * pairs)1272912Sartem libhal_storage_policy_set_icon_mapping (LibHalStoragePolicy *policy, LibHalStoragePolicyIconPair *pairs)
1282912Sartem {
1292912Sartem 	LibHalStoragePolicyIconPair *i;
1302912Sartem 
1312912Sartem 	for (i = pairs; i->icon != 0x00; i++) {
1322912Sartem 		libhal_storage_policy_set_icon_path (policy, i->icon, i->icon_path);
1332912Sartem 	}
1342912Sartem }
1352912Sartem 
1362912Sartem const char *
libhal_storage_policy_lookup_icon(LibHalStoragePolicy * policy,LibHalStoragePolicyIcon icon)1372912Sartem libhal_storage_policy_lookup_icon (LibHalStoragePolicy *policy, LibHalStoragePolicyIcon icon)
1382912Sartem {
1392912Sartem 	IconMappingEntry *i;
1402912Sartem 	const char *path;
1412912Sartem 
1422912Sartem 	path = NULL;
1432912Sartem 	for (i = policy->icon_mappings; i != NULL; i = i->next) {
1442912Sartem 		if (i->icon == icon) {
1452912Sartem 			path = i->path;
1462912Sartem 			goto out;
1472912Sartem 		}
1482912Sartem 	}
1492912Sartem out:
1502912Sartem 	return path;
1512912Sartem }
1522912Sartem 
1532912Sartem 
1542912Sartem #define MAX_STRING_SZ 256
1552912Sartem 
1562912Sartem char *
libhal_volume_policy_compute_size_as_string(LibHalVolume * volume)1572912Sartem libhal_volume_policy_compute_size_as_string (LibHalVolume *volume)
1582912Sartem {
1592912Sartem 	dbus_uint64_t size;
1602912Sartem 	char *result;
1612912Sartem 	char* sizes_str[] = {"K", "M", "G", "T", NULL};
1622912Sartem 	dbus_uint64_t cur = 1000L;
1632912Sartem 	dbus_uint64_t base = 10L;
1642912Sartem 	dbus_uint64_t step = 10L*10L*10L;
1652912Sartem 	int cur_str = 0;
1662912Sartem 	char buf[MAX_STRING_SZ];
1672912Sartem 
1682912Sartem 	result = NULL;
1692912Sartem 
1702912Sartem 	size = libhal_volume_get_size (volume);
1712912Sartem 
1722912Sartem 	do {
1732912Sartem 		if (sizes_str[cur_str+1] == NULL || size < cur*step) {
1742912Sartem 			/* found the unit, display a comma number if result is a single digit */
1752912Sartem 			if (size < cur*base) {
1762912Sartem 				snprintf (buf, MAX_STRING_SZ, "%.01f%s",
1772912Sartem 					  ((double)size)/((double)cur), sizes_str[cur_str]);
1782912Sartem 				result = strdup (buf);
1792912Sartem 			} else {
1802912Sartem 				snprintf (buf, MAX_STRING_SZ, "%llu%s", (long long unsigned int) size / cur, sizes_str[cur_str]);
1812912Sartem 				result = strdup (buf);
1822912Sartem 				}
1832912Sartem 			goto out;
1842912Sartem 		}
1852912Sartem 
1862912Sartem 		cur *= step;
1872912Sartem 		cur_str++;
1882912Sartem 	} while (1);
1892912Sartem 
1902912Sartem out:
1912912Sartem 	return result;
1922912Sartem }
1932912Sartem 
1942912Sartem static void
fixup_string(char * s)1952912Sartem fixup_string (char *s)
1962912Sartem {
1972912Sartem 	/* TODO: first strip leading and trailing whitespace */
1982912Sartem 	/*g_strstrip (s);*/
1992912Sartem 
2002912Sartem 	/* TODO: could do nice things on all-upper case strings */
2012912Sartem }
2022912Sartem 
2032912Sartem /* volume may be NULL (e.g. if drive supports removable media) */
2042912Sartem char *
libhal_drive_policy_compute_display_name(LibHalDrive * drive,LibHalVolume * volume,LibHalStoragePolicy * policy)2052912Sartem libhal_drive_policy_compute_display_name (LibHalDrive *drive, LibHalVolume *volume, LibHalStoragePolicy *policy)
2062912Sartem {
2072912Sartem 	char *name;
2082912Sartem 	char *size_str;
2092912Sartem 	char *vendormodel_str;
2102912Sartem 	const char *model;
2112912Sartem 	const char *vendor;
2122912Sartem 	LibHalDriveType drive_type;
2132912Sartem 	dbus_bool_t drive_is_hotpluggable;
2142912Sartem 	dbus_bool_t drive_is_removable;
2152912Sartem 	LibHalDriveCdromCaps drive_cdrom_caps;
2162912Sartem 	char buf[MAX_STRING_SZ];
2172912Sartem 
2182912Sartem 	model = libhal_drive_get_model (drive);
2192912Sartem 	vendor = libhal_drive_get_vendor (drive);
2202912Sartem 	drive_type = libhal_drive_get_type (drive);
2212912Sartem 	drive_is_hotpluggable = libhal_drive_is_hotpluggable (drive);
2222912Sartem 	drive_is_removable = libhal_drive_uses_removable_media (drive);
2232912Sartem 	drive_cdrom_caps = libhal_drive_get_cdrom_caps (drive);
2242912Sartem 
2252912Sartem 	if (volume != NULL)
2262912Sartem 		size_str = libhal_volume_policy_compute_size_as_string (volume);
2272912Sartem 	else
2282912Sartem 		size_str = NULL;
2292912Sartem 
2302912Sartem 	if (vendor == NULL || strlen (vendor) == 0) {
2312912Sartem 		if (model == NULL || strlen (model) == 0)
2322912Sartem 			vendormodel_str = strdup ("");
2332912Sartem 		else
2342912Sartem 			vendormodel_str = strdup (model);
2352912Sartem 	} else {
2362912Sartem 		if (model == NULL || strlen (model) == 0)
2372912Sartem 			vendormodel_str = strdup (vendor);
2382912Sartem 		else {
2392912Sartem 			snprintf (buf, MAX_STRING_SZ, "%s %s", vendor, model);
2402912Sartem 			vendormodel_str = strdup (buf);
2412912Sartem 		}
2422912Sartem 	}
2432912Sartem 
2442912Sartem 	fixup_string (vendormodel_str);
2452912Sartem 
2462912Sartem 	if (drive_type==LIBHAL_DRIVE_TYPE_CDROM) {
2472912Sartem 
2482912Sartem 		/* Optical drive handling */
2492912Sartem 		char *first;
2502912Sartem 		char *second;
2512912Sartem 
2522912Sartem 
2532912Sartem 		first = "CD-ROM";
2542912Sartem 		if (drive_cdrom_caps & LIBHAL_DRIVE_CDROM_CAPS_CDR)
2552912Sartem 			first = "CD-R";
2562912Sartem 		if (drive_cdrom_caps & LIBHAL_DRIVE_CDROM_CAPS_CDRW)
2572912Sartem 			first = "CD-RW";
2582912Sartem 
2592912Sartem 		second = "";
2602912Sartem 		if (drive_cdrom_caps & LIBHAL_DRIVE_CDROM_CAPS_DVDROM)
2612912Sartem 			second = "/DVD-ROM";
2622912Sartem 		if (drive_cdrom_caps & LIBHAL_DRIVE_CDROM_CAPS_DVDPLUSR)
2632912Sartem 			second = "/DVD+R";
2642912Sartem 		if (drive_cdrom_caps & LIBHAL_DRIVE_CDROM_CAPS_DVDPLUSRW)
2652912Sartem 			second = "/DVD+RW";
2662912Sartem 		if (drive_cdrom_caps & LIBHAL_DRIVE_CDROM_CAPS_DVDR)
2672912Sartem 			second = "/DVD-R";
2682912Sartem 		if (drive_cdrom_caps & LIBHAL_DRIVE_CDROM_CAPS_DVDRW)
2692912Sartem 			second = "/DVD-RW";
2702912Sartem 		if (drive_cdrom_caps & LIBHAL_DRIVE_CDROM_CAPS_DVDRAM)
2712912Sartem 			second = "/DVD-RAM";
2722912Sartem 		if ((drive_cdrom_caps & LIBHAL_DRIVE_CDROM_CAPS_DVDR) &&
2732912Sartem 		    (drive_cdrom_caps & LIBHAL_DRIVE_CDROM_CAPS_DVDPLUSR)) {
2742912Sartem 			if(drive_cdrom_caps & LIBHAL_DRIVE_CDROM_CAPS_DVDPLUSRDL)
2752912Sartem 				second = "/DVD±R DL";
2762912Sartem 			else
2772912Sartem 				second = "/DVD±R";
2782912Sartem 		}
2792912Sartem 		if ((drive_cdrom_caps & LIBHAL_DRIVE_CDROM_CAPS_DVDRW) &&
2802912Sartem 		    (drive_cdrom_caps & LIBHAL_DRIVE_CDROM_CAPS_DVDPLUSRW)) {
2812912Sartem                         if(drive_cdrom_caps & LIBHAL_DRIVE_CDROM_CAPS_DVDPLUSRDL ||
2822912Sartem 			   drive_cdrom_caps & LIBHAL_DRIVE_CDROM_CAPS_DVDPLUSRWDL)
2832912Sartem                                 second = "/DVD±RW DL";
2842912Sartem                         else
2852912Sartem                                 second = "/DVD±RW";
2862912Sartem                 }
2872912Sartem 		if (drive_cdrom_caps & LIBHAL_DRIVE_CDROM_CAPS_BDROM)
2882912Sartem 			second = "/BD-ROM";
2892912Sartem 		if (drive_cdrom_caps & LIBHAL_DRIVE_CDROM_CAPS_BDR)
2902912Sartem 			second = "/BD-R";
2912912Sartem 		if (drive_cdrom_caps & LIBHAL_DRIVE_CDROM_CAPS_BDRE)
2922912Sartem 			second = "/BD-RE";
2932912Sartem 		if (drive_cdrom_caps & LIBHAL_DRIVE_CDROM_CAPS_HDDVDROM)
2942912Sartem 			second = "/HD DVD-ROM";
2952912Sartem 		if (drive_cdrom_caps & LIBHAL_DRIVE_CDROM_CAPS_HDDVDR)
2962912Sartem 			second = "/HD DVD-R";
2972912Sartem 		if (drive_cdrom_caps & LIBHAL_DRIVE_CDROM_CAPS_HDDVDRW)
2982912Sartem 			second = "/HD DVD-RW";
2992912Sartem 
3002912Sartem 		if (drive_is_hotpluggable) {
3012912Sartem 			snprintf (buf, MAX_STRING_SZ, _("External %s%s Drive"), first, second);
3022912Sartem 			name = strdup (buf);
3032912Sartem 		} else {
3042912Sartem 			snprintf (buf, MAX_STRING_SZ, _("%s%s Drive"), first, second);
3052912Sartem 			name = strdup (buf);
3062912Sartem 		}
3072912Sartem 
3082912Sartem 	} else if (drive_type==LIBHAL_DRIVE_TYPE_FLOPPY) {
3092912Sartem 
3102912Sartem 		/* Floppy Drive handling */
3112912Sartem 
3122912Sartem 		if (drive_is_hotpluggable)
3132912Sartem 			name = strdup (_("External Floppy Drive"));
3142912Sartem 		else
3152912Sartem 			name = strdup (_("Floppy Drive"));
3162912Sartem 	} else if (drive_type==LIBHAL_DRIVE_TYPE_DISK && !drive_is_removable) {
3172912Sartem 
3182912Sartem 		/* Harddisks */
3192912Sartem 
3202912Sartem 		if (size_str != NULL) {
3212912Sartem 			if (drive_is_hotpluggable) {
3222912Sartem 				snprintf (buf, MAX_STRING_SZ, _("%s External Hard Drive"), size_str);
3232912Sartem 				name = strdup (buf);
3242912Sartem 			} else {
3252912Sartem 				snprintf (buf, MAX_STRING_SZ, _("%s Hard Drive"), size_str);
3262912Sartem 				name = strdup (buf);
3272912Sartem 			}
3282912Sartem 		} else {
3292912Sartem 			if (drive_is_hotpluggable)
3302912Sartem 				name = strdup (_("External Hard Drive"));
3312912Sartem 			else
3322912Sartem 				name = strdup (_("Hard Drive"));
3332912Sartem 		}
3342912Sartem 	} else {
3352912Sartem 
3362912Sartem 		/* The rest - includes drives with removable Media */
3372912Sartem 
3382912Sartem 		if (strlen (vendormodel_str) > 0)
3392912Sartem 			name = strdup (vendormodel_str);
3402912Sartem 		else
3412912Sartem 			name = strdup (_("Drive"));
3422912Sartem 	}
3432912Sartem 
3442912Sartem 	free (vendormodel_str);
3452912Sartem 	free (size_str);
3462912Sartem 
3472912Sartem 	return name;
3482912Sartem }
3492912Sartem 
3502912Sartem char *
libhal_volume_policy_compute_display_name(LibHalDrive * drive,LibHalVolume * volume,LibHalStoragePolicy * policy)3512912Sartem libhal_volume_policy_compute_display_name (LibHalDrive *drive, LibHalVolume *volume, LibHalStoragePolicy *policy)
3522912Sartem {
3532912Sartem 	char *name;
3542912Sartem 	char *size_str;
3552912Sartem 	const char *volume_label;
3562912Sartem 	const char *model;
3572912Sartem 	const char *vendor;
3582912Sartem 	LibHalDriveType drive_type;
3592912Sartem 	dbus_bool_t drive_is_hotpluggable;
3602912Sartem 	dbus_bool_t drive_is_removable;
3612912Sartem 	LibHalDriveCdromCaps drive_cdrom_caps;
3622912Sartem 	char buf[MAX_STRING_SZ];
3632912Sartem 
3642912Sartem 	volume_label = libhal_volume_get_label (volume);
3652912Sartem 	model = libhal_drive_get_model (drive);
3662912Sartem 	vendor = libhal_drive_get_vendor (drive);
3672912Sartem 	drive_type = libhal_drive_get_type (drive);
3682912Sartem 	drive_is_hotpluggable = libhal_drive_is_hotpluggable (drive);
3692912Sartem 	drive_is_removable = libhal_drive_uses_removable_media (drive);
3702912Sartem 	drive_cdrom_caps = libhal_drive_get_cdrom_caps (drive);
3712912Sartem 
3722912Sartem 	size_str = libhal_volume_policy_compute_size_as_string (volume);
3732912Sartem 
3742912Sartem 	/* If the volume label is available use that
3752912Sartem 	 *
3762912Sartem 	 * TODO: If label is a fully-qualified UNIX path don't use that
3772912Sartem 	 */
3782912Sartem 	if (volume_label != NULL) {
3792912Sartem 		name = strdup (volume_label);
3802912Sartem 		goto out;
3812912Sartem 	}
3822912Sartem 
3832912Sartem 	/* Handle media in optical drives */
3842912Sartem 	if (drive_type==LIBHAL_DRIVE_TYPE_CDROM) {
3852912Sartem 		switch (libhal_volume_get_disc_type (volume)) {
3862912Sartem 
3872912Sartem 		default:
3882912Sartem 			/* explict fallthrough */
3892912Sartem 		case LIBHAL_VOLUME_DISC_TYPE_CDROM:
3902912Sartem 			name = strdup (_("CD-ROM "));
3912912Sartem 			break;
3922912Sartem 
3932912Sartem 		case LIBHAL_VOLUME_DISC_TYPE_CDR:
3942912Sartem 			if (libhal_volume_disc_is_blank (volume))
3952912Sartem 				name = strdup (_("Blank CD-R"));
3962912Sartem 			else
3972912Sartem 				name = strdup (_("CD-R"));
3982912Sartem 			break;
3992912Sartem 
4002912Sartem 		case LIBHAL_VOLUME_DISC_TYPE_CDRW:
4012912Sartem 			if (libhal_volume_disc_is_blank (volume))
4022912Sartem 				name = strdup (_("Blank CD-RW"));
4032912Sartem 			else
4042912Sartem 				name = strdup (_("CD-RW"));
4052912Sartem 			break;
4062912Sartem 
4072912Sartem 		case LIBHAL_VOLUME_DISC_TYPE_DVDROM:
4082912Sartem 			name = strdup (_("DVD-ROM"));
4092912Sartem 			break;
4102912Sartem 
4112912Sartem 		case LIBHAL_VOLUME_DISC_TYPE_DVDRAM:
4122912Sartem 			if (libhal_volume_disc_is_blank (volume))
4132912Sartem 				name = strdup (_("Blank DVD-RAM"));
4142912Sartem 			else
4152912Sartem 				name = strdup (_("DVD-RAM"));
4162912Sartem 			break;
4172912Sartem 
4182912Sartem 		case LIBHAL_VOLUME_DISC_TYPE_DVDR:
4192912Sartem 			if (libhal_volume_disc_is_blank (volume))
4202912Sartem 				name = strdup (_("Blank DVD-R"));
4212912Sartem 			else
4222912Sartem 				name = strdup (_("DVD-R"));
4232912Sartem 			break;
4242912Sartem 
4252912Sartem 		case LIBHAL_VOLUME_DISC_TYPE_DVDRW:
4262912Sartem 			if (libhal_volume_disc_is_blank (volume))
4272912Sartem 				name = strdup (_("Blank DVD-RW"));
4282912Sartem 			else
4292912Sartem 				name = strdup (_("DVD-RW"));
4302912Sartem 			break;
4312912Sartem 
4322912Sartem 		case LIBHAL_VOLUME_DISC_TYPE_DVDPLUSR:
4332912Sartem 			if (libhal_volume_disc_is_blank (volume))
4342912Sartem 				name = strdup (_("Blank DVD+R"));
4352912Sartem 			else
4362912Sartem 				name = strdup (_("DVD+R"));
4372912Sartem 			break;
4382912Sartem 
4392912Sartem 		case LIBHAL_VOLUME_DISC_TYPE_DVDPLUSRW:
4402912Sartem 			if (libhal_volume_disc_is_blank (volume))
4412912Sartem 				name = strdup (_("Blank DVD+RW"));
4422912Sartem 			else
4432912Sartem 				name = strdup (_("DVD+RW"));
4442912Sartem 			break;
4452912Sartem 
4462912Sartem 		case LIBHAL_VOLUME_DISC_TYPE_DVDPLUSR_DL:
4472912Sartem 			if (libhal_volume_disc_is_blank (volume))
4482912Sartem 				name = strdup (_("Blank DVD+R Dual-Layer"));
4492912Sartem 			else
4502912Sartem 				name = strdup (_("DVD+R Dual-Layer"));
4512912Sartem 			break;
4522912Sartem 
4532912Sartem 		case LIBHAL_VOLUME_DISC_TYPE_BDROM:
4542912Sartem 			name = strdup (_("BD-ROM"));
4552912Sartem 			break;
4562912Sartem 
4572912Sartem 		case LIBHAL_VOLUME_DISC_TYPE_BDR:
4582912Sartem 			if (libhal_volume_disc_is_blank (volume))
4592912Sartem 				name = strdup (_("Blank BD-R"));
4602912Sartem 			else
4612912Sartem 				name = strdup (_("BD-R"));
4622912Sartem 			break;
4632912Sartem 
4642912Sartem 		case LIBHAL_VOLUME_DISC_TYPE_BDRE:
4652912Sartem 			if (libhal_volume_disc_is_blank (volume))
4662912Sartem 				name = strdup (_("Blank BD-RE"));
4672912Sartem 			else
4682912Sartem 				name = strdup (_("BD-RE"));
4692912Sartem 			break;
4702912Sartem 
4712912Sartem 		case LIBHAL_VOLUME_DISC_TYPE_HDDVDROM:
4722912Sartem 			name = strdup (_("HD DVD-ROM"));
4732912Sartem 			break;
4742912Sartem 
4752912Sartem 		case LIBHAL_VOLUME_DISC_TYPE_HDDVDR:
4762912Sartem 			if (libhal_volume_disc_is_blank (volume))
4772912Sartem 				name = strdup (_("Blank HD DVD-R"));
4782912Sartem 			else
4792912Sartem 				name = strdup (_("HD DVD-R"));
4802912Sartem 			break;
4812912Sartem 
4822912Sartem 		case LIBHAL_VOLUME_DISC_TYPE_HDDVDRW:
4832912Sartem 			if (libhal_volume_disc_is_blank (volume))
4842912Sartem 				name = strdup (_("Blank HD DVD-RW"));
4852912Sartem 			else
4862912Sartem 				name = strdup (_("HD DVD-RW"));
4872912Sartem 			break;
4882912Sartem 
4892912Sartem 		}
4902912Sartem 
4912912Sartem 		/* Special case for pure audio disc */
4922912Sartem 		if (libhal_volume_disc_has_audio (volume) && !libhal_volume_disc_has_data (volume)) {
4932912Sartem 			free (name);
4942912Sartem 			name = strdup (_("Audio CD"));
4952912Sartem 		}
4962912Sartem 
4972912Sartem 		goto out;
4982912Sartem 	}
4992912Sartem 
5002912Sartem 	/* Fallback: size of media */
5012912Sartem 	if (drive_is_removable) {
5022912Sartem 		snprintf (buf, MAX_STRING_SZ, _("%s Removable Media"), size_str);
5032912Sartem 		name = strdup (buf);
5042912Sartem 	} else {
5052912Sartem 		snprintf (buf, MAX_STRING_SZ, _("%s Media"), size_str);
5062912Sartem 		name = strdup (buf);
5072912Sartem 	}
5082912Sartem 
5092912Sartem 	/* Fallback: Use drive name */
5102912Sartem 	/*name = libhal_drive_policy_compute_display_name (drive, volume);*/
5112912Sartem 
5122912Sartem out:
5132912Sartem 	free (size_str);
5142912Sartem 	return name;
5152912Sartem }
5162912Sartem 
5172912Sartem char *
libhal_drive_policy_compute_icon_name(LibHalDrive * drive,LibHalVolume * volume,LibHalStoragePolicy * policy)5182912Sartem libhal_drive_policy_compute_icon_name (LibHalDrive *drive, LibHalVolume *volume, LibHalStoragePolicy *policy)
5192912Sartem {
5202912Sartem 	const char *name;
5212912Sartem 	LibHalDriveBus bus;
5222912Sartem 	LibHalDriveType drive_type;
5232912Sartem 
5242912Sartem 	bus        = libhal_drive_get_bus (drive);
5252912Sartem 	drive_type = libhal_drive_get_type (drive);
5262912Sartem 
5272912Sartem 	/* by design, the enums are laid out so we can do easy computations */
5282912Sartem 
5292912Sartem 	switch (drive_type) {
5302912Sartem 	case LIBHAL_DRIVE_TYPE_REMOVABLE_DISK:
5312912Sartem 	case LIBHAL_DRIVE_TYPE_DISK:
5322912Sartem 	case LIBHAL_DRIVE_TYPE_CDROM:
5332912Sartem 	case LIBHAL_DRIVE_TYPE_FLOPPY:
5342912Sartem 		name = libhal_storage_policy_lookup_icon (policy, 0x10000 + drive_type*0x100 + bus);
5352912Sartem 		break;
5362912Sartem 
5372912Sartem 	default:
5382912Sartem 		name = libhal_storage_policy_lookup_icon (policy, 0x10000 + drive_type*0x100);
5392912Sartem 	}
5402912Sartem 
5412912Sartem 	if (name != NULL)
5422912Sartem 		return strdup (name);
5432912Sartem 	else
5442912Sartem 		return NULL;
5452912Sartem }
5462912Sartem 
5472912Sartem char *
libhal_volume_policy_compute_icon_name(LibHalDrive * drive,LibHalVolume * volume,LibHalStoragePolicy * policy)5482912Sartem libhal_volume_policy_compute_icon_name (LibHalDrive *drive, LibHalVolume *volume, LibHalStoragePolicy *policy)
5492912Sartem {
5502912Sartem 	const char *name;
5512912Sartem 	LibHalDriveBus bus;
5522912Sartem 	LibHalDriveType drive_type;
5532912Sartem 	LibHalVolumeDiscType disc_type;
5542912Sartem 
5552912Sartem 	/* by design, the enums are laid out so we can do easy computations */
5562912Sartem 
5572912Sartem 	if (libhal_volume_is_disc (volume)) {
5582912Sartem 		disc_type = libhal_volume_get_disc_type (volume);
5592912Sartem 		name = libhal_storage_policy_lookup_icon (policy, 0x30000 + disc_type);
5602912Sartem 		goto out;
5612912Sartem 	}
5622912Sartem 
5632912Sartem 	if (drive == NULL) {
5642912Sartem 		name = libhal_storage_policy_lookup_icon (policy, LIBHAL_STORAGE_ICON_VOLUME_REMOVABLE_DISK);
5652912Sartem 		goto out;
5662912Sartem 	}
5672912Sartem 
5682912Sartem 	bus        = libhal_drive_get_bus (drive);
5692912Sartem 	drive_type = libhal_drive_get_type (drive);
5702912Sartem 
5712912Sartem 	switch (drive_type) {
5722912Sartem 	case LIBHAL_DRIVE_TYPE_REMOVABLE_DISK:
5732912Sartem 	case LIBHAL_DRIVE_TYPE_DISK:
5742912Sartem 	case LIBHAL_DRIVE_TYPE_CDROM:
5752912Sartem 	case LIBHAL_DRIVE_TYPE_FLOPPY:
5762912Sartem 		name = libhal_storage_policy_lookup_icon (policy, 0x20000 + drive_type*0x100 + bus);
5772912Sartem 		break;
5782912Sartem 
5792912Sartem 	default:
5802912Sartem 		name = libhal_storage_policy_lookup_icon (policy, 0x20000 + drive_type*0x100);
5812912Sartem 	}
5822912Sartem out:
5832912Sartem 	if (name != NULL)
5842912Sartem 		return strdup (name);
5852912Sartem 	else
5862912Sartem 		return NULL;
5872912Sartem }
5882912Sartem 
5892912Sartem /** Policy function to determine if a volume should be visible in a desktop
5902912Sartem  *  environment. This is useful to hide certain system volumes as bootstrap
5912912Sartem  *  partitions, the /usr partition, swap partitions and other volumes that
5922912Sartem  *  a unprivileged desktop user shouldn't know even exists.
5932912Sartem  *
5942912Sartem  *  @param  drive               Drive that the volume is stemming from
5952912Sartem  *  @param  volume              Volume
5962912Sartem  *  @param  policy              Policy object
5972912Sartem  *  @param  target_mount_point  The mount point that the volume is expected to
5982912Sartem  *                              be mounted at if not already mounted. This may
5992912Sartem  *                              e.g. stem from /etc/fstab. If this is NULL the
6002912Sartem  *                              then mount point isn't taking into account when
6012912Sartem  *                              evaluating whether the volume should be visible
6022912Sartem  *  @return                     Whether the volume should be shown in a desktop
6032912Sartem  *                              environment.
6042912Sartem  */
6052912Sartem dbus_bool_t
libhal_volume_policy_should_be_visible(LibHalDrive * drive,LibHalVolume * volume,LibHalStoragePolicy * policy,const char * target_mount_point)6062912Sartem libhal_volume_policy_should_be_visible (LibHalDrive *drive, LibHalVolume *volume, LibHalStoragePolicy *policy,
6072912Sartem 				     const char *target_mount_point)
6082912Sartem {
6092912Sartem 	unsigned int i;
6102912Sartem 	dbus_bool_t is_visible;
6112912Sartem 	const char *label;
6122912Sartem 	const char *mount_point;
6132912Sartem 	const char *fstype;
6142912Sartem 	const char *fhs23_toplevel_mount_points[] = {
6152912Sartem 		"/",
6162912Sartem 		"/bin",
6172912Sartem 		"/boot",
6182912Sartem 		"/dev",
6192912Sartem 		"/etc",
6202912Sartem 		"/home",
6212912Sartem 		"/lib",
6222912Sartem 		"/lib64",
6232912Sartem 		"/media",
6242912Sartem 		"/mnt",
6252912Sartem 		"/opt",
6262912Sartem 		"/root",
6272912Sartem 		"/sbin",
6282912Sartem 		"/srv",
6292912Sartem 		"/tmp",
6302912Sartem 		"/usr",
6312912Sartem 		"/var",
6322912Sartem 		"/proc",
6332912Sartem 		"/sbin",
6342912Sartem 		NULL
6352912Sartem 	};
6362912Sartem 
6372912Sartem 	is_visible = FALSE;
6382912Sartem 
6392912Sartem 	/* skip if hal says it's not used as a filesystem */
6402912Sartem 	if (libhal_volume_get_fsusage (volume) != LIBHAL_VOLUME_USAGE_MOUNTABLE_FILESYSTEM)
6412912Sartem 		goto out;
6422912Sartem 
6432912Sartem 	label = libhal_volume_get_label (volume);
6442912Sartem 	mount_point = libhal_volume_get_mount_point (volume);
6452912Sartem 	fstype = libhal_volume_get_fstype (volume);
6462912Sartem 
6472912Sartem 	/* use target mount point if we're not mounted yet */
6482912Sartem 	if (mount_point == NULL)
6492912Sartem 		mount_point = target_mount_point;
6502912Sartem 
6512912Sartem 	/* bail out if we don't know the filesystem */
6522912Sartem 	if (fstype == NULL)
6532912Sartem 		goto out;
6542912Sartem 
6552912Sartem 	/* blacklist fhs2.3 top level mount points */
6562912Sartem 	if (mount_point != NULL) {
6572912Sartem 		for (i = 0; fhs23_toplevel_mount_points[i] != NULL; i++) {
6582912Sartem 			if (strcmp (mount_point, fhs23_toplevel_mount_points[i]) == 0)
6592912Sartem 				goto out;
6602912Sartem 		}
6612912Sartem 	}
6622912Sartem 
6632912Sartem 	/* blacklist partitions with name 'bootstrap' of type HFS (Apple uses that) */
6642912Sartem 	if (label != NULL && strcmp (label, "bootstrap") == 0 && strcmp (fstype, "hfs") == 0)
6652912Sartem 		goto out;
6662912Sartem 
6672912Sartem 	/* only the real lucky mount points will make it this far :-) */
6682912Sartem 	is_visible = TRUE;
6692912Sartem 
6702912Sartem out:
6712912Sartem 	return is_visible;
6722912Sartem }
6732912Sartem 
6742912Sartem /*************************************************************************/
6752912Sartem 
6762912Sartem #define MOUNT_OPTIONS_SIZE 256
6772912Sartem 
6782912Sartem struct LibHalDrive_s {
6792912Sartem 	char *udi;
6802912Sartem 
6812912Sartem 	int device_major;
6822912Sartem 	int device_minor;
6832912Sartem 	char *device_file;
6842912Sartem 
6852912Sartem 	LibHalDriveBus bus;
6862912Sartem 	char *vendor;             /* may be "", is never NULL */
6872912Sartem 	char *model;              /* may be "", is never NULL */
6882912Sartem 	dbus_bool_t is_hotpluggable;
6892912Sartem 	dbus_bool_t is_removable;
6902912Sartem 	dbus_bool_t is_media_detected;
6912912Sartem 	dbus_bool_t requires_eject;
6922912Sartem 
6932912Sartem 	LibHalDriveType type;
6942912Sartem 	char *type_textual;
6952912Sartem 
6962912Sartem 	char *physical_device;  /* UDI of physical device, e.g. the
6972912Sartem 				 * IDE, USB, IEEE1394 device */
6982912Sartem 
6992912Sartem 	char *dedicated_icon_drive;
7002912Sartem 	char *dedicated_icon_volume;
7012912Sartem 
7022912Sartem 	char *serial;
7032912Sartem 	char *firmware_version;
7042912Sartem 	LibHalDriveCdromCaps cdrom_caps;
7052912Sartem 
7062912Sartem 	char *desired_mount_point;
7072912Sartem 	char *mount_filesystem;
7082912Sartem 	dbus_bool_t should_mount;
7092912Sartem 
7102912Sartem 	dbus_bool_t no_partitions_hint;
7112912Sartem 
7122912Sartem 	dbus_uint64_t drive_size;
7132912Sartem 	dbus_uint64_t drive_media_size;
7142912Sartem 	char *partition_scheme;
7152912Sartem 
7162912Sartem 	LibHalContext *hal_ctx;
7172912Sartem 
7182912Sartem 	char **capabilities;
7192912Sartem 
7202912Sartem 	char mount_options[MOUNT_OPTIONS_SIZE];
7212912Sartem };
7222912Sartem 
7232912Sartem struct LibHalVolume_s {
7242912Sartem 	char *udi;
7252912Sartem 
7262912Sartem 	int device_major;
7272912Sartem 	int device_minor;
7282912Sartem 	char *device_file;
7292912Sartem 	char *volume_label; /* may be NULL, is never "" */
7302912Sartem 	dbus_bool_t is_mounted;
7312912Sartem 	dbus_bool_t is_mounted_read_only; /* TRUE iff is_mounted and r/o fs */
7322912Sartem 	char *mount_point;  /* NULL iff !is_mounted */
7332912Sartem 	char *fstype;       /* NULL iff !is_mounted or unknown */
7342912Sartem 	char *fsversion;
7352912Sartem 	char *uuid;
7362912Sartem 	char *storage_device;
7372912Sartem 
7382912Sartem 	LibHalVolumeUsage fsusage;
7392912Sartem 
7402912Sartem 	dbus_bool_t is_partition;
7412912Sartem 	unsigned int partition_number;
7422912Sartem 	char *partition_scheme;
7432912Sartem 	char *partition_type;
7442912Sartem 	char *partition_label;
7452912Sartem 	char *partition_uuid;
7462912Sartem 	char **partition_flags;
7472912Sartem 
7482912Sartem 	int msdos_part_table_type;
7492912Sartem 	dbus_uint64_t msdos_part_table_start;
7502912Sartem 	dbus_uint64_t msdos_part_table_size;
7512912Sartem 
7522912Sartem 	dbus_bool_t is_disc;
7532912Sartem 	LibHalVolumeDiscType disc_type;
7542912Sartem 	dbus_bool_t disc_has_audio;
7552912Sartem 	dbus_bool_t disc_has_data;
7562912Sartem 	dbus_bool_t disc_is_appendable;
7572912Sartem 	dbus_bool_t disc_is_blank;
7582912Sartem 	dbus_bool_t disc_is_rewritable;
7592912Sartem 
7602912Sartem 	unsigned int block_size;
7612912Sartem 	unsigned int num_blocks;
7622912Sartem 
7632912Sartem 	char *desired_mount_point;
7642912Sartem 	char *mount_filesystem;
7652912Sartem 	dbus_bool_t should_mount;
7662912Sartem 
7672912Sartem 	dbus_bool_t ignore_volume;
7682912Sartem 
7692912Sartem 	char *crypto_backing_volume;
7702912Sartem 
7712912Sartem 	char mount_options[MOUNT_OPTIONS_SIZE];
7722912Sartem 
7732912Sartem 	dbus_uint64_t volume_size;
7742912Sartem 	dbus_uint64_t disc_capacity;
7752912Sartem 
7762912Sartem 	dbus_uint64_t partition_start_offset;
7772912Sartem 	dbus_uint64_t partition_media_size;
7782912Sartem };
7792912Sartem 
7802912Sartem const char *
libhal_drive_get_dedicated_icon_drive(LibHalDrive * drive)7812912Sartem libhal_drive_get_dedicated_icon_drive (LibHalDrive *drive)
7822912Sartem {
7832912Sartem 	return drive->dedicated_icon_drive;
7842912Sartem }
7852912Sartem 
7862912Sartem const char *
libhal_drive_get_dedicated_icon_volume(LibHalDrive * drive)7872912Sartem libhal_drive_get_dedicated_icon_volume (LibHalDrive *drive)
7882912Sartem {
7892912Sartem 	return drive->dedicated_icon_volume;
7902912Sartem }
7912912Sartem 
7922912Sartem /** Free all resources used by a LibHalDrive object.
7932912Sartem  *
7942912Sartem  *  @param  drive               Object to free
7952912Sartem  */
7962912Sartem void
libhal_drive_free(LibHalDrive * drive)7972912Sartem libhal_drive_free (LibHalDrive *drive)
7982912Sartem {
7992912Sartem 	if (drive == NULL )
8002912Sartem 		return;
8012912Sartem 
8022912Sartem 	free (drive->udi);
8032912Sartem 	libhal_free_string (drive->device_file);
8042912Sartem 	libhal_free_string (drive->vendor);
8052912Sartem 	libhal_free_string (drive->model);
8062912Sartem 	libhal_free_string (drive->type_textual);
8072912Sartem 	libhal_free_string (drive->physical_device);
8082912Sartem 	libhal_free_string (drive->dedicated_icon_drive);
8092912Sartem 	libhal_free_string (drive->dedicated_icon_volume);
8102912Sartem 	libhal_free_string (drive->serial);
8112912Sartem 	libhal_free_string (drive->firmware_version);
8122912Sartem 	libhal_free_string (drive->desired_mount_point);
8132912Sartem 	libhal_free_string (drive->mount_filesystem);
8142912Sartem 	libhal_free_string_array (drive->capabilities);
8152912Sartem 	libhal_free_string (drive->partition_scheme);
8162912Sartem 
8172912Sartem 	free (drive);
8182912Sartem }
8192912Sartem 
8202912Sartem 
8212912Sartem /** Free all resources used by a LibHalVolume object.
8222912Sartem  *
8232912Sartem  *  @param  vol              Object to free
8242912Sartem  */
8252912Sartem void
libhal_volume_free(LibHalVolume * vol)8262912Sartem libhal_volume_free (LibHalVolume *vol)
8272912Sartem {
8282912Sartem 	if (vol == NULL )
8292912Sartem 		return;
8302912Sartem 
8312912Sartem 	free (vol->udi);
8322912Sartem 	libhal_free_string (vol->device_file);
8332912Sartem 	libhal_free_string (vol->volume_label);
8342912Sartem 	libhal_free_string (vol->fstype);
8352912Sartem 	libhal_free_string (vol->mount_point);
8362912Sartem 	libhal_free_string (vol->fsversion);
8372912Sartem 	libhal_free_string (vol->uuid);
8382912Sartem 	libhal_free_string (vol->desired_mount_point);
8392912Sartem 	libhal_free_string (vol->mount_filesystem);
8402912Sartem 	libhal_free_string (vol->crypto_backing_volume);
8412912Sartem 	libhal_free_string (vol->storage_device);
8422912Sartem 
8432912Sartem 	libhal_free_string (vol->partition_scheme);
8442912Sartem 	libhal_free_string (vol->partition_type);
8452912Sartem 	libhal_free_string (vol->partition_label);
8462912Sartem 	libhal_free_string (vol->partition_uuid);
8472912Sartem 	libhal_free_string_array (vol->partition_flags);
8482912Sartem 
8492912Sartem 	free (vol);
8502912Sartem }
8512912Sartem 
8522912Sartem 
8532912Sartem static char **
my_strvdup(char ** strv)8542912Sartem my_strvdup (char **strv)
8552912Sartem {
8562912Sartem 	unsigned int num_elems;
8572912Sartem 	unsigned int i;
8582912Sartem 	char **res;
8592912Sartem 
8602912Sartem 	for (num_elems = 0; strv[num_elems] != NULL; num_elems++)
8612912Sartem 		;
8622912Sartem 
8632912Sartem 	res = calloc (num_elems + 1, sizeof (char*));
8642912Sartem 	if (res == NULL)
8652912Sartem 		goto out;
8662912Sartem 
8672912Sartem 	for (i = 0; i < num_elems; i++)
8682912Sartem 		res[i] = strdup (strv[i]);
8692912Sartem 	res[i] = NULL;
8702912Sartem 
8712912Sartem out:
8722912Sartem 	return res;
8732912Sartem }
8742912Sartem 
8752912Sartem /* ok, hey, so this is a bit ugly */
8762912Sartem 
8772912Sartem #define LIBHAL_PROP_EXTRACT_BEGIN if (FALSE)
8782912Sartem #define LIBHAL_PROP_EXTRACT_END ;
8792912Sartem #define LIBHAL_PROP_EXTRACT_INT(_property_, _where_) else if (strcmp (key, _property_) == 0 && type == LIBHAL_PROPERTY_TYPE_INT32) _where_ = libhal_psi_get_int (&it)
8802912Sartem #define LIBHAL_PROP_EXTRACT_UINT64(_property_, _where_) else if (strcmp (key, _property_) == 0 && type == LIBHAL_PROPERTY_TYPE_UINT64) _where_ = libhal_psi_get_uint64 (&it)
8812912Sartem #define LIBHAL_PROP_EXTRACT_STRING(_property_, _where_) else if (strcmp (key, _property_) == 0 && type == LIBHAL_PROPERTY_TYPE_STRING) _where_ = (libhal_psi_get_string (&it) != NULL && strlen (libhal_psi_get_string (&it)) > 0) ? strdup (libhal_psi_get_string (&it)) : NULL
8822912Sartem #define LIBHAL_PROP_EXTRACT_BOOL(_property_, _where_) else if (strcmp (key, _property_) == 0 && type == LIBHAL_PROPERTY_TYPE_BOOLEAN) _where_ = libhal_psi_get_bool (&it)
8832912Sartem #define LIBHAL_PROP_EXTRACT_BOOL_BITFIELD(_property_, _where_, _field_) else if (strcmp (key, _property_) == 0 && type == LIBHAL_PROPERTY_TYPE_BOOLEAN) _where_ |= libhal_psi_get_bool (&it) ? _field_ : 0
8842912Sartem #define LIBHAL_PROP_EXTRACT_STRLIST(_property_, _where_) else if (strcmp (key, _property_) == 0 && type == LIBHAL_PROPERTY_TYPE_STRLIST) _where_ = my_strvdup (libhal_psi_get_strlist (&it))
8852912Sartem 
8862912Sartem /** Given a UDI for a HAL device of capability 'storage', this
8872912Sartem  *  function retrieves all the relevant properties into convenient
8882912Sartem  *  in-process data structures.
8892912Sartem  *
8902912Sartem  *  @param  hal_ctx             libhal context
8912912Sartem  *  @param  udi                 HAL UDI
8922912Sartem  *  @return                     LibHalDrive object or NULL if UDI is invalid
8932912Sartem  */
8942912Sartem LibHalDrive *
libhal_drive_from_udi(LibHalContext * hal_ctx,const char * udi)8952912Sartem libhal_drive_from_udi (LibHalContext *hal_ctx, const char *udi)
8962912Sartem {
8972912Sartem 	char *bus_textual;
8982912Sartem 	LibHalDrive *drive;
8992912Sartem 	LibHalPropertySet *properties;
9002912Sartem 	LibHalPropertySetIterator it;
9012912Sartem 	DBusError error;
9022912Sartem 	unsigned int i;
9032912Sartem 
9042912Sartem 	LIBHAL_CHECK_LIBHALCONTEXT(hal_ctx, NULL);
9052912Sartem 
9062912Sartem 	drive = NULL;
9072912Sartem 	properties = NULL;
9082912Sartem 	bus_textual = NULL;
9092912Sartem 
9102912Sartem 	dbus_error_init (&error);
9112912Sartem 	if (!libhal_device_query_capability (hal_ctx, udi, "storage", &error))
9122912Sartem 		goto error;
9132912Sartem 
9142912Sartem 	drive = malloc (sizeof (LibHalDrive));
9152912Sartem 	if (drive == NULL)
9162912Sartem 		goto error;
9172912Sartem 	memset (drive, 0x00, sizeof (LibHalDrive));
9182912Sartem 
9192912Sartem 	drive->hal_ctx = hal_ctx;
9202912Sartem 
9212912Sartem 	drive->udi = strdup (udi);
9222912Sartem 	if (drive->udi == NULL)
9232912Sartem 		goto error;
9242912Sartem 
9252912Sartem 	properties = libhal_device_get_all_properties (hal_ctx, udi, &error);
9262912Sartem 	if (properties == NULL)
9272912Sartem 		goto error;
9282912Sartem 
9292912Sartem 	/* we can count on hal to give us all these properties */
9302912Sartem 	for (libhal_psi_init (&it, properties); libhal_psi_has_more (&it); libhal_psi_next (&it)) {
9312912Sartem 		int type;
9322912Sartem 		char *key;
9332912Sartem 
9342912Sartem 		type = libhal_psi_get_type (&it);
9352912Sartem 		key = libhal_psi_get_key (&it);
9362912Sartem 
9372912Sartem 		LIBHAL_PROP_EXTRACT_BEGIN;
9382912Sartem 
9392912Sartem 		LIBHAL_PROP_EXTRACT_INT    ("block.minor",               drive->device_minor);
9402912Sartem 		LIBHAL_PROP_EXTRACT_INT    ("block.major",               drive->device_major);
9412912Sartem 		LIBHAL_PROP_EXTRACT_STRING ("block.device",              drive->device_file);
9422912Sartem 		LIBHAL_PROP_EXTRACT_STRING ("storage.bus",               bus_textual);
9432912Sartem 		LIBHAL_PROP_EXTRACT_STRING ("storage.vendor",            drive->vendor);
9442912Sartem 		LIBHAL_PROP_EXTRACT_STRING ("storage.model",             drive->model);
9452912Sartem 		LIBHAL_PROP_EXTRACT_STRING ("storage.drive_type",        drive->type_textual);
9462912Sartem 		LIBHAL_PROP_EXTRACT_UINT64 ("storage.size", 		 drive->drive_size);
9472912Sartem 
9482912Sartem 		LIBHAL_PROP_EXTRACT_STRING ("storage.icon.drive",        drive->dedicated_icon_drive);
9492912Sartem 		LIBHAL_PROP_EXTRACT_STRING ("storage.icon.volume",       drive->dedicated_icon_volume);
9502912Sartem 
9512912Sartem 		LIBHAL_PROP_EXTRACT_BOOL   ("storage.hotpluggable",      drive->is_hotpluggable);
9522912Sartem 		LIBHAL_PROP_EXTRACT_BOOL   ("storage.removable",         drive->is_removable);
9532912Sartem 		LIBHAL_PROP_EXTRACT_BOOL   ("storage.removable.media_available", drive->is_media_detected);
9542912Sartem 		LIBHAL_PROP_EXTRACT_UINT64 ("storage.removable.media_size", drive->drive_media_size);
9552912Sartem 		LIBHAL_PROP_EXTRACT_BOOL   ("storage.requires_eject",    drive->requires_eject);
9562912Sartem 
9572912Sartem 		LIBHAL_PROP_EXTRACT_STRING ("storage.partitioning_scheme", drive->partition_scheme);
9582912Sartem 
9592912Sartem 		LIBHAL_PROP_EXTRACT_STRING ("storage.physical_device",   drive->physical_device);
9602912Sartem 		LIBHAL_PROP_EXTRACT_STRING ("storage.firmware_version",  drive->firmware_version);
9612912Sartem 		LIBHAL_PROP_EXTRACT_STRING ("storage.serial",            drive->serial);
9622912Sartem 
9632912Sartem 		LIBHAL_PROP_EXTRACT_BOOL_BITFIELD ("storage.cdrom.cdr", drive->cdrom_caps, LIBHAL_DRIVE_CDROM_CAPS_CDR);
9642912Sartem 		LIBHAL_PROP_EXTRACT_BOOL_BITFIELD ("storage.cdrom.cdrw", drive->cdrom_caps, LIBHAL_DRIVE_CDROM_CAPS_CDRW);
9652912Sartem 		LIBHAL_PROP_EXTRACT_BOOL_BITFIELD ("storage.cdrom.dvd", drive->cdrom_caps, LIBHAL_DRIVE_CDROM_CAPS_DVDROM);
9662912Sartem 		LIBHAL_PROP_EXTRACT_BOOL_BITFIELD ("storage.cdrom.dvdplusr", drive->cdrom_caps, LIBHAL_DRIVE_CDROM_CAPS_DVDPLUSR);
9672912Sartem 		LIBHAL_PROP_EXTRACT_BOOL_BITFIELD ("storage.cdrom.dvdplusrw", drive->cdrom_caps, LIBHAL_DRIVE_CDROM_CAPS_DVDPLUSRW);
9682912Sartem 		LIBHAL_PROP_EXTRACT_BOOL_BITFIELD ("storage.cdrom.dvdplusrwdl", drive->cdrom_caps, LIBHAL_DRIVE_CDROM_CAPS_DVDPLUSRWDL);
9692912Sartem 		LIBHAL_PROP_EXTRACT_BOOL_BITFIELD ("storage.cdrom.dvdplusrdl", drive->cdrom_caps, LIBHAL_DRIVE_CDROM_CAPS_DVDPLUSRDL);
9702912Sartem 		LIBHAL_PROP_EXTRACT_BOOL_BITFIELD ("storage.cdrom.dvdr", drive->cdrom_caps, LIBHAL_DRIVE_CDROM_CAPS_DVDR);
9712912Sartem 		LIBHAL_PROP_EXTRACT_BOOL_BITFIELD ("storage.cdrom.dvdrw", drive->cdrom_caps, LIBHAL_DRIVE_CDROM_CAPS_DVDRW);
9722912Sartem 		LIBHAL_PROP_EXTRACT_BOOL_BITFIELD ("storage.cdrom.dvdram", drive->cdrom_caps, LIBHAL_DRIVE_CDROM_CAPS_DVDRAM);
9732912Sartem 		LIBHAL_PROP_EXTRACT_BOOL_BITFIELD ("storage.cdrom.bd", drive->cdrom_caps, LIBHAL_DRIVE_CDROM_CAPS_BDROM);
9742912Sartem 		LIBHAL_PROP_EXTRACT_BOOL_BITFIELD ("storage.cdrom.bdr", drive->cdrom_caps, LIBHAL_DRIVE_CDROM_CAPS_BDR);
9752912Sartem 		LIBHAL_PROP_EXTRACT_BOOL_BITFIELD ("storage.cdrom.bdre", drive->cdrom_caps, LIBHAL_DRIVE_CDROM_CAPS_BDRE);
9762912Sartem 		LIBHAL_PROP_EXTRACT_BOOL_BITFIELD ("storage.cdrom.hddvd", drive->cdrom_caps, LIBHAL_DRIVE_CDROM_CAPS_HDDVDROM);
9772912Sartem 		LIBHAL_PROP_EXTRACT_BOOL_BITFIELD ("storage.cdrom.hddvdr", drive->cdrom_caps, LIBHAL_DRIVE_CDROM_CAPS_HDDVDR);
9782912Sartem 		LIBHAL_PROP_EXTRACT_BOOL_BITFIELD ("storage.cdrom.hddvdrw", drive->cdrom_caps, LIBHAL_DRIVE_CDROM_CAPS_HDDVDRW);
9792912Sartem 
9802912Sartem 		LIBHAL_PROP_EXTRACT_BOOL   ("storage.policy.should_mount",        drive->should_mount);
9812912Sartem 		LIBHAL_PROP_EXTRACT_STRING ("storage.policy.desired_mount_point", drive->desired_mount_point);
9822912Sartem 		LIBHAL_PROP_EXTRACT_STRING ("storage.policy.mount_filesystem",    drive->mount_filesystem);
9832912Sartem 
9842912Sartem 		LIBHAL_PROP_EXTRACT_BOOL   ("storage.no_partitions_hint",        drive->no_partitions_hint);
9852912Sartem 
9862912Sartem 		LIBHAL_PROP_EXTRACT_STRLIST ("info.capabilities",                drive->capabilities);
9872912Sartem 
9882912Sartem 		LIBHAL_PROP_EXTRACT_END;
9892912Sartem 	}
9902912Sartem 
9912912Sartem 	if (drive->type_textual != NULL) {
9922912Sartem 		if (strcmp (drive->type_textual, "cdrom") == 0) {
9932912Sartem 			drive->cdrom_caps |= LIBHAL_DRIVE_CDROM_CAPS_CDROM;
9942912Sartem 			drive->type = LIBHAL_DRIVE_TYPE_CDROM;
9952912Sartem 		} else if (strcmp (drive->type_textual, "floppy") == 0) {
9962912Sartem 			drive->type = LIBHAL_DRIVE_TYPE_FLOPPY;
9972912Sartem 		} else if (strcmp (drive->type_textual, "disk") == 0) {
9982912Sartem 			if (drive->is_removable)
9992912Sartem 				drive->type = LIBHAL_DRIVE_TYPE_REMOVABLE_DISK;
10002912Sartem 			else
10012912Sartem 				drive->type = LIBHAL_DRIVE_TYPE_DISK;
10022912Sartem 		} else if (strcmp (drive->type_textual, "tape") == 0) {
10032912Sartem 			drive->type = LIBHAL_DRIVE_TYPE_TAPE;
10042912Sartem 		} else if (strcmp (drive->type_textual, "compact_flash") == 0) {
10052912Sartem 			drive->type = LIBHAL_DRIVE_TYPE_COMPACT_FLASH;
10062912Sartem 		} else if (strcmp (drive->type_textual, "memory_stick") == 0) {
10072912Sartem 			drive->type = LIBHAL_DRIVE_TYPE_MEMORY_STICK;
10082912Sartem 		} else if (strcmp (drive->type_textual, "smart_media") == 0) {
10092912Sartem 			drive->type = LIBHAL_DRIVE_TYPE_SMART_MEDIA;
10102912Sartem 		} else if (strcmp (drive->type_textual, "sd_mmc") == 0) {
10112912Sartem 			drive->type = LIBHAL_DRIVE_TYPE_SD_MMC;
10122912Sartem 		} else if (strcmp (drive->type_textual, "zip") == 0) {
10132912Sartem 			drive->type = LIBHAL_DRIVE_TYPE_ZIP;
10142912Sartem 		} else if (strcmp (drive->type_textual, "jaz") == 0) {
10152912Sartem 			drive->type = LIBHAL_DRIVE_TYPE_JAZ;
10162912Sartem 		} else if (strcmp (drive->type_textual, "flashkey") == 0) {
10172912Sartem 			drive->type = LIBHAL_DRIVE_TYPE_FLASHKEY;
10182912Sartem 		} else {
10192912Sartem 		        drive->type = LIBHAL_DRIVE_TYPE_DISK;
10202912Sartem 		}
10212912Sartem 
10222912Sartem 	}
10232912Sartem 
10242912Sartem 	if (drive->capabilities != NULL) {
10252912Sartem 		for (i = 0; drive->capabilities[i] != NULL; i++) {
10262912Sartem 			if (strcmp (drive->capabilities[i], "portable_audio_player") == 0) {
10272912Sartem 				drive->type = LIBHAL_DRIVE_TYPE_PORTABLE_AUDIO_PLAYER;
10282912Sartem 				break;
10292912Sartem 			} else if (strcmp (drive->capabilities[i], "camera") == 0) {
10302912Sartem 				drive->type = LIBHAL_DRIVE_TYPE_CAMERA;
10312912Sartem 				break;
10322912Sartem 			}
10332912Sartem 		}
10342912Sartem 	}
10352912Sartem 
10362912Sartem 	if (bus_textual != NULL) {
10372912Sartem 		if (strcmp (bus_textual, "usb") == 0) {
10382912Sartem 			drive->bus = LIBHAL_DRIVE_BUS_USB;
10392912Sartem 		} else if (strcmp (bus_textual, "ieee1394") == 0) {
10402912Sartem 			drive->bus = LIBHAL_DRIVE_BUS_IEEE1394;
10412912Sartem 		} else if (strcmp (bus_textual, "ide") == 0) {
10422912Sartem 			drive->bus = LIBHAL_DRIVE_BUS_IDE;
10432912Sartem 		} else if (strcmp (bus_textual, "scsi") == 0) {
10442912Sartem 			drive->bus = LIBHAL_DRIVE_BUS_SCSI;
10452912Sartem 		} else if (strcmp (bus_textual, "ccw") == 0) {
10462912Sartem 			drive->bus = LIBHAL_DRIVE_BUS_CCW;
10472912Sartem 		}
10482912Sartem 	}
10492912Sartem 
10502912Sartem 	libhal_free_string (bus_textual);
10512912Sartem 	libhal_free_property_set (properties);
10522912Sartem 
10532912Sartem 	return drive;
10542912Sartem 
10552912Sartem error:
10562912Sartem 	LIBHAL_FREE_DBUS_ERROR(&error);
10572912Sartem 	libhal_free_string (bus_textual);
10582912Sartem 	libhal_free_property_set (properties);
10592912Sartem 	libhal_drive_free (drive);
10602912Sartem 	return NULL;
10612912Sartem }
10622912Sartem 
10632912Sartem const char *
libhal_volume_get_storage_device_udi(LibHalVolume * volume)10642912Sartem libhal_volume_get_storage_device_udi (LibHalVolume *volume)
10652912Sartem {
10662912Sartem 	return volume->storage_device;
10672912Sartem }
10682912Sartem 
libhal_drive_get_physical_device_udi(LibHalDrive * drive)10692912Sartem const char *libhal_drive_get_physical_device_udi (LibHalDrive *drive)
10702912Sartem {
10712912Sartem 	return drive->physical_device;
10722912Sartem }
10732912Sartem 
10742912Sartem dbus_bool_t
libhal_drive_requires_eject(LibHalDrive * drive)10752912Sartem libhal_drive_requires_eject (LibHalDrive *drive)
10762912Sartem {
10772912Sartem 	return drive->requires_eject;
10782912Sartem }
10792912Sartem 
10802912Sartem /** Given a UDI for a LIBHAL device of capability 'volume', this
10812912Sartem  *  function retrieves all the relevant properties into convenient
10822912Sartem  *  in-process data structures.
10832912Sartem  *
10842912Sartem  *  @param  hal_ctx             libhal context
10852912Sartem  *  @param  udi                 HAL UDI
10862912Sartem  *  @return                     LibHalVolume object or NULL if UDI is invalid
10872912Sartem  */
10882912Sartem LibHalVolume *
libhal_volume_from_udi(LibHalContext * hal_ctx,const char * udi)10892912Sartem libhal_volume_from_udi (LibHalContext *hal_ctx, const char *udi)
10902912Sartem {
10912912Sartem 	char *disc_type_textual;
10922912Sartem 	char *vol_fsusage_textual;
10932912Sartem 	LibHalVolume *vol;
10942912Sartem 	LibHalPropertySet *properties;
10952912Sartem 	LibHalPropertySetIterator it;
10962912Sartem 	DBusError error;
10972912Sartem 
10982912Sartem 	LIBHAL_CHECK_LIBHALCONTEXT(hal_ctx, NULL);
10992912Sartem 
11002912Sartem 	vol = NULL;
11012912Sartem 	properties = NULL;
11022912Sartem 	disc_type_textual = NULL;
11032912Sartem 	vol_fsusage_textual = NULL;
11042912Sartem 
11052912Sartem 	dbus_error_init (&error);
11062912Sartem 	if (!libhal_device_query_capability (hal_ctx, udi, "volume", &error))
11072912Sartem 		goto error;
11082912Sartem 
11092912Sartem 	vol = malloc (sizeof (LibHalVolume));
11102912Sartem 	if (vol == NULL)
11112912Sartem 		goto error;
11122912Sartem 	memset (vol, 0x00, sizeof (LibHalVolume));
11132912Sartem 
11142912Sartem 	vol->udi = strdup (udi);
11152912Sartem 
11162912Sartem 	properties = libhal_device_get_all_properties (hal_ctx, udi, &error);
11172912Sartem 	if (properties == NULL)
11182912Sartem 		goto error;
11192912Sartem 
11202912Sartem 	/* we can count on hal to give us all these properties */
11212912Sartem 	for (libhal_psi_init (&it, properties); libhal_psi_has_more (&it); libhal_psi_next (&it)) {
11222912Sartem 		int type;
11232912Sartem 		char *key;
11242912Sartem 
11252912Sartem 		type = libhal_psi_get_type (&it);
11262912Sartem 		key = libhal_psi_get_key (&it);
11272912Sartem 
11282912Sartem 		LIBHAL_PROP_EXTRACT_BEGIN;
11292912Sartem 
11302912Sartem 		LIBHAL_PROP_EXTRACT_BOOL   ("volume.is_partition",                    vol->is_partition);
11312912Sartem 		LIBHAL_PROP_EXTRACT_INT    ("volume.partition.number",                vol->partition_number);
11322912Sartem 		LIBHAL_PROP_EXTRACT_STRING ("volume.partition.scheme",                vol->partition_scheme);
11332912Sartem 		LIBHAL_PROP_EXTRACT_STRING ("volume.partition.type",                  vol->partition_type);
11342912Sartem 		LIBHAL_PROP_EXTRACT_STRING ("volume.partition.label",                 vol->partition_label);
11352912Sartem 		LIBHAL_PROP_EXTRACT_STRING ("volume.partition.uuid",                  vol->partition_uuid);
11362912Sartem 		LIBHAL_PROP_EXTRACT_STRLIST ("volume.partition.flags",                vol->partition_flags);
11372912Sartem 
11382912Sartem 		LIBHAL_PROP_EXTRACT_UINT64 ("volume.partition.start", 		      vol->partition_start_offset);
11392912Sartem 		LIBHAL_PROP_EXTRACT_UINT64 ("volume.partition.media_size",            vol->partition_media_size);
11402912Sartem 		LIBHAL_PROP_EXTRACT_INT    ("volume.partition.msdos_part_table_type", vol->msdos_part_table_type);
11412912Sartem 		LIBHAL_PROP_EXTRACT_UINT64 ("volume.partition.msdos_part_table_start", vol->msdos_part_table_start);
11422912Sartem 		LIBHAL_PROP_EXTRACT_UINT64 ("volume.partition.msdos_part_table_size", vol->msdos_part_table_size);
11432912Sartem 
11442912Sartem 		LIBHAL_PROP_EXTRACT_INT    ("block.minor",               vol->device_minor);
11452912Sartem 		LIBHAL_PROP_EXTRACT_INT    ("block.major",               vol->device_major);
11462912Sartem 		LIBHAL_PROP_EXTRACT_STRING ("block.device",              vol->device_file);
11472912Sartem 
11482912Sartem 		LIBHAL_PROP_EXTRACT_STRING ("block.storage_device",      vol->storage_device);
11492912Sartem 
11502912Sartem 		LIBHAL_PROP_EXTRACT_STRING ("volume.crypto_luks.clear.backing_volume", vol->crypto_backing_volume);
11512912Sartem 
11522912Sartem 		LIBHAL_PROP_EXTRACT_INT    ("volume.block_size",         vol->block_size);
11532912Sartem 		LIBHAL_PROP_EXTRACT_INT    ("volume.num_blocks",         vol->num_blocks);
11542912Sartem 		LIBHAL_PROP_EXTRACT_UINT64 ("volume.size", 		 vol->volume_size);
11552912Sartem 		LIBHAL_PROP_EXTRACT_STRING ("volume.label",              vol->volume_label);
11562912Sartem 		LIBHAL_PROP_EXTRACT_STRING ("volume.mount_point",        vol->mount_point);
11572912Sartem 		LIBHAL_PROP_EXTRACT_STRING ("volume.fstype",             vol->fstype);
11582912Sartem 		LIBHAL_PROP_EXTRACT_STRING ("volume.fsversion",             vol->fsversion);
11592912Sartem 		LIBHAL_PROP_EXTRACT_BOOL   ("volume.is_mounted",         vol->is_mounted);
11602912Sartem 		LIBHAL_PROP_EXTRACT_BOOL   ("volume.is_mounted_read_only", vol->is_mounted_read_only);
11612912Sartem 		LIBHAL_PROP_EXTRACT_STRING ("volume.fsusage",            vol_fsusage_textual);
11622912Sartem 		LIBHAL_PROP_EXTRACT_STRING ("volume.uuid",               vol->uuid);
11632912Sartem 
11642912Sartem 		LIBHAL_PROP_EXTRACT_BOOL   ("volume.ignore",             vol->ignore_volume);
11652912Sartem 
11662912Sartem 		LIBHAL_PROP_EXTRACT_BOOL   ("volume.is_disc",            vol->is_disc);
11672912Sartem 		LIBHAL_PROP_EXTRACT_STRING ("volume.disc.type",          disc_type_textual);
11682912Sartem 		LIBHAL_PROP_EXTRACT_BOOL   ("volume.disc.has_audio",     vol->disc_has_audio);
11692912Sartem 		LIBHAL_PROP_EXTRACT_BOOL   ("volume.disc.has_data",      vol->disc_has_data);
11702912Sartem 		LIBHAL_PROP_EXTRACT_BOOL   ("volume.disc.is_appendable", vol->disc_is_appendable);
11712912Sartem 		LIBHAL_PROP_EXTRACT_BOOL   ("volume.disc.is_blank",      vol->disc_is_blank);
11722912Sartem 		LIBHAL_PROP_EXTRACT_BOOL   ("volume.disc.is_rewritable", vol->disc_is_rewritable);
11732912Sartem 		LIBHAL_PROP_EXTRACT_UINT64 ("volume.disc.capacity",      vol->disc_capacity);
11742912Sartem 
11752912Sartem 		LIBHAL_PROP_EXTRACT_BOOL   ("volume.policy.should_mount",        vol->should_mount);
11762912Sartem 		LIBHAL_PROP_EXTRACT_STRING ("volume.policy.desired_mount_point", vol->desired_mount_point);
11772912Sartem 		LIBHAL_PROP_EXTRACT_STRING ("volume.policy.mount_filesystem",    vol->mount_filesystem);
11782912Sartem 
11792912Sartem 		LIBHAL_PROP_EXTRACT_END;
11802912Sartem 	}
11812912Sartem 
11822912Sartem 	if (disc_type_textual != NULL) {
11832912Sartem 		if (strcmp (disc_type_textual, "cd_rom") == 0) {
11842912Sartem 			vol->disc_type = LIBHAL_VOLUME_DISC_TYPE_CDROM;
11852912Sartem 		} else if (strcmp (disc_type_textual, "cd_r") == 0) {
11862912Sartem 			vol->disc_type = LIBHAL_VOLUME_DISC_TYPE_CDR;
11872912Sartem 		} else if (strcmp (disc_type_textual, "cd_rw") == 0) {
11882912Sartem 			vol->disc_type = LIBHAL_VOLUME_DISC_TYPE_CDRW;
11892912Sartem 		} else if (strcmp (disc_type_textual, "dvd_rom") == 0) {
11902912Sartem 			vol->disc_type = LIBHAL_VOLUME_DISC_TYPE_DVDROM;
11912912Sartem 		} else if (strcmp (disc_type_textual, "dvd_ram") == 0) {
11922912Sartem 			vol->disc_type = LIBHAL_VOLUME_DISC_TYPE_DVDRAM;
11932912Sartem 		} else if (strcmp (disc_type_textual, "dvd_r") == 0) {
11942912Sartem 			vol->disc_type = LIBHAL_VOLUME_DISC_TYPE_DVDR;
11952912Sartem 		} else if (strcmp (disc_type_textual, "dvd_rw") == 0) {
11962912Sartem 			vol->disc_type = LIBHAL_VOLUME_DISC_TYPE_DVDRW;
11972912Sartem 		} else if (strcmp (disc_type_textual, "dvd_plus_r") == 0) {
11982912Sartem 			vol->disc_type = LIBHAL_VOLUME_DISC_TYPE_DVDPLUSR;
11992912Sartem 		} else if (strcmp (disc_type_textual, "dvd_plus_rw") == 0) {
12002912Sartem 			vol->disc_type = LIBHAL_VOLUME_DISC_TYPE_DVDPLUSRW;
12012912Sartem 		} else if (strcmp (disc_type_textual, "dvd_plus_r_dl") == 0) {
12022912Sartem 			vol->disc_type = LIBHAL_VOLUME_DISC_TYPE_DVDPLUSR_DL;
12032912Sartem 		} else if (strcmp (disc_type_textual, "bd_rom") == 0) {
12042912Sartem 			vol->disc_type = LIBHAL_VOLUME_DISC_TYPE_BDROM;
12052912Sartem 		} else if (strcmp (disc_type_textual, "bd_r") == 0) {
12062912Sartem 			vol->disc_type = LIBHAL_VOLUME_DISC_TYPE_BDR;
12072912Sartem 		} else if (strcmp (disc_type_textual, "bd_re") == 0) {
12082912Sartem 			vol->disc_type = LIBHAL_VOLUME_DISC_TYPE_BDRE;
12092912Sartem 		} else if (strcmp (disc_type_textual, "hddvd_rom") == 0) {
12102912Sartem 			vol->disc_type = LIBHAL_VOLUME_DISC_TYPE_HDDVDROM;
12112912Sartem 		} else if (strcmp (disc_type_textual, "hddvd_r") == 0) {
12122912Sartem 			vol->disc_type = LIBHAL_VOLUME_DISC_TYPE_HDDVDR;
12132912Sartem 		} else if (strcmp (disc_type_textual, "hddvd_rw") == 0) {
12142912Sartem 			vol->disc_type = LIBHAL_VOLUME_DISC_TYPE_HDDVDRW;
12152912Sartem 		}
12162912Sartem 	}
12172912Sartem 
12182912Sartem 	vol->fsusage = LIBHAL_VOLUME_USAGE_UNKNOWN;
12192912Sartem 	if (vol_fsusage_textual != NULL) {
12202912Sartem 		if (strcmp (vol_fsusage_textual, "filesystem") == 0) {
12212912Sartem 			vol->fsusage = LIBHAL_VOLUME_USAGE_MOUNTABLE_FILESYSTEM;
12222912Sartem 		} else if (strcmp (vol_fsusage_textual, "partitiontable") == 0) {
12232912Sartem 			vol->fsusage = LIBHAL_VOLUME_USAGE_PARTITION_TABLE;
12242912Sartem 		} else if (strcmp (vol_fsusage_textual, "raid") == 0) {
12252912Sartem 			vol->fsusage = LIBHAL_VOLUME_USAGE_RAID_MEMBER;
12262912Sartem 		} else if (strcmp (vol_fsusage_textual, "crypto") == 0) {
12272912Sartem 			vol->fsusage = LIBHAL_VOLUME_USAGE_CRYPTO;
12282912Sartem 		} else if (strcmp (vol_fsusage_textual, "other") == 0) {
12292912Sartem 			vol->fsusage = LIBHAL_VOLUME_USAGE_OTHER;
12302912Sartem 		} else {
12312912Sartem 			vol->fsusage = LIBHAL_VOLUME_USAGE_UNKNOWN;
12322912Sartem 		}
12332912Sartem 	}
12342912Sartem 
12352912Sartem 	libhal_free_string (vol_fsusage_textual);
12362912Sartem 	libhal_free_string (disc_type_textual);
12372912Sartem 	libhal_free_property_set (properties);
12382912Sartem 	return vol;
12392912Sartem error:
12402912Sartem 	if (dbus_error_is_set (&error)) {
12412912Sartem 		dbus_error_free (&error);
12422912Sartem 	}
12432912Sartem 	libhal_free_string (vol_fsusage_textual);
12442912Sartem 	libhal_free_string (disc_type_textual);
12452912Sartem 	libhal_free_property_set (properties);
12462912Sartem 	libhal_volume_free (vol);
12472912Sartem 	return NULL;
12482912Sartem }
12492912Sartem 
12502912Sartem 
12512912Sartem /** If the volume is on a drive with a MSDOS style partition table, return
12522912Sartem  *  the partition table id.
12532912Sartem  *
12542912Sartem  *  @param  volume              Volume object
12552912Sartem  *  @return                     The partition type or -1 if volume is not
12562912Sartem  *                              a partition or the media the volume stems from
12572912Sartem  *                              isn't partition with a MS DOS style table
12582912Sartem  */
12592912Sartem int
libhal_volume_get_msdos_part_table_type(LibHalVolume * volume)12602912Sartem libhal_volume_get_msdos_part_table_type (LibHalVolume *volume)
12612912Sartem {
12622912Sartem 	return volume->msdos_part_table_type;
12632912Sartem }
12642912Sartem 
12652912Sartem /** If the volume is on a drive with a MSDOS style partition table, return
12662912Sartem  *  the partition start offset according to the partition table.
12672912Sartem  *
12682912Sartem  *  @param  volume              Volume object
12692912Sartem  *  @return                     The partition start offset or -1 if volume isnt
12702912Sartem  *                              a partition or the media the volume stems from
12712912Sartem  *                              isn't partition with a MS DOS style table
12722912Sartem  */
12732912Sartem dbus_uint64_t
libhal_volume_get_msdos_part_table_start(LibHalVolume * volume)12742912Sartem libhal_volume_get_msdos_part_table_start (LibHalVolume *volume)
12752912Sartem {
12762912Sartem 	return volume->msdos_part_table_start;
12772912Sartem }
12782912Sartem 
12792912Sartem /** If the volume is on a drive with a MSDOS style partition table, return
12802912Sartem  *  the partition size according to the partition table.
12812912Sartem  *
12822912Sartem  *  @param  volume              Volume object
12832912Sartem  *  @return                     The partition size or -1 if volume is not
12842912Sartem  *                              a partition or the media the volume stems from
12852912Sartem  *                              isn't partition with a MS DOS style table
12862912Sartem  */
12872912Sartem dbus_uint64_t
libhal_volume_get_msdos_part_table_size(LibHalVolume * volume)12882912Sartem libhal_volume_get_msdos_part_table_size (LibHalVolume *volume)
12892912Sartem {
12902912Sartem 	return volume->msdos_part_table_size;
12912912Sartem }
12922912Sartem 
12932912Sartem /***********************************************************************/
12942912Sartem 
12952912Sartem /** Get the drive object that either is (when given e.g. /dev/sdb) or contains
12962912Sartem  *  (when given e.g. /dev/sdb1) the given device file.
12972912Sartem  *
12982912Sartem  *  @param  hal_ctx             libhal context to use
12992912Sartem  *  @param  device_file         Name of special device file, e.g. '/dev/hdc'
13002912Sartem  *  @return                     LibHalDrive object or NULL if it doesn't exist
13012912Sartem  */
13022912Sartem LibHalDrive *
libhal_drive_from_device_file(LibHalContext * hal_ctx,const char * device_file)13032912Sartem libhal_drive_from_device_file (LibHalContext *hal_ctx, const char *device_file)
13042912Sartem {
13052912Sartem 	int i;
13062912Sartem 	char **hal_udis;
13072912Sartem 	int num_hal_udis;
13082912Sartem 	LibHalDrive *result;
13092912Sartem 	char *found_udi;
13102912Sartem 	DBusError error;
13112912Sartem 
13122912Sartem 	LIBHAL_CHECK_LIBHALCONTEXT(hal_ctx, NULL);
13132912Sartem 
13142912Sartem 	result = NULL;
13152912Sartem 	found_udi = NULL;
13162912Sartem 
13172912Sartem 	dbus_error_init (&error);
13182912Sartem 	if ((hal_udis = libhal_manager_find_device_string_match (hal_ctx, "block.device",
13192912Sartem 								 device_file, &num_hal_udis, &error)) == NULL) {
13202912Sartem 		LIBHAL_FREE_DBUS_ERROR(&error);
13212912Sartem 		goto out;
13222912Sartem 	}
13232912Sartem 
13242912Sartem 	for (i = 0; i < num_hal_udis; i++) {
13252912Sartem 		char *udi;
13262912Sartem 		char *storage_udi;
13272912Sartem 		DBusError err1;
13282912Sartem 		DBusError err2;
13292912Sartem 		udi = hal_udis[i];
13302912Sartem 
13312912Sartem 		dbus_error_init (&err1);
13322912Sartem 		dbus_error_init (&err2);
13332912Sartem 		if (libhal_device_query_capability (hal_ctx, udi, "volume", &err1)) {
13342912Sartem 
13352912Sartem 			storage_udi = libhal_device_get_property_string (hal_ctx, udi, "block.storage_device", &err1);
13362912Sartem 			if (storage_udi == NULL)
13372912Sartem 				continue;
13382912Sartem 			found_udi = strdup (storage_udi);
13392912Sartem 			libhal_free_string (storage_udi);
13402912Sartem 			break;
13412912Sartem 		} else if (libhal_device_query_capability (hal_ctx, udi, "storage", &err2)) {
13422912Sartem 			found_udi = strdup (udi);
13432912Sartem 		}
13442912Sartem 		LIBHAL_FREE_DBUS_ERROR(&err1);
13452912Sartem 		LIBHAL_FREE_DBUS_ERROR(&err2);
13462912Sartem 	}
13472912Sartem 
13482912Sartem 	libhal_free_string_array (hal_udis);
13492912Sartem 
13502912Sartem 	if (found_udi != NULL)
13512912Sartem 		result = libhal_drive_from_udi (hal_ctx, found_udi);
13522912Sartem 
13532912Sartem 	free (found_udi);
13542912Sartem out:
13552912Sartem 	return result;
13562912Sartem }
13572912Sartem 
13582912Sartem 
13592912Sartem /** Get the volume object for a given device file.
13602912Sartem  *
13612912Sartem  *  @param  hal_ctx             libhal context to use
13622912Sartem  *  @param  device_file         Name of special device file, e.g. '/dev/hda5'
13632912Sartem  *  @return                     LibHalVolume object or NULL if it doesn't exist
13642912Sartem  */
13652912Sartem LibHalVolume *
libhal_volume_from_device_file(LibHalContext * hal_ctx,const char * device_file)13662912Sartem libhal_volume_from_device_file (LibHalContext *hal_ctx, const char *device_file)
13672912Sartem {
13682912Sartem 	int i;
13692912Sartem 	char **hal_udis;
13702912Sartem 	int num_hal_udis;
13712912Sartem 	LibHalVolume *result;
13722912Sartem 	char *found_udi;
13732912Sartem 	DBusError error;
13742912Sartem 
13752912Sartem 	LIBHAL_CHECK_LIBHALCONTEXT(hal_ctx, NULL);
13762912Sartem 
13772912Sartem 	result = NULL;
13782912Sartem 	found_udi = NULL;
13792912Sartem 
13802912Sartem 	dbus_error_init (&error);
13812912Sartem 	if ((hal_udis = libhal_manager_find_device_string_match (hal_ctx, "block.device",
13822912Sartem 								 device_file, &num_hal_udis, &error)) == NULL)
13832912Sartem 		goto out;
13842912Sartem 
13852912Sartem 	for (i = 0; i < num_hal_udis; i++) {
13862912Sartem 		char *udi;
13872912Sartem 		udi = hal_udis[i];
13882912Sartem 		if (libhal_device_query_capability (hal_ctx, udi, "volume", &error)) {
13892912Sartem 			found_udi = strdup (udi);
13902912Sartem 			break;
13912912Sartem 		}
13922912Sartem 	}
13932912Sartem 
13942912Sartem 	libhal_free_string_array (hal_udis);
13952912Sartem 
13962912Sartem 	if (found_udi != NULL)
13972912Sartem 		result = libhal_volume_from_udi (hal_ctx, found_udi);
13982912Sartem 
13992912Sartem 	free (found_udi);
14002912Sartem out:
14012912Sartem 	LIBHAL_FREE_DBUS_ERROR(&error);
14022912Sartem 	return result;
14032912Sartem }
14042912Sartem 
14052912Sartem dbus_uint64_t
libhal_volume_get_size(LibHalVolume * volume)14062912Sartem libhal_volume_get_size (LibHalVolume *volume)
14072912Sartem {
14082912Sartem 	if (volume->volume_size > 0)
14092912Sartem 		return volume->volume_size;
14102912Sartem 	else
14112912Sartem 		return ((dbus_uint64_t)volume->block_size) * ((dbus_uint64_t)volume->num_blocks);
14122912Sartem }
14132912Sartem 
14142912Sartem dbus_uint64_t
libhal_volume_get_disc_capacity(LibHalVolume * volume)14152912Sartem libhal_volume_get_disc_capacity (LibHalVolume *volume)
14162912Sartem {
14172912Sartem 	return volume->disc_capacity;
14182912Sartem }
14192912Sartem 
14202912Sartem 
14212912Sartem dbus_bool_t
libhal_drive_is_hotpluggable(LibHalDrive * drive)14222912Sartem libhal_drive_is_hotpluggable (LibHalDrive *drive)
14232912Sartem {
14242912Sartem 	return drive->is_hotpluggable;
14252912Sartem }
14262912Sartem 
14272912Sartem dbus_bool_t
libhal_drive_uses_removable_media(LibHalDrive * drive)14282912Sartem libhal_drive_uses_removable_media (LibHalDrive *drive)
14292912Sartem {
14302912Sartem 	return drive->is_removable;
14312912Sartem }
14322912Sartem 
14332912Sartem dbus_bool_t
libhal_drive_is_media_detected(LibHalDrive * drive)14342912Sartem libhal_drive_is_media_detected (LibHalDrive *drive)
14352912Sartem {
14362912Sartem 	return drive->is_media_detected;
14372912Sartem }
14382912Sartem 
14392912Sartem dbus_uint64_t
libhal_drive_get_size(LibHalDrive * drive)14402912Sartem libhal_drive_get_size (LibHalDrive *drive)
14412912Sartem {
14422912Sartem 	return drive->drive_size;
14432912Sartem }
14442912Sartem 
14452912Sartem dbus_uint64_t
libhal_drive_get_media_size(LibHalDrive * drive)14462912Sartem libhal_drive_get_media_size (LibHalDrive *drive)
14472912Sartem {
14482912Sartem 	return drive->drive_media_size;
14492912Sartem }
14502912Sartem 
14512912Sartem const char *
libhal_drive_get_partition_scheme(LibHalDrive * drive)14522912Sartem libhal_drive_get_partition_scheme (LibHalDrive *drive)
14532912Sartem {
14542912Sartem 	return drive->partition_scheme;
14552912Sartem }
14562912Sartem 
14572912Sartem 
14582912Sartem LibHalDriveType
libhal_drive_get_type(LibHalDrive * drive)14592912Sartem libhal_drive_get_type (LibHalDrive *drive)
14602912Sartem {
14612912Sartem 	return drive->type;
14622912Sartem }
14632912Sartem 
14642912Sartem LibHalDriveBus
libhal_drive_get_bus(LibHalDrive * drive)14652912Sartem libhal_drive_get_bus (LibHalDrive *drive)
14662912Sartem {
14672912Sartem 	return drive->bus;
14682912Sartem }
14692912Sartem 
14702912Sartem LibHalDriveCdromCaps
libhal_drive_get_cdrom_caps(LibHalDrive * drive)14712912Sartem libhal_drive_get_cdrom_caps (LibHalDrive *drive)
14722912Sartem {
14732912Sartem 	return drive->cdrom_caps;
14742912Sartem }
14752912Sartem 
14762912Sartem unsigned int
libhal_drive_get_device_major(LibHalDrive * drive)14772912Sartem libhal_drive_get_device_major (LibHalDrive *drive)
14782912Sartem {
14792912Sartem 	return drive->device_major;
14802912Sartem }
14812912Sartem 
14822912Sartem unsigned int
libhal_drive_get_device_minor(LibHalDrive * drive)14832912Sartem libhal_drive_get_device_minor (LibHalDrive *drive)
14842912Sartem {
14852912Sartem 	return drive->device_minor;
14862912Sartem }
14872912Sartem 
14882912Sartem const char *
libhal_drive_get_type_textual(LibHalDrive * drive)14892912Sartem libhal_drive_get_type_textual (LibHalDrive *drive)
14902912Sartem {
14912912Sartem 	return drive->type_textual;
14922912Sartem }
14932912Sartem 
14942912Sartem const char *
libhal_drive_get_device_file(LibHalDrive * drive)14952912Sartem libhal_drive_get_device_file (LibHalDrive *drive)
14962912Sartem {
14972912Sartem 	return drive->device_file;
14982912Sartem }
14992912Sartem 
15002912Sartem const char *
libhal_drive_get_udi(LibHalDrive * drive)15012912Sartem libhal_drive_get_udi (LibHalDrive *drive)
15022912Sartem {
15032912Sartem 	return drive->udi;
15042912Sartem }
15052912Sartem 
15062912Sartem const char *
libhal_drive_get_serial(LibHalDrive * drive)15072912Sartem libhal_drive_get_serial (LibHalDrive *drive)
15082912Sartem {
15092912Sartem 	return drive->serial;
15102912Sartem }
15112912Sartem 
15122912Sartem const char *
libhal_drive_get_firmware_version(LibHalDrive * drive)15132912Sartem libhal_drive_get_firmware_version (LibHalDrive *drive)
15142912Sartem {
15152912Sartem 	return drive->firmware_version;
15162912Sartem }
15172912Sartem 
15182912Sartem const char *
libhal_drive_get_model(LibHalDrive * drive)15192912Sartem libhal_drive_get_model (LibHalDrive *drive)
15202912Sartem {
15212912Sartem 	return drive->model;
15222912Sartem }
15232912Sartem 
15242912Sartem const char *
libhal_drive_get_vendor(LibHalDrive * drive)15252912Sartem libhal_drive_get_vendor (LibHalDrive *drive)
15262912Sartem {
15272912Sartem 	return drive->vendor;
15282912Sartem }
15292912Sartem 
15302912Sartem /*****************************************************************************/
15312912Sartem 
15322912Sartem const char *
libhal_volume_get_udi(LibHalVolume * volume)15332912Sartem libhal_volume_get_udi (LibHalVolume *volume)
15342912Sartem {
15352912Sartem 	return volume->udi;
15362912Sartem }
15372912Sartem 
15382912Sartem const char *
libhal_volume_get_device_file(LibHalVolume * volume)15392912Sartem libhal_volume_get_device_file (LibHalVolume *volume)
15402912Sartem {
15412912Sartem 	return volume->device_file;
15422912Sartem }
15432912Sartem 
libhal_volume_get_device_major(LibHalVolume * volume)15442912Sartem unsigned int libhal_volume_get_device_major (LibHalVolume *volume)
15452912Sartem {
15462912Sartem 	return volume->device_major;
15472912Sartem }
15482912Sartem 
libhal_volume_get_device_minor(LibHalVolume * volume)15492912Sartem unsigned int libhal_volume_get_device_minor (LibHalVolume *volume)
15502912Sartem {
15512912Sartem 	return volume->device_minor;
15522912Sartem }
15532912Sartem 
15542912Sartem const char *
libhal_volume_get_fstype(LibHalVolume * volume)15552912Sartem libhal_volume_get_fstype (LibHalVolume *volume)
15562912Sartem {
15572912Sartem 	return volume->fstype;
15582912Sartem }
15592912Sartem 
15602912Sartem const char *
libhal_volume_get_fsversion(LibHalVolume * volume)15612912Sartem libhal_volume_get_fsversion (LibHalVolume *volume)
15622912Sartem {
15632912Sartem 	return volume->fsversion;
15642912Sartem }
15652912Sartem 
15662912Sartem LibHalVolumeUsage
libhal_volume_get_fsusage(LibHalVolume * volume)15672912Sartem libhal_volume_get_fsusage (LibHalVolume *volume)
15682912Sartem {
15692912Sartem 	return volume->fsusage;
15702912Sartem }
15712912Sartem 
15722912Sartem dbus_bool_t
libhal_volume_is_mounted(LibHalVolume * volume)15732912Sartem libhal_volume_is_mounted (LibHalVolume *volume)
15742912Sartem {
15752912Sartem 	return volume->is_mounted;
15762912Sartem }
15772912Sartem 
15782912Sartem dbus_bool_t
libhal_volume_is_mounted_read_only(LibHalVolume * volume)15792912Sartem libhal_volume_is_mounted_read_only (LibHalVolume *volume)
15802912Sartem {
15812912Sartem 	return volume->is_mounted_read_only;
15822912Sartem }
15832912Sartem 
15842912Sartem dbus_bool_t
libhal_volume_is_partition(LibHalVolume * volume)15852912Sartem libhal_volume_is_partition (LibHalVolume *volume)
15862912Sartem {
15872912Sartem 	return volume->is_partition;
15882912Sartem }
15892912Sartem 
15902912Sartem dbus_bool_t
libhal_volume_is_disc(LibHalVolume * volume)15912912Sartem libhal_volume_is_disc (LibHalVolume *volume)
15922912Sartem {
15932912Sartem 	return volume->is_disc;
15942912Sartem }
15952912Sartem 
15962912Sartem unsigned int
libhal_volume_get_partition_number(LibHalVolume * volume)15972912Sartem libhal_volume_get_partition_number (LibHalVolume *volume)
15982912Sartem {
15992912Sartem 	return volume->partition_number;
16002912Sartem }
16012912Sartem 
16022912Sartem const char *
libhal_volume_get_partition_scheme(LibHalVolume * volume)16032912Sartem libhal_volume_get_partition_scheme (LibHalVolume *volume)
16042912Sartem {
16052912Sartem 	return volume->partition_scheme;
16062912Sartem }
16072912Sartem 
16082912Sartem const char *
libhal_volume_get_partition_type(LibHalVolume * volume)16092912Sartem libhal_volume_get_partition_type (LibHalVolume *volume)
16102912Sartem {
16112912Sartem 	return volume->partition_type;
16122912Sartem }
16132912Sartem 
16142912Sartem const char *
libhal_volume_get_partition_label(LibHalVolume * volume)16152912Sartem libhal_volume_get_partition_label (LibHalVolume *volume)
16162912Sartem {
16172912Sartem 	return volume->partition_label;
16182912Sartem }
16192912Sartem 
16202912Sartem const char *
libhal_volume_get_partition_uuid(LibHalVolume * volume)16212912Sartem libhal_volume_get_partition_uuid (LibHalVolume *volume)
16222912Sartem {
16232912Sartem 	return volume->partition_uuid;
16242912Sartem }
16252912Sartem 
16262912Sartem const char **
libhal_volume_get_partition_flags(LibHalVolume * volume)16272912Sartem libhal_volume_get_partition_flags (LibHalVolume *volume)
16282912Sartem {
16292912Sartem 	return (const char **) volume->partition_flags;
16302912Sartem }
16312912Sartem 
16322912Sartem 
16332912Sartem dbus_uint64_t
libhal_volume_get_partition_start_offset(LibHalVolume * volume)16342912Sartem libhal_volume_get_partition_start_offset (LibHalVolume *volume)
16352912Sartem {
16362912Sartem 	return volume->partition_start_offset;
16372912Sartem }
16382912Sartem 
16392912Sartem dbus_uint64_t
libhal_volume_get_partition_media_size(LibHalVolume * volume)16402912Sartem libhal_volume_get_partition_media_size (LibHalVolume *volume)
16412912Sartem {
16422912Sartem 	return volume->partition_media_size;
16432912Sartem }
16442912Sartem 
16452912Sartem const char *
libhal_volume_get_label(LibHalVolume * volume)16462912Sartem libhal_volume_get_label (LibHalVolume *volume)
16472912Sartem {
16482912Sartem 	return volume->volume_label;
16492912Sartem }
16502912Sartem 
16512912Sartem const char *
libhal_volume_get_mount_point(LibHalVolume * volume)16522912Sartem libhal_volume_get_mount_point (LibHalVolume *volume)
16532912Sartem {
16542912Sartem 	return volume->mount_point;
16552912Sartem }
16562912Sartem 
16572912Sartem const char *
libhal_volume_get_uuid(LibHalVolume * volume)16582912Sartem libhal_volume_get_uuid (LibHalVolume *volume)
16592912Sartem {
16602912Sartem 	return volume->uuid;
16612912Sartem }
16622912Sartem 
16632912Sartem dbus_bool_t
libhal_volume_disc_has_audio(LibHalVolume * volume)16642912Sartem libhal_volume_disc_has_audio (LibHalVolume *volume)
16652912Sartem {
16662912Sartem 	return volume->disc_has_audio;
16672912Sartem }
16682912Sartem 
16692912Sartem dbus_bool_t
libhal_volume_disc_has_data(LibHalVolume * volume)16702912Sartem libhal_volume_disc_has_data (LibHalVolume *volume)
16712912Sartem {
16722912Sartem 	return volume->disc_has_data;
16732912Sartem }
16742912Sartem 
16752912Sartem dbus_bool_t
libhal_volume_disc_is_blank(LibHalVolume * volume)16762912Sartem libhal_volume_disc_is_blank (LibHalVolume *volume)
16772912Sartem {
16782912Sartem 	return volume->disc_is_blank;
16792912Sartem }
16802912Sartem 
16812912Sartem dbus_bool_t
libhal_volume_disc_is_rewritable(LibHalVolume * volume)16822912Sartem libhal_volume_disc_is_rewritable (LibHalVolume *volume)
16832912Sartem {
16842912Sartem 	return volume->disc_is_rewritable;
16852912Sartem }
16862912Sartem 
16872912Sartem dbus_bool_t
libhal_volume_disc_is_appendable(LibHalVolume * volume)16882912Sartem libhal_volume_disc_is_appendable (LibHalVolume *volume)
16892912Sartem {
16902912Sartem 	return volume->disc_is_appendable;
16912912Sartem }
16922912Sartem 
16932912Sartem LibHalVolumeDiscType
libhal_volume_get_disc_type(LibHalVolume * volume)16942912Sartem libhal_volume_get_disc_type (LibHalVolume *volume)
16952912Sartem {
16962912Sartem 	return volume->disc_type;
16972912Sartem }
16982912Sartem 
16992912Sartem dbus_bool_t
libhal_volume_should_ignore(LibHalVolume * volume)17002912Sartem libhal_volume_should_ignore (LibHalVolume     *volume)
17012912Sartem {
17022912Sartem 	return volume->ignore_volume;
17032912Sartem }
17042912Sartem 
17052912Sartem char **
libhal_drive_find_all_volumes(LibHalContext * hal_ctx,LibHalDrive * drive,int * num_volumes)17062912Sartem libhal_drive_find_all_volumes (LibHalContext *hal_ctx, LibHalDrive *drive, int *num_volumes)
17072912Sartem {
17082912Sartem 	int i;
17092912Sartem 	char **udis;
17102912Sartem 	int num_udis;
17112912Sartem 	const char *drive_udi;
17122912Sartem 	char **result;
17132912Sartem 	DBusError error;
17142912Sartem 
17152912Sartem 	LIBHAL_CHECK_LIBHALCONTEXT(hal_ctx, NULL);
17162912Sartem 
17172912Sartem 	udis = NULL;
17182912Sartem 	result = NULL;
17192912Sartem 	*num_volumes = 0;
17202912Sartem 
17212912Sartem 	drive_udi = libhal_drive_get_udi (drive);
17222912Sartem 	if (drive_udi == NULL)
17232912Sartem 		goto out;
17242912Sartem 
17252912Sartem 	/* get initial list... */
17262912Sartem 	dbus_error_init (&error);
17272912Sartem 	if ((udis = libhal_manager_find_device_string_match (hal_ctx, "block.storage_device",
17282912Sartem 							     drive_udi, &num_udis, &error)) == NULL) {
17292912Sartem 		LIBHAL_FREE_DBUS_ERROR(&error);
17302912Sartem 		goto out;
17312912Sartem 	}
17322912Sartem 
1733*9823SLin.Guo@Sun.COM 	result = malloc (sizeof (char *) * (num_udis + 1));
17342912Sartem 	if (result == NULL)
17352912Sartem 		goto out;
17362912Sartem 
17372912Sartem 	/* ...and filter out the single UDI that is the drive itself */
17382912Sartem 	for (i = 0; i < num_udis; i++) {
17392912Sartem 		if (strcmp (udis[i], drive_udi) == 0)
17402912Sartem 			continue;
17412912Sartem 		result[*num_volumes] = strdup (udis[i]);
17422912Sartem 		*num_volumes = (*num_volumes) + 1;
17432912Sartem 	}
17442912Sartem 	/* set last element (above removed UDI) to NULL for libhal_free_string_array()*/
17452912Sartem 	result[*num_volumes] = NULL;
17462912Sartem 
17472912Sartem out:
17482912Sartem 	libhal_free_string_array (udis);
17492912Sartem 	return result;
17502912Sartem }
17512912Sartem 
17522912Sartem const char *
libhal_volume_crypto_get_backing_volume_udi(LibHalVolume * volume)17532912Sartem libhal_volume_crypto_get_backing_volume_udi (LibHalVolume *volume)
17542912Sartem {
17552912Sartem 	return volume->crypto_backing_volume;
17562912Sartem }
17572912Sartem 
17582912Sartem char *
libhal_volume_crypto_get_clear_volume_udi(LibHalContext * hal_ctx,LibHalVolume * volume)17592912Sartem libhal_volume_crypto_get_clear_volume_udi (LibHalContext *hal_ctx, LibHalVolume *volume)
17602912Sartem {
17612912Sartem 	DBusError error;
17622912Sartem 	char **clear_devices;
17632912Sartem 	int num_clear_devices;
17642912Sartem 	char *result;
17652912Sartem 
17662912Sartem 	result = NULL;
17672912Sartem 
17682912Sartem 	LIBHAL_CHECK_LIBHALCONTEXT (hal_ctx, NULL);
17692912Sartem 
17702912Sartem 	dbus_error_init (&error);
17712912Sartem 	clear_devices = libhal_manager_find_device_string_match (hal_ctx,
17722912Sartem 								 "volume.crypto_luks.clear.backing_volume",
17732912Sartem 								 volume->udi,
17742912Sartem 								 &num_clear_devices,
17752912Sartem 								 &error);
17762912Sartem 	if (clear_devices != NULL) {
17772912Sartem 
17782912Sartem 		if (num_clear_devices >= 1) {
17792912Sartem 			result = strdup (clear_devices[0]);
17802912Sartem 		}
17812912Sartem 		libhal_free_string_array (clear_devices);
17822912Sartem 	}
17832912Sartem 
17842912Sartem 	return result;
17852912Sartem }
17862912Sartem 
17872912Sartem 
17882912Sartem /*************************************************************************/
17892912Sartem 
17902912Sartem char *
libhal_drive_policy_default_get_mount_root(LibHalContext * hal_ctx)17912912Sartem libhal_drive_policy_default_get_mount_root (LibHalContext *hal_ctx)
17922912Sartem {
17932912Sartem 	char *result;
17942912Sartem 	DBusError error;
17952912Sartem 
17962912Sartem 	LIBHAL_CHECK_LIBHALCONTEXT(hal_ctx, NULL);
17972912Sartem 
17982912Sartem 	dbus_error_init (&error);
17992912Sartem 	if ((result = libhal_device_get_property_string (hal_ctx, "/org/freedesktop/Hal/devices/computer",
18002912Sartem 						    "storage.policy.default.mount_root", &error)) == NULL)
18012912Sartem 		LIBHAL_FREE_DBUS_ERROR(&error);
18022912Sartem 
18032912Sartem 	return result;
18042912Sartem }
18052912Sartem 
18062912Sartem dbus_bool_t
libhal_drive_policy_default_use_managed_keyword(LibHalContext * hal_ctx)18072912Sartem libhal_drive_policy_default_use_managed_keyword (LibHalContext *hal_ctx)
18082912Sartem {
18092912Sartem 	dbus_bool_t result;
18102912Sartem 	DBusError error;
18112912Sartem 
18122912Sartem 	LIBHAL_CHECK_LIBHALCONTEXT(hal_ctx, FALSE);
18132912Sartem 
18142912Sartem 	dbus_error_init (&error);
18152912Sartem 	if ((result = libhal_device_get_property_bool (hal_ctx, "/org/freedesktop/Hal/devices/computer",
18162912Sartem 						  "storage.policy.default.use_managed_keyword", &error)) == FALSE)
18172912Sartem 		LIBHAL_FREE_DBUS_ERROR(&error);
18182912Sartem 
18192912Sartem 	return result;
18202912Sartem }
18212912Sartem 
18222912Sartem char *
libhal_drive_policy_default_get_managed_keyword_primary(LibHalContext * hal_ctx)18232912Sartem libhal_drive_policy_default_get_managed_keyword_primary (LibHalContext *hal_ctx)
18242912Sartem {
18252912Sartem 	char *result;
18262912Sartem 	DBusError error;
18272912Sartem 
18282912Sartem 	LIBHAL_CHECK_LIBHALCONTEXT(hal_ctx, NULL);
18292912Sartem 
18302912Sartem 	dbus_error_init (&error);
18312912Sartem 	if ((result = libhal_device_get_property_string (hal_ctx, "/org/freedesktop/Hal/devices/computer",
18322912Sartem 						    "storage.policy.default.managed_keyword.primary", &error)) == NULL)
18332912Sartem 		LIBHAL_FREE_DBUS_ERROR(&error);
18342912Sartem 
18352912Sartem 	return result;
18362912Sartem }
18372912Sartem 
18382912Sartem char *
libhal_drive_policy_default_get_managed_keyword_secondary(LibHalContext * hal_ctx)18392912Sartem libhal_drive_policy_default_get_managed_keyword_secondary (LibHalContext *hal_ctx)
18402912Sartem {
18412912Sartem 	char *result;
18422912Sartem 	DBusError error;
18432912Sartem 
18442912Sartem 	LIBHAL_CHECK_LIBHALCONTEXT(hal_ctx, NULL);
18452912Sartem 
18462912Sartem 	dbus_error_init (&error);
18472912Sartem 	if ((result = libhal_device_get_property_string (hal_ctx, "/org/freedesktop/Hal/devices/computer",
18482912Sartem 						    "storage.policy.default.managed_keyword.secondary", &error)) == NULL)
18492912Sartem 		LIBHAL_FREE_DBUS_ERROR(&error);
18502912Sartem 
18512912Sartem 	return result;
18522912Sartem }
18532912Sartem 
18542912Sartem /*************************************************************************/
18552912Sartem 
18562912Sartem dbus_bool_t
libhal_drive_policy_is_mountable(LibHalDrive * drive,LibHalStoragePolicy * policy)18572912Sartem libhal_drive_policy_is_mountable (LibHalDrive *drive, LibHalStoragePolicy *policy)
18582912Sartem {
18592912Sartem 	printf ("should_mount=%d, no_partitions_hint=%d\n", drive->should_mount, drive->no_partitions_hint);
18602912Sartem 
18612912Sartem 	return drive->should_mount && drive->no_partitions_hint;
18622912Sartem }
18632912Sartem 
18642912Sartem const char *
libhal_drive_policy_get_desired_mount_point(LibHalDrive * drive,LibHalStoragePolicy * policy)18652912Sartem libhal_drive_policy_get_desired_mount_point (LibHalDrive *drive, LibHalStoragePolicy *policy)
18662912Sartem {
18672912Sartem 	return drive->desired_mount_point;
18682912Sartem }
18692912Sartem 
18702912Sartem /* safely strcat() at most the remaining space in 'dst' */
18712912Sartem #define strcat_len(dst, src, dstmaxlen) do {    \
18722912Sartem 	dst[dstmaxlen - 1] = '\0'; \
18732912Sartem 	strncat (dst, src, dstmaxlen - strlen (dst) - 1); \
18742912Sartem } while(0)
18752912Sartem 
18762912Sartem 
18772912Sartem static void
mopts_collect(LibHalContext * hal_ctx,const char * namespace,int namespace_len,const char * udi,char * options_string,size_t options_max_len,dbus_bool_t only_collect_imply_opts)18782912Sartem mopts_collect (LibHalContext *hal_ctx, const char *namespace, int namespace_len,
18792912Sartem 	       const char *udi, char *options_string, size_t options_max_len, dbus_bool_t only_collect_imply_opts)
18802912Sartem {
18812912Sartem 	LibHalPropertySet *properties;
18822912Sartem 	LibHalPropertySetIterator it;
18832912Sartem 	DBusError error;
18842912Sartem 
18852912Sartem 	if(hal_ctx == 0) {
18862912Sartem 		fprintf (stderr,"%s %d : LibHalContext *ctx is NULL\n",__FILE__, __LINE__);
18872912Sartem 		return;
18882912Sartem 	}
18892912Sartem 
18902912Sartem 	dbus_error_init (&error);
18912912Sartem 
18922912Sartem 	/* first collect from root computer device */
18932912Sartem 	properties = libhal_device_get_all_properties (hal_ctx, udi, &error);
18942912Sartem 	if (properties == NULL ) {
18952912Sartem 		LIBHAL_FREE_DBUS_ERROR(&error);
18962912Sartem 		return;
18972912Sartem 	}
18982912Sartem 
18992912Sartem 	for (libhal_psi_init (&it, properties); libhal_psi_has_more (&it); libhal_psi_next (&it)) {
19002912Sartem 		int type;
19012912Sartem 		char *key;
19022912Sartem 
19032912Sartem 		type = libhal_psi_get_type (&it);
19042912Sartem 		key = libhal_psi_get_key (&it);
19052912Sartem 		if (libhal_psi_get_type (&it) == LIBHAL_PROPERTY_TYPE_BOOLEAN &&
19062912Sartem 		    strncmp (key, namespace, namespace_len - 1) == 0) {
19072912Sartem 			const char *option = key + namespace_len - 1;
19082912Sartem 			char *location;
19092912Sartem 			dbus_bool_t is_imply_opt;
19102912Sartem 
19112912Sartem 			is_imply_opt = FALSE;
19122912Sartem 			if (strcmp (option, "user") == 0 ||
19132912Sartem 			    strcmp (option, "users") == 0 ||
19142912Sartem 			    strcmp (option, "defaults") == 0 ||
19152912Sartem 			    strcmp (option, "pamconsole") == 0)
19162912Sartem 				is_imply_opt = TRUE;
19172912Sartem 
19182912Sartem 
19192912Sartem 			if (only_collect_imply_opts) {
19202912Sartem 				if (!is_imply_opt)
19212912Sartem 					continue;
19222912Sartem 			} else {
19232912Sartem 				if (is_imply_opt)
19242912Sartem 					continue;
19252912Sartem 			}
19262912Sartem 
19272912Sartem 			if (libhal_psi_get_bool (&it)) {
19282912Sartem 				/* see if option is already there */
19292912Sartem 				location = strstr (options_string, option);
19302912Sartem 				if (location == NULL) {
19312912Sartem 					if (strlen (options_string) > 0)
19322912Sartem 						strcat_len (options_string, ",", options_max_len);
19332912Sartem 					strcat_len (options_string, option, options_max_len);
19342912Sartem 				}
19352912Sartem 			} else {
19362912Sartem 				/* remove option if already there */
19372912Sartem 				location = strstr (options_string, option);
19382912Sartem 				if (location != NULL) {
19392912Sartem 					char *end;
19402912Sartem 
19412912Sartem 					end = strchr (location, ',');
19422912Sartem 					if (end == NULL) {
19432912Sartem 						location[0] = '\0';
19442912Sartem 					} else {
19452912Sartem 						strcpy (location, end + 1); /* skip the extra comma */
19462912Sartem 					}
19472912Sartem 				}
19482912Sartem 
19492912Sartem 			}
19502912Sartem 		}
19512912Sartem 	}
19522912Sartem 
19532912Sartem 	libhal_free_property_set (properties);
19542912Sartem }
19552912Sartem 
19562912Sartem 
19572912Sartem const char *
libhal_drive_policy_get_mount_options(LibHalDrive * drive,LibHalStoragePolicy * policy)19582912Sartem libhal_drive_policy_get_mount_options (LibHalDrive *drive, LibHalStoragePolicy *policy)
19592912Sartem {
19602912Sartem 	const char *result;
19612912Sartem 	char stor_mount_option_default_begin[] = "storage.policy.default.mount_option.";
19622912Sartem 	char stor_mount_option_begin[] = "storage.policy.mount_option.";
19632912Sartem 
19642912Sartem 	result = NULL;
19652912Sartem 	drive->mount_options[0] = '\0';
19662912Sartem 
19672912Sartem 	/* collect options != ('pamconsole', 'user', 'users', 'defaults' options that imply other options)  */
19682912Sartem 	mopts_collect (drive->hal_ctx, stor_mount_option_default_begin, sizeof (stor_mount_option_default_begin),
19692912Sartem 		       "/org/freedesktop/Hal/devices/computer", drive->mount_options, MOUNT_OPTIONS_SIZE, TRUE);
19702912Sartem 	mopts_collect (drive->hal_ctx, stor_mount_option_begin, sizeof (stor_mount_option_begin),
19712912Sartem 		       drive->udi, drive->mount_options, MOUNT_OPTIONS_SIZE, TRUE);
19722912Sartem 	/* ensure ('pamconsole', 'user', 'users', 'defaults' options that imply other options), are first */
19732912Sartem 	mopts_collect (drive->hal_ctx, stor_mount_option_default_begin, sizeof (stor_mount_option_default_begin),
19742912Sartem 		       "/org/freedesktop/Hal/devices/computer", drive->mount_options, MOUNT_OPTIONS_SIZE, FALSE);
19752912Sartem 	mopts_collect (drive->hal_ctx, stor_mount_option_begin, sizeof (stor_mount_option_begin),
19762912Sartem 		       drive->udi, drive->mount_options, MOUNT_OPTIONS_SIZE, FALSE);
19772912Sartem 
19782912Sartem 	result = drive->mount_options;
19792912Sartem 
19802912Sartem 	return result;
19812912Sartem }
19822912Sartem 
19832912Sartem const char *
libhal_drive_policy_get_mount_fs(LibHalDrive * drive,LibHalStoragePolicy * policy)19842912Sartem libhal_drive_policy_get_mount_fs (LibHalDrive *drive, LibHalStoragePolicy *policy)
19852912Sartem {
19862912Sartem 	return drive->mount_filesystem;
19872912Sartem }
19882912Sartem 
19892912Sartem 
19902912Sartem dbus_bool_t
libhal_volume_policy_is_mountable(LibHalDrive * drive,LibHalVolume * volume,LibHalStoragePolicy * policy)19912912Sartem libhal_volume_policy_is_mountable (LibHalDrive *drive, LibHalVolume *volume, LibHalStoragePolicy *policy)
19922912Sartem {
19932912Sartem 	return drive->should_mount && volume->should_mount;
19942912Sartem }
19952912Sartem 
libhal_volume_policy_get_desired_mount_point(LibHalDrive * drive,LibHalVolume * volume,LibHalStoragePolicy * policy)19962912Sartem const char *libhal_volume_policy_get_desired_mount_point (LibHalDrive *drive, LibHalVolume *volume, LibHalStoragePolicy *policy)
19972912Sartem {
19982912Sartem 	return volume->desired_mount_point;
19992912Sartem }
20002912Sartem 
libhal_volume_policy_get_mount_options(LibHalDrive * drive,LibHalVolume * volume,LibHalStoragePolicy * policy)20012912Sartem const char *libhal_volume_policy_get_mount_options (LibHalDrive *drive, LibHalVolume *volume, LibHalStoragePolicy *policy)
20022912Sartem {
20032912Sartem 	const char *result;
20042912Sartem 	char stor_mount_option_default_begin[] = "storage.policy.default.mount_option.";
20052912Sartem 	char vol_mount_option_begin[] = "volume.policy.mount_option.";
20062912Sartem 
20072912Sartem 	result = NULL;
20082912Sartem 	volume->mount_options[0] = '\0';
20092912Sartem 
20102912Sartem 	/* ensure ('pamconsole', 'user', 'users', 'defaults' options that imply other options), are first */
20112912Sartem 	mopts_collect (drive->hal_ctx, stor_mount_option_default_begin, sizeof (stor_mount_option_default_begin),
20122912Sartem 		       "/org/freedesktop/Hal/devices/computer", volume->mount_options, MOUNT_OPTIONS_SIZE, TRUE);
20132912Sartem 	mopts_collect (drive->hal_ctx, vol_mount_option_begin, sizeof (vol_mount_option_begin),
20142912Sartem 		       volume->udi, volume->mount_options, MOUNT_OPTIONS_SIZE, TRUE);
20152912Sartem 	/* collect options != ('pamconsole', 'user', 'users', 'defaults' options that imply other options)  */
20162912Sartem 	mopts_collect (drive->hal_ctx, stor_mount_option_default_begin, sizeof (stor_mount_option_default_begin),
20172912Sartem 		       "/org/freedesktop/Hal/devices/computer", volume->mount_options, MOUNT_OPTIONS_SIZE, FALSE);
20182912Sartem 	mopts_collect (drive->hal_ctx, vol_mount_option_begin, sizeof (vol_mount_option_begin),
20192912Sartem 		       volume->udi, volume->mount_options, MOUNT_OPTIONS_SIZE, FALSE);
20202912Sartem 
20212912Sartem 	result = volume->mount_options;
20222912Sartem 
20232912Sartem 	return result;
20242912Sartem }
20252912Sartem 
libhal_volume_policy_get_mount_fs(LibHalDrive * drive,LibHalVolume * volume,LibHalStoragePolicy * policy)20262912Sartem const char *libhal_volume_policy_get_mount_fs (LibHalDrive *drive, LibHalVolume *volume, LibHalStoragePolicy *policy)
20272912Sartem {
20282912Sartem 	return volume->mount_filesystem;
20292912Sartem }
20302912Sartem 
20312912Sartem dbus_bool_t
libhal_drive_no_partitions_hint(LibHalDrive * drive)20322912Sartem libhal_drive_no_partitions_hint (LibHalDrive *drive)
20332912Sartem {
20342912Sartem 	return drive->no_partitions_hint;
20352912Sartem }
20362912Sartem 
20372912Sartem /** @} */
2038