All pastes #438663 Raw Edit

Something

public text v1 · immutable
·published 2007-04-13 19:41 UTC
rendered paste body
static HalDevice *
net_add (const gchar *sysfs_path, const gchar *device_file, HalDevice *parent_dev, const gchar *parent_path)
{
	HalDevice *d;
	const gchar *ifname;
	guint media_type;
	gint flags;

	d = NULL;

	if (parent_dev == NULL)
		goto error;

	d = hal_device_new ();
	hal_device_property_set_string (d, "linux.sysfs_path", sysfs_path);
	hal_device_property_set_string (d, "info.parent", hal_device_get_udi (parent_dev));

	hal_device_property_set_string (d, "info.category", "net");
	hal_device_add_capability (d, "net");

	hal_device_property_set_string (d, "net.originating_device", hal_device_get_udi (parent_dev));
	hal_device_property_set_string (d, "net.physical_device", hal_device_get_udi (parent_dev));

	ifname = hal_util_get_last_element (sysfs_path);
	hal_device_property_set_string (d, "net.interface", ifname);

	if (!hal_util_set_string_from_file (d, "net.address", sysfs_path, "address")) {
		hal_device_property_set_string (d, "net.address", "00:00:00:00:00:00");	
	}

	if (!hal_util_set_int_from_file (d, "net.linux.ifindex", sysfs_path, "ifindex", 10))
		goto error;

	if (!hal_util_set_int_from_file (d, "net.arp_proto_hw_id", sysfs_path, "type", 10))
		goto error;

	if (!hal_util_get_int_from_file (sysfs_path, "flags", &flags, 16))
		goto error;

	media_type = hal_device_property_get_int (d, "net.arp_proto_hw_id");
	if (media_type == ARPHRD_ETHER) {
		const char *addr;
		const char *parent_subsys;
		char wireless_path[HAL_PATH_MAX];
		char wiphy_path[HAL_PATH_MAX];
		struct stat s;
		dbus_uint64_t mac_address = 0;

		addr = hal_device_property_get_string (d, "net.address");
		if (addr != NULL) {
			unsigned int a5, a4, a3, a2, a1, a0;

			if (sscanf (addr, "%x:%x:%x:%x:%x:%x",
				    &a5, &a4, &a3, &a2, &a1, &a0) == 6) {
				mac_address =
					((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);
			}
		}

		snprintf (wireless_path, HAL_PATH_MAX, "%s/wireless", sysfs_path);
		/* wireless dscape stack e.g. from rt2500pci driver*/
		snprintf (wiphy_path, HAL_PATH_MAX, "%s/wiphy", sysfs_path);
		parent_subsys = hal_device_property_get_string (parent_dev, "linux.subsystem");

		if (parent_subsys && strcmp(parent_subsys, "bluetooth") == 0) {
			hal_device_property_set_string (d, "info.product", "Bluetooth Interface");
			hal_device_property_set_string (d, "info.category", "net.bluetooth");
			hal_device_add_capability (d, "net.bluetooth");
			hal_device_property_set_uint64 (d, "net.bluetooth.mac_address", mac_address);
			/* Leave those properties empty so helper may fill it up */
			hal_device_property_set_string (d, "net.bluetooth.name", "");
			hal_device_property_set_string (d, "net.bluetooth.uuid", "");
		} else if ((stat (wireless_path, &s) == 0 && (s.st_mode & S_IFDIR)) ||
			(stat (wiphy_path, &s) == 0 && (s.st_mode & S_IFDIR))) {
			hal_device_property_set_string (d, "info.product", "WLAN Interface");
			hal_device_property_set_string (d, "info.category", "net.80211");
			hal_device_add_capability (d, "net.80211");
			hal_device_property_set_uint64 (d, "net.80211.mac_address", mac_address);
		} else {
			hal_device_property_set_string (d, "info.product", "Networking Interface");
			hal_device_property_set_string (d, "info.category", "net.80203");
			hal_device_add_capability (d, "net.80203");
			hal_device_property_set_uint64 (d, "net.80203.mac_address", mac_address);
		}
	} else if (media_type == ARPHRD_IRDA) {
		hal_device_property_set_string (d, "info.product", "Networking Interface");
		hal_device_property_set_string (d, "info.category", "net.irda");
		hal_device_add_capability (d, "net.irda");
	}
#if defined(ARPHRD_IEEE80211_RADIOTAP) && defined(ARPHRD_IEEE80211_PRISM)
	else if (media_type == ARPHRD_IEEE80211 || media_type == ARPHRD_IEEE80211_PRISM || 
		   media_type == ARPHRD_IEEE80211_RADIOTAP) {
		hal_device_property_set_string (d, "info.product", "Networking Wireless Control Interface");
		hal_device_property_set_string (d, "info.category", "net.80211control");
		hal_device_add_capability (d, "net.80211control");
	}
#else
#warning ARPHRD_IEEE80211_RADIOTAP and/or ARPHRD_IEEE80211_PRISM not defined!
#endif

	return d;
error:
	if (d != NULL) {
		hal_device_store_remove (hald_get_tdl (), d);
		g_object_unref (d);
		d = NULL;
	}

	return d;
}