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:
|
doc-sync:
|
||||||
rsync -av --delete libudev/docs/html/ master.kernel.org:/pub/linux/utils/kernel/hotplug/libudev/
|
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
|
fi
|
||||||
AM_CONDITIONAL([ENABLE_EXTRAS], [test "x$enable_extras" = xyes])
|
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_HEADERS(config.h)
|
||||||
AC_CONFIG_FILES([
|
AC_CONFIG_FILES([
|
||||||
Makefile
|
Makefile
|
||||||
|
@ -90,6 +104,10 @@ AC_CONFIG_FILES([
|
||||||
extras/scsi_id/Makefile
|
extras/scsi_id/Makefile
|
||||||
extras/usb_id/Makefile
|
extras/usb_id/Makefile
|
||||||
extras/udev-acl/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
|
AC_OUTPUT
|
||||||
|
@ -100,6 +118,7 @@ AC_MSG_RESULT([
|
||||||
prefix: ${prefix}
|
prefix: ${prefix}
|
||||||
exec_prefix: ${exec_prefix}
|
exec_prefix: ${exec_prefix}
|
||||||
udev_prefix: ${udev_prefix}
|
udev_prefix: ${udev_prefix}
|
||||||
|
libdir: ${libdir}
|
||||||
libdir_name: ${libdir_name}
|
libdir_name: ${libdir_name}
|
||||||
datarootdir: ${datarootdir}
|
datarootdir: ${datarootdir}
|
||||||
mandir: ${mandir}
|
mandir: ${mandir}
|
||||||
|
@ -114,6 +133,7 @@ AC_MSG_RESULT([
|
||||||
ldflags: ${LDFLAGS}
|
ldflags: ${LDFLAGS}
|
||||||
|
|
||||||
extras: ${enable_extras}
|
extras: ${enable_extras}
|
||||||
|
gintrospection: ${enable_introspection}
|
||||||
|
|
||||||
xsltproc: ${XSLTPROC}
|
xsltproc: ${XSLTPROC}
|
||||||
])
|
])
|
||||||
|
|
|
@ -15,5 +15,6 @@ SUBDIRS = \
|
||||||
|
|
||||||
if ENABLE_EXTRAS
|
if ENABLE_EXTRAS
|
||||||
SUBDIRS += \
|
SUBDIRS += \
|
||||||
udev-acl
|
udev-acl \
|
||||||
|
gudev
|
||||||
endif
|
endif
|
||||||
|
|
|
@ -0,0 +1,8 @@
|
||||||
|
gtk-doc.make
|
||||||
|
docs/version.xml
|
||||||
|
gudev-1.0.pc
|
||||||
|
gudevenumtypes.c
|
||||||
|
gudevenumtypes.h
|
||||||
|
gudevmarshal.c
|
||||||
|
gudevmarshal.h
|
||||||
|
|
|
@ -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
|
|
@ -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
|
||||||
|
|
|
@ -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
|
|
@ -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>
|
|
@ -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>
|
||||||
|
|
|
@ -0,0 +1,3 @@
|
||||||
|
g_udev_device_type_get_type
|
||||||
|
g_udev_device_get_type
|
||||||
|
g_udev_client_get_type
|
|
@ -0,0 +1 @@
|
||||||
|
@VERSION@
|
|
@ -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');
|
|
@ -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
|
|
@ -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__ */
|
|
@ -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;
|
||||||
|
}
|
||||||
|
|
|
@ -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__ */
|
|
@ -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;
|
||||||
|
}
|
|
@ -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__ */
|
|
@ -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__ */
|
|
@ -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 ***/
|
|
@ -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 ***/
|
|
@ -0,0 +1 @@
|
||||||
|
VOID:STRING,OBJECT
|
|
@ -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__ */
|
|
@ -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__ */
|
|
@ -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