HalDevice * devinfo_audio_dsp_add(HalDevice *parent, const char *devnode, char *devfs_path, char *device_type) { HalDevice *d = NULL; char *device_file, *parent_udi, *card_id, *device_id; int16_t unit; if (strstr (devnode, "oss_dsp_") != devnode) return NULL; d = hal_device_new (); devinfo_set_default_properties (d, parent, devnode, devfs_path); hal_device_add_capability (d, "oss"); hal_device_property_set_string (d, "info.category", "oss"); hal_device_property_set_string (d, "info.subsystem", "sound"); card_id = hal_device_property_get_string (parent, "sound.card_id"); hal_device_property_set_string (d, "oss.card_id", card_id); unit = hal_device_property_get_int (parent, "sound.card"); hal_device_property_set_int (d, "oss.card", unit); hal_device_property_set_int (d, "oss.device", unit); device_id = hal_device_property_get_string (parent, "netbsd.sound.hardware"); hal_device_property_set_string (d, "oss.device_id", device_id); hal_device_property_set_string (d, "oss.type", "pcm"); device_file = g_strdup_printf (_PATH_SOUND "%d", unit); hal_device_property_set_string (d, "oss.device_file", device_file); g_free (device_file); parent_udi = hal_device_property_get_string (parent, "info.udi"); if (parent_udi) hal_device_property_set_string (d, "sound.originating_device", parent_udi); devinfo_add_enqueue (d, devfs_path, &devinfo_audio_dsp_handler); return d; }
HalDevice * devinfo_audio_add(HalDevice *parent, const char *devnode, char *devfs_path, char *device_type) { HalDevice *d = NULL, *mixer, *dsp; prop_dictionary_t dict; const char *driver, *parent_udi; char *childnode; int16_t unit; char *audioctl; struct audio_device audiodev; int fd; if (drvctl_find_device (devnode, &dict) == FALSE || dict == NULL) return NULL; if (prop_dictionary_get_int16 (dict, "device-unit", &unit) == false || prop_dictionary_get_cstring_nocopy (dict, "device-driver", &driver) == false) { prop_object_release (dict); return NULL; } if (strcmp (driver, "audio") != 0) { prop_object_release (dict); return NULL; } audioctl = g_strdup_printf (_PATH_AUDIOCTL "%d", unit); fd = open (audioctl, O_RDONLY); if (fd < 0) { HAL_WARNING (("couldn't open %s: %s", audioctl, strerror(errno))); goto done; } if (ioctl (fd, AUDIO_GETDEV, &audiodev) == -1) { HAL_WARNING (("couldn't query %s: %s", audioctl, strerror(errno))); goto done; } d = hal_device_new (); devinfo_set_default_properties (d, parent, devnode, devfs_path); hal_device_add_capability (d, "sound"); hal_device_property_set_string (d, "info.category", "sound"); hal_device_property_set_string (d, "info.subsystem", "sound"); hal_device_property_set_int (d, "sound.card", unit); hal_device_property_set_string (d, "sound.card_id", audiodev.name); hal_device_property_set_string (d, "netbsd.sound.hardware", audiodev.config); parent_udi = hal_device_property_get_string (parent, "info.udi"); if (parent_udi) hal_device_property_set_string (d, "sound.originating_device", parent_udi); devinfo_add_enqueue (d, devfs_path, &devinfo_audio_handler); childnode = g_strdup_printf ("oss_mixer_%d", unit); devinfo_add_node (d, childnode); g_free (childnode); childnode = g_strdup_printf ("oss_dsp_%d", unit); devinfo_add_node (d, childnode); g_free (childnode); done: if (dict) prop_object_release (dict); if (audioctl) g_free (audioctl); if (fd >= 0) close (fd); return d; }
HalDevice * devinfo_mass_disklabel_add(HalDevice *parent, const char *devnode, char *devfs_path, char *device_type) { HalDevice *d = NULL; struct disklabel label; struct partition *part; struct stat st; const char *driver; char *devpath, *rdevpath, *partname; char *childnode; char unit; struct volume_id *vid; uint64_t psize, msize; int i, fd; partname = devnode; unit = partname[strlen (partname) - 1] - 'a'; if (unit >= MAXPARTITIONS) return NULL; devpath = g_strdup_printf ("/dev/%s", partname); rdevpath = g_strdup_printf ("/dev/r%s", partname); fd = open (rdevpath, O_RDONLY); if (fd < 0) { HAL_WARNING (("couldn't open %s: %s", rdevpath, strerror (errno))); g_free (rdevpath); return NULL; } if (ioctl (fd, DIOCGDINFO, &label) == -1) { HAL_WARNING (("DIOCGDINFO failed on %s: %s", rdevpath, strerror (errno))); g_free (rdevpath); close (fd); return NULL; } part = &label.d_partitions[unit]; d = hal_device_new (); devinfo_set_default_properties (d, parent, devnode, devfs_path); hal_device_add_capability (d, "block"); hal_device_property_set_string (d, "info.subsystem", "block"); hal_device_property_set_string (d, "info.category", "volume"); hal_device_property_set_string (d, "block.device", devpath); hal_device_property_set_string (d, "block.storage_device", hal_device_property_get_string (parent, "info.udi")); if (stat (devpath, &st) == 0) { hal_device_property_set_int (d, "block.major", major (st.st_rdev)); hal_device_property_set_int (d, "block.minor", minor (st.st_rdev)); } hal_device_property_set_bool (d, "block.is_volume", TRUE); hal_device_property_set_bool (d, "block.no_partitions", FALSE); hal_device_property_set_bool (d, "block.have_scanned", TRUE); hal_device_add_capability (d, "volume"); hal_device_property_set_bool (d, "volume.ignore", FALSE); hal_device_property_set_bool (d, "volume.is_mounted", FALSE); hal_device_property_set_bool (d, "volume.is_mounted_read_only", FALSE); hal_device_property_set_string (d, "volume.mount_point", ""); hal_device_property_set_string (d, "volume.fsusage", "filesystem"); hal_device_property_set_string (d, "volume.fstype", devinfo_mass_get_fstype (part->p_fstype)); hal_device_property_set_bool (d, "volume.is_disc", FALSE); hal_device_property_set_string (d, "volume.label", ""); hal_device_property_set_string (d, "volume.partition.label", ""); hal_device_property_set_string (d, "volume.uuid", ""); hal_device_property_set_string (d, "volume.partition.uuid", ""); psize = (uint64_t)part->p_size * (uint64_t)label.d_secsize; msize = (uint64_t)label.d_secsize * (uint64_t)label.d_secperunit; hal_device_property_set_uint64 (d, "volume.size", psize); hal_device_property_set_int (d, "volume.block_size", label.d_secsize); hal_device_property_set_uint64 (d, "volume.num_blocks", part->p_size); hal_device_property_set_uint64 (d, "volume.partition.media_size", msize); hal_device_property_set_bool (d, "volume.is_partition", TRUE); hal_device_property_set_int (d, "volume.partition.number", unit); hal_device_property_set_string (d, "volume.partition.scheme", "mbr"); vid = volume_id_open_fd (fd); if (vid) { if (volume_id_probe_all (vid, 0, psize) == 0) { const char *type,*fstype; hal_device_property_set_string (d, "volume.label", vid->label); hal_device_property_set_string (d, "volume.partition.label", vid->label); hal_device_property_set_string (d, "volume.uuid", vid->uuid); hal_device_property_set_string (d, "volume.partition.uuid", vid->uuid); if ( type && volume_id_get_type (vid, &type)) { fstype=devinfo_mass_get_fstype (part->p_fstype); if (strcmp (type, fstype)) { HAL_INFO (("%s disklabel reports [%s] but libvolume_id says it is " "[%s], assuming disklabel is incorrect", devpath, fstype, type)); hal_device_property_set_string (d, "volume.fstype", type); } } } volume_id_close (vid); } devinfo_add_enqueue (d, devfs_path, &devinfo_mass_disklabel_handler); close (fd); g_free (rdevpath); g_free (devpath); return d; }
static HalDevice * hf_net_device_new (const char *interface, HalDevice *parent, GError **err) { char *output; char **lines; int i; int ifindex; GError *tmp_err = NULL; const char *mac = NULL; const char *media = NULL; gboolean is_ethernet = FALSE; gboolean is_wireless = FALSE; gboolean is_tokenring = FALSE; HalDevice *device = NULL; g_return_val_if_fail(interface != NULL, NULL); g_return_val_if_fail(HAL_IS_DEVICE(parent), NULL); output = hf_run(&tmp_err, "/sbin/ifconfig %s", interface); if (! output) { g_set_error(err, 0, 0, "ifconfig failure: %s", tmp_err->message); g_error_free(tmp_err); return NULL; } lines = g_strsplit(output, "\n", 0); g_free(output); for (i = 0; lines[i]; i++) { if (g_str_has_prefix(lines[i], "\tether ")) mac = lines[i] + 7; if (g_str_has_prefix(lines[i], "\tmedia: ")) media = lines[i] + 8; if (g_str_has_prefix(lines[i], "\tmedia: Ethernet")) is_ethernet = TRUE; else if (g_str_has_prefix(lines[i], "\tmedia: IEEE 802.11 Wireless Ethernet")) { is_ethernet = TRUE; is_wireless = TRUE; } else if (g_str_has_prefix(lines[i], "\tmedia: Token ring")) is_tokenring = TRUE; } device = hf_device_new(parent); hf_device_set_udi(device, "net_%s", mac ? mac : hal_util_get_last_element(hal_device_get_udi(parent))); hal_device_property_set_string(device, "info.product", "Networking Interface"); hal_device_add_capability(device, "net"); hal_device_property_set_string(device, "net.address", mac ? mac : "00:00:00:00:00:00"); hal_device_property_set_string(device, "net.interface", interface); hal_device_property_set_string(device, "net.originating_device", hal_device_get_udi(parent)); hal_device_property_set_string(device, "net.media", media); if (hf_devtree_is_driver(interface, "fwe")) hal_device_property_set_int(device, "net.arp_proto_hw_id", ARPHRD_IEEE1394); else if (is_ethernet) hal_device_property_set_int(device, "net.arp_proto_hw_id", ARPHRD_ETHER); else if (is_tokenring) hal_device_property_set_int(device, "net.arp_proto_hw_id", ARPHRD_IEEE802); /* FIXME Add additional net.arp_proto_hw_id support */ ifindex = if_nametoindex(interface); hal_device_property_set_int(device, "net.freebsd.ifindex", ifindex); if (is_ethernet) { dbus_uint64_t numeric_mac = 0; unsigned int a5, a4, a3, a2, a1, a0; if (mac && sscanf(mac, "%x:%x:%x:%x:%x:%x", &a5, &a4, &a3, &a2, &a1, &a0) == 6) numeric_mac = ((dbus_uint64_t) a5 << 40) | ((dbus_uint64_t) a4 << 32) | ((dbus_uint64_t) a3 << 24) | ((dbus_uint64_t) a2 << 16) | ((dbus_uint64_t) a1 << 8) | ((dbus_uint64_t) a0 << 0); if (is_wireless) { hal_device_property_set_string(device, "info.product", "WLAN Networking Interface"); hal_device_add_capability(device, "net.80211"); hal_device_property_set_string(device, "info.category", "net.80211"); hal_device_property_set_uint64(device, "net.80211.mac_address", numeric_mac); } else { hal_device_add_capability(device, "net.80203"); hal_device_property_set_string(device, "info.category", "net.80203"); hal_device_property_set_uint64(device, "net.80203.mac_address", numeric_mac); hal_device_property_set_uint64(device, "net.80203.rate", hf_net_get_rate(ifindex)); } } else hal_device_property_set_string(device, "info.category", "net"); g_strfreev(lines); hf_net_device_set_link_up(device, hf_net_get_link_up(interface)); return device; }
HalDevice * devinfo_mass_add(HalDevice *parent, const char *devnode, char *devfs_path, char *device_type) { HalDevice *d = NULL, *gparent = NULL; prop_dictionary_t dict; struct disklabel label; struct stat st; const char *driver; char *rdevpath, *devpath; char *childnode; char *parent_devnode, *gparent_devnode = NULL; char *gparent_udi; int16_t unit; int i, fd; struct scsipi_inquiry_data inqbuf; struct scsipi_inquiry cmd; bool scsiinq_status; char *storage_model = NULL, *storage_vendor = NULL; if (drvctl_find_device (devnode, &dict) == FALSE || dict == NULL) return NULL; if (prop_dictionary_get_int16 (dict, "device-unit", &unit) == false || prop_dictionary_get_cstring_nocopy (dict, "device-driver", &driver) == false) { prop_object_release (dict); return NULL; } if (strcmp (driver, "wd") != 0 && strcmp (driver, "sd") != 0 && strcmp (driver, "ld") != 0) { prop_object_release (dict); return NULL; } sleep (1); devpath = g_strdup_printf ("/dev/%s%c", devnode, RAW_PART + 'a'); rdevpath = g_strdup_printf ("/dev/r%s%c", devnode, RAW_PART + 'a'); HAL_INFO ((" going to open %s", rdevpath)); fd = open (rdevpath, O_RDONLY); if (fd < 0) { HAL_WARNING (("couldn't open %s: %s", rdevpath, strerror (errno))); g_free (rdevpath); g_free (devpath); return NULL; } HAL_INFO ((" going to DIOCGDINFO %s", rdevpath)); if (ioctl (fd, DIOCGDINFO, &label) == -1) { HAL_WARNING (("DIOCGDINFO failed on %s: %s", rdevpath, strerror (errno))); g_free (rdevpath); g_free (devpath); close (fd); return NULL; } if (strcmp (driver, "sd") == 0) { memset(&cmd, 0, sizeof (cmd)); memset(&inqbuf, 0, sizeof (inqbuf)); cmd.opcode = INQUIRY; cmd.length = sizeof (inqbuf); scsiinq_status = scsi_command (fd, &cmd, sizeof (cmd), &inqbuf, sizeof (inqbuf), 10000, SCCMD_READ); } else scsiinq_status = false; close (fd); d = hal_device_new (); devinfo_set_default_properties (d, parent, devnode, devfs_path); hal_device_add_capability (d, "block"); hal_device_property_set_string (d, "info.subsystem", "block"); hal_device_property_set_string (d, "block.device", devpath); if (stat (devpath, &st) == 0) { hal_device_property_set_int (d, "block.major", major (st.st_rdev)); hal_device_property_set_int (d, "block.minor", minor (st.st_rdev)); } hal_device_property_set_bool (d, "block.is_volume", FALSE); hal_device_property_set_bool (d, "block.no_partitions", FALSE); hal_device_property_set_bool (d, "block.have_scanned", TRUE); hal_device_add_capability (d, "storage"); hal_device_property_set_string (d, "info.category", "storage"); parent_devnode = hal_device_property_get_string (parent, "netbsd.device"); gparent_udi = hal_device_property_get_string (parent, "info.parent"); if (gparent_udi) { gparent = hal_device_store_find (hald_get_gdl (), gparent_udi); if (gparent) gparent_devnode = hal_device_property_get_string (gparent, "netbsd.device"); } if (gparent_devnode && strstr (gparent_devnode, "umass") == gparent_devnode) hal_device_property_set_string (d, "storage.bus", "usb"); else if (parent_devnode && strstr (parent_devnode, "atabus") == parent_devnode) hal_device_property_set_string (d, "storage.bus", "ide"); else hal_device_property_set_string (d, "storage.bus", "scsi"); hal_device_property_set_string (d, "storage.device_type", "disk"); hal_device_property_set_bool (d, "storage.removable", label.d_flags & D_REMOVABLE ? TRUE : FALSE); if (label.d_flags & D_REMOVABLE) { hal_device_property_set_bool (d, "storage.removable.media_available", TRUE); hal_device_property_set_uint64 (d, "storage.removable.media_size", (uint64_t)label.d_secsize * (uint64_t)label.d_secperunit); hal_device_property_set_uint64 (d, "storage.size", 0); hal_device_property_set_bool (d, "storage.hotpluggable", TRUE); hal_device_property_set_bool (d, "storage.automount_enabled_hint", TRUE); } else { hal_device_property_set_bool (d, "storage.removable.media_available", FALSE); hal_device_property_set_uint64 (d, "storage.removable.media_size", 0); hal_device_property_set_uint64 (d, "storage.size", (uint64_t)label.d_secsize * (uint64_t)label.d_secperunit); hal_device_property_set_bool (d, "storage.hotpluggable", FALSE); hal_device_property_set_bool (d, "storage.automount_enabled_hint", FALSE); } hal_device_property_set_bool (d, "storage.no_partitions_hint", FALSE); hal_device_property_set_bool (d, "storage.requires_eject", FALSE); hal_device_property_set_bool (d, "storage.removable.support_async_notification", FALSE); hal_device_property_set_string (d, "storage.partitioning_scheme", "mbr"); hal_device_property_set_string (d, "storage.originating_device", hal_device_property_get_string (d, "info.udi")); if (scsiinq_status == true) { storage_model = rtrim_copy(inqbuf.product, sizeof (inqbuf.product)); storage_vendor = rtrim_copy(inqbuf.vendor, sizeof (inqbuf.vendor)); } if (storage_model) { hal_device_property_set_string (d, "storage.model", storage_model); free (storage_model); } else hal_device_property_set_string (d, "storage.model", label.d_packname); if (storage_vendor) { hal_device_property_set_string (d, "storage.vendor", storage_vendor); free (storage_vendor); } else hal_device_property_set_string (d, "storage.vendor", label.d_typename); devinfo_add_enqueue (d, devfs_path, &devinfo_mass_handler); for (i = 0; i < MAXPARTITIONS; i++) { const char *fstype; fstype = devinfo_mass_get_fstype(label.d_partitions[i].p_fstype); if (fstype == NULL) continue; childnode = g_strdup_printf ("%s%c", devnode, 'a' + i); HAL_INFO ((" adding %s on %s", childnode, rdevpath)); devinfo_mass_disklabel_add (d, childnode, childnode, childnode); g_free (childnode); } HAL_INFO ((" returning")); g_free (rdevpath); g_free (devpath); done: prop_object_release (dict); return d; }