118c2aff7Sartem /***************************************************************************
218c2aff7Sartem  * CVSID: $Id$
318c2aff7Sartem  *
418c2aff7Sartem  * libhal-storage.c : HAL convenience library for storage devices and volumes
518c2aff7Sartem  *
618c2aff7Sartem  * Copyright (C) 2004 Red Hat, Inc.
718c2aff7Sartem  *
818c2aff7Sartem  * Author: David Zeuthen <davidz@redhat.com>
918c2aff7Sartem  *
1018c2aff7Sartem  * Licensed under the Academic Free License version 2.1
1118c2aff7Sartem  *
1218c2aff7Sartem  * This program is free software; you can redistribute it and/or modify
1318c2aff7Sartem  * it under the terms of the GNU General Public License as published by
1418c2aff7Sartem  * the Free Software Foundation; either version 2 of the License, or
1518c2aff7Sartem  * (at your option) any later version.
1618c2aff7Sartem  *
1718c2aff7Sartem  * This program is distributed in the hope that it will be useful,
1818c2aff7Sartem  * but WITHOUT ANY WARRANTY; without even the implied warranty of
1918c2aff7Sartem  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.	 See the
2018c2aff7Sartem  * GNU General Public License for more details.
2118c2aff7Sartem  *
2218c2aff7Sartem  * You should have received a copy of the GNU General Public License
2318c2aff7Sartem  * along with this program; if not, write to the Free Software
2418c2aff7Sartem  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307	 USA
2518c2aff7Sartem  *
2618c2aff7Sartem  **************************************************************************/
2718c2aff7Sartem 
2818c2aff7Sartem #ifdef HAVE_CONFIG_H
2918c2aff7Sartem #  include <config.h>
3018c2aff7Sartem #endif
3118c2aff7Sartem 
3218c2aff7Sartem #include <stdio.h>
3318c2aff7Sartem #include <stdlib.h>
3418c2aff7Sartem #include <string.h>
3518c2aff7Sartem #include <dbus/dbus.h>
3618c2aff7Sartem 
3718c2aff7Sartem #include <libhal.h>
3818c2aff7Sartem #include "libhal-storage.h"
3918c2aff7Sartem 
4018c2aff7Sartem 
4118c2aff7Sartem #ifdef ENABLE_NLS
4218c2aff7Sartem # include <libintl.h>
4318c2aff7Sartem # define _(String) dgettext (GETTEXT_PACKAGE, String)
4418c2aff7Sartem # ifdef gettext_noop
4518c2aff7Sartem #   define N_(String) gettext_noop (String)
4618c2aff7Sartem # else
4718c2aff7Sartem #   define N_(String) (String)
4818c2aff7Sartem # endif
4918c2aff7Sartem #else
5018c2aff7Sartem /* Stubs that do something close enough.  */
5118c2aff7Sartem # define textdomain(String) (String)
5218c2aff7Sartem # define gettext(String) (String)
5318c2aff7Sartem # define dgettext(Domain,Message) (Message)
5418c2aff7Sartem # define dcgettext(Domain,Message,Type) (Message)
5518c2aff7Sartem # define bindtextdomain(Domain,Directory) (Domain)
5618c2aff7Sartem # define _(String) (String)
5718c2aff7Sartem # define N_(String) (String)
5818c2aff7Sartem #endif
5918c2aff7Sartem 
6018c2aff7Sartem typedef struct IconMappingEntry_s {
6118c2aff7Sartem 	LibHalStoragePolicyIcon icon;
6218c2aff7Sartem 	char *path;
6318c2aff7Sartem 	struct IconMappingEntry_s *next;
6418c2aff7Sartem } IconMappingEntry;
6518c2aff7Sartem 
6618c2aff7Sartem struct LibHalStoragePolicy_s {
6718c2aff7Sartem 	IconMappingEntry *icon_mappings;
6818c2aff7Sartem };
6918c2aff7Sartem 
7018c2aff7Sartem LibHalStoragePolicy *
libhal_storage_policy_new()7118c2aff7Sartem libhal_storage_policy_new ()
7218c2aff7Sartem {
7318c2aff7Sartem 	LibHalStoragePolicy *p;
7418c2aff7Sartem 
7518c2aff7Sartem 	p = malloc (sizeof (LibHalStoragePolicy));
7618c2aff7Sartem 	if (p == NULL)
7718c2aff7Sartem 		goto out;
7818c2aff7Sartem 
7918c2aff7Sartem 	p->icon_mappings = NULL;
8018c2aff7Sartem out:
8118c2aff7Sartem 	return p;
8218c2aff7Sartem }
8318c2aff7Sartem 
8418c2aff7Sartem void
libhal_storage_policy_free(LibHalStoragePolicy * policy)8518c2aff7Sartem libhal_storage_policy_free (LibHalStoragePolicy *policy)
8618c2aff7Sartem {
8718c2aff7Sartem 	IconMappingEntry *i;
8818c2aff7Sartem 	IconMappingEntry *j;
8918c2aff7Sartem 
9018c2aff7Sartem 	/* free all icon mappings */
9118c2aff7Sartem 	for (i = policy->icon_mappings; i != NULL; i = j) {
9218c2aff7Sartem 		j = i->next;
9318c2aff7Sartem 		free (i->path);
9418c2aff7Sartem 		free (i);
9518c2aff7Sartem 	}
9618c2aff7Sartem 
9718c2aff7Sartem 	free (policy);
9818c2aff7Sartem }
9918c2aff7Sartem 
10018c2aff7Sartem void
libhal_storage_policy_set_icon_path(LibHalStoragePolicy * policy,LibHalStoragePolicyIcon icon,const char * path)10118c2aff7Sartem libhal_storage_policy_set_icon_path (LibHalStoragePolicy *policy, LibHalStoragePolicyIcon icon, const char *path)
10218c2aff7Sartem {
10318c2aff7Sartem 	IconMappingEntry *i;
10418c2aff7Sartem 
10518c2aff7Sartem 	/* see if it already exist */
10618c2aff7Sartem 	for (i = policy->icon_mappings; i != NULL; i = i->next) {
10718c2aff7Sartem 		if (i->icon == icon) {
10818c2aff7Sartem 			free (i->path);
10918c2aff7Sartem 			i->path = strdup (path);
11018c2aff7Sartem 			goto out;
11118c2aff7Sartem 		}
11218c2aff7Sartem 	}
11318c2aff7Sartem 
11418c2aff7Sartem 	i = malloc (sizeof (IconMappingEntry));
11518c2aff7Sartem 	if (i == NULL)
11618c2aff7Sartem 		goto out;
11718c2aff7Sartem 	i->icon = icon;
11818c2aff7Sartem 	i->path = strdup (path);
11918c2aff7Sartem 	i->next = policy->icon_mappings;
12018c2aff7Sartem 	policy->icon_mappings = i;
12118c2aff7Sartem 
12218c2aff7Sartem out:
12318c2aff7Sartem 	return;
12418c2aff7Sartem }
12518c2aff7Sartem 
12618c2aff7Sartem void
libhal_storage_policy_set_icon_mapping(LibHalStoragePolicy * policy,LibHalStoragePolicyIconPair * pairs)12718c2aff7Sartem libhal_storage_policy_set_icon_mapping (LibHalStoragePolicy *policy, LibHalStoragePolicyIconPair *pairs)
12818c2aff7Sartem {
12918c2aff7Sartem 	LibHalStoragePolicyIconPair *i;
13018c2aff7Sartem 
13118c2aff7Sartem 	for (i = pairs; i->icon != 0x00; i++) {
13218c2aff7Sartem 		libhal_storage_policy_set_icon_path (policy, i->icon, i->icon_path);
13318c2aff7Sartem 	}
13418c2aff7Sartem }
13518c2aff7Sartem 
13618c2aff7Sartem const char *
libhal_storage_policy_lookup_icon(LibHalStoragePolicy * policy,LibHalStoragePolicyIcon icon)13718c2aff7Sartem libhal_storage_policy_lookup_icon (LibHalStoragePolicy *policy, LibHalStoragePolicyIcon icon)
13818c2aff7Sartem {
13918c2aff7Sartem 	IconMappingEntry *i;
14018c2aff7Sartem 	const char *path;
14118c2aff7Sartem 
14218c2aff7Sartem 	path = NULL;
14318c2aff7Sartem 	for (i = policy->icon_mappings; i != NULL; i = i->next) {
14418c2aff7Sartem 		if (i->icon == icon) {
14518c2aff7Sartem 			path = i->path;
14618c2aff7Sartem 			goto out;
14718c2aff7Sartem 		}
14818c2aff7Sartem 	}
14918c2aff7Sartem out:
15018c2aff7Sartem 	return path;
15118c2aff7Sartem }
15218c2aff7Sartem 
15318c2aff7Sartem 
15418c2aff7Sartem #define MAX_STRING_SZ 256
15518c2aff7Sartem 
15618c2aff7Sartem char *
libhal_volume_policy_compute_size_as_string(LibHalVolume * volume)15718c2aff7Sartem libhal_volume_policy_compute_size_as_string (LibHalVolume *volume)
15818c2aff7Sartem {
15918c2aff7Sartem 	dbus_uint64_t size;
16018c2aff7Sartem 	char *result;
16118c2aff7Sartem 	char* sizes_str[] = {"K", "M", "G", "T", NULL};
16218c2aff7Sartem 	dbus_uint64_t cur = 1000L;
16318c2aff7Sartem 	dbus_uint64_t base = 10L;
16418c2aff7Sartem 	dbus_uint64_t step = 10L*10L*10L;
16518c2aff7Sartem 	int cur_str = 0;
16618c2aff7Sartem 	char buf[MAX_STRING_SZ];
16718c2aff7Sartem 
16818c2aff7Sartem 	result = NULL;
16918c2aff7Sartem 
17018c2aff7Sartem 	size = libhal_volume_get_size (volume);
17118c2aff7Sartem 
17218c2aff7Sartem 	do {
17318c2aff7Sartem 		if (sizes_str[cur_str+1] == NULL || size < cur*step) {
17418c2aff7Sartem 			/* found the unit, display a comma number if result is a single digit */
17518c2aff7Sartem 			if (size < cur*base) {
176*55fea89dSDan Cross 				snprintf (buf, MAX_STRING_SZ, "%.01f%s",
17718c2aff7Sartem 					  ((double)size)/((double)cur), sizes_str[cur_str]);
17818c2aff7Sartem 				result = strdup (buf);
17918c2aff7Sartem 			} else {
18018c2aff7Sartem 				snprintf (buf, MAX_STRING_SZ, "%llu%s", (long long unsigned int) size / cur, sizes_str[cur_str]);
18118c2aff7Sartem 				result = strdup (buf);
18218c2aff7Sartem 				}
18318c2aff7Sartem 			goto out;
18418c2aff7Sartem 		}
18518c2aff7Sartem 
18618c2aff7Sartem 		cur *= step;
18718c2aff7Sartem 		cur_str++;
18818c2aff7Sartem 	} while (1);
18918c2aff7Sartem 
19018c2aff7Sartem out:
19118c2aff7Sartem 	return result;
19218c2aff7Sartem }
19318c2aff7Sartem 
19418c2aff7Sartem static void
fixup_string(char * s)19518c2aff7Sartem fixup_string (char *s)
19618c2aff7Sartem {
19718c2aff7Sartem 	/* TODO: first strip leading and trailing whitespace */
19818c2aff7Sartem 	/*g_strstrip (s);*/
19918c2aff7Sartem 
20018c2aff7Sartem 	/* TODO: could do nice things on all-upper case strings */
20118c2aff7Sartem }
20218c2aff7Sartem 
20318c2aff7Sartem /* volume may be NULL (e.g. if drive supports removable media) */
20418c2aff7Sartem char *
libhal_drive_policy_compute_display_name(LibHalDrive * drive,LibHalVolume * volume,LibHalStoragePolicy * policy)20518c2aff7Sartem libhal_drive_policy_compute_display_name (LibHalDrive *drive, LibHalVolume *volume, LibHalStoragePolicy *policy)
20618c2aff7Sartem {
20718c2aff7Sartem 	char *name;
20818c2aff7Sartem 	char *size_str;
20918c2aff7Sartem 	char *vendormodel_str;
21018c2aff7Sartem 	const char *model;
21118c2aff7Sartem 	const char *vendor;
21218c2aff7Sartem 	LibHalDriveType drive_type;
21318c2aff7Sartem 	dbus_bool_t drive_is_hotpluggable;
21418c2aff7Sartem 	dbus_bool_t drive_is_removable;
21518c2aff7Sartem 	LibHalDriveCdromCaps drive_cdrom_caps;
21618c2aff7Sartem 	char buf[MAX_STRING_SZ];
21718c2aff7Sartem 
21818c2aff7Sartem 	model = libhal_drive_get_model (drive);
21918c2aff7Sartem 	vendor = libhal_drive_get_vendor (drive);
22018c2aff7Sartem 	drive_type = libhal_drive_get_type (drive);
22118c2aff7Sartem 	drive_is_hotpluggable = libhal_drive_is_hotpluggable (drive);
22218c2aff7Sartem 	drive_is_removable = libhal_drive_uses_removable_media (drive);
22318c2aff7Sartem 	drive_cdrom_caps = libhal_drive_get_cdrom_caps (drive);
22418c2aff7Sartem 
22518c2aff7Sartem 	if (volume != NULL)
22618c2aff7Sartem 		size_str = libhal_volume_policy_compute_size_as_string (volume);
22718c2aff7Sartem 	else
22818c2aff7Sartem 		size_str = NULL;
22918c2aff7Sartem 
23018c2aff7Sartem 	if (vendor == NULL || strlen (vendor) == 0) {
23118c2aff7Sartem 		if (model == NULL || strlen (model) == 0)
23218c2aff7Sartem 			vendormodel_str = strdup ("");
23318c2aff7Sartem 		else
23418c2aff7Sartem 			vendormodel_str = strdup (model);
23518c2aff7Sartem 	} else {
23618c2aff7Sartem 		if (model == NULL || strlen (model) == 0)
23718c2aff7Sartem 			vendormodel_str = strdup (vendor);
23818c2aff7Sartem 		else {
23918c2aff7Sartem 			snprintf (buf, MAX_STRING_SZ, "%s %s", vendor, model);
24018c2aff7Sartem 			vendormodel_str = strdup (buf);
24118c2aff7Sartem 		}
24218c2aff7Sartem 	}
24318c2aff7Sartem 
24418c2aff7Sartem 	fixup_string (vendormodel_str);
24518c2aff7Sartem 
24618c2aff7Sartem 	if (drive_type==LIBHAL_DRIVE_TYPE_CDROM) {
24718c2aff7Sartem 
24818c2aff7Sartem 		/* Optical drive handling */
24918c2aff7Sartem 		char *first;
25018c2aff7Sartem 		char *second;
25118c2aff7Sartem 
25218c2aff7Sartem 
25318c2aff7Sartem 		first = "CD-ROM";
25418c2aff7Sartem 		if (drive_cdrom_caps & LIBHAL_DRIVE_CDROM_CAPS_CDR)
25518c2aff7Sartem 			first = "CD-R";
25618c2aff7Sartem 		if (drive_cdrom_caps & LIBHAL_DRIVE_CDROM_CAPS_CDRW)
25718c2aff7Sartem 			first = "CD-RW";
25818c2aff7Sartem 
25918c2aff7Sartem 		second = "";
26018c2aff7Sartem 		if (drive_cdrom_caps & LIBHAL_DRIVE_CDROM_CAPS_DVDROM)
26118c2aff7Sartem 			second = "/DVD-ROM";
26218c2aff7Sartem 		if (drive_cdrom_caps & LIBHAL_DRIVE_CDROM_CAPS_DVDPLUSR)
26318c2aff7Sartem 			second = "/DVD+R";
26418c2aff7Sartem 		if (drive_cdrom_caps & LIBHAL_DRIVE_CDROM_CAPS_DVDPLUSRW)
26518c2aff7Sartem 			second = "/DVD+RW";
26618c2aff7Sartem 		if (drive_cdrom_caps & LIBHAL_DRIVE_CDROM_CAPS_DVDR)
26718c2aff7Sartem 			second = "/DVD-R";
26818c2aff7Sartem 		if (drive_cdrom_caps & LIBHAL_DRIVE_CDROM_CAPS_DVDRW)
26918c2aff7Sartem 			second = "/DVD-RW";
27018c2aff7Sartem 		if (drive_cdrom_caps & LIBHAL_DRIVE_CDROM_CAPS_DVDRAM)
27118c2aff7Sartem 			second = "/DVD-RAM";
27218c2aff7Sartem 		if ((drive_cdrom_caps & LIBHAL_DRIVE_CDROM_CAPS_DVDR) &&
27318c2aff7Sartem 		    (drive_cdrom_caps & LIBHAL_DRIVE_CDROM_CAPS_DVDPLUSR)) {
27418c2aff7Sartem 			if(drive_cdrom_caps & LIBHAL_DRIVE_CDROM_CAPS_DVDPLUSRDL)
27518c2aff7Sartem 				second = "/DVD±R DL";
27618c2aff7Sartem 			else
27718c2aff7Sartem 				second = "/DVD±R";
27818c2aff7Sartem 		}
27918c2aff7Sartem 		if ((drive_cdrom_caps & LIBHAL_DRIVE_CDROM_CAPS_DVDRW) &&
28018c2aff7Sartem 		    (drive_cdrom_caps & LIBHAL_DRIVE_CDROM_CAPS_DVDPLUSRW)) {
281*55fea89dSDan Cross                         if(drive_cdrom_caps & LIBHAL_DRIVE_CDROM_CAPS_DVDPLUSRDL ||
28218c2aff7Sartem 			   drive_cdrom_caps & LIBHAL_DRIVE_CDROM_CAPS_DVDPLUSRWDL)
28318c2aff7Sartem                                 second = "/DVD±RW DL";
28418c2aff7Sartem                         else
28518c2aff7Sartem                                 second = "/DVD±RW";
28618c2aff7Sartem                 }
28718c2aff7Sartem 		if (drive_cdrom_caps & LIBHAL_DRIVE_CDROM_CAPS_BDROM)
28818c2aff7Sartem 			second = "/BD-ROM";
28918c2aff7Sartem 		if (drive_cdrom_caps & LIBHAL_DRIVE_CDROM_CAPS_BDR)
29018c2aff7Sartem 			second = "/BD-R";
29118c2aff7Sartem 		if (drive_cdrom_caps & LIBHAL_DRIVE_CDROM_CAPS_BDRE)
29218c2aff7Sartem 			second = "/BD-RE";
29318c2aff7Sartem 		if (drive_cdrom_caps & LIBHAL_DRIVE_CDROM_CAPS_HDDVDROM)
29418c2aff7Sartem 			second = "/HD DVD-ROM";
29518c2aff7Sartem 		if (drive_cdrom_caps & LIBHAL_DRIVE_CDROM_CAPS_HDDVDR)
29618c2aff7Sartem 			second = "/HD DVD-R";
29718c2aff7Sartem 		if (drive_cdrom_caps & LIBHAL_DRIVE_CDROM_CAPS_HDDVDRW)
29818c2aff7Sartem 			second = "/HD DVD-RW";
29918c2aff7Sartem 
30018c2aff7Sartem 		if (drive_is_hotpluggable) {
30118c2aff7Sartem 			snprintf (buf, MAX_STRING_SZ, _("External %s%s Drive"), first, second);
30218c2aff7Sartem 			name = strdup (buf);
30318c2aff7Sartem 		} else {
30418c2aff7Sartem 			snprintf (buf, MAX_STRING_SZ, _("%s%s Drive"), first, second);
30518c2aff7Sartem 			name = strdup (buf);
30618c2aff7Sartem 		}
307*55fea89dSDan Cross 
30818c2aff7Sartem 	} else if (drive_type==LIBHAL_DRIVE_TYPE_FLOPPY) {
30918c2aff7Sartem 
31018c2aff7Sartem 		/* Floppy Drive handling */
31118c2aff7Sartem 
31218c2aff7Sartem 		if (drive_is_hotpluggable)
31318c2aff7Sartem 			name = strdup (_("External Floppy Drive"));
31418c2aff7Sartem 		else
31518c2aff7Sartem 			name = strdup (_("Floppy Drive"));
31618c2aff7Sartem 	} else if (drive_type==LIBHAL_DRIVE_TYPE_DISK && !drive_is_removable) {
31718c2aff7Sartem 
31818c2aff7Sartem 		/* Harddisks */
31918c2aff7Sartem 
32018c2aff7Sartem 		if (size_str != NULL) {
32118c2aff7Sartem 			if (drive_is_hotpluggable) {
32218c2aff7Sartem 				snprintf (buf, MAX_STRING_SZ, _("%s External Hard Drive"), size_str);
32318c2aff7Sartem 				name = strdup (buf);
32418c2aff7Sartem 			} else {
32518c2aff7Sartem 				snprintf (buf, MAX_STRING_SZ, _("%s Hard Drive"), size_str);
32618c2aff7Sartem 				name = strdup (buf);
32718c2aff7Sartem 			}
32818c2aff7Sartem 		} else {
32918c2aff7Sartem 			if (drive_is_hotpluggable)
33018c2aff7Sartem 				name = strdup (_("External Hard Drive"));
33118c2aff7Sartem 			else
33218c2aff7Sartem 				name = strdup (_("Hard Drive"));
33318c2aff7Sartem 		}
33418c2aff7Sartem 	} else {
33518c2aff7Sartem 
33618c2aff7Sartem 		/* The rest - includes drives with removable Media */
33718c2aff7Sartem 
33818c2aff7Sartem 		if (strlen (vendormodel_str) > 0)
33918c2aff7Sartem 			name = strdup (vendormodel_str);
34018c2aff7Sartem 		else
34118c2aff7Sartem 			name = strdup (_("Drive"));
34218c2aff7Sartem 	}
34318c2aff7Sartem 
34418c2aff7Sartem 	free (vendormodel_str);
34518c2aff7Sartem 	free (size_str);
34618c2aff7Sartem 
34718c2aff7Sartem 	return name;
34818c2aff7Sartem }
34918c2aff7Sartem 
35018c2aff7Sartem char *
libhal_volume_policy_compute_display_name(LibHalDrive * drive,LibHalVolume * volume,LibHalStoragePolicy * policy)35118c2aff7Sartem libhal_volume_policy_compute_display_name (LibHalDrive *drive, LibHalVolume *volume, LibHalStoragePolicy *policy)
35218c2aff7Sartem {
35318c2aff7Sartem 	char *name;
35418c2aff7Sartem 	char *size_str;
35518c2aff7Sartem 	const char *volume_label;
35618c2aff7Sartem 	LibHalDriveType drive_type;
35718c2aff7Sartem 	dbus_bool_t drive_is_removable;
35818c2aff7Sartem 	char buf[MAX_STRING_SZ];
35918c2aff7Sartem 
36018c2aff7Sartem 	volume_label = libhal_volume_get_label (volume);
36118c2aff7Sartem 	drive_type = libhal_drive_get_type (drive);
36218c2aff7Sartem 	drive_is_removable = libhal_drive_uses_removable_media (drive);
36318c2aff7Sartem 
36418c2aff7Sartem 	size_str = libhal_volume_policy_compute_size_as_string (volume);
36518c2aff7Sartem 
366*55fea89dSDan Cross 	/* If the volume label is available use that
36718c2aff7Sartem 	 *
36818c2aff7Sartem 	 * TODO: If label is a fully-qualified UNIX path don't use that
36918c2aff7Sartem 	 */
37018c2aff7Sartem 	if (volume_label != NULL) {
37118c2aff7Sartem 		name = strdup (volume_label);
37218c2aff7Sartem 		goto out;
37318c2aff7Sartem 	}
37418c2aff7Sartem 
37518c2aff7Sartem 	/* Handle media in optical drives */
37618c2aff7Sartem 	if (drive_type==LIBHAL_DRIVE_TYPE_CDROM) {
37718c2aff7Sartem 		switch (libhal_volume_get_disc_type (volume)) {
37818c2aff7Sartem 
37918c2aff7Sartem 		default:
38018c2aff7Sartem 			/* explict fallthrough */
38118c2aff7Sartem 		case LIBHAL_VOLUME_DISC_TYPE_CDROM:
38218c2aff7Sartem 			name = strdup (_("CD-ROM "));
38318c2aff7Sartem 			break;
384*55fea89dSDan Cross 
38518c2aff7Sartem 		case LIBHAL_VOLUME_DISC_TYPE_CDR:
38618c2aff7Sartem 			if (libhal_volume_disc_is_blank (volume))
38718c2aff7Sartem 				name = strdup (_("Blank CD-R"));
38818c2aff7Sartem 			else
38918c2aff7Sartem 				name = strdup (_("CD-R"));
39018c2aff7Sartem 			break;
391*55fea89dSDan Cross 
39218c2aff7Sartem 		case LIBHAL_VOLUME_DISC_TYPE_CDRW:
39318c2aff7Sartem 			if (libhal_volume_disc_is_blank (volume))
39418c2aff7Sartem 				name = strdup (_("Blank CD-RW"));
39518c2aff7Sartem 			else
39618c2aff7Sartem 				name = strdup (_("CD-RW"));
39718c2aff7Sartem 			break;
398*55fea89dSDan Cross 
39918c2aff7Sartem 		case LIBHAL_VOLUME_DISC_TYPE_DVDROM:
40018c2aff7Sartem 			name = strdup (_("DVD-ROM"));
40118c2aff7Sartem 			break;
402*55fea89dSDan Cross 
40318c2aff7Sartem 		case LIBHAL_VOLUME_DISC_TYPE_DVDRAM:
40418c2aff7Sartem 			if (libhal_volume_disc_is_blank (volume))
40518c2aff7Sartem 				name = strdup (_("Blank DVD-RAM"));
40618c2aff7Sartem 			else
40718c2aff7Sartem 				name = strdup (_("DVD-RAM"));
40818c2aff7Sartem 			break;
409*55fea89dSDan Cross 
41018c2aff7Sartem 		case LIBHAL_VOLUME_DISC_TYPE_DVDR:
41118c2aff7Sartem 			if (libhal_volume_disc_is_blank (volume))
41218c2aff7Sartem 				name = strdup (_("Blank DVD-R"));
41318c2aff7Sartem 			else
41418c2aff7Sartem 				name = strdup (_("DVD-R"));
41518c2aff7Sartem 			break;
416*55fea89dSDan Cross 
41718c2aff7Sartem 		case LIBHAL_VOLUME_DISC_TYPE_DVDRW:
41818c2aff7Sartem 			if (libhal_volume_disc_is_blank (volume))
41918c2aff7Sartem 				name = strdup (_("Blank DVD-RW"));
42018c2aff7Sartem 			else
42118c2aff7Sartem 				name = strdup (_("DVD-RW"));
42218c2aff7Sartem 			break;
42318c2aff7Sartem 
42418c2aff7Sartem 		case LIBHAL_VOLUME_DISC_TYPE_DVDPLUSR:
42518c2aff7Sartem 			if (libhal_volume_disc_is_blank (volume))
42618c2aff7Sartem 				name = strdup (_("Blank DVD+R"));
42718c2aff7Sartem 			else
42818c2aff7Sartem 				name = strdup (_("DVD+R"));
42918c2aff7Sartem 			break;
430*55fea89dSDan Cross 
43118c2aff7Sartem 		case LIBHAL_VOLUME_DISC_TYPE_DVDPLUSRW:
43218c2aff7Sartem 			if (libhal_volume_disc_is_blank (volume))
43318c2aff7Sartem 				name = strdup (_("Blank DVD+RW"));
43418c2aff7Sartem 			else
43518c2aff7Sartem 				name = strdup (_("DVD+RW"));
43618c2aff7Sartem 			break;
437*55fea89dSDan Cross 
43818c2aff7Sartem 		case LIBHAL_VOLUME_DISC_TYPE_DVDPLUSR_DL:
43918c2aff7Sartem 			if (libhal_volume_disc_is_blank (volume))
44018c2aff7Sartem 				name = strdup (_("Blank DVD+R Dual-Layer"));
44118c2aff7Sartem 			else
44218c2aff7Sartem 				name = strdup (_("DVD+R Dual-Layer"));
44318c2aff7Sartem 			break;
444*55fea89dSDan Cross 
44518c2aff7Sartem 		case LIBHAL_VOLUME_DISC_TYPE_BDROM:
44618c2aff7Sartem 			name = strdup (_("BD-ROM"));
44718c2aff7Sartem 			break;
448*55fea89dSDan Cross 
44918c2aff7Sartem 		case LIBHAL_VOLUME_DISC_TYPE_BDR:
45018c2aff7Sartem 			if (libhal_volume_disc_is_blank (volume))
45118c2aff7Sartem 				name = strdup (_("Blank BD-R"));
45218c2aff7Sartem 			else
45318c2aff7Sartem 				name = strdup (_("BD-R"));
45418c2aff7Sartem 			break;
455*55fea89dSDan Cross 
45618c2aff7Sartem 		case LIBHAL_VOLUME_DISC_TYPE_BDRE:
45718c2aff7Sartem 			if (libhal_volume_disc_is_blank (volume))
45818c2aff7Sartem 				name = strdup (_("Blank BD-RE"));
45918c2aff7Sartem 			else
46018c2aff7Sartem 				name = strdup (_("BD-RE"));
46118c2aff7Sartem 			break;
462*55fea89dSDan Cross 
46318c2aff7Sartem 		case LIBHAL_VOLUME_DISC_TYPE_HDDVDROM:
46418c2aff7Sartem 			name = strdup (_("HD DVD-ROM"));
46518c2aff7Sartem 			break;
466*55fea89dSDan Cross 
46718c2aff7Sartem 		case LIBHAL_VOLUME_DISC_TYPE_HDDVDR:
46818c2aff7Sartem 			if (libhal_volume_disc_is_blank (volume))
46918c2aff7Sartem 				name = strdup (_("Blank HD DVD-R"));
47018c2aff7Sartem 			else
47118c2aff7Sartem 				name = strdup (_("HD DVD-R"));
47218c2aff7Sartem 			break;
473*55fea89dSDan Cross 
47418c2aff7Sartem 		case LIBHAL_VOLUME_DISC_TYPE_HDDVDRW:
47518c2aff7Sartem 			if (libhal_volume_disc_is_blank (volume))
47618c2aff7Sartem 				name = strdup (_("Blank HD DVD-RW"));
47718c2aff7Sartem 			else
47818c2aff7Sartem 				name = strdup (_("HD DVD-RW"));
47918c2aff7Sartem 			break;
48018c2aff7Sartem 
48118c2aff7Sartem 		}
482*55fea89dSDan Cross 
48318c2aff7Sartem 		/* Special case for pure audio disc */
48418c2aff7Sartem 		if (libhal_volume_disc_has_audio (volume) && !libhal_volume_disc_has_data (volume)) {
48518c2aff7Sartem 			free (name);
48618c2aff7Sartem 			name = strdup (_("Audio CD"));
48718c2aff7Sartem 		}
48818c2aff7Sartem 
48918c2aff7Sartem 		goto out;
49018c2aff7Sartem 	}
49118c2aff7Sartem 
49218c2aff7Sartem 	/* Fallback: size of media */
49318c2aff7Sartem 	if (drive_is_removable) {
49418c2aff7Sartem 		snprintf (buf, MAX_STRING_SZ, _("%s Removable Media"), size_str);
49518c2aff7Sartem 		name = strdup (buf);
49618c2aff7Sartem 	} else {
49718c2aff7Sartem 		snprintf (buf, MAX_STRING_SZ, _("%s Media"), size_str);
49818c2aff7Sartem 		name = strdup (buf);
49918c2aff7Sartem 	}
50018c2aff7Sartem 
50118c2aff7Sartem 	/* Fallback: Use drive name */
50218c2aff7Sartem 	/*name = libhal_drive_policy_compute_display_name (drive, volume);*/
50318c2aff7Sartem 
50418c2aff7Sartem out:
50518c2aff7Sartem 	free (size_str);
50618c2aff7Sartem 	return name;
50718c2aff7Sartem }
50818c2aff7Sartem 
50918c2aff7Sartem char *
libhal_drive_policy_compute_icon_name(LibHalDrive * drive,LibHalVolume * volume,LibHalStoragePolicy * policy)51018c2aff7Sartem libhal_drive_policy_compute_icon_name (LibHalDrive *drive, LibHalVolume *volume, LibHalStoragePolicy *policy)
51118c2aff7Sartem {
51218c2aff7Sartem 	const char *name;
51318c2aff7Sartem 	LibHalDriveBus bus;
51418c2aff7Sartem 	LibHalDriveType drive_type;
51518c2aff7Sartem 
51618c2aff7Sartem 	bus        = libhal_drive_get_bus (drive);
51718c2aff7Sartem 	drive_type = libhal_drive_get_type (drive);
51818c2aff7Sartem 
51918c2aff7Sartem 	/* by design, the enums are laid out so we can do easy computations */
52018c2aff7Sartem 
52118c2aff7Sartem 	switch (drive_type) {
52218c2aff7Sartem 	case LIBHAL_DRIVE_TYPE_REMOVABLE_DISK:
52318c2aff7Sartem 	case LIBHAL_DRIVE_TYPE_DISK:
52418c2aff7Sartem 	case LIBHAL_DRIVE_TYPE_CDROM:
52518c2aff7Sartem 	case LIBHAL_DRIVE_TYPE_FLOPPY:
52618c2aff7Sartem 		name = libhal_storage_policy_lookup_icon (policy, 0x10000 + drive_type*0x100 + bus);
52718c2aff7Sartem 		break;
52818c2aff7Sartem 
52918c2aff7Sartem 	default:
53018c2aff7Sartem 		name = libhal_storage_policy_lookup_icon (policy, 0x10000 + drive_type*0x100);
53118c2aff7Sartem 	}
53218c2aff7Sartem 
53318c2aff7Sartem 	if (name != NULL)
53418c2aff7Sartem 		return strdup (name);
53518c2aff7Sartem 	else
53618c2aff7Sartem 		return NULL;
53718c2aff7Sartem }
53818c2aff7Sartem 
53918c2aff7Sartem char *
libhal_volume_policy_compute_icon_name(LibHalDrive * drive,LibHalVolume * volume,LibHalStoragePolicy * policy)54018c2aff7Sartem libhal_volume_policy_compute_icon_name (LibHalDrive *drive, LibHalVolume *volume, LibHalStoragePolicy *policy)
54118c2aff7Sartem {
54218c2aff7Sartem 	const char *name;
54318c2aff7Sartem 	LibHalDriveBus bus;
54418c2aff7Sartem 	LibHalDriveType drive_type;
54518c2aff7Sartem 	LibHalVolumeDiscType disc_type;
54618c2aff7Sartem 
54718c2aff7Sartem 	/* by design, the enums are laid out so we can do easy computations */
54818c2aff7Sartem 
54918c2aff7Sartem 	if (libhal_volume_is_disc (volume)) {
55018c2aff7Sartem 		disc_type = libhal_volume_get_disc_type (volume);
55118c2aff7Sartem 		name = libhal_storage_policy_lookup_icon (policy, 0x30000 + disc_type);
55218c2aff7Sartem 		goto out;
55318c2aff7Sartem 	}
55418c2aff7Sartem 
55518c2aff7Sartem 	if (drive == NULL) {
55618c2aff7Sartem 		name = libhal_storage_policy_lookup_icon (policy, LIBHAL_STORAGE_ICON_VOLUME_REMOVABLE_DISK);
55718c2aff7Sartem 		goto out;
55818c2aff7Sartem 	}
55918c2aff7Sartem 
56018c2aff7Sartem 	bus        = libhal_drive_get_bus (drive);
56118c2aff7Sartem 	drive_type = libhal_drive_get_type (drive);
56218c2aff7Sartem 
56318c2aff7Sartem 	switch (drive_type) {
56418c2aff7Sartem 	case LIBHAL_DRIVE_TYPE_REMOVABLE_DISK:
56518c2aff7Sartem 	case LIBHAL_DRIVE_TYPE_DISK:
56618c2aff7Sartem 	case LIBHAL_DRIVE_TYPE_CDROM:
56718c2aff7Sartem 	case LIBHAL_DRIVE_TYPE_FLOPPY:
56818c2aff7Sartem 		name = libhal_storage_policy_lookup_icon (policy, 0x20000 + drive_type*0x100 + bus);
56918c2aff7Sartem 		break;
57018c2aff7Sartem 
57118c2aff7Sartem 	default:
57218c2aff7Sartem 		name = libhal_storage_policy_lookup_icon (policy, 0x20000 + drive_type*0x100);
57318c2aff7Sartem 	}
57418c2aff7Sartem out:
57518c2aff7Sartem 	if (name != NULL)
57618c2aff7Sartem 		return strdup (name);
57718c2aff7Sartem 	else
57818c2aff7Sartem 		return NULL;
57918c2aff7Sartem }
58018c2aff7Sartem 
581*55fea89dSDan Cross /** Policy function to determine if a volume should be visible in a desktop
58218c2aff7Sartem  *  environment. This is useful to hide certain system volumes as bootstrap
58318c2aff7Sartem  *  partitions, the /usr partition, swap partitions and other volumes that
58418c2aff7Sartem  *  a unprivileged desktop user shouldn't know even exists.
58518c2aff7Sartem  *
58618c2aff7Sartem  *  @param  drive               Drive that the volume is stemming from
58718c2aff7Sartem  *  @param  volume              Volume
58818c2aff7Sartem  *  @param  policy              Policy object
58918c2aff7Sartem  *  @param  target_mount_point  The mount point that the volume is expected to
59018c2aff7Sartem  *                              be mounted at if not already mounted. This may
59118c2aff7Sartem  *                              e.g. stem from /etc/fstab. If this is NULL the
59218c2aff7Sartem  *                              then mount point isn't taking into account when
59318c2aff7Sartem  *                              evaluating whether the volume should be visible
59418c2aff7Sartem  *  @return                     Whether the volume should be shown in a desktop
59518c2aff7Sartem  *                              environment.
59618c2aff7Sartem  */
59718c2aff7Sartem dbus_bool_t
libhal_volume_policy_should_be_visible(LibHalDrive * drive,LibHalVolume * volume,LibHalStoragePolicy * policy,const char * target_mount_point)598*55fea89dSDan Cross libhal_volume_policy_should_be_visible (LibHalDrive *drive, LibHalVolume *volume, LibHalStoragePolicy *policy,
59918c2aff7Sartem 				     const char *target_mount_point)
60018c2aff7Sartem {
60118c2aff7Sartem 	unsigned int i;
60218c2aff7Sartem 	dbus_bool_t is_visible;
60318c2aff7Sartem 	const char *label;
60418c2aff7Sartem 	const char *mount_point;
60518c2aff7Sartem 	const char *fstype;
60618c2aff7Sartem 	const char *fhs23_toplevel_mount_points[] = {
60718c2aff7Sartem 		"/",
60818c2aff7Sartem 		"/bin",
60918c2aff7Sartem 		"/boot",
61018c2aff7Sartem 		"/dev",
61118c2aff7Sartem 		"/etc",
61218c2aff7Sartem 		"/home",
61318c2aff7Sartem 		"/lib",
61418c2aff7Sartem 		"/lib64",
61518c2aff7Sartem 		"/media",
61618c2aff7Sartem 		"/mnt",
61718c2aff7Sartem 		"/opt",
61818c2aff7Sartem 		"/root",
61918c2aff7Sartem 		"/sbin",
62018c2aff7Sartem 		"/srv",
62118c2aff7Sartem 		"/tmp",
62218c2aff7Sartem 		"/usr",
62318c2aff7Sartem 		"/var",
62418c2aff7Sartem 		"/proc",
62518c2aff7Sartem 		"/sbin",
62618c2aff7Sartem 		NULL
62718c2aff7Sartem 	};
62818c2aff7Sartem 
62918c2aff7Sartem 	is_visible = FALSE;
63018c2aff7Sartem 
63118c2aff7Sartem 	/* skip if hal says it's not used as a filesystem */
63218c2aff7Sartem 	if (libhal_volume_get_fsusage (volume) != LIBHAL_VOLUME_USAGE_MOUNTABLE_FILESYSTEM)
63318c2aff7Sartem 		goto out;
63418c2aff7Sartem 
63518c2aff7Sartem 	label = libhal_volume_get_label (volume);
63618c2aff7Sartem 	mount_point = libhal_volume_get_mount_point (volume);
63718c2aff7Sartem 	fstype = libhal_volume_get_fstype (volume);
63818c2aff7Sartem 
63918c2aff7Sartem 	/* use target mount point if we're not mounted yet */
64018c2aff7Sartem 	if (mount_point == NULL)
64118c2aff7Sartem 		mount_point = target_mount_point;
64218c2aff7Sartem 
64318c2aff7Sartem 	/* bail out if we don't know the filesystem */
64418c2aff7Sartem 	if (fstype == NULL)
64518c2aff7Sartem 		goto out;
64618c2aff7Sartem 
64718c2aff7Sartem 	/* blacklist fhs2.3 top level mount points */
64818c2aff7Sartem 	if (mount_point != NULL) {
64918c2aff7Sartem 		for (i = 0; fhs23_toplevel_mount_points[i] != NULL; i++) {
65018c2aff7Sartem 			if (strcmp (mount_point, fhs23_toplevel_mount_points[i]) == 0)
65118c2aff7Sartem 				goto out;
65218c2aff7Sartem 		}
65318c2aff7Sartem 	}
65418c2aff7Sartem 
65518c2aff7Sartem 	/* blacklist partitions with name 'bootstrap' of type HFS (Apple uses that) */
65618c2aff7Sartem 	if (label != NULL && strcmp (label, "bootstrap") == 0 && strcmp (fstype, "hfs") == 0)
65718c2aff7Sartem 		goto out;
65818c2aff7Sartem 
65918c2aff7Sartem 	/* only the real lucky mount points will make it this far :-) */
66018c2aff7Sartem 	is_visible = TRUE;
66118c2aff7Sartem 
66218c2aff7Sartem out:
66318c2aff7Sartem 	return is_visible;
66418c2aff7Sartem }
66518c2aff7Sartem 
66618c2aff7Sartem /*************************************************************************/
66718c2aff7Sartem 
66818c2aff7Sartem #define MOUNT_OPTIONS_SIZE 256
66918c2aff7Sartem 
67018c2aff7Sartem struct LibHalDrive_s {
67118c2aff7Sartem 	char *udi;
67218c2aff7Sartem 
67318c2aff7Sartem 	int device_major;
67418c2aff7Sartem 	int device_minor;
67518c2aff7Sartem 	char *device_file;
67618c2aff7Sartem 
67718c2aff7Sartem 	LibHalDriveBus bus;
67818c2aff7Sartem 	char *vendor;             /* may be "", is never NULL */
67918c2aff7Sartem 	char *model;              /* may be "", is never NULL */
68018c2aff7Sartem 	dbus_bool_t is_hotpluggable;
68118c2aff7Sartem 	dbus_bool_t is_removable;
68218c2aff7Sartem 	dbus_bool_t is_media_detected;
68318c2aff7Sartem 	dbus_bool_t requires_eject;
68418c2aff7Sartem 
68518c2aff7Sartem 	LibHalDriveType type;
68618c2aff7Sartem 	char *type_textual;
68718c2aff7Sartem 
688*55fea89dSDan Cross 	char *physical_device;  /* UDI of physical device, e.g. the
68918c2aff7Sartem 				 * IDE, USB, IEEE1394 device */
69018c2aff7Sartem 
69118c2aff7Sartem 	char *dedicated_icon_drive;
69218c2aff7Sartem 	char *dedicated_icon_volume;
69318c2aff7Sartem 
69418c2aff7Sartem 	char *serial;
69518c2aff7Sartem 	char *firmware_version;
69618c2aff7Sartem 	LibHalDriveCdromCaps cdrom_caps;
69718c2aff7Sartem 
69818c2aff7Sartem 	char *desired_mount_point;
69918c2aff7Sartem 	char *mount_filesystem;
70018c2aff7Sartem 	dbus_bool_t should_mount;
70118c2aff7Sartem 
70218c2aff7Sartem 	dbus_bool_t no_partitions_hint;
70318c2aff7Sartem 
70418c2aff7Sartem 	dbus_uint64_t drive_size;
70518c2aff7Sartem 	dbus_uint64_t drive_media_size;
70618c2aff7Sartem 	char *partition_scheme;
70718c2aff7Sartem 
70818c2aff7Sartem 	LibHalContext *hal_ctx;
70918c2aff7Sartem 
71018c2aff7Sartem 	char **capabilities;
71118c2aff7Sartem 
71218c2aff7Sartem 	char mount_options[MOUNT_OPTIONS_SIZE];
71318c2aff7Sartem };
71418c2aff7Sartem 
71518c2aff7Sartem struct LibHalVolume_s {
71618c2aff7Sartem 	char *udi;
71718c2aff7Sartem 
71818c2aff7Sartem 	int device_major;
71918c2aff7Sartem 	int device_minor;
72018c2aff7Sartem 	char *device_file;
72118c2aff7Sartem 	char *volume_label; /* may be NULL, is never "" */
72218c2aff7Sartem 	dbus_bool_t is_mounted;
72318c2aff7Sartem 	dbus_bool_t is_mounted_read_only; /* TRUE iff is_mounted and r/o fs */
72418c2aff7Sartem 	char *mount_point;  /* NULL iff !is_mounted */
72518c2aff7Sartem 	char *fstype;       /* NULL iff !is_mounted or unknown */
72618c2aff7Sartem 	char *fsversion;
72718c2aff7Sartem 	char *uuid;
72818c2aff7Sartem 	char *storage_device;
72918c2aff7Sartem 
73018c2aff7Sartem 	LibHalVolumeUsage fsusage;
73118c2aff7Sartem 
73218c2aff7Sartem 	dbus_bool_t is_partition;
73318c2aff7Sartem 	unsigned int partition_number;
73418c2aff7Sartem 	char *partition_scheme;
73518c2aff7Sartem 	char *partition_type;
73618c2aff7Sartem 	char *partition_label;
73718c2aff7Sartem 	char *partition_uuid;
73818c2aff7Sartem 	char **partition_flags;
73918c2aff7Sartem 
74018c2aff7Sartem 	int msdos_part_table_type;
74118c2aff7Sartem 	dbus_uint64_t msdos_part_table_start;
74218c2aff7Sartem 	dbus_uint64_t msdos_part_table_size;
743*55fea89dSDan Cross 
74418c2aff7Sartem 	dbus_bool_t is_disc;
74518c2aff7Sartem 	LibHalVolumeDiscType disc_type;
74618c2aff7Sartem 	dbus_bool_t disc_has_audio;
74718c2aff7Sartem 	dbus_bool_t disc_has_data;
74818c2aff7Sartem 	dbus_bool_t disc_is_appendable;
74918c2aff7Sartem 	dbus_bool_t disc_is_blank;
75018c2aff7Sartem 	dbus_bool_t disc_is_rewritable;
75118c2aff7Sartem 
75218c2aff7Sartem 	unsigned int block_size;
75318c2aff7Sartem 	unsigned int num_blocks;
75418c2aff7Sartem 
75518c2aff7Sartem 	char *desired_mount_point;
75618c2aff7Sartem 	char *mount_filesystem;
75718c2aff7Sartem 	dbus_bool_t should_mount;
75818c2aff7Sartem 
75918c2aff7Sartem 	dbus_bool_t ignore_volume;
76018c2aff7Sartem 
76118c2aff7Sartem 	char *crypto_backing_volume;
76218c2aff7Sartem 
76318c2aff7Sartem 	char mount_options[MOUNT_OPTIONS_SIZE];
76418c2aff7Sartem 
76518c2aff7Sartem 	dbus_uint64_t volume_size;
76618c2aff7Sartem 	dbus_uint64_t disc_capacity;
76718c2aff7Sartem 
76818c2aff7Sartem 	dbus_uint64_t partition_start_offset;
76918c2aff7Sartem 	dbus_uint64_t partition_media_size;
77018c2aff7Sartem };
77118c2aff7Sartem 
77218c2aff7Sartem const char *
libhal_drive_get_dedicated_icon_drive(LibHalDrive * drive)77318c2aff7Sartem libhal_drive_get_dedicated_icon_drive (LibHalDrive *drive)
77418c2aff7Sartem {
77518c2aff7Sartem 	return drive->dedicated_icon_drive;
77618c2aff7Sartem }
77718c2aff7Sartem 
77818c2aff7Sartem const char *
libhal_drive_get_dedicated_icon_volume(LibHalDrive * drive)77918c2aff7Sartem libhal_drive_get_dedicated_icon_volume (LibHalDrive *drive)
78018c2aff7Sartem {
78118c2aff7Sartem 	return drive->dedicated_icon_volume;
78218c2aff7Sartem }
78318c2aff7Sartem 
78418c2aff7Sartem /** Free all resources used by a LibHalDrive object.
78518c2aff7Sartem  *
78618c2aff7Sartem  *  @param  drive               Object to free
78718c2aff7Sartem  */
78818c2aff7Sartem void
libhal_drive_free(LibHalDrive * drive)78918c2aff7Sartem libhal_drive_free (LibHalDrive *drive)
79018c2aff7Sartem {
79118c2aff7Sartem 	if (drive == NULL )
79218c2aff7Sartem 		return;
79318c2aff7Sartem 
79418c2aff7Sartem 	free (drive->udi);
79518c2aff7Sartem 	libhal_free_string (drive->device_file);
79618c2aff7Sartem 	libhal_free_string (drive->vendor);
79718c2aff7Sartem 	libhal_free_string (drive->model);
79818c2aff7Sartem 	libhal_free_string (drive->type_textual);
79918c2aff7Sartem 	libhal_free_string (drive->physical_device);
80018c2aff7Sartem 	libhal_free_string (drive->dedicated_icon_drive);
80118c2aff7Sartem 	libhal_free_string (drive->dedicated_icon_volume);
80218c2aff7Sartem 	libhal_free_string (drive->serial);
80318c2aff7Sartem 	libhal_free_string (drive->firmware_version);
80418c2aff7Sartem 	libhal_free_string (drive->desired_mount_point);
80518c2aff7Sartem 	libhal_free_string (drive->mount_filesystem);
80618c2aff7Sartem 	libhal_free_string_array (drive->capabilities);
80718c2aff7Sartem 	libhal_free_string (drive->partition_scheme);
80818c2aff7Sartem 
80918c2aff7Sartem 	free (drive);
81018c2aff7Sartem }
81118c2aff7Sartem 
81218c2aff7Sartem 
81318c2aff7Sartem /** Free all resources used by a LibHalVolume object.
81418c2aff7Sartem  *
81518c2aff7Sartem  *  @param  vol              Object to free
81618c2aff7Sartem  */
81718c2aff7Sartem void
libhal_volume_free(LibHalVolume * vol)81818c2aff7Sartem libhal_volume_free (LibHalVolume *vol)
81918c2aff7Sartem {
82018c2aff7Sartem 	if (vol == NULL )
82118c2aff7Sartem 		return;
82218c2aff7Sartem 
82318c2aff7Sartem 	free (vol->udi);
82418c2aff7Sartem 	libhal_free_string (vol->device_file);
82518c2aff7Sartem 	libhal_free_string (vol->volume_label);
82618c2aff7Sartem 	libhal_free_string (vol->fstype);
82718c2aff7Sartem 	libhal_free_string (vol->mount_point);
82818c2aff7Sartem 	libhal_free_string (vol->fsversion);
82918c2aff7Sartem 	libhal_free_string (vol->uuid);
83018c2aff7Sartem 	libhal_free_string (vol->desired_mount_point);
83118c2aff7Sartem 	libhal_free_string (vol->mount_filesystem);
83218c2aff7Sartem 	libhal_free_string (vol->crypto_backing_volume);
83318c2aff7Sartem 	libhal_free_string (vol->storage_device);
83418c2aff7Sartem 
83518c2aff7Sartem 	libhal_free_string (vol->partition_scheme);
83618c2aff7Sartem 	libhal_free_string (vol->partition_type);
83718c2aff7Sartem 	libhal_free_string (vol->partition_label);
83818c2aff7Sartem 	libhal_free_string (vol->partition_uuid);
83918c2aff7Sartem 	libhal_free_string_array (vol->partition_flags);
84018c2aff7Sartem 
84118c2aff7Sartem 	free (vol);
84218c2aff7Sartem }
84318c2aff7Sartem 
84418c2aff7Sartem 
84518c2aff7Sartem static char **
my_strvdup(char ** strv)84618c2aff7Sartem my_strvdup (char **strv)
84718c2aff7Sartem {
84818c2aff7Sartem 	unsigned int num_elems;
84918c2aff7Sartem 	unsigned int i;
85018c2aff7Sartem 	char **res;
85118c2aff7Sartem 
85218c2aff7Sartem 	for (num_elems = 0; strv[num_elems] != NULL; num_elems++)
85318c2aff7Sartem 		;
85418c2aff7Sartem 
85518c2aff7Sartem 	res = calloc (num_elems + 1, sizeof (char*));
85618c2aff7Sartem 	if (res == NULL)
85718c2aff7Sartem 		goto out;
85818c2aff7Sartem 
85918c2aff7Sartem 	for (i = 0; i < num_elems; i++)
86018c2aff7Sartem 		res[i] = strdup (strv[i]);
86118c2aff7Sartem 	res[i] = NULL;
86218c2aff7Sartem 
86318c2aff7Sartem out:
86418c2aff7Sartem 	return res;
86518c2aff7Sartem }
86618c2aff7Sartem 
86718c2aff7Sartem /* ok, hey, so this is a bit ugly */
86818c2aff7Sartem 
86918c2aff7Sartem #define LIBHAL_PROP_EXTRACT_BEGIN if (FALSE)
87018c2aff7Sartem #define LIBHAL_PROP_EXTRACT_END ;
87118c2aff7Sartem #define LIBHAL_PROP_EXTRACT_INT(_property_, _where_) else if (strcmp (key, _property_) == 0 && type == LIBHAL_PROPERTY_TYPE_INT32) _where_ = libhal_psi_get_int (&it)
87218c2aff7Sartem #define LIBHAL_PROP_EXTRACT_UINT64(_property_, _where_) else if (strcmp (key, _property_) == 0 && type == LIBHAL_PROPERTY_TYPE_UINT64) _where_ = libhal_psi_get_uint64 (&it)
87318c2aff7Sartem #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
87418c2aff7Sartem #define LIBHAL_PROP_EXTRACT_BOOL(_property_, _where_) else if (strcmp (key, _property_) == 0 && type == LIBHAL_PROPERTY_TYPE_BOOLEAN) _where_ = libhal_psi_get_bool (&it)
87518c2aff7Sartem #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
87618c2aff7Sartem #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))
87718c2aff7Sartem 
87818c2aff7Sartem /** Given a UDI for a HAL device of capability 'storage', this
87918c2aff7Sartem  *  function retrieves all the relevant properties into convenient
88018c2aff7Sartem  *  in-process data structures.
88118c2aff7Sartem  *
88218c2aff7Sartem  *  @param  hal_ctx             libhal context
88318c2aff7Sartem  *  @param  udi                 HAL UDI
88418c2aff7Sartem  *  @return                     LibHalDrive object or NULL if UDI is invalid
88518c2aff7Sartem  */
88618c2aff7Sartem LibHalDrive *
libhal_drive_from_udi(LibHalContext * hal_ctx,const char * udi)88718c2aff7Sartem libhal_drive_from_udi (LibHalContext *hal_ctx, const char *udi)
888*55fea89dSDan Cross {
88918c2aff7Sartem 	char *bus_textual;
89018c2aff7Sartem 	LibHalDrive *drive;
89118c2aff7Sartem 	LibHalPropertySet *properties;
89218c2aff7Sartem 	LibHalPropertySetIterator it;
89318c2aff7Sartem 	DBusError error;
89418c2aff7Sartem 	unsigned int i;
89518c2aff7Sartem 
89618c2aff7Sartem 	LIBHAL_CHECK_LIBHALCONTEXT(hal_ctx, NULL);
89718c2aff7Sartem 
89818c2aff7Sartem 	drive = NULL;
89918c2aff7Sartem 	properties = NULL;
90018c2aff7Sartem 	bus_textual = NULL;
90118c2aff7Sartem 
90218c2aff7Sartem 	dbus_error_init (&error);
90318c2aff7Sartem 	if (!libhal_device_query_capability (hal_ctx, udi, "storage", &error))
90418c2aff7Sartem 		goto error;
90518c2aff7Sartem 
90618c2aff7Sartem 	drive = malloc (sizeof (LibHalDrive));
90718c2aff7Sartem 	if (drive == NULL)
90818c2aff7Sartem 		goto error;
90918c2aff7Sartem 	memset (drive, 0x00, sizeof (LibHalDrive));
91018c2aff7Sartem 
91118c2aff7Sartem 	drive->hal_ctx = hal_ctx;
91218c2aff7Sartem 
91318c2aff7Sartem 	drive->udi = strdup (udi);
91418c2aff7Sartem 	if (drive->udi == NULL)
91518c2aff7Sartem 		goto error;
91618c2aff7Sartem 
91718c2aff7Sartem 	properties = libhal_device_get_all_properties (hal_ctx, udi, &error);
91818c2aff7Sartem 	if (properties == NULL)
91918c2aff7Sartem 		goto error;
92018c2aff7Sartem 
92118c2aff7Sartem 	/* we can count on hal to give us all these properties */
92218c2aff7Sartem 	for (libhal_psi_init (&it, properties); libhal_psi_has_more (&it); libhal_psi_next (&it)) {
92318c2aff7Sartem 		int type;
92418c2aff7Sartem 		char *key;
925*55fea89dSDan Cross 
92618c2aff7Sartem 		type = libhal_psi_get_type (&it);
92718c2aff7Sartem 		key = libhal_psi_get_key (&it);
92818c2aff7Sartem 
92918c2aff7Sartem 		LIBHAL_PROP_EXTRACT_BEGIN;
93018c2aff7Sartem 
93118c2aff7Sartem 		LIBHAL_PROP_EXTRACT_INT    ("block.minor",               drive->device_minor);
93218c2aff7Sartem 		LIBHAL_PROP_EXTRACT_INT    ("block.major",               drive->device_major);
93318c2aff7Sartem 		LIBHAL_PROP_EXTRACT_STRING ("block.device",              drive->device_file);
93418c2aff7Sartem 		LIBHAL_PROP_EXTRACT_STRING ("storage.bus",               bus_textual);
93518c2aff7Sartem 		LIBHAL_PROP_EXTRACT_STRING ("storage.vendor",            drive->vendor);
93618c2aff7Sartem 		LIBHAL_PROP_EXTRACT_STRING ("storage.model",             drive->model);
93718c2aff7Sartem 		LIBHAL_PROP_EXTRACT_STRING ("storage.drive_type",        drive->type_textual);
938*55fea89dSDan Cross 		LIBHAL_PROP_EXTRACT_UINT64 ("storage.size", 		 drive->drive_size);
93918c2aff7Sartem 
94018c2aff7Sartem 		LIBHAL_PROP_EXTRACT_STRING ("storage.icon.drive",        drive->dedicated_icon_drive);
94118c2aff7Sartem 		LIBHAL_PROP_EXTRACT_STRING ("storage.icon.volume",       drive->dedicated_icon_volume);
94218c2aff7Sartem 
94318c2aff7Sartem 		LIBHAL_PROP_EXTRACT_BOOL   ("storage.hotpluggable",      drive->is_hotpluggable);
94418c2aff7Sartem 		LIBHAL_PROP_EXTRACT_BOOL   ("storage.removable",         drive->is_removable);
94518c2aff7Sartem 		LIBHAL_PROP_EXTRACT_BOOL   ("storage.removable.media_available", drive->is_media_detected);
946*55fea89dSDan Cross 		LIBHAL_PROP_EXTRACT_UINT64 ("storage.removable.media_size", drive->drive_media_size);
94718c2aff7Sartem 		LIBHAL_PROP_EXTRACT_BOOL   ("storage.requires_eject",    drive->requires_eject);
94818c2aff7Sartem 
949*55fea89dSDan Cross 		LIBHAL_PROP_EXTRACT_STRING ("storage.partitioning_scheme", drive->partition_scheme);
95018c2aff7Sartem 
95118c2aff7Sartem 		LIBHAL_PROP_EXTRACT_STRING ("storage.physical_device",   drive->physical_device);
95218c2aff7Sartem 		LIBHAL_PROP_EXTRACT_STRING ("storage.firmware_version",  drive->firmware_version);
95318c2aff7Sartem 		LIBHAL_PROP_EXTRACT_STRING ("storage.serial",            drive->serial);
95418c2aff7Sartem 
95518c2aff7Sartem 		LIBHAL_PROP_EXTRACT_BOOL_BITFIELD ("storage.cdrom.cdr", drive->cdrom_caps, LIBHAL_DRIVE_CDROM_CAPS_CDR);
95618c2aff7Sartem 		LIBHAL_PROP_EXTRACT_BOOL_BITFIELD ("storage.cdrom.cdrw", drive->cdrom_caps, LIBHAL_DRIVE_CDROM_CAPS_CDRW);
95718c2aff7Sartem 		LIBHAL_PROP_EXTRACT_BOOL_BITFIELD ("storage.cdrom.dvd", drive->cdrom_caps, LIBHAL_DRIVE_CDROM_CAPS_DVDROM);
95818c2aff7Sartem 		LIBHAL_PROP_EXTRACT_BOOL_BITFIELD ("storage.cdrom.dvdplusr", drive->cdrom_caps, LIBHAL_DRIVE_CDROM_CAPS_DVDPLUSR);
95918c2aff7Sartem 		LIBHAL_PROP_EXTRACT_BOOL_BITFIELD ("storage.cdrom.dvdplusrw", drive->cdrom_caps, LIBHAL_DRIVE_CDROM_CAPS_DVDPLUSRW);
96018c2aff7Sartem 		LIBHAL_PROP_EXTRACT_BOOL_BITFIELD ("storage.cdrom.dvdplusrwdl", drive->cdrom_caps, LIBHAL_DRIVE_CDROM_CAPS_DVDPLUSRWDL);
96118c2aff7Sartem 		LIBHAL_PROP_EXTRACT_BOOL_BITFIELD ("storage.cdrom.dvdplusrdl", drive->cdrom_caps, LIBHAL_DRIVE_CDROM_CAPS_DVDPLUSRDL);
96218c2aff7Sartem 		LIBHAL_PROP_EXTRACT_BOOL_BITFIELD ("storage.cdrom.dvdr", drive->cdrom_caps, LIBHAL_DRIVE_CDROM_CAPS_DVDR);
96318c2aff7Sartem 		LIBHAL_PROP_EXTRACT_BOOL_BITFIELD ("storage.cdrom.dvdrw", drive->cdrom_caps, LIBHAL_DRIVE_CDROM_CAPS_DVDRW);
96418c2aff7Sartem 		LIBHAL_PROP_EXTRACT_BOOL_BITFIELD ("storage.cdrom.dvdram", drive->cdrom_caps, LIBHAL_DRIVE_CDROM_CAPS_DVDRAM);
96518c2aff7Sartem 		LIBHAL_PROP_EXTRACT_BOOL_BITFIELD ("storage.cdrom.bd", drive->cdrom_caps, LIBHAL_DRIVE_CDROM_CAPS_BDROM);
96618c2aff7Sartem 		LIBHAL_PROP_EXTRACT_BOOL_BITFIELD ("storage.cdrom.bdr", drive->cdrom_caps, LIBHAL_DRIVE_CDROM_CAPS_BDR);
96718c2aff7Sartem 		LIBHAL_PROP_EXTRACT_BOOL_BITFIELD ("storage.cdrom.bdre", drive->cdrom_caps, LIBHAL_DRIVE_CDROM_CAPS_BDRE);
96818c2aff7Sartem 		LIBHAL_PROP_EXTRACT_BOOL_BITFIELD ("storage.cdrom.hddvd", drive->cdrom_caps, LIBHAL_DRIVE_CDROM_CAPS_HDDVDROM);
96918c2aff7Sartem 		LIBHAL_PROP_EXTRACT_BOOL_BITFIELD ("storage.cdrom.hddvdr", drive->cdrom_caps, LIBHAL_DRIVE_CDROM_CAPS_HDDVDR);
97018c2aff7Sartem 		LIBHAL_PROP_EXTRACT_BOOL_BITFIELD ("storage.cdrom.hddvdrw", drive->cdrom_caps, LIBHAL_DRIVE_CDROM_CAPS_HDDVDRW);
97118c2aff7Sartem 
97218c2aff7Sartem 		LIBHAL_PROP_EXTRACT_BOOL   ("storage.policy.should_mount",        drive->should_mount);
97318c2aff7Sartem 		LIBHAL_PROP_EXTRACT_STRING ("storage.policy.desired_mount_point", drive->desired_mount_point);
97418c2aff7Sartem 		LIBHAL_PROP_EXTRACT_STRING ("storage.policy.mount_filesystem",    drive->mount_filesystem);
97518c2aff7Sartem 
97618c2aff7Sartem 		LIBHAL_PROP_EXTRACT_BOOL   ("storage.no_partitions_hint",        drive->no_partitions_hint);
97718c2aff7Sartem 
97818c2aff7Sartem 		LIBHAL_PROP_EXTRACT_STRLIST ("info.capabilities",                drive->capabilities);
97918c2aff7Sartem 
98018c2aff7Sartem 		LIBHAL_PROP_EXTRACT_END;
98118c2aff7Sartem 	}
98218c2aff7Sartem 
98318c2aff7Sartem 	if (drive->type_textual != NULL) {
98418c2aff7Sartem 		if (strcmp (drive->type_textual, "cdrom") == 0) {
98518c2aff7Sartem 			drive->cdrom_caps |= LIBHAL_DRIVE_CDROM_CAPS_CDROM;
98618c2aff7Sartem 			drive->type = LIBHAL_DRIVE_TYPE_CDROM;
98718c2aff7Sartem 		} else if (strcmp (drive->type_textual, "floppy") == 0) {
98818c2aff7Sartem 			drive->type = LIBHAL_DRIVE_TYPE_FLOPPY;
98918c2aff7Sartem 		} else if (strcmp (drive->type_textual, "disk") == 0) {
99018c2aff7Sartem 			if (drive->is_removable)
99118c2aff7Sartem 				drive->type = LIBHAL_DRIVE_TYPE_REMOVABLE_DISK;
99218c2aff7Sartem 			else
993*55fea89dSDan Cross 				drive->type = LIBHAL_DRIVE_TYPE_DISK;
99418c2aff7Sartem 		} else if (strcmp (drive->type_textual, "tape") == 0) {
99518c2aff7Sartem 			drive->type = LIBHAL_DRIVE_TYPE_TAPE;
99618c2aff7Sartem 		} else if (strcmp (drive->type_textual, "compact_flash") == 0) {
99718c2aff7Sartem 			drive->type = LIBHAL_DRIVE_TYPE_COMPACT_FLASH;
99818c2aff7Sartem 		} else if (strcmp (drive->type_textual, "memory_stick") == 0) {
99918c2aff7Sartem 			drive->type = LIBHAL_DRIVE_TYPE_MEMORY_STICK;
100018c2aff7Sartem 		} else if (strcmp (drive->type_textual, "smart_media") == 0) {
100118c2aff7Sartem 			drive->type = LIBHAL_DRIVE_TYPE_SMART_MEDIA;
100218c2aff7Sartem 		} else if (strcmp (drive->type_textual, "sd_mmc") == 0) {
100318c2aff7Sartem 			drive->type = LIBHAL_DRIVE_TYPE_SD_MMC;
100418c2aff7Sartem 		} else if (strcmp (drive->type_textual, "zip") == 0) {
100518c2aff7Sartem 			drive->type = LIBHAL_DRIVE_TYPE_ZIP;
100618c2aff7Sartem 		} else if (strcmp (drive->type_textual, "jaz") == 0) {
100718c2aff7Sartem 			drive->type = LIBHAL_DRIVE_TYPE_JAZ;
100818c2aff7Sartem 		} else if (strcmp (drive->type_textual, "flashkey") == 0) {
100918c2aff7Sartem 			drive->type = LIBHAL_DRIVE_TYPE_FLASHKEY;
101018c2aff7Sartem 		} else {
1011*55fea89dSDan Cross 		        drive->type = LIBHAL_DRIVE_TYPE_DISK;
101218c2aff7Sartem 		}
101318c2aff7Sartem 
101418c2aff7Sartem 	}
101518c2aff7Sartem 
101618c2aff7Sartem 	if (drive->capabilities != NULL) {
101718c2aff7Sartem 		for (i = 0; drive->capabilities[i] != NULL; i++) {
101818c2aff7Sartem 			if (strcmp (drive->capabilities[i], "portable_audio_player") == 0) {
101918c2aff7Sartem 				drive->type = LIBHAL_DRIVE_TYPE_PORTABLE_AUDIO_PLAYER;
102018c2aff7Sartem 				break;
102118c2aff7Sartem 			} else if (strcmp (drive->capabilities[i], "camera") == 0) {
102218c2aff7Sartem 				drive->type = LIBHAL_DRIVE_TYPE_CAMERA;
102318c2aff7Sartem 				break;
102418c2aff7Sartem 			}
102518c2aff7Sartem 		}
102618c2aff7Sartem 	}
102718c2aff7Sartem 
102818c2aff7Sartem 	if (bus_textual != NULL) {
102918c2aff7Sartem 		if (strcmp (bus_textual, "usb") == 0) {
103018c2aff7Sartem 			drive->bus = LIBHAL_DRIVE_BUS_USB;
103118c2aff7Sartem 		} else if (strcmp (bus_textual, "ieee1394") == 0) {
103218c2aff7Sartem 			drive->bus = LIBHAL_DRIVE_BUS_IEEE1394;
103318c2aff7Sartem 		} else if (strcmp (bus_textual, "ide") == 0) {
103418c2aff7Sartem 			drive->bus = LIBHAL_DRIVE_BUS_IDE;
103518c2aff7Sartem 		} else if (strcmp (bus_textual, "scsi") == 0) {
103618c2aff7Sartem 			drive->bus = LIBHAL_DRIVE_BUS_SCSI;
103718c2aff7Sartem 		} else if (strcmp (bus_textual, "ccw") == 0) {
103818c2aff7Sartem 			drive->bus = LIBHAL_DRIVE_BUS_CCW;
103918c2aff7Sartem 		}
104018c2aff7Sartem 	}
104118c2aff7Sartem 
104218c2aff7Sartem 	libhal_free_string (bus_textual);
104318c2aff7Sartem 	libhal_free_property_set (properties);
104418c2aff7Sartem 
104518c2aff7Sartem 	return drive;
104618c2aff7Sartem 
104718c2aff7Sartem error:
104818c2aff7Sartem 	LIBHAL_FREE_DBUS_ERROR(&error);
104918c2aff7Sartem 	libhal_free_string (bus_textual);
105018c2aff7Sartem 	libhal_free_property_set (properties);
105118c2aff7Sartem 	libhal_drive_free (drive);
105218c2aff7Sartem 	return NULL;
105318c2aff7Sartem }
105418c2aff7Sartem 
105518c2aff7Sartem const char *
libhal_volume_get_storage_device_udi(LibHalVolume * volume)105618c2aff7Sartem libhal_volume_get_storage_device_udi (LibHalVolume *volume)
105718c2aff7Sartem {
105818c2aff7Sartem 	return volume->storage_device;
105918c2aff7Sartem }
106018c2aff7Sartem 
libhal_drive_get_physical_device_udi(LibHalDrive * drive)106118c2aff7Sartem const char *libhal_drive_get_physical_device_udi (LibHalDrive *drive)
106218c2aff7Sartem {
106318c2aff7Sartem 	return drive->physical_device;
106418c2aff7Sartem }
106518c2aff7Sartem 
106618c2aff7Sartem dbus_bool_t
libhal_drive_requires_eject(LibHalDrive * drive)106718c2aff7Sartem libhal_drive_requires_eject (LibHalDrive *drive)
106818c2aff7Sartem {
106918c2aff7Sartem 	return drive->requires_eject;
107018c2aff7Sartem }
107118c2aff7Sartem 
107218c2aff7Sartem /** Given a UDI for a LIBHAL device of capability 'volume', this
107318c2aff7Sartem  *  function retrieves all the relevant properties into convenient
107418c2aff7Sartem  *  in-process data structures.
107518c2aff7Sartem  *
107618c2aff7Sartem  *  @param  hal_ctx             libhal context
107718c2aff7Sartem  *  @param  udi                 HAL UDI
107818c2aff7Sartem  *  @return                     LibHalVolume object or NULL if UDI is invalid
107918c2aff7Sartem  */
108018c2aff7Sartem LibHalVolume *
libhal_volume_from_udi(LibHalContext * hal_ctx,const char * udi)108118c2aff7Sartem libhal_volume_from_udi (LibHalContext *hal_ctx, const char *udi)
108218c2aff7Sartem {
108318c2aff7Sartem 	char *disc_type_textual;
108418c2aff7Sartem 	char *vol_fsusage_textual;
108518c2aff7Sartem 	LibHalVolume *vol;
108618c2aff7Sartem 	LibHalPropertySet *properties;
108718c2aff7Sartem 	LibHalPropertySetIterator it;
108818c2aff7Sartem 	DBusError error;
108918c2aff7Sartem 
109018c2aff7Sartem 	LIBHAL_CHECK_LIBHALCONTEXT(hal_ctx, NULL);
109118c2aff7Sartem 
109218c2aff7Sartem 	vol = NULL;
109318c2aff7Sartem 	properties = NULL;
109418c2aff7Sartem 	disc_type_textual = NULL;
109518c2aff7Sartem 	vol_fsusage_textual = NULL;
109618c2aff7Sartem 
109718c2aff7Sartem 	dbus_error_init (&error);
109818c2aff7Sartem 	if (!libhal_device_query_capability (hal_ctx, udi, "volume", &error))
109918c2aff7Sartem 		goto error;
110018c2aff7Sartem 
110118c2aff7Sartem 	vol = malloc (sizeof (LibHalVolume));
110218c2aff7Sartem 	if (vol == NULL)
110318c2aff7Sartem 		goto error;
110418c2aff7Sartem 	memset (vol, 0x00, sizeof (LibHalVolume));
110518c2aff7Sartem 
110618c2aff7Sartem 	vol->udi = strdup (udi);
110718c2aff7Sartem 
110818c2aff7Sartem 	properties = libhal_device_get_all_properties (hal_ctx, udi, &error);
110918c2aff7Sartem 	if (properties == NULL)
111018c2aff7Sartem 		goto error;
111118c2aff7Sartem 
111218c2aff7Sartem 	/* we can count on hal to give us all these properties */
111318c2aff7Sartem 	for (libhal_psi_init (&it, properties); libhal_psi_has_more (&it); libhal_psi_next (&it)) {
111418c2aff7Sartem 		int type;
111518c2aff7Sartem 		char *key;
1116*55fea89dSDan Cross 
111718c2aff7Sartem 		type = libhal_psi_get_type (&it);
111818c2aff7Sartem 		key = libhal_psi_get_key (&it);
111918c2aff7Sartem 
112018c2aff7Sartem 		LIBHAL_PROP_EXTRACT_BEGIN;
112118c2aff7Sartem 
112218c2aff7Sartem 		LIBHAL_PROP_EXTRACT_BOOL   ("volume.is_partition",                    vol->is_partition);
112318c2aff7Sartem 		LIBHAL_PROP_EXTRACT_INT    ("volume.partition.number",                vol->partition_number);
112418c2aff7Sartem 		LIBHAL_PROP_EXTRACT_STRING ("volume.partition.scheme",                vol->partition_scheme);
112518c2aff7Sartem 		LIBHAL_PROP_EXTRACT_STRING ("volume.partition.type",                  vol->partition_type);
112618c2aff7Sartem 		LIBHAL_PROP_EXTRACT_STRING ("volume.partition.label",                 vol->partition_label);
112718c2aff7Sartem 		LIBHAL_PROP_EXTRACT_STRING ("volume.partition.uuid",                  vol->partition_uuid);
112818c2aff7Sartem 		LIBHAL_PROP_EXTRACT_STRLIST ("volume.partition.flags",                vol->partition_flags);
112918c2aff7Sartem 
1130*55fea89dSDan Cross 		LIBHAL_PROP_EXTRACT_UINT64 ("volume.partition.start", 		      vol->partition_start_offset);
1131*55fea89dSDan Cross 		LIBHAL_PROP_EXTRACT_UINT64 ("volume.partition.media_size",            vol->partition_media_size);
113218c2aff7Sartem 		LIBHAL_PROP_EXTRACT_INT    ("volume.partition.msdos_part_table_type", vol->msdos_part_table_type);
113318c2aff7Sartem 		LIBHAL_PROP_EXTRACT_UINT64 ("volume.partition.msdos_part_table_start", vol->msdos_part_table_start);
113418c2aff7Sartem 		LIBHAL_PROP_EXTRACT_UINT64 ("volume.partition.msdos_part_table_size", vol->msdos_part_table_size);
113518c2aff7Sartem 
113618c2aff7Sartem 		LIBHAL_PROP_EXTRACT_INT    ("block.minor",               vol->device_minor);
113718c2aff7Sartem 		LIBHAL_PROP_EXTRACT_INT    ("block.major",               vol->device_major);
113818c2aff7Sartem 		LIBHAL_PROP_EXTRACT_STRING ("block.device",              vol->device_file);
113918c2aff7Sartem 
114018c2aff7Sartem 		LIBHAL_PROP_EXTRACT_STRING ("block.storage_device",      vol->storage_device);
114118c2aff7Sartem 
114218c2aff7Sartem 		LIBHAL_PROP_EXTRACT_STRING ("volume.crypto_luks.clear.backing_volume", vol->crypto_backing_volume);
114318c2aff7Sartem 
114418c2aff7Sartem 		LIBHAL_PROP_EXTRACT_INT    ("volume.block_size",         vol->block_size);
114518c2aff7Sartem 		LIBHAL_PROP_EXTRACT_INT    ("volume.num_blocks",         vol->num_blocks);
1146*55fea89dSDan Cross 		LIBHAL_PROP_EXTRACT_UINT64 ("volume.size", 		 vol->volume_size);
114718c2aff7Sartem 		LIBHAL_PROP_EXTRACT_STRING ("volume.label",              vol->volume_label);
114818c2aff7Sartem 		LIBHAL_PROP_EXTRACT_STRING ("volume.mount_point",        vol->mount_point);
114918c2aff7Sartem 		LIBHAL_PROP_EXTRACT_STRING ("volume.fstype",             vol->fstype);
115018c2aff7Sartem 		LIBHAL_PROP_EXTRACT_STRING ("volume.fsversion",             vol->fsversion);
115118c2aff7Sartem 		LIBHAL_PROP_EXTRACT_BOOL   ("volume.is_mounted",         vol->is_mounted);
115218c2aff7Sartem 		LIBHAL_PROP_EXTRACT_BOOL   ("volume.is_mounted_read_only", vol->is_mounted_read_only);
115318c2aff7Sartem 		LIBHAL_PROP_EXTRACT_STRING ("volume.fsusage",            vol_fsusage_textual);
115418c2aff7Sartem 		LIBHAL_PROP_EXTRACT_STRING ("volume.uuid",               vol->uuid);
115518c2aff7Sartem 
115618c2aff7Sartem 		LIBHAL_PROP_EXTRACT_BOOL   ("volume.ignore",             vol->ignore_volume);
115718c2aff7Sartem 
115818c2aff7Sartem 		LIBHAL_PROP_EXTRACT_BOOL   ("volume.is_disc",            vol->is_disc);
115918c2aff7Sartem 		LIBHAL_PROP_EXTRACT_STRING ("volume.disc.type",          disc_type_textual);
116018c2aff7Sartem 		LIBHAL_PROP_EXTRACT_BOOL   ("volume.disc.has_audio",     vol->disc_has_audio);
116118c2aff7Sartem 		LIBHAL_PROP_EXTRACT_BOOL   ("volume.disc.has_data",      vol->disc_has_data);
116218c2aff7Sartem 		LIBHAL_PROP_EXTRACT_BOOL   ("volume.disc.is_appendable", vol->disc_is_appendable);
116318c2aff7Sartem 		LIBHAL_PROP_EXTRACT_BOOL   ("volume.disc.is_blank",      vol->disc_is_blank);
116418c2aff7Sartem 		LIBHAL_PROP_EXTRACT_BOOL   ("volume.disc.is_rewritable", vol->disc_is_rewritable);
116518c2aff7Sartem 		LIBHAL_PROP_EXTRACT_UINT64 ("volume.disc.capacity",      vol->disc_capacity);
116618c2aff7Sartem 
116718c2aff7Sartem 		LIBHAL_PROP_EXTRACT_BOOL   ("volume.policy.should_mount",        vol->should_mount);
116818c2aff7Sartem 		LIBHAL_PROP_EXTRACT_STRING ("volume.policy.desired_mount_point", vol->desired_mount_point);
116918c2aff7Sartem 		LIBHAL_PROP_EXTRACT_STRING ("volume.policy.mount_filesystem",    vol->mount_filesystem);
117018c2aff7Sartem 
117118c2aff7Sartem 		LIBHAL_PROP_EXTRACT_END;
117218c2aff7Sartem 	}
117318c2aff7Sartem 
117418c2aff7Sartem 	if (disc_type_textual != NULL) {
117518c2aff7Sartem 		if (strcmp (disc_type_textual, "cd_rom") == 0) {
117618c2aff7Sartem 			vol->disc_type = LIBHAL_VOLUME_DISC_TYPE_CDROM;
117718c2aff7Sartem 		} else if (strcmp (disc_type_textual, "cd_r") == 0) {
117818c2aff7Sartem 			vol->disc_type = LIBHAL_VOLUME_DISC_TYPE_CDR;
117918c2aff7Sartem 		} else if (strcmp (disc_type_textual, "cd_rw") == 0) {
118018c2aff7Sartem 			vol->disc_type = LIBHAL_VOLUME_DISC_TYPE_CDRW;
118118c2aff7Sartem 		} else if (strcmp (disc_type_textual, "dvd_rom") == 0) {
118218c2aff7Sartem 			vol->disc_type = LIBHAL_VOLUME_DISC_TYPE_DVDROM;
118318c2aff7Sartem 		} else if (strcmp (disc_type_textual, "dvd_ram") == 0) {
118418c2aff7Sartem 			vol->disc_type = LIBHAL_VOLUME_DISC_TYPE_DVDRAM;
118518c2aff7Sartem 		} else if (strcmp (disc_type_textual, "dvd_r") == 0) {
118618c2aff7Sartem 			vol->disc_type = LIBHAL_VOLUME_DISC_TYPE_DVDR;
118718c2aff7Sartem 		} else if (strcmp (disc_type_textual, "dvd_rw") == 0) {
118818c2aff7Sartem 			vol->disc_type = LIBHAL_VOLUME_DISC_TYPE_DVDRW;
118918c2aff7Sartem 		} else if (strcmp (disc_type_textual, "dvd_plus_r") == 0) {
119018c2aff7Sartem 			vol->disc_type = LIBHAL_VOLUME_DISC_TYPE_DVDPLUSR;
119118c2aff7Sartem 		} else if (strcmp (disc_type_textual, "dvd_plus_rw") == 0) {
119218c2aff7Sartem 			vol->disc_type = LIBHAL_VOLUME_DISC_TYPE_DVDPLUSRW;
119318c2aff7Sartem 		} else if (strcmp (disc_type_textual, "dvd_plus_r_dl") == 0) {
119418c2aff7Sartem 			vol->disc_type = LIBHAL_VOLUME_DISC_TYPE_DVDPLUSR_DL;
119518c2aff7Sartem 		} else if (strcmp (disc_type_textual, "bd_rom") == 0) {
119618c2aff7Sartem 			vol->disc_type = LIBHAL_VOLUME_DISC_TYPE_BDROM;
119718c2aff7Sartem 		} else if (strcmp (disc_type_textual, "bd_r") == 0) {
119818c2aff7Sartem 			vol->disc_type = LIBHAL_VOLUME_DISC_TYPE_BDR;
119918c2aff7Sartem 		} else if (strcmp (disc_type_textual, "bd_re") == 0) {
120018c2aff7Sartem 			vol->disc_type = LIBHAL_VOLUME_DISC_TYPE_BDRE;
120118c2aff7Sartem 		} else if (strcmp (disc_type_textual, "hddvd_rom") == 0) {
120218c2aff7Sartem 			vol->disc_type = LIBHAL_VOLUME_DISC_TYPE_HDDVDROM;
120318c2aff7Sartem 		} else if (strcmp (disc_type_textual, "hddvd_r") == 0) {
120418c2aff7Sartem 			vol->disc_type = LIBHAL_VOLUME_DISC_TYPE_HDDVDR;
120518c2aff7Sartem 		} else if (strcmp (disc_type_textual, "hddvd_rw") == 0) {
120618c2aff7Sartem 			vol->disc_type = LIBHAL_VOLUME_DISC_TYPE_HDDVDRW;
120718c2aff7Sartem 		}
120818c2aff7Sartem 	}
120918c2aff7Sartem 
121018c2aff7Sartem 	vol->fsusage = LIBHAL_VOLUME_USAGE_UNKNOWN;
121118c2aff7Sartem 	if (vol_fsusage_textual != NULL) {
121218c2aff7Sartem 		if (strcmp (vol_fsusage_textual, "filesystem") == 0) {
121318c2aff7Sartem 			vol->fsusage = LIBHAL_VOLUME_USAGE_MOUNTABLE_FILESYSTEM;
121418c2aff7Sartem 		} else if (strcmp (vol_fsusage_textual, "partitiontable") == 0) {
121518c2aff7Sartem 			vol->fsusage = LIBHAL_VOLUME_USAGE_PARTITION_TABLE;
121618c2aff7Sartem 		} else if (strcmp (vol_fsusage_textual, "raid") == 0) {
121718c2aff7Sartem 			vol->fsusage = LIBHAL_VOLUME_USAGE_RAID_MEMBER;
121818c2aff7Sartem 		} else if (strcmp (vol_fsusage_textual, "crypto") == 0) {
121918c2aff7Sartem 			vol->fsusage = LIBHAL_VOLUME_USAGE_CRYPTO;
122018c2aff7Sartem 		} else if (strcmp (vol_fsusage_textual, "other") == 0) {
122118c2aff7Sartem 			vol->fsusage = LIBHAL_VOLUME_USAGE_OTHER;
122218c2aff7Sartem 		} else {
122318c2aff7Sartem 			vol->fsusage = LIBHAL_VOLUME_USAGE_UNKNOWN;
1224*55fea89dSDan Cross 		}
122518c2aff7Sartem 	}
122618c2aff7Sartem 
122718c2aff7Sartem 	libhal_free_string (vol_fsusage_textual);
122818c2aff7Sartem 	libhal_free_string (disc_type_textual);
122918c2aff7Sartem 	libhal_free_property_set (properties);
123018c2aff7Sartem 	return vol;
123118c2aff7Sartem error:
123218c2aff7Sartem 	if (dbus_error_is_set (&error)) {
123318c2aff7Sartem 		dbus_error_free (&error);
123418c2aff7Sartem 	}
123518c2aff7Sartem 	libhal_free_string (vol_fsusage_textual);
123618c2aff7Sartem 	libhal_free_string (disc_type_textual);
123718c2aff7Sartem 	libhal_free_property_set (properties);
123818c2aff7Sartem 	libhal_volume_free (vol);
123918c2aff7Sartem 	return NULL;
124018c2aff7Sartem }
124118c2aff7Sartem 
124218c2aff7Sartem 
124318c2aff7Sartem /** If the volume is on a drive with a MSDOS style partition table, return
124418c2aff7Sartem  *  the partition table id.
124518c2aff7Sartem  *
124618c2aff7Sartem  *  @param  volume              Volume object
124718c2aff7Sartem  *  @return                     The partition type or -1 if volume is not
124818c2aff7Sartem  *                              a partition or the media the volume stems from
124918c2aff7Sartem  *                              isn't partition with a MS DOS style table
125018c2aff7Sartem  */
125118c2aff7Sartem int
libhal_volume_get_msdos_part_table_type(LibHalVolume * volume)125218c2aff7Sartem libhal_volume_get_msdos_part_table_type (LibHalVolume *volume)
125318c2aff7Sartem {
125418c2aff7Sartem 	return volume->msdos_part_table_type;
125518c2aff7Sartem }
125618c2aff7Sartem 
125718c2aff7Sartem /** If the volume is on a drive with a MSDOS style partition table, return
125818c2aff7Sartem  *  the partition start offset according to the partition table.
125918c2aff7Sartem  *
126018c2aff7Sartem  *  @param  volume              Volume object
126118c2aff7Sartem  *  @return                     The partition start offset or -1 if volume isnt
126218c2aff7Sartem  *                              a partition or the media the volume stems from
126318c2aff7Sartem  *                              isn't partition with a MS DOS style table
126418c2aff7Sartem  */
126518c2aff7Sartem dbus_uint64_t
libhal_volume_get_msdos_part_table_start(LibHalVolume * volume)126618c2aff7Sartem libhal_volume_get_msdos_part_table_start (LibHalVolume *volume)
126718c2aff7Sartem {
126818c2aff7Sartem 	return volume->msdos_part_table_start;
126918c2aff7Sartem }
127018c2aff7Sartem 
127118c2aff7Sartem /** If the volume is on a drive with a MSDOS style partition table, return
127218c2aff7Sartem  *  the partition size according to the partition table.
127318c2aff7Sartem  *
127418c2aff7Sartem  *  @param  volume              Volume object
127518c2aff7Sartem  *  @return                     The partition size or -1 if volume is not
127618c2aff7Sartem  *                              a partition or the media the volume stems from
127718c2aff7Sartem  *                              isn't partition with a MS DOS style table
127818c2aff7Sartem  */
127918c2aff7Sartem dbus_uint64_t
libhal_volume_get_msdos_part_table_size(LibHalVolume * volume)128018c2aff7Sartem libhal_volume_get_msdos_part_table_size (LibHalVolume *volume)
128118c2aff7Sartem {
128218c2aff7Sartem 	return volume->msdos_part_table_size;
128318c2aff7Sartem }
128418c2aff7Sartem 
128518c2aff7Sartem /***********************************************************************/
128618c2aff7Sartem 
128718c2aff7Sartem /** Get the drive object that either is (when given e.g. /dev/sdb) or contains
128818c2aff7Sartem  *  (when given e.g. /dev/sdb1) the given device file.
128918c2aff7Sartem  *
129018c2aff7Sartem  *  @param  hal_ctx             libhal context to use
129118c2aff7Sartem  *  @param  device_file         Name of special device file, e.g. '/dev/hdc'
129218c2aff7Sartem  *  @return                     LibHalDrive object or NULL if it doesn't exist
129318c2aff7Sartem  */
129418c2aff7Sartem LibHalDrive *
libhal_drive_from_device_file(LibHalContext * hal_ctx,const char * device_file)129518c2aff7Sartem libhal_drive_from_device_file (LibHalContext *hal_ctx, const char *device_file)
129618c2aff7Sartem {
129718c2aff7Sartem 	int i;
129818c2aff7Sartem 	char **hal_udis;
129918c2aff7Sartem 	int num_hal_udis;
130018c2aff7Sartem 	LibHalDrive *result;
130118c2aff7Sartem 	char *found_udi;
130218c2aff7Sartem 	DBusError error;
130318c2aff7Sartem 
130418c2aff7Sartem 	LIBHAL_CHECK_LIBHALCONTEXT(hal_ctx, NULL);
130518c2aff7Sartem 
130618c2aff7Sartem 	result = NULL;
130718c2aff7Sartem 	found_udi = NULL;
130818c2aff7Sartem 
130918c2aff7Sartem 	dbus_error_init (&error);
1310*55fea89dSDan Cross 	if ((hal_udis = libhal_manager_find_device_string_match (hal_ctx, "block.device",
131118c2aff7Sartem 								 device_file, &num_hal_udis, &error)) == NULL) {
131218c2aff7Sartem 		LIBHAL_FREE_DBUS_ERROR(&error);
131318c2aff7Sartem 		goto out;
131418c2aff7Sartem 	}
131518c2aff7Sartem 
131618c2aff7Sartem 	for (i = 0; i < num_hal_udis; i++) {
131718c2aff7Sartem 		char *udi;
131818c2aff7Sartem 		char *storage_udi;
131918c2aff7Sartem 		DBusError err1;
132018c2aff7Sartem 		DBusError err2;
132118c2aff7Sartem 		udi = hal_udis[i];
132218c2aff7Sartem 
132318c2aff7Sartem 		dbus_error_init (&err1);
132418c2aff7Sartem 		dbus_error_init (&err2);
132518c2aff7Sartem 		if (libhal_device_query_capability (hal_ctx, udi, "volume", &err1)) {
132618c2aff7Sartem 
132718c2aff7Sartem 			storage_udi = libhal_device_get_property_string (hal_ctx, udi, "block.storage_device", &err1);
132818c2aff7Sartem 			if (storage_udi == NULL)
132918c2aff7Sartem 				continue;
133018c2aff7Sartem 			found_udi = strdup (storage_udi);
133118c2aff7Sartem 			libhal_free_string (storage_udi);
133218c2aff7Sartem 			break;
133318c2aff7Sartem 		} else if (libhal_device_query_capability (hal_ctx, udi, "storage", &err2)) {
133418c2aff7Sartem 			found_udi = strdup (udi);
133518c2aff7Sartem 		}
133618c2aff7Sartem 		LIBHAL_FREE_DBUS_ERROR(&err1);
133718c2aff7Sartem 		LIBHAL_FREE_DBUS_ERROR(&err2);
133818c2aff7Sartem 	}
133918c2aff7Sartem 
134018c2aff7Sartem 	libhal_free_string_array (hal_udis);
134118c2aff7Sartem 
134218c2aff7Sartem 	if (found_udi != NULL)
134318c2aff7Sartem 		result = libhal_drive_from_udi (hal_ctx, found_udi);
134418c2aff7Sartem 
134518c2aff7Sartem 	free (found_udi);
134618c2aff7Sartem out:
134718c2aff7Sartem 	return result;
134818c2aff7Sartem }
134918c2aff7Sartem 
135018c2aff7Sartem 
135118c2aff7Sartem /** Get the volume object for a given device file.
135218c2aff7Sartem  *
135318c2aff7Sartem  *  @param  hal_ctx             libhal context to use
135418c2aff7Sartem  *  @param  device_file         Name of special device file, e.g. '/dev/hda5'
135518c2aff7Sartem  *  @return                     LibHalVolume object or NULL if it doesn't exist
135618c2aff7Sartem  */
135718c2aff7Sartem LibHalVolume *
libhal_volume_from_device_file(LibHalContext * hal_ctx,const char * device_file)135818c2aff7Sartem libhal_volume_from_device_file (LibHalContext *hal_ctx, const char *device_file)
135918c2aff7Sartem {
136018c2aff7Sartem 	int i;
136118c2aff7Sartem 	char **hal_udis;
136218c2aff7Sartem 	int num_hal_udis;
136318c2aff7Sartem 	LibHalVolume *result;
136418c2aff7Sartem 	char *found_udi;
136518c2aff7Sartem 	DBusError error;
136618c2aff7Sartem 
136718c2aff7Sartem 	LIBHAL_CHECK_LIBHALCONTEXT(hal_ctx, NULL);
136818c2aff7Sartem 
136918c2aff7Sartem 	result = NULL;
137018c2aff7Sartem 	found_udi = NULL;
137118c2aff7Sartem 
137218c2aff7Sartem 	dbus_error_init (&error);
1373*55fea89dSDan Cross 	if ((hal_udis = libhal_manager_find_device_string_match (hal_ctx, "block.device",
137418c2aff7Sartem 								 device_file, &num_hal_udis, &error)) == NULL)
137518c2aff7Sartem 		goto out;
137618c2aff7Sartem 
137718c2aff7Sartem 	for (i = 0; i < num_hal_udis; i++) {
137818c2aff7Sartem 		char *udi;
137918c2aff7Sartem 		udi = hal_udis[i];
138018c2aff7Sartem 		if (libhal_device_query_capability (hal_ctx, udi, "volume", &error)) {
138118c2aff7Sartem 			found_udi = strdup (udi);
138218c2aff7Sartem 			break;
138318c2aff7Sartem 		}
138418c2aff7Sartem 	}
138518c2aff7Sartem 
138618c2aff7Sartem 	libhal_free_string_array (hal_udis);
138718c2aff7Sartem 
138818c2aff7Sartem 	if (found_udi != NULL)
138918c2aff7Sartem 		result = libhal_volume_from_udi (hal_ctx, found_udi);
139018c2aff7Sartem 
139118c2aff7Sartem 	free (found_udi);
139218c2aff7Sartem out:
139318c2aff7Sartem 	LIBHAL_FREE_DBUS_ERROR(&error);
139418c2aff7Sartem 	return result;
139518c2aff7Sartem }
139618c2aff7Sartem 
139718c2aff7Sartem dbus_uint64_t
libhal_volume_get_size(LibHalVolume * volume)139818c2aff7Sartem libhal_volume_get_size (LibHalVolume *volume)
139918c2aff7Sartem {
140018c2aff7Sartem 	if (volume->volume_size > 0)
140118c2aff7Sartem 		return volume->volume_size;
140218c2aff7Sartem 	else
140318c2aff7Sartem 		return ((dbus_uint64_t)volume->block_size) * ((dbus_uint64_t)volume->num_blocks);
140418c2aff7Sartem }
140518c2aff7Sartem 
140618c2aff7Sartem dbus_uint64_t
libhal_volume_get_disc_capacity(LibHalVolume * volume)140718c2aff7Sartem libhal_volume_get_disc_capacity (LibHalVolume *volume)
140818c2aff7Sartem {
140918c2aff7Sartem 	return volume->disc_capacity;
141018c2aff7Sartem }
141118c2aff7Sartem 
141218c2aff7Sartem 
141318c2aff7Sartem dbus_bool_t
libhal_drive_is_hotpluggable(LibHalDrive * drive)141418c2aff7Sartem libhal_drive_is_hotpluggable (LibHalDrive *drive)
141518c2aff7Sartem {
141618c2aff7Sartem 	return drive->is_hotpluggable;
141718c2aff7Sartem }
141818c2aff7Sartem 
141918c2aff7Sartem dbus_bool_t
libhal_drive_uses_removable_media(LibHalDrive * drive)142018c2aff7Sartem libhal_drive_uses_removable_media (LibHalDrive *drive)
142118c2aff7Sartem {
142218c2aff7Sartem 	return drive->is_removable;
142318c2aff7Sartem }
142418c2aff7Sartem 
142518c2aff7Sartem dbus_bool_t
libhal_drive_is_media_detected(LibHalDrive * drive)142618c2aff7Sartem libhal_drive_is_media_detected (LibHalDrive *drive)
142718c2aff7Sartem {
142818c2aff7Sartem 	return drive->is_media_detected;
142918c2aff7Sartem }
143018c2aff7Sartem 
143118c2aff7Sartem dbus_uint64_t
libhal_drive_get_size(LibHalDrive * drive)143218c2aff7Sartem libhal_drive_get_size (LibHalDrive *drive)
143318c2aff7Sartem {
143418c2aff7Sartem 	return drive->drive_size;
143518c2aff7Sartem }
143618c2aff7Sartem 
143718c2aff7Sartem dbus_uint64_t
libhal_drive_get_media_size(LibHalDrive * drive)143818c2aff7Sartem libhal_drive_get_media_size (LibHalDrive *drive)
143918c2aff7Sartem {
144018c2aff7Sartem 	return drive->drive_media_size;
144118c2aff7Sartem }
144218c2aff7Sartem 
144318c2aff7Sartem const char *
libhal_drive_get_partition_scheme(LibHalDrive * drive)144418c2aff7Sartem libhal_drive_get_partition_scheme (LibHalDrive *drive)
144518c2aff7Sartem {
144618c2aff7Sartem 	return drive->partition_scheme;
144718c2aff7Sartem }
144818c2aff7Sartem 
144918c2aff7Sartem 
145018c2aff7Sartem LibHalDriveType
libhal_drive_get_type(LibHalDrive * drive)145118c2aff7Sartem libhal_drive_get_type (LibHalDrive *drive)
145218c2aff7Sartem {
145318c2aff7Sartem 	return drive->type;
145418c2aff7Sartem }
145518c2aff7Sartem 
145618c2aff7Sartem LibHalDriveBus
libhal_drive_get_bus(LibHalDrive * drive)145718c2aff7Sartem libhal_drive_get_bus (LibHalDrive *drive)
145818c2aff7Sartem {
145918c2aff7Sartem 	return drive->bus;
146018c2aff7Sartem }
146118c2aff7Sartem 
146218c2aff7Sartem LibHalDriveCdromCaps
libhal_drive_get_cdrom_caps(LibHalDrive * drive)146318c2aff7Sartem libhal_drive_get_cdrom_caps (LibHalDrive *drive)
146418c2aff7Sartem {
146518c2aff7Sartem 	return drive->cdrom_caps;
146618c2aff7Sartem }
146718c2aff7Sartem 
146818c2aff7Sartem unsigned int
libhal_drive_get_device_major(LibHalDrive * drive)146918c2aff7Sartem libhal_drive_get_device_major (LibHalDrive *drive)
147018c2aff7Sartem {
147118c2aff7Sartem 	return drive->device_major;
147218c2aff7Sartem }
147318c2aff7Sartem 
147418c2aff7Sartem unsigned int
libhal_drive_get_device_minor(LibHalDrive * drive)147518c2aff7Sartem libhal_drive_get_device_minor (LibHalDrive *drive)
147618c2aff7Sartem {
147718c2aff7Sartem 	return drive->device_minor;
147818c2aff7Sartem }
147918c2aff7Sartem 
148018c2aff7Sartem const char *
libhal_drive_get_type_textual(LibHalDrive * drive)148118c2aff7Sartem libhal_drive_get_type_textual (LibHalDrive *drive)
148218c2aff7Sartem {
148318c2aff7Sartem 	return drive->type_textual;
148418c2aff7Sartem }
148518c2aff7Sartem 
148618c2aff7Sartem const char *
libhal_drive_get_device_file(LibHalDrive * drive)148718c2aff7Sartem libhal_drive_get_device_file (LibHalDrive *drive)
148818c2aff7Sartem {
148918c2aff7Sartem 	return drive->device_file;
149018c2aff7Sartem }
149118c2aff7Sartem 
149218c2aff7Sartem const char *
libhal_drive_get_udi(LibHalDrive * drive)149318c2aff7Sartem libhal_drive_get_udi (LibHalDrive *drive)
149418c2aff7Sartem {
149518c2aff7Sartem 	return drive->udi;
149618c2aff7Sartem }
149718c2aff7Sartem 
149818c2aff7Sartem const char *
libhal_drive_get_serial(LibHalDrive * drive)149918c2aff7Sartem libhal_drive_get_serial (LibHalDrive *drive)
150018c2aff7Sartem {
150118c2aff7Sartem 	return drive->serial;
150218c2aff7Sartem }
150318c2aff7Sartem 
150418c2aff7Sartem const char *
libhal_drive_get_firmware_version(LibHalDrive * drive)150518c2aff7Sartem libhal_drive_get_firmware_version (LibHalDrive *drive)
150618c2aff7Sartem {
150718c2aff7Sartem 	return drive->firmware_version;
150818c2aff7Sartem }
150918c2aff7Sartem 
151018c2aff7Sartem const char *
libhal_drive_get_model(LibHalDrive * drive)151118c2aff7Sartem libhal_drive_get_model (LibHalDrive *drive)
151218c2aff7Sartem {
151318c2aff7Sartem 	return drive->model;
151418c2aff7Sartem }
151518c2aff7Sartem 
151618c2aff7Sartem const char *
libhal_drive_get_vendor(LibHalDrive * drive)151718c2aff7Sartem libhal_drive_get_vendor (LibHalDrive *drive)
151818c2aff7Sartem {
151918c2aff7Sartem 	return drive->vendor;
152018c2aff7Sartem }
152118c2aff7Sartem 
152218c2aff7Sartem /*****************************************************************************/
152318c2aff7Sartem 
152418c2aff7Sartem const char *
libhal_volume_get_udi(LibHalVolume * volume)152518c2aff7Sartem libhal_volume_get_udi (LibHalVolume *volume)
152618c2aff7Sartem {
152718c2aff7Sartem 	return volume->udi;
152818c2aff7Sartem }
152918c2aff7Sartem 
153018c2aff7Sartem const char *
libhal_volume_get_device_file(LibHalVolume * volume)153118c2aff7Sartem libhal_volume_get_device_file (LibHalVolume *volume)
153218c2aff7Sartem {
153318c2aff7Sartem 	return volume->device_file;
153418c2aff7Sartem }
153518c2aff7Sartem 
libhal_volume_get_device_major(LibHalVolume * volume)153618c2aff7Sartem unsigned int libhal_volume_get_device_major (LibHalVolume *volume)
153718c2aff7Sartem {
153818c2aff7Sartem 	return volume->device_major;
153918c2aff7Sartem }
154018c2aff7Sartem 
libhal_volume_get_device_minor(LibHalVolume * volume)154118c2aff7Sartem unsigned int libhal_volume_get_device_minor (LibHalVolume *volume)
154218c2aff7Sartem {
154318c2aff7Sartem 	return volume->device_minor;
154418c2aff7Sartem }
154518c2aff7Sartem 
154618c2aff7Sartem const char *
libhal_volume_get_fstype(LibHalVolume * volume)154718c2aff7Sartem libhal_volume_get_fstype (LibHalVolume *volume)
154818c2aff7Sartem {
154918c2aff7Sartem 	return volume->fstype;
155018c2aff7Sartem }
155118c2aff7Sartem 
155218c2aff7Sartem const char *
libhal_volume_get_fsversion(LibHalVolume * volume)155318c2aff7Sartem libhal_volume_get_fsversion (LibHalVolume *volume)
155418c2aff7Sartem {
155518c2aff7Sartem 	return volume->fsversion;
155618c2aff7Sartem }
155718c2aff7Sartem 
1558*55fea89dSDan Cross LibHalVolumeUsage
libhal_volume_get_fsusage(LibHalVolume * volume)155918c2aff7Sartem libhal_volume_get_fsusage (LibHalVolume *volume)
156018c2aff7Sartem {
156118c2aff7Sartem 	return volume->fsusage;
156218c2aff7Sartem }
156318c2aff7Sartem 
1564*55fea89dSDan Cross dbus_bool_t
libhal_volume_is_mounted(LibHalVolume * volume)156518c2aff7Sartem libhal_volume_is_mounted (LibHalVolume *volume)
156618c2aff7Sartem {
156718c2aff7Sartem 	return volume->is_mounted;
156818c2aff7Sartem }
156918c2aff7Sartem 
1570*55fea89dSDan Cross dbus_bool_t
libhal_volume_is_mounted_read_only(LibHalVolume * volume)157118c2aff7Sartem libhal_volume_is_mounted_read_only (LibHalVolume *volume)
157218c2aff7Sartem {
157318c2aff7Sartem 	return volume->is_mounted_read_only;
157418c2aff7Sartem }
157518c2aff7Sartem 
1576*55fea89dSDan Cross dbus_bool_t
libhal_volume_is_partition(LibHalVolume * volume)157718c2aff7Sartem libhal_volume_is_partition (LibHalVolume *volume)
157818c2aff7Sartem {
157918c2aff7Sartem 	return volume->is_partition;
158018c2aff7Sartem }
158118c2aff7Sartem 
158218c2aff7Sartem dbus_bool_t
libhal_volume_is_disc(LibHalVolume * volume)158318c2aff7Sartem libhal_volume_is_disc (LibHalVolume *volume)
158418c2aff7Sartem {
158518c2aff7Sartem 	return volume->is_disc;
158618c2aff7Sartem }
158718c2aff7Sartem 
158818c2aff7Sartem unsigned int
libhal_volume_get_partition_number(LibHalVolume * volume)158918c2aff7Sartem libhal_volume_get_partition_number (LibHalVolume *volume)
159018c2aff7Sartem {
159118c2aff7Sartem 	return volume->partition_number;
159218c2aff7Sartem }
159318c2aff7Sartem 
159418c2aff7Sartem const char *
libhal_volume_get_partition_scheme(LibHalVolume * volume)159518c2aff7Sartem libhal_volume_get_partition_scheme (LibHalVolume *volume)
159618c2aff7Sartem {
159718c2aff7Sartem 	return volume->partition_scheme;
159818c2aff7Sartem }
159918c2aff7Sartem 
160018c2aff7Sartem const char *
libhal_volume_get_partition_type(LibHalVolume * volume)160118c2aff7Sartem libhal_volume_get_partition_type (LibHalVolume *volume)
160218c2aff7Sartem {
160318c2aff7Sartem 	return volume->partition_type;
160418c2aff7Sartem }
160518c2aff7Sartem 
160618c2aff7Sartem const char *
libhal_volume_get_partition_label(LibHalVolume * volume)160718c2aff7Sartem libhal_volume_get_partition_label (LibHalVolume *volume)
160818c2aff7Sartem {
160918c2aff7Sartem 	return volume->partition_label;
161018c2aff7Sartem }
161118c2aff7Sartem 
161218c2aff7Sartem const char *
libhal_volume_get_partition_uuid(LibHalVolume * volume)161318c2aff7Sartem libhal_volume_get_partition_uuid (LibHalVolume *volume)
161418c2aff7Sartem {
161518c2aff7Sartem 	return volume->partition_uuid;
161618c2aff7Sartem }
161718c2aff7Sartem 
161818c2aff7Sartem const char **
libhal_volume_get_partition_flags(LibHalVolume * volume)161918c2aff7Sartem libhal_volume_get_partition_flags (LibHalVolume *volume)
162018c2aff7Sartem {
162118c2aff7Sartem 	return (const char **) volume->partition_flags;
162218c2aff7Sartem }
162318c2aff7Sartem 
162418c2aff7Sartem 
1625*55fea89dSDan Cross dbus_uint64_t
libhal_volume_get_partition_start_offset(LibHalVolume * volume)162618c2aff7Sartem libhal_volume_get_partition_start_offset (LibHalVolume *volume)
162718c2aff7Sartem {
162818c2aff7Sartem 	return volume->partition_start_offset;
162918c2aff7Sartem }
163018c2aff7Sartem 
163118c2aff7Sartem dbus_uint64_t
libhal_volume_get_partition_media_size(LibHalVolume * volume)163218c2aff7Sartem libhal_volume_get_partition_media_size (LibHalVolume *volume)
163318c2aff7Sartem {
163418c2aff7Sartem 	return volume->partition_media_size;
163518c2aff7Sartem }
163618c2aff7Sartem 
163718c2aff7Sartem const char *
libhal_volume_get_label(LibHalVolume * volume)163818c2aff7Sartem libhal_volume_get_label (LibHalVolume *volume)
163918c2aff7Sartem {
164018c2aff7Sartem 	return volume->volume_label;
164118c2aff7Sartem }
164218c2aff7Sartem 
164318c2aff7Sartem const char *
libhal_volume_get_mount_point(LibHalVolume * volume)164418c2aff7Sartem libhal_volume_get_mount_point (LibHalVolume *volume)
164518c2aff7Sartem {
164618c2aff7Sartem 	return volume->mount_point;
164718c2aff7Sartem }
164818c2aff7Sartem 
164918c2aff7Sartem const char *
libhal_volume_get_uuid(LibHalVolume * volume)165018c2aff7Sartem libhal_volume_get_uuid (LibHalVolume *volume)
165118c2aff7Sartem {
165218c2aff7Sartem 	return volume->uuid;
165318c2aff7Sartem }
165418c2aff7Sartem 
165518c2aff7Sartem dbus_bool_t
libhal_volume_disc_has_audio(LibHalVolume * volume)165618c2aff7Sartem libhal_volume_disc_has_audio (LibHalVolume *volume)
165718c2aff7Sartem {
165818c2aff7Sartem 	return volume->disc_has_audio;
165918c2aff7Sartem }
166018c2aff7Sartem 
166118c2aff7Sartem dbus_bool_t
libhal_volume_disc_has_data(LibHalVolume * volume)166218c2aff7Sartem libhal_volume_disc_has_data (LibHalVolume *volume)
166318c2aff7Sartem {
166418c2aff7Sartem 	return volume->disc_has_data;
166518c2aff7Sartem }
166618c2aff7Sartem 
166718c2aff7Sartem dbus_bool_t
libhal_volume_disc_is_blank(LibHalVolume * volume)166818c2aff7Sartem libhal_volume_disc_is_blank (LibHalVolume *volume)
166918c2aff7Sartem {
167018c2aff7Sartem 	return volume->disc_is_blank;
167118c2aff7Sartem }
167218c2aff7Sartem 
167318c2aff7Sartem dbus_bool_t
libhal_volume_disc_is_rewritable(LibHalVolume * volume)167418c2aff7Sartem libhal_volume_disc_is_rewritable (LibHalVolume *volume)
167518c2aff7Sartem {
167618c2aff7Sartem 	return volume->disc_is_rewritable;
167718c2aff7Sartem }
167818c2aff7Sartem 
167918c2aff7Sartem dbus_bool_t
libhal_volume_disc_is_appendable(LibHalVolume * volume)168018c2aff7Sartem libhal_volume_disc_is_appendable (LibHalVolume *volume)
168118c2aff7Sartem {
168218c2aff7Sartem 	return volume->disc_is_appendable;
168318c2aff7Sartem }
168418c2aff7Sartem 
168518c2aff7Sartem LibHalVolumeDiscType
libhal_volume_get_disc_type(LibHalVolume * volume)168618c2aff7Sartem libhal_volume_get_disc_type (LibHalVolume *volume)
168718c2aff7Sartem {
168818c2aff7Sartem 	return volume->disc_type;
168918c2aff7Sartem }
169018c2aff7Sartem 
169118c2aff7Sartem dbus_bool_t
libhal_volume_should_ignore(LibHalVolume * volume)169218c2aff7Sartem libhal_volume_should_ignore (LibHalVolume     *volume)
169318c2aff7Sartem {
169418c2aff7Sartem 	return volume->ignore_volume;
169518c2aff7Sartem }
169618c2aff7Sartem 
1697*55fea89dSDan Cross char **
libhal_drive_find_all_volumes(LibHalContext * hal_ctx,LibHalDrive * drive,int * num_volumes)169818c2aff7Sartem libhal_drive_find_all_volumes (LibHalContext *hal_ctx, LibHalDrive *drive, int *num_volumes)
169918c2aff7Sartem {
170018c2aff7Sartem 	int i;
170118c2aff7Sartem 	char **udis;
170218c2aff7Sartem 	int num_udis;
170318c2aff7Sartem 	const char *drive_udi;
170418c2aff7Sartem 	char **result;
170518c2aff7Sartem 	DBusError error;
170618c2aff7Sartem 
170718c2aff7Sartem 	LIBHAL_CHECK_LIBHALCONTEXT(hal_ctx, NULL);
170818c2aff7Sartem 
170918c2aff7Sartem 	udis = NULL;
171018c2aff7Sartem 	result = NULL;
171118c2aff7Sartem 	*num_volumes = 0;
171218c2aff7Sartem 
171318c2aff7Sartem 	drive_udi = libhal_drive_get_udi (drive);
171418c2aff7Sartem 	if (drive_udi == NULL)
171518c2aff7Sartem 		goto out;
171618c2aff7Sartem 
171718c2aff7Sartem 	/* get initial list... */
171818c2aff7Sartem 	dbus_error_init (&error);
1719*55fea89dSDan Cross 	if ((udis = libhal_manager_find_device_string_match (hal_ctx, "block.storage_device",
172018c2aff7Sartem 							     drive_udi, &num_udis, &error)) == NULL) {
172118c2aff7Sartem 		LIBHAL_FREE_DBUS_ERROR(&error);
172218c2aff7Sartem 		goto out;
172318c2aff7Sartem 	}
172418c2aff7Sartem 
1725de7d23d8SLin Guo - Sun Microsystems 	result = malloc (sizeof (char *) * (num_udis + 1));
172618c2aff7Sartem 	if (result == NULL)
172718c2aff7Sartem 		goto out;
172818c2aff7Sartem 
172918c2aff7Sartem 	/* ...and filter out the single UDI that is the drive itself */
173018c2aff7Sartem 	for (i = 0; i < num_udis; i++) {
173118c2aff7Sartem 		if (strcmp (udis[i], drive_udi) == 0)
173218c2aff7Sartem 			continue;
173318c2aff7Sartem 		result[*num_volumes] = strdup (udis[i]);
173418c2aff7Sartem 		*num_volumes = (*num_volumes) + 1;
173518c2aff7Sartem 	}
173618c2aff7Sartem 	/* set last element (above removed UDI) to NULL for libhal_free_string_array()*/
173718c2aff7Sartem 	result[*num_volumes] = NULL;
173818c2aff7Sartem 
173918c2aff7Sartem out:
174018c2aff7Sartem 	libhal_free_string_array (udis);
174118c2aff7Sartem 	return result;
174218c2aff7Sartem }
174318c2aff7Sartem 
174418c2aff7Sartem const char *
libhal_volume_crypto_get_backing_volume_udi(LibHalVolume * volume)174518c2aff7Sartem libhal_volume_crypto_get_backing_volume_udi (LibHalVolume *volume)
174618c2aff7Sartem {
174718c2aff7Sartem 	return volume->crypto_backing_volume;
174818c2aff7Sartem }
174918c2aff7Sartem 
175018c2aff7Sartem char *
libhal_volume_crypto_get_clear_volume_udi(LibHalContext * hal_ctx,LibHalVolume * volume)175118c2aff7Sartem libhal_volume_crypto_get_clear_volume_udi (LibHalContext *hal_ctx, LibHalVolume *volume)
175218c2aff7Sartem {
175318c2aff7Sartem 	DBusError error;
175418c2aff7Sartem 	char **clear_devices;
175518c2aff7Sartem 	int num_clear_devices;
175618c2aff7Sartem 	char *result;
175718c2aff7Sartem 
175818c2aff7Sartem 	result = NULL;
175918c2aff7Sartem 
176018c2aff7Sartem 	LIBHAL_CHECK_LIBHALCONTEXT (hal_ctx, NULL);
176118c2aff7Sartem 
176218c2aff7Sartem 	dbus_error_init (&error);
176318c2aff7Sartem 	clear_devices = libhal_manager_find_device_string_match (hal_ctx,
176418c2aff7Sartem 								 "volume.crypto_luks.clear.backing_volume",
176518c2aff7Sartem 								 volume->udi,
176618c2aff7Sartem 								 &num_clear_devices,
176718c2aff7Sartem 								 &error);
176818c2aff7Sartem 	if (clear_devices != NULL) {
176918c2aff7Sartem 
177018c2aff7Sartem 		if (num_clear_devices >= 1) {
177118c2aff7Sartem 			result = strdup (clear_devices[0]);
177218c2aff7Sartem 		}
177318c2aff7Sartem 		libhal_free_string_array (clear_devices);
177418c2aff7Sartem 	}
177518c2aff7Sartem 
177618c2aff7Sartem 	return result;
177718c2aff7Sartem }
177818c2aff7Sartem 
177918c2aff7Sartem 
178018c2aff7Sartem /*************************************************************************/
178118c2aff7Sartem 
178218c2aff7Sartem char *
libhal_drive_policy_default_get_mount_root(LibHalContext * hal_ctx)178318c2aff7Sartem libhal_drive_policy_default_get_mount_root (LibHalContext *hal_ctx)
178418c2aff7Sartem {
178518c2aff7Sartem 	char *result;
178618c2aff7Sartem 	DBusError error;
178718c2aff7Sartem 
178818c2aff7Sartem 	LIBHAL_CHECK_LIBHALCONTEXT(hal_ctx, NULL);
178918c2aff7Sartem 
179018c2aff7Sartem 	dbus_error_init (&error);
179118c2aff7Sartem 	if ((result = libhal_device_get_property_string (hal_ctx, "/org/freedesktop/Hal/devices/computer",
1792*55fea89dSDan Cross 						    "storage.policy.default.mount_root", &error)) == NULL)
179318c2aff7Sartem 		LIBHAL_FREE_DBUS_ERROR(&error);
179418c2aff7Sartem 
179518c2aff7Sartem 	return result;
179618c2aff7Sartem }
179718c2aff7Sartem 
179818c2aff7Sartem dbus_bool_t
libhal_drive_policy_default_use_managed_keyword(LibHalContext * hal_ctx)179918c2aff7Sartem libhal_drive_policy_default_use_managed_keyword (LibHalContext *hal_ctx)
180018c2aff7Sartem {
180118c2aff7Sartem 	dbus_bool_t result;
180218c2aff7Sartem 	DBusError error;
180318c2aff7Sartem 
180418c2aff7Sartem 	LIBHAL_CHECK_LIBHALCONTEXT(hal_ctx, FALSE);
180518c2aff7Sartem 
180618c2aff7Sartem 	dbus_error_init (&error);
180718c2aff7Sartem 	if ((result = libhal_device_get_property_bool (hal_ctx, "/org/freedesktop/Hal/devices/computer",
180818c2aff7Sartem 						  "storage.policy.default.use_managed_keyword", &error)) == FALSE)
180918c2aff7Sartem 		LIBHAL_FREE_DBUS_ERROR(&error);
181018c2aff7Sartem 
181118c2aff7Sartem 	return result;
181218c2aff7Sartem }
181318c2aff7Sartem 
181418c2aff7Sartem char *
libhal_drive_policy_default_get_managed_keyword_primary(LibHalContext * hal_ctx)181518c2aff7Sartem libhal_drive_policy_default_get_managed_keyword_primary (LibHalContext *hal_ctx)
181618c2aff7Sartem {
181718c2aff7Sartem 	char *result;
181818c2aff7Sartem 	DBusError error;
181918c2aff7Sartem 
182018c2aff7Sartem 	LIBHAL_CHECK_LIBHALCONTEXT(hal_ctx, NULL);
182118c2aff7Sartem 
182218c2aff7Sartem 	dbus_error_init (&error);
182318c2aff7Sartem 	if ((result = libhal_device_get_property_string (hal_ctx, "/org/freedesktop/Hal/devices/computer",
182418c2aff7Sartem 						    "storage.policy.default.managed_keyword.primary", &error)) == NULL)
182518c2aff7Sartem 		LIBHAL_FREE_DBUS_ERROR(&error);
182618c2aff7Sartem 
182718c2aff7Sartem 	return result;
182818c2aff7Sartem }
182918c2aff7Sartem 
183018c2aff7Sartem char *
libhal_drive_policy_default_get_managed_keyword_secondary(LibHalContext * hal_ctx)183118c2aff7Sartem libhal_drive_policy_default_get_managed_keyword_secondary (LibHalContext *hal_ctx)
183218c2aff7Sartem {
183318c2aff7Sartem 	char *result;
183418c2aff7Sartem 	DBusError error;
183518c2aff7Sartem 
183618c2aff7Sartem 	LIBHAL_CHECK_LIBHALCONTEXT(hal_ctx, NULL);
183718c2aff7Sartem 
183818c2aff7Sartem 	dbus_error_init (&error);
183918c2aff7Sartem 	if ((result = libhal_device_get_property_string (hal_ctx, "/org/freedesktop/Hal/devices/computer",
184018c2aff7Sartem 						    "storage.policy.default.managed_keyword.secondary", &error)) == NULL)
184118c2aff7Sartem 		LIBHAL_FREE_DBUS_ERROR(&error);
184218c2aff7Sartem 
184318c2aff7Sartem 	return result;
184418c2aff7Sartem }
184518c2aff7Sartem 
184618c2aff7Sartem /*************************************************************************/
184718c2aff7Sartem 
184818c2aff7Sartem dbus_bool_t
libhal_drive_policy_is_mountable(LibHalDrive * drive,LibHalStoragePolicy * policy)184918c2aff7Sartem libhal_drive_policy_is_mountable (LibHalDrive *drive, LibHalStoragePolicy *policy)
185018c2aff7Sartem {
185118c2aff7Sartem 	printf ("should_mount=%d, no_partitions_hint=%d\n", drive->should_mount, drive->no_partitions_hint);
185218c2aff7Sartem 
185318c2aff7Sartem 	return drive->should_mount && drive->no_partitions_hint;
185418c2aff7Sartem }
185518c2aff7Sartem 
185618c2aff7Sartem const char *
libhal_drive_policy_get_desired_mount_point(LibHalDrive * drive,LibHalStoragePolicy * policy)185718c2aff7Sartem libhal_drive_policy_get_desired_mount_point (LibHalDrive *drive, LibHalStoragePolicy *policy)
185818c2aff7Sartem {
185918c2aff7Sartem 	return drive->desired_mount_point;
186018c2aff7Sartem }
186118c2aff7Sartem 
186218c2aff7Sartem /* safely strcat() at most the remaining space in 'dst' */
186318c2aff7Sartem #define strcat_len(dst, src, dstmaxlen) do {    \
186418c2aff7Sartem 	dst[dstmaxlen - 1] = '\0'; \
186518c2aff7Sartem 	strncat (dst, src, dstmaxlen - strlen (dst) - 1); \
186618c2aff7Sartem } while(0)
186718c2aff7Sartem 
186818c2aff7Sartem 
186918c2aff7Sartem 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)1870*55fea89dSDan Cross mopts_collect (LibHalContext *hal_ctx, const char *namespace, int namespace_len,
187118c2aff7Sartem 	       const char *udi, char *options_string, size_t options_max_len, dbus_bool_t only_collect_imply_opts)
187218c2aff7Sartem {
187318c2aff7Sartem 	LibHalPropertySet *properties;
187418c2aff7Sartem 	LibHalPropertySetIterator it;
187518c2aff7Sartem 	DBusError error;
187618c2aff7Sartem 
187718c2aff7Sartem 	if(hal_ctx == 0) {
187818c2aff7Sartem 		fprintf (stderr,"%s %d : LibHalContext *ctx is NULL\n",__FILE__, __LINE__);
187918c2aff7Sartem 		return;
188018c2aff7Sartem 	}
188118c2aff7Sartem 
188218c2aff7Sartem 	dbus_error_init (&error);
188318c2aff7Sartem 
188418c2aff7Sartem 	/* first collect from root computer device */
188518c2aff7Sartem 	properties = libhal_device_get_all_properties (hal_ctx, udi, &error);
188618c2aff7Sartem 	if (properties == NULL ) {
188718c2aff7Sartem 		LIBHAL_FREE_DBUS_ERROR(&error);
188818c2aff7Sartem 		return;
188918c2aff7Sartem 	}
189018c2aff7Sartem 
189118c2aff7Sartem 	for (libhal_psi_init (&it, properties); libhal_psi_has_more (&it); libhal_psi_next (&it)) {
189218c2aff7Sartem 		int type;
189318c2aff7Sartem 		char *key;
1894*55fea89dSDan Cross 
189518c2aff7Sartem 		type = libhal_psi_get_type (&it);
189618c2aff7Sartem 		key = libhal_psi_get_key (&it);
18978629b981SToomas Soome 		if (type == LIBHAL_PROPERTY_TYPE_BOOLEAN &&
189818c2aff7Sartem 		    strncmp (key, namespace, namespace_len - 1) == 0) {
189918c2aff7Sartem 			const char *option = key + namespace_len - 1;
190018c2aff7Sartem 			char *location;
190118c2aff7Sartem 			dbus_bool_t is_imply_opt;
190218c2aff7Sartem 
190318c2aff7Sartem 			is_imply_opt = FALSE;
190418c2aff7Sartem 			if (strcmp (option, "user") == 0 ||
190518c2aff7Sartem 			    strcmp (option, "users") == 0 ||
190618c2aff7Sartem 			    strcmp (option, "defaults") == 0 ||
190718c2aff7Sartem 			    strcmp (option, "pamconsole") == 0)
190818c2aff7Sartem 				is_imply_opt = TRUE;
190918c2aff7Sartem 
1910*55fea89dSDan Cross 
191118c2aff7Sartem 			if (only_collect_imply_opts) {
191218c2aff7Sartem 				if (!is_imply_opt)
191318c2aff7Sartem 					continue;
191418c2aff7Sartem 			} else {
191518c2aff7Sartem 				if (is_imply_opt)
191618c2aff7Sartem 					continue;
191718c2aff7Sartem 			}
191818c2aff7Sartem 
191918c2aff7Sartem 			if (libhal_psi_get_bool (&it)) {
192018c2aff7Sartem 				/* see if option is already there */
192118c2aff7Sartem 				location = strstr (options_string, option);
192218c2aff7Sartem 				if (location == NULL) {
192318c2aff7Sartem 					if (strlen (options_string) > 0)
192418c2aff7Sartem 						strcat_len (options_string, ",", options_max_len);
192518c2aff7Sartem 					strcat_len (options_string, option, options_max_len);
192618c2aff7Sartem 				}
192718c2aff7Sartem 			} else {
192818c2aff7Sartem 				/* remove option if already there */
192918c2aff7Sartem 				location = strstr (options_string, option);
193018c2aff7Sartem 				if (location != NULL) {
193118c2aff7Sartem 					char *end;
193218c2aff7Sartem 
193318c2aff7Sartem 					end = strchr (location, ',');
193418c2aff7Sartem 					if (end == NULL) {
193518c2aff7Sartem 						location[0] = '\0';
193618c2aff7Sartem 					} else {
193718c2aff7Sartem 						strcpy (location, end + 1); /* skip the extra comma */
193818c2aff7Sartem 					}
193918c2aff7Sartem 				}
194018c2aff7Sartem 
194118c2aff7Sartem 			}
194218c2aff7Sartem 		}
194318c2aff7Sartem 	}
1944*55fea89dSDan Cross 
194518c2aff7Sartem 	libhal_free_property_set (properties);
194618c2aff7Sartem }
194718c2aff7Sartem 
194818c2aff7Sartem 
194918c2aff7Sartem const char *
libhal_drive_policy_get_mount_options(LibHalDrive * drive,LibHalStoragePolicy * policy)195018c2aff7Sartem libhal_drive_policy_get_mount_options (LibHalDrive *drive, LibHalStoragePolicy *policy)
195118c2aff7Sartem {
195218c2aff7Sartem 	const char *result;
195318c2aff7Sartem 	char stor_mount_option_default_begin[] = "storage.policy.default.mount_option.";
195418c2aff7Sartem 	char stor_mount_option_begin[] = "storage.policy.mount_option.";
195518c2aff7Sartem 
195618c2aff7Sartem 	result = NULL;
195718c2aff7Sartem 	drive->mount_options[0] = '\0';
195818c2aff7Sartem 
195918c2aff7Sartem 	/* collect options != ('pamconsole', 'user', 'users', 'defaults' options that imply other options)  */
196018c2aff7Sartem 	mopts_collect (drive->hal_ctx, stor_mount_option_default_begin, sizeof (stor_mount_option_default_begin),
196118c2aff7Sartem 		       "/org/freedesktop/Hal/devices/computer", drive->mount_options, MOUNT_OPTIONS_SIZE, TRUE);
196218c2aff7Sartem 	mopts_collect (drive->hal_ctx, stor_mount_option_begin, sizeof (stor_mount_option_begin),
196318c2aff7Sartem 		       drive->udi, drive->mount_options, MOUNT_OPTIONS_SIZE, TRUE);
196418c2aff7Sartem 	/* ensure ('pamconsole', 'user', 'users', 'defaults' options that imply other options), are first */
196518c2aff7Sartem 	mopts_collect (drive->hal_ctx, stor_mount_option_default_begin, sizeof (stor_mount_option_default_begin),
196618c2aff7Sartem 		       "/org/freedesktop/Hal/devices/computer", drive->mount_options, MOUNT_OPTIONS_SIZE, FALSE);
196718c2aff7Sartem 	mopts_collect (drive->hal_ctx, stor_mount_option_begin, sizeof (stor_mount_option_begin),
196818c2aff7Sartem 		       drive->udi, drive->mount_options, MOUNT_OPTIONS_SIZE, FALSE);
196918c2aff7Sartem 
197018c2aff7Sartem 	result = drive->mount_options;
197118c2aff7Sartem 
197218c2aff7Sartem 	return result;
197318c2aff7Sartem }
197418c2aff7Sartem 
197518c2aff7Sartem const char *
libhal_drive_policy_get_mount_fs(LibHalDrive * drive,LibHalStoragePolicy * policy)197618c2aff7Sartem libhal_drive_policy_get_mount_fs (LibHalDrive *drive, LibHalStoragePolicy *policy)
197718c2aff7Sartem {
197818c2aff7Sartem 	return drive->mount_filesystem;
197918c2aff7Sartem }
198018c2aff7Sartem 
198118c2aff7Sartem 
198218c2aff7Sartem dbus_bool_t
libhal_volume_policy_is_mountable(LibHalDrive * drive,LibHalVolume * volume,LibHalStoragePolicy * policy)198318c2aff7Sartem libhal_volume_policy_is_mountable (LibHalDrive *drive, LibHalVolume *volume, LibHalStoragePolicy *policy)
198418c2aff7Sartem {
198518c2aff7Sartem 	return drive->should_mount && volume->should_mount;
198618c2aff7Sartem }
198718c2aff7Sartem 
libhal_volume_policy_get_desired_mount_point(LibHalDrive * drive,LibHalVolume * volume,LibHalStoragePolicy * policy)198818c2aff7Sartem const char *libhal_volume_policy_get_desired_mount_point (LibHalDrive *drive, LibHalVolume *volume, LibHalStoragePolicy *policy)
198918c2aff7Sartem {
199018c2aff7Sartem 	return volume->desired_mount_point;
199118c2aff7Sartem }
199218c2aff7Sartem 
libhal_volume_policy_get_mount_options(LibHalDrive * drive,LibHalVolume * volume,LibHalStoragePolicy * policy)199318c2aff7Sartem const char *libhal_volume_policy_get_mount_options (LibHalDrive *drive, LibHalVolume *volume, LibHalStoragePolicy *policy)
199418c2aff7Sartem {
199518c2aff7Sartem 	const char *result;
199618c2aff7Sartem 	char stor_mount_option_default_begin[] = "storage.policy.default.mount_option.";
199718c2aff7Sartem 	char vol_mount_option_begin[] = "volume.policy.mount_option.";
199818c2aff7Sartem 
199918c2aff7Sartem 	result = NULL;
200018c2aff7Sartem 	volume->mount_options[0] = '\0';
200118c2aff7Sartem 
200218c2aff7Sartem 	/* ensure ('pamconsole', 'user', 'users', 'defaults' options that imply other options), are first */
200318c2aff7Sartem 	mopts_collect (drive->hal_ctx, stor_mount_option_default_begin, sizeof (stor_mount_option_default_begin),
200418c2aff7Sartem 		       "/org/freedesktop/Hal/devices/computer", volume->mount_options, MOUNT_OPTIONS_SIZE, TRUE);
200518c2aff7Sartem 	mopts_collect (drive->hal_ctx, vol_mount_option_begin, sizeof (vol_mount_option_begin),
200618c2aff7Sartem 		       volume->udi, volume->mount_options, MOUNT_OPTIONS_SIZE, TRUE);
200718c2aff7Sartem 	/* collect options != ('pamconsole', 'user', 'users', 'defaults' options that imply other options)  */
200818c2aff7Sartem 	mopts_collect (drive->hal_ctx, stor_mount_option_default_begin, sizeof (stor_mount_option_default_begin),
200918c2aff7Sartem 		       "/org/freedesktop/Hal/devices/computer", volume->mount_options, MOUNT_OPTIONS_SIZE, FALSE);
201018c2aff7Sartem 	mopts_collect (drive->hal_ctx, vol_mount_option_begin, sizeof (vol_mount_option_begin),
201118c2aff7Sartem 		       volume->udi, volume->mount_options, MOUNT_OPTIONS_SIZE, FALSE);
201218c2aff7Sartem 
201318c2aff7Sartem 	result = volume->mount_options;
201418c2aff7Sartem 
201518c2aff7Sartem 	return result;
201618c2aff7Sartem }
201718c2aff7Sartem 
libhal_volume_policy_get_mount_fs(LibHalDrive * drive,LibHalVolume * volume,LibHalStoragePolicy * policy)201818c2aff7Sartem const char *libhal_volume_policy_get_mount_fs (LibHalDrive *drive, LibHalVolume *volume, LibHalStoragePolicy *policy)
201918c2aff7Sartem {
202018c2aff7Sartem 	return volume->mount_filesystem;
202118c2aff7Sartem }
202218c2aff7Sartem 
2023*55fea89dSDan Cross dbus_bool_t
libhal_drive_no_partitions_hint(LibHalDrive * drive)202418c2aff7Sartem libhal_drive_no_partitions_hint (LibHalDrive *drive)
202518c2aff7Sartem {
202618c2aff7Sartem 	return drive->no_partitions_hint;
202718c2aff7Sartem }
202818c2aff7Sartem 
202918c2aff7Sartem /** @} */
2030