Skip to contentSkip to conversation

ConnMan improvements and misc fixes

PATCH In review Otavio Salvador 2 participants 7 messages Dec 9, 2011

lore
Share & tools
lore
#0 lore raw

cover ConnMan improvements and misc fixes

The following changes since commit 4a13766c7b223d82e8cf682db999a135d2b8412c:

gtk.inc: ship gtk-demo to independent package (2011-12-08 16:58:41 +0000)

are available in the git repository at:
git://github.com/OSSystems/oe-core master
https://github.com/OSSystems/oe-core/tree/HEAD

Otavio Salvador (5):
dosfstools: update native to 2.11 scripts/send-pull-request: allow sending of patches without a cover
letter
connman: drop git version
connman: move files from connman-0.75 to connman dir
connman: update to 0.78

 .../connman/connman-0.75/dbusperms.patch           |   14 ---
 .../connman/connman-0.75/xtables_version.patch     |   64 -------------
 meta/recipes-connectivity/connman/connman.inc      |   96 ++++++++++++++------
 .../add_xuser_dbus_permission.patch                |    0
 .../connman/{connman-0.75 => connman}/connman      |    0
 meta/recipes-connectivity/connman/connman_0.75.bb  |   29 ------
 meta/recipes-connectivity/connman/connman_0.78.bb  |   10 ++
 meta/recipes-connectivity/connman/connman_git.bb   |   11 ---
 .../dosfstools/dosfstools-native_2.10.bb           |   19 ----
 .../dosfstools/dosfstools/2.6.20-syscall.patch     |   72 ---------------
 .../dosfstools/dosfstools-2.10-kernel-2.6.patch    |   74 ---------------
 .../dosfstools/dosfstools/mkdosfs-bootcode.patch   |   68 +++++++--------
 .../dosfstools/dosfstools/mkdosfs-dir.patch        |   62 ++++++-------
 .../recipes-devtools/dosfstools/dosfstools_2.10.bb |   24 -----
 .../recipes-devtools/dosfstools/dosfstools_2.11.bb |   11 ++-
 scripts/send-pull-request                          |   21 +++--
 16 files changed, 160 insertions(+), 415 deletions(-)
 delete mode 100644 meta/recipes-connectivity/connman/connman-0.75/dbusperms.patch
 delete mode 100644 meta/recipes-connectivity/connman/connman-0.75/xtables_version.patch
 rename meta/recipes-connectivity/connman/{connman-0.75 => connman}/add_xuser_dbus_permission.patch (100%)
 rename meta/recipes-connectivity/connman/{connman-0.75 => connman}/connman (100%)
 delete mode 100644 meta/recipes-connectivity/connman/connman_0.75.bb
 create mode 100644 meta/recipes-connectivity/connman/connman_0.78.bb
 delete mode 100644 meta/recipes-connectivity/connman/connman_git.bb
 delete mode 100644 meta/recipes-devtools/dosfstools/dosfstools-native_2.10.bb
 delete mode 100644 meta/recipes-devtools/dosfstools/dosfstools/2.6.20-syscall.patch
 delete mode 100644 meta/recipes-devtools/dosfstools/dosfstools/dosfstools-2.10-kernel-2.6.patch
 delete mode 100644 meta/recipes-devtools/dosfstools/dosfstools_2.10.bb
Signature · 1 line
1.7.2.5
#1 lore raw

PATCH 1/5 dosfstools: update native to 2.11

This unify recipes for target and native builds and also drops the the already merged patches.

---
 .../dosfstools/dosfstools-native_2.10.bb           |   19 -----
 .../dosfstools/dosfstools/2.6.20-syscall.patch     |   72 -------------------
 .../dosfstools/dosfstools-2.10-kernel-2.6.patch    |   74 --------------------
 .../dosfstools/dosfstools/mkdosfs-bootcode.patch   |   68 ++++++++----------
 .../dosfstools/dosfstools/mkdosfs-dir.patch        |   62 ++++++++---------
 .../recipes-devtools/dosfstools/dosfstools_2.10.bb |   24 ------
 .../recipes-devtools/dosfstools/dosfstools_2.11.bb |   11 ++-
 7 files changed, 69 insertions(+), 261 deletions(-)
 delete mode 100644 meta/recipes-devtools/dosfstools/dosfstools-native_2.10.bb
 delete mode 100644 meta/recipes-devtools/dosfstools/dosfstools/2.6.20-syscall.patch
 delete mode 100644 meta/recipes-devtools/dosfstools/dosfstools/dosfstools-2.10-kernel-2.6.patch
 delete mode 100644 meta/recipes-devtools/dosfstools/dosfstools_2.10.bb
