diff options
author | Martin Schlemmer <azarah@gentoo.org> | 2004-01-29 18:39:19 +0000 |
---|---|---|
committer | Martin Schlemmer <azarah@gentoo.org> | 2004-01-29 18:39:19 +0000 |
commit | 583f5971519a2f2a5467921346d07543afe633c6 (patch) | |
tree | 7fd4be545c196b664b4ec920f92a297314fd56bd | |
parent | Version bump. Bugfixes and documentation updates relating to the new DHCP code. (diff) | |
download | gentoo-2-583f5971519a2f2a5467921346d07543afe633c6.tar.gz gentoo-2-583f5971519a2f2a5467921346d07543afe633c6.tar.bz2 gentoo-2-583f5971519a2f2a5467921346d07543afe633c6.zip |
Update version. Update no-wait-for-sleep.patch to apply again. Add
logging-config-option.patch to toggle logging via a udev.conf option,
and add it to udev.conf. Update udev.rules.post_012 with some misc
rules to extend devfs compat. Should close bug #39517.
-rw-r--r-- | sys-fs/udev/ChangeLog | 13 | ||||
-rw-r--r-- | sys-fs/udev/Manifest | 21 | ||||
-rw-r--r-- | sys-fs/udev/files/digest-udev-015 | 1 | ||||
-rw-r--r-- | sys-fs/udev/files/udev-015-logging-config-option.patch | 115 | ||||
-rw-r--r-- | sys-fs/udev/files/udev-015-no-wait-for-sleep.patch | 54 | ||||
-rw-r--r-- | sys-fs/udev/files/udev.conf | 5 | ||||
-rw-r--r-- | sys-fs/udev/files/udev.rules.post_012 | 36 | ||||
-rw-r--r-- | sys-fs/udev/udev-015.ebuild | 144 |
8 files changed, 360 insertions, 29 deletions
diff --git a/sys-fs/udev/ChangeLog b/sys-fs/udev/ChangeLog index c55a1b8d080a..75e6d72b0fb5 100644 --- a/sys-fs/udev/ChangeLog +++ b/sys-fs/udev/ChangeLog @@ -1,6 +1,17 @@ # ChangeLog for sys-fs/udev # Copyright 2000-2004 Gentoo Technologies, Inc.; Distributed under the GPL v2 -# $Header: /var/cvsroot/gentoo-x86/sys-fs/udev/ChangeLog,v 1.20 2004/01/16 18:57:29 azarah Exp $ +# $Header: /var/cvsroot/gentoo-x86/sys-fs/udev/ChangeLog,v 1.21 2004/01/29 18:39:19 azarah Exp $ + +*udev-015 (29 Jan 2004) + + 29 Jan 2004; Martin Schlemmer <azarah@gentoo.org> udev-015.ebuild, + files/udev-015-logging-config-option.patch, + files/udev-015-no-wait-for-sleep.patch, + files/udev.conf, files/udev.rules.post_012 + Update version. Update no-wait-for-sleep.patch to apply again. Add + logging-config-option.patch to toggle logging via a udev.conf option, + and add it to udev.conf. Update udev.rules.post_012 with some misc + rules to extend devfs compat. Should close bug #39517. *udev-013-r1 (16 Jan 2004) diff --git a/sys-fs/udev/Manifest b/sys-fs/udev/Manifest index ba5dcfd9e2ab..ec6e2b0a655d 100644 --- a/sys-fs/udev/Manifest +++ b/sys-fs/udev/Manifest @@ -1,15 +1,16 @@ MD5 39793fbef16989ec7c19fa8ba04370ee udev-013.ebuild 3343 -MD5 aba24cfb26a8f0b604a44a0d9ca7f830 files/udev.permissions 3550 +MD5 813397f1f9255c1b8c5e05e67b182938 udev-013-r1.ebuild 3352 +MD5 587f6b44601dba58a82992226948f9a7 ChangeLog 5015 +MD5 a19af1e2e874cadb09ab486d2fd343bb udev-012.ebuild 3400 +MD5 813397f1f9255c1b8c5e05e67b182938 udev-015.ebuild 3352 +MD5 9a09f8d531c582e78977dbfd96edc1f2 metadata.xml 164 MD5 dbe7dc643caeafddc845fe9269430123 files/udev-011-no-wait-for-sleep.patch 1053 -MD5 8e183b484cd841ca7c3537c1cbd923a5 files/udev.rules.post_012 4367 -MD5 4e0d7e033730bbe5544745788e7a13a8 files/udev-012-udev_c-gcc295-compat.patch 277 -MD5 8ee2274e54f304cb9dbbe9094982fe94 files/digest-udev-013-r1 62 MD5 b87af7c246fa800c37ddc9bd3497ca54 files/udev.conf 1123 -MD5 4c26691abc7f47b0329203056cbcbebc files/udev.rules 3554 +MD5 8ee2274e54f304cb9dbbe9094982fe94 files/digest-udev-013-r1 62 +MD5 4e0d7e033730bbe5544745788e7a13a8 files/udev-012-udev_c-gcc295-compat.patch 277 MD5 35fcac8040808dde93580ddfe5ff5a18 files/digest-udev-012 62 +MD5 8b2a4466a30de6474690e3f93703457b files/digest-udev-015 62 MD5 8ee2274e54f304cb9dbbe9094982fe94 files/digest-udev-013 62 -MD5 a19af1e2e874cadb09ab486d2fd343bb udev-012.ebuild 3400 -MD5 be959598bcfc4b16d7e3d6dcac4d64ce .#Manifest.1.20 1291 -MD5 813397f1f9255c1b8c5e05e67b182938 udev-013-r1.ebuild 3352 -MD5 587f6b44601dba58a82992226948f9a7 ChangeLog 5015 -MD5 9a09f8d531c582e78977dbfd96edc1f2 metadata.xml 164 +MD5 8e183b484cd841ca7c3537c1cbd923a5 files/udev.rules.post_012 4367 +MD5 aba24cfb26a8f0b604a44a0d9ca7f830 files/udev.permissions 3550 +MD5 4c26691abc7f47b0329203056cbcbebc files/udev.rules 3554 diff --git a/sys-fs/udev/files/digest-udev-015 b/sys-fs/udev/files/digest-udev-015 new file mode 100644 index 000000000000..43d5af2b46de --- /dev/null +++ b/sys-fs/udev/files/digest-udev-015 @@ -0,0 +1 @@ +MD5 6abfb23d89284cca03c5c68e2ab8910a udev-015.tar.bz2 1148457 diff --git a/sys-fs/udev/files/udev-015-logging-config-option.patch b/sys-fs/udev/files/udev-015-logging-config-option.patch new file mode 100644 index 000000000000..91fd10ebc11c --- /dev/null +++ b/sys-fs/udev/files/udev-015-logging-config-option.patch @@ -0,0 +1,115 @@ +--- udev-015/Makefile 2004-01-29 20:03:55.920842712 +0200 ++++ udev-015.log_option/Makefile 2004-01-29 20:20:06.758252992 +0200 +@@ -232,6 +232,7 @@ + @echo \#define UDEV_CONFIG_FILE \"$(configdir)\udev.conf\" >> $@ + @echo \#define UDEV_RULES_FILE \"$(configdir)\udev.rules\" >> $@ + @echo \#define UDEV_PERMISSION_FILE \"$(configdir)\udev.permissions\" >> $@ ++ @echo \#define UDEV_LOG_DEFAULT \"yes\" >> $@ + + # config files automatically generated + GEN_CONFIGS = $(LOCAL_CFG_DIR)/udev.conf +@@ -252,12 +253,12 @@ + $(LD) $(LDFLAGS) -o $@ $(CRT0) udevinfo.o logging.o udev_config.o udevdb.o $(SYSFS) $(TDB) $(LIB_OBJS) $(ARCH_LIB_OBJS) + $(STRIPCMD) $@ + +-$(DAEMON): udevd.h udevd.o udevd.o logging.o +- $(LD) $(LDFLAGS) -o $@ $(CRT0) udevd.o logging.o $(LIB_OBJS) $(ARCH_LIB_OBJS) ++$(DAEMON): udevd.h udevd.o udevd.o udev_config.o logging.o $(SYSFS) ++ $(LD) $(LDFLAGS) -o $@ $(CRT0) udevd.o udev_config.o logging.o $(SYSFS) $(LIB_OBJS) $(ARCH_LIB_OBJS) + $(STRIPCMD) $@ + +-$(SENDER): udevd.h udevsend.o udevd.o logging.o +- $(LD) $(LDFLAGS) -o $@ $(CRT0) udevsend.o logging.o $(LIB_OBJS) $(ARCH_LIB_OBJS) ++$(SENDER): udevd.h udevsend.o udevd.o udev_config.o logging.o $(SYSFS) ++ $(LD) $(LDFLAGS) -o $@ $(CRT0) udevsend.o udev_config.o logging.o $(SYSFS) $(LIB_OBJS) $(ARCH_LIB_OBJS) + $(STRIPCMD) $@ + + clean: +--- udev-015/etc/udev/udev.conf.in 2004-01-29 19:59:08.296568248 +0200 ++++ udev-015.log_option/etc/udev/udev.conf.in 2004-01-29 20:15:01.824609952 +0200 +@@ -29,3 +29,6 @@ + # explicit match in the permissions file + default_group="root" + ++# udev_log - set to "yes" if you want logging, else "no" ++udev_log="yes" ++ +--- udev-015/udev_config.c 2004-01-29 19:20:34.634298376 +0200 ++++ udev-015.log_option/udev_config.c 2004-01-29 20:22:49.771471216 +0200 +@@ -48,6 +48,7 @@ char udev_config_filename[PATH_MAX+NAME_ + char default_mode_str[MODE_SIZE]; + char default_owner_str[OWNER_SIZE]; + char default_group_str[GROUP_SIZE]; ++char udev_log_str[BOOL_SIZE]; + + + static void init_variables(void) +@@ -60,6 +61,7 @@ static void init_variables(void) + strfieldcpy(udev_config_filename, UDEV_CONFIG_FILE); + strfieldcpy(udev_rules_filename, UDEV_RULES_FILE); + strfieldcpy(udev_permissions_filename, UDEV_PERMISSION_FILE); ++ strfieldcpy(udev_log_str, UDEV_LOG_DEFAULT); + } + + #define set_var(_name, _var) \ +@@ -156,6 +158,7 @@ static int parse_config_file(void) + set_var("default_mode", default_mode_str); + set_var("default_owner", default_owner_str); + set_var("default_group", default_group_str); ++ set_var("udev_log", udev_log_str); + } + dbg_parse("%s:%d:%Zd: error parsing '%s'", udev_config_filename, + lineno, temp - line, temp); +@@ -191,6 +194,7 @@ static void get_dirs(void) + dbg_parse("udev_db_filename = %s", udev_db_filename); + dbg_parse("udev_rules_filename = %s", udev_rules_filename); + dbg_parse("udev_permissions_filename = %s", udev_permissions_filename); ++ dbg_parse("udev_log_str = %s", udev_log_str); + parse_config_file(); + + dbg_parse("udev_root = %s", udev_root); +@@ -198,6 +202,7 @@ static void get_dirs(void) + dbg_parse("udev_db_filename = %s", udev_db_filename); + dbg_parse("udev_rules_filename = %s", udev_rules_filename); + dbg_parse("udev_permissions_filename = %s", udev_permissions_filename); ++ dbg_parse("udev_log_str = %s", udev_log_str); + } + + void udev_init_config(void) +--- udev-015/logging.c 2004-01-29 19:20:40.673380296 +0200 ++++ udev-015.log_option/logging.c 2004-01-29 20:02:41.316184344 +0200 +@@ -26,6 +26,7 @@ + #include <unistd.h> + #include <syslog.h> + ++#include "udev.h" + #include "logging.h" + + +@@ -47,6 +48,9 @@ int log_message(int level, const char *f + { + va_list args; + ++ if (0 != strncmp(udev_log_str, "yes", BOOL_SIZE)) ++ return 0; ++ + if (!logging_init) + init_logging(); + va_start(args, format); +--- udev-015/udev.h 2004-01-29 20:00:40.473555216 +0200 ++++ udev-015.log_option/udev.h 2004-01-29 20:03:16.094897176 +0200 +@@ -32,6 +32,7 @@ + #define OWNER_SIZE 30 + #define GROUP_SIZE 30 + #define MODE_SIZE 8 ++#define BOOL_SIZE 5 + + struct udevice { + char name[NAME_SIZE]; +@@ -72,5 +73,6 @@ extern char udev_rules_filename[PATH_MAX + extern char default_mode_str[MODE_SIZE]; + extern char default_owner_str[OWNER_SIZE]; + extern char default_group_str[GROUP_SIZE]; ++extern char udev_log_str[BOOL_SIZE]; + + #endif diff --git a/sys-fs/udev/files/udev-015-no-wait-for-sleep.patch b/sys-fs/udev/files/udev-015-no-wait-for-sleep.patch new file mode 100644 index 000000000000..e21de378e525 --- /dev/null +++ b/sys-fs/udev/files/udev-015-no-wait-for-sleep.patch @@ -0,0 +1,54 @@ +--- udev-015/namedev.c 2004-01-29 19:02:10.067218096 +0200 ++++ udev-015.no_sleep/namedev.c 2004-01-29 19:10:21.440518000 +0200 +@@ -285,6 +285,10 @@ static void wait_for_device_to_initializ + struct bus_file *b = &bus_files[0]; + struct sysfs_attribute *tmpattr; + int loop; ++ int wait = 1; ++ ++ if (getenv("UDEV_NO_SLEEP") != NULL) ++ wait = 0; + + while (1) { + if (b->bus == NULL) +@@ -300,7 +304,8 @@ static void wait_for_device_to_initializ + goto exit; + } + /* sleep to give the kernel a chance to create the file */ +- sleep(1); ++ if (wait) ++ sleep(1); + } + dbg("timed out waiting for '%s' file, continuing on anyway...", b->file); + goto exit; +@@ -524,6 +529,10 @@ static struct sysfs_device *get_sysfs_de + struct sysfs_class_device *class_dev_parent; + struct timespec tspec; + int loop; ++ int wait = 1; ++ ++ if (getenv("UDEV_NO_SLEEP") != NULL) ++ wait = 0; + + /* Figure out where the device symlink is at. For char devices this will + * always be in the class_dev->path. But for block devices, it's different. +@@ -542,7 +551,8 @@ static struct sysfs_device *get_sysfs_de + tspec.tv_nsec = 10000000; /* sleep 10 millisec */ + loop = 10; + while (loop--) { +- nanosleep(&tspec, NULL); ++ if (wait) ++ nanosleep(&tspec, NULL); + if (class_dev_parent) + sysfs_device = sysfs_get_classdev_device(class_dev_parent); + else +@@ -569,7 +579,8 @@ device_found: + loop = 10; + tspec.tv_nsec = 10000000; + while (loop--) { +- nanosleep(&tspec, NULL); ++ if (wait) ++ nanosleep(&tspec, NULL); + sysfs_get_device_bus(sysfs_device); + + if (sysfs_device->bus[0] != '\0') diff --git a/sys-fs/udev/files/udev.conf b/sys-fs/udev/files/udev.conf index d84b33aab84a..0489594063df 100644 --- a/sys-fs/udev/files/udev.conf +++ b/sys-fs/udev/files/udev.conf @@ -1,5 +1,5 @@ # /etc/udev/udev.conf: main config file for udev -# $Header: /var/cvsroot/gentoo-x86/sys-fs/udev/files/udev.conf,v 1.2 2003/12/26 23:32:44 azarah Exp $ +# $Header: /var/cvsroot/gentoo-x86/sys-fs/udev/files/udev.conf,v 1.3 2004/01/29 18:39:19 azarah Exp $ # # This file can be used to override some of udev's default values # for where it looks for files, and where it places device nodes. @@ -26,3 +26,6 @@ udev_permissions="/etc/udev/udev.permissions" # user to function in the permissions file! default_mode="0666" +# udev_log - set to "yes" if you want logging +udev_log="no" + diff --git a/sys-fs/udev/files/udev.rules.post_012 b/sys-fs/udev/files/udev.rules.post_012 index 96b16c25176c..0772061b2935 100644 --- a/sys-fs/udev/files/udev.rules.post_012 +++ b/sys-fs/udev/files/udev.rules.post_012 @@ -1,20 +1,8 @@ # /etc/udev/udev.rules: device naming rules for udev -# $Header: /var/cvsroot/gentoo-x86/sys-fs/udev/files/udev.rules.post_012,v 1.3 2004/01/16 18:57:29 azarah Exp $ -# -# There are a number of modifiers that are allowed to be used in the NAME or PROGRAM fields. -# They provide the following subsitutions: -# %n - the "kernel number" of the device. -# for example, 'sda3' has a "kernel number" of '3' -# %k - the kernel name for the device. -# %M - the kernel major number for the device -# %m - the kernel minor number for the device -# %b - the bus id for the device -# %c - the return value of the external PROGRAM (note, this doesn't work within -# the PROGRAM field for the obvious reason.) -# %D - use the devfs style disk name for this device. -# For partitions, this will result in 'part%n' -# If this is not a partition, it will result in 'disc' +# $Header: /var/cvsroot/gentoo-x86/sys-fs/udev/files/udev.rules.post_012,v 1.4 2004/01/29 18:39:19 azarah Exp $ # +# There are a number of modifiers that are allowed to be used in some of the +# fields. See the udev man page for a full description of them. ########################################################### # @@ -22,6 +10,11 @@ # ########################################################### +# LS120 +LABEL, BUS="scsi", SYSFS_model="LS-120 COSM 04", NAME="afd" +LABEL, BUS="scsi", SYSFS_vendor="MATSHITA", NAME="afd" +CALLOUT, BUS="scsi", PROGRAM="/sbin/scsi_id", ID="LS-120 COSM 04", NAME="afd" + # Looking for scsi bus id 42:0:0:1 BUS="scsi", PROGRAM="/bin/echo -n test-%b", RESULT="test-42:0:0:1", NAME="%c" @@ -77,6 +70,9 @@ KERNEL="device-mapper", NAME="mapper/control" # fb devices KERNEL="fb[0-9]*", NAME="fb/%n", SYMLINK="%k" +# floppy devices +KERNEL="fd[0-9]*", NAME="floppy/%n", SYMLINK="%k" + # i2c devices KERNEL="i2c-[0-9]*", NAME="i2c/%n", SYMLINK="%k" @@ -84,6 +80,8 @@ KERNEL="i2c-[0-9]*", NAME="i2c/%n", SYMLINK="%k" KERNEL="mice", NAME="input/mice" KERNEL="mouse[0-9]*", NAME="input/mouse%n" KERNEL="event[0-9]*", NAME="input/event%n" +KERNEL="js*", NAME="input/%k" +KERNEL="ts*", NAME="input/%k" # loop devices KERNEL="loop[0-9]*", NAME="loop/%n", SYMLINK="%k" @@ -92,8 +90,12 @@ KERNEL="loop[0-9]*", NAME="loop/%n", SYMLINK="%k" KERNEL="md[0-9]*", NAME="md/%n", SYMLINK="%k" # misc devices -KERNEL="rtc", NAME="misc/%k", SYMLINK="%k" -KERNEL="psaux", NAME="misc/%k", SYMLINK="%k" +KERNEL="rtc", NAME="misc/%k", SYMLINK="%k" +KERNEL="psaux", NAME="misc/%k", SYMLINK="%k" +KERNEL="agpgart", NAME="misc/%k", SYMLINK="%k" +KERNEL="rtc", NAME="misc/%k", SYMLINK="%k" +KERNEL="psaux", NAME="misc/%k", SYMLINK="%k" +KERNEL="uinput", NAME="misc/%k", SYMLINK="%k" # pty devices KERNEL="pty[p-za-e][0-9a-f]*", NAME="pty/m%n", SYMLINK="%k" diff --git a/sys-fs/udev/udev-015.ebuild b/sys-fs/udev/udev-015.ebuild new file mode 100644 index 000000000000..5b877874fec1 --- /dev/null +++ b/sys-fs/udev/udev-015.ebuild @@ -0,0 +1,144 @@ +# Copyright 1999-2004 Gentoo Technologies, Inc. +# Distributed under the terms of the GNU General Public License v2 +# $Header: /var/cvsroot/gentoo-x86/sys-fs/udev/udev-015.ebuild,v 1.1 2004/01/29 18:39:19 azarah Exp $ + +# Note: Cannot use external libsysfs with klibc .. +USE_KLIBC="no" +USE_EXT_LIBSYSFS="no" + +inherit eutils + +DESCRIPTION="Linux dynamic device naming support (aka userspace devfs)" +HOMEPAGE="http://www.kernel.org/pub/linux/utils/kernel/hotplug/udev-FAQ" +SRC_URI="mirror://kernel/linux/utils/kernel/hotplug/${P}.tar.bz2" + +LICENSE="GPL-2" +SLOT="0" +KEYWORDS="~x86 ~hppa" + +DEPEND="virtual/glibc + >=sys-apps/hotplug-20030805-r1 + >=sys-fs/sysfsutils-0.3.0" + +RDEPEND="${DEPEND} + >=sys-apps/baselayout-1.8.6.12-r3" +# We need some changes for devfs type layout + +pkg_setup() { + [ "${USE_KLIBC}" = "yes" ] && check_KV + + return 0 +} + +src_unpack() { + unpack ${A} + + cd ${S} + # No need to clutter the logs ... + sed -ie '/^DEBUG/ c\DEBUG = false' Makefile + # Do not use optimization flags from the package + sed -ie 's|$(OPTIMIZATION)||g' Makefile + + # Make sure there is no sudden changes to udev.rules.devfs + # (more for my own needs than anything else ...) + if [ "`md5sum < "${S}/etc/udev/udev.rules.devfs"`" != \ + "f3082e94beb6456f6693b893d4300c62 -" ] + then + echo + eerror "udev.rules.devfs has been updated, please validate!" + die "udev.rules.devfs has been updated, please validate!" + fi + + # Make sure we do not build included libsysfs, but link to + # one in sysfsutils ... + if [ "${USE_EXT_LIBSYSFS}" = "yes" -a "${USE_KLIBC}" != "yes" ] + then + rm -rf ${S}/libsysfs + cp -Rd ${ROOT}/usr/include/sysfs ${S}/libsysfs + fi + + # Setup things for klibc + if [ "${USE_KLIBC}" = "yes" ] + then + ln -snf ${ROOT}/usr/src/linux ${S}/klibc/linux + fi + + # Do not sleep if UDEV_NO_SLEEP is set + epatch ${FILESDIR}/${P}-no-wait-for-sleep.patch + + # Make logging a udev.conf option + epatch ${FILESDIR}/${P}-logging-config-option.patch +} + +src_compile() { + local myconf= + + # DBUS support? + if which pkg-config &>/dev/null && pkg-config dbus-1 &>/dev/null + then + myconf="USE_DBUS=true" + fi + + # Do not work with emake + if [ "${USE_EXT_LIBSYSFS}" = "yes" -a "${USE_KLIBC}" != "yes" ] + then + make EXTRAS="extras/scsi_id" \ + udevdir="/dev/" \ + ARCH_LIB_OBJS="-lsysfs" \ + SYSFS="" \ + ${myconf} || die + else + make EXTRAS="extras/scsi_id" \ + udevdir="/dev/" \ + ${myconf} || die + fi +} + +src_install() { + dobin udevinfo + into / + dosbin udev + # *** Note that we do not yet use or install udevd and udevsend, *** + # *** as they seem to be still too buggy (udevsend do not even *** + # *** start udevd over here ... *** + #dosbin udevd udevsend + dosbin extras/scsi_id/scsi_id + + exeinto /etc/udev/scripts + doexe extras/ide-devfs.sh + + insinto /etc/udev + doins ${FILESDIR}/udev.conf +# newins etc/udev/udev.rules udev.rules.example + # For devfs style layout + newins ${FILESDIR}/udev.rules.post_012 udev.rules + # Our own custom udev.permissions + doins ${FILESDIR}/udev.permissions +# doins etc/udev/udev.permissions + insinto /etc + doins extras/scsi_id/scsi_id.config + # DBUS support? + if which pkg-config &>/dev/null && pkg-config dbus-1 &>/dev/null + then + insinto /etc/dbus-1/system.d + doins etc/dbus-1/system.d/udev_sysbus_policy.conf + fi + + dodir /etc/hotplug.d/default + dosym ../../../sbin/udev /etc/hotplug.d/default/udev.hotplug + + doman *.8 + doman extras/scsi_id/scsi_id.8 + + dodoc COPYING ChangeLog FAQ README TODO + dodoc docs/{overview,udev-OLS2003.pdf,udev_vs_devfs} +} + +pkg_preinst() { + if [ -f "${ROOT}/etc/udev/udev.config" -a \ + ! -f "${ROOT}/etc/udev/udev.rules" ] + then + mv -f ${ROOT}/etc/udev/udev.config ${ROOT}/etc/udev/udev.rules + fi +} + |