1
0
mirror of https://github.com/systemd/systemd.git synced 2024-12-23 21:35:11 +03:00

gudev: move from udev-extras

GObject libudev access. Initial version from Bastien Nocera, current
version by David Zeuthen.
This commit is contained in:
David Zeuthen 2009-06-16 17:52:15 +02:00 committed by Kay Sievers
parent af23b83ea7
commit bf05675a20
25 changed files with 2439 additions and 1 deletions

View File

@ -62,3 +62,4 @@ git-release:
doc-sync:
rsync -av --delete libudev/docs/html/ master.kernel.org:/pub/linux/utils/kernel/hotplug/libudev/
rsync -av --delete extras/gudev/docs/html/ master.kernel.org:/pub/linux/utils/kernel/hotplug/libgudev/

View File

@ -68,6 +68,20 @@ if test "x$enable_extras" = xyes; then
fi
AM_CONDITIONAL([ENABLE_EXTRAS], [test "x$enable_extras" = xyes])
AC_ARG_ENABLE([introspection],
AS_HELP_STRING([--enable-introspection], [enable GObject introspection]),
[], [enable_introspection=no])
if test "$enable_introspection" = xyes; then
PKG_CHECK_MODULES([INTROSPECTION], [gobject-introspection-1.0 >= 0.6.2])
AC_DEFINE([ENABLE_INTROSPECTION], [1], [enable GObject introspection support])
AC_SUBST([G_IR_SCANNER], [$($PKG_CONFIG --variable=g_ir_scanner gobject-introspection-1.0)])
AC_SUBST([G_IR_COMPILER], [$($PKG_CONFIG --variable=g_ir_compiler gobject-introspection-1.0)])
AC_SUBST([G_IR_GENERATE], [$($PKG_CONFIG --variable=g_ir_generate gobject-introspection-1.0)])
AC_SUBST([GIRDIR], [$($PKG_CONFIG --variable=girdir gobject-introspection-1.0)])
AC_SUBST([GIRTYPELIBDIR], [$($PKG_CONFIG --variable=typelibdir gobject-introspection-1.0)])
fi
AM_CONDITIONAL([ENABLE_INTROSPECTION], [test "x$enable_introspection" = xyes])
AC_CONFIG_HEADERS(config.h)
AC_CONFIG_FILES([
Makefile
@ -90,6 +104,10 @@ AC_CONFIG_FILES([
extras/scsi_id/Makefile
extras/usb_id/Makefile
extras/udev-acl/Makefile
extras/gudev/Makefile
extras/gudev/gudev-1.0.pc
extras/gudev/docs/Makefile
extras/gudev/docs/version.xml
])
AC_OUTPUT
@ -100,6 +118,7 @@ AC_MSG_RESULT([
prefix: ${prefix}
exec_prefix: ${exec_prefix}
udev_prefix: ${udev_prefix}
libdir: ${libdir}
libdir_name: ${libdir_name}
datarootdir: ${datarootdir}
mandir: ${mandir}
@ -114,6 +133,7 @@ AC_MSG_RESULT([
ldflags: ${LDFLAGS}
extras: ${enable_extras}
gintrospection: ${enable_introspection}
xsltproc: ${XSLTPROC}
])

View File

@ -15,5 +15,6 @@ SUBDIRS = \
if ENABLE_EXTRAS
SUBDIRS += \
udev-acl
udev-acl \
gudev
endif

8
extras/gudev/.gitignore vendored Normal file
View File

@ -0,0 +1,8 @@
gtk-doc.make
docs/version.xml
gudev-1.0.pc
gudevenumtypes.c
gudevenumtypes.h
gudevmarshal.c
gudevmarshal.h

115
extras/gudev/Makefile.am Normal file
View File

@ -0,0 +1,115 @@
include $(top_srcdir)/Makefile.am.inc
# putting . first causes prefix ordering of directories
SUBDIRS = \
. \
docs
AM_CPPFLAGS += \
-I$(top_builddir)/extras \
-I$(top_srcdir)/extras \
-I$(top_builddir)/extras/gudev \
-I$(top_srcdir)/extras/gudev \
-D_POSIX_PTHREAD_SEMANTICS -D_REENTRANT \
-D_GUDEV_COMPILATION \
-DG_UDEV_API_IS_SUBJECT_TO_CHANGE \
-DG_LOG_DOMAIN=\"GUdev\"
BUILT_SOURCES = \
gudevmarshal.h gudevmarshal.c \
gudevenumtypes.h gudevenumtypes.c
gudevmarshal.h: gudevmarshal.list
glib-genmarshal $< --prefix=g_udev_marshal --header > $@
gudevmarshal.c: gudevmarshal.list
echo "#include \"gudevmarshal.h\"" > $@ && \
glib-genmarshal $< --prefix=g_udev_marshal --body >> $@
gudevenumtypes.h: $(srcdir)/gudevenumtypes.h.template gudevenums.h
glib-mkenums --template $(srcdir)/gudevenumtypes.h.template gudevenums.h > \
gudevenumtypes.h.tmp && mv gudevenumtypes.h.tmp gudevenumtypes.h
gudevenumtypes.c: $(srcdir)/gudevenumtypes.c.template gudevenums.h
glib-mkenums --template $(srcdir)/gudevenumtypes.c.template gudevenums.h > \
gudevenumtypes.c.tmp && mv gudevenumtypes.c.tmp gudevenumtypes.c
lib_LTLIBRARIES = libgudev-1.0.la
libgudev_1_0_includedir=$(includedir)/gudev-1.0/gudev
libgudev_1_0_include_HEADERS = \
gudev.h \
gudevenums.h \
gudevenumtypes.h \
gudevtypes.h \
gudevclient.h \
gudevdevice.h
libgudev_1_0_la_SOURCES = \
gudevenums.h \
gudevenumtypes.h gudevenumtypes.h\
gudevtypes.h \
gudevclient.h gudevclient.c \
gudevdevice.h gudevdevice.c \
gudevprivate.h \
$(BUILT_SOURCES)
libgudev_1_0_la_CFLAGS = $(GLIB_CFLAGS)
libgudev_1_0_la_LIBADD = $(top_builddir)/libudev/libudev.la $(GLIB_LIBS)
LT_CURRENT=0
LT_REVISION=1
LT_AGE=0
libgudev_1_0_la_LDFLAGS = \
-version-info $(LT_CURRENT):$(LT_REVISION):$(LT_AGE) \
-export-dynamic -no-undefined \
-export-symbols-regex '^g_udev_.*'
pkgconfigdir = $(libdir)/pkgconfig
pkgconfig_DATA = gudev-1.0.pc
EXTRA_DIST = \
gudev-1.0.pc.in \
gudevmarshal.list \
gudevenumtypes.h.template \
gudevenumtypes.c.template
CLEANFILES = $(BUILT_SOURCES)
if ENABLE_INTROSPECTION
GUdev-1.0.gir: libgudev-1.0.la $(G_IR_SCANNER) Makefile.am
PKG_CONFIG_PATH=$(top_builddir)/data:$$PKG_CONFIG_PATH \
$(G_IR_SCANNER) -v \
--namespace GUdev \
--nsversion=1.0 \
--include=GObject-2.0 \
--library=gudev-1.0 \
--output $@ \
--pkg=glib-2.0 \
--pkg=gobject-2.0 \
-I$(top_srcdir) \
-D_GUDEV_COMPILATION \
-DG_UDEV_API_IS_SUBJECT_TO_CHANGE \
$(top_srcdir)/extras/gudev/gudev.h \
$(top_srcdir)/extras/gudev/gudevtypes.h \
$(top_srcdir)/extras/gudev/gudevenums.h \
$(top_srcdir)/extras/gudev/gudevenumtypes.h \
$(top_srcdir)/extras/gudev/gudevclient.h \
$(top_srcdir)/extras/gudev/gudevdevice.h \
$(top_srcdir)/extras/gudev/gudevclient.c \
$(top_srcdir)/extras/gudev/gudevdevice.c
girdir = $(GIRDIR)
gir_DATA = GUdev-1.0.gir
typelibsdir = $(GIRTYPELIBDIR)
typelibs_DATA = GUdev-1.0.typelib
GUdev-1.0.typelib: GUdev-1.0.gir $(G_IR_COMPILER)
g-ir-compiler GUdev-1.0.gir -o GUdev-1.0.typelib
EXTRA_DIST += GUdev-1.0.gir
CLEANFILES += $(gir_DATA) $(typelibs_DATA)
endif # ENABLE_INTROSPECTION

17
extras/gudev/docs/.gitignore vendored Normal file
View File

@ -0,0 +1,17 @@
gudev-decl-list.txt
gudev-decl.txt
gudev-overrides.txt
gudev-undeclared.txt
gudev-undocumented.txt
gudev.args
gudev.hierarchy
gudev.interfaces
gudev.prerequisites
gudev.signals
gudev.unused
html.stamp
html/*
xml/*
tmpl/*
*.stamp

View File

@ -0,0 +1,106 @@
## Process this file with automake to produce Makefile.in
# We require automake 1.10 at least.
AUTOMAKE_OPTIONS = 1.10
# This is a blank Makefile.am for using gtk-doc.
# Copy this to your project's API docs directory and modify the variables to
# suit your project. See the GTK+ Makefiles in gtk+/docs/reference for examples
# of using the various options.
# The name of the module, e.g. 'glib'.
DOC_MODULE=gudev
# Uncomment for versioned docs and specify the version of the module, e.g. '2'.
#DOC_MODULE_VERSION=2
# The top-level SGML file. You can change this if you want to.
DOC_MAIN_SGML_FILE=$(DOC_MODULE)-docs.xml
# The directory containing the source code. Relative to $(srcdir).
# gtk-doc will search all .c & .h files beneath here for inline comments
# documenting the functions and macros.
# e.g. DOC_SOURCE_DIR=../../../gtk
DOC_SOURCE_DIR=..
# Extra options to pass to gtkdoc-scangobj. Not normally needed.
SCANGOBJ_OPTIONS=
# Extra options to supply to gtkdoc-scan.
# e.g. SCAN_OPTIONS=--deprecated-guards="GTK_DISABLE_DEPRECATED"
SCAN_OPTIONS=
# Extra options to supply to gtkdoc-mkdb.
# e.g. MKDB_OPTIONS=--sgml-mode --output-format=xml
MKDB_OPTIONS=--sgml-mode --output-format=xml
# Extra options to supply to gtkdoc-mktmpl
# e.g. MKTMPL_OPTIONS=--only-section-tmpl
MKTMPL_OPTIONS=
# Extra options to supply to gtkdoc-mkhtml
MKHTML_OPTIONS=
# Extra options to supply to gtkdoc-fixref. Not normally needed.
# e.g. FIXXREF_OPTIONS=--extra-dir=../gdk-pixbuf/html --extra-dir=../gdk/html
FIXXREF_OPTIONS=
# Used for dependencies. The docs will be rebuilt if any of these change.
# e.g. HFILE_GLOB=$(top_srcdir)/gtk/*.h
# e.g. CFILE_GLOB=$(top_srcdir)/gtk/*.c
HFILE_GLOB=$(top_srcdir)/extras/gudev/*.h
CFILE_GLOB=$(top_srcdir)/extras/gudev/*.c
# Extra header to include when scanning, which are not under DOC_SOURCE_DIR
# e.g. EXTRA_HFILES=$(top_srcdir}/contrib/extra.h
EXTRA_HFILES=
# Header files to ignore when scanning. Use base file name, no paths
# e.g. IGNORE_HFILES=gtkdebug.h gtkintl.h
IGNORE_HFILES=
# Images to copy into HTML directory.
# e.g. HTML_IMAGES=$(top_srcdir)/gtk/stock-icons/stock_about_24.png
HTML_IMAGES=
# Extra SGML files that are included by $(DOC_MAIN_SGML_FILE).
# e.g. content_files=running.sgml building.sgml changes-2.0.sgml
content_files = version.xml
# SGML files where gtk-doc abbrevations (#GtkWidget) are expanded
# These files must be listed here *and* in content_files
# e.g. expand_content_files=running.sgml
expand_content_files=
# CFLAGS and LDFLAGS for compiling gtkdoc-scangobj with your library.
# Only needed if you are using gtkdoc-scangobj to dynamically query widget
# signals and properties.
# e.g. GTKDOC_CFLAGS=-I$(top_srcdir) -I$(top_builddir) $(GTK_DEBUG_FLAGS)
# e.g. GTKDOC_LIBS=$(top_builddir)/gtk/$(gtktargetlib)
GTKDOC_CFLAGS = \
$(DBUS_GLIB_CFLAGS) \
$(GLIB_CFLAGS) \
-I$(top_srcdir)/extras/gudev \
-I$(top_builddir)/extras/gudev
GTKDOC_LIBS = \
$(GLIB_LIBS) \
$(top_builddir)/extras/gudev/libgudev-1.0.la
# This includes the standard gtk-doc make rules, copied by gtkdocize.
include $(top_srcdir)/gtk-doc.make
# Other files to distribute
# e.g. EXTRA_DIST += version.xml.in
EXTRA_DIST += version.xml.in
# Files not to distribute
# for --rebuild-types in $(SCAN_OPTIONS), e.g. $(DOC_MODULE).types
# for --rebuild-sections in $(SCAN_OPTIONS) e.g. $(DOC_MODULE)-sections.txt
#DISTCLEANFILES +=
# Comment this out if you want your docs-status tested during 'make check'
if ENABLE_GTK_DOC
#TESTS_ENVIRONMENT = cd $(srcsrc)
#TESTS = $(GTKDOC_CHECK)
endif

View File

@ -0,0 +1,88 @@
<?xml version="1.0"?>
<!DOCTYPE book PUBLIC "-//OASIS//DTD DocBook XML V4.1.2//EN"
"http://www.oasis-open.org/docbook/xml/4.1.2/docbookx.dtd" [
<!ENTITY version SYSTEM "version.xml">
]>
<book id="index" xmlns:xi="http://www.w3.org/2003/XInclude">
<bookinfo>
<title>GUDev Reference Manual</title>
<releaseinfo>For GUdev version &version;</releaseinfo>
<authorgroup>
<author>
<firstname>David</firstname>
<surname>Zeuthen</surname>
<affiliation>
<address>
<email>davidz@redhat.com</email>
</address>
</affiliation>
</author>
<author>
<firstname>Bastien</firstname>
<surname>Nocera</surname>
<affiliation>
<address>
<email>hadess@hadess.net</email>
</address>
</affiliation>
</author>
</authorgroup>
<copyright>
<year>2009</year>
<holder>The GUDev Authors</holder>
</copyright>
<legalnotice>
<para>
Permission is granted to copy, distribute and/or modify this
document under the terms of the <citetitle>GNU Free
Documentation License</citetitle>, Version 1.1 or any later
version published by the Free Software Foundation with no
Invariant Sections, no Front-Cover Texts, and no Back-Cover
Texts. You may obtain a copy of the <citetitle>GNU Free
Documentation License</citetitle> from the Free Software
Foundation by visiting <ulink type="http"
url="http://www.fsf.org">their Web site</ulink> or by writing
to:
<address>
The Free Software Foundation, Inc.,
<street>59 Temple Place</street> - Suite 330,
<city>Boston</city>, <state>MA</state> <postcode>02111-1307</postcode>,
<country>USA</country>
</address>
</para>
<para>
Many of the names used by companies to distinguish their
products and services are claimed as trademarks. Where those
names appear in any freedesktop.org documentation, and those
trademarks are made aware to the members of the
freedesktop.org Project, the names have been printed in caps
or initial caps.
</para>
</legalnotice>
</bookinfo>
<reference id="ref-API">
<title>API Reference</title>
<partintro>
<para>
This part presents the class and function reference for the
<literal>libgudev</literal> library.
</para>
</partintro>
<xi:include href="xml/gudevclient.xml"/>
<xi:include href="xml/gudevdevice.xml"/>
</reference>
<chapter id="gudev-hierarchy">
<title>Object Hierarchy</title>
<xi:include href="xml/tree_index.sgml"/>
</chapter>
<index>
<title>Index</title>
</index>
</book>

View File

@ -0,0 +1,66 @@
<SECTION>
<FILE>gudevclient</FILE>
<TITLE>GUdevClient</TITLE>
GUdevClient
GUdevClientClass
GUdevDeviceType
GUdevDeviceNumber
g_udev_client_new
g_udev_client_query_by_subsystem
g_udev_client_query_by_device_number
g_udev_client_query_by_device_file
g_udev_client_query_by_sysfs_path
g_udev_client_query_by_subsystem_and_name
<SUBSECTION Standard>
G_UDEV_CLIENT
G_UDEV_IS_CLIENT
G_UDEV_TYPE_CLIENT
g_udev_client_get_type
G_UDEV_CLIENT_CLASS
G_UDEV_IS_CLIENT_CLASS
G_UDEV_CLIENT_GET_CLASS
</SECTION>
<SECTION>
<FILE>gudevdevice</FILE>
<TITLE>GUdevDevice</TITLE>
GUdevDevice
GUdevDeviceClass
g_udev_device_get_subsystem
g_udev_device_get_devtype
g_udev_device_get_name
g_udev_device_get_number
g_udev_device_get_sysfs_path
g_udev_device_get_driver
g_udev_device_get_action
g_udev_device_get_seqnum
g_udev_device_get_device_type
g_udev_device_get_device_number
g_udev_device_get_device_file
g_udev_device_get_device_file_symlinks
g_udev_device_get_parent
g_udev_device_get_parent_with_subsystem
g_udev_device_get_property_keys
g_udev_device_has_property
g_udev_device_get_property
g_udev_device_get_property_as_int
g_udev_device_get_property_as_uint64
g_udev_device_get_property_as_double
g_udev_device_get_property_as_boolean
g_udev_device_get_property_as_strv
g_udev_device_get_sysfs_attr
g_udev_device_get_sysfs_attr_as_int
g_udev_device_get_sysfs_attr_as_uint64
g_udev_device_get_sysfs_attr_as_double
g_udev_device_get_sysfs_attr_as_boolean
g_udev_device_get_sysfs_attr_as_strv
<SUBSECTION Standard>
G_UDEV_DEVICE
G_UDEV_IS_DEVICE
G_UDEV_TYPE_DEVICE
g_udev_device_get_type
G_UDEV_DEVICE_CLASS
G_UDEV_IS_DEVICE_CLASS
G_UDEV_DEVICE_GET_CLASS
</SECTION>

View File

@ -0,0 +1,3 @@
g_udev_device_type_get_type
g_udev_device_get_type
g_udev_client_get_type

View File

@ -0,0 +1 @@
@VERSION@

75
extras/gudev/gjs-example.js Executable file
View File

@ -0,0 +1,75 @@
#!/usr/bin/env gjs-console
// This currently depends on the following patches to gjs
//
// http://bugzilla.gnome.org/show_bug.cgi?id=584558
// http://bugzilla.gnome.org/show_bug.cgi?id=584560
// http://bugzilla.gnome.org/show_bug.cgi?id=584568
const GUdev = imports.gi.GUdev;
const Mainloop = imports.mainloop;
function print_device (device) {
print (" subsystem: " + device.get_subsystem ());
print (" devtype: " + device.get_devtype ());
print (" name: " + device.get_name ());
print (" number: " + device.get_number ());
print (" sysfs_path: " + device.get_sysfs_path ());
print (" driver: " + device.get_driver ());
print (" action: " + device.get_action ());
print (" seqnum: " + device.get_seqnum ());
print (" device type: " + device.get_device_type ());
print (" device number: " + device.get_device_number ());
print (" device file: " + device.get_device_file ());
print (" device file symlinks: " + device.get_device_file_symlinks ());
print (" foo: " + device.get_sysfs_attr_as_strv ("stat"));
var keys = device.get_property_keys ();
for (var n = 0; n < keys.length; n++) {
print (" " + keys[n] + "=" + device.get_property (keys[n]));
}
}
function on_uevent (client, action, device) {
print ("action " + action + " on device " + device.get_sysfs_path());
print_device (device);
print ("");
}
var client = new GUdev.Client ({subsystems: ["block", "usb/usb_interface"]});
client.connect ("uevent", on_uevent);
var block_devices = client.query_by_subsystem ("block");
for (var n = 0; n < block_devices.length; n++) {
print ("block device: " + block_devices[n].get_device_file ());
}
var d;
d = client.query_by_device_number (GUdev.DeviceType.BLOCK, 0x0810);
if (d == null) {
print ("query_by_device_number 0x810 -> null");
} else {
print ("query_by_device_number 0x810 -> " + d.get_device_file ());
var dd = d.get_parent_with_subsystem ("usb", null);
print_device (dd);
print ("--------------------------------------------------------------------------");
while (d != null) {
print_device (d);
print ("");
d = d.get_parent ();
}
}
d = client.query_by_sysfs_path ("/sys/block/sda/sda1");
print ("query_by_sysfs_path (\"/sys/block/sda1\") -> " + d.get_device_file ());
d = client.query_by_subsystem_and_name ("block", "sda2");
print ("query_by_subsystem_and_name (\"block\", \"sda2\") -> " + d.get_device_file ());
d = client.query_by_device_file ("/dev/sda");
print ("query_by_device_file (\"/dev/sda\") -> " + d.get_device_file ());
d = client.query_by_device_file ("/dev/block/8:0");
print ("query_by_device_file (\"/dev/block/8:0\") -> " + d.get_device_file ());
Mainloop.run('udev-example');

View File

@ -0,0 +1,11 @@
prefix=@prefix@
exec_prefix=@exec_prefix@
libdir=@libdir@
includedir=@includedir@
Name: gudev-1.0
Description: GObject bindings for libudev
Version: @VERSION@
Requires: glib-2.0, gobject-2.0
Libs: -L${libdir} -lgudev-1.0
Cflags: -I${includedir}/gudev-1.0

36
extras/gudev/gudev.h Normal file
View File

@ -0,0 +1,36 @@
/* -*- Mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*-
*
* Copyright (C) 2008 David Zeuthen <davidz@redhat.com>
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the
* Free Software Foundation, Inc., 59 Temple Place - Suite 330,
* Boston, MA 02111-1307, USA.
*/
#ifndef __G_UDEV_H__
#define __G_UDEV_H__
#ifndef G_UDEV_API_IS_SUBJECT_TO_CHANGE
#error GUdev is currently unstable API. You must define G_UDEV_API_IS_SUBJECT_TO_CHANGE to acknowledge this.
#endif
#define _GUDEV_INSIDE_GUDEV_H 1
#include <gudev/gudevenums.h>
#include <gudev/gudevenumtypes.h>
#include <gudev/gudevtypes.h>
#include <gudev/gudevclient.h>
#include <gudev/gudevdevice.h>
#undef _GUDEV_INSIDE_GUDEV_H
#endif /* __G_UDEV_H__ */

502
extras/gudev/gudevclient.c Normal file
View File

@ -0,0 +1,502 @@
/* -*- Mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*-
*
* Copyright (C) 2008 David Zeuthen <davidz@redhat.com>
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the
* Free Software Foundation, Inc., 59 Temple Place - Suite 330,
* Boston, MA 02111-1307, USA.
*
*/
#ifdef HAVE_CONFIG_H
# include "config.h"
#endif
#include <stdlib.h>
#include <string.h>
#include "gudevclient.h"
#include "gudevdevice.h"
#include "gudevmarshal.h"
#include "gudevprivate.h"
/**
* SECTION:gudevclient
* @short_description: Query devices and listen to uevents
*
* #GUdevClient is used to query information about devices on a Linux
* system from the Linux kernel and the udev device
* manager.
*
* Device information is retrieved from the kernel (through the
* <literal>sysfs</literal> filesystem) and the udev daemon (through a
* <literal>tmpfs</literal> filesystem) and presented through
* #GUdevDevice objects. This means that no blocking IO ever happens
* (in both cases, we are essentially just reading data from kernel
* memory) and as such there are no asynchronous versions of the
* provided methods.
*
* To get information about a device, use
* g_udev_client_query_by_subsystem(),
* g_udev_client_query_by_device_number(),
* g_udev_client_query_by_device_file(),
* g_udev_client_query_by_sysfs_path() or
* g_udev_client_query_by_subsystem_and_name().
*
* To listen to uevents, connect to the #GUdevClient::uevent signal.
*/
struct _GUdevClientPrivate
{
guint watch_id;
struct udev *udev;
struct udev_monitor *monitor;
gchar **subsystems;
};
enum
{
PROP_0,
PROP_SUBSYSTEMS,
};
enum
{
UEVENT_SIGNAL,
LAST_SIGNAL,
};
static guint signals[LAST_SIGNAL] = { 0 };
G_DEFINE_TYPE (GUdevClient, g_udev_client, G_TYPE_OBJECT)
/* ---------------------------------------------------------------------------------------------------- */
static gboolean
monitor_event (GIOChannel *source,
GIOCondition condition,
gpointer data)
{
GUdevClient *client = (GUdevClient *) data;
GUdevDevice *device;
struct udev_device *udevice;
udevice = udev_monitor_receive_device (client->priv->monitor);
if (udevice == NULL)
goto out;
device = _g_udev_device_new (udevice);
udev_device_unref (udevice);
g_signal_emit (client,
signals[UEVENT_SIGNAL],
0,
g_udev_device_get_action (device),
device);
g_object_unref (device);
out:
return TRUE;
}
static void
g_udev_client_finalize (GObject *object)
{
GUdevClient *client = G_UDEV_CLIENT (object);
if (client->priv->watch_id != 0)
{
g_source_remove (client->priv->watch_id);
client->priv->watch_id = 0;
}
if (client->priv->monitor != NULL)
{
udev_monitor_unref (client->priv->monitor);
client->priv->monitor = NULL;
}
if (client->priv->udev != NULL)
{
udev_unref (client->priv->udev);
client->priv->udev = NULL;
}
g_strfreev (client->priv->subsystems);
if (G_OBJECT_CLASS (g_udev_client_parent_class)->finalize != NULL)
G_OBJECT_CLASS (g_udev_client_parent_class)->finalize (object);
}
static void
g_udev_client_set_property (GObject *object,
guint prop_id,
const GValue *value,
GParamSpec *pspec)
{
GUdevClient *client = G_UDEV_CLIENT (object);
switch (prop_id)
{
case PROP_SUBSYSTEMS:
if (client->priv->subsystems != NULL)
g_strfreev (client->priv->subsystems);
client->priv->subsystems = g_strdupv (g_value_get_boxed (value));
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
break;
}
}
static void
g_udev_client_get_property (GObject *object,
guint prop_id,
GValue *value,
GParamSpec *pspec)
{
GUdevClient *client = G_UDEV_CLIENT (object);
switch (prop_id)
{
case PROP_SUBSYSTEMS:
g_value_set_boxed (value, client->priv->subsystems);
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
break;
}
}
static void
g_udev_client_constructed (GObject *object)
{
GUdevClient *client = G_UDEV_CLIENT (object);
GIOChannel *channel;
guint n;
client->priv->udev = udev_new ();
/* connect to event source */
client->priv->monitor = udev_monitor_new_from_netlink (client->priv->udev, "udev");
//g_debug ("ss = %p", client->priv->subsystems);
if (client->priv->subsystems != NULL)
{
/* install subsytem filters to only wake up for certain events */
for (n = 0; client->priv->subsystems[n] != NULL; n++)
{
gchar *subsystem;
gchar *devtype;
gchar *s;
subsystem = g_strdup (client->priv->subsystems[n]);
devtype = NULL;
//g_debug ("s = '%s'", subsystem);
s = strstr (subsystem, "/");
if (s != NULL)
{
devtype = s + 1;
*s = '\0';
}
udev_monitor_filter_add_match_subsystem_devtype (client->priv->monitor, subsystem, devtype);
g_free (subsystem);
}
/* listen to events, and buffer them */
udev_monitor_enable_receiving (client->priv->monitor);
channel = g_io_channel_unix_new (udev_monitor_get_fd (client->priv->monitor));
client->priv->watch_id = g_io_add_watch (channel, G_IO_IN, monitor_event, client);
g_io_channel_unref (channel);
}
if (G_OBJECT_CLASS (g_udev_client_parent_class)->constructed != NULL)
G_OBJECT_CLASS (g_udev_client_parent_class)->constructed (object);
}
static void
g_udev_client_class_init (GUdevClientClass *klass)
{
GObjectClass *gobject_class = (GObjectClass *) klass;
gobject_class->constructed = g_udev_client_constructed;
gobject_class->set_property = g_udev_client_set_property;
gobject_class->get_property = g_udev_client_get_property;
gobject_class->finalize = g_udev_client_finalize;
/**
* GUdevClient:subsystems:
*
* The subsystems to listen for uevents on.
*
* To listen for only a specific DEVTYPE for a given SUBSYSTEM, use
* "subsystem/devtype". For example, to only listen for uevents
* where SUBSYSTEM is usb and DEVTYPE is usb_interface, use
* "usb/usb_interface".
*
* If this property is %NULL, then no events will be reported. If
* it's the empty array, events from all subsystems will be
* reported.
*/
g_object_class_install_property (gobject_class,
PROP_SUBSYSTEMS,
g_param_spec_boxed ("subsystems",
"The subsystems to listen for changes on",
"The subsystems to listen for changes on",
G_TYPE_STRV,
G_PARAM_CONSTRUCT_ONLY |
G_PARAM_READWRITE));
/**
* GUdevClient::uevent:
* @client: The #GUdevClient receiving the event.
* @action: The action for the uevent e.g. "add", "remove", "change", "move", etc.
* @device: Details about the #GUdevDevice the event is for.
*
* Emitted when @client receives an uevent.
*/
signals[UEVENT_SIGNAL] = g_signal_new ("uevent",
G_TYPE_FROM_CLASS (klass),
G_SIGNAL_RUN_LAST,
G_STRUCT_OFFSET (GUdevClientClass, uevent),
NULL,
NULL,
g_udev_marshal_VOID__STRING_OBJECT,
G_TYPE_NONE,
2,
G_TYPE_STRING,
G_UDEV_TYPE_DEVICE);
g_type_class_add_private (klass, sizeof (GUdevClientPrivate));
}
static void
g_udev_client_init (GUdevClient *client)
{
client->priv = G_TYPE_INSTANCE_GET_PRIVATE (client,
G_UDEV_TYPE_CLIENT,
GUdevClientPrivate);
}
/**
* g_udev_client_new:
* @subsystems: (allow-none): A %NULL terminated string array of subsystems to listen for uevents on, %NULL to not listen on uevents at all, or an empty array to listen to uevents on all subsystems. See the documentation for the #GUdevClient:subsystems property for details on this parameter.
*
* Constructs a #GUdevClient object that can be used to query
* information about devices. Connect to the #GUdevClient::uevent
* signal to listen for uevents.
*
* Returns: A new #GUdevClient object. Free with g_object_unref().
*/
GUdevClient *
g_udev_client_new (const gchar * const *subsystems)
{
return G_UDEV_CLIENT (g_object_new (G_UDEV_TYPE_CLIENT, "subsystems", subsystems, NULL));
}
/**
* g_udev_client_query_by_subsystem:
* @client: A #GUdevClient.
* @subsystem: (allow-none): The subsystem to get devices for or %NULL to get all devices.
*
* Gets all devices belonging to @subsystem.
*
* Returns: (element-type GUdevDevice): A list of #GUdevDevice objects. The caller should free the result by using g_object_unref() on each element in the list and then g_list_free() on the list.
*/
GList *
g_udev_client_query_by_subsystem (GUdevClient *client,
const gchar *subsystem)
{
struct udev_enumerate *enumerate;
struct udev_list_entry *l, *devices;
GList *ret;
g_return_val_if_fail (G_UDEV_IS_CLIENT (client), NULL);
ret = NULL;
/* prepare a device scan */
enumerate = udev_enumerate_new (client->priv->udev);
/* filter for subsystem */
if (subsystem != NULL)
udev_enumerate_add_match_subsystem (enumerate, subsystem);
/* retrieve the list */
udev_enumerate_scan_devices (enumerate);
/* add devices to the list */
devices = udev_enumerate_get_list_entry (enumerate);
for (l = devices; l != NULL; l = udev_list_entry_get_next (l))
{
struct udev_device *udevice;
GUdevDevice *device;
udevice = udev_device_new_from_syspath (udev_enumerate_get_udev (enumerate),
udev_list_entry_get_name (l));
if (udevice == NULL)
continue;
device = _g_udev_device_new (udevice);
udev_device_unref (udevice);
ret = g_list_prepend (ret, device);
}
udev_enumerate_unref (enumerate);
ret = g_list_reverse (ret);
return ret;
}
/**
* g_udev_client_query_by_device_number:
* @client: A #GUdevClient.
* @type: A value from the #GUdevDeviceType enumeration.
* @number: A device number.
*
* Looks up a device for a type and device number.
*
* Returns: A #GUdevDevice object or %NULL if the device was not found. Free with g_object_unref().
*/
GUdevDevice *
g_udev_client_query_by_device_number (GUdevClient *client,
GUdevDeviceType type,
GUdevDeviceNumber number)
{
struct udev_device *udevice;
GUdevDevice *device;
g_return_val_if_fail (G_UDEV_IS_CLIENT (client), NULL);
device = NULL;
udevice = udev_device_new_from_devnum (client->priv->udev, type, number);
if (udevice == NULL)
goto out;
device = _g_udev_device_new (udevice);
udev_device_unref (udevice);
out:
return device;
}
/**
* g_udev_client_query_by_device_file:
* @client: A #GUdevClient.
* @device_file: A device file.
*
* Looks up a device for a device file.
*
* Returns: A #GUdevDevice object or %NULL if the device was not found. Free with g_object_unref().
*/
GUdevDevice *
g_udev_client_query_by_device_file (GUdevClient *client,
const gchar *device_file)
{
struct stat stat_buf;
GUdevDevice *device;
g_return_val_if_fail (G_UDEV_IS_CLIENT (client), NULL);
g_return_val_if_fail (device_file != NULL, NULL);
device = NULL;
if (stat (device_file, &stat_buf) != 0)
goto out;
if (stat_buf.st_rdev == 0)
goto out;
if (S_ISBLK (stat_buf.st_mode))
device = g_udev_client_query_by_device_number (client, G_UDEV_DEVICE_TYPE_BLOCK, stat_buf.st_rdev);
else if (S_ISCHR (stat_buf.st_mode))
device = g_udev_client_query_by_device_number (client, G_UDEV_DEVICE_TYPE_CHAR, stat_buf.st_rdev);
out:
return device;
}
/**
* g_udev_client_query_by_sysfs_path:
* @client: A #GUdevClient.
* @sysfs_path: A sysfs path.
*
* Looks up a device for a sysfs path.
*
* Returns: A #GUdevDevice object or %NULL if the device was not found. Free with g_object_unref().
*/
GUdevDevice *
g_udev_client_query_by_sysfs_path (GUdevClient *client,
const gchar *sysfs_path)
{
struct udev_device *udevice;
GUdevDevice *device;
g_return_val_if_fail (G_UDEV_IS_CLIENT (client), NULL);
g_return_val_if_fail (sysfs_path != NULL, NULL);
device = NULL;
udevice = udev_device_new_from_syspath (client->priv->udev, sysfs_path);
if (udevice == NULL)
goto out;
device = _g_udev_device_new (udevice);
udev_device_unref (udevice);
out:
return device;
}
/**
* g_udev_client_query_by_subsystem_and_name:
* @client: A #GUdevClient.
* @subsystem: A subsystem name.
* @name: The name of the device.
*
* Looks up a device for a subsystem and name.
*
* Returns: A #GUdevDevice object or %NULL if the device was not found. Free with g_object_unref().
*/
GUdevDevice *
g_udev_client_query_by_subsystem_and_name (GUdevClient *client,
const gchar *subsystem,
const gchar *name)
{
struct udev_device *udevice;
GUdevDevice *device;
g_return_val_if_fail (G_UDEV_IS_CLIENT (client), NULL);
g_return_val_if_fail (subsystem != NULL, NULL);
g_return_val_if_fail (name != NULL, NULL);
device = NULL;
udevice = udev_device_new_from_subsystem_sysname (client->priv->udev, subsystem, name);
if (udevice == NULL)
goto out;
device = _g_udev_device_new (udevice);
udev_device_unref (udevice);
out:
return device;
}

101
extras/gudev/gudevclient.h Normal file
View File

@ -0,0 +1,101 @@
/* -*- Mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*-
*
* Copyright (C) 2008 David Zeuthen <davidz@redhat.com>
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the
* Free Software Foundation, Inc., 59 Temple Place - Suite 330,
* Boston, MA 02111-1307, USA.
*/
#if !defined (_GUDEV_COMPILATION) && !defined(_GUDEV_INSIDE_GUDEV_H)
#error "Only <gudev/gudev.h> can be included directly, this file may disappear or change contents."
#endif
#ifndef __G_UDEV_CLIENT_H__
#define __G_UDEV_CLIENT_H__
#include <gudev/gudevtypes.h>
G_BEGIN_DECLS
#define G_UDEV_TYPE_CLIENT (g_udev_client_get_type ())
#define G_UDEV_CLIENT(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), G_UDEV_TYPE_CLIENT, GUdevClient))
#define G_UDEV_CLIENT_CLASS(k) (G_TYPE_CHECK_CLASS_CAST((k), G_UDEV_TYPE_CLIENT, GUdevClientClass))
#define G_UDEV_IS_CLIENT(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), G_UDEV_TYPE_CLIENT))
#define G_UDEV_IS_CLIENT_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), G_UDEV_TYPE_CLIENT))
#define G_UDEV_CLIENT_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS ((o), G_UDEV_TYPE_CLIENT, GUdevClientClass))
typedef struct _GUdevClientClass GUdevClientClass;
typedef struct _GUdevClientPrivate GUdevClientPrivate;
/**
* GUdevClient:
* @parent: Parent instance.
*
* The #GUdevClient struct is opaque and should not be accessed directly.
*/
struct _GUdevClient
{
GObject parent;
/*< private >*/
GUdevClientPrivate *priv;
};
/**
* GUdevClientClass:
* @parent_class: Parent class.
* @uevent: Signal class handler for the #GUdevClient::uevent signal.
*
* Class structure for #GUdevClient.
*/
struct _GUdevClientClass
{
GObjectClass parent_class;
/* signals */
void (*uevent) (GUdevClient *client,
const gchar *action,
GUdevDevice *device);
/*< private >*/
/* Padding for future expansion */
void (*reserved1) (void);
void (*reserved2) (void);
void (*reserved3) (void);
void (*reserved4) (void);
void (*reserved5) (void);
void (*reserved6) (void);
void (*reserved7) (void);
void (*reserved8) (void);
};
GType g_udev_client_get_type (void) G_GNUC_CONST;
GUdevClient *g_udev_client_new (const gchar* const *subsystems);
GList *g_udev_client_query_by_subsystem (GUdevClient *client,
const gchar *subsystem);
GUdevDevice *g_udev_client_query_by_device_number (GUdevClient *client,
GUdevDeviceType type,
GUdevDeviceNumber number);
GUdevDevice *g_udev_client_query_by_device_file (GUdevClient *client,
const gchar *device_file);
GUdevDevice *g_udev_client_query_by_sysfs_path (GUdevClient *client,
const gchar *sysfs_path);
GUdevDevice *g_udev_client_query_by_subsystem_and_name (GUdevClient *client,
const gchar *subsystem,
const gchar *name);
G_END_DECLS
#endif /* __G_UDEV_CLIENT_H__ */

891
extras/gudev/gudevdevice.c Normal file
View File

@ -0,0 +1,891 @@
/* -*- Mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*-
*
* Copyright (C) 2008 David Zeuthen <davidz@redhat.com>
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the
* Free Software Foundation, Inc., 59 Temple Place - Suite 330,
* Boston, MA 02111-1307, USA.
*
*/
#ifdef HAVE_CONFIG_H
# include "config.h"
#endif
#include <stdlib.h>
#include <string.h>
#include "gudevdevice.h"
#include "gudevprivate.h"
/**
* SECTION:gudevdevice
* @short_description: Get information about a device
*
* The #GUdevDevice class is used to get information about a specific
* device. Note that you cannot instantiate a #GUdevDevice object
* yourself. Instead you must use #GUdevClient to obtain #GUdevDevice
* objects.
*
* To get basic information about a device, use
* g_udev_device_get_subsystem(), g_udev_device_get_devtype(),
* g_udev_device_get_name(), g_udev_device_get_number(),
* g_udev_device_get_sysfs_path(), g_udev_device_get_driver(),
* g_udev_device_get_action(), g_udev_device_get_seqnum(),
* g_udev_device_get_device_type(), g_udev_device_get_device_number(),
* g_udev_device_get_device_file(),
* g_udev_device_get_device_file_symlinks().
*
* To navigate the device tree, use g_udev_device_get_parent() and
* g_udev_device_get_parent_with_subsystem().
*
* To access udev properties for the device, use
* g_udev_device_get_property_keys(),
* g_udev_device_has_property(),
* g_udev_device_get_property(),
* g_udev_device_get_property_as_int(),
* g_udev_device_get_property_as_uint64(),
* g_udev_device_get_property_as_double(),
* g_udev_device_get_property_as_boolean() and
* g_udev_device_get_property_as_strv().
*
* To access sysfs attributes for the device, use
* g_udev_device_get_sysfs_attr(),
* g_udev_device_get_sysfs_attr_as_int(),
* g_udev_device_get_sysfs_attr_as_uint64(),
* g_udev_device_get_sysfs_attr_as_double(),
* g_udev_device_get_sysfs_attr_as_boolean() and
* g_udev_device_get_sysfs_attr_as_strv().
*
* Note that all getters on #GUdevDevice are non-reffing returned
* values are owned by the object, should not be freed and are only
* valid as long as the object is alive.
*
* By design, #GUdevDevice will not react to changes for a device it
* only contains a snapshot of information when the #GUdevDevice
* object was created. To work with changes, you typically connect to
* the #GUdevClient::uevent signal on a #GUdevClient and get a new
* #GUdevDevice whenever an event happens.
*/
struct _GUdevDevicePrivate
{
struct udev_device *udevice;
/* computed ondemand and cached */
gchar **device_file_symlinks;
gchar **property_keys;
GHashTable *prop_strvs;
GHashTable *sysfs_attr_strvs;
};
G_DEFINE_TYPE (GUdevDevice, g_udev_device, G_TYPE_OBJECT)
static void
g_udev_device_finalize (GObject *object)
{
GUdevDevice *device = G_UDEV_DEVICE (object);
g_strfreev (device->priv->device_file_symlinks);
g_strfreev (device->priv->property_keys);
if (device->priv->udevice != NULL)
udev_device_unref (device->priv->udevice);
if (device->priv->prop_strvs != NULL)
g_hash_table_unref (device->priv->prop_strvs);
if (device->priv->sysfs_attr_strvs != NULL)
g_hash_table_unref (device->priv->sysfs_attr_strvs);
if (G_OBJECT_CLASS (g_udev_device_parent_class)->finalize != NULL)
(* G_OBJECT_CLASS (g_udev_device_parent_class)->finalize) (object);
}
static void
g_udev_device_class_init (GUdevDeviceClass *klass)
{
GObjectClass *gobject_class = (GObjectClass *) klass;
gobject_class->finalize = g_udev_device_finalize;
g_type_class_add_private (klass, sizeof (GUdevDevicePrivate));
}
static void
g_udev_device_init (GUdevDevice *device)
{
device->priv = G_TYPE_INSTANCE_GET_PRIVATE (device,
G_UDEV_TYPE_DEVICE,
GUdevDevicePrivate);
}
GUdevDevice *
_g_udev_device_new (struct udev_device *udevice)
{
GUdevDevice *device;
device = G_UDEV_DEVICE (g_object_new (G_UDEV_TYPE_DEVICE, NULL));
device->priv->udevice = udev_device_ref (udevice);
return device;
}
/**
* g_udev_device_get_subsystem:
* @device: A #GUdevDevice.
*
* Gets the subsystem for @device.
*
* Returns: The subsystem for @device.
*/
const gchar *
g_udev_device_get_subsystem (GUdevDevice *device)
{
g_return_val_if_fail (G_UDEV_IS_DEVICE (device), NULL);
return udev_device_get_subsystem (device->priv->udevice);
}
/**
* g_udev_device_get_devtype:
* @device: A #GUdevDevice.
*
* Gets the device type for @device.
*
* Returns: The devtype for @device.
*/
const gchar *
g_udev_device_get_devtype (GUdevDevice *device)
{
g_return_val_if_fail (G_UDEV_IS_DEVICE (device), NULL);
return udev_device_get_devtype (device->priv->udevice);
}
/**
* g_udev_device_get_name:
* @device: A #GUdevDevice.
*
* Gets the name of @device, e.g. "sda3".
*
* Returns: The name of @device.
*/
const gchar *
g_udev_device_get_name (GUdevDevice *device)
{
g_return_val_if_fail (G_UDEV_IS_DEVICE (device), NULL);
return udev_device_get_sysname (device->priv->udevice);
}
/**
* g_udev_device_get_number:
* @device: A #GUdevDevice.
*
* Gets the number of @device, e.g. "3" if g_udev_device_get_name() returns "sda3".
*
* Returns: The number of @device.
*/
const gchar *
g_udev_device_get_number (GUdevDevice *device)
{
g_return_val_if_fail (G_UDEV_IS_DEVICE (device), NULL);
return udev_device_get_sysnum (device->priv->udevice);
}
/**
* g_udev_device_get_sysfs_path:
* @device: A #GUdevDevice.
*
* Gets the sysfs path for @device.
*
* Returns: The sysfs path for @device.
*/
const gchar *
g_udev_device_get_sysfs_path (GUdevDevice *device)
{
g_return_val_if_fail (G_UDEV_IS_DEVICE (device), NULL);
return udev_device_get_syspath (device->priv->udevice);
}
/**
* g_udev_device_get_driver:
* @device: A #GUdevDevice.
*
* Gets the name of the driver used for @device.
*
* Returns: The name of the driver for @device or %NULL if unknown.
*/
const gchar *
g_udev_device_get_driver (GUdevDevice *device)
{
g_return_val_if_fail (G_UDEV_IS_DEVICE (device), NULL);
return udev_device_get_driver (device->priv->udevice);
}
/**
* g_udev_device_get_action:
* @device: A #GUdevDevice.
*
* Gets the most recent action (e.g. "add", "remove", "change", etc.) for @device.
*
* Returns: An action string.
*/
const gchar *
g_udev_device_get_action (GUdevDevice *device)
{
g_return_val_if_fail (G_UDEV_IS_DEVICE (device), NULL);
return udev_device_get_action (device->priv->udevice);
}
/**
* g_udev_device_get_seqnum:
* @device: A #GUdevDevice.
*
* Gets the most recent sequence number for @device.
*
* Returns: A sequence number.
*/
guint64
g_udev_device_get_seqnum (GUdevDevice *device)
{
g_return_val_if_fail (G_UDEV_IS_DEVICE (device), 0);
return udev_device_get_seqnum (device->priv->udevice);
}
/**
* g_udev_device_get_device_type:
* @device: A #GUdevDevice.
*
* Gets the type of the device file, if any, for @device.
*
* Returns: The device number for @device or #G_UDEV_DEVICE_TYPE_NONE if the device does not have a device file.
*/
GUdevDeviceType
g_udev_device_get_device_type (GUdevDevice *device)
{
struct stat stat_buf;
const gchar *device_file;
GUdevDeviceType type;
g_return_val_if_fail (G_UDEV_IS_DEVICE (device), G_UDEV_DEVICE_TYPE_NONE);
type = G_UDEV_DEVICE_TYPE_NONE;
/* TODO: would be better to have support for this in libudev... */
device_file = g_udev_device_get_device_file (device);
if (device_file == NULL)
goto out;
if (stat (device_file, &stat_buf) != 0)
goto out;
if (S_ISBLK (stat_buf.st_mode))
type = G_UDEV_DEVICE_TYPE_BLOCK;
else if (S_ISCHR (stat_buf.st_mode))
type = G_UDEV_DEVICE_TYPE_CHAR;
out:
return type;
}
/**
* g_udev_device_get_device_number:
* @device: A #GUdevDevice.
*
* Gets the device number, if any, for @device.
*
* Returns: The device number for @device or 0 if unknown.
*/
GUdevDeviceNumber
g_udev_device_get_device_number (GUdevDevice *device)
{
g_return_val_if_fail (G_UDEV_IS_DEVICE (device), 0);
return udev_device_get_devnum (device->priv->udevice);
}
/**
* g_udev_device_get_device_file:
* @device: A #GUdevDevice.
*
* Gets the device file for @device.
*
* Returns: The device file for @device or %NULL if no device file
* exists.
*/
const gchar *
g_udev_device_get_device_file (GUdevDevice *device)
{
g_return_val_if_fail (G_UDEV_IS_DEVICE (device), NULL);
return udev_device_get_devnode (device->priv->udevice);
}
/**
* g_udev_device_get_device_file_symlinks:
* @device: A #GUdevDevice.
*
* Gets a list of symlinks (in <literal>/dev</literal>) that points to
* the device file for @device.
*
* Returns: (transfer none) (array zero-terminated=1) (element-type utf8): A %NULL terminated string array of symlinks. This array is owned by @device and should not be freed by the caller.
*/
const gchar * const *
g_udev_device_get_device_file_symlinks (GUdevDevice *device)
{
struct udev_list_entry *l;
GPtrArray *p;
g_return_val_if_fail (G_UDEV_IS_DEVICE (device), NULL);
if (device->priv->device_file_symlinks != NULL)
goto out;
p = g_ptr_array_new ();
for (l = udev_device_get_devlinks_list_entry (device->priv->udevice); l != NULL; l = udev_list_entry_get_next (l))
{
g_ptr_array_add (p, g_strdup (udev_list_entry_get_name (l)));
}
g_ptr_array_add (p, NULL);
device->priv->device_file_symlinks = (gchar **) g_ptr_array_free (p, FALSE);
out:
return (const gchar * const *) device->priv->device_file_symlinks;
}
/* ---------------------------------------------------------------------------------------------------- */
/**
* g_udev_device_get_parent:
* @device: A #GUdevDevice.
*
* Gets the immediate parent of @device, if any.
*
* Returns: A #GUdevDevice or %NULL if @device has no parent. Free with g_object_unref().
*/
GUdevDevice *
g_udev_device_get_parent (GUdevDevice *device)
{
GUdevDevice *ret;
struct udev_device *udevice;
g_return_val_if_fail (G_UDEV_IS_DEVICE (device), NULL);
ret = NULL;
udevice = udev_device_get_parent (device->priv->udevice);
if (udevice == NULL)
goto out;
ret = _g_udev_device_new (udevice);
out:
return ret;
}
/**
* g_udev_device_get_parent_with_subsystem:
* @device: A #GUdevDevice.
* @subsystem: The subsystem of the parent to get.
* @devtype: (allow-none): The devtype of the parent to get or %NULL.
*
* Walks up the chain of parents of @device and returns the first
* device encountered where @subsystem and @devtype matches, if any.
*
* Returns: A #GUdevDevice or %NULL if @device has no parent with @subsystem and @devtype. Free with g_object_unref().
*/
GUdevDevice *
g_udev_device_get_parent_with_subsystem (GUdevDevice *device,
const gchar *subsystem,
const gchar *devtype)
{
GUdevDevice *ret;
struct udev_device *udevice;
g_return_val_if_fail (G_UDEV_IS_DEVICE (device), NULL);
g_return_val_if_fail (subsystem != NULL, NULL);
ret = NULL;
udevice = udev_device_get_parent_with_subsystem_devtype (device->priv->udevice,
subsystem,
devtype);
if (udevice == NULL)
goto out;
ret = _g_udev_device_new (udevice);
out:
return ret;
}
/* ---------------------------------------------------------------------------------------------------- */
/**
* g_udev_device_get_property_keys:
* @device: A #GUdevDevice.
*
* Gets all keys for properties on @device.
*
* Returns: (transfer none) (array zero-terminated=1) (element-type utf8): A %NULL terminated string array of property keys. This array is owned by @device and should not be freed by the caller.
*/
const gchar* const *
g_udev_device_get_property_keys (GUdevDevice *device)
{
struct udev_list_entry *l;
GPtrArray *p;
g_return_val_if_fail (G_UDEV_IS_DEVICE (device), NULL);
if (device->priv->property_keys != NULL)
goto out;
p = g_ptr_array_new ();
for (l = udev_device_get_properties_list_entry (device->priv->udevice); l != NULL; l = udev_list_entry_get_next (l))
{
g_ptr_array_add (p, g_strdup (udev_list_entry_get_name (l)));
}
g_ptr_array_add (p, NULL);
device->priv->property_keys = (gchar **) g_ptr_array_free (p, FALSE);
out:
return (const gchar * const *) device->priv->property_keys;
}
/**
* g_udev_device_has_property:
* @device: A #GUdevDevice.
* @key: Name of property.
*
* Check if a the property with the given key exists.
*
* Returns: %TRUE only if the value for @key exist.
*/
gboolean
g_udev_device_has_property (GUdevDevice *device,
const gchar *key)
{
g_return_val_if_fail (G_UDEV_IS_DEVICE (device), FALSE);
g_return_val_if_fail (key != NULL, FALSE);
return udev_device_get_property_value (device->priv->udevice, key) != NULL;
}
/**
* g_udev_device_get_property:
* @device: A #GUdevDevice.
* @key: Name of property.
*
* Look up the value for @key on @device.
*
* Returns: The value for @key or %NULL if @key doesn't exist on @device. Do not free this string, it is owned by @device.
*/
const gchar *
g_udev_device_get_property (GUdevDevice *device,
const gchar *key)
{
g_return_val_if_fail (G_UDEV_IS_DEVICE (device), NULL);
g_return_val_if_fail (key != NULL, NULL);
return udev_device_get_property_value (device->priv->udevice, key);
}
/**
* g_udev_device_get_property_as_int:
* @device: A #GUdevDevice.
* @key: Name of property.
*
* Look up the value for @key on @device and convert it to an integer
* using strtol().
*
* Returns: The value for @key or 0 if @key doesn't exist or
* isn't an integer.
*/
gint
g_udev_device_get_property_as_int (GUdevDevice *device,
const gchar *key)
{
gint result;
const gchar *s;
g_return_val_if_fail (G_UDEV_IS_DEVICE (device), 0);
g_return_val_if_fail (key != NULL, 0);
result = 0;
s = g_udev_device_get_property (device, key);
if (s == NULL)
goto out;
result = strtol (s, NULL, 0);
out:
return result;
}
/**
* g_udev_device_get_property_as_uint64:
* @device: A #GUdevDevice.
* @key: Name of property.
*
* Look up the value for @key on @device and convert it to an unsigned
* 64-bit integer using strtoll().
*
* Returns: The value for @key or 0 if @key doesn't exist or isn't a
* #guint64.
*/
guint64
g_udev_device_get_property_as_uint64 (GUdevDevice *device,
const gchar *key)
{
guint64 result;
const gchar *s;
g_return_val_if_fail (G_UDEV_IS_DEVICE (device), 0);
g_return_val_if_fail (key != NULL, 0);
result = 0;
s = g_udev_device_get_property (device, key);
if (s == NULL)
goto out;
result = strtoll (s, NULL, 0);
out:
return result;
}
/**
* g_udev_device_get_property_as_double:
* @device: A #GUdevDevice.
* @key: Name of property.
*
* Look up the value for @key on @device and convert it to a double
* precision floating point number using strtod().
*
* Returns: The value for @key or 0.0 if @key doesn't exist or isn't a
* #gdouble.
*/
gdouble
g_udev_device_get_property_as_double (GUdevDevice *device,
const gchar *key)
{
gdouble result;
const gchar *s;
g_return_val_if_fail (G_UDEV_IS_DEVICE (device), 0.0);
g_return_val_if_fail (key != NULL, 0.0);
result = 0.0;
s = g_udev_device_get_property (device, key);
if (s == NULL)
goto out;
result = strtod (s, NULL);
out:
return result;
}
/**
* g_udev_device_get_property_as_boolean:
* @device: A #GUdevDevice.
* @key: Name of property.
*
* Look up the value for @key on @device and convert it to an
* boolean. This is done by doing a case-insensitive string comparison
* on the string value against "1" and "true".
*
* Returns: The value for @key or %FALSE if @key doesn't exist or
* isn't a #gboolean.
*/
gboolean
g_udev_device_get_property_as_boolean (GUdevDevice *device,
const gchar *key)
{
gboolean result;
const gchar *s;
g_return_val_if_fail (G_UDEV_IS_DEVICE (device), FALSE);
g_return_val_if_fail (key != NULL, FALSE);
result = FALSE;
s = g_udev_device_get_property (device, key);
if (s == NULL)
goto out;
if (strcmp (s, "1") == 0 || g_ascii_strcasecmp (s, "true") == 0)
result = TRUE;
out:
return result;
}
static gchar **
split_at_whitespace (const gchar *s)
{
gchar **result;
guint n;
guint m;
result = g_strsplit_set (s, " \v\t\r\n", 0);
/* remove empty strings, thanks GLib */
for (n = 0; result[n] != NULL; n++)
{
if (strlen (result[n]) == 0)
{
g_free (result[n]);
for (m = n; result[m] != NULL; m++)
result[m] = result[m + 1];
n--;
}
}
return result;
}
/**
* g_udev_device_get_property_as_strv:
* @device: A #GUdevDevice.
* @key: Name of property.
*
* Look up the value for @key on @device and return the result of
* splitting it into non-empty tokens split at white space (only space
* (' '), form-feed ('\f'), newline ('\n'), carriage return ('\r'),
* horizontal tab ('\t'), and vertical tab ('\v') are considered; the
* locale is not taken into account).
*
* Returns: (transfer none) (array zero-terminated=1) (element-type utf8): The value of @key on @device split into tokens or %NULL if @key doesn't exist. This array is owned by @device and should not be freed by the caller.
*/
const gchar* const *
g_udev_device_get_property_as_strv (GUdevDevice *device,
const gchar *key)
{
gchar **result;
const gchar *s;
g_return_val_if_fail (G_UDEV_IS_DEVICE (device), NULL);
g_return_val_if_fail (key != NULL, NULL);
if (device->priv->prop_strvs != NULL)
{
result = g_hash_table_lookup (device->priv->prop_strvs, key);
if (result != NULL)
goto out;
}
result = NULL;
s = g_udev_device_get_property (device, key);
if (s == NULL)
goto out;
result = split_at_whitespace (s);
if (result == NULL)
goto out;
if (device->priv->prop_strvs == NULL)
device->priv->prop_strvs = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, (GDestroyNotify) g_strfreev);
g_hash_table_insert (device->priv->prop_strvs, g_strdup (key), result);
out:
return (const gchar* const *) result;
}
/* ---------------------------------------------------------------------------------------------------- */
/**
* g_udev_device_get_sysfs_attr:
* @device: A #GUdevDevice.
* @name: Name of the sysfs attribute.
*
* Look up the sysfs attribute with @name on @device.
*
* Returns: The value of the sysfs attribute or %NULL if there is no
* such attribute. Do not free this string, it is owned by @device.
*/
const gchar *
g_udev_device_get_sysfs_attr (GUdevDevice *device,
const gchar *name)
{
g_return_val_if_fail (G_UDEV_IS_DEVICE (device), NULL);
g_return_val_if_fail (name != NULL, NULL);
return udev_device_get_sysattr_value (device->priv->udevice, name);
}
/**
* g_udev_device_get_sysfs_attr_as_int:
* @device: A #GUdevDevice.
* @name: Name of the sysfs attribute.
*
* Look up the sysfs attribute with @name on @device and convert it to an integer
* using strtol().
*
* Returns: The value of the sysfs attribute or 0 if there is no such
* attribute.
*/
gint
g_udev_device_get_sysfs_attr_as_int (GUdevDevice *device,
const gchar *name)
{
gint result;
const gchar *s;
g_return_val_if_fail (G_UDEV_IS_DEVICE (device), 0);
g_return_val_if_fail (name != NULL, 0);
result = 0;
s = g_udev_device_get_sysfs_attr (device, name);
if (s == NULL)
goto out;
result = strtol (s, NULL, 0);
out:
return result;
}
/**
* g_udev_device_get_sysfs_attr_as_uint64:
* @device: A #GUdevDevice.
* @name: Name of the sysfs attribute.
*
* Look up the sysfs attribute with @name on @device and convert it to an unsigned
* 64-bit integer using strtoll().
*
* Returns: The value of the sysfs attribute or 0 if there is no such
* attribute.
*/
guint64
g_udev_device_get_sysfs_attr_as_uint64 (GUdevDevice *device,
const gchar *name)
{
guint64 result;
const gchar *s;
g_return_val_if_fail (G_UDEV_IS_DEVICE (device), 0);
g_return_val_if_fail (name != NULL, 0);
result = 0;
s = g_udev_device_get_sysfs_attr (device, name);
if (s == NULL)
goto out;
result = strtoll (s, NULL, 0);
out:
return result;
}
/**
* g_udev_device_get_sysfs_attr_as_double:
* @device: A #GUdevDevice.
* @name: Name of the sysfs attribute.
*
* Look up the sysfs attribute with @name on @device and convert it to a double
* precision floating point number using strtod().
*
* Returns: The value of the sysfs attribute or 0.0 if there is no such
* attribute.
*/
gdouble
g_udev_device_get_sysfs_attr_as_double (GUdevDevice *device,
const gchar *name)
{
gdouble result;
const gchar *s;
g_return_val_if_fail (G_UDEV_IS_DEVICE (device), 0.0);
g_return_val_if_fail (name != NULL, 0.0);
result = 0.0;
s = g_udev_device_get_sysfs_attr (device, name);
if (s == NULL)
goto out;
result = strtod (s, NULL);
out:
return result;
}
/**
* g_udev_device_get_sysfs_attr_as_boolean:
* @device: A #GUdevDevice.
* @name: Name of the sysfs attribute.
*
* Look up the sysfs attribute with @name on @device and convert it to an
* boolean. This is done by doing a case-insensitive string comparison
* on the string value against "1" and "true".
*
* Returns: The value of the sysfs attribute or %FALSE if there is no such
* attribute.
*/
gboolean
g_udev_device_get_sysfs_attr_as_boolean (GUdevDevice *device,
const gchar *name)
{
gboolean result;
const gchar *s;
g_return_val_if_fail (G_UDEV_IS_DEVICE (device), FALSE);
g_return_val_if_fail (name != NULL, FALSE);
result = FALSE;
s = g_udev_device_get_sysfs_attr (device, name);
if (s == NULL)
goto out;
if (strcmp (s, "1") == 0 || g_ascii_strcasecmp (s, "true") == 0)
result = TRUE;
out:
return result;
}
/**
* g_udev_device_get_sysfs_attr_as_strv:
* @device: A #GUdevDevice.
* @name: Name of the sysfs attribute.
*
* Look up the sysfs attribute with @name on @device and return the result of
* splitting it into non-empty tokens split at white space (only space (' '),
* form-feed ('\f'), newline ('\n'), carriage return ('\r'), horizontal
* tab ('\t'), and vertical tab ('\v') are considered; the locale is
* not taken into account).
*
* Returns: (transfer none) (array zero-terminated=1) (element-type utf8): The value of the sysfs attribute split into tokens or %NULL if there is no such attribute. This array is owned by @device and should not be freed by the caller.
*/
const gchar * const *
g_udev_device_get_sysfs_attr_as_strv (GUdevDevice *device,
const gchar *name)
{
gchar **result;
const gchar *s;
g_return_val_if_fail (G_UDEV_IS_DEVICE (device), NULL);
g_return_val_if_fail (name != NULL, NULL);
if (device->priv->sysfs_attr_strvs != NULL)
{
result = g_hash_table_lookup (device->priv->sysfs_attr_strvs, name);
if (result != NULL)
goto out;
}
result = NULL;
s = g_udev_device_get_sysfs_attr (device, name);
if (s == NULL)
goto out;
result = split_at_whitespace (s);
if (result == NULL)
goto out;
if (device->priv->sysfs_attr_strvs == NULL)
device->priv->sysfs_attr_strvs = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, (GDestroyNotify) g_strfreev);
g_hash_table_insert (device->priv->sysfs_attr_strvs, g_strdup (name), result);
out:
return (const gchar* const *) result;
}

126
extras/gudev/gudevdevice.h Normal file
View File

@ -0,0 +1,126 @@
/* -*- Mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*-
*
* Copyright (C) 2008 David Zeuthen <davidz@redhat.com>
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the
* Free Software Foundation, Inc., 59 Temple Place - Suite 330,
* Boston, MA 02111-1307, USA.
*/
#if !defined (_GUDEV_COMPILATION) && !defined(_GUDEV_INSIDE_GUDEV_H)
#error "Only <gudev/gudev.h> can be included directly, this file may disappear or change contents."
#endif
#ifndef __G_UDEV_DEVICE_H__
#define __G_UDEV_DEVICE_H__
#include <gudev/gudevtypes.h>
G_BEGIN_DECLS
#define G_UDEV_TYPE_DEVICE (g_udev_device_get_type ())
#define G_UDEV_DEVICE(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), G_UDEV_TYPE_DEVICE, GUdevDevice))
#define G_UDEV_DEVICE_CLASS(k) (G_TYPE_CHECK_CLASS_CAST((k), G_UDEV_TYPE_DEVICE, GUdevDeviceClass))
#define G_UDEV_IS_DEVICE(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), G_UDEV_TYPE_DEVICE))
#define G_UDEV_IS_DEVICE_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), G_UDEV_TYPE_DEVICE))
#define G_UDEV_DEVICE_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS ((o), G_UDEV_TYPE_DEVICE, GUdevDeviceClass))
typedef struct _GUdevDeviceClass GUdevDeviceClass;
typedef struct _GUdevDevicePrivate GUdevDevicePrivate;
/**
* GUdevDevice:
* @parent: Parent instance.
*
* The #GUdevDevice struct is opaque and should not be accessed directly.
*/
struct _GUdevDevice
{
GObject parent;
/*< private >*/
GUdevDevicePrivate *priv;
};
/**
* GUdevDeviceClass:
* @parent_class: Parent class.
*
* Class structure for #GUdevDevice.
*/
struct _GUdevDeviceClass
{
GObjectClass parent_class;
/*< private >*/
/* Padding for future expansion */
void (*reserved1) (void);
void (*reserved2) (void);
void (*reserved3) (void);
void (*reserved4) (void);
void (*reserved5) (void);
void (*reserved6) (void);
void (*reserved7) (void);
void (*reserved8) (void);
};
GType g_udev_device_get_type (void) G_GNUC_CONST;
const gchar *g_udev_device_get_subsystem (GUdevDevice *device);
const gchar *g_udev_device_get_devtype (GUdevDevice *device);
const gchar *g_udev_device_get_name (GUdevDevice *device);
const gchar *g_udev_device_get_number (GUdevDevice *device);
const gchar *g_udev_device_get_sysfs_path (GUdevDevice *device);
const gchar *g_udev_device_get_driver (GUdevDevice *device);
const gchar *g_udev_device_get_action (GUdevDevice *device);
guint64 g_udev_device_get_seqnum (GUdevDevice *device);
GUdevDeviceType g_udev_device_get_device_type (GUdevDevice *device);
GUdevDeviceNumber g_udev_device_get_device_number (GUdevDevice *device);
const gchar *g_udev_device_get_device_file (GUdevDevice *device);
const gchar* const *g_udev_device_get_device_file_symlinks (GUdevDevice *device);
GUdevDevice *g_udev_device_get_parent (GUdevDevice *device);
GUdevDevice *g_udev_device_get_parent_with_subsystem (GUdevDevice *device,
const gchar *subsystem,
const gchar *devtype);
const gchar* const *g_udev_device_get_property_keys (GUdevDevice *device);
gboolean g_udev_device_has_property (GUdevDevice *device,
const gchar *key);
const gchar *g_udev_device_get_property (GUdevDevice *device,
const gchar *key);
gint g_udev_device_get_property_as_int (GUdevDevice *device,
const gchar *key);
guint64 g_udev_device_get_property_as_uint64 (GUdevDevice *device,
const gchar *key);
gdouble g_udev_device_get_property_as_double (GUdevDevice *device,
const gchar *key);
gboolean g_udev_device_get_property_as_boolean (GUdevDevice *device,
const gchar *key);
const gchar* const *g_udev_device_get_property_as_strv (GUdevDevice *device,
const gchar *key);
const gchar *g_udev_device_get_sysfs_attr (GUdevDevice *device,
const gchar *name);
gint g_udev_device_get_sysfs_attr_as_int (GUdevDevice *device,
const gchar *name);
guint64 g_udev_device_get_sysfs_attr_as_uint64 (GUdevDevice *device,
const gchar *name);
gdouble g_udev_device_get_sysfs_attr_as_double (GUdevDevice *device,
const gchar *name);
gboolean g_udev_device_get_sysfs_attr_as_boolean (GUdevDevice *device,
const gchar *name);
const gchar* const *g_udev_device_get_sysfs_attr_as_strv (GUdevDevice *device,
const gchar *name);
G_END_DECLS
#endif /* __G_UDEV_DEVICE_H__ */

49
extras/gudev/gudevenums.h Normal file
View File

@ -0,0 +1,49 @@
/* -*- Mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*-
*
* Copyright (C) 2008 David Zeuthen <davidz@redhat.com>
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the
* Free Software Foundation, Inc., 59 Temple Place - Suite 330,
* Boston, MA 02111-1307, USA.
*/
#if !defined (_GUDEV_COMPILATION) && !defined(_GUDEV_INSIDE_GUDEV_H)
#error "Only <gudev/gudev.h> can be included directly, this file may disappear or change contents."
#endif
#ifndef __G_UDEV_ENUMS_H__
#define __G_UDEV_ENUMS_H__
#include <glib-object.h>
G_BEGIN_DECLS
/**
* GUdevDeviceType:
* @G_UDEV_DEVICE_TYPE_NONE: Device does not have a device file.
* @G_UDEV_DEVICE_TYPE_BLOCK: Device is a block device.
* @G_UDEV_DEVICE_TYPE_CHAR: Device is a character device.
*
* Enumeration used to specify a the type of a device.
*/
typedef enum
{
G_UDEV_DEVICE_TYPE_NONE = 0,
G_UDEV_DEVICE_TYPE_BLOCK = 'b',
G_UDEV_DEVICE_TYPE_CHAR = 'c',
} GUdevDeviceType;
G_END_DECLS
#endif /* __G_UDEV_ENUMS_H__ */

View File

@ -0,0 +1,39 @@
/*** BEGIN file-header ***/
#include <gudev.h>
/*** END file-header ***/
/*** BEGIN file-production ***/
/* enumerations from "@filename@" */
/*** END file-production ***/
/*** BEGIN value-header ***/
GType
@enum_name@_get_type (void)
{
static volatile gsize g_define_type_id__volatile = 0;
if (g_once_init_enter (&g_define_type_id__volatile))
{
static const G@Type@Value values[] = {
/*** END value-header ***/
/*** BEGIN value-production ***/
{ @VALUENAME@, "@VALUENAME@", "@valuenick@" },
/*** END value-production ***/
/*** BEGIN value-tail ***/
{ 0, NULL, NULL }
};
GType g_define_type_id =
g_@type@_register_static (g_intern_static_string ("@EnumName@"), values);
g_once_init_leave (&g_define_type_id__volatile, g_define_type_id);
}
return g_define_type_id__volatile;
}
/*** END value-tail ***/
/*** BEGIN file-tail ***/
/*** END file-tail ***/

View File

@ -0,0 +1,24 @@
/*** BEGIN file-header ***/
#ifndef __GUDEV_ENUM_TYPES_H__
#define __GUDEV_ENUM_TYPES_H__
#include <glib-object.h>
G_BEGIN_DECLS
/*** END file-header ***/
/*** BEGIN file-production ***/
/* enumerations from "@filename@" */
/*** END file-production ***/
/*** BEGIN value-header ***/
GType @enum_name@_get_type (void) G_GNUC_CONST;
#define @ENUMPREFIX@_TYPE_@ENUMSHORT@ (@enum_name@_get_type ())
/*** END value-header ***/
/*** BEGIN file-tail ***/
G_END_DECLS
#endif /* __GUDEV_ENUM_TYPES_H__ */
/*** END file-tail ***/

View File

@ -0,0 +1 @@
VOID:STRING,OBJECT

View File

@ -0,0 +1,40 @@
/* -*- Mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*-
*
* Copyright (C) 2008 David Zeuthen <davidz@redhat.com>
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the
* Free Software Foundation, Inc., 59 Temple Place - Suite 330,
* Boston, MA 02111-1307, USA.
*/
#if !defined (_GUDEV_COMPILATION) && !defined(_GUDEV_INSIDE_GUDEV_H)
#error "Only <gudev/gudev.h> can be included directly, this file may disappear or change contents."
#endif
#ifndef __G_UDEV_PRIVATE_H__
#define __G_UDEV_PRIVATE_H__
#include <gudev/gudevtypes.h>
#define LIBUDEV_I_KNOW_THE_API_IS_SUBJECT_TO_CHANGE 1
#include <libudev.h>
G_BEGIN_DECLS
GUdevDevice *
_g_udev_device_new (struct udev_device *udevice);
G_END_DECLS
#endif /* __G_UDEV_PRIVATE_H__ */

45
extras/gudev/gudevtypes.h Normal file
View File

@ -0,0 +1,45 @@
/* -*- Mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*-
*
* Copyright (C) 2008 David Zeuthen <davidz@redhat.com>
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the
* Free Software Foundation, Inc., 59 Temple Place - Suite 330,
* Boston, MA 02111-1307, USA.
*/
#if !defined (_GUDEV_COMPILATION) && !defined(_GUDEV_INSIDE_GUDEV_H)
#error "Only <gudev/gudev.h> can be included directly, this file may disappear or change contents."
#endif
#ifndef __G_UDEV_TYPES_H__
#define __G_UDEV_TYPES_H__
#include <gudev/gudevenums.h>
G_BEGIN_DECLS
typedef struct _GUdevClient GUdevClient;
typedef struct _GUdevDevice GUdevDevice;
/**
* GUdevDeviceNumber:
*
* Corresponds to the standard #dev_t type as defined by POSIX (Until
* bug 584517 is resolved this is aliased to an integer).
*/
typedef int GUdevDeviceNumber;
G_END_DECLS
#endif /* __G_UDEV_TYPES_H__ */

72
extras/gudev/seed-example.js Executable file
View File

@ -0,0 +1,72 @@
#!/usr/bin/env seed
// seed example
const GLib = imports.gi.GLib;
const GUdev = imports.gi.GUdev;
function print_device (device) {
print (" subsystem: " + device.get_subsystem ());
print (" devtype: " + device.get_devtype ());
print (" name: " + device.get_name ());
print (" number: " + device.get_number ());
print (" sysfs_path: " + device.get_sysfs_path ());
print (" driver: " + device.get_driver ());
print (" action: " + device.get_action ());
print (" seqnum: " + device.get_seqnum ());
print (" device type: " + device.get_device_type ());
print (" device number: " + device.get_device_number ());
print (" device file: " + device.get_device_file ());
print (" device file symlinks: " + device.get_device_file_symlinks ());
print (" foo: " + device.get_sysfs_attr_as_strv ("stat"));
var keys = device.get_property_keys ();
for (var n = 0; n < keys.length; n++) {
print (" " + keys[n] + "=" + device.get_property (keys[n]));
}
}
function on_uevent (client, action, device) {
print ("action " + action + " on device " + device.get_sysfs_path());
print_device (device);
print ("");
}
var client = new GUdev.Client ({subsystems: ["block", "usb/usb_interface"]});
client.signal.connect ("uevent", on_uevent);
var block_devices = client.query_by_subsystem ("block");
for (var n = 0; n < block_devices.length; n++) {
print ("block device: " + block_devices[n].get_device_file ());
}
var d;
d = client.query_by_device_number (GUdev.DeviceType.BLOCK, 0x0810);
if (d == null) {
print ("query_by_device_number 0x810 -> null");
} else {
print ("query_by_device_number 0x810 -> " + d.get_device_file ());
dd = d.get_parent_with_subsystem ("usb", null);
print_device (dd);
print ("--------------------------------------------------------------------------");
while (d != null) {
print_device (d);
print ("");
d = d.get_parent ();
}
}
d = client.query_by_sysfs_path ("/sys/block/sda/sda1");
print ("query_by_sysfs_path (\"/sys/block/sda1\") -> " + d.get_device_file ());
d = client.query_by_subsystem_and_name ("block", "sda2");
print ("query_by_subsystem_and_name (\"block\", \"sda2\") -> " + d.get_device_file ());
d = client.query_by_device_file ("/dev/sda");
print ("query_by_device_file (\"/dev/sda\") -> " + d.get_device_file ());
d = client.query_by_device_file ("/dev/block/8:0");
print ("query_by_device_file (\"/dev/block/8:0\") -> " + d.get_device_file ());
var mainloop = GLib.main_loop_new ();
GLib.main_loop_run (mainloop);