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:
parent
af23b83ea7
commit
bf05675a20
@ -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/
|
||||
|
20
configure.ac
20
configure.ac
@ -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}
|
||||
])
|
||||
|
@ -15,5 +15,6 @@ SUBDIRS = \
|
||||
|
||||
if ENABLE_EXTRAS
|
||||
SUBDIRS += \
|
||||
udev-acl
|
||||
udev-acl \
|
||||
gudev
|
||||
endif
|
||||
|
8
extras/gudev/.gitignore
vendored
Normal file
8
extras/gudev/.gitignore
vendored
Normal 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
115
extras/gudev/Makefile.am
Normal 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
17
extras/gudev/docs/.gitignore
vendored
Normal 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
|
||||
|
106
extras/gudev/docs/Makefile.am
Normal file
106
extras/gudev/docs/Makefile.am
Normal 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
|
88
extras/gudev/docs/gudev-docs.xml
Normal file
88
extras/gudev/docs/gudev-docs.xml
Normal 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>
|
66
extras/gudev/docs/gudev-sections.txt
Normal file
66
extras/gudev/docs/gudev-sections.txt
Normal 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>
|
||||
|
3
extras/gudev/docs/gudev.types
Normal file
3
extras/gudev/docs/gudev.types
Normal file
@ -0,0 +1,3 @@
|
||||
g_udev_device_type_get_type
|
||||
g_udev_device_get_type
|
||||
g_udev_client_get_type
|
1
extras/gudev/docs/version.xml.in
Normal file
1
extras/gudev/docs/version.xml.in
Normal file
@ -0,0 +1 @@
|
||||
@VERSION@
|
75
extras/gudev/gjs-example.js
Executable file
75
extras/gudev/gjs-example.js
Executable 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');
|
11
extras/gudev/gudev-1.0.pc.in
Normal file
11
extras/gudev/gudev-1.0.pc.in
Normal 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
36
extras/gudev/gudev.h
Normal 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
502
extras/gudev/gudevclient.c
Normal 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
101
extras/gudev/gudevclient.h
Normal 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
891
extras/gudev/gudevdevice.c
Normal 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
126
extras/gudev/gudevdevice.h
Normal 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
49
extras/gudev/gudevenums.h
Normal 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__ */
|
39
extras/gudev/gudevenumtypes.c.template
Normal file
39
extras/gudev/gudevenumtypes.c.template
Normal 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 ***/
|
24
extras/gudev/gudevenumtypes.h.template
Normal file
24
extras/gudev/gudevenumtypes.h.template
Normal 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 ***/
|
1
extras/gudev/gudevmarshal.list
Normal file
1
extras/gudev/gudevmarshal.list
Normal file
@ -0,0 +1 @@
|
||||
VOID:STRING,OBJECT
|
40
extras/gudev/gudevprivate.h
Normal file
40
extras/gudev/gudevprivate.h
Normal 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
45
extras/gudev/gudevtypes.h
Normal 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
72
extras/gudev/seed-example.js
Executable 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);
|
Loading…
Reference in New Issue
Block a user