static void ac_adapter_present(LibHalContext *ctx, const char *udi, int fd) { int pow; LibHalChangeSet *cs; DBusError error; HAL_DEBUG(("ac_adapter_present() enter")); if (ioctl(fd, BATT_IOC_POWER_STATUS, &pow) < 0) { return; } if ((cs = libhal_device_new_changeset(udi)) == NULL) { return; } if (pow > 0) { libhal_changeset_set_property_bool(cs, "ac_adapter.present", TRUE); } else { libhal_changeset_set_property_bool(cs, "ac_adapter.present", FALSE); } dbus_error_init(&error); libhal_device_commit_changeset(ctx, cs, &error); libhal_device_free_changeset(cs); my_dbus_error_free(&error); HAL_DEBUG(("ac_adapter_present() exit")); }
int main (int argc, char *argv[]) { int ret; char *udi; DBusError error; LibHalContext *hal_ctx = NULL; LibHalChangeSet *cs; gboolean can_suspend = FALSE; gboolean can_suspend_hybrid = FALSE; gboolean can_hibernate = FALSE; int exit_status; ret = 1; udi = getenv ("HAL_PROP_INFO_UDI"); if (udi == NULL) goto out; dbus_error_init (&error); if ((hal_ctx = libhal_ctx_init_direct (&error)) == NULL) { printf ("Cannot connect to hald\n"); if (dbus_error_is_set (&error)) { dbus_error_free (&error); } goto out; } cs = libhal_device_new_changeset (udi); if (cs == NULL) { printf ("Cannot initialize changeset\n"); goto out; } g_spawn_command_line_sync ("/usr/bin/pm-is-supported --suspend", NULL, NULL, &exit_status, NULL); can_suspend = (exit_status == 0); g_spawn_command_line_sync ("/usr/bin/pm-is-supported --suspend-hybrid", NULL, NULL, &exit_status, NULL); can_suspend_hybrid = (exit_status == 0); g_spawn_command_line_sync ("/usr/bin/pm-is-supported --hibernate", NULL, NULL, &exit_status, NULL); can_hibernate = (exit_status == 0); libhal_changeset_set_property_bool (cs, "power_management.can_suspend", can_suspend); libhal_changeset_set_property_bool (cs, "power_management.can_suspend_hybrid", can_suspend_hybrid); libhal_changeset_set_property_bool (cs, "power_management.can_hibernate", can_hibernate); libhal_device_commit_changeset (hal_ctx, cs, &error); libhal_device_free_changeset (cs); ret = 0; out: return ret; }
static dbus_bool_t probe_disc (int fd, LibHalContext *ctx, const char *udi, dbus_bool_t *has_data, dbus_bool_t *has_audio) { DBusError error; disc_info_t di; int profile; dbus_bool_t is_blank, is_appendable, is_rewritable; char *disc_type = "cd_rom"; uint64_t capacity = 0; int i; LibHalChangeSet *cs; dbus_error_init (&error); if (get_disc_info (fd, &di)) { is_blank = (di.disc_status == 0); is_appendable = (di.disc_status == 1); is_rewritable = (di.erasable != 0); } else { is_blank = is_appendable = is_rewritable = FALSE; } if (get_current_profile (fd, &profile)) { switch (profile) { case 0x08: /* CD-ROM */ disc_type = "cd_rom"; break; case 0x09: /* CD-R */ disc_type = "cd_r"; break; case 0x0A: /* CD-RW */ disc_type = "cd_rw"; is_rewritable = TRUE; break; case 0x10: /* DVD-ROM */ disc_type = "dvd_rom"; break; case 0x11: /* DVD-R Sequential */ disc_type = "dvd_r"; break; case 0x12: /* DVD-RAM */ disc_type = "dvd_ram"; is_rewritable = TRUE; break; case 0x13: /* DVD-RW Restricted Overwrite */ disc_type = "dvd_rw"; is_rewritable = TRUE; break; case 0x14: /* DVD-RW Sequential */ disc_type = "dvd_rw"; is_rewritable = TRUE; break; case 0x1A: /* DVD+RW */ disc_type = "dvd_plus_rw"; is_rewritable = TRUE; break; case 0x1B: /* DVD+R */ disc_type = "dvd_plus_r"; break; case 0x2B: /* DVD+R Double Layer */ disc_type = "dvd_plus_r_dl"; break; case 0x40: /* BD-ROM */ disc_type = "bd_rom"; break; case 0x41: /* BD-R Sequential */ disc_type = "bd_r"; break; case 0x42: /* BD-R Random */ disc_type = "bd_r"; break; case 0x43: /* BD-RE */ disc_type = "bd_re"; is_rewritable = TRUE; break; case 0x50: /* HD DVD-ROM */ disc_type = "hddvd_rom"; break; case 0x51: /* HD DVD-R */ disc_type = "hddvd_r"; break; case 0x52: /* HD DVD-Rewritable */ disc_type = "hddvd_rw"; is_rewritable = TRUE; break; } (void) get_disc_capacity_for_profile(fd, profile, &capacity); } *has_audio = *has_data = FALSE; if (!is_blank) { uchar_t smalltoc[12]; size_t toc_size; uchar_t *toc, *p; /* * XXX for some reason CDROMREADTOCENTRY fails on video DVDs, * but extracting the toc directly works okay. */ if (!read_toc(fd, 0, 1, 4, smalltoc)) { HAL_DEBUG(("read_toc failed")); *has_data = B_TRUE; /* probe for fs anyway */ } else { toc_size = smalltoc[0] * 256 + smalltoc[1] + 2; toc = (uchar_t *)calloc(1, toc_size); if (toc == NULL || !read_toc(fd, 0, 1, toc_size, toc)) { HAL_DEBUG (("read_toc again failed")); } else { for (p = &toc[4]; p < (toc + toc_size); p += 8) { /* skip leadout */ if (p[2] == 0xAA) { continue; } if (p[1] & 4) { *has_data = B_TRUE; } else { *has_audio = B_TRUE; } } } free(toc); } } if ((cs = libhal_device_new_changeset (udi)) == NULL) { return (FALSE); } libhal_changeset_set_property_string (cs, "volume.disc.type", disc_type); libhal_changeset_set_property_bool (cs, "volume.disc.is_blank", is_blank); libhal_changeset_set_property_bool (cs, "volume.disc.has_audio", *has_audio); libhal_changeset_set_property_bool (cs, "volume.disc.has_data", *has_data); libhal_changeset_set_property_bool (cs, "volume.disc.is_appendable", is_appendable); libhal_changeset_set_property_bool (cs, "volume.disc.is_rewritable", is_rewritable); libhal_changeset_set_property_uint64 (cs, "volume.disc.capacity", capacity); libhal_changeset_set_property_bool (cs, "volume.disc.is_videodvd", FALSE); libhal_changeset_set_property_bool (cs, "volume.disc.is_vcd", FALSE); libhal_changeset_set_property_bool (cs, "volume.disc.is_svcd", FALSE); libhal_device_commit_changeset (ctx, cs, &error); libhal_device_free_changeset (cs); out: my_dbus_error_free (&error); return (TRUE); }