18c2aff776a775d34a4c9893a4c72e0434d68e36artem/***************************************************************************
18c2aff776a775d34a4c9893a4c72e0434d68e36artem * CVSID: $Id$
18c2aff776a775d34a4c9893a4c72e0434d68e36artem * hal-storage-mount.c : Mount wrapper
18c2aff776a775d34a4c9893a4c72e0434d68e36artem * Copyright (C) 2006 David Zeuthen, <david@fubar.dk>
18c2aff776a775d34a4c9893a4c72e0434d68e36artem * This program is free software; you can redistribute it and/or modify
18c2aff776a775d34a4c9893a4c72e0434d68e36artem * it under the terms of the GNU General Public License as published by
18c2aff776a775d34a4c9893a4c72e0434d68e36artem * the Free Software Foundation; either version 2 of the License, or
18c2aff776a775d34a4c9893a4c72e0434d68e36artem * (at your option) any later version.
18c2aff776a775d34a4c9893a4c72e0434d68e36artem * This program is distributed in the hope that it will be useful,
18c2aff776a775d34a4c9893a4c72e0434d68e36artem * but WITHOUT ANY WARRANTY; without even the implied warranty of
18c2aff776a775d34a4c9893a4c72e0434d68e36artem * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18c2aff776a775d34a4c9893a4c72e0434d68e36artem * GNU General Public License for more details.
18c2aff776a775d34a4c9893a4c72e0434d68e36artem * You should have received a copy of the GNU General Public License
18c2aff776a775d34a4c9893a4c72e0434d68e36artem * along with this program; if not, write to the Free Software
18c2aff776a775d34a4c9893a4c72e0434d68e36artem * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
18c2aff776a775d34a4c9893a4c72e0434d68e36artem **************************************************************************/
18c2aff776a775d34a4c9893a4c72e0434d68e36artem fprintf (stderr, "This program should only be started by hald.\n");
18c2aff776a775d34a4c9893a4c72e0434d68e36artem fprintf (stderr, "org.freedesktop.Hal.Device.Volume.PermissionDenied\n");
18c2aff776a775d34a4c9893a4c72e0434d68e36artem fprintf (stderr, "Device has %s volume.ignore set to TRUE. Refusing to mount.\n", device);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem fprintf (stderr, "org.freedesktop.Hal.Device.Volume.PermissionDenied\n");
18c2aff776a775d34a4c9893a4c72e0434d68e36artem fprintf (stderr, "Device %s is listed in /etc/fstab. Refusing to mount.\n", device);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem fprintf (stderr, "org.freedesktop.Hal.Device.Volume.AlreadyMounted\n");
18c2aff776a775d34a4c9893a4c72e0434d68e36artem fprintf (stderr, "Device %s is already mounted.\n", device);
18c2aff776a775d34a4c9893a4c72e0434d68e36arteminvalid_mount_option (const char *option, const char *uid)
18c2aff776a775d34a4c9893a4c72e0434d68e36artem fprintf (stderr, "org.freedesktop.Hal.Device.Volume.InvalidMountOption\n");
18c2aff776a775d34a4c9893a4c72e0434d68e36artem fprintf (stderr, "The option '%s' is not allowed for uid=%s\n", option, uid);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem fprintf (stderr, "org.freedesktop.Hal.Device.Volume.UnknownFilesystemType\n");
18c2aff776a775d34a4c9893a4c72e0434d68e36artem fprintf (stderr, "Unknown file system '%s'\n", filesystem);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem fprintf (stderr, "org.freedesktop.Hal.Device.Volume.InvalidMountpoint\n");
18c2aff776a775d34a4c9893a4c72e0434d68e36artem fprintf (stderr, "The mount point '%s' is invalid\n", mount_point);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem fprintf (stderr, "org.freedesktop.Hal.Device.Volume.MountPointNotAvailable\n");
18c2aff776a775d34a4c9893a4c72e0434d68e36artem fprintf (stderr, "The mount point '%s' is already occupied\n", mount_point);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem fprintf (stderr, "org.freedesktop.Hal.Device.Volume.CannotRemount\n");
18c2aff776a775d34a4c9893a4c72e0434d68e36artempermission_denied_privilege (const char *privilege, const char *uid)
18c2aff776a775d34a4c9893a4c72e0434d68e36artem fprintf (stderr, "org.freedesktop.Hal.Device.PermissionDeniedByPolicy\n");
18c2aff776a775d34a4c9893a4c72e0434d68e36artem fprintf (stderr, "%s refused uid %s\n", privilege, uid);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem/* borrowed from gtk/gtkfilesystemunix.c in GTK+ on 02/23/2006 */
18c2aff776a775d34a4c9893a4c72e0434d68e36artemstatic char *
18c2aff776a775d34a4c9893a4c72e0434d68e36artem g_warning ("Cannot resolve symlink %s: %s", f, error->message);
18c2aff776a775d34a4c9893a4c72e0434d68e36artemvolume_findby (LibHalContext *hal_ctx, const char *property, const char *value)
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if ((hal_udis = libhal_manager_find_device_string_match (hal_ctx, property,
18c2aff776a775d34a4c9893a4c72e0434d68e36artem for (i = 0; i < num_hal_udis; i++) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (libhal_device_query_capability (hal_ctx, udi, "volume", &error)) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artembailout_if_in_fstab (LibHalContext *hal_ctx, const char *device, const char *label, const char *uuid)
18c2aff776a775d34a4c9893a4c72e0434d68e36artem printf (" label '%s' uuid '%s'\n", label ? label : "" , uuid ? uuid : "");
18c2aff776a775d34a4c9893a4c72e0434d68e36artem /* check if /etc/fstab mentions this device... (with symlinks etc) */
18c2aff776a775d34a4c9893a4c72e0434d68e36artem while ((entry = fstab_next (handle, &_mount_point)) != NULL) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (label != NULL && g_str_has_prefix (entry, "LABEL=")) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem /* (heck, we also do the stuff below in gnome-mount) */
18c2aff776a775d34a4c9893a4c72e0434d68e36artem /* OK, so what's if someone attaches an external disk with the label '/' and
18c2aff776a775d34a4c9893a4c72e0434d68e36artem * LABEL=/ / ext3 defaults 1 1
18c2aff776a775d34a4c9893a4c72e0434d68e36artem * in /etc/fstab as most Red Hat systems do? Bugger, this is a very common use
18c2aff776a775d34a4c9893a4c72e0434d68e36artem * case; suppose that you take the disk from your Fedora server and attaches it
18c2aff776a775d34a4c9893a4c72e0434d68e36artem * to your laptop. Bingo, you now have two disks with the label '/'. One must
18c2aff776a775d34a4c9893a4c72e0434d68e36artem * seriously wonder if using things like LABEL=/ for / is a good idea; just
18c2aff776a775d34a4c9893a4c72e0434d68e36artem * what happens if you boot in this configuration? (answer: the initrd gets
18c2aff776a775d34a4c9893a4c72e0434d68e36artem * it wrong most of the time.. sigh)
18c2aff776a775d34a4c9893a4c72e0434d68e36artem * To work around this, check if the listed entry in /etc/fstab is already mounted,
18c2aff776a775d34a4c9893a4c72e0434d68e36artem * if it is, then check if it's the same device_file as the given one...
18c2aff776a775d34a4c9893a4c72e0434d68e36artem /* see if a volume is mounted at this mount point */
18c2aff776a775d34a4c9893a4c72e0434d68e36artem mounted_vol = volume_findby (hal_ctx, "volume.mount_point", _mount_point);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem mounted_vol_device_file = libhal_volume_get_device_file (mounted_vol);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem /* no need to resolve symlinks, hal uses the canonical device file */
18c2aff776a775d34a4c9893a4c72e0434d68e36artem printf ("Wanting to mount %s that has label %s, but /etc/fstab says LABEL=%s is to be mounted at mount point '%s'. However %s (that also has label %s), is already mounted at said mount point. So, skipping said /etc/fstab entry.\n",
18c2aff776a775d34a4c9893a4c72e0434d68e36artem device, label, label, _mount_point, mounted_vol_device_file, _mount_point);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem printf ("%s found in /etc/fstab. Not mounting.\n", entry);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem } else if (uuid != NULL && g_str_has_prefix (entry, "UUID=")) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem printf ("%s found in /etc/fstab. Not mounting.\n", entry);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem printf ("/etc/fstab: device %s -> %s \n", entry, resolved);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem printf ("%s (-> %s) found in /etc/fstab. Not mounting.\n", entry, resolved);
18c2aff776a775d34a4c9893a4c72e0434d68e36artemdevice_is_mounted (const char *device, char **mount_point)
18c2aff776a775d34a4c9893a4c72e0434d68e36artem /* check if /proc/mounts mentions this device... (with symlinks etc) */
18c2aff776a775d34a4c9893a4c72e0434d68e36artem unknown_error ("Cannot open /etc/mtab or equivalent");
18c2aff776a775d34a4c9893a4c72e0434d68e36artem while (((entry = mtab_next (handle, mount_point)) != NULL) && (ret == FALSE)) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem printf ("/proc/mounts: device %s -> %s \n", entry, resolved);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem printf ("%s (-> %s) found in mount list. Not mounting.\n", entry, resolved);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem/* maps volume_id fs types to the appropriate -t mount option */
18c2aff776a775d34a4c9893a4c72e0434d68e36artemstatic const char *
18c2aff776a775d34a4c9893a4c72e0434d68e36artem return "cd9660";
18c2aff776a775d34a4c9893a4c72e0434d68e36artem return "ext2fs";
18c2aff776a775d34a4c9893a4c72e0434d68e36artem return "msdosfs";
18c2aff776a775d34a4c9893a4c72e0434d68e36artem return "hsfs";
18c2aff776a775d34a4c9893a4c72e0434d68e36artem return "pcfs";
18c2aff776a775d34a4c9893a4c72e0434d68e36artem const char *udi,
18c2aff776a775d34a4c9893a4c72e0434d68e36artem LibHalVolume *volume, LibHalDrive *drive, const char *device,
18c2aff776a775d34a4c9893a4c72e0434d68e36artem const char *invoked_by_uid, const char *invoked_by_syscon_name,
18c2aff776a775d34a4c9893a4c72e0434d68e36artem printf ("invoked by system bus connection = %s\n", invoked_by_syscon_name);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (libhal_device_get_property_bool (hal_ctx, udi, "volume.ignore", &error) ||
18c2aff776a775d34a4c9893a4c72e0434d68e36artem * When device allocation is enabled (bsmconv or TX), we
18c2aff776a775d34a4c9893a4c72e0434d68e36artem * set volume.ignore on all volumes, but still want
18c2aff776a775d34a4c9893a4c72e0434d68e36artem * Mount() to succeed when called from the euid=0
18c2aff776a775d34a4c9893a4c72e0434d68e36artem * device allocation program.
18c2aff776a775d34a4c9893a4c72e0434d68e36artem /* TODO: sanity check that what hal exports is correct (cf. Martin Pitt's email) */
18c2aff776a775d34a4c9893a4c72e0434d68e36artem /* read from stdin */
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (strlen (fgets (mount_point, sizeof (mount_point), stdin)) > 0)
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (strlen (fgets (mount_fstype, sizeof (mount_fstype), stdin)) > 0)
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (strlen (fgets (mount_options, sizeof (mount_options), stdin)) > 0)
18c2aff776a775d34a4c9893a4c72e0434d68e36artem /* validate that input from stdin is UTF-8 */
18c2aff776a775d34a4c9893a4c72e0434d68e36artem unknown_error ("Error validating mount_point as UTF-8");
18c2aff776a775d34a4c9893a4c72e0434d68e36artem unknown_error ("Error validating mount_fstype as UTF-8");
18c2aff776a775d34a4c9893a4c72e0434d68e36artem unknown_error ("Error validating mount_options as UTF-8");
18c2aff776a775d34a4c9893a4c72e0434d68e36artem unknown_error ("mount_point cannot contain the following characters: newline, G_DIR_SEPARATOR (usually /)");
18c2aff776a775d34a4c9893a4c72e0434d68e36artem /* delete any trailing whitespace options from splitting the string */
18c2aff776a775d34a4c9893a4c72e0434d68e36artem for (i = g_strv_length (given_options) - 1; i >= 0; --i) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem /* for read-only media append 'ro' option if not already */
18c2aff776a775d34a4c9893a4c72e0434d68e36artem append_ro = libhal_device_get_property_bool (hal_ctx, libhal_drive_get_udi(drive),
18c2aff776a775d34a4c9893a4c72e0434d68e36artem for (i = 0; i < (int) g_strv_length (given_options); i++) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem#endif /* sun */
18c2aff776a775d34a4c9893a4c72e0434d68e36artem /* is option 'remount' included? */
18c2aff776a775d34a4c9893a4c72e0434d68e36artem for (i = 0; i < (int) g_strv_length (given_options); i++) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem mount_dir = g_strdup (libhal_volume_get_mount_point (volume));
18c2aff776a775d34a4c9893a4c72e0434d68e36artem unknown_error ("Cannot get mount_dir for remount even though volume is mounted!");
18c2aff776a775d34a4c9893a4c72e0434d68e36artem /* figure out mount point if no mount point is given... */
18c2aff776a775d34a4c9893a4c72e0434d68e36artem /* best - use label */
18c2aff776a775d34a4c9893a4c72e0434d68e36artem } else if ((drive_type != NULL) && (strlen (drive_type) > 0)) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem g_strlcpy (mount_point, drive_type, sizeof (mount_point));
18c2aff776a775d34a4c9893a4c72e0434d68e36artem /* fallback - use "disk" */
18c2aff776a775d34a4c9893a4c72e0434d68e36artem g_snprintf (mount_point, sizeof (mount_point), "disk");
18c2aff776a775d34a4c9893a4c72e0434d68e36artem /* sanitize computed mount point name, e.g. replace invalid chars with '-' */
18c2aff776a775d34a4c9893a4c72e0434d68e36artem /* check mount point name - only forbid separators */
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (g_utf8_strchr (mount_point, -1, G_DIR_SEPARATOR) != NULL) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem printf ("'%s' is an invalid mount point\n", mount_point);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem /* check if mount point is available - append number to mount point */
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (i == 0)
18c2aff776a775d34a4c9893a4c72e0434d68e36artem mount_dir = g_strdup_printf ("/media/%s", mount_point);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem mount_dir = g_strdup_printf ("/media/%s-%d", mount_point, i);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem /* XXX should test for being a mount point */
18c2aff776a775d34a4c9893a4c72e0434d68e36artem allowed_options = libhal_device_get_property_strlist (hal_ctx, udi, "volume.mount.valid_options", &error);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem unknown_error ("Cannot get volume.mount.valid_options");
18c2aff776a775d34a4c9893a4c72e0434d68e36artem printf ("given_options[%d] = '%s'\n", i, given_options[i]);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem printf ("allowed_options[%d] = '%s'\n", i, allowed_options[i]);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem /* check mount options */
18c2aff776a775d34a4c9893a4c72e0434d68e36artem /* option matched allowed ending in '=', e.g.
18c2aff776a775d34a4c9893a4c72e0434d68e36artem * given == "umask=foobar" and allowed == "umask="
18c2aff776a775d34a4c9893a4c72e0434d68e36artem /* check for uid=, it requires special handling */
18c2aff776a775d34a4c9893a4c72e0434d68e36artem /* apparently option was not ok */
18c2aff776a775d34a4c9893a4c72e0434d68e36artem /* Check privilege */
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (libhal_drive_is_hotpluggable (drive) || libhal_drive_uses_removable_media (drive))
18c2aff776a775d34a4c9893a4c72e0434d68e36artem /* don't consider uid= on non-pollable drives for the purpose of policy
18c2aff776a775d34a4c9893a4c72e0434d68e36artem * (since these drives normally use vfat)
18c2aff776a775d34a4c9893a4c72e0434d68e36artem /* don't consider uid= on vfat, iso9660, udf change-uid for the purpose of policy
18c2aff776a775d34a4c9893a4c72e0434d68e36artem * (since these doesn't contain uid/gid bits)
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (strcmp (libhal_volume_get_fstype (volume), "vfat") != 0 &&
18c2aff776a775d34a4c9893a4c72e0434d68e36artem strcmp (libhal_volume_get_fstype (volume), "iso9660") != 0 &&
18c2aff776a775d34a4c9893a4c72e0434d68e36artem strcmp (libhal_volume_get_fstype (volume), "udf") != 0) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem privilege = "hal-storage-removable-mount-all-options";
18c2aff776a775d34a4c9893a4c72e0434d68e36artem printf ("using privilege %s for uid %s, system_bus_connection %s\n", privilege, invoked_by_uid,
18c2aff776a775d34a4c9893a4c72e0434d68e36artem unknown_error ("Cannot lookup privilege from PolicyKit");
18c2aff776a775d34a4c9893a4c72e0434d68e36artem permission_denied_privilege (privilege, invoked_by_uid);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem /* create directory */
18c2aff776a775d34a4c9893a4c72e0434d68e36artem calling_uid = (uid_t) strtol (invoked_by_uid, (char **) NULL, 10);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (chown (mount_dir, calling_uid, calling_gid) != 0) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem printf ("Cannot chown '%s' to uid: %d, gid: %d\n", mount_dir,
18c2aff776a775d34a4c9893a4c72e0434d68e36artem /* construct arguments to mount */
18c2aff776a775d34a4c9893a4c72e0434d68e36artem /* non-pollable drive; force auto */
18c2aff776a775d34a4c9893a4c72e0434d68e36artem } else if (libhal_volume_get_fstype (volume) != NULL && strlen (libhal_volume_get_fstype (volume)) > 0) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem mount_do_fstype = (char *) map_fstype (libhal_volume_get_fstype (volume));
18c2aff776a775d34a4c9893a4c72e0434d68e36artem mount_option_commasep = g_string_free (mount_option_str, FALSE); /* leak! */
18c2aff776a775d34a4c9893a4c72e0434d68e36artem /* TODO FIXME XXX HACK: OK, so we should rewrite the options in /media/.hal-mtab ..
18c2aff776a775d34a4c9893a4c72e0434d68e36artem * but it doesn't really matter much at this point */
18c2aff776a775d34a4c9893a4c72e0434d68e36artem /* Maintain a list in /media/.hal-mtab with entries of the following format
18c2aff776a775d34a4c9893a4c72e0434d68e36artem * <device_file>\t<uid>\t<session-id>\t<fstype>\t<options_sep_by_comma>\t<mount point>\n
18c2aff776a775d34a4c9893a4c72e0434d68e36artem * where session-id currently is unused and thus set to 0.
18c2aff776a775d34a4c9893a4c72e0434d68e36artem * /dev/sda2 500 0 hfsplus noexec,nosuid,nodev /media/Macintosh HD
18c2aff776a775d34a4c9893a4c72e0434d68e36artem * /dev/sda4 500 0 ntfs noexec,nosuid,nodev,umask=222 /media/Windows
18c2aff776a775d34a4c9893a4c72e0434d68e36artem * /dev/sdb1 500 0 vfat noexec,nosuid,nodev,shortname=winnt,uid=500 /media/davidz
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (g_file_test ("/media/.hal-mtab", G_FILE_TEST_EXISTS)) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem unknown_error ("Cannot seek to end of /media/.hal-mtab");
18c2aff776a775d34a4c9893a4c72e0434d68e36artem unknown_error ("Cannot determine size of /media/.hal-mtab");
18c2aff776a775d34a4c9893a4c72e0434d68e36artem num_read = fread (hal_mtab_buf, 1, hal_mtab_orig_len, hal_mtab_orig);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem printf ("%d: XYA creating /media/.hal-mtab~\n", getpid ());
18c2aff776a775d34a4c9893a4c72e0434d68e36artem hal_mtab_buf = g_strdup_printf ("%s%s\t%s\t0\t%s\t%s\t%s\n",
18c2aff776a775d34a4c9893a4c72e0434d68e36artem unknown_error ("Out of memory appending to /media/.hal-mtab~");
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (fwrite (hal_mtab_buf, 1, strlen (hal_mtab_buf), hal_mtab) != strlen (hal_mtab_buf)) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem printf ("%d: XYA closing /media/.hal-mtab~\n", getpid ());
18c2aff776a775d34a4c9893a4c72e0434d68e36artem } /* !is_remount */
18c2aff776a775d34a4c9893a4c72e0434d68e36artem /* now try to mount */
18c2aff776a775d34a4c9893a4c72e0434d68e36artem printf ("%s error %d, stdout='%s', stderr='%s'\n", MOUNT, exit_status, sout, serr);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (strncmp (errstr, serr, sizeof (errstr) - 1) == 0) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem (volume != NULL ? libhal_volume_get_fstype (volume) : "") );
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (rename ("/media/.hal-mtab~", "/media/.hal-mtab") != 0) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem printf ("rename(2) failed, errno=%d -> '%s'\n", errno, strerror (errno));
18c2aff776a775d34a4c9893a4c72e0434d68e36artem printf ("%d: XYA failed renaming /media/.hal-mtab~ to /media/.hal-mtab\n", getpid ());
18c2aff776a775d34a4c9893a4c72e0434d68e36artem unknown_error ("Cannot rename /media/.hal-mtab~ to /media/.hal-mtab");
18c2aff776a775d34a4c9893a4c72e0434d68e36artem printf ("%d: XYA done renaming /media/.hal-mtab~ to /media/.hal-mtab\n", getpid ());
18c2aff776a775d34a4c9893a4c72e0434d68e36artem syslog (LOG_INFO, "remounted %s at '%s' on behalf of uid %s", device, mount_dir, invoked_by_uid);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem syslog (LOG_INFO, "mounted %s on behalf of uid %s", device, invoked_by_uid);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem WEXITSTATUS(exit_status), auth_from_privilege(privilege),
18c2aff776a775d34a4c9893a4c72e0434d68e36artem unknown_error ("Cannot obtain lock on /media/.hal-mtab");
18c2aff776a775d34a4c9893a4c72e0434d68e36artem invoked_by_uid = getenv ("HAL_METHOD_INVOKED_BY_UID");
18c2aff776a775d34a4c9893a4c72e0434d68e36artem invoked_by_syscon_name = getenv ("HAL_METHOD_INVOKED_BY_SYSTEMBUS_CONNECTION_NAME");
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if ((hal_ctx = libhal_ctx_init_direct (&error)) == NULL) {