meta/recipes-devtools/dosfstools/dosfstools-native_2.10.bb deleted +0 -19
deleted file mode 100644
index 91ff11f..0000000
@@ -1,19 +0,0 @@
-# dosfstools-native OE build file
-# Copyright (C) 2004-2006, Advanced Micro Devices, Inc.  All Rights Reserved
-# Released under the MIT license (see packages/COPYING)
-
-require dosfstools_${PV}.bb
-
-PR="r5"
-
-SRC_URI = "ftp://ftp.uni-erlangen.de/pub/Linux/LOCAL/dosfstools/dosfstools-${PV}.src.tar.gz \
-	file://mkdosfs-bootcode.patch \
-	file://mkdosfs-dir.patch \
-	file://alignment_hack.patch \
-	file://dosfstools-2.10-kernel-2.6.patch \
-	file://msdos_fat12_undefined.patch \
-	file://dosfstools-msdos_fs-types.patch \
-	file://include-linux-types.patch \
-	file://2.6.20-syscall.patch"
-
-inherit native
meta/recipes-devtools/dosfstools/dosfstools/2.6.20-syscall.patch deleted +0 -72

72 lines not on this page · raw message

meta/recipes-devtools/dosfstools/dosfstools/dosfstools-2.10-kernel-2.6.patch deleted +0 -74

74 lines not on this page · raw message

meta/recipes-devtools/dosfstools/dosfstools/mkdosfs-bootcode.patch +31 -37

166 lines not on this page · raw message

meta/recipes-devtools/dosfstools/dosfstools/mkdosfs-dir.patch +30 -32

165 lines not on this page · raw message

meta/recipes-devtools/dosfstools/dosfstools_2.10.bb deleted +0 -24
deleted file mode 100644
index c23c02d..0000000
@@ -1,24 +0,0 @@
-# dosfstools OE build file
-# Copyright (C) 2004-2006, Advanced Micro Devices, Inc.  All Rights Reserved
-# Released under the MIT license (see packages/COPYING)
-
-DESCRIPTION = "DOS FAT Filesystem Utilities"
-
-SECTION = "base"
-LICENSE = "GPLv2"
-LIC_FILES_CHKSUM = "file://mkdosfs/COPYING;md5=cbe67f08d6883bff587f615f0cc81aa8"
-PR = "r3"
-
-SRC_URI = "ftp://ftp.uni-erlangen.de/pub/Linux/LOCAL/dosfstools/dosfstools-${PV}.src.tar.gz \
-	   file://alignment_hack.patch \
-	   file://dosfstools-2.10-kernel-2.6.patch \
-           file://msdos_fat12_undefined.patch \
-	   file://include-linux-types.patch"
-
-SRC_URI[md5sum] = "59a02f311a891af8787c4c9e28c6b89b"
-SRC_URI[sha256sum] = "55a7b2f5ea4506bde935ee3145573e1773427fc72283a36796c7c2cf861dd064"
-
-do_install () {
-	oe_runmake "PREFIX=${D}" "SBINDIR=${D}${sbindir}" \
-		   "MANDIR=${D}${mandir}/man8" install
-}
meta/recipes-devtools/dosfstools/dosfstools_2.11.bb +8 -3
index 944d873..7d0080c 100644
@@ -7,12 +7,15 @@ DESCRIPTION = "DOS FAT Filesystem Utilities"
 SECTION = "base"
 LICENSE = "GPLv2"
 LIC_FILES_CHKSUM = "file://mkdosfs/COPYING;md5=cbe67f08d6883bff587f615f0cc81aa8"
-PR = "r0"
+PR = "r1"
 
 SRC_URI = "ftp://ftp.uni-erlangen.de/pub/Linux/LOCAL/dosfstools/dosfstools-${PV}.src.tar.gz \
-	   file://alignment_hack.patch \
+           file://mkdosfs-bootcode.patch \
+           file://mkdosfs-dir.patch \
+           file://alignment_hack.patch \
            file://msdos_fat12_undefined.patch \
-	   file://include-linux-types.patch"
+           file://dosfstools-msdos_fs-types.patch \
+           file://include-linux-types.patch"
 
 SRC_URI[md5sum] = "407d405ade410f7597d364ab5dc8c9f6"
 SRC_URI[sha256sum] = "0eac6d12388b3d9ed78684529c1b0d9346fa2abbe406c4d4a3eb5a023c98a484"
@@ -21,3 +24,5 @@ do_install () {
 	oe_runmake "PREFIX=${D}" "SBINDIR=${D}${sbindir}" \
 		   "MANDIR=${D}${mandir}/man8" install
 }
+
+BBCLASSEXTEND = "native"
Signature · 1 line
1.7.2.5
#2 lore raw

PATCH 2/5 scripts/send-pull-request: allow sending of patches without a cover letter

In reply to Otavio Salvador
---
 scripts/send-pull-request |   21 ++++++++++++---------
 1 files changed, 12 insertions(+), 9 deletions(-)
scripts/send-pull-request +12 -9
index be13009..8d51ce2 100755
@@ -108,15 +108,18 @@ fi
 
 
 # Verify the cover letter is complete and free of tokens
-CL="$PDIR/0000-cover-letter.patch"
-for TOKEN in SUBJECT BLURB; do
-	grep -q "*** $TOKEN HERE ***" "$CL"
-	if [ $? -eq 0 ]; then
-		echo "ERROR: Please edit $CL and try again (Look for '*** $TOKEN HERE ***')."
-		exit 1
-	fi
-done
-
+if [ -e $PDIR/0000-cover-letter.patch ]; then
+	CL="$PDIR/0000-cover-letter.patch"
+	for TOKEN in SUBJECT BLURB; do
+		grep -q "*** $TOKEN HERE ***" "$CL"
+		if [ $? -eq 0 ]; then
+			echo "ERROR: Please edit $CL and try again (Look for '*** $TOKEN HERE ***')."
+			exit 1
+		fi
+	done
+else
+	echo "WARNING: No cover letter will be send."
+fi
 
 # Harvest emails from the generated patches and populate AUTO_CC.
 if [ $AUTO_CL -eq 1 ]; then
Signature · 1 line
1.7.2.5
#3 lore raw

PATCH 3/5 connman: drop git version

In reply to Otavio Salvador

This was clearly unused as dbusperms.patch cannot be fetched by this recipe and noone noticed the build failures caused by it.

---
 .../connman/connman-0.75/dbusperms.patch           |   14 --------------
 meta/recipes-connectivity/connman/connman_git.bb   |   11 -----------
 2 files changed, 0 insertions(+), 25 deletions(-)
 delete mode 100644 meta/recipes-connectivity/connman/connman-0.75/dbusperms.patch
 delete mode 100644 meta/recipes-connectivity/connman/connman_git.bb
meta/recipes-connectivity/connman/connman-0.75/dbusperms.patch deleted +0 -14
deleted file mode 100644
index c331654..0000000
@@ -1,14 +0,0 @@
-Upstream-Status: Inappropriate [configuration]
-
-Index: git/src/connman-dbus.conf
-===================================================================
---- git.orig/src/connman-dbus.conf	2009-05-26 00:34:35.000000000 +0100
-+++ git/src/connman-dbus.conf	2009-05-26 00:34:48.000000000 +0100
-@@ -10,6 +10,6 @@
-         <allow send_destination="org.moblin.connman"/>
-     </policy>
-     <policy context="default">
--        <deny send_destination="org.moblin.connman"/>
-+        <allow send_destination="org.moblin.connman"/>
-     </policy>
- </busconfig>
meta/recipes-connectivity/connman/connman_git.bb deleted +0 -11
deleted file mode 100644
index 54ac4a5..0000000
@@ -1,11 +0,0 @@
-require connman.inc
-
-SRCREV = "36e877dece72577a3ae6197eafd505d0e6e0c1d2"
-PV       = "0.47+git${SRCPV}"
-PR       = "r17"
-S        = "${WORKDIR}/git"
-
-SRC_URI  = "git://git.kernel.org/pub/scm/network/connman/connman.git;protocol=git \
-            file://dbusperms.patch \
-            file://connman "
-
Signature · 1 line
1.7.2.5
#4 lore raw

PATCH 4/5 connman: move files from connman-0.75 to connman dir

In reply to Otavio Salvador

This is being done in preparation to get newer version of connman into OE-Core.

---
 .../add_xuser_dbus_permission.patch                |    0
 .../connman/{connman-0.75 => connman}/connman      |    0
 .../xtables_version.patch                          |    0
 3 files changed, 0 insertions(+), 0 deletions(-)
 rename meta/recipes-connectivity/connman/{connman-0.75 => connman}/add_xuser_dbus_permission.patch (100%)
 rename meta/recipes-connectivity/connman/{connman-0.75 => connman}/connman (100%)
 rename meta/recipes-connectivity/connman/{connman-0.75 => connman}/xtables_version.patch (100%)
meta/recipes-connectivity/connman/connman/add_xuser_dbus_permission.patch renamed from meta/recipes-connectivity/connman/connman-0.75/add_xuser_dbus_permission.patch +0 -0
similarity index 100%
rename from meta/recipes-connectivity/connman/connman-0.75/add_xuser_dbus_permission.patch
rename to meta/recipes-connectivity/connman/connman/add_xuser_dbus_permission.patch
meta/recipes-connectivity/connman/connman/connman renamed from meta/recipes-connectivity/connman/connman-0.75/connman +0 -0
similarity index 100%
rename from meta/recipes-connectivity/connman/connman-0.75/connman
rename to meta/recipes-connectivity/connman/connman/connman
meta/recipes-connectivity/connman/connman/xtables_version.patch renamed from meta/recipes-connectivity/connman/connman-0.75/xtables_version.patch +0 -0
similarity index 100%
rename from meta/recipes-connectivity/connman/connman-0.75/xtables_version.patch
rename to meta/recipes-connectivity/connman/connman/xtables_version.patch
Signature · 1 line
1.7.2.5
#5 lore raw

PATCH 5/5 connman: update to 0.78

In reply to Otavio Salvador

Updates the package to 0.78 bringing changes done on meta-oe and extra cleanups as:

* xtables_version.patch: removed as it has been merged upstream

* use sed to fix dbus access policy

* remove build depends on dhclient as connman has an internal client now

* make wifi and bluetooth building optional

* add ppp in depends that is used by some plugins

* add ntp in depends and enable ntp plugin

* package tools

* enable fake plugin

This uses PR as "r1" since it was previously available on meta-oe.

---
 meta/recipes-connectivity/connman/connman.inc      |   96 ++++++++++++++------
 .../connman/connman/xtables_version.patch          |   64 -------------
 meta/recipes-connectivity/connman/connman_0.75.bb  |   29 ------
 meta/recipes-connectivity/connman/connman_0.78.bb  |   10 ++
 4 files changed, 79 insertions(+), 120 deletions(-)
 delete mode 100644 meta/recipes-connectivity/connman/connman/xtables_version.patch
 delete mode 100644 meta/recipes-connectivity/connman/connman_0.75.bb
 create mode 100644 meta/recipes-connectivity/connman/connman_0.78.bb
meta/recipes-connectivity/connman/connman.inc +69 -27
index 7ee460e..e90aa4b 100644
@@ -13,7 +13,32 @@ LICENSE  = "GPLv2"
 LIC_FILES_CHKSUM = "file://COPYING;md5=12f884d2ae1ff87c09e5b7ccc2c4ca7e \
                     file://src/main.c;beginline=1;endline=20;md5=4b55b550fa6b33cc2055ef30dd262b3e"
 
-DEPENDS  = "libgdbus dbus glib-2.0 iptables"
+# we need to define the depends here, the dynamic stuff is too late
+DEPENDS  = "dbus glib-2.0 ppp iptables gnutls ntp \
+            ${@base_contains('DISTRO_FEATURES', 'bluetooth','bluez4', '', d)} \
+            ${@base_contains('DISTRO_FEATURES', 'wifi','wpa-supplicant', '', d)} \
+            "
+
+EXTRA_OECONF += "\
+    ac_cv_path_WPASUPPLICANT=${sbindir}/wpa_supplicant \
+    ac_cv_path_PPPD=${sbindir}/pppd \
+    --disable-gtk-doc \
+    --enable-debug \
+    --enable-threads \
+    --enable-loopback \
+    --enable-ethernet \
+    ${@base_contains('DISTRO_FEATURES', 'wifi','--enable-wifi', '--disable-wifi', d)} \
+    ${@base_contains('DISTRO_FEATURES', 'bluetooth','--enable-bluetooth', '--disable-bluetooth', d)} \
+    --enable-dnsproxy \
+    --enable-ofono \
+    --enable-tools \
+    --enable-test \
+    --disable-polkit \
+    --enable-client \
+    --enable-fake \
+    --enable-ntpd \
+    --with-ntpd=${bindir}/ntpd \
+"
 
 INITSCRIPT_NAME = "connman"
 INITSCRIPT_PARAMS = "start 05 5 2 3 . stop 22 0 1 6 ."
@@ -25,44 +50,61 @@ USERADD_PARAM_${PN} = "--system --no-create-home \
 
 inherit autotools pkgconfig update-rc.d useradd
 
-do_install_append() {
-    install -d ${D}${sysconfdir}/init.d/
-    install -m 0755 ${WORKDIR}/connman ${D}${sysconfdir}/init.d/connman
+do_compile_append() {
+	sed -i -e s:deny:allow:g src/connman-dbus.conf
 }
 
-PACKAGES += "${PN}-scripts"
-RDEPENDS_${PN}-scripts += "python"
-
-PACKAGES_DYNAMIC = "${PN}-plugin-*"
-FILES_${PN} = "${bindir}/* ${sbindir}/* ${libexecdir}/* ${libdir}/lib*.so.* \
-            ${sysconfdir} ${sharedstatedir} ${localstatedir} \
-            ${base_bindir}/* ${base_sbindir}/* ${base_libdir}/*.so* ${datadir}/${PN} \
-            ${datadir}/pixmaps ${datadir}/applications \
-            ${datadir}/idl ${datadir}/omf ${datadir}/sounds \
-            ${libdir}/bonobo/servers \
-            ${datadir}/dbus-1/system-services/* \
-            ${libdir}/connman/scripts/dhclient*"
-FILES_${PN}-dbg += "${libdir}/connman/plugins/.debug \
-                    ${libdir}/connman/scripts/.debug"
+do_install_append() {
+	install -d ${D}${sysconfdir}/init.d
+	install -m 0755 ${WORKDIR}/connman ${D}${sysconfdir}/init.d/connman
 
-FILES_${PN}-dev += "${libdir}/connman/plugins/*.la"
+	install -d ${D}${bindir}
+	install -m 0755 ${S}/tools/*-test ${D}${bindir}
+	install -m 0755 ${S}/tools/wispr ${D}${bindir}
+}
 
-FILES_${PN}-scripts += "${libdir}/${PN}/test/*"
+PACKAGES_DYNAMIC = "${PN}-plugin-*"
 
 python populate_packages_prepend() {
-	prefix = (d.getVar("MLPREFIX", True) or "")
-	depmap = dict( wifi=prefix+"wpa-supplicant", bluetooth=prefix+"bluez4", ofono=prefix+"ofono" )
+	depmap = dict( pppd="ppp",
+	               udhcp="busybox connman-scripts",
+	               dhclient="dhcp-client",
+	               wifi="wpa-supplicant",
+	               resolvconf="resolvconf",
+	               bluetooth="bluez4",
+	               ntpd="ntp",
+	               ofono="ofono" )
 	packages = []
+	multilib_prefix = (d.getVar("MLPREFIX", True) or "")
 	hook = lambda file,pkg,b,c,d:packages.append((file,pkg))
-
 	plugin_dir = bb.data.expand('${libdir}/connman/plugins/', d)
 	plugin_name = bb.data.expand('${PN}-plugin-%s', d)
-
 	do_split_packages(d, plugin_dir, '^(.*).so$', plugin_name, '${PN} plugin for %s', extra_depends='', hook=hook )
-
 	for (file, package) in packages:
 		plugintype = package.split( '-' )[-1]
 		if plugintype in depmap:
-			bb.note( "Adding rdependency on %s to package %s" % ( depmap[plugintype], package ) )
-			d.setVar("RDEPENDS_%s" % package, depmap[plugintype])
+			rdepends = map(lambda x: multilib_prefix + x,  depmap[plugintype].split())
+			bb.note( "Adding rdependency on %s to %s" % ( rdepends, package ) )
+			d.setVar("RDEPENDS_%s" % package, " ".join(rdepends))
 }
+
+PACKAGES =+ "${PN}-scripts ${PN}-tools ${PN}-tests"
+
+FILES_${PN}-tools = "${bindir}/wispr"
+
+FILES_${PN}-tests = "${bindir}/*-test"
+
+FILES_${PN}-scripts += "${libdir}/${PN}/test/* ${libdir}/connman/scripts"
+RDEPENDS_${PN}-scripts = "python"
+
+FILES_${PN} = "${bindir}/* ${sbindir}/* ${libexecdir}/* ${libdir}/lib*.so.* \
+            ${sysconfdir} ${sharedstatedir} ${localstatedir} \
+            ${base_bindir}/* ${base_sbindir}/* ${base_libdir}/*.so* ${datadir}/${PN} \
+            ${datadir}/pixmaps ${datadir}/applications \
+            ${datadir}/idl ${datadir}/omf ${datadir}/sounds \
+            ${libdir}/bonobo/servers \
+            ${datadir}/dbus-1/system-services/*"
+
+FILES_${PN}-dbg += "${libdir}/connman/*/.debug"
+
+FILES_${PN}-dev += "${libdir}/connman/*/*.la"
meta/recipes-connectivity/connman/connman/xtables_version.patch deleted +0 -64

64 lines not on this page · raw message

meta/recipes-connectivity/connman/connman_0.75.bb deleted +0 -29
deleted file mode 100644
index c6e911b..0000000
@@ -1,29 +0,0 @@
-require connman.inc
-PR = "r4"
-
-EXTRA_OECONF += "\
-  ac_cv_path_WPASUPPLICANT=/usr/sbin/wpa_supplicant \
-  --disable-gtk-doc \
-  --enable-debug \
-  --enable-threads \
-  --enable-loopback \
-  --enable-ethernet \
-  ${@base_contains('DISTRO_FEATURES', 'wifi','--enable-wifi', '--disable-wifi', d)} \
-  ${@base_contains('DISTRO_FEATURES', 'bluetooth','--enable-bluetooth', '--disable-bluetooth', d)} \
-  --enable-dnsproxy \
-  --disable-dhclient \
-  --enable-test \
-  --disable-polkit \
-  --enable-client \
-  --enable-ofono \
-  --prefix=/usr --sysconfdir=/etc --localstatedir=/var"
-
-SRC_URI  = "\
-  ${KERNELORG_MIRROR}/linux/network/connman/connman-${PV}.tar.gz \
-  file://add_xuser_dbus_permission.patch \
-  file://xtables_version.patch \
-  file://connman \
-"
-
-SRC_URI[md5sum] = "9973cb89a11fff6b51fc85b51c13b711"
-SRC_URI[sha256sum] = "b15361237f7ec8092fb0e55d4585550ab35491485edaf10ddd032d6e36299db7"
meta/recipes-connectivity/connman/connman_0.78.bb new file +10 -0
new file mode 100644
index 0000000..cc23c28
@@ -0,0 +1,10 @@
+require connman.inc
+
+PR = "r1"
+
+# 0.78 tag
+SRCREV = "02f5d5fe2d7c71514a6387ba2b772b42d8e8d297"
+SRC_URI  = "git://git.kernel.org/pub/scm/network/connman/connman.git \
+            file://add_xuser_dbus_permission.patch \
+            file://connman"
+S = "${WORKDIR}/git"
Signature · 1 line
1.7.2.5
#6 lore raw
In reply to Otavio Salvador
Quoted 8 lines · Otavio Salvador

The following changes since commit 4a13766c7b223d82e8cf682db999a135d2b8412c:

gtk.inc: ship gtk-demo to independent package (2011-12-08 16:58:41 +0000)

are available in the git repository at:
git://github.com/OSSystems/oe-core master
https://github.com/OSSystems/oe-core/tree/HEAD

Quoted 7 lines

Otavio Salvador (5):
dosfstools: update native to 2.11 scripts/send-pull-request: allow sending of patches without a cover
letter
connman: drop git version
connman: move files from connman-0.75 to connman dir
connman: update to 0.78

I've merged these apart from the dosfstools change which I'm going to let Saul test a bit further before it goes in.

Cheers,

Richard