diff options
author | Patrick Williams <patrick@stwcx.xyz> | 2016-06-20 12:57:21 -0500 |
---|---|---|
committer | Patrick Williams <patrick@stwcx.xyz> | 2016-06-24 15:22:19 -0500 |
commit | d8c66bc71e9a0303f1d300b9fa59c60dbfe10056 (patch) | |
tree | 0d5c0ade4cc7ae9d8df42bcb3ad376d95398465e /yocto-poky/meta/recipes-core | |
parent | 353dbdaaa97d78d064f0638221f57311f21f0bb3 (diff) | |
download | blackbird-openbmc-d8c66bc71e9a0303f1d300b9fa59c60dbfe10056.tar.gz blackbird-openbmc-d8c66bc71e9a0303f1d300b9fa59c60dbfe10056.zip |
Squashed 'yocto-poky/' changes from b1f23d1..8358e54
Upgrade subtree to Yocto-2.1.
6c1c013 build-appliance-image: Update to krogoth head revision
5f84d65 syslinux.bbclass: Remove APPEND from variable dependency
d9dd864 bitbake: toaster-tests: tests for build dashboard
1cf8f21 bitbake: toaster: add modal to select custom image for editing
a40a3e6 bitbake: toaster: add build dashboard buttons to edit/create custom images
e65c980 bitbake: toaster-tests: make helper click on input before entering text
484cbf8 bitbake: toaster-tests: add tests for new custom image page
437b728 bitbake: toaster: prevent exception when Project.release is null
cfc22d3 bitbake: toaster: only prevent duplicate custom image names within a project
3036413 bitbake: toaster: disable/enable "Add layer" button according to input's content
040dbf6 bitbake: toaster: fix sorting after hiding a column in build tables
1b11b79 bitbake: toaster: ensure ToasterTable headings are reset when order by changes
9855840 image.bbclass: The wrong name is being used for the debug filesystem
38c7e2d image_types: Ensure rootfs dependencies cover DEBUGFS
0c3eaa7 syslinux.bbclass: The AUTO_SYSLINUXMENU value needs to be boolean
9c8a049 perf: pass DESTDIR in EXTRA_OEMAKE
9de7324 buildtools-tarball: set INHIBIT_DEFAULT_DEPS
ef09105 xf86-video-omapfb: remove EXTRA_OECONF_armv7a
c2f7da2 base.bbclass: Introduce PACKAGECONFIG_CONFARGS variable
e1c6890 git: update to 2.7.4
98bf7de license.bbclass: do write_deploy_manifest in image postprocessing
519600c devtool: sdk-update: fix handling of UNINATIVE_CHECKSUM changes
c7980b6 bitbake: main: fix processing of BBEVENTLOG
ee25d0e toasterconf.json: Update for krogoth release
b8e5de2 toasterconf.json: Remove fido from supported configurations
c59771e toasterconf.json: Update for krogoth release
d0bce0b toasterconf.json: Remove fido from supported configurations
d25eea3 poky-tiny.conf: set PREFERRED_VERSION_linux-yocto-tiny to 4.4
9f970b6 dev-manual, profile-manual, ref-manual: Purging Oprofile stuff
1d93104 ref-manual: Added description for the testsdk.bbclass.
db47094 ref-manual: Updated the remove-libtool.bbclass description.
a16eeca ref-manual: Added gobject-introspection.bbclass description.
3e761b4 ref-manual: Added reference for npm.bbclass.
5e50157 ref-manual: Fixed typo in the nopackages.bbclass description
f7b68c7 ref-manual: Added description for bash-completion.bbclass
ece900a ref-manual: Added nopackages.bbclass description. Fixed stray typo.
9143e9e ref-manual: Added description for the INSTALL_TIMEZONE_FILE variable.
6391dbf ref-manual: Updated the PREFERRED_PROVIDER variable with a note.
6d86f7a ref-manual: Dropped references to the autotools_stage class
4d5ff5e ref-manual, dev-manual: Scrubbed boot-directdisk and bootimg classes
cd2aaaa ref-manual: Updated the uninative.bbclass description.
e975d26 documentation: Converted "meta-yocto" to "meta-poky"
84452ee bsp-guide: Updated yocto-bsp create example output.
e00a62c ref-manual: Added the migration section for 2.1
02db9e6 yocto-project-qs, ref-manual: Upgraded minimum Git requirement
989841f ref-manual: Added rootfs-postcommands class description.
d06b343 ref-manual: Updated the EXTRA_OEMAKE variable description.
ecb2eb6 dev-manual: Updated "Additional Implementation Details" section
004b939 bitbake: lib/bb/utils: add docstring for contains()
524d04c ca-certificates: support Toybox
ecaf12e oetest: make console output more verbose
4946ecf dhcp: CVE-2016-2774
c219c6d buildtools-tarball: fix perl being included when building with ipk
9fe7738 buildtools-tarball.bb: fix unexpected operator
ed07f43 lib/oeqa/selftest/base.py: Correct a reference to meta/lib/oeqa/selftest
8953d83 oe-selftest: Correct the usage examples
dee47ad devtool: sdk-update: reset git metadata on update
396e64d build-appliance-image: Load TUN at startup
55068b1 default-providers.inc: set openssl PREFERRED_PROVIDER to openssl
74ab080 bind: CVE-2016-2088
d488d78 rpm: Disable __sync_add_and_fetch_8 on nios2
9d2d1ae kernel: fitimage: Fix do_deploy taskhash mismatch
4693593 images: zero out the rootfs_extra_space in initramfs images
8beb671 ext-sdk-prepare.py: exclude do_rm_work from unexpected output; create unit test
0262bc5 bitbake: bitbake-user-manual: Updated the 'bitbake -h' output example.
890ccd3 bitbake: bitbake-user-manual: Updated "Conditional Metadata" section
20a0121 bitbake: bitbake-user-manual: Updated discussion about using "inherit"
9f374c4 bitbake: providers: Add PREFERRED_RPROVIDER support
4b8b110 bitbake: providers: We don't depend on previous build results
8e7282c bitbake: cooker/knotty: Prefix parse logs with filename being parsed
1131303 bitbake: cooker: pass exception to finishAsyncCommand
ffa2ca0 fs-perms.txt: fix ROOT_HOME's permission
fd66a38 Revert "fs-perms.txt: fix ROOT_HOME's permission"
9ec9557 buildstats: Fix tracebacks for early task failures
7f9d01e default-providers: Update to use PREFERRED_RPROVIDER
76f4bbc oeqa/selftest/sstatetests: fix no-op sstate test
6326812 buildhistory: don't alter SDK creation stamps
bb40b5e dhcp: Enable update-rc.d service
27e202f meta/classes/qemu.bbclass: set -cpu of ppce5500/ppce6500 to e500mc
7c5823a shadow: Disable syslog for more commands
60a8719 devtool: upgrade: handle recipes where source is not first entry in SRC_URI
8353557 devtool: update-recipe: handle where SRC_URI is appended to with +=
aab3c8d linux-yocto: make aufs4 optional
d75d2be linux-yocto: tiny and pin ctrl config updates
8547cbf linux-yocto/4.4: BXT enablement
ffad386 linux-yocto/4.1: mainline SPI backports
4ba33a3 linux-yocto/4.4: gpio-pca953x: fix the "drive" property cannot read/write
86571db devtool: don't copy .git when building the eSDK
83eac65 package.bbclass: improve permission handling
eeae2ac fs-perms.txt: fix ROOT_HOME's permission
1db3dc8 runqemu: let ramfs equal to cpio.gz
a8c8e81 gcc-common.inc: String format tweak for available tunes
a7c426a pbzip2: fix LIC_FILES_CHKSUM following 1.1.12 -> 1.1.13 upgrade
1229009 pbzip2: don't skip do_configure
1e4ee30 useradd_base.bbclass: remove flock option '-w'
cb45ef3 matchbox-keyboard: Hide desktop launcher
69e20ca npm.bbclass: Stop packagenames containing underscores from being generated
c3c55478 bind: CVE-2016-1285 CVE-2016-1286
c4387a8 image.bbclass: add DEB_{PRE, POST}PROCESS_COMMANDS to rootfs_command_variables list
967bc74 rootfs.py: apply ROOTFS_POSTINSTALL_COMMAND to all package formats
f7352ca wic: fix bug in handling fsoptions
b2f5de5 buildtools-tarball.bb: set TOOLCHAIN_NEED_CONFIGSITE_CACHE to null
a460b04 rpm: more verbose errors in rpmTempFile
a43991d rootfs-postcommands: handle broken links when writing manifest
2c81e17 socat: Use c_ispeed and c_ospeed based upon libc
5c8124d archiver: Improve debug output
e912c46 kbd: remove uclibc-stdarg.patch
965fd3c image.bbclass: use max() instead of indexing booleans
6d85874 linux-yocto-tiny: fix KBRANCH
440d949 sudo: fix pam config on systemd systems
3fd5a6d sysvinit: make lastb.1 an alternative
175263e lib/oe/lsb: sanitise the distro identifier
9262d2f package.bbclass: handle links in sorted order
29cf263 sanity: allow sftp and ssh mirrors
f503317 toaster.bbclass: improve package information collection
88f4178 rsync: remove upstream's rebuild logic
8d59d06 rsync: pass cached configure values through the right variable
384e41c rsync: don't install acinclude.m4
e80800e Revert "oeqa/selftest/wic: add test case for sparse images"
45c0763 Revert "wic/utils/partitionedfs.py: assemble .wic images as sparse files"
e0e5426 bitbake: runqueue: Improve 'mulitiple .bb files are due to be built' message
380004b archiver: Ensure sstate-inputdir directory is created
3ad70a5 linux-yocto-tiny: fix COMPATIBLE_MACHINE
0e59727 glib-2.0: Put glib-compile-schemas back in -utils
d27ca36 oeqa/runexported.py: Fix exported test
85dbd7b oeqa/selftest/sstatetests: split 32/64 build host from no-op action tests
57be6dd util-linux: take ownership of hwclock if installed
acc1f96 meta: remove redundant ac_cv_sizeof_off_t assignments
92759d8 meta/site: remove sizeof_off_t
5602f64 archiver: Fix ASSUME_PROVIDED issues
fab626c distrodata: Exclude DATETIME reference from sstate checksum
faaeaf9 build-appliance-image: Support for VirtualBox guest additions
778121a local.conf.sample: Make it possible to override EXTRA_IMAGE_FEATURES
f947c27 poky.conf: add Fedora 23 to supported distros
f33a110 maintainers.inc: remove adt-installer
83d4fab local.conf.sample: remove reference to adt
52cfdb6 bitbake: toaster: fixes for customimage package not found
dae4ffb bitbake: data_smart: Restrict expansion regexp to not include : characters
7e739ac bitbake: tests/utils.py: test origvalue in a callback matches what is expected
e1e459e bitbake: lib/bb/utils.py: Fix a bug in edit_metadata() that could corrupt vars
43150ab oeqa/selftest/wic: add test case for sparse images
29bc2f7 wic/utils/partitionedfs.py: assemble .wic images as sparse files
7fdb061 image-vm.bbclass/image_types.bbclass: IMAGE_NAME -> IMAGE_LINK_NAME
04e1978 image_types.bbclass: fix elf
513ea49 image_types.bbclass: set nodesize for btrfs
bad434b libxml2: fix AM_PATH_XML2
9fe3d01 useradd_base.bbclass: prevent variable expansion in $opts
fb8e5f9 extrausers.bbclass: drop retry count for perform_user/group* calls
f737af4 build-perf-test: add eSDK installed size to metrics
50f5ca3 rpm: brace expansion is a bashism
66ecbd3 openssl.inc: minor packaging cleanup
e38ec0c systemd-systemctl-native: fix unit detection
4019058 apr-util: fix path in rules.mk for nativesdk
bdf453f bdwgc: installed-vs-shipped for nativesdk
12ca8df libsolv: fix installed-vs-shipped for nativesdk
c88c894 desktop-file-utils-native: disable emacs
d4f6c0e toaster: add DL_DIR and SSTATE_DIR to oe toasterconf
69b3f87 toaster.bbclass: strip task from the target
aa45c75 x11-common: Add PACKAGECONFIG for screen blanking
d366a33 opkg-utils: re-do find/ls code to not fail on filenames with spaces
5e360ca image-live.bbclass: fix iso + efi only
f5adb23 Add missing runtime dependency to python-pygobject
0720425 devtool: Create unlocked-sigs.inc containing items in the workspace
64cca7e sstatesig.py: Add a method to "unlock" recipes
1cb99dd populate_sdk_ext.bbclass: Enable locked sigs errors
2431ed7 sstatesig.py: Improve the SIGGEN_LOCKEDSIGS_TASKSIG_CHECK message
7e90280 sstatesig.py: Split single locked sigs check into multiple checks
7ce800c toasterconf.json: Set default distro to nodistro
1b7b548 dev-manual: Updated poky-floating-revisions file snippit example.
8d9e233 dev-manual: set correct task name for do_kernel_configme
6971029 poky-floating-revisions: Fix typo
14e2b90 toasterconf.json: Add DL_DIR and SSTATE_DIR to poky toasterconf
296dfbc build-appliance-image: Update to master head revision
00c4c9b poky: Convetion is 2.1, not 2.1.0
8cd1dec build-appliance-image: Update to master head revision
ecd58bb poky.conf: Bump version for 2.1.0 krogoth release
e955b5d bitbake: Update version to 1.30.0
4fd14e3 build-appliance-image: Update to master head revision
133224f documentation: Fixed references using the DISTRO_NAME variable
3831ca0 documentation: Updated release date in manual history tables.
b590fab dev-manual, ref-manual, sdk-manual: Removing oprofile references.
d2084cc Makefile: Removed adt-manual support
2677098 mega-manual: Removed the adt title .PNG file.
d9b4c80 README: Updated to remove the ADT manual and add the SDK manual.
9796cbb mega-manual.sed: Removed adt-manual processing
aa4b72b yocto-project-qs: Updated the minnowboard example.
f2505af poky.ent: Added lower-case distro name variable.
ee42a9b kernel-dev: Applied review comments to "Adding Recipe-Space Kernel Features"
d57fe7c ref-manual: Updated the PREFERRED_VERSION variable description.
53bade8 dev-manual: Added new section describing hardware and non-hardware config
763ae4e ref-manual: Updated verbiage on proxy handling
a1295ed ref-manual: Updated PREFERRED_VERSION variable description
879eec2 ref-manual: Updated debugging tips and tricks
23dbf81 kernel-dev: Added new "Adding Recipe-Space Kernel Features" section.
f30bfe9 kernel-dev: Updated the "Kernel Metadata Location" section.
53729bc sdk-manual: Removed three sections of writer notes.
9f0c571 sdk-manual: Applied review edits.
d4bdafa sdk-manual: Added sections in Appendix B.
d94fa00 dev-manual, profile-manual: Removed oprofile section and link
4f3dfa8 bitbake: bitbake: update LICENSE file with QUnit details
013984d bitbake: tests: browser Add test to run the js unit tests
7609888 bitbake: toaster: views jsunittest Add MACHINE and an extra layer to test project
fbc2c5d bitbake: toaster: tests Set MACHINE for the test projects
cb6b4eb bitbake: toaster: Add quint to project so that it can be used offline
18cb7fe bitbake: toaster: add rev dep column to image detail pages
7a309d9 bitbake: buildinfohelper: work around unicode exceptions
860cba8 bitbake: toasterui: update build in internal state
acb9407 bitbake: buildinfohelper: fix KeyError
52c8740 bitbake: toaster: get bitbake location from BBBASEDIR
f5d3ef6 bitbake: toaster: export BBBASEDIR variable
71ff9b9 bitbake: toaster: update projectconf.html for DL_DIR and SSTATE_DIR
705d44f bitbake: toaster: update view to support DL_DIR and SSTATE_DIR
4aafcae bitbake: toaster: use empty token
5ce4665 bitbake: toaster: runbuilds Clean up runbuilds
55b6fab bitbake: toaster: runbuilds Make runbuilds aware of the build CANCELLED state
f4cee88 bitbake: toaster: models Exclude the CANCELLED builds from get_number_of_builds
296d373 bitbake: toaster: mrb_section template Add build cancel button
f1b49dc bitbake: toaster: tables BuildsTable exclude cancelled builds
22242ae bitbake: buildinfohelper: Add handler for cancelling a build
9dcb9cb bitbake: toaster: bldcontrol models Add a cancelling state the BuildRequest
dfa8510 bitbake: toaster: models Add cancelled state to build outcome
5f862bb bitbake: toaster: update BuildEnvironmentController and BitbakeController
0db62c5 bitbake: toaster: libtoaster Update implementation of startABuild and cancelABuild
afab95c bitbake: toaster: xhr Update the implementation of the build cancellation request
eead032 bitbake: toaster: Move xhr calls for starting and stopping builds
f5aa970 bitbake: toaster: bldcontrol Add forceShutDown function to BitbakeController
d6992a8 bitbake: toasterui: shutdown on BuildCompleted event
c4ae028 bitbake: toaster: use bash explicitly
4adddfd bitbake: toaster: fix jethro build
b1a919a bitbake: toaster: update conf/local.conf
590a815 bitbake: toaster: stop bitbake server after the build
a8f6001 bitbake: toaster: add new parameter to _shellcmd
a43a16b bitbake: toaster: reimplement triggerBuild
ab18c20 bitbake: toaster: modified setLayers API
22fba9b bitbake: toaster: add brbe parameter to triggerBuild
829a0bd bitbake: toaster: remove release API
7068e8a bitbake: toaster: remove startBBServer API
9d4c62d bitbake: toasterui: fix brbe reporting
5bcce68 bitbake: buildinfohelper: improve handling of providermap
61b6b98 bitbake: uievent: improve BBUIEventQueue code
0b0d754 bitbake: toasterui: add brbe parameter to buildinfohelper
94ac3f0 bitbake: toaster: set BITBAKE_UI environment variable
e23a23b bitbake: toaster: get rid of noui option
f77baec bitbake: toaster: don't start bitbake server
4127fef image_types: use compress framework to produce checksums for images
60786b8 runqemu-gen-tapdevs: Add note about NetworkManager & tap devices
634aeed libtool: fix contaminated path to lt_truncate_bin
298d875 create-pull-request: fix for newer git
4faeff9 wget: fix build when len(TMPDIR) == 410
b667f4d sanity.bbclass: fix a hardcode in check_path_length()
94b3583 grub: remove unused 0001-Fix-build-with-glibc-2.20.patch
ef163ab glibc: remove unused CVE patches
b050ab2 clutter-gst-3.0: remove unused enable-tests.patch
064ebd5 cmake: remove unused dont-run-cross-binaries.patch
a71db4c tcl: remove unused fix-configure.patch
476eeea rpm: remove two unused patch
3d56864 ffmpeg, gstreamer1.0-libav: add textrel INSANE_SKIPs
8cc10a9 ffmpeg: Make configure options explicit
45c1944 bzip2: set correct soname
cbe33ec useradd.bbclass: remove user/group created by the package in clean* task
c115740 bitbake: fetch2/git.py: remove .indirectiondir workaround
4f07c22 bitbake: persist_data: Return str instead of unicode for sqlite3 text queries
d8f1f42 scripts/oe-selftest: avoid the creation of coverage file when coverage not installed
6e5e225 scripts/oe-selftest: remove coverage file if any coverage option is given
5edfec4 scripts/oe-selftest: remove unneeded coverage warning
8109e93 patch.bbclass: remove useless path assignment
7963613 gstreamer: remove now-redundant expansion in do_split_packages
37f4f5b package: do_split_packages: expand variables in extra_depends
2ed2089 xf86-video-intel: Add patch to fix some poor image quality
c1436b3 sanity: Increase minimum git version to 1.8.3.1
672545b scripts/oe-buildenv-internal: Fix regression in BB_ENV_EXTRAWHITE setting
f7fed7c license.bbclass: fix warnings when run in unprivileged "container" env
43071a0 externalsrc: avoid race in temporary git index file
f4f1d20 scripts/lib/bsp/help.py: Typo in help for yocto-bsp create
1bd2c8e bdwgc: use github repo for source location
0e6743b xf86-video-intel: Add patch to allow UXA to build
21e31c2 package_manager.py: better error handling in opkg's package listing
f2d5e20 systemd: make systemd-serialgetty optional
e699404 ncurses: reorder PACKAGES
f94ad4d bluez5.inc: remove obsolete workaround
a0cd8c0 buildtools-tarball: Add texinfo (for makeinfo)
9877795 cogl: fix G-I .typelib installation
b13184c classes/buildhistory: fix grammar in comments
e5c0a9f classes/buildhistory: fix filtering of depends-nokernel.dot
4d364f2 classes/buildhistory: optimise getting package size list
af5f423 bitbake: siggen: Ensure tainted stamps are accounted for with writing custom stamps
47e9e12 bitbake: siggen: Fix nostamp taint handling
8033627 bitbake: siggen: Add checksum recalculation/checking code
3e1b5e0 bitbake: siggen: Fix check calculation problem with file_checksums
39b637c bitbake: siggen: Drop misleading duplicate method
2c722e2 bitbake: tests/fetch.py: Improve unit tests for trusted network check
cf6d12d bitbake: fetch2: BB_ALLOWED_NETWORKS should not care about port numbers
158575c bitbake: toaster: orm better detect requires during CustomImageRecipe generation
c634473 bitbake: toaster: Correct typo on build form help text
c9ad1e6 bitbake: toaster: buildinfohelper Add additional metadata to the built layer
072a0b3 poky: Exclude DATE from DISTRO/SDK_VERSION checksums
f3c029f build-appliance-image: Exclude DDATETIME from task signature
7833eb4 image-vm: Exclude DISK_SIGNATURE_GENERATED from task signature
85ff4ff populate_sdk_ext: Exclude BBTASKDEPDATA from task signature
66412ab opkg-utils: opkg-build exit when fail to list files.
6b8f8a4 kernel-yocto: enforce SRC_URI specified branch
6ebd43c linux-yocto/4.4: UVC: Add support for R200 depth camera
6d2299f linux-yocto/4.4: fix PAT for 32bit x86
5559301 Revert "linux-yocto: Work around PAT issue on qemux86"
686c74f linux-yocto-dev: bump to v4.6-rcX
b3ba813 linux-yocto/4.1: ahci: backport AHCI runtime PM
8f7bbea linux-yocto/4.4: gpio-pca953x: add PCAL9535 interrupt support
4a50c05 linux-yocto/4.1: telemetry and dmaengine backports
31a10cb wic/isoimage-isohybrid.py: change cpio generated uid&gid to root
5cabf3b wic/isoimage-isohybrid.py: use glob to find initramfs location
5c60c36 bluez5: add ptest support
fc8b24d oe/patch: print cleaner error message when patch fails to apply
bf14014 oe/patch: more detailed error reporting
a2bf9e3 insane.bbclass: avoid false positives on library location
1f2f43c grub-efi.bbclass: use GRUB_ROOT rather than APPEND for root device
bf58526 bitbake.conf: Add BB_WORKERCONTEXT to HASHBASE_WHITELIST
1c1e851 gdb-cross-canadian: use PACKAGECONFIG for python and readline
370a50a base: Fixup PACKAGECONFIG incorrect mappings
dea3423 classes/packagegroup: Refactor code to be simpler
5defbcd default-distrovars.inc: remove libassuan from LGPLv2_WHITELIST_GPL-3.0
58d8123 libassuan: use package specific licensing
1f2a01b init-install-efi.sh: remove all root=foo from grub.cfg
3ce7d8c init-install.sh: fix disk_size
46eed0a ltp: fix test_proc_kill hanging
207ee90 ltp: add periodic output for memcg stress test
feafad1 epiphany: Depend on intltool-native for configure
2510239 image: Fix debugfs image type recursion loop
7dcb4c4 bitbake: toaster: tests Migrate landing page tests to Selenium
5b848fa bitbake: toaster: tests Migrate all projects page tests to Selenium
f2a38ea bitbake: toaster: tests Migrate project builds page tests to Selenium
961cd90 bitbake: toaster: tests Migrate all builds page and project page tests to Selenium
f859a3d bitbake: toaster: tests Migrate to Selenium for UI tests
965c72c yocto-bsp: Set correct default branches and branches base for i386, qemu and x86_64 archs
d110eba selftest/signing: Use packagedata to obtain PR value for signing test
34f11b5 lib/oe/packagedata: Add import os
0012b90 base.bbclass: avoid duplicate call to d.getVar('LICENSE', True)
efe73cb base.bbclass: drop obsolete HOSTTOOLS_WHITELIST_GPL-3.0
5293b83 man: use BUILD_CC and target include files for configure
5121705 scripts, lib: Don't limit traceback lengths to arbitrary values
3168134 bitbake: bitbake: Don't limit traceback lengths to arbitrary values
88ea0b9 image-vm.bbclass: remove invalid code
4d1df2c image-live.bbclass/image-vm.bbclass: remove duplicated code
d6d7526 bootimg.bbclass: merge it into image-live.bbclass
723fa56 boot-directdisk.bbclass: merge it into image-vm.bbclass
9e588481 man: fix several annoying compile/build warnings
aa13b97 image.bbclass: Make unneeded packages for a read-only rootfs configurable
4dde12f relocate_sdk: additional error checks
22bd875 systemd: fix build with gcrypt PACKAGECONFIG disabled
4b77909 devtool: modify: call shutdown on tinfoil when done
43da712 toolchain-shar-extract.sh: ensure all_proxy is allowed through
2aec71e oe-publish-sdk: exclude sstate-cache if publishing minimal SDK
8ef7016 oe-publish-sdk: prevent specifying a directory for the SDK argument
591b97c classes/populate_sdk_ext: support setting vars from environment at build time
c37d542 scripts, lib: Don't limit traceback lengths to arbitrary values
8049f25 pyton-numpy: Add definition of off_t size
b75505e image-live.bbclass: DEPENDS on syslinux
3ece012 ldconfig-native: Fix ELF flags on 64-bit binaries
d492aec recipes-support/rng-tools: Change runlevel start from S to 2, 3, 4, 5.
ab5c62e oeqa/runtime/parselogs.py: Add systemd unit circular dependencies errors.
9be3fb2 systemd-serialgetty: allow baud rate overriding
cf6788c psmisc: Remove including sys/user.h and __WORDSIZE
ede11b6 selftest: Added testcase decorator to tests
ccfe48c linux-yocto: add overlayfs feature
6ae0224 linux-yocto/4.4: broxton and usb type-c backports
e1ae3ee linux-yocto/4.4: drm/i915/skl: Fix DMC load on Skylake J0 and K0
0a1d621 linux-yocto/4.1: Intel Broxton: pwm backports
6ce8802 linux-yocto/4.1: Apollo Lake/Broxton mmc backports
a256628 linux-yocto/4.1: i2c: designware: Backport i2c patches
fbd209d linux-yocto/4.1: device property backports
ccf1b33 linux-yocto/qemuarm64: enable 32 bit compatibility
dacf9f2 linux-yocto/4.1: SMBus/iTCO backports
ab6fd48 default-distrovars.inc: remove gnutls + libtasn1 from LGPLv2_WHITELIST_GPL-3.0
2123a7e sanity.bbclass: Use pythonexception to raise real exceptions without backtraces
6af88d8 sanity: Require bitbake 1.29.1
1b2df6e uninative: Switch md5sum -> sha256
f719386 bitbake: cookerdata.py: remove slash in the end
e26087f bitbake: Bump version to 1.29.1
d73da22 bitbake: build/utils: Allow python functions to execute with real exception handling
672c07d bitbake: fetch2: Ensure that incorrect checksumed files are always renamed
2554be4 bitbake: cooker: fix CookerParser.shutdown()
53b5dc0 gcc: Fix musl ldso name for mips64
dd31bca selftest/buildoptions.py: use INHERIT +=
71db079 archiver.bbclass: addtask do_deploy_archives_setscene
1ca71e5 bitbake: cooker: Ensure bbappend order is deterministic
292c3e8 bitbake: checksum: In FileChecksumCache don't follow directory symlinks
326fc29 gcc-5.3/gcc-4.9: -fdebug-prefix-map support to remap relative path
9e20f94 ptest-runner_2.0.bb: Update recipe to point git.yoctoproject.org repo.
437841c man: fix src/Makefile to work with parallel make
abb5b46 oeqa/selftest/bbtests: Test bbappend order
ddbeb56 bitbake: cookerdata: Improve handling of ParseError
6dff639 gcc: Backport fixes for musl ssp configuration
ab20659 siteinfo: Fix musl 64bit targets
cd16b65 musl: Update to tip
0883aff buildhistory.bbclass: create image directory when needed
c093f7c runqemu: fix for iso
f1f9f89 init-live.sh: fix overlay fs
4e7eaed init-live.sh: fix ROOT_MOUNT
1622077 no-static-libs.inc: build static libusb1-native
b3e4a31 sstatesig: Ensure we keep native depends for allarch recipes
528a890 oe-selftest: generate .env only in test_image_env
21823cb build-appliance-image: Update to master head revision
7d251f7 build-appliance-image: Fix permissions
60656d0 bitbake: fetch2/wget.py: _check_latest_version_by_dir fix prefix detection
45ee2b1 bitbake: fetch2/wget.py: _check_latest_version_by_dir use group names
55cd35b conf/bitbake.conf package.bbclass: fix dbg package not contain sources while -fdebug-prefix-map used
e2b919c externalsrc: remove nostamp from do_configure
bbfc210 externalsrc: do not use do_configure[nostamp] for git srctrees
9ee403b archiver.bbclass: Just archive gcc-source for all gcc recipes
37683ef oeqa/utils/ftools: improve remove_from_file algorithm
3a934a8 scripts:/oe-selftest: Use timestamp instead of test names in coverage data file
71304d8 xcursor-transparent-theme: upgrade to latest git revision
7c5343a gdb: Fix build on mips64/musl
856be1f libunwind: Fix build on mips/mips64 for musl targets
dd61341 toolchain-shar-extract.sh: check the length for target_sdk_dir
c3c793b relocate_sdk: fixed .gccrelocprefix section handling
cc97d57 glib-2.0: Fix packaging
cef8bc9 gio-module-cache: Add class for Gio modules
0cda9d8 glib-2.0: Install gio-querymodules in main package
9ac1b6f oe-git-proxy: support username / password in http proxy
a15541d oe-git-proxy: also check all_proxy and http_proxy env variables
92b2bc5 wic: Update after task ordering changes
d6cb46c image.bbclass: run wicenv task only for wic images
5cb7705 wic: fix type of no-table option
1209eb2 matchbox-desktop: Do not close desktop on alt-F4
0361676 rootfs-postcommands: don't write manifest when IMAGE_MANIFEST empty
abd5b24 bitbake.conf: rename 'gobject-introspection-data' machine feature to 'qemu-usermode'
f81065f selftest/devtool: Update after make PROVIDER changes
25a04ee make, remake: make them properly exclude each other
f3a92ff kernel.bbclass: consider .csp firmware files
0569b69 tzdata: update to 2016c
a7e726a tzcode: update to 2016c
201d9d3 icecc.bbclass: replace icc with icecc
da00f6c icecc.bbclass: expand package arch
3f1702c icecc.bbclass: add icc_is_allarch inherit check
39170fe classes/sanity: use proper multi-line string literals
33a6135 oe-buildenv-internal: simplify derivation of BB_ENV_EXTRAWHITE
c6ab828 u-boot.inc: Add sub-dir support for SPL_BINARY
ddedab4 quilt: run ptest as normal user
afa4d5e site: Cache config vars for ccache
04344eb gdb-cross: use PACKAGECONFIG for python and readline
5005cab add !meta-poky to .gitignore file
1dd9348 scripts/lib/bsp/help.py: Add missing options to yocto-bsp help and usage
54eca75 poky-sanity.bbclass: update conf/templateconf.cfg for existing installations
2b992f3 site.conf.sample: fix reference to oe-git-proxy script
af63b49 conf-notes: remove reference to adt-installer
1d219ce linux-yocto: Update SRCREV for genericx86* for 4.4
8d4f43e linux-yocto: Update SRCREV for genericx86* for 4.1
84d5924 bitbake: fetch2: Handle lockfiles for file:// urls redirected to mirrors
b036afb bitbake: toaster: get all dependents for pkg for removal
9bf98a9 bitbake: toaster: new customise package-remove modal dlg
d5a419d bitbake: toaster: show full list of dependents to remove
fda94f4 bitbake: bitbake: fetch2/gitsm: Fix fetch when the repository contains nested submodules
1341c17 pseudo: backport a patch to fix xattr removal
07f0af3 uninative: don't try to relocate static binaries
c3c0d0a lib/oe/qa: add method to check if static or dynamic linked
10b6037 uninative: ensure patchelf errors are visible
86d7e44 libmad: remove use of obsolete _thumb over-ride
e7395c8 perf: package python modules into perf-python
b47225f perf: fix python scripts QA errors
ea8b914 linux-yocto/4.1: MFD backports
b6563a1 linux-yocto/4.1: device property : Backport device property patches
46baceb linux-yocto: ktypes/standard: Add tmpfs-posix-acl feature
bdf6b20 linux-firmware: Break out some additional firmware
6d8141f linux-firmware: Clean-up and sync license data
cea2a21 linux-firmware: Collapse iwlwifi firmware blobs for 7260 and 7265
3b3fe1d linux-firmware: Update to latest HEAD
d7cf2c3 archiver.bbclass: Fix tar name for git repositories
2cb4cb7 archiver.bbclass: Fix gcc-source corner case
c29eea0 archiver.bbclass: Fix use of ARCHIVER_WORKDIR and ARCHIVER_OUTDIR
8b7ee6e archiver.bbclass: Don't expand python functions in dumpdata
bc100b3 bind: /var/cache/bind
04d883c sysvinit: downgrade ALTERNATIVE_PRIORITY[mountpoint]
688d9a6 util-linux: split out util-linux-mountpoint
85ff75d gconf: fix buildpaths QA issue
7f7c9ab python-pygobject: use Python 2 instead of Python 3
e33124f sanity.bbclass: check host tool dependencies on change in NATIVELSBSTRING
4fe64d7 libunwind: Fix build with fstack-protector on musl
4aa08b8 ltp: Fix build on x86/musl
959b7f2 package.bbclass: Treat .node files same as .so when checking what to strip
e0bc781 bootimg.bbclass: only inherit syslinux when pcbios
1b1de89 grub-efi.bbclass: make it can build vm and live together
4ebaeb2 bootimg.bbclass: fix settings for grub-efi.bbclass
af1f77a pixz: Fix build on big-endian/musl systems
421289c sanity.bbclass cleanup
93e411e matchbox-wm: Update to fix XChangeProperty datatype issue
c843022 matchbox-panel-2: Fix Home-button icon load issue
01f6818 gstreamer1.0: fix introspection support also for git recipes
171adb1 gstreamer1.0-plugins-bad: fix incorrect handling of Cflags in gstreamer-gl.pc file
6462d08 x86-base.inc: suggest the latest kernel
c5c9ed6 at: fix configure option with/without-selinux
9b2b1f0 no-static-libs: just like target and native, nativesk-libcap doesn't like unrecognised options
bf90d0c linux-firmware: package firmware for Marvell 88W8688
cd17ab0 tune-arm926ejs: Handle missing thumb suffix
5b70c7e nativesdk-coreutils: a lot of warnings fixed
b47c53b runqemu-internal: split the code into functions
fae732f runqemu-internal: cleanup unsed code
e469bb7 runqemu: simplify checking for iso and ramfs
3610329 runqemu: add support for qcow2 and vdi
d85ca4a runqemu: remove ISO and RAMFS from help text
58bc854 runqemu: simplify the checking for vm images
6716eb2 runqemu: fix ROOTFS for vmdk
258cfa8 python(3): Disable tkinter
5988b5c selftest/signing.py: RPM_GPG_PASSPHRASE_FILE -> RPM_GPG_PASSPHRASE
3e5c5fe gpg_sign.py: get rid of pexpect
05d7e0d rpm: check _gpg_passphrase before ask for input
13a31b1 oe-publish-sdk: fix remote publishing
9926425 oe-publish-sdk: improve help output slightly
905286c oe-publish-sdk: drop SDK installer file from published output
0523378 devtool: add: create git repository if URL specified as positional argument
11c1d30 devtool: add: delete externalsrc files on npm recipe do_install
552a68a devtool: configure-help: fix error if do_configure not already run
eab3f06 bitbake.conf: whitelist proxy variables in config hash
58d2e56 classes/populate_sdk_ext: parse metadata on minimal SDK install
0684572 devtool: sdk-install: add option to allow building from source
50addfb classes/distutils*: don't hide logs when setup script fails
0ec30c7 classes/packagegroup: drop complementary -ptest if ptest not in DISTRO_FEATURES
d96ea29 classes/packagegroup: fix dbg/dev/ptest complementary packages
b58e5b1 bitbake: bitbake: xmlrpc: set single use mode differently
2df514b sdk-manual: Added note for running remote apps with SSH port forw enabled.
12f5c25 poky.ent: Added code name for 2.1 release to the variable
64241e0 sdk-manual: Applied more review edits to the manual per Eggleton.
b44d9e5 ref-manual: Created distrodata and checkpkg tasks, updated distrodata class
54050ff sdk-manual: Applied 2nd round of review edits.
6db8cbc sdk-manual: Applied review edits to the manual.
922eaeb sdk-manual: Updated the SDK devtool modify flow diagram.
2bbf77a dev-manual: Fixed a grammar error
286b76f sdk-manual, mega-manual: Updated the SDK devtool modify diagram
c3946bc dev-manual, profile-manual, ref-manual: Updates to remove meta-toolchain
7233e35 sdk-manual: Edits to add extensible SDK configuration sections.
b31bf7c ref-manual, sdk-manual: Changed section heading.
670735e ref-manual: Added some SDK manual support to introduction
266742b profile-manual: Updated screen output for oe-init-build-env
0654224 kernel-dev: Changed a link from an example to in-text.
19e3648 dev-manual: Edits from a 2.1 read-through.
a389684 poky.ent: Fixed a typo in one of the variables "ftar" to "tar"
b5d3065 poky.ent, bsp-guide: Removed eMenlow example and updated 2.1 variables
884b528 yocto-project-qs: Performed a read-through edit.
4b42385 poky.ent: Updated copyright year and version variables.
ae48b1f mega-manual: Added two new sections for the sdk manual
815d686 sdk-manual: Added some intro stuff about the SDK
4c5157f ref-manual: Resolving a conflict
4306f7f sdk-manual, mega-manual: Added new figure for Eclipse flow.
0bb6e48 sdk-manual: WIP on the book.
5a64701 sdk-manual, mega-manual, Makefile: Added new figures
32629e0 Makefile: Resolving a conflict
af40e9a sdk-manual: Added a new figure for installed extensible sdk directory.
62477889 sdk-manual: Applied some "red" text formatting to indicate notes
7ab8afa Makefile: Added the ".png" part to a figure I forgot.
fc43555 sdk-manual: Added a red-text "role" to the style sheet.
d07100d sdk-manual: Added new section detailing installed SDK directory.
b750729 sdk-manual-customization: Fixed XSL Appendix numbering parameter
ad7a994 Makefile: Updated the figure list for the mega-manual.
890f721 sdk-manual: WIP - Various small edits as WIP
f15f96c sdk-manual: New content for outline purposes.
4643b04 sdk-manual: Updated with two new appendices for new files.
d05566b sdk-manual: Added sdk-environment.png diagram.
0936eed sdk-manual: Added two appendix files to SDK Manual.
6996a1c Makefile: Added sdk-environment.png to figure list for SDK Manual
6cdb356 toaster-manual: Edits to a previous patch.
77594c0 mega-manual, Makefile: Added support for three new toaster figures.
00fe95d toaster-manual: Explain the local release
d06c7b8 documentation: remove all references to Hob
be8af37 ref-manual: Updated COREBASE_FILES variable.
5c7e5aa bitbake: bitbake-user-manual: include/require checks current directory
7ec8f28 bitbake: bitbake-user-manual: Updated the "inherit Directive" section.
75cba54 bitbake: bitbake-user-manual: Updated the copyright year to 2016
2918b50 bitbake: toasterui: remove ParseStarted from the event list
ab2abd4 bitbake: toasterui: Remove the excessive exception logging
d8137be bitbake: cache: Make BB_DONT_CACHE variable external
1d1aaa2 bitbake: toaster: orm generate CustomImageRecipe contents try secondary path
5c49230 bitbake: toaster: localhostbecontroller put generated layer in the builddir
b60c994 bitbake: toaster: localhostbecontroller Allow file:/// uri type for git repo
3025092 bitbake: toaster: orm Add a constant for the CustomImageRecipe's layer name
3df6551 bitbake: toaster: localhostbecontroller Don't clear out toaster custom layer dir
2f2f784 parselogs: add new whitelist entries to address 4.4.3 issues
8037ba4 bitbake: bb/tests/fetch: Update cups url
dab6d59 oe-buildenv-internal: Correct the sed expression which updates $PATH
068afc5 tzdata: update to 2016b
e140272 tzcode: update to 2016b
c0b3667 ffmpeg: Remove RSUGGEST=mplayer
e528a0a lttng-tools: Remove lttng-ust from PACKAGECONFIG for musl
42b9bdf packagegroup: Disable packages not available on musl
f148a2e world-broken: Add packages broken on musl
624ca6a siteinfo: Move apr configure cache to common-linux
90234f1 parselogs: add new whitelist entries to address 4.4.3 issues
13a2a3f u-boot: Upgrade to 2016.03 release
ecf3396 grub: add -Wno-error=trampolines to native CFLAGS
07515b0 dhcpd: create dhcpd user for dhcp dameon
b9ad80d valgrind: fix buildpath QA issue
7985006 gcc-5.3/gcc-4.9:Reuse -fdebug-prefix-map to replace -ffile-prefix-map
2faa718 gcc-5.3/gcc-4.9:replace build path with target path in __FILE__
76f10fd oe-buildenv-internal: Some clean up
4d1efc3 oe-buildenv-internal: Add variables individually to BB_ENV_EXTRAWHITE
39ac332 oe-buildenv-internal: Add paths to $PATH individually
dd5f2f7 oe-init-build-env*: Make them actually return failures
ea28de6 oe-init-build-env*: Remove unnecessary differences between the scripts
51aa00f oe-init-build-env*: Update/correct comment about specifying arguments
16fb9b8 oe-init-build-env*: Allow $OEROOT to be predefined
3173979 bluez5: allow D-Bus to spawn obexd in systems without systemd
10ef68f oeqa: remove RPM 4 self test
d915965 lib/package_manager: remove RPM4 support code
03fce73 smartpm: remove rpm4 patch
1e9de52 rpm: remove RPM 4
a7dd04d grub: fix documentation rebuilds
ee4f61b oe-selftest: Fixed --list-tests-by tag option
068e898 gcc-runtime.inc: set LICENSE for all gcc-runtime packages
788dfdd ParaTypeFFL-1.3: Add license file
62ddde6 externalsrc: use shared stamp directory if B=S
1969332 rpm: fix error when 'lua' is enabled
a31301e matchbox-keyboard: Update to latest HEAD to fix 64bit issue
40a55f1 oeqa/selftest/buildoptions: test read-only-rootfs
f64fdd2 oeqa/selftest/sstatetests: verify more variables don't impact the hash
ac347da gobject-introspection.bbclass: wrap comments at 80 columns
ae63b88 qemuarm64.conf: don't clear MACHINE_FEATURES
cad415d sanity.bbclass: allow customizing config file update error messages
96a5cb4 sanity.bbclass: fix success message when config file was updated
805aca8 sanity.bbclass: expand error messages for version checks
7d6801c lighttpd: fix /usr/lib/mod_cgi.so: undefined symbol: chunkqueue_written
5f7b9f0 valgrind: Disable nios2 support
aaaccc4 systemtap: Disable nios2 support
5857b20 lttng-modules: Add nios2 support
26248cd kexec: Disable on nios2
3e4d99b packagegroup-core-sdk: Disable sanitizers for nios2
797ffc8 bdgwc: Backport nios2 support
238e2c1 libatomic-ops: Backport nios2 support
7e83af3 selftest/buildoptions: Renamed one test case
0d9f515 python-numpy: Fix build on musl
e1f3f4c socat: Access c_ispeed and c_ospeed via APIs
bb4e6e0 watchdog: Disable nfs on musl targets
f00cca8 bdwgc: Check for getcontext() API during configure
51464e7 devtool: change config symlink name to .config.new
8c0148f systemd: Fix and expand ptests
427e369 oeqa/utils/testexport.py: add functionality for exporting binaries
2191623 init-live : make it easier to add custom boot targets
57a525c useradd_base.bbclass: replace retry logic with flock
5d06f00 image.bbclass: track ROOTFS_POSTUNINSTALL_COMMAND in do_rootfs vardeps
6129d86 eudev: split eudev-hwdb from eudev
9aa27fe openssl: don't move libcrypto to base_libdir
370419e xcb-util-image: Fix build with clang
8727975 musl: Update to get mips64 port
4653fdd dhcp: enable gentle shutdown
e382d96 coreutils: fix reporting 'unknown' by `uname -p' and `uname -i'
3b8cd1d ncurses_6: Improve installation
9cc65ed Revert "selftest: Added MACHINE = "qemux86" to tests that use runqemu"
3c5ee61 busybox: Drop -r passthrough patch
2c666af linux-yocto/4.1: usb: add usb_otg_caps to usb_gadget structure.
8dc9162 linux-yocto/4.1: Intel Broxton and Sunrisepoint-H: pinctrl and drm
99ad4c9 linux-yocto/4.1: powercap/RAPL: Backport powercap/RAPL
c4f544e linux-yocto/4.1: Thermal: Enable Broxton SoC thermal reporting device
123c2c6 linux-yocto/4.1: usb backports for Apollo Lake/Broxton
600b700 recipetool: create: don't create extra files directory unconditionally
8debfea local.conf.sample: Disable prelink by default
efa0881 oeqa/selftest/recipetool: Fix test_recipetool_create_simple
c9d269c Revert "packagegroup-core-x11-sato: add python-pygobject and gtk+3"
d24a39a oeqa/recipetool: Fix syntax error
55a1e52 oeqa/recipetool: Improve debugging output by adding dirlist
637b3c8 uninative: Add a fix for icu-native to use the correct ABI
9dbfbe9 scripts/oe-selftest: Add short names to most common options
681a452 gcc: Fix the license on GNU OpenMP
15c5b2a Revert "gcc: Fix the license on GNU OpenMP"
d5cdb48 perl: fix missing dependency for perl-misc
0eb52b9 classes/buildhistory: record a few more variables for extensible SDK
cbb4c5b package-deb: Ignore circular dependencies
fcc7ff0 package_deb: Fix python runtime error
9155b24 python-numpy: fix buildpaths QA issue
9e69963 python: move ast module into python-core
1a35166 xserver: require sufficiently new libdrm
36bf666 package_manager.py: Fix race condition in OpkgIndexer.write_index()
35be679 scripts/oe-selftest: Add search expression matching to run/list options
4489ef1 glib-2.0: relocate the GIO module directory for native builds
cf3402e image-buildinfo.bbclass: fix performance problems
e2fe28c linux-yocto/4.4: gpio-pca953x: add "drive" property
3d45853 python3: fix do_configure check platform triplet error
03b167d ncurses_6: Fix an install race condition
09eab6b build-appliance: make the inclusion of downloaded sources optional
8ea5cdc builder: remove hob from autostart
ff5d9f7 Revert "gstreamer1.0-plugins-XXX: move inherit gettext into common .inc file"
c99da8d musl: disable building of gobject introspection data
0dea50e machine/include/arch-x86: Make x32 ABI not supporting gobject-introspection-data
8c14c74 bitbake.conf: add 'gobject-introspection-data' to DISTRO/MACHINE_FEATURES_BACKFILL
2e27994 packagegroup-core-x11-sato: add python-pygobject and gtk+3
8b1fa2a webkitgtk: enable gobject introspection
7bd32b9 recipes-gnome: fix introspection support
efd37c5 python-pygobject: update to 3.18.2
ff3500b gnomebase.bbclass: do not disable gobject introspection
ac5cc0c gstreamer: enable gobject introspection
03cd714 libsoup-2.4: enable gobject introspection
c1d67e4 clutter: enable gobject introspection
0ec412b gtk+3: enable gobject-introspection
d6f8028 gtk+: enable gobject introspection
0d1e4b2 avahi: enable gobject-introspection
d2e0dc1 python-pygtk: remove the recipe
0c6d7cb avahi-ui: remove the dependency on python-pygtk by disabling avahi-discover
4fbf761 vala.bbclass: remove pre-packaged vapigen.m4 from tarballs
235455d vala: enable the use of vapigen by packages with vala support
d1b96f1 gobject-introspection.bbclass: add a class that enables gobject introspection
96b5847 gtk-doc-stub: remove introspection stubs
3a1d9fb gobject-introspection: Override GIO_MODULE_DIR when scanning
10e9977 gobject-introspection: add the recipe
3c66619 bitbake: fetch2/npm: fix ud.registry so that alternative registries can be handled
0155472 ref-manual: Updated "Application Development SDK" section.
4438460 ref-manual: Applied review edits to several SDK variables.
3c727ff ref-manual: Updated "Cross-Development Toolchain Development" section.
af1517c ref-manual: Updated "Build History SDK Information" section.
d9fc04b dev-manual, mega-manual: Updated "Application Development SDK" section.
357aa33 ref-manual, mega-manual: Updated "SDK Generation" section.
54490c0 ref-manual: Added several extensible SDK variables to glossary.
6dfd441 ref-manual: Updated IMAGE_PKGTYPE variable.
77f002c ref-manual: Updated "Cross-Development Toolchain Generation"
ee90cc6 ref-manual: Updated the "Build History SDK Information" section.
53dd8a0 dev-manual: Moved "Optionally Using an External Toolchain" to Tasks chapter.
9d76cfe meta: toolchain-shar-relocate.sh: Fix for extracting SDK in the same directory as SDK script.
054abad nettle: The variable named p in the patch file was incorrectly named.
93a5417 valgrind: Make dep on glibc-utils conditional on TCLIBC = glibc
40c9774 make 4.1: fix segfault when ttyname fails
7f27713 gcc: Disable libitm for MicroBlaze
81d58d6 sign_package_feed: add feed signature type
42f612c package_manager: sign IPK package feeds
c637783 signing-keys: create ipk package
14e809e gpg_sign: export_pubkey: add signature type support
0b088e0 gpg_sign: detach_sign: fix gpg > 2.1 STDIN file descriptor
2fccd8a gpg_sign: add local ipk package signing functionality
6bd6a2b systemd: add comment stating that resolved needs gcrypt
a5fd57d selftest/bblayers.py: Remove harcoded recipe files
dce7290 selftest/prservice.py: Sanitize package version when looking for stamp
cbd87f3 lsof: update UPSTREAM_CHECK_URI
57fb05a eudev: provide UPSTREAM_CHECK_URI
3f8d5bf toaster.bbclass: show packages that were setscened into existence too
39e1351 gcc: Fix the license on GNU OpenMP
c6aeef3 linux-yocto/4.4: Galileo updates
37b61b0 siteinfo: Add ppc64le support.
0265fcc nettle: disable static for 2.7.1
8660cd1 nettle: Security fix CVE-2015-8804
dae5715 nettle: Security fix CVE-2015-8803 and CVE-2015-8805
24aea3a glib-2.0: silence warnings when parsing headers for introspection
3331992 qemu: Limit paths searched during user mode emulation
b578a06 image-mklibs: handle position independent binaries
c706b5e libpam: define limits.conf as CONFFILES of package libpam-runtime
82dec46 perl-rdepends: Remove circular dependencies
815c36f rpm: Sync CVS to regular version
775f22e rpm: Fix musl integration with RPM5
001bdef gcc: Disable libitm for nios2
d53413d bitbake: server/process: Try connecting 4 times before giving up
0f01059 bitbake: toaster: models List only have the specified project's imported layers
0dcab02 bitbake: toaster: rework task buildstats storage and display
cc74a8a bitbake: toaster: use force_bytes to display non-ascii project names
aebc22d bitbake: fetch2: Make SRC_URI[md5sum] and SRC_URI[sha256sum] expand their values
d405f97 bitbake: xmlrpc: fix bug in setting XMLRPCServer.single_use
c50bdb3 bitbake: fetch2/npm: add missing URL argument to ParameterError
fbf27c4 bitbake: fetch2/npm: properly handle npm dependencies
ef6a451 bitbake: fetch2/npm: fix errors with some version specifications
ad50ce9 populate_sdk_ext: Correct commit 8b81bb56c69aabdea984352f8e267a9783c0bdbc
bc0e99d recipetool: create: shrinkwrap and lockdown npm modules
309b2e6 recipetool: create: support creation of additional files by plugins
2279eb2 recipetool: create: check if npm available if npm:// URL specified
9145500 recipetool: create: split npm module dependencies into packages
d46827c recipetool: create: add license file crunching
3fd244b recipetool: create: match *LICENSE* as a license file
2b6a352 recipetool: create: improve mapping for autotools program macros
1607fac recipetool: create: be more tolerant of spacing in configure.ac
9dca5c8 lib/sstatesig: skip shared_workdir when checking locked sigs
142bad3 python3: fix patching get_python_lib() in distutils/sysconfig.py
50d07e9 python3-native: use the previous version of python-config script
5dce2e3 qemu.bbclass: add qemu_wrapper_cmdline()
8b5afcd db: remove the NO_UPDATE_REASON and replace it a comment about RPM
5699c67 rpmresolve: It is not necessary to manually specify -lpopt
8ea55ba rpm: A number of the patches have been submitted upstream
6833c5d rpm: Enable specific crypto and digest settings via variables
59a4d99 security_flags.inc: Special flags are needed for RPM
007c284 rpm: Uprev to rpm-5.4.16 (pre) and rpm-5.4+cvs to current CVS head
a27ca6d yocto-bsp: Update templates to 4.4 kernel
2d0933c conf/distro/include: drop old recipes
1fd183e bblayers.conf.sample: remove BBLAYERS_NON_REMOVABLE
477b8fb poky: Enable uninative
1b7cc9c linux-yocto/4.4: explicitly enable ftrace in tracing fragment
aee7482 linux-yocto/4.4: iwlwifi: mvm: don't allow sched scans without matches to be started
2408f49 linux-yocto/kernel-meta: ktype refactoring: move DEBUG_KERNEL, EXPERT and EMBEDDED
9ac029b xmlto: tell xmlto where cp is
6d89b52 toaster.bbclass: improve how we gather buildstats for Toaster
4dd3e40 image-prelink: use STAGING_*_NATIVE variables
2193e9d strace: Backport fixes for compiling with clang
ee8ff42 ghostscript: 9.16 -> 9.18
3f5725c fontconfig: Revert changes made to FcConfigAppFontAddDir() recently
433d866 populate_sdk_ext: Make populate_sdk_ext nostamp
e186d6d systemd: binfmt should be added to SYSTEMD_PACKAGES only if binfmt is enabled
b051a95 license.bbclass: fix host contamination warnings for license files
f8a9774 oeqa/selftest/buildoptions: Test build does not fail without git rev
656aeff busybox.inc: add tail symlink so busybox can commit suicide cleanly
a321f4e avahi-ui: add dbus to PACKAGECONFIG
1bd4b72 avahi: add missing intltool-native build dependency
72f9e39 avahi: make dbus optional but default
424466b oe-setup-builddir: tidy up local.conf and bblayers.conf commentary
07919e9 net-tools: Add SCTP option support
e8254bc tune-corei7.inc: Fix PACKAGE_EXTRA_ARCHS for corei7-32
5346675 eudev: remove redundant udev_run assignment
adad264 xcursor-transparent-theme: use a version glob in the selftest bbappend
946d00c populate_sdk_ext: Update after uninative changes
ba57ba1 image.bbclass: support chaining compression (aka conversion) commands
5ac3dc7 image.bbclass: fix incomplete .rootfs customization
3322fa7 bitbake: toasterui: fix warning 'Unknown event'
621cbc8 bitbake: toasterui: exit on final events
8e138b7 bitbake: toasterui: make toasterui to work in build mode
0a61306 bitbake: toasterui: check if setEventMask succeeded
ac941ac bitbake: command: make setEventMask readonly
dd3da9a bitbake: toasterui: update list of events
f56fa5d bitbake: toasterui: reformat list of events
a71d32a bitbake: toaster: remove sshbecontroller module
3db71b4 bitbake: toaster: don't use sshbecontroller
790b2d1 bitbake: toaster: raise NotImplementedError
96535ba bitbake: toaster: bring back the strict directive
5b8b399 bitbake: toaster: change 'revision' to 'Git revision'
07ead98 bitbake: toaster: views api Package info return both kinds of RDEPENDS
9cda2ab bitbake: toaster: fixup dependency excludes for customimage
a54cebe bitbake: fetch2/npm: ignore unknown headers in tarballs
0cd1be1 bitbake: fetch2/npm: handle alternative dependency syntax
d999927 bitbake: fetch2/npm: fix indentation
26ee4dd image creation: allow overriding .rootfs suffix
e43fcdf scripts/hob: drop
59b4cef classes/packageinfo: remove
bbf2a5d conf/documentation.conf: remove BBLAYERS_NON_REMOVABLE
7054882 yocto-uninative: Add common include for uninative
d2c96ca mtools: Drop GCONV_PATH manipulation
d27644e uninative: Handle relocate of GCONV_PATH in libc
0523499 uninative: Add checksum support
73265d1 uninative: Refactor common code
4feb00d uninative: Use CXX11 ABI for interoperation between gcc4 and gcc5
013dd24 uninative: correctly enable uninative
034618d glibc: Add relocation of GCONV_PATH
8dca343 uninative-tarball: Add glibc-gconv-iso8859-1 for guile
1f50f29 dkpg: Use tar everywhere (not gtar)
b158d6c gtk3+: Add missing DEPENDS on wayland-native
e395e81 tune-cortexa17.inc: apply changes similar to a15
ea53d1e sstate: Allow late expansion of NATIVELSBSTRING
bd3a1d5 linux-yocto: Update SRCREV for genericx86* for 4.4
70c6df2 linux-yocto: Update SRCREV for genericx86* for 4.1
ae85c4b linuxloader/image-prelink/image-mklibs: Fix non-standard path prelinking
0b84897 insane/prelink: Handle nonstandard library paths
6b564ae ext-sdk-prepare: Catch setscene tasks which should have run but didn't
d8efd2e createrepo: Fix stat floating timestamps
ce5a9df xmlto: ensure /bin/bash is used as bash
70b4f36 openssl: add a patch to fix parallel builds
1632742 xdg-utils: remove trailing whitespace in multiline string
816391a btrfs-tools: Add libgcc to RDEPENDS
e467156 bitbake.conf: Add libgcc-native to ASSUME_PROVIDED
a91713f net-tools: Override CFLAGS/LDFLAGS in do_install too
fb0c3c5 nspr: Fix build regression on musl from last upgrade
37f5fb9 gdb: fix builds with internal readline and no static libraries
6518db4 feature-arm-thumb.inc: Fix thumb tune override warning
afb1d09 recipetool: create: fix support for AX_CHECK_LIBRARY
463fd5e formfactor: assume a keyboard is plugged in
e2107f5 acl: Fix re pattern in test cases
82a8064 gcc-runtime.inc: disable libitm for little endian MIPS too
25d9c4e devtool: add build-sdk subcommand
41eb36d devtool: build-image: rename module
82d0c8a oeqa/buildoptions: Improve unsafe references tests
4284fdf insane.bbclass: make the checking stricter for unsafe references in scripts
5cd71fe yocto-project-qs: Updated flow to mention Toaster
cd041b7 dev-manual: Applied review comments to the devshell section.
f54fe56 ref-manual: Updates for nativesdk clarifications.
a882267 dev-manual: Fixed typo in the devshell section.
70c7e36 dev-manual: Created devtool upgrade section.
b2b22d5 dev-manual, mega-manual, Makefile: Added support for new upgrade flow
0b7d8a4 dev-manual, mega-manual: Updated the workspace directory structure image
050e021 dev-manual: Applied review changes to the devtool section.
09ecf38 dev-manual, mega-manual: Updated three figures for devtool
f33ffaa dev-manual: Applied more review comments to the section.
fe70eb2 dev-manual, mega-manual: Updated the devtool modify flow diagram.
eb3b414 dev-manual, mega-manual: Updated the devtool add flow diagram.
4c5bd3f dev-manual, mega-manual: Updated the devtool workspace figure.
9cee16b dev-manual: Applied review comments to the devtool section
c678d1a dev-manual: Updated the devtool add section.
a09238a dev-manual, mega-manual: Updated devtool add flow diagram
7699f0a dev-manual: Added section for devtool modify flow
1eecaea dev-manual, mega-manual: Added new figure for devtool modify flow
9582da6 dev-manual: Edits to the devtool-add section.
740369f dev-manual, mega-manual: Updated the devtool add flow figure
a848e9f dev-manual, mega-manual: Updated the workflow layer content figure.
34e08b3 dev-manual: Added new "writernotes" style.
17a21e6 Makefile, dev-manual, mega-manual: Added new figure support
d346c35 dev-manual: Applied review comments to devshell section.
3b41049 ref-manual, dev-manual: Clarifying "native" and "sdknative"
a1970eb dev-manual: Updated devshell section.
a58cde0 toaster-manual: Updated how manage.py createsuperuser command is run
c5b4f69 ref-manual, dev-manual: Clarification of "native" and "sdknative"
952bcc7 toaster-manual: Removed prompts for json file.
34c75fa ref-manual: Updated the S variable description with feedback
2b2ced0 ref-manual: Updated the staging.bbclass description
b9dddd5 ref-manual: Updated the S variable description.
41e9f7c dev-manual, ref-manual: Updated licensing text information.
5066fbc ref-manual: Added order information for conf file parsing.
ad6b2f2 toaster-manual: Removed typo - double "allow" words.
c8c533e ref-manual: Updated the do_populate_sysroot task.
2a3942b dev-manual: Updated section on adding license text.
77b3d06 ref-manual: Updated the S variable entry in the glossary.
a1a4808 toaster-manual: Applied a patch to weed out build mode (modes).
353b755 bitbake: bitbake-user-manual: Added expand() function to list.
638ad17 bitbake: bitbake-user-manual: Added note for Python variable ref expansion.
da22add bitbake: bitbake-user-manual: Enhance environment variable discussion.
f11de9d e2fsprogs: do not enable non-stable features by default
b04280a sdk_update.py: Enable local sdk-update tests
14dd07c sdk.py: Fix undefined variable
c12e919 eudev: recipe formatting improvements
73a43fc openssl: Security fix Drown via 1.0.2g update
ed14aef layer.conf: Update after replacement of udev with eudev
e72233a bootimg: set default value for LABELS variable
4eaef67 sanity: Do not mistake meta-yocto-bsp for meta-yocto
86759de sanity.bbclass: remove conflict checking for image vm and live
bb1c719 syslinux.bbclass: make vm and live can be built together
5c5c13d recipetool: create: add basic support for new npm fetcher/class
2be37a9 recipetool: create: add basic support for generating linux kernel recipes
5cf15ff recipetool: create: add support for out-of-tree kernel modules
937ecd0 bitbake: toaster: cleanup of bin/toaster startup code
a7d1b95 bitbake: ui: remove the puccho ui
a9dc72f bitbake: hob: removal of hob ui and associated ui files
27468db bitbake: fetch2/npm: Add missing ParameterError import
44e3461 bitbake: npm: in cases where shrinkwrap resolved a git URL, ignore it and grab dist.tarball
2a73181 bitbake: fetch2: Fix unpack for absolute file urls
865d2fe bitbake: fetch2: fixes copying of file://dir; subdir=foo, bug 6128 and bug 6129
fb437d3 meta-yocto-bsp: bump to linux-yocto 4.4 for the non-x86 BSPs
fbedac4 maintainers.inc: Add new eudev package and change maintainership for udev
0138874 gcc: Add support for atomic opertions (libitm) where available
70153b4 classes/externalsrc: fix symlinking if symlink exists pointing to another path
eac4061 populate_sdk_ext: Only write LCONF_VERSION to bblayers if it is set
c366343 automake: don't delete .pyc files
d6e63be cracklib: fix Python packaging
a005d25 populate_sdk_base: handle empty SDK_PACKAGING_FUNC
ec3be9f linux-yocto/4.4: update to 4.4.3
6ed16ff linux-yocto/4.1: iwlwifi: mvm: don't allow sched scans without matches to be started
2497e80 linux-yocto/4.4: update to -stable 4.4.2
aa2c1f7 linux-yocto: braswell: Remove feature and move DRM_I915_PRELIMINARY_HW_SUPPORT option
702701d linux-yocto/4.4: yaffs2 build fixes
c2152b8 linux-yocto/4.1: update to 4.1.18
45d4cd7 linux-yocto/4.1: clkdev updates
79ecef6 linux-yocto/4.1: Galileo updates
5f61693 usbutils: Fix for new eudev implementation
c89b777 libgudev: Fix for new eudev implementation
3e5e540 eudev: Replaces udev with eudev for compatibility when using sysvinit on newer kernels
674e55f populate_sdk_ext: Delete the buildtools tar file after installation
d8acef2 libarchive: Set xattrs after setting times
431c1e1 combo-layer: handle empty commits during "init --history"
695cc45 classes/populate_sdk_ext: prepend to PATH rather than appending
b145480 classes/module: allow substitution of the modules_install target name
b03936c grub2.inc: drop bogus dependency on xz
7328765 grub2.inc: avoid passing -isystem to native builds
576587d grub2.inc: dont export TARGET_CFLAGS etc to grub2 configure
97a3322 harfbuzz: update 1.2.1 -> 1.2.3
edf93a0 gstreamer1.0-plugins-bad.inc: limit ARM_INSTRUCTION_SET over-rides to armv4/armv5
89140b0 dhcp: CVE-2015-8605
6ccd8cd sato/images: Add ptest image
f38debb layer.conf: Whitelist cantarell-fonts fontconfig dependency
b307937 pango: make ${PN}-ptest RDEPENDS on cantarell-fonts
0c80f29 cantarell-fonts: Add recipe
4006a7f sanity: Fix int verses string reference
2e27c4b bitbake: fetch2/npm: Enable fetcher
1c060d7 pseudo: Increase number of retries
030d920 bitbake: providers: Fix PREFERRED_VERSION lookup for '_' in PN
c679a3d bitbake: fetch2: Skip lockfiles and donestamps for local files
d01042e bitbake: fetch2/__init__.py: Error if lockfile path invalid
ab7b7bf bitbake: fetch2/__init__: Fix decodeurl to better handle urls without paths
06b4d8f bitbake: fetch2/wget: Set localfile for directories
8d7e799 genericx86-common: Update PREFERRED_VERSION_linux-yocto to 4.4
65d6a62 gstreamer1.0-plugins-bad.inc: enable webp PACKAGECONFIG by default
cd00748 gettext: Delete libintl.la file from install
b33efa9 systemctl: handle RequiredBy dependencies
8caa592 ffmpeg: add bzlib, lzma and xv PACKAGECONFIGs
0011760 rootfs-postcommands: fix ssh_allow_empty_password checking
96f5f89 musl: Add linux-libc-headers to deps
3354878 mesa: Fix build on musl
7651342 dosfstools_2.11: fix build following removal of -e from EXTRA_OEMAKE
6c8abea uclibc support for rng-tools
c7e5a38 oeqa/sdkext: Add sdk_update.SDKUpdateTest class.
738bd1a classes/testsdk: Pass tcname to SDK and SDKExt contexts
2a410b2 classes/testsdk: Move the removal of bitbake PATH to eSDK context only
eb1f8b9 classes/testsdk: Move code for avoid PATHs to oeqa.utils
55d4849 gstreamer1.0-plugins-XXX: control orc PACKAGECONFIG via GSTREAMER_ORC
083c63d boost.inc: fix BJAM_OPTS --build-dir option
f4e17c6 shared-mime-info: update to 1.6
4ffdfdf vala: update to 0.30.1
f53f374 python-git: update to 1.0.2
ec73437 pax-utils: update to 1.1.5
447ddb9 nettle: update to 3.2
26a3d25 ncurses: update to revision 20160213
dc42d30 libdrm: update to 2.4.67
0296e0a gtk+3: update to 3.18.8
e08ad62 gtk-icon-utils-native: update to 3.18.8
9daf153 git: update to 2.7.2
927dfaf gnupg: update to 2.1.11
2c39358 clutter-gst-3.0: update to 3.0.16
b8a1e59 ccache: update to 3.2.4
4d4aa1f libsolv: update to 0.6.19
8c2e420 ffmpeg: update to 3.0
afce247 nspr: update to 4.12
b19dbe5 pcmanfm: update to 1.2.4
6b41608 libfm: update to 1.2.4
325a9d3 epiphany: update to 3.18.4
d4da534 wic: don't throw away our created swap partition
5f82d17 automake: set test-driver path relative to top_builddir
b41862d uninative-tarball: respect SDKMACHINE when building
4d1c14f boost.inc: enable more verbose build logs
7f84ad0 gstreamer1.0-plugins-XXX: move inherit gettext into common .inc file
2ce48e6 gstreamer1.0.inc: add explicit PACKAGECONFIG init
935d88a gstreamer1.0-libav: move LIBAV_EXTRA_CONFIGURE_COMMON_ARG into .inc
3a8ff19 gstreamer1.0-libav_git: add --ranlib option to LIBAV_EXTRA_CONFIGURE_COMMON_ARG
b8bdb99 boost.inc: limit ARM_INSTRUCTION_SET over-rides to armv4/armv5
9ca8f30 populate_sdk_ext: Add images to SDK_INSTALL_TARGETS
07dc765 boot-directdisk.bbclass: drop IS_VM chechking
a87574c image-live/boot-directdisk.bbclass: remove AUTO_SYSLINUXCFG
76eb815 testimage.bbclass: reuse generic test suites
6571a84 testimage.bbclass: add generic, image test suites
8c45747 gconf: remove redundant dependencies
a74c389 gtk-doc-stub: don't inherit autotools
2269f90 os-release: sanitise VERSION_ID field
9d86b26 apr-util: add ldap crypto and sqlite3 to PACKAGECONFIG
d8d2f57 apr-util: fix loadable module packaging
77cfa2b glibc.inc: improve optimisation level sanity checking
04c4719 rsync: add native variant
2c20fe4 core-tools-profile: add lttng tools for aarch64
8a0b997 lttng-ust: add support for aarch64_be
6081c35 liburcu: add support for aarch64_be
07a3c71 harfbuzz: add explicit dependency on fontconfig
73cc8b8 harfbuzz: update 1.2.0 -> 1.2.1
bb151b8 fontconfig: Don't add font directories from host
e9f5134 musl: Upgrade to 1.1.14
bf4d380 oe-selftest: devtool: add an additional test for devtool upgrade
4bae2f2 oe-selftest: devtool: rework devtool upgrade test
10290f2 devtool: upgrade: print new recipe name
5cd3be3 devtool: upgrade: drop PR on upgrade
e6f684b devtool: upgrade: eliminate unnecessary datastore copy
860574e devtool: upgrade: fix several issues with extraction of new source
66a781c devtool: upgrade: fix constructing new branch from tarball releases
d30cc76 devtool: upgrade: fix renaming of recipe if PV is not in name
75eeeab devtool: upgrade: fix moving version-specific files directory
81ebb0b devtool: upgrade: fix version argument checking
e953b57 devtool: upgrade: drop superfluous call to validate_pn
492b1eb devtool: upgrade: make source tree path optional
942ae25 devtool: modify: fix source tree default name when mapping virtuals
e2334e1 devtool: add: tweak auto-determining name failure message
55ae566 uninative.bbclass: if the loader can't be found disable instead of failing
50b8740 uninative: use check_output instead of Popen directly
4495e8b lib/oe/qa: add explicit exception for 'file isn't an ELF'
4553bb1 libdrm: fix build with uclibc
4e5a871 strace: fix ptest execution
e8e0489 clutter-1.0: Fix confgure test errors found by clang
b748f40 oeqa/parselogs: Updated whitelist
4b32351 buildstats.bbclass: Don't assume /proc/<pid>/io present
07e1f10 sysvinit-inittab: Move start_getty scrip to base_bindir.
8d07e14 oeqa/selftest/prservice: Added new TC: check pr-server starts and stop correctly on localhost.
d2a563c oe-selftest: Add support for lib/oeqa/selftest subdirectories
7f58b92 musl: Upgrade to 1.1.14
73bf792 devtool: update-recipe: create config fragment
2fbd1d7 devtool: sync: update kernel config
26f951b git: fix installed-vs-shipped QA Issue
033db24 btrfs-tools: fix symlink creation multiple times
9af773f bison/gettext: add --with-bisonlocaledir to assign BISON_LOCALEDIR
b14e2ae gcc: use relative path for configure script
1f00fb2 depmodwrapper-cross: nopackages to avoid QA [buildpaths] issue
00a6f5a oeqa/utils: added new network module
3f7aa6f scripts/oe-selftest: Use site.USER_SITE to run coverage configuration code for sub-process
1c6c76e scripts/oe-selftest: Add filtering to the coverage data gathered by oe-selftest
4a21827 oeqa/selftest/signing: Added test for locked signatures
604dc1c package: check inherit instead of PN to decide if a recipe is a packagegroup
b4df005 tune-cortexa9.inc: add vfpv3 tunes
889a5cc mirrors/own-mirrors/sanity: Updates after npm fetcher addition
28d17cf npm.bbclass: Add npm class to match fetcher
bc5a1d1 base: Add nodejs-native dependency for npm:// urls
9d5483c meta-yocto: Rename to meta-poky to better match its purpose
ab3a718 adt-installer: Drop since its replaced by the extensible SDK
c1c6a9d sanity: Improve configuration upgrade capabilities (support meta-yocto -> poky transition)
2587101 image: Run do_rootfs_wicenv after do_image
e0fd964 bitbake: toaster: change 'delete layer' to 'remove layer'
6e82820 bitbake: toaster: rename 'run again' button
c8dd72c bitbake: toaster: fix banner after customimage package add
149f574 bitbake: toaster: custom breadcrumb for the default project
4a12865 bitbake: prserv: Add dump_db()
bdb51ab bitbake: toaster: remove custom images from Image Recipes
98d462c bitbake: toaster: show suffix for image files and basename for artifact files
88b5660 bitbake: toaster: add missing link to image recipe details
25b179d bitbake: toaster: adjust the search field width
a97081b bitbake: toaster: make 'configuration' the first tab
e1fc319 bitbake: toaster: link to configuration in all breadcrumbs
df2808f bitbake: toaster: reduce max height of modal dialogs
6c51f08 bitbake: toaster: disable add layer button on click
d4a663a bitbake: toaster: apply error class to name field
48f0ae2 bitbake: toaster: fix custom image name form
07eb4f2 bitbake: toaster: comment out project release change
12ade9b bitbake: fetch2/npm: Add mirroring support for npm fetcher
ca5b6d6 bitbake: fetch2/npm: Add npm fetcher
813bd1f bitbake: utils.py: Add sha1_file call
7bb9e8d signing-keys: Make signing keys the only publisher of keys
64ab17b systemd: Upgrade to 229
44248af harfbuzz: update to version 1.2.0
f4f5573 perf: add sysroot handling to subcmd
7a95c2c oeqa/selftest/buildoptions: build -minimal instead of -sato images
2980ac0 bitbake.conf: add findutils-native to ASSUME_PROVIDED
2e152ff findutils: upgrade to 4.6.0
951ce18 mesa: add missing space to RRECOMMENDS append
2305610 uclibc: Do not use immediate expansion operator
aab3900 security_flags: Disable ssp when compiling uclibc
afb954e rpm: fix building rpm 5 with internal beecrypt
069cdbe alsa-lib: topology: Add missing include sys/stat.h
b879aed libsdl2: Fix patch after upgrade
3d4f71d gstreamer1.0-libav_git: update 1.7.1 -> 1.7.2
9d83a3e gstreamer1.0-plugins-ugly_git: update 1.7.1 -> 1.7.2
6456a6f gstreamer1.0-plugins-bad_git: update 1.7.1 -> 1.7.2
821498f gstreamer1.0-plugins-good_git: update 1.7.1 -> 1.7.2
04e77c1 gstreamer1.0-plugins-base_git: update 1.7.1 -> 1.7.2
e67c91d gstreamer1.0_git: update 1.7.1 -> 1.7.2
ea8c34e libnewt: Fix build with PIE flags
66a833a pseudo: Fix build when security flags are enabled
91a1baa glibc: Upgrade to 2.23
c1f9507 no-static-libs: remove eglinfo
0ab67d6 freetype: use autotools instead of a manual do_configure
4883ccc classes/populate_sdk_ext: add a better config extension mechanism
524ee08 recipetool: create: improve CMake package mapping
7b6e5b0 recipetool: create: add additional extension mechanisms
b2d4472 devtool: modify: tweak help description for behaviour change
a8e0e5e devtool: deploy-target: preserve existing files
2059a34 devtool: undeploy-target: support undeploying all recipes
b95c72c devtool: deploy-target: write deployed files list to target
62989ef devtool: sdk-update: tweak command-line handling of updateserver
cada5a8 devtool: (un)deploy-target: add help descriptions
6bd88e6 scripts/lib/argparse_oe: tweak title above options
32ef523 devtool: categorise and order subcommands in help output
9f7df76 devtool: update-recipe: don't show workspace recipe warning if no update
51972ed devtool: reset: fix preserving patches/other files next to recipes
e54f9c1 devtool / recipetool: use common code for launching editor
dd35f69 devtool: minor fix for error message
41242a2 staging.bbclass: remove trail slash from SYSROOT_DESTDIR
aeb8964 terminal.bbclass: import oe.terminal for oe.terminal.prioritized()
bee556a recipe_sanity.bbclass: skip DataSmart in recipe_sanity_eh()
2d293bd image.bbclass: fix circular dependency when IMAGE_FSTYPES append hddimg
a332360 toolchain-scripts.bbclass: add three other path to PATH in env.sh
4d2910f libsoup-2.4: disable libsoup-gnome by default
619f6c6 libsoup-2.4: prevent PACKAGECONFIG dependant package renaming
13e726f libsoup-2.4: minor formatting improvements
dd0ef3c populate_sdk_ext.bbclass: Add SDK_RECRDEP_TASKS variable
4c5c40d devtool: Don't recursively look for .devtoolbase in --basepath
0220180 populate_sdk_ext: Don't ignore SDK_TARGETS value
8c0ba8d bitbake: toaster: toastergui Fix invalid char test and implementation
913e9b1 bitbake: toaster: PackagesTable show only installed packages
94bca58 bitbake: toaster: toastergui unit tests convert to use fixtures
8796ac8 bitbake: toaster: SoftwareRecipesTable apply default order_by
8469e58 bitbake: toaster: orm migrations Sort out migrations mess
78b6109 cml1/sstate: Fix missing getVar parameter
7e19f88 linux-yocto/4.1: capabilities backports
54bfbcc waf.bbclass: Remove --disable-static from EXTRA_OECONF
51fc304 gcc-5.3: backport fix for PR-target-65358
ed20c6c epiphany: Add libxml2-native to DEPENDS
2021f63 libsdl2: update to 2.0.4
947b3bf cmake: Update to 3.4.3.
4699483 sstate.bbclass: use oe.gpg_sign for gpg signing
db7c7c2 oe/gpg_sign: add 'passphrase' argument to detach_sign method
e845b75 sign_rpm.bbclass: do not store key details in signer instance
d5be866 oe/gpg_sign: add 'armor' argument to detach_sign()
03554b7 oe/gpg_sign: add verify() method
af7e516 ruby: break out ri-docs and rdoc into separate packages
8bcf139 insane.bbclass: print more info for build-deps and file-rdeps
5f3dfea curl: re-enable proxy support by default
1f61888 libtool: Don't hardcode grep paths
a3b996a cml1.bbclass: fix do_menuconfig
91bfe50 cups: upgrade to 2.1.3
eeac0a9 coreutils: upgrade to 8.25
01dc859 findutils: upgrade to 4.5.19
bf7d5f6 diffstat: upgrade to 1.61
247f3b4 grep: upgrade to 2.23
4e5e501 bitbake: data_smart: Drop default expand=False to getVarFlag [API change]
c7610aa bitbake: data_smart: Drop default expand=False to getVar [API change]
4f0ab27 bitbake: SignatureGeneratorBasic: make checksum cache file configurable
0cdf193 bitbake: MultiProcessCache: make cache filename configurable
ca552bb bitbake: FileChecksumCache: add get_checksums() method
8f61f2d bitbake: bb/runqueue: save task file dependency cache onto disk
5177b1e bitbake: SignatureGenerator: add method for saving the file checksum cache
97617fd bitbake: bb/cache: drop some unused arguments
5a87d8c bitbake: Allow Hob to run images on a custom simulator, other than qemu
7fc38ea gma500-gfx-check: Fixes infinite calling to modprobe gma500_gfx
be7b52a pulseaudio: 6.0 -> 8.0
c52b8f6 alsa-plugins: 1.0.29 -> 1.1.0
a231a4e alsa-utils: 1.0.29 -> 1.1.0
1adbb73 alsa-tools: 1.0.29 -> 1.1.0
3a82e2e avahi: update to version 0.6.32
14daeb5 no-static-libs.inc: Add libcap-native
c001863 libsdl2: Fix build with static libraries disabled
a46dc87 uboot-inc: Backport patch to fix Beaglebone Black bootloader
c7355b9 busybox: drop patches that are not valid anymore
47d0119 pcmciautils: Update SRC_URI
f37ac5b debianutils: Upgrade 4.5.1 -> 4.7
adfcaf2 busybox: Add musl config for _git recipe
46824dc debianutils: Fix SRC_URI to use debian snapshot
3df8701 nfs-utils: bugfix: adjust name of statd service unit
c15bf55 musl: Upgrade to 1.1.13+
07e7879 dpkg: Update to 1.18.4
5794b56 glew: upgrade to 1.13.0.
aea0746 glew: rewrite to use upstream build system
0b1c324 socat: Fix build with musl
04c6a48 binutils: Fix useless rpaths QA warning
eb6d14e image/populate_sdk: seprate variables to fix dependency
c9e5e34 gcc: Backport nios2 r31 fix
012460d sqlite3: update 3.10.2 -> 3.11.0
f770a6e insane: wrap autotools checks in inherits_class(autotools) checks
35011d9 cmake: don't inherit autotools
9cd64ed oeqa/selftest/bbtests: Test bitbake --setscene-only option
7e5b451 glew: don't put our CFLAGS into the pkgconfig file
b1145cc dbus: update large file patch
fad63e3 coreutils: fix problem with acl for 6.9 version
351039f gcc-4.9/5.3: Ignore -fdebug-prefix-map in producer string
7a11650 bitbake.conf: use target path as compile dir in debugging info
ef30119 glibc: Security fix CVE-2015-7547
c834ebc glibc: CVE-2015-8776
842177a glibc: CVE-2015-9761
efa1ae5 glibc: CVE-2015-8779
aefe1fa glibc: CVE-2015-8777.patch
152914f oeqa/parselogs: Whitelist dmi firmware failure message in 4.4 kernels
683ea31 rng-tools: Fix underquoted m4 and libgcrypt floating dependency
7a700f5 lib/qa.py: raise ValueError if file isn't an ELF
334e1b5 lib/oe/qa: ELFFile: check that a path is a file before opening it
11359e9 rng-tools: fix the build with musl
a258589 bitbake: bb.ui.knotty: prefix task messages with recipe/task
4bf8b21 bitbake: Move bb.{debug,note,..} into their own logging domain
3b35de3 layer.conf: Add gstreamer1.0-meta-base to SIGGEN_EXCLUDERECIPES_ABISAFE
14e9385 sstate: Add ca-certificates-native to postinst recipes list
73e53e4 nss: define RPATH variable for nss-native
6e4e9f7 Revert "lsbinitscripts: fix the path for mountpoint"
6db39e1 libunwind: Fix build on ppc
47896a7 dbus-glib: 0.104 -> 0.106
93d8fc1 conf/no-static-libs: add explicit rule for libical
637b44c runtime/systemd: Fix for boot time string parse error
ef5b8b4 security_flags: Add SECURITY_CFLAGS to TARGET_CC_ARCH for binutils
1387785 binutils: Use tip of 2.26 branch
da13f0b buildhistory.bbclass: remove out-dated information on request
a56da4a Remove obsolete references to exmap
8b21720 bitbake: knotty: Set exit failure code on runQueueTaskFailed events
a9223e2 bitbake: taskdata: Fix traceback issue with missing provider
7593756 bitbake: cooker: Improve cache handling
9cb38c1 poky: Disable static libs by default
f852014 bitbake.conf: Remove unhelpful default value for EXTRA_OEMAKE
b050c50 apmd: fix build with static libraries disabled
d585a71 oeqa: Update to handle domain specific references in build logs
9300749 libpng12: Handle no static libs
67ea65e ed_0.5: Handle --disable-static option
438d6d6 conf/distro/include: Add no-static-libs.inc
2eb19cc classes/buildhistory: fix for python function parsing change
1a3204c valgrind: Fix build with musl
e8b0da1 rpm: Fix build with musl
48144e0 gstreamer1.0-meta-base: Mark as machine specific due to COMBINED_FEATURES
ff8ca89 gdb-cross-canadian: Add missing virtual/* DEPENDS
120a160 e2fsprogs: Update to upstream version of a patch
5394ada gdb: Rationalise PACKAGECONFIG
ce0f8ab insane: Add --disable-static to UNKNOWN_CONFIGURE_WHITELIST
94abdb2 linux-yocto: Work around PAT issue on qemux86
6fb493a libgcrypt: update 1.6.4 -> 1.6.5
bf9ad22 musl: Upgrade to tip of tree
5d156bc oe-selftest: don't use specific tasks
80e8928 oe-selftest: pylinted wic tests
9b6dc9b wic-image-minimal: use uuid for root partition
ab7cb65 wic: fix processing of --use-uuid
51e0a8a oe-selftest: add new wic testcase
2100f82 wic-image-minimal: update .wks to boot by qemu
4b26601 wic-image-minimal: change IMAGE_FSTYPES
f799e21 oeqa/targetcontrol: support wic image type
7066f16 oeqa/targetcontrol: make ssh control optional
0ade658 qemurunner: add parameter to method 'start'
d083fec oe-selftest: remove unused parameter
c26a9c3 runqemu: support path/to/<image>-<machine>.wic
c7f0578 runqemu: don't set KERNEL for wic images
2c3a009 runqemu: add support for wic images
64d2f13 scripts/sstate-cache-management.sh: Change wording
6740dd5 qemu.inc: Add rng-tools to qemu images
ce3df21 rng-tools: Import recipe from meta-openembedded
36b43b2 lib/oe/terminal: set workdir for konsole terminal
03e1950 mmc-utils: upgrade to latest git version
b5b8003 ltp: Upgrade to 20160126 and fix build on musl
f6b3957 initscripts: start urandom after populate-volatiles
85ac8eb initscripts: populate-volatiles.sh: add mount-bind feature
be5b72c libdrm: don't detect components that have been disabled
5fc5996 buildhistory: Fix regex to handle versions without spaces
7c3d4c0 debian: Fix superfluous setting for RPROVIDES
2eba066 autotools: Fix interaction with bitbake -b
9c8fee9 autotools: Correct dependency search logic error
971fafb maintainers.inc: include libjpeg-turbo and mmc-utils
4e0b334 scripts/runqemu-internal: Work around qemux86 PAT bugs in linux 4.4.1
283a302 sanity: Bump minimum version to 1.29.0
1c2d632 bitbake: Bump version post release to 1.29.0
a12dcc4 base.bbclass: fix support for gitsm://
bc72f64 linux-yocto: Update SRCREV for genericx86* for 4.4
be89a1d linux-yocto: Update SRCREV for genericx86* for 4.1
4a8d20a poky: update qemu* to prefer 4.4 kernel
d255f4f linux-yocto/4.1: galileo backports and support
fdcb373 linux-yocto/4.1: update to v4.1.17
5688cab linux-yocto/4.4: update to v4.4.1
f9f93ae bitbake: cooker: gracefully shutdown parsers
1f7f077 bitbake: buildinfohelper: unset brbe variable when build finishes
9a6cb10 nativesdk-buildtools-perl-dummy.bb: Fix variable expansion in python code
5e978d7 classes/testsdk: do_testsdkext avoid STAGING_DIR/BASE_WORKDIR in PATH
f56e9aa freetype: update 2.6.2 -> 2.6.3
1ba1aa3 freetype: minor formatting improvements
0d5e611 piglit: upgrade SRCREV
72c6b62 libbsd: Security fix and update 0.8.2
78be954 gstreamer1.0-plugins-bad_git: fix gst_structure_get() etc compiler warnings
fdd8979 gstreamer1.0-plugins-good_git: fix gst_structure_get() compiler warning
a23a50e python-setuptools: Add python-compile on RDEPENDS
914ff14 qemu: Security fix CVE-2016-2198
0938353 qemu: Security fix CVE-2016-2197
1f3e1d1 curl: add PACKAGECONFIG options for less common / legacy protocols
19045ba toaster: tests Remove symlinks from toasteruitest folder
738a9b7 classes/sanity: check_perl_modules provide output when fail
e64ce73 oe-selftest: devtool: add another devtool add test
a5095d1 recipetool: create: set S when we set SRC_URI from local git repo
ca5a36c recipetool: create: convert http git URLs that don't end in .git but contain /git/
4c71afb recipetool: create: ensure URL parameters don't make it into the name
86f3464 devtool: add: fix adding from a local source directory
fa50153 devtool: modify: make -x the default behaviour
f767757 recipetool: create: determine name/version from github/bitbucket URLs
d94c7e3 recipetool: create: support cmake find_library directive
ddfe744 devtool: commit for extra tasks that modify source when extracting
e36cb6c classes/externalsrc: create symlinks for workdir and logs
20034c3 classes/externalsrc: disable rm_work when active
c38f253 uninative.bbclass: capture stdout/err from patchelf-uninative
9065222 db: update HOMEPAGE
f0d5478 mdadm: update to version 3.4
79d5041 iproute2: update to version 4.4.0
21e3b2a image_types_uboot: add cpio.gz.uboot to supported IMAGE_TYPES
6fab5fc recipetool.newappend: add -e/--edit argument
252f97e liburcu: Add nios2 support
e72ab70 strace: Fix build for arc, metag, nios2, or1k, tile
691277f udhcpc: specify full path for ip command calls
f141f0b alsa-lib: avoid including <sys/poll.h> directly
a1ad3d0 oprofile: Add nios2 support
fd7dd07 nspr: Add nios2 support
954dc45 guile: Fix nios2 support
611e3d8 binutils: Repair nios2 PLT and GP handling
027eac5 gstreamer1.0-meta-base: make gstreamer1.0-plugins-base-alsa conditional
056d82c curl: drop obsolete pkgconfig_fix.patch
0e62f01 iproute2: update to version 4.4.0
216e618 quota: update to version 4.03
25d2956 oeqa/selftest/sstatetests.py: check that PARALLEL_MAKE doesn't change signatures
2966016 bitbake.conf: remove unused ALLOWED_FLAGS
3bdeda5 libproxy: remove GPLv3 logic and spurious exports
86994fd libproxy: add PACKAGECONFIG control for gnome3
033d754 libproxy: replace PACKAGECONFIG equivalent with the real thing
e65a29e openssh: Properly skip ptrace test if tools are missing
e1a1e0b openssh: Fix regex that sets sftp-server path for tests
d7faf67 insane.bbclass: Support MicroBlaze with musl
9937c93 hdparm: Explicitly set EXTRA_OEMAKE as required
7475c4c qemu: Security fix CVE-2016-1568
4857511 xserver-xorg: Add PACKAGECONFIG for crypto libraries
34798fa mesa: upgrade 10.6.3 -> 11.1.1
7edea7c initrdscripts: fix mmc device as install target
c3ef2bb libsoup-2.4: Remove unnecessary gnutls dependency
04454b2 wpa-supplicant: Only depend on libgcrypt when needed
4de0ee6 systemd: Don't depend on gcrypt unnecessarily
0da96bf buildstats.bbclass: remove dead URL from comment
326592d Remove obsolete references to exmap
a0cc1c3 curl: update 7.47.0 -> 7.47.1
a0d3eb9 sign_package_feed.bbclass: fix task dependencies
8cb1e83 oe/gpg_sign: fix incorrect variable name
902a68f meta/conf/layer.conf: adapt to more flexible initramfs-framework RDEPENDS
5b2b343 tune-corei7.inc: tell qemu to emulate a matching processor
5b70ee4 pixz: fix upstream version check
62a6f97 webkitgtk: update to 2.10.7
1cd6912 libwnck3: update to 3.14.1
e53eef9 iso-codes: update to 3.65
30cf8aa bash-completion: fix upstream version check
8098256 gstreamer1.0: fix upstream check for unstable versions from git
c24b0ab ffmpeg: update to 2.8.6
9237097 python: merge python-elementtree into python-xml
5ac4172 piglit: add missing dependency on python-xml
4d3ca42 systemd: tighten timesyncd and journal-gateway user accounts
6be3031 systemd: extend PACKAGECONFIG flags
85728ec systemd: rename systemd-zsh to systemd-zsh-completion
22a2866 systemd: move some tools into systemd-extra-utils package
9909104 classes/useradd: handle whitespace only USERADD/GROUPADD/GROUPMEMS
e485686 systemd: realign packages list
41d0f83 systemd: move bash completion into separate package
9a80afd nettle.inc: drop duplicate LIC_FILES_CHKSUM and SRC_URI hashes
72ec267 gdb: drop unnecessary CC_FOR_BUILD etc exports
00d6b67 gdb: build fix for MIPS + musl libc
40e4e8c strace: build fix for MIPS + musl libc
299b426 uclibc: fetch from master branch not 1.0
4ac4d28 uclibc-ng: Bump up to 1.0.12 release
70bfd4c musl: Upgrade to tip of tree
d1496b4 e2fsprogs: Fix multiple xattr handling
9d4b526 cdrtools-native: Explicitly set EXTRA_OEMAKE as required
864797a oeqa/prservice: Fix whitespace problem
7cd8351 pseudo: uprev to 1.7.5
246b02e ptest-runner: Explicitly set EXTRA_OEMAKE as required
7932525 unzip: Explicitly set EXTRA_OEMAKE as required
4ef055c sysklogd: Explicitly set EXTRA_OEMAKE as required
625066b stat: Explicitly set EXTRA_OEMAKE as required
07e81c8 pigz: Explicitly set EXTRA_OEMAKE as required
936223b iputils: Explicitly set EXTRA_OEMAKE as required
1e3fdbb ed: Explicitly set EXTRA_OEMAKE as required
ef36b6f gptfdisk: Explicitly set EXTRA_OEMAKE as required
59ee206 dmidecode: Explicitly set EXTRA_OEMAKE as required
d17758a libacpi: Explicitly set EXTRA_OEMAKE as required
44e8d0f apmd: Explicitly set EXTRA_OEMAKE as required
961d898 perl: Explicitly set EXTRA_OEMAKE as required
ecb9c34 oeqa: Improve test failure messages
ae2f3a3 sstate: Ensure populate_lic sstate objects are cleaned
26f26e5 package_deb: Ensure allarch deb packages aren't target specific
b3a2065 base: Make do_cleansstate nostamp
37357ab classes/testimage: Fix exportTests function.
f895a61 classes/testsdk: Add help information on how to run tests.
e22fbce oeqa/sdkext/devtool.py: Add location test to ensure that devtool is the eSDK one.
92d0cc5 oeqa/sdkext: Add devtool basic tests for eSDK.
a619ea2 oeqa/oetest: Fix compatibility SDK tests using eSDK.
062dbd6 classes/populate_sdk_ext: Add SDK_EXT_TARGET_MANIFEST and SDK_EXT_HOST_MANIFEST
4cfdf17 testsdkext: Add skeleton for support Extensible SDK tests.
5580d7b classes/testsdk: Add compatibility SDK testsuite to eSDK
7181da7 oeqa/oetest: oeSDKTest when run a command redirect env output to null
f3c2ce2 classes/testsdk: Add function run_test_context
3577c35 oetest.py/TestContext: Move loadTests and runTests inside it.
8009418 testimage/testsdk: Move get test suites routine inside TestContext.
b588b80 testimage/testsdk: Modularize TestContext.
59791d1 toolchain-shar-extract.sh: Add proxy variable to new env.
abd8158 classes/testsdk: Add call to export_proxies on testsdkext.
42f2ac4 classes/testsdk: Add testsdkext task only install.
90590ab get_test_suites: Add sdkext type for load test suites.
2ecc319 populate_sdk_ext: Set TOOLCHAINEXT_OUTPUTNAME.
7b459be classes/testimage: Add defeault inherit for testsdk.
24326a9 classes/testsdk: Add new class testsdk.
3d1d30b testimage: Modularize helper functions for get test lists.
8b5ee36 bitbake.conf/base: Improve handling of SRCPV
947e526 oeqa: setup bitbake logger after tinfoil.shutdown
400f530 bitbake: build: Improve python execution tracebacks
aece748 bitbake: build/data: Don't expand python functions before execution [API change]
e39cfb1 bitbake: cooker: Don't expand python functions in variable dumps
f652b6b bitbake: data: Don't expand python functions for variable dependencies
d3e0c44 bitbake: data_smart: Avoid expanding anonymous python functions
e0eb2ea bitbake: toaster: models Remove manual transaction control from lsupdates
48622e1 bitbake: toaster: build section Improve display of builds when > 1 targets
4d0ba0f bitbake: toaster: templates make build data breadcrumb consistent
99184d7 bitbake: BBHandler/ast: Merge handMethod and handleMethodFlags
6ba69b4 bitbake: utils: Drop datastore function inspection during exception
f8a44b1 bitbake: cooker: extended dot styling
30c132b bitbake: toaster: Enable Image Customisation feature
5e14a8f bitbake: toaster: xhr_customrecipe_packages Add dependencies to included packages
749f5a6 bitbake: toaster: orm generate_recipe_content only exclude locale packages
6269411 bitbake: toaster: customrecipe page Add last successful build link and conditionals
8d5b61e bitbake: toaster: models Add update_package_list for CustomImageRecipe
86db0bd bitbake: toaster: orm Add last_updated field to CustomImageRecipe
18d8b17 bitbake: toaster: models add get_last_successful_built_target method
8885b7b bitbake: toaster: pkg_dependencies_popover just show direct dependencies
40f6eff bitbake: toaster: models add all_depends method for Package_DependencyManager
a8ab1c6 bitbake: toaster: buildinfohelper CustomImagePackage update dependency info
0fee829 bitbake: toaster: newcustomimage_modal add frontend name validation
cb6d290 bitbake: toaster: API CustomImageRecipe check the recipe name supplied is valid
5634a25 bitbake: toaster: views CustomRecipe API add size information to the package lists
6fbceb0 bitbake: toaster: models Invalidate ToasterTables cache when a m2m field changes
998f9af bitbake: toaster: customrecipe Add dependency tracking to package selection
9976e4f bitbake: toaster: tables move template logic into the pkg_add_rm_btn
d77c247 bitbake: toaster: CustomImageRecipe generate overwrite IMAGE_FEATURES
481dc11 bitbake: toaster: make locale packages uneditable in custom image page
a757d39 bitbake: toaster: include locale and packagegroup packages in custom image
baac458 bitbake: toaster: update custom image package table filters
efbffe3 bitbake: toaster: move recent builds query to model
b514785 bitbake: toaster: update customimagerecipe migration
df58f5b bitbake: toaster: add merge migration to resolve conflict
38f4913 bitbake: toaster: orm generate_recipe_file_contents Handler for require recipe
769017e bitbake: toaster: project builds Poll the server to get latest progress for build
971d65c bitbake: toaster: localhostbectrl Update the dirpath of customrecipe's base layer
6d9f342 bitbake: toaster: tables Check layer presence in project for customise_btn
76c0008 bitbake: toaster: toastergui tests Add addtional data to the setUp for new tables
70a078e bitbake: toaster: tables SelectPackagesTable rename recipe_id to custrecipeid
7e4c231 bitbake: toaster: toastergui tests Update package test to use CustomImagePackage
4b3c9d6 bitbake: toaster: customrecipe Add further front end features using new API
b213907 bitbake: toaster: xhr_customrecipe_packages add GET info for package response
a9668ee bitbake: toaster: xhr_customrecipe_id change to use CustomImagePackage
439314c bitbake: toaster: API allow CustomImageRecipe to be updated after creation
9ea4de6 bitbake: toaster: tables Change SelectPackagesTable to use ProjectPackage
20f400b bitbake: toaster: tables add recipe download link to CustomImagesTable
1c9ce1c bitbake: toaster: newcustomimage_modal use libtoaster method for new CustomRecipe
8b1d043 bitbake: toaster: libtoaster Add createCustomRecipe method
32048fa bitbake: toaster: orm Add convenience method to get all pkgs in a CustomImageRecipe
c80b7df bitbake: toaster: orm get_project_layer_versions to return layer_version objects
796e348 bitbake: toaster: toastergui tests Add unit test for download custom recipe
04d8c94 bitbake: toaster: toastergui tests Update to reflect changes to CustomImageRecipe
4e8a0aa bitbake: toaster: views xhr_customrecipe_packages clean up API
66b5608 bitbake: toaster: toastertable remove title from Show all in table
ce72896 bitbake: toaster: Add recipe details page
5f52614 bitbake: toaster: newcustomimage Move modal dialog out of newcustomimage template
2a3dd32 bitbake: toaster: Continue front end features to custom image recipe page.
d6e7e4a bitbake: toaster: tables Add table for Packages and update SelectPackagesTable
43f0a05 bitbake: toaster: views Add view to download custom recipe
2cf55af bitbake: toaster: move CustomImageRecipe generation to API entry point
c402ac2 bitbake: toaster: orm add CustomImageRecipe generate contents function
a6e4f94 bitbake: toaster: buildinfohelper Add the concept of CustomImagePackage
e1bfe1c bitbake: toaster: orm: Add db migration for new CustomImagePackage table
f760a78 bitbake: toaster: orm Add CustomImagePackage table
4117af2 bitbake: toaster: orm: Add db migration for new CustomImageRecipe inheritance change
1f10289 bitbake: toaster: orm make CustomImageRecipe inherit from Recipe
648753b bitbake: toaster: orm Add sum of dependencies size function to PackageDependencyManager
a92fc30 bitbake: toaster: tablejs Add an event handler to manually trigger a data reload
4c82878 bitbake: toaster: ToasterTables simplify filter function move common part to widget
3e1e8e6 bitbake: toaster: models fall back to a sensible string for no vcs reference
14d09c8 bitbake: toaster: localhostbecontroller CustomRecipe now base_recipe is Recipe
7d5d8d0 scripts/lib/bsp/engine: trailing whitespace cleanup
dfeda17 scripts/lib/bsp/engine: fix path separator
d482d84 maintainers: remove gtk-theme-torturer and gnome-mime-data
d0d85a4 bitbake: bb/fetch2: Move export_proxies function from wget to utils.
7226ce2 glibc-locale: fix QA warning
4a2f42f formfactor: add machconfig for Beaglebone
eb53c54 sstatetests: Fix after change to sstate populate_lic SWSPEC
a43b9ef gstreamer1.0-plugins-base: move freetype dependency into 1.6.3 recipe
fb4f05b gstreamer1.0-plugins-base_git: update to git master 1.7.1-79-g6414289
fc81c80 gstreamer1.0-plugins-bad_git: avoid including <sys/poll.h> directly
3f02474 gstreamer1.0-plugins-good_git: avoid including <sys/poll.h> directly
9b0a74a gstreamer1.0: avoid including <sys/poll.h> directly
f9e565e gmp_4.2.1: fix build for MIPS
6d570c8 gmp.inc: limit ARM_INSTRUCTION_SET over-rides to armv4/armv5
3aecdd9 gmp: move BBCLASSEXTEND = "native nativesdk" from gmp.inc into 6.1.0 recipe
263a65d gmp: move SRC_URI out of gmp.inc + minor reformatting
aacae25 image_types.bbclass: Embed IMAGE_NAME in ubinize config file
9c0d4ec toolchain-scripts: drop PYTHONHOME
6560f80 python: set PYTHONHOME for nativesdk
92ae4e2 gcc: musl related fixes for ppc/secure-plt and gthr
9e5222c gcc: Assume libssp and dl_iterate_phdr on musl
281bd41 security_flags: wipe security flags for gcc/glibc and related libraries
61a5875 security_flags: use -fstack-protector-strong
a07f2fd security_flags: ensure security flags only apply to target builds
8d57d1d gcc: Fix build on musl with -fstack-protector
eb134c6 isoimage-isohybrid.py: fix cpio working directory
8bedf76 glib-2.0: use the system libpcre
1ae132e libpcre: enable unicode properties by default
3adb8d5 python3: remove optimize by default patch
1df1ac9 security_flags.inc: don't do -pie for syslinux
562c75c neon: convert to PACKAGECONFIG
6228cf8 bitbake: toaster: reinstate ID on edit columns button
916c73d bitbake: cooker: shutdown cooker parser on shutdown
8857498 bitbake: fetch2/osc: Clean up old variable syntax
54da829 bitbake: fetch2/osc: Remove hardcoded url
c57ba52 cross-localedef-native: add ABI breaking glibc patch
0cc825f uninative: Improve error handling
576a248 patchelf: Add patch to handle large files
bbdbe00 package_manager.py: fix python indentation bug (opkg)
ea40a0b populate_sdk_ext: Make populate_sdk_ext depend on sdk_extra_conf
4f7656a populate_sdk_ext: Add support for a "minimal" type
71bb332 populate_sdk_ext: Don't set sdk_update_targets in the config
5b7a43e toolchain-scripts.bbclass: Use PYTHONPATH instead of PYTHONHOME
f1f8447 copy_buildsystem.py: Pass the nativelsb argument to gen-lockedsig-cache
b130805 gnome-mime-data: remove
12d5fa8 gtk-theme-torturer: remove from oe-core
659d755 openssl.inc: drop obsolete mtx-1 and mtx-2 over-rides
32b498c scripts/devtool: Add getVarFlag expand argument
ed5daa1 bitbake.conf/native/nativesdk: Set PKG_CONFIG_SYSTEM_ at top level
8fa2d52 pango: unset LDFLAGS when building gen_all_unicode
edfaa04 pango: merge bb and inc
00ccf51 e2fsprogs: Ensure we use the right mke2fs.conf when restoring from sstate
66a6ec2 nativesdk: Set PKG_CONFIG_SYSTEM_ variables
34e95b0 local.conf.sample.extended: Document HOW-TO enable systemd or busbox for init system
077d32e local.conf.sample: Remove trailing whitespaces
6ae662a bitbake: parse/ast: Mark anonymous functions as python functions
9913fd8 bitbake: codeparser: Improve handling of data.expand() dependencies
4628fe1 bitbake: lib/bb: Add expansion parameter to getVarFlag
b98866d bitbake: fetch2/gitsm: Fix when repository change submodules
390c2c1 bitbake: data_smart: Add missing expand parameter to getVar call
56454f6 bitbake: bitbake: prserv: do not clear umask when daemonizing
abf8a8f bitbake: bitbake: prserv: SIGTERM handling hung process
be032fc bitbake: bitbake: prserv: -wal and -shm sqlite lost when daemonizing
1e95ebd poky-tiny: Use musl for default system C library
6594bd5 maintainers.inc: Set me as Maintainer of QEMU.
86851d5 insane: Fix populate_sysroot sanity test path
d09a25e socat: upgrade to 1.7.3.1
fad264b libffi: move from recipes-gnome to recipes-support
d3753dd libffi: ensure sysroot paths are not in libffi.pc
c72614b syslinux: remove LDFLAGS manipulation
8ad11fc lttng-tools: Fix ptest installed la files
66ed16b gnutls: update 3.4.8 -> 3.4.9
149cb17 python-distutils: add missing dependency on python-email
3473962 nss-myhostname: Fix build on musl
42e37d7 linux-firmware: update to latest revision 52442afee
ce1bed7 license.bbclass: add LICENSE_CREATE_PACKAGE to perform_packagecopy vardeps
e43504b i2c-tools: point SRC_URI at Yocto source mirrors
2d7622c gnutls.inc: allow libidn support to be controlled via PACKAGECONFIG
60ebe1c gnutls.inc: add gmp to DEPENDS
935aa96 gnutls.inc: minor formatting improvements
3fa1c54 Revert "kernel/kernel-arch: Explicitly mapping between i386/x86_64 and x86 for kernel ARCH"
0b82af2 wic: isoimage-isohybrid: check for syslinux-native
9699441 formfactor: add machconfig for qemumips64
4701dc9 ncurses: use closing curly brackets in FILES_${PN}-tools variable
9d9f233 util-linux: Change ALTERNATIVE_PRIORITY above busybox
8f2306c mktemp: lower the priority of standalone mktemp package
6251846 libxsettings-client: drop obsolete disable_Os_option.patch
7894633 wic: default to empty bootloader config
090fb51 copy_buildsystem: add ability to exclude layers
8dc600f toaster.bbclass: reinstate scan for artifacts in the sdk directory
eee675b toaster.bbclass: attach image file scan postfunc to do_image_complete
0c0b072 meta: add ASSUME_PROVIDED dependency on wget-native for http fetches
f926610 gtk+3: Tweak getVar to use True, not 1
7fa6eeb classes/lib: Add expand parameter to getVarFlag
252e645 python-pycurl: remove unnecessary exports
9fd214d sstate: Fix SSTATE_SWSPEC only used by populate_lic tasks
4ea6a64 package.bbclass: Add data expansion to do_split_packages()
6ab5001 busybox/gtk/perl/base-passwd: Ensure data is correctly expanded
e8860f7 ref-manual: Fixed typo in FAQ 14.15 section.
9d2925e ref-manual: Updated FAQ entry regarding Proxy for SOCKS
29a44da ref-manual: Fixed type in LICENSE_CREATE_PACKAGE variable description
4181e58 ref-manual: Updated warning regarding libexecdir
0d8bd7d ref-manual: Added description for LICENSE_CREATE_PACKAGE variable.
6aca5b8 ref-manual: Added remove-libtool class
5e2201e toaster-manual: Updated the "Installation" to have TOASTER_DIR information
3aa162a p11-kit: fix packaging warnings
60c9759 piglit: don't use /tmp to write generated sources to
b33e440 libical: Work around hardcoded paths in pkgconfig file
a131b6e documentation.conf: align the documentation for DEBUG_OPTIMIZATION and FULL_OPTIMIZATION with bitbake.conf
974a8c0 pciutils: Explicitly set EXTRA_OEMAKE as required
2d3e6f3 openssl: Explicitly set EXTRA_OEMAKE as required
b07e161 dbus: add user sessions support
877eae1 dbus: use ${systemd_system_unitdir}
6010088 populate_sdk_ext: Add SSTATE_MIRRORS to config blacklist
70ec867 insane: add test for -dev packaging containing real libraries
38d6f1f python3: set INSANE_SKIP as libpython3.so is a trampoline library
4ac4023 p11-kit: fix module packaging
9a27010 libnl: package the libnl-cli modules in libnl-cli
111af1d remove-libtool: add new class
333dce4 gtk-immodules-cache.bbclass: fix immodules-cache path
b1e41f4 Revert "matchbox-keyboard: export GTK_IM_MODULE_FILE location"
ac1f311 directfb: use Yocto source mirrors for SRC_URI
4d80f7a gcc-configure-common.inc: drop --enable-target-optspace from configure
654eddc machine/include: drop tune-cortexm*.inc and tune-cortexr4.inc
322015a liboil: drop recipe from oe-core
41d50f9 boost: Fix build on soft-float ABI arm systems
07a91a6 libnss-mdns: Check for nss.h before using
1b34f55 db: Use cross libtool
64089c6 libtool-cross: Unset pre|post dep objects
457f417 docbook-xsl-stylesheets: create a link for easy refer
1ba62f9 pth: Remove dead code
a4a5d1f3 bitbake: cooker, bitbake-worker: Fix spelling of "received"
8f6b9c7 bitbake: cooker: Only start as many parse threads as we need
602da7c bitbake: knotty: Don't show errors for universe provider issues
1dd2d76 linux-yocto: Adds new genericx86 and genericx86-64 SRCREVs for kernel 4.4
b8fa9d3 poky: Add poky-world-exclude.inc and add qwt-as
5503a22 sstate: Revert using -m option to tar in sstate
6023798 libarchive-native: Disable libxml2 support
b09b054 pcmciautils: Fix makefile race
89df5f1 binutils: Use target provided zlib
c85c54f binutils: Upgrade to 2.26
ba2fdcd native.bbclass: Set CXXFLAGS from BUILD_CXXFLAGS not BUILD_CFLAGS
2394b15 gstreamer1.0-plugins-base: Add video crop supporting when convert frame
2724908 gstreamer1.0-plugins-bad: Fix memory leak of navigation thread
db81fc9 lib/oe/package_manager: remove package feed lists
c43da12 externalsrc: use shared CONFIGURESTAMPFILE if B=S
c6b8227 Make sure that the directory for CONFIGURESTAMPFILE exists
ca06179 autotools.bbclass: use oe_runmake instead of ${MAKE}
f4f9f2f gcc, qemuppc: Explicitly disable forcing SPE flags
691f7e4 pango.inc: misc dependency fixes
70efb8d pango.inc: limit ptest specific do_compile_prepend to target builds
c1273d4 systemtap_git.inc: do not immediate expand SELECTED_OPTIMIZATION
e631be2 glibc.inc: do not immediate expand SELECTED_OPTIMIZATION
770d9ff mkelfimage: fix target cflags leaks to host
c936bf0 base: Move COMPATIBLE_MACHINE out the scope of SOURCE_MIRROR_FETCH
3072361 bitbake: bitbake: BBUIHelper: Remove function findServerDetails
28c041c bitbake: fetch2: Simplify logic in verify_checksum()
5375e64 bitbake: bitbake: Set process names to be meaninful
5b234d1 bitbake: utils: Add ability to change the process name
0b06924 bitbake: data.py: avoid double newlines at the end of functions in emit_var()
68600ae bitbake: build.py: minor shell_trap_code() formatting tweaks
423a264 conf/distro/poky.conf: use example.com for connectivity check
6c058ce curl: update 7.46.0 -> 7.47.0 ( CVE-2016-0754 CVE-2016-0755 )
adbe63d openssl: update 1.0.2e -> 1.0.2f ( CVE-2016-0701 CVE-2015-3197 )
85b6679 autotools.bbclass: don't create subshell to delete configure scripts
2f1bcc1 sstate: Add back packagedata on packagedata dependencies
346b225 libical: update to 2.0.0
b696bb3 kexec: package kdump init script/configuration file correctly
51cebbf connman: fix crash with iptables 1.6
7f54fab autotools_stage.bbclass: remove it
07c4bc1 gdb-common.inc: add PACKAGECONFIG for readline
5869e35 tzdata: update to 2016a
c9cc707 tzcode: update to 2016a
aff2f58 glibc-testing.inc: drop pruning of PATCH_GET from the testglibc script
dfb9d41 gcc-cross.inc: drop pruning of PATCH_GET from the testgcc script
9e7d929 bitbake.conf: stop exporting PATCH_GET = "0"
5410aff sstate: Improve handling of useradd dependencies
9823802 gtk-icon-utils-native: Drop problematic dependency
6c04e0d glib.inc: limit ARM_INSTRUCTION_SET over-rides to armv4/armv5
83476b5 glib-2.0: drop add-march-i486-into-CFLAGS-automatically.patch
fab76ae glib-2.0: refresh configure-libtool.patch
593dcd4 systemd: fix systemctl enable script for template units
3c90507 glib: use bash-completion.bbclass
d88ed5d kmod: use bash-completion.bbclass
0f3780c git: use bash-completion.bbclass
9d20661 util-linux: use bash-completion.bbclass
0e5b0bf dbus-glib: use bash-completion.bbclass
9cddc0a bash-completion.bbclass: add class
ddb786c bash-completion: move in recipe from meta-oe
74e2f68 ffmpeg: add a recipe, and remove the libav recipe
eb7e554 lib/oe/patch: Make GitApplyTree._applypatch() support read-only .git/hooks
3ed566e gcc: fix hidden weak symbols by removing buggy gcc patch
51d9ba6 dpkg: fix CVE-2015-0860
f80d16e qemu.bbclass: clarify QEMU_EXTRAOPTIONS
3dca294 pango.inc: drop obsolete dependency on qemu-native
a16e9a2f dbus: upgrade to 1.10.6
7081458 buildhistory: fix the check for existence of a git repo
d74325e connman: tidy up connman-conf usage
79f4495 connman-conf: convert to systemd oneshot
5c35883 bitbake-whatchanged: avoid double do_ task name prefix
7881c02 netbase: add ipv6 host to /etc/hosts
93fcee6 linux-yocto/4.4: CVEs and preempt-rt update
07c182f linux-yocto/4.1: update to 4.1.16
7003698 gstreamer1.0-plugins-bad: fix compiler warnings with -Os in 1.7.1
6e90145 gstreamer1.0-plugins-good: fix compiler warnings with -Os in 1.7.1
3cd70c8 libsoup-2.4: add glib-2.0-native dependency
d5b3b97 libtirpc: remove stray .orig file from Use-netbsd-queue.h.patch
209066c ptest-runner: Add ptest-runner_2.0 recipe.
4953e26 musl: Upgrade to tip of tree
52413d0 libdrm: Refresh patch to match upstream submission
66e215f fts: Correct LIC_FILES_CHKSUM
be4c446 pth: Delete
df95988 elfutils: Fix build with uclibc/musl
047ad2c grub: Backport fix for largefile detection/use
956be0c oeqa/runtime/rpm: be more verbose if test_rpm_query_nonroot fails
3b5288f libc-package.bbclass: add LOCALE_UTF8_IS_DEFAULT
4f3ef90 ref-manual: Updated the BBMASK variable description.
b2b7214 dev-manual: Restored ptest-runner2 to ptest-runner
d484e58 ref-manual: Removed obsolete do_deploy statement from "Shared State"
7705b87 toaster-manual: Updated instructions for production setup.
4b4a8a6 ref-manual: Updated the SDK figure.
d7481ce ref-manual: Added do_image and do_image_complete tasks
d39e9d1 ref-manual: Rewrite of "Image Generation" and devtool text.
1e7735e ref-manual, mega-manual: Updated the Image Creation figure
fded4fa ref-manual: Updated configuration of auto.conf in closer look
9f192c8 dev-manual: Updated the devtool help examples.
4bbd39d dev-manual: Grammar fix to kickstart section.
75078dd dev-manual: Updated wic reference section
9ed7881 poky-ent: Grouped Fedora perl packages for niceness
3ac0416 local.conf.sample.extended: Update the info about BBMASK
d61d290 bitbake: bitbake-user-manual-ref-variables: Update the help for BBMASK
a948f52 bitbake: cooker: Allow BBMASK to contain multiple regular expressions
e82101a bitbake: bitbake-user-manual-metadata: Updated 'dir' flag
100d6c2 bitbake: bitbake-user-manual: Updated the example BitBake directory
11be341 documentation.conf: Update the help for BBMASK
3d2c0f5 cmake: update to 3.4.2
4364850 at-spi2-core: update to 2.18.3
c763940 webkitgtk: update to 2.10.5
1e95815 libsecret: update to 0.18.4
9259a43 freetype: update to 2.6.2
5ec6dbb gdk-pixbuf: update to 2.32.3
9c84fbc glib-2.0: update to 2.46.2
bd7278c gtk+3: update to 3.18.6
d609cd5 gtk+: update to 2.24.29
6197313 gtk-icon-utils-native: update to 3.18.6
1556f0e libsoup-2.4: update to 2.52.2
dff038a waffle: update to 1.5.2
89bd19f vala: update to 0.30.0
6c02099 rxvt-unicode: update to 9.22
245af2b btrfs-tools: Disable backtrace on musl
fa01d37 bsd-headers: Fix LICENCE and dev package RDEPENDS
05e11a5 gdb: Fix build failures on musl
72c1aa2 ltp: Add rdep on ldd
1d0332d argp-standalone: Fix build when S != B
9f22898 bitbake: fetch2/wget: fallback to GET if HEAD is rejected in checkstatus()
d11cc29 busybox: fix stop -vs- start typo in rcS script
9f4b088 mtools: keep v3.9.9 recipe in sync with the v4.0.18 version
2c14be3 gen-lockedsig-cache: fix bad destination path joining
9dea876 distutils-common-base: do not set PACKAGES - use defaults from bitbake.conf
4ead707 insane: remove unused variable assignment
44e9c3b meta: fix capitalisation in Upstream-Status
06b4572 pixman: only check even upstream versions
0f74387 gcr: check only even upstream versions
a2848ee avahi: Add patch to fix Win10 mDNS issues
04ef34f xf86-input-libinput: initial add 0.16.0
8a2dfa1 image.bbclass: check INITRAMFS_MAXSIZE
962cc37 systemd: make TEST_DIR configurable
9967746 bind: update to 9.10.3-P3
cac47db uninative: handle UNINATIVE_URL being file:///
9995814 uninative: fix path to patchelf-uninative
2495dfa scripts/wipe-sysroot: also delete uninative sysroot
bb97157 meta/lib: new module for handling GPG signing
aadb879 devtool: extract: use the correct datastore for builddir
fa801e7 busybox: backport upstream truncate open mode fix
6996b26 gstreamer1.0-plugins-base.inc: drop obsolete dependency on liboil
1c4a8cc e2fsprogs: disable blkid
0de8766 pango.inc: drop obsolete FULL_OPTIMIZATION over-ride
89a7ed5 devtool: add configure-help subcommand
84720c8 devtool: properly handle bb.build.FuncFailed when extracting source
c3f0f7b devtool: add: warn if modified recipe found in attic directory
e559b66 devtool: build-image: allow specifying packages to add to image
e00eac8 devtool: move edit-recipe to a separate module
6720bda image: Don't create tasks with '.' in the name
88ca227 rootfs-postcommands: fix allow-empty-password on read-only rootfs
fdac363 kernel: Clean DEPLOYDIR before do_deploy runs
c2231de gcc-cross-canadian: Add missing DEPENDS on virtual/${HOST_PREFIX}gcc-crosssdk
5fdedb6 libtirpc: Drop unneeded xz-native dependency
7a98fb7 libuser: Drop unneeded xz-native dependency
72f98ba bitbake: toaster: Update UI test runner
c192bd6 Revert "xz: Allow to work with ASSUME_PROVIDED xz-native"
6df607b acpid: upgrade to 2.0.26
7a52f67 build-perf-test.sh: add eSDK testing
5c367ec build-perf-test.sh: more generic timing function
44fee2b python3-pip: Upgrade to 8.0.0
9d95a9d orc: update HOMEPAGE
0c1c93e gstreamer1.0-plugins.inc: drop obsolete ${S}/po/Makefile.in.in workaround
be145ad busybox: Add support for busybox-init
716fa93 pulseaudio.inc: drop obsolete dependency on liboil
55bfaa2 sqlite3: update 3.10.0 -> 3.10.2
6bb1dd1 sqlite3.inc: add PACKAGECONFIG to support building against libedit
39f6a9e sqlite3.inc: dynamically link the sqlite3 command-line utility
9b2835e sqlite: formatting improvements, move more stuff into sqlite3.inc
89ed462 sqlite3.inc: drop obsolete config_BUILD_CC, etc exports
6188419 sqlite3.inc: fix readline PACKAGECONFIG
939de8d sqlite3: fix the parallel build fix patch
a304b82 weston: Add missing DEPENDS on wayland-native
4a5458f bitbake: fetch2: Don't show checksum warnings if a single checksum was supplied
e66599f uninative: Fix conflicts with normal sysroot
4833bee insane: Drop do_stage test
861c916 populate_sdk: Use pixz instead of xz
a1c35f3 lib/oe/sdk: Partially revert "sdk.py: fix conflicts of packages"
29c5eda uninative: Add fetch capability
b54fa25 pixz: Add 1.0.6
d47572d xz: Allow to work with ASSUME_PROVIDED xz-native
0aeb33f lib/oe/package_manager: prevent testing an undefined variable
c1f4e92 recipetool: create: better fix for fetch error handling
10c8d14 recipetool: create: fix extraction of name from URLs ending in /
b307e0a recipetool: create: extract SRC_URI from local git repositories
50e40fc devtool / recipetool: support specifying a subdirectory within the fetched source
7e1691d recipetool: create: strip quotes from values extracted from CMakeLists.txt
477fa84 gen-lockedsig-cache: copy correct native sstate into ext SDK
204e4ab toolchain-shar-extract.sh: improve behaviour when xz is not installed
979c8fb classes/populate_sdk*: add dependencies on script files
f220abc classes/populate_sdk_ext: drop ext-sdk-prepare.py when installing
b435225 devtool: add sdk-install subcommand
44d1a2a devtool: sdk-update: improve SDK update process robustness
3360baa devtool: sdk-update: improve temp directory handling
d193531 devtool: build: ensure pkgdata is written out
d3a4f72 classes/populate_sdk_ext: add option to bring in pkgdata for world
a9dfced linux-libc-headers: Port patches for linux-headers for musl
3cffa6d libsolv: Update to 0.6.17+
d9134cf glib-2.0: Fix locale location on musl
527cd95 syslinux: Set LD to avoid using build host ld
136db70 binutils: Fix gold linking errors due to unresolved R_ARM_MOVW_ABS_NC
704e342 puzzles: Silence warning on arm with clang
bee65f9 eglinfo: Fix build on raspberrypi
6296c0f mdadm: Fix build with musl
67eef11 gpgme: Define __error_t_defined on musl
368e838 console-tools: Fix header inclusion when not using glibc
5a8c935 uclibc: Update to 1.0.11
1113d58 unfs3: Depend on libtirpc when building on musl
2ecfc02 guile: Fix build with musl
2df08b8 bsd-headers: Package cdefs.h
29deaf0 musl: Create ld.so as a relative symlink
2d028b3 fts: Fix linker hash-style option
8dd1aa8 dosfstools: Correct cross-compile CFLAGS and fix build with musl
21550d1 nss: Undefine HAVE_SYS_CDEFS_H
92e6a7a apmd: Fix build with musl
5d661c5 pcmciautils: Fix parallel build and include sys/types.h
86795ff kexec-tools: Define _GNU_SOURCE for getting loff_t definition
ff8006f systemd: Skip parsing on musl based targets
f2856a1 oprofile: fix build with musl
226c450 portmap: Point to tirpc headers and libraries on musl
5512c2f nfs-utils: Disable tcp-wrappers for musl
06d0204 bsd-headers,musl: Add recipe for bsd missing features
c2c9202 tcf-agent: Implement canonicalize_file_name() for musl as well
f294813 chkconfig: Avoid using caddr_t
b2aca09 nspr: Drop older glibc code
c0976fc irda-utils: Fix header inclusions
a3f9721 iproute2: Fix build with musl
22333f0 libuser: Fix build when secure getenv is not there
ea9dc99 iputils: Use member based initialization for mrghdr struct
b207868 pax: Fix build with musl
1076499 tar: Fix build for musl based targets
e451023 rt-tests: Fix build with non-gcc compilers
68da390 webkitgtk: Fix build with clang/musl
da81635 console-tools: Include sys/types.h for u_char and u_short defs
205a07a sysklogd: untangle header inclusion maze
9f40dba babeltrace: Add missing header for MAXNAMLEN define
2458850 libunwind: backtrace APIs are glibc specific
abdfacb apt: Add support for building for musl targets
ec187d3 puzzles: Zero'ise structs before use
3cd0a8c dpkg: Add musleabi to known architectures
aaa8516 xinetd: Fix build with musl
93fb408 watchdog: Fix build with musl
7509ffd gzip: Fix build with musl
1d28cbc directfb: Fix build with musl
7b6b312 net-tools: Link with libintl on uclibc
ee1bfdb parted: Fix build with uclibc
ed5da2a mtools: Fix build with uclibc
5384f08 gnutls: Link with libuargp on uclibc
493e557 guile: Fix build with uclibc
1636f6f packagegroup-self-hosted.bb: Move glibc-gconv-ibm850 to glibc only case
3e7d7ab util-linux: Fix ptest builds on musl
77825f8 gnutls: Link with libargp on musl and depend on argp-standalone
1a6fe71 argp-standalone: Add recipe
a7d780c gdk-pixbuf: Fix latent build issue exposed by musl
f2cf5d3 xserver-xorg: Fix build with musl
b8de631 libcgroup: Add dependency on fts when building on musl
87c3e98 connman: include config.h for HAVE_STRUCT_IN6_PKTINFO_IPI6_ADDR
cc55fc7 fts: Add recipe
6e3950b tcp-wrappers: Fix build with musl
68f88a5 ppp: Fix build with musl
4972edd blktrace: Include <sys/types.h for dev_t
d629fa1 powertop: Include right headers for timval struct
063dc38 update-alternatives: when warning about alt_link==alt_target, say what PN
6baafa1 python-setuptools: Unify and upgrade python-setuptools and python3-setuptools to 19.4
f0e500e gstreamer1.0-libav: update git recipe to 1.7.1
90cbdfb gstreamer1.0-plugins-ugly: update git recipe to 1.7.1
6752484 gstreamer1.0-plugins-bad: update git recipe to 1.7.1
ad8f201 gstreamer1.0-plugins-good: update git recipe to 1.7.1
2ca9f20 gstreamer1.0-plugins-base: update git recipe to 1.7.1
3c7f2b8 gstreamer1.0: update git recipe to 1.7.1
7c810d0 gstreamer1.0-libav: update 1.6.2 -> 1.6.3
a4b8e9a gstreamer1.0-plugins-ugly: update 1.6.2 -> 1.6.3
8170e06 gstreamer1.0-plugins-bad: update 1.6.2 -> 1.6.3
497ebc9 gstreamer1.0-plugins-good: update 1.6.2 -> 1.6.3
3d87902 gstreamer1.0-plugins-base: update 1.6.2 -> 1.6.3
1e256ee gstreamer1.0: update 1.6.2 -> 1.6.3
dacf2aa gst-plugins-package.inc: drop perl RDEPEND for XXX-apps packages
676275f gstreamer1.0-plugins.inc: don't set base SRC_URI via python
852f098 gstreamer1.0-plugins.inc: drop obsolete lib-link.m4 workaround
a32ac26 gstreamer1.0-plugins-bad.inc: update hls dependency gnutls -> nettle
97e0752 gstreamer1.0-plugins-bad.inc: don't set ${S} or apply version specific patch
78e9361 gstreamer1.0-plugins-good.inc: remove duplicate --disable-examples
0edabfd gstreamer1.0-plugins.inc: convert GSTREAMER_1_0_DEBUG to a PACKAGECONFIG
81cd227 gstreamer1.0-plugins.inc: add missing glib-2.0-native dependency
a0b1e66 gstreamer1.0.inc: add missing glib-2.0-native dependency
e5fb79d gstreamer1.0-rtsp-server.inc: minor formatting improvements
434aa8e gstreamer1.0-omx: minor formatting improvements + update HOMEPAGE
69bcd33 gstreamer1.0-libav: minor formatting improvements + update HOMEPAGE
1d6e61a gstreamer1.0-plugins-ugly: minor formatting improvements
c45ce26 gstreamer1.0-plugins-bad: minor formatting improvements
c1ea981 gstreamer1.0-plugins-good: minor formatting improvements
beb8091 gstreamer1.0-plugins-base: minor formatting improvements
61f30b4 gstreamer1.0-plugins.inc: minor formatting improvements
981145a gstreamer1.0: minor formatting improvements
9f1a943 gst-plugins-package.inc: minor formatting improvements
9e08b69 gst-player: minor formatting improvements
a8ed2c8 valgrind: remove unused valgrind-remove-rpath.patch
e24123d emptytest: exclude from world builds
6808035 build-appliance-image: bump version to 14.0.0
eb418c3 insane.bbclass: fix package_qa_walk()
e185004 insane.bbclass: print all the QA messages
95fa36e weston: upgrade 1.8.0 -> 1.9.0
1bc0c89 wayland: upgrade 1.8.1 -> 1.9.0
03dae8e glib-2.0: fix the ptest
68c5e6d insane.bbclass:buildpaths: ignore ipkg/dpkg's CONTROL dir
258676b sstate: display the sysroot name when cleaning for clarity
f35b2e2 bitbake: set default libexecdir to $prefix/libexec
40f0c2d gawk: fix libexecdir/libdir/BPN confusion
2458f41 mesa: update SRC_URI
fdb12f9 e2fsprogs: set PV to 1.42.99+1.43+git${SRCPV}
9cf1ec0 valgrind: avoid neon for targets which don't support it
b191f58 valgrind: re-enable ARM intdiv and vcvt_fixed_float_VFP tests
b0b3412 valgrind: let valgrind determine its own optimisation flags
92abb5f meta/files/toolchain-shar-relocate.sh: Detect different python binaries and select one that exists.
924e2c3 python-nose: upgrade to 1.3.7
02440b5 python-native: Make python-native also RPROVIDE python-unittest-native
b7ca05d linux-libc-headers: update to 4.4
f73ee59 libpng12: upgrade to 1.2.56
3a59486 libpng: upgrade to 1.6.21
63a49f8 libtirpc: remove redundant va_list patch
55a8df2 perl: Upgrade to 5.22.1
a840588 oeqa/selftest/signing: use temporary rpmdb
65c1de9 kexec-tools: inherit update-rc.d
ba837f1 autotools: don't output the full config.log on configure failure
3e3cb62 bitbake.conf: Remove horrible variable expansion hacks
b963efb mesa: add missing wayland-native build dependency
9dd6c81 maintainers.inc: Correct maintainership for several packages
bd1a534 bitbake: toaster: run bitbake server with --read option
76a281c bitbake: taskdata: add the ability to access world targets list
11a1f49 bitbake: cache.py: check existence before add to cachedata.rproviders
05c1775 bitbake: taskdata.py: add RuntimeProviders to close matches
cf9cb65 bitbake: data_smart: Don't show exceptions for EOL literals
b80219e udev: Add 2 patches to support 4.4 kernel
1013385 gcc-runtime.inc: provide libquadmath
60b237f kexec: update supported architecture list
92a0032 strace: update 4.10 -> 4.11
0aa8169 strace: fix ARCH definition in tests/Makefile
2408149 strace: remove need for git-version-gen script
9ca6a5f strace: fix --disable-aio configure option
dd90f32 strace: drop unnecessary dependency on acl
aadae7b libnewt: Fix linking error due missing symbols
571289d lib/oe/package_manager.py: Remove list() from PkgsList class
6ebda8e lib/oe/rootfs: Use list_pkgs() instead of list()
03075f6 lib/oe/utils: Add function format_pkg_list()
c708411 lib/oe/package_manager: Add list_pkgs() to PkgsList class
113e136 python3: Minor upgrade 3.5.0 -> 3.5.1
918149d python-numpy: upgrade to 1.10.4
eae7584 swig: upgrade to 3.0.8
21f7677 python-scons: upgrade to 2.4.1
7721652 python-pycurl: upgrade to 7.21.5
2ef401f python-mako: upgrade to 1.0.3
2a608cc python-setuptools: Upgrade to 19.2
6395bc8 python3-setuptools: upgrade to 19.2
40738af python: Upgrade 2.7.9 > 2.7.11
35855a0 wic: pylinted ksparser module
e3b3bcf wic: add help for 'include' command
bfaabe5 wic: move parts of canned .wks into common.wks.inc
50a3dc5 wic: implement search of includes
15ea180 wic: refactor get_boot_config
d304162 wic: ksparser: add support for include
3fc6aaa wic: do not remove build dir in source plugins
8d34eea wic: use unique partition number
43b4058 wic: move wks parsing code to KickStart._parse
3860640 nss: update to 3.21
ea39ad0 libjpeg-turbo: fix upstream version check (sort of)
48a8a89 libical: fix upstream version check
c6f71c5 gnutls: update to 3.4.8
7a80f84 sysstat: fix upstream version check
2aabf9a pbzip2: update to 1.1.13
77aee28 ncurses: fix upstream version check
56e4ff6 libsolv: fix upstream version check
d46bc77 e2fsprogs: fix upstream version check
0436e3f build-appliance-image: bump version to 14.0
a206a19 btrfs-tools: update to 4.4
a1790bc bootchart2: update to 0.14.8
68c7113 poky.conf: Delete BB_SIGNATURE_HANDLER settings
0916235 rpm: remove bashisms: [ x == x ] -> [ x = x ]
2dbd61f uclibc: remove a use of immediate expansion and oe_filter_out ()
32eeb00 gcc-runtime: switch to removal override syntax to modify CXXFLAGS
c886a78 bitbake: tests/codeparser.py: Add filename/lineno flags to test variable
f130033 bitbake: toaster: write variables to toaster.conf
1835768 sstate: replace verbose manifest removal with a single count
d4c721a libdrm: Upgrade 2.4.65 -> 2.4.66
b5508a8 slang: Add dependency on ncurses
27b2df2 valgrind: make it explicit that valgrind supports armv7a and above
5dc38a3 sign_rpm.bbclass: fix task dependencies
27c39c4 opkg-utils: store alternatives in nonarch_libdir
77fde15 security_flags.inc: remove obsolete workarounds for curl
31ce027 cups: update systemd support
a4b48c2 coreutils: Add xattr PACKAGECONFIG
7a0b1c1 oeqa/runtime/parselogs: use -F to search fixed strings for grep
b8e11e2 libinput: Upgrade 0.21.0 -> 1.1.4
a9f2e87 postinst-intercepts: always use set -e
de0848f maintainers: mark Khem as nominal owner for uclibc
3235f5e formfactor: remove unused beagleboard configuration
6c64700 alsa-state: remove beagleboard configuration
f0d47a6 bitbake: Revert "runqueue.py: Ensure one setscene function doesn't mask out another which needs to run"
9e867ef sstate: Add packagedata to list of tasks not to recurse
5e881c1 classes/populate_sdk_ext: fix task dependency regression
2e9f092 image: Handle image types containing '-' correctly
0612ca4 oe-selftest: devtool: fix test_devtool_add_library if python was built first
c1492c4 recipetool: create: add a couple more license checksums
2c8c9fe recipetool: create: add basic support for extracting dependencies from cmake
3eb397f recipetool: create: force GL libraries to virtual/*
726dbda recipetool: create: move dependency mapping code to RecipeHandler
788e4bb recipetool: create: fix overzealous mapping of git URLs
ece0a2e recipetool: create: support additional autoconf macros from autoconf-archive
903d471 recipetool: create: detect flex/bison dependency
a66f4ac recipetool: create: pick up boost macros in configure.ac
dbe91a3 recipetool: create: improve extraction of pkg-config / lib deps
e7bedb9 wic: rename kickstarter.py -> ksparser.py
3bb6ea6 wic: override ArgumentParser.error
d652203 wic: removed unused imports
d2090a6 wic: improve processing of parseing errors
1ed97cc wic: catch KickStartError
bda77fd wic: add custom exception KickStartError
ef211a5 bootimg/image-vm/image-live: Improve image dependencies
0910bc6 image: Always run do_rootfs_wicenv
12e37e7 selftest/buildhistory: Improve test to remove sources of error
05716dd bootimg/image: Enhance bootimg to respect RM_OLD_IMAGE
1c869a9 rootfs-postcommands: Ensure license manifests respect RM_OLD_IMAGE
d27491b image: Ensure we don't expand TMPDIR in image commands
ce8a206 image: Fix instability of do_image_* checksums
fb1654f image: Fix wic environment issues
1da8f52 insane: Start to clean up do_configure_qa code
dd28695 insane: Clean up horrible return value processing code
839fb18 e2fsprogs: fix PV
b1236dc e2fsprogs: add PACKAGECONFIG for fuse
f98e11c bitbake: toastergui: make artifact download more robust
68f3e1e bitbake: toasterui: log OSErrorException metadata events
fb94754 bitbake: toasterui: listen for bb.event.MetadataEvent
a2f23fa openssh: CVE-2016-1907
320a319 license.bbclass: fix license manifest
4339a82 wic/help.py: document requirements for valid fstab generation
d688df8 glib-2.0: add dependency glib-2.0-native back
76e35f1 kernel-yocto.bbclass: move do_kernel_link_vmlinux() into kernel.bbclass
d453fa1 kernel-yocto.bbclass: remove do_kernel_link_vmlinux from SRCTREECOVEREDTASKS
2b92f88 libarchive: Add bsdtar and bsdcpio packages
e246905 toaster.bbclass: Separate artifact dump from image file dump
4f481bc pax-utils: 1.0.5 -> 1.1.4
f9974f2 sqlite3: upgrade to version 3.10.0
cd7910d connman: upgrade to 1.31
b9169b7 python3: add missing dependency on PN-misc to PN-modules
4b4dea7 useradd-staticids.bbclass: Remove unnecessary spaces
4f2c352 useradd-staticids.bbclass: Read passwd/group files before parsing
4cbdb15 useradd-staticids.bbclass: Simplify the logic for when to add groups
b18e40c useradd-staticids.bbclass: Simplify some logic
b689aa0 useradd-staticids.bbclass: Make --no-user-group have effect
c03ea8d useradd-staticids.bbclass: Treat mutually exclusive options as such
af8b005 wic: get rid of 2 getters
2573e28 wic: get rid of set_size and set_source_file setters
5cd222b wic: get rid of get_rootfs and set_rootfs
4d5d5dd wic: get rid of get_timeout getter
26fb2a1 wic: adjust code for new data structure
c827238 wic: remove pykickstart code
c15ea82 wic: use new kickstart parser
f572f44 wic: add kickstart parser module
e5e1905 wic: add partition module
180f170 alsa-lib: 1.0.29 -> 1.1.0
a8c25af matchbox-keyboard: export GTK_IM_MODULE_FILE location
d75cb1f xf86-input-evdev: upgrade to 2.10.1
2283732 menu-cache: upgrade to 1.0.1
ec7e406 libxi: upgrade to 1.7.6
86f3f25 librsvg: upgrade to 2.40.13
72dd806 libgpg-error: upgrade to 1.21
3c02fe0 libevdev: upgrade to 1.4.6
33e9930 libcroco: upgrade to 0.6.11
5b63c44 gsettings-desktop-schemas: upgrade to 3.19.3
dfff167 gpgme: upgrade to 1.6.0
5abb691 u-boot: Update to 2016.01 release
e9280d1 linux-yocto: introduce v4.4 standard/preempt-rt/standard kernel
8c3276e e2fsprogs: 1.42.9 -> 1.43 (master)
b248e55 bitbake.conf: rename python-native-runtime
65d0bfc net-tools_1.60-26.bb: Fix do_patch dependency error
99923fc ncurses: 5.9 0 -> 6.0
44d283a autotools.bbclass: use relative path to run configure script
b2f1de3 glibc-initial.inc: use relative path to run configure
0fe6e2d bitbake: toaster: increase timeout
a5f34bc poky.ent: Added "perl-bignum" package for Fedora
afc6cba dev-manual: Updated "Running ptset" section
ec047ad yocto-project-qs: Updated the "Next Steps" section
57ddbe8 ref-manual: Removed all variables related to "QMAKE"
7814b33 ref-manual: Updates to cull out qt4 stuff.
bf81969 toaster-manual: Updates on how to start Toaster.
798e8b8 bitbake: toastergui: code formatting and clean-up
c4b5011 bitbake: toaster tests: fix Django tests for new ToasterTable pages
88a262c bitbake: toastergui: remove unused views and template code
059a274 bitbake: toastergui: fix error and warning counts for builds
4103e0c bitbake: toastergui: make "Apply" button state depend on filter range
6c2d88f bitbake: toastergui: mute label for filter actions with no records
f08730a bitbake: toastergui: set default visible and hideable columns
112f374 bitbake: toastergui: serialise decimals correctly
e024aab bitbake: toastergui: streamline construction of filter objects
fcb20f9 bitbake: toastergui: ensure filter_value updates
f9c46f5 bitbake: toastergui: don't hide all elements with .col class
eaae82a bitbake: toastergui: convert project builds page to ToasterTable
33b011c bitbake: toastergui: implement "today" and "yesterday" filters
f8d383d bitbake: toastergui: implement date range filters for builds
b929889 bitbake: toastergui: show recent builds on all builds page
1a4b203 bitbake: toastergui: switch off filter highlights when inactive
809046c bitbake: toastergui: refactor ToasterTable filtering
294579b bitbake: toastergui: convert all builds page to ToasterTable
6c12ca7 bitbake: toastergui: use event delegates for hover help elements
ef93dce bitbake: toastergui: switch projects/ view to ToasterTable
417f1d3 bitbake: toaster: check inferred file suffixes against list of known types
c02ee05 bitbake: toaster: move image file suffix list to model
d29e4cd bitbake: toastergui: use ToasterTable for projects page
b1256db openssh: update to 7.1p2
c0e9f2d kernel/kernel-arch: Explicitly mapping between i386/x86_64 and x86 for kernel ARCH
f8508de bitbake: Revert "fetch/git: Change to use clearer ssh url syntax for broken servers"
b567235 image/image-live: Add back IMAGE_TYPES_MASKED support
e914e2a image.bbclass: Handle image base type dependency properly
ad32f65 autoconf: add missing perl-module-file-find to RDEPENDS
d83dfe6 ca-certificates: update to 20160104
4440560 epiphany: upgrade to 3.18.3
dcf54b4 iso-codes: upgrade to 3.64
d7bee35 lighttpd: upgrade to 1.4.39
08c8923 libwebp: upgrade to 0.5.0
cf0aea7 classes/populate_sdk_ext: avoid unnecessary sstate being brought in
ea29bec insane/package: Fix cases where QA errors aren't fatal
2e620a4 classes/populate_sdk_ext: check that extensible SDK prepared correctly
4685c33 classes/buildhistory: save auto.conf and bblayers.conf for extensible SDK
39f6472 classes/populate_sdk_ext: support auto.conf
91877aa classes/populate_sdk_ext.bbclass: handle if local.conf doesn't end with a newline
764c927 util-linux: create util-linux-runuser iff pam in DISTRO_FEATURES
95dce70 rsync: 3.1.1 -> 3.1.2
38aa0fc less: 479 -> 481
4cb2269 iputils: s20121221 -> s20151218
fe47dd7 wget: 1.17 -> 1.17.1
79886e9 git: 2.5.0 -> 2.7.0
d3e16b8 file: 5.24 -> 5.25
3549abc autogen-native: 5.18.5 -> 5.18.6
fb14627 curl: upgrade to 7.46
eaf88d7 xz: upgrade to 5.2.2
8516ff7 sysstat: upgrade to 11.2.0
ae73be1 at: upgrade to 3.18
21efab7 kmod: upgrade to 22
c88efae resolvconf: upgrade to 1.78
6729889 pciutils: upgrade to 3.4.1
edd319c gnupg: 2.1.7 -> 2.1.10
78b58b8 help2man-native: 1.47.1 -> 1.47.3
ac0e0d5 man-pages: 4.02 -> 4.04
1e0cbb9 libgcrypt: 1.6.3 -> 1.6.4
372c23d xmlto: 0.0.26 -> 0.0.28
aaafe33 elfutils: 0.163 -> 0.164
38901a7 dhcp: 4.3.2 -> 4.3.3
ea05e05 image.bbclass: Unconditional includes of populate_sdk_ext fails
c08f272 tcmode-default.inc: Fix preferred provider nativesdk-sdk_prefix-libc-initial
5d2f783 dhcp: search libxml2 for bind
b69652d tzdata: remove bashism
7c7c249 harfbuzz: update 1.1.2 -> 1.1.3
84623dc libpostproc: duplicate armv7a over-rides for armv7ve
1744198 libav.inc: duplicate armv7a over-rides for armv7ve
102dfa1 gcc-configure-common.inc: duplicate armv7a over-ride for armv7ve
b08dfb5 subversion: Upgrade 1.9.2 -> 1.9.3
d6fae0c lttng-ust: Upgrade to 2.7.1
a9cc9b5 lttng-tools: Upgrade to 2.7.1
6b02575 lttng-modules: Upgrade to 2.7.1
a378430 gdb: upgrade to 7.10.1
92cc02f linux-yocto: Update Genericx86* BSPs to 4.1.15
da43a56 bitbake: Revert "fetch2/local.py: avoid using PREMIRROR"
96a34e7 conf/distro/poky-tiny: correctly disable python in opkg-utils
1724ffd bitbake: fetch2/git.py: Add missing "errno" module import.
74fa824 bitbake: bitbake: clean up stamp-base related codes
f3f769a local.conf.sample: add qemumips64
43328fe bitbake: runqueue: Fix setscene task dependencies
7b905ca bitbake: toaster: settings Add uid to the toaster cache dir
dff7a27 bitbake: toaster: show 'satisfied via' text for reverse deps
89f4932 bitbake: toaster: show 'satisfied via' text for build deps
febb898 bitbake: toaster: show list of provides for the recipe
2ff4ccb bitbake: buildinfohelper: add provides info to the db
16a81fb bitbake: toaster: add Provider model
6a28ed3 bitbake: buildinfohelper: use providermap
f2b7252 bitbake: cooker: add providermap to dep_tree
7e380d4 bitbake: taskdata: refactor get_providermap
46731da bitbake: main/runqueue: Add --setscene-only option to bitbake
34f8db9 update_font_cache: only scan system font directories
e5c011b Add "CVE:" tag to current patches in OE-core
f04fb88 scripts/create-pull-request: fix git request-pull syntax
928ceb6 qt4: fix-for-mips-n32.patch: remove it
c4a3258 util-linux: create util-linux-runuser package
554ca68 valgrind: include aarch64 in COMPATIBLE_HOST
0ce775a valgrind: update to 3.11.0
21a94f6 valgrind: don't restrict to armv7a
b8ebac9 DpkgRootfs: Fix logcheck_error false-positive when use multilib
e265fbb package_deb.bbclass: add 'Multi-Arch: foreign' tag to allarch packages
4aeb69d package_manager.py: fixes for multilib deb packaging builds
9ea7428 package_deb.bbclass, cross-canadian.bbclass: DPKG_ARCH mapping function
72e6932 connman.inc: add missing RDEPENDS
675ff42 meta: rename perl-native-runtime
3f4fb39 dbus: support large-file for stat64
0d5e41f freetype: enable out-of-tree builds, and use host zlib
8f2ab19 bluez5: upgrade to 5.37
11f5a42 cogl-1.0: fix may be used uninitialized error
235606f oeqa/runtime/logrotate: fix hardcoded root directory
cce6c3e oeqa/runtime/smart: fix hardcoded root directory
cd2cf1f boost: update to 1.60.0
afc0255 bitbake.conf: remove 'stamp-base'
c8fef7f gcc5: Fix build on NIOS2
eda3947 rpmresolve.c: Fix unfreed pointers that keep DB opened
3c8a451 tzdata: Make /etc/timezone optional
b80da02 systemd: arrange for volatile /etc/resolv.conf
5548a76 systemd: add myhostname to nsswitch.conf
d6bc841 opkg-utils: add update-alternatives PACKAGECONFIG
c3b96ff linux-dtb.inc: use absolute upd-alt paths
3ad08c0 uclibc: Upgrade to 1.0.10
74c3667 populate_sdk_ext: Pass excluded_targets as a list to prune_lockedsigs
e306d54 populate_sdk_ext: Change to include siginfo and non sstate task sigs
e1a558a populate_sdk: Switch from bzip2 to xz
3341f3f classes: Fix do_rootfs references
0a4e1f9 image: Create separate tasks for rootfs construction
fdced52 image: Move pre/post process commands to bbclass
cdc0aee image.bbclass: Separate out image generation into a new task, do_image
0269219 populate_sdk_ext: Use new --setscene-only option to bitbake instead of workarounds
1ee0842 sstatesig: Handle special case of gcc-source shared-workdir for printdiff
d93c212 bitbake.conf: add virtual/libiconv-native to ASSUME_PROVIDED
b2fe2a8 devtool: build: support using BBCLASSEXTENDed names
38ed039 devtool: reset: support recipes with BBCLASSEXTEND
532f429 devtool: refactor code for getting local recipe file
ec90168 devtool: add: support adding a native variant
99e3872 devtool: reset: do clean for multiple recipes at once with -a
5ef716c recipetool: create: support creating standalone native/nativesdk recipes
1e503c0 recipetool: create: lower case name when determining from filename
4deed25 devtool: sdk-update: add option to skip preparation step
d586a11 devtool: sdk-update: fix error checking
c1b7d83 devtool: sdk-update: fix metadata update step
efead10 devtool: sdk-update: fix not using updateserver config file option
9348c91 classes/populate_sdk_ext: disable signature warnings
d44dcd7 classes/populate_sdk_ext: fix cascading from preparation failure
d11051c scripts/oe-publish-sdk: add missing call to git update-server-info
fbc2147 libbsd: upgrade to 0.8.1
221d864 bitbake: fetch/git: Change to use clearer ssh url syntax for broken servers
46d62d0 bitbake: knotty: Use non-interactive mode as fallback for dumb terminals
bfa7859 bitbake: cooker: fix findFilesMatchingInDir documentation
3d42737 bitbake: cooker: use in instead of count
0e83229 maintainers.inc: remove x11vnc
d914c7f meta-yocto: drop qt4 references
0f3ad7c scripts/yocto-layer: Avoids duplication of "meta-" prefix
220ef32 poky-lsb/poky-tiny: update preferred kernel to 4.1
b82e228 yocto-bsp: remove 3.14 and 3.19 bbappends
685daeb conf/local.conf.sample: comment out ASSUME_PROVIDED=libsdl-native
2c5e7e0 image: Really remove lockfiles flag
a500e3a boost: ensure boost to remain an empty metapackage
b151506 image_types.bbclass: Rebuild when WICVARS change
eb4159c gccmakedep: fix buildpaths qa check
f54e53c bash: fix buildpaths qa check error
6d111c8 testimage: remove VNC test, x11vnc isn't in oe-core anymore
8bec5c5 x11vnc: remove all references to moved package
8f865e2 x11vnc: move recipe to meta-oe
ae1fc96 classes/buildhistory: actually use KiB in extensible SDK sizes files
84f66b5 x11vnc: move recipe to meta-oe
c44599d readline: move inputrc into readline
f29d642 tune-*: use mcpu instead of mtune for ARM tunes
c6a1991 arch-armv7ve: add tune include for armv7ve and use it from cortexa7 and cortexa15
21d61fa cortexa{7,15,17}: add VFPv4 tunes
7f2cb68 feature-arm-vfp.inc: Further simplify with TUNE_CCARGS_MFLOAT
e9b2ffc feature-arm-{neon,vfp}.inc: refactor and fix issues
45f726c arch-armv7a.inc: add vfpv4 support also to softfp and big endiand tunes
ebe8358 arch-armv7a.inc: Fix PACKAGE_EXTRA_ARCHS for tune-armv7atb-vfpv3, tune-armv7atb-vfpv3d16, cortexa7thf-neon-vfpv4
9280a8e arch-armv5.inc: drop duplicate ARMPKGSFX_DSP and PACKAGE_EXTRA_ARCHS_tune-armv5tehf-vfp
46d6b0e arch-armv[456]*.inc: improve indentation like armv7a
860663a arm/arch-arm*, tune-cortexa*, tune-thunderx.inc, powerpac/arch-powerpc64.inc: Use normal assignment
8c483a1 arch-armv7a, tune-cortexa*: improve indentation
7498b91 arch-armv7a, tune-cortexa*: improve comment VFP -> HF
bb9b581 arch-armv7a: add missing space before ?=
15f8344 tune-cortexr4.inc: fix PACKAGE_EXTRA_ARCHS
e2736f7 sanity.bbclass: add more information to error message about TUNE_PKGARCH missing in PACKAGE_ARCHS
b68d947 mkefidisk.sh: add boot log on console
62d7c97 mkefidisk.sh: add startup script for automated boot
5aa3b93 oeqa/selftest/recipetool: update for libjpeg-turbo migration
ffa7469 libjpeg: Replace libjpeg with libjpeg-turbo
29d273f python3: fix installed-vs-shipped when 64bit + multilib
db7cee6 pulseaudio: add PACKAGECONFIG for lirc
b900ec8 sstate-sysroot-cruft.sh: Extend the whitelist
20843fa iptables: upgrade to 1.6.0
c2bda6c scripts/oe-selftest: Allow to run tests on random/all MACHINEs
8e1435e selftest: Added testcase decorators for 2 tests
32f332c oe-selftest: New option --list-tests
17d886b oe-selftest: Improved --list-classes when determining test names
4ec2da7 selftest: moved tc test_buildhistory_does_not_change_signatures
02d259c scripts/oe-selftest: Remove extra coverage data added to unittests
30c06a4 expat: CVE-2015-1283
315bdc8 packagegroup-core-x11-sato: enable pcmanfm on mips
a3e26f9 wic: rawcopy: Copy source file to build folder
d6e0da4 grub2: Fix CVE-2015-8370
bb663b0 systemd: enable compatibility libraries by default
3fea163 systemd: add more compression and importd PACKAGECONFIGs
d462b70 gcc-sanitizers: link directly against sysroot libstc++
3eb6135 openjade: Fix build if not installing libtool .la files
6308c47 valgrind: Define __UCLIBC__ for uclibc based systems
3d19a1e security_flags.inc: disable -fstack-protector-XXX for valgrind
807ed8a meta/conf/layer.conf: bump layer version due to Qt4 removal
4fb3e05 packagegroup-core-lsb: treat qt4 packages same as qt3 packages
8b11ed8 qt4: remove recipes and classes
0baadc8 toaster-manual: Updates to toaster use chapter.
908bbff ref-manual: Updated the list of supported image types.
5d27451 dev-manual: Added the --configfile bootloader option.
7b3b1f9 dev-manual: Added three new wic option descriptions.
eeffa64 dev-manual: Added the --overhead-factor wic option description.
2beb19b dev-manual: Added the --extra-space wic option description.
95851df dev-manual: Added wic --notable option description.
88a2794 dev-manual:
8bdc707 sdk-manual: Initial Manual framework
f1f7625 bsp-guide: Updated the license statement.
6686a31 dev-manual: Correction to the KVM stuff in the runqemu commands.
ccc830d documentation: Prepare for 2.1 builds
7af9314 mega-manual: Added four new figures for GUI example.
f8185ff bitbake: ast: Add filename/lineno to mapped functions
a178c5a bitbake: main: kill server without queue setup
773700d bitbake: xmplrpc: split connect method
05b4fbc bitbake: uievent: refactor retry loop
ebc169c bitbake: uievent: get rid of EventHandler attribute
4e0de6e bitbake: uievent: add error to registerEventHandler return
01419d5 bitbake: cooker: add state.get_name method
763506d bitbake: fetch2/__init__.py: Add support for 7-Zip
f5bfc1c bitbake: utils: Remove double compile from better_compile
b4141f6 bitbake: fetch2/local.py: avoid using PREMIRROR
1ad3595 bitbake: siggen: Change exception note into a warning
4ba49ac bitbake: data: Drop misleading ExpansionError exception
2c94311 bitbake: cooker: Drop useless parsing exception
a16b543 bitbake: data: Pass lineno/filename data from build_dependencies
958f0ff bitbake: codeparser: Add support for correct linenumbers
db4376e udev-extraconf: introduce multiple blacklist files for more complex setups
a8fb429 uclibc: disable parallel builds
401c632 image: Condense do_rootfs function/flags
0051510 image/rootfs-postcommands: Separate out post rootfs commands to separate class
3428edd image: Remove pointless rootfs lock
eb5bb0e packagegroup-core-boot:replace busybox to variable
cc7bb6c initramfs-framework_1.0:replace busybox for variable.
d9ffa59 core-image-minimal-initramfs: replace base-utils
9349f42 base-utils:flexible dependency for command utilities
c44b76a orc: Add missing PACKAGES_DYNAMIC
2cd061a bluez5: include the patch only for 5.36
4c35473 meta-yocto-bsp: remove 3.14 and 3.19 bbappends
6af8981 meta-yocto-bsp: Remove uvesafb (v86d) from generic x86 features
614e9ec qemu: add PACKAGECONFIG for Nettle crypto support
09705a4 oeqa/selftest: support sets in devtool comparisons
4b543f7 packagegroup-core-x11-sato: include pulseaudio-misc
23302ee devtool: use cp instead of shutil.copytree
d6e7b5b xorg-lib: allow native building without x11 DISTRO_FEATURES
4cba706 busybox: generalize recipe to work with arbitrary install directories
9d001ae cairo: update 1.14.4 -> 1.14.6
6d561fb libdrm: Upgrade to 2.4.65
0f516f0 image-vm.bbclass: uses IMAGE_LINK_NAME
c851096 image-live.bbclass: uses IMAGE_LINK_NAME
907b87d rpm: Generate per distribution and multilib macro files
c910789 package_manager.py: add debugging support for rpm scriptlet execution
8dd27ef xinput-calibrator: get screen geometry when calibrating
e8d36f4 scripts: hand the TEMPLATECONF local over to setup-builddir
0f4fb26 util-linux: Fix floating dependency upon 'readline'
2cb434a linux-firmware: package Broadcom BCM43340 firmware
f70d46f rpcbind: Fix build with libtirpc 1.0.1
866c693 libtirpc: upgrade to 1.0.1
5754b83 gstreamer1.0-libav: upgrade to version 1.6.2
6ac601f gstreamer1.0-rtsp-server: upgrade to version 1.6.2
3ac3d33 gstreamer1.0-plugins-ugly: upgrade to version 1.6.2
823b623 gstreamer1.0-plugins-bad: upgrade to version 1.6.2
6d13f30 gstreamer1.0-plugins-good: upgrade to version 1.6.2
05896a5 gstreamer1.0-plugins-base: upgrade to version 1.6.2
a8eb77b gstreamer1.0: upgrade to version 1.6.2
dd5756b mirrors: add archive.apache.org to Apache mirrors
cfbd804 guile: remove redundant replacement of .pc file
c2e8079 bind: 9.10.2-P4 -> 9.10.3-P2
7204a0f libsndfile1: enable FLAC/Ogg/Vorbis support
35bd254 buildhistory: improve support for extensible SDK
ea0abcd buildhistory: fix not recording SDK information
b6d191d scripts/oe-selftest: Add support for selftest log with timestamp
ab79287 selftest: Added MACHINE = "qemux86" to tests that use runqemu
b09080d ncurses: fixes wrong paths in BINCONFIG
8df88fb xcb: don't build-depend on python-native
d7759a5 tcmode-default: Use glibc for nativesdk version even on uclibc and musl
a7eadc3 qemu: upgrade to 2.5.0
9988ab3 webkitgtk: update to 2.10.4
cedb027 epiphany: update to 3.18.2
6e27dd8 libwebp: update to 0.4.4
efcf4b4 libsecret: update to 0.18.3
0112274 gnome-desktop3: update to 3.18.2
88a656e gcr: update to 3.18.0
883193a linux-yocto: remove 3.14 and 3.19 recipes
4487e3a kernel-yocto: fix checkout bare-cloned kernel repositories
5161944 linux-yocto/4.1: update to v4.1.15
a462d16 linux-yocto-dev: bump to 4.4-rcX
862b3b3 lttng-modules: fix build issue against kernel 4.4
9563aa8 yaffs2: fix checkpoint functionality
cefc24d mobile-broadband-provider-info: update to tagged release 20151214
04aa27c icu: fix upstream version check
2865e5f btrfs-tools: update to 4.3.1
5beb3bc iso-codes: update to 3.63
503c08d kexec-tools: update to 2.0.11
4fa2e4b lighttpd: update to 1.4.38
f7a7796 tiff: update to 4.0.6
2498065 libassuan: update to 2.4.2
f2192fa msmtp: update to 1.6.3
7fc3066 liburcu: update to 0.9.1
10d14bc trace-cmd: update to 2.6
fc774e9 python3-pip: update to 7.1.2
c3330aa pytnon-pexpect: update to 4.0.1
aa90b5d ifupdown: update to 0.8.2
4c98105 gptfdisk: update to 1.0.1
edde9af cryptodev: update to 1.8
9da9308 oe-selftest: devtool: add more explicit check for ls output
c2435b1 oe-selftest: add tests for simple devtool add / recipetool create URL case
8916731 recipetool: create: fix error when extracting source to a specified directory
fe28c25 recipetool: create: improve autotools support
498e483 devtool: sync: tweak help / messages
b272c51 devtool: reset: print message about leaving source tree behind
95a234e devtool: status: list recipe file within workspace if one exists
e116739 devtool: modify: default source tree path
110f433 devtool: add: allow specifying URL as positional argument
ceaa4bf devtool: add: figure out recipe name from recipetool
ee0d5a1 devtool: add: allow source tree to be omitted
0d8751f scripts/lib/argparse_oe: handle intermixing of optional positional arguments
1bd7793 devtool: update-recipe: use correct method to get bbappend filename
2074654 devtool: split out function for naming bbappend
6acbdc9 devtool: add: tweak help text
316b57b devtool: edit-recipe: add new subcommand
ebe5f0b recipetool: create: basic extraction of name/version from filename
db5f964 recipetool: create: support extracting name and version from build scripts
6a7661b recipetool: create: set up priority system for recipe handlers
38803e3 recipetool: create: detect when specified URL returns a web page
e78a039 recipetool: create: prevent attempting to unpack entire DL_DIR
e61645b recipetool: create: minor fix for potential issue in python handling
ae2141b recipetool: create: fix do_install handling for makefile-only software
c2f1742 recipetool: create: avoid traceback on fetch error
470f20b recipetool: create: handle https://....git URLs
8e0a84c scripts: print usage in argparse-using scripts when a command-line error occurs
548d433 directfb.inc: enable bfd linker workaround for all arm targets
2381f4a devtool: sdk-update: fix traceback without update server set
7540550 classes/populate_sdk_ext: error out of install if buildtools install fails
ecce3d3 classes/populate_sdk_ext: hide build configuration in devtool build* output
fd84d0f classes/base: don't print header if BUILDCFG_HEADER not set
a4f496a classes/populate_sdk_ext: use uninative to set NATIVELSBSTRING
a6f8a3f toaster.bbclass: fix TypeError when parsing build stats
937b7fd libxcb: Add a workaround for gcc5 bug on mips
86c8b8b flex: update to 2.6.0
dad130b opkg: upgrade to v0.3.1
d2b770c systemd: remove merge conflicts accidently left in
ca69643 wic/help.py: document that mountpoint is optional for part command
5628dde pixman: check neon support via TUNE_FEATURES, not the _armv7a over-ride
9a74388 xdg-utils: Do not build the in-script documentation
520b37d gettext: Upgrade 0.19.4 -> 0.19.6
cae0e0f gcc-configure-common.inc: add gcc-runtime ABI fixes for armv7m and armv7r
cba8fb3 tune-cortexr4.inc: provide an _armv7r over-ride via MACHINEOVERRIDES
fd10723 tune-cortexm3.inc: provide an _armv7m over-ride via MACHINEOVERRIDES
b6fe440 feature-arm-thumb.inc: drop 'no-thumb-interwork' tuning feature
1d5a4cf feature-arm-thumb.inc: drop legacy _thumb and _thumb-interwork over-rides
ca64c16 feature-arm-thumb.inc: drop ARM -vs- thumb comments
95a79a5 rpm: Fix support for db5 and db6
75cec07 oe-buildenv-internal: fix return code
606c9e7 staging.bbclass: make already-stripped can be skipped
647e0e4 buildhistory-collect-srcrevs: hide empty sections
d4b5a1f selftest/buildhistory.py: Test buildhistory does not change sigs
4b83f1f gcc5: Upgrade gcc-5.2 -> gcc-5.3
0381b78 bitbake: event/utils/methodpool: Add a cache of compiled code objects
c61c1eb bitbake: BBHandler: Improve IN_PYTHON_EOF handling
2a94194 bitbake.conf: Add filename and lineno to BB_SIGNATURE_EXCLUDE_FLAGS
5f40691 bitbake: toaster: remove 2 confusing parameters
3960b6e bitbake: toaster: move setting of default values
b194c0c bitbake: toaster: move startup checks to a better place
064d2c7 bitbake: toaster: remove 2 unused functions
c505f24 bitbake: toaster: remove addtoConfiguration function
c7e4404 bitbake: toaster: updated header of the toaster script
af34920 bitbake: toaster: add MANAGE variable
563b786 bitbake: toaster: remove unused variable
aa3cc12 bitbake: toaster: split long lines, add/remove whitespace
8e4acac bitbake: toaster: check if address:port is in use
847b935 bitbake: toaster: implement checksocket command
9f3681d buildstats-summary/toaster: Cope with removal of get_bn()
522dcaa bitbake: knotty: Improve exception error message
01d67bf bitbake: knotty: Fix row/column function return value issue
6c12efa bitbake: buildinfohelper: Update for buildstats layout change
28ea1a1 bitbake: fetch: use orig localpath when calling orig method
5cb6d83 bitbake: utils: Improve traceback from better_exec internal errors
0019edc bitbake: ast/event/utils: Improve tracebacks to include file and line numbers more correctly
b14ccb2 bitbake: runqueue: Add support for <task>- syntax
5069ab6 m4: Drop unused/unreferenced patch
d7e766b toaster: Update for buildstats changes
adfdca4 buildstats: Improve to add getrusage data and corrected IO stats
3187647 buildstats: Separate out the build and task data to allow improvements
38a2553 buildstats: Clean up e.data and bb.data references
7b1e48f buildstats: Drop get_bn/set_pn and just use BUILDNAME
7837162 buildstats: Drop disk data from buildstats
030c033 nativesdk-buildtools-perl-dummy: Bump PR
e6f2761 combo-layer: Stop using filterdiff
f1f3716 meta: more removals of redunant FILES_${PN}-dbg
5fb8fea clutter-gst-3.0: add dependency on libgudev
54f01ca systemd: Upgrade to 228
63bdadc uclibc: Switch to using uclibc-ng
0b5cddd cdrtools-native: update to 3.01 final
c4dfb92 grep: update to 2.22
d8608bc procps: update to 3.3.11
52f6a01 babeltrace: update to 1.3.1
0c705d6 powertop: update to 2.8
516d8c9 nfs-utils: update to 1.3.3
9c39a4f systemtap: update to 2.9
fef0ec6 kbd: update to 2.0.3
8668e17 gmp: update to 6.1.0
86e02d0 docbook-xsl-stylesheets: fix UPSTREAM_CHECK_REGEX
f065766 mtd-utils: update to 1.5.2
5d32aeb unfs3: update to r497
4e653b5 python-numpy: update to 1.10.1
90b7212 libxml-simple-perl: update to 2.22
689db13 dmidecode: update to 3.0
d301451 cpio: update to 2.12
2bea006 puzzles: update to current commit
2d04c83 gnutls: update to 3.4.7
cf1eb2b libidn: add native and nativesdk support
dd58b3b libpng: Update SRC_URI to use GENTOO_MIRROR
b763668 libpng12: Upgrade 1.2.54 -> 1.2.55
91c92fc libical: Upgrade 1.0.0 -> 1.0.1
5c6ff26 libxslt: use proper SRC_URI
a444eb5 kexec-tools: added the script kdump
be9f7f9 ltp: Upgrade 20150420 -> 20150903
81f1e41 musl: Update to latest 1.1.12 release
c529e66 util-linux: Upgrade to 2.27.1
bdbc5ee packagegroup-core-sdk: Disable sanitizers for uclibc
692853d libsolv: add new recipe
8bba7de curl: upgrade to 7.45
2e3a172 libsndfile1: 1.0.25 -> 1.0.26
df18352 wget: Upgrade 1.16.3 -> 1.17
81eb101 unifdef: upgrade to 2.11
19c76ad sstate-sysroot-cruft: Add php, python, lua, fontcache generated files to whitelist
f80f8ba oeqa/selftest: Added testcase decorators for 2 testcases
a5dd1dd uninative.bbclass: Choose the correct loader based on BUILD_ARCH
388e580 license: Fix BB_TASKDEPDATA references
f19e8de coreutils/procps: Revert priority change since coreutils > busybox
455ff32 meta: more removals of redunant FILES_${PN}-dbg
e0890b6 meta: Drop now pointless manual -dbg packaging
b7766e4 package: Add auto package splitting of .debug files
89f13c7 meta/conf/toasterconf.json: remove SDKMACHINE variable as it no longer used
03d715e bitbake: toaster: tables Set a default order for the software recipes table
4ff0d60 bitbake: toaster: rework checking of Django version
4a78416 bitbake: toaster: monkey patch Queryset
c1c8eff bitbake: toaster: removed extra calls of migrate
507aafb bitbake: toaster: work around 'database is locked' error
322b470 bitbake: toaster: fixed format strings
84daa40 bitbake: toaster: use OneToOneField instead of ForeignKey
c464f34 bitbake: toaster: Amend regex for MySQL database URLs
f001a4a bitbake: toaster: Remove compatible_layerversions() method
0adffdf bitbake: toaster: Check Django version against toaster-requirements.txt
8d058cf bitbake: toaster: Update deprecated manage.py command
717c636 bitbake: toaster: Prevent deprecation warnings for RedirectView
0f602c1 bitbake: toaster: Update API used to make runbuilds methods run in transactions
93f5738 bitbake: toaster: rename get_query_set -> get_queryset
23c4806 bitbake: toaster: Start Django machinery for database access
7a0c45e bitbake: toaster: Create default project with get_or_create* method
9de8dfa bitbake: toaster: Fix references to app paths
535fc9b bitbake: toaster: Remove South migrations
8ca4664 bitbake: toaster: Upgrade to Django 1.8.6 and remove South
b322dec bitbake: toasterui: process SetBRBE event
0274b68 bitbake: toaster: trigger SetBRBE event
fdb8e74 bitbake: toaster: implement BitbakeController.triggerEvent
5de3800 bitbake: event: Fix subprocess event error traceback failures
0da1d71 nopackages: Add class for recipes which don't generate packages
5003d14 sstate: Ensure populate_lic dependencies are not followed
48aad51 populate_sdk_ext/sign_rpm/sign_package_feed: Add missing getVar parameter
98dcdcb autoconf: Disable macro which causes excessive delays when using dash as sh
28fa304 automake: Remove delays in configure scripts using automake
f5e681d site/common-linux: Add some macros to avoid sleeps during configure
93adf46 meta-yocto/conf/toasterconf.json: remove SDKMACHINE variable as it no longer used
b3d6872 lttng-tools: Revert wrong enforcement of Python 3.0 use
2c11bdd attr: Add patch to account for use of internal glibc header
f1c034b libpam: Fix build with musl
33bab59 openssl: Add musl configuration support
c4207ee busybox: Add config for musl
083d9d1 gettext: Delete libintl.h and charset.alias
3a0797f sysvinit: Fix build with musl
fd21402 musl: Add recipe
781d34f mtools: Use proper glibc override to add glibc packages to recommendations
1b90d67 squashfs-tools: Define FNM_EXTMATCH if not defined
36a709a mtd-utils: Backport and create patches to support musl
41fd73f gdb: Fix build with musl
1ee97d8 autoconf: Add musl support
a2ea58b gcc: Add support for building musl configuration
37c74e2 gstreamer1.0: Split bash completion information into separate package
fc32a3b attr: add attr dependency to attr-ptest
9205f0a valgrind: import Debian link_tool patch for MIPS
c27bbb4 slang: update upstream URI to (official) jedsoft.org
21e35df subversion: update to 1.9.2
39260c3 json-c: add manual upstream version check
4ff0017 mirrors: replace references to archive.apache.org
1672a18 mobile-broadband-provider-info: update to current commit
b699b15 nspr: update to 4.11
dec8d20 python-setuptools: update to 18.7.1
b3535e2 openssl: update to 1.0.2e
fce2ee7 dropbear.inc: drop legacy CFLAGS and LD tweaks
f87063b dropbear: update 2015.70 -> 2015.71
a520495 texinfo: don't create dependency on INHERIT variable
2b2774b sudo: upgrade to 1.8.15
5eb0e90 linux-firmware: update to latest revision bbe4917
c147782 bluez5: upgrade to 5.36
64c3a09 sudo: remove libdir INSANE_SKIP
b407a80 libsdl: expand PACKAGECONFIG and enable native builds
39facf9 buildtools-tarball.bb: 32bit tools need pseudo 32bit library
bc26a7d rpm: fix file conflicts for MIPS64 N32
01c0285 rpm: Enable MIPS64 N32 transactions
a742586 bash: fix testcase run-coproc/run-execscript/run-test/run-heredoc failed
a6bb872 cpio: fix test case of symlink-bad-length
787d82b linux-libc-headers: update default KORG_ARCHIVE_COMPRESSION bz2 -> xz
94c0332 linux-libc-headers.inc: remove '-e MAKEFLAGS=' from EXTRA_OEMAKE
c7ad779 gcc-4.9: import patch fixing compilation in thumb mode
1260ded gcc-5.2: import patch fixing compilation in thumb mode
b4db53a dropbear: Upgrade 2015.68 -> 2015.70
e0162c1 gcc-cross-initial: make dependency on gnu-config-native and autoconf-native explicit
fccb128 weston-init: add a native systemd unit file
a1fa8d9 python: Fix cross compiling issue
c9fdc1b icu: Upgrade 55.1 -> 56.1
95909bc kernel.bbclass: drop unnecessary 'eval' from kernel_do_configure()
ec79a19 insane: in libdir test allow libraries in libexecdir
9c0186f rootfs.py: Change logic to unistall packages
23083e7 oeqa/systemd: get runtest target boot time and log
c6330a2 oeqa/systemd: journalctl helper function
220a78b scripts: oe-selftest Added new features.
98d2485 oe-buildenv-internal: preserve existing BB_ENV_EXTRAWHITE
9cab798 toolchain-shar-extract.sh: fix ~ not working in path
f27401d nativesdk-buildtools-perl-dummy: properly set PACKAGE_ARCH
5e3e2e0 poky.conf: Bump for 2.1 development
7e8ff7b bitbake: toaster: toasterui Add ParseStarted/ParseProgress events to mask
f823601 build-appliance-image: Update to master head revision
992e577 linux-yocto: Update genericx86* BSPs to v4.1.13
b4f6950 cmake: Add nios2 support
27b9f04 boost: adjust hard-coded path after python3 upgrade
639cadd sdk.py / OpkgSdk: remove_packaging_data() after install
fd4894f devtool: extract: update SRCTREECOVEREDTASKS for kernel
34f1d81 devtool: extract: copy kernel config to srctree
6650357 lib/oe/package_manager: Introducing PACKAGE_FEED_BASE_PATHS/PACKAGE_FEED_ARCHS
d7baeb5 selftest/wic.py: Add test for custom bootloader config
8612f26 directdisk-bootloader-config.wks: Add example for custom bootloader config
c59dc3b wic/help.py: Document the new option "configfile"
7033873 wic: Allow to use a custom config for bootloaders
f95f729 wic/utils/misc.py: Added function to search for files in canned-wks
9773faa wic: Prepare wicboot to allow custom bootloader config
4515186 package_ipk: allow to specify OPKG_ARGS in local.conf
7cf7156 systemd.bbclass: Allow enabling of parameterised services
551cda0 base: check for existing prefix when expanding names in PACKAGECONFIG
c093fd8 linux-yocto/4.1: Fix kernel oops on qemuarm boot
cda3905 toolchain-shar-extract.sh: ensure cleaned environment will work for ext SDK
f9384b0 bitbake: knotty: Enforce terminal line limit to stop crazy scrolling
7a775a1 initramfs-framework: create directory /var/run
2861399 libpcre: drop UPSTREAM_CHECK_ variables
35c28e3 libpcre: upgrade to 8.38
d50ef65 libpng: update 1.6.19 -> 1.6.20 (CVE-2015-8126)
2b736f2 ghostscript: add dependency for pnglibconf.h
976f0e3 package_regex.inc: split the rest of the entries to their recipes
74bfa62 package_regex.inc: split entries which blacklist specific versions to their recipes
75c6929 package_regex.inc: split sourceforge related entries to their own recipes
cefeac2 package_regex.inc: split PyPi related entries to their own recipes
aa5df2a package_regex.inc: split Debian-related entries into their own recipes
12ba5cc package_regex.inc: split GITTAGREGEX entries into recipe files
642e92f package_regex.inc: split entries with odd-even versioning into their own recipes
96eac69 package_regex.inc: deprecate the file
b0bbea5 gstreamer: really fix the helper install race
b822216 neard: fix libdir/libexecdir confusion
cbfccc6 glibc: fix libdir/libexecdir path confusion
d0577f9 sudo: handle libexecdir != libdir/PN.
6f837cc util-linux: Add ptest
dbd02bd libav: Correctly handle prefix=""
fda9859 libav: Add PACKAGECONFIG options: avdevice, avfilter, avplay, gpl
7ba85f1 libav: Remove deprecated --disable-avserver
2739ed0 busybox: backport upstream fixes for unzip
6decbbb qt4-4.8.7: fix build for mips n32
f1e8938 gstreamer1.0: Convert tests and valgrind config opts to PACKAGECONFIGs
11b9524 cracklib: fix for base_libdir == libdir
d9f73ca libbsd: Upgrade to 0.8.0
10d6dc4 libcroco: Upgrade 0.6.8 -> 0.6.9
79b823a shared-mime-info: Upgrade 1.4 -> 1.5
f6ec8a4 xdg-utils: Upgrade to 1.1.1
a3f63f9 gsettings-desktop-schemas: Upgrade 2.16.1 -> 3.18.1
754f6b6 gnome-common: Upgrade 3.14.0 -> 3.18.0
75aba18 clutter-gtk-1.0: Upgrade 1.6.2 -> 1.6.6
c6a6212 clutter-gst-3.0: Upgrade 3.0.8 -> 3.0.14
2da6cd5 clutter-1.0: Upgrade 1.24.2
148c953 cogl-1.0: Upgrade 1.20.0 -> 1.22.0
f54d4e4 ghostscript: Add NIOS2 support
21ba42b harfbuzz: update 1.1.0 -> 1.1.2
058b91e xvideo-tests: move to the latest release
70d459c scripts/oe-pkgdata-util: sort the packages in list-pkg-files
80e3919 wic: insert local Python paths at front
9d788d7 toolchain-scripts.bbclass: unset command_not_found_handle
82ab99f waf.bbclass: remove unused parameter from get_waf_parallel_make()
68d3dfe toolchain-shar-extract.sh: proper fix for additional env setup scripts
0c5d239 base: Improve handling of switching virtual/x providers
3745479 bitbake: bitbake: rename REGEX, REGEX_URI, and GITTAGREGEX.
dd282d4 bitbake: toaster: return back 'New project' button
2a8e970 bitbake: toaster: tests Update UI tests to work with 2.0 changes
fe8a0a3 bitbake: toaster: tests Automated build-mode backend tests
0497b57 bitbake: toaster: unset environment variables
8b7a548 bitbake: toaster: get rid of complicated heuristics
556b8b6 bitbake: toaster: remove SDKMACHINE from project variables
4186f5b bitbake: toaster: stop using toaster-pre.conf
361faa3 bitbake: toaster: remove writeConfFile API
fcbba5a bitbake: toaster: set varibales on bitbake server
993bc7e bitbake: toaster: implement BitbakeController.getVariable
53e981e bitbake: toaster: buildinfohelper Broaden the toaster created recipe data case
57e5f24 bitbake: toaster: do not create duplicate HelpText objects
4c1e5ec bitbake: toaster: remove usage of BUILD_MODE variable
9902895 bitbake: toaster: do not terminate bb server
58765a8 bitbake: toaster: remove stopBBServer API
95a3cf7 bitbake: toaster: reimplemented startBBServer method
76d53b5 bitbake: toaster: remove _setupBE function
87b2f95 bitbake: toaster: implement 'toaster restart-bitbake'
891484a bitbake: toaster: implement start_bitbake function
bf25471 bitbake: toaster: implement stop_bitbake function
7c2b225 bitbake: toaster: update brbe and project attributes
de812d0 bitbake: toaster: start 'manage.py runbuilds' in the script
28e8ccf bitbake: toaster: make runbuilds to loop
a3871a3 bitbake: toaster: use parent of the build dir
2a96d35 bitbake: toaster: check for toaster configuration later
d87a534 bitbake: toaster: remove unused variable
dc6a489 bitbake: toaster: change toasterconf.json logic to use TEMPLATECONF, like oe-setup-builddir
5a42c2d bitbake: toaster: run bitbake the same way
cac91db bitbake: toaster: set DATABASE_URL in toaster script
a464bf2 bitbake: toaster: implement get-dburl command
e473151 bitbake: toaster: don't allow to run toaster as a script
4de214f bitbake: lib/bb/utils: improve edit_bblayers_conf() handling of bblayers.conf formatting
0debb11 bitbake: lib/bb/utils: fix error in edit_metadata() when deleting first line
9d19dd9 bitbake: wget.py: parse only <a> tags
71ede7b bitbake: toaster: toastergui tests Add generic test for ToasterTables widget
34b22cf bitbake: toaster: tables Fix invalid field name on NewCustomImagesTable
1c59846 bitbake: toaster: tables Add default_orderby field where it was missing or unset
d82c541 bitbake: toaster: CustomImageRecipe add search_allowed_fields to this model
bdf6241 bitbake: toaster: machines table Fix missing layers information needed for filter
b90a8dc bitbake: toaster: tablejs Make sure click handlers consume click event
c075bcf bitbake: toaster: projectpage Make sure build targets are space separated
698c74c libsdl: remove redundant configure_tweak patch
35945fd iw: upgrade to version 4.3
15969ae gstreamer1.0-plugins-good: fix PACKAGECONFIG for gudev and add one for v4l2 and libv4l2
e601b38 gstreamer1.0-plugins-bad: fix dependencies for uvch264 PACKAGECONFIG
ddf2501 gudev: Add from meta-oe
e406fa8 lsb: fix installed-vs-shipped for mips
39ecdce rpm: fix for N32 MIPS64
09b4da6 glibc/0029-fix-getmnt-empty-lines.patch: fix getmntent()
1781a9a init-install-efi: fix script for eMMC installation
f808747 init-install-efi: fix script for gummiboot loader
2a55036 linux-firmware: rtl8192cx: Add latest available firmware
b60af3b libsdl2: add missing dependency on libxkbcommon for PACKAGECONFIG[wayland]
ed31874 libxml2: upgrade to 2.9.3
ecb1c71 libxml2: merge pointless bb/inc split
19a626d openssh: redesign ssh-agent.sh regression test case
81b59e7 gcr: Require x11 DISTRO_FEATURE
934e486 psplash: update to latest git version
ccb2a57 sysvinit-inittab: Add wrapper script to verify console exists
b7f610d linux-yocto/4.1: Bluetooth:Fix the connection fail of 6lowpan over BT LE
d08e761 linux-yocto-rt/4.1: update to -rt15
6aa464c linux-yocto/4.1: fsl-mpc8315e-rdb: Enable EEPROM
bd29006 linux-yocto/4.1: update to v4.1.13
5561407 uClibc: enable utmp for shadow compatibility
533fc01 glibc: Backported a patch to fix glibc's bug(18589)
598e372 ncurses: update SRC_URI
51b64ee openssl: enable parallel make
88e45cd busybox: enable resize applet
87de4a1 busybox: disable support for mounting NFS file systems on Linux < 2.6.23
73cc839 busybox: update 1.23.2 -> 1.24.1
f8ac408 busybox: re-order defconfig to align with busybox 1.24.1
3648a37 busybox.inc: remove '-e MAKEFLAGS=' from EXTRA_OEMAKE
bf28ea9 busybox.inc: set CC=${CC} via make command line
f21dce1 busybox.inc: fix CONFIG_EXTRA_CFLAGS configmangle
6167669 busybox.inc: don't set .config CROSS_COMPILER_PREFIX
e1ecccd busybox: move EXTRA_OEMAKE etc into busybox.inc
0e63300 busybox.inc: don't export EXTRA_OEMAKE
3735776 busybox_git: Enable getopt applet
b1774f4 harfbuzz: update 1.0.6 -> 1.1.0
31f803a sqlite3: update 3.9.0 -> 3.9.2
7e3474c readline: apply missing upstream patches
99b9d52 readline: prepare for readline6.3 upstream patches
e0b6d0c dbus: merge .bb and .inc
d99958a pulseaudio: Fix HDMI profile selection
2ba954f initscripts: hide the error in case system is not writeable
4ed84ff nativesdk-buildtools-perl-dummy: fix rebuilding when SDKMACHINE changes
b8fdd09 xf86-video-vmware: Add vmwgfx PACKAGECONFIG option
dfd5c4d pkgconfig: merge .bb and .inc
61c6887 pkgconfig: upgrade to version 0.29
744e89f ofono: upgrade to version 1.17
996f843 libxml2: remove legacy LDFLAGS += "-ldl" workaround
dedabc1 apr: fix LTFLAGS to make it work with ccache
9470956 iproute2: install bridge tool by default
1b8f6a2 lttng-tools: add libgcc to RDEPENDS
22dd6e7 lttng-tools: Upgrade to 2.7 release
ef73f21 lttng-tools: Drop unused patch
c375976 lttng-ust: Upgrade to 2.7 release
f5c1b57 lttng-modules: Upgrade to 2.7 release
8d708a5 libunistring: upgrade to version 0.9.6
f840e59 libtasn1: upgrade to 4.7
012ca02 wpa-supplicant: upgrade to 2.5
872e153 mesa: Make gl libraries RRECOMMEND mesa-megadriver
a62fa23 directfb.inc: force bfd linker for armv7a
9b075ca libpng12: update to 1.2.54
6d1eb34 libpng: update to 1.6.19
92a881f orc: update to 0.4.24
2f479b1 libpcap: update to 1.7.4
bd4058f apr-util: add missing RDEPENDS for ptest
1408642 iproute2: update to 4.3.0
e677c25 ruby-native: Depend on openssl-native
9e37812 db: fix race issue for libdb-6.0.la
c19036a pango: use ptest-gnome
43b29d9 gst-plugins-bad: improve FILES variables
9fc877f gstreamer1.0-plugins-base: add PACKAGECONFIG for libvisual
7a2bb0d python3: fix building nativesdk-python3
2268a70 python3: Upgrade from 3.4.3 to 3.5
ed8d1be python-git: Add missing dependency
dee2a8c guile, mailx, gcc, opensp, gstreamer1.0-libav, libunwind: disable thumb where it fails for qemuarm
c0b822f icu: force arm mode
f42ef3f rpcbind: Security Advisory - rpcbind - CVE-2015-7236
04034e7 subversion: fix CVE-2015-3187
f91aedf subversion: fix CVE-2015-3184
40cd228 oeqa/sshcontrol: don't source profile
d39192a oeqa/runtime/multilib: refactor ELF class extraction
cc34104 oe-selftest: Enable code coverage on unit tests
06859de meta/conf/machine: use ' inside quoted values
6be94ec runqemu-internal: Replace wacom-tablet with tablet for usbdevice
0cc3810 recipetool: make plugin registration function name consistent with devtool
b381f80 recipetool: add setvar subcommand
1fbd760 lib/oe/recipeutils: refactor patch_recipe_file() to use edit_metadata()
0b850cb devtool: clarify help text
5001f23 devtool: build: enable showing default task in help
f79022d devtool: build: use bbappend to set PARALLEL_MAKE
21481bc lib/oe/recipeutils: check in validate_pn() for names instead of filenames
671f41e devtool: ensure we change back to the original dir on error
74505b4 devtool: search: print SUMMARY value
3f46af2 devtool: drop unused plugin_init() functions
176211a devtool: package: use DEPLOY_DIR_<pkgtype> to get deploy directory
0fe7426 devtool: disable creating workspace for extract and search subcommands
a360fa7 lib/oe/patch: improve extraction of patch header
f79cc4d devtool: upgrade: provide a means to update the source branch
b4d4d21 devtool: upgrade: fetch remote repository before checking out new revision
9b7d45c devtool: upgrade: remove erroneous error when not renaming recipe
9a70444 devtool: upgrade: fix updating PV and SRCREV
6a52c73 devtool: upgrade: fix removing other recipes from workspace on reset
44ef78a devtool: include do_patch in SRCTREECOVEREDTASKS
804f5b8 image.py: avoid mkdir race when building multiple images
312862f package_manager.py: define info_dir and status_file when OPKGLIBDIR isn't the default
b00f734 image.py: Avoid creating empty .env file in _write_wic_env
a88505b lib/oe/terminal: use C locale when determining version
8d784ba toolchain-shar-extract.sh: Ensure it's ran in clean environment
7f3c20f toolchain-shar-extract.sh: do not allow $ in paths for ext SDK
2d21e5d create-pull-request: handle empty ODIR
c63b36f scripts/gen-lockedsig-cache: improve output
67af6d6 wic: exec_native_cmd: implement support for pseudo
8ffba25 toolchain-shar-relocate: don't assume last state of env_setup_script is good
b8ee7ae sanity: don't enforce DISPLAY for testimage
b364183 oeqa/qemurunner: pass nographic to runqemu if DISPLAY isn't set
46755cc base: add automatic dependency on lzip-native for .lz SRC_URI
6ea39c2 base: decode SRC_URI before adding implicit fetch dependencies
eded9c2 buildhistory.bbclass: support extending the content of the build history
d95df11 license.bbclass: Create image license manifest
efdab52 license.bbclass: Add function get_deployed_files
cc0d044 license.bbclass: Added function get_deployed_dependencies
d45e10e license.bbclass: Added get_boot_dependencies function
8b1e7bc license.bbclass: Split license create manifest
1a210e6 license.bbclass: Write recipeinfo file in license folder
74c7cd5 populate_sdk_ext.bbclass: Be more permissive on the name of the buildtools
5ba6382 populate_sdk_base: Add sysroot symlink check
7fed655 classes/populate_sdk_ext: fail if SDK_ARCH != BUILD_ARCH
2948169 classes/populate_sdk_ext: tweak reporting of workspace exclusion
28a2ea7 classes/populate_sdk_ext: make it clear when SDK installation has failed
124c6aa classes/populate_sdk_ext: tidy up preparation log file writing
d348624 boot-directdisk.bbclass: remove HDDIMG before create
03f15e5 sstate: Ensure siginfo and sig files are also touched
615ccae weston: Add PACKAGECONFIG option for colord CMS
cdad67c opkg: add cache filename length fixes
2ec77de openjade-native: statically link local libs
29747d4 sysklogd: inhibit updatercd for non-sysvinit
add3451 connman: depend on readline
7a557a2 latencytop: obey LDFLAGS
8aeec87 tcf-agent: obey LDFLAGS
9025d2e blkspace: fix ldflags for iowatcher
1732a8a bluez5: enable sysvinit support
160fdd8 sysprof: use packageconfig for the gui
425d020 mc: upgrade to 4.8.15
7386647 packagegroup-core-directfb: Don't depend on pango-modules
ac5ed8e xkeyboard-config: Upgrade 2.15 -> 2.16
3a71fab xkbcomp: Upgrade 1.3.0 -> 1.3.1
b7cb308 xinput: Upgrade 1.6.1 -> 1.6.2
05eca73 xf86-video-omap: Upgrade 0.4.3 -> 0.4.4
cfcc5e5 xf86-input-synaptics: Upgrade 1.8.2 -> 1.8.3
4c9256f xf86-input-evdev: Upgrade 2.9.2 -> 2.10.0
96ddcc5 xorg-driver-input: add xorg configuration to FILES
a1003f5 xserver-xorg: Upgrade 1.17.2 -> 1.18.0
a336b8a libxcb: Remove unused git-version of the recipe
05ba0db libxcb: Upgrade 1.11 -> 1.11.1
44233d3 pixman: Upgrade 0.32.6 -> 0.32.8
7ab0466 libxi: Upgrade 1.7.4 -> 1.7.5
63feef0 gtk-icon-utils-native: Upgrade 3.16.6 -> 3.18.2
38924d9 package_regex.inc: Add gtk-icon-utils-native
060b482 gtk+3: Upgrade 3.16.6 -> 3.18.2
4f3d2b3 adwaita-icon-theme: Upgrade 3.16.2.1 -> 3.18.0
c8849ac librsvg: Upgrade 2.40.10 -> 2.40.11
81769ca pango: add RPROVIDES for removed packages
c9b06f5 pango: Upgrade 1.36.8 -> 1.38.1
ced8d49 gdk-pixbuf: Upgrade 2.30.8 -> 2.32.1
918c773 libsoup-2.4: Upgrade 2.50.0 -> 2.52.1
5bd9305 at-spi2-atk: Upgrade 2.16.0 -> 2.18.1
8eb0c8f atk-spi2-core: Upgrade 2.16.0 -> 2.18.1
78130eb atk: Upgrade 2.16.0 -> 2.18.0
e7141ab glib-networking: Upgrade 2.44.0 -> 2.46.1
fcd7494 glib-2.0: build dependency cleanup
5357764 glib-2.0: Enable more tests while cross-compiling
1e271af glib-2.0: Upgrade 2.44.1 -> 2.46.1
bc1be07 qemu: Backport malloc-trace disabling
bca5a7a logrotate: do not move binary logrotate to /usr/bin
0069c0d systemd: drop unneeded $D check in prerm
cd1f2b4 systemd: chown hwdb.bin to root:root for do_rootfs
7ca8cd9 systemd: for valgrind, define VALGRIND=1
46fa8ab systemd: make coredump a PACKAGECONFIG
ac34784 systemd: add machine-id to conffiles
04937cc systemd: ignore .so filenames in systemd-doc
6821854 systemd: fix Upstream-Status tag
82107b1 mdadm: fix CFLAGS and ptest issues
d8adfd2 gcc-4.9: Fix various _FOR_BUILD and related variables
8ae27fa devtool: add sync command
6bfa1dc boost.inc: remove unused parameter from get_boost_parallel_make()
16d7bfd wireless-tools: remove unused files
ee923bf gstreamer1.0: fix install race
0ae52c8 gcc-multilib-config: make aarch64 support multilib
8514d21 libxml2: fix CVE-2015-7942 and CVE-2015-8035
e864f71 terminal: Open a new window instead of split on older tmux versions (<1.9)
5056581 flex: fix test-bison-yylval and test-bison-yylloc failed
c54540e gdbm 1.8.3: install libgdbm_compat
b9f87ed harfbuzz: update to 1.0.6
3f75537 ethtool: bump version to 4.2
9a4da3c openssl: fix ptest issues
9163a5d base-files: stage /etc/skel
d60c5ff mktemp: raise the priority to avoid conflicting with coreutils
b06eacd libunwind: fix build for qemuarm
c4acace gma500_gfx: Avoid inserting gma500_gfx module for certain devices
6c3f680 libsndfile: fix CVE-2014-9756
aa07eb1 python-pycurl: update version to 7.19.5.2
696aa7e rt-tests: upgrade to version 0.96
6ec7dc2 rpcbind: don't use '-w' for starting rpcbind
eddd88f libsecret: add dependency on intltool-native
2e8efb1 openssl: use subdir= instead of moving files in do_configure_prepend()
036d2dc openssl: sanity check that the bignum module is present
cf366d8 libsdl2: require GLES when building Wayland support
4b38be6 meta: add some missing Upstream-Status tags to patches
42c75cd weston: delete unused patch
521fac6 glibc: fix Upstream-Status tag
44a7bbc linux-firmware: package Broadcom BCM4339 firmware
f9d51cd libusb1: fix make install race
cb01f6d libusb1: upgrade from 1.0.19 to 1.0.20
b4e6f63 perl: fix spaces in brackets while using CC version
a59d019 u-boot: Update to 2015.10 release
e67c5b0 bitbake-prserv-tool: check file name
4e2c5e1 recipetool.append: don't choke on a trailing ; in a url
a35f79d yocto-bsp: Set SRCREV meta/machine revisions to AUTOREV
9d585b5 yocto-bsp: Set KTYPE to user selected base branch
1542c2a yocto-bsp: Typo on the file extension
f674ffa yocto-bsp: Avoid duplication of user patches ({{=machine}}-user-patches.scc)
49a465c package_manager.py: Delete installed_pkgs.txt file
ace895d rootfs.py: Stop using installed_pkgs.txt
ccb1616 lib/oe/distro_check: don't set empty proxy keys
8137a84 lib/oe/copy_buildsystem: Don't expand BB_TASKDEPDATA
a6c68d8 oeqa/selftest/sstatetests: prettier output for allarch test
92328b4 oeqa/selftest/signing: Added new test for signing sstate.
fbb03a8 oeqa/selftest/signing: New test for Signing packages in the package feeds.
13a4c38 qemu.bbclass: fix vardeps of QEMU_OPTIONS
51bd011 qemu.bbclass: correct the fsl ppc QEMU_EXTRAOPTIONS
753f31e autotools: Allow recipe-individual configure scripts
e281791 allarch: Force TARGET_*FLAGS variable values
e28e17e distro/maintainers.inc: include stress package details
76d2e46 image_types: improve wks path specification
70ae7a6 insane.bbclass: Avoid libdir QA check if PACKAGE_DEBUG_SPLIT_STYLE='debug-file-directory'
cf0dfdb classes/cpan-base: fix libdir for nativesdk
a205c4c bbclass: fix spelling mistakes
cf218e5 rootfs_*.bbclass: don't add BUILDNAME to do_rootfs vardepsexclude
7d8616c insane: Don't depend on BB_TASKDEPDATA
a9cc27e kernel: fix race condition between compile_kernelmodules and shared_workdir
fecb077 classes: Ensure pass setVar/setVarFlag strings, not integers
9167f20 classes/license: fix intermittent license collection warning
43c8867 classes/metadata_scm: fix git errors showing up on non-git repositories
59b27d5 sstate: respect GPG_BIN and GPG_HOME
4415dc5 archiver.bbclass: add bbappend when do_ar_recipe kernel and gcc packages
2f0ff3a archiver.bbclass: fix previous issue regarding work-shared for linux-yocto
0cc4eef waf.bbclass: filter out non -j from PARALLEL_MAKE
95719b0 ptest-gnome: extend EXTRA_OECONF in all builds, not just target
1b25a70 yocto-project-qs, ref-manual, poky.ent: CentOS Package updates
2e649d7 dev-manual: Updated runqemu command options list
bd62289 toaster-manual: Removed SDKMACHINE from the json file example.
c674cd7 ref-manual: Updated list of supported distros.
33d8cff ref-manual: Updated the GCC 5 migration section for 2.0
d9aabf9 gcc: Drop 4.8
2cb1aee layer.conf: Correct gcc-cross dependency
88f9310 bitbake: toaster: builds pages Fix the download cooker log link
d04af8b bitbake: toaster: project pages Link to image recipes table in notifications
70465c7 bitbake: toaster: tests: Re-write some cases to make them more maintainable
536b73f bitbake: data_smart: Only support lowercase OVERRIDES
fb01a66 bitbake: fetch2: Remove crazy code in unpack
7db88aa bitbake: parse: Don't try to expand __base_depends/__depends
4c04ce0 bitbake: cache: Don't try to expand __inherit_data
9d8e36a bitbake: toaster: localhostbectrl Pass DATABASE_URL in via the process environment
4677d8b bitbake: toaster: Remove the new-build-input button widget
55f4494 bitbake: toaster: projecttopbar Use the project in context to get num builds
e9d4962 bitbake: toaster: projectpage Disable/Enable build input if we have 0 layers
5fa4c73 bitbake: toaster: orm Fix get_number_of_builds to count all apart from IN_PROGRESS
c4032f4 bitbake: codeparser: Only load the codeparser cache once
e3b66c1 maintainers: mass reassign and cleanup
37ddd3e Revert "local.conf.sample: Disable image-prelink by default"
9cc221d yocto-bsp: Default kernel version to 4.1 on x86_64
7100c42 scripts: runqemu: remove QEMUARCH from help message
f47e4ad cairo: update 1.14.2 -> 1.14.4
603b4de cairo.inc: drop obsolete CFLAGS += "-ffat-lto-objects" workaround
e8833a6 cmake: update 3.3.1 -> 3.3.2
8b2b068 oe-selftest: add test for bitbake-layers show-recipes
480bbae oeqa/selftest/layerappend: fix test if build directory is not inside COREBASE
a301f6e oeqa/selftest/devtool: fix test if build directory is not inside COREBASE
fd6bf77 classes/distrodata: split SRC_URI properly before determining type
7cebff6 classes/buildhistory: split package history values only once
10fc534 conf/distro/include: drop old recipes from include files
37cfd80 gitignore: fix overzealous exclusion
1f6599b meta: Fix typos in Upstream-Status labels
7cace4c meta/conf/layer.conf: fix typo
ca8e1e5 texinfo-dummy-native: set SUMMARY instead of DESCRIPTION
64cd113 gstreamer1.0-meta-base: set SUMMARY instead of DESCRIPTION
1d42d59 mmc-utils: set SUMMARY instead of DESCRIPTION
6692540 swig: set SUMMARY instead of DESCRIPTION
47ae8eb alsa-plugins: set SUMMARY instead of DESCRIPTION
eac5fa9 tzcode-native: set SUMMARY instead of DESCRIPTION
0a30a1f linux-yocto.inc: set SUMMARY instead of DESCRIPTION
19e1a73 python-nose: add SUMMARY
b5f58c1 stress: add SUMMARY
5f9392a libunwind: add SUMMARY
1460e01 gptfdisk: add SUMMARY
0821c36 verify-homepage: fix recipe file selection
0c48921 verify-homepage: tidy up output and comments
0e348e7 verify-homepage: get expanded HOMEPAGE value
caaca00 verify-homepage: use scriptpath to find bitbake path
649b6bc libaio: don't disable linking to the system libraries
11a9c24 runqemu: don't specify IP when starting a VNC server
3b95964 qemurunner: Remove the timeout in run_serial
bbd6d07 libxslt: CVE-2015-7995
a0d2ea9 gstreamer1.0-rtsp-server: upgrade to version 1.6.1
2459ec2 gstreamer1.0-libav: upgrade to version 1.6.1
bce06e7 gstreamer1.0-plugins-ugly: upgrade to version 1.6.1
0ec3c62 gstreamer1.0-plugins-bad: upgrade to version 1.6.1
ba1bc63 gstreamer1.0-plugins-good: upgrade to version 1.6.1
4a55d12 gstreamer1.0-plugins-base: upgrade to version 1.6.1
8360f23 gstreamer1.0: upgrade to version 1.6.1
8800033 prelink: Fix various prelink issues on IA32, ARM, and MIPS.
920fb96 gcc: Update default Power GCC settings to use secure-plt
7b1763a glibc: Fix ld.so / prelink interface for ELF_RTYPE_CLASS_EXTERN_PROTECTED_DATA
e63e191 qemurunner: Enable timestamps on kernel boot-up
a1ca788 openssl: fix mips64 configure support
5a10a6f at: modify sources in do_patch
78e0598 unzip: rename patch to reflect CVE fix
b80935a readline: rename patch to contain CVE reference
86d84ff qemu: upgrade to 2.4.0.1
4f0d756 gnome-desktop-testing: fix ptest output format
834de84 default-distrovars: remove less from WHITELIST_GPL-3.0
29bba95 lsof: don't export EXTRA_OEMAKE
3d37768 cmake.bbclass: don't duplicate CMAKE_C_FLAGS in CMAKE_C_FLAGS_RELEASE
efc07c2 rm_work.bbclass: Exclude do_rootfs stamp removal
5f9d16b cairo: fix license for cairo-script-interpreter
7328479 openssh: enable X11Forwarding if distro feature x11 is set
adeb820 acpid: Upgrade to 2.0.25
781dfd8 libidn: 1.30 -> 1.32
351c69a sqlite: 3.8.10.2 -> 3.9.0
c0fe43c rt-tests: bump to v0.94
cf972f9 gbm: Fix "configure: error: gbm requires --enable-dri"
17733cc xinetd: install xinetd supported services configuration
aa1844e combo-layer: introduce ability to exclude component from mass update
dcc446f linux-dtb.inc: refactor common code to function get_real_dtb_path_in_kernel
af9c7a4 linux-dtb.inc: refactor common code to function normalize_dtb
7eecb81 linux-dtb.inc: explicit test for empty string not needed
54df911 ptest-runner: Allow running of specific tests
54325b2 oeqa/testimage: Add support for test folder export.
ecbe135 oeqa/runtime/multilib: run the arch tests on connmand not connman-applet
2d1071e oeqa/runtime: remove dmesg test
42a5378 nfs-utils/statd: fix a segfault
77e3246 qemu: enable user mode for mips64 and mips64el
70600fb gnupg: fix find-version for beta checking
ab123ef rpm: define EM_AARCH64 for debugedit
af8c136 xserver-xorg: drop empty ${PN}-security-policy package
b667067 xserver-xorg: add Xwayland RRECOMMENDS
80f4d71 weston: add a PACKAGECONFIG option for xwayland support
883ab0f systemd: make dbus an optional build time dependency
2c5047f weston: add PACKAGECONFIG to build with systemd-login support
65ffeb5 systemd: add PACKAGECONFIG to build with compatibility libraries
4b29c80 os-release: put double-quotes around variable contents
0f516a5 cpio: fix testcase symlink-bad-lengths [ LIN8-947 ]
bceb9cb cpio: Fix symlink-bad-length test for 64-bit [ LIN8-947 ] architectures.
0ff3fc7 gtk+3: fix ALTERNATIVE_PRIORITY conflict with gtk+
eca12a6 coreutils: fix ALTERNATIVE_PRIORITY conflict with procps and mktemp
8de5315 util-linux: fix ALTERNATIVE_PRIORITY conflict with ncurses procps and e2fsprogs
3befb43 console-tools: fix ALTERNATIVE_PRIORITY conflict with kbd
5385ea8 debianutils: fix ALTERNATIVE_PRIORITY conflict with which
3a0bd40 linux-dtb.inc: use same variable name DTB for all elements of KERNEL_DEVICETREE
a879312 linux-dtb.inc: remove unneeded 'cd'
a23d1ca webkitgtk: Add upstream patch to fix build problem
69836e8 python: don't append -D__SOFTFP__ to TARGET_CC_ARCH for armv6/armv7a
38d1d63 prexport.bbclass: avoid export for native and crosssdk
d3da006 recipes: add distro_features_check for some packages
63690f0 scons.bbclass: SCons packages don't require do_configure
bffdc65 busybox: Schedule mdev after mountall
13ce7c2 busybox: Fix mdev block device automounting
b09f0f2 libarchive: rename patch to reflect CVE
116360f binutils: Fix XLP / Octeon 3 instruction clash
fd4f4d2 binutils: Fix octeon3 disassembly patch
REVERT: b1f23d1 build-appliance-image: Update to jethro head revision
REVERT: 7fe17a2 qemu: Security fix CVE-2016-2198
REVERT: 50700a7 qemu: Security fix CVE-2016-2197
REVERT: 1f0e615 libgcrypt: Security fix CVE-2015-7511
REVERT: dc5f155 uclibc: Security fix CVE-2016-2225
REVERT: ef13511 uclibc: Security fix CVE-2016-2224
REVERT: ae57ea0 libbsd: Security fix CVE-2016-2090
REVERT: eb9666a glibc: Security fix CVE-2015-7547
REVERT: 5b12268 build-appliance-image: Update to jethro head revision
REVERT: a3a374a curl: Secuirty fix CVE-2016-0755
REVERT: f4341a9 curl: Security fix CVE-2016-0754
REVERT: 35f4306 nettle: Security fix CVE-2015-8804
REVERT: 3e8a07b nettle: Security fix CVE-2015-8803 and CVE-2015-8805
REVERT: 5ffc326 socat: Security fix CVE-2016-2217
REVERT: 5cc5f99 libpng: Security fix CVE-2015-8472
REVERT: 21a816c libpng: Security fix CVE-2015-8126
REVERT: 6a0fbfa foomatic-filters: Security fixes CVE-2015-8327
REVERT: d57aaf7 foomatic-filters: Security fix CVE-2015-8560
REVERT: 941874a build-appliance-image: Update to jethro head revision
REVERT: d74a3cb cross-localedef-native: add ABI breaking glibc patch
REVERT: 12fae23 build-appliance-image: Update to jethro head revision
REVERT: 67ac9d6 e2fsprogs: Ensure we use the right mke2fs.conf when restoring from sstate
REVERT: 5812fc9 build-appliance-image: Update to jethro head revision
REVERT: 3de2492 ref-manual: Updated host package install requirements CentOS
REVERT: 79de8cf toaster-manual: Updated the "Installation" to have TOASTER_DIR information
REVERT: a23d262 toaster-manual: Updated instructions for production setup.
REVERT: b6def81 linux-yocto: Update SRCREV for genericx86* for 4.1, fixes CVE-2016-0728
REVERT: db0f8ac linux-yocto: Update SRCREV for genericx86* for 3.19, fixes CVE-2016-0728
REVERT: c8122a0 linux-yocto: Update SRCREV for genericx86* for 3.14, fixes CVE-2016-0728
REVERT: cdeb241 meta-yocto-bsp: Remove uvesafb (v86d) from generic x86 features
REVERT: 52cd219 yocto-bsp: Set SRCREV meta/machine revisions to AUTOREV
REVERT: a88d6cb yocto-bsp: Set KTYPE to user selected base branch
REVERT: 4e74b36 yocto-bsp: Avoid duplication of user patches ({{=machine}}-user-patches.scc)
REVERT: 6680773 yocto-bsp: Default kernel version to 4.1 on x86_64
REVERT: 4c075e7 piglit: don't use /tmp to write generated sources to
REVERT: ee52ac6 gen-lockedsig-cache: fix bad destination path joining
REVERT: e9f95df linux-yocto: Update SRCREV for qemux86* for 4.1, fixes CVE-2016-0728
REVERT: e63bab1 linux-yocto: Update SRCREV for qemux86* for 3.19, fixes CVE-2016-0728
REVERT: 64a4920 linux-yocto: Update SRCREV for qemux86* for 3.14, fixes CVE-2016-0728
REVERT: 5b043da libpng12: update URL that no longer exists
REVERT: 655c8a5 libpng: update URL that no longer exists
REVERT: 96fda8c busybox: fix build of last applet
REVERT: ae037d9 ghostscript: add dependency for pnglibconf.h
REVERT: 26eb877 gcr: Require x11 DISTRO_FEATURE
REVERT: e632cdb uClibc: enable utmp for shadow compatibility
REVERT: e8c9613 git: Security fix CVE-2015-7545
REVERT: 108ea6d glibc-locale: fix QA warning
REVERT: 9a88c1d grub: Security fix CVE-2015-8370
REVERT: 443b09a gdk-pixbuf: Security fix CVE-2015-7674
REVERT: 6c91068 librsvg: Security fix CVE-2015-7558
REVERT: 9fd2349 bind: Security fix CVE-2015-8461
REVERT: 5a40d9f bind: Security fix CVE-2015-8000
REVERT: 1bbf183 libxml2: Security fix CVE-2015-8710
REVERT: 2ec6d1d libxml2: Security fix CVE-2015-8241
REVERT: 55aafb5 dpkg: Security fix CVE-2015-0860
REVERT: 029948b tzdata: update to 2016a
REVERT: 2bcf141 tzcode: update to 2016a
REVERT: cc3a391 kernel-yocto: fix checkout bare-cloned kernel repositories
REVERT: 049be17 libpcre: bug fixes include security
REVERT: 5e94ac7 qemu: Security fix CVE-2015-7295
REVERT: 7ee1828 qemu: Security fix CVE-2016-1568
REVERT: ca6ec2e qemu: Security fix CVE-2015-8345
REVERT: b55a677 qemu: Security fix CVE-2015-7512
REVERT: 4922f47 qemu: Security fix CVE-2015-7504
REVERT: 3ec0e95 qemu: Security fix CVE-2015-8504
REVERT: 942ce53 openssl: Security fix CVE-2016-0701
REVERT: ce8ae1c openssl: Security fix CVE-2015-3197
REVERT: 080e027 tiff: Security fix CVE-2015-8784
REVERT: c6ae9c1 tiff: Security fix CVE-2015-8781
REVERT: 049b7db bind: CVE-2015-8704 and CVE-2015-8705
REVERT: d632a92 rpmresolve.c: Fix unfreed pointers that keep DB opened
REVERT: 5b993ed openssh: CVE-2016-1907
REVERT: 27ee5b4 glibc: CVE-2015-8776
REVERT: a4134af glibc: CVE-2015-9761
REVERT: e10ec6f glibc: CVE-2015-8779
REVERT: a5a965d glibc: CVE-2015-8777.patch
REVERT: 2fb7ee2 bitbake: toaster: make runbuilds loop
REVERT: b9ad87b nativesdk-buildtools-perl-dummy: Bump PR
REVERT: 0a1c63a nativesdk-buildtools-perl-dummy: properly set PACKAGE_ARCH
REVERT: d4b400e nativesdk-buildtools-perl-dummy: fix rebuilding when SDKMACHINE changes
REVERT: 8c8c4ed Revert "gstreamer1.0-plugins-good.inc: add gudev back to PACKAGECONFIG"
REVERT: b832202 Revert "gstreamer: Deal with merge conflict which breaks systemd builds"
REVERT: dd0ba9e build-appliance-image: Update to jethro head revision
REVERT: 325d205 gstreamer: Deal with merge conflict which breaks systemd builds
REVERT: 53b114b build-appliance-image: Update to jethro head revision
REVERT: 02be35d poky.conf: Bump version for 2.0.1 jethro release
REVERT: f5551f8 ref-manual: Updated the list of supported image types.
REVERT: aa179ae dev-manual: Added three new wic option descriptions.
REVERT: 20007c8 dev-manual: Added the --overhead-factor wic option description.
REVERT: 2dd7f46 dev-manual: Added the --extra-space wic option description.
REVERT: 81cc737 dev-manual: Added wic --notable option description.
REVERT: 2b1dce5 dev-manual:
REVERT: a6f5293 kernel/kernel-arch: Explicitly mapping between i386/x86_64 and x86 for kernel ARCH
REVERT: e79a538 openssh: update to 7.1p2
REVERT: b171076 devtool: reset: do clean for multiple recipes at once with -a
REVERT: 255115f devtool: sdk-update: fix error checking
REVERT: 3f69105 devtool: sdk-update: fix metadata update step
REVERT: 5ba94af devtool: sdk-update: fix not using updateserver config file option
REVERT: d03d145 classes/populate_sdk_ext: disable signature warnings
REVERT: 00ff950 classes/populate_sdk_ext: fix cascading from preparation failure
REVERT: 22446c6 scripts/oe-publish-sdk: add missing call to git update-server-info
REVERT: 8597a61 devtool: use cp instead of shutil.copytree
REVERT: 95cc641 buildhistory: fix not recording SDK information
REVERT: 84d48ac recipetool: create: fix error when extracting source to a specified directory
REVERT: 4369329 recipetool: create: detect when specified URL returns a web page
REVERT: 4c3191f recipetool: create: prevent attempting to unpack entire DL_DIR
REVERT: caca77e recipetool: create: fix do_install handling for makefile-only software
REVERT: 383159e recipetool: create: avoid traceback on fetch error
REVERT: be40baa recipetool: create: handle https://....git URLs
REVERT: a897bfd devtool: sdk-update: fix traceback without update server set
REVERT: 9c4b61e classes/populate_sdk_ext: error out of install if buildtools install fails
REVERT: 4c07dd2 gstreamer1.0-plugins-good.inc: add gudev back to PACKAGECONFIG
REVERT: 83b72d8 linux-yocto: Update Genericx86* BSP to 4.1.15 kernel
REVERT: 44639bd libaio: don't disable linking to the system libraries
REVERT: a0be9bd linux-yocto/4.1: update to v4.1.15
REVERT: 53f0290 libxml2: security fix CVE-2015-5312
REVERT: f4b0c49 libxml2: security fix CVE-2015-8242
REVERT: fb409c9 libxml2: security fix CVE-2015-7500
REVERT: 55d097a libxml2: security fix CVE-2015-7499
REVERT: 8e6b2d6 libxml2: security fix CVE-2015-7497
REVERT: 332eb1d libxml2: security fix CVE-2015-7498
REVERT: cbc4e83 libxml2: security fix CVE-2015-8035
REVERT: c4b71e1 libxml2: security fix CVE-2015-7942
REVERT: fdea03d libxml2: security fix CVE-2015-8317
REVERT: 6fc1109 libxml2: security fix CVE-2015-7941
REVERT: 9eb4ce0 openssl: fix for CVE-2015-3195
REVERT: 6880f82 openssl: fix for CVE-2015-3194
REVERT: 7dcaa84 openssl: fix for CVE-2015-3193
REVERT: 435139b logrotate: do not move binary logrotate to /usr/bin
REVERT: 5f49c0a cairo: fix license for cairo-script-interpreter
REVERT: a29ec81 glibc: Fix ld.so / prelink interface for ELF_RTYPE_CLASS_EXTERN_PROTECTED_DATA
REVERT: b1e980f gcc: Update default Power GCC settings to use secure-plt
REVERT: ed82690 prelink: Fix various prelink issues on IA32, ARM, and MIPS.
REVERT: 9a620da autotools: Allow recipe-individual configure scripts
REVERT: f828071 toolchain-scripts.bbclass: unset command_not_found_handle
REVERT: 49858bd devtool: upgrade: fetch remote repository before checking out new revision
REVERT: d213452 devtool: upgrade: remove erroneous error when not renaming recipe
REVERT: fec97f6 devtool: upgrade: fix updating PV and SRCREV
REVERT: 3b4f659 devtool: upgrade: fix removing other recipes from workspace on reset
REVERT: 61a7de0 devtool: include do_patch in SRCTREECOVEREDTASKS
REVERT: 82c0072 toolchain-shar-extract.sh: do not allow $ in paths for ext SDK
REVERT: f181e72 scripts/gen-lockedsig-cache: improve output
REVERT: 4b5d4ca toolchain-shar-extract.sh: proper fix for additional env setup scripts
REVERT: d2ea8f1 toolchain-shar-relocate: don't assume last state of env_setup_script is good
REVERT: 02ef437 populate_sdk_ext.bbclass: Be more permissive on the name of the buildtools
REVERT: 3653b17 classes/populate_sdk_ext: fail if SDK_ARCH != BUILD_ARCH
REVERT: 8879571 classes/populate_sdk_ext: tweak reporting of workspace exclusion
REVERT: eeda3c6 classes/populate_sdk_ext: make it clear when SDK installation has failed
REVERT: dee9fbe classes/populate_sdk_ext: tidy up preparation log file writing
REVERT: d001d46 classes/license: fix intermittent license collection warning
REVERT: 777451c classes/metadata_scm: fix git errors showing up on non-git repositories
REVERT: cb0ca72 oeqa/selftest/layerappend: fix test if build directory is not inside COREBASE
REVERT: 8970ad6 oeqa/selftest/devtool: fix test if build directory is not inside COREBASE
REVERT: 4f7fdd0 classes/distrodata: split SRC_URI properly before determining type
REVERT: 3b7df55 uninative.bbclass: Choose the correct loader based on BUILD_ARCH
REVERT: f3d7c3f openssl: sanity check that the bignum module is present
REVERT: 96b1b5c glibc: Backported a patch to fix glibc's bug(18589)
REVERT: 7aecb57 directfb.inc: force bfd linker for armv7a
REVERT: 75ca2c8 texinfo: don't create dependency on INHERIT variable
REVERT: 02c7b3f package_manager.py: define info_dir and status_file when OPKGLIBDIR isn't the default
REVERT: 003c94f libsdl2: require GLES when building Wayland support
REVERT: ad6db01 gst-plugins-bad: add PACKAGECONFIGs for voamrwbenc, voaacenc, resindvd
REVERT: f0d87fe gstreamer1.0-plugins-good: fix PACKAGECONFIG for gudev and add one for v4l2 and libv4l2
REVERT: 35f34a6 gstreamer1.0-plugins-bad: fix dependencies for uvch264 PACKAGECONFIG
REVERT: 3b77e20 gstreamer1.0-plugins-{base,good}: update PACKAGECONFIGs
REVERT: e2d4412 libunwind: fix build for qemuarm
REVERT: ef69078 guile, mailx, gcc, opensp, gstreamer1.0-libav, libunwind: disable thumb where it fails for qemuarm
REVERT: 4700e40 icu: force arm mode
REVERT: 743ee04 libxcb: Add a workaround for gcc5 bug on mips
REVERT: 8a3deca bitbake: fetch: use orig localpath when calling orig method
REVERT: 0073b23 yocto-bsp: Typo on the file extension
REVERT: 71dbbcd bsp-guide: Updated the license statement.
REVERT: 41f1026 dev-manual: Correction to the KVM stuff in the runqemu commands.
REVERT: 38e3c6e mega-manual: Added four new figures for GUI example.
REVERT: b99ec28 poky.ent: Fixed POKYVERSION variable.
REVERT: c670dc7 yocto-project-qs, ref-manual, poky.ent: CentOS Package updates
REVERT: b968190 dev-manual: Updated runqemu command options list
REVERT: 1278753 toaster-manual: Removed SDKMACHINE from the json file example.
REVERT: 7b25b70 ref-manual: Updated list of supported distros.
REVERT: d9423fb ref-manual: Updated the GCC 5 migration section for 2.0
REVERT: 347347a bitbake: lib/bb/utils: improve edit_bblayers_conf() handling of bblayers.conf formatting
REVERT: 5935783 bitbake: lib/bb/utils: fix error in edit_metadata() when deleting first line
REVERT: 7fdad70 rpcbind: Security Advisory - rpcbind - CVE-2015-7236
REVERT: 0cb2fa5 subversion: fix CVE-2015-3187
REVERT: 5b52e9b subversion: fix CVE-2015-3184
REVERT: 59bdde4 linux-firmware: rtl8192cx: Add latest available firmware
REVERT: 8ad2bcc init-install-efi: fix script for gummiboot loader
REVERT: c3087bd init-install-efi: fix script for eMMC installation
REVERT: d2bf9fb pulseaudio: Fix HDMI profile selection
REVERT: 0556c58 allarch: Force TARGET_*FLAGS variable values
REVERT: e683dac libsndfile: fix CVE-2014-9756
REVERT: 092757e libxslt: CVE-2015-7995
REVERT: dab5555 unzip: rename patch to reflect CVE fix
REVERT: 1753d4a readline: rename patch to contain CVE reference
REVERT: 9dd3422 libarchive: rename patch to reflect CVE
REVERT: 1401976 binutils: Fix octeon3 disassembly patch
REVERT: a54a0db opkg: add cache filename length fixes
git-subtree-dir: yocto-poky
git-subtree-split: 8358e543ab95a1d2b1d19c1e944275daa17378c1
Signed-off-by: Patrick Williams <patrick@stwcx.xyz>
Diffstat (limited to 'yocto-poky/meta/recipes-core')
283 files changed, 7811 insertions, 32598 deletions
diff --git a/yocto-poky/meta/recipes-core/base-files/base-files_3.0.14.bb b/yocto-poky/meta/recipes-core/base-files/base-files_3.0.14.bb index e16fe722b..d39170737 100644 --- a/yocto-poky/meta/recipes-core/base-files/base-files_3.0.14.bb +++ b/yocto-poky/meta/recipes-core/base-files/base-files_3.0.14.bb @@ -13,7 +13,6 @@ LIC_FILES_CHKSUM = "file://licenses/GPL-2;md5=94d55d512a9ba36caa9b7df079bae19f" SRC_URI = "file://rotation \ file://nsswitch.conf \ file://motd \ - file://inputrc \ file://host.conf \ file://profile \ file://shells \ @@ -55,7 +54,7 @@ dirs2775-lsb = "/var/mail" volatiles = "log tmp" conffiles = "${sysconfdir}/debian_version ${sysconfdir}/host.conf \ - ${sysconfdir}/inputrc ${sysconfdir}/issue /${sysconfdir}/issue.net \ + ${sysconfdir}/issue /${sysconfdir}/issue.net \ ${sysconfdir}/nsswitch.conf ${sysconfdir}/profile \ ${sysconfdir}/default" @@ -124,7 +123,6 @@ do_install () { install -m 0644 ${WORKDIR}/shells ${D}${sysconfdir}/shells install -m 0755 ${WORKDIR}/share/dot.profile ${D}${sysconfdir}/skel/.profile install -m 0755 ${WORKDIR}/share/dot.bashrc ${D}${sysconfdir}/skel/.bashrc - install -m 0644 ${WORKDIR}/inputrc ${D}${sysconfdir}/inputrc install -m 0644 ${WORKDIR}/nsswitch.conf ${D}${sysconfdir}/nsswitch.conf install -m 0644 ${WORKDIR}/host.conf ${D}${sysconfdir}/host.conf install -m 0644 ${WORKDIR}/motd ${D}${sysconfdir}/motd @@ -167,6 +165,10 @@ do_install_append_linuxstdbase() { done } +sysroot_stage_all_append () { + sysroot_stage_dir ${D}${sysconfdir}/skel ${SYSROOT_DESTDIR}${sysconfdir}/skel +} + PACKAGES = "${PN}-doc ${PN} ${PN}-dev ${PN}-dbg" FILES_${PN} = "/" FILES_${PN}-doc = "${docdir} ${datadir}/common-licenses" diff --git a/yocto-poky/meta/recipes-core/base-passwd/base-passwd_3.5.29.bb b/yocto-poky/meta/recipes-core/base-passwd/base-passwd_3.5.29.bb index ac9bd81d3..10457b2de 100644 --- a/yocto-poky/meta/recipes-core/base-passwd/base-passwd_3.5.29.bb +++ b/yocto-poky/meta/recipes-core/base-passwd/base-passwd_3.5.29.bb @@ -17,6 +17,10 @@ SRC_URI = "https://launchpad.net/debian/+archive/primary/+files/${BPN}_${PV}.tar SRC_URI[md5sum] = "6beccac48083fe8ae5048acd062e5421" SRC_URI[sha256sum] = "f0b66388b2c8e49c15692439d2bee63bcdd4bbbf7a782c7f64accc55986b6a36" +# the package is taken from launchpad; that source is static and goes stale +# so we check the latest upstream from a directory that does get updated +UPSTREAM_CHECK_URI = "${DEBIAN_MIRROR}/main/b/base-passwd/" + inherit autotools SSTATEPOSTINSTFUNCS += "base_passwd_sstate_postinst" @@ -85,7 +89,7 @@ if [ ! -e $D${sysconfdir}/group ]; then """ + group + """EOF fi """ - d.setVar('pkg_preinst_${PN}', preinst) + d.setVar(d.expand('pkg_preinst_${PN}'), preinst) } addtask do_package after do_populate_sysroot diff --git a/yocto-poky/meta/recipes-core/bsd-headers/bsd-headers.bb b/yocto-poky/meta/recipes-core/bsd-headers/bsd-headers.bb new file mode 100644 index 000000000..8f43d431d --- /dev/null +++ b/yocto-poky/meta/recipes-core/bsd-headers/bsd-headers.bb @@ -0,0 +1,31 @@ +# Copyright (C) 2016 Khem Raj <raj.khem@gmail.com> +# Released under the MIT license (see COPYING.MIT for the terms) + +DESCRIPTION = "bsd compatible headers" +LICENSE = "BSD-3-Clause & BSD-2-Clause" +LIC_FILES_CHKSUM = "file://sys-queue.h;beginline=1;endline=32;md5=c6352b0f03bb448600456547d334b56f" +SECTION = "devel" + +SRC_URI = "file://sys-queue.h \ + file://sys-tree.h \ + file://sys-cdefs.h \ + " +do_configure[noexec] = "1" +do_compile[noexec] = "1" + +INHIBIT_DEFAULT_DEPS = "1" + +S = "${WORKDIR}" + +do_install() { + install -Dm 0644 ${S}/sys-queue.h ${D}${includedir}/sys/queue.h + install -Dm 0644 ${S}/sys-tree.h ${D}${includedir}/sys/tree.h + install -Dm 0644 ${S}/sys-cdefs.h ${D}${includedir}/sys/cdefs.h +} +# +# We will skip parsing for non-musl systems +# + +COMPATIBLE_HOST = ".*-musl.*" +RDEPENDS_${PN}-dev = "" +RRECOMMENDS_${PN}-dbg = "${PN}-dev (= ${EXTENDPKGV})" diff --git a/yocto-poky/meta/recipes-core/bsd-headers/bsd-headers/sys-cdefs.h b/yocto-poky/meta/recipes-core/bsd-headers/bsd-headers/sys-cdefs.h new file mode 100644 index 000000000..209a623c0 --- /dev/null +++ b/yocto-poky/meta/recipes-core/bsd-headers/bsd-headers/sys-cdefs.h @@ -0,0 +1,26 @@ +#warning usage of non-standard #include <sys/cdefs.h> is deprecated + +#undef __P +#undef __PMT + +#define __P(args) args +#define __PMT(args) args + +#define __CONCAT(x,y) x ## y +#define __STRING(x) #x + +#ifdef __cplusplus +# define __BEGIN_DECLS extern "C" { +# define __END_DECLS } +#else +# define __BEGIN_DECLS +# define __END_DECLS +#endif + +#if defined(__GNUC__) && !defined(__cplusplus) +# define __THROW __attribute__ ((__nothrow__)) +# define __NTH(fct) __attribute__ ((__nothrow__)) fct +#else +# define __THROW +# define __NTH(fct) fct +#endif diff --git a/yocto-poky/meta/recipes-core/bsd-headers/bsd-headers/sys-queue.h b/yocto-poky/meta/recipes-core/bsd-headers/bsd-headers/sys-queue.h new file mode 100644 index 000000000..99d01a55b --- /dev/null +++ b/yocto-poky/meta/recipes-core/bsd-headers/bsd-headers/sys-queue.h @@ -0,0 +1,846 @@ +/* $NetBSD: queue.h,v 1.68 2014/11/19 08:10:01 uebayasi Exp $ */ + +/* + * Copyright (c) 1991, 1993 + * The Regents of the University of California. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * @(#)queue.h 8.5 (Berkeley) 8/20/94 + */ + +#ifndef _SYS_QUEUE_H_ +#define _SYS_QUEUE_H_ + +/* + * This file defines five types of data structures: singly-linked lists, + * lists, simple queues, tail queues, and circular queues. + * + * A singly-linked list is headed by a single forward pointer. The + * elements are singly linked for minimum space and pointer manipulation + * overhead at the expense of O(n) removal for arbitrary elements. New + * elements can be added to the list after an existing element or at the + * head of the list. Elements being removed from the head of the list + * should use the explicit macro for this purpose for optimum + * efficiency. A singly-linked list may only be traversed in the forward + * direction. Singly-linked lists are ideal for applications with large + * datasets and few or no removals or for implementing a LIFO queue. + * + * A list is headed by a single forward pointer (or an array of forward + * pointers for a hash table header). The elements are doubly linked + * so that an arbitrary element can be removed without a need to + * traverse the list. New elements can be added to the list before + * or after an existing element or at the head of the list. A list + * may only be traversed in the forward direction. + * + * A simple queue is headed by a pair of pointers, one the head of the + * list and the other to the tail of the list. The elements are singly + * linked to save space, so elements can only be removed from the + * head of the list. New elements can be added to the list after + * an existing element, at the head of the list, or at the end of the + * list. A simple queue may only be traversed in the forward direction. + * + * A tail queue is headed by a pair of pointers, one to the head of the + * list and the other to the tail of the list. The elements are doubly + * linked so that an arbitrary element can be removed without a need to + * traverse the list. New elements can be added to the list before or + * after an existing element, at the head of the list, or at the end of + * the list. A tail queue may be traversed in either direction. + * + * A circle queue is headed by a pair of pointers, one to the head of the + * list and the other to the tail of the list. The elements are doubly + * linked so that an arbitrary element can be removed without a need to + * traverse the list. New elements can be added to the list before or after + * an existing element, at the head of the list, or at the end of the list. + * A circle queue may be traversed in either direction, but has a more + * complex end of list detection. + * + * For details on the use of these macros, see the queue(3) manual page. + */ + +/* + * Include the definition of NULL only on NetBSD because sys/null.h + * is not available elsewhere. This conditional makes the header + * portable and it can simply be dropped verbatim into any system. + * The caveat is that on other systems some other header + * must provide NULL before the macros can be used. + */ +#ifdef __NetBSD__ +#include <sys/null.h> +#endif + +#if defined(QUEUEDEBUG) +# if defined(_KERNEL) +# define QUEUEDEBUG_ABORT(...) panic(__VA_ARGS__) +# else +# include <err.h> +# define QUEUEDEBUG_ABORT(...) err(1, __VA_ARGS__) +# endif +#endif + +/* + * Singly-linked List definitions. + */ +#define SLIST_HEAD(name, type) \ +struct name { \ + struct type *slh_first; /* first element */ \ +} + +#define SLIST_HEAD_INITIALIZER(head) \ + { NULL } + +#define SLIST_ENTRY(type) \ +struct { \ + struct type *sle_next; /* next element */ \ +} + +/* + * Singly-linked List access methods. + */ +#define SLIST_FIRST(head) ((head)->slh_first) +#define SLIST_END(head) NULL +#define SLIST_EMPTY(head) ((head)->slh_first == NULL) +#define SLIST_NEXT(elm, field) ((elm)->field.sle_next) + +#define SLIST_FOREACH(var, head, field) \ + for((var) = (head)->slh_first; \ + (var) != SLIST_END(head); \ + (var) = (var)->field.sle_next) + +#define SLIST_FOREACH_SAFE(var, head, field, tvar) \ + for ((var) = SLIST_FIRST((head)); \ + (var) != SLIST_END(head) && \ + ((tvar) = SLIST_NEXT((var), field), 1); \ + (var) = (tvar)) + +/* + * Singly-linked List functions. + */ +#define SLIST_INIT(head) do { \ + (head)->slh_first = SLIST_END(head); \ +} while (/*CONSTCOND*/0) + +#define SLIST_INSERT_AFTER(slistelm, elm, field) do { \ + (elm)->field.sle_next = (slistelm)->field.sle_next; \ + (slistelm)->field.sle_next = (elm); \ +} while (/*CONSTCOND*/0) + +#define SLIST_INSERT_HEAD(head, elm, field) do { \ + (elm)->field.sle_next = (head)->slh_first; \ + (head)->slh_first = (elm); \ +} while (/*CONSTCOND*/0) + +#define SLIST_REMOVE_AFTER(slistelm, field) do { \ + (slistelm)->field.sle_next = \ + SLIST_NEXT(SLIST_NEXT((slistelm), field), field); \ +} while (/*CONSTCOND*/0) + +#define SLIST_REMOVE_HEAD(head, field) do { \ + (head)->slh_first = (head)->slh_first->field.sle_next; \ +} while (/*CONSTCOND*/0) + +#define SLIST_REMOVE(head, elm, type, field) do { \ + if ((head)->slh_first == (elm)) { \ + SLIST_REMOVE_HEAD((head), field); \ + } \ + else { \ + struct type *curelm = (head)->slh_first; \ + while(curelm->field.sle_next != (elm)) \ + curelm = curelm->field.sle_next; \ + curelm->field.sle_next = \ + curelm->field.sle_next->field.sle_next; \ + } \ +} while (/*CONSTCOND*/0) + + +/* + * List definitions. + */ +#define LIST_HEAD(name, type) \ +struct name { \ + struct type *lh_first; /* first element */ \ +} + +#define LIST_HEAD_INITIALIZER(head) \ + { NULL } + +#define LIST_ENTRY(type) \ +struct { \ + struct type *le_next; /* next element */ \ + struct type **le_prev; /* address of previous next element */ \ +} + +/* + * List access methods. + */ +#define LIST_FIRST(head) ((head)->lh_first) +#define LIST_END(head) NULL +#define LIST_EMPTY(head) ((head)->lh_first == LIST_END(head)) +#define LIST_NEXT(elm, field) ((elm)->field.le_next) + +#define LIST_FOREACH(var, head, field) \ + for ((var) = ((head)->lh_first); \ + (var) != LIST_END(head); \ + (var) = ((var)->field.le_next)) + +#define LIST_FOREACH_SAFE(var, head, field, tvar) \ + for ((var) = LIST_FIRST((head)); \ + (var) != LIST_END(head) && \ + ((tvar) = LIST_NEXT((var), field), 1); \ + (var) = (tvar)) + +#define LIST_MOVE(head1, head2) do { \ + LIST_INIT((head2)); \ + if (!LIST_EMPTY((head1))) { \ + (head2)->lh_first = (head1)->lh_first; \ + LIST_INIT((head1)); \ + } \ +} while (/*CONSTCOND*/0) + +/* + * List functions. + */ +#if defined(QUEUEDEBUG) +#define QUEUEDEBUG_LIST_INSERT_HEAD(head, elm, field) \ + if ((head)->lh_first && \ + (head)->lh_first->field.le_prev != &(head)->lh_first) \ + QUEUEDEBUG_ABORT("LIST_INSERT_HEAD %p %s:%d", (head), \ + __FILE__, __LINE__); +#define QUEUEDEBUG_LIST_OP(elm, field) \ + if ((elm)->field.le_next && \ + (elm)->field.le_next->field.le_prev != \ + &(elm)->field.le_next) \ + QUEUEDEBUG_ABORT("LIST_* forw %p %s:%d", (elm), \ + __FILE__, __LINE__); \ + if (*(elm)->field.le_prev != (elm)) \ + QUEUEDEBUG_ABORT("LIST_* back %p %s:%d", (elm), \ + __FILE__, __LINE__); +#define QUEUEDEBUG_LIST_POSTREMOVE(elm, field) \ + (elm)->field.le_next = (void *)1L; \ + (elm)->field.le_prev = (void *)1L; +#else +#define QUEUEDEBUG_LIST_INSERT_HEAD(head, elm, field) +#define QUEUEDEBUG_LIST_OP(elm, field) +#define QUEUEDEBUG_LIST_POSTREMOVE(elm, field) +#endif + +#define LIST_INIT(head) do { \ + (head)->lh_first = LIST_END(head); \ +} while (/*CONSTCOND*/0) + +#define LIST_INSERT_AFTER(listelm, elm, field) do { \ + QUEUEDEBUG_LIST_OP((listelm), field) \ + if (((elm)->field.le_next = (listelm)->field.le_next) != \ + LIST_END(head)) \ + (listelm)->field.le_next->field.le_prev = \ + &(elm)->field.le_next; \ + (listelm)->field.le_next = (elm); \ + (elm)->field.le_prev = &(listelm)->field.le_next; \ +} while (/*CONSTCOND*/0) + +#define LIST_INSERT_BEFORE(listelm, elm, field) do { \ + QUEUEDEBUG_LIST_OP((listelm), field) \ + (elm)->field.le_prev = (listelm)->field.le_prev; \ + (elm)->field.le_next = (listelm); \ + *(listelm)->field.le_prev = (elm); \ + (listelm)->field.le_prev = &(elm)->field.le_next; \ +} while (/*CONSTCOND*/0) + +#define LIST_INSERT_HEAD(head, elm, field) do { \ + QUEUEDEBUG_LIST_INSERT_HEAD((head), (elm), field) \ + if (((elm)->field.le_next = (head)->lh_first) != LIST_END(head))\ + (head)->lh_first->field.le_prev = &(elm)->field.le_next;\ + (head)->lh_first = (elm); \ + (elm)->field.le_prev = &(head)->lh_first; \ +} while (/*CONSTCOND*/0) + +#define LIST_REMOVE(elm, field) do { \ + QUEUEDEBUG_LIST_OP((elm), field) \ + if ((elm)->field.le_next != NULL) \ + (elm)->field.le_next->field.le_prev = \ + (elm)->field.le_prev; \ + *(elm)->field.le_prev = (elm)->field.le_next; \ + QUEUEDEBUG_LIST_POSTREMOVE((elm), field) \ +} while (/*CONSTCOND*/0) + +#define LIST_REPLACE(elm, elm2, field) do { \ + if (((elm2)->field.le_next = (elm)->field.le_next) != NULL) \ + (elm2)->field.le_next->field.le_prev = \ + &(elm2)->field.le_next; \ + (elm2)->field.le_prev = (elm)->field.le_prev; \ + *(elm2)->field.le_prev = (elm2); \ + QUEUEDEBUG_LIST_POSTREMOVE((elm), field) \ +} while (/*CONSTCOND*/0) + +/* + * Simple queue definitions. + */ +#define SIMPLEQ_HEAD(name, type) \ +struct name { \ + struct type *sqh_first; /* first element */ \ + struct type **sqh_last; /* addr of last next element */ \ +} + +#define SIMPLEQ_HEAD_INITIALIZER(head) \ + { NULL, &(head).sqh_first } + +#define SIMPLEQ_ENTRY(type) \ +struct { \ + struct type *sqe_next; /* next element */ \ +} + +/* + * Simple queue access methods. + */ +#define SIMPLEQ_FIRST(head) ((head)->sqh_first) +#define SIMPLEQ_END(head) NULL +#define SIMPLEQ_EMPTY(head) ((head)->sqh_first == SIMPLEQ_END(head)) +#define SIMPLEQ_NEXT(elm, field) ((elm)->field.sqe_next) + +#define SIMPLEQ_FOREACH(var, head, field) \ + for ((var) = ((head)->sqh_first); \ + (var) != SIMPLEQ_END(head); \ + (var) = ((var)->field.sqe_next)) + +#define SIMPLEQ_FOREACH_SAFE(var, head, field, next) \ + for ((var) = ((head)->sqh_first); \ + (var) != SIMPLEQ_END(head) && \ + ((next = ((var)->field.sqe_next)), 1); \ + (var) = (next)) + +/* + * Simple queue functions. + */ +#define SIMPLEQ_INIT(head) do { \ + (head)->sqh_first = NULL; \ + (head)->sqh_last = &(head)->sqh_first; \ +} while (/*CONSTCOND*/0) + +#define SIMPLEQ_INSERT_HEAD(head, elm, field) do { \ + if (((elm)->field.sqe_next = (head)->sqh_first) == NULL) \ + (head)->sqh_last = &(elm)->field.sqe_next; \ + (head)->sqh_first = (elm); \ +} while (/*CONSTCOND*/0) + +#define SIMPLEQ_INSERT_TAIL(head, elm, field) do { \ + (elm)->field.sqe_next = NULL; \ + *(head)->sqh_last = (elm); \ + (head)->sqh_last = &(elm)->field.sqe_next; \ +} while (/*CONSTCOND*/0) + +#define SIMPLEQ_INSERT_AFTER(head, listelm, elm, field) do { \ + if (((elm)->field.sqe_next = (listelm)->field.sqe_next) == NULL)\ + (head)->sqh_last = &(elm)->field.sqe_next; \ + (listelm)->field.sqe_next = (elm); \ +} while (/*CONSTCOND*/0) + +#define SIMPLEQ_REMOVE_HEAD(head, field) do { \ + if (((head)->sqh_first = (head)->sqh_first->field.sqe_next) == NULL) \ + (head)->sqh_last = &(head)->sqh_first; \ +} while (/*CONSTCOND*/0) + +#define SIMPLEQ_REMOVE_AFTER(head, elm, field) do { \ + if (((elm)->field.sqe_next = (elm)->field.sqe_next->field.sqe_next) \ + == NULL) \ + (head)->sqh_last = &(elm)->field.sqe_next; \ +} while (/*CONSTCOND*/0) + +#define SIMPLEQ_REMOVE(head, elm, type, field) do { \ + if ((head)->sqh_first == (elm)) { \ + SIMPLEQ_REMOVE_HEAD((head), field); \ + } else { \ + struct type *curelm = (head)->sqh_first; \ + while (curelm->field.sqe_next != (elm)) \ + curelm = curelm->field.sqe_next; \ + if ((curelm->field.sqe_next = \ + curelm->field.sqe_next->field.sqe_next) == NULL) \ + (head)->sqh_last = &(curelm)->field.sqe_next; \ + } \ +} while (/*CONSTCOND*/0) + +#define SIMPLEQ_CONCAT(head1, head2) do { \ + if (!SIMPLEQ_EMPTY((head2))) { \ + *(head1)->sqh_last = (head2)->sqh_first; \ + (head1)->sqh_last = (head2)->sqh_last; \ + SIMPLEQ_INIT((head2)); \ + } \ +} while (/*CONSTCOND*/0) + +#define SIMPLEQ_LAST(head, type, field) \ + (SIMPLEQ_EMPTY((head)) ? \ + NULL : \ + ((struct type *)(void *) \ + ((char *)((head)->sqh_last) - offsetof(struct type, field)))) + +/* + * Tail queue definitions. + */ +#define _TAILQ_HEAD(name, type, qual) \ +struct name { \ + qual type *tqh_first; /* first element */ \ + qual type *qual *tqh_last; /* addr of last next element */ \ +} +#define TAILQ_HEAD(name, type) _TAILQ_HEAD(name, struct type,) + +#define TAILQ_HEAD_INITIALIZER(head) \ + { TAILQ_END(head), &(head).tqh_first } + +#define _TAILQ_ENTRY(type, qual) \ +struct { \ + qual type *tqe_next; /* next element */ \ + qual type *qual *tqe_prev; /* address of previous next element */\ +} +#define TAILQ_ENTRY(type) _TAILQ_ENTRY(struct type,) + +/* + * Tail queue access methods. + */ +#define TAILQ_FIRST(head) ((head)->tqh_first) +#define TAILQ_END(head) (NULL) +#define TAILQ_NEXT(elm, field) ((elm)->field.tqe_next) +#define TAILQ_LAST(head, headname) \ + (*(((struct headname *)((head)->tqh_last))->tqh_last)) +#define TAILQ_PREV(elm, headname, field) \ + (*(((struct headname *)((elm)->field.tqe_prev))->tqh_last)) +#define TAILQ_EMPTY(head) (TAILQ_FIRST(head) == TAILQ_END(head)) + + +#define TAILQ_FOREACH(var, head, field) \ + for ((var) = ((head)->tqh_first); \ + (var) != TAILQ_END(head); \ + (var) = ((var)->field.tqe_next)) + +#define TAILQ_FOREACH_SAFE(var, head, field, next) \ + for ((var) = ((head)->tqh_first); \ + (var) != TAILQ_END(head) && \ + ((next) = TAILQ_NEXT(var, field), 1); (var) = (next)) + +#define TAILQ_FOREACH_REVERSE(var, head, headname, field) \ + for ((var) = (*(((struct headname *)((head)->tqh_last))->tqh_last));\ + (var) != TAILQ_END(head); \ + (var) = (*(((struct headname *)((var)->field.tqe_prev))->tqh_last))) + +#define TAILQ_FOREACH_REVERSE_SAFE(var, head, headname, field, prev) \ + for ((var) = TAILQ_LAST((head), headname); \ + (var) != TAILQ_END(head) && \ + ((prev) = TAILQ_PREV((var), headname, field), 1); (var) = (prev)) + +/* + * Tail queue functions. + */ +#if defined(QUEUEDEBUG) +#define QUEUEDEBUG_TAILQ_INSERT_HEAD(head, elm, field) \ + if ((head)->tqh_first && \ + (head)->tqh_first->field.tqe_prev != &(head)->tqh_first) \ + QUEUEDEBUG_ABORT("TAILQ_INSERT_HEAD %p %s:%d", (head), \ + __FILE__, __LINE__); +#define QUEUEDEBUG_TAILQ_INSERT_TAIL(head, elm, field) \ + if (*(head)->tqh_last != NULL) \ + QUEUEDEBUG_ABORT("TAILQ_INSERT_TAIL %p %s:%d", (head), \ + __FILE__, __LINE__); +#define QUEUEDEBUG_TAILQ_OP(elm, field) \ + if ((elm)->field.tqe_next && \ + (elm)->field.tqe_next->field.tqe_prev != \ + &(elm)->field.tqe_next) \ + QUEUEDEBUG_ABORT("TAILQ_* forw %p %s:%d", (elm), \ + __FILE__, __LINE__); \ + if (*(elm)->field.tqe_prev != (elm)) \ + QUEUEDEBUG_ABORT("TAILQ_* back %p %s:%d", (elm), \ + __FILE__, __LINE__); +#define QUEUEDEBUG_TAILQ_PREREMOVE(head, elm, field) \ + if ((elm)->field.tqe_next == NULL && \ + (head)->tqh_last != &(elm)->field.tqe_next) \ + QUEUEDEBUG_ABORT("TAILQ_PREREMOVE head %p elm %p %s:%d",\ + (head), (elm), __FILE__, __LINE__); +#define QUEUEDEBUG_TAILQ_POSTREMOVE(elm, field) \ + (elm)->field.tqe_next = (void *)1L; \ + (elm)->field.tqe_prev = (void *)1L; +#else +#define QUEUEDEBUG_TAILQ_INSERT_HEAD(head, elm, field) +#define QUEUEDEBUG_TAILQ_INSERT_TAIL(head, elm, field) +#define QUEUEDEBUG_TAILQ_OP(elm, field) +#define QUEUEDEBUG_TAILQ_PREREMOVE(head, elm, field) +#define QUEUEDEBUG_TAILQ_POSTREMOVE(elm, field) +#endif + +#define TAILQ_INIT(head) do { \ + (head)->tqh_first = TAILQ_END(head); \ + (head)->tqh_last = &(head)->tqh_first; \ +} while (/*CONSTCOND*/0) + +#define TAILQ_INSERT_HEAD(head, elm, field) do { \ + QUEUEDEBUG_TAILQ_INSERT_HEAD((head), (elm), field) \ + if (((elm)->field.tqe_next = (head)->tqh_first) != TAILQ_END(head))\ + (head)->tqh_first->field.tqe_prev = \ + &(elm)->field.tqe_next; \ + else \ + (head)->tqh_last = &(elm)->field.tqe_next; \ + (head)->tqh_first = (elm); \ + (elm)->field.tqe_prev = &(head)->tqh_first; \ +} while (/*CONSTCOND*/0) + +#define TAILQ_INSERT_TAIL(head, elm, field) do { \ + QUEUEDEBUG_TAILQ_INSERT_TAIL((head), (elm), field) \ + (elm)->field.tqe_next = TAILQ_END(head); \ + (elm)->field.tqe_prev = (head)->tqh_last; \ + *(head)->tqh_last = (elm); \ + (head)->tqh_last = &(elm)->field.tqe_next; \ +} while (/*CONSTCOND*/0) + +#define TAILQ_INSERT_AFTER(head, listelm, elm, field) do { \ + QUEUEDEBUG_TAILQ_OP((listelm), field) \ + if (((elm)->field.tqe_next = (listelm)->field.tqe_next) != \ + TAILQ_END(head)) \ + (elm)->field.tqe_next->field.tqe_prev = \ + &(elm)->field.tqe_next; \ + else \ + (head)->tqh_last = &(elm)->field.tqe_next; \ + (listelm)->field.tqe_next = (elm); \ + (elm)->field.tqe_prev = &(listelm)->field.tqe_next; \ +} while (/*CONSTCOND*/0) + +#define TAILQ_INSERT_BEFORE(listelm, elm, field) do { \ + QUEUEDEBUG_TAILQ_OP((listelm), field) \ + (elm)->field.tqe_prev = (listelm)->field.tqe_prev; \ + (elm)->field.tqe_next = (listelm); \ + *(listelm)->field.tqe_prev = (elm); \ + (listelm)->field.tqe_prev = &(elm)->field.tqe_next; \ +} while (/*CONSTCOND*/0) + +#define TAILQ_REMOVE(head, elm, field) do { \ + QUEUEDEBUG_TAILQ_PREREMOVE((head), (elm), field) \ + QUEUEDEBUG_TAILQ_OP((elm), field) \ + if (((elm)->field.tqe_next) != TAILQ_END(head)) \ + (elm)->field.tqe_next->field.tqe_prev = \ + (elm)->field.tqe_prev; \ + else \ + (head)->tqh_last = (elm)->field.tqe_prev; \ + *(elm)->field.tqe_prev = (elm)->field.tqe_next; \ + QUEUEDEBUG_TAILQ_POSTREMOVE((elm), field); \ +} while (/*CONSTCOND*/0) + +#define TAILQ_REPLACE(head, elm, elm2, field) do { \ + if (((elm2)->field.tqe_next = (elm)->field.tqe_next) != \ + TAILQ_END(head)) \ + (elm2)->field.tqe_next->field.tqe_prev = \ + &(elm2)->field.tqe_next; \ + else \ + (head)->tqh_last = &(elm2)->field.tqe_next; \ + (elm2)->field.tqe_prev = (elm)->field.tqe_prev; \ + *(elm2)->field.tqe_prev = (elm2); \ + QUEUEDEBUG_TAILQ_POSTREMOVE((elm), field); \ +} while (/*CONSTCOND*/0) + +#define TAILQ_CONCAT(head1, head2, field) do { \ + if (!TAILQ_EMPTY(head2)) { \ + *(head1)->tqh_last = (head2)->tqh_first; \ + (head2)->tqh_first->field.tqe_prev = (head1)->tqh_last; \ + (head1)->tqh_last = (head2)->tqh_last; \ + TAILQ_INIT((head2)); \ + } \ +} while (/*CONSTCOND*/0) + +/* + * Singly-linked Tail queue declarations. + */ +#define STAILQ_HEAD(name, type) \ +struct name { \ + struct type *stqh_first; /* first element */ \ + struct type **stqh_last; /* addr of last next element */ \ +} + +#define STAILQ_HEAD_INITIALIZER(head) \ + { NULL, &(head).stqh_first } + +#define STAILQ_ENTRY(type) \ +struct { \ + struct type *stqe_next; /* next element */ \ +} + +/* + * Singly-linked Tail queue access methods. + */ +#define STAILQ_FIRST(head) ((head)->stqh_first) +#define STAILQ_END(head) NULL +#define STAILQ_NEXT(elm, field) ((elm)->field.stqe_next) +#define STAILQ_EMPTY(head) (STAILQ_FIRST(head) == STAILQ_END(head)) + +/* + * Singly-linked Tail queue functions. + */ +#define STAILQ_INIT(head) do { \ + (head)->stqh_first = NULL; \ + (head)->stqh_last = &(head)->stqh_first; \ +} while (/*CONSTCOND*/0) + +#define STAILQ_INSERT_HEAD(head, elm, field) do { \ + if (((elm)->field.stqe_next = (head)->stqh_first) == NULL) \ + (head)->stqh_last = &(elm)->field.stqe_next; \ + (head)->stqh_first = (elm); \ +} while (/*CONSTCOND*/0) + +#define STAILQ_INSERT_TAIL(head, elm, field) do { \ + (elm)->field.stqe_next = NULL; \ + *(head)->stqh_last = (elm); \ + (head)->stqh_last = &(elm)->field.stqe_next; \ +} while (/*CONSTCOND*/0) + +#define STAILQ_INSERT_AFTER(head, listelm, elm, field) do { \ + if (((elm)->field.stqe_next = (listelm)->field.stqe_next) == NULL)\ + (head)->stqh_last = &(elm)->field.stqe_next; \ + (listelm)->field.stqe_next = (elm); \ +} while (/*CONSTCOND*/0) + +#define STAILQ_REMOVE_HEAD(head, field) do { \ + if (((head)->stqh_first = (head)->stqh_first->field.stqe_next) == NULL) \ + (head)->stqh_last = &(head)->stqh_first; \ +} while (/*CONSTCOND*/0) + +#define STAILQ_REMOVE(head, elm, type, field) do { \ + if ((head)->stqh_first == (elm)) { \ + STAILQ_REMOVE_HEAD((head), field); \ + } else { \ + struct type *curelm = (head)->stqh_first; \ + while (curelm->field.stqe_next != (elm)) \ + curelm = curelm->field.stqe_next; \ + if ((curelm->field.stqe_next = \ + curelm->field.stqe_next->field.stqe_next) == NULL) \ + (head)->stqh_last = &(curelm)->field.stqe_next; \ + } \ +} while (/*CONSTCOND*/0) + +#define STAILQ_FOREACH(var, head, field) \ + for ((var) = ((head)->stqh_first); \ + (var); \ + (var) = ((var)->field.stqe_next)) + +#define STAILQ_FOREACH_SAFE(var, head, field, tvar) \ + for ((var) = STAILQ_FIRST((head)); \ + (var) && ((tvar) = STAILQ_NEXT((var), field), 1); \ + (var) = (tvar)) + +#define STAILQ_CONCAT(head1, head2) do { \ + if (!STAILQ_EMPTY((head2))) { \ + *(head1)->stqh_last = (head2)->stqh_first; \ + (head1)->stqh_last = (head2)->stqh_last; \ + STAILQ_INIT((head2)); \ + } \ +} while (/*CONSTCOND*/0) + +#define STAILQ_LAST(head, type, field) \ + (STAILQ_EMPTY((head)) ? \ + NULL : \ + ((struct type *)(void *) \ + ((char *)((head)->stqh_last) - offsetof(struct type, field)))) + + +#ifndef _KERNEL +/* + * Circular queue definitions. Do not use. We still keep the macros + * for compatibility but because of pointer aliasing issues their use + * is discouraged! + */ + +/* + * __launder_type(): We use this ugly hack to work around the the compiler + * noticing that two types may not alias each other and elide tests in code. + * We hit this in the CIRCLEQ macros when comparing 'struct name *' and + * 'struct type *' (see CIRCLEQ_HEAD()). Modern compilers (such as GCC + * 4.8) declare these comparisons as always false, causing the code to + * not run as designed. + * + * This hack is only to be used for comparisons and thus can be fully const. + * Do not use for assignment. + * + * If we ever choose to change the ABI of the CIRCLEQ macros, we could fix + * this by changing the head/tail sentinal values, but see the note above + * this one. + */ +static __inline const void * __launder_type(const void *); +static __inline const void * +__launder_type(const void *__x) +{ + __asm __volatile("" : "+r" (__x)); + return __x; +} + +#if defined(QUEUEDEBUG) +#define QUEUEDEBUG_CIRCLEQ_HEAD(head, field) \ + if ((head)->cqh_first != CIRCLEQ_ENDC(head) && \ + (head)->cqh_first->field.cqe_prev != CIRCLEQ_ENDC(head)) \ + QUEUEDEBUG_ABORT("CIRCLEQ head forw %p %s:%d", (head), \ + __FILE__, __LINE__); \ + if ((head)->cqh_last != CIRCLEQ_ENDC(head) && \ + (head)->cqh_last->field.cqe_next != CIRCLEQ_ENDC(head)) \ + QUEUEDEBUG_ABORT("CIRCLEQ head back %p %s:%d", (head), \ + __FILE__, __LINE__); +#define QUEUEDEBUG_CIRCLEQ_ELM(head, elm, field) \ + if ((elm)->field.cqe_next == CIRCLEQ_ENDC(head)) { \ + if ((head)->cqh_last != (elm)) \ + QUEUEDEBUG_ABORT("CIRCLEQ elm last %p %s:%d", \ + (elm), __FILE__, __LINE__); \ + } else { \ + if ((elm)->field.cqe_next->field.cqe_prev != (elm)) \ + QUEUEDEBUG_ABORT("CIRCLEQ elm forw %p %s:%d", \ + (elm), __FILE__, __LINE__); \ + } \ + if ((elm)->field.cqe_prev == CIRCLEQ_ENDC(head)) { \ + if ((head)->cqh_first != (elm)) \ + QUEUEDEBUG_ABORT("CIRCLEQ elm first %p %s:%d", \ + (elm), __FILE__, __LINE__); \ + } else { \ + if ((elm)->field.cqe_prev->field.cqe_next != (elm)) \ + QUEUEDEBUG_ABORT("CIRCLEQ elm prev %p %s:%d", \ + (elm), __FILE__, __LINE__); \ + } +#define QUEUEDEBUG_CIRCLEQ_POSTREMOVE(elm, field) \ + (elm)->field.cqe_next = (void *)1L; \ + (elm)->field.cqe_prev = (void *)1L; +#else +#define QUEUEDEBUG_CIRCLEQ_HEAD(head, field) +#define QUEUEDEBUG_CIRCLEQ_ELM(head, elm, field) +#define QUEUEDEBUG_CIRCLEQ_POSTREMOVE(elm, field) +#endif + +#define CIRCLEQ_HEAD(name, type) \ +struct name { \ + struct type *cqh_first; /* first element */ \ + struct type *cqh_last; /* last element */ \ +} + +#define CIRCLEQ_HEAD_INITIALIZER(head) \ + { CIRCLEQ_END(&head), CIRCLEQ_END(&head) } + +#define CIRCLEQ_ENTRY(type) \ +struct { \ + struct type *cqe_next; /* next element */ \ + struct type *cqe_prev; /* previous element */ \ +} + +/* + * Circular queue functions. + */ +#define CIRCLEQ_INIT(head) do { \ + (head)->cqh_first = CIRCLEQ_END(head); \ + (head)->cqh_last = CIRCLEQ_END(head); \ +} while (/*CONSTCOND*/0) + +#define CIRCLEQ_INSERT_AFTER(head, listelm, elm, field) do { \ + QUEUEDEBUG_CIRCLEQ_HEAD((head), field) \ + QUEUEDEBUG_CIRCLEQ_ELM((head), (listelm), field) \ + (elm)->field.cqe_next = (listelm)->field.cqe_next; \ + (elm)->field.cqe_prev = (listelm); \ + if ((listelm)->field.cqe_next == CIRCLEQ_ENDC(head)) \ + (head)->cqh_last = (elm); \ + else \ + (listelm)->field.cqe_next->field.cqe_prev = (elm); \ + (listelm)->field.cqe_next = (elm); \ +} while (/*CONSTCOND*/0) + +#define CIRCLEQ_INSERT_BEFORE(head, listelm, elm, field) do { \ + QUEUEDEBUG_CIRCLEQ_HEAD((head), field) \ + QUEUEDEBUG_CIRCLEQ_ELM((head), (listelm), field) \ + (elm)->field.cqe_next = (listelm); \ + (elm)->field.cqe_prev = (listelm)->field.cqe_prev; \ + if ((listelm)->field.cqe_prev == CIRCLEQ_ENDC(head)) \ + (head)->cqh_first = (elm); \ + else \ + (listelm)->field.cqe_prev->field.cqe_next = (elm); \ + (listelm)->field.cqe_prev = (elm); \ +} while (/*CONSTCOND*/0) + +#define CIRCLEQ_INSERT_HEAD(head, elm, field) do { \ + QUEUEDEBUG_CIRCLEQ_HEAD((head), field) \ + (elm)->field.cqe_next = (head)->cqh_first; \ + (elm)->field.cqe_prev = CIRCLEQ_END(head); \ + if ((head)->cqh_last == CIRCLEQ_ENDC(head)) \ + (head)->cqh_last = (elm); \ + else \ + (head)->cqh_first->field.cqe_prev = (elm); \ + (head)->cqh_first = (elm); \ +} while (/*CONSTCOND*/0) + +#define CIRCLEQ_INSERT_TAIL(head, elm, field) do { \ + QUEUEDEBUG_CIRCLEQ_HEAD((head), field) \ + (elm)->field.cqe_next = CIRCLEQ_END(head); \ + (elm)->field.cqe_prev = (head)->cqh_last; \ + if ((head)->cqh_first == CIRCLEQ_ENDC(head)) \ + (head)->cqh_first = (elm); \ + else \ + (head)->cqh_last->field.cqe_next = (elm); \ + (head)->cqh_last = (elm); \ +} while (/*CONSTCOND*/0) + +#define CIRCLEQ_REMOVE(head, elm, field) do { \ + QUEUEDEBUG_CIRCLEQ_HEAD((head), field) \ + QUEUEDEBUG_CIRCLEQ_ELM((head), (elm), field) \ + if ((elm)->field.cqe_next == CIRCLEQ_ENDC(head)) \ + (head)->cqh_last = (elm)->field.cqe_prev; \ + else \ + (elm)->field.cqe_next->field.cqe_prev = \ + (elm)->field.cqe_prev; \ + if ((elm)->field.cqe_prev == CIRCLEQ_ENDC(head)) \ + (head)->cqh_first = (elm)->field.cqe_next; \ + else \ + (elm)->field.cqe_prev->field.cqe_next = \ + (elm)->field.cqe_next; \ + QUEUEDEBUG_CIRCLEQ_POSTREMOVE((elm), field) \ +} while (/*CONSTCOND*/0) + +#define CIRCLEQ_FOREACH(var, head, field) \ + for ((var) = ((head)->cqh_first); \ + (var) != CIRCLEQ_ENDC(head); \ + (var) = ((var)->field.cqe_next)) + +#define CIRCLEQ_FOREACH_REVERSE(var, head, field) \ + for ((var) = ((head)->cqh_last); \ + (var) != CIRCLEQ_ENDC(head); \ + (var) = ((var)->field.cqe_prev)) + +/* + * Circular queue access methods. + */ +#define CIRCLEQ_FIRST(head) ((head)->cqh_first) +#define CIRCLEQ_LAST(head) ((head)->cqh_last) +/* For comparisons */ +#define CIRCLEQ_ENDC(head) (__launder_type(head)) +/* For assignments */ +#define CIRCLEQ_END(head) ((void *)(head)) +#define CIRCLEQ_NEXT(elm, field) ((elm)->field.cqe_next) +#define CIRCLEQ_PREV(elm, field) ((elm)->field.cqe_prev) +#define CIRCLEQ_EMPTY(head) \ + (CIRCLEQ_FIRST(head) == CIRCLEQ_ENDC(head)) + +#define CIRCLEQ_LOOP_NEXT(head, elm, field) \ + (((elm)->field.cqe_next == CIRCLEQ_ENDC(head)) \ + ? ((head)->cqh_first) \ + : (elm->field.cqe_next)) +#define CIRCLEQ_LOOP_PREV(head, elm, field) \ + (((elm)->field.cqe_prev == CIRCLEQ_ENDC(head)) \ + ? ((head)->cqh_last) \ + : (elm->field.cqe_prev)) +#endif /* !_KERNEL */ + +#endif /* !_SYS_QUEUE_H_ */ diff --git a/yocto-poky/meta/recipes-core/bsd-headers/bsd-headers/sys-tree.h b/yocto-poky/meta/recipes-core/bsd-headers/bsd-headers/sys-tree.h new file mode 100644 index 000000000..eaea56aae --- /dev/null +++ b/yocto-poky/meta/recipes-core/bsd-headers/bsd-headers/sys-tree.h @@ -0,0 +1,761 @@ +/* $NetBSD: tree.h,v 1.20 2013/09/14 13:20:45 joerg Exp $ */ +/* $OpenBSD: tree.h,v 1.13 2011/07/09 00:19:45 pirofti Exp $ */ +/* + * Copyright 2002 Niels Provos <provos@citi.umich.edu> + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef _SYS_TREE_H_ +#define _SYS_TREE_H_ + +/* + * This file defines data structures for different types of trees: + * splay trees and red-black trees. + * + * A splay tree is a self-organizing data structure. Every operation + * on the tree causes a splay to happen. The splay moves the requested + * node to the root of the tree and partly rebalances it. + * + * This has the benefit that request locality causes faster lookups as + * the requested nodes move to the top of the tree. On the other hand, + * every lookup causes memory writes. + * + * The Balance Theorem bounds the total access time for m operations + * and n inserts on an initially empty tree as O((m + n)lg n). The + * amortized cost for a sequence of m accesses to a splay tree is O(lg n); + * + * A red-black tree is a binary search tree with the node color as an + * extra attribute. It fulfills a set of conditions: + * - every search path from the root to a leaf consists of the + * same number of black nodes, + * - each red node (except for the root) has a black parent, + * - each leaf node is black. + * + * Every operation on a red-black tree is bounded as O(lg n). + * The maximum height of a red-black tree is 2lg (n+1). + */ + +#define SPLAY_HEAD(name, type) \ +struct name { \ + struct type *sph_root; /* root of the tree */ \ +} + +#define SPLAY_INITIALIZER(root) \ + { NULL } + +#define SPLAY_INIT(root) do { \ + (root)->sph_root = NULL; \ +} while (/*CONSTCOND*/ 0) + +#define SPLAY_ENTRY(type) \ +struct { \ + struct type *spe_left; /* left element */ \ + struct type *spe_right; /* right element */ \ +} + +#define SPLAY_LEFT(elm, field) (elm)->field.spe_left +#define SPLAY_RIGHT(elm, field) (elm)->field.spe_right +#define SPLAY_ROOT(head) (head)->sph_root +#define SPLAY_EMPTY(head) (SPLAY_ROOT(head) == NULL) + +/* SPLAY_ROTATE_{LEFT,RIGHT} expect that tmp hold SPLAY_{RIGHT,LEFT} */ +#define SPLAY_ROTATE_RIGHT(head, tmp, field) do { \ + SPLAY_LEFT((head)->sph_root, field) = SPLAY_RIGHT(tmp, field); \ + SPLAY_RIGHT(tmp, field) = (head)->sph_root; \ + (head)->sph_root = tmp; \ +} while (/*CONSTCOND*/ 0) + +#define SPLAY_ROTATE_LEFT(head, tmp, field) do { \ + SPLAY_RIGHT((head)->sph_root, field) = SPLAY_LEFT(tmp, field); \ + SPLAY_LEFT(tmp, field) = (head)->sph_root; \ + (head)->sph_root = tmp; \ +} while (/*CONSTCOND*/ 0) + +#define SPLAY_LINKLEFT(head, tmp, field) do { \ + SPLAY_LEFT(tmp, field) = (head)->sph_root; \ + tmp = (head)->sph_root; \ + (head)->sph_root = SPLAY_LEFT((head)->sph_root, field); \ +} while (/*CONSTCOND*/ 0) + +#define SPLAY_LINKRIGHT(head, tmp, field) do { \ + SPLAY_RIGHT(tmp, field) = (head)->sph_root; \ + tmp = (head)->sph_root; \ + (head)->sph_root = SPLAY_RIGHT((head)->sph_root, field); \ +} while (/*CONSTCOND*/ 0) + +#define SPLAY_ASSEMBLE(head, node, left, right, field) do { \ + SPLAY_RIGHT(left, field) = SPLAY_LEFT((head)->sph_root, field); \ + SPLAY_LEFT(right, field) = SPLAY_RIGHT((head)->sph_root, field);\ + SPLAY_LEFT((head)->sph_root, field) = SPLAY_RIGHT(node, field); \ + SPLAY_RIGHT((head)->sph_root, field) = SPLAY_LEFT(node, field); \ +} while (/*CONSTCOND*/ 0) + +/* Generates prototypes and inline functions */ + +#define SPLAY_PROTOTYPE(name, type, field, cmp) \ +void name##_SPLAY(struct name *, struct type *); \ +void name##_SPLAY_MINMAX(struct name *, int); \ +struct type *name##_SPLAY_INSERT(struct name *, struct type *); \ +struct type *name##_SPLAY_REMOVE(struct name *, struct type *); \ + \ +/* Finds the node with the same key as elm */ \ +static __inline struct type * \ +name##_SPLAY_FIND(struct name *head, struct type *elm) \ +{ \ + if (SPLAY_EMPTY(head)) \ + return(NULL); \ + name##_SPLAY(head, elm); \ + if ((cmp)(elm, (head)->sph_root) == 0) \ + return (head->sph_root); \ + return (NULL); \ +} \ + \ +static __inline __unused struct type * \ +name##_SPLAY_NEXT(struct name *head, struct type *elm) \ +{ \ + name##_SPLAY(head, elm); \ + if (SPLAY_RIGHT(elm, field) != NULL) { \ + elm = SPLAY_RIGHT(elm, field); \ + while (SPLAY_LEFT(elm, field) != NULL) { \ + elm = SPLAY_LEFT(elm, field); \ + } \ + } else \ + elm = NULL; \ + return (elm); \ +} \ + \ +static __unused __inline struct type * \ +name##_SPLAY_MIN_MAX(struct name *head, int val) \ +{ \ + name##_SPLAY_MINMAX(head, val); \ + return (SPLAY_ROOT(head)); \ +} + +/* Main splay operation. + * Moves node close to the key of elm to top + */ +#define SPLAY_GENERATE(name, type, field, cmp) \ +struct type * \ +name##_SPLAY_INSERT(struct name *head, struct type *elm) \ +{ \ + if (SPLAY_EMPTY(head)) { \ + SPLAY_LEFT(elm, field) = SPLAY_RIGHT(elm, field) = NULL; \ + } else { \ + int __comp; \ + name##_SPLAY(head, elm); \ + __comp = (cmp)(elm, (head)->sph_root); \ + if(__comp < 0) { \ + SPLAY_LEFT(elm, field) = SPLAY_LEFT((head)->sph_root, field);\ + SPLAY_RIGHT(elm, field) = (head)->sph_root; \ + SPLAY_LEFT((head)->sph_root, field) = NULL; \ + } else if (__comp > 0) { \ + SPLAY_RIGHT(elm, field) = SPLAY_RIGHT((head)->sph_root, field);\ + SPLAY_LEFT(elm, field) = (head)->sph_root; \ + SPLAY_RIGHT((head)->sph_root, field) = NULL; \ + } else \ + return ((head)->sph_root); \ + } \ + (head)->sph_root = (elm); \ + return (NULL); \ +} \ + \ +struct type * \ +name##_SPLAY_REMOVE(struct name *head, struct type *elm) \ +{ \ + struct type *__tmp; \ + if (SPLAY_EMPTY(head)) \ + return (NULL); \ + name##_SPLAY(head, elm); \ + if ((cmp)(elm, (head)->sph_root) == 0) { \ + if (SPLAY_LEFT((head)->sph_root, field) == NULL) { \ + (head)->sph_root = SPLAY_RIGHT((head)->sph_root, field);\ + } else { \ + __tmp = SPLAY_RIGHT((head)->sph_root, field); \ + (head)->sph_root = SPLAY_LEFT((head)->sph_root, field);\ + name##_SPLAY(head, elm); \ + SPLAY_RIGHT((head)->sph_root, field) = __tmp; \ + } \ + return (elm); \ + } \ + return (NULL); \ +} \ + \ +void \ +name##_SPLAY(struct name *head, struct type *elm) \ +{ \ + struct type __node, *__left, *__right, *__tmp; \ + int __comp; \ +\ + SPLAY_LEFT(&__node, field) = SPLAY_RIGHT(&__node, field) = NULL;\ + __left = __right = &__node; \ +\ + while ((__comp = (cmp)(elm, (head)->sph_root)) != 0) { \ + if (__comp < 0) { \ + __tmp = SPLAY_LEFT((head)->sph_root, field); \ + if (__tmp == NULL) \ + break; \ + if ((cmp)(elm, __tmp) < 0){ \ + SPLAY_ROTATE_RIGHT(head, __tmp, field); \ + if (SPLAY_LEFT((head)->sph_root, field) == NULL)\ + break; \ + } \ + SPLAY_LINKLEFT(head, __right, field); \ + } else if (__comp > 0) { \ + __tmp = SPLAY_RIGHT((head)->sph_root, field); \ + if (__tmp == NULL) \ + break; \ + if ((cmp)(elm, __tmp) > 0){ \ + SPLAY_ROTATE_LEFT(head, __tmp, field); \ + if (SPLAY_RIGHT((head)->sph_root, field) == NULL)\ + break; \ + } \ + SPLAY_LINKRIGHT(head, __left, field); \ + } \ + } \ + SPLAY_ASSEMBLE(head, &__node, __left, __right, field); \ +} \ + \ +/* Splay with either the minimum or the maximum element \ + * Used to find minimum or maximum element in tree. \ + */ \ +void name##_SPLAY_MINMAX(struct name *head, int __comp) \ +{ \ + struct type __node, *__left, *__right, *__tmp; \ +\ + SPLAY_LEFT(&__node, field) = SPLAY_RIGHT(&__node, field) = NULL;\ + __left = __right = &__node; \ +\ + while (1) { \ + if (__comp < 0) { \ + __tmp = SPLAY_LEFT((head)->sph_root, field); \ + if (__tmp == NULL) \ + break; \ + if (__comp < 0){ \ + SPLAY_ROTATE_RIGHT(head, __tmp, field); \ + if (SPLAY_LEFT((head)->sph_root, field) == NULL)\ + break; \ + } \ + SPLAY_LINKLEFT(head, __right, field); \ + } else if (__comp > 0) { \ + __tmp = SPLAY_RIGHT((head)->sph_root, field); \ + if (__tmp == NULL) \ + break; \ + if (__comp > 0) { \ + SPLAY_ROTATE_LEFT(head, __tmp, field); \ + if (SPLAY_RIGHT((head)->sph_root, field) == NULL)\ + break; \ + } \ + SPLAY_LINKRIGHT(head, __left, field); \ + } \ + } \ + SPLAY_ASSEMBLE(head, &__node, __left, __right, field); \ +} + +#define SPLAY_NEGINF -1 +#define SPLAY_INF 1 + +#define SPLAY_INSERT(name, x, y) name##_SPLAY_INSERT(x, y) +#define SPLAY_REMOVE(name, x, y) name##_SPLAY_REMOVE(x, y) +#define SPLAY_FIND(name, x, y) name##_SPLAY_FIND(x, y) +#define SPLAY_NEXT(name, x, y) name##_SPLAY_NEXT(x, y) +#define SPLAY_MIN(name, x) (SPLAY_EMPTY(x) ? NULL \ + : name##_SPLAY_MIN_MAX(x, SPLAY_NEGINF)) +#define SPLAY_MAX(name, x) (SPLAY_EMPTY(x) ? NULL \ + : name##_SPLAY_MIN_MAX(x, SPLAY_INF)) + +#define SPLAY_FOREACH(x, name, head) \ + for ((x) = SPLAY_MIN(name, head); \ + (x) != NULL; \ + (x) = SPLAY_NEXT(name, head, x)) + +/* Macros that define a red-black tree */ +#define RB_HEAD(name, type) \ +struct name { \ + struct type *rbh_root; /* root of the tree */ \ +} + +#define RB_INITIALIZER(root) \ + { NULL } + +#define RB_INIT(root) do { \ + (root)->rbh_root = NULL; \ +} while (/*CONSTCOND*/ 0) + +#define RB_BLACK 0 +#define RB_RED 1 +#define RB_ENTRY(type) \ +struct { \ + struct type *rbe_left; /* left element */ \ + struct type *rbe_right; /* right element */ \ + struct type *rbe_parent; /* parent element */ \ + int rbe_color; /* node color */ \ +} + +#define RB_LEFT(elm, field) (elm)->field.rbe_left +#define RB_RIGHT(elm, field) (elm)->field.rbe_right +#define RB_PARENT(elm, field) (elm)->field.rbe_parent +#define RB_COLOR(elm, field) (elm)->field.rbe_color +#define RB_ROOT(head) (head)->rbh_root +#define RB_EMPTY(head) (RB_ROOT(head) == NULL) + +#define RB_SET(elm, parent, field) do { \ + RB_PARENT(elm, field) = parent; \ + RB_LEFT(elm, field) = RB_RIGHT(elm, field) = NULL; \ + RB_COLOR(elm, field) = RB_RED; \ +} while (/*CONSTCOND*/ 0) + +#define RB_SET_BLACKRED(black, red, field) do { \ + RB_COLOR(black, field) = RB_BLACK; \ + RB_COLOR(red, field) = RB_RED; \ +} while (/*CONSTCOND*/ 0) + +#ifndef RB_AUGMENT +#define RB_AUGMENT(x) do {} while (/*CONSTCOND*/ 0) +#endif + +#define RB_ROTATE_LEFT(head, elm, tmp, field) do { \ + (tmp) = RB_RIGHT(elm, field); \ + if ((RB_RIGHT(elm, field) = RB_LEFT(tmp, field)) != NULL) { \ + RB_PARENT(RB_LEFT(tmp, field), field) = (elm); \ + } \ + RB_AUGMENT(elm); \ + if ((RB_PARENT(tmp, field) = RB_PARENT(elm, field)) != NULL) { \ + if ((elm) == RB_LEFT(RB_PARENT(elm, field), field)) \ + RB_LEFT(RB_PARENT(elm, field), field) = (tmp); \ + else \ + RB_RIGHT(RB_PARENT(elm, field), field) = (tmp); \ + } else \ + (head)->rbh_root = (tmp); \ + RB_LEFT(tmp, field) = (elm); \ + RB_PARENT(elm, field) = (tmp); \ + RB_AUGMENT(tmp); \ + if ((RB_PARENT(tmp, field))) \ + RB_AUGMENT(RB_PARENT(tmp, field)); \ +} while (/*CONSTCOND*/ 0) + +#define RB_ROTATE_RIGHT(head, elm, tmp, field) do { \ + (tmp) = RB_LEFT(elm, field); \ + if ((RB_LEFT(elm, field) = RB_RIGHT(tmp, field)) != NULL) { \ + RB_PARENT(RB_RIGHT(tmp, field), field) = (elm); \ + } \ + RB_AUGMENT(elm); \ + if ((RB_PARENT(tmp, field) = RB_PARENT(elm, field)) != NULL) { \ + if ((elm) == RB_LEFT(RB_PARENT(elm, field), field)) \ + RB_LEFT(RB_PARENT(elm, field), field) = (tmp); \ + else \ + RB_RIGHT(RB_PARENT(elm, field), field) = (tmp); \ + } else \ + (head)->rbh_root = (tmp); \ + RB_RIGHT(tmp, field) = (elm); \ + RB_PARENT(elm, field) = (tmp); \ + RB_AUGMENT(tmp); \ + if ((RB_PARENT(tmp, field))) \ + RB_AUGMENT(RB_PARENT(tmp, field)); \ +} while (/*CONSTCOND*/ 0) + +/* Generates prototypes and inline functions */ +#define RB_PROTOTYPE(name, type, field, cmp) \ + RB_PROTOTYPE_INTERNAL(name, type, field, cmp,) +#define RB_PROTOTYPE_STATIC(name, type, field, cmp) \ + RB_PROTOTYPE_INTERNAL(name, type, field, cmp, __unused static) +#define RB_PROTOTYPE_INTERNAL(name, type, field, cmp, attr) \ +attr void name##_RB_INSERT_COLOR(struct name *, struct type *); \ +attr void name##_RB_REMOVE_COLOR(struct name *, struct type *, struct type *);\ +attr struct type *name##_RB_REMOVE(struct name *, struct type *); \ +attr struct type *name##_RB_INSERT(struct name *, struct type *); \ +attr struct type *name##_RB_FIND(struct name *, struct type *); \ +attr struct type *name##_RB_NFIND(struct name *, struct type *); \ +attr struct type *name##_RB_NEXT(struct type *); \ +attr struct type *name##_RB_PREV(struct type *); \ +attr struct type *name##_RB_MINMAX(struct name *, int); \ + \ + +/* Main rb operation. + * Moves node close to the key of elm to top + */ +#define RB_GENERATE(name, type, field, cmp) \ + RB_GENERATE_INTERNAL(name, type, field, cmp,) +#define RB_GENERATE_STATIC(name, type, field, cmp) \ + RB_GENERATE_INTERNAL(name, type, field, cmp, __unused static) +#define RB_GENERATE_INTERNAL(name, type, field, cmp, attr) \ +attr void \ +name##_RB_INSERT_COLOR(struct name *head, struct type *elm) \ +{ \ + struct type *parent, *gparent, *tmp; \ + while ((parent = RB_PARENT(elm, field)) != NULL && \ + RB_COLOR(parent, field) == RB_RED) { \ + gparent = RB_PARENT(parent, field); \ + if (parent == RB_LEFT(gparent, field)) { \ + tmp = RB_RIGHT(gparent, field); \ + if (tmp && RB_COLOR(tmp, field) == RB_RED) { \ + RB_COLOR(tmp, field) = RB_BLACK; \ + RB_SET_BLACKRED(parent, gparent, field);\ + elm = gparent; \ + continue; \ + } \ + if (RB_RIGHT(parent, field) == elm) { \ + RB_ROTATE_LEFT(head, parent, tmp, field);\ + tmp = parent; \ + parent = elm; \ + elm = tmp; \ + } \ + RB_SET_BLACKRED(parent, gparent, field); \ + RB_ROTATE_RIGHT(head, gparent, tmp, field); \ + } else { \ + tmp = RB_LEFT(gparent, field); \ + if (tmp && RB_COLOR(tmp, field) == RB_RED) { \ + RB_COLOR(tmp, field) = RB_BLACK; \ + RB_SET_BLACKRED(parent, gparent, field);\ + elm = gparent; \ + continue; \ + } \ + if (RB_LEFT(parent, field) == elm) { \ + RB_ROTATE_RIGHT(head, parent, tmp, field);\ + tmp = parent; \ + parent = elm; \ + elm = tmp; \ + } \ + RB_SET_BLACKRED(parent, gparent, field); \ + RB_ROTATE_LEFT(head, gparent, tmp, field); \ + } \ + } \ + RB_COLOR(head->rbh_root, field) = RB_BLACK; \ +} \ + \ +attr void \ +name##_RB_REMOVE_COLOR(struct name *head, struct type *parent, struct type *elm) \ +{ \ + struct type *tmp; \ + while ((elm == NULL || RB_COLOR(elm, field) == RB_BLACK) && \ + elm != RB_ROOT(head)) { \ + if (RB_LEFT(parent, field) == elm) { \ + tmp = RB_RIGHT(parent, field); \ + if (RB_COLOR(tmp, field) == RB_RED) { \ + RB_SET_BLACKRED(tmp, parent, field); \ + RB_ROTATE_LEFT(head, parent, tmp, field);\ + tmp = RB_RIGHT(parent, field); \ + } \ + if ((RB_LEFT(tmp, field) == NULL || \ + RB_COLOR(RB_LEFT(tmp, field), field) == RB_BLACK) &&\ + (RB_RIGHT(tmp, field) == NULL || \ + RB_COLOR(RB_RIGHT(tmp, field), field) == RB_BLACK)) {\ + RB_COLOR(tmp, field) = RB_RED; \ + elm = parent; \ + parent = RB_PARENT(elm, field); \ + } else { \ + if (RB_RIGHT(tmp, field) == NULL || \ + RB_COLOR(RB_RIGHT(tmp, field), field) == RB_BLACK) {\ + struct type *oleft; \ + if ((oleft = RB_LEFT(tmp, field)) \ + != NULL) \ + RB_COLOR(oleft, field) = RB_BLACK;\ + RB_COLOR(tmp, field) = RB_RED; \ + RB_ROTATE_RIGHT(head, tmp, oleft, field);\ + tmp = RB_RIGHT(parent, field); \ + } \ + RB_COLOR(tmp, field) = RB_COLOR(parent, field);\ + RB_COLOR(parent, field) = RB_BLACK; \ + if (RB_RIGHT(tmp, field)) \ + RB_COLOR(RB_RIGHT(tmp, field), field) = RB_BLACK;\ + RB_ROTATE_LEFT(head, parent, tmp, field);\ + elm = RB_ROOT(head); \ + break; \ + } \ + } else { \ + tmp = RB_LEFT(parent, field); \ + if (RB_COLOR(tmp, field) == RB_RED) { \ + RB_SET_BLACKRED(tmp, parent, field); \ + RB_ROTATE_RIGHT(head, parent, tmp, field);\ + tmp = RB_LEFT(parent, field); \ + } \ + if ((RB_LEFT(tmp, field) == NULL || \ + RB_COLOR(RB_LEFT(tmp, field), field) == RB_BLACK) &&\ + (RB_RIGHT(tmp, field) == NULL || \ + RB_COLOR(RB_RIGHT(tmp, field), field) == RB_BLACK)) {\ + RB_COLOR(tmp, field) = RB_RED; \ + elm = parent; \ + parent = RB_PARENT(elm, field); \ + } else { \ + if (RB_LEFT(tmp, field) == NULL || \ + RB_COLOR(RB_LEFT(tmp, field), field) == RB_BLACK) {\ + struct type *oright; \ + if ((oright = RB_RIGHT(tmp, field)) \ + != NULL) \ + RB_COLOR(oright, field) = RB_BLACK;\ + RB_COLOR(tmp, field) = RB_RED; \ + RB_ROTATE_LEFT(head, tmp, oright, field);\ + tmp = RB_LEFT(parent, field); \ + } \ + RB_COLOR(tmp, field) = RB_COLOR(parent, field);\ + RB_COLOR(parent, field) = RB_BLACK; \ + if (RB_LEFT(tmp, field)) \ + RB_COLOR(RB_LEFT(tmp, field), field) = RB_BLACK;\ + RB_ROTATE_RIGHT(head, parent, tmp, field);\ + elm = RB_ROOT(head); \ + break; \ + } \ + } \ + } \ + if (elm) \ + RB_COLOR(elm, field) = RB_BLACK; \ +} \ + \ +attr struct type * \ +name##_RB_REMOVE(struct name *head, struct type *elm) \ +{ \ + struct type *child, *parent, *old = elm; \ + int color; \ + if (RB_LEFT(elm, field) == NULL) \ + child = RB_RIGHT(elm, field); \ + else if (RB_RIGHT(elm, field) == NULL) \ + child = RB_LEFT(elm, field); \ + else { \ + struct type *left; \ + elm = RB_RIGHT(elm, field); \ + while ((left = RB_LEFT(elm, field)) != NULL) \ + elm = left; \ + child = RB_RIGHT(elm, field); \ + parent = RB_PARENT(elm, field); \ + color = RB_COLOR(elm, field); \ + if (child) \ + RB_PARENT(child, field) = parent; \ + if (parent) { \ + if (RB_LEFT(parent, field) == elm) \ + RB_LEFT(parent, field) = child; \ + else \ + RB_RIGHT(parent, field) = child; \ + RB_AUGMENT(parent); \ + } else \ + RB_ROOT(head) = child; \ + if (RB_PARENT(elm, field) == old) \ + parent = elm; \ + (elm)->field = (old)->field; \ + if (RB_PARENT(old, field)) { \ + if (RB_LEFT(RB_PARENT(old, field), field) == old)\ + RB_LEFT(RB_PARENT(old, field), field) = elm;\ + else \ + RB_RIGHT(RB_PARENT(old, field), field) = elm;\ + RB_AUGMENT(RB_PARENT(old, field)); \ + } else \ + RB_ROOT(head) = elm; \ + RB_PARENT(RB_LEFT(old, field), field) = elm; \ + if (RB_RIGHT(old, field)) \ + RB_PARENT(RB_RIGHT(old, field), field) = elm; \ + if (parent) { \ + left = parent; \ + do { \ + RB_AUGMENT(left); \ + } while ((left = RB_PARENT(left, field)) != NULL); \ + } \ + goto color; \ + } \ + parent = RB_PARENT(elm, field); \ + color = RB_COLOR(elm, field); \ + if (child) \ + RB_PARENT(child, field) = parent; \ + if (parent) { \ + if (RB_LEFT(parent, field) == elm) \ + RB_LEFT(parent, field) = child; \ + else \ + RB_RIGHT(parent, field) = child; \ + RB_AUGMENT(parent); \ + } else \ + RB_ROOT(head) = child; \ +color: \ + if (color == RB_BLACK) \ + name##_RB_REMOVE_COLOR(head, parent, child); \ + return (old); \ +} \ + \ +/* Inserts a node into the RB tree */ \ +attr struct type * \ +name##_RB_INSERT(struct name *head, struct type *elm) \ +{ \ + struct type *tmp; \ + struct type *parent = NULL; \ + int comp = 0; \ + tmp = RB_ROOT(head); \ + while (tmp) { \ + parent = tmp; \ + comp = (cmp)(elm, parent); \ + if (comp < 0) \ + tmp = RB_LEFT(tmp, field); \ + else if (comp > 0) \ + tmp = RB_RIGHT(tmp, field); \ + else \ + return (tmp); \ + } \ + RB_SET(elm, parent, field); \ + if (parent != NULL) { \ + if (comp < 0) \ + RB_LEFT(parent, field) = elm; \ + else \ + RB_RIGHT(parent, field) = elm; \ + RB_AUGMENT(parent); \ + } else \ + RB_ROOT(head) = elm; \ + name##_RB_INSERT_COLOR(head, elm); \ + return (NULL); \ +} \ + \ +/* Finds the node with the same key as elm */ \ +attr struct type * \ +name##_RB_FIND(struct name *head, struct type *elm) \ +{ \ + struct type *tmp = RB_ROOT(head); \ + int comp; \ + while (tmp) { \ + comp = cmp(elm, tmp); \ + if (comp < 0) \ + tmp = RB_LEFT(tmp, field); \ + else if (comp > 0) \ + tmp = RB_RIGHT(tmp, field); \ + else \ + return (tmp); \ + } \ + return (NULL); \ +} \ + \ +/* Finds the first node greater than or equal to the search key */ \ +attr struct type * \ +name##_RB_NFIND(struct name *head, struct type *elm) \ +{ \ + struct type *tmp = RB_ROOT(head); \ + struct type *res = NULL; \ + int comp; \ + while (tmp) { \ + comp = cmp(elm, tmp); \ + if (comp < 0) { \ + res = tmp; \ + tmp = RB_LEFT(tmp, field); \ + } \ + else if (comp > 0) \ + tmp = RB_RIGHT(tmp, field); \ + else \ + return (tmp); \ + } \ + return (res); \ +} \ + \ +/* ARGSUSED */ \ +attr struct type * \ +name##_RB_NEXT(struct type *elm) \ +{ \ + if (RB_RIGHT(elm, field)) { \ + elm = RB_RIGHT(elm, field); \ + while (RB_LEFT(elm, field)) \ + elm = RB_LEFT(elm, field); \ + } else { \ + if (RB_PARENT(elm, field) && \ + (elm == RB_LEFT(RB_PARENT(elm, field), field))) \ + elm = RB_PARENT(elm, field); \ + else { \ + while (RB_PARENT(elm, field) && \ + (elm == RB_RIGHT(RB_PARENT(elm, field), field)))\ + elm = RB_PARENT(elm, field); \ + elm = RB_PARENT(elm, field); \ + } \ + } \ + return (elm); \ +} \ + \ +/* ARGSUSED */ \ +attr struct type * \ +name##_RB_PREV(struct type *elm) \ +{ \ + if (RB_LEFT(elm, field)) { \ + elm = RB_LEFT(elm, field); \ + while (RB_RIGHT(elm, field)) \ + elm = RB_RIGHT(elm, field); \ + } else { \ + if (RB_PARENT(elm, field) && \ + (elm == RB_RIGHT(RB_PARENT(elm, field), field))) \ + elm = RB_PARENT(elm, field); \ + else { \ + while (RB_PARENT(elm, field) && \ + (elm == RB_LEFT(RB_PARENT(elm, field), field)))\ + elm = RB_PARENT(elm, field); \ + elm = RB_PARENT(elm, field); \ + } \ + } \ + return (elm); \ +} \ + \ +attr struct type * \ +name##_RB_MINMAX(struct name *head, int val) \ +{ \ + struct type *tmp = RB_ROOT(head); \ + struct type *parent = NULL; \ + while (tmp) { \ + parent = tmp; \ + if (val < 0) \ + tmp = RB_LEFT(tmp, field); \ + else \ + tmp = RB_RIGHT(tmp, field); \ + } \ + return (parent); \ +} + +#define RB_NEGINF -1 +#define RB_INF 1 + +#define RB_INSERT(name, x, y) name##_RB_INSERT(x, y) +#define RB_REMOVE(name, x, y) name##_RB_REMOVE(x, y) +#define RB_FIND(name, x, y) name##_RB_FIND(x, y) +#define RB_NFIND(name, x, y) name##_RB_NFIND(x, y) +#define RB_NEXT(name, x, y) name##_RB_NEXT(y) +#define RB_PREV(name, x, y) name##_RB_PREV(y) +#define RB_MIN(name, x) name##_RB_MINMAX(x, RB_NEGINF) +#define RB_MAX(name, x) name##_RB_MINMAX(x, RB_INF) + +#define RB_FOREACH(x, name, head) \ + for ((x) = RB_MIN(name, head); \ + (x) != NULL; \ + (x) = name##_RB_NEXT(x)) + +#define RB_FOREACH_FROM(x, name, y) \ + for ((x) = (y); \ + ((x) != NULL) && ((y) = name##_RB_NEXT(x), (x) != NULL); \ + (x) = (y)) + +#define RB_FOREACH_SAFE(x, name, head, y) \ + for ((x) = RB_MIN(name, head); \ + ((x) != NULL) && ((y) = name##_RB_NEXT(x), (x) != NULL); \ + (x) = (y)) + +#define RB_FOREACH_REVERSE(x, name, head) \ + for ((x) = RB_MAX(name, head); \ + (x) != NULL; \ + (x) = name##_RB_PREV(x)) + +#define RB_FOREACH_REVERSE_FROM(x, name, y) \ + for ((x) = (y); \ + ((x) != NULL) && ((y) = name##_RB_PREV(x), (x) != NULL); \ + (x) = (y)) + +#define RB_FOREACH_REVERSE_SAFE(x, name, head, y) \ + for ((x) = RB_MAX(name, head); \ + ((x) != NULL) && ((y) = name##_RB_PREV(x), (x) != NULL); \ + (x) = (y)) + +#endif /* _SYS_TREE_H_ */ diff --git a/yocto-poky/meta/recipes-core/busybox/busybox.inc b/yocto-poky/meta/recipes-core/busybox/busybox.inc index 4d4709a48..5e91a263d 100644 --- a/yocto-poky/meta/recipes-core/busybox/busybox.inc +++ b/yocto-poky/meta/recipes-core/busybox/busybox.inc @@ -17,7 +17,9 @@ BUSYBOX_SPLIT_SUID ?= "1" export EXTRA_CFLAGS = "${CFLAGS}" export EXTRA_LDFLAGS = "${LDFLAGS}" -export EXTRA_OEMAKE += "'LD=${CCLD}'" + +# We don't want '-e MAKEFLAGS=' in EXTRA_OEMAKE +EXTRA_OEMAKE = "CC='${CC}' LD='${CCLD}' V=1 ARCH=${TARGET_ARCH} CROSS_COMPILE=${TARGET_PREFIX} SKIP_STRIP=y" PACKAGES =+ "${PN}-httpd ${PN}-udhcpd ${PN}-udhcpc ${PN}-syslog ${PN}-mdev ${PN}-hwclock" @@ -33,9 +35,9 @@ INITSCRIPT_PACKAGES = "${PN}-httpd ${PN}-syslog ${PN}-udhcpd ${PN}-mdev ${PN}-hw INITSCRIPT_NAME_${PN}-httpd = "busybox-httpd" INITSCRIPT_NAME_${PN}-hwclock = "hwclock.sh" INITSCRIPT_NAME_${PN}-mdev = "mdev" -INITSCRIPT_PARAMS_${PN}-mdev = "start 03 S ." +INITSCRIPT_PARAMS_${PN}-mdev = "start 04 S ." INITSCRIPT_NAME_${PN}-syslog = "syslog" -INITSCRIPT_NAME_${PN}-udhcpd = "busybox-udhcpd" +INITSCRIPT_NAME_${PN}-udhcpd = "busybox-udhcpd" SYSTEMD_PACKAGES = "${PN}-syslog" SYSTEMD_SERVICE_${PN}-syslog = "busybox-syslog.service" @@ -79,8 +81,7 @@ def features_to_busybox_del(d): cnf, rem = features_to_busybox_settings(d) return rem -configmangle = '/CROSS_COMPILER_PREFIX/d; \ - /CONFIG_EXTRA_CFLAGS/d; \ +configmangle = '/CONFIG_EXTRA_CFLAGS/d; \ ' OE_FEATURES := "${@features_to_busybox_conf(d)}" OE_DEL := "${@features_to_busybox_del(d)}" @@ -96,8 +97,7 @@ python () { ("\\n".join((d.expand("${OE_FEATURES}").split("\n"))))) d.setVar('configmangle_append', "/^### CROSS$/a\\\n%s\n" % - ("\\n".join(["CONFIG_CROSS_COMPILER_PREFIX=\"${TARGET_PREFIX}\"", - "CONFIG_EXTRA_CFLAGS=\"${CFLAGS}\" \"${HOST_CC_ARCH}\"" + ("\\n".join(["CONFIG_EXTRA_CFLAGS=\"${CFLAGS} ${HOST_CC_ARCH}\"" ]) )) } @@ -171,20 +171,20 @@ do_compile() { } do_install () { - if [ "${prefix}" != "/usr" ]; then - sed -i "s:^/usr/:${prefix}/:" busybox.links* - fi - if [ "${base_sbindir}" != "/sbin" ]; then - sed -i "s:^/sbin/:${base_sbindir}/:" busybox.links* - fi - if [ "${base_bindir}" != "/bin" ]; then - sed -i "s:^/bin/:${base_bindir}/:" busybox.links* - fi + sed -i "s:^/bin/:BASE_BINDIR/:" busybox.links* + sed -i "s:^/sbin/:BASE_SBINDIR/:" busybox.links* + sed -i "s:^/usr/bin/:BINDIR/:" busybox.links* + sed -i "s:^/usr/sbin/:SBINDIR/:" busybox.links* + + sed -i "s:^BASE_BINDIR/:${base_bindir}/:" busybox.links* + sed -i "s:^BASE_SBINDIR/:${base_sbindir}/:" busybox.links* + sed -i "s:^BINDIR/:${bindir}/:" busybox.links* + sed -i "s:^SBINDIR/:${sbindir}/:" busybox.links* install -d ${D}${sysconfdir}/init.d if ! grep -q "CONFIG_FEATURE_INDIVIDUAL=y" ${B}/.config; then - # Install /bin/busybox, and the /bin/sh link so the postinst script + # Install ${base_bindir}/busybox, and the ${base_bindir}/sh link so the postinst script # can run. Let update-alternatives handle the rest. install -d ${D}${base_bindir} if [ "${BUSYBOX_SPLIT_SUID}" = "1" ]; then @@ -212,7 +212,7 @@ do_install () { # We make this symlink here to eliminate the error when upgrading together # with busybox-syslog. Without this symlink, the opkg may think of the # busybox.nosuid as obsolete and remove it, resulting in dead links like - # /bin/sed -> /bin/busybox.nosuid. This will make upgrading busybox-syslog fail. + # ${base_bindir}/sed -> ${base_bindir}/busybox.nosuid. This will make upgrading busybox-syslog fail. # This symlink will be safely deleted in postinst, thus no negative effect. ln -sf busybox ${D}${base_bindir}/busybox.nosuid fi @@ -258,7 +258,8 @@ do_install () { if grep "CONFIG_UDHCPC=y" ${B}/.config; then install -d ${D}${sysconfdir}/udhcpc.d install -d ${D}${datadir}/udhcpc - install -m 0755 ${WORKDIR}/simple.script ${D}${sysconfdir}/udhcpc.d/50default + install -m 0755 ${WORKDIR}/simple.script ${D}${sysconfdir}/udhcpc.d/50default + sed -i "s:/SBIN_DIR/:${base_sbindir}/:" ${D}${sysconfdir}/udhcpc.d/50default install -m 0755 ${WORKDIR}/default.script ${D}${datadir}/udhcpc/default.script fi if grep "CONFIG_INETD=y" ${B}/.config; then @@ -275,6 +276,21 @@ do_install () { install -m 0755 ${WORKDIR}/mdev-mount.sh ${D}${sysconfdir}/mdev fi fi + if grep "CONFIG_INIT=y" ${B}/.config; then + install -D -m 0777 ${WORKDIR}/rcS ${D}${sysconfdir}/init.d/rcS + install -D -m 0777 ${WORKDIR}/rcK ${D}${sysconfdir}/init.d/rcK + install -D -m 0755 ${WORKDIR}/runlevel ${D}${base_sbindir}/runlevel + if grep "CONFIG_FEATURE_USE_INITTAB=y" ${B}/.config; then + install -D -m 0777 ${WORKDIR}/inittab ${D}${sysconfdir}/inittab + tmp="${SERIAL_CONSOLES}" + for i in $tmp + do + j=`echo ${i} | sed s/\;/\ /g` + label=`echo ${i} | sed -e 's/tty//' -e 's/^.*;//' -e 's/;.*//'` + echo "tty$label::respawn:${base_sbindir}/getty ${j}" >> ${D}${sysconfdir}/inittab + done + fi + fi if ${@bb.utils.contains('DISTRO_FEATURES','systemd','true','false',d)}; then if grep -q "CONFIG_SYSLOGD=y" ${B}/.config; then @@ -300,6 +316,12 @@ do_install () { fi } +do_install_ptest () { + cp -r ${B}/testsuite ${D}${PTEST_PATH}/ + cp ${B}/.config ${D}${PTEST_PATH}/ + ln -s /bin/busybox ${D}${PTEST_PATH}/busybox +} + inherit update-alternatives ALTERNATIVE_PRIORITY = "50" @@ -325,6 +347,8 @@ python do_package_prepend () { dvar = d.getVar('D', True) pn = d.getVar('PN', True) def set_alternative_vars(links, target): + links = d.expand(links) + target = d.expand(target) f = open('%s%s' % (dvar, links), 'r') for alt_link_name in f: alt_link_name = alt_link_name.strip() @@ -362,21 +386,10 @@ pkg_postinst_${PN} () { if test -e ${sysconfdir}/busybox.links$suffix; then while read link; do if test ! -e "$link"; then - case "$link" in - /*/*/*) - to="../..${base_bindir}/busybox$suffix" - ;; - /bin/*) - to="busybox$suffix" - ;; - /*/*) - to="..${base_bindir}/busybox$suffix" - ;; - esac # we can use busybox here because even if we are using splitted busybox # we've made a symlink from /bin/busybox to /bin/busybox.nosuid. busybox rm -f $link - busybox ln -s $to $link + busybox ln -s "${base_bindir}/busybox$suffix" $link fi done < ${sysconfdir}/busybox.links$suffix fi @@ -402,6 +415,7 @@ pkg_prerm_${PN} () { ln -s ${base_bindir}/busybox $tmpdir/sed ln -s ${base_bindir}/busybox $tmpdir/sort ln -s ${base_bindir}/busybox $tmpdir/grep + ln -s ${base_bindir}/busybox $tmpdir/tail export PATH=$PATH:$tmpdir } diff --git a/yocto-poky/meta/recipes-core/busybox/busybox/0001-Switch-to-POSIX-utmpx-API.patch b/yocto-poky/meta/recipes-core/busybox/busybox/0001-Switch-to-POSIX-utmpx-API.patch deleted file mode 100644 index 1d299eec9..000000000 --- a/yocto-poky/meta/recipes-core/busybox/busybox/0001-Switch-to-POSIX-utmpx-API.patch +++ /dev/null @@ -1,388 +0,0 @@ -From 86a7f18f211af1abda5c855d2674b0fcb53de524 Mon Sep 17 00:00:00 2001 -From: Bernhard Reutner-Fischer <rep.dot.nop@gmail.com> -Date: Thu, 2 Apr 2015 23:03:46 +0200 -Subject: [PATCH] *: Switch to POSIX utmpx API - -UTMP is SVID legacy, UTMPX is mandated by POSIX. - -Glibc and uClibc have identical layout of UTMP and UTMPX, both of these -libc treat _PATH_UTMPX as _PATH_UTMP so from a user-perspective nothing -changes except the names of the API entrypoints. - -Signed-off-by: Bernhard Reutner-Fischer <rep.dot.nop@gmail.com> ---- -Upstream-Status: Backport - - coreutils/who.c | 8 ++++---- - include/libbb.h | 2 +- - init/halt.c | 4 ++-- - libbb/utmp.c | 44 ++++++++++++++++++++++---------------------- - miscutils/last.c | 8 ++++---- - miscutils/last_fancy.c | 16 ++++++++++------ - miscutils/runlevel.c | 12 ++++++------ - miscutils/wall.c | 8 ++++---- - procps/uptime.c | 6 +++--- - 9 files changed, 56 insertions(+), 52 deletions(-) - -diff --git a/coreutils/who.c b/coreutils/who.c -index f955ce6..8337212 100644 ---- a/coreutils/who.c -+++ b/coreutils/who.c -@@ -73,7 +73,7 @@ static void idle_string(char *str6, time_t t) - int who_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE; - int who_main(int argc UNUSED_PARAM, char **argv) - { -- struct utmp *ut; -+ struct utmpx *ut; - unsigned opt; - int do_users = (ENABLE_USERS && (!ENABLE_WHO || applet_name[0] == 'u')); - const char *fmt = "%s"; -@@ -83,8 +83,8 @@ int who_main(int argc UNUSED_PARAM, char **argv) - if (opt & 2) // -H - printf("USER\t\tTTY\t\tIDLE\tTIME\t\t HOST\n"); - -- setutent(); -- while ((ut = getutent()) != NULL) { -+ setutxent(); -+ while ((ut = getutxent()) != NULL) { - if (ut->ut_user[0] - && ((opt & 1) || ut->ut_type == USER_PROCESS) - ) { -@@ -126,6 +126,6 @@ int who_main(int argc UNUSED_PARAM, char **argv) - if (do_users) - bb_putchar('\n'); - if (ENABLE_FEATURE_CLEAN_UP) -- endutent(); -+ endutxent(); - return EXIT_SUCCESS; - } -diff --git a/include/libbb.h b/include/libbb.h -index 26b6868..0f8363b 100644 ---- a/include/libbb.h -+++ b/include/libbb.h -@@ -84,7 +84,7 @@ - # include <selinux/av_permissions.h> - #endif - #if ENABLE_FEATURE_UTMP --# include <utmp.h> -+# include <utmpx.h> - #endif - #if ENABLE_LOCALE_SUPPORT - # include <locale.h> -diff --git a/init/halt.c b/init/halt.c -index 7974adb..ad12d91 100644 ---- a/init/halt.c -+++ b/init/halt.c -@@ -74,7 +74,7 @@ - - static void write_wtmp(void) - { -- struct utmp utmp; -+ struct utmpx utmp; - struct utsname uts; - /* "man utmp" says wtmp file should *not* be created automagically */ - /*if (access(bb_path_wtmp_file, R_OK|W_OK) == -1) { -@@ -88,7 +88,7 @@ static void write_wtmp(void) - utmp.ut_line[0] = '~'; utmp.ut_line[1] = '~'; /* = strcpy(utmp.ut_line, "~~"); */ - uname(&uts); - safe_strncpy(utmp.ut_host, uts.release, sizeof(utmp.ut_host)); -- updwtmp(bb_path_wtmp_file, &utmp); -+ updwtmpx(bb_path_wtmp_file, &utmp); - } - #else - #define write_wtmp() ((void)0) -diff --git a/libbb/utmp.c b/libbb/utmp.c -index 8ad9ba2..bd07670 100644 ---- a/libbb/utmp.c -+++ b/libbb/utmp.c -@@ -16,7 +16,7 @@ static void touch(const char *filename) - - void FAST_FUNC write_new_utmp(pid_t pid, int new_type, const char *tty_name, const char *username, const char *hostname) - { -- struct utmp utent; -+ struct utmpx utent; - char *id; - unsigned width; - -@@ -45,17 +45,17 @@ void FAST_FUNC write_new_utmp(pid_t pid, int new_type, const char *tty_name, con - tty_name += 3; - strncpy(id, tty_name, width); - -- touch(_PATH_UTMP); -- //utmpname(_PATH_UTMP); -- setutent(); -+ touch(_PATH_UTMPX); -+ //utmpxname(_PATH_UTMPX); -+ setutxent(); - /* Append new one (hopefully, unless we collide on ut_id) */ -- pututline(&utent); -- endutent(); -+ pututxline(&utent); -+ endutxent(); - - #if ENABLE_FEATURE_WTMP - /* "man utmp" says wtmp file should *not* be created automagically */ - /*touch(bb_path_wtmp_file);*/ -- updwtmp(bb_path_wtmp_file, &utent); -+ updwtmpx(bb_path_wtmp_file, &utent); - #endif - } - -@@ -64,17 +64,17 @@ void FAST_FUNC write_new_utmp(pid_t pid, int new_type, const char *tty_name, con - */ - void FAST_FUNC update_utmp(pid_t pid, int new_type, const char *tty_name, const char *username, const char *hostname) - { -- struct utmp utent; -- struct utmp *utp; -+ struct utmpx utent; -+ struct utmpx *utp; - -- touch(_PATH_UTMP); -- //utmpname(_PATH_UTMP); -- setutent(); -+ touch(_PATH_UTMPX); -+ //utmpxname(_PATH_UTMPX); -+ setutxent(); - - /* Did init/getty/telnetd/sshd/... create an entry for us? - * It should be (new_type-1), but we'd also reuse - * any other potentially stale xxx_PROCESS entry */ -- while ((utp = getutent()) != NULL) { -+ while ((utp = getutxent()) != NULL) { - if (utp->ut_pid == pid - // && ut->ut_line[0] - && utp->ut_id[0] /* must have nonzero id */ -@@ -88,25 +88,25 @@ void FAST_FUNC update_utmp(pid_t pid, int new_type, const char *tty_name, const - /* Stale record. Nuke hostname */ - memset(utp->ut_host, 0, sizeof(utp->ut_host)); - } -- /* NB: pututline (see later) searches for matching utent -- * using getutid(utent) - we must not change ut_id -+ /* NB: pututxline (see later) searches for matching utxent -+ * using getutxid(utent) - we must not change ut_id - * if we want *exactly this* record to be overwritten! - */ - break; - } - } -- //endutent(); - no need, pututline can deal with (and actually likes) -+ //endutxent(); - no need, pututxline can deal with (and actually likes) - //the situation when utmp file is positioned on found record - - if (!utp) { - if (new_type != DEAD_PROCESS) - write_new_utmp(pid, new_type, tty_name, username, hostname); - else -- endutent(); -+ endutxent(); - return; - } - -- /* Make a copy. We can't use *utp, pututline's internal getutid -+ /* Make a copy. We can't use *utp, pututxline's internal getutxid - * will overwrite it before it is used! */ - utent = *utp; - -@@ -120,14 +120,14 @@ void FAST_FUNC update_utmp(pid_t pid, int new_type, const char *tty_name, const - utent.ut_tv.tv_sec = time(NULL); - - /* Update, or append new one */ -- //setutent(); -- pututline(&utent); -- endutent(); -+ //setutxent(); -+ pututxline(&utent); -+ endutxent(); - - #if ENABLE_FEATURE_WTMP - /* "man utmp" says wtmp file should *not* be created automagically */ - /*touch(bb_path_wtmp_file);*/ -- updwtmp(bb_path_wtmp_file, &utent); -+ updwtmpx(bb_path_wtmp_file, &utent); - #endif - } - -diff --git a/miscutils/last.c b/miscutils/last.c -index a144c7e..6d8b584 100644 ---- a/miscutils/last.c -+++ b/miscutils/last.c -@@ -32,21 +32,21 @@ - - #if defined UT_LINESIZE \ - && ((UT_LINESIZE != 32) || (UT_NAMESIZE != 32) || (UT_HOSTSIZE != 256)) --#error struct utmp member char[] size(s) have changed! -+#error struct utmpx member char[] size(s) have changed! - #elif defined __UT_LINESIZE \ - && ((__UT_LINESIZE != 32) || (__UT_NAMESIZE != 64) || (__UT_HOSTSIZE != 256)) --#error struct utmp member char[] size(s) have changed! -+#error struct utmpx member char[] size(s) have changed! - #endif - - #if EMPTY != 0 || RUN_LVL != 1 || BOOT_TIME != 2 || NEW_TIME != 3 || \ - OLD_TIME != 4 --#error Values for the ut_type field of struct utmp changed -+#error Values for the ut_type field of struct utmpx changed - #endif - - int last_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE; - int last_main(int argc UNUSED_PARAM, char **argv UNUSED_PARAM) - { -- struct utmp ut; -+ struct utmpx ut; - int n, file = STDIN_FILENO; - time_t t_tmp; - off_t pos; -diff --git a/miscutils/last_fancy.c b/miscutils/last_fancy.c -index 16ed9e9..8194e31 100644 ---- a/miscutils/last_fancy.c -+++ b/miscutils/last_fancy.c -@@ -22,6 +22,10 @@ - #define HEADER_LINE_WIDE "USER", "TTY", \ - INET6_ADDRSTRLEN, INET6_ADDRSTRLEN, "HOST", "LOGIN", " TIME", "" - -+#if !defined __UT_LINESIZE && defined UT_LINESIZE -+# define __UT_LINESIZE UT_LINESIZE -+#endif -+ - enum { - NORMAL, - LOGGED, -@@ -39,7 +43,7 @@ enum { - - #define show_wide (option_mask32 & LAST_OPT_W) - --static void show_entry(struct utmp *ut, int state, time_t dur_secs) -+static void show_entry(struct utmpx *ut, int state, time_t dur_secs) - { - unsigned days, hours, mins; - char duration[sizeof("(%u+02:02)") + sizeof(int)*3]; -@@ -104,7 +108,7 @@ static void show_entry(struct utmp *ut, int state, time_t dur_secs) - duration_str); - } - --static int get_ut_type(struct utmp *ut) -+static int get_ut_type(struct utmpx *ut) - { - if (ut->ut_line[0] == '~') { - if (strcmp(ut->ut_user, "shutdown") == 0) { -@@ -142,7 +146,7 @@ static int get_ut_type(struct utmp *ut) - return ut->ut_type; - } - --static int is_runlevel_shutdown(struct utmp *ut) -+static int is_runlevel_shutdown(struct utmpx *ut) - { - if (((ut->ut_pid & 255) == '0') || ((ut->ut_pid & 255) == '6')) { - return 1; -@@ -154,7 +158,7 @@ static int is_runlevel_shutdown(struct utmp *ut) - int last_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE; - int last_main(int argc UNUSED_PARAM, char **argv) - { -- struct utmp ut; -+ struct utmpx ut; - const char *filename = _PATH_WTMP; - llist_t *zlist; - off_t pos; -@@ -242,9 +246,9 @@ int last_main(int argc UNUSED_PARAM, char **argv) - { - llist_t *el, *next; - for (el = zlist; el; el = next) { -- struct utmp *up = (struct utmp *)el->data; -+ struct utmpx *up = (struct utmpx *)el->data; - next = el->link; -- if (strncmp(up->ut_line, ut.ut_line, UT_LINESIZE) == 0) { -+ if (strncmp(up->ut_line, ut.ut_line, __UT_LINESIZE) == 0) { - if (show) { - show_entry(&ut, NORMAL, up->ut_tv.tv_sec); - show = 0; -diff --git a/miscutils/runlevel.c b/miscutils/runlevel.c -index 76231df..8558db8 100644 ---- a/miscutils/runlevel.c -+++ b/miscutils/runlevel.c -@@ -29,19 +29,19 @@ - int runlevel_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE; - int runlevel_main(int argc UNUSED_PARAM, char **argv) - { -- struct utmp *ut; -+ struct utmpx *ut; - char prev; - -- if (argv[1]) utmpname(argv[1]); -+ if (argv[1]) utmpxname(argv[1]); - -- setutent(); -- while ((ut = getutent()) != NULL) { -+ setutxent(); -+ while ((ut = getutxent()) != NULL) { - if (ut->ut_type == RUN_LVL) { - prev = ut->ut_pid / 256; - if (prev == 0) prev = 'N'; - printf("%c %c\n", prev, ut->ut_pid % 256); - if (ENABLE_FEATURE_CLEAN_UP) -- endutent(); -+ endutxent(); - return 0; - } - } -@@ -49,6 +49,6 @@ int runlevel_main(int argc UNUSED_PARAM, char **argv) - puts("unknown"); - - if (ENABLE_FEATURE_CLEAN_UP) -- endutent(); -+ endutxent(); - return 1; - } -diff --git a/miscutils/wall.c b/miscutils/wall.c -index bb709ee..50658f4 100644 ---- a/miscutils/wall.c -+++ b/miscutils/wall.c -@@ -32,7 +32,7 @@ - int wall_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE; - int wall_main(int argc UNUSED_PARAM, char **argv) - { -- struct utmp *ut; -+ struct utmpx *ut; - char *msg; - int fd; - -@@ -46,8 +46,8 @@ int wall_main(int argc UNUSED_PARAM, char **argv) - msg = xmalloc_read(fd, NULL); - if (ENABLE_FEATURE_CLEAN_UP && argv[1]) - close(fd); -- setutent(); -- while ((ut = getutent()) != NULL) { -+ setutxent(); -+ while ((ut = getutxent()) != NULL) { - char *line; - if (ut->ut_type != USER_PROCESS) - continue; -@@ -56,7 +56,7 @@ int wall_main(int argc UNUSED_PARAM, char **argv) - free(line); - } - if (ENABLE_FEATURE_CLEAN_UP) { -- endutent(); -+ endutxent(); - free(msg); - } - return EXIT_SUCCESS; -diff --git a/procps/uptime.c b/procps/uptime.c -index 778812a..149bae6 100644 ---- a/procps/uptime.c -+++ b/procps/uptime.c -@@ -81,10 +81,10 @@ int uptime_main(int argc UNUSED_PARAM, char **argv UNUSED_PARAM) - - #if ENABLE_FEATURE_UPTIME_UTMP_SUPPORT - { -- struct utmp *ut; -+ struct utmpx *ut; - unsigned users = 0; -- while ((ut = getutent()) != NULL) { -- if ((ut->ut_type == USER_PROCESS) && (ut->ut_name[0] != '\0')) -+ while ((ut = getutxent()) != NULL) { -+ if ((ut->ut_type == USER_PROCESS) && (ut->ut_user[0] != '\0')) - users++; - } - printf(", %u users", users); --- -2.5.1 - diff --git a/yocto-poky/meta/recipes-core/busybox/busybox/0001-chown-fix-help-text.patch b/yocto-poky/meta/recipes-core/busybox/busybox/0001-chown-fix-help-text.patch deleted file mode 100644 index 429979966..000000000 --- a/yocto-poky/meta/recipes-core/busybox/busybox/0001-chown-fix-help-text.patch +++ /dev/null @@ -1,34 +0,0 @@ -From d291c2fdd5cb8616605c67ecbfb04274fa094242 Mon Sep 17 00:00:00 2001 -From: Junling Zheng <zhengjunling@huawei.com> -Date: Sun, 7 Jun 2015 02:32:23 +0200 -Subject: [PATCH] chown: fix help text - -Derived from: -http://git.busybox.net/busybox/commit/?id=d291c2fdd5cb8616605c67ecbfb04274fa094242. - -Only when DESKTOP is enabled, chown has -L, -H and -P options. - -Upstream-Status: Backport - -Signed-off-by: Junling Zheng <zhengjunling@huawei.com> -Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com> ---- - coreutils/chown.c | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -diff --git a/coreutils/chown.c b/coreutils/chown.c -index cb07bbc..679c0d8 100644 ---- a/coreutils/chown.c -+++ b/coreutils/chown.c -@@ -11,7 +11,7 @@ - /* http://www.opengroup.org/onlinepubs/007904975/utilities/chown.html */ - - //usage:#define chown_trivial_usage --//usage: "[-RhLHP"IF_DESKTOP("cvf")"]... OWNER[<.|:>[GROUP]] FILE..." -+//usage: "[-Rh"IF_DESKTOP("LHPcvf")"]... OWNER[<.|:>[GROUP]] FILE..." - //usage:#define chown_full_usage "\n\n" - //usage: "Change the owner and/or group of each FILE to OWNER and/or GROUP\n" - //usage: "\n -R Recurse" --- -1.8.3.4 - diff --git a/yocto-poky/meta/recipes-core/busybox/busybox/0001-ifconfig-fix-double-free-fatal-error-in-INET_sprint.patch b/yocto-poky/meta/recipes-core/busybox/busybox/0001-ifconfig-fix-double-free-fatal-error-in-INET_sprint.patch deleted file mode 100644 index 2d729b1b0..000000000 --- a/yocto-poky/meta/recipes-core/busybox/busybox/0001-ifconfig-fix-double-free-fatal-error-in-INET_sprint.patch +++ /dev/null @@ -1,67 +0,0 @@ -From a97777889328157bb7d06ec618bad16712a9c345 Mon Sep 17 00:00:00 2001 -From: Denys Vlasenko <vda.linux@googlemail.com> -Date: Tue, 3 Feb 2015 12:11:30 +0100 -Subject: [PATCH] ifconfig: fix double free fatal error in INET_sprint - -Derived from: -http://git.busybox.net/busybox/commit/?id=a97777889328157bb7d06ec618bad16712a9c345. - -While INET_sprint or INET6_sprint is called circularly by keeping -ifconfiging, sap->sa_family would be cleaned by other parallel processes -such as dhclient sometimes, and then there would be a double free error -like the following: - - *** glibc detected *** ifconfig: double free or corruption (fasttop): 0x000a6008 *** - ======= Backtrace: ========= - /lib/libc.so.6(+0x6bc84)[0x40133c84] - /lib/libc.so.6(cfree+0x94)[0x40138684] - ifconfig[0x1c460] - ifconfig[0x1c6a0] - ifconfig[0x1ccf4] - ifconfig[0x187c8] - ifconfig[0xd544] - ifconfig[0xd5dc] - ifconfig[0xdca8] - /lib/libc.so.6(__libc_start_main+0x110)[0x400df258] - ======= Memory map: ======== - 00008000-0009c000 r-xp 00000000 1f:05 444328 /bin/busybox - 000a3000-000a4000 rw-p 00093000 1f:05 444328 /bin/busybox - -This patch moved free() two lines down to address this problem. - -Upstream-Status: Backport - -Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com> ---- - networking/interface.c | 4 ++-- - 1 file changed, 2 insertions(+), 2 deletions(-) - -diff --git a/networking/interface.c b/networking/interface.c -index bf7d2b1..b0572d0 100644 ---- a/networking/interface.c -+++ b/networking/interface.c -@@ -91,9 +91,9 @@ static const char* FAST_FUNC INET_sprint(struct sockaddr *sap, int numeric) - { - static char *buff; /* defaults to NULL */ - -- free(buff); - if (sap->sa_family == 0xFFFF || sap->sa_family == 0) - return "[NONE SET]"; -+ free(buff); - buff = INET_rresolve((struct sockaddr_in *) sap, numeric, 0xffffff00); - return buff; - } -@@ -173,9 +173,9 @@ static const char* FAST_FUNC INET6_sprint(struct sockaddr *sap, int numeric) - { - static char *buff; - -- free(buff); - if (sap->sa_family == 0xFFFF || sap->sa_family == 0) - return "[NONE SET]"; -+ free(buff); - buff = INET6_rresolve((struct sockaddr_in6 *) sap, numeric); - return buff; - } --- -1.8.3.4 - diff --git a/yocto-poky/meta/recipes-core/busybox/busybox/0001-randconfig-fix.patch b/yocto-poky/meta/recipes-core/busybox/busybox/0001-randconfig-fix.patch deleted file mode 100644 index 415ec3409..000000000 --- a/yocto-poky/meta/recipes-core/busybox/busybox/0001-randconfig-fix.patch +++ /dev/null @@ -1,33 +0,0 @@ -If CONFIG_FEATURE_LAST_SMALL is enabled the build fails because of a broken -__UT_NAMESIZE test. - -Upstream-Status: Backport -Signed-off-by: Ross Burton <ross.burton@intel.com> - -From 932302666b0354ede63504d1bef8393cab28db8b Mon Sep 17 00:00:00 2001 -From: Denys Vlasenko <vda.linux@googlemail.com> -Date: Sun, 11 Oct 2015 16:58:18 +0200 -Subject: [PATCH] randconfig fix - -Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com> ---- - miscutils/last.c | 3 ++- - 1 file changed, 2 insertions(+), 1 deletion(-) - -diff --git a/miscutils/last.c b/miscutils/last.c -index 6d8b584..f8f3437 100644 ---- a/miscutils/last.c -+++ b/miscutils/last.c -@@ -34,7 +34,8 @@ - && ((UT_LINESIZE != 32) || (UT_NAMESIZE != 32) || (UT_HOSTSIZE != 256)) - #error struct utmpx member char[] size(s) have changed! - #elif defined __UT_LINESIZE \ -- && ((__UT_LINESIZE != 32) || (__UT_NAMESIZE != 64) || (__UT_HOSTSIZE != 256)) -+ && ((__UT_LINESIZE != 32) || (__UT_NAMESIZE != 32) || (__UT_HOSTSIZE != 256)) -+/* __UT_NAMESIZE was checked with 64 above, but glibc-2.11 definitely uses 32! */ - #error struct utmpx member char[] size(s) have changed! - #endif - --- -2.6.4 - diff --git a/yocto-poky/meta/recipes-core/busybox/busybox/0002-Passthrough-r-to-linker.patch b/yocto-poky/meta/recipes-core/busybox/busybox/0002-Passthrough-r-to-linker.patch deleted file mode 100644 index de286fb74..000000000 --- a/yocto-poky/meta/recipes-core/busybox/busybox/0002-Passthrough-r-to-linker.patch +++ /dev/null @@ -1,32 +0,0 @@ -From df2cc76cdebc4773361477f3db203790f6986e3b Mon Sep 17 00:00:00 2001 -From: Khem Raj <raj.khem@gmail.com> -Date: Sat, 22 Aug 2015 23:42:40 -0700 -Subject: [PATCH 2/2] Passthrough -r to linker - -clang does not have -r switch and it does not pass it down to linker -either, LDFLAGS_RELOCATABLE is used when CC is used for LD, so this -should not cause side effects - -Signed-off-by: Khem Raj <raj.khem@gmail.com> ---- -Upstream-Status: Pending - - Makefile | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -diff --git a/Makefile b/Makefile -index 9da02cb..10dd4a9 100644 ---- a/Makefile -+++ b/Makefile -@@ -309,7 +309,7 @@ CHECKFLAGS := -D__linux__ -Dlinux -D__STDC__ -Dunix -D__unix__ -Wbitwise $(C - MODFLAGS = -DMODULE - CFLAGS_MODULE = $(MODFLAGS) - AFLAGS_MODULE = $(MODFLAGS) --LDFLAGS_RELOCATABLE = -r -nostdlib -+LDFLAGS_RELOCATABLE = -Xlinker -r -nostdlib - LDFLAGS_MODULE = $(LDFLAGS_RELOCATABLE) - CFLAGS_KERNEL = - AFLAGS_KERNEL = --- -2.1.4 - diff --git a/yocto-poky/meta/recipes-core/busybox/busybox/busybox-1.24.1-truncate-open-mode.patch b/yocto-poky/meta/recipes-core/busybox/busybox/busybox-1.24.1-truncate-open-mode.patch new file mode 100644 index 000000000..cdc91082b --- /dev/null +++ b/yocto-poky/meta/recipes-core/busybox/busybox/busybox-1.24.1-truncate-open-mode.patch @@ -0,0 +1,81 @@ +Upstream-Status: Backport + + http://busybox.net/downloads/fixes-1.24.1/ + https://git.busybox.net/busybox/commit/?id=e111a1640494fe87fc913f94fae3bb805de0fc99 + https://git.busybox.net/busybox/commit/?h=1_24_stable&id=be729c1d3b5c923f10871dd68ea94156d0f8c803 + +Signed-off-by: Andre McCurdy <armccurdy@gmail.com> + +From be729c1d3b5c923f10871dd68ea94156d0f8c803 Mon Sep 17 00:00:00 2001 +From: Ari Sundholm <ari@tuxera.com> +Date: Mon, 4 Jan 2016 15:40:37 +0200 +Subject: [PATCH] truncate: always set mode when opening file to avoid fortify + errors + +Busybox crashes due to no mode being given when opening: +$ ./busybox truncate -s 1M foo +*** invalid open64 call: O_CREAT without mode ***: ./busybox terminated +======= Backtrace: ========= +/lib/x86_64-linux-gnu/libc.so.6(+0x7338f)[0x7f66d921338f] +/lib/x86_64-linux-gnu/libc.so.6(__fortify_fail+0x5c)[0x7f66d92aac9c] +/lib/x86_64-linux-gnu/libc.so.6(+0xeb6aa)[0x7f66d928b6aa] +./busybox[0x4899f9] +======= Memory map: ======== +00400000-004d0000 r-xp 00000000 00:1a 137559 /home/ari/busybox/busybox +006cf000-006d0000 r--p 000cf000 00:1a 137559 /home/ari/busybox/busybox +006d0000-006d1000 rw-p 000d0000 00:1a 137559 /home/ari/busybox/busybox +006d1000-006d4000 rw-p 00000000 00:00 0 +014e7000-01508000 rw-p 00000000 00:00 0 [heap] +7f66d8f8a000-7f66d8fa0000 r-xp 00000000 08:07 1579008 /lib/x86_64-linux-gnu/libgcc_s.so.1 +7f66d8fa0000-7f66d919f000 ---p 00016000 08:07 1579008 /lib/x86_64-linux-gnu/libgcc_s.so.1 +7f66d919f000-7f66d91a0000 rw-p 00015000 08:07 1579008 /lib/x86_64-linux-gnu/libgcc_s.so.1 +7f66d91a0000-7f66d935b000 r-xp 00000000 08:07 1578994 /lib/x86_64-linux-gnu/libc-2.19.so +7f66d935b000-7f66d955a000 ---p 001bb000 08:07 1578994 /lib/x86_64-linux-gnu/libc-2.19.so +7f66d955a000-7f66d955e000 r--p 001ba000 08:07 1578994 /lib/x86_64-linux-gnu/libc-2.19.so +7f66d955e000-7f66d9560000 rw-p 001be000 08:07 1578994 /lib/x86_64-linux-gnu/libc-2.19.so +7f66d9560000-7f66d9565000 rw-p 00000000 00:00 0 +7f66d9565000-7f66d966a000 r-xp 00000000 08:07 1579020 /lib/x86_64-linux-gnu/libm-2.19.so +7f66d966a000-7f66d9869000 ---p 00105000 08:07 1579020 /lib/x86_64-linux-gnu/libm-2.19.so +7f66d9869000-7f66d986a000 r--p 00104000 08:07 1579020 /lib/x86_64-linux-gnu/libm-2.19.so +7f66d986a000-7f66d986b000 rw-p 00105000 08:07 1579020 /lib/x86_64-linux-gnu/libm-2.19.so +7f66d986b000-7f66d988e000 r-xp 00000000 08:07 1578981 /lib/x86_64-linux-gnu/ld-2.19.so +7f66d9a64000-7f66d9a67000 rw-p 00000000 00:00 0 +7f66d9a8a000-7f66d9a8d000 rw-p 00000000 00:00 0 +7f66d9a8d000-7f66d9a8e000 r--p 00022000 08:07 1578981 /lib/x86_64-linux-gnu/ld-2.19.so +7f66d9a8e000-7f66d9a8f000 rw-p 00023000 08:07 1578981 /lib/x86_64-linux-gnu/ld-2.19.so +7f66d9a8f000-7f66d9a90000 rw-p 00000000 00:00 0 +7ffc47761000-7ffc47782000 rw-p 00000000 00:00 0 [stack] +7ffc477ab000-7ffc477ad000 r-xp 00000000 00:00 0 [vdso] +ffffffffff600000-ffffffffff601000 r-xp 00000000 00:00 0 [vsyscall] +Aborted (core dumped) +$ + +Fix this by simply always setting the mode, as it doesn't hurt even +when O_CREAT is not specified. + +This bug is a regression introduced in fc3e40e, as xopen(), which +was originally used, would automatically set the mode. + +Signed-off-by: Ari Sundholm <ari@tuxera.com> +Signed-off-by: Mike Frysinger <vapier@gentoo.org> +(cherry picked from commit e111a1640494fe87fc913f94fae3bb805de0fc99) +--- + coreutils/truncate.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/coreutils/truncate.c b/coreutils/truncate.c +index e5fa656..4c997bf 100644 +--- a/coreutils/truncate.c ++++ b/coreutils/truncate.c +@@ -64,7 +64,7 @@ int truncate_main(int argc UNUSED_PARAM, char **argv) + + argv += optind; + while (*argv) { +- int fd = open(*argv, flags); ++ int fd = open(*argv, flags, 0666); + if (fd < 0) { + if (errno != ENOENT || !(opts & OPT_NOCREATE)) { + bb_perror_msg("%s: open", *argv); +-- +2.6.2 + diff --git a/yocto-poky/meta/recipes-core/busybox/busybox/busybox-1.24.1-unzip-regression.patch b/yocto-poky/meta/recipes-core/busybox/busybox/busybox-1.24.1-unzip-regression.patch new file mode 100644 index 000000000..e3c502091 --- /dev/null +++ b/yocto-poky/meta/recipes-core/busybox/busybox/busybox-1.24.1-unzip-regression.patch @@ -0,0 +1,143 @@ +Upstream-Status: Backport + + http://busybox.net/downloads/fixes-1.24.1/ + http://git.busybox.net/busybox/commit/?id=092fabcf1df5d46cd22be4ffcd3b871f6180eb9c + http://git.busybox.net/busybox/commit/?h=1_24_stable&id=092fabcf1df5d46cd22be4ffcd3b871f6180eb9c + +Signed-off-by: Andre McCurdy <armccurdy@gmail.com> + +From 092fabcf1df5d46cd22be4ffcd3b871f6180eb9c Mon Sep 17 00:00:00 2001 +From: Denys Vlasenko <vda.linux@googlemail.com> +Date: Fri, 30 Oct 2015 23:41:53 +0100 +Subject: [PATCH] [g]unzip: fix recent breakage. + +Also, do emit error message we so painstakingly pass from gzip internals + +Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com> +(cherry picked from commit 6bd3fff51aa74e2ee2d87887b12182a3b09792ef) +Signed-off-by: Mike Frysinger <vapier@gentoo.org> +--- + archival/libarchive/decompress_gunzip.c | 33 +++++++++++++++++++++------------ + testsuite/unzip.tests | 1 + + 2 files changed, 22 insertions(+), 12 deletions(-) + +diff --git a/archival/libarchive/decompress_gunzip.c b/archival/libarchive/decompress_gunzip.c +index c76fd31..357c9bf 100644 +--- a/archival/libarchive/decompress_gunzip.c ++++ b/archival/libarchive/decompress_gunzip.c +@@ -309,8 +309,7 @@ static int huft_build(const unsigned *b, const unsigned n, + huft_t *q; /* points to current table */ + huft_t r; /* table entry for structure assignment */ + huft_t *u[BMAX]; /* table stack */ +- unsigned v[N_MAX]; /* values in order of bit length */ +- unsigned v_end; ++ unsigned v[N_MAX + 1]; /* values in order of bit length. last v[] is never used */ + int ws[BMAX + 1]; /* bits decoded stack */ + int w; /* bits decoded */ + unsigned x[BMAX + 1]; /* bit offsets, then code stack */ +@@ -365,15 +364,17 @@ static int huft_build(const unsigned *b, const unsigned n, + *xp++ = j; + } + +- /* Make a table of values in order of bit lengths */ ++ /* Make a table of values in order of bit lengths. ++ * To detect bad input, unused v[i]'s are set to invalid value UINT_MAX. ++ * In particular, last v[i] is never filled and must not be accessed. ++ */ ++ memset(v, 0xff, sizeof(v)); + p = b; + i = 0; +- v_end = 0; + do { + j = *p++; + if (j != 0) { + v[x[j]++] = i; +- v_end = x[j]; + } + } while (++i < n); + +@@ -435,7 +436,9 @@ static int huft_build(const unsigned *b, const unsigned n, + + /* set up table entry in r */ + r.b = (unsigned char) (k - w); +- if (p >= v + v_end) { // Was "if (p >= v + n)" but v[] can be shorter! ++ if (/*p >= v + n || -- redundant, caught by the second check: */ ++ *p == UINT_MAX /* do we access uninited v[i]? (see memset(v))*/ ++ ) { + r.e = 99; /* out of values--invalid code */ + } else if (*p < s) { + r.e = (unsigned char) (*p < 256 ? 16 : 15); /* 256 is EOB code */ +@@ -520,8 +523,9 @@ static NOINLINE int inflate_codes(STATE_PARAM_ONLY) + e = t->e; + if (e > 16) + do { +- if (e == 99) +- abort_unzip(PASS_STATE_ONLY);; ++ if (e == 99) { ++ abort_unzip(PASS_STATE_ONLY); ++ } + bb >>= t->b; + k -= t->b; + e -= 16; +@@ -557,8 +561,9 @@ static NOINLINE int inflate_codes(STATE_PARAM_ONLY) + e = t->e; + if (e > 16) + do { +- if (e == 99) ++ if (e == 99) { + abort_unzip(PASS_STATE_ONLY); ++ } + bb >>= t->b; + k -= t->b; + e -= 16; +@@ -824,8 +829,9 @@ static int inflate_block(STATE_PARAM smallint *e) + + b_dynamic >>= 4; + k_dynamic -= 4; +- if (nl > 286 || nd > 30) ++ if (nl > 286 || nd > 30) { + abort_unzip(PASS_STATE_ONLY); /* bad lengths */ ++ } + + /* read in bit-length-code lengths */ + for (j = 0; j < nb; j++) { +@@ -906,12 +912,14 @@ static int inflate_block(STATE_PARAM smallint *e) + bl = lbits; + + i = huft_build(ll, nl, 257, cplens, cplext, &inflate_codes_tl, &bl); +- if (i != 0) ++ if (i != 0) { + abort_unzip(PASS_STATE_ONLY); ++ } + bd = dbits; + i = huft_build(ll + nl, nd, 0, cpdist, cpdext, &inflate_codes_td, &bd); +- if (i != 0) ++ if (i != 0) { + abort_unzip(PASS_STATE_ONLY); ++ } + + /* set up data for inflate_codes() */ + inflate_codes_setup(PASS_STATE bl, bd); +@@ -999,6 +1007,7 @@ inflate_unzip_internal(STATE_PARAM transformer_state_t *xstate) + error_msg = "corrupted data"; + if (setjmp(error_jmp)) { + /* Error from deep inside zip machinery */ ++ bb_error_msg(error_msg); + n = -1; + goto ret; + } +diff --git a/testsuite/unzip.tests b/testsuite/unzip.tests +index ca0a458..d8738a3 100755 +--- a/testsuite/unzip.tests ++++ b/testsuite/unzip.tests +@@ -34,6 +34,7 @@ rm foo.zip + testing "unzip (bad archive)" "uudecode; unzip bad.zip 2>&1; echo \$?" \ + "Archive: bad.zip + inflating: ]3j½r«IK-%Ix ++unzip: corrupted data + unzip: inflate error + 1 + " \ +-- +2.6.2 + diff --git a/yocto-poky/meta/recipes-core/busybox/busybox/busybox-1.24.1-unzip.patch b/yocto-poky/meta/recipes-core/busybox/busybox/busybox-1.24.1-unzip.patch new file mode 100644 index 000000000..718672695 --- /dev/null +++ b/yocto-poky/meta/recipes-core/busybox/busybox/busybox-1.24.1-unzip.patch @@ -0,0 +1,118 @@ +Upstream-Status: Backport + + http://busybox.net/downloads/fixes-1.24.1/ + http://git.busybox.net/busybox/commit/?id=1de25a6e87e0e627aa34298105a3d17c60a1f44e + http://git.busybox.net/busybox/commit/?h=1_24_stable&id=6767af17f11144c7cd3cfe9ef799d7f89a78fe65 + +Signed-off-by: Andre McCurdy <armccurdy@gmail.com> + +From 1de25a6e87e0e627aa34298105a3d17c60a1f44e Mon Sep 17 00:00:00 2001 +From: Denys Vlasenko <vda.linux@googlemail.com> +Date: Mon, 26 Oct 2015 19:33:05 +0100 +Subject: [PATCH] unzip: test for bad archive SEGVing + +function old new delta +huft_build 1296 1300 +4 + +Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com> +--- + archival/libarchive/decompress_gunzip.c | 11 +++++++---- + testsuite/unzip.tests | 23 ++++++++++++++++++++++- + 2 files changed, 29 insertions(+), 5 deletions(-) + +diff --git a/archival/libarchive/decompress_gunzip.c b/archival/libarchive/decompress_gunzip.c +index 7b6f459..30bf451 100644 +--- a/archival/libarchive/decompress_gunzip.c ++++ b/archival/libarchive/decompress_gunzip.c +@@ -305,11 +305,12 @@ static int huft_build(const unsigned *b, const unsigned n, + unsigned i; /* counter, current code */ + unsigned j; /* counter */ + int k; /* number of bits in current code */ +- unsigned *p; /* pointer into c[], b[], or v[] */ ++ const unsigned *p; /* pointer into c[], b[], or v[] */ + huft_t *q; /* points to current table */ + huft_t r; /* table entry for structure assignment */ + huft_t *u[BMAX]; /* table stack */ + unsigned v[N_MAX]; /* values in order of bit length */ ++ unsigned v_end; + int ws[BMAX + 1]; /* bits decoded stack */ + int w; /* bits decoded */ + unsigned x[BMAX + 1]; /* bit offsets, then code stack */ +@@ -324,7 +325,7 @@ static int huft_build(const unsigned *b, const unsigned n, + + /* Generate counts for each bit length */ + memset(c, 0, sizeof(c)); +- p = (unsigned *) b; /* cast allows us to reuse p for pointing to b */ ++ p = b; + i = n; + do { + c[*p]++; /* assume all entries <= BMAX */ +@@ -365,12 +366,14 @@ static int huft_build(const unsigned *b, const unsigned n, + } + + /* Make a table of values in order of bit lengths */ +- p = (unsigned *) b; ++ p = b; + i = 0; ++ v_end = 0; + do { + j = *p++; + if (j != 0) { + v[x[j]++] = i; ++ v_end = x[j]; + } + } while (++i < n); + +@@ -432,7 +435,7 @@ static int huft_build(const unsigned *b, const unsigned n, + + /* set up table entry in r */ + r.b = (unsigned char) (k - w); +- if (p >= v + n) { ++ if (p >= v + v_end) { // Was "if (p >= v + n)" but v[] can be shorter! + r.e = 99; /* out of values--invalid code */ + } else if (*p < s) { + r.e = (unsigned char) (*p < 256 ? 16 : 15); /* 256 is EOB code */ +diff --git a/testsuite/unzip.tests b/testsuite/unzip.tests +index 8677a03..ca0a458 100755 +--- a/testsuite/unzip.tests ++++ b/testsuite/unzip.tests +@@ -7,7 +7,7 @@ + + . ./testing.sh + +-# testing "test name" "options" "expected result" "file input" "stdin" ++# testing "test name" "commands" "expected result" "file input" "stdin" + # file input will be file called "input" + # test can create a file "actual" instead of writing to stdout + +@@ -30,6 +30,27 @@ testing "unzip (subdir only)" "unzip -q foo.zip foo/ && test -d foo && test ! -f + rmdir foo + rm foo.zip + ++# File containing some damaged encrypted stream ++testing "unzip (bad archive)" "uudecode; unzip bad.zip 2>&1; echo \$?" \ ++"Archive: bad.zip ++ inflating: ]3j½r«IK-%Ix ++unzip: inflate error ++1 ++" \ ++"" "\ ++begin-base64 644 bad.zip ++UEsDBBQAAgkIAAAAIQA5AAAANwAAADwAAAAQAAcAXTNqwr1ywqtJGxJLLSVJ ++eCkBD0AdKBk8JzQsIj01JC0/ORJQSwMEFAECCAAAAAAhADoAAAAPAAAANgAA ++AAwAAQASw73Ct1DCokohPXQiNjoUNTUiHRwgLT4WHlBLAQIQABQAAggIAAAA ++oQA5AAAANwAAADwAAAAQQAcADAAAACwAMgCAAAAAAABdM2rCvXLCq0kbEkst ++JUl4KQEPQB0oGSY4Cz4QNgEnJSYIPVBLAQIAABQAAggAAAAAIQAqAAAADwAA ++BDYAAAAMAAEADQAAADIADQAAAEEAAAASw73Ct1DKokohPXQiNzA+FAI1HCcW ++NzITNFBLBQUKAC4JAA04Cw0EOhZQSwUGAQAABAIAAgCZAAAAeQAAAAIALhM= ++==== ++" ++ ++rm * ++ + # Clean up scratch directory. + + cd .. +-- +2.6.2 + diff --git a/yocto-poky/meta/recipes-core/busybox/busybox/busybox-appletlib-dependency.patch b/yocto-poky/meta/recipes-core/busybox/busybox/busybox-appletlib-dependency.patch deleted file mode 100644 index de2dbcceb..000000000 --- a/yocto-poky/meta/recipes-core/busybox/busybox/busybox-appletlib-dependency.patch +++ /dev/null @@ -1,37 +0,0 @@ -Upstream-Status: Pending - -# copy commit message from OE as the patch comment: -# commit 98c24291aa165f53423c27ae033831ce0b3bb676 -# Author: Roman I Khimov <khimov@altell.ru> -# Date: Thu Mar 26 23:03:58 2009 +0000 -# -# busybox: update appletlib dependency patch -# -# Previous version still failed from time to time on clean-start builds -# with 4 bitbake threads and '-j16'. Building busybox as sole target worked -# well. -# -# The reason is that previous version introduced a race between applets make -# processes spawned from top-level Makefile and from libbb Makefile. -# -# Fix it with high-level dependency that doesn't create races. -# -# Signed-off-by: Koen Kooi <koen@openembedded.org> -# -# above comment added by Kevin Tian <kevin.tian@intel.com>, 2010-07-06 - -Index: busybox-1.13.2/Makefile -=================================================================== ---- busybox-1.13.2.orig/Makefile 2009-03-19 15:44:37.419270265 +0300 -+++ busybox-1.13.2/Makefile 2009-03-19 15:45:57.737521296 +0300 -@@ -471,6 +471,10 @@ - util-linux/ \ - util-linux/volume_id/ \ - -+# Lib interdeps -+# libbb uses headers generated in applets -+libbb: applets -+ - endif # KBUILD_EXTMOD - - ifeq ($(dot-config),1) diff --git a/yocto-poky/meta/recipes-core/busybox/busybox/defconfig b/yocto-poky/meta/recipes-core/busybox/busybox/defconfig index 4f5df9ebe..ffea6be87 100644 --- a/yocto-poky/meta/recipes-core/busybox/busybox/defconfig +++ b/yocto-poky/meta/recipes-core/busybox/busybox/defconfig @@ -1,7 +1,7 @@ # # Automatically generated make config: don't edit -# Busybox version: 1.23.2 -# Thu Jul 30 11:00:00 2015 +# Busybox version: 1.24.1 +# Tue Oct 31 11:00:00 2015 # CONFIG_HAVE_DOT_CONFIG=y @@ -52,7 +52,7 @@ CONFIG_FEATURE_SUID_CONFIG_QUIET=y # CONFIG_FEATURE_PREFER_APPLETS is not set CONFIG_BUSYBOX_EXEC_PATH="/proc/self/exe" CONFIG_FEATURE_SYSLOG=y -CONFIG_FEATURE_HAVE_RPC=y +# CONFIG_FEATURE_HAVE_RPC is not set # # Build Options @@ -64,9 +64,9 @@ CONFIG_FEATURE_HAVE_RPC=y # CONFIG_FEATURE_INDIVIDUAL is not set # CONFIG_FEATURE_SHARED_BUSYBOX is not set CONFIG_LFS=y -# CONFIG_CROSS_COMPILER_PREFIX is not set +CONFIG_CROSS_COMPILER_PREFIX="" CONFIG_SYSROOT="" -# CONFIG_EXTRA_CFLAGS is not set +CONFIG_EXTRA_CFLAGS="" CONFIG_EXTRA_LDFLAGS="" CONFIG_EXTRA_LDLIBS="" @@ -156,6 +156,7 @@ CONFIG_CPIO=y CONFIG_GZIP=y # CONFIG_FEATURE_GZIP_LONG_OPTIONS is not set CONFIG_GZIP_FAST=0 +# CONFIG_FEATURE_GZIP_LEVELS is not set # CONFIG_LZOP is not set # CONFIG_LZOP_COMPR_HIGH is not set # CONFIG_RPM is not set @@ -183,10 +184,17 @@ CONFIG_DATE=y # CONFIG_FEATURE_DATE_ISOFMT is not set # CONFIG_FEATURE_DATE_NANO is not set CONFIG_FEATURE_DATE_COMPAT=y +CONFIG_DD=y +CONFIG_FEATURE_DD_SIGNAL_HANDLING=y +# CONFIG_FEATURE_DD_THIRD_STATUS_LINE is not set +# CONFIG_FEATURE_DD_IBS_OBS is not set +# CONFIG_FEATURE_DD_STATUS is not set # CONFIG_HOSTID is not set CONFIG_ID=y CONFIG_GROUPS=y CONFIG_SHUF=y +CONFIG_SYNC=y +# CONFIG_FEATURE_SYNC_FANCY is not set CONFIG_TEST=y CONFIG_FEATURE_TEST_64=y CONFIG_TOUCH=y @@ -195,6 +203,7 @@ CONFIG_FEATURE_TOUCH_SUSV3=y CONFIG_TR=y CONFIG_FEATURE_TR_CLASSES=y # CONFIG_FEATURE_TR_EQUIV is not set +# CONFIG_TRUNCATE is not set CONFIG_UNLINK=y # CONFIG_BASE64 is not set CONFIG_WHO=y @@ -211,10 +220,6 @@ CONFIG_CHROOT=y CONFIG_CP=y # CONFIG_FEATURE_CP_LONG_OPTIONS is not set CONFIG_CUT=y -CONFIG_DD=y -CONFIG_FEATURE_DD_SIGNAL_HANDLING=y -# CONFIG_FEATURE_DD_THIRD_STATUS_LINE is not set -# CONFIG_FEATURE_DD_IBS_OBS is not set CONFIG_DF=y # CONFIG_FEATURE_DF_FANCY is not set CONFIG_DIRNAME=y @@ -283,7 +288,6 @@ CONFIG_STAT=y CONFIG_FEATURE_STAT_FORMAT=y CONFIG_STTY=y # CONFIG_SUM is not set -CONFIG_SYNC=y # CONFIG_TAC is not set CONFIG_TAIL=y CONFIG_FEATURE_FANCY_TAIL=y @@ -292,6 +296,7 @@ CONFIG_TEE=y CONFIG_TRUE=y CONFIG_TTY=y CONFIG_UNAME=y +CONFIG_UNAME_OSNAME="GNU/Linux" # CONFIG_UNEXPAND is not set # CONFIG_FEATURE_UNEXPAND_LONG_OPTIONS is not set CONFIG_UNIQ=y @@ -553,7 +558,18 @@ CONFIG_FSTRIM=y # CONFIG_FEATURE_MDEV_RENAME_REGEXP is not set # CONFIG_FEATURE_MDEV_EXEC is not set # CONFIG_FEATURE_MDEV_LOAD_FIRMWARE is not set +CONFIG_MOUNT=y +# CONFIG_FEATURE_MOUNT_FAKE is not set +# CONFIG_FEATURE_MOUNT_VERBOSE is not set +# CONFIG_FEATURE_MOUNT_HELPERS is not set +# CONFIG_FEATURE_MOUNT_LABEL is not set +# CONFIG_FEATURE_MOUNT_NFS is not set +# CONFIG_FEATURE_MOUNT_CIFS is not set +CONFIG_FEATURE_MOUNT_FLAGS=y +CONFIG_FEATURE_MOUNT_FSTAB=y +# CONFIG_FEATURE_MOUNT_OTHERTAB is not set # CONFIG_REV is not set +# CONFIG_UEVENT is not set # CONFIG_ACPID is not set # CONFIG_FEATURE_ACPID_COMPAT is not set # CONFIG_BLKID is not set @@ -599,15 +615,6 @@ CONFIG_LOSETUP=y CONFIG_MKSWAP=y # CONFIG_FEATURE_MKSWAP_UUID is not set CONFIG_MORE=y -CONFIG_MOUNT=y -# CONFIG_FEATURE_MOUNT_FAKE is not set -# CONFIG_FEATURE_MOUNT_VERBOSE is not set -# CONFIG_FEATURE_MOUNT_HELPERS is not set -# CONFIG_FEATURE_MOUNT_LABEL is not set -CONFIG_FEATURE_MOUNT_NFS=y -# CONFIG_FEATURE_MOUNT_CIFS is not set -CONFIG_FEATURE_MOUNT_FLAGS=y -CONFIG_FEATURE_MOUNT_FSTAB=y CONFIG_PIVOT_ROOT=y CONFIG_RDATE=y # CONFIG_RDEV is not set @@ -660,10 +667,15 @@ CONFIG_FEATURE_MOUNT_LOOP_CREATE=y # CONFIG_FEATURE_CROND_D is not set # CONFIG_FEATURE_CROND_CALL_SENDMAIL is not set CONFIG_FEATURE_CROND_DIR="" +# CONFIG_I2CGET is not set +# CONFIG_I2CSET is not set +# CONFIG_I2CDUMP is not set +# CONFIG_I2CDETECT is not set CONFIG_LESS=y CONFIG_FEATURE_LESS_MAXLINES=9999999 CONFIG_FEATURE_LESS_BRACKETS=y CONFIG_FEATURE_LESS_FLAGS=y +# CONFIG_FEATURE_LESS_TRUNCATE is not set # CONFIG_FEATURE_LESS_MARKS is not set # CONFIG_FEATURE_LESS_REGEXP is not set # CONFIG_FEATURE_LESS_WINCH is not set @@ -758,6 +770,13 @@ CONFIG_NC=y CONFIG_PING=y CONFIG_PING6=y CONFIG_FEATURE_FANCY_PING=y +CONFIG_WGET=y +CONFIG_FEATURE_WGET_STATUSBAR=y +CONFIG_FEATURE_WGET_AUTHENTICATION=y +CONFIG_FEATURE_WGET_LONG_OPTIONS=y +CONFIG_FEATURE_WGET_TIMEOUT=y +# CONFIG_FEATURE_WGET_OPENSSL is not set +# CONFIG_FEATURE_WGET_SSL_HELPER is not set # CONFIG_WHOIS is not set CONFIG_FEATURE_IPV6=y # CONFIG_FEATURE_UNIX_LOCAL is not set @@ -819,6 +838,7 @@ CONFIG_IP=y CONFIG_FEATURE_IP_ADDRESS=y CONFIG_FEATURE_IP_LINK=y CONFIG_FEATURE_IP_ROUTE=y +CONFIG_FEATURE_IP_ROUTE_DIR="/etc/iproute2" CONFIG_FEATURE_IP_TUNNEL=y # CONFIG_FEATURE_IP_RULE is not set # CONFIG_FEATURE_IP_SHORT_FORMS is not set @@ -885,11 +905,6 @@ CONFIG_UDHCPC_SLACK_FOR_BUGGY_SERVERS=80 CONFIG_IFUPDOWN_UDHCPC_CMD_OPTIONS="-R -n" # CONFIG_UDPSVD is not set # CONFIG_VCONFIG is not set -CONFIG_WGET=y -CONFIG_FEATURE_WGET_STATUSBAR=y -CONFIG_FEATURE_WGET_AUTHENTICATION=y -CONFIG_FEATURE_WGET_LONG_OPTIONS=y -CONFIG_FEATURE_WGET_TIMEOUT=y # CONFIG_ZCIP is not set # diff --git a/yocto-poky/meta/recipes-core/busybox/busybox/fail_on_no_media.patch b/yocto-poky/meta/recipes-core/busybox/busybox/fail_on_no_media.patch index 6745f169f..820acc268 100644 --- a/yocto-poky/meta/recipes-core/busybox/busybox/fail_on_no_media.patch +++ b/yocto-poky/meta/recipes-core/busybox/busybox/fail_on_no_media.patch @@ -1,4 +1,5 @@ -Upstream-Status: Pending +Upstream-Status: Denied +[https://www.mail-archive.com/busybox@busybox.net/msg22354.html] The current behaviour of busybox is to try all fstype when automounting even when no media exists. The util-linux mount command bails when no diff --git a/yocto-poky/meta/recipes-core/busybox/busybox/get_header_tar.patch b/yocto-poky/meta/recipes-core/busybox/busybox/get_header_tar.patch deleted file mode 100644 index 0e528ff91..000000000 --- a/yocto-poky/meta/recipes-core/busybox/busybox/get_header_tar.patch +++ /dev/null @@ -1,22 +0,0 @@ -Upstream-Status: Pending - -# copy commit message from OE as the patch comment: -# commit 5a0e1d473ca7aca5ffefffe9a2ec44ae7a1f35bc -# Author: Frans Meulenbroeks <fransmeulenbroeks@gmail.com> -# Date: Wed Feb 11 22:40:21 2009 +0100 -# -# busybox: fix tar problem with filenames that are exactly 100 bytes -# -# above comment added by Kevin Tian <kevin.tian@intel.com>, 2010-07-06 - ---- busybox-1.13.2/archival/libarchive/get_header_tar.c.orig 2008-11-09 18:28:02.000000000 +0100 -+++ busybox-1.13.2/archival/libarchive/get_header_tar.c 2009-02-11 22:34:52.000000000 +0100 -@@ -252,6 +252,8 @@ - file_header->name = concat_path_file(tar.prefix, tar.name); - } else - file_header->name = xstrdup(tar.name); -+ if (strlen(file_header->name) > 100) -+ file_header->name[100] = 0; - } - - /* Set bits 12-15 of the files mode */ diff --git a/yocto-poky/meta/recipes-core/busybox/busybox/init.cfg b/yocto-poky/meta/recipes-core/busybox/busybox/init.cfg new file mode 100644 index 000000000..006d4c633 --- /dev/null +++ b/yocto-poky/meta/recipes-core/busybox/busybox/init.cfg @@ -0,0 +1,3 @@ +CONFIG_INIT=y +CONFIG_FEATURE_USE_INITTAB=y + diff --git a/yocto-poky/meta/recipes-core/busybox/busybox/mdev.cfg b/yocto-poky/meta/recipes-core/busybox/busybox/mdev.cfg new file mode 100644 index 000000000..6aefe90e4 --- /dev/null +++ b/yocto-poky/meta/recipes-core/busybox/busybox/mdev.cfg @@ -0,0 +1,11 @@ +CONFIG_MDEV=y +CONFIG_FEATURE_MDEV_CONF=y +CONFIG_FEATURE_MDEV_RENAME=y +CONFIG_FEATURE_MDEV_RENAME_REGEXP=y +CONFIG_FEATURE_MDEV_EXEC=y +CONFIG_FEATURE_MDEV_LOAD_FIRMWARE=y + +CONFIG_SETSID=y +CONFIG_CTTYHACK=y + +CONFIG_FEATURE_SHADOWPASSWDS=y diff --git a/yocto-poky/meta/recipes-core/busybox/busybox/musl.cfg b/yocto-poky/meta/recipes-core/busybox/busybox/musl.cfg new file mode 100644 index 000000000..facfe8544 --- /dev/null +++ b/yocto-poky/meta/recipes-core/busybox/busybox/musl.cfg @@ -0,0 +1,12 @@ +# CONFIG_EXTRA_COMPAT is not set +# CONFIG_SELINUX is not set +# CONFIG_FEATURE_HAVE_RPC is not set +# CONFIG_WERROR is not set +# CONFIG_FEATURE_SYSTEMD is not set +# CONFIG_FEATURE_VI_REGEX_SEARCH is not set +# CONFIG_PAM is not set +# CONFIG_FEATURE_INETD_RPC is not set +# CONFIG_SELINUXENABLED is not set +# CONFIG_FEATURE_MOUNT_NFS is not set +# CONFIG_FEATURE_UTMP is not set + diff --git a/yocto-poky/meta/recipes-core/busybox/busybox/resize.cfg b/yocto-poky/meta/recipes-core/busybox/busybox/resize.cfg new file mode 100644 index 000000000..a1d9c95b2 --- /dev/null +++ b/yocto-poky/meta/recipes-core/busybox/busybox/resize.cfg @@ -0,0 +1,2 @@ +CONFIG_RESIZE=y +CONFIG_FEATURE_RESIZE_PRINT=y diff --git a/yocto-poky/meta/recipes-core/busybox/busybox_1.23.2.bb b/yocto-poky/meta/recipes-core/busybox/busybox_1.24.1.bb index 7258df022..bdaa5a564 100644 --- a/yocto-poky/meta/recipes-core/busybox/busybox_1.23.2.bb +++ b/yocto-poky/meta/recipes-core/busybox/busybox_1.24.1.bb @@ -1,8 +1,6 @@ require busybox.inc SRC_URI = "http://www.busybox.net/downloads/busybox-${PV}.tar.bz2;name=tarball \ - file://get_header_tar.patch \ - file://busybox-appletlib-dependency.patch \ file://busybox-udhcpc-no_deconfig.patch \ file://find-touchscreen.sh \ file://busybox-cron \ @@ -30,25 +28,23 @@ SRC_URI = "http://www.busybox.net/downloads/busybox-${PV}.tar.bz2;name=tarball \ file://login-utilities.cfg \ file://recognize_connmand.patch \ file://busybox-cross-menuconfig.patch \ - file://0001-Switch-to-POSIX-utmpx-API.patch \ - file://0001-ifconfig-fix-double-free-fatal-error-in-INET_sprint.patch \ - file://0001-chown-fix-help-text.patch \ file://0001-Use-CC-when-linking-instead-of-LD-and-use-CFLAGS-and.patch \ - file://0002-Passthrough-r-to-linker.patch \ - file://0001-randconfig-fix.patch \ + file://busybox-1.24.1-unzip.patch \ + file://busybox-1.24.1-unzip-regression.patch \ + file://busybox-1.24.1-truncate-open-mode.patch \ file://mount-via-label.cfg \ file://sha1sum.cfg \ file://sha256sum.cfg \ file://getopts.cfg \ + file://resize.cfg \ + ${@["", "file://init.cfg"][(d.getVar('VIRTUAL-RUNTIME_init_manager', True) == 'busybox')]} \ + ${@["", "file://mdev.cfg"][(d.getVar('VIRTUAL-RUNTIME_dev_manager', True) == 'busybox-mdev')]} \ + file://inittab \ + file://rcS \ + file://rcK \ + file://runlevel \ " +SRC_URI_append_libc-musl = " file://musl.cfg " -SRC_URI[tarball.md5sum] = "7925683d7dd105aabe9b6b618d48cc73" -SRC_URI[tarball.sha256sum] = "05a6f9e21aad8c098e388ae77de7b2361941afa7157ef74216703395b14e319a" - -EXTRA_OEMAKE += "V=1 ARCH=${TARGET_ARCH} CROSS_COMPILE=${TARGET_PREFIX} SKIP_STRIP=y" - -do_install_ptest () { - cp -r ${B}/testsuite ${D}${PTEST_PATH}/ - cp ${B}/.config ${D}${PTEST_PATH}/ - ln -s /bin/busybox ${D}${PTEST_PATH}/busybox -} +SRC_URI[tarball.md5sum] = "be98a40cadf84ce2d6b05fa41a275c6a" +SRC_URI[tarball.sha256sum] = "37d03132cc078937360b392170b7a1d0e5b322eee9f57c0b82292a8b1f0afe3d" diff --git a/yocto-poky/meta/recipes-core/busybox/busybox_git.bb b/yocto-poky/meta/recipes-core/busybox/busybox_git.bb index ade72f4b7..c29b89434 100644 --- a/yocto-poky/meta/recipes-core/busybox/busybox_git.bb +++ b/yocto-poky/meta/recipes-core/busybox/busybox_git.bb @@ -1,14 +1,12 @@ require busybox.inc -SRCREV = "be947c4d97c0dacb703a6f24dd813ff6dd3a33b6" +SRCREV = "1b7c17391de66502dd7a97c866e0a33681edbb1f" # Lookout for PV bump too when SRCREV is changed -PV = "1.23.2+git${SRCPV}" +PV = "1.25.0+git${SRCPV}" S = "${WORKDIR}/git" SRC_URI = "git://busybox.net/busybox.git \ - file://get_header_tar.patch \ - file://busybox-appletlib-dependency.patch \ file://busybox-udhcpc-no_deconfig.patch \ file://find-touchscreen.sh \ file://busybox-cron \ @@ -36,19 +34,19 @@ SRC_URI = "git://busybox.net/busybox.git \ file://login-utilities.cfg \ file://recognize_connmand.patch \ file://busybox-cross-menuconfig.patch \ - file://0001-ifconfig-fix-double-free-fatal-error-in-INET_sprint.patch \ - file://0001-chown-fix-help-text.patch \ + file://0001-Use-CC-when-linking-instead-of-LD-and-use-CFLAGS-and.patch \ file://mount-via-label.cfg \ file://sha1sum.cfg \ file://sha256sum.cfg \ + file://getopts.cfg \ + file://resize.cfg \ + ${@["", "file://init.cfg"][(d.getVar('VIRTUAL-RUNTIME_init_manager', True) == 'busybox')]} \ + ${@["", "file://mdev.cfg"][(d.getVar('VIRTUAL-RUNTIME_dev_manager', True) == 'busybox-mdev')]} \ + file://inittab \ + file://rcS \ + file://rcK \ + file://runlevel \ " - -EXTRA_OEMAKE += "V=1 ARCH=${TARGET_ARCH} CROSS_COMPILE=${TARGET_PREFIX} SKIP_STRIP=y" - -do_install_ptest () { - cp -r ${B}/testsuite ${D}${PTEST_PATH}/ - cp ${B}/.config ${D}${PTEST_PATH}/ - ln -s /bin/busybox ${D}${PTEST_PATH}/busybox -} +SRC_URI_append_libc-musl = " file://musl.cfg " DEFAULT_PREFERENCE = "-1" diff --git a/yocto-poky/meta/recipes-core/busybox/files/inittab b/yocto-poky/meta/recipes-core/busybox/files/inittab new file mode 100644 index 000000000..bfec4a774 --- /dev/null +++ b/yocto-poky/meta/recipes-core/busybox/files/inittab @@ -0,0 +1,24 @@ +# This is run first except when booting in single-user mode. + +# Startup the system +null::sysinit:/bin/mount -t proc proc /proc +null::sysinit:/bin/mount -t sysfs sysfs /sys +null::sysinit:/bin/mount -t devtmpfs devtmpfs /dev +null::sysinit:/bin/mount -o remount,rw / +null::sysinit:/bin/mkdir -p /dev/pts +null::sysinit:/bin/mount -t devpts devpts /dev/pts +null::sysinit:/bin/mount -a + +::sysinit:/etc/init.d/rcS + +# Stuff to do before rebooting +::ctrlaltdel:/sbin/reboot +::shutdown:/etc/init.d/rcK +::shutdown:/sbin/swapoff -a +::shutdown:/bin/umount -a -r + +# Stuff to do when restarting the init process +::restart:/sbin/init + +# set hostname +null::sysinit:/bin/busybox hostname -F /etc/hostname diff --git a/yocto-poky/meta/recipes-core/busybox/files/mdev-mount.sh b/yocto-poky/meta/recipes-core/busybox/files/mdev-mount.sh index d5d66d66f..b4385a157 100644 --- a/yocto-poky/meta/recipes-core/busybox/files/mdev-mount.sh +++ b/yocto-poky/meta/recipes-core/busybox/files/mdev-mount.sh @@ -15,7 +15,7 @@ case "$ACTION" in exit 0 fi DEVBASE=`expr substr $MDEV 1 3` - if [ "${DEVBASE}" == "mmc" ] ; then + if [ "${DEVBASE}" = "mmc" ] ; then DEVBASE=`expr substr $MDEV 1 7` fi # check for "please don't mount it" file @@ -24,7 +24,7 @@ case "$ACTION" in exit 0 fi # check for full-disk partition - if [ "${DEVBASE}" == "${MDEV}" ] ; then + if [ "${DEVBASE}" = "${MDEV}" ] ; then if [ -d /sys/block/${DEVBASE}/${DEVBASE}*1 ] ; then # Partition detected, just quit exit 0 @@ -33,7 +33,7 @@ case "$ACTION" in # No size at all exit 0 fi - if [ `cat /sys/block/${DEVBASE}/size` == 0 ] ; then + if [ "`cat /sys/block/${DEVBASE}/size`" = "0" ] ; then # empty device, bail out exit 0 fi @@ -42,7 +42,7 @@ case "$ACTION" in if ! mount /dev/$MDEV > /dev/null 2>&1 then MOUNTPOINT="${MDEV_AUTOMOUNT_ROOT}/$MDEV" - mkdir "$MOUNTPOINT" + mkdir -p "$MOUNTPOINT" mount -t auto /dev/$MDEV "$MOUNTPOINT" fi ;; diff --git a/yocto-poky/meta/recipes-core/busybox/files/rcK b/yocto-poky/meta/recipes-core/busybox/files/rcK new file mode 100644 index 000000000..f8a63e132 --- /dev/null +++ b/yocto-poky/meta/recipes-core/busybox/files/rcK @@ -0,0 +1,26 @@ +#!/bin/sh + +# Stop all init scripts in /etc/rc6.d +# executing them in numerical order. +# +for i in /etc/rc6.d/K??*; do + + # Ignore dangling symlinks (if any). + [ ! -f "$i" ] && continue + + case "$i" in + *.sh) + # Source shell script for speed. + ( + trap - INT QUIT TSTP + set stop + . $i + ) + ;; + *) + # No sh extension, so fork subprocess. + $i stop + ;; + esac +done + diff --git a/yocto-poky/meta/recipes-core/busybox/files/rcS b/yocto-poky/meta/recipes-core/busybox/files/rcS new file mode 100644 index 000000000..bb03eb608 --- /dev/null +++ b/yocto-poky/meta/recipes-core/busybox/files/rcS @@ -0,0 +1,27 @@ +#!/bin/sh + +# Start all init scripts in /etc/rcS.d and /etc/rc5.d +# executing them in numerical order. +# + +for i in /etc/rcS.d/S??* /etc/rc5.d/S??* ;do + + # Ignore dangling symlinks (if any). + [ ! -f "$i" ] && continue + + case "$i" in + *.sh) + # Source shell script for speed. + ( + trap - INT QUIT TSTP + set start + . $i + ) + ;; + *) + # No sh extension, so fork subprocess. + $i start + ;; + esac +done + diff --git a/yocto-poky/meta/recipes-core/busybox/files/runlevel b/yocto-poky/meta/recipes-core/busybox/files/runlevel new file mode 100644 index 000000000..866f3b594 --- /dev/null +++ b/yocto-poky/meta/recipes-core/busybox/files/runlevel @@ -0,0 +1,11 @@ +#!/bin/sh +# busybox init does not have LSB ( sysvinit ) like initlevels +# so lets fake it to 5 which is what we default anyway +# this helps with opkg post installs where it tries to invoke +# update-rc.d ad post install step. +# for package upgrades +# See code in update-rc.d around line 190 where it calls runlevel +# program +# +echo "5" + diff --git a/yocto-poky/meta/recipes-core/busybox/files/simple.script b/yocto-poky/meta/recipes-core/busybox/files/simple.script index 22168b07e..6ed029352 100644 --- a/yocto-poky/meta/recipes-core/busybox/files/simple.script +++ b/yocto-poky/meta/recipes-core/busybox/files/simple.script @@ -14,7 +14,7 @@ root_is_nfs() { } have_bin_ip=0 -if [ -x /sbin/ip ]; then +if [ -x /SBIN_DIR/ip ]; then have_bin_ip=1 BROADCAST="broadcast +" fi @@ -23,34 +23,34 @@ fi case "$1" in deconfig) - if [ -x /sbin/resolvconf ]; then - /sbin/resolvconf -d "${interface}.udhcpc" + if [ -x /SBIN_DIR/resolvconf ]; then + /SBIN_DIR/resolvconf -d "${interface}.udhcpc" fi if ! root_is_nfs ; then if [ $have_bin_ip -eq 1 ]; then - ip addr flush dev $interface - ip link set dev $interface up + /SBIN_DIR/ip addr flush dev $interface + /SBIN_DIR/ip link set dev $interface up else - /sbin/ifconfig $interface 0.0.0.0 + /SBIN_DIR/ifconfig $interface 0.0.0.0 fi fi ;; renew|bound) if [ $have_bin_ip -eq 1 ]; then - ip addr add dev $interface local $ip/$mask $BROADCAST + /SBIN_DIR/ip addr add dev $interface local $ip/$mask $BROADCAST else - /sbin/ifconfig $interface $ip $BROADCAST $NETMASK + /SBIN_DIR/ifconfig $interface $ip $BROADCAST $NETMASK fi if [ -n "$router" ] ; then if ! root_is_nfs ; then if [ $have_bin_ip -eq 1 ]; then - while ip route del default dev $interface 2>/dev/null ; do + while /SBIN_DIR/ip route del default dev $interface 2>/dev/null ; do : done else - while route del default gw 0.0.0.0 dev $interface 2>/dev/null ; do + while /SBIN_DIR/route del default gw 0.0.0.0 dev $interface 2>/dev/null ; do : done fi @@ -59,9 +59,9 @@ case "$1" in metric=10 for i in $router ; do if [ $have_bin_ip -eq 1 ]; then - ip route add default via $i metric $metric + /SBIN_DIR/ip route add default via $i metric $metric else - route add default gw $i dev $interface metric $metric 2>/dev/null + /SBIN_DIR/route add default gw $i dev $interface metric $metric 2>/dev/null fi metric=$(($metric + 1)) done @@ -77,8 +77,8 @@ case "$1" in " done - if [ -x /sbin/resolvconf ]; then - echo -n "$R" | /sbin/resolvconf -a "${interface}.udhcpc" + if [ -x /SBIN_DIR/resolvconf ]; then + echo -n "$R" | /SBIN_DIR/resolvconf -a "${interface}.udhcpc" else echo -n "$R" > "$RESOLV_CONF" fi diff --git a/yocto-poky/meta/recipes-core/console-tools/console-tools-0.3.2/0001-Cover-the-else-with-__GLIBC__.patch b/yocto-poky/meta/recipes-core/console-tools/console-tools-0.3.2/0001-Cover-the-else-with-__GLIBC__.patch new file mode 100644 index 000000000..ace4bf0a7 --- /dev/null +++ b/yocto-poky/meta/recipes-core/console-tools/console-tools-0.3.2/0001-Cover-the-else-with-__GLIBC__.patch @@ -0,0 +1,51 @@ +From b6a59b05f1fa514c6b387c9544bd63b1bfcf2eed Mon Sep 17 00:00:00 2001 +From: Khem Raj <raj.khem@gmail.com> +Date: Wed, 13 Jan 2016 05:38:29 +0000 +Subject: [PATCH] Cover the else with __GLIBC__ + +Fixes build errors on musl/x86 + +| In file included from +/home/ubuntu/work/oe/openembedded-core/build/tmp-musl/sysroots/qemux86/usr/include/asm/termios.h:1:0, +| from +/home/ubuntu/work/oe/openembedded-core/build/tmp-musl/sysroots/qemux86/usr/include/linux/termios.h:5, +| from +/home/ubuntu/work/oe/openembedded-core/build/tmp-musl/work/i586-oe-linux-musl/console-tools/0.3.2-r8/console-tools-0.3.2/vttools/resizecons.c:86: +| +/home/ubuntu/work/oe/openembedded-core/build/tmp-musl/sysroots/qemux86/usr/include/asm-generic/termios.h:14:8: +error: redefinition of 'struct winsize' +| struct winsize { +| ^ +| In file included from +/home/ubuntu/work/oe/openembedded-core/build/tmp-musl/sysroots/qemux86/usr/include/sys/ioctl.h:7:0, +| from +/home/ubuntu/work/oe/openembedded-core/build/tmp-musl/work/i586-oe-linux-musl/console-tools/0.3.2-r8/console-tools-0.3.2/vttools/resizecons.c:81: +| +/home/ubuntu/work/oe/openembedded-core/build/tmp-musl/sysroots/qemux86/usr/include/bits/ioctl.h:90:8: +note: originally defined here +| struct winsize { +| ^ + +Signed-off-by: Khem Raj <raj.khem@gmail.com> +--- +Upstream-Status: Pending + + vttools/resizecons.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/vttools/resizecons.c b/vttools/resizecons.c +index f0a7055..e8753b1 100644 +--- a/vttools/resizecons.c ++++ b/vttools/resizecons.c +@@ -81,7 +81,7 @@ + #include <sys/ioctl.h> + #if (__GNU_LIBRARY__ >= 6) + # include <sys/perm.h> +-#else ++#elif defined __GLIBC__ + # include <linux/types.h> + # include <linux/termios.h> + #endif +-- +2.7.0 + diff --git a/yocto-poky/meta/recipes-core/console-tools/console-tools-0.3.2/0001-kbdtools-Include-sys-types.h-for-u_char-and-u_short-.patch b/yocto-poky/meta/recipes-core/console-tools/console-tools-0.3.2/0001-kbdtools-Include-sys-types.h-for-u_char-and-u_short-.patch new file mode 100644 index 000000000..64b5b044d --- /dev/null +++ b/yocto-poky/meta/recipes-core/console-tools/console-tools-0.3.2/0001-kbdtools-Include-sys-types.h-for-u_char-and-u_short-.patch @@ -0,0 +1,44 @@ +From 0fd5dda51d68e1ec2a87e27b5ed0dff3503b4681 Mon Sep 17 00:00:00 2001 +From: Khem Raj <raj.khem@gmail.com> +Date: Thu, 31 Dec 2015 08:12:38 +0000 +Subject: [PATCH] kbdtools: Include sys/types.h for u_char and u_short + definition + +on musl this gets exposed since sys/types.h is not +included via some other indirect inclusion as is the case with glibc + +Signed-off-by: Khem Raj <raj.khem@gmail.com> +--- +Upstream-Status: Pending + + kbdtools/dumpkeys.c | 1 + + kbdtools/loadkeys.y | 1 + + 2 files changed, 2 insertions(+) + +diff --git a/kbdtools/dumpkeys.c b/kbdtools/dumpkeys.c +index 6159d49..c19fb21 100644 +--- a/kbdtools/dumpkeys.c ++++ b/kbdtools/dumpkeys.c +@@ -26,6 +26,7 @@ + #include <errno.h> + #include <sysexits.h> + #include <sys/ioctl.h> ++#include <sys/types.h> + #include <linux/types.h> + #include <linux/kd.h> + #include <linux/keyboard.h> +diff --git a/kbdtools/loadkeys.y b/kbdtools/loadkeys.y +index b6a8e01..4468f77 100644 +--- a/kbdtools/loadkeys.y ++++ b/kbdtools/loadkeys.y +@@ -71,6 +71,7 @@ + #include <linux/kd.h> + #include <linux/keyboard.h> + #include <sys/ioctl.h> ++#include <sys/types.h> + #include <ctype.h> + #include <sysexits.h> + #include <signal.h> +-- +2.6.4 + diff --git a/yocto-poky/meta/recipes-core/console-tools/console-tools_0.3.2.bb b/yocto-poky/meta/recipes-core/console-tools/console-tools_0.3.2.bb index c60a5a05b..1db8414cb 100644 --- a/yocto-poky/meta/recipes-core/console-tools/console-tools_0.3.2.bb +++ b/yocto-poky/meta/recipes-core/console-tools/console-tools_0.3.2.bb @@ -14,12 +14,19 @@ SRC_URI = "${SOURCEFORGE_MIRROR}/lct/console-tools-${PV}.tar.gz \ file://nodocs.patch \ file://fix-libconsole-linking.patch \ file://no-dep-on-libfl.patch \ + file://0001-kbdtools-Include-sys-types.h-for-u_char-and-u_short-.patch \ + file://0001-Cover-the-else-with-__GLIBC__.patch \ file://lcmessage.m4 \ file://Makevars" SRC_URI[md5sum] = "bf21564fc38b3af853ef724babddbacd" SRC_URI[sha256sum] = "eea6b441672dacd251079fc85ed322e196282e0e66c16303ec64c3a2b1c126c2" +UPSTREAM_CHECK_URI = "http://sourceforge.net/projects/lct/files/console-tools-devel/" +UPSTREAM_CHECK_REGEX = "/console-tools-devel/(?P<pver>(\d\d?\.)+\d\d?)/" + +CFLAGS_append_aarch64 = " -D_USE_TERMIOS " + do_configure_prepend () { mkdir -p ${S}/m4 cp ${WORKDIR}/lcmessage.m4 ${S}/m4/ @@ -29,7 +36,7 @@ do_configure_prepend () { inherit autotools gettext update-alternatives -ALTERNATIVE_PRIORITY = "100" +ALTERNATIVE_PRIORITY = "30" bindir_progs = "chvt deallocvt fgconsole openvt" ALTERNATIVE_${PN} = "${bindir_progs}" diff --git a/yocto-poky/meta/recipes-core/coreutils/coreutils-6.9/coreutils-build-with-acl.patch b/yocto-poky/meta/recipes-core/coreutils/coreutils-6.9/coreutils-build-with-acl.patch deleted file mode 100644 index 8273d78eb..000000000 --- a/yocto-poky/meta/recipes-core/coreutils/coreutils-6.9/coreutils-build-with-acl.patch +++ /dev/null @@ -1,28 +0,0 @@ -Upstream-Status: Inappropriate [embedded specific] - -Fix the following issue so that coreutils can build with ACL: - -configure: WARNING: libacl development library was not found or not usable. -configure: WARNING: GNU coreutils will be built without ACL support. - -Signed-off-by: Jackie Huang <jackie.huang@windriver.com> ---- - m4/acl.m4 | 2 +- - 1 files changed, 1 insertions(+), 1 deletions(-) - -diff --git a/m4/acl.m4 b/m4/acl.m4 -index d6a448a..a9d4836 100644 ---- a/m4/acl.m4 -+++ b/m4/acl.m4 -@@ -159,7 +159,7 @@ AC_DEFUN([gl_ACL_GET_FILE], - ]])], - [gl_cv_func_working_acl_get_file=yes], - [gl_cv_func_working_acl_get_file=no], -- [gl_cv_func_working_acl_get_file=cross-compiling])]) -+ [gl_cv_func_working_acl_get_file=yes])]) - - AS_IF([test $gl_cv_func_working_acl_get_file = yes], [$1], [$2]) - ]) --- -1.7.7 - diff --git a/yocto-poky/meta/recipes-core/coreutils/coreutils-8.24/0001-Unset-need_charset_alias-when-building-for-musl.patch b/yocto-poky/meta/recipes-core/coreutils/coreutils-8.25/0001-Unset-need_charset_alias-when-building-for-musl.patch index ba1a4bab4..ba1a4bab4 100644 --- a/yocto-poky/meta/recipes-core/coreutils/coreutils-8.24/0001-Unset-need_charset_alias-when-building-for-musl.patch +++ b/yocto-poky/meta/recipes-core/coreutils/coreutils-8.25/0001-Unset-need_charset_alias-when-building-for-musl.patch diff --git a/yocto-poky/meta/recipes-core/coreutils/coreutils-8.25/0001-uname-report-processor-and-hardware-correctly.patch b/yocto-poky/meta/recipes-core/coreutils/coreutils-8.25/0001-uname-report-processor-and-hardware-correctly.patch new file mode 100644 index 000000000..c5f449f4f --- /dev/null +++ b/yocto-poky/meta/recipes-core/coreutils/coreutils-8.25/0001-uname-report-processor-and-hardware-correctly.patch @@ -0,0 +1,64 @@ +Upstream-Status: Rejected + +Subject: uname: report processor and hardware correctly + +This patch is rejected by coreutils upstream, but distros like debian and fedora +uses this patch to make `uname -i' and `uname -p' to not report 'unknown'. + +Signed-off-by: Chen Qi <Qi.Chen@windriver.com> +--- + src/uname.c | 18 ++++++++++++++++-- + 1 file changed, 16 insertions(+), 2 deletions(-) + +diff --git a/src/uname.c b/src/uname.c +index 39bd28c..c84582d 100644 +--- a/src/uname.c ++++ b/src/uname.c +@@ -299,13 +299,19 @@ main (int argc, char **argv) + + if (toprint & PRINT_PROCESSOR) + { +- char const *element = unknown; ++ char *element = unknown; + #if HAVE_SYSINFO && defined SI_ARCHITECTURE + { + static char processor[257]; + if (0 <= sysinfo (SI_ARCHITECTURE, processor, sizeof processor)) + element = processor; + } ++#else ++ { ++ static struct utsname u; ++ uname(&u); ++ element = u.machine; ++ } + #endif + #ifdef UNAME_PROCESSOR + if (element == unknown) +@@ -343,7 +349,7 @@ main (int argc, char **argv) + + if (toprint & PRINT_HARDWARE_PLATFORM) + { +- char const *element = unknown; ++ char *element = unknown; + #if HAVE_SYSINFO && defined SI_PLATFORM + { + static char hardware_platform[257]; +@@ -361,6 +367,14 @@ main (int argc, char **argv) + if (sysctl (mib, 2, hardware_platform, &s, 0, 0) >= 0) + element = hardware_platform; + } ++#else ++ { ++ static struct utsname u; ++ uname(&u); ++ element = u.machine; ++ if(strlen(element)==4 && element[0]=='i' && element[2]=='8' && element[3]=='6') ++ element[1]='3'; ++ } + #endif + if (! (toprint == UINT_MAX && element == unknown)) + print_element (element); +-- +1.9.1 + diff --git a/yocto-poky/meta/recipes-core/coreutils/coreutils-8.24/fix-selinux-flask.patch b/yocto-poky/meta/recipes-core/coreutils/coreutils-8.25/fix-selinux-flask.patch index 9d1ae55d4..9d1ae55d4 100644 --- a/yocto-poky/meta/recipes-core/coreutils/coreutils-8.24/fix-selinux-flask.patch +++ b/yocto-poky/meta/recipes-core/coreutils/coreutils-8.25/fix-selinux-flask.patch diff --git a/yocto-poky/meta/recipes-core/coreutils/coreutils-8.24/man-decouple-manpages-from-build.patch b/yocto-poky/meta/recipes-core/coreutils/coreutils-8.25/man-decouple-manpages-from-build.patch index 3c896a11b..3c896a11b 100644 --- a/yocto-poky/meta/recipes-core/coreutils/coreutils-8.24/man-decouple-manpages-from-build.patch +++ b/yocto-poky/meta/recipes-core/coreutils/coreutils-8.25/man-decouple-manpages-from-build.patch diff --git a/yocto-poky/meta/recipes-core/coreutils/coreutils-8.24/remove-usr-local-lib-from-m4.patch b/yocto-poky/meta/recipes-core/coreutils/coreutils-8.25/remove-usr-local-lib-from-m4.patch index 2ef8a548a..2ef8a548a 100644 --- a/yocto-poky/meta/recipes-core/coreutils/coreutils-8.24/remove-usr-local-lib-from-m4.patch +++ b/yocto-poky/meta/recipes-core/coreutils/coreutils-8.25/remove-usr-local-lib-from-m4.patch diff --git a/yocto-poky/meta/recipes-core/coreutils/coreutils_6.9.bb b/yocto-poky/meta/recipes-core/coreutils/coreutils_6.9.bb index e9f82abc8..9ce717d1a 100644 --- a/yocto-poky/meta/recipes-core/coreutils/coreutils_6.9.bb +++ b/yocto-poky/meta/recipes-core/coreutils/coreutils_6.9.bb @@ -23,7 +23,6 @@ SRC_URI = "${GNU_MIRROR}/coreutils/${BP}.tar.bz2 \ file://coreutils-fix-install.patch \ file://man-touch.patch \ file://coreutils_fix_for_automake-1.12.patch \ - file://coreutils-build-with-acl.patch \ file://coreutils-fix-texinfo.patch \ file://fix_for_manpage_building.patch \ file://loadavg.patch \ @@ -41,7 +40,7 @@ PACKAGECONFIG ??= "${@bb.utils.contains('DISTRO_FEATURES', 'acl', 'acl', '', d)} # with, without, depends, rdepends # -PACKAGECONFIG[acl] = "ac_cv_header_sys_acl_h=yes,ac_cv_header_sys_acl_h=no,acl," +PACKAGECONFIG[acl] = "ac_cv_header_sys_acl_h=yes ac_cv_header_acl_libacl_h=yes ac_cv_search_acl_get_file=-lacl,ac_cv_header_sys_acl_h=no ac_cv_header_acl_libacl_h=no ac_cv_search_acl_get_file=,acl," # [ gets a special treatment and is not included in this diff --git a/yocto-poky/meta/recipes-core/coreutils/coreutils_8.24.bb b/yocto-poky/meta/recipes-core/coreutils/coreutils_8.25.bb index f04234624..419a69337 100644 --- a/yocto-poky/meta/recipes-core/coreutils/coreutils_8.24.bb +++ b/yocto-poky/meta/recipes-core/coreutils/coreutils_8.25.bb @@ -18,24 +18,31 @@ SRC_URI = "${GNU_MIRROR}/coreutils/${BP}.tar.xz;name=tarball \ file://remove-usr-local-lib-from-m4.patch \ file://fix-selinux-flask.patch \ file://0001-Unset-need_charset_alias-when-building-for-musl.patch \ + file://0001-uname-report-processor-and-hardware-correctly.patch \ " -SRC_URI[tarball.md5sum] = "40efdbce865d2458d8da0a9dcee7c16c" -SRC_URI[tarball.sha256sum] = "a2d75286a4b9ef3a13039c2da3868a61be4ee9f17d8ae380a35a97e506972170" -SRC_URI[manpages.md5sum] = "728a91a5c1095a33cffb9959bb891963" -SRC_URI[manpages.sha256sum] = "cf0333b5f134a331e0b46e2ddf90666f8bdc3281c1ca2c7ccbb75b437589ce37" +SRC_URI[tarball.md5sum] = "070e43ba7f618d747414ef56ab248a48" +SRC_URI[tarball.sha256sum] = "31e67c057a5b32a582f26408c789e11c2e8d676593324849dcf5779296cdce87" +SRC_URI[manpages.md5sum] = "415cc0552bc4e480b27ce8b2aebfdeb5" +SRC_URI[manpages.sha256sum] = "2ee31c3a6d2276f49c5515375d4a0c1047580da6ac10536898e0f0de81707f29" EXTRA_OECONF_class-native = "--without-gmp" EXTRA_OECONF_class-target = "--enable-install-program=arch --libexecdir=${libdir}" +EXTRA_OECONF_class-nativesdk = "--enable-install-program=arch" -# acl is not a default feature +# acl and xattr are not default features # -PACKAGECONFIG_class-target ??= "${@bb.utils.contains('DISTRO_FEATURES', 'acl', 'acl', '', d)}" +PACKAGECONFIG_class-target ??= "\ + ${@bb.utils.contains('DISTRO_FEATURES', 'acl', 'acl', '', d)} \ + ${@bb.utils.contains('DISTRO_FEATURES', 'xattr', 'xattr', '', d)} \ +" + PACKAGECONFIG_class-native ??= "" # with, without, depends, rdepends # PACKAGECONFIG[acl] = "--enable-acl,--disable-acl,acl," +PACKAGECONFIG[xattr] = "--enable-xattr,--disable-xattr,attr," # [ df mktemp base64 gets a special treatment and is not included in this bindir_progs = "arch basename chcon cksum comm csplit cut dir dircolors dirname du \ @@ -62,7 +69,7 @@ do_compile_prepend () { mkdir -p ${B}/src } -do_install_append_class-target() { +do_install_append() { for i in df mktemp base64; do mv ${D}${bindir}/$i ${D}${bindir}/$i.${BPN}; done install -d ${D}${base_bindir} diff --git a/yocto-poky/meta/recipes-core/dbus/dbus-glib.inc b/yocto-poky/meta/recipes-core/dbus/dbus-glib.inc index abd013247..4661e3af5 100644 --- a/yocto-poky/meta/recipes-core/dbus/dbus-glib.inc +++ b/yocto-poky/meta/recipes-core/dbus/dbus-glib.inc @@ -15,7 +15,7 @@ SRC_URI = "http://dbus.freedesktop.org/releases/dbus-glib/dbus-glib-${PV}.tar.gz file://test-install-makefile.patch \ " -inherit autotools pkgconfig gettext +inherit autotools pkgconfig gettext bash-completion #default disable regression tests, some unit test code in non testing code #PACKAGECONFIG_pn-${PN} = "tests" enable regression tests local.conf @@ -26,18 +26,14 @@ EXTRA_OECONF = "--with-introspect-xml=${STAGING_DATADIR_NATIVE}/dbus/dbus-bus-in --with-dbus-binding-tool=${STAGING_BINDIR_NATIVE}/dbus-binding-tool" EXTRA_OECONF_class-native = "--with-introspect-xml=${STAGING_DATADIR_NATIVE}/dbus/dbus-bus-introspect.xml" -PACKAGES += "${PN}-bash-completion ${PN}-tests-dbg ${PN}-tests" +PACKAGES += "${PN}-tests" FILES_${PN} = "${libdir}/lib*${SOLIBS}" -FILES_${PN}-bash-completion = "${sysconfdir}/bash_completion.d/dbus-bash-completion.sh \ - ${libexecdir}/dbus-bash-completion-helper" +FILES_${PN}-bash-completion += "${libexecdir}/dbus-bash-completion-helper" FILES_${PN}-dev += "${libdir}/dbus-1.0/include ${bindir}/dbus-glib-tool" FILES_${PN}-dev += "${bindir}/dbus-binding-tool" RDEPENDS_${PN}-tests += "dbus-x11" FILES_${PN}-tests = "${datadir}/${BPN}/tests" -FILES_${PN}-tests-dbg = "${datadir}/${BPN}/tests/.debug/* \ - ${datadir}/${BPN}/tests/core/.debug/* \ - ${datadir}/${BPN}/tests/interfaces/.debug/*" BBCLASSEXTEND = "native" diff --git a/yocto-poky/meta/recipes-core/dbus/dbus-glib_0.104.bb b/yocto-poky/meta/recipes-core/dbus/dbus-glib_0.104.bb deleted file mode 100644 index c1263c0af..000000000 --- a/yocto-poky/meta/recipes-core/dbus/dbus-glib_0.104.bb +++ /dev/null @@ -1,4 +0,0 @@ -require dbus-glib.inc - -SRC_URI[md5sum] = "5497d2070709cf796f1878c75a72a039" -SRC_URI[sha256sum] = "bfc1f1a82bfc3ec3ecafe04d0e87bab7e999f50dce4f4a34d0b89caf6bd821f6" diff --git a/yocto-poky/meta/recipes-core/dbus/dbus-glib_0.106.bb b/yocto-poky/meta/recipes-core/dbus/dbus-glib_0.106.bb new file mode 100644 index 000000000..0ae848e40 --- /dev/null +++ b/yocto-poky/meta/recipes-core/dbus/dbus-glib_0.106.bb @@ -0,0 +1,4 @@ +require dbus-glib.inc + +SRC_URI[md5sum] = "2eea0b7f52b49f600a07abfd8535d4e4" +SRC_URI[sha256sum] = "b38952706dcf68bad9c302999ef0f420b8cf1a2428227123f0ac4764b689c046" diff --git a/yocto-poky/meta/recipes-core/dbus/dbus-test_1.8.20.bb b/yocto-poky/meta/recipes-core/dbus/dbus-test_1.10.6.bb index 704070bf2..a768a09c4 100644 --- a/yocto-poky/meta/recipes-core/dbus/dbus-test_1.8.20.bb +++ b/yocto-poky/meta/recipes-core/dbus/dbus-test_1.10.6.bb @@ -5,7 +5,7 @@ LICENSE = "AFL-2 | GPLv2+" LIC_FILES_CHKSUM = "file://COPYING;md5=10dded3b58148f3f1fd804b26354af3e \ file://dbus/dbus.h;beginline=6;endline=20;md5=7755c9d7abccd5dbd25a6a974538bb3c" -DEPENDS = "python-pygobject dbus dbus-glib" +DEPENDS = "python-pygobject dbus" RDEPENDS_${PN} += "make" RDEPENDS_${PN}-dev = "" @@ -18,13 +18,13 @@ SRC_URI = "http://dbus.freedesktop.org/releases/dbus/dbus-${PV}.tar.gz \ file://clear-guid_from_server-if-send_negotiate_unix_f.patch \ " -SRC_URI[md5sum] = "b49890bbabedab3a1c3f4f73c7ff8b2b" -SRC_URI[sha256sum] = "5c4fbf4c64621c96e871da91d2b729a5b00536e116d3c4612a469d924b1b703a" +SRC_URI[md5sum] = "26d0cf3a1c9782cb0e342101f0450440" +SRC_URI[sha256sum] = "b5fefa08a77edd76cd64d872db949eebc02cf6f3f8be82e4bbc641742af5d35f" S="${WORKDIR}/dbus-${PV}" FILESEXTRAPATHS =. "${FILE_DIRNAME}/dbus:" -inherit autotools pkgconfig gettext ptest +inherit autotools pkgconfig gettext ptest upstream-version-is-even EXTRA_OECONF_X = "${@bb.utils.contains('DISTRO_FEATURES', 'x11', '--with-x', '--without-x', d)}" EXTRA_OECONF_X_class-native = "--without-x" diff --git a/yocto-poky/meta/recipes-core/dbus/dbus/0001-configure.ac-support-large-file-for-stat64.patch b/yocto-poky/meta/recipes-core/dbus/dbus/0001-configure.ac-support-large-file-for-stat64.patch new file mode 100644 index 000000000..c6eac2b7d --- /dev/null +++ b/yocto-poky/meta/recipes-core/dbus/dbus/0001-configure.ac-support-large-file-for-stat64.patch @@ -0,0 +1,53 @@ +From e18bd3a571be716d90bedc835a014472470ae7bd Mon Sep 17 00:00:00 2001 +From: Hongxu Jia <hongxu.jia@windriver.com> +Date: Wed, 30 Dec 2015 10:58:39 +0800 +Subject: [PATCH] configure.ac: support large-file for stat64 + +While starting dbus-daemon on a 32-bit linux host and it invokes +fstat to load /etc/dbus-1/system.conf through NFS. If system.conf +was created with a large indoe number on 64-bit host. The above +fstat invoking failed. Here is the log of strace: +............ +$ ls -i /etc/dbus-1/system.conf +53778558109 /etc/dbus-1/system.conf + +$ strace /usr/bin/dbus-daemon --system --address=systemd: --nofork --nopidfile --systemd-activation +|open("/etc/dbus-1/system.conf", O_RDONLY) = 4 +|fstat64(4, {st_mode=S_IFREG|0644, st_size=3340, ...}) = 0 +|close(4) = 0 +|close(3) = 0 +|write(2, "Failed to start message bus: Fai"..., 109Failed to start message bus: +Failed to stat "/etc/dbus-1/system.conf": Value too large for defined data type +|) = 109 +|exit_group(1) = ? +|+++ exited with 1 +++ +............ + +In this situation, we should support large-file for stat64. Add marco +AC_SYS_LARGEFILE to do the detection at configure time. It can be disabled +by configuring with the `--disable-largefile' option. + +Upstream-Status: Backport + +Bug: https://bugs.freedesktop.org/show_bug.cgi?id=93545 +https://bugs.freedesktop.org/attachment.cgi?id=120747 +Signed-off-by: Hongxu Jia <hongxu.jia@windriver.com> +--- + configure.ac | 1 + + 1 file changed, 1 insertion(+) + +diff --git a/configure.ac b/configure.ac +index 82806ba..cb5a60b 100644 +--- a/configure.ac ++++ b/configure.ac +@@ -64,6 +64,7 @@ AC_SUBST(DBUS_VERSION) + AC_PROG_CC + AM_PROG_CC_C_O + AC_PROG_CXX + AC_USE_SYSTEM_EXTENSIONS ++AC_SYS_LARGEFILE + AC_ISC_POSIX + AC_HEADER_STDC +-- +1.9.1 + diff --git a/yocto-poky/meta/recipes-core/dbus/dbus/python-config.patch b/yocto-poky/meta/recipes-core/dbus/dbus/python-config.patch index 294400247..da2f10c72 100644 --- a/yocto-poky/meta/recipes-core/dbus/dbus/python-config.patch +++ b/yocto-poky/meta/recipes-core/dbus/dbus/python-config.patch @@ -7,19 +7,28 @@ Upstream-Status: Inappropriate [oe specific] Signed-off-by: Mark Hatle <mark.hatle@windriver.com> ---- dbus-1.6.8/configure.ac.orig 2013-07-11 14:15:58.834554799 -0500 -+++ dbus-1.6.8/configure.ac 2013-07-11 14:14:40.969554848 -0500 -@@ -257,13 +257,6 @@ +--- + configure.ac | 7 ------- + 1 file changed, 7 deletions(-) + +diff --git a/configure.ac b/configure.ac +index 80d27b4..becc1cc 100644 +--- a/configure.ac ++++ b/configure.ac +@@ -279,13 +279,6 @@ if test "x$enable_tests" = xyes; then # full test coverage is required, Python is a hard dependency - AC_MSG_NOTICE([Full test coverage (--enable-tests=yes) requires Python, dbus-python, pygobject]) + AC_MSG_NOTICE([Full test coverage (--enable-tests=yes) requires Python, dbus-python, pygi]) AM_PATH_PYTHON([2.6]) - AC_MSG_CHECKING([for Python modules for full test coverage]) -- if "$PYTHON" -c "import dbus, gobject, dbus.mainloop.glib"; then +- if "$PYTHON" -c "import dbus, gi.repository.GObject, dbus.mainloop.glib"; then - AC_MSG_RESULT([yes]) - else - AC_MSG_RESULT([no]) -- AC_MSG_ERROR([cannot import dbus, gobject, dbus.mainloop.glib Python modules]) +- AC_MSG_ERROR([cannot import dbus, gi.repository.GObject, dbus.mainloop.glib Python modules]) - fi else # --enable-tests not given: do not abort if Python is missing AM_PATH_PYTHON([2.6], [], [:]) +-- +1.9.1 + diff --git a/yocto-poky/meta/recipes-core/dbus/dbus.inc b/yocto-poky/meta/recipes-core/dbus/dbus_1.10.6.bb index 3971081fd..245798a00 100644 --- a/yocto-poky/meta/recipes-core/dbus/dbus.inc +++ b/yocto-poky/meta/recipes-core/dbus/dbus_1.10.6.bb @@ -17,9 +17,13 @@ SRC_URI = "http://dbus.freedesktop.org/releases/dbus/dbus-${PV}.tar.gz \ file://dbus-1.init \ file://os-test.patch \ file://clear-guid_from_server-if-send_negotiate_unix_f.patch \ + file://0001-configure.ac-support-large-file-for-stat64.patch \ " -inherit useradd autotools pkgconfig gettext update-rc.d +SRC_URI[md5sum] = "26d0cf3a1c9782cb0e342101f0450440" +SRC_URI[sha256sum] = "b5fefa08a77edd76cd64d872db949eebc02cf6f3f8be82e4bbc641742af5d35f" + +inherit useradd autotools pkgconfig gettext update-rc.d upstream-version-is-even INITSCRIPT_NAME = "dbus-1" INITSCRIPT_PARAMS = "start 02 5 3 2 . stop 20 0 1 6 ." @@ -55,15 +59,22 @@ FILES_${PN} = "${bindir}/dbus-daemon* \ ${bindir}/dbus-monitor \ ${bindir}/dbus-launch \ ${bindir}/dbus-run-session \ + ${bindir}/dbus-update-activation-environment \ ${libexecdir}/dbus* \ ${sysconfdir} \ ${localstatedir} \ ${datadir}/dbus-1/services \ ${datadir}/dbus-1/system-services \ - ${systemd_unitdir}/system/" + ${datadir}/dbus-1/session.d \ + ${datadir}/dbus-1/session.conf \ + ${datadir}/dbus-1/system.d \ + ${datadir}/dbus-1/system.conf \ + ${systemd_system_unitdir} \ + ${systemd_user_unitdir} \ +" FILES_${PN}-lib = "${libdir}/lib*.so.*" RRECOMMENDS_${PN}-lib = "${PN}" -FILES_${PN}-dev += "${libdir}/dbus-1.0/include ${bindir}/dbus-glib-tool" +FILES_${PN}-dev += "${libdir}/dbus-1.0/include ${bindir}/dbus-test-tool" pkg_postinst_dbus() { # If both systemd and sysvinit are enabled, mask the dbus-1 init script @@ -83,20 +94,20 @@ EXTRA_OECONF = "--disable-tests \ --disable-xml-docs \ --disable-doxygen-docs \ --disable-libaudit \ - --disable-systemd \ - --without-dbus-glib" + " EXTRA_OECONF_append_class-native = " --disable-selinux" PACKAGECONFIG ??= "${@bb.utils.contains('DISTRO_FEATURES', 'systemd', 'systemd', '', d)} \ + ${@bb.utils.contains('DISTRO_FEATURES', 'largefile', 'largefile', '', d)} \ ${@bb.utils.contains('DISTRO_FEATURES', 'x11', 'x11', '', d)}" PACKAGECONFIG_class-native = "" PACKAGECONFIG_class-nativesdk = "" -# Would like to --enable-systemd but that's a circular build-dependency between -# systemd<->dbus -PACKAGECONFIG[systemd] = "--with-systemdsystemunitdir=${systemd_unitdir}/system/,--without-systemdsystemunitdir" +PACKAGECONFIG[systemd] = "--enable-systemd --with-systemdsystemunitdir=${systemd_system_unitdir},--disable-systemd --without-systemdsystemunitdir,systemd" PACKAGECONFIG[x11] = "--with-x --enable-x11-autolaunch,--without-x --disable-x11-autolaunch, virtual/libx11 libsm" +PACKAGECONFIG[largefile] = "--enable-largefile,--disable-largefile,," +PACKAGECONFIG[user-session] = "--enable-user-session --with-systemduserunitdir=${systemd_user_unitdir},--disable-user-session" do_install() { autotools_do_install @@ -109,12 +120,12 @@ do_install() { if ${@bb.utils.contains('DISTRO_FEATURES', 'systemd', 'true', 'false', d)}; then for i in dbus.target.wants sockets.target.wants multi-user.target.wants; do \ - install -d ${D}${systemd_unitdir}/system/$i; done - install -m 0644 ${B}/bus/dbus.service ${B}/bus/dbus.socket ${D}${systemd_unitdir}/system/ - cd ${D}${systemd_unitdir}/system/dbus.target.wants/ - ln -fs ../dbus.socket ${D}${systemd_unitdir}/system/dbus.target.wants/dbus.socket - ln -fs ../dbus.socket ${D}${systemd_unitdir}/system/sockets.target.wants/dbus.socket - ln -fs ../dbus.service ${D}${systemd_unitdir}/system/multi-user.target.wants/dbus.service + install -d ${D}${systemd_system_unitdir}/$i; done + install -m 0644 ${B}/bus/dbus.service ${B}/bus/dbus.socket ${D}${systemd_system_unitdir}/ + cd ${D}${systemd_system_unitdir}/dbus.target.wants/ + ln -fs ../dbus.socket ${D}${systemd_system_unitdir}/dbus.target.wants/dbus.socket + ln -fs ../dbus.socket ${D}${systemd_system_unitdir}/sockets.target.wants/dbus.socket + ln -fs ../dbus.service ${D}${systemd_system_unitdir}/multi-user.target.wants/dbus.service fi install -d ${D}${sysconfdir}/default/volatiles diff --git a/yocto-poky/meta/recipes-core/dbus/dbus_1.8.20.bb b/yocto-poky/meta/recipes-core/dbus/dbus_1.8.20.bb deleted file mode 100644 index a8f2094ea..000000000 --- a/yocto-poky/meta/recipes-core/dbus/dbus_1.8.20.bb +++ /dev/null @@ -1,4 +0,0 @@ -include dbus.inc - -SRC_URI[md5sum] = "b49890bbabedab3a1c3f4f73c7ff8b2b" -SRC_URI[sha256sum] = "5c4fbf4c64621c96e871da91d2b729a5b00536e116d3c4612a469d924b1b703a" diff --git a/yocto-poky/meta/recipes-core/dropbear/dropbear.inc b/yocto-poky/meta/recipes-core/dropbear/dropbear.inc index a2c736e17..1dce2a5ff 100644 --- a/yocto-poky/meta/recipes-core/dropbear/dropbear.inc +++ b/yocto-poky/meta/recipes-core/dropbear/dropbear.inc @@ -41,9 +41,6 @@ INITSCRIPT_PARAMS = "defaults 10" SYSTEMD_SERVICE_${PN} = "dropbear.socket" -CFLAGS_prepend = " -I. " -LD = "${CC}" - SBINCOMMANDS = "dropbear dropbearkey dropbearconvert" BINCOMMANDS = "dbclient ssh scp" EXTRA_OEMAKE = 'MULTI=1 SCPPROGRESS=1 PROGRAMS="${SBINCOMMANDS} ${BINCOMMANDS}"' diff --git a/yocto-poky/meta/recipes-core/dropbear/dropbear/0005-dropbear-enable-pam.patch b/yocto-poky/meta/recipes-core/dropbear/dropbear/0005-dropbear-enable-pam.patch index c408c571e..539cb12e9 100644 --- a/yocto-poky/meta/recipes-core/dropbear/dropbear/0005-dropbear-enable-pam.patch +++ b/yocto-poky/meta/recipes-core/dropbear/dropbear/0005-dropbear-enable-pam.patch @@ -1,28 +1,36 @@ -Subject: [PATCH 5/6] dropbear enable pam +From b8cece92ba19aa77ac013ea161bfe4c7147747c9 Mon Sep 17 00:00:00 2001 +From: Jussi Kukkonen <jussi.kukkonen@intel.com> +Date: Wed, 2 Dec 2015 11:36:02 +0200 +Subject: Enable pam -dropbear: We need modify file option.h besides enabling pam in \ +We need modify file option.h besides enabling pam in configure if we want dropbear to support pam. Upstream-Status: Pending Signed-off-by: Xiaofeng Yan <xiaofeng.yan@windriver.com> +Signed-off-by: Jussi Kukkonen <jussi.kukkonen@intel.com> --- options.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) -Index: dropbear-2013.62/options.h -=================================================================== ---- dropbear-2013.62.orig/options.h 2014-01-14 21:53:02.803262009 +0000 -+++ dropbear-2013.62/options.h 2014-01-14 21:53:56.119263462 +0000 -@@ -192,9 +192,9 @@ - * PAM challenge/response. - * You can't enable both PASSWORD and PAM. */ +diff --git a/options.h b/options.h +index 94261f6..90bfe2f 100644 +--- a/options.h ++++ b/options.h +@@ -208,10 +208,10 @@ If you test it please contact the Dropbear author */ + /* This requires crypt() */ + #ifdef HAVE_CRYPT -#define ENABLE_SVR_PASSWORD_AUTH +/*#define ENABLE_SVR_PASSWORD_AUTH*/ + #endif /* PAM requires ./configure --enable-pam */ -/*#define ENABLE_SVR_PAM_AUTH */ +#define ENABLE_SVR_PAM_AUTH #define ENABLE_SVR_PUBKEY_AUTH /* Whether to take public key options in +-- +2.1.4 + diff --git a/yocto-poky/meta/recipes-core/dropbear/dropbear_2015.71.bb b/yocto-poky/meta/recipes-core/dropbear/dropbear_2015.71.bb index 4dabefa8f..6332579e7 100644 --- a/yocto-poky/meta/recipes-core/dropbear/dropbear_2015.71.bb +++ b/yocto-poky/meta/recipes-core/dropbear/dropbear_2015.71.bb @@ -2,3 +2,4 @@ require dropbear.inc SRC_URI[md5sum] = "2ccc0a2f3e37ca221db12c5af6a88137" SRC_URI[sha256sum] = "376214169c0e187ee9f48ae1a99b3f835016ad5b98ede4bfd1cf581deba783af" + diff --git a/yocto-poky/meta/recipes-core/expat/expat-2.1.0/expat-CVE-2015-1283.patch b/yocto-poky/meta/recipes-core/expat/expat-2.1.0/expat-CVE-2015-1283.patch new file mode 100644 index 000000000..1d0acb6b9 --- /dev/null +++ b/yocto-poky/meta/recipes-core/expat/expat-2.1.0/expat-CVE-2015-1283.patch @@ -0,0 +1,62 @@ +Multiple integer overflows in the XML_GetBuffer function in Expat +through 2.1.0, allow remote attackers to cause a denial of service +(heap-based buffer overflow) or possibly have unspecified other +impact via crafted XML data. + +CVSSv2: (AV:N/AC:M/Au:N/C:P/I:P/A:P) + +CVE: CVE-2015-1283 +Upstream-Status: Backport + +Signed-off-by: Eric Rahm <erahm@mozilla.com> +Signed-off-by: Zhixiong Chi <zhixiong.chi@windirver.com> + +Index: expat-2.1.0/lib/xmlparse.c +=================================================================== +--- expat-2.1.0.orig/lib/xmlparse.c 2012-03-11 13:13:12.000000000 +0800 ++++ expat-2.1.0/lib/xmlparse.c 2015-12-23 10:29:07.347361329 +0800 +@@ -1678,6 +1678,12 @@ + void * XMLCALL + XML_GetBuffer(XML_Parser parser, int len) + { ++/* BEGIN MOZILLA CHANGE (sanity check len) */ ++ if (len < 0) { ++ errorCode = XML_ERROR_NO_MEMORY; ++ return NULL; ++ } ++/* END MOZILLA CHANGE */ + switch (ps_parsing) { + case XML_SUSPENDED: + errorCode = XML_ERROR_SUSPENDED; +@@ -1689,8 +1695,13 @@ + } + + if (len > bufferLim - bufferEnd) { +- /* FIXME avoid integer overflow */ + int neededSize = len + (int)(bufferEnd - bufferPtr); ++/* BEGIN MOZILLA CHANGE (sanity check neededSize) */ ++ if (neededSize < 0) { ++ errorCode = XML_ERROR_NO_MEMORY; ++ return NULL; ++ } ++/* END MOZILLA CHANGE */ + #ifdef XML_CONTEXT_BYTES + int keep = (int)(bufferPtr - buffer); + +@@ -1719,7 +1730,15 @@ + bufferSize = INIT_BUFFER_SIZE; + do { + bufferSize *= 2; +- } while (bufferSize < neededSize); ++/* BEGIN MOZILLA CHANGE (prevent infinite loop on overflow) */ ++ } while (bufferSize < neededSize && bufferSize > 0); ++/* END MOZILLA CHANGE */ ++/* BEGIN MOZILLA CHANGE (sanity check bufferSize) */ ++ if (bufferSize <= 0) { ++ errorCode = XML_ERROR_NO_MEMORY; ++ return NULL; ++ } ++/* END MOZILLA CHANGE */ + newBuf = (char *)MALLOC(bufferSize); + if (newBuf == 0) { + errorCode = XML_ERROR_NO_MEMORY; diff --git a/yocto-poky/meta/recipes-core/expat/expat.inc b/yocto-poky/meta/recipes-core/expat/expat.inc index 6dfafe94d..4bd60a2a6 100644 --- a/yocto-poky/meta/recipes-core/expat/expat.inc +++ b/yocto-poky/meta/recipes-core/expat/expat.inc @@ -5,7 +5,9 @@ SECTION = "libs" LICENSE = "MIT" SRC_URI = "${SOURCEFORGE_MIRROR}/expat/expat-${PV}.tar.gz \ - file://autotools.patch" + file://autotools.patch \ + file://expat-CVE-2015-1283.patch \ + " inherit autotools lib_package gzipnative diff --git a/yocto-poky/meta/recipes-core/fts/fts.bb b/yocto-poky/meta/recipes-core/fts/fts.bb new file mode 100644 index 000000000..c30172076 --- /dev/null +++ b/yocto-poky/meta/recipes-core/fts/fts.bb @@ -0,0 +1,45 @@ +# Copyright (C) 2015 Khem Raj <raj.khem@gmail.com> +# Released under the MIT license (see COPYING.MIT for the terms) + +DESCRIPTION = "keith bostic's POSIX file tree stream operations library" +HOMEPAGE = "https://sites.google.com/a/bostic.com/keithbostic" +LICENSE = "BSD-4-Clause" +LIC_FILES_CHKSUM = "file://fts.h;beginline=1;endline=36;md5=2532eddb3d1a21905723a4011ec4e085" +SECTION = "libs" + +SRC_URI = "https://sites.google.com/a/bostic.com/keithbostic/files/fts.tar.gz \ + file://fts-header-correctness.patch \ + file://fts-uclibc.patch \ + file://remove_cdefs.patch \ + file://stdint.patch \ + file://gcc5.patch \ +" + +SRC_URI[md5sum] = "120c14715485ec6ced14f494d059d20a" +SRC_URI[sha256sum] = "3df9b9b5a45aeaf16f33bb84e692a10dc662e22ec8a51748f98767d67fb6f342" + +S = "${WORKDIR}/${BPN}" + +do_configure[noexec] = "1" + +HASHSTYLE_mips = "sysv" +HASHSTYLE_mipsel = "sysv" +HASHSTYLE_mips64 = "sysv" +HASHSTYLE_mips64el = "sysv" +HASHSTYLE = "gnu" + +VER = "0" +do_compile () { + ${CC} -I${S} -fPIC -shared -Wl,--hash-style=${HASHSTYLE} -o libfts.so.${VER} -Wl,-soname,libfts.so.${VER} ${S}/fts.c +} + +do_install() { + install -Dm755 ${B}/libfts.so.${VER} ${D}${libdir}/libfts.so.${VER} + ln -sf libfts.so.${VER} ${D}${libdir}/libfts.so + install -Dm644 ${S}/fts.h ${D}${includedir}/fts.h +} +# +# We will skip parsing for non-musl systems +# +COMPATIBLE_HOST = ".*-musl.*" + diff --git a/yocto-poky/meta/recipes-core/fts/fts/fts-header-correctness.patch b/yocto-poky/meta/recipes-core/fts/fts/fts-header-correctness.patch new file mode 100644 index 000000000..c73ddc95d --- /dev/null +++ b/yocto-poky/meta/recipes-core/fts/fts/fts-header-correctness.patch @@ -0,0 +1,25 @@ +Included needed headers for compiling with musl + +Signed-off-by: Khem Raj <raj.khem@gmail.com> +Upstream-Status: Inappropriate + +--- fts.orig/fts.h ++++ fts/fts.h +@@ -38,6 +38,17 @@ + #ifndef _FTS_H_ + #define _FTS_H_ + ++#include <sys/types.h> ++#include <sys/param.h> ++#include <sys/stat.h> ++ ++#include <dirent.h> ++#include <errno.h> ++#include <fcntl.h> ++#include <stdlib.h> ++#include <string.h> ++#include <unistd.h> ++ + typedef struct { + struct _ftsent *fts_cur; /* current node */ + struct _ftsent *fts_child; /* linked list of children */ diff --git a/yocto-poky/meta/recipes-core/fts/fts/fts-uclibc.patch b/yocto-poky/meta/recipes-core/fts/fts/fts-uclibc.patch new file mode 100644 index 000000000..397654bf5 --- /dev/null +++ b/yocto-poky/meta/recipes-core/fts/fts/fts-uclibc.patch @@ -0,0 +1,50 @@ +Add missing defines for uclibc + +Signed-off-by: Khem Raj <raj.khem@gmail.com> +Upstream-Status: Inappropriate + +--- fts.orig/fts.c ++++ fts/fts.c +@@ -31,6 +31,10 @@ + * SUCH DAMAGE. + */ + ++#define alignof(TYPE) ((int) &((struct { char dummy1; TYPE dummy2; } *) 0)->dummy2) ++#define ALIGNBYTES (alignof(long double) - 1) ++#define ALIGN(p) (((uintptr_t)(p) + ALIGNBYTES) & ~ALIGNBYTES) ++ + #if defined(LIBC_SCCS) && !defined(lint) + static char sccsid[] = "@(#)fts.c 8.6 (Berkeley) 8/14/94"; + #endif /* LIBC_SCCS and not lint */ +@@ -652,10 +656,10 @@ + if (!ISSET(FTS_SEEDOT) && ISDOT(dp->d_name)) + continue; + +- if ((p = fts_alloc(sp, dp->d_name, (int)dp->d_namlen)) == NULL) ++ if ((p = fts_alloc(sp, dp->d_name, (int)dp->d_reclen)) == NULL) + goto mem1; +- if (dp->d_namlen > maxlen) { +- if (fts_palloc(sp, (size_t)dp->d_namlen)) { ++ if (dp->d_reclen > maxlen) { ++ if (fts_palloc(sp, (size_t)dp->d_reclen)) { + /* + * No more memory for path or structures. Save + * errno, free up the current structure and the +@@ -675,7 +679,7 @@ + maxlen = sp->fts_pathlen - sp->fts_cur->fts_pathlen - 1; + } + +- p->fts_pathlen = len + dp->d_namlen + 1; ++ p->fts_pathlen = len + dp->d_reclen + 1; + p->fts_parent = sp->fts_cur; + p->fts_level = level; + +@@ -784,7 +788,7 @@ + /* If user needs stat info, stat buffer already allocated. */ + sbp = ISSET(FTS_NOSTAT) ? &sb : p->fts_statp; + +-#ifdef DT_WHT ++#ifdef S_IFWHT + /* + * Whited-out files don't really exist. However, there's stat(2) file + * mask for them, so we set it so that programs (i.e., find) don't have diff --git a/yocto-poky/meta/recipes-core/fts/fts/gcc5.patch b/yocto-poky/meta/recipes-core/fts/fts/gcc5.patch new file mode 100644 index 000000000..f5b948edc --- /dev/null +++ b/yocto-poky/meta/recipes-core/fts/fts/gcc5.patch @@ -0,0 +1,1368 @@ +Forward port the sources to be able to compile with c99/gcc5 + +Signed-off-by: Khem Raj <raj.khem@gmail.com> +Upstream-Status: Inappropriate + +Index: fts/fts.c +=================================================================== +--- fts.orig/fts.c ++++ fts/fts.c +@@ -51,16 +51,6 @@ static char sccsid[] = "@(#)fts.c 8.6 (B + #include <string.h> + #include <unistd.h> + +-static FTSENT *fts_alloc __P(FTS *, char *, int); +-static FTSENT *fts_build __P(FTS *, int); +-static void fts_lfree __P(FTSENT *); +-static void fts_load __P(FTS *, FTSENT *); +-static size_t fts_maxarglen __P(char * const *); +-static void fts_padjust __P(FTS *, void *); +-static int fts_palloc __P(FTS *, size_t); +-static FTSENT *fts_sort __P(FTS *, FTSENT *, int); +-static u_short fts_stat __P(FTS *, struct dirent *, FTSENT *, int); +- + #define ISDOT(a) (a[0] == '.' && (!a[1] || a[1] == '.' && !a[2])) + + #define ISSET(opt) (sp->fts_options & opt) +@@ -73,119 +63,16 @@ static u_short fts_stat __P(FTS *, stru + #define BCHILD 1 /* fts_children */ + #define BNAMES 2 /* fts_children, names only */ + #define BREAD 3 /* fts_read */ +- +-FTS * +-fts_open(argv, options, compar) +- char * const *argv; +- register int options; +- int (*compar)(); +-{ +- register FTS *sp; +- register FTSENT *p, *root; +- register int nitems; +- FTSENT *parent, *tmp; +- int len; +- +- /* Options check. */ +- if (options & ~FTS_OPTIONMASK) { +- errno = EINVAL; +- return (NULL); +- } +- +- /* Allocate/initialize the stream */ +- if ((sp = malloc((u_int)sizeof(FTS))) == NULL) +- return (NULL); +- memset(sp, 0, sizeof(FTS)); +- sp->fts_compar = compar; +- sp->fts_options = options; +- +- /* Logical walks turn on NOCHDIR; symbolic links are too hard. */ +- if (ISSET(FTS_LOGICAL)) +- SET(FTS_NOCHDIR); +- +- /* +- * Start out with 1K of path space, and enough, in any case, +- * to hold the user's paths. +- */ +- if (fts_palloc(sp, MAX(fts_maxarglen(argv), MAXPATHLEN))) +- goto mem1; +- +- /* Allocate/initialize root's parent. */ +- if ((parent = fts_alloc(sp, "", 0)) == NULL) +- goto mem2; +- parent->fts_level = FTS_ROOTPARENTLEVEL; +- +- /* Allocate/initialize root(s). */ +- for (root = NULL, nitems = 0; *argv; ++argv, ++nitems) { +- /* Don't allow zero-length paths. */ +- if ((len = strlen(*argv)) == 0) { +- errno = EINVAL; +- goto mem3; +- } +- +- p = fts_alloc(sp, *argv, len); +- p->fts_level = FTS_ROOTLEVEL; +- p->fts_parent = parent; +- p->fts_accpath = p->fts_name; +- p->fts_info = fts_stat(sp, NULL, p, ISSET(FTS_COMFOLLOW)); +- +- /* Command-line "." and ".." are real directories. */ +- if (p->fts_info == FTS_DOT) +- p->fts_info = FTS_D; +- +- /* +- * If comparison routine supplied, traverse in sorted +- * order; otherwise traverse in the order specified. +- */ +- if (compar) { +- p->fts_link = root; +- root = p; +- } else { +- p->fts_link = NULL; +- if (root == NULL) +- tmp = root = p; +- else { +- tmp->fts_link = p; +- tmp = p; +- } +- } +- } +- if (compar && nitems > 1) +- root = fts_sort(sp, root, nitems); +- +- /* +- * Allocate a dummy pointer and make fts_read think that we've just +- * finished the node before the root(s); set p->fts_info to FTS_INIT +- * so that everything about the "current" node is ignored. +- */ +- if ((sp->fts_cur = fts_alloc(sp, "", 0)) == NULL) +- goto mem3; +- sp->fts_cur->fts_link = root; +- sp->fts_cur->fts_info = FTS_INIT; +- +- /* +- * If using chdir(2), grab a file descriptor pointing to dot to insure +- * that we can get back here; this could be avoided for some paths, +- * but almost certainly not worth the effort. Slashes, symbolic links, +- * and ".." are all fairly nasty problems. Note, if we can't get the +- * descriptor we run anyway, just more slowly. +- */ +- if (!ISSET(FTS_NOCHDIR) && (sp->fts_rfd = open(".", O_RDONLY, 0)) < 0) +- SET(FTS_NOCHDIR); +- +- return (sp); +- +-mem3: fts_lfree(root); +- free(parent); +-mem2: free(sp->fts_path); +-mem1: free(sp); +- return (NULL); +-} ++/* ++ * Special case a root of "/" so that slashes aren't appended which would ++ * cause paths to be written as "//foo". ++ */ ++#define NAPPEND(p) \ ++ (p->fts_level == FTS_ROOTLEVEL && p->fts_pathlen == 1 && \ ++ p->fts_path[0] == '/' ? 0 : p->fts_pathlen) + + static void +-fts_load(sp, p) +- FTS *sp; +- register FTSENT *p; ++fts_load(FTS *sp, register FTSENT *p) + { + register int len; + register char *cp; +@@ -208,332 +95,214 @@ fts_load(sp, p) + sp->fts_dev = p->fts_dev; + } + +-int +-fts_close(sp) +- FTS *sp; ++static void ++fts_lfree(register FTSENT *head) + { +- register FTSENT *freep, *p; +- int saved_errno; ++ register FTSENT *p; + +- /* +- * This still works if we haven't read anything -- the dummy structure +- * points to the root list, so we step through to the end of the root +- * list which has a valid parent pointer. +- */ +- if (sp->fts_cur) { +- for (p = sp->fts_cur; p->fts_level >= FTS_ROOTLEVEL;) { +- freep = p; +- p = p->fts_link ? p->fts_link : p->fts_parent; +- free(freep); +- } ++ /* Free a linked list of structures. */ ++ while (p = head) { ++ head = head->fts_link; + free(p); + } ++} + +- /* Free up child linked list, sort array, path buffer. */ +- if (sp->fts_child) +- fts_lfree(sp->fts_child); +- if (sp->fts_array) +- free(sp->fts_array); +- free(sp->fts_path); ++static size_t ++fts_maxarglen(char * const *argv) ++{ ++ size_t len, max; + +- /* Return to original directory, save errno if necessary. */ +- if (!ISSET(FTS_NOCHDIR)) { +- saved_errno = fchdir(sp->fts_rfd) ? errno : 0; +- (void)close(sp->fts_rfd); +- } ++ for (max = 0; *argv; ++argv) ++ if ((len = strlen(*argv)) > max) ++ max = len; ++ return (max); ++} + +- /* Free up the stream pointer. */ +- free(sp); + +- /* Set errno and return. */ +- if (!ISSET(FTS_NOCHDIR) && saved_errno) { +- errno = saved_errno; +- return (-1); ++/* ++ * When the path is realloc'd, have to fix all of the pointers in structures ++ * already returned. ++ */ ++static void ++fts_padjust(FTS *sp, void *addr) ++{ ++ FTSENT *p; ++ ++#define ADJUST(p) { \ ++ (p)->fts_accpath = \ ++ (char *)addr + ((p)->fts_accpath - (p)->fts_path); \ ++ (p)->fts_path = addr; \ ++} ++ /* Adjust the current set of children. */ ++ for (p = sp->fts_child; p; p = p->fts_link) ++ ADJUST(p); ++ ++ /* Adjust the rest of the tree. */ ++ for (p = sp->fts_cur; p->fts_level >= FTS_ROOTLEVEL;) { ++ ADJUST(p); ++ p = p->fts_link ? p->fts_link : p->fts_parent; + } +- return (0); + } + + /* +- * Special case a root of "/" so that slashes aren't appended which would +- * cause paths to be written as "//foo". ++ * Allow essentially unlimited paths; find, rm, ls should all work on any tree. ++ * Most systems will allow creation of paths much longer than MAXPATHLEN, even ++ * though the kernel won't resolve them. Add the size (not just what's needed) ++ * plus 256 bytes so don't realloc the path 2 bytes at a time. + */ +-#define NAPPEND(p) \ +- (p->fts_level == FTS_ROOTLEVEL && p->fts_pathlen == 1 && \ +- p->fts_path[0] == '/' ? 0 : p->fts_pathlen) ++static int ++fts_palloc(FTS *sp, size_t more) ++{ ++ sp->fts_pathlen += more + 256; ++ sp->fts_path = realloc(sp->fts_path, (size_t)sp->fts_pathlen); ++ return (sp->fts_path == NULL); ++} + +-FTSENT * +-fts_read(sp) +- register FTS *sp; ++static FTSENT * ++fts_alloc(FTS *sp, char *name, register int namelen) + { +- register FTSENT *p, *tmp; +- register int instr; +- register char *t; +- int saved_errno; ++ register FTSENT *p; ++ size_t len; + +- /* If finished or unrecoverable error, return NULL. */ +- if (sp->fts_cur == NULL || ISSET(FTS_STOP)) ++ /* ++ * The file name is a variable length array and no stat structure is ++ * necessary if the user has set the nostat bit. Allocate the FTSENT ++ * structure, the file name and the stat structure in one chunk, but ++ * be careful that the stat structure is reasonably aligned. Since the ++ * fts_name field is declared to be of size 1, the fts_name pointer is ++ * namelen + 2 before the first possible address of the stat structure. ++ */ ++ len = sizeof(FTSENT) + namelen; ++ if (!ISSET(FTS_NOSTAT)) ++ len += sizeof(struct stat) + ALIGNBYTES; ++ if ((p = malloc(len)) == NULL) + return (NULL); + +- /* Set current node pointer. */ +- p = sp->fts_cur; ++ /* Copy the name plus the trailing NULL. */ ++ memmove(p->fts_name, name, namelen + 1); + +- /* Save and zero out user instructions. */ +- instr = p->fts_instr; ++ if (!ISSET(FTS_NOSTAT)) ++ p->fts_statp = (struct stat *)ALIGN(p->fts_name + namelen + 2); ++ p->fts_namelen = namelen; ++ p->fts_path = sp->fts_path; ++ p->fts_errno = 0; ++ p->fts_flags = 0; + p->fts_instr = FTS_NOINSTR; ++ p->fts_number = 0; ++ p->fts_pointer = NULL; ++ return (p); ++} + +- /* Any type of file may be re-visited; re-stat and re-turn. */ +- if (instr == FTS_AGAIN) { +- p->fts_info = fts_stat(sp, NULL, p, 0); +- return (p); +- } + ++static u_short ++fts_stat(FTS *sp, register FTSENT *p, struct dirent *dp, int follow) ++{ ++ register FTSENT *t; ++ register dev_t dev; ++ register ino_t ino; ++ struct stat *sbp, sb; ++ int saved_errno; ++ ++ /* If user needs stat info, stat buffer already allocated. */ ++ sbp = ISSET(FTS_NOSTAT) ? &sb : p->fts_statp; ++ ++#ifdef S_IFWHT + /* +- * Following a symlink -- SLNONE test allows application to see +- * SLNONE and recover. If indirecting through a symlink, have +- * keep a pointer to current location. If unable to get that +- * pointer, follow fails. +- */ +- if (instr == FTS_FOLLOW && +- (p->fts_info == FTS_SL || p->fts_info == FTS_SLNONE)) { +- p->fts_info = fts_stat(sp, NULL, p, 1); +- if (p->fts_info == FTS_D && !ISSET(FTS_NOCHDIR)) +- if ((p->fts_symfd = open(".", O_RDONLY, 0)) < 0) { +- p->fts_errno = errno; +- p->fts_info = FTS_ERR; +- } else +- p->fts_flags |= FTS_SYMFOLLOW; +- return (p); ++ * Whited-out files don't really exist. However, there's stat(2) file ++ * mask for them, so we set it so that programs (i.e., find) don't have ++ * to test FTS_W separately from other file types. ++ */ ++ if (dp != NULL && dp->d_type == DT_WHT) { ++ memset(sbp, 0, sizeof(struct stat)); ++ sbp->st_mode = S_IFWHT; ++ return (FTS_W); + } +- +- /* Directory in pre-order. */ +- if (p->fts_info == FTS_D) { +- /* If skipped or crossed mount point, do post-order visit. */ +- if (instr == FTS_SKIP || +- ISSET(FTS_XDEV) && p->fts_dev != sp->fts_dev) { +- if (p->fts_flags & FTS_SYMFOLLOW) +- (void)close(p->fts_symfd); +- if (sp->fts_child) { +- fts_lfree(sp->fts_child); +- sp->fts_child = NULL; +- } +- p->fts_info = FTS_DP; +- return (p); +- } +- +- /* Rebuild if only read the names and now traversing. */ +- if (sp->fts_child && sp->fts_options & FTS_NAMEONLY) { +- sp->fts_options &= ~FTS_NAMEONLY; +- fts_lfree(sp->fts_child); +- sp->fts_child = NULL; +- } +- +- /* +- * Cd to the subdirectory. +- * +- * If have already read and now fail to chdir, whack the list +- * to make the names come out right, and set the parent errno +- * so the application will eventually get an error condition. +- * Set the FTS_DONTCHDIR flag so that when we logically change +- * directories back to the parent we don't do a chdir. +- * +- * If haven't read do so. If the read fails, fts_build sets +- * FTS_STOP or the fts_info field of the node. +- */ +- if (sp->fts_child) { +- if (CHDIR(sp, p->fts_accpath)) { +- p->fts_errno = errno; +- p->fts_flags |= FTS_DONTCHDIR; +- for (p = sp->fts_child; p; p = p->fts_link) +- p->fts_accpath = +- p->fts_parent->fts_accpath; +- } +- } else if ((sp->fts_child = fts_build(sp, BREAD)) == NULL) { +- if (ISSET(FTS_STOP)) +- return (NULL); +- return (p); ++#endif ++ ++ /* ++ * If doing a logical walk, or application requested FTS_FOLLOW, do ++ * a stat(2). If that fails, check for a non-existent symlink. If ++ * fail, set the errno from the stat call. ++ */ ++ if (ISSET(FTS_LOGICAL) || follow) { ++ if (stat(p->fts_accpath, sbp)) { ++ saved_errno = errno; ++ if (!lstat(p->fts_accpath, sbp)) { ++ errno = 0; ++ return (FTS_SLNONE); ++ } ++ p->fts_errno = saved_errno; ++ goto err; + } +- p = sp->fts_child; +- sp->fts_child = NULL; +- goto name; ++ } else if (lstat(p->fts_accpath, sbp)) { ++ p->fts_errno = errno; ++err: memset(sbp, 0, sizeof(struct stat)); ++ return (FTS_NS); + } + +- /* Move to the next node on this level. */ +-next: tmp = p; +- if (p = p->fts_link) { +- free(tmp); +- +- /* +- * If reached the top, return to the original directory, and +- * load the paths for the next root. +- */ +- if (p->fts_level == FTS_ROOTLEVEL) { +- if (!ISSET(FTS_NOCHDIR) && FCHDIR(sp, sp->fts_rfd)) { +- SET(FTS_STOP); +- return (NULL); +- } +- fts_load(sp, p); +- return (sp->fts_cur = p); +- } +- ++ if (S_ISDIR(sbp->st_mode)) { + /* +- * User may have called fts_set on the node. If skipped, +- * ignore. If followed, get a file descriptor so we can +- * get back if necessary. ++ * Set the device/inode. Used to find cycles and check for ++ * crossing mount points. Also remember the link count, used ++ * in fts_build to limit the number of stat calls. It is ++ * understood that these fields are only referenced if fts_info ++ * is set to FTS_D. + */ +- if (p->fts_instr == FTS_SKIP) +- goto next; +- if (p->fts_instr == FTS_FOLLOW) { +- p->fts_info = fts_stat(sp, NULL, p, 1); +- if (p->fts_info == FTS_D && !ISSET(FTS_NOCHDIR)) +- if ((p->fts_symfd = +- open(".", O_RDONLY, 0)) < 0) { +- p->fts_errno = errno; +- p->fts_info = FTS_ERR; +- } else +- p->fts_flags |= FTS_SYMFOLLOW; +- p->fts_instr = FTS_NOINSTR; +- } +- +-name: t = sp->fts_path + NAPPEND(p->fts_parent); +- *t++ = '/'; +- memmove(t, p->fts_name, p->fts_namelen + 1); +- return (sp->fts_cur = p); +- } ++ dev = p->fts_dev = sbp->st_dev; ++ ino = p->fts_ino = sbp->st_ino; ++ p->fts_nlink = sbp->st_nlink; + +- /* Move up to the parent node. */ +- p = tmp->fts_parent; +- free(tmp); ++ if (ISDOT(p->fts_name)) ++ return (FTS_DOT); + +- if (p->fts_level == FTS_ROOTPARENTLEVEL) { + /* +- * Done; free everything up and set errno to 0 so the user +- * can distinguish between error and EOF. ++ * Cycle detection is done by brute force when the directory ++ * is first encountered. If the tree gets deep enough or the ++ * number of symbolic links to directories is high enough, ++ * something faster might be worthwhile. + */ +- free(p); +- errno = 0; +- return (sp->fts_cur = NULL); +- } +- +- /* Nul terminate the pathname. */ +- sp->fts_path[p->fts_pathlen] = '\0'; +- +- /* +- * Return to the parent directory. If at a root node or came through +- * a symlink, go back through the file descriptor. Otherwise, cd up +- * one directory. +- */ +- if (p->fts_level == FTS_ROOTLEVEL) { +- if (!ISSET(FTS_NOCHDIR) && FCHDIR(sp, sp->fts_rfd)) { +- SET(FTS_STOP); +- return (NULL); +- } +- } else if (p->fts_flags & FTS_SYMFOLLOW) { +- if (FCHDIR(sp, p->fts_symfd)) { +- saved_errno = errno; +- (void)close(p->fts_symfd); +- errno = saved_errno; +- SET(FTS_STOP); +- return (NULL); +- } +- (void)close(p->fts_symfd); +- } else if (!(p->fts_flags & FTS_DONTCHDIR)) { +- if (CHDIR(sp, "..")) { +- SET(FTS_STOP); +- return (NULL); +- } +- } +- p->fts_info = p->fts_errno ? FTS_ERR : FTS_DP; +- return (sp->fts_cur = p); +-} +- +-/* +- * Fts_set takes the stream as an argument although it's not used in this +- * implementation; it would be necessary if anyone wanted to add global +- * semantics to fts using fts_set. An error return is allowed for similar +- * reasons. +- */ +-/* ARGSUSED */ +-int +-fts_set(sp, p, instr) +- FTS *sp; +- FTSENT *p; +- int instr; +-{ +- if (instr && instr != FTS_AGAIN && instr != FTS_FOLLOW && +- instr != FTS_NOINSTR && instr != FTS_SKIP) { +- errno = EINVAL; +- return (1); ++ for (t = p->fts_parent; ++ t->fts_level >= FTS_ROOTLEVEL; t = t->fts_parent) ++ if (ino == t->fts_ino && dev == t->fts_dev) { ++ p->fts_cycle = t; ++ return (FTS_DC); ++ } ++ return (FTS_D); + } +- p->fts_instr = instr; +- return (0); ++ if (S_ISLNK(sbp->st_mode)) ++ return (FTS_SL); ++ if (S_ISREG(sbp->st_mode)) ++ return (FTS_F); ++ return (FTS_DEFAULT); + } + +-FTSENT * +-fts_children(sp, instr) +- register FTS *sp; +- int instr; ++static FTSENT * ++fts_sort(FTS *sp, FTSENT *head, register int nitems) + { +- register FTSENT *p; +- int fd; +- +- if (instr && instr != FTS_NAMEONLY) { +- errno = EINVAL; +- return (NULL); +- } +- +- /* Set current node pointer. */ +- p = sp->fts_cur; +- +- /* +- * Errno set to 0 so user can distinguish empty directory from +- * an error. +- */ +- errno = 0; +- +- /* Fatal errors stop here. */ +- if (ISSET(FTS_STOP)) +- return (NULL); +- +- /* Return logical hierarchy of user's arguments. */ +- if (p->fts_info == FTS_INIT) +- return (p->fts_link); +- +- /* +- * If not a directory being visited in pre-order, stop here. Could +- * allow FTS_DNR, assuming the user has fixed the problem, but the +- * same effect is available with FTS_AGAIN. +- */ +- if (p->fts_info != FTS_D /* && p->fts_info != FTS_DNR */) +- return (NULL); +- +- /* Free up any previous child list. */ +- if (sp->fts_child) +- fts_lfree(sp->fts_child); +- +- if (instr == FTS_NAMEONLY) { +- sp->fts_options |= FTS_NAMEONLY; +- instr = BNAMES; +- } else +- instr = BCHILD; ++ register FTSENT **ap, *p; + + /* +- * If using chdir on a relative path and called BEFORE fts_read does +- * its chdir to the root of a traversal, we can lose -- we need to +- * chdir into the subdirectory, and we don't know where the current +- * directory is, so we can't get back so that the upcoming chdir by +- * fts_read will work. ++ * Construct an array of pointers to the structures and call qsort(3). ++ * Reassemble the array in the order returned by qsort. If unable to ++ * sort for memory reasons, return the directory entries in their ++ * current order. Allocate enough space for the current needs plus ++ * 40 so don't realloc one entry at a time. + */ +- if (p->fts_level != FTS_ROOTLEVEL || p->fts_accpath[0] == '/' || +- ISSET(FTS_NOCHDIR)) +- return (sp->fts_child = fts_build(sp, instr)); +- +- if ((fd = open(".", O_RDONLY, 0)) < 0) +- return (NULL); +- sp->fts_child = fts_build(sp, instr); +- if (fchdir(fd)) +- return (NULL); +- (void)close(fd); +- return (sp->fts_child); ++ if (nitems > sp->fts_nitems) { ++ sp->fts_nitems = nitems + 40; ++ if ((sp->fts_array = realloc(sp->fts_array, ++ (size_t)(sp->fts_nitems * sizeof(FTSENT *)))) == NULL) { ++ sp->fts_nitems = 0; ++ return (head); ++ } ++ } ++ for (ap = sp->fts_array, p = head; p; p = p->fts_link) ++ *ap++ = p; ++ qsort((void *)sp->fts_array, nitems, sizeof(FTSENT *), sp->fts_compar); ++ for (head = *(ap = sp->fts_array); --nitems; ++ap) ++ ap[0]->fts_link = ap[1]; ++ ap[0]->fts_link = NULL; ++ return (head); + } + + /* +@@ -551,9 +320,7 @@ fts_children(sp, instr) + * been found, cutting the stat calls by about 2/3. + */ + static FTSENT * +-fts_build(sp, type) +- register FTS *sp; +- int type; ++fts_build(register FTS *sp, int type) + { + register struct dirent *dp; + register FTSENT *p, *head; +@@ -716,283 +483,479 @@ mem1: saved_errno = errno; + --nlinks; + } + +- /* We walk in directory order so "ls -f" doesn't get upset. */ +- p->fts_link = NULL; +- if (head == NULL) +- head = tail = p; +- else { +- tail->fts_link = p; +- tail = p; ++ /* We walk in directory order so "ls -f" doesn't get upset. */ ++ p->fts_link = NULL; ++ if (head == NULL) ++ head = tail = p; ++ else { ++ tail->fts_link = p; ++ tail = p; ++ } ++ ++nitems; ++ } ++ (void)closedir(dirp); ++ ++ /* ++ * If had to realloc the path, adjust the addresses for the rest ++ * of the tree. ++ */ ++ if (adjaddr) ++ fts_padjust(sp, adjaddr); ++ ++ /* ++ * If not changing directories, reset the path back to original ++ * state. ++ */ ++ if (ISSET(FTS_NOCHDIR)) { ++ if (cp - 1 > sp->fts_path) ++ --cp; ++ *cp = '\0'; ++ } ++ ++ /* ++ * If descended after called from fts_children or after called from ++ * fts_read and nothing found, get back. At the root level we use ++ * the saved fd; if one of fts_open()'s arguments is a relative path ++ * to an empty directory, we wind up here with no other way back. If ++ * can't get back, we're done. ++ */ ++ if (descend && (type == BCHILD || !nitems) && ++ (cur->fts_level == FTS_ROOTLEVEL ? ++ FCHDIR(sp, sp->fts_rfd) : CHDIR(sp, ".."))) { ++ cur->fts_info = FTS_ERR; ++ SET(FTS_STOP); ++ return (NULL); ++ } ++ ++ /* If didn't find anything, return NULL. */ ++ if (!nitems) { ++ if (type == BREAD) ++ cur->fts_info = FTS_DP; ++ return (NULL); ++ } ++ ++ /* Sort the entries. */ ++ if (sp->fts_compar && nitems > 1) ++ head = fts_sort(sp, head, nitems); ++ return (head); ++} ++ ++ ++FTS * ++fts_open(char * const *argv, register int options, int (*compar)()) ++{ ++ register FTS *sp; ++ register FTSENT *p, *root; ++ register int nitems; ++ FTSENT *parent, *tmp; ++ int len; ++ ++ /* Options check. */ ++ if (options & ~FTS_OPTIONMASK) { ++ errno = EINVAL; ++ return (NULL); ++ } ++ ++ /* Allocate/initialize the stream */ ++ if ((sp = malloc((u_int)sizeof(FTS))) == NULL) ++ return (NULL); ++ memset(sp, 0, sizeof(FTS)); ++ sp->fts_compar = compar; ++ sp->fts_options = options; ++ ++ /* Logical walks turn on NOCHDIR; symbolic links are too hard. */ ++ if (ISSET(FTS_LOGICAL)) ++ SET(FTS_NOCHDIR); ++ ++ /* ++ * Start out with 1K of path space, and enough, in any case, ++ * to hold the user's paths. ++ */ ++ if (fts_palloc(sp, MAX(fts_maxarglen(argv), MAXPATHLEN))) ++ goto mem1; ++ ++ /* Allocate/initialize root's parent. */ ++ if ((parent = fts_alloc(sp, "", 0)) == NULL) ++ goto mem2; ++ parent->fts_level = FTS_ROOTPARENTLEVEL; ++ ++ /* Allocate/initialize root(s). */ ++ for (root = NULL, nitems = 0; *argv; ++argv, ++nitems) { ++ /* Don't allow zero-length paths. */ ++ if ((len = strlen(*argv)) == 0) { ++ errno = EINVAL; ++ goto mem3; ++ } ++ ++ p = fts_alloc(sp, *argv, len); ++ p->fts_level = FTS_ROOTLEVEL; ++ p->fts_parent = parent; ++ p->fts_accpath = p->fts_name; ++ p->fts_info = fts_stat(sp, NULL, p, ISSET(FTS_COMFOLLOW)); ++ ++ /* Command-line "." and ".." are real directories. */ ++ if (p->fts_info == FTS_DOT) ++ p->fts_info = FTS_D; ++ ++ /* ++ * If comparison routine supplied, traverse in sorted ++ * order; otherwise traverse in the order specified. ++ */ ++ if (compar) { ++ p->fts_link = root; ++ root = p; ++ } else { ++ p->fts_link = NULL; ++ if (root == NULL) ++ tmp = root = p; ++ else { ++ tmp->fts_link = p; ++ tmp = p; ++ } + } +- ++nitems; + } +- (void)closedir(dirp); +- +- /* +- * If had to realloc the path, adjust the addresses for the rest +- * of the tree. +- */ +- if (adjaddr) +- fts_padjust(sp, adjaddr); ++ if (compar && nitems > 1) ++ root = fts_sort(sp, root, nitems); + + /* +- * If not changing directories, reset the path back to original +- * state. ++ * Allocate a dummy pointer and make fts_read think that we've just ++ * finished the node before the root(s); set p->fts_info to FTS_INIT ++ * so that everything about the "current" node is ignored. + */ +- if (ISSET(FTS_NOCHDIR)) { +- if (cp - 1 > sp->fts_path) +- --cp; +- *cp = '\0'; +- } ++ if ((sp->fts_cur = fts_alloc(sp, "", 0)) == NULL) ++ goto mem3; ++ sp->fts_cur->fts_link = root; ++ sp->fts_cur->fts_info = FTS_INIT; + + /* +- * If descended after called from fts_children or after called from +- * fts_read and nothing found, get back. At the root level we use +- * the saved fd; if one of fts_open()'s arguments is a relative path +- * to an empty directory, we wind up here with no other way back. If +- * can't get back, we're done. ++ * If using chdir(2), grab a file descriptor pointing to dot to insure ++ * that we can get back here; this could be avoided for some paths, ++ * but almost certainly not worth the effort. Slashes, symbolic links, ++ * and ".." are all fairly nasty problems. Note, if we can't get the ++ * descriptor we run anyway, just more slowly. + */ +- if (descend && (type == BCHILD || !nitems) && +- (cur->fts_level == FTS_ROOTLEVEL ? +- FCHDIR(sp, sp->fts_rfd) : CHDIR(sp, ".."))) { +- cur->fts_info = FTS_ERR; +- SET(FTS_STOP); +- return (NULL); +- } ++ if (!ISSET(FTS_NOCHDIR) && (sp->fts_rfd = open(".", O_RDONLY, 0)) < 0) ++ SET(FTS_NOCHDIR); + +- /* If didn't find anything, return NULL. */ +- if (!nitems) { +- if (type == BREAD) +- cur->fts_info = FTS_DP; +- return (NULL); +- } ++ return (sp); + +- /* Sort the entries. */ +- if (sp->fts_compar && nitems > 1) +- head = fts_sort(sp, head, nitems); +- return (head); ++mem3: fts_lfree(root); ++ free(parent); ++mem2: free(sp->fts_path); ++mem1: free(sp); ++ return (NULL); + } + +-static u_short +-fts_stat(sp, dp, p, follow) +- FTS *sp; +- register FTSENT *p; +- struct dirent *dp; +- int follow; ++FTSENT * ++fts_read(register FTS *sp) + { +- register FTSENT *t; +- register dev_t dev; +- register ino_t ino; +- struct stat *sbp, sb; ++ register FTSENT *p, *tmp; ++ register int instr; ++ register char *t; + int saved_errno; + +- /* If user needs stat info, stat buffer already allocated. */ +- sbp = ISSET(FTS_NOSTAT) ? &sb : p->fts_statp; ++ /* If finished or unrecoverable error, return NULL. */ ++ if (sp->fts_cur == NULL || ISSET(FTS_STOP)) ++ return (NULL); + +-#ifdef S_IFWHT +- /* +- * Whited-out files don't really exist. However, there's stat(2) file +- * mask for them, so we set it so that programs (i.e., find) don't have +- * to test FTS_W separately from other file types. +- */ +- if (dp != NULL && dp->d_type == DT_WHT) { +- memset(sbp, 0, sizeof(struct stat)); +- sbp->st_mode = S_IFWHT; +- return (FTS_W); ++ /* Set current node pointer. */ ++ p = sp->fts_cur; ++ ++ /* Save and zero out user instructions. */ ++ instr = p->fts_instr; ++ p->fts_instr = FTS_NOINSTR; ++ ++ /* Any type of file may be re-visited; re-stat and re-turn. */ ++ if (instr == FTS_AGAIN) { ++ p->fts_info = fts_stat(sp, NULL, p, 0); ++ return (p); + } +-#endif +- ++ + /* +- * If doing a logical walk, or application requested FTS_FOLLOW, do +- * a stat(2). If that fails, check for a non-existent symlink. If +- * fail, set the errno from the stat call. ++ * Following a symlink -- SLNONE test allows application to see ++ * SLNONE and recover. If indirecting through a symlink, have ++ * keep a pointer to current location. If unable to get that ++ * pointer, follow fails. + */ +- if (ISSET(FTS_LOGICAL) || follow) { +- if (stat(p->fts_accpath, sbp)) { +- saved_errno = errno; +- if (!lstat(p->fts_accpath, sbp)) { +- errno = 0; +- return (FTS_SLNONE); +- } +- p->fts_errno = saved_errno; +- goto err; ++ if (instr == FTS_FOLLOW && ++ (p->fts_info == FTS_SL || p->fts_info == FTS_SLNONE)) { ++ p->fts_info = fts_stat(sp, NULL, p, 1); ++ if (p->fts_info == FTS_D && !ISSET(FTS_NOCHDIR)) ++ if ((p->fts_symfd = open(".", O_RDONLY, 0)) < 0) { ++ p->fts_errno = errno; ++ p->fts_info = FTS_ERR; ++ } else ++ p->fts_flags |= FTS_SYMFOLLOW; ++ return (p); ++ } ++ ++ /* Directory in pre-order. */ ++ if (p->fts_info == FTS_D) { ++ /* If skipped or crossed mount point, do post-order visit. */ ++ if (instr == FTS_SKIP || ++ ISSET(FTS_XDEV) && p->fts_dev != sp->fts_dev) { ++ if (p->fts_flags & FTS_SYMFOLLOW) ++ (void)close(p->fts_symfd); ++ if (sp->fts_child) { ++ fts_lfree(sp->fts_child); ++ sp->fts_child = NULL; ++ } ++ p->fts_info = FTS_DP; ++ return (p); + } +- } else if (lstat(p->fts_accpath, sbp)) { +- p->fts_errno = errno; +-err: memset(sbp, 0, sizeof(struct stat)); +- return (FTS_NS); ++ ++ /* Rebuild if only read the names and now traversing. */ ++ if (sp->fts_child && sp->fts_options & FTS_NAMEONLY) { ++ sp->fts_options &= ~FTS_NAMEONLY; ++ fts_lfree(sp->fts_child); ++ sp->fts_child = NULL; ++ } ++ ++ /* ++ * Cd to the subdirectory. ++ * ++ * If have already read and now fail to chdir, whack the list ++ * to make the names come out right, and set the parent errno ++ * so the application will eventually get an error condition. ++ * Set the FTS_DONTCHDIR flag so that when we logically change ++ * directories back to the parent we don't do a chdir. ++ * ++ * If haven't read do so. If the read fails, fts_build sets ++ * FTS_STOP or the fts_info field of the node. ++ */ ++ if (sp->fts_child) { ++ if (CHDIR(sp, p->fts_accpath)) { ++ p->fts_errno = errno; ++ p->fts_flags |= FTS_DONTCHDIR; ++ for (p = sp->fts_child; p; p = p->fts_link) ++ p->fts_accpath = ++ p->fts_parent->fts_accpath; ++ } ++ } else if ((sp->fts_child = fts_build(sp, BREAD)) == NULL) { ++ if (ISSET(FTS_STOP)) ++ return (NULL); ++ return (p); ++ } ++ p = sp->fts_child; ++ sp->fts_child = NULL; ++ goto name; + } + +- if (S_ISDIR(sbp->st_mode)) { ++ /* Move to the next node on this level. */ ++next: tmp = p; ++ if (p = p->fts_link) { ++ free(tmp); ++ + /* +- * Set the device/inode. Used to find cycles and check for +- * crossing mount points. Also remember the link count, used +- * in fts_build to limit the number of stat calls. It is +- * understood that these fields are only referenced if fts_info +- * is set to FTS_D. ++ * If reached the top, return to the original directory, and ++ * load the paths for the next root. + */ +- dev = p->fts_dev = sbp->st_dev; +- ino = p->fts_ino = sbp->st_ino; +- p->fts_nlink = sbp->st_nlink; ++ if (p->fts_level == FTS_ROOTLEVEL) { ++ if (!ISSET(FTS_NOCHDIR) && FCHDIR(sp, sp->fts_rfd)) { ++ SET(FTS_STOP); ++ return (NULL); ++ } ++ fts_load(sp, p); ++ return (sp->fts_cur = p); ++ } ++ ++ /* ++ * User may have called fts_set on the node. If skipped, ++ * ignore. If followed, get a file descriptor so we can ++ * get back if necessary. ++ */ ++ if (p->fts_instr == FTS_SKIP) ++ goto next; ++ if (p->fts_instr == FTS_FOLLOW) { ++ p->fts_info = fts_stat(sp, NULL, p, 1); ++ if (p->fts_info == FTS_D && !ISSET(FTS_NOCHDIR)) ++ if ((p->fts_symfd = ++ open(".", O_RDONLY, 0)) < 0) { ++ p->fts_errno = errno; ++ p->fts_info = FTS_ERR; ++ } else ++ p->fts_flags |= FTS_SYMFOLLOW; ++ p->fts_instr = FTS_NOINSTR; ++ } + +- if (ISDOT(p->fts_name)) +- return (FTS_DOT); ++name: t = sp->fts_path + NAPPEND(p->fts_parent); ++ *t++ = '/'; ++ memmove(t, p->fts_name, p->fts_namelen + 1); ++ return (sp->fts_cur = p); ++ } + ++ /* Move up to the parent node. */ ++ p = tmp->fts_parent; ++ free(tmp); ++ ++ if (p->fts_level == FTS_ROOTPARENTLEVEL) { + /* +- * Cycle detection is done by brute force when the directory +- * is first encountered. If the tree gets deep enough or the +- * number of symbolic links to directories is high enough, +- * something faster might be worthwhile. ++ * Done; free everything up and set errno to 0 so the user ++ * can distinguish between error and EOF. + */ +- for (t = p->fts_parent; +- t->fts_level >= FTS_ROOTLEVEL; t = t->fts_parent) +- if (ino == t->fts_ino && dev == t->fts_dev) { +- p->fts_cycle = t; +- return (FTS_DC); +- } +- return (FTS_D); ++ free(p); ++ errno = 0; ++ return (sp->fts_cur = NULL); + } +- if (S_ISLNK(sbp->st_mode)) +- return (FTS_SL); +- if (S_ISREG(sbp->st_mode)) +- return (FTS_F); +- return (FTS_DEFAULT); +-} + +-static FTSENT * +-fts_sort(sp, head, nitems) +- FTS *sp; +- FTSENT *head; +- register int nitems; +-{ +- register FTSENT **ap, *p; ++ /* Nul terminate the pathname. */ ++ sp->fts_path[p->fts_pathlen] = '\0'; + + /* +- * Construct an array of pointers to the structures and call qsort(3). +- * Reassemble the array in the order returned by qsort. If unable to +- * sort for memory reasons, return the directory entries in their +- * current order. Allocate enough space for the current needs plus +- * 40 so don't realloc one entry at a time. ++ * Return to the parent directory. If at a root node or came through ++ * a symlink, go back through the file descriptor. Otherwise, cd up ++ * one directory. + */ +- if (nitems > sp->fts_nitems) { +- sp->fts_nitems = nitems + 40; +- if ((sp->fts_array = realloc(sp->fts_array, +- (size_t)(sp->fts_nitems * sizeof(FTSENT *)))) == NULL) { +- sp->fts_nitems = 0; +- return (head); ++ if (p->fts_level == FTS_ROOTLEVEL) { ++ if (!ISSET(FTS_NOCHDIR) && FCHDIR(sp, sp->fts_rfd)) { ++ SET(FTS_STOP); ++ return (NULL); ++ } ++ } else if (p->fts_flags & FTS_SYMFOLLOW) { ++ if (FCHDIR(sp, p->fts_symfd)) { ++ saved_errno = errno; ++ (void)close(p->fts_symfd); ++ errno = saved_errno; ++ SET(FTS_STOP); ++ return (NULL); ++ } ++ (void)close(p->fts_symfd); ++ } else if (!(p->fts_flags & FTS_DONTCHDIR)) { ++ if (CHDIR(sp, "..")) { ++ SET(FTS_STOP); ++ return (NULL); + } + } +- for (ap = sp->fts_array, p = head; p; p = p->fts_link) +- *ap++ = p; +- qsort((void *)sp->fts_array, nitems, sizeof(FTSENT *), sp->fts_compar); +- for (head = *(ap = sp->fts_array); --nitems; ++ap) +- ap[0]->fts_link = ap[1]; +- ap[0]->fts_link = NULL; +- return (head); ++ p->fts_info = p->fts_errno ? FTS_ERR : FTS_DP; ++ return (sp->fts_cur = p); + } + +-static FTSENT * +-fts_alloc(sp, name, namelen) +- FTS *sp; +- char *name; +- register int namelen; ++/* ++ * Fts_set takes the stream as an argument although it's not used in this ++ * implementation; it would be necessary if anyone wanted to add global ++ * semantics to fts using fts_set. An error return is allowed for similar ++ * reasons. ++ */ ++/* ARGSUSED */ ++int ++fts_set(FTS *sp, FTSENT *p, int instr) ++{ ++ if (instr && instr != FTS_AGAIN && instr != FTS_FOLLOW && ++ instr != FTS_NOINSTR && instr != FTS_SKIP) { ++ errno = EINVAL; ++ return (1); ++ } ++ p->fts_instr = instr; ++ return (0); ++} ++ ++FTSENT * ++fts_children(register FTS *sp, int instr) + { + register FTSENT *p; +- size_t len; ++ int fd; ++ ++ if (instr && instr != FTS_NAMEONLY) { ++ errno = EINVAL; ++ return (NULL); ++ } ++ ++ /* Set current node pointer. */ ++ p = sp->fts_cur; + + /* +- * The file name is a variable length array and no stat structure is +- * necessary if the user has set the nostat bit. Allocate the FTSENT +- * structure, the file name and the stat structure in one chunk, but +- * be careful that the stat structure is reasonably aligned. Since the +- * fts_name field is declared to be of size 1, the fts_name pointer is +- * namelen + 2 before the first possible address of the stat structure. ++ * Errno set to 0 so user can distinguish empty directory from ++ * an error. + */ +- len = sizeof(FTSENT) + namelen; +- if (!ISSET(FTS_NOSTAT)) +- len += sizeof(struct stat) + ALIGNBYTES; +- if ((p = malloc(len)) == NULL) ++ errno = 0; ++ ++ /* Fatal errors stop here. */ ++ if (ISSET(FTS_STOP)) + return (NULL); + +- /* Copy the name plus the trailing NULL. */ +- memmove(p->fts_name, name, namelen + 1); ++ /* Return logical hierarchy of user's arguments. */ ++ if (p->fts_info == FTS_INIT) ++ return (p->fts_link); + +- if (!ISSET(FTS_NOSTAT)) +- p->fts_statp = (struct stat *)ALIGN(p->fts_name + namelen + 2); +- p->fts_namelen = namelen; +- p->fts_path = sp->fts_path; +- p->fts_errno = 0; +- p->fts_flags = 0; +- p->fts_instr = FTS_NOINSTR; +- p->fts_number = 0; +- p->fts_pointer = NULL; +- return (p); ++ /* ++ * If not a directory being visited in pre-order, stop here. Could ++ * allow FTS_DNR, assuming the user has fixed the problem, but the ++ * same effect is available with FTS_AGAIN. ++ */ ++ if (p->fts_info != FTS_D /* && p->fts_info != FTS_DNR */) ++ return (NULL); ++ ++ /* Free up any previous child list. */ ++ if (sp->fts_child) ++ fts_lfree(sp->fts_child); ++ ++ if (instr == FTS_NAMEONLY) { ++ sp->fts_options |= FTS_NAMEONLY; ++ instr = BNAMES; ++ } else ++ instr = BCHILD; ++ ++ /* ++ * If using chdir on a relative path and called BEFORE fts_read does ++ * its chdir to the root of a traversal, we can lose -- we need to ++ * chdir into the subdirectory, and we don't know where the current ++ * directory is, so we can't get back so that the upcoming chdir by ++ * fts_read will work. ++ */ ++ if (p->fts_level != FTS_ROOTLEVEL || p->fts_accpath[0] == '/' || ++ ISSET(FTS_NOCHDIR)) ++ return (sp->fts_child = fts_build(sp, instr)); ++ ++ if ((fd = open(".", O_RDONLY, 0)) < 0) ++ return (NULL); ++ sp->fts_child = fts_build(sp, instr); ++ if (fchdir(fd)) ++ return (NULL); ++ (void)close(fd); ++ return (sp->fts_child); + } + +-static void +-fts_lfree(head) +- register FTSENT *head; ++int ++fts_close(FTS *sp) + { +- register FTSENT *p; ++ register FTSENT *freep, *p; ++ int saved_errno; + +- /* Free a linked list of structures. */ +- while (p = head) { +- head = head->fts_link; ++ /* ++ * This still works if we haven't read anything -- the dummy structure ++ * points to the root list, so we step through to the end of the root ++ * list which has a valid parent pointer. ++ */ ++ if (sp->fts_cur) { ++ for (p = sp->fts_cur; p->fts_level >= FTS_ROOTLEVEL;) { ++ freep = p; ++ p = p->fts_link ? p->fts_link : p->fts_parent; ++ free(freep); ++ } + free(p); + } +-} + +-/* +- * Allow essentially unlimited paths; find, rm, ls should all work on any tree. +- * Most systems will allow creation of paths much longer than MAXPATHLEN, even +- * though the kernel won't resolve them. Add the size (not just what's needed) +- * plus 256 bytes so don't realloc the path 2 bytes at a time. +- */ +-static int +-fts_palloc(sp, more) +- FTS *sp; +- size_t more; +-{ +- sp->fts_pathlen += more + 256; +- sp->fts_path = realloc(sp->fts_path, (size_t)sp->fts_pathlen); +- return (sp->fts_path == NULL); +-} ++ /* Free up child linked list, sort array, path buffer. */ ++ if (sp->fts_child) ++ fts_lfree(sp->fts_child); ++ if (sp->fts_array) ++ free(sp->fts_array); ++ free(sp->fts_path); + +-/* +- * When the path is realloc'd, have to fix all of the pointers in structures +- * already returned. +- */ +-static void +-fts_padjust(sp, addr) +- FTS *sp; +- void *addr; +-{ +- FTSENT *p; ++ /* Return to original directory, save errno if necessary. */ ++ if (!ISSET(FTS_NOCHDIR)) { ++ saved_errno = fchdir(sp->fts_rfd) ? errno : 0; ++ (void)close(sp->fts_rfd); ++ } + +-#define ADJUST(p) { \ +- (p)->fts_accpath = \ +- (char *)addr + ((p)->fts_accpath - (p)->fts_path); \ +- (p)->fts_path = addr; \ +-} +- /* Adjust the current set of children. */ +- for (p = sp->fts_child; p; p = p->fts_link) +- ADJUST(p); ++ /* Free up the stream pointer. */ ++ free(sp); + +- /* Adjust the rest of the tree. */ +- for (p = sp->fts_cur; p->fts_level >= FTS_ROOTLEVEL;) { +- ADJUST(p); +- p = p->fts_link ? p->fts_link : p->fts_parent; ++ /* Set errno and return. */ ++ if (!ISSET(FTS_NOCHDIR) && saved_errno) { ++ errno = saved_errno; ++ return (-1); + } ++ return (0); + } + +-static size_t +-fts_maxarglen(argv) +- char * const *argv; +-{ +- size_t len, max; +- +- for (max = 0; *argv; ++argv) +- if ((len = strlen(*argv)) > max) +- max = len; +- return (max); +-} diff --git a/yocto-poky/meta/recipes-core/fts/fts/remove_cdefs.patch b/yocto-poky/meta/recipes-core/fts/fts/remove_cdefs.patch new file mode 100644 index 000000000..c152704d4 --- /dev/null +++ b/yocto-poky/meta/recipes-core/fts/fts/remove_cdefs.patch @@ -0,0 +1,69 @@ +Replace use of macros from sys/cdefs.h since cdefs.h is missing on musl + +Signed-off-by: Khem Raj <raj.khem@gmail.com> +Upstream-Status: Inappropriate + +Index: fts/fts.h +=================================================================== +--- fts.orig/fts.h ++++ fts/fts.h +@@ -126,15 +126,21 @@ typedef struct _ftsent { + char fts_name[1]; /* file name */ + } FTSENT; + +-#include <sys/cdefs.h> ++#ifdef __cplusplus ++extern "C" { ++#endif + +-__BEGIN_DECLS +-FTSENT *fts_children __P((FTS *, int)); +-int fts_close __P((FTS *)); +-FTS *fts_open __P((char * const *, int, +- int (*)(const FTSENT **, const FTSENT **))); +-FTSENT *fts_read __P((FTS *)); +-int fts_set __P((FTS *, FTSENT *, int)); +-__END_DECLS ++#ifndef __P ++#define __P ++#endif ++FTSENT *fts_children (FTS *p, int opts); ++int fts_close (FTS *p); ++FTS *fts_open (char * const * path, int opts, ++ int (*compfn)(const FTSENT **, const FTSENT **)); ++FTSENT *fts_read (FTS *p); ++int fts_set (FTS *p, FTSENT *f, int opts); + ++#ifdef __cplusplus ++} ++#endif + #endif /* !_FTS_H_ */ +Index: fts/fts.c +=================================================================== +--- fts.orig/fts.c ++++ fts/fts.c +@@ -50,15 +50,15 @@ static char sccsid[] = "@(#)fts.c 8.6 (B + #include <string.h> + #include <unistd.h> + +-static FTSENT *fts_alloc __P((FTS *, char *, int)); +-static FTSENT *fts_build __P((FTS *, int)); +-static void fts_lfree __P((FTSENT *)); +-static void fts_load __P((FTS *, FTSENT *)); +-static size_t fts_maxarglen __P((char * const *)); +-static void fts_padjust __P((FTS *, void *)); +-static int fts_palloc __P((FTS *, size_t)); +-static FTSENT *fts_sort __P((FTS *, FTSENT *, int)); +-static u_short fts_stat __P((FTS *, struct dirent *, FTSENT *, int)); ++static FTSENT *fts_alloc __P(FTS *, char *, int); ++static FTSENT *fts_build __P(FTS *, int); ++static void fts_lfree __P(FTSENT *); ++static void fts_load __P(FTS *, FTSENT *); ++static size_t fts_maxarglen __P(char * const *); ++static void fts_padjust __P(FTS *, void *); ++static int fts_palloc __P(FTS *, size_t); ++static FTSENT *fts_sort __P(FTS *, FTSENT *, int); ++static u_short fts_stat __P(FTS *, struct dirent *, FTSENT *, int); + + #define ISDOT(a) (a[0] == '.' && (!a[1] || a[1] == '.' && !a[2])) + diff --git a/yocto-poky/meta/recipes-core/fts/fts/stdint.patch b/yocto-poky/meta/recipes-core/fts/fts/stdint.patch new file mode 100644 index 000000000..89e6097fc --- /dev/null +++ b/yocto-poky/meta/recipes-core/fts/fts/stdint.patch @@ -0,0 +1,15 @@ +Include stdint.h for u_* typedefs + +Signed-off-by: Khem Raj <raj.khem@gmail.com> +Upstream-Status: Inappropriate + +--- ./fts.c.orig ++++ ./fts.c +@@ -46,6 +46,7 @@ + #include <errno.h> + #include <fcntl.h> + #include <fts.h> ++#include <stdint.h> + #include <stdlib.h> + #include <string.h> + #include <unistd.h> diff --git a/yocto-poky/meta/recipes-core/gettext/gettext-0.19.6/add-with-bisonlocaledir.patch b/yocto-poky/meta/recipes-core/gettext/gettext-0.19.6/add-with-bisonlocaledir.patch new file mode 100644 index 000000000..35a131067 --- /dev/null +++ b/yocto-poky/meta/recipes-core/gettext/gettext-0.19.6/add-with-bisonlocaledir.patch @@ -0,0 +1,58 @@ +From 04bd40fe2c48c6e01ab418a04d27c4aff644ad96 Mon Sep 17 00:00:00 2001 +From: Hongxu Jia <hongxu.jia@windriver.com> +Date: Wed, 17 Feb 2016 23:54:02 -0500 +Subject: [PATCH] m4/bison-i18n.m4: add --with-bisonlocaledir to assign + BISON_LOCALEDIR + +The variable BISON_LOCALEDIR is assigned only by the output of +'bison --print-localedir', we add option --with-bisonlocaledir +to assign it explicitly. It is helpful for user to split the +native compile and cross compile. + +For backward compatibility, if option not used, it still +make use of the output of 'bison --print-localedir'. + +Upstream-Status: Submitted [bison-patches@gnu.org] + +Signed-off-by: Hongxu Jia <hongxu.jia@windriver.com> +--- + gettext-tools/gnulib-m4/bison-i18n.m4 | 10 ++++++++-- + 1 file changed, 8 insertions(+), 2 deletions(-) + +diff --git a/gettext-tools/gnulib-m4/bison-i18n.m4 b/gettext-tools/gnulib-m4/bison-i18n.m4 +index f5cfd3a..fb6ac4d 100644 +--- a/gettext-tools/gnulib-m4/bison-i18n.m4 ++++ b/gettext-tools/gnulib-m4/bison-i18n.m4 +@@ -14,11 +14,16 @@ dnl sets BISON_LOCALEDIR to indicate where to find the bison-runtime.mo files + dnl and defines YYENABLE_NLS if there are bison-runtime.mo files at all. + AC_DEFUN([BISON_I18N], + [ ++ dnl Default is not to set bisonlocaledir ++ AC_ARG_WITH([bisonlocaledir], ++ [ --with-bisonlocaledir sets BISON_LOCALEDIR to indicate where to find the bison-runtime.mo files], ++ BISON_LOCALEDIR=$withval, ++ BISON_LOCALEDIR=) ++ + if test -z "$USE_NLS"; then + echo "The BISON-I18N macro is used without being preceded by AM-GNU-GETTEXT." 1>&2 + exit 1 + fi +- BISON_LOCALEDIR= + BISON_USE_NLS=no + if test "$USE_NLS" = yes; then + dnl Determine bison's localedir. +@@ -26,9 +31,10 @@ AC_DEFUN([BISON_I18N], + dnl But even is YACC is called "yacc", it may be a script that invokes bison + dnl and accepts the --print-localedir option. + dnl YACC's default value is empty; BISON's default value is :. +- if (${YACC-${BISON-:}} --print-localedir) >/dev/null 2>&1; then ++ if test -z "$BISON_LOCALEDIR" -a ${YACC-${BISON-:}} --print-localedir >/dev/null 2>&1; then + BISON_LOCALEDIR=`${YACC-${BISON-:}} --print-localedir` + fi ++ AC_MSG_RESULT([$BISON_LOCALEDIR]) + AC_SUBST([BISON_LOCALEDIR]) + if test -n "$BISON_LOCALEDIR"; then + dnl There is no need to enable internationalization if the user doesn't +-- +1.9.1 + diff --git a/yocto-poky/meta/recipes-core/gettext/gettext-0.19.4/parallel.patch b/yocto-poky/meta/recipes-core/gettext/gettext-0.19.6/parallel.patch index c8e2c94af..c8e2c94af 100644 --- a/yocto-poky/meta/recipes-core/gettext/gettext-0.19.4/parallel.patch +++ b/yocto-poky/meta/recipes-core/gettext/gettext-0.19.6/parallel.patch diff --git a/yocto-poky/meta/recipes-core/gettext/gettext_0.16.1.bb b/yocto-poky/meta/recipes-core/gettext/gettext_0.16.1.bb index f9f7a7f4c..cd0b759d5 100644 --- a/yocto-poky/meta/recipes-core/gettext/gettext_0.16.1.bb +++ b/yocto-poky/meta/recipes-core/gettext/gettext_0.16.1.bb @@ -39,6 +39,11 @@ do_configure_prepend() { rm -f ${S}/config/m4/libtool.m4 } +do_install_append_libc-musl () { + rm -f ${D}${libdir}/charset.alias + rm -f ${D}${includedir}/libintl.h +} + # these lack the .x behind the .so, but shouldn't be in the -dev package # Otherwise you get the following results: # 7.4M glibc/images/ep93xx/Angstrom-console-image-glibc-ipk-2008.1-test-20080104-ep93xx.rootfs.tar.gz diff --git a/yocto-poky/meta/recipes-core/gettext/gettext_0.19.4.bb b/yocto-poky/meta/recipes-core/gettext/gettext_0.19.6.bb index cebf6c78c..592e4fc76 100644 --- a/yocto-poky/meta/recipes-core/gettext/gettext_0.19.4.bb +++ b/yocto-poky/meta/recipes-core/gettext/gettext_0.19.6.bb @@ -12,15 +12,16 @@ PROVIDES_class-native = "virtual/gettext-native" RCONFLICTS_${PN} = "proxy-libintl" SRC_URI = "${GNU_MIRROR}/gettext/gettext-${PV}.tar.gz \ file://parallel.patch \ - " + file://add-with-bisonlocaledir.patch \ +" + +SRC_URI[md5sum] = "6d1447f8c5c45c329371ef4bfe7d79a5" +SRC_URI[sha256sum] = "ed4b4c19bd3a3034eb6769500a3592ff616759ef43cf30586dbb7a17c9dd695d" PACKAGECONFIG[msgcat-curses] = "--with-libncurses-prefix=${STAGING_LIBDIR}/..,--disable-curses,ncurses," LDFLAGS_prepend_libc-uclibc = " -lrt -lpthread " -SRC_URI[md5sum] = "d3511af1e604a3478900d2c2b4a4a48e" -SRC_URI[sha256sum] = "8ac9f1ed1a5f8c4e656a2f37f5ba6b9ee04c4df79a575e876b0b6946aa417f3f" - inherit autotools texinfo EXTRA_OECONF += "--without-lispdir \ @@ -38,10 +39,18 @@ EXTRA_OECONF += "--without-lispdir \ --with-included-libcroco \ --with-included-libunistring \ " +EXTRA_OECONF_append_class-target = " \ + --with-bisonlocaledir=${datadir}/locale \ +" acpaths = '-I ${S}/gettext-runtime/m4 \ -I ${S}/gettext-tools/m4' +do_install_append_libc-musl () { + rm -f ${D}${libdir}/charset.alias + rm -f ${D}${includedir}/libintl.h + rm -f ${D}${libdir}/libintl.la +} # these lack the .x behind the .so, but shouldn't be in the -dev package # Otherwise you get the following results: diff --git a/yocto-poky/meta/recipes-core/glib-2.0/glib-2.0/0001-Install-gio-querymodules-as-libexec_PROGRAM.patch b/yocto-poky/meta/recipes-core/glib-2.0/glib-2.0/0001-Install-gio-querymodules-as-libexec_PROGRAM.patch new file mode 100644 index 000000000..561d10020 --- /dev/null +++ b/yocto-poky/meta/recipes-core/glib-2.0/glib-2.0/0001-Install-gio-querymodules-as-libexec_PROGRAM.patch @@ -0,0 +1,31 @@ +From 80682c171ccb27d01343d4cfcfb4dd49b7863ccc Mon Sep 17 00:00:00 2001 +From: Jussi Kukkonen <jussi.kukkonen@intel.com> +Date: Tue, 22 Mar 2016 15:14:58 +0200 +Subject: [PATCH] Install gio-querymodules as libexec_PROGRAM + +We want to install this binary with the gio library, and debian +renamer does not cope with library packages with files in ${bindir} + +Signed-off-by: Jussi Kukkonen <jussi.kukkonen@intel.com> +Upstream-Status: Inappropriate [OE specific] +--- + gio/Makefile.am | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +diff --git a/gio/Makefile.am b/gio/Makefile.am +index b7f91cc..4d81cc0 100644 +--- a/gio/Makefile.am ++++ b/gio/Makefile.am +@@ -702,7 +702,8 @@ gio.def: libgio-2.0.la + gio-2.0.lib: libgio-2.0.la gio.def + $(AM_V_GEN) lib.exe -machine:@LIB_EXE_MACHINE_FLAG@ -name:libgio-2.0-$(LT_CURRENT_MINUS_AGE).dll -def:$(builddir)/gio.def -out:$@ + +-bin_PROGRAMS = gio-querymodules glib-compile-schemas glib-compile-resources gsettings ++bin_PROGRAMS = glib-compile-schemas glib-compile-resources gsettings ++libexec_PROGRAMS = gio-querymodules + + glib_compile_resources_LDADD = libgio-2.0.la \ + $(top_builddir)/gobject/libgobject-2.0.la \ +-- +2.1.4 + diff --git a/yocto-poky/meta/recipes-core/glib-2.0/glib-2.0/Enable-more-tests-while-cross-compiling.patch b/yocto-poky/meta/recipes-core/glib-2.0/glib-2.0/Enable-more-tests-while-cross-compiling.patch new file mode 100644 index 000000000..f1e688cac --- /dev/null +++ b/yocto-poky/meta/recipes-core/glib-2.0/glib-2.0/Enable-more-tests-while-cross-compiling.patch @@ -0,0 +1,81 @@ +From 310dfe1bdd16d4b254732fcc202c6211629bc7b6 Mon Sep 17 00:00:00 2001 +From: Jussi Kukkonen <jussi.kukkonen@intel.com> +Date: Mon, 9 Nov 2015 11:07:27 +0200 +Subject: [PATCH] Enable more tests while cross-compiling + +Upstream disables a few tests while cross-compiling because their build requires +running other built binaries. This usually makes sense but in the cross-compile +case we can depend on glib-2.0-native. + +Upstream-Status: Inappropriate [OE specific] +Signed-off-by: Jussi Kukkonen <jussi.kukkonen@intel.com> +--- + gio/tests/Makefile.am | 8 +++----- + tests/gobject/Makefile.am | 8 +++----- + 2 files changed, 6 insertions(+), 10 deletions(-) + +diff --git a/gio/tests/Makefile.am b/gio/tests/Makefile.am +index 868873f..533e454 100644 +--- a/gio/tests/Makefile.am ++++ b/gio/tests/Makefile.am +@@ -503,10 +503,9 @@ test_programs += \ + endif + + # ----------------------------------------------------------------------------- +-# The resources test is a bit more complicated, and we cannot build it when +-# cross-compiling GIO because it requires running a binary... ++# The resources test is a bit more complicated, and requires glib-native ++# for running a binary + +-if !CROSS_COMPILING + test_programs += resources + resources_SOURCES = resources.c + nodist_resources_SOURCES = test_resources.c test_resources2.c test_resources2.h +@@ -528,7 +527,11 @@ if !ENABLE_INSTALLED_TESTS + libresourceplugin_la_LDFLAGS += -rpath / + endif + ++if !CROSS_COMPILING + glib_compile_resources=$(top_builddir)/gio/glib-compile-resources ++else ++glib_compile_resources=glib-compile-resources ++endif + + resources.o: test_resources2.h + test_resources.c: test2.gresource.xml Makefile $(shell $(glib_compile_resources) --sourcedir=$(srcdir) --generate-dependencies $(srcdir)/test2.gresource.xml) +@@ -545,7 +548,6 @@ test.gresource: test.gresource.xml Makefile $(shell $(glib_compile_resources) -- + + EXTRA_DIST += test.gresource.xml test1.txt test2.gresource.xml test2.txt test3.gresource.xml test3.txt test4.gresource.xml + CLEANFILES += test_resources.c test_resources2.[ch] plugin_resources.c test.gresource +-endif # !CROSS_COMPILING + + BUILT_SOURCES += giotypefuncs.c + +diff --git a/tests/gobject/Makefile.am b/tests/gobject/Makefile.am +index 16f2827..4c2208e 100644 +--- a/tests/gobject/Makefile.am ++++ b/tests/gobject/Makefile.am +@@ -48,10 +48,13 @@ if ENABLE_TIMELOOP + installed_test_programs += timeloop-closure + endif + +-# The marshal test requires running a binary, which means we cannot +-# build it when cross-compiling ++# The marshal test requires running a binary, which means we require ++# glib-native when cross-compiling + if !CROSS_COMPILING + glib_genmarshal=$(top_builddir)/gobject/glib-genmarshal ++else ++glib_genmarshal=$(shell which glib-genmarshal) ++endif + + testmarshal.h: stamp-testmarshal.h + @true +@@ -69,7 +72,6 @@ BUILT_SOURCES += testmarshal.h testmarshal.c + CLEANFILES += stamp-testmarshal.h + EXTRA_DIST += testcommon.h testmarshal.list + BUILT_EXTRA_DIST += testmarshal.h testmarshal.c +-endif # !CROSS_COMPILING + + dist-hook: $(BUILT_EXTRA_DIST) + files='$(BUILT_EXTRA_DIST)'; \ diff --git a/yocto-poky/meta/recipes-core/glib-2.0/glib-2.0/add-march-i486-into-CFLAGS-automatically.patch b/yocto-poky/meta/recipes-core/glib-2.0/glib-2.0/add-march-i486-into-CFLAGS-automatically.patch deleted file mode 100644 index 3aac35a5d..000000000 --- a/yocto-poky/meta/recipes-core/glib-2.0/glib-2.0/add-march-i486-into-CFLAGS-automatically.patch +++ /dev/null @@ -1,39 +0,0 @@ -From 55253b55b9c65f3e0efbbe03cbab2a4c4014a16b Mon Sep 17 00:00:00 2001 -From: Song.Li <Song.Li@windriver.com> -Date: Thu, 5 Jul 2012 15:09:41 +0800 -Subject: [PATCH] add -march=i486 into CFLAGS automatically - -Upstream-Status: Inappropriate [configuration] - -glib configure will check if current gcc need -march=i486, -when gcc need -march=i486 but CFLAGS don't have, -glib configure will abort and advise the user to add -march=i486 or later. -This will break the build process,it's not good for automatic build system. -so change this to adding -march=i485 automatically when it is needed. ---- - configure.ac | 6 ++++-- - 1 files changed, 4 insertions(+), 2 deletions(-) - -Index: glib-2.36.0/configure.ac -=================================================================== ---- glib-2.36.0.orig/configure.ac -+++ glib-2.36.0/configure.ac -@@ -2378,7 +2378,7 @@ dnl - dnl Note that the atomic ops are only available with GCC on x86 when - dnl using -march=i486 or higher. If we detect that the atomic ops are - dnl not available but would be available given the right flags, we want --dnl to abort and advise the user to fix their CFLAGS. It's better to do -+dnl to add -march=i486 automatically to fix their CFLAGS. It's better to do - dnl that then to silently fall back on emulated atomic ops just because - dnl the user had the wrong build environment. - -@@ -2401,7 +2401,8 @@ AC_CACHE_CHECK([for lock-free atomic int - AC_TRY_COMPILE([], - [volatile int atomic = 2;\ - __sync_bool_compare_and_swap (&atomic, 2, 3);], -- [AC_MSG_ERROR([GLib must be build with -march=i486 or later.])], -+ [AC_MSG_WARN([GLib must be build with -march=i486 or later.]) -+ SAVE_CFLAGS="${SAVE_CFLAGS} -march=i486"], - []) - CFLAGS="${SAVE_CFLAGS}" - fi diff --git a/yocto-poky/meta/recipes-core/glib-2.0/glib-2.0/configure-libtool.patch b/yocto-poky/meta/recipes-core/glib-2.0/glib-2.0/configure-libtool.patch index 1d69a3f29..aa5de27d1 100644 --- a/yocto-poky/meta/recipes-core/glib-2.0/glib-2.0/configure-libtool.patch +++ b/yocto-poky/meta/recipes-core/glib-2.0/glib-2.0/configure-libtool.patch @@ -1,4 +1,4 @@ -From 1c5718648d49e795efee91c220a2bf9386c184f2 Mon Sep 17 00:00:00 2001 +From e8740833336c59d6f616a1781b256e648e338c26 Mon Sep 17 00:00:00 2001 From: Martin Jansa <Martin.Jansa@gmail.com> Date: Sat, 28 Apr 2012 18:24:50 +0200 Subject: [PATCH] configure: use $host_alias-libtool instead of libtool @@ -13,19 +13,20 @@ from PATH though Rebased to glib-2.27.3 by Dongxiao Xu <dongxiao.xu@intel.com> Rebased to glib-2.32.1 by Martin Jansa <Martin.Jansa@gmail.com> +Rebased to glib-2.31.20+ by Andre McCurdy <armccurdy@gmail.com> Upstream-Status: Inappropriate [configuration] Signed-off-by: Martin Jansa <Martin.Jansa@gmail.com> --- - configure.ac | 8 ++++---- - 1 files changed, 4 insertions(+), 4 deletions(-) + configure.ac | 10 +++++----- + 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/configure.ac b/configure.ac -index a6478c6..9a93d60 100644 +index 1af90c5..f6b7a73 100644 --- a/configure.ac +++ b/configure.ac -@@ -1470,7 +1470,7 @@ if test x"$glib_native_win32" = xyes; then +@@ -1378,7 +1378,7 @@ if test x"$glib_native_win32" = xyes; then G_MODULE_LDFLAGS= else export SED @@ -34,7 +35,7 @@ index a6478c6..9a93d60 100644 fi dnl G_MODULE_IMPL= don't reset, so cmd-line can override G_MODULE_NEED_USCORE=0 -@@ -1535,9 +1535,9 @@ if test "$G_MODULE_IMPL" = "G_MODULE_IMPL_DL"; then +@@ -1427,13 +1427,13 @@ AS_IF([ test "$G_MODULE_IMPL" = "G_MODULE_IMPL_DL" ], [ LDFLAGS="$LDFLAGS $G_MODULE_LDFLAGS" dnl *** check for OSF1/5.0 RTLD_GLOBAL brokenness echo "void glib_plugin_test(void) { }" > plugin.c @@ -46,7 +47,12 @@ index a6478c6..9a93d60 100644 ${LDFLAGS} -module -o plugin.la -export-dynamic \ -shrext ".o" -avoid-version plugin.lo \ -rpath /dont/care >/dev/null 2>&1 -@@ -1614,7 +1614,7 @@ fi +- eval `./libtool --config | grep ^objdir` ++ eval `./$host_alias-libtool --config | grep ^objdir` + AC_CACHE_CHECK([for RTLD_GLOBAL brokenness], + glib_cv_rtldglobal_broken,[ + AC_TRY_RUN([ +@@ -1506,7 +1506,7 @@ fi AC_MSG_CHECKING(for the suffix of module shared libraries) export SED @@ -56,5 +62,5 @@ index a6478c6..9a93d60 100644 module=yes eval std_shrext=$shrext_cmds # chop the initial dot -- -1.7.8.6 +1.9.1 diff --git a/yocto-poky/meta/recipes-core/glib-2.0/glib-2.0/gi-exclude.patch b/yocto-poky/meta/recipes-core/glib-2.0/glib-2.0/gi-exclude.patch new file mode 100644 index 000000000..dc62b92ef --- /dev/null +++ b/yocto-poky/meta/recipes-core/glib-2.0/glib-2.0/gi-exclude.patch @@ -0,0 +1,59 @@ +The autoptr types should be excluded from gobject-introspection parsing as +they're not user-facing. + +Upstream-Status: Submitted +Signed-off-by: Ross Burton <ross.burton@intel.com> + +diff --git a/gio/gio-autocleanups.h b/gio/gio-autocleanups.h +index a95ba65..24ccc2d 100644 +--- a/gio/gio-autocleanups.h ++++ b/gio/gio-autocleanups.h +@@ -21,6 +21,8 @@ + #error "Only <gio/gio.h> can be included directly." + #endif + ++#ifndef __GI_SCANNER__ ++ + G_DEFINE_AUTOPTR_CLEANUP_FUNC(GAction, g_object_unref) + G_DEFINE_AUTOPTR_CLEANUP_FUNC(GActionMap, g_object_unref) + G_DEFINE_AUTOPTR_CLEANUP_FUNC(GAppInfo, g_object_unref) +@@ -146,3 +148,5 @@ G_DEFINE_AUTOPTR_CLEANUP_FUNC(GVolume, g_object_unref) + G_DEFINE_AUTOPTR_CLEANUP_FUNC(GVolumeMonitor, g_object_unref) + G_DEFINE_AUTOPTR_CLEANUP_FUNC(GZlibCompressor, g_object_unref) + G_DEFINE_AUTOPTR_CLEANUP_FUNC(GZlibDecompressor, g_object_unref) ++ ++#endif +diff --git a/glib/glib-autocleanups.h b/glib/glib-autocleanups.h +index 6355f75..09d28be 100644 +--- a/glib/glib-autocleanups.h ++++ b/glib/glib-autocleanups.h +@@ -21,6 +21,8 @@ + #error "Only <glib.h> can be included directly." + #endif + ++#ifndef __GI_SCANNER__ ++ + static inline void + g_autoptr_cleanup_generic_gfree (void *p) + { +@@ -87,3 +89,5 @@ G_DEFINE_AUTOPTR_CLEANUP_FUNC(GVariantDict, g_variant_dict_unref) + G_DEFINE_AUTO_CLEANUP_CLEAR_FUNC(GVariantDict, g_variant_dict_clear) + G_DEFINE_AUTOPTR_CLEANUP_FUNC(GVariantType, g_variant_type_free) + G_DEFINE_AUTO_CLEANUP_FREE_FUNC(GStrv, g_strfreev, NULL) ++ ++#endif +diff --git a/gobject/gobject-autocleanups.h b/gobject/gobject-autocleanups.h +index 980203f..a1d4ba1 100644 +--- a/gobject/gobject-autocleanups.h ++++ b/gobject/gobject-autocleanups.h +@@ -21,6 +21,10 @@ + #error "Only <glib-object.h> can be included directly." + #endif + ++#ifndef __GI_SCANNER__ ++ + G_DEFINE_AUTOPTR_CLEANUP_FUNC(GObject, g_object_unref) + G_DEFINE_AUTOPTR_CLEANUP_FUNC(GInitiallyUnowned, g_object_unref) + G_DEFINE_AUTO_CLEANUP_CLEAR_FUNC(GValue, g_value_unset) ++ ++#endif diff --git a/yocto-poky/meta/recipes-core/glib-2.0/glib-2.0/relocate-modules.patch b/yocto-poky/meta/recipes-core/glib-2.0/glib-2.0/relocate-modules.patch new file mode 100644 index 000000000..f9e3f3dba --- /dev/null +++ b/yocto-poky/meta/recipes-core/glib-2.0/glib-2.0/relocate-modules.patch @@ -0,0 +1,49 @@ +Instead of hard-coding GIO_MODULE_PATH when glib is built, use dladdr() to +determine where libglib.so is and use that path to calculate GIO_MODULES_DIR. + +This solves relocation problems with GIOModule for native builds of glib. + +Upstream-Status: Inappropriate +Signed-off-by: Ross Burton <ross.burton@intel.com> + +diff --git a/gio/giomodule.c b/gio/giomodule.c +index 56c498c..a2e32b7 100644 +--- a/gio/giomodule.c ++++ b/gio/giomodule.c +@@ -47,6 +47,27 @@ + #include "gdesktopappinfo.h" + #endif + ++#include <dlfcn.h> ++ ++/* ++ * Generate a GIO module directory based on where glib is installed ++ */ ++static const char * ++_get_gio_module_dir (void) ++{ ++ Dl_info info; ++ ++ if (dladdr (g_io_module_new, &info)) { ++ char *libdir = g_path_get_dirname (info.dli_fname); ++ char *dir = g_build_filename (libdir, "gio", "modules", NULL); ++ g_free (libdir); ++ return dir; ++ } else { ++ return GIO_MODULE_DIR; ++ } ++} ++ ++ + /** + * SECTION:giomodule + * @short_description: Loadable GIO Modules +@@ -1057,7 +1078,7 @@ _g_io_modules_ensure_loaded (void) + /* Then load the compiled in path */ + module_dir = g_getenv ("GIO_MODULE_DIR"); + if (module_dir == NULL) +- module_dir = GIO_MODULE_DIR; ++ module_dir = _get_gio_module_dir (); + + g_io_modules_scan_all_in_directory_with_scope (module_dir, scope); + diff --git a/yocto-poky/meta/recipes-core/glib-2.0/glib-2.0/run-ptest b/yocto-poky/meta/recipes-core/glib-2.0/glib-2.0/run-ptest index 130ae09b6..5b85e8fab 100644 --- a/yocto-poky/meta/recipes-core/glib-2.0/glib-2.0/run-ptest +++ b/yocto-poky/meta/recipes-core/glib-2.0/glib-2.0/run-ptest @@ -1,3 +1,5 @@ #! /bin/sh -gnome-desktop-testing-runner glib +useradd glib2-test +su glib2-test -c gnome-desktop-testing-runner glib +userdel glib2-test diff --git a/yocto-poky/meta/recipes-core/glib-2.0/glib-2.0/uclibc.patch b/yocto-poky/meta/recipes-core/glib-2.0/glib-2.0/uclibc_musl_translation.patch index 2a154fdd4..7aa6217d6 100644 --- a/yocto-poky/meta/recipes-core/glib-2.0/glib-2.0/uclibc.patch +++ b/yocto-poky/meta/recipes-core/glib-2.0/glib-2.0/uclibc_musl_translation.patch @@ -5,16 +5,18 @@ based systems therefore lets set DATADIRNAME to "share". Signed-off-by: Khem Raj <raj.khem@gmail.com> Upstream-Status: Pending -Index: glib-2.38.2/m4macros/glib-gettext.m4 +Index: glib-2.46.1/m4macros/glib-gettext.m4 =================================================================== ---- glib-2.38.2.orig/m4macros/glib-gettext.m4 2013-11-07 07:29:13.000000000 -0800 -+++ glib-2.38.2/m4macros/glib-gettext.m4 2014-03-15 14:51:54.712135644 -0700 -@@ -239,7 +239,7 @@ - [CATOBJEXT=.mo - DATADIRNAME=lib]) - ;; -- *-*-openbsd*) -+ *-*-openbsd* | *-*-linux-uclibc*) +--- glib-2.46.1.orig/m4macros/glib-gettext.m4 ++++ glib-2.46.1/m4macros/glib-gettext.m4 +@@ -243,6 +243,10 @@ msgstr "" CATOBJEXT=.mo DATADIRNAME=share ;; ++ *-*-musl* | *-*-linux-uclibc*) ++ CATOBJEXT=.gmo ++ DATADIRNAME=share ++ ;; + *) + CATOBJEXT=.mo + DATADIRNAME=lib diff --git a/yocto-poky/meta/recipes-core/glib-2.0/glib-2.0_2.44.1.bb b/yocto-poky/meta/recipes-core/glib-2.0/glib-2.0_2.46.2.bb index 1e3d36af1..8e445b415 100644 --- a/yocto-poky/meta/recipes-core/glib-2.0/glib-2.0_2.44.1.bb +++ b/yocto-poky/meta/recipes-core/glib-2.0/glib-2.0_2.46.2.bb @@ -7,17 +7,20 @@ SHRT_VER = "${@oe.utils.trim_version("${PV}", 2)}" SRC_URI = "${GNOME_MIRROR}/glib/${SHRT_VER}/glib-${PV}.tar.xz \ file://configure-libtool.patch \ file://fix-conflicting-rand.patch \ - file://add-march-i486-into-CFLAGS-automatically.patch \ file://glib-2.0-configure-readlink.patch \ file://run-ptest \ file://ptest-paths.patch \ - file://uclibc.patch \ + file://uclibc_musl_translation.patch \ file://0001-configure.ac-Do-not-use-readlink-when-cross-compilin.patch \ file://allow-run-media-sdX-drive-mount-if-username-root.patch \ file://0001-Remove-the-warning-about-deprecated-paths-in-schemas.patch \ + file://Enable-more-tests-while-cross-compiling.patch \ + file://gi-exclude.patch \ + file://0001-Install-gio-querymodules-as-libexec_PROGRAM.patch \ " -SRC_URI_append_class-native = " file://glib-gettextize-dir.patch" +SRC_URI_append_class-native = " file://glib-gettextize-dir.patch \ + file://relocate-modules.patch" -SRC_URI[md5sum] = "83efba4722a9674b97437d1d99af79db" -SRC_URI[sha256sum] = "8811deacaf8a503d0a9b701777ea079ca6a4277be10e3d730d2112735d5eca07" +SRC_URI[md5sum] = "7f815d6e46df68e070cb421ed7f1139e" +SRC_URI[sha256sum] = "5031722e37036719c1a09163cc6cf7c326e4c4f1f1e074b433c156862bd733db" diff --git a/yocto-poky/meta/recipes-core/glib-2.0/glib.inc b/yocto-poky/meta/recipes-core/glib-2.0/glib.inc index 072f79011..e764fad13 100644 --- a/yocto-poky/meta/recipes-core/glib-2.0/glib.inc +++ b/yocto-poky/meta/recipes-core/glib-2.0/glib.inc @@ -17,20 +17,23 @@ SECTION = "libs" BBCLASSEXTEND = "native nativesdk" -DEPENDS = "glib-2.0-native virtual/libiconv libffi zlib" -DEPENDS_append_class-target = "${@bb.utils.contains('DISTRO_FEATURES', 'ptest', ' dbus', '', d)}" +DEPENDS = "virtual/libiconv libffi zlib glib-2.0-native" +DEPENDS_append = " ${@bb.utils.contains('PTEST_ENABLED', '1', ' dbus', '', d)}" DEPENDS_class-native = "pkgconfig-native gettext-native libffi-native zlib-native" -DEPENDS_class-nativesdk = "nativesdk-libtool nativesdk-gettext nativesdk-libffi nativesdk-zlib ${BPN}-native" +DEPENDS_class-nativesdk = "nativesdk-libtool nativesdk-gettext nativesdk-libffi nativesdk-zlib glib-2.0-native" -PACKAGES =+ "${PN}-utils ${PN}-bash-completion ${PN}-codegen" +PACKAGES += "${PN}-codegen ${PN}-utils" LEAD_SONAME = "libglib-2.0.*" -FILES_${PN}-utils = "${bindir}/* ${datadir}/glib-2.0/gettext" -inherit autotools gettext gtk-doc pkgconfig ptest-gnome +inherit autotools gettext gtk-doc pkgconfig ptest-gnome upstream-version-is-even bash-completion gio-module-cache S = "${WORKDIR}/glib-${PV}" +PACKAGECONFIG ??= "system-pcre" +# To use the system pcre it must be configured with --enable-unicode-properties +PACKAGECONFIG[system-pcre] = "--with-pcre=system,--with-pcre=internal,libpcre" + CORECONF = "--disable-dtrace --disable-fam --disable-libelf --disable-systemtap --disable-man" PRINTF = "--enable-included-printf=no" @@ -44,19 +47,27 @@ do_configure_prepend() { sed -i -e '1s,#!.*,#!${USRBINPATH}/env python,' ${S}/gio/gdbus-2.0/codegen/gdbus-codegen.in } -FILES_${PN} = "${libdir}/lib*${SOLIBS} ${libdir}/gio ${datadir}/glib-2.0/schemas \ - ${datadir}/glib-2.0/gettext/mkinstalldirs ${datadir}/glib-2.0/gettext/po/Makefile.in.in" +FILES_${PN} = "${libdir}/lib*${SOLIBS} \ + ${libdir}/gio \ + ${libexecdir}/*gio-querymodules \ + ${datadir}/glib-2.0/schemas" FILES_${PN}-dev += "${libdir}/glib-2.0/include \ ${libdir}/gio/modules/lib*${SOLIBSDEV} \ - ${libdir}/gio/modules/*.la" -FILES_${PN}-dbg += "${datadir}/glib-2.0/gdb ${datadir}/gdb \ - ${libdir}/gio/modules/.debug \ - ${libdir}/glib-2.0/installed-tests/glib/.debug" -FILES_${PN}-codegen = "${datadir}/glib-2.0/codegen/*.py" -FILES_${PN}-bash-completion = "${sysconfdir}/bash_completion.d \ - ${datadir}/bash-completion" - -ARM_INSTRUCTION_SET = "arm" + ${libdir}/gio/modules/*.la \ + ${bindir}/glib-genmarshal \ + ${bindir}/glib-gettextize \ + ${bindir}/glib-mkenums \ + ${bindir}/glib-compile-resources \ + ${datadir}/glib-2.0/gettext/po/Makefile.in.in \ + ${datadir}/glib-2.0/schemas/gschema.dtd" +FILES_${PN}-dbg += "${datadir}/glib-2.0/gdb ${datadir}/gdb" +FILES_${PN}-codegen = "${datadir}/glib-2.0/codegen/*.py \ + ${bindir}/gdbus-codegen" +FILES_${PN}-utils = "${bindir}/*" + +ARM_INSTRUCTION_SET_armv4 = "arm" +ARM_INSTRUCTION_SET_armv5 = "arm" + USE_NLS = "yes" do_install_append () { @@ -73,6 +84,21 @@ do_install_append () { if [ -f ${D}${bindir}/glib-mkenums ]; then sed -i -e '1s,#!.*perl,#! ${USRBINPATH}/env perl,' ${D}${bindir}/glib-mkenums fi + + if [ -f ${D}${datadir}/installed-tests/glib/gdbus-serialization.test ]; then + if ${@bb.utils.contains("DISTRO_FEATURES", "x11", "false", "true", d)}; then + rm ${D}${datadir}/installed-tests/glib/gdbus-serialization.test + fi + fi + + # Make sure gio-querymodules is unique among multilibs + if test "x${MLPREFIX}" != "x"; then + mv ${D}${libexecdir}/gio-querymodules ${D}${libexecdir}/${MLPREFIX}gio-querymodules + fi +} + +do_install_append_libc-musl () { + rm -f ${D}${libdir}/charset.alias } RDEPENDS_${PN}-ptest += "\ diff --git a/yocto-poky/meta/recipes-core/glib-networking/glib-networking_2.44.0.bb b/yocto-poky/meta/recipes-core/glib-networking/glib-networking_2.46.1.bb index 4f91b76ac..749ac988a 100644 --- a/yocto-poky/meta/recipes-core/glib-networking/glib-networking_2.44.0.bb +++ b/yocto-poky/meta/recipes-core/glib-networking/glib-networking_2.46.1.bb @@ -9,8 +9,8 @@ LIC_FILES_CHKSUM = "file://COPYING;md5=5f30f0716dfdd0d91eb439ebec522ec2" SECTION = "libs" DEPENDS = "glib-2.0 intltool-native" -SRC_URI[archive.md5sum] = "6989b20cf3b26dd5ae272e04a9acb0b3" -SRC_URI[archive.sha256sum] = "8f8a340d3ba99bfdef38b653da929652ea6640e27969d29f7ac51fbbe11a4346" +SRC_URI[archive.md5sum] = "c000e0b579f5d8fd48efebc7ac4d95dc" +SRC_URI[archive.sha256sum] = "d5034214217f705891b6c9e719cc2c583c870bfcfdc454ebbb5e5e8940ac90b1" PACKAGECONFIG ??= "ca-certificates gnutls" @@ -22,9 +22,8 @@ PACKAGECONFIG[pkcs11] = "--with-pkcs11,--without-pkcs11,p11-kit" EXTRA_OECONF = "--without-gnome-proxy" -inherit gnomebase gettext +inherit gnomebase gettext upstream-version-is-even gio-module-cache FILES_${PN} += "${libdir}/gio/modules/libgio*.so ${datadir}/dbus-1/services/" -FILES_${PN}-dbg += "${libdir}/gio/modules/.debug/" FILES_${PN}-dev += "${libdir}/gio/modules/libgio*.la" FILES_${PN}-staticdev += "${libdir}/gio/modules/libgio*.a" diff --git a/yocto-poky/meta/recipes-core/glibc/cross-localedef-native_2.22.bb b/yocto-poky/meta/recipes-core/glibc/cross-localedef-native_2.23.bb index 3aefe748f..fa930fd48 100644 --- a/yocto-poky/meta/recipes-core/glibc/cross-localedef-native_2.22.bb +++ b/yocto-poky/meta/recipes-core/glibc/cross-localedef-native_2.23.bb @@ -16,29 +16,27 @@ FILESEXTRAPATHS =. "${FILE_DIRNAME}/${PN}:${FILE_DIRNAME}/glibc:" SRCBRANCH ?= "release/${PV}/master" GLIBC_GIT_URI ?= "git://sourceware.org/git/glibc.git" +UPSTREAM_CHECK_GITTAGREGEX = "(?P<pver>\d+\.\d+(\.\d+)*)" SRC_URI = "${GLIBC_GIT_URI};branch=${SRCBRANCH};name=glibc \ git://github.com/kraj/localedef;branch=master;name=localedef;destsuffix=git/localedef \ file://fix_for_centos_5.8.patch \ - file://strcoll-Remove-incorrect-STRDIFF-based-optimization-.patch \ ${EGLIBCPATCHES} \ " EGLIBCPATCHES = "\ - file://0017-timezone-re-written-tzselect-as-posix-sh.patch \ + file://0016-timezone-re-written-tzselect-as-posix-sh.patch \ + file://0017-Remove-bash-dependency-for-nscd-init-script.patch \ file://0018-eglibc-Cross-building-and-testing-instructions.patch \ - file://0019-eglibc-Bring-Eglibc-option-group-infrastructure-to-g.patch \ - file://0020-eglibc-Help-bootstrap-cross-toolchain.patch \ - file://0021-eglibc-cherry-picked-from-http-www.eglibc.org-archiv.patch \ - file://0022-eglibc-Clear-cache-lines-on-ppc8xx.patch \ - file://0023-eglibc-Resolve-__fpscr_values-on-SH4.patch \ - file://0024-eglibc-Forward-port-eglibc-options-groups-support.patch \ - file://0025-eglibc-Install-PIC-archives.patch \ - file://0026-eglibc-dl_debug_mask-is-controlled-by-__OPTION_EGLIB.patch \ - file://0027-eglibc-use-option-groups-Conditionally-exclude-c-tes.patch \ + file://0019-eglibc-Help-bootstrap-cross-toolchain.patch \ + file://0020-eglibc-cherry-picked-from.patch \ + file://0021-eglibc-Clear-cache-lines-on-ppc8xx.patch \ + file://0022-eglibc-Resolve-__fpscr_values-on-SH4.patch \ + file://0023-eglibc-Install-PIC-archives.patch \ + file://0025-eglibc-Forward-port-cross-locale-generation-support.patch \ " -SRCREV_glibc ?= "a34d1c6afc86521d6ad17662a3b5362d8481514c" -SRCREV_localedef ?= "c833367348d39dad7ba018990bfdaffaec8e9ed3" +SRCREV_glibc ?= "e742928c1592b43db6809db4f39e67be151cdd27" +SRCREV_localedef ?= "5a81ff9f06a7a808d4c3d37bbf34077a4c5902ed" # Makes for a rather long rev (22 characters), but... # diff --git a/yocto-poky/meta/recipes-core/glibc/glibc-initial.inc b/yocto-poky/meta/recipes-core/glibc/glibc-initial.inc index 35008489e..5975fd26c 100644 --- a/yocto-poky/meta/recipes-core/glibc/glibc-initial.inc +++ b/yocto-poky/meta/recipes-core/glibc/glibc-initial.inc @@ -11,11 +11,11 @@ TOOLCHAIN_OPTIONS = " --sysroot=${STAGING_DIR_TCBOOTSTRAP}" do_configure () { (cd ${S} && gnu-configize) || die "failure in running gnu-configize" find ${S} -name "configure" | xargs touch - ${S}/configure --host=${TARGET_SYS} --build=${BUILD_SYS} \ + cfgscript=`python -c "import os; print os.path.relpath('${S}', '.')"`/configure + $cfgscript --host=${TARGET_SYS} --build=${BUILD_SYS} \ --prefix=/usr \ --without-cvs --disable-sanity-checks \ --with-headers=${STAGING_DIR_TARGET}${includedir} \ - --with-kconfig=${STAGING_BINDIR_NATIVE} \ --enable-hacker-mode --enable-addons } @@ -74,3 +74,5 @@ do_populate_sysroot[sstate-outputdirs] = "${STAGING_DIR_TCBOOTSTRAP}/" do_evacuate_scripts () { : } + +inherit nopackages diff --git a/yocto-poky/meta/recipes-core/glibc/glibc-initial_2.22.bb b/yocto-poky/meta/recipes-core/glibc/glibc-initial_2.23.bb index 8ab01dc79..e86770e12 100644 --- a/yocto-poky/meta/recipes-core/glibc/glibc-initial_2.22.bb +++ b/yocto-poky/meta/recipes-core/glibc/glibc-initial_2.23.bb @@ -1,8 +1,6 @@ require glibc_${PV}.bb require glibc-initial.inc -DEPENDS += "kconfig-frontends-native" - # main glibc recipes muck with TARGET_CPPFLAGS to point into # final target sysroot but we # are not there when building glibc-initial diff --git a/yocto-poky/meta/recipes-core/glibc/glibc-locale.inc b/yocto-poky/meta/recipes-core/glibc/glibc-locale.inc index 2352bd029..e868e38a9 100644 --- a/yocto-poky/meta/recipes-core/glibc/glibc-locale.inc +++ b/yocto-poky/meta/recipes-core/glibc/glibc-locale.inc @@ -64,7 +64,6 @@ DESCRIPTION_localedef = "glibc: compile locale definition files" # FILES_glibc-gconv will not be automatically extended in multilib. # Explicitly add ${MLPREFIX} for FILES_glibc-gconv. FILES_${MLPREFIX}glibc-gconv = "${libdir}/gconv/*" -FILES_${PN}-dbg += "${libdir}/gconv/.debug/*" FILES_localedef = "${bindir}/localedef" LOCALETREESRC = "${STAGING_INCDIR}/glibc-locale-internal-${MULTIMACH_TARGET_SYS}" diff --git a/yocto-poky/meta/recipes-core/glibc/glibc-locale_2.22.bb b/yocto-poky/meta/recipes-core/glibc/glibc-locale_2.23.bb index f7702e035..f7702e035 100644 --- a/yocto-poky/meta/recipes-core/glibc/glibc-locale_2.22.bb +++ b/yocto-poky/meta/recipes-core/glibc/glibc-locale_2.23.bb diff --git a/yocto-poky/meta/recipes-core/glibc/glibc-mtrace_2.22.bb b/yocto-poky/meta/recipes-core/glibc/glibc-mtrace_2.23.bb index 0b69bad46..0b69bad46 100644 --- a/yocto-poky/meta/recipes-core/glibc/glibc-mtrace_2.22.bb +++ b/yocto-poky/meta/recipes-core/glibc/glibc-mtrace_2.23.bb diff --git a/yocto-poky/meta/recipes-core/glibc/glibc-options.inc b/yocto-poky/meta/recipes-core/glibc/glibc-options.inc deleted file mode 100644 index 9fd27f32f..000000000 --- a/yocto-poky/meta/recipes-core/glibc/glibc-options.inc +++ /dev/null @@ -1,162 +0,0 @@ -def glibc_cfg(feature, tokens, cnf): - if type(tokens) == type(""): - tokens = [tokens] - if feature: - cnf.extend([token + '=y' for token in tokens]) - else: - for token in tokens: - cnf.extend([token + '=n']) - if token == 'OPTION_EGLIBC_NSSWITCH': - cnf.extend(["OPTION_EGLIBC_NSSWITCH_FIXED_CONFIG=\"${S}/nss/nsswitch.conf\""]) - cnf.extend(["OPTION_EGLIBC_NSSWITCH_FIXED_FUNCTIONS=\"${S}/nss/fixed-nsswitch.functions\""]) - -# Map distro features to glibc options settings -def features_to_glibc_settings(d): - cnf = ([]) - - ipv4 = bb.utils.contains('DISTRO_FEATURES', 'ipv4', True, False, d) - ipv6 = bb.utils.contains('DISTRO_FEATURES', 'ipv6', True, False, d) - libc_backtrace = bb.utils.contains('DISTRO_FEATURES', 'libc-backtrace', True, False, d) - libc_big_macros = bb.utils.contains('DISTRO_FEATURES', 'libc-big-macros', True, False, d) - libc_bsd = bb.utils.contains('DISTRO_FEATURES', 'libc-bsd', True, False, d) - libc_cxx_tests = bb.utils.contains('DISTRO_FEATURES', 'libc-cxx-tests', True, False, d) - libc_catgets = bb.utils.contains('DISTRO_FEATURES', 'libc-catgets', True, False, d) - libc_charsets = bb.utils.contains('DISTRO_FEATURES', 'libc-charsets', True, False, d) - libc_crypt = bb.utils.contains('DISTRO_FEATURES', 'libc-crypt', True, False, d) - libc_crypt_ufc = bb.utils.contains('DISTRO_FEATURES', 'libc-crypt-ufc', True, False, d) - libc_db_aliases = bb.utils.contains('DISTRO_FEATURES', 'libc-db-aliases', True, False, d) - libc_envz = bb.utils.contains('DISTRO_FEATURES', 'libc-envz', True, False, d) - libc_fcvt = bb.utils.contains('DISTRO_FEATURES', 'libc-fcvt', True, False, d) - libc_fmtmsg = bb.utils.contains('DISTRO_FEATURES', 'libc-fmtmsg', True, False, d) - libc_fstab = bb.utils.contains('DISTRO_FEATURES', 'libc-fstab', True, False, d) - libc_ftraverse = bb.utils.contains('DISTRO_FEATURES', 'libc-ftraverse', True, False, d) - libc_getlogin = bb.utils.contains('DISTRO_FEATURES', 'libc-getlogin', True, False, d) - libc_idn = bb.utils.contains('DISTRO_FEATURES', 'libc-idn', True, False, d) - libc_inet_anl = bb.utils.contains('DISTRO_FEATURES', 'libc-inet-anl', True, False, d) - libc_libm = bb.utils.contains('DISTRO_FEATURES', 'libc-libm', True, False, d) - libc_locales = bb.utils.contains('DISTRO_FEATURES', 'libc-locales', True, False, d) - libc_locale_code = bb.utils.contains('DISTRO_FEATURES', 'libc-locale-code', True, False, d) - libc_memusage = bb.utils.contains('DISTRO_FEATURES', 'libc-memusage', True, False, d) - libc_nis = bb.utils.contains('DISTRO_FEATURES', 'libc-nis', True, False, d) - libc_nsswitch = bb.utils.contains('DISTRO_FEATURES', 'libc-nsswitch', True, False, d) - libc_rcmd = bb.utils.contains('DISTRO_FEATURES', 'libc-rcmd', True, False, d) - libc_rtld_debug = bb.utils.contains('DISTRO_FEATURES', 'libc-rtld-debug', True, False, d) - libc_spawn = bb.utils.contains('DISTRO_FEATURES', 'libc-spawn', True, False, d) - libc_streams = bb.utils.contains('DISTRO_FEATURES', 'libc-streams', True, False, d) - libc_sunrpc = bb.utils.contains('DISTRO_FEATURES', 'libc-sunrpc', True, False, d) - libc_utmp = bb.utils.contains('DISTRO_FEATURES', 'libc-utmp', True, False, d) - libc_utmpx = bb.utils.contains('DISTRO_FEATURES', 'libc-utmpx', True, False, d) - libc_wordexp = bb.utils.contains('DISTRO_FEATURES', 'libc-wordexp', True, False, d) - libc_posix_clang_wchar = bb.utils.contains('DISTRO_FEATURES', 'libc-posix-clang-wchar', True, False, d) - libc_posix_regexp = bb.utils.contains('DISTRO_FEATURES', 'libc-posix-regexp', True, False, d) - libc_posix_regexp_glibc = bb.utils.contains('DISTRO_FEATURES', 'libc-posix-regexp-glibc', True, False, d) - libc_posix_wchar_io = bb.utils.contains('DISTRO_FEATURES', 'libc-posix-wchar-io', True, False, d) - - # arrange the dependencies among glibc configuable options according to file option-groups.def from glibc source code - new_dep = True - while new_dep: - new_dep = False - - if ipv6 and not ipv4: - new_dep = True - ipv4 = True - - if ipv4 and not libc_nsswitch: - new_dep = True - libc_nsswitch = True - - if libc_cxx_tests: - if not libc_posix_wchar_io: - new_dep = True - libc_posix_wchar_io = True - if not libc_libm: - new_dep = True - libc_libm = True - - if libc_catgets and not libc_locale_code: - new_dep = True - libc_locale_code = True - - if libc_crypt_ufc and not libc_crypt: - new_dep = True - libc_crypt = True - - if libc_getlogin and not libc_utmp: - new_dep = True - libc_utmp = True - - if libc_inet_anl and not ipv4: - new_dep = True - ipv4 = True - - if libc_locale_code and not libc_posix_clang_wchar: - new_dep = True - libc_posix_clang_wchar = True - - if libc_nis: - if not ipv4: - new_dep = True - ipv4 = True - if not libc_sunrpc: - new_dep = True - libc_sunrpc = True - - if libc_rcmd and not ipv4: - new_dep = True - ipv4 = True - - if libc_sunrpc and not ipv4: - new_dep = True - ipv4 = True - - if libc_utmpx and not libc_utmp: - new_dep = True - libc_utmp = True - - if libc_posix_regexp_glibc and not libc_posix_regexp: - new_dep = True - libc_posix_regexp = True - - if libc_posix_wchar_io and not libc_posix_clang_wchar: - new_dep = True - libc_posix_clang_wchar = True - - glibc_cfg(ipv6, 'OPTION_EGLIBC_ADVANCED_INET6', cnf) - glibc_cfg(libc_backtrace, 'OPTION_EGLIBC_BACKTRACE', cnf) - glibc_cfg(libc_big_macros, 'OPTION_EGLIBC_BIG_MACROS', cnf) - glibc_cfg(libc_bsd, 'OPTION_EGLIBC_BSD', cnf) - glibc_cfg(libc_cxx_tests, 'OPTION_EGLIBC_CXX_TESTS', cnf) - glibc_cfg(libc_catgets, 'OPTION_EGLIBC_CATGETS', cnf) - glibc_cfg(libc_charsets, 'OPTION_EGLIBC_CHARSETS', cnf) - glibc_cfg(libc_crypt, 'OPTION_EGLIBC_CRYPT', cnf) - glibc_cfg(libc_crypt_ufc, 'OPTION_EGLIBC_CRYPT_UFC', cnf) - glibc_cfg(libc_db_aliases, 'OPTION_EGLIBC_DB_ALIASES', cnf) - glibc_cfg(libc_envz, 'OPTION_EGLIBC_ENVZ', cnf) - glibc_cfg(libc_fcvt, 'OPTION_EGLIBC_FCVT', cnf) - glibc_cfg(libc_fmtmsg, 'OPTION_EGLIBC_FMTMSG', cnf) - glibc_cfg(libc_fstab, 'OPTION_EGLIBC_FSTAB', cnf) - glibc_cfg(libc_ftraverse, 'OPTION_EGLIBC_FTRAVERSE', cnf) - glibc_cfg(libc_getlogin, 'OPTION_EGLIBC_GETLOGIN', cnf) - glibc_cfg(libc_idn, 'OPTION_EGLIBC_IDN', cnf) - glibc_cfg(ipv4, 'OPTION_EGLIBC_INET', cnf) - glibc_cfg(libc_inet_anl, 'OPTION_EGLIBC_INET_ANL', cnf) - glibc_cfg(libc_libm, 'OPTION_EGLIBC_LIBM', cnf) - glibc_cfg(libc_locales, 'OPTION_EGLIBC_LOCALES', cnf) - glibc_cfg(libc_locale_code, 'OPTION_EGLIBC_LOCALE_CODE', cnf) - glibc_cfg(libc_memusage, 'OPTION_EGLIBC_MEMUSAGE', cnf) - glibc_cfg(libc_nis, 'OPTION_EGLIBC_NIS', cnf) - glibc_cfg(libc_nsswitch, 'OPTION_EGLIBC_NSSWITCH', cnf) - glibc_cfg(libc_rcmd, 'OPTION_EGLIBC_RCMD', cnf) - glibc_cfg(libc_rtld_debug, 'OPTION_EGLIBC_RTLD_DEBUG', cnf) - glibc_cfg(libc_spawn, 'OPTION_EGLIBC_SPAWN', cnf) - glibc_cfg(libc_streams, 'OPTION_EGLIBC_STREAMS', cnf) - glibc_cfg(libc_sunrpc, 'OPTION_EGLIBC_SUNRPC', cnf) - glibc_cfg(libc_utmp, 'OPTION_EGLIBC_UTMP', cnf) - glibc_cfg(libc_utmpx, 'OPTION_EGLIBC_UTMPX', cnf) - glibc_cfg(libc_wordexp, 'OPTION_EGLIBC_WORDEXP', cnf) - glibc_cfg(libc_posix_clang_wchar, 'OPTION_POSIX_C_LANG_WIDE_CHAR', cnf) - glibc_cfg(libc_posix_regexp, 'OPTION_POSIX_REGEXP', cnf) - glibc_cfg(libc_posix_regexp_glibc, 'OPTION_POSIX_REGEXP_GLIBC', cnf) - glibc_cfg(libc_posix_wchar_io, 'OPTION_POSIX_WIDE_CHAR_DEVICE_IO', cnf) - - return "\n".join(cnf) diff --git a/yocto-poky/meta/recipes-core/glibc/glibc-package.inc b/yocto-poky/meta/recipes-core/glibc/glibc-package.inc index 5f6036840..bad642449 100644 --- a/yocto-poky/meta/recipes-core/glibc/glibc-package.inc +++ b/yocto-poky/meta/recipes-core/glibc/glibc-package.inc @@ -54,7 +54,6 @@ FILES_nscd = "${sbindir}/nscd* ${sysconfdir}/init.d/nscd ${systemd_unitdir}/syst FILES_${PN}-mtrace = "${bindir}/mtrace" FILES_tzcode = "${bindir}/tzselect ${sbindir}/zic ${sbindir}/zdump" FILES_${PN}-utils = "${bindir}/* ${sbindir}/*" -FILES_${PN}-dbg += "${libexecdir}/*/.debug ${libdir}/audit/.debug" FILES_catchsegv = "${bindir}/catchsegv" RDEPENDS_catchsegv = "libsegfault" FILES_${PN}-pcprofile = "${base_libdir}/libpcprofile.so" @@ -82,9 +81,10 @@ do_install_append () { rm -rf ${D}${localstatedir} # remove empty glibc dir - if [ -d ${D}${libdir}/glibc -a ! -e ${D}${libdir}/glibc/pt_chown ]; then - rmdir ${D}${libdir}/glibc + if [ -d ${D}${libexecdir} ]; then + rmdir --ignore-fail-on-non-empty ${D}${libexecdir} fi + oe_multilib_header bits/syscall.h if [ -f ${D}${bindir}/mtrace ]; then diff --git a/yocto-poky/meta/recipes-core/glibc/glibc-scripts_2.22.bb b/yocto-poky/meta/recipes-core/glibc/glibc-scripts_2.23.bb index 5a89bd802..5a89bd802 100644 --- a/yocto-poky/meta/recipes-core/glibc/glibc-scripts_2.22.bb +++ b/yocto-poky/meta/recipes-core/glibc/glibc-scripts_2.23.bb diff --git a/yocto-poky/meta/recipes-core/glibc/glibc-testing.inc b/yocto-poky/meta/recipes-core/glibc/glibc-testing.inc index a9bbf37a1..0a42ae7f7 100644 --- a/yocto-poky/meta/recipes-core/glibc/glibc-testing.inc +++ b/yocto-poky/meta/recipes-core/glibc/glibc-testing.inc @@ -22,7 +22,6 @@ do_compile_append () { sed -i -e "/^'/d" ${B}/${HOST_PREFIX}testglibc sed -i -e "/^UID/d" ${B}/${HOST_PREFIX}testglibc sed -i -e "/^TERM/d" ${B}/${HOST_PREFIX}testglibc - sed -i -e "/^PATCH_GET/d" ${B}/${HOST_PREFIX}testglibc sed -i -e "/^PKG_/d" ${B}/${HOST_PREFIX}testglibc sed -i -e "/^POSIXLY_/d" ${B}/${HOST_PREFIX}testglibc sed -i -e "/^PPID/d" ${B}/${HOST_PREFIX}testglibc diff --git a/yocto-poky/meta/recipes-core/glibc/glibc.inc b/yocto-poky/meta/recipes-core/glibc/glibc.inc index 17fa2d52a..bf1dccdeb 100644 --- a/yocto-poky/meta/recipes-core/glibc/glibc.inc +++ b/yocto-poky/meta/recipes-core/glibc/glibc.inc @@ -8,27 +8,17 @@ PATH_prepend = "${STAGING_BINDIR_TOOLCHAIN}.${STAGINGCC}:" TOOLCHAIN_OPTIONS = " --sysroot=${STAGING_DIR_TCBOOTSTRAP}" -# glibc can't be built without optimization, if someone tries to compile an -# entire image as -O0, we override it with -O2 here and give a note about it. -def get_optimization(d): - selected_optimization = d.getVar("SELECTED_OPTIMIZATION", True) - if bb.utils.contains("SELECTED_OPTIMIZATION", "-O2", "x", "", d) == "x": - return selected_optimization - elif bb.utils.contains("SELECTED_OPTIMIZATION", "-O", "x", "", d) == "x": - bb.note("glibc can't be built with -O, -O -Wno-error will be used instead.") - return selected_optimization.replace("-O", "-O -Wno-error") - elif bb.utils.contains("SELECTED_OPTIMIZATION", "-O0", "x", "", d) == "x": - bb.note("glibc can't be built with -O0, -O2 will be used instead.") - return selected_optimization.replace("-O0", "-O2") - elif bb.utils.contains("SELECTED_OPTIMIZATION", "-Os", "x", "", d) == "x": - bb.note("glibc can't be built with -Os, -Os -Wno-error will be used instead.") - return selected_optimization.replace("-Os", "-Os -Wno-error") - elif bb.utils.contains("SELECTED_OPTIMIZATION", "-O1", "x", "", d) == "x": - bb.note("glibc can't be built with -O1, -O1 -Wno-error will be used instead.") - return selected_optimization.replace("-O1", "-O1 -Wno-error") - return selected_optimization - -SELECTED_OPTIMIZATION := "${@get_optimization(d)}" +python () { + opt_effective = "-O" + for opt in d.getVar('SELECTED_OPTIMIZATION', True).split(): + if opt in ("-O0", "-O", "-O1", "-O2", "-O3", "-Os"): + opt_effective = opt + if opt_effective == "-O0": + bb.fatal("%s can't be built with %s, try -O1 instead" % (d.getVar('PN', True), opt_effective)) + if opt_effective in ("-O", "-O1", "-Os"): + bb.note("%s doesn't build cleanly with %s, adding -Wno-error to SELECTED_OPTIMIZATION" % (d.getVar('PN', True), opt_effective)) + d.appendVar("SELECTED_OPTIMIZATION", " -Wno-error") +} # siteconfig.bbclass runs configure which needs a working compiler # For the compiler to work we need a working libc yet libc isn't @@ -50,12 +40,6 @@ DEPENDS = "virtual/${TARGET_PREFIX}gcc-initial libgcc-initial linux-libc-headers PROVIDES = "virtual/libc virtual/${TARGET_PREFIX}libc-for-gcc" PROVIDES += "virtual/libintl virtual/libiconv" inherit autotools texinfo distro_features_check systemd -require glibc-options.inc - -# The main purpose of setting this variable is to prevent users from accidently -# overriding DISTRO_FEATRUES, causing obscure build failures because of lack -# of libc functions. -REQUIRED_DISTRO_FEATURES = "${DISTRO_FEATURES_LIBC}" LEAD_SONAME = "libc.so" @@ -64,6 +48,7 @@ CACHED_CONFIGUREVARS += " \ libc_cv_slibdir=${base_libdir} \ libc_cv_rootsbindir=${base_sbindir} \ libc_cv_localedir=${localedir} \ + libc_cv_ssp_strong=no \ libc_cv_ssp=no \ " @@ -88,18 +73,8 @@ PARALLEL_MAKE = "" # ensure make uses /bin/bash EXTRA_OEMAKE += "SHELL=/bin/bash" -OE_FEATURES = "${@features_to_glibc_settings(d)}" do_configure_prepend() { sed -e "s#@BASH@#/bin/sh#" -i ${S}/elf/ldd.bash.in - echo '${OE_FEATURES}' > ${B}/option-groups.config -} - -do_configure_append() { - yes '' | oe_runmake config - - # Remove quotation marks from OPTION_EGLIBC_NSSWITCH_FIXED_*. This will - # avoid install error. - sed -i 's/^OPTION_EGLIBC_NSSWITCH_FIXED_\(.*\)="\(.*\)"$/OPTION_EGLIBC_NSSWITCH_FIXED_\1=\2/' option-groups.config } GLIBC_ADDONS ?= "nptl,libidn" diff --git a/yocto-poky/meta/recipes-core/glibc/glibc/0001-nativesdk-glibc-Look-for-host-system-ld.so.cache-as-.patch b/yocto-poky/meta/recipes-core/glibc/glibc/0001-nativesdk-glibc-Look-for-host-system-ld.so.cache-as-.patch index 3d6634813..97c280059 100644 --- a/yocto-poky/meta/recipes-core/glibc/glibc/0001-nativesdk-glibc-Look-for-host-system-ld.so.cache-as-.patch +++ b/yocto-poky/meta/recipes-core/glibc/glibc/0001-nativesdk-glibc-Look-for-host-system-ld.so.cache-as-.patch @@ -1,7 +1,7 @@ -From 0876fea1b5b26da84f298714a2e23ba696607dba Mon Sep 17 00:00:00 2001 +From 66d04e2cd8badb0984050e4e9f2732f47151fbbf Mon Sep 17 00:00:00 2001 From: Khem Raj <raj.khem@gmail.com> Date: Wed, 18 Mar 2015 01:48:24 +0000 -Subject: [PATCH 01/27] nativesdk-glibc: Look for host system ld.so.cache as +Subject: [PATCH 01/24] nativesdk-glibc: Look for host system ld.so.cache as well Upstream-Status: Inappropriate [embedded specific] @@ -27,18 +27,17 @@ RP 14/10/2010 Signed-off-by: Khem Raj <raj.khem@gmail.com> --- - elf/dl-load.c | 17 ++++++++--------- - 1 file changed, 8 insertions(+), 9 deletions(-) + elf/dl-load.c | 16 ++++++++-------- + 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/elf/dl-load.c b/elf/dl-load.c -index 0c052e4..f45085a 100644 +index 6fb615e..ee3d1e6 100644 --- a/elf/dl-load.c +++ b/elf/dl-load.c -@@ -2040,7 +2040,14 @@ _dl_map_object (struct link_map *loader, const char *name, - fd = open_path (name, namelen, mode, - &loader->l_runpath_dirs, &realname, &fb, loader, - LA_SER_RUNPATH, &found_other_class); -- +@@ -2094,6 +2094,14 @@ _dl_map_object (struct link_map *loader, const char *name, + } + } + + /* try the default path. */ + if (fd == -1 + && ((l = loader ?: GL(dl_ns)[nsid]._ns_loaded) == NULL @@ -50,7 +49,7 @@ index 0c052e4..f45085a 100644 #ifdef USE_LDCONFIG if (fd == -1 && (__glibc_likely ((mode & __RTLD_SECURE) == 0) -@@ -2099,14 +2106,6 @@ _dl_map_object (struct link_map *loader, const char *name, +@@ -2152,14 +2160,6 @@ _dl_map_object (struct link_map *loader, const char *name, } #endif @@ -66,5 +65,5 @@ index 0c052e4..f45085a 100644 if (__glibc_unlikely (GLRO(dl_debug_mask) & DL_DEBUG_LIBS)) _dl_debug_printf ("\n"); -- -2.1.4 +2.6.4 diff --git a/yocto-poky/meta/recipes-core/glibc/glibc/0002-nativesdk-glibc-Fix-buffer-overrun-with-a-relocated-.patch b/yocto-poky/meta/recipes-core/glibc/glibc/0002-nativesdk-glibc-Fix-buffer-overrun-with-a-relocated-.patch index b568fc6bd..473b89449 100644 --- a/yocto-poky/meta/recipes-core/glibc/glibc/0002-nativesdk-glibc-Fix-buffer-overrun-with-a-relocated-.patch +++ b/yocto-poky/meta/recipes-core/glibc/glibc/0002-nativesdk-glibc-Fix-buffer-overrun-with-a-relocated-.patch @@ -1,7 +1,7 @@ -From 086b65d9aacffc47fcd8df68818a476a5ae76fa1 Mon Sep 17 00:00:00 2001 +From 179dc5f1e13c3ff96d5f21a2a78c089cf120ceb8 Mon Sep 17 00:00:00 2001 From: Khem Raj <raj.khem@gmail.com> Date: Wed, 18 Mar 2015 01:50:00 +0000 -Subject: [PATCH 02/27] nativesdk-glibc: Fix buffer overrun with a relocated +Subject: [PATCH 02/24] nativesdk-glibc: Fix buffer overrun with a relocated SDK When ld-linux-*.so.2 is relocated to a path that is longer than the @@ -22,10 +22,10 @@ Signed-off-by: Khem Raj <raj.khem@gmail.com> 1 file changed, 12 insertions(+) diff --git a/elf/dl-load.c b/elf/dl-load.c -index f45085a..f1eb5ed 100644 +index ee3d1e6..c4a42e9 100644 --- a/elf/dl-load.c +++ b/elf/dl-load.c -@@ -1765,7 +1765,19 @@ open_path (const char *name, size_t namelen, int mode, +@@ -1793,7 +1793,19 @@ open_path (const char *name, size_t namelen, int mode, given on the command line when rtld is run directly. */ return -1; @@ -46,5 +46,5 @@ index f45085a..f1eb5ed 100644 { struct r_search_path_elem *this_dir = *dirs; -- -2.1.4 +2.6.4 diff --git a/yocto-poky/meta/recipes-core/glibc/glibc/0003-nativesdk-glibc-Raise-the-size-of-arrays-containing-.patch b/yocto-poky/meta/recipes-core/glibc/glibc/0003-nativesdk-glibc-Raise-the-size-of-arrays-containing-.patch index a681a64e8..60f9f17b8 100644 --- a/yocto-poky/meta/recipes-core/glibc/glibc/0003-nativesdk-glibc-Raise-the-size-of-arrays-containing-.patch +++ b/yocto-poky/meta/recipes-core/glibc/glibc/0003-nativesdk-glibc-Raise-the-size-of-arrays-containing-.patch @@ -1,7 +1,7 @@ -From fd595a5ec885bcb4c14417daa21c2e61c5b72e42 Mon Sep 17 00:00:00 2001 +From e76048898ae9aa49dc70d6f9b1bbc22082e61fe3 Mon Sep 17 00:00:00 2001 From: Khem Raj <raj.khem@gmail.com> Date: Wed, 18 Mar 2015 01:51:38 +0000 -Subject: [PATCH 03/27] nativesdk-glibc: Raise the size of arrays containing dl +Subject: [PATCH 03/24] nativesdk-glibc: Raise the size of arrays containing dl paths This patch puts the dynamic loader path in the binaries, SYSTEM_DIRS strings @@ -40,10 +40,10 @@ index dec49bc..862f1d8 100644 internal_function _dl_cache_libcmp (const char *p1, const char *p2) diff --git a/elf/dl-load.c b/elf/dl-load.c -index f1eb5ed..f664f50 100644 +index c4a42e9..acf6c03 100644 --- a/elf/dl-load.c +++ b/elf/dl-load.c -@@ -104,8 +104,8 @@ static size_t max_capstrlen attribute_relro; +@@ -106,8 +106,8 @@ static size_t max_capstrlen attribute_relro; /* Get the generated information about the trusted directories. */ #include "trusted-dirs.h" @@ -80,7 +80,7 @@ index f54ec22..0e78a83 100644 a platform. */ static int diff --git a/elf/rtld.c b/elf/rtld.c -index 69873c2..6d3add7 100644 +index 52160df..80f0582 100644 --- a/elf/rtld.c +++ b/elf/rtld.c @@ -99,6 +99,7 @@ uintptr_t __pointer_chk_guard_local @@ -91,7 +91,7 @@ index 69873c2..6d3add7 100644 /* List of auditing DSOs. */ static struct audit_list -@@ -877,12 +878,12 @@ of this helper program; chances are you did not intend to run this program.\n\ +@@ -873,12 +874,12 @@ of this helper program; chances are you did not intend to run this program.\n\ --list list all dependencies and how they are resolved\n\ --verify verify that given object really is a dynamically linked\n\ object we can handle\n\ @@ -107,7 +107,7 @@ index 69873c2..6d3add7 100644 ++_dl_skip_args; --_dl_argc; diff --git a/sysdeps/generic/dl-cache.h b/sysdeps/generic/dl-cache.h -index 4b49869..1800d03 100644 +index 70d4aeb..5c726d0 100644 --- a/sysdeps/generic/dl-cache.h +++ b/sysdeps/generic/dl-cache.h @@ -27,10 +27,6 @@ @@ -121,6 +121,16 @@ index 4b49869..1800d03 100644 #ifndef add_system_dir # define add_system_dir(dir) add_dir (dir) #endif --- -2.1.4 - +Index: git/iconv/gconv_conf.c +=================================================================== +--- git.orig/iconv/gconv_conf.c ++++ git/iconv/gconv_conf.c +@@ -36,7 +36,7 @@ + + + /* This is the default path where we look for module lists. */ +-static const char default_gconv_path[] = GCONV_PATH; ++static char default_gconv_path[4096] __attribute__ ((section (".gccrelocprefix"))) = GCONV_PATH; + + /* The path elements, as determined by the __gconv_get_path function. + All path elements end in a slash. */ diff --git a/yocto-poky/meta/recipes-core/glibc/glibc/0004-Backport-https-sourceware.org-ml-libc-ports-2007-12-.patch b/yocto-poky/meta/recipes-core/glibc/glibc/0004-Backport-https-sourceware.org-ml-libc-ports-2007-12-.patch deleted file mode 100644 index 748750304..000000000 --- a/yocto-poky/meta/recipes-core/glibc/glibc/0004-Backport-https-sourceware.org-ml-libc-ports-2007-12-.patch +++ /dev/null @@ -1,34 +0,0 @@ -From 2560b564b5674bf2990e5607f6342c1647a5dc4f Mon Sep 17 00:00:00 2001 -From: Khem Raj <raj.khem@gmail.com> -Date: Sun, 8 Mar 2015 04:01:01 +0000 -Subject: [PATCH 04/27] Backport - https://sourceware.org/ml/libc-ports/2007-12/msg00000.html - -Upstream-Status: Pending - -2007-12-03 Kristian Van Der Vliet <vanders@liqwyd.com> - - * bits/stdio-lock.h (_IO_acquire_lock_clear_flags2): Define - -Signed-off-by: Kristian Van Der Vliet <vanders@liqwyd.com> -Signed-off-by: Khem Raj <raj.khem@gmail.com> ---- - bits/stdio-lock.h | 2 ++ - 1 file changed, 2 insertions(+) - -diff --git a/bits/stdio-lock.h b/bits/stdio-lock.h -index 0c5bb65..66304a6 100644 ---- a/bits/stdio-lock.h -+++ b/bits/stdio-lock.h -@@ -49,6 +49,8 @@ __libc_lock_define_recursive (typedef, _IO_lock_t) - _IO_cleanup_region_start ((void (*) (void *)) _IO_funlockfile, (_fp)); \ - _IO_flockfile (_fp) - -+# define _IO_acquire_lock_clear_flags2(_fp) _IO_acquire_lock (_fp) -+ - # define _IO_release_lock(_fp) \ - _IO_funlockfile (_fp); \ - _IO_cleanup_region_end (0) --- -2.1.4 - diff --git a/yocto-poky/meta/recipes-core/glibc/glibc/0004-nativesdk-glibc-Allow-64-bit-atomics-for-x86.patch b/yocto-poky/meta/recipes-core/glibc/glibc/0004-nativesdk-glibc-Allow-64-bit-atomics-for-x86.patch new file mode 100644 index 000000000..21f04a132 --- /dev/null +++ b/yocto-poky/meta/recipes-core/glibc/glibc/0004-nativesdk-glibc-Allow-64-bit-atomics-for-x86.patch @@ -0,0 +1,32 @@ +From 2e1638115f0f924ee8235eee9265047054c15cfd Mon Sep 17 00:00:00 2001 +From: Khem Raj <raj.khem@gmail.com> +Date: Thu, 31 Dec 2015 14:35:35 -0800 +Subject: [PATCH 04/24] nativesdk-glibc: Allow 64 bit atomics for x86 + +The fix consist of allowing 64bit atomic ops for x86. +This should be safe for i586 and newer CPUs. +It also makes the synchronization more efficient. + +Signed-off-by: Juro Bystricky <juro.bystricky@intel.com> +Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org> +Signed-off-by: Khem Raj <raj.khem@gmail.com> +--- + sysdeps/i386/atomic-machine.h | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/sysdeps/i386/atomic-machine.h b/sysdeps/i386/atomic-machine.h +index 59f3d34..6f6b7ff 100644 +--- a/sysdeps/i386/atomic-machine.h ++++ b/sysdeps/i386/atomic-machine.h +@@ -54,7 +54,7 @@ typedef uintmax_t uatomic_max_t; + # endif + #endif + +-#define __HAVE_64B_ATOMICS 0 ++#define __HAVE_64B_ATOMICS 1 + #define USE_ATOMIC_COMPILER_BUILTINS 0 + + +-- +2.6.4 + diff --git a/yocto-poky/meta/recipes-core/glibc/glibc/0005-fsl-e500-e5500-e6500-603e-fsqrt-implementation.patch b/yocto-poky/meta/recipes-core/glibc/glibc/0005-fsl-e500-e5500-e6500-603e-fsqrt-implementation.patch index 8d3f85955..ba8c92e11 100644 --- a/yocto-poky/meta/recipes-core/glibc/glibc/0005-fsl-e500-e5500-e6500-603e-fsqrt-implementation.patch +++ b/yocto-poky/meta/recipes-core/glibc/glibc/0005-fsl-e500-e5500-e6500-603e-fsqrt-implementation.patch @@ -1,7 +1,7 @@ -From aa0cd82892f32e58602143c697ef0524696a6428 Mon Sep 17 00:00:00 2001 +From 7ff57edfe24b4243373fcb896ee0b613938c1ec9 Mon Sep 17 00:00:00 2001 From: Khem Raj <raj.khem@gmail.com> Date: Wed, 18 Mar 2015 00:01:50 +0000 -Subject: [PATCH 05/27] fsl e500/e5500/e6500/603e fsqrt implementation +Subject: [PATCH 05/24] fsl e500/e5500/e6500/603e fsqrt implementation Upstream-Status: Pending Signed-off-by: Edmar Wienskoski <edmar@freescale.com> @@ -1580,5 +1580,5 @@ index 0000000..04ff8cc @@ -0,0 +1 @@ +powerpc/powerpc64/e6500/fpu -- -2.1.4 +2.6.4 diff --git a/yocto-poky/meta/recipes-core/glibc/glibc/0006-readlib-Add-OECORE_KNOWN_INTERPRETER_NAMES-to-known-.patch b/yocto-poky/meta/recipes-core/glibc/glibc/0006-readlib-Add-OECORE_KNOWN_INTERPRETER_NAMES-to-known-.patch index 65c227ff2..086a73dd2 100644 --- a/yocto-poky/meta/recipes-core/glibc/glibc/0006-readlib-Add-OECORE_KNOWN_INTERPRETER_NAMES-to-known-.patch +++ b/yocto-poky/meta/recipes-core/glibc/glibc/0006-readlib-Add-OECORE_KNOWN_INTERPRETER_NAMES-to-known-.patch @@ -1,7 +1,7 @@ -From 5ec1bc5172851278231ce940b68b35ce9cbf8500 Mon Sep 17 00:00:00 2001 +From 61129ef3ee735b300604f75d50e01cb29f4387f4 Mon Sep 17 00:00:00 2001 From: Khem Raj <raj.khem@gmail.com> Date: Wed, 18 Mar 2015 00:11:22 +0000 -Subject: [PATCH 06/27] readlib: Add OECORE_KNOWN_INTERPRETER_NAMES to known +Subject: [PATCH 06/24] readlib: Add OECORE_KNOWN_INTERPRETER_NAMES to known names This bolts in a hook for OE to pass its own version of interpreter @@ -29,5 +29,5 @@ index 7fd5b8a..2f5da9f 100644 static struct known_names known_libs[] = -- -2.1.4 +2.6.4 diff --git a/yocto-poky/meta/recipes-core/glibc/glibc/0007-ppc-sqrt-Fix-undefined-reference-to-__sqrt_finite.patch b/yocto-poky/meta/recipes-core/glibc/glibc/0007-ppc-sqrt-Fix-undefined-reference-to-__sqrt_finite.patch index aec8fbeb9..952784b1c 100644 --- a/yocto-poky/meta/recipes-core/glibc/glibc/0007-ppc-sqrt-Fix-undefined-reference-to-__sqrt_finite.patch +++ b/yocto-poky/meta/recipes-core/glibc/glibc/0007-ppc-sqrt-Fix-undefined-reference-to-__sqrt_finite.patch @@ -1,7 +1,7 @@ -From ea98b1a12b5f779fd79478ff930a79ef60387851 Mon Sep 17 00:00:00 2001 +From f936548decac99501f9a4c522a3211d16542fa49 Mon Sep 17 00:00:00 2001 From: Khem Raj <raj.khem@gmail.com> Date: Wed, 18 Mar 2015 00:15:07 +0000 -Subject: [PATCH 07/27] ppc/sqrt: Fix undefined reference to `__sqrt_finite' +Subject: [PATCH 07/24] ppc/sqrt: Fix undefined reference to `__sqrt_finite' on ppc fixes the errors like below | ./.libs/libpulsecore-1.1.so: undefined reference to `__sqrt_finite' @@ -204,5 +204,5 @@ index 26fa067..9d17512 100644 } +strong_alias (__ieee754_sqrtf, __sqrtf_finite) -- -2.1.4 +2.6.4 diff --git a/yocto-poky/meta/recipes-core/glibc/glibc/0008-__ieee754_sqrt-f-are-now-inline-functions-and-call-o.patch b/yocto-poky/meta/recipes-core/glibc/glibc/0008-__ieee754_sqrt-f-are-now-inline-functions-and-call-o.patch index b3fa931c6..8d513ab42 100644 --- a/yocto-poky/meta/recipes-core/glibc/glibc/0008-__ieee754_sqrt-f-are-now-inline-functions-and-call-o.patch +++ b/yocto-poky/meta/recipes-core/glibc/glibc/0008-__ieee754_sqrt-f-are-now-inline-functions-and-call-o.patch @@ -1,7 +1,7 @@ -From 2456ea44aeeedae87edb522f77a7969d636399b0 Mon Sep 17 00:00:00 2001 +From d02704895fdce917e337619a4414042f63edd88b Mon Sep 17 00:00:00 2001 From: Khem Raj <raj.khem@gmail.com> Date: Wed, 18 Mar 2015 00:16:38 +0000 -Subject: [PATCH 08/27] __ieee754_sqrt{,f} are now inline functions and call +Subject: [PATCH 08/24] __ieee754_sqrt{,f} are now inline functions and call out __slow versions Upstream-Status: Pending @@ -383,5 +383,5 @@ index 9d17512..10de1f0 100644 + strong_alias (__ieee754_sqrtf, __sqrtf_finite) -- -2.1.4 +2.6.4 diff --git a/yocto-poky/meta/recipes-core/glibc/glibc/0009-Quote-from-bug-1443-which-explains-what-the-patch-do.patch b/yocto-poky/meta/recipes-core/glibc/glibc/0009-Quote-from-bug-1443-which-explains-what-the-patch-do.patch index 1f5475912..12f24fb68 100644 --- a/yocto-poky/meta/recipes-core/glibc/glibc/0009-Quote-from-bug-1443-which-explains-what-the-patch-do.patch +++ b/yocto-poky/meta/recipes-core/glibc/glibc/0009-Quote-from-bug-1443-which-explains-what-the-patch-do.patch @@ -1,7 +1,7 @@ -From acf7a028817e71eb99d785037659abd4d120ffe2 Mon Sep 17 00:00:00 2001 +From 502f061d846e58aac7aca67e4e0d6ba9e0763b17 Mon Sep 17 00:00:00 2001 From: Khem Raj <raj.khem@gmail.com> Date: Wed, 18 Mar 2015 00:20:09 +0000 -Subject: [PATCH 09/27] Quote from bug 1443 which explains what the patch does +Subject: [PATCH 09/24] Quote from bug 1443 which explains what the patch does : We build some random program and link it with -lust. When we run it, @@ -58,5 +58,5 @@ index 6fb20bd..8805537 100644 case R_ARM_TLS_TPOFF32: -- -2.1.4 +2.6.4 diff --git a/yocto-poky/meta/recipes-core/glibc/glibc/0010-eglibc-run-libm-err-tab.pl-with-specific-dirs-in-S.patch b/yocto-poky/meta/recipes-core/glibc/glibc/0010-eglibc-run-libm-err-tab.pl-with-specific-dirs-in-S.patch index d71e576a6..77bd7d132 100644 --- a/yocto-poky/meta/recipes-core/glibc/glibc/0010-eglibc-run-libm-err-tab.pl-with-specific-dirs-in-S.patch +++ b/yocto-poky/meta/recipes-core/glibc/glibc/0010-eglibc-run-libm-err-tab.pl-with-specific-dirs-in-S.patch @@ -1,7 +1,7 @@ -From 017322ee28c1579ce6c81904842aaada9c82403c Mon Sep 17 00:00:00 2001 +From 69a3e30b49d28a7386d18725528652931510cbfc Mon Sep 17 00:00:00 2001 From: Ting Liu <b28495@freescale.com> Date: Wed, 19 Dec 2012 04:39:57 -0600 -Subject: [PATCH 10/27] eglibc: run libm-err-tab.pl with specific dirs in ${S} +Subject: [PATCH 10/24] eglibc: run libm-err-tab.pl with specific dirs in ${S} libm-err-tab.pl will parse all the files named "libm-test-ulps" in the given dir recursively. To avoid parsing the one in @@ -10,7 +10,7 @@ ${S}/.pc/aarch64-0001-glibc-fsf-v1-eaf6f205.patch/ports/sysdeps/ aarch64/libm-test-ulps), run libm-err-tab.pl with specific dirs in ${S}. -Upstream-Status: inappropriate [OE specific] +Upstream-Status: Inappropriate [OE specific] Signed-off-by: Ting Liu <b28495@freescale.com> --- @@ -18,7 +18,7 @@ Signed-off-by: Ting Liu <b28495@freescale.com> 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/manual/Makefile b/manual/Makefile -index 5382208..6b701b0 100644 +index cdb6763..0b32a0a 100644 --- a/manual/Makefile +++ b/manual/Makefile @@ -105,7 +105,8 @@ $(objpfx)libm-err.texi: $(objpfx)stamp-libm-err @@ -32,5 +32,5 @@ index 5382208..6b701b0 100644 touch $@ -- -2.1.4 +2.6.4 diff --git a/yocto-poky/meta/recipes-core/glibc/glibc/0011-__ieee754_sqrt-f-are-now-inline-functions-and-call-o.patch b/yocto-poky/meta/recipes-core/glibc/glibc/0011-__ieee754_sqrt-f-are-now-inline-functions-and-call-o.patch index 07a112b21..251e5f5af 100644 --- a/yocto-poky/meta/recipes-core/glibc/glibc/0011-__ieee754_sqrt-f-are-now-inline-functions-and-call-o.patch +++ b/yocto-poky/meta/recipes-core/glibc/glibc/0011-__ieee754_sqrt-f-are-now-inline-functions-and-call-o.patch @@ -1,7 +1,7 @@ -From 1be45f870ebbb0259bea5250a6d2c2fbcb33409d Mon Sep 17 00:00:00 2001 +From 4cf52971a841304aec30b2e975f81d7ad9d42ef0 Mon Sep 17 00:00:00 2001 From: Khem Raj <raj.khem@gmail.com> Date: Wed, 18 Mar 2015 00:24:46 +0000 -Subject: [PATCH 11/27] __ieee754_sqrt{,f} are now inline functions and call +Subject: [PATCH 11/24] __ieee754_sqrt{,f} are now inline functions and call out __slow versions Upstream-Status: Pending @@ -57,5 +57,5 @@ index 8126535..10de1f0 100644 #endif { -- -2.1.4 +2.6.4 diff --git a/yocto-poky/meta/recipes-core/glibc/glibc/0012-Make-ld-version-output-matching-grok-gold-s-output.patch b/yocto-poky/meta/recipes-core/glibc/glibc/0012-Make-ld-version-output-matching-grok-gold-s-output.patch index 267791393..3208a0c89 100644 --- a/yocto-poky/meta/recipes-core/glibc/glibc/0012-Make-ld-version-output-matching-grok-gold-s-output.patch +++ b/yocto-poky/meta/recipes-core/glibc/glibc/0012-Make-ld-version-output-matching-grok-gold-s-output.patch @@ -1,7 +1,7 @@ -From 49471ab1f90e392da9520eea831ce8731be9fc8b Mon Sep 17 00:00:00 2001 +From b356816d6e005ecda7adbed9627a4315ad39de39 Mon Sep 17 00:00:00 2001 From: Khem Raj <raj.khem@gmail.com> Date: Wed, 18 Mar 2015 00:25:45 +0000 -Subject: [PATCH 12/27] Make ld --version output matching grok gold's output +Subject: [PATCH 12/24] Make ld --version output matching grok gold's output adapted from from upstream branch roland/gold-vs-libc @@ -14,10 +14,10 @@ Signed-off-by: Khem Raj <raj.khem@gmail.com> 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/configure b/configure -index 45cc7cb..7d7299a 100755 +index aa05d49..6dabd11 100755 --- a/configure +++ b/configure -@@ -4709,7 +4709,7 @@ else +@@ -4486,7 +4486,7 @@ else # Found it, now check the version. { $as_echo "$as_me:${as_lineno-$LINENO}: checking version of $LD" >&5 $as_echo_n "checking version of $LD... " >&6; } @@ -27,10 +27,10 @@ index 45cc7cb..7d7299a 100755 '') ac_prog_version="v. ?.??, bad"; ac_verc_fail=yes;; 2.1[0-9][0-9]*|2.2[2-9]*|2.[3-9][0-9]*|[3-9].*|[1-9][0-9]*) diff --git a/configure.ac b/configure.ac -index 7e9383a..a467a69 100644 +index ee7a3f1..b4b95b9 100644 --- a/configure.ac +++ b/configure.ac -@@ -941,7 +941,7 @@ AC_CHECK_PROG_VER(AS, $AS, --version, +@@ -948,7 +948,7 @@ AC_CHECK_PROG_VER(AS, $AS, --version, [2.1[0-9][0-9]*|2.2[2-9]*|2.[3-9][0-9]*|[3-9].*|[1-9][0-9]*], AS=: critic_missing="$critic_missing as") AC_CHECK_PROG_VER(LD, $LD, --version, @@ -40,5 +40,5 @@ index 7e9383a..a467a69 100644 LD=: critic_missing="$critic_missing ld") -- -2.1.4 +2.6.4 diff --git a/yocto-poky/meta/recipes-core/glibc/glibc/0013-sysdeps-gnu-configure.ac-handle-correctly-libc_cv_ro.patch b/yocto-poky/meta/recipes-core/glibc/glibc/0013-sysdeps-gnu-configure.ac-handle-correctly-libc_cv_ro.patch index c1fda9d43..82fa10044 100644 --- a/yocto-poky/meta/recipes-core/glibc/glibc/0013-sysdeps-gnu-configure.ac-handle-correctly-libc_cv_ro.patch +++ b/yocto-poky/meta/recipes-core/glibc/glibc/0013-sysdeps-gnu-configure.ac-handle-correctly-libc_cv_ro.patch @@ -1,7 +1,7 @@ -From b55e49b199c46a278ab66b6b1e3eab483b913197 Mon Sep 17 00:00:00 2001 +From 10003d48f83f7a4f7fa562ed89af904a544b6323 Mon Sep 17 00:00:00 2001 From: Khem Raj <raj.khem@gmail.com> Date: Wed, 18 Mar 2015 00:27:10 +0000 -Subject: [PATCH 13/27] sysdeps/gnu/configure.ac: handle correctly +Subject: [PATCH 13/24] sysdeps/gnu/configure.ac: handle correctly $libc_cv_rootsbindir Upstream-Status:Pending @@ -14,7 +14,7 @@ Signed-off-by: Khem Raj <raj.khem@gmail.com> 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/sysdeps/gnu/configure b/sysdeps/gnu/configure -index 9239297..c5ed3ca 100644 +index 71243ad..f578187 100644 --- a/sysdeps/gnu/configure +++ b/sysdeps/gnu/configure @@ -32,6 +32,6 @@ case "$prefix" in @@ -38,5 +38,5 @@ index 634fe4d..3db1697 100644 ;; esac -- -2.1.4 +2.6.4 diff --git a/yocto-poky/meta/recipes-core/glibc/glibc/0014-Add-unused-attribute.patch b/yocto-poky/meta/recipes-core/glibc/glibc/0014-Add-unused-attribute.patch index 0ba5d2fba..ea3e1670f 100644 --- a/yocto-poky/meta/recipes-core/glibc/glibc/0014-Add-unused-attribute.patch +++ b/yocto-poky/meta/recipes-core/glibc/glibc/0014-Add-unused-attribute.patch @@ -1,7 +1,7 @@ -From 0229d6c9c0e7721773118d5ae1d172c269bc9826 Mon Sep 17 00:00:00 2001 +From cafa8a7ef830e02cdbf928471e06d11054946940 Mon Sep 17 00:00:00 2001 From: Khem Raj <raj.khem@gmail.com> Date: Wed, 18 Mar 2015 00:28:41 +0000 -Subject: [PATCH 14/27] Add unused attribute +Subject: [PATCH 14/24] Add unused attribute Helps in avoiding gcc warning when header is is included in a source file which does not use both functions @@ -30,5 +30,5 @@ index 80290bc..7890a8e 100644 { int slash_count = 0; -- -2.1.4 +2.6.4 diff --git a/yocto-poky/meta/recipes-core/glibc/glibc/0015-When-disabling-SSE-also-make-sure-that-fpmath-is-not.patch b/yocto-poky/meta/recipes-core/glibc/glibc/0015-When-disabling-SSE-also-make-sure-that-fpmath-is-not.patch deleted file mode 100644 index 4b261ca1e..000000000 --- a/yocto-poky/meta/recipes-core/glibc/glibc/0015-When-disabling-SSE-also-make-sure-that-fpmath-is-not.patch +++ /dev/null @@ -1,32 +0,0 @@ -From f058c884dd26d10c94550ca5252ed6576614d659 Mon Sep 17 00:00:00 2001 -From: Khem Raj <raj.khem@gmail.com> -Date: Thu, 19 Feb 2015 03:23:45 +0000 -Subject: [PATCH 15/27] When disabling SSE also make sure that fpmath is not - set to use SSE as well - -This fixes errors when we inject sse options through CFLAGS and now -that we have -Werror turned on by default this warning turns to become -error on x86 - -Signed-off-by: Khem Raj <raj.khem@gmail.com> - -Upstream-Status: Pending ---- - sysdeps/x86/Makefile | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -diff --git a/sysdeps/x86/Makefile b/sysdeps/x86/Makefile -index 19f5eca..827ea71 100644 ---- a/sysdeps/x86/Makefile -+++ b/sysdeps/x86/Makefile -@@ -1,6 +1,6 @@ - ifeq ($(subdir),elf) - CFLAGS-.os += $(if $(filter $(@F),$(patsubst %,%.os,$(all-rtld-routines))),\ -- -mno-sse -mno-mmx) -+ -mno-sse -mno-mmx -mfpmath=387) - - tests-special += $(objpfx)tst-ld-sse-use.out - $(objpfx)tst-ld-sse-use.out: ../sysdeps/x86/tst-ld-sse-use.sh $(objpfx)ld.so --- -2.1.4 - diff --git a/yocto-poky/meta/recipes-core/glibc/glibc/0016-yes-within-the-path-sets-wrong-config-variables.patch b/yocto-poky/meta/recipes-core/glibc/glibc/0015-yes-within-the-path-sets-wrong-config-variables.patch index 089e8b1b0..90e12b883 100644 --- a/yocto-poky/meta/recipes-core/glibc/glibc/0016-yes-within-the-path-sets-wrong-config-variables.patch +++ b/yocto-poky/meta/recipes-core/glibc/glibc/0015-yes-within-the-path-sets-wrong-config-variables.patch @@ -1,7 +1,7 @@ -From 70199fe59c38b621ab4121d7a55719b2b29b36de Mon Sep 17 00:00:00 2001 +From 4d6bead19874e519752ceeb2a15897ff2ffbe5e8 Mon Sep 17 00:00:00 2001 From: Khem Raj <raj.khem@gmail.com> Date: Wed, 18 Mar 2015 00:31:06 +0000 -Subject: [PATCH 16/27] 'yes' within the path sets wrong config variables +Subject: [PATCH 15/24] 'yes' within the path sets wrong config variables It seems that the 'AC_EGREP_CPP(yes...' example is quite popular but being such a short word to grep it is likely to produce @@ -63,7 +63,7 @@ index 7851dd4..6e92381 100644 ], libc_cv_aarch64_be=yes, libc_cv_aarch64_be=no)]) if test $libc_cv_aarch64_be = yes; then diff --git a/sysdeps/arm/configure b/sysdeps/arm/configure -index 158116b..5eaf54e 100644 +index 431e843..e152461 100644 --- a/sysdeps/arm/configure +++ b/sysdeps/arm/configure @@ -151,12 +151,12 @@ else @@ -82,7 +82,7 @@ index 158116b..5eaf54e 100644 else libc_cv_arm_pcs_vfp=no diff --git a/sysdeps/arm/configure.ac b/sysdeps/arm/configure.ac -index 859c92a..2f4a6e2 100644 +index 90cdd69..05a262b 100644 --- a/sysdeps/arm/configure.ac +++ b/sysdeps/arm/configure.ac @@ -15,8 +15,8 @@ AC_DEFINE(PI_STATIC_AND_HIDDEN) @@ -165,10 +165,10 @@ index f05f438..dc86399 100644 ], libc_cv_nios2_be=yes, libc_cv_nios2_be=no)]) if test $libc_cv_nios2_be = yes; then diff --git a/sysdeps/unix/sysv/linux/mips/configure b/sysdeps/unix/sysv/linux/mips/configure -index 83f8b13..2b6cbee 100644 +index dee56aa..f2049ed 100644 --- a/sysdeps/unix/sysv/linux/mips/configure +++ b/sysdeps/unix/sysv/linux/mips/configure -@@ -387,11 +387,11 @@ else +@@ -414,11 +414,11 @@ else /* end confdefs.h. */ dnl #ifdef __mips_nan2008 @@ -183,10 +183,10 @@ index 83f8b13..2b6cbee 100644 else libc_cv_mips_nan2008=no diff --git a/sysdeps/unix/sysv/linux/mips/configure.ac b/sysdeps/unix/sysv/linux/mips/configure.ac -index 5039ec9..1035f76 100644 +index 45147c5..4224af1 100644 --- a/sysdeps/unix/sysv/linux/mips/configure.ac +++ b/sysdeps/unix/sysv/linux/mips/configure.ac -@@ -98,9 +98,9 @@ AC_COMPILE_IFELSE( +@@ -105,9 +105,9 @@ AC_COMPILE_IFELSE( LIBC_CONFIG_VAR([mips-mode-switch],[${libc_mips_mode_switch}]) AC_CACHE_CHECK([whether the compiler is using the 2008 NaN encoding], @@ -199,7 +199,7 @@ index 5039ec9..1035f76 100644 libc_mips_nan= diff --git a/sysdeps/unix/sysv/linux/powerpc/powerpc64/configure b/sysdeps/unix/sysv/linux/powerpc/powerpc64/configure -index 70bb18a..ffd9e3e 100644 +index af06970..27b8c1b 100644 --- a/sysdeps/unix/sysv/linux/powerpc/powerpc64/configure +++ b/sysdeps/unix/sysv/linux/powerpc/powerpc64/configure @@ -155,12 +155,12 @@ else @@ -259,5 +259,5 @@ index 0822915..9a32fdd 100644 ], libc_cv_ppc64_def_call_elf=yes, libc_cv_ppc64_def_call_elf=no)]) if test $libc_cv_ppc64_def_call_elf = no; then -- -2.1.4 +2.6.4 diff --git a/yocto-poky/meta/recipes-core/glibc/glibc/0017-timezone-re-written-tzselect-as-posix-sh.patch b/yocto-poky/meta/recipes-core/glibc/glibc/0016-timezone-re-written-tzselect-as-posix-sh.patch index 0ce823087..e51b611f3 100644 --- a/yocto-poky/meta/recipes-core/glibc/glibc/0017-timezone-re-written-tzselect-as-posix-sh.patch +++ b/yocto-poky/meta/recipes-core/glibc/glibc/0016-timezone-re-written-tzselect-as-posix-sh.patch @@ -1,7 +1,7 @@ -From c90306107fbbe2979012917e87747ce78c82ab88 Mon Sep 17 00:00:00 2001 +From 3e8586eb3509e2f0d6dfb74be8f89a30b06b56e9 Mon Sep 17 00:00:00 2001 From: Khem Raj <raj.khem@gmail.com> Date: Wed, 18 Mar 2015 00:33:03 +0000 -Subject: [PATCH 17/27] timezone: re-written tzselect as posix sh +Subject: [PATCH 16/24] timezone: re-written tzselect as posix sh To avoid the bash dependency. @@ -15,10 +15,10 @@ Signed-off-by: Khem Raj <raj.khem@gmail.com> 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/timezone/Makefile b/timezone/Makefile -index 24c93c6..886b06e 100644 +index 99566cb..b6e757e 100644 --- a/timezone/Makefile +++ b/timezone/Makefile -@@ -126,7 +126,7 @@ $(testdata)/XT%: testdata/XT% +@@ -122,7 +122,7 @@ $(testdata)/XT%: testdata/XT% cp $< $@ $(objpfx)tzselect: tzselect.ksh $(common-objpfx)config.make @@ -41,5 +41,5 @@ index 9d70691..25f45a8 100755 # Check for awk Posix compliance. ($AWK -v x=y 'BEGIN { exit 123 }') </dev/null >/dev/null 2>&1 -- -2.1.4 +2.6.4 diff --git a/yocto-poky/meta/recipes-core/glibc/glibc/nscd-no-bash.patch b/yocto-poky/meta/recipes-core/glibc/glibc/0017-Remove-bash-dependency-for-nscd-init-script.patch index c306ce6af..0c9ae6c13 100644 --- a/yocto-poky/meta/recipes-core/glibc/glibc/nscd-no-bash.patch +++ b/yocto-poky/meta/recipes-core/glibc/glibc/0017-Remove-bash-dependency-for-nscd-init-script.patch @@ -1,7 +1,16 @@ -Don't use bashisms (except for echo -n, which busybox supports) to avoid needing bash to start nscd. +From cd9d9fe7316f4ce4ca9d8e67e22f5718879535e4 Mon Sep 17 00:00:00 2001 +From: Khem Raj <raj.khem@gmail.com> +Date: Thu, 31 Dec 2015 14:33:02 -0800 +Subject: [PATCH 17/24] Remove bash dependency for nscd init script + +The nscd init script uses #! /bin/bash but only really uses one bashism +(translated strings), so remove them and switch the shell to #!/bin/sh. -Upstream-Status: Pending Signed-off-by: Ross Burton <ross.burton@intel.com> +Signed-off-by: Khem Raj <raj.khem@gmail.com> +--- + nscd/nscd.init | 14 +++++++------- + 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/nscd/nscd.init b/nscd/nscd.init index a882da7..b02986e 100644 @@ -59,3 +68,6 @@ index a882da7..b02986e 100644 RETVAL=1 ;; esac +-- +2.6.4 + diff --git a/yocto-poky/meta/recipes-core/glibc/glibc/0018-eglibc-Cross-building-and-testing-instructions.patch b/yocto-poky/meta/recipes-core/glibc/glibc/0018-eglibc-Cross-building-and-testing-instructions.patch index 8eacbc059..e282e60eb 100644 --- a/yocto-poky/meta/recipes-core/glibc/glibc/0018-eglibc-Cross-building-and-testing-instructions.patch +++ b/yocto-poky/meta/recipes-core/glibc/glibc/0018-eglibc-Cross-building-and-testing-instructions.patch @@ -1,7 +1,7 @@ -From eff048074ac7b5258bb615e5a5b221daa19b18ae Mon Sep 17 00:00:00 2001 +From 8f554f4a1beb39182aad9cd9b5e1da69464dff7e Mon Sep 17 00:00:00 2001 From: Khem Raj <raj.khem@gmail.com> Date: Wed, 18 Mar 2015 00:42:58 +0000 -Subject: [PATCH 18/27] eglibc: Cross building and testing instructions +Subject: [PATCH 18/24] eglibc: Cross building and testing instructions Ported from eglibc Upstream-Status: Pending @@ -615,5 +615,5 @@ index 0000000..b67b468 + simply place copies of these libraries in the top GLIBC build + directory. -- -2.1.4 +2.6.4 diff --git a/yocto-poky/meta/recipes-core/glibc/glibc/0019-eglibc-Bring-Eglibc-option-group-infrastructure-to-g.patch b/yocto-poky/meta/recipes-core/glibc/glibc/0019-eglibc-Bring-Eglibc-option-group-infrastructure-to-g.patch deleted file mode 100644 index dcb80f9c8..000000000 --- a/yocto-poky/meta/recipes-core/glibc/glibc/0019-eglibc-Bring-Eglibc-option-group-infrastructure-to-g.patch +++ /dev/null @@ -1,1436 +0,0 @@ -From aa7c5fe86d04584a9aed4dc40ba856c65a1ef9c4 Mon Sep 17 00:00:00 2001 -From: Khem Raj <raj.khem@gmail.com> -Date: Wed, 18 Mar 2015 00:45:18 +0000 -Subject: [PATCH 19/27] eglibc: Bring Eglibc option group infrastructure to - glibc - -Upstream-Status: Pending - -Signed-off-by: Khem Raj <raj.khem@gmail.com> ---- - EGLIBC.option-groups | 122 ++++++ - Makefile | 1 + - config.make.in | 2 + - configure | 13 + - configure.ac | 10 + - option-groups.def | 868 ++++++++++++++++++++++++++++++++++++++ - option-groups.defaults | 47 +++ - option-groups.mak | 41 ++ - options-config/Makefile | 55 +++ - options-config/config-postproc.pl | 58 +++ - options-config/config-preproc.pl | 8 + - scripts/option-groups.awk | 63 +++ - 12 files changed, 1288 insertions(+) - create mode 100644 EGLIBC.option-groups - create mode 100644 option-groups.def - create mode 100644 option-groups.defaults - create mode 100644 option-groups.mak - create mode 100644 options-config/Makefile - create mode 100644 options-config/config-postproc.pl - create mode 100644 options-config/config-preproc.pl - create mode 100644 scripts/option-groups.awk - -diff --git a/EGLIBC.option-groups b/EGLIBC.option-groups -new file mode 100644 -index 0000000..6a50b8d ---- /dev/null -+++ b/EGLIBC.option-groups -@@ -0,0 +1,122 @@ -+ -*- mode: text -*- -+ -+ The EGLIBC Component Configuration System -+ Jim Blandy <jimb@codesourcery.com> -+ -+Introduction -+ -+The GNU C library (GLIBC) provides a broad range of functionality, -+ranging from internationalization support to transcendental -+mathematical functions. Its website boasts that "nearly all known and -+useful functions from any other C library are available." This -+exhaustive approach has been one of GLIBC's strengths on desktop and -+server systems, but it has also given GLIBC a large footprint, both in -+memory and on disk, making it a challenge to use in embedded systems -+with limited resources. -+ -+The Embedded GNU C library (EGLIBC) is a variant of the GNU C library -+designed to work well on embedded systems. In particular, EGLIBC's -+component configuration system allows embedded developers to build -+customized versions of the library that include only the features -+their application uses, reducing its space requirements. -+ -+EGLIBC's component configuration system categorizes the library's -+functions into "option groups", and allows you to include or exclude -+option groups individually. Some option groups depend on others; -+EGLIBC tracks these relationships, and ensures that the selected -+configuration yields a functioning library. -+ -+ -+Consistent and Predictable Behavior -+ -+A flexible configuration system is a mixed blessing: if the options -+offered are poorly designed, it can be hard to see which choices will -+have the desired effects, and choices with obscure consequences can -+make debugging difficult. EGLIBC's configuration follows some general -+principles to reduce these risks: -+ -+- EGLIBC has a single default configuration for each target -+ architecture. -+ -+- In the default configuration, all option groups are enabled, and -+ EGLIBC is upwardly API- and ABI-compatible with GLIBC. -+ -+- As much as possible, configurations only affect what functions are -+ present, not how they behave. If the system works with an option -+ group disabled, it will still work with it enabled. -+ -+- As much as possible, configurations only select option groups --- -+ they do not describe characteristics of the target architecture. -+ -+These rules mean that you have a simple debugging strategy available -+if you suspect that your EGLIBC configuration might be the source of a -+problem: fall back to the default configuration, re-test, and then -+disable option groups one by one, until the problem reappears. -+ -+ -+The Option Groups -+ -+To see the current full list of implemented option groups, refer to the -+file 'option-groups.def' at the top of the source tree, or run -+'make menuconfig' from the top-level build directory. -+ -+The POSIX.1-2001 specification includes a suggested partition of all -+the functions in the POSIX C API into option groups: math functions -+like 'sin' and 'cos'; networking functions like 'socket' and -+'connect'; and so on. EGLIBC could use this partitioning as the basis -+for future option groups. -+ -+ -+Implementation -+ -+The EGLIBC component configuration system resembles the approach used -+by the Linux kernel to select device drivers, network protocols, and -+other features. A file named 'option-groups.config' in the top-level -+build directory contains assignments to Make variables, each of which -+enables or disables a particular option group. If the variable's -+value is set to 'y', then the option group is enabled; if it set to -+anything else, the option group is omitted. The file -+'option-groups.defaults', at the top of the source tree, establishes -+default values for all variables; all option groups are enabled by -+default. -+ -+For example, the following 'option-groups.config' would omit locale -+data, but include mathematical functions, and everything else: -+ -+ OPTION_EGLIBC_LOCALES = n -+ OPTION_EGLIBC_LIBM = y -+ -+Like the Linux kernel, EGLIBC supports a similar set of '*config' make -+targets to make it easier to create 'option-groups.config', with all -+dependencies between option groups automatically satisfied. Run -+'make help' to see the list of supported make config targets. For -+example, 'make menuconfig' will update the current config utilising a -+menu based program. -+ -+The option group names and their type (boolean, int, hex, string), help -+description, and dependencies with other option groups, are described by -+'option-groups.def' at the top of the source tree, analogous to the -+'Kconfig' files in the Linux kernel. -+ -+In general, each option group variable controls whether a given set of -+object files in EGLIBC is compiled and included in the final -+libraries, or omitted from the build. -+ -+Each subdirectory's Makefile categorizes its routines, libraries, and -+executables by option group. For example, EGLIBC's 'math/Makefile' -+places the 'libm' library in the OPTION_EGLIBC_LIBM group as follows: -+ -+ extra-libs-$(OPTION_EGLIBC_LIBM) := libm -+ -+Finally, common code in 'Makerules' cites the value of the variable -+'extra-libs-y', selecting only those libraries that belong to enabled -+option groups to be built. -+ -+ -+Current Status and Future Directions -+ -+The EGLIBC component configuration system described here is still -+under development. -+ -+We have used the system to subset some portions of EGLIBC's -+Index: libc/configure.ac -diff --git a/Makefile b/Makefile -index 658ccfa..f906391 100644 ---- a/Makefile -+++ b/Makefile -@@ -24,6 +24,7 @@ endif - - include Makeconfig - -+include options-config/Makefile - - # This is the default target; it makes everything except the tests. - .PHONY: all -diff --git a/config.make.in b/config.make.in -index a9f5696..294f8d1 100644 ---- a/config.make.in -+++ b/config.make.in -@@ -47,6 +47,8 @@ c++-sysincludes = @CXX_SYSINCLUDES@ - all-warnings = @all_warnings@ - enable-werror = @enable_werror@ - -+kconfig_tools = @KCONFIG_TOOLS@ -+ - have-z-combreloc = @libc_cv_z_combreloc@ - have-z-execstack = @libc_cv_z_execstack@ - have-Bgroup = @libc_cv_Bgroup@ -diff --git a/configure b/configure -index 7d7299a..4116404 100755 ---- a/configure -+++ b/configure -@@ -641,6 +641,7 @@ INSTALL_INFO - PERL - BASH_SHELL - libc_cv_gcc_static_libgcc -+KCONFIG_TOOLS - CXX_SYSINCLUDES - SYSINCLUDES - AUTOCONF -@@ -755,6 +756,7 @@ with_fp - with_binutils - with_selinux - with_headers -+with_kconfig - with_default_link - enable_sanity_checks - enable_shared -@@ -1459,6 +1461,9 @@ Optional Packages: - --with-selinux if building with SELinux support - --with-headers=PATH location of system headers to use (for example - /usr/src/linux/include) [default=compiler default] -+ --with-kconfig=PATH location of kconfig tools to use (from Linux kernel -+ builds) to re-use for configuring EGLIBC option -+ groups - --with-default-link do not use explicit linker scripts - --with-cpu=CPU select code for CPU variant - -@@ -3517,6 +3522,14 @@ fi - - - -+# Check whether --with-kconfig was given. -+if test "${with_kconfig+set}" = set; then -+ withval=$with_kconfig; KCONFIG_TOOLS=$withval -+else -+ KCONFIG_TOOLS='' -+fi -+ -+ - - # Check whether --with-default-link was given. - if test "${with_default_link+set}" = set; then : -diff --git a/configure.ac b/configure.ac -index a467a69..fc0ed4d 100644 ---- a/configure.ac -+++ b/configure.ac -@@ -136,6 +136,16 @@ AC_ARG_WITH([headers], - [sysheaders='']) - AC_SUBST(sysheaders) - -+AC_ARG_WITH([kconfig], -+ AC_HELP_STRING([--with-kconfig=PATH], -+ [location of kconfig tools to use (from Linux -+ kernel builds) to re-use for configuring EGLIBC -+ option groups]), -+ [KCONFIG_TOOLS=$withval], -+ [KCONFIG_TOOLS='']) -+AC_SUBST(KCONFIG_TOOLS) -+ -+ - AC_SUBST(use_default_link) - AC_ARG_WITH([default-link], - AC_HELP_STRING([--with-default-link], -diff --git a/option-groups.def b/option-groups.def -new file mode 100644 -index 0000000..6aebd94 ---- /dev/null -+++ b/option-groups.def -@@ -0,0 +1,868 @@ -+# This file documents the option groups EGLIBC currently supports, in -+# a format akin to the Linux Kconfig system's. The syntax may change -+# over time. -+# -+# An entry of the form: -+# -+# config GROUP_NAME -+# bool "one-line explanation of what this option group controls" -+# help -+# Multi-line help explaining the option group's meaning in -+# some detail, terminated by indentation level. -+# -+# defines an option group whose variable is GROUP_NAME, with -+# meaningful values 'y' (enabled) and 'n' (disabled). The -+# documentation is formatted to be consumed by some sort of -+# interactive configuration interface, but EGLIBC doesn't have such an -+# interface yet. -+# -+# An option may have a 'depends on' line, indicating which other options -+# must also be enabled if this option is. At present, EGLIBC doesn't -+# check that these dependencies are satisfied. -+# -+# Option group variables get their default values from the file -+# 'option-groups.defaults', in the top directory of the EGLIBC source -+# tree. By default, all EGLIBC option groups are enabled --- their -+# variables are set to 'y'. -+# -+# After including 'option-groups.defaults', the EGLIBC make machinery -+# includes the file 'option-groups.config' from the top of the build -+# tree, if it is present. Developers can place assignments to option -+# group variables in that file to override the defaults. For example, -+# to disable an option group, place a line of the form: -+# -+# OPTION_GROUP_NAME = n -+# -+# in 'option-groups.config' at the top of your build tree. To -+# explicitly enable an option group, you may also write: -+# -+# OPTION_GROUP_NAME = y -+# -+# although this simply reestablishes the value already set by -+# 'option-groups.defaults'. -+ -+config EGLIBC_ADVANCED_INET6 -+ bool "IPv6 Advanced Sockets API support (RFC3542)" -+ depends on EGLIBC_INET -+ help -+ This option group includes the functions specified by RFC 3542, -+ "Advanced Sockets Application Program Interface (API) for -+ IPv6". -+ -+ This option group includes the following functions: -+ -+ inet6_opt_append -+ inet6_opt_find -+ inet6_opt_finish -+ inet6_opt_get_val -+ inet6_opt_init -+ inet6_option_alloc -+ inet6_option_append -+ inet6_option_find -+ inet6_option_init -+ inet6_option_next -+ inet6_option_space -+ inet6_opt_next -+ inet6_opt_set_val -+ inet6_rth_add -+ inet6_rth_getaddr -+ inet6_rth_init -+ inet6_rth_reverse -+ inet6_rth_segments -+ inet6_rth_space -+ -+config EGLIBC_BACKTRACE -+ bool "Functions for producing backtraces" -+ help -+ This option group includes functions for producing a list of -+ the function calls that are currently active in a thread, from -+ within the thread itself. These functions are often used -+ within signal handlers, to produce diagnostic output. -+ -+ This option group includes the following functions: -+ -+ backtrace -+ backtrace_symbols -+ backtrace_symbols_fd -+ -+config EGLIBC_BIG_MACROS -+ bool "Use extensive inline code" -+ help -+ This option group specifies whether certain pieces of code -+ should be inlined to achieve maximum speed. If this option -+ group is not selected, function calls will be used instead, -+ hence reducing the library footprint. -+ -+config EGLIBC_BSD -+ bool "BSD-specific functions, and their compatibility stubs" -+ help -+ This option group includes functions specific to BSD kernels. -+ A number of these functions have stub versions that are also -+ included in libraries built for non-BSD systems for -+ compatibility. -+ -+ This option group includes the following functions: -+ -+ chflags -+ fchflags -+ lchmod -+ revoke -+ setlogin -+ -+config EGLIBC_CXX_TESTS -+ bool "Tests that link against the standard C++ library." -+ depends on POSIX_WIDE_CHAR_DEVICE_IO && EGLIBC_LIBM -+ help -+ This option group does not include any C library functions; -+ instead, it controls which EGLIBC tests an ordinary 'make -+ tests' runs. With this group disabled, tests that would -+ normally link against the standard C++ library are not -+ run. -+ -+ The standard C++ library depends on the math library 'libm' and -+ the wide character I/O functions included in EGLIBC. So those -+ option groups must be enabled if this test is enabled. -+ -+config EGLIBC_CATGETS -+ bool "Functions for accessing message catalogs" -+ depends on EGLIBC_LOCALE_CODE -+ help -+ This option group includes functions for accessing message -+ catalogs: catopen, catclose, and catgets. -+ -+ This option group depends on the EGLIBC_LOCALE_CODE -+ option group. -+ -+config EGLIBC_CHARSETS -+ bool "iconv/gconv character set conversion libraries" -+ help -+ This option group includes support for character sets other -+ than ASCII (ANSI_X3.4-1968) and Unicode and ISO-10646 in their -+ various encodings. This affects both the character sets -+ supported by the wide and multibyte character functions, and -+ those supported by the 'iconv' functions. -+ -+ With this option group disabled, EGLIBC supports only the -+ following character sets: -+ -+ ANSI_X3.4 - ASCII -+ ANSI_X3.4-1968 -+ ANSI_X3.4-1986 -+ ASCII -+ CP367 -+ CSASCII -+ IBM367 -+ ISO-IR-6 -+ ISO646-US -+ ISO_646.IRV:1991 -+ OSF00010020 -+ US -+ US-ASCII -+ -+ 10646-1:1993 - ISO 10646, in big-endian UCS4 form -+ 10646-1:1993/UCS4 -+ CSUCS4 -+ ISO-10646 -+ ISO-10646/UCS4 -+ OSF00010104 -+ OSF00010105 -+ OSF00010106 -+ UCS-4 -+ UCS-4BE -+ UCS4 -+ -+ UCS-4LE - ISO 10646, in little-endian UCS4 form -+ -+ ISO-10646/UTF-8 - ISO 10646, in UTF-8 form -+ ISO-10646/UTF8 -+ ISO-IR-193 -+ OSF05010001 -+ UTF-8 -+ UTF8 -+ -+ ISO-10646/UCS2 - ISO 10646, in target-endian UCS2 form -+ OSF00010100 -+ OSF00010101 -+ OSF00010102 -+ UCS-2 -+ UCS2 -+ -+ UCS-2BE - ISO 10646, in big-endian UCS2 form -+ UNICODEBIG -+ -+ UCS-2LE - ISO 10646, in little-endian UCS2 form -+ UNICODELITTLE -+ -+ WCHAR_T - EGLIBC's internal form (target-endian, -+ 32-bit ISO 10646) -+ -+config EGLIBC_CRYPT -+ bool "Encryption library" -+ help -+ This option group includes the `libcrypt' library which -+ provides functions for one-way encryption. Supported -+ encryption algorithms include MD5, SHA-256, SHA-512 and DES. -+ -+config EGLIBC_CRYPT_UFC -+ bool "Ultra fast `crypt' implementation" -+ depends on EGLIBC_CRYPT -+ help -+ This option group provides ultra fast DES-based implementation of -+ the `crypt' function. When this option group is disabled, -+ (a) the library will not provide the setkey[_r] and encrypt[_r] -+ functions and (b) the crypt[_r] function will return NULL and set the -+ errno to ENOSYS if /salt/ passed does not correspond to either MD5, -+ SHA-256 or SHA-512 algorithm. -+ -+config EGLIBC_DB_ALIASES -+ bool "Functions for accessing the mail aliases database" -+ help -+ This option group includues functions for looking up mail -+ aliases in '/etc/aliases' or using nsswitch. It includes the -+ following functions: -+ -+ endaliasent -+ getaliasbyname -+ getaliasbyname_r -+ getaliasent -+ getaliasent_r -+ setaliasent -+ -+ When this option group is disabled, the NSS service libraries -+ also lack support for querying their mail alias tables. -+ -+config EGLIBC_ENVZ -+ bool "Functions for handling envz-style environment vectors." -+ help -+ This option group contains functions for creating and operating -+ on envz vectors. An "envz vector" is a vector of strings in a -+ contiguous block of memory, where each element is a name-value -+ pair, and elements are separated from their neighbors by null -+ characters. -+ -+ This option group includes the following functions: -+ -+ envz_add envz_merge -+ envz_entry envz_remove -+ envz_get envz_strip -+ -+config EGLIBC_FCVT -+ bool "Functions for converting floating-point numbers to strings" -+ help -+ This option group includes functions for converting -+ floating-point numbers to strings. -+ -+ This option group includes the following functions: -+ -+ ecvt qecvt -+ ecvt_r qecvt_r -+ fcvt qfcvt -+ fcvt_r qfcvt_r -+ gcvt qgcvt -+ -+config EGLIBC_FMTMSG -+ bool "Functions for formatting messages" -+ help -+ This option group includes the following functions: -+ -+ addseverity fmtmsg -+ -+config EGLIBC_FSTAB -+ bool "Access functions for 'fstab'" -+ help -+ This option group includes functions for reading the mount -+ point specification table, '/etc/fstab'. These functions are -+ not included in the POSIX standard, which provides the -+ 'getmntent' family of functions instead. -+ -+ This option group includes the following functions: -+ -+ endfsent getfsspec -+ getfsent setfsent -+ getfsfile -+ -+config EGLIBC_FTRAVERSE -+ bool "Functions for traversing file hierarchies" -+ help -+ This option group includes functions for traversing file -+ UNIX file hierachies. -+ -+ This option group includes the following functions: -+ -+ fts_open ftw -+ fts_read nftw -+ fts_children ftw64 -+ fts_set nftw64 -+ fts_close -+ -+config EGLIBC_GETLOGIN -+ bool "The getlogin function" -+ depends on EGLIBC_UTMP -+ help -+ This function group includes the 'getlogin' and 'getlogin_r' -+ functions, which return the user name associated by the login -+ activity with the current process's controlling terminal. -+ -+ With this option group disabled, the 'glob' function will not -+ fall back on 'getlogin' to find the user's login name for tilde -+ expansion when the 'HOME' environment variable is not set. -+ -+config EGLIBC_IDN -+ bool "International domain names support" -+ help -+ This option group includes the `libcidn' library which -+ provides support for international domain names. -+ -+config EGLIBC_INET -+ bool "Networking support" -+ help -+ This option group includes networking-specific functions and -+ data. With EGLIBC_INET disabled, the EGLIBC -+ installation and API changes as follows: -+ -+ - The following libraries are not installed: -+ -+ libnsl -+ libnss_compat -+ libnss_dns -+ libnss_hesiod -+ libnss_nis -+ libnss_nisplus -+ libresolv -+ -+ - The following functions and variables are omitted from libc: -+ -+ authdes_create hstrerror svc_fdset -+ authdes_getucred htonl svc_getreq -+ authdes_pk_create htons svc_getreq_common -+ authnone_create if_freenameindex svc_getreq_poll -+ authunix_create if_indextoname svc_getreqset -+ authunix_create_default if_nameindex svc_max_pollfd -+ bindresvport if_nametoindex svc_pollfd -+ callrpc in6addr_any svcraw_create -+ cbc_crypt in6addr_loopback svc_register -+ clnt_broadcast inet6_opt_append svc_run -+ clnt_create inet6_opt_find svc_sendreply -+ clnt_pcreateerror inet6_opt_finish svctcp_create -+ clnt_perrno inet6_opt_get_val svcudp_bufcreate -+ clnt_perror inet6_opt_init svcudp_create -+ clntraw_create inet6_option_alloc svcudp_enablecache -+ clnt_spcreateerror inet6_option_append svcunix_create -+ clnt_sperrno inet6_option_find svcunixfd_create -+ clnt_sperror inet6_option_init svc_unregister -+ clnttcp_create inet6_option_next user2netname -+ clntudp_bufcreate inet6_option_space xdecrypt -+ clntudp_create inet6_opt_next xdr_accepted_reply -+ clntunix_create inet6_opt_set_val xdr_array -+ des_setparity inet6_rth_add xdr_authdes_cred -+ ecb_crypt inet6_rth_getaddr xdr_authdes_verf -+ endaliasent inet6_rth_init xdr_authunix_parms -+ endhostent inet6_rth_reverse xdr_bool -+ endnetent inet6_rth_segments xdr_bytes -+ endnetgrent inet6_rth_space xdr_callhdr -+ endprotoent inet_addr xdr_callmsg -+ endrpcent inet_aton xdr_char -+ endservent inet_lnaof xdr_cryptkeyarg -+ ether_aton inet_makeaddr xdr_cryptkeyarg2 -+ ether_aton_r inet_netof xdr_cryptkeyres -+ ether_hostton inet_network xdr_des_block -+ ether_line inet_nsap_addr xdr_double -+ ether_ntoa inet_nsap_ntoa xdr_enum -+ ether_ntoa_r inet_ntoa xdr_float -+ ether_ntohost inet_ntop xdr_free -+ freeaddrinfo inet_pton xdr_getcredres -+ freeifaddrs innetgr xdr_hyper -+ gai_strerror iruserok xdr_int -+ getaddrinfo iruserok_af xdr_int16_t -+ getaliasbyname key_decryptsession xdr_int32_t -+ getaliasbyname_r key_decryptsession_pk xdr_int64_t -+ getaliasent key_encryptsession xdr_int8_t -+ getaliasent_r key_encryptsession_pk xdr_keybuf -+ gethostbyaddr key_gendes xdr_key_netstarg -+ gethostbyaddr_r key_get_conv xdr_key_netstres -+ gethostbyname key_secretkey_is_set xdr_keystatus -+ gethostbyname2 key_setnet xdr_long -+ gethostbyname2_r key_setsecret xdr_longlong_t -+ gethostbyname_r netname2host xdrmem_create -+ gethostent netname2user xdr_netnamestr -+ gethostent_r ntohl xdr_netobj -+ getifaddrs ntohs xdr_opaque -+ getipv4sourcefilter passwd2des xdr_opaque_auth -+ get_myaddress pmap_getmaps xdr_pmap -+ getnameinfo pmap_getport xdr_pmaplist -+ getnetbyaddr pmap_rmtcall xdr_pointer -+ getnetbyaddr_r pmap_set xdr_quad_t -+ getnetbyname pmap_unset xdrrec_create -+ getnetbyname_r rcmd xdrrec_endofrecord -+ getnetent rcmd_af xdrrec_eof -+ getnetent_r registerrpc xdrrec_skiprecord -+ getnetgrent res_init xdr_reference -+ getnetgrent_r rexec xdr_rejected_reply -+ getnetname rexec_af xdr_replymsg -+ getprotobyname rexecoptions xdr_rmtcall_args -+ getprotobyname_r rpc_createerr xdr_rmtcallres -+ getprotobynumber rresvport xdr_short -+ getprotobynumber_r rresvport_af xdr_sizeof -+ getprotoent rtime xdrstdio_create -+ getprotoent_r ruserok xdr_string -+ getpublickey ruserok_af xdr_u_char -+ getrpcbyname ruserpass xdr_u_hyper -+ getrpcbyname_r setaliasent xdr_u_int -+ getrpcbynumber sethostent xdr_uint16_t -+ getrpcbynumber_r setipv4sourcefilter xdr_uint32_t -+ getrpcent setnetent xdr_uint64_t -+ getrpcent_r setnetgrent xdr_uint8_t -+ getrpcport setprotoent xdr_u_long -+ getsecretkey setrpcent xdr_u_longlong_t -+ getservbyname setservent xdr_union -+ getservbyname_r setsourcefilter xdr_unixcred -+ getservbyport svcauthdes_stats xdr_u_quad_t -+ getservbyport_r svcerr_auth xdr_u_short -+ getservent svcerr_decode xdr_vector -+ getservent_r svcerr_noproc xdr_void -+ getsourcefilter svcerr_noprog xdr_wrapstring -+ h_errlist svcerr_progvers xencrypt -+ h_errno svcerr_systemerr xprt_register -+ herror svcerr_weakauth xprt_unregister -+ h_nerr svc_exit -+ host2netname svcfd_create -+ -+ - The rpcgen, nscd, and rpcinfo commands are not installed. -+ -+ - The 'rpc' file (a text file listing RPC services) is not installed. -+ -+ Socket-related system calls do not fall in this option group, -+ because many are also used for other inter-process -+ communication mechanisms. For example, the 'syslog' routines -+ use Unix-domain sockets to communicate with the syslog daemon; -+ syslog is valuable in non-networked contexts. -+ -+config EGLIBC_INET_ANL -+ bool "Asynchronous name lookup" -+ depends on EGLIBC_INET -+ help -+ This option group includes the `libanl' library which -+ provides support for asynchronous name lookup. -+ -+config EGLIBC_LIBM -+ bool "libm (math library)" -+ help -+ This option group includes the 'libm' library, containing -+ mathematical functions. If this option group is omitted, then -+ an EGLIBC installation does not include shared or unshared versions -+ of the math library. -+ -+ Note that this does not remove all floating-point related -+ functionality from EGLIBC; for example, 'printf' and 'scanf' -+ can still print and read floating-point values with this option -+ group disabled. -+ -+ Note that the ISO Standard C++ library 'libstdc++' depends on -+ EGLIBC's math library 'libm'. If you disable this option -+ group, you will not be able to build 'libstdc++' against the -+ resulting EGLIBC installation. -+ -+config EGLIBC_LOCALES -+ bool "Locale definitions" -+ help -+ This option group includes all locale definitions other than -+ that for the "C" locale. If this option group is omitted, then -+ only the "C" locale is supported. -+ -+ -+config EGLIBC_LOCALE_CODE -+ bool "Locale functions" -+ depends on POSIX_C_LANG_WIDE_CHAR -+ help -+ This option group includes locale support functions, programs, -+ and libraries. With EGLIBC_LOCALE_CODE disabled, -+ EGLIBC supports only the 'C' locale (also known as 'POSIX'), -+ and ignores the settings of the 'LANG' and 'LC_*' environment -+ variables. -+ -+ With EGLIBC_LOCALE_CODE disabled, the following -+ functions are omitted from libc: -+ -+ duplocale localeconv nl_langinfo rpmatch strfmon_l -+ freelocale newlocale nl_langinfo_l strfmon uselocale -+ -+ Furthermore, only the LC_CTYPE and LC_TIME categories of the -+ standard "C" locale are available. -+ -+ The EGLIBC_CATGETS option group depends on this option group. -+ -+ -+config EGLIBC_MEMUSAGE -+ bool "Memory profiling library" -+ help -+ This option group includes the `libmemusage' library and -+ the `memusage' and `memusagestat' utilities. -+ These components provide memory profiling functions. -+ -+config EGLIBC_MEMUSAGE_DEFAULT_BUFFER_SIZE -+ int "Memory profiling library buffer size" -+ depends on EGLIBC_MEMUSAGE -+ default "32768" -+ help -+ Libmemusage library buffers the profiling data in memory -+ before writing it out to disk. By default, the library -+ allocates 1.5M buffer, which can be substantial for some -+ systems. EGLIBC_MEMUSAGE_DEFAULT_BUFFER_SIZE option -+ allows to change the default buffer size. It specifies -+ the number of entries the buffer should have. -+ On most architectures one buffer entry amounts to 48 bytes, -+ so setting this option to the value of 512 will reduce the size of -+ the memory buffer to 24K. -+ -+config EGLIBC_NIS -+ bool "Support for NIS, NIS+, and the special 'compat' services." -+ depends on EGLIBC_INET && EGLIBC_SUNRPC -+ help -+ This option group includes the NIS, NIS+, and 'compat' Name -+ Service Switch service libraries. When it is disabled, those -+ services libraries are not installed; you should remove any -+ references to them from your 'nsswitch.conf' file. -+ -+ This option group depends on the EGLIBC_INET option -+ group; you must enable that to enable this option group. -+ -+config EGLIBC_NSSWITCH -+ bool "Name service switch (nsswitch) support" -+ help -+ This option group includes support for the 'nsswitch' facility. -+ With this option group enabled, all EGLIBC functions for -+ accessing various system databases (passwords and groups; -+ networking; aliases; public keys; and so on) consult the -+ '/etc/nsswitch.conf' configuration file to decide how to handle -+ queries. -+ -+ With this option group disabled, EGLIBC uses a fixed list of -+ services to satisfy queries on each database, as requested by -+ configuration files specified when EGLIBC is built. Your -+ 'option-groups.config' file must set the following two -+ variables: -+ -+config EGLIBC_NSSWITCH_FIXED_CONFIG -+ string "Nsswitch fixed config filename" -+ depends on !EGLIBC_NSSWITCH -+ default "" -+ help -+ Set this to the name of a file whose contents observe the -+ same syntax as an ordinary '/etc/nsswitch.conf' file. The -+ EGLIBC build process parses this file just as EGLIBC would -+ at run time if EGLIBC_NSSWITCH were enabled, and -+ produces a C library that uses the nsswitch service -+ libraries to search for database entries as this file -+ specifies, instead of consulting '/etc/nsswitch.conf' at run -+ time. -+ -+ This should be an absolute filename. The EGLIBC build -+ process may use it from several different working -+ directories. It may include references to Makefile -+ variables like 'common-objpfx' (the top of the build tree, -+ with a trailing slash), or '..' (the top of the source tree, -+ with a trailing slash). -+ -+ The EGLIBC source tree includes a sample configuration file -+ named 'nss/fixed-nsswitch.conf'; for simple configurations, -+ you will probably want to delete references to databases not -+ needed on your system. -+ -+config EGLIBC_NSSWITCH_FIXED_FUNCTIONS -+ string "Nsswitch fixed functions filename" -+ depends on !EGLIBC_NSSWITCH -+ default "" -+ help -+ The EGLIBC build process uses this file to decide which -+ functions to make available from which service libraries. -+ The file 'nss/fixed-nsswitch.functions' serves as a sample -+ configuration file for this setting, and explains its syntax -+ and meaning in more detail. -+ -+ This should be an absolute file name. The EGLIBC build -+ process may use it from several different working -+ directories. It may include references to Makefile -+ variables like 'common-objpfx' (the top of the build tree, -+ with a trailing slash), or '..' (the top of the source tree, -+ with a trailing slash). -+ -+ Be sure to mention each function in each service you wish to -+ use. If you do not mention a service's function here, the -+ EGLIBC database access functions will not find it, even if -+ it is listed in the EGLIBC_NSSWITCH_FIXED_CONFIG -+ file. -+ -+ In this arrangement, EGLIBC will not use the 'dlopen' and -+ 'dlsym' functions to find database access functions. Instead, -+ libc hard-codes references to the service libraries' database -+ access functions. You must explicitly link your program -+ against the name service libraries (those whose names start -+ with 'libnss_', in the sysroot's '/lib' directory) whose -+ functions you intend to use. This arrangement helps -+ system-wide static analysis tools decide which functions a -+ system actually uses. -+ -+ Note that some nsswitch service libraries require other option -+ groups to be enabled; for example, the EGLIBC_INET -+ option group must be enabled to use the 'libnss_dns.so.2' -+ service library, which uses the Domain Name System network -+ protocol to answer queries. -+ -+config EGLIBC_RCMD -+ bool "Support for 'rcmd' and related library functions" -+ depends on EGLIBC_INET -+ help -+ This option group includes functions for running commands on -+ remote machines via the 'rsh' protocol, and doing authentication -+ related to those functions. This also includes functions that -+ use the 'rexec' protocol. -+ -+ This option group includes the following functions: -+ -+ rcmd ruserok -+ rcmd_af ruserok_af -+ rexec iruserok -+ rexec_af iruserok_af -+ rresvport ruserpass -+ rresvport_af -+ -+config EGLIBC_RTLD_DEBUG -+ bool "Runtime linker debug print outs" -+ help -+ This option group enables debug output of the runtime linker -+ which is activated via LD_DEBUG and LD_TRACE_PRELINKING -+ environment variables. Disabling this option group yields -+ a smaller runtime linker binary. -+ BEWARE: Disabling this option group is likely to break -+ the `ldd' utility which may also be used by the prelinker. -+ In particular, the `--unused' ldd option will not work correctly. -+ -+config EGLIBC_SPAWN -+ bool "Support for POSIX posix_spawn functions" -+ help -+ This option group includes the POSIX functions for executing -+ programs in child processes without using 'fork' or 'vfork'. -+ -+ This option group includes the following functions: -+ -+ posix_spawn -+ posix_spawnattr_destroy -+ posix_spawnattr_getflags -+ posix_spawnattr_getpgroup -+ posix_spawnattr_getschedparam -+ posix_spawnattr_getschedpolicy -+ posix_spawnattr_getsigdefault -+ posix_spawnattr_getsigmask -+ posix_spawnattr_init -+ posix_spawnattr_setflags -+ posix_spawnattr_setpgroup -+ posix_spawnattr_setschedparam -+ posix_spawnattr_setschedpolicy -+ posix_spawnattr_setsigdefault -+ posix_spawnattr_setsigmask -+ posix_spawn_file_actions_addclose -+ posix_spawn_file_actions_adddup2 -+ posix_spawn_file_actions_addopen -+ posix_spawn_file_actions_destroy -+ posix_spawn_file_actions_init -+ posix_spawnp -+ -+ This option group also provides the ability for the iconv, -+ localedef, and locale programs to operate transparently on -+ compressed charset definitions. When this option group is -+ disabled, those programs will only operate on uncompressed -+ charmap files. -+ -+config EGLIBC_STREAMS -+ bool "Support for accessing STREAMS." -+ help -+ This option group includes functions for reading and writing -+ messages to and from STREAMS. The STREAMS interface provides a -+ uniform mechanism for implementing networking services and other -+ character-based I/O. (STREAMS are not to be confused with -+ <stdio.h> FILE objects, also called 'streams'.) -+ -+ This option group includes the following functions: -+ -+ getmsg putpmsg -+ getpmsg fattach -+ isastream fdetach -+ putmsg -+ -+config EGLIBC_SUNRPC -+ bool "Support for the Sun 'RPC' protocol." -+ depends on EGLIBC_INET -+ help -+ This option group includes support for the Sun RPC protocols, -+ including the 'rpcgen' and 'rpcinfo' programs. -+ -+config EGLIBC_UTMP -+ bool "Older access functions for 'utmp' login records" -+ help -+ This option group includes the older 'utent' family of -+ functions for accessing user login records in the 'utmp' file. -+ POSIX omits these functions in favor of the 'utxent' family, -+ and they are obsolete on systems other than Linux. -+ -+ This option group includes the following functions: -+ -+ endutent -+ getutent -+ getutent_r -+ getutid -+ getutid_r -+ getutline -+ getutline_r -+ logwtmp -+ pututline -+ setutent -+ updwtmp -+ utmpname -+ -+ This option group includes the following libraries: -+ -+ libutil.so (and libutil.a) -+ -+config EGLIBC_UTMPX -+ bool "POSIX access functions for 'utmp' login records" -+ depends on EGLIBC_UTMP -+ help -+ This option group includes the POSIX functions for reading and -+ writing user login records in the 'utmp' file (usually -+ '/var/run/utmp'). The POSIX functions operate on 'struct -+ utmpx' structures, as opposed to the family of older 'utent' -+ functions, which operate on 'struct utmp' structures. -+ -+ This option group includes the following functions: -+ -+ endutxent -+ getutmp -+ getutmpx -+ getutxent -+ getutxid -+ getutxline -+ pututxline -+ setutxent -+ updwtmpx -+ utmpxname -+ -+config EGLIBC_WORDEXP -+ bool "Shell-style word expansion" -+ help -+ This option group includes the 'wordexp' function for -+ performing word expansion in the manner of the shell, and the -+ accompanying 'wordfree' function. -+ -+config POSIX_C_LANG_WIDE_CHAR -+ bool "ISO C library wide character functions, excluding I/O" -+ help -+ This option group includes the functions defined by the ISO C -+ standard for working with wide and multibyte characters in -+ memory. Functions for reading and writing wide and multibyte -+ characters from and to files call in the -+ POSIX_WIDE_CHAR_DEVICE_IO option group. -+ -+ This option group includes the following functions: -+ -+ btowc mbsinit wcscspn wcstoll -+ iswalnum mbsrtowcs wcsftime wcstombs -+ iswalpha mbstowcs wcslen wcstoul -+ iswblank mbtowc wcsncat wcstoull -+ iswcntrl swprintf wcsncmp wcstoumax -+ iswctype swscanf wcsncpy wcsxfrm -+ iswdigit towctrans wcspbrk wctob -+ iswgraph towlower wcsrchr wctomb -+ iswlower towupper wcsrtombs wctrans -+ iswprint vswprintf wcsspn wctype -+ iswpunct vswscanf wcsstr wmemchr -+ iswspace wcrtomb wcstod wmemcmp -+ iswupper wcscat wcstof wmemcpy -+ iswxdigit wcschr wcstoimax wmemmove -+ mblen wcscmp wcstok wmemset -+ mbrlen wcscoll wcstol -+ mbrtowc wcscpy wcstold -+ -+config POSIX_REGEXP -+ bool "Regular expressions" -+ help -+ This option group includes the POSIX regular expression -+ functions, and the associated non-POSIX extensions and -+ compatibility functions. -+ -+ With POSIX_REGEXP disabled, the following functions are -+ omitted from libc: -+ -+ re_comp re_max_failures regcomp -+ re_compile_fastmap re_search regerror -+ re_compile_pattern re_search_2 regexec -+ re_exec re_set_registers regfree -+ re_match re_set_syntax rpmatch -+ re_match_2 re_syntax_options -+ -+ Furthermore, the compatibility regexp interface defined in the -+ <regexp.h> header file, 'compile', 'step', and 'advance', is -+ omitted. -+ -+config POSIX_REGEXP_GLIBC -+ bool "Regular expressions from GLIBC" -+ depends on POSIX_REGEXP -+ help -+ This option group specifies which regular expression -+ library to use. The choice is between regex -+ implementation from GLIBC and regex implementation from -+ libiberty. The GLIBC variant is fully POSIX conformant and -+ optimized for speed; regex from libiberty is more than twice -+ as small while still is enough for most practical purposes. -+ -+config POSIX_WIDE_CHAR_DEVICE_IO -+ bool "Input and output functions for wide characters" -+ depends on POSIX_C_LANG_WIDE_CHAR -+ help -+ This option group includes functions for reading and writing -+ wide characters to and from <stdio.h> streams. -+ -+ This option group includes the following functions: -+ -+ fgetwc fwprintf putwchar vwscanf -+ fgetws fwscanf ungetwc wprintf -+ fputwc getwc vfwprintf wscanf -+ fputws getwchar vfwscanf -+ fwide putwc vwprintf -+ -+ This option group further includes the following unlocked -+ variants of the above functions: -+ -+ fgetwc_unlocked getwc_unlocked -+ fgetws_unlocked getwchar_unlocked -+ fputwc_unlocked putwc_unlocked -+ fputws_unlocked putwchar_unlocked -+ -+ Note that the GNU standard C++ library, 'libstdc++.so', uses -+ some of these functions; you will not be able to link or run -+ C++ programs if you disable this option group. -+ -+ This option group also affects the behavior of the following -+ functions: -+ -+ fdopen -+ fopen -+ fopen64 -+ freopen -+ freopen64 -+ -+ These functions all take an OPENTYPE parameter which may -+ contain a string of the form ",ccs=CHARSET", indicating that -+ the underlying file uses the character set named CHARSET. -+ This produces a wide-oriented stream, which is only useful -+ when the functions included in this option group are present. -+ If the user attempts to open a file specifying a character set -+ in the OPENTYPE parameter, and EGLIBC was built with this -+ option group disabled, the function returns NULL, and sets -+ errno to EINVAL. -+ -+ -+# This helps Emacs users browse this file using the page motion commands -+# and commands like 'pages-directory'. -+# Local Variables: -+# page-delimiter: "^config\\s-" -+# End: -diff --git a/option-groups.defaults b/option-groups.defaults -new file mode 100644 -index 0000000..8141201 ---- /dev/null -+++ b/option-groups.defaults -@@ -0,0 +1,47 @@ -+# This file sets default values for all option group variables -+# mentioned in option-groups.def; see that file for a description of -+# each option group. -+# -+# Subdirectory makefiles include this file before including the user's -+# settings from option-groups.config at the top of the build tree; -+# that file need only refer to those options whose default settings -+# are to be changed. -+# -+# By default, all option groups are enabled. -+OPTION_EGLIBC_ADVANCED_INET6 = y -+OPTION_EGLIBC_BACKTRACE = y -+OPTION_EGLIBC_BIG_MACROS = y -+OPTION_EGLIBC_BSD = y -+OPTION_EGLIBC_CXX_TESTS = y -+OPTION_EGLIBC_CATGETS = y -+OPTION_EGLIBC_CHARSETS = y -+OPTION_EGLIBC_CRYPT = y -+OPTION_EGLIBC_CRYPT_UFC = y -+OPTION_EGLIBC_DB_ALIASES = y -+OPTION_EGLIBC_ENVZ = y -+OPTION_EGLIBC_FCVT = y -+OPTION_EGLIBC_FMTMSG = y -+OPTION_EGLIBC_FSTAB = y -+OPTION_EGLIBC_FTRAVERSE = y -+OPTION_EGLIBC_GETLOGIN = y -+OPTION_EGLIBC_IDN = y -+OPTION_EGLIBC_INET = y -+OPTION_EGLIBC_INET_ANL = y -+OPTION_EGLIBC_LIBM = y -+OPTION_EGLIBC_LOCALES = y -+OPTION_EGLIBC_LOCALE_CODE = y -+OPTION_EGLIBC_MEMUSAGE = y -+OPTION_EGLIBC_NIS = y -+OPTION_EGLIBC_NSSWITCH = y -+OPTION_EGLIBC_RCMD = y -+OPTION_EGLIBC_RTLD_DEBUG = y -+OPTION_EGLIBC_SPAWN = y -+OPTION_EGLIBC_STREAMS = y -+OPTION_EGLIBC_SUNRPC = y -+OPTION_EGLIBC_UTMP = y -+OPTION_EGLIBC_UTMPX = y -+OPTION_EGLIBC_WORDEXP = y -+OPTION_POSIX_C_LANG_WIDE_CHAR = y -+OPTION_POSIX_REGEXP = y -+OPTION_POSIX_REGEXP_GLIBC = y -+OPTION_POSIX_WIDE_CHAR_DEVICE_IO = y -diff --git a/option-groups.mak b/option-groups.mak -new file mode 100644 -index 0000000..f83e0c1 ---- /dev/null -+++ b/option-groups.mak -@@ -0,0 +1,41 @@ -+# Setup file for subdirectory Makefiles that define EGLIBC option groups. -+ -+# EGLIBC shouldn't need to override this. However, the -+# cross-build-friendly localedef includes this makefile to get option -+# group variable definitions; it uses a single build tree for all the -+# multilibs, and needs to be able to specify a different option group -+# configuration file for each multilib. -+option_group_config_file ?= $(objdir)/option-groups.config -+ -+# Read the default settings for all options. -+# We're included before ../Rules, so we can't assume $(..) is set. -+include $(firstword $(..) ../)option-groups.defaults -+ -+# Read the developer's option group selections, overriding the -+# defaults from option-groups.defaults. -+-include $(option_group_config_file) -+ -+# $(call option-disabled, VAR) is 'y' if VAR is not 'y', or 'n' otherwise. -+# VAR should be a variable name, not a variable reference; this is -+# less general, but more terse for the intended use. -+# You can use it to add a file to a list if an option group is -+# disabled, like this: -+# routines-$(call option-disabled, OPTION_POSIX_C_LANG_WIDE_CHAR) += ... -+define option-disabled -+$(firstword $(subst y,n,$(filter y,$($(strip $(1))))) y) -+endef -+ -+# Establish 'routines-y', etc. as simply-expanded variables. -+aux-y := -+extra-libs-others-y := -+extra-libs-y := -+extra-objs-y := -+install-bin-y := -+install-others-y := -+install-sbin-y := -+others-y := -+others-pie-y := -+routines-y := -+test-srcs-y := -+tests-y := -+xtests-y := -diff --git a/options-config/Makefile b/options-config/Makefile -new file mode 100644 -index 0000000..db00708 ---- /dev/null -+++ b/options-config/Makefile -@@ -0,0 +1,55 @@ -+# =========================================================================== -+# EGLIBC option-groups configuration targets -+# These targets are included from top-level makefile -+ -+ifneq ($(kconfig_tools),) -+ifneq (no,$(PERL)) -+ -+ocdir := options-config -+ -+OconfigDefaults := option-groups.defaults -+OconfigDefaults_tmp := $(common-objpfx).tmp.defconfig -+OconfigDef := option-groups.def -+Oconfig := $(common-objpfx)option-groups.config -+Oconfig_tmp := $(common-objpfx).tmp.config -+ -+conf := $(kconfig_tools)/conf -+mconf := $(kconfig_tools)/mconf -+ -+preproc := $(PERL) $(ocdir)/config-preproc.pl -+postproc := $(PERL) $(ocdir)/config-postproc.pl -+ -+PHONY += defconfig config menuconfig -+ -+defconfig: $(conf) $(OconfigDefaults) $(OconfigDef) -+ rm -f $(OconfigDefaults_tmp) -+ rm -f $(Oconfig_tmp) -+ $(preproc) $(OconfigDefaults) > $(OconfigDefaults_tmp) -+ KCONFIG_CONFIG=$(Oconfig_tmp) $< --defconfig=$(OconfigDefaults_tmp) \ -+ $(OconfigDef) -+ $(postproc) $(OconfigDefaults) $(Oconfig_tmp) > $(Oconfig) -+ rm $(Oconfig_tmp) -+ rm $(OconfigDefaults_tmp) -+ -+config: $(conf) $(OconfigDefaults) $(OconfigDef) -+ rm -f $(Oconfig_tmp) -+ $(preproc) $(wildcard $(Oconfig)) > $(Oconfig_tmp) -+ KCONFIG_CONFIG=$(Oconfig_tmp) $< --oldaskconfig $(OconfigDef) -+ $(postproc) $(OconfigDefaults) $(Oconfig_tmp) > $(Oconfig) -+ rm $(Oconfig_tmp) -+ -+menuconfig: $(mconf) $(OconfigDefaults) $(OconfigDef) -+ rm -f $(Oconfig_tmp) -+ $(preproc) $(wildcard $(Oconfig)) > $(Oconfig_tmp) -+ KCONFIG_CONFIG=$(Oconfig_tmp) $< $(OconfigDef) -+ $(postproc) $(OconfigDefaults) $(Oconfig_tmp) > $(Oconfig) -+ rm $(Oconfig_tmp) -+ -+# Help text used by make help -+help: -+ @echo ' defconfig - New config with default from default config' -+ @echo ' config - Update current config utilising a line-oriented program' -+ @echo ' menuconfig - Update current config utilising a menu based program' -+ -+endif -+endif -diff --git a/options-config/config-postproc.pl b/options-config/config-postproc.pl -new file mode 100644 -index 0000000..4dd1c63 ---- /dev/null -+++ b/options-config/config-postproc.pl -@@ -0,0 +1,58 @@ -+#!/usr/bin/perl -+ -+$usage = "usage: $0 <default config file> <config file>\n"; -+ -+die "$usage" unless @ARGV; -+$defaults = shift @ARGV; -+die "$usage" unless @ARGV; -+die "Could not open $ARGV[0]" unless -T $ARGV[0]; -+ -+sub yank { -+ @option = grep(!($_ =~ /$_[0]\s*=/), @option); -+} -+ -+open(DEFAULTS, $defaults) || die "Could not open $defaults\n"; -+ -+# get the full list of available options using the default config file -+$i = 0; -+while (<DEFAULTS>) { -+ if (/^\s*OPTION_(\w+\s*=.*$)/) { -+ $option[$i++] = $1; -+ } -+} -+ -+# now go through the config file, making the necessary changes -+while (<>) { -+ if (/Linux Kernel Configuration/) { -+ # change title -+ s/Linux Kernel/Option Groups/; -+ print; -+ } elsif (/^\s*CONFIG_(\w+)\s*=/) { -+ # this is an explicit option set line, change CONFIG_ to OPTION_ -+ # before printing and remove this option from option list -+ $opt = $1; -+ yank($opt); -+ s/CONFIG_/OPTION_/g; -+ print; -+ } elsif (/^\s*#\s+CONFIG_(\w+) is not set/) { -+ # this is a comment line for an unset boolean option, change CONFIG_ -+ # to OPTION_, remove this option from option list, and convert to -+ # explicit OPTION_FOO=n -+ $opt = $1; -+ yank($opt); -+ s/CONFIG_/OPTION_/g; -+ print "OPTION_$opt=n\n"; -+ } else { -+ print; -+ } -+} -+ -+# any boolean options left in @options, are options that were not mentioned in -+# the config file, and implicitly that means the option must be set =n, -+# so do that here. -+foreach $opt (@option) { -+ if ($opt =~ /=\s*[yn]/) { -+ $opt =~ s/=\s*[yn]/=n/; -+ print "OPTION_$opt\n"; -+ } -+} -diff --git a/options-config/config-preproc.pl b/options-config/config-preproc.pl -new file mode 100644 -index 0000000..b83bb85 ---- /dev/null -+++ b/options-config/config-preproc.pl -@@ -0,0 +1,8 @@ -+#!/usr/bin/perl -+ -+if (@ARGV) { -+ while (<>) { -+ s/OPTION_/CONFIG_/g; -+ print; -+ } -+} -diff --git a/scripts/option-groups.awk b/scripts/option-groups.awk -new file mode 100644 -index 0000000..533af0c ---- /dev/null -+++ b/scripts/option-groups.awk -@@ -0,0 +1,63 @@ -+# option-groups.awk --- generate option group header file -+# Given input files containing makefile-style assignments to variables, -+# print out a header file that #defines an appropriate preprocessor -+# symbol for each variable left set to 'y'. -+ -+BEGIN { FS="=" } -+ -+# Trim spaces. -+{ gsub (/[[:blank:]]/, "") } -+ -+# Skip comments. -+/^#/ { next } -+ -+# Process assignments. -+NF == 2 { -+ vars[$1] = $2 -+} -+ -+# Print final values. -+END { -+ print "/* This file is automatically generated by scripts/option-groups.awk" -+ print " in the EGLIBC source tree." -+ print "" -+ print " It defines macros that indicate which EGLIBC option groups were" -+ print " configured in 'option-groups.config' when this C library was" -+ print " built. For each option group named OPTION_foo, it #defines" -+ print " __OPTION_foo to be 1 if the group is enabled, or #defines that" -+ print " symbol to be 0 if the group is disabled. */" -+ print "" -+ print "#ifndef __GNU_OPTION_GROUPS_H" -+ print "#define __GNU_OPTION_GROUPS_H" -+ print "" -+ -+ # Produce a sorted list of variable names. -+ i=0 -+ for (var in vars) -+ names[i++] = var -+ n = asort (names) -+ -+ for (i = 1; i <= n; i++) -+ { -+ var = names[i] -+ if (var ~ /^OPTION_/) -+ { -+ if (vars[var] == "y") -+ print "#define __" var " 1" -+ else if (vars[var] == "n") -+ print "#define __" var " 0" -+ else if (vars[var] ~ /^[0-9]+/ || -+ vars[var] ~ /^0x[0-9aAbBcCdDeEfF]+/ || -+ vars[var] ~ /^\"/) -+ print "#define __" var " " vars[var] -+ else -+ print "/* #undef __" var " */" -+ # Ignore variables that don't have boolean, int, hex, or -+ # string values. Ideally, this would be driven by the types -+ # given in option-groups.def. -+ } -+ } -+ -+ print "" -+ print "#endif /* __GNU_OPTION_GROUPS_H */" -+} --- -2.1.4 - diff --git a/yocto-poky/meta/recipes-core/glibc/glibc/0020-eglibc-Help-bootstrap-cross-toolchain.patch b/yocto-poky/meta/recipes-core/glibc/glibc/0019-eglibc-Help-bootstrap-cross-toolchain.patch index df9309454..c04e0a11d 100644 --- a/yocto-poky/meta/recipes-core/glibc/glibc/0020-eglibc-Help-bootstrap-cross-toolchain.patch +++ b/yocto-poky/meta/recipes-core/glibc/glibc/0019-eglibc-Help-bootstrap-cross-toolchain.patch @@ -1,7 +1,7 @@ -From 8fe0d29488b376011cdaaa462d557ffc0b31fb63 Mon Sep 17 00:00:00 2001 +From c2d49eab20db4ab02b6de62092fedc623d757146 Mon Sep 17 00:00:00 2001 From: Khem Raj <raj.khem@gmail.com> Date: Wed, 18 Mar 2015 00:49:28 +0000 -Subject: [PATCH 20/27] eglibc: Help bootstrap cross toolchain +Subject: [PATCH 19/24] eglibc: Help bootstrap cross toolchain Taken from EGLIBC, r1484 + r1525 @@ -29,7 +29,7 @@ Signed-off-by: Khem Raj <raj.khem@gmail.com> create mode 100644 include/stubs-bootstrap.h diff --git a/Makefile b/Makefile -index f906391..e4e149e 100644 +index 9a01c93..a6ae003 100644 --- a/Makefile +++ b/Makefile @@ -69,9 +69,18 @@ subdir-dirs = include @@ -96,5 +96,5 @@ index 0000000..1d2b669 + EGLIBC subdir 'stubs' make targets, on every .o file in EGLIBC, but + an empty stubs.h like this will do fine for GCC. */ -- -2.1.4 +2.6.4 diff --git a/yocto-poky/meta/recipes-core/glibc/glibc/0021-eglibc-cherry-picked-from-http-www.eglibc.org-archiv.patch b/yocto-poky/meta/recipes-core/glibc/glibc/0020-eglibc-cherry-picked-from.patch index 38bb8a15e..4362efae7 100644 --- a/yocto-poky/meta/recipes-core/glibc/glibc/0021-eglibc-cherry-picked-from-http-www.eglibc.org-archiv.patch +++ b/yocto-poky/meta/recipes-core/glibc/glibc/0020-eglibc-cherry-picked-from.patch @@ -1,30 +1,32 @@ -From fe2ae4f877928dd6bff5bac3f15bce4b50d2bd12 Mon Sep 17 00:00:00 2001 +From 588d936b9aa65e7cc8b1eb2cad1d209087db43a9 Mon Sep 17 00:00:00 2001 From: Khem Raj <raj.khem@gmail.com> -Date: Wed, 18 Mar 2015 00:51:16 +0000 -Subject: [PATCH 21/27] eglibc: cherry-picked from - http://www.eglibc.org/archives/patches/msg00772.html +Date: Thu, 31 Dec 2015 15:10:33 -0800 +Subject: [PATCH 20/24] eglibc: cherry-picked from -It hasn't yet been merged into glibc +http://www.eglibc.org/archives/patches/msg00772.html + +Not yet merged into glibc Upstream-Status: Pending Signed-off-by: Khem Raj <raj.khem@gmail.com> --- - resolv/res_libc.c | 15 +++++++++++++-- - 1 file changed, 13 insertions(+), 2 deletions(-) + resolv/res_libc.c | 14 +++++++++++++- + 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/resolv/res_libc.c b/resolv/res_libc.c -index ee3fa21..29e2340 100644 +index a8394e0..981ac7c 100644 --- a/resolv/res_libc.c +++ b/resolv/res_libc.c -@@ -22,12 +22,13 @@ +@@ -18,6 +18,7 @@ + #include <atomic.h> + #include <limits.h> + #include <sys/types.h> ++#include <sys/stat.h> + #include <netinet/in.h> #include <arpa/nameser.h> #include <resolv.h> - #include <bits/libc-lock.h> -- -+#include <sys/stat.h> - - /* The following bit is copied from res_data.c (where it is #ifdef'ed +@@ -28,6 +29,7 @@ out) since res_init() should go into libc.so but the rest of that file should not. */ @@ -32,7 +34,7 @@ index ee3fa21..29e2340 100644 extern unsigned long long int __res_initstamp attribute_hidden; /* We have atomic increment operations on 64-bit platforms. */ #if __WORDSIZE == 64 -@@ -35,7 +36,6 @@ extern unsigned long long int __res_initstamp attribute_hidden; +@@ -35,7 +37,6 @@ extern unsigned long long int __res_initstamp attribute_hidden; # define atomicincunlock(lock) (void) 0 # define atomicinc(var) catomic_increment (&(var)) #else @@ -40,7 +42,7 @@ index ee3fa21..29e2340 100644 # define atomicinclock(lock) __libc_lock_lock (lock) # define atomicincunlock(lock) __libc_lock_unlock (lock) # define atomicinc(var) ++var -@@ -94,7 +94,18 @@ res_init(void) { +@@ -94,7 +95,18 @@ res_init(void) { int __res_maybe_init (res_state resp, int preinit) { @@ -60,5 +62,5 @@ index ee3fa21..29e2340 100644 if (resp->nscount > 0) __res_iclose (resp, true); -- -2.1.4 +2.6.4 diff --git a/yocto-poky/meta/recipes-core/glibc/glibc/0022-eglibc-Clear-cache-lines-on-ppc8xx.patch b/yocto-poky/meta/recipes-core/glibc/glibc/0021-eglibc-Clear-cache-lines-on-ppc8xx.patch index 8a4c9c3e8..225f22f01 100644 --- a/yocto-poky/meta/recipes-core/glibc/glibc/0022-eglibc-Clear-cache-lines-on-ppc8xx.patch +++ b/yocto-poky/meta/recipes-core/glibc/glibc/0021-eglibc-Clear-cache-lines-on-ppc8xx.patch @@ -1,7 +1,7 @@ -From be7273225698074347a71de58006977bb304d7f7 Mon Sep 17 00:00:00 2001 +From b74e34e6f53816ad57b13ba6fd70a97db1bc1eae Mon Sep 17 00:00:00 2001 From: Khem Raj <raj.khem@gmail.com> -Date: Wed, 18 Mar 2015 00:53:47 +0000 -Subject: [PATCH 22/27] eglibc: Clear cache lines on ppc8xx +Date: Thu, 31 Dec 2015 15:15:09 -0800 +Subject: [PATCH 21/24] eglibc: Clear cache lines on ppc8xx 2007-06-13 Nathan Sidwell <nathan@codesourcery.com> Mark Shinwell <shinwell@codesourcery.com> @@ -13,11 +13,12 @@ Subject: [PATCH 22/27] eglibc: Clear cache lines on ppc8xx (DL_PLATFORM_AUXV): Likewise. Upstream-Status: Pending + Signed-off-by: Khem Raj <raj.khem@gmail.com> --- sysdeps/unix/sysv/linux/powerpc/dl-sysdep.c | 14 +++++++++++++- - sysdeps/unix/sysv/linux/powerpc/libc-start.c | 15 ++++++++++++++- - 2 files changed, 27 insertions(+), 2 deletions(-) + sysdeps/unix/sysv/linux/powerpc/libc-start.c | 16 +++++++++++++++- + 2 files changed, 28 insertions(+), 2 deletions(-) diff --git a/sysdeps/unix/sysv/linux/powerpc/dl-sysdep.c b/sysdeps/unix/sysv/linux/powerpc/dl-sysdep.c index c2504ff..d50f1cb 100644 @@ -47,15 +48,16 @@ index c2504ff..d50f1cb 100644 break; diff --git a/sysdeps/unix/sysv/linux/powerpc/libc-start.c b/sysdeps/unix/sysv/linux/powerpc/libc-start.c -index a9364c7..a3ed1d4 100644 +index 209a16d..5d8572d 100644 --- a/sysdeps/unix/sysv/linux/powerpc/libc-start.c +++ b/sysdeps/unix/sysv/linux/powerpc/libc-start.c -@@ -68,11 +68,24 @@ __libc_start_main (int argc, char **argv, - rtld_fini = NULL; - } +@@ -73,11 +73,25 @@ __libc_start_main (int argc, char **argv, -- /* Initialize the __cache_line_size variable from the aux vector. */ -+ /* Initialize the __cache_line_size variable from the aux vector. + /* Initialize the __cache_line_size variable from the aux vector. For the + static case, we also need _dl_hwcap, _dl_hwcap2 and _dl_platform, so we +- can call __tcb_parse_hwcap_and_convert_at_platform (). */ ++ can call __tcb_parse_hwcap_and_convert_at_platform (). ++ + This is used by memset to optimize setting to zero. We have to + detect 8xx processors, which have buggy dcbz implementations that + cannot report page faults correctly. That requires reading SPR, @@ -75,7 +77,7 @@ index a9364c7..a3ed1d4 100644 + } __cache_line_size = av->a_un.a_val; break; - } + #ifndef SHARED -- -2.1.4 +2.6.4 diff --git a/yocto-poky/meta/recipes-core/glibc/glibc/0023-eglibc-Resolve-__fpscr_values-on-SH4.patch b/yocto-poky/meta/recipes-core/glibc/glibc/0022-eglibc-Resolve-__fpscr_values-on-SH4.patch index 9f3d753d7..88b20f67a 100644 --- a/yocto-poky/meta/recipes-core/glibc/glibc/0023-eglibc-Resolve-__fpscr_values-on-SH4.patch +++ b/yocto-poky/meta/recipes-core/glibc/glibc/0022-eglibc-Resolve-__fpscr_values-on-SH4.patch @@ -1,7 +1,7 @@ -From 718e7e5db1c8b073adb9a79ec6f167238c2d8bda Mon Sep 17 00:00:00 2001 +From 8f483cb1f21ab6431ff99e8d30d56b91607ae918 Mon Sep 17 00:00:00 2001 From: Khem Raj <raj.khem@gmail.com> Date: Wed, 18 Mar 2015 00:55:53 +0000 -Subject: [PATCH 23/27] eglibc: Resolve __fpscr_values on SH4 +Subject: [PATCH 22/24] eglibc: Resolve __fpscr_values on SH4 2010-09-29 Nobuhiro Iwamatsu <iwamatsu@nigauri.org> Andrew Stubbs <ams@codesourcery.com> @@ -52,5 +52,5 @@ index a02b7e2..b9be326 100644 +weak_alias (___fpscr_values, __fpscr_values) + -- -2.1.4 +2.6.4 diff --git a/yocto-poky/meta/recipes-core/glibc/glibc/0025-eglibc-Install-PIC-archives.patch b/yocto-poky/meta/recipes-core/glibc/glibc/0023-eglibc-Install-PIC-archives.patch index c359cce9c..d95ea3ba3 100644 --- a/yocto-poky/meta/recipes-core/glibc/glibc/0025-eglibc-Install-PIC-archives.patch +++ b/yocto-poky/meta/recipes-core/glibc/glibc/0023-eglibc-Install-PIC-archives.patch @@ -1,7 +1,7 @@ -From 5773417fa91a18cd39fb35c9907d72af0ed9ea33 Mon Sep 17 00:00:00 2001 +From 58d424884eed7efde6c90af0cd7c6c37cf9b444a Mon Sep 17 00:00:00 2001 From: Khem Raj <raj.khem@gmail.com> Date: Wed, 18 Mar 2015 01:57:01 +0000 -Subject: [PATCH 25/27] eglibc: Install PIC archives +Subject: [PATCH 23/24] eglibc: Install PIC archives Forward port from eglibc @@ -29,10 +29,10 @@ Signed-off-by: Khem Raj <raj.khem@gmail.com> 1 file changed, 40 insertions(+), 2 deletions(-) diff --git a/Makerules b/Makerules -index 1dd41aa..41778e1 100644 +index fa24030..1ff4634 100644 --- a/Makerules +++ b/Makerules -@@ -713,6 +713,9 @@ ifeq ($(build-shared),yes) +@@ -694,6 +694,9 @@ ifeq ($(build-shared),yes) $(common-objpfx)libc.so: $(common-objpfx)libc.map endif common-generated += libc.so libc_pic.os @@ -42,7 +42,7 @@ index 1dd41aa..41778e1 100644 ifdef libc.so-version $(common-objpfx)libc.so$(libc.so-version): $(common-objpfx)libc.so $(make-link) -@@ -955,6 +958,7 @@ endif +@@ -936,6 +939,7 @@ endif install: check-install-supported @@ -50,7 +50,7 @@ index 1dd41aa..41778e1 100644 install: $(installed-libcs) $(installed-libcs): $(inst_libdir)/lib$(libprefix)%: lib $(+force) $(make-target-directory) -@@ -983,6 +987,22 @@ versioned := $(strip $(foreach so,$(install-lib.so),\ +@@ -964,6 +968,22 @@ versioned := $(strip $(foreach so,$(install-lib.so),\ install-lib.so-versioned := $(filter $(versioned), $(install-lib.so)) install-lib.so-unversioned := $(filter-out $(versioned), $(install-lib.so)) @@ -73,7 +73,7 @@ index 1dd41aa..41778e1 100644 # For versioned libraries, we install three files: # $(inst_libdir)/libfoo.so -- for linking, symlink or ld script # $(inst_slibdir)/libfoo.so.NN -- for loading by SONAME, symlink -@@ -1225,9 +1245,22 @@ $(addprefix $(inst_includedir)/,$(headers-nonh)): $(inst_includedir)/%: \ +@@ -1206,9 +1226,22 @@ $(addprefix $(inst_includedir)/,$(headers-nonh)): $(inst_includedir)/%: \ endif # headers-nonh endif # headers @@ -97,7 +97,7 @@ index 1dd41aa..41778e1 100644 install-bin-nosubdir: $(addprefix $(inst_bindir)/,$(install-bin)) install-bin-script-nosubdir: $(addprefix $(inst_bindir)/,$(install-bin-script)) install-rootsbin-nosubdir: \ -@@ -1240,6 +1273,10 @@ install-data-nosubdir: $(addprefix $(inst_datadir)/,$(install-data)) +@@ -1221,6 +1254,10 @@ install-data-nosubdir: $(addprefix $(inst_datadir)/,$(install-data)) install-headers-nosubdir: $(addprefix $(inst_includedir)/,$(headers)) install-others-nosubdir: $(install-others) install-others-programs-nosubdir: $(install-others-programs) @@ -108,7 +108,7 @@ index 1dd41aa..41778e1 100644 # We need all the `-nosubdir' targets so that `install' in the parent # doesn't depend on several things which each iterate over the subdirs. -@@ -1249,7 +1286,8 @@ install-%:: install-%-nosubdir ; +@@ -1230,7 +1267,8 @@ install-%:: install-%-nosubdir ; .PHONY: install install-no-libc.a-nosubdir install-no-libc.a-nosubdir: install-headers-nosubdir install-data-nosubdir \ @@ -119,5 +119,5 @@ index 1dd41aa..41778e1 100644 install-no-libc.a-nosubdir: install-bin-nosubdir install-bin-script-nosubdir \ install-rootsbin-nosubdir install-sbin-nosubdir \ -- -2.1.4 +2.6.4 diff --git a/yocto-poky/meta/recipes-core/glibc/glibc/0024-eglibc-Forward-port-eglibc-options-groups-support.patch b/yocto-poky/meta/recipes-core/glibc/glibc/0024-eglibc-Forward-port-eglibc-options-groups-support.patch deleted file mode 100644 index 0514e282e..000000000 --- a/yocto-poky/meta/recipes-core/glibc/glibc/0024-eglibc-Forward-port-eglibc-options-groups-support.patch +++ /dev/null @@ -1,16842 +0,0 @@ -From 2a5d7bcf0ff791c95ee1388772408a1bf4454694 Mon Sep 17 00:00:00 2001 -From: Khem Raj <raj.khem@gmail.com> -Date: Wed, 18 Mar 2015 01:33:49 +0000 -Subject: [PATCH 24/27] eglibc: Forward port eglibc options groups support - -Upstream-Status: Pending - -Signed-off-by: Khem Raj <raj.khem@gmail.com> ---- - Makeconfig | 20 +- - Makerules | 19 + - argp/Makefile | 2 + - argp/argp-fmtstream.c | 25 +- - argp/argp-help.c | 13 +- - argp/argp-namefrob.h | 2 + - catgets/Makefile | 17 +- - crypt/Makefile | 20 +- - crypt/crypt-entry.c | 13 + - crypt/crypt_common.c | 42 + - crypt/crypt_util.c | 18 - - csu/Makefile | 2 + - debug/Makefile | 41 +- - debug/segfault.c | 11 +- - debug/tst-chk1.c | 7 + - dlfcn/Makefile | 7 +- - elf/dl-support.c | 3 + - elf/rtld.c | 17 +- - extra-lib.mk | 6 +- - grp/Makefile | 5 + - hesiod/Makefile | 6 +- - iconv/Makefile | 7 + - iconv/gconv_db.c | 3 + - iconv/gconv_trans.c | 7 + - iconv/iconv_prog.c | 8 + - iconvdata/Makefile | 27 +- - include/netdb.h | 4 + - inet/Makefile | 22 +- - intl/Makefile | 3 +- - intl/dcigettext.c | 39 +- - io/Makefile | 18 +- - libidn/Makefile | 5 +- - libidn/toutf8.c | 11 +- - libio/Makefile | 66 +- - libio/__fpurge.c | 2 +- - libio/fileops.c | 10 +- - libio/iofwide.c | 26 + - libio/ioseekoff.c | 2 +- - libio/ioseekpos.c | 2 +- - libio/iosetbuffer.c | 4 + - libio/libioP.h | 18 +- - libio/wdummyfileops.c | 161 + - locale/C-ctype.c | 20 + - locale/Makefile | 41 +- - locale/catnames.c | 48 + - locale/dummy-setlocale.c | 33 + - locale/localeinfo.h | 2 +- - locale/programs/charmap-dir.c | 6 + - locale/programs/ld-collate.c | 17 +- - locale/programs/ld-ctype.c | 27 +- - locale/programs/ld-messages.c | 5 + - locale/programs/ld-time.c | 31 +- - locale/programs/linereader.c | 2 +- - locale/programs/localedef.c | 8 + - locale/programs/locfile.c | 5 +- - locale/programs/locfile.h | 59 +- - locale/setlocale.c | 30 - - locale/xlocale.c | 37 + - localedata/Makefile | 35 +- - login/Makefile | 17 +- - malloc/Makefile | 10 +- - malloc/memusage.c | 7 +- - malloc/memusage.sh | 2 +- - math/Makefile | 6 +- - misc/Makefile | 25 +- - misc/err.c | 11 + - misc/error.c | 5 + - misc/tst-efgcvt.c | 2 +- - nis/Makefile | 31 +- - nptl/Makefile | 28 +- - nptl/pthread_create.c | 5 + - nscd/Makefile | 33 +- - nscd/nis_hash.c | 3 + - nss/Makefile | 67 +- - nss/fixed-nsswitch.conf | 22 + - nss/fixed-nsswitch.functions | 121 + - nss/gen-fixed-nsswitch.c | 803 +++ - nss/getent.c | 46 +- - nss/getnssent_r.c | 9 +- - nss/nsswitch.c | 109 +- - nss/nsswitch.h | 18 +- - posix/Makefile | 94 +- - posix/bug-regex1.c | 3 + - posix/bug-regex6.c | 8 +- - posix/fnmatch.c | 6 +- - posix/fnmatch_loop.c | 23 +- - posix/glob.c | 15 +- - posix/regcomp.c | 98 +- - posix/regex.h | 11 + - posix/regex_internal.c | 45 +- - posix/regex_internal.h | 23 +- - posix/regexec-compat.c | 39 + - posix/regexec.c | 71 +- - posix/xregex.c | 8215 +++++++++++++++++++++++++++++++ - pwd/Makefile | 2 + - resolv/Makefile | 21 +- - stdio-common/Makefile | 35 +- - stdio-common/_i18n_number.h | 13 + - stdio-common/fxprintf.c | 5 + - stdio-common/printf_fp.c | 22 + - stdio-common/printf_fphex.c | 13 + - stdio-common/printf_size.c | 8 + - stdio-common/scanf14.c | 3 + - stdio-common/tst-popen.c | 3 + - stdio-common/tst-sprintf.c | 4 +- - stdio-common/tstdiomisc.c | 5 + - stdio-common/vfprintf.c | 31 +- - stdio-common/vfscanf.c | 53 +- - stdlib/Makefile | 34 +- - stdlib/strtod_l.c | 13 + - stdlib/tst-strtod.c | 5 + - streams/Makefile | 5 +- - string/Makefile | 14 +- - string/strcoll_l.c | 5 + - string/strerror_l.c | 5 + - string/strxfrm_l.c | 5 + - string/test-strcmp.c | 28 - - string/tst-strxfrm.c | 3 + - string/tst-strxfrm2.c | 3 + - sunrpc/Makefile | 44 +- - sysdeps/arm/Makefile | 5 +- - sysdeps/generic/ldsodefs.h | 8 + - sysdeps/gnu/Makefile | 3 +- - sysdeps/ieee754/ldbl-opt/Makefile | 27 +- - sysdeps/ieee754/ldbl-opt/nldbl-compat.c | 40 +- - sysdeps/ieee754/ldbl-opt/nldbl-compat.h | 24 +- - sysdeps/nptl/Makefile | 3 + - sysdeps/nptl/bits/libc-lock.h | 45 + - sysdeps/nptl/bits/libc-lockP.h | 50 +- - sysdeps/nptl/small-macros-fns.c | 72 + - sysdeps/unix/sysv/linux/gethostid.c | 6 + - sysdeps/unix/sysv/linux/libc_fatal.c | 3 + - time/Makefile | 18 +- - time/strftime_l.c | 12 +- - time/strptime_l.c | 14 +- - timezone/Makefile | 2 +- - wcsmbs/Makefile | 27 +- - wcsmbs/wcsmbsload.c | 13 + - wctype/Makefile | 14 +- - 139 files changed, 11363 insertions(+), 583 deletions(-) - create mode 100644 crypt/crypt_common.c - create mode 100644 libio/wdummyfileops.c - create mode 100644 locale/catnames.c - create mode 100644 locale/dummy-setlocale.c - create mode 100644 nscd/nis_hash.c - create mode 100644 nss/fixed-nsswitch.conf - create mode 100644 nss/fixed-nsswitch.functions - create mode 100644 nss/gen-fixed-nsswitch.c - create mode 100644 posix/regexec-compat.c - create mode 100644 posix/xregex.c - create mode 100644 sysdeps/nptl/small-macros-fns.c - -diff --git a/Makeconfig b/Makeconfig -index f136b88..52dae8f 100644 ---- a/Makeconfig -+++ b/Makeconfig -@@ -609,7 +609,7 @@ elf-objpfx = $(common-objpfx)elf/ - # and run on the build system, causes that program with those - # arguments to be run on the host for which the library is built. - ifndef test-wrapper --test-wrapper = -+test-wrapper = $(cross-test-wrapper) - endif - # Likewise, but the name of the program is preceded by - # <variable>=<value> assignments for environment variables. -@@ -1089,6 +1089,24 @@ libm = $(common-objpfx)math/libm.a - libmvec = $(common-objpfx)mathvec/libmvec.a - endif - -+# Generate a header file that #defines preprocessor symbols indicating -+# which option groups are enabled. Note that the option-groups.config file -+# may not exist at all. -+before-compile += $(common-objpfx)gnu/option-groups.h -+common-generated += gnu/option-groups.h gnu/option-groups.stmp -+headers += gnu/option-groups.h -+$(common-objpfx)gnu/option-groups.h: $(common-objpfx)gnu/option-groups.stmp; @: -+$(common-objpfx)gnu/option-groups.stmp: \ -+ $(..)scripts/option-groups.awk \ -+ $(..)option-groups.defaults \ -+ $(wildcard $(common-objpfx)option-groups.config) -+ $(make-target-directory) -+ @rm -f ${@:stmp=T} $@ -+ LC_ALL=C $(AWK) -f $^ > ${@:stmp=T} -+ $(move-if-change) ${@:stmp=T} ${@:stmp=h} -+ touch $@ -+ -+ - # These are the subdirectories containing the library source. The order - # is more or less arbitrary. The sorting step will take care of the - # dependencies. -diff --git a/Makerules b/Makerules -index f9ca3f5..1dd41aa 100644 ---- a/Makerules -+++ b/Makerules -@@ -456,6 +456,25 @@ define sed-remove-objpfx - endef - endif - -+# Include targets in the selected option groups. -+aux += $(aux-y) -+extra-libs += $(extra-libs-y) -+extra-libs-others += $(extra-libs-others-y) -+extra-objs += $(extra-objs-y) -+install-bin += $(install-bin-y) -+install-others += $(install-others-y) -+install-sbin += $(install-sbin-y) -+modules += $(modules-y) -+others += $(others-y) -+others-pie += $(others-pie-y) -+routines += $(routines-y) -+static-only-routines += $(static-only-routines-y) -+sysdep_routines += $(sysdep_routines-y) -+test-srcs += $(test-srcs-y) -+tests += $(tests-y) -+xtests += $(xtests-y) -+ -+ - # Modify the list of routines we build for different targets - - ifeq (yes,$(build-shared)) -diff --git a/argp/Makefile b/argp/Makefile -index 1a87629..f7c1e40 100644 ---- a/argp/Makefile -+++ b/argp/Makefile -@@ -18,6 +18,8 @@ - # - # Makefile for argp. - # -+include ../option-groups.mak -+ - subdir := argp - - include ../Makeconfig -diff --git a/argp/argp-fmtstream.c b/argp/argp-fmtstream.c -index 2b845e0..c344e7b 100644 ---- a/argp/argp-fmtstream.c -+++ b/argp/argp-fmtstream.c -@@ -42,6 +42,7 @@ - #ifdef _LIBC - # include <wchar.h> - # include <libio/libioP.h> -+# include <gnu/option-groups.h> - # define __vsnprintf(s, l, f, a) _IO_vsnprintf (s, l, f, a) - #endif - -@@ -100,7 +101,11 @@ __argp_fmtstream_free (argp_fmtstream_t fs) - __argp_fmtstream_update (fs); - if (fs->p > fs->buf) - { -+#ifdef _LIBC - __fxprintf (fs->stream, "%.*s", (int) (fs->p - fs->buf), fs->buf); -+#else -+ fwrite_unlocked (fs->buf, 1, fs->p - fs->buf, fs->stream); -+#endif - } - free (fs->buf); - free (fs); -@@ -145,9 +150,17 @@ __argp_fmtstream_update (argp_fmtstream_t fs) - size_t i; - for (i = 0; i < pad; i++) - { -+#ifdef _LIBC - if (_IO_fwide (fs->stream, 0) > 0) -- putwc_unlocked (L' ', fs->stream); -+ { -+#if ! _LIBC || __OPTION_POSIX_WIDE_CHAR_DEVICE_IO -+ putwc_unlocked (L' ', fs->stream); -+#else -+ abort (); -+#endif -+ } - else -+#endif - putc_unlocked (' ', fs->stream); - } - } -@@ -308,9 +321,17 @@ __argp_fmtstream_update (argp_fmtstream_t fs) - *nl++ = ' '; - else - for (i = 0; i < fs->wmargin; ++i) -+#ifdef _LIBC - if (_IO_fwide (fs->stream, 0) > 0) -- putwc_unlocked (L' ', fs->stream); -+ { -+#ifdef OPTION_POSIX_WIDE_CHAR_DEVICE_IO -+ putwc_unlocked (L' ', fs->stream); -+#else -+ abort (); -+#endif -+ } - else -+#endif - putc_unlocked (' ', fs->stream); - - /* Copy the tail of the original buffer into the current buffer -diff --git a/argp/argp-help.c b/argp/argp-help.c -index b055e45..6b3c4c1 100644 ---- a/argp/argp-help.c -+++ b/argp/argp-help.c -@@ -51,6 +51,7 @@ char *alloca (); - #ifdef _LIBC - # include <../libio/libioP.h> - # include <wchar.h> -+# include <gnu/option-groups.h> - #endif - - #ifndef _ -@@ -1702,7 +1703,7 @@ char *__argp_basename (char *name) - } - - char * --__argp_short_program_name (void) -+(__argp_short_program_name) (void) - { - # if HAVE_DECL_PROGRAM_INVOCATION_SHORT_NAME - return program_invocation_short_name; -@@ -1873,9 +1874,17 @@ __argp_failure (const struct argp_state *state, int status, int errnum, - #endif - } - -+#ifdef _LIBC - if (_IO_fwide (stream, 0) > 0) -- putwc_unlocked (L'\n', stream); -+ { -+#if ! _LIBC || __OPTION_POSIX_WIDE_CHAR_DEVICE_IO -+ putwc_unlocked (L'\n', stream); -+#else -+ abort (); -+#endif -+ } - else -+#endif - putc_unlocked ('\n', stream); - - #if _LIBC || (HAVE_FLOCKFILE && HAVE_FUNLOCKFILE) -diff --git a/argp/argp-namefrob.h b/argp/argp-namefrob.h -index f67c58f..e2002dc 100644 ---- a/argp/argp-namefrob.h -+++ b/argp/argp-namefrob.h -@@ -76,10 +76,12 @@ - #undef __argp_fmtstream_wmargin - #define __argp_fmtstream_wmargin argp_fmtstream_wmargin - -+#if 0 - #include "mempcpy.h" - #include "strcase.h" - #include "strchrnul.h" - #include "strndup.h" -+#endif - - /* normal libc functions we call */ - #undef __flockfile -diff --git a/catgets/Makefile b/catgets/Makefile -index 4624a88..05714fd 100644 ---- a/catgets/Makefile -+++ b/catgets/Makefile -@@ -22,20 +22,23 @@ subdir := catgets - - include ../Makeconfig - -+include ../option-groups.mak -+ - headers = nl_types.h --routines = catgets open_catalog --others = gencat --install-bin = gencat --extra-objs = $(gencat-modules:=.o) -+routines-$(OPTION_EGLIBC_CATGETS) := catgets open_catalog -+others-$(OPTION_EGLIBC_CATGETS) := gencat -+install-bin-$(OPTION_EGLIBC_CATGETS) := gencat -+extra-objs-$(OPTION_EGLIBC_CATGETS) := $(gencat-modules:=.o) - --tests = tst-catgets --test-srcs = test-gencat -+tests-$(OPTION_EGLIBC_CATGETS) := tst-catgets -+test-srcs-$(OPTION_EGLIBC_CATGETS) := test-gencat - -+ifeq (y,$(OPTION_EGLIBC_CATGETS)) - ifeq ($(run-built-tests),yes) - tests-special += $(objpfx)de/libc.cat $(objpfx)test1.cat $(objpfx)test2.cat \ - $(objpfx)sample.SJIS.cat $(objpfx)test-gencat.out - endif -- -+endif - gencat-modules = xmalloc - - # To find xmalloc.c -diff --git a/crypt/Makefile b/crypt/Makefile -index 34c4dd7..7c18c88 100644 ---- a/crypt/Makefile -+++ b/crypt/Makefile -@@ -18,21 +18,25 @@ - # - # Sub-makefile for crypt() portion of the library. - # -+include ../option-groups.mak -+ - subdir := crypt - - include ../Makeconfig - - headers := crypt.h - --extra-libs := libcrypt --extra-libs-others := $(extra-libs) -+extra-libs-$(OPTION_EGLIBC_CRYPT) := libcrypt -+extra-libs-others-y := $(extra-libs-y) - --libcrypt-routines := crypt-entry md5-crypt sha256-crypt sha512-crypt crypt \ -- crypt_util -+libcrypt-routines :=crypt-entry md5-crypt sha256-crypt sha512-crypt crypt_common -+libcrypt-routines-$(OPTION_EGLIBC_CRYPT_UFC) := crypt crypt_util -+libcrypt-routines += $(libcrypt-routines-y) - --tests := cert md5c-test sha256c-test sha512c-test badsalttest -+tests-$(OPTION_EGLIBC_CRYPT) := md5c-test sha256c-test sha512c-test badsalttest -+tests-$(OPTION_EGLIBC_CRYPT_UFC) += cert - --ifeq ($(crypt-in-libc),yes) -+ifeq ($(crypt-in-libc)$(OPTION_EGLIBC_CRYPT),yesy) - routines += $(libcrypt-routines) - endif - -@@ -44,7 +48,7 @@ LDLIBS-crypt.so = -lfreebl3 - else - libcrypt-routines += md5 sha256 sha512 - --tests += md5test sha256test sha512test -+tests-$(OPTION_EGLIBC_CRYPT) += md5test sha256test sha512test - - # The test md5test-giant uses up to 400 MB of RSS and runs on a fast - # machine over a minute. -@@ -64,8 +68,10 @@ $(objpfx)sha256test: $(patsubst %, $(objpfx)%.o,$(sha256-routines)) - $(objpfx)sha512test: $(patsubst %, $(objpfx)%.o,$(sha512-routines)) - endif - -+ifeq ($(OPTION_EGLIBC_CRYPT),y) - ifeq (yes,$(build-shared)) - $(addprefix $(objpfx),$(tests)): $(objpfx)libcrypt.so - else - $(addprefix $(objpfx),$(tests)): $(objpfx)libcrypt.a - endif -+endif # eglibc: OPTION_EGLIBC_CRYPT -diff --git a/crypt/crypt-entry.c b/crypt/crypt-entry.c -index 7e655ba..6ae5c2b 100644 ---- a/crypt/crypt-entry.c -+++ b/crypt/crypt-entry.c -@@ -27,6 +27,7 @@ - #include <stdio.h> - #endif - #include <string.h> -+#include <gnu/option-groups.h> - #include <errno.h> - #include <fips-private.h> - -@@ -76,9 +77,11 @@ __crypt_r (key, salt, data) - const char *salt; - struct crypt_data * __restrict data; - { -+#if __OPTION_EGLIBC_CRYPT_UFC - ufc_long res[4]; - char ktab[9]; - ufc_long xx = 25; /* to cope with GCC long long compiler bugs */ -+#endif /*__OPTION_EGLIBC_CRYPT_UFC*/ - - #ifdef _LIBC - /* Try to find out whether we have to use MD5 encryption replacement. */ -@@ -105,6 +108,7 @@ __crypt_r (key, salt, data) - sizeof (struct crypt_data)); - #endif - -+#if __OPTION_EGLIBC_CRYPT_UFC - /* - * Hack DES tables according to salt - */ -@@ -144,6 +148,10 @@ __crypt_r (key, salt, data) - */ - _ufc_output_conversion_r (res[0], res[1], salt, data); - return data->crypt_3_buf; -+#else /* __OPTION_EGLIBC_CRYPT_UFC */ -+ __set_errno (ENOSYS); -+ return NULL; -+#endif /* __OPTION_EGLIBC_CRYPT_UFC */ - } - weak_alias (__crypt_r, crypt_r) - -@@ -168,7 +176,12 @@ crypt (key, salt) - return __sha512_crypt (key, salt); - #endif - -+#if __OPTION_EGLIBC_CRYPT_UFC - return __crypt_r (key, salt, &_ufc_foobar); -+#else /* __OPTION_EGLIBC_CRYPT_UFC */ -+ __set_errno (ENOSYS); -+ return NULL; -+#endif /* __OPTION_EGLIBC_CRYPT_UFC */ - } - - -diff --git a/crypt/crypt_common.c b/crypt/crypt_common.c -new file mode 100644 -index 0000000..cce6a31 ---- /dev/null -+++ b/crypt/crypt_common.c -@@ -0,0 +1,42 @@ -+/* -+ * crypt: crypt(3) implementation -+ * -+ * Copyright (C) 1991-2014 Free Software Foundation, Inc. -+ * -+ * 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.1 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; see the file COPYING.LIB. If not, -+ * see <http://www.gnu.org/licenses/>. -+ * -+ * General Support routines -+ * -+ */ -+ -+#include "crypt-private.h" -+ -+/* Table with characters for base64 transformation. */ -+static const char b64t[64] = -+"./0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"; -+ -+void -+__b64_from_24bit (char **cp, int *buflen, -+ unsigned int b2, unsigned int b1, unsigned int b0, -+ int n) -+{ -+ unsigned int w = (b2 << 16) | (b1 << 8) | b0; -+ while (n-- > 0 && (*buflen) > 0) -+ { -+ *(*cp)++ = b64t[w & 0x3f]; -+ --(*buflen); -+ w >>= 6; -+ } -+} -diff --git a/crypt/crypt_util.c b/crypt/crypt_util.c -index 1597885..9297974 100644 ---- a/crypt/crypt_util.c -+++ b/crypt/crypt_util.c -@@ -242,10 +242,6 @@ static ufc_long eperm32tab[4][256][2]; - */ - static ufc_long efp[16][64][2]; - --/* Table with characters for base64 transformation. */ --static const char b64t[64] = --"./0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"; -- - /* - * For use by the old, non-reentrant routines - * (crypt/encrypt/setkey) -@@ -949,17 +945,3 @@ setkey(__key) - { - __setkey_r(__key, &_ufc_foobar); - } -- --void --__b64_from_24bit (char **cp, int *buflen, -- unsigned int b2, unsigned int b1, unsigned int b0, -- int n) --{ -- unsigned int w = (b2 << 16) | (b1 << 8) | b0; -- while (n-- > 0 && (*buflen) > 0) -- { -- *(*cp)++ = b64t[w & 0x3f]; -- --(*buflen); -- w >>= 6; -- } --} -diff --git a/csu/Makefile b/csu/Makefile -index 9f0855a..b1c3363 100644 ---- a/csu/Makefile -+++ b/csu/Makefile -@@ -22,6 +22,8 @@ - # crtn.o, special "initializer" and "finalizer" files used in the link - # to make the .init and .fini sections work right. - -+include ../option-groups.mak -+ - subdir := csu - - include ../Makeconfig -diff --git a/debug/Makefile b/debug/Makefile -index 9ff357b..d23d97d 100644 ---- a/debug/Makefile -+++ b/debug/Makefile -@@ -18,6 +18,8 @@ - # - # Sub-makefile for debug portion of the library. - # -+include ../option-groups.mak -+ - subdir := debug - - include ../Makeconfig -@@ -27,7 +29,7 @@ headers := execinfo.h - # Note that ptsname_r_chk and getlogin_r are not here, but in - # login/Makefile instead. If that subdir is omitted from the - # build, its _FORTIFY_SOURCE support will be too. --routines = backtrace backtracesyms backtracesymsfd noophooks \ -+routines = noophooks \ - memcpy_chk memmove_chk mempcpy_chk memset_chk stpcpy_chk \ - strcat_chk strcpy_chk strncat_chk strncpy_chk stpncpy_chk \ - sprintf_chk vsprintf_chk snprintf_chk vsnprintf_chk \ -@@ -36,20 +38,27 @@ routines = backtrace backtracesyms backtracesymsfd noophooks \ - read_chk pread_chk pread64_chk recv_chk recvfrom_chk \ - readlink_chk readlinkat_chk getwd_chk getcwd_chk \ - realpath_chk fread_chk fread_u_chk \ -- wctomb_chk wcscpy_chk wmemcpy_chk wmemmove_chk wmempcpy_chk \ -- wcpcpy_chk wcsncpy_chk wcscat_chk wcsncat_chk wmemset_chk \ -- wcpncpy_chk \ -- swprintf_chk vswprintf_chk wprintf_chk fwprintf_chk \ -- vwprintf_chk vfwprintf_chk fgetws_chk fgetws_u_chk \ - confstr_chk getgroups_chk ttyname_r_chk \ -- gethostname_chk getdomainname_chk wcrtomb_chk mbsnrtowcs_chk \ -- wcsnrtombs_chk mbsrtowcs_chk wcsrtombs_chk mbstowcs_chk \ -- wcstombs_chk asprintf_chk vasprintf_chk dprintf_chk \ -+ gethostname_chk getdomainname_chk \ -+ asprintf_chk vasprintf_chk dprintf_chk \ - vdprintf_chk obprintf_chk \ - longjmp_chk ____longjmp_chk \ - fdelt_chk poll_chk ppoll_chk \ - stack_chk_fail fortify_fail \ - $(static-only-routines) -+routines-$(OPTION_EGLIBC_BACKTRACE) += backtrace backtracesyms backtracesymsfd -+routines-$(OPTION_POSIX_WIDE_CHAR_DEVICE_IO) \ -+ += wprintf_chk fwprintf_chk \ -+ vwprintf_chk vfwprintf_chk fgetws_chk fgetws_u_chk -+routines-$(OPTION_POSIX_C_LANG_WIDE_CHAR) \ -+ += wctomb_chk wcscpy_chk wmemcpy_chk wmemmove_chk wmempcpy_chk \ -+ wcpcpy_chk wcsncpy_chk wcscat_chk wcsncat_chk wmemset_chk \ -+ wcpncpy_chk \ -+ swprintf_chk vswprintf_chk \ -+ wcrtomb_chk mbsnrtowcs_chk \ -+ wcsnrtombs_chk mbsrtowcs_chk wcsrtombs_chk mbstowcs_chk \ -+ wcstombs_chk -+ - static-only-routines := warning-nop stack_chk_fail_local - - CFLAGS-backtrace.c = -fno-omit-frame-pointer -@@ -131,11 +140,15 @@ LDFLAGS-tst-backtrace4 = -rdynamic - LDFLAGS-tst-backtrace5 = -rdynamic - LDFLAGS-tst-backtrace6 = -rdynamic - --tests = backtrace-tst tst-longjmp_chk tst-chk1 tst-chk2 tst-chk3 \ -- tst-lfschk1 tst-lfschk2 tst-lfschk3 test-strcpy_chk test-stpcpy_chk \ -- tst-chk4 tst-chk5 tst-chk6 tst-lfschk4 tst-lfschk5 tst-lfschk6 \ -- tst-longjmp_chk2 tst-backtrace2 tst-backtrace3 tst-backtrace4 \ -- tst-backtrace5 tst-backtrace6 -+tests = tst-longjmp_chk test-strcpy_chk test-stpcpy_chk tst-longjmp_chk2 -+tests-$(OPTION_EGLIBC_LOCALE_CODE) \ -+ += tst-chk1 tst-chk2 tst-chk3 tst-lfschk1 tst-lfschk2 tst-lfschk3 -+tests-$(OPTION_EGLIBC_BACKTRACE) \ -+ += backtrace-tst tst-backtrace2 tst-backtrace3 tst-backtrace4 \ -+ tst-backtrace5 tst-backtrace6 -+ifeq (yy,$(OPTION_EGLIBC_LOCALE_CODE)$(OPTION_EGLIBC_CXX_TESTS)) -+tests += tst-chk4 tst-chk5 tst-chk6 tst-lfschk4 tst-lfschk5 tst-lfschk6 -+endif - - ifeq (,$(CXX)) - tests-unsupported = tst-chk4 tst-chk5 tst-chk6 \ -diff --git a/debug/segfault.c b/debug/segfault.c -index 3459a2a..ee9a146 100644 ---- a/debug/segfault.c -+++ b/debug/segfault.c -@@ -30,6 +30,7 @@ - #include <unistd.h> - #include <_itoa.h> - #include <ldsodefs.h> -+#include <gnu/option-groups.h> - - /* This file defines macros to access the content of the sigcontext element - passed up by the signal handler. */ -@@ -68,11 +69,13 @@ write_strsignal (int fd, int signal) - static void - catch_segfault (int signal, SIGCONTEXT ctx) - { -- int fd, cnt, i; -- void **arr; -+ int fd; - struct sigaction sa; -+#if __OPTION_EGLIBC_BACKTRACE -+ int cnt, i; -+ void **arr; - uintptr_t pc; -- -+#endif - /* This is the name of the file we are writing to. If none is given - or we cannot write to this file write to stderr. */ - fd = 2; -@@ -91,6 +94,7 @@ catch_segfault (int signal, SIGCONTEXT ctx) - REGISTER_DUMP; - #endif - -+#if __OPTION_EGLIBC_BACKTRACE - WRITE_STRING ("\nBacktrace:\n"); - - /* Get the backtrace. */ -@@ -113,6 +117,7 @@ catch_segfault (int signal, SIGCONTEXT ctx) - - /* Now generate nicely formatted output. */ - __backtrace_symbols_fd (arr + i, cnt - i, fd); -+#endif - - #ifdef HAVE_PROC_SELF - /* Now the link map. */ -diff --git a/debug/tst-chk1.c b/debug/tst-chk1.c -index 53559e6..362d92a 100644 ---- a/debug/tst-chk1.c -+++ b/debug/tst-chk1.c -@@ -31,6 +31,7 @@ - #include <sys/select.h> - #include <sys/socket.h> - #include <sys/un.h> -+#include <gnu/option-groups.h> - - - #define obstack_chunk_alloc malloc -@@ -307,6 +308,7 @@ do_test (void) - snprintf (buf + 8, l0 + 3, "%d", num2); - CHK_FAIL_END - -+#if __OPTION_POSIX_C_LANG_WIDE_CHAR - CHK_FAIL_START - swprintf (wbuf + 8, 3, L"%d", num1); - CHK_FAIL_END -@@ -314,6 +316,7 @@ do_test (void) - CHK_FAIL_START - swprintf (wbuf + 8, l0 + 3, L"%d", num1); - CHK_FAIL_END -+#endif /* __OPTION_POSIX_C_LANG_WIDE_CHAR */ - # endif - - memcpy (buf, str1 + 2, l0 + 9); -@@ -381,6 +384,7 @@ do_test (void) - CHK_FAIL_END - #endif - -+#if __OPTION_POSIX_C_LANG_WIDE_CHAR - - /* These ops can be done without runtime checking of object size. */ - wmemcpy (wbuf, L"abcdefghij", 10); -@@ -605,6 +609,7 @@ do_test (void) - CHK_FAIL_END - #endif - -+#endif /* __OPTION_POSIX_C_LANG_WIDE_CHAR */ - - /* Now checks for %n protection. */ - -@@ -1192,6 +1197,7 @@ do_test (void) - # endif - #endif - -+#if __OPTION_POSIX_C_LANG_WIDE_CHAR - if (setlocale (LC_ALL, "de_DE.UTF-8") != NULL) - { - assert (MB_CUR_MAX <= 10); -@@ -1348,6 +1354,7 @@ do_test (void) - puts ("cannot set locale"); - ret = 1; - } -+#endif /* __OPTION_POSIX_C_LANG_WIDE_CHAR */ - - int fd = posix_openpt (O_RDWR); - if (fd != -1) -diff --git a/dlfcn/Makefile b/dlfcn/Makefile -index 759780d..3827607 100644 ---- a/dlfcn/Makefile -+++ b/dlfcn/Makefile -@@ -15,6 +15,8 @@ - # License along with the GNU C Library; if not, see - # <http://www.gnu.org/licenses/>. - -+include ../option-groups.mak -+ - subdir := dlfcn - - include ../Makeconfig -@@ -36,8 +38,11 @@ endif - ifeq (yes,$(build-shared)) - tests = glrefmain failtest tst-dladdr default errmsg1 tstcxaatexit \ - bug-dlopen1 bug-dlsym1 tst-dlinfo bug-atexit1 bug-atexit2 \ -- bug-atexit3 tstatexit bug-dl-leaf tst-rec-dlopen -+ tstatexit bug-dl-leaf tst-rec-dlopen - endif -+ -+tests-$(OPTION_EGLIBC_CXX_TESTS) += bug-atexit3 -+ - modules-names = glreflib1 glreflib2 glreflib3 failtestmod defaultmod1 \ - defaultmod2 errmsg1mod modatexit modcxaatexit \ - bug-dlsym1-lib1 bug-dlsym1-lib2 bug-atexit1-lib \ -diff --git a/elf/dl-support.c b/elf/dl-support.c -index 4d036f1..c15f405 100644 ---- a/elf/dl-support.c -+++ b/elf/dl-support.c -@@ -19,6 +19,7 @@ - /* This file defines some things that for the dynamic linker are defined in - rtld.c and dl-sysdep.c in ways appropriate to bootstrap dynamic linking. */ - -+#include <gnu/option-groups.h> - #include <errno.h> - #include <libintl.h> - #include <stdlib.h> -@@ -42,7 +43,9 @@ char **_dl_argv = &__progname; /* This is checked for some error messages. */ - const char *_dl_platform; - size_t _dl_platformlen; - -+#if __OPTION_EGLIBC_RTLD_DEBUG - int _dl_debug_mask; -+#endif - int _dl_lazy; - ElfW(Addr) _dl_use_load_bias = -2; - int _dl_dynamic_weak; -diff --git a/elf/rtld.c b/elf/rtld.c -index 6d3add7..fc3a2db 100644 ---- a/elf/rtld.c -+++ b/elf/rtld.c -@@ -16,6 +16,7 @@ - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -+#include <gnu/option-groups.h> - #include <errno.h> - #include <dlfcn.h> - #include <fcntl.h> -@@ -2201,6 +2202,7 @@ print_missing_version (int errcode __attribute__ ((unused)), - objname, errstring); - } - -+#if __OPTION_EGLIBC_RTLD_DEBUG - /* Nonzero if any of the debugging options is enabled. */ - static int any_debug attribute_relro; - -@@ -2310,6 +2312,7 @@ a filename can be specified using the LD_DEBUG_OUTPUT environment variable.\n"); - _exit (0); - } - } -+#endif /* __OPTION_EGLIBC_RTLD_DEBUG */ - - static void - process_dl_audit (char *str) -@@ -2349,8 +2352,9 @@ process_envvars (enum mode *modep) - char **runp = _environ; - char *envline; - enum mode mode = normal; -+#if __OPTION_EGLIBC_RTLD_DEBUG - char *debug_output = NULL; -- -+#endif - /* This is the default place for profiling data file. */ - GLRO(dl_profile_output) - = &"/var/tmp\0/var/profile"[__libc_enable_secure ? 9 : 0]; -@@ -2377,12 +2381,14 @@ process_envvars (enum mode *modep) - break; - - case 5: -+#if __OPTION_EGLIBC_RTLD_DEBUG - /* Debugging of the dynamic linker? */ - if (memcmp (envline, "DEBUG", 5) == 0) - { - process_dl_debug (&envline[6]); - break; - } -+#endif - if (memcmp (envline, "AUDIT", 5) == 0) - process_dl_audit (&envline[6]); - break; -@@ -2448,13 +2454,14 @@ process_envvars (enum mode *modep) - break; - } - -+#if __OPTION_EGLIBC_RTLD_DEBUG - /* Where to place the profiling data file. */ - if (memcmp (envline, "DEBUG_OUTPUT", 12) == 0) - { - debug_output = &envline[13]; - break; - } -- -+#endif - if (!__libc_enable_secure - && memcmp (envline, "DYNAMIC_WEAK", 12) == 0) - GLRO(dl_dynamic_weak) = 1; -@@ -2491,7 +2498,9 @@ process_envvars (enum mode *modep) - { - mode = trace; - GLRO(dl_verbose) = 1; -+#if __OPTION_EGLIBC_RTLD_DEBUG - GLRO(dl_debug_mask) |= DL_DEBUG_PRELINK; -+#endif - GLRO(dl_trace_prelink) = &envline[17]; - } - break; -@@ -2538,12 +2547,15 @@ process_envvars (enum mode *modep) - if (__access ("/etc/suid-debug", F_OK) != 0) - { - unsetenv ("MALLOC_CHECK_"); -+#if __OPTION_EGLIBC_RTLD_DEBUG - GLRO(dl_debug_mask) = 0; -+#endif - } - - if (mode != normal) - _exit (5); - } -+#if __OPTION_EGLIBC_RTLD_DEBUG - /* If we have to run the dynamic linker in debugging mode and the - LD_DEBUG_OUTPUT environment variable is given, we write the debug - messages to this file. */ -@@ -2568,6 +2580,7 @@ process_envvars (enum mode *modep) - /* We use standard output if opening the file failed. */ - GLRO(dl_debug_fd) = STDOUT_FILENO; - } -+#endif /* __OPTION_EGLIBC_RTLD_DEBUG */ - } - - -diff --git a/extra-lib.mk b/extra-lib.mk -index b10748d..d71a06f 100644 ---- a/extra-lib.mk -+++ b/extra-lib.mk -@@ -25,7 +25,9 @@ install-lib := $(install-lib) - extra-objs := $(extra-objs) - - # The modules that go in $(lib). --all-$(lib)-routines := $($(lib)-routines) $($(lib)-sysdep_routines) -+all-$(lib)-routines := $($(lib)-routines) \ -+ $($(lib)-routines-y) \ -+ $($(lib)-sysdep_routines) - - # Add each flavor of library to the lists of things to build and install. - install-lib += $(foreach o,$(object-suffixes-$(lib)),$(lib:lib%=$(libtype$o))) -@@ -101,7 +103,7 @@ endif - endif - - # This will define `libof-ROUTINE := LIB' for each of the routines. --cpp-srcs-left := $($(lib)-routines) $($(lib)-sysdep_routines) -+cpp-srcs-left := $(all-$(lib)-routines) - ifneq (,$(cpp-srcs-left)) - include $(patsubst %,$(..)cppflags-iterator.mk,$(cpp-srcs-left)) - endif -diff --git a/grp/Makefile b/grp/Makefile -index c63b552..7486f32 100644 ---- a/grp/Makefile -+++ b/grp/Makefile -@@ -18,6 +18,8 @@ - # - # Sub-makefile for grp portion of the library. - # -+include ../option-groups.mak -+ - subdir := grp - - include ../Makeconfig -@@ -29,6 +31,9 @@ routines := fgetgrent initgroups setgroups \ - getgrent_r getgrgid_r getgrnam_r fgetgrent_r - - tests := testgrp -+ifneq (y,$(OPTION_EGLIBC_NSSWITCH)) -+LDLIBS-testgrp += $(shell cat $(common-objpfx)nss/fixed-nsswitch-libs) -+endif - - ifeq (yes,$(build-shared)) - test-srcs := tst_fgetgrent -diff --git a/hesiod/Makefile b/hesiod/Makefile -index ac0bc01..38263b4 100644 ---- a/hesiod/Makefile -+++ b/hesiod/Makefile -@@ -18,12 +18,14 @@ - # - # Sub-makefile for hesiod portion of the library. - # -+include ../option-groups.mak -+ - subdir := hesiod - - include ../Makeconfig - --extra-libs := libnss_hesiod --extra-libs-others = $(extra-libs) -+extra-libs-$(OPTION_EGLIBC_INET) += libnss_hesiod -+extra-libs-others-y += $(extra-libs-y) - - subdir-dirs = nss_hesiod - vpath %.c nss_hesiod -diff --git a/iconv/Makefile b/iconv/Makefile -index 0d55eda..a1847c6 100644 ---- a/iconv/Makefile -+++ b/iconv/Makefile -@@ -18,6 +18,8 @@ - # - # Makefile for iconv. - # -+include ../option-groups.mak -+ - subdir := iconv - - include ../Makeconfig -@@ -39,6 +41,11 @@ CFLAGS-iconv_charmap.c = -I../locale/programs - CFLAGS-dummy-repertoire.c = -I../locale/programs - CFLAGS-charmap.c = -DCHARMAP_PATH='"$(i18ndir)/charmaps"' \ - -DDEFAULT_CHARMAP=null_pointer -DNEED_NULL_POINTER -+ -+ifneq (y,$(OPTION_EGLIBC_SPAWN)) -+CFLAGS-charmap-dir.c += -DNO_UNCOMPRESS -+endif -+ - CFLAGS-linereader.c = -DNO_TRANSLITERATION - CFLAGS-simple-hash.c = -I../locale - -diff --git a/iconv/gconv_db.c b/iconv/gconv_db.c -index ce46216..ea18964 100644 ---- a/iconv/gconv_db.c -+++ b/iconv/gconv_db.c -@@ -25,6 +25,7 @@ - #include <sys/param.h> - #include <bits/libc-lock.h> - #include <locale/localeinfo.h> -+#include <gnu/option-groups.h> - - #include <dlfcn.h> - #include <gconv_int.h> -@@ -828,9 +829,11 @@ free_modules_db (struct gconv_module *node) - /* Free all resources if necessary. */ - libc_freeres_fn (free_mem) - { -+#if __OPTION_EGLIBC_LOCALE_CODE - /* First free locale memory. This needs to be done before freeing derivations, - as ctype cleanup functions dereference steps arrays which we free below. */ - _nl_locale_subfreeres (); -+#endif - - /* finddomain.c has similar problem. */ - extern void _nl_finddomain_subfreeres (void) attribute_hidden; -diff --git a/iconv/gconv_trans.c b/iconv/gconv_trans.c -index 5d5d4d7..a7d3072 100644 ---- a/iconv/gconv_trans.c -+++ b/iconv/gconv_trans.c -@@ -23,6 +23,7 @@ - #include <stdint.h> - #include <string.h> - #include <stdlib.h> -+#include <gnu/option-groups.h> - - #include <bits/libc-lock.h> - #include "gconv_int.h" -@@ -38,15 +39,19 @@ __gconv_transliterate (struct __gconv_step *step, - unsigned char **outbufstart, size_t *irreversible) - { - /* Find out about the locale's transliteration. */ -+#if __OPTION_EGLIBC_LOCALE_CODE - uint_fast32_t size; - const uint32_t *from_idx; - const uint32_t *from_tbl; - const uint32_t *to_idx; - const uint32_t *to_tbl; -+#endif - const uint32_t *winbuf; - const uint32_t *winbufend; -+#if __OPTION_EGLIBC_LOCALE_CODE - uint_fast32_t low; - uint_fast32_t high; -+#endif - - /* The input buffer. There are actually 4-byte values. */ - winbuf = (const uint32_t *) *inbufp; -@@ -58,6 +63,7 @@ __gconv_transliterate (struct __gconv_step *step, - PTR_DEMANGLE (fct); - #endif - -+#if __OPTION_EGLIBC_LOCALE_CODE - /* If there is no transliteration information in the locale don't do - anything and return the error. */ - size = _NL_CURRENT_WORD (LC_CTYPE, _NL_CTYPE_TRANSLIT_TAB_SIZE); -@@ -193,6 +199,7 @@ __gconv_transliterate (struct __gconv_step *step, - sorted. */ - break; - } -+#endif - - /* One last chance: use the default replacement. */ - if (_NL_CURRENT_WORD (LC_CTYPE, _NL_CTYPE_TRANSLIT_DEFAULT_MISSING_LEN) != 0) -diff --git a/iconv/iconv_prog.c b/iconv/iconv_prog.c -index e249bce..403ece5 100644 ---- a/iconv/iconv_prog.c -+++ b/iconv/iconv_prog.c -@@ -35,6 +35,7 @@ - #ifdef _POSIX_MAPPED_FILES - # include <sys/mman.h> - #endif -+#include <gnu/option-groups.h> - #include <charmap.h> - #include <gconv_int.h> - #include "iconv_prog.h" -@@ -221,10 +222,17 @@ main (int argc, char *argv[]) - bool to_wrong = - (iconv_open (to_code, "UTF-8") == (iconv_t) -1 - && errno == EINVAL); -+#if __OPTION_EGLIBC_LOCALE_CODE - const char *from_pretty = - (from_code[0] ? from_code : nl_langinfo (CODESET)); - const char *to_pretty = - (orig_to_code[0] ? orig_to_code : nl_langinfo (CODESET)); -+#else -+ const char *from_pretty = -+ (from_code[0] ? from_code : "ANSI_X3.4-1968"); -+ const char *to_pretty = -+ (orig_to_code[0] ? orig_to_code : "ANSI_X3.4-1968"); -+#endif - - if (from_wrong) - { -diff --git a/iconvdata/Makefile b/iconvdata/Makefile -index a3d1d09..0832708 100644 ---- a/iconvdata/Makefile -+++ b/iconvdata/Makefile -@@ -18,12 +18,15 @@ - # - # Makefile for iconv data and code. - # -+include ../option-groups.mak -+ - subdir := iconvdata - - include ../Makeconfig - - # Names of all the shared objects which implement the transformations. --modules := ISO8859-1 ISO8859-2 ISO8859-3 ISO8859-4 ISO8859-5 \ -+modules-$(OPTION_EGLIBC_CHARSETS) \ -+ := ISO8859-1 ISO8859-2 ISO8859-3 ISO8859-4 ISO8859-5 \ - ISO8859-6 ISO8859-7 ISO8859-8 ISO8859-9 ISO8859-10 \ - ISO8859-11 ISO8859-13 ISO8859-14 ISO8859-15 ISO8859-16 \ - T.61 ISO_6937 SJIS KOI-8 HP-ROMAN8 HP-ROMAN9 EBCDIC-AT-DE \ -@@ -63,11 +66,13 @@ modules := ISO8859-1 ISO8859-2 ISO8859-3 ISO8859-4 ISO8859-5 \ - MAC-CENTRALEUROPE KOI8-RU ISO8859-9E \ - CP770 CP771 CP772 CP773 CP774 - --modules.so := $(addsuffix .so, $(modules)) -+modules.so := $(addsuffix .so, $(modules-y)) - - ifeq (yes,$(build-shared)) - tests = bug-iconv1 bug-iconv2 tst-loading tst-e2big tst-iconv4 bug-iconv4 \ -- tst-iconv6 bug-iconv5 bug-iconv6 tst-iconv7 bug-iconv8 bug-iconv9 -+ tst-iconv6 bug-iconv5 bug-iconv8 bug-iconv9 -+tests-$(OPTION_EGLIBC_LOCALE_CODE) += bug-iconv6 tst-iconv7 -+ - ifeq ($(have-thread-library),yes) - tests += bug-iconv3 - endif -@@ -127,13 +132,13 @@ ifeq (yes,$(build-shared)) - # Rule to generate the shared objects. - charmaps = ../localedata/charmaps - -include $(objpfx)iconv-rules --extra-modules-left := $(modules) -+extra-modules-left := $(modules-y) - include extra-module.mk - - - extra-objs += $(modules.so) --install-others = $(addprefix $(inst_gconvdir)/, $(modules.so)) \ -- $(inst_gconvdir)/gconv-modules -+install-others-y += $(addprefix $(inst_gconvdir)/, $(modules.so)) -+install-others-$(OPTION_EGLIBC_CHARSETS) += $(inst_gconvdir)/gconv-modules - - # We can build the conversion tables for numerous charsets automatically. - -@@ -201,7 +206,7 @@ before-compile += $(addprefix $(objpfx),$(generated-modules:=.h)) - ifndef avoid-generated - $(objpfx)iconv-rules: Makefile - $(make-target-directory) -- { echo $(filter-out lib%, $(modules)); \ -+ { echo $(filter-out lib%, $(modules-y)); \ - echo 8bit $(gen-8bit-modules); \ - echo 8bit-gap $(gen-8bit-gap-modules); } | \ - LC_ALL=C \ -@@ -245,7 +250,7 @@ $(addprefix $(inst_gconvdir)/, $(modules.so)): \ - $(do-install-program) - $(inst_gconvdir)/gconv-modules: gconv-modules $(+force) - $(do-install) --ifeq (no,$(cross-compiling)) -+# eglibc: ifeq (no,$(cross-compiling)) - # Update the $(prefix)/lib/gconv/gconv-modules.cache file. This is necessary - # if this libc has more gconv modules than the previously installed one. - if test -f "$(inst_gconvdir)/gconv-modules.cache"; then \ -@@ -254,9 +259,9 @@ ifeq (no,$(cross-compiling)) - $(common-objpfx)iconv/iconvconfig \ - $(addprefix --prefix=,$(install_root)); \ - fi --else -- @echo '*@*@*@ You should recreate $(inst_gconvdir)/gconv-modules.cache' --endif -+# eglibc: else -+# eglibc: @echo '*@*@*@ You should recreate $(inst_gconvdir)/gconv-modules.cache' -+# eglibc: endif - - endif # build-shared = yes - -diff --git a/include/netdb.h b/include/netdb.h -index e1f051d..f6d15aa 100644 ---- a/include/netdb.h -+++ b/include/netdb.h -@@ -232,6 +232,10 @@ extern enum nss_status _nss_ ## service ## _gethostbyname2_r \ - (const char *name, int af, struct hostent *host, \ - char *buffer, size_t buflen, int *errnop, \ - int *h_errnop); \ -+extern enum nss_status _nss_ ## service ## _gethostbyname3_r \ -+ (const char *name, int af, struct hostent *result, \ -+ char *buffer, size_t buflen, int *errnop, \ -+ int *h_errnop, int32_t *ttlp, char **canonp); \ - extern enum nss_status _nss_ ## service ## _gethostbyname_r \ - (const char *name, struct hostent *host, char *buffer, \ - size_t buflen, int *errnop, int *h_errnop); \ -diff --git a/inet/Makefile b/inet/Makefile -index f1d871f..7cb1709 100644 ---- a/inet/Makefile -+++ b/inet/Makefile -@@ -18,6 +18,8 @@ - # - # Sub-makefile for inet portion of the library. - # -+include ../option-groups.mak -+ - subdir := inet - - include ../Makeconfig -@@ -27,7 +29,8 @@ headers := netinet/ether.h netinet/in.h netinet/in_systm.h \ - netinet/tcp.h netinet/ip.h $(wildcard arpa/*.h protocols/*.h) \ - aliases.h ifaddrs.h netinet/ip6.h netinet/icmp6.h bits/in.h - --routines := htonl htons \ -+routines-$(OPTION_EGLIBC_INET) \ -+ += htonl htons \ - inet_lnaof inet_mkadr \ - inet_netof inet_ntoa inet_net herrno herrno-loc \ - gethstbyad gethstbyad_r gethstbynm gethstbynm2 gethstbynm2_r \ -@@ -39,18 +42,23 @@ routines := htonl htons \ - getservent_r \ - ether_aton ether_aton_r ether_hton ether_line \ - ether_ntoa ether_ntoa_r ether_ntoh \ -- rcmd rexec ruserpass \ - getnetgrent_r getnetgrent \ -- getaliasent_r getaliasent getaliasname getaliasname_r \ -- in6_addr getnameinfo if_index ifaddrs inet6_option \ -+ in6_addr getnameinfo if_index ifaddrs \ - getipv4sourcefilter setipv4sourcefilter \ -- getsourcefilter setsourcefilter inet6_opt inet6_rth -+ getsourcefilter setsourcefilter -+routines-$(OPTION_EGLIBC_RCMD) \ -+ += rcmd rexec ruserpass -+routines-$(OPTION_EGLIBC_DB_ALIASES) \ -+ += getaliasent_r getaliasent getaliasname getaliasname_r -+routines-$(OPTION_EGLIBC_ADVANCED_INET6) \ -+ += inet6_option inet6_opt inet6_rth - --aux := check_pf check_native ifreq -+aux-$(OPTION_EGLIBC_INET) += check_pf check_native ifreq - - tests := htontest test_ifindex tst-ntoa tst-ether_aton tst-network \ -- tst-gethnm test-ifaddrs bug-if1 test-inet6_opt tst-ether_line \ -+ tst-gethnm test-ifaddrs bug-if1 tst-ether_line \ - tst-getni1 tst-getni2 tst-inet6_rth tst-checks -+tests-$(OPTION_EGLIBC_ADVANCED_INET6) += test-inet6_opt - - include ../Rules - -diff --git a/intl/Makefile b/intl/Makefile -index 9ecf8fe..587bc0d 100644 ---- a/intl/Makefile -+++ b/intl/Makefile -@@ -16,6 +16,7 @@ - # <http://www.gnu.org/licenses/>. - - # Makefile for intl subdirectory: message handling code from GNU gettext. -+include ../option-groups.mak - - subdir = intl - -@@ -48,7 +49,7 @@ endif - $(objpfx)plural.o: plural.c - - ifeq ($(run-built-tests),yes) --ifeq (yes,$(build-shared)) -+ifeq (yyyes,$(OPTION_EGLIBC_LOCALES)$(OPTION_EGLIBC_LOCALE_CODE)$(build-shared)) - ifneq ($(strip $(MSGFMT)),:) - tests-special += $(objpfx)tst-translit.out $(objpfx)tst-gettext.out \ - $(objpfx)tst-gettext2.out $(objpfx)tst-codeset.out \ -diff --git a/intl/dcigettext.c b/intl/dcigettext.c -index 8a3f091..e271648 100644 ---- a/intl/dcigettext.c -+++ b/intl/dcigettext.c -@@ -100,11 +100,15 @@ extern int errno; - # include "libgnuintl.h" - #endif - #include "hash-string.h" -+#ifdef _LIBC -+# include <gnu/option-groups.h> -+#endif - - /* Handle multi-threaded applications. */ - #ifdef _LIBC - # include <bits/libc-lock.h> - # define gl_rwlock_define_initialized __libc_rwlock_define_initialized -+# define gl_rwlock_define __libc_rwlock_define - # define gl_rwlock_rdlock __libc_rwlock_rdlock - # define gl_rwlock_wrlock __libc_rwlock_wrlock - # define gl_rwlock_unlock __libc_rwlock_unlock -@@ -523,8 +527,10 @@ DCIGETTEXT (const char *domainname, const char *msgid1, const char *msgid2, - saved_errno = errno; - - #ifdef _LIBC -- __libc_rwlock_define (extern, __libc_setlocale_lock attribute_hidden) -- __libc_rwlock_rdlock (__libc_setlocale_lock); -+# if __OPTION_EGLIBC_LOCALE_CODE -+ gl_rwlock_define (extern, __libc_setlocale_lock attribute_hidden) -+ gl_rwlock_rdlock (__libc_setlocale_lock); -+# endif - #endif - - gl_rwlock_rdlock (_nl_state_lock); -@@ -550,7 +556,11 @@ DCIGETTEXT (const char *domainname, const char *msgid1, const char *msgid2, - #ifdef HAVE_PER_THREAD_LOCALE - # ifndef IN_LIBGLOCALE - # ifdef _LIBC -- localename = strdupa (__current_locale_name (category)); -+# if __OPTION_EGLIBC_LOCALE_CODE -+ localename = strdupa (__current_locale_name (category)); -+# else -+ localename = "C"; -+# endif - # else - categoryname = category_to_name (category); - # define CATEGORYNAME_INITIALIZED -@@ -581,10 +591,12 @@ DCIGETTEXT (const char *domainname, const char *msgid1, const char *msgid2, - else - retval = (char *) (*foundp)->translation; - -- gl_rwlock_unlock (_nl_state_lock); - # ifdef _LIBC -- __libc_rwlock_unlock (__libc_setlocale_lock); -+# if __OPTION_EGLIBC_LOCALE_CODE -+ gl_rwlock_unlock (__libc_setlocale_lock); -+# endif - # endif -+ gl_rwlock_unlock (_nl_state_lock); - __set_errno (saved_errno); - return retval; - } -@@ -838,10 +850,13 @@ DCIGETTEXT (const char *domainname, const char *msgid1, const char *msgid2, - if (plural) - retval = plural_lookup (domain, n, retval, retlen); - -- gl_rwlock_unlock (_nl_state_lock); - #ifdef _LIBC -- __libc_rwlock_unlock (__libc_setlocale_lock); -+# if __OPTION_EGLIBC_LOCALE_CODE -+ -+ gl_rwlock_unlock (__libc_setlocale_lock); -+# endif - #endif -+ gl_rwlock_unlock (_nl_state_lock); - return retval; - } - } -@@ -850,10 +865,12 @@ DCIGETTEXT (const char *domainname, const char *msgid1, const char *msgid2, - return_untranslated: - /* Return the untranslated MSGID. */ - FREE_BLOCKS (block_list); -- gl_rwlock_unlock (_nl_state_lock); - #ifdef _LIBC -- __libc_rwlock_unlock (__libc_setlocale_lock); -+# if __OPTION_EGLIBC_LOCALE_CODE -+ gl_rwlock_unlock (__libc_setlocale_lock); -+# endif - #endif -+ gl_rwlock_unlock (_nl_state_lock); - #ifndef _LIBC - if (!ENABLE_SECURE) - { -@@ -1550,7 +1567,11 @@ guess_category_value (int category, const char *categoryname) - `LC_xxx', and `LANG'. On some systems this can be done by the - `setlocale' function itself. */ - # ifdef _LIBC -+# if __OPTION_EGLIBC_LOCALE_CODE - locale = __current_locale_name (category); -+# else -+ locale = "C"; -+# endif - # else - locale_defaulted = 0; - # if HAVE_USELOCALE -diff --git a/io/Makefile b/io/Makefile -index 613dce0..697439e 100644 ---- a/io/Makefile -+++ b/io/Makefile -@@ -18,6 +18,8 @@ - # - # Sub-makefile for I/O portion of the library. - # -+include ../option-groups.mak -+ - subdir := io - - include ../Makeconfig -@@ -36,7 +38,7 @@ routines := \ - fxstatat fxstatat64 \ - statfs fstatfs statfs64 fstatfs64 \ - statvfs fstatvfs statvfs64 fstatvfs64 \ -- umask chmod fchmod lchmod fchmodat \ -+ umask chmod fchmod fchmodat \ - mkdir mkdirat \ - open open_2 open64 open64_2 openat openat_2 openat64 openat64_2 \ - read write lseek lseek64 access euidaccess faccessat \ -@@ -49,11 +51,13 @@ routines := \ - ttyname ttyname_r isatty \ - link linkat symlink symlinkat readlink readlinkat \ - unlink unlinkat rmdir \ -- ftw ftw64 fts poll ppoll \ -+ poll ppoll \ - posix_fadvise posix_fadvise64 \ - posix_fallocate posix_fallocate64 \ - sendfile sendfile64 \ - utimensat futimens -+routines-$(OPTION_EGLIBC_BSD) += lchmod -+routines-$(OPTION_EGLIBC_FTRAVERSE) += ftw ftw64 fts - - aux := have_o_cloexec - -@@ -64,18 +68,22 @@ static-only-routines = stat fstat lstat stat64 fstat64 lstat64 \ - fstatat fstatat64 mknod mknodat - - others := pwd --test-srcs := ftwtest -+test-srcs-$(OPTION_EGLIBC_FTRAVERSE) := ftwtest - tests := test-utime test-stat test-stat2 test-lfs tst-getcwd \ -- tst-fcntl bug-ftw1 bug-ftw2 bug-ftw3 bug-ftw4 tst-statvfs \ -+ tst-fcntl tst-statvfs \ - tst-openat tst-unlinkat tst-fstatat tst-futimesat \ - tst-renameat tst-fchownat tst-fchmodat tst-faccessat \ - tst-symlinkat tst-linkat tst-readlinkat tst-mkdirat \ -- tst-mknodat tst-mkfifoat tst-ttyname_r bug-ftw5 \ -+ tst-mknodat tst-mkfifoat tst-ttyname_r \ - tst-posix_fallocate -+tests-$(OPTION_EGLIBC_FTRAVERSE) += bug-ftw1 bug-ftw2 bug-ftw3 bug-ftw4 \ -+ bug-ftw5 - - ifeq ($(run-built-tests),yes) -+ifeq (y,$(OPTION_EGLIBC_FTRAVERSE)) - tests-special += $(objpfx)ftwtest.out - endif -+endif - - include ../Rules - -diff --git a/libidn/Makefile b/libidn/Makefile -index 940fa52..43aad0c 100644 ---- a/libidn/Makefile -+++ b/libidn/Makefile -@@ -16,6 +16,7 @@ - # <http://www.gnu.org/licenses/>. - - # Makefile for libidn subdirectory of GNU C Library. -+include ../option-groups.mak - - subdir := libidn - -@@ -23,8 +24,8 @@ include ../Makeconfig - - routines = idn-stub - --extra-libs = libcidn --extra-libs-others = $(extra-libs) -+extra-libs-$(OPTION_EGLIBC_IDN) = libcidn -+extra-libs-others-y = $(extra-libs-y) - - libcidn-routines := punycode toutf8 nfkc stringprep rfc3454 profiles idna \ - iconvme -diff --git a/libidn/toutf8.c b/libidn/toutf8.c -index c7e67ca..62df478 100644 ---- a/libidn/toutf8.c -+++ b/libidn/toutf8.c -@@ -33,6 +33,11 @@ - /* Get strlen. */ - #include <string.h> - -+/* Get __OPTION_EGLIBC_LOCALE_CODE. */ -+#ifdef _LIBC -+# include <gnu/option-groups.h> -+#endif -+ - /* Get iconv_string. */ - #include "iconvme.h" - -@@ -47,7 +52,11 @@ - #endif - - #ifdef _LIBC --# define stringprep_locale_charset() nl_langinfo (CODESET) -+# if __OPTION_EGLIBC_LOCALE_CODE -+# define stringprep_locale_charset() nl_langinfo (CODESET) -+# else -+# define stringprep_locale_charset() "ANSI_X3.4-1968" -+# endif - #else - /** - * stringprep_locale_charset - return charset used in current locale -diff --git a/libio/Makefile b/libio/Makefile -index 7b3bcf9..27c9186 100644 ---- a/libio/Makefile -+++ b/libio/Makefile -@@ -18,6 +18,8 @@ - # - # Specific makefile for libio. - # -+include ../option-groups.mak -+ - subdir := libio - - include ../Makeconfig -@@ -27,16 +29,13 @@ headers := stdio.h libio.h _G_config.h bits/stdio.h bits/stdio-lock.h \ - - routines := \ - filedoalloc iofclose iofdopen iofflush iofgetpos iofgets iofopen \ -- iofopncook iofputs iofread iofsetpos ioftell wfiledoalloc \ -+ iofopncook iofputs iofread iofsetpos ioftell \ - iofwrite iogetdelim iogetline iogets iopadn iopopen ioputs \ - ioseekoff ioseekpos iosetbuffer iosetvbuf ioungetc \ - iovsprintf iovsscanf \ - iofgetpos64 iofopen64 iofsetpos64 \ -- fputwc fputwc_u getwc getwc_u getwchar getwchar_u iofgetws iofgetws_u \ -- iofputws iofputws_u iogetwline iowpadn ioungetwc putwc putwc_u \ -- putwchar putwchar_u putchar putchar_u fwprintf swprintf vwprintf \ -- wprintf wscanf fwscanf vwscanf vswprintf iovswscanf swscanf wgenops \ -- wstrops wfileops iofwide fwide wmemstream \ -+ putchar putchar_u \ -+ iofwide \ - \ - clearerr feof ferror fileno fputc freopen fseek getc getchar \ - memstream pclose putc putchar rewind setbuf setlinebuf vasprintf \ -@@ -48,24 +47,49 @@ routines := \ - \ - libc_fatal fmemopen oldfmemopen - --tests = tst_swprintf tst_wprintf tst_swscanf tst_wscanf tst_getwc tst_putwc \ -- tst_wprintf2 tst-widetext test-fmemopen tst-ext tst-ext2 \ -- tst-fgetws tst-ungetwc1 tst-ungetwc2 tst-swscanf tst-sscanf \ -- tst-mmap-setvbuf bug-ungetwc1 bug-ungetwc2 tst-atime tst-eof \ -- tst-freopen bug-rewind bug-rewind2 bug-ungetc bug-fseek \ -+routines-$(OPTION_POSIX_C_LANG_WIDE_CHAR) += \ -+ wfiledoalloc \ -+ iowpadn \ -+ swprintf \ -+ vswprintf iovswscanf swscanf wgenops \ -+ wstrops wfileops wmemstream -+routines-$(call option-disabled, OPTION_POSIX_C_LANG_WIDE_CHAR) += \ -+ wdummyfileops -+routines-$(OPTION_POSIX_WIDE_CHAR_DEVICE_IO) += \ -+ fputwc fputwc_u getwc getwc_u getwchar getwchar_u iofgetws iofgetws_u \ -+ iofputws iofputws_u iogetwline ioungetwc putwc putwc_u \ -+ putwchar putwchar_u fwprintf vwprintf \ -+ wprintf wscanf fwscanf vwscanf \ -+ fwide -+ -+tests = test-fmemopen tst-ext tst-ext2 \ -+ tst-mmap-setvbuf tst-atime tst-eof \ -+ tst-freopen bug-ungetc bug-fseek \ - tst-mmap-eofsync tst-mmap-fflushsync bug-mmap-fflush \ -- tst-mmap2-eofsync tst-mmap-offend bug-fopena+ bug-wfflush \ -- bug-ungetc2 bug-ftell bug-ungetc3 bug-ungetc4 tst-fopenloc2 \ -+ tst-mmap2-eofsync tst-mmap-offend bug-fopena+ \ -+ bug-ungetc2 bug-ungetc3 bug-ungetc4 \ - tst-memstream1 tst-memstream2 \ -- tst-wmemstream1 tst-wmemstream2 \ -- bug-memstream1 bug-wmemstream1 \ -- tst-setvbuf1 tst-popen1 tst-fgetwc bug-wsetpos tst-fseek \ -- tst-fwrite-error tst-ftell-partial-wide tst-ftell-active-handler \ -- tst-ftell-append tst-fputws -+ bug-memstream1 tst-popen1 tst-fwrite-error \ -+ tst-ftell-active-handler tst-ftell-append -+tests-$(OPTION_EGLIBC_LOCALE_CODE) \ -+ += tst-swscanf tst-fgetws tst-setvbuf1 \ -+ tst-ungetwc1 tst-ungetwc2 bug-ftell bug-ungetwc2 \ -+ tst-widetext tst-fputws -+tests-$(OPTION_POSIX_WIDE_CHAR_DEVICE_IO) \ -+ += bug-rewind bug-rewind2 bug-ungetwc1 \ -+ bug-wfflush bug-wmemstream1 tst-fopenloc2 \ -+ tst_getwc \ -+ tst_putwc tst_wprintf tst_wprintf2 tst_wscanf \ -+ tst-fgetwc bug-wsetpos tst-fseek tst-ftell-partial-wide -+tests-$(OPTION_POSIX_C_LANG_WIDE_CHAR) \ -+ += tst_swprintf tst_swscanf \ -+ tst-sscanf \ -+ tst-wmemstream1 tst-wmemstream2 -+ - ifeq (yes,$(build-shared)) - # Add test-fopenloc only if shared library is enabled since it depends on - # shared localedata objects. --tests += tst-fopenloc -+tests-$(OPTION_EGLIBC_LOCALE_CODE) += tst-fopenloc - endif - test-srcs = test-freopen - -@@ -164,13 +188,17 @@ shared-only-routines = oldiofopen oldiofdopen oldiofclose oldfileops \ - oldiofsetpos64 - - ifeq ($(run-built-tests),yes) -+ifeq (y,$(OPTION_POSIX_WIDE_CHAR_DEVICE_IO)) - tests-special += $(objpfx)test-freopen.out -+endif -+ifeq (y,$(OPTION_EGLIBC_LOCALE_CODE)) - ifeq (yes,$(build-shared)) - # Run tst-fopenloc-cmp.out and tst-openloc-mem.out only if shared - # library is enabled since they depend on tst-fopenloc.out. - tests-special += $(objpfx)tst-fopenloc-cmp.out $(objpfx)tst-fopenloc-mem.out - endif - endif -+endif - - include ../Rules - -diff --git a/libio/__fpurge.c b/libio/__fpurge.c -index 065cf61..e32a3e9 100644 ---- a/libio/__fpurge.c -+++ b/libio/__fpurge.c -@@ -21,7 +21,7 @@ - void - __fpurge (FILE *fp) - { -- if (fp->_mode > 0) -+ if (_IO_is_wide (fp)) - { - /* Wide-char stream. */ - if (_IO_in_backup (fp)) -diff --git a/libio/fileops.c b/libio/fileops.c -index cbcd6f5..19e43c2 100644 ---- a/libio/fileops.c -+++ b/libio/fileops.c -@@ -39,6 +39,7 @@ - #include <string.h> - #include <errno.h> - #include <unistd.h> -+#include <gnu/option-groups.h> - #include <stdlib.h> - #if _LIBC - # include "../wcsmbs/wcsmbsload.h" -@@ -173,7 +174,7 @@ _IO_new_file_close_it (_IO_FILE *fp) - - /* Free buffer. */ - #if defined _LIBC || defined _GLIBCPP_USE_WCHAR_T -- if (fp->_mode > 0) -+ if (_IO_is_wide (fp)) - { - if (_IO_have_wbackup (fp)) - _IO_free_wbackup_area (fp); -@@ -348,6 +349,7 @@ _IO_new_file_fopen (_IO_FILE *fp, const char *filename, const char *mode, - cs = strstr (last_recognized + 1, ",ccs="); - if (cs != NULL) - { -+#if __OPTION_POSIX_WIDE_CHAR_DEVICE_IO - /* Yep. Load the appropriate conversions and set the orientation - to wide. */ - struct gconv_fcts fcts; -@@ -418,6 +420,12 @@ _IO_new_file_fopen (_IO_FILE *fp, const char *filename, const char *mode, - - /* Set the mode now. */ - result->_mode = 1; -+#else -+ /* Treat this as if we couldn't find the given character set. */ -+ (void) _IO_file_close_it (fp); -+ __set_errno (EINVAL); -+ return NULL; -+#endif - } - } - -diff --git a/libio/iofwide.c b/libio/iofwide.c -index 0c175d1..3e9f52b 100644 ---- a/libio/iofwide.c -+++ b/libio/iofwide.c -@@ -26,6 +26,7 @@ - - #include <libioP.h> - #ifdef _LIBC -+# include <gnu/option-groups.h> - # include <dlfcn.h> - # include <wchar.h> - #endif -@@ -43,6 +44,8 @@ - #endif - - -+#if ! defined _LIBC || __OPTION_POSIX_C_LANG_WIDE_CHAR -+ - /* Prototypes of libio's codecvt functions. */ - static enum __codecvt_result do_out (struct _IO_codecvt *codecvt, - __mbstate_t *statep, -@@ -499,3 +502,26 @@ do_max_length (struct _IO_codecvt *codecvt) - return MB_CUR_MAX; - #endif - } -+ -+#else -+/* OPTION_POSIX_C_LANG_WIDE_CHAR is disabled. */ -+ -+#undef _IO_fwide -+int -+_IO_fwide (fp, mode) -+ _IO_FILE *fp; -+ int mode; -+{ -+ /* Die helpfully if the user tries to create a wide stream; I -+ disbelieve that most users check the return value from -+ 'fwide (fp, 1)'. */ -+ assert (mode <= 0); -+ -+ /* We can only make streams byte-oriented, which is trivial. */ -+ if (mode < 0) -+ fp->_mode = -1; -+ -+ return fp->_mode; -+} -+ -+#endif -diff --git a/libio/ioseekoff.c b/libio/ioseekoff.c -index 11765cf..15d6230 100644 ---- a/libio/ioseekoff.c -+++ b/libio/ioseekoff.c -@@ -60,7 +60,7 @@ _IO_seekoff_unlocked (fp, offset, dir, mode) - else - abort (); - } -- if (_IO_fwide (fp, 0) < 0) -+ if (! _IO_is_wide (fp)) - _IO_free_backup_area (fp); - else - _IO_free_wbackup_area (fp); -diff --git a/libio/ioseekpos.c b/libio/ioseekpos.c -index a7652a1..6938b68 100644 ---- a/libio/ioseekpos.c -+++ b/libio/ioseekpos.c -@@ -35,7 +35,7 @@ _IO_seekpos_unlocked (fp, pos, mode) - /* If we have a backup buffer, get rid of it, since the __seekoff - callback may not know to do the right thing about it. - This may be over-kill, but it'll do for now. TODO */ -- if (_IO_fwide (fp, 0) <= 0) -+ if (! _IO_is_wide (fp)) - { - if (_IO_have_backup (fp)) - _IO_free_backup_area (fp); -diff --git a/libio/iosetbuffer.c b/libio/iosetbuffer.c -index 0a41c10..3d99fa0 100644 ---- a/libio/iosetbuffer.c -+++ b/libio/iosetbuffer.c -@@ -24,6 +24,8 @@ - This exception applies to code released by its copyright holders - in files containing the exception. */ - -+#include <gnu/option-groups.h> -+ - #include "libioP.h" - - void -@@ -38,9 +40,11 @@ _IO_setbuffer (fp, buf, size) - if (!buf) - size = 0; - (void) _IO_SETBUF (fp, buf, size); -+#if __OPTION_POSIX_C_LANG_WIDE_CHAR - if (_IO_vtable_offset (fp) == 0 && fp->_mode == 0 && _IO_CHECK_WIDE (fp)) - /* We also have to set the buffer using the wide char function. */ - (void) _IO_WSETBUF (fp, buf, size); -+#endif /* __OPTION_POSIX_C_LANG_WIDE_CHAR */ - _IO_release_lock (fp); - } - libc_hidden_def (_IO_setbuffer) -diff --git a/libio/libioP.h b/libio/libioP.h -index 0f16e2d..d2626d6 100644 ---- a/libio/libioP.h -+++ b/libio/libioP.h -@@ -44,6 +44,10 @@ - /*# include <comthread.h>*/ - #endif - -+#if defined _LIBC -+# include <gnu/option-groups.h> -+#endif -+ - #include <math_ldbl_opt.h> - - #include "iolibio.h" -@@ -523,8 +527,20 @@ extern void _IO_old_init (_IO_FILE *fp, int flags) __THROW; - - - #if defined _LIBC || defined _GLIBCPP_USE_WCHAR_T -+ -+/* _IO_is_wide (fp) is roughly equivalent to '_IO_fwide (fp, 0) > 0', -+ except that when OPTION_POSIX_C_LANG_WIDE_CHAR is disabled, it -+ expands to a constant, allowing the compiler to realize that it can -+ eliminate code that references wide stream handling functions. -+ This, in turn, allows us to omit them. */ -+#if __OPTION_POSIX_C_LANG_WIDE_CHAR -+# define _IO_is_wide(_f) ((_f)->_mode > 0) -+#else -+# define _IO_is_wide(_f) (0) -+#endif -+ - # define _IO_do_flush(_f) \ -- ((_f)->_mode <= 0 \ -+ (! _IO_is_wide (_f) \ - ? _IO_do_write(_f, (_f)->_IO_write_base, \ - (_f)->_IO_write_ptr-(_f)->_IO_write_base) \ - : _IO_wdo_write(_f, (_f)->_wide_data->_IO_write_base, \ -diff --git a/libio/wdummyfileops.c b/libio/wdummyfileops.c -new file mode 100644 -index 0000000..c0150b8 ---- /dev/null -+++ b/libio/wdummyfileops.c -@@ -0,0 +1,161 @@ -+/* Copyright (C) 2007 Free Software Foundation, Inc. -+ This file is part of the GNU C Library. -+ -+ The GNU C 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.1 of the License, or (at your option) any later version. -+ -+ The GNU C 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 the GNU C Library; if not, write to the Free -+ Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA -+ 02111-1307 USA. -+ -+ As a special exception, if you link the code in this file with -+ files compiled with a GNU compiler to produce an executable, -+ that does not cause the resulting executable to be covered by -+ the GNU Lesser General Public License. This exception does not -+ however invalidate any other reasons why the executable file -+ might be covered by the GNU Lesser General Public License. -+ This exception applies to code released by its copyright holders -+ in files containing the exception. */ -+ -+#include <assert.h> -+#include <stdio.h> -+#include <stdlib.h> -+#include <libioP.h> -+ -+static void __THROW __attribute__ ((__noreturn__)) -+_IO_wfile_wide_char_support_disabled (void) -+{ -+ static const char errstr[] -+ = ("The application tried to use wide character I/O, but libc.so" -+ " was compiled\n" -+ "with the OPTION_POSIX_C_LANG_WIDE_CHAR option group disabled.\n"); -+ __libc_write (STDERR_FILENO, errstr, sizeof (errstr) - 1); -+ abort (); -+} -+ -+static void -+_IO_wfile_disabled_void_int (_IO_FILE *fp, int x) -+{ -+ _IO_wfile_wide_char_support_disabled (); -+} -+ -+static int -+_IO_wfile_disabled_int_int (_IO_FILE *fp, int x) -+{ -+ _IO_wfile_wide_char_support_disabled (); -+} -+ -+static int -+_IO_wfile_disabled_int_none (_IO_FILE *fp) -+{ -+ _IO_wfile_wide_char_support_disabled (); -+} -+ -+static _IO_size_t -+_IO_wfile_disabled_xsputn (_IO_FILE *fp, const void *data, _IO_size_t n) -+{ -+ _IO_wfile_wide_char_support_disabled (); -+} -+ -+static _IO_size_t -+_IO_wfile_disabled_xsgetn (_IO_FILE *fp, void *data, _IO_size_t n) -+{ -+ _IO_wfile_wide_char_support_disabled (); -+} -+ -+static _IO_off64_t -+_IO_wfile_disabled_seekoff (_IO_FILE *fp, _IO_off64_t off, int dir, int mode) -+{ -+ _IO_wfile_wide_char_support_disabled (); -+} -+ -+static _IO_off64_t -+_IO_wfile_disabled_seekpos (_IO_FILE *fp, _IO_off64_t pos, int flags) -+{ -+ _IO_wfile_wide_char_support_disabled (); -+} -+ -+static _IO_FILE * -+_IO_wfile_disabled_setbuf (_IO_FILE *fp, char *buffer, _IO_ssize_t length) -+{ -+ _IO_wfile_wide_char_support_disabled (); -+} -+ -+static _IO_ssize_t -+_IO_wfile_disabled_read (_IO_FILE *fp, void *buffer, _IO_ssize_t length) -+{ -+ _IO_wfile_wide_char_support_disabled (); -+} -+ -+static _IO_ssize_t -+_IO_wfile_disabled_write (_IO_FILE *fp, const void *buffer, _IO_ssize_t length) -+{ -+ _IO_wfile_wide_char_support_disabled (); -+} -+ -+static _IO_off64_t -+_IO_wfile_disabled_seek (_IO_FILE *fp, _IO_off64_t offset, int mode) -+{ -+ _IO_wfile_wide_char_support_disabled (); -+} -+ -+static int -+_IO_wfile_disabled_close (_IO_FILE *fp) -+{ -+ _IO_wfile_wide_char_support_disabled (); -+} -+ -+static int -+_IO_wfile_disabled_stat (_IO_FILE *fp, void *buf) -+{ -+ _IO_wfile_wide_char_support_disabled (); -+} -+ -+static int -+_IO_wfile_disabled_showmanyc (_IO_FILE *fp) -+{ -+ _IO_wfile_wide_char_support_disabled (); -+} -+ -+static void -+_IO_wfile_disabled_imbue (_IO_FILE *fp, void *locale) -+{ -+ _IO_wfile_wide_char_support_disabled (); -+} -+ -+static const struct _IO_jump_t _IO_wfile_jumps_disabled = -+{ -+ JUMP_INIT_DUMMY, -+ JUMP_INIT(finish, _IO_wfile_disabled_void_int), -+ JUMP_INIT(overflow, _IO_wfile_disabled_int_int), -+ JUMP_INIT(underflow, _IO_wfile_disabled_int_none), -+ JUMP_INIT(uflow, _IO_wfile_disabled_int_none), -+ JUMP_INIT(pbackfail, _IO_wfile_disabled_int_int), -+ JUMP_INIT(xsputn, _IO_wfile_disabled_xsputn), -+ JUMP_INIT(xsgetn, _IO_wfile_disabled_xsgetn), -+ JUMP_INIT(seekoff, _IO_wfile_disabled_seekoff), -+ JUMP_INIT(seekpos, _IO_wfile_disabled_seekpos), -+ JUMP_INIT(setbuf, _IO_wfile_disabled_setbuf), -+ JUMP_INIT(sync, _IO_wfile_disabled_int_none), -+ JUMP_INIT(doallocate, _IO_wfile_disabled_int_none), -+ JUMP_INIT(read, _IO_wfile_disabled_read), -+ JUMP_INIT(write, _IO_wfile_disabled_write), -+ JUMP_INIT(seek, _IO_wfile_disabled_seek), -+ JUMP_INIT(close, _IO_wfile_disabled_close), -+ JUMP_INIT(stat, _IO_wfile_disabled_stat), -+ JUMP_INIT(showmanyc, _IO_wfile_disabled_showmanyc), -+ JUMP_INIT(imbue, _IO_wfile_disabled_imbue) -+}; -+ -+strong_alias (_IO_wfile_jumps_disabled, _IO_wfile_jumps) -+libc_hidden_data_def (_IO_wfile_jumps) -+strong_alias (_IO_wfile_jumps_disabled, _IO_wfile_jumps_mmap) -+strong_alias (_IO_wfile_jumps_disabled, _IO_wfile_jumps_maybe_mmap) -diff --git a/locale/C-ctype.c b/locale/C-ctype.c -index aa5f19f..06be081 100644 ---- a/locale/C-ctype.c -+++ b/locale/C-ctype.c -@@ -19,8 +19,11 @@ - #include "localeinfo.h" - #include <endian.h> - #include <stdint.h> -+#include <gnu/option-groups.h> - -+#if __OPTION_EGLIBC_LOCALE_CODE - #include "C-translit.h" -+#endif - - /* This table's entries are taken from POSIX.2 Table 2-6 - ``LC_CTYPE Category Definition in the POSIX Locale''. -@@ -634,6 +637,7 @@ const struct __locale_data _nl_C_LC_CTYPE attribute_hidden = - { .word = L'7' }, - { .word = L'8' }, - { .word = L'9' }, -+#if __OPTION_EGLIBC_LOCALE_CODE - /* _NL_CTYPE_TRANSLIT_TAB_SIZE */ - { .word = NTRANSLIT }, - /* _NL_CTYPE_TRANSLIT_FROM_IDX */ -@@ -644,6 +648,22 @@ const struct __locale_data _nl_C_LC_CTYPE attribute_hidden = - { .wstr = translit_to_idx }, - /* _NL_CTYPE_TRANSLIT_TO_TBL */ - { .wstr = (uint32_t *) translit_to_tbl }, -+#else -+ /* If the locale code isn't enabled, we don't have the -+ transliteration code in iconv/gconv_trans.c anyway, so there's -+ no need for the transliteration tables here. We'll fall back -+ on the default missing replacement, '?'. */ -+ /* _NL_CTYPE_TRANSLIT_TAB_SIZE */ -+ { .word = 0 }, -+ /* _NL_CTYPE_TRANSLIT_FROM_IDX */ -+ { .wstr = NULL }, -+ /* _NL_CTYPE_TRANSLIT_FROM_TBL */ -+ { .wstr = NULL }, -+ /* _NL_CTYPE_TRANSLIT_TO_IDX */ -+ { .wstr = NULL }, -+ /* _NL_CTYPE_TRANSLIT_TO_TBL */ -+ { .wstr = NULL }, -+#endif - /* _NL_CTYPE_TRANSLIT_DEFAULT_MISSING_LEN */ - { .word = 1 }, - /* _NL_CTYPE_TRANSLIT_DEFAULT_MISSING */ -diff --git a/locale/Makefile b/locale/Makefile -index f1b4343..599a1a9 100644 ---- a/locale/Makefile -+++ b/locale/Makefile -@@ -18,27 +18,43 @@ - # - # Makefile for locales. - # -+include ../option-groups.mak -+ - subdir := locale - - include ../Makeconfig - - headers = locale.h bits/locale.h langinfo.h xlocale.h --routines = setlocale findlocale loadlocale loadarchive \ -- localeconv nl_langinfo nl_langinfo_l mb_cur_max \ -- newlocale duplocale freelocale uselocale --tests = tst-C-locale tst-locname tst-duplocale -+# catnames is needed by OPTION_EGLIBC_LOCALE_CODE and by the 'intl' code. -+# If we put the latter in an option group, too, we can omit catnames -+# when both option groups are disabled. libstdc++-v3 needs mb_cur_max. -+routines-y := catnames mb_cur_max -+routines-$(OPTION_EGLIBC_LOCALE_CODE) \ -+ += setlocale findlocale loadlocale loadarchive \ -+ localeconv nl_langinfo nl_langinfo_l \ -+ newlocale duplocale freelocale uselocale -+ifneq (y,$(OPTION_EGLIBC_LOCALE_CODE)) -+routines-y += dummy-setlocale -+endif -+tests-$(OPTION_EGLIBC_LOCALE_CODE) += tst-C-locale tst-locname tst-duplocale - categories = ctype messages monetary numeric time paper name \ - address telephone measurement identification collate --aux = $(categories:%=lc-%) $(categories:%=C-%) SYS_libc C_name \ -- xlocale localename global-locale coll-lookup --others = localedef locale -+# C-messages belongs in an intl option group. -+aux-y := C-ctype C-time \ -+ SYS_libc C_name xlocale global-locale coll-lookup -+aux-$(OPTION_EGLIBC_LOCALE_CODE) \ -+ += $(filter-out $(aux-y), \ -+ $(categories:%=lc-%) $(categories:%=C-%)) \ -+ localename -+others-$(OPTION_EGLIBC_LOCALE_CODE) = localedef locale - #others-static = localedef locale --install-bin = localedef locale --extra-objs = $(localedef-modules:=.o) $(localedef-aux:=.o) \ -+install-bin = $(others-y) -+extra-objs-$(OPTION_EGLIBC_LOCALE_CODE) \ -+ = $(localedef-modules:=.o) $(localedef-aux:=.o) \ - $(locale-modules:=.o) $(lib-modules:=.o) - --extra-libs = libBrokenLocale --extra-libs-others = $(extra-libs) -+extra-libs-$(OPTION_EGLIBC_LOCALE_CODE) = libBrokenLocale -+extra-libs-others = $(extra-libs-y) - - libBrokenLocale-routines = broken_cur_max - -@@ -93,6 +109,9 @@ CPPFLAGS-locale-programs = -DLOCALE_PATH='$(localepath)' \ - CFLAGS-charmap.c = -Wno-write-strings -Wno-char-subscripts - CFLAGS-locfile.c = -Wno-write-strings -Wno-char-subscripts - CFLAGS-charmap-dir.c = -Wno-write-strings -+ifneq (y,$(OPTION_EGLIBC_SPAWN)) -+CFLAGS-charmap-dir.c += -DNO_UNCOMPRESS -+endif - - # Set libof-* for each routine. - cpp-srcs-left := $(localedef-modules) $(localedef-aux) $(locale-modules) \ -diff --git a/locale/catnames.c b/locale/catnames.c -new file mode 100644 -index 0000000..9fad357 ---- /dev/null -+++ b/locale/catnames.c -@@ -0,0 +1,48 @@ -+/* Copyright (C) 2006 Free Software Foundation, Inc. -+ This file is part of the GNU C Library. -+ -+ The GNU C 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.1 of the License, or (at your option) any later version. -+ -+ The GNU C 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 the GNU C Library; if not, write to the Free -+ Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA -+ 02111-1307 USA. */ -+ -+#include "localeinfo.h" -+ -+/* Define an array of category names (also the environment variable names). */ -+const union catnamestr_t _nl_category_names attribute_hidden = -+ { -+ { -+#define DEFINE_CATEGORY(category, category_name, items, a) \ -+ category_name, -+#include "categories.def" -+#undef DEFINE_CATEGORY -+ } -+ }; -+ -+const uint8_t _nl_category_name_idxs[__LC_LAST] attribute_hidden = -+ { -+#define DEFINE_CATEGORY(category, category_name, items, a) \ -+ [category] = offsetof (union catnamestr_t, CATNAMEMF (__LINE__)), -+#include "categories.def" -+#undef DEFINE_CATEGORY -+ }; -+ -+/* An array of their lengths, for convenience. */ -+const uint8_t _nl_category_name_sizes[] attribute_hidden = -+ { -+#define DEFINE_CATEGORY(category, category_name, items, a) \ -+ [category] = sizeof (category_name) - 1, -+#include "categories.def" -+#undef DEFINE_CATEGORY -+ [LC_ALL] = sizeof ("LC_ALL") - 1 -+ }; -diff --git a/locale/dummy-setlocale.c b/locale/dummy-setlocale.c -new file mode 100644 -index 0000000..219964a ---- /dev/null -+++ b/locale/dummy-setlocale.c -@@ -0,0 +1,33 @@ -+/* Copyright (C) 2006 Free Software Foundation, Inc. -+ This file is part of the GNU C Library. -+ -+ The GNU C 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.1 of the License, or (at your option) any later version. -+ -+ The GNU C 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 the GNU C Library; if not, write to the Free -+ Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA -+ 02111-1307 USA. */ -+ -+#include <string.h> -+#include <locale.h> -+ -+char * -+setlocale (int category, const char *locale) -+{ -+ if (! locale -+ || locale[0] == '\0' -+ || strcmp (locale, "C") == 0 -+ || strcmp (locale, "POSIX") == 0) -+ return (char *) "C"; -+ else -+ return NULL; -+} -+libc_hidden_def (setlocale) -diff --git a/locale/localeinfo.h b/locale/localeinfo.h -index bdab9fe..a7516c0 100644 ---- a/locale/localeinfo.h -+++ b/locale/localeinfo.h -@@ -232,7 +232,7 @@ __libc_tsd_define (extern, __locale_t, LOCALE) - unused. We can manage this playing some tricks with weak references. - But with thread-local locale settings, it becomes quite ungainly unless - we can use __thread variables. So only in that case do we attempt this. */ --#ifndef SHARED -+#if !defined SHARED && !defined IN_GLIBC_LOCALEDEF - # include <tls.h> - # define NL_CURRENT_INDIRECT 1 - #endif -diff --git a/locale/programs/charmap-dir.c b/locale/programs/charmap-dir.c -index cf7adea..ef3b811 100644 ---- a/locale/programs/charmap-dir.c -+++ b/locale/programs/charmap-dir.c -@@ -19,7 +19,9 @@ - #include <error.h> - #include <fcntl.h> - #include <libintl.h> -+#ifndef NO_UNCOMPRESS - #include <spawn.h> -+#endif - #include <stdio.h> - #include <stdlib.h> - #include <string.h> -@@ -156,6 +158,7 @@ charmap_closedir (CHARMAP_DIR *cdir) - return closedir (dir); - } - -+#ifndef NO_UNCOMPRESS - /* Creates a subprocess decompressing the given pathname, and returns - a stream reading its output (the decompressed data). */ - static -@@ -204,6 +207,7 @@ fopen_uncompressed (const char *pathname, const char *compressor) - } - return NULL; - } -+#endif - - /* Opens a charmap for reading, given its name (not an alias name). */ - FILE * -@@ -226,6 +230,7 @@ charmap_open (const char *directory, const char *name) - if (stream != NULL) - return stream; - -+#ifndef NO_UNCOMPRESS - memcpy (p, ".gz", 4); - stream = fopen_uncompressed (pathname, "gzip"); - if (stream != NULL) -@@ -235,6 +240,7 @@ charmap_open (const char *directory, const char *name) - stream = fopen_uncompressed (pathname, "bzip2"); - if (stream != NULL) - return stream; -+#endif - - return NULL; - } -diff --git a/locale/programs/ld-collate.c b/locale/programs/ld-collate.c -index a39a94f..16e9039 100644 ---- a/locale/programs/ld-collate.c -+++ b/locale/programs/ld-collate.c -@@ -351,7 +351,7 @@ new_element (struct locale_collate_t *collate, const char *mbs, size_t mbslen, - } - if (wcs != NULL) - { -- size_t nwcs = wcslen ((wchar_t *) wcs); -+ size_t nwcs = wcslen_uint32 (wcs); - uint32_t zero = 0; - /* Handle <U0000> as a single character. */ - if (nwcs == 0) -@@ -1777,8 +1777,7 @@ symbol `%s' has the same encoding as"), (*eptr)->name); - - if ((*eptr)->nwcs == runp->nwcs) - { -- int c = wmemcmp ((wchar_t *) (*eptr)->wcs, -- (wchar_t *) runp->wcs, runp->nwcs); -+ int c = wmemcmp_uint32 ((*eptr)->wcs, runp->wcs, runp->nwcs); - - if (c == 0) - { -@@ -2011,9 +2010,9 @@ add_to_tablewc (uint32_t ch, struct element_t *runp) - one consecutive entry. */ - if (runp->wcnext != NULL - && runp->nwcs == runp->wcnext->nwcs -- && wmemcmp ((wchar_t *) runp->wcs, -- (wchar_t *)runp->wcnext->wcs, -- runp->nwcs - 1) == 0 -+ && wmemcmp_uint32 (runp->wcs, -+ runp->wcnext->wcs, -+ runp->nwcs - 1) == 0 - && (runp->wcs[runp->nwcs - 1] - == runp->wcnext->wcs[runp->nwcs - 1] + 1)) - { -@@ -2037,9 +2036,9 @@ add_to_tablewc (uint32_t ch, struct element_t *runp) - runp = runp->wcnext; - while (runp->wcnext != NULL - && runp->nwcs == runp->wcnext->nwcs -- && wmemcmp ((wchar_t *) runp->wcs, -- (wchar_t *)runp->wcnext->wcs, -- runp->nwcs - 1) == 0 -+ && wmemcmp_uint32 (runp->wcs, -+ runp->wcnext->wcs, -+ runp->nwcs - 1) == 0 - && (runp->wcs[runp->nwcs - 1] - == runp->wcnext->wcs[runp->nwcs - 1] + 1)); - -diff --git a/locale/programs/ld-ctype.c b/locale/programs/ld-ctype.c -index 3f464ef..b7b6b51 100644 ---- a/locale/programs/ld-ctype.c -+++ b/locale/programs/ld-ctype.c -@@ -926,7 +926,7 @@ ctype_output (struct localedef_t *locale, const struct charmap_t *charmap, - allocate_arrays (ctype, charmap, ctype->repertoire); - - default_missing_len = (ctype->default_missing -- ? wcslen ((wchar_t *) ctype->default_missing) -+ ? wcslen_uint32 (ctype->default_missing) - : 0); - - init_locale_data (&file, nelems); -@@ -1937,7 +1937,7 @@ read_translit_entry (struct linereader *ldfile, struct locale_ctype_t *ctype, - ignore = 1; - else - /* This value is usable. */ -- obstack_grow (ob, to_wstr, wcslen ((wchar_t *) to_wstr) * 4); -+ obstack_grow (ob, to_wstr, wcslen_uint32 (to_wstr) * 4); - - first = 0; - } -@@ -2471,8 +2471,8 @@ with character code range values one must use the absolute ellipsis `...'")); - } - - handle_tok_digit: -- class_bit = _ISwdigit; -- class256_bit = _ISdigit; -+ class_bit = BITw (tok_digit); -+ class256_bit = BIT (tok_digit); - handle_digits = 1; - goto read_charclass; - -@@ -3929,8 +3929,7 @@ allocate_arrays (struct locale_ctype_t *ctype, const struct charmap_t *charmap, - - while (idx < number) - { -- int res = wcscmp ((const wchar_t *) sorted[idx]->from, -- (const wchar_t *) runp->from); -+ int res = wcscmp_uint32 (sorted[idx]->from, runp->from); - if (res == 0) - { - replace = 1; -@@ -3967,11 +3966,11 @@ allocate_arrays (struct locale_ctype_t *ctype, const struct charmap_t *charmap, - for (size_t cnt = 0; cnt < number; ++cnt) - { - struct translit_to_t *srunp; -- from_len += wcslen ((const wchar_t *) sorted[cnt]->from) + 1; -+ from_len += wcslen_uint32 (sorted[cnt]->from) + 1; - srunp = sorted[cnt]->to; - while (srunp != NULL) - { -- to_len += wcslen ((const wchar_t *) srunp->str) + 1; -+ to_len += wcslen_uint32 (srunp->str) + 1; - srunp = srunp->next; - } - /* Plus one for the extra NUL character marking the end of -@@ -3995,18 +3994,18 @@ allocate_arrays (struct locale_ctype_t *ctype, const struct charmap_t *charmap, - ctype->translit_from_idx[cnt] = from_len; - ctype->translit_to_idx[cnt] = to_len; - -- len = wcslen ((const wchar_t *) sorted[cnt]->from) + 1; -- wmemcpy ((wchar_t *) &ctype->translit_from_tbl[from_len], -- (const wchar_t *) sorted[cnt]->from, len); -+ len = wcslen_uint32 (sorted[cnt]->from) + 1; -+ wmemcpy_uint32 (&ctype->translit_from_tbl[from_len], -+ sorted[cnt]->from, len); - from_len += len; - - ctype->translit_to_idx[cnt] = to_len; - srunp = sorted[cnt]->to; - while (srunp != NULL) - { -- len = wcslen ((const wchar_t *) srunp->str) + 1; -- wmemcpy ((wchar_t *) &ctype->translit_to_tbl[to_len], -- (const wchar_t *) srunp->str, len); -+ len = wcslen_uint32 (srunp->str) + 1; -+ wmemcpy_uint32 (&ctype->translit_to_tbl[to_len], -+ srunp->str, len); - to_len += len; - srunp = srunp->next; - } -diff --git a/locale/programs/ld-messages.c b/locale/programs/ld-messages.c -index ec1a80b..736eed8 100644 ---- a/locale/programs/ld-messages.c -+++ b/locale/programs/ld-messages.c -@@ -25,6 +25,7 @@ - #include <string.h> - #include <stdint.h> - #include <sys/uio.h> -+#include <gnu/option-groups.h> - - #include <assert.h> - -@@ -124,6 +125,7 @@ No definition for %s category found"), "LC_MESSAGES")); - } - else - { -+#if __OPTION_POSIX_REGEXP - int result; - regex_t re; - -@@ -140,6 +142,7 @@ No definition for %s category found"), "LC_MESSAGES")); - } - else if (result != 0) - regfree (&re); -+#endif - } - - if (messages->noexpr == NULL) -@@ -158,6 +161,7 @@ No definition for %s category found"), "LC_MESSAGES")); - } - else - { -+#if __OPTION_POSIX_REGEXP - int result; - regex_t re; - -@@ -174,6 +178,7 @@ No definition for %s category found"), "LC_MESSAGES")); - } - else if (result != 0) - regfree (&re); -+#endif - } - } - -diff --git a/locale/programs/ld-time.c b/locale/programs/ld-time.c -index db490c6..75dc505 100644 ---- a/locale/programs/ld-time.c -+++ b/locale/programs/ld-time.c -@@ -215,8 +215,10 @@ No definition for %s category found"), "LC_TIME")); - } - else - { -+ static const uint32_t wt_fmt_ampm[] -+ = { '%','I',':','%','M',':','%','S',' ','%','p',0 }; - time->t_fmt_ampm = "%I:%M:%S %p"; -- time->wt_fmt_ampm = (const uint32_t *) L"%I:%M:%S %p"; -+ time->wt_fmt_ampm = wt_fmt_ampm; - } - } - -@@ -226,7 +228,7 @@ No definition for %s category found"), "LC_TIME")); - const int days_per_month[12] = { 31, 29, 31, 30, 31, 30, - 31, 31, 30, 31 ,30, 31 }; - size_t idx; -- wchar_t *wstr; -+ uint32_t *wstr; - - time->era_entries = - (struct era_data *) xmalloc (time->num_era -@@ -464,18 +466,18 @@ No definition for %s category found"), "LC_TIME")); - } - - /* Now generate the wide character name and format. */ -- wstr = wcschr ((wchar_t *) time->wera[idx], L':');/* end direction */ -- wstr = wstr ? wcschr (wstr + 1, L':') : NULL; /* end offset */ -- wstr = wstr ? wcschr (wstr + 1, L':') : NULL; /* end start */ -- wstr = wstr ? wcschr (wstr + 1, L':') : NULL; /* end end */ -+ wstr = wcschr_uint32 (time->wera[idx], L':'); /* end direction */ -+ wstr = wstr ? wcschr_uint32 (wstr + 1, L':') : NULL; /* end offset */ -+ wstr = wstr ? wcschr_uint32 (wstr + 1, L':') : NULL; /* end start */ -+ wstr = wstr ? wcschr_uint32 (wstr + 1, L':') : NULL; /* end end */ - if (wstr != NULL) - { -- time->era_entries[idx].wname = (uint32_t *) wstr + 1; -- wstr = wcschr (wstr + 1, L':'); /* end name */ -+ time->era_entries[idx].wname = wstr + 1; -+ wstr = wcschr_uint32 (wstr + 1, L':'); /* end name */ - if (wstr != NULL) - { - *wstr = L'\0'; -- time->era_entries[idx].wformat = (uint32_t *) wstr + 1; -+ time->era_entries[idx].wformat = wstr + 1; - } - else - time->era_entries[idx].wname = -@@ -530,7 +532,16 @@ No definition for %s category found"), "LC_TIME")); - if (time->date_fmt == NULL) - time->date_fmt = "%a %b %e %H:%M:%S %Z %Y"; - if (time->wdate_fmt == NULL) -- time->wdate_fmt = (const uint32_t *) L"%a %b %e %H:%M:%S %Z %Y"; -+ { -+ static const uint32_t wdate_fmt[] = -+ { '%','a',' ', -+ '%','b',' ', -+ '%','e',' ', -+ '%','H',':','%','M',':','%','S',' ', -+ '%','Z',' ', -+ '%','Y',0 }; -+ time->wdate_fmt = wdate_fmt; -+ } - } - - -diff --git a/locale/programs/linereader.c b/locale/programs/linereader.c -index 2e05130..653b68c 100644 ---- a/locale/programs/linereader.c -+++ b/locale/programs/linereader.c -@@ -595,7 +595,7 @@ get_string (struct linereader *lr, const struct charmap_t *charmap, - { - int return_widestr = lr->return_widestr; - char *buf; -- wchar_t *buf2 = NULL; -+ uint32_t *buf2 = NULL; - size_t bufact; - size_t bufmax = 56; - -diff --git a/locale/programs/localedef.c b/locale/programs/localedef.c -index 2a0f2aa..583d233 100644 ---- a/locale/programs/localedef.c -+++ b/locale/programs/localedef.c -@@ -114,6 +114,7 @@ void (*argp_program_version_hook) (FILE *, struct argp_state *) = print_version; - #define OPT_LIST_ARCHIVE 309 - #define OPT_LITTLE_ENDIAN 400 - #define OPT_BIG_ENDIAN 401 -+#define OPT_UINT32_ALIGN 402 - - /* Definitions of arguments for argp functions. */ - static const struct argp_option options[] = -@@ -150,6 +151,8 @@ static const struct argp_option options[] = - N_("Generate little-endian output") }, - { "big-endian", OPT_BIG_ENDIAN, NULL, 0, - N_("Generate big-endian output") }, -+ { "uint32-align", OPT_UINT32_ALIGN, "ALIGNMENT", 0, -+ N_("Set the target's uint32_t alignment in bytes (default 4)") }, - { NULL, 0, NULL, 0, NULL } - }; - -@@ -239,12 +242,14 @@ main (int argc, char *argv[]) - ctype locale. (P1003.2 4.35.5.2) */ - setlocale (LC_CTYPE, "POSIX"); - -+#ifndef NO_SYSCONF - /* Look whether the system really allows locale definitions. POSIX - defines error code 3 for this situation so I think it must be - a fatal error (see P1003.2 4.35.8). */ - if (sysconf (_SC_2_LOCALEDEF) < 0) - WITH_CUR_LOCALE (error (3, 0, _("\ - FATAL: system does not define `_POSIX2_LOCALEDEF'"))); -+#endif - - /* Process charmap file. */ - charmap = charmap_read (charmap_file, verbose, 1, be_quiet, 1); -@@ -338,6 +343,9 @@ parse_opt (int key, char *arg, struct argp_state *state) - case OPT_BIG_ENDIAN: - set_big_endian (true); - break; -+ case OPT_UINT32_ALIGN: -+ uint32_align_mask = strtol (arg, NULL, 0) - 1; -+ break; - case 'c': - force_output = 1; - break; -diff --git a/locale/programs/locfile.c b/locale/programs/locfile.c -index 33da52e..f790c4c 100644 ---- a/locale/programs/locfile.c -+++ b/locale/programs/locfile.c -@@ -544,6 +544,9 @@ compare_files (const char *filename1, const char *filename2, size_t size, - machine running localedef. */ - bool swap_endianness_p; - -+/* The target's value of __align__(uint32_t) - 1. */ -+unsigned int uint32_align_mask = 3; -+ - /* When called outside a start_locale_structure/end_locale_structure - or start_locale_prelude/end_locale_prelude block, record that the - next byte in FILE's obstack will be the first byte of a new element. -@@ -621,7 +624,7 @@ add_locale_string (struct locale_file *file, const char *string) - void - add_locale_wstring (struct locale_file *file, const uint32_t *string) - { -- add_locale_uint32_array (file, string, wcslen ((const wchar_t *) string) + 1); -+ add_locale_uint32_array (file, string, wcslen_uint32 (string) + 1); - } - - /* Record that FILE's next element is the 32-bit integer VALUE. */ -diff --git a/locale/programs/locfile.h b/locale/programs/locfile.h -index 6fc441b..118b171 100644 ---- a/locale/programs/locfile.h -+++ b/locale/programs/locfile.h -@@ -71,6 +71,8 @@ extern void write_all_categories (struct localedef_t *definitions, - - extern bool swap_endianness_p; - -+extern unsigned int uint32_align_mask; -+ - /* Change the output to be big-endian if BIG_ENDIAN is true and - little-endian otherwise. */ - static inline void -@@ -89,7 +91,8 @@ maybe_swap_uint32 (uint32_t value) - } - - /* Likewise, but munge an array of N uint32_ts starting at ARRAY. */ --static inline void -+static void -+__attribute__ ((unused)) - maybe_swap_uint32_array (uint32_t *array, size_t n) - { - if (swap_endianness_p) -@@ -99,7 +102,8 @@ maybe_swap_uint32_array (uint32_t *array, size_t n) - - /* Like maybe_swap_uint32_array, but the array of N elements is at - the end of OBSTACK's current object. */ --static inline void -+static void -+__attribute__ ((unused)) - maybe_swap_uint32_obstack (struct obstack *obstack, size_t n) - { - maybe_swap_uint32_array ((uint32_t *) obstack_next_free (obstack) - n, n); -@@ -276,4 +280,55 @@ extern void identification_output (struct localedef_t *locale, - const struct charmap_t *charmap, - const char *output_path); - -+static size_t wcslen_uint32 (const uint32_t *str) __attribute__ ((unused)); -+static uint32_t * wmemcpy_uint32 (uint32_t *s1, const uint32_t *s2, size_t n) __attribute__ ((unused)); -+static uint32_t * wcschr_uint32 (const uint32_t *s, uint32_t ch) __attribute__ ((unused)); -+static int wcscmp_uint32 (const uint32_t *s1, const uint32_t *s2) __attribute__ ((unused)); -+static int wmemcmp_uint32 (const uint32_t *s1, const uint32_t *s2, size_t n) __attribute__ ((unused)); -+ -+static size_t -+wcslen_uint32 (const uint32_t *str) -+{ -+ size_t len = 0; -+ while (str[len] != 0) -+ len++; -+ return len; -+} -+ -+static int -+wmemcmp_uint32 (const uint32_t *s1, const uint32_t *s2, size_t n) -+{ -+ while (n-- != 0) -+ { -+ int diff = *s1++ - *s2++; -+ if (diff != 0) -+ return diff; -+ } -+ return 0; -+} -+ -+static int -+wcscmp_uint32 (const uint32_t *s1, const uint32_t *s2) -+{ -+ while (*s1 != 0 && *s1 == *s2) -+ s1++, s2++; -+ return *s1 - *s2; -+} -+ -+static uint32_t * -+wmemcpy_uint32 (uint32_t *s1, const uint32_t *s2, size_t n) -+{ -+ return memcpy (s1, s2, n * sizeof (uint32_t)); -+} -+ -+static uint32_t * -+wcschr_uint32 (const uint32_t *s, uint32_t ch) -+{ -+ do -+ if (*s == ch) -+ return (uint32_t *) s; -+ while (*s++ != 0); -+ return 0; -+} -+ - #endif /* locfile.h */ -diff --git a/locale/setlocale.c b/locale/setlocale.c -index fa9cb3a..8eee284 100644 ---- a/locale/setlocale.c -+++ b/locale/setlocale.c -@@ -64,36 +64,6 @@ static char *const _nl_current_used[] = - #endif - - --/* Define an array of category names (also the environment variable names). */ --const union catnamestr_t _nl_category_names attribute_hidden = -- { -- { --#define DEFINE_CATEGORY(category, category_name, items, a) \ -- category_name, --#include "categories.def" --#undef DEFINE_CATEGORY -- } -- }; -- --const uint8_t _nl_category_name_idxs[__LC_LAST] attribute_hidden = -- { --#define DEFINE_CATEGORY(category, category_name, items, a) \ -- [category] = offsetof (union catnamestr_t, CATNAMEMF (__LINE__)), --#include "categories.def" --#undef DEFINE_CATEGORY -- }; -- --/* An array of their lengths, for convenience. */ --const uint8_t _nl_category_name_sizes[] attribute_hidden = -- { --#define DEFINE_CATEGORY(category, category_name, items, a) \ -- [category] = sizeof (category_name) - 1, --#include "categories.def" --#undef DEFINE_CATEGORY -- [LC_ALL] = sizeof ("LC_ALL") - 1 -- }; -- -- - #ifdef NL_CURRENT_INDIRECT - # define WEAK_POSTLOAD(postload) weak_extern (postload) - #else -diff --git a/locale/xlocale.c b/locale/xlocale.c -index fec4564..f00269c 100644 ---- a/locale/xlocale.c -+++ b/locale/xlocale.c -@@ -18,6 +18,7 @@ - <http://www.gnu.org/licenses/>. */ - - #include <locale.h> -+#include <gnu/option-groups.h> - #include "localeinfo.h" - - #define DEFINE_CATEGORY(category, category_name, items, a) \ -@@ -25,6 +26,19 @@ extern struct __locale_data _nl_C_##category; - #include "categories.def" - #undef DEFINE_CATEGORY - -+/* If the locale support code isn't enabled, don't generate strong -+ reference to the C locale_data structures here; let the Makefile -+ decide which ones to include. (In the static linking case, the -+ strong reference to the 'class', 'toupper', and 'tolower' tables -+ will cause C-ctype.o to be brought in, as it should be, even when -+ the reference to _nl_C_LC_CTYPE will be weak.) */ -+#if ! __OPTION_EGLIBC_LOCALE_CODE -+# define DEFINE_CATEGORY(category, category_name, items, a) \ -+ weak_extern (_nl_C_##category) -+# include "categories.def" -+# undef DEFINE_CATEGORY -+#endif -+ - /* Defined in locale/C-ctype.c. */ - extern const char _nl_C_LC_CTYPE_class[] attribute_hidden; - extern const char _nl_C_LC_CTYPE_toupper[] attribute_hidden; -@@ -52,3 +66,26 @@ const struct __locale_struct _nl_C_locobj attribute_hidden = - .__ctype_tolower = (const int *) _nl_C_LC_CTYPE_tolower + 128, - .__ctype_toupper = (const int *) _nl_C_LC_CTYPE_toupper + 128 - }; -+ -+ -+#if ! __OPTION_EGLIBC_LOCALE_CODE -+/* When locale code is enabled, these are each defined in the -+ appropriate lc-CATEGORY.c file, so that static links (when __thread -+ is supported) bring in only those lc-CATEGORY.o files for -+ categories the program actually uses; look for NL_CURRENT_INDIRECT -+ in localeinfo.h. -+ -+ When locale code is disabled, the _nl_C_CATEGORY objects are the -+ only possible referents. At the moment, there isn't a way to get -+ __OPTION_EGLIBC_LOCALE_CODE defined in every compilation unit that -+ #includes localeinfo.h, so we can't just turn off -+ NL_CURRENT_INDIRECT. So we'll define the _nl_current_CATEGORY -+ pointers here. */ -+#if defined (NL_CURRENT_INDIRECT) -+#define DEFINE_CATEGORY(category, category_name, items, a) \ -+ __thread struct __locale_data * const *_nl_current_##category \ -+ attribute_hidden = &_nl_C_locobj.__locales[category]; -+#include "categories.def" -+#undef DEFINE_CATEGORY -+#endif -+#endif /* __OPTION_EGLIBC_LOCALE_CODE */ -diff --git a/localedata/Makefile b/localedata/Makefile -index ebf6ac9..1870753 100644 ---- a/localedata/Makefile -+++ b/localedata/Makefile -@@ -21,12 +21,22 @@ subdir := localedata - - include ../Makeconfig - --# List with all available character set descriptions. --charmaps := $(wildcard charmaps/[A-I]*) $(wildcard charmaps/[J-Z]*) -+include ../option-groups.mak - - # List with all available character set descriptions. --locales := $(wildcard locales/*) -- -+all-charmaps := $(wildcard charmaps/[A-I]*) $(wildcard charmaps/[J-Z]*) -+ -+all-locales := $(wildcard locales/*) -+ -+# If the EGLIBC_LOCALES option group is not enabled, trim the -+# list of charmap and locale source files. -+ifeq ($(OPTION_EGLIBC_LOCALES),y) -+charmaps := $(all-charmaps) -+locales := $(all-locales) -+else -+charmaps := -+locales := locales/POSIX -+endif - - subdir-dirs = tests-mbwc - vpath %.c tests-mbwc -@@ -71,14 +81,20 @@ locale_test_suite := tst_iswalnum tst_iswalpha tst_iswcntrl \ - tst_wcsxfrm tst_wctob tst_wctomb tst_wctrans \ - tst_wctype tst_wcwidth - --tests = $(locale_test_suite) tst-digits tst-setlocale bug-iconv-trans \ -+# Since these tests build their own locale files, they're not -+# dependent on the OPTION_EGLIBC_LOCALES option group. But they do -+# need the locale functions to be present. -+tests-$(OPTION_EGLIBC_LOCALE_CODE) \ -+ += $(locale_test_suite) tst-digits tst-setlocale bug-iconv-trans \ - tst-leaks tst-mbswcs1 tst-mbswcs2 tst-mbswcs3 tst-mbswcs4 tst-mbswcs5 \ - tst-mbswcs6 tst-xlocale1 tst-xlocale2 bug-usesetlocale \ - tst-strfmon1 tst-sscanf bug-setlocale1 tst-setlocale2 tst-setlocale3 \ - tst-wctype -+ifeq (y,$(OPTION_EGLIBC_LOCALE_CODE)) - tests-static = bug-setlocale1-static - tests += $(tests-static) --ifeq (yes,$(build-shared)) -+endif -+ifeq (yesy,$(build-shared)$(OPTION_EGLIBC_LOCALE_CODE)) - ifneq (no,$(PERL)) - tests-special += $(objpfx)mtrace-tst-leaks.out - endif -@@ -95,6 +111,7 @@ tests: $(objdir)/iconvdata/gconv-modules - tests-static += tst-langinfo-static - - ifeq ($(run-built-tests),yes) -+ifeq (y,$(OPTION_EGLIBC_LOCALE_CODE)) - tests-special += $(objpfx)sort-test.out $(objpfx)tst-fmon.out \ - $(objpfx)tst-locale.out $(objpfx)tst-rpmatch.out \ - $(objpfx)tst-trans.out $(objpfx)tst-ctype.out \ -@@ -109,6 +126,7 @@ LOCALES := de_DE.ISO-8859-1 de_DE.UTF-8 en_US.ANSI_X3.4-1968 \ - tr_TR.ISO-8859-9 en_GB.UTF-8 uk_UA.UTF-8 - include ../gen-locales.mk - endif -+endif - - include ../Rules - -@@ -191,6 +209,11 @@ endif - - include SUPPORTED - -+# Only install locale data if OPTION_EGLIBC_LOCALES is selected. -+ifneq ($(OPTION_EGLIBC_LOCALES),y) -+SUPPORTED-LOCALES := -+endif -+ - INSTALL-SUPPORTED-LOCALES=$(addprefix install-, $(SUPPORTED-LOCALES)) - - # Sometimes the whole collection of locale files should be installed. -diff --git a/login/Makefile b/login/Makefile -index 0f4bb22..4036ddb 100644 ---- a/login/Makefile -+++ b/login/Makefile -@@ -18,6 +18,7 @@ - # - # Sub-makefile for login portion of the library. - # -+include ../option-groups.mak - - subdir := login - -@@ -25,14 +26,16 @@ include ../Makeconfig - - headers := utmp.h bits/utmp.h lastlog.h pty.h - --routines := getlogin getlogin_r setlogin getlogin_r_chk \ -- getutent getutent_r getutid getutline getutid_r getutline_r \ -- utmp_file utmpname updwtmp getpt grantpt unlockpt ptsname \ -- ptsname_r_chk -+routines := getpt grantpt unlockpt ptsname ptsname_r_chk -+routines-$(OPTION_EGLIBC_UTMP) \ -+ += getutent getutent_r getutid getutline getutid_r getutline_r \ -+ utmp_file utmpname updwtmp -+routines-$(OPTION_EGLIBC_GETLOGIN) += getlogin getlogin_r getlogin_r_chk -+routines-$(OPTION_EGLIBC_BSD) += setlogin - - CFLAGS-grantpt.c = -DLIBEXECDIR='"$(libexecdir)"' - --others = utmpdump -+others-$(OPTION_EGLIBC_UTMP) += utmpdump - - ifeq (yes,$(build-pt-chown)) - others += pt_chown -@@ -46,8 +49,8 @@ vpath %.c programs - tests := tst-utmp tst-utmpx tst-grantpt tst-ptsname tst-getlogin - - # Build the -lutil library with these extra functions. --extra-libs := libutil --extra-libs-others := $(extra-libs) -+extra-libs-$(OPTION_EGLIBC_UTMP) := libutil -+extra-libs-others := $(extra-libs-y) - - libutil-routines:= login login_tty logout logwtmp openpty forkpty - -diff --git a/malloc/Makefile b/malloc/Makefile -index 67ed293..272ca4d 100644 ---- a/malloc/Makefile -+++ b/malloc/Makefile -@@ -18,6 +18,8 @@ - # - # Makefile for malloc routines - # -+include ../option-groups.mak -+ - subdir := malloc - - include ../Makeconfig -@@ -39,9 +41,15 @@ install-lib := libmcheck.a - non-lib.a := libmcheck.a - - # Additional library. -+ifeq ($(OPTION_EGLIBC_MEMUSAGE),y) - extra-libs = libmemusage - extra-libs-others = $(extra-libs) - -+ifdef OPTION_EGLIBC_MEMUSAGE_DEFAULT_BUFFER_SIZE -+CPPFLAGS-memusage += -D__OPTION_EGLIBC_MEMUSAGE_DEFAULT_BUFFER_SIZE=$(OPTION_EGLIBC_MEMUSAGE_DEFAULT_BUFFER_SIZE) -+endif -+endif -+ - libmemusage-routines = memusage - libmemusage-inhibit-o = $(filter-out .os,$(object-suffixes)) - -@@ -71,7 +79,7 @@ endif - # Unless we get a test for the availability of libgd which also works - # for cross-compiling we disable the memusagestat generation in this - # situation. --ifneq ($(cross-compiling),yes) -+ifeq ($(cross-compiling)$(OPTION_EGLIBC_MEMUSAGE),noy) - # If the gd library is available we build the `memusagestat' program. - ifneq ($(LIBGD),no) - others: $(objpfx)memusage -diff --git a/malloc/memusage.c b/malloc/memusage.c -index a57ba8e..732ba9d 100644 ---- a/malloc/memusage.c -+++ b/malloc/memusage.c -@@ -33,6 +33,7 @@ - #include <stdint.h> - #include <sys/mman.h> - #include <sys/time.h> -+#include <gnu/option-groups.h> - - #include <memusage.h> - -@@ -93,7 +94,11 @@ static __thread uintptr_t start_sp; - #define peak_stack peak_use[1] - #define peak_total peak_use[2] - --#define DEFAULT_BUFFER_SIZE 32768 -+#ifndef __OPTION_EGLIBC_MEMUSAGE_DEFAULT_BUFFER_SIZE -+# define DEFAULT_BUFFER_SIZE 32768 -+#else -+# define DEFAULT_BUFFER_SIZE __OPTION_EGLIBC_MEMUSAGE_DEFAULT_BUFFER_SIZE -+#endif - static size_t buffer_size; - - static int fd = -1; -diff --git a/malloc/memusage.sh b/malloc/memusage.sh -index 8ab8cc2..d18f446 100755 ---- a/malloc/memusage.sh -+++ b/malloc/memusage.sh -@@ -35,7 +35,7 @@ do_missing_arg() { - - # Print help message - do_help() { -- echo $"Usage: memusage [OPTION]... PROGRAM [PROGRAMOPTION]... -+ printf $"Usage: memusage [OPTION]... PROGRAM [PROGRAMOPTION]... - Profile memory usage of PROGRAM. - - -n,--progname=NAME Name of the program file to profile -diff --git a/math/Makefile b/math/Makefile -index 6388bae..ed1c511 100644 ---- a/math/Makefile -+++ b/math/Makefile -@@ -21,6 +21,8 @@ subdir := math - - include ../Makeconfig - -+include ../option-groups.mak -+ - # Installed header files. - headers := math.h bits/mathcalls.h bits/mathinline.h bits/huge_val.h \ - bits/huge_valf.h bits/huge_vall.h bits/inf.h bits/nan.h \ -@@ -34,8 +36,8 @@ aux := setfpucw fpu_control - - # Build the -lm library. - --extra-libs := libm --extra-libs-others = $(extra-libs) -+extra-libs-$(OPTION_EGLIBC_LIBM) := libm -+extra-libs-others-$(OPTION_EGLIBC_LIBM) = $(extra-libs-$(OPTION_EGLIBC_LIBM)) - - libm-support = s_lib_version s_matherr s_signgam \ - fclrexcpt fgetexcptflg fraiseexcpt fsetexcptflg \ -diff --git a/misc/Makefile b/misc/Makefile -index aecb0da..e6b7c23 100644 ---- a/misc/Makefile -+++ b/misc/Makefile -@@ -19,6 +19,10 @@ - # Sub-makefile for misc portion of the library. - # - -+# Some system-dependent implementations of these functions use option -+# groups (see sysdeps/unix/sysv/linux/Makefile, for example). -+include ../option-groups.mak -+ - subdir := misc - - include ../Makeconfig -@@ -46,40 +50,47 @@ routines := brk sbrk sstk ioctl \ - select pselect \ - acct chroot fsync sync fdatasync syncfs reboot \ - gethostid sethostid \ -- revoke vhangup \ -+ vhangup \ - swapon swapoff mktemp mkstemp mkstemp64 mkdtemp \ - mkostemp mkostemp64 mkstemps mkstemps64 mkostemps mkostemps64 \ - ualarm usleep \ - gtty stty \ - ptrace \ -- fstab mntent mntent_r \ -+ mntent mntent_r \ - utimes lutimes futimes futimesat \ - truncate ftruncate truncate64 ftruncate64 \ -- chflags fchflags \ - insremque getttyent getusershell getpass ttyslot \ - syslog syscall daemon \ - mmap mmap64 munmap mprotect msync madvise mincore remap_file_pages\ - mlock munlock mlockall munlockall \ -- efgcvt efgcvt_r qefgcvt qefgcvt_r \ - hsearch hsearch_r tsearch lsearch \ - err error ustat \ -- getsysstats dirname regexp \ -+ getsysstats dirname \ - getloadavg getclktck \ - fgetxattr flistxattr fremovexattr fsetxattr getxattr \ - listxattr lgetxattr llistxattr lremovexattr lsetxattr \ - removexattr setxattr getauxval ifunc-impl-list - -+routines-$(OPTION_POSIX_REGEXP) += regexp -+routines-$(OPTION_EGLIBC_FSTAB) += fstab -+routines-$(OPTION_EGLIBC_BSD) += chflags fchflags revoke -+routines-$(OPTION_EGLIBC_FCVT) += efgcvt efgcvt_r qefgcvt qefgcvt_r -+ - generated += tst-error1.mtrace tst-error1-mem.out - - aux := init-misc - install-lib := libg.a - gpl2lgpl := error.c error.h - --tests := tst-dirname tst-tsearch tst-fdset tst-efgcvt tst-mntent tst-hsearch \ -- tst-error1 tst-pselect tst-insremque tst-mntent2 bug-hsearch1 -+tests := tst-dirname tst-tsearch tst-fdset tst-mntent tst-hsearch \ -+ tst-pselect tst-insremque tst-mntent2 bug-hsearch1 -+tests-$(OPTION_POSIX_WIDE_CHAR_DEVICE_IO) += tst-error1 -+tests-$(OPTION_EGLIBC_FCVT) += tst-efgcvt - ifeq ($(run-built-tests),yes) -+ifeq (y,$(OPTION_POSIX_WIDE_CHAR_DEVICE_IO)) - tests-special += $(objpfx)tst-error1-mem.out - endif -+endif - - CFLAGS-select.c = -fexceptions -fasynchronous-unwind-tables - CFLAGS-tsearch.c = $(uses-callbacks) -diff --git a/misc/err.c b/misc/err.c -index 7b98157..efce8d5 100644 ---- a/misc/err.c -+++ b/misc/err.c -@@ -22,6 +22,7 @@ - #include <errno.h> - #include <string.h> - #include <stdio.h> -+#include <gnu/option-groups.h> - - #include <wchar.h> - #define flockfile(s) _IO_flockfile (s) -@@ -37,6 +38,7 @@ extern char *__progname; - va_end (ap); \ - } - -+#if __OPTION_POSIX_WIDE_CHAR_DEVICE_IO - static void - convert_and_print (const char *format, __gnuc_va_list ap) - { -@@ -81,6 +83,7 @@ convert_and_print (const char *format, __gnuc_va_list ap) - - __vfwprintf (stderr, wformat, ap); - } -+#endif - - void - vwarnx (const char *format, __gnuc_va_list ap) -@@ -88,9 +91,13 @@ vwarnx (const char *format, __gnuc_va_list ap) - flockfile (stderr); - if (_IO_fwide (stderr, 0) > 0) - { -+#if __OPTION_POSIX_WIDE_CHAR_DEVICE_IO - __fwprintf (stderr, L"%s: ", __progname); - convert_and_print (format, ap); - putwc_unlocked (L'\n', stderr); -+#else -+ abort (); -+#endif - } - else - { -@@ -111,6 +118,7 @@ vwarn (const char *format, __gnuc_va_list ap) - flockfile (stderr); - if (_IO_fwide (stderr, 0) > 0) - { -+#if __OPTION_POSIX_WIDE_CHAR_DEVICE_IO - __fwprintf (stderr, L"%s: ", __progname); - if (format) - { -@@ -119,6 +127,9 @@ vwarn (const char *format, __gnuc_va_list ap) - } - __set_errno (error); - __fwprintf (stderr, L"%m\n"); -+#else -+ abort (); -+#endif - } - else - { -diff --git a/misc/error.c b/misc/error.c -index aaa120d..d6cbc82 100644 ---- a/misc/error.c -+++ b/misc/error.c -@@ -35,6 +35,7 @@ - #endif - - #ifdef _LIBC -+# include <gnu/option-groups.h> - # include <libintl.h> - # include <stdbool.h> - # include <stdint.h> -@@ -205,6 +206,7 @@ error_tail (int status, int errnum, const char *message, va_list args) - #if _LIBC - if (_IO_fwide (stderr, 0) > 0) - { -+#if __OPTION_POSIX_WIDE_CHAR_DEVICE_IO - size_t len = strlen (message) + 1; - wchar_t *wmessage = NULL; - mbstate_t st; -@@ -265,6 +267,9 @@ error_tail (int status, int errnum, const char *message, va_list args) - - if (use_malloc) - free (wmessage); -+#else -+ abort (); -+#endif - } - else - #endif -diff --git a/misc/tst-efgcvt.c b/misc/tst-efgcvt.c -index 5083fec..79ed36c 100644 ---- a/misc/tst-efgcvt.c -+++ b/misc/tst-efgcvt.c -@@ -59,7 +59,7 @@ static testcase ecvt_tests[] = - { 123.01, -4, 3, "" }, - { 126.71, -4, 3, "" }, - { 0.0, 4, 1, "0000" }, --#if DBL_MANT_DIG == 53 -+#if DBL_MANT_DIG == 53 && !(defined __powerpc__ && defined __NO_FPRS__ && !defined _SOFT_FLOAT && !defined _SOFT_DOUBLE) - { 0x1p-1074, 3, -323, "494" }, - { -0x1p-1074, 3, -323, "494" }, - #endif -diff --git a/nis/Makefile b/nis/Makefile -index 037e674..c967850 100644 ---- a/nis/Makefile -+++ b/nis/Makefile -@@ -18,6 +18,8 @@ - # - # Makefile for NIS/NIS+ part. - # -+include ../option-groups.mak -+ - subdir := nis - - include ../Makeconfig -@@ -30,19 +32,26 @@ endif - - # These are the databases available for the nis (and perhaps later nisplus) - # service. This must be a superset of the services in nss. --databases = proto service hosts network grp pwd rpc ethers \ -- spwd netgrp alias publickey -+databases-y := proto service hosts network grp pwd rpc ethers \ -+ spwd netgrp publickey -+databases-$(OPTION_EGLIBC_DB_ALIASES) += alias - - # Specify rules for the nss_* modules. --services := nis nisplus compat -+# The 'compat' module includes nis support, and the 'nss' directory -+# includes a bare-bones "files" library, so we'll include 'compat' in -+# OPTION_EGLIBC_NIS. -+services-y := -+services-$(OPTION_EGLIBC_NIS) += nis nisplus compat -+ -+extra-libs-$(OPTION_EGLIBC_NIS) += libnsl -+extra-libs-y += $(services-y:%=libnss_%) - --extra-libs = libnsl $(services:%=libnss_%) - # These libraries will be built in the `others' pass rather than - # the `lib' pass, because they depend on libc.so being built already. --extra-libs-others = $(extra-libs) -+extra-libs-others-y += $(extra-libs-y) - - # The sources are found in the appropriate subdir. --subdir-dirs = $(services:%=nss_%) -+subdir-dirs = $(services-y:%=nss_%) - vpath %.c $(subdir-dirs) - - libnsl-routines = yp_xdr ypclnt ypupdate_xdr \ -@@ -60,11 +69,11 @@ libnsl-routines = yp_xdr ypclnt ypupdate_xdr \ - libnss_compat-routines := $(addprefix compat-,grp pwd spwd initgroups) - libnss_compat-inhibit-o = $(filter-out .os,$(object-suffixes)) - --libnss_nis-routines := $(addprefix nis-,$(databases)) nis-initgroups \ -+libnss_nis-routines := $(addprefix nis-,$(databases-y)) nis-initgroups \ - nss-nis - libnss_nis-inhibit-o = $(filter-out .os,$(object-suffixes)) - --libnss_nisplus-routines := $(addprefix nisplus-,$(databases)) nisplus-parser \ -+libnss_nisplus-routines := $(addprefix nisplus-,$(databases-y)) nisplus-parser \ - nss-nisplus nisplus-initgroups - libnss_nisplus-inhibit-o = $(filter-out .os,$(object-suffixes)) - -@@ -80,12 +89,12 @@ libnsl-libc = $(common-objpfx)linkobj/libc.so - # Target-specific variable setting to link objects using deprecated - # RPC interfaces with the version of libc.so that makes them available - # for new links: --$(services:%=$(objpfx)libnss_%.so) $(objpfx)libnsl.so: \ -+$(services-y:%=$(objpfx)libnss_%.so) $(objpfx)libnsl.so: \ - libc-for-link = $(libnsl-libc) - - - ifeq ($(build-shared),yes) --$(others:%=$(objpfx)%): $(objpfx)libnsl.so$(libnsl.so-version) -+$(others-y:%=$(objpfx)%): $(objpfx)libnsl.so$(libnsl.so-version) - else --$(others:%=$(objpfx)%): $(objpfx)libnsl.a -+$(others-y:%=$(objpfx)%): $(objpfx)libnsl.a - endif -diff --git a/nptl/Makefile b/nptl/Makefile -index aaca0a4..596ca3c 100644 ---- a/nptl/Makefile -+++ b/nptl/Makefile -@@ -18,6 +18,8 @@ - # - # Sub-makefile for NPTL portion of the library. - # -+include ../option-groups.mak -+ - subdir := nptl - - include ../Makeconfig -@@ -118,7 +120,7 @@ libpthread-routines = nptl-init vars events version pt-interp \ - pt-raise pt-system \ - flockfile ftrylockfile funlockfile \ - sigaction \ -- herrno res pt-allocrtsig \ -+ pt-allocrtsig \ - pthread_kill_other_threads \ - pthread_getaffinity pthread_setaffinity \ - pthread_attr_getaffinity pthread_attr_setaffinity \ -@@ -138,8 +140,10 @@ libpthread-routines = nptl-init vars events version pt-interp \ - # pthread_setgid pthread_setegid pthread_setregid \ - # pthread_setresgid - -+libpthread-routines-$(OPTION_EGLIBC_INET) := herrno res - libpthread-shared-only-routines = version pt-interp pt-allocrtsig \ - unwind-forcedunwind -+ - libpthread-static-only-routines = pthread_atfork - - # Since cancellation handling is in large parts handled using exceptions -@@ -220,7 +224,7 @@ tests = tst-typesizes \ - tst-mutexpi1 tst-mutexpi2 tst-mutexpi3 tst-mutexpi4 tst-mutexpi5 \ - tst-mutexpi5a tst-mutexpi6 tst-mutexpi7 tst-mutexpi7a tst-mutexpi8 \ - tst-mutexpi9 \ -- tst-spin1 tst-spin2 tst-spin3 tst-spin4 \ -+ tst-spin1 tst-spin2 tst-spin3 \ - tst-cond1 tst-cond2 tst-cond3 tst-cond4 tst-cond5 tst-cond6 tst-cond7 \ - tst-cond8 tst-cond9 tst-cond10 tst-cond11 tst-cond12 tst-cond13 \ - tst-cond14 tst-cond15 tst-cond16 tst-cond17 tst-cond18 tst-cond19 \ -@@ -256,14 +260,14 @@ tests = tst-typesizes \ - tst-cancel6 tst-cancel7 tst-cancel8 tst-cancel9 tst-cancel10 \ - tst-cancel11 tst-cancel12 tst-cancel13 tst-cancel14 tst-cancel15 \ - tst-cancel16 tst-cancel17 tst-cancel18 tst-cancel19 tst-cancel20 \ -- tst-cancel21 tst-cancel22 tst-cancel23 tst-cancel24 tst-cancel25 \ -+ tst-cancel21 tst-cancel22 tst-cancel23 tst-cancel25 \ - tst-cancel-self tst-cancel-self-cancelstate \ - tst-cancel-self-canceltype tst-cancel-self-testcancel \ - tst-cleanup0 tst-cleanup1 tst-cleanup2 tst-cleanup3 tst-cleanup4 \ - tst-flock1 tst-flock2 \ - tst-signal1 tst-signal2 tst-signal3 tst-signal4 tst-signal5 \ - tst-signal6 tst-signal7 \ -- tst-exec1 tst-exec2 tst-exec3 tst-exec4 \ -+ tst-exec2 tst-exec3 tst-exec4 \ - tst-exit1 tst-exit2 tst-exit3 \ - tst-stdio1 tst-stdio2 \ - tst-stack1 tst-stack2 tst-stack3 tst-stack4 tst-pthread-getattr \ -@@ -271,13 +275,12 @@ tests = tst-typesizes \ - tst-unload \ - tst-dlsym1 \ - tst-sysconf \ -- tst-locale1 tst-locale2 \ -+ tst-locale2 \ - tst-umask1 \ - tst-popen1 \ - tst-clock1 \ - tst-context1 \ - tst-sched1 \ -- tst-backtrace1 \ - tst-abstime \ - tst-vfork1 tst-vfork2 tst-vfork1x tst-vfork2x \ - tst-getpid3 \ -@@ -288,9 +291,16 @@ xtests = tst-setuid1 tst-setuid1-static tst-setuid2 \ - tst-mutexpp1 tst-mutexpp6 tst-mutexpp10 - test-srcs = tst-oddstacklimit - --# Test expected to fail on most targets (except x86_64) due to bug --# 18435 - pthread_once hangs when init routine throws an exception. --test-xfail-tst-once5 = yes -+# This test uses the posix_spawn functions. -+tests-$(OPTION_EGLIBC_SPAWN) += tst-exec1 -+ -+# This test uses the 'backtrace' functions. -+tests-$(OPTION_EGLIBC_BACKTRACE) += tst-backtrace1 -+ -+# This test is written in C++. -+tests-$(OPTION_EGLIBC_CXX_TESTS) += tst-cancel24 -+ -+tests-$(OPTION_EGLIBC_LOCALE_CODE) += tst-locale1 - - # Files which must not be linked with libpthread. - tests-nolibpthread = tst-unload -diff --git a/nptl/pthread_create.c b/nptl/pthread_create.c -index d10f4ea..14257ce 100644 ---- a/nptl/pthread_create.c -+++ b/nptl/pthread_create.c -@@ -33,6 +33,7 @@ - #include <default-sched.h> - #include <futex-internal.h> - -+#include <gnu/option-groups.h> - #include <shlib-compat.h> - - #include <stap-probe.h> -@@ -262,8 +263,10 @@ START_THREAD_DEFN - THREAD_SETMEM (pd, cpuclock_offset, now); - #endif - -+#if __OPTION_EGLIBC_INET - /* Initialize resolver state pointer. */ - __resp = &pd->res; -+#endif - - /* Initialize pointers to locale data. */ - __ctype_init (); -@@ -346,8 +349,10 @@ START_THREAD_DEFN - /* Run the destructor for the thread-local data. */ - __nptl_deallocate_tsd (); - -+#if __OPTION_EGLIBC_INET - /* Clean up any state libc stored in thread-local variables. */ - __libc_thread_freeres (); -+#endif - - /* If this is the last thread we terminate the process now. We - do not notify the debugger, it might just irritate it if there -diff --git a/nscd/Makefile b/nscd/Makefile -index ede941d..f4f3f8d 100644 ---- a/nscd/Makefile -+++ b/nscd/Makefile -@@ -18,14 +18,17 @@ - # - # Sub-makefile for nscd portion of the library. - # -+include ../option-groups.mak -+ - subdir := nscd - - include ../Makeconfig - - ifneq ($(use-nscd),no) --routines := nscd_getpw_r nscd_getgr_r nscd_gethst_r nscd_getai \ -+routines-$(OPTION_EGLIBC_INET) += \ -+ nscd_getpw_r nscd_getgr_r nscd_gethst_r nscd_getai \ - nscd_initgroups nscd_getserv_r nscd_netgroup --aux := nscd_helper -+aux-$(OPTION_EGLIBC_INET) += nscd_helper - endif - - # To find xmalloc.c -@@ -37,14 +40,18 @@ nscd-modules := nscd connections pwdcache getpwnam_r getpwuid_r grpcache \ - dbg_log nscd_conf nscd_stat cache mem nscd_setup_thread \ - xmalloc xstrdup aicache initgrcache gai res_hconf \ - netgroupcache -- -+ifneq (y,$(OPTION_EGLIBC_NIS)) -+# If we haven't build libnsl.so, then we'll need to include our -+# own copy of nis_hash. -+nscd-modules += nis_hash -+endif - ifeq ($(build-nscd)$(have-thread-library),yesyes) - --others += nscd --others-pie += nscd --install-sbin := nscd -+others-$(OPTION_EGLIBC_INET) += nscd -+others-pie-$(OPTION_EGLIBC_INET) += nscd -+install-sbin-$(OPTION_EGLIBC_INET) += nscd - --extra-objs = $(nscd-modules:=.o) -+extra-objs-$(OPTION_EGLIBC_INET) += $(nscd-modules:=.o) - - endif - -@@ -100,7 +107,15 @@ include $(patsubst %,$(..)cppflags-iterator.mk,$(cpp-srcs-left)) - $(objpfx)nscd: $(nscd-modules:%=$(objpfx)%.o) - - ifeq ($(build-shared),yes) --$(objpfx)nscd: $(shared-thread-library) $(common-objpfx)nis/libnsl.so -+$(objpfx)nscd: $(shared-thread-library) -+else -+$(objpfx)nscd: $(static-thread-library) -+endif -+ -+ifeq (y,$(OPTION_EGLIBC_NIS)) -+ifeq ($(build-shared),yes) -+$(objpfx)nscd: $(common-objpfx)nis/libnsl.so - else --$(objpfx)nscd: $(static-thread-library) $(common-objpfx)nis/libnsl.a -+$(objpfx)nscd: $(common-objpfx)nis/libnsl.a -+endif - endif -diff --git a/nscd/nis_hash.c b/nscd/nis_hash.c -new file mode 100644 -index 0000000..d244c41 ---- /dev/null -+++ b/nscd/nis_hash.c -@@ -0,0 +1,3 @@ -+/* If OPTION_EGLIBC_NIS is disabled, nscd can't get this from libnsl.so; -+ we need our own copy. */ -+#include "../nis/nis_hash.c" -diff --git a/nss/Makefile b/nss/Makefile -index 65ab7b5..19f0aef 100644 ---- a/nss/Makefile -+++ b/nss/Makefile -@@ -18,28 +18,35 @@ - # - # Makefile for name service switch. - # -+include ../option-groups.mak -+ - subdir := nss - - include ../Makeconfig - - headers := nss.h - --# This is the trivial part which goes into libc itself. --routines = nsswitch getnssent getnssent_r digits_dots \ -- $(addsuffix -lookup,$(databases)) -- - # These are the databases that go through nss dispatch. - # Caution: if you add a database here, you must add its real name - # in databases.def, too. --databases = proto service hosts network grp pwd ethers \ -- spwd netgrp alias sgrp -+databases-y = grp pwd spwd sgrp -+databases-$(OPTION_EGLIBC_INET) \ -+ += proto service hosts network ethers \ -+ netgrp -+databases-$(OPTION_EGLIBC_DB_ALIASES) += alias -+ -+routines-$(OPTION_EGLIBC_INET) += digits_dots - - ifneq (,$(filter sunrpc,$(subdirs))) --databases += key rpc -+databases-$(OPTION_EGLIBC_INET) += key rpc - have-sunrpc := 1 - else - have-sunrpc := 0 - endif -+# This is the trivial part which goes into libc itself. -+routines-y += nsswitch getnssent getnssent_r \ -+ $(addsuffix -lookup,$(databases-y)) -+ - CPPFLAGS-getent.c = -DHAVE_SUNRPC=$(have-sunrpc) - - others := getent makedb -@@ -47,8 +54,9 @@ install-bin := getent makedb - makedb-modules = xmalloc hash-string - extra-objs += $(makedb-modules:=.o) - --tests = test-netdb tst-nss-test1 test-digits-dots tst-nss-getpwent --xtests = bug-erange -+tests = tst-nss-test1 tst-nss-getpwent -+tests-$(OPTION_EGLIBC_INET) += test-netdb test-digits-dots -+xtests-$(OPTION_EGLIBC_INET) += bug-erange - - # Specify rules for the nss_* modules. We have some services. - services := files db -@@ -63,7 +71,7 @@ subdir-dirs = $(services:%=nss_%) - vpath %.c $(subdir-dirs) ../locale/programs ../intl - - --libnss_files-routines := $(addprefix files-,$(databases)) \ -+libnss_files-routines := $(addprefix files-,$(databases-y)) \ - files-initgroups files-have_o_cloexec files-init - - libnss_db-dbs := $(addprefix db-,\ -@@ -86,6 +94,45 @@ tests-static = tst-nss-static - tests += $(tests-static) - endif - -+ifneq ($(OPTION_EGLIBC_NSSWITCH),y) -+ -+ifndef OPTION_EGLIBC_NSSWITCH_FIXED_CONFIG -+$(error OPTION_EGLIBC_NSSWITCH_FIXED_CONFIG variable left unset) -+endif -+ -+ifndef OPTION_EGLIBC_NSSWITCH_FIXED_FUNCTIONS -+$(error OPTION_EGLIBC_NSSWITCH_FIXED_FUNCTIONS variable left unset) -+endif -+ -+ifeq (,$(wildcard $(OPTION_EGLIBC_NSSWITCH_FIXED_CONFIG))) -+$(warning OPTION_EGLIBC_NSSWITCH is disabled, but fixed config file) -+$(error does not exist: $(OPTION_EGLIBC_NSSWITCH_FIXED_CONFIG)) -+endif -+ -+ifeq (,$(wildcard $(OPTION_EGLIBC_NSSWITCH_FIXED_FUNCTIONS))) -+$(warning OPTION_EGLIBC_NSSWITCH is disabled, but fixed functions file) -+$(error does not exist: $(OPTION_EGLIBC_NSSWITCH_FIXED_FUNCTIONS)) -+endif -+ -+before-compile := $(objpfx)fixed-nsswitch.h -+generated := fixed-nsswitch.h -+$(objpfx)fixed-nsswitch.h $(objfpx)fixed-nsswitch-libs: \ -+ $(objpfx)gen-fixed-nsswitch \ -+ $(OPTION_EGLIBC_NSSWITCH_FIXED_CONFIG) -+ $< $(objpfx)fixed-nsswitch.h \ -+ $(objpfx)fixed-nsswitch-libs \ -+ $(OPTION_EGLIBC_NSSWITCH_FIXED_CONFIG) -+ -+$(objpfx)gen-fixed-nsswitch: gen-fixed-nsswitch.c \ -+ $(common-objpfx)option-groups.config \ -+ $(OPTION_EGLIBC_NSSWITCH_FIXED_FUNCTIONS) -+ $(native-compile) -+gen-fixed-nsswitch-CFLAGS = \ -+ -g3 -O -Wall \ -+ -I $(objpfx) \ -+ -DFIXED_FUNCTIONS='"$(OPTION_EGLIBC_NSSWITCH_FIXED_FUNCTIONS)"' -+endif -+ - include ../Rules - - ifeq (yes,$(have-selinux)) -diff --git a/nss/fixed-nsswitch.conf b/nss/fixed-nsswitch.conf -new file mode 100644 -index 0000000..91bb675 ---- /dev/null -+++ b/nss/fixed-nsswitch.conf -@@ -0,0 +1,22 @@ -+# /etc/nsswitch.conf -+# -+# Example configuration for fixed name service. -+# See the description of OPTION_EGLIBC_NSSWITCH in option-groups.def -+# for details. -+# -+ -+aliases: files -+ -+passwd: files -+group: files -+shadow: files -+ -+hosts: files dns -+networks: files dns -+ -+protocols: files -+services: files -+ethers: files -+rpc: files -+ -+netgroup: files -diff --git a/nss/fixed-nsswitch.functions b/nss/fixed-nsswitch.functions -new file mode 100644 -index 0000000..2f3fa83 ---- /dev/null -+++ b/nss/fixed-nsswitch.functions -@@ -0,0 +1,121 @@ -+/* List of functions defined for fixed NSS in GNU C Library. -+ Copyright (C) 1996, 1997, 1998, 2005 Free Software Foundation, Inc. -+ This file is part of the GNU C Library. -+ -+ The GNU C 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.1 of the License, or (at your option) any later version. -+ -+ The GNU C 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 the GNU C Library; if not, write to the Free -+ Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA -+ 02111-1307 USA. */ -+ -+/* When OPTION_EGLIBC_NSSWITCH is disabled (see option-groups.def), -+ EGLIBC does not use the 'dlopen' and 'dlsym' functions to look for -+ database query functions in the individual name service libraries. -+ Instead, it uses a set of functions chosen at compile time, as -+ directed by the OPTION_EGLIBC_NSSWITCH_FIXED_FUNCTIONS file. This -+ file is a sample of what you might use there. -+ -+ This file is C source code; it should only contain invocations of -+ the following macros: -+ -+ - DEFINE_ENT (DATABASE, SERVICE, X) -+ -+ Declare the 'setXent', 'getXent_r', and 'endXent' functions that -+ query DATABASE using the service library 'libnss_SERVICE.so.2'. -+ DATABASE should be the full name of the database as it appears in -+ 'nsswitch.conf', like 'passwd' or 'aliases'. -+ -+ (The non-reentrant 'getXent' functions are implemented in terms -+ of the reentrant 'getXent_r' functions, so there is no need to -+ refer to them explicitly here.) -+ -+ - DEFINE_GETBY (DATABASE, SERVICE, X, KEY) -+ -+ Declare the 'getXbyKEY_r' functions that query DATABASE using -+ SERVICE. DATABASE and SERVICE are as described above. -+ -+ (The non-reentrant 'getXbyKEY' functions are implemented in terms -+ of the reentrant 'getXbyKEY_r' functions, so there is no need to -+ refer to them explicitly here.) -+ -+ Use the special key 'name3' for the service library function that -+ implements the 'getaddrinfo' function. -+ -+ - DEFINE_GET (DATABASE, SERVICE, QUERY) -+ -+ Declare the 'getQUERY_r' functions that query DATABASE using -+ SERVICE. This is used for functions like 'getpwnam'. -+ -+ (The non-reentrant 'getQUERY' functions are implemented in terms -+ of the reentrant 'getQUERY_r' functions, so there is no need to -+ refer to them explicitly here.) -+ -+ This sample file only includes functions that consult the files in -+ '/etc', and the Domain Name System (DNS). */ -+ -+/* aliases */ -+DEFINE_ENT (aliases, files, alias) -+DEFINE_GETBY (aliases, files, alias, name) -+ -+/* ethers */ -+DEFINE_ENT (ethers, files, ether) -+ -+/* group */ -+DEFINE_ENT (group, files, gr) -+DEFINE_GET (group, files, grgid) -+DEFINE_GET (group, files, grnam) -+ -+/* hosts */ -+DEFINE_ENT (hosts, files, host) -+DEFINE_GETBY (hosts, files, host, addr) -+DEFINE_GETBY (hosts, files, host, name) -+DEFINE_GETBY (hosts, files, host, name2) -+DEFINE_GET (hosts, files, hostton) -+DEFINE_GET (hosts, files, ntohost) -+DEFINE_GETBY (hosts, dns, host, addr) -+DEFINE_GETBY (hosts, dns, host, name) -+DEFINE_GETBY (hosts, dns, host, name2) -+DEFINE_GETBY (hosts, dns, host, name3) -+ -+/* netgroup */ -+DEFINE_ENT (netgroup, files, netgr) -+ -+/* networks */ -+DEFINE_ENT (networks, files, net) -+DEFINE_GETBY (networks, files, net, name) -+DEFINE_GETBY (networks, files, net, addr) -+DEFINE_GETBY (networks, dns, net, name) -+DEFINE_GETBY (networks, dns, net, addr) -+ -+/* protocols */ -+DEFINE_ENT (protocols, files, proto) -+DEFINE_GETBY (protocols, files, proto, name) -+DEFINE_GETBY (protocols, files, proto, number) -+ -+/* passwd */ -+DEFINE_ENT (passwd, files, pw) -+DEFINE_GET (passwd, files, pwnam) -+DEFINE_GET (passwd, files, pwuid) -+ -+/* rpc */ -+DEFINE_ENT (rpc, files, rpc) -+DEFINE_GETBY (rpc, files, rpc, name) -+DEFINE_GETBY (rpc, files, rpc, number) -+ -+/* services */ -+DEFINE_ENT (services, files, serv) -+DEFINE_GETBY (services, files, serv, name) -+DEFINE_GETBY (services, files, serv, port) -+ -+/* shadow */ -+DEFINE_ENT (shadow, files, sp) -+DEFINE_GET (shadow, files, spnam) -diff --git a/nss/gen-fixed-nsswitch.c b/nss/gen-fixed-nsswitch.c -new file mode 100644 -index 0000000..6e1c98c ---- /dev/null -+++ b/nss/gen-fixed-nsswitch.c -@@ -0,0 +1,803 @@ -+/* gen-fixed-nsswitch.c --- generate fixed name service data structures -+ Copyright (C) 1996-1999, 2001-2006, 2007 Free Software Foundation, Inc. -+ This file is part of the GNU C Library. -+ -+ The GNU C 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.1 of the License, or (at your option) any later version. -+ -+ The GNU C 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 the GNU C Library; if not, write to the Free -+ Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA -+ 02111-1307 USA. */ -+ -+#define _GNU_SOURCE -+ -+#include <stdlib.h> -+#include <stdio.h> -+#include <errno.h> -+#include <string.h> -+#include <stdarg.h> -+#include <assert.h> -+#include <ctype.h> -+ -+#include "gnu/lib-names.h" -+#include "nss.h" -+ -+/* Provide a fallback definition to allow this file to be compiled outside -+ libc. */ -+#ifndef internal_function -+# define internal_function -+#endif -+ -+ -+/* Simple utilities. */ -+ -+void __attribute__ ((noreturn)) -+error (const char *message) -+{ -+ fprintf (stderr, "%s\n", message); -+ exit (1); -+} -+ -+ -+void * -+check_alloc (void *p) -+{ -+ if (p) -+ return p; -+ else -+ error ("out of memory"); -+} -+ -+void * -+xmalloc (size_t size) -+{ -+ return check_alloc (malloc (size)); -+} -+ -+ -+/* Format ARGS according to FORMAT, and return the result as a -+ malloc'ed string. */ -+char * -+saprintf (const char *format, ...) -+{ -+ va_list args; -+ size_t len; -+ char *buf; -+ -+ va_start (args, format); -+ len = vsnprintf (NULL, 0, format, args); -+ va_end (args); -+ -+ buf = xmalloc (len + 1); -+ va_start (args, format); -+ assert (len == vsnprintf (buf, len + 1, format, args)); -+ va_end (args); -+ -+ return buf; -+} -+ -+ -+ -+/* Data structures representing the configuration file in memory. */ -+ -+/* These are copied from nsswitch.h. -+ -+ We could simply #include that file, but this program runs on the -+ build machine and links against the build machine's libraries, -+ whereas that header is meant for use by target code; it uses -+ 'libc_hidden_proto', 'internal_function', and related hair. Since -+ we've copied the parsing code, we might as well copy the data -+ structure definitions as well. */ -+ -+/* Actions performed after lookup finished. */ -+typedef enum -+{ -+ NSS_ACTION_CONTINUE, -+ NSS_ACTION_RETURN -+} lookup_actions; -+ -+ -+typedef struct service_library -+{ -+ /* Name of service (`files', `dns', `nis', ...). */ -+ const char *name; -+ /* Pointer to the loaded shared library. */ -+ void *lib_handle; -+ /* And the link to the next entry. */ -+ struct service_library *next; -+} service_library; -+ -+ -+/* For mapping a function name to a function pointer. It is known in -+ nsswitch.c:nss_lookup_function that a string pointer for the lookup key -+ is the first member. */ -+typedef struct -+{ -+ const char *fct_name; -+ void *fct_ptr; -+} known_function; -+ -+ -+typedef struct service_user -+{ -+ /* And the link to the next entry. */ -+ struct service_user *next; -+ /* Action according to result. */ -+ lookup_actions actions[5]; -+ /* Link to the underlying library object. */ -+ service_library *library; -+ /* Collection of known functions. -+ -+ With OPTION_EGLIBC_NSSWITCH enabled, this is the root of a -+ 'tsearch'-style tree. -+ -+ With OPTION_EGLIBC_NSSWITCH disabled, this is an array of -+ pointers to known_function structures, NULL-terminated. */ -+ union -+ { -+ void *tree; -+ const known_function **array; -+ } known; -+ /* Name of the service (`files', `dns', `nis', ...). */ -+ const char *name; -+} service_user; -+ -+/* To access the action based on the status value use this macro. */ -+#define nss_next_action(ni, status) ((ni)->actions[2 + status]) -+ -+ -+typedef struct name_database_entry -+{ -+ /* And the link to the next entry. */ -+ struct name_database_entry *next; -+ /* List of service to be used. */ -+ service_user *service; -+ /* Name of the database. */ -+ const char *name; -+} name_database_entry; -+ -+ -+typedef struct name_database -+{ -+ /* List of all known databases. */ -+ name_database_entry *entry; -+ /* List of libraries with service implementation. */ -+ service_library *library; -+} name_database; -+ -+ -+ -+/* Gathering the contents of the FIXED_FUNCTIONS file. */ -+ -+/* It should be possible to generate this list automatically by -+ looking at the services and databases used in the nsswitch.conf -+ file, and having a hard-coded set of queries supported on each -+ database. */ -+ -+/* We #include the FIXED_FUNCTIONS file several times to build an -+ array of function structures holding its data. */ -+enum function_kind { -+ fk_end = 0, /* Last entry. */ -+ fk_setent, /* Like setpwent. */ -+ fk_getent, /* Like getpwent. */ -+ fk_endent, /* Like endpwent. */ -+ fk_getby, /* Like gethostbyname. */ -+ fk_get /* Like getpwnam. */ -+}; -+ -+ -+struct function { -+ /* What kind of function this is. */ -+ enum function_kind kind; -+ -+ /* The database and service of the function being hardwired in. */ -+ char *database, *service; -+ -+ /* The kind of entry being queried, for 'fk_setent', 'fk_getent', -+ 'fk_endent', and 'fk_getby' functions. */ -+ char *entry; -+ -+ /* The key, for 'fk_getby' entries. */ -+ char *key; -+ -+ /* The value and key, for 'fk_get' entries. */ -+ char *value_and_key; -+}; -+ -+ -+const struct function functions[] = -+ { -+ -+#define DEFINE_ENT(database, service, entry) \ -+ { fk_setent, #database, #service, #entry }, \ -+ { fk_getent, #database, #service, #entry }, \ -+ { fk_endent, #database, #service, #entry }, -+#define DEFINE_GETBY(database, service, entry, key) \ -+ { fk_getby, #database, #service, #entry, #key }, -+#define DEFINE_GET(database, service, value_and_key) \ -+ { fk_get, #database, #service, NULL, NULL, #value_and_key }, -+ -+#include FIXED_FUNCTIONS -+ -+#undef DEFINE_ENT -+#undef DEFINE_GETBY -+#undef DEFINE_GET -+ -+ { fk_end } -+ }; -+ -+ -+/* Parsing the config file. Functions copied from nsswitch.c. */ -+ -+#define __strchrnul strchrnul -+#define __getline getline -+#define __strncasecmp strncasecmp -+ -+/* Prototypes for the local functions. */ -+static name_database *nss_parse_file (const char *fname) internal_function; -+static name_database_entry *nss_getline (char *line) internal_function; -+static service_user *nss_parse_service_list (const char *line) -+ internal_function; -+ -+static name_database * -+internal_function -+nss_parse_file (const char *fname) -+{ -+ FILE *fp; -+ name_database *result; -+ name_database_entry *last; -+ char *line; -+ size_t len; -+ -+ /* Open the configuration file. */ -+ fp = fopen (fname, "rc"); -+ if (fp == NULL) -+ return NULL; -+ -+ // /* No threads use this stream. */ -+ // __fsetlocking (fp, FSETLOCKING_BYCALLER); -+ -+ result = (name_database *) xmalloc (sizeof (name_database)); -+ -+ result->entry = NULL; -+ result->library = NULL; -+ last = NULL; -+ line = NULL; -+ len = 0; -+ do -+ { -+ name_database_entry *this; -+ ssize_t n; -+ -+ n = __getline (&line, &len, fp); -+ if (n < 0) -+ break; -+ if (line[n - 1] == '\n') -+ line[n - 1] = '\0'; -+ -+ /* Because the file format does not know any form of quoting we -+ can search forward for the next '#' character and if found -+ make it terminating the line. */ -+ *__strchrnul (line, '#') = '\0'; -+ -+ /* If the line is blank it is ignored. */ -+ if (line[0] == '\0') -+ continue; -+ -+ /* Each line completely specifies the actions for a database. */ -+ this = nss_getline (line); -+ if (this != NULL) -+ { -+ if (last != NULL) -+ last->next = this; -+ else -+ result->entry = this; -+ -+ last = this; -+ } -+ } -+ while (!feof_unlocked (fp)); -+ -+ /* Free the buffer. */ -+ free (line); -+ /* Close configuration file. */ -+ fclose (fp); -+ -+ return result; -+} -+ -+ -+/* Read the source names: -+ `( <source> ( "[" "!"? (<status> "=" <action> )+ "]" )? )*' -+ */ -+static service_user * -+internal_function -+nss_parse_service_list (const char *line) -+{ -+ service_user *result = NULL, **nextp = &result; -+ -+ while (1) -+ { -+ service_user *new_service; -+ const char *name; -+ -+ while (isspace (line[0])) -+ ++line; -+ if (line[0] == '\0') -+ /* No source specified. */ -+ return result; -+ -+ /* Read <source> identifier. */ -+ name = line; -+ while (line[0] != '\0' && !isspace (line[0]) && line[0] != '[') -+ ++line; -+ if (name == line) -+ return result; -+ -+ -+ new_service = (service_user *) xmalloc (sizeof (*new_service)); -+ new_service->name = (char *) xmalloc (line - name + 1); -+ -+ *((char *) __mempcpy ((char *) new_service->name, name, line - name)) -+ = '\0'; -+ -+ /* Set default actions. */ -+ new_service->actions[2 + NSS_STATUS_TRYAGAIN] = NSS_ACTION_CONTINUE; -+ new_service->actions[2 + NSS_STATUS_UNAVAIL] = NSS_ACTION_CONTINUE; -+ new_service->actions[2 + NSS_STATUS_NOTFOUND] = NSS_ACTION_CONTINUE; -+ new_service->actions[2 + NSS_STATUS_SUCCESS] = NSS_ACTION_RETURN; -+ new_service->actions[2 + NSS_STATUS_RETURN] = NSS_ACTION_RETURN; -+ new_service->library = NULL; -+ new_service->known.tree = NULL; -+ new_service->next = NULL; -+ -+ while (isspace (line[0])) -+ ++line; -+ -+ if (line[0] == '[') -+ { -+ /* Read criterions. */ -+ do -+ ++line; -+ while (line[0] != '\0' && isspace (line[0])); -+ -+ do -+ { -+ int not; -+ enum nss_status status; -+ lookup_actions action; -+ -+ /* Grok ! before name to mean all statii but that one. */ -+ not = line[0] == '!'; -+ if (not) -+ ++line; -+ -+ /* Read status name. */ -+ name = line; -+ while (line[0] != '\0' && !isspace (line[0]) && line[0] != '=' -+ && line[0] != ']') -+ ++line; -+ -+ /* Compare with known statii. */ -+ if (line - name == 7) -+ { -+ if (__strncasecmp (name, "SUCCESS", 7) == 0) -+ status = NSS_STATUS_SUCCESS; -+ else if (__strncasecmp (name, "UNAVAIL", 7) == 0) -+ status = NSS_STATUS_UNAVAIL; -+ else -+ return result; -+ } -+ else if (line - name == 8) -+ { -+ if (__strncasecmp (name, "NOTFOUND", 8) == 0) -+ status = NSS_STATUS_NOTFOUND; -+ else if (__strncasecmp (name, "TRYAGAIN", 8) == 0) -+ status = NSS_STATUS_TRYAGAIN; -+ else -+ return result; -+ } -+ else -+ return result; -+ -+ while (isspace (line[0])) -+ ++line; -+ if (line[0] != '=') -+ return result; -+ do -+ ++line; -+ while (isspace (line[0])); -+ -+ name = line; -+ while (line[0] != '\0' && !isspace (line[0]) && line[0] != '=' -+ && line[0] != ']') -+ ++line; -+ -+ if (line - name == 6 && __strncasecmp (name, "RETURN", 6) == 0) -+ action = NSS_ACTION_RETURN; -+ else if (line - name == 8 -+ && __strncasecmp (name, "CONTINUE", 8) == 0) -+ action = NSS_ACTION_CONTINUE; -+ else -+ return result; -+ -+ if (not) -+ { -+ /* Save the current action setting for this status, -+ set them all to the given action, and reset this one. */ -+ const lookup_actions save = new_service->actions[2 + status]; -+ new_service->actions[2 + NSS_STATUS_TRYAGAIN] = action; -+ new_service->actions[2 + NSS_STATUS_UNAVAIL] = action; -+ new_service->actions[2 + NSS_STATUS_NOTFOUND] = action; -+ new_service->actions[2 + NSS_STATUS_SUCCESS] = action; -+ new_service->actions[2 + status] = save; -+ } -+ else -+ new_service->actions[2 + status] = action; -+ -+ /* Skip white spaces. */ -+ while (isspace (line[0])) -+ ++line; -+ } -+ while (line[0] != ']'); -+ -+ /* Skip the ']'. */ -+ ++line; -+ } -+ -+ *nextp = new_service; -+ nextp = &new_service->next; -+ } -+} -+ -+static name_database_entry * -+internal_function -+nss_getline (char *line) -+{ -+ const char *name; -+ name_database_entry *result; -+ size_t len; -+ -+ /* Ignore leading white spaces. ATTENTION: this is different from -+ what is implemented in Solaris. The Solaris man page says a line -+ beginning with a white space character is ignored. We regard -+ this as just another misfeature in Solaris. */ -+ while (isspace (line[0])) -+ ++line; -+ -+ /* Recognize `<database> ":"'. */ -+ name = line; -+ while (line[0] != '\0' && !isspace (line[0]) && line[0] != ':') -+ ++line; -+ if (line[0] == '\0' || name == line) -+ /* Syntax error. */ -+ return NULL; -+ *line++ = '\0'; -+ -+ len = strlen (name) + 1; -+ -+ result = (name_database_entry *) xmalloc (sizeof (*result)); -+ result->name = (char *) xmalloc (len); -+ -+ /* Save the database name. */ -+ memcpy ((char *) result->name, name, len); -+ -+ /* Parse the list of services. */ -+ result->service = nss_parse_service_list (line); -+ -+ result->next = NULL; -+ return result; -+} -+ -+ -+ -+/* Generating code for statically initialized nsswitch structures. */ -+ -+ -+/* Return the service-neutral suffix of the name of the service -+ library function referred to by the function F. The result is -+ allocated with malloc. */ -+char * -+known_function_suffix (const struct function *f) -+{ -+ switch (f->kind) -+ { -+ case fk_setent: -+ return saprintf ("set%sent", f->entry); -+ -+ case fk_getent: -+ return saprintf ("get%sent_r", f->entry); -+ -+ case fk_endent: -+ return saprintf ("end%sent", f->entry); -+ -+ case fk_getby: -+ return saprintf ("get%sby%s_r", f->entry, f->key); -+ -+ case fk_get: -+ return saprintf ("get%s_r", f->value_and_key); -+ -+ default: -+ abort (); -+ } -+} -+ -+ -+/* Return the name of the service library function referred to by the -+ function F. The result is allocated with malloc. */ -+char * -+known_function_name (const struct function *f) -+{ -+ return saprintf ("_nss_%s_%s", f->service, known_function_suffix (f)); -+} -+ -+ -+/* Write initialized known_function structures to OUT for -+ all the functions we'll use. */ -+void -+generate_known_functions (FILE *out) -+{ -+ int i; -+ -+ /* First, generate weak references to the functions. The service -+ libraries depend on libc, and if these references weren't weak, -+ we'd be making libc depend circularly on the service -+ libraries. */ -+ for (i = 0; functions[i].kind; i++) -+ { -+ char *name = known_function_name (&functions[i]); -+ fprintf (out, "typeof (%s) %s __attribute__ ((weak));\n", -+ name, name); -+ } -+ fputs ("\n", out); -+ -+ /* Then, a table mapping names to functions. */ -+ fputs ("static const known_function fixed_known_functions[] = {\n", -+ out); -+ for (i = 0; functions[i].kind; i++) -+ { -+ const struct function *f = &functions[i]; -+ char *suffix = known_function_suffix (f); -+ -+ fprintf (out, " /* %2d */ { \"%s\", _nss_%s_%s },\n", -+ i, suffix, f->service, suffix); -+ } -+ fputs ("};\n", out); -+ fputs ("\n", out); -+} -+ -+ -+/* Print code to OUT for an initialized array of pointers to the -+ 'known_function' structures needed for USER, which is for -+ DATABASE. Return its name, allocated with malloc. */ -+char * -+generate_known_function_list (FILE *out, -+ const name_database_entry *database, -+ const service_user *user) -+{ -+ char *list_name = saprintf ("fixed_%s_%s_known_funcs", -+ database->name, user->name); -+ fprintf (out, "static const known_function *%s[] = {\n", -+ list_name); -+ int i; -+ for (i = 0; functions[i].kind; i++) -+ if (strcmp (functions[i].database, database->name) == 0 -+ && strcmp (functions[i].service, user->name) == 0) -+ fprintf (out, " &fixed_known_functions[%d], /* %s */\n", -+ i, known_function_name (&functions[i])); -+ fputs (" NULL\n", out); -+ fputs ("};\n", out); -+ fputs ("\n", out); -+ -+ return list_name; -+} -+ -+ -+/* Return the name of the status value STATUS, as a statically -+ allocated string. */ -+const char * -+lookup_status_name (enum nss_status status) -+{ -+ switch (status) -+ { -+ case NSS_STATUS_TRYAGAIN: return "NSS_STATUS_TRYAGAIN"; -+ case NSS_STATUS_UNAVAIL: return "NSS_STATUS_UNAVAIL"; -+ case NSS_STATUS_NOTFOUND: return "NSS_STATUS_NOTFOUND"; -+ case NSS_STATUS_SUCCESS: return "NSS_STATUS_SUCCESS"; -+ case NSS_STATUS_RETURN: return "NSS_STATUS_RETURN"; -+ default: abort (); -+ }; -+} -+ -+ -+/* Return the name of ACTION as a statically allocated string. */ -+const char * -+lookup_action_name (lookup_actions action) -+{ -+ switch (action) -+ { -+ case NSS_ACTION_CONTINUE: return "NSS_ACTION_CONTINUE"; -+ case NSS_ACTION_RETURN: return "NSS_ACTION_RETURN"; -+ default: abort (); -+ } -+} -+ -+ -+/* Print code to OUT for the list of service_user structures starting -+ with USER, which are all for DATABASE. Return the name of the -+ first structure in that list, or zero if USER is NULL. */ -+char * -+generate_service_user_list (FILE *out, -+ name_database_entry *database, -+ service_user *user) -+{ -+ if (user) -+ { -+ /* Generate the tail of the list. */ -+ char *next_name = generate_service_user_list (out, database, user->next); -+ /* Generate our known function list. */ -+ char *known_function_list_name = -+ generate_known_function_list (out, database, user); -+ -+ char *name = saprintf ("fixed_%s_%s_user", database->name, user->name); -+ -+ fprintf (out, "static const service_user %s = {\n", name); -+ if (next_name) -+ fprintf (out, " (service_user *) &%s,\n", next_name); -+ else -+ fprintf (out, " NULL, /* no next entry */\n"); -+ fputs (" {\n", out); -+ int i; -+ for (i = 0; i < sizeof (user->actions) / sizeof (user->actions[0]); i++) -+ fprintf (out, " %s, /* %s */\n", -+ lookup_action_name (user->actions[i]), -+ lookup_status_name (i - 2)); -+ fputs (" },\n", out); -+ fprintf (out, " NULL, /* we never need the service library */\n"); -+ fprintf (out, " { .array = %s },\n", known_function_list_name); -+ fprintf (out, " \"%s\"\n", user->name); -+ fputs ("};\n", out); -+ fputs ("\n", out); -+ -+ return name; -+ } -+ else -+ return NULL; -+} -+ -+ -+/* Print code to OUT for the list of name_database_entry structures -+ starting with DATABASE. Return the name of the first structure -+ in that list, or zero if DATABASE is NULL. */ -+char * -+generate_name_database_entries (FILE *out, name_database_entry *database) -+{ -+ if (database) -+ { -+ char *next_name = generate_name_database_entries (out, database->next); -+ char *service_user_name -+ = generate_service_user_list (out, database, database->service); -+ char *name = saprintf ("fixed_%s_name_database", database->name); -+ -+ fprintf (out, "static const name_database_entry %s = {\n", name); -+ -+ if (next_name) -+ fprintf (out, " (name_database_entry *) &%s,\n", next_name); -+ else -+ fprintf (out, " NULL,\n"); -+ -+ if (service_user_name) -+ fprintf (out, " (service_user *) &%s,\n", service_user_name); -+ else -+ fprintf (out, " NULL,\n"); -+ -+ fprintf (out, " \"%s\"\n", database->name); -+ fprintf (out, "};\n"); -+ fputs ("\n", out); -+ -+ return name; -+ } -+ else -+ return NULL; -+} -+ -+ -+void -+generate_name_database (FILE *out, name_database *service_table) -+{ -+ /* Produce a linked list of the known name_database_entry -+ structures. */ -+ char *entries = generate_name_database_entries (out, service_table->entry); -+ -+ /* Now produce the main structure that points to them all. */ -+ fprintf (out, "static const name_database fixed_name_database = {\n"); -+ if (entries) -+ fprintf (out, " (name_database_entry *) &%s,\n", entries); -+ else -+ fprintf (out, " NULL,\n"); -+ fputs (" NULL /* we don't need the libraries */\n" -+ "};\n", -+ out); -+} -+ -+ -+ -+/* Generating the list of service libraries we generate references to. */ -+ -+/* String with revision number of the shared object files. */ -+static const char *const nss_shlib_revision = LIBNSS_FILES_SO + 15; -+ -+void -+generate_service_lib_list (FILE *out, name_database *service_table) -+{ -+ int i, j; -+ int printed_any = 0; -+ -+ for (i = 0; functions[i].kind; i++) -+ { -+ /* Mention each service library only once. */ -+ for (j = 0; j < i; j++) -+ if (strcmp (functions[i].service, functions[j].service) == 0) -+ break; -+ -+ if (j >= i) -+ { -+ if (printed_any) -+ putc (' ', out); -+ fprintf (out, "-lnss_%s", -+ functions[i].service, -+ nss_shlib_revision); -+ printed_any = 1; -+ } -+ } -+} -+ -+ -+/* Main. */ -+ -+int -+main (int argc, char **argv) -+{ -+ if (argc != 4) -+ { -+ fprintf (stderr, "usage: gen-fixed-nsswitch HEADER SERVLIBS CONFIG\n"); -+ exit (1); -+ } -+ -+ name_database *service_table = nss_parse_file (argv[3]); -+ -+ FILE *header = fopen (argv[1], "w"); -+ if (! header) -+ { -+ fprintf (stderr, -+ "gen-fixed-nsswitch: couldn't open output file %s: %s\n", -+ argv[1], strerror (errno)); -+ exit (1); -+ } -+ fputs ("/* Generated by nss/gen-fixed-nsswitch.c. */\n", header); -+ fputs ("\n", header); -+ generate_known_functions (header); -+ generate_name_database (header, service_table); -+ fclose (header); -+ -+ FILE *service_lib_list = fopen (argv[2], "w"); -+ if (! service_lib_list) -+ { -+ fprintf (stderr, -+ "gen-fixed-nsswitch: couldn't open output file %s: %s\n", -+ argv[2], strerror (errno)); -+ exit (1); -+ } -+ generate_service_lib_list (service_lib_list, service_table); -+ fclose (service_lib_list); -+ -+ return 0; -+} -diff --git a/nss/getent.c b/nss/getent.c -index 34df848..674c8ee 100644 ---- a/nss/getent.c -+++ b/nss/getent.c -@@ -39,6 +39,7 @@ - #include <netinet/ether.h> - #include <netinet/in.h> - #include <sys/socket.h> -+#include <gnu/option-groups.h> - - /* Get libc version number. */ - #include <version.h> -@@ -91,6 +92,7 @@ warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n\ - fprintf (stream, gettext ("Written by %s.\n"), "Thorsten Kukuk"); - } - -+#if __OPTION_EGLIBC_DB_ALIASES - /* This is for aliases */ - static void - print_aliases (struct aliasent *alias) -@@ -135,7 +137,9 @@ aliases_keys (int number, char *key[]) - - return result; - } -+#endif /* __OPTION_EGLIBC_DB_ALIASES */ - -+#if __OPTION_EGLIBC_INET - /* This is for ethers */ - static int - ethers_keys (int number, char *key[]) -@@ -179,6 +183,7 @@ ethers_keys (int number, char *key[]) - - return result; - } -+#endif /* __OPTION_EGLIBC_INET */ - - /* This is for group */ - static void -@@ -301,6 +306,7 @@ gshadow_keys (int number, char *key[]) - return result; - } - -+#if __OPTION_EGLIBC_INET - /* This is for hosts */ - static void - print_hosts (struct hostent *host) -@@ -598,6 +604,7 @@ networks_keys (int number, char *key[]) - - return result; - } -+#endif /* __OPTION_EGLIBC_INET */ - - /* Now is all for passwd */ - static void -@@ -650,6 +657,7 @@ passwd_keys (int number, char *key[]) - return result; - } - -+#if __OPTION_EGLIBC_INET - /* This is for protocols */ - static void - print_protocols (struct protoent *proto) -@@ -807,6 +815,7 @@ services_keys (int number, char *key[]) - - return result; - } -+#endif /* __OPTION_EGLIBC_INET */ - - /* This is for shadow */ - static void -@@ -873,23 +882,36 @@ struct - } databases[] = - { - #define D(name) { #name, name ## _keys }, --D(ahosts) --D(ahostsv4) --D(ahostsv6) --D(aliases) --D(ethers) -+ -+#if __OPTION_EGLIBC_INET -+# define DN(name) D(name) -+#else -+# define DN(name) -+#endif -+ -+#if __OPTION_EGLIBC_DB_ALIASES -+# define DA(name) D(name) -+#else -+# define DA(name) -+#endif -+ -+DN(ahosts) -+DN(ahostsv4) -+DN(ahostsv6) -+DA(aliases) -+DN(ethers) - D(group) - D(gshadow) --D(hosts) --D(initgroups) --D(netgroup) --D(networks) -+DN(hosts) -+DN(initgroups) -+DN(netgroup) -+DN(networks) - D(passwd) --D(protocols) -+DN(protocols) - #if HAVE_SUNRPC --D(rpc) -+DN(rpc) - #endif --D(services) -+DN(services) - D(shadow) - #undef D - { NULL, NULL } -diff --git a/nss/getnssent_r.c b/nss/getnssent_r.c -index f5b9036..f09f7fe 100644 ---- a/nss/getnssent_r.c -+++ b/nss/getnssent_r.c -@@ -16,6 +16,7 @@ - <http://www.gnu.org/licenses/>. */ - - #include <errno.h> -+#include <gnu/option-groups.h> - #include <netdb.h> - #include "nsswitch.h" - -@@ -59,11 +60,13 @@ __nss_setent (const char *func_name, db_lookup_function lookup_fct, - } fct; - int no_more; - -+#if __OPTION_EGLIBC_INET - if (res && __res_maybe_init (&_res, 0) == -1) - { - __set_h_errno (NETDB_INTERNAL); - return; - } -+#endif /* __OPTION_EGLIBC_INET */ - - /* Cycle through the services and run their `setXXent' functions until - we find an available service. */ -@@ -101,11 +104,13 @@ __nss_endent (const char *func_name, db_lookup_function lookup_fct, - } fct; - int no_more; - -+#if __OPTION_EGLIBC_INET - if (res && __res_maybe_init (&_res, 0) == -1) - { - __set_h_errno (NETDB_INTERNAL); - return; - } -+#endif /* __OPTION_EGLIBC_INET */ - - /* Cycle through all the services and run their endXXent functions. */ - no_more = setup (func_name, lookup_fct, &fct.ptr, nip, startp, 1); -@@ -141,12 +146,14 @@ __nss_getent_r (const char *getent_func_name, - int no_more; - enum nss_status status; - -+#if __OPTION_EGLIBC_INET - if (res && __res_maybe_init (&_res, 0) == -1) - { - *h_errnop = NETDB_INTERNAL; - *result = NULL; - return errno; - } -+#endif /* __OPTION_EGLIBC_INET */ - - /* Initialize status to return if no more functions are found. */ - status = NSS_STATUS_NOTFOUND; -@@ -161,7 +168,7 @@ __nss_getent_r (const char *getent_func_name, - int is_last_nip = *nip == *last_nip; - - status = DL_CALL_FCT (fct.f, -- (resbuf, buffer, buflen, &errno, &h_errno)); -+ (resbuf, buffer, buflen, &errno, h_errnop)); - - /* The status is NSS_STATUS_TRYAGAIN and errno is ERANGE the - provided buffer is too small. In this case we should give -diff --git a/nss/nsswitch.c b/nss/nsswitch.c -index 9712623..c81e207 100644 ---- a/nss/nsswitch.c -+++ b/nss/nsswitch.c -@@ -26,6 +26,7 @@ - #include <stdio_ext.h> - #include <stdlib.h> - #include <string.h> -+#include <gnu/option-groups.h> - - #include <aliases.h> - #include <grp.h> -@@ -41,6 +42,15 @@ - #include "../nscd/nscd_proto.h" - #include <sysdep.h> - -+/* When OPTION_EGLIBC_NSSWITCH is disabled, we use fixed tables of -+ databases and services, generated at library build time. Thus: -+ - We can't reconfigure individual databases, so we don't need a -+ name-to-database map. -+ - We never add databases or service libraries, or look up functions -+ at runtime, so there's no need for a lock to protect our tables. -+ See ../option-groups.def for the details. */ -+#if __OPTION_EGLIBC_NSSWITCH -+ - /* Prototypes for the local functions. */ - static name_database *nss_parse_file (const char *fname) internal_function; - static name_database_entry *nss_getline (char *line) internal_function; -@@ -79,6 +89,9 @@ bool __nss_database_custom[NSS_DBSIDX_max]; - - __libc_lock_define_initialized (static, lock) - -+#define lock_nsswitch __libc_lock_lock (lock) -+#define unlock_nsswitch __libc_lock_unlock (lock) -+ - #if !defined DO_STATIC_NSS || defined SHARED - /* String with revision number of the shared object files. */ - static const char *const __nss_shlib_revision = LIBNSS_FILES_SO + 15; -@@ -93,6 +106,20 @@ static name_database *service_table; - __libc_freeres. */ - static name_database_entry *defconfig_entries; - -+#else /* __OPTION_EGLIBC_NSSWITCH */ -+ -+/* Bring in the statically initialized service table we generated at -+ build time. */ -+#include "fixed-nsswitch.h" -+ -+const static name_database *service_table = &fixed_name_database; -+ -+/* Nothing ever changes, so there's no need to lock anything. */ -+#define lock_nsswitch (0) -+#define unlock_nsswitch (0) -+ -+#endif /* __OPTION_EGLIBC_NSSWITCH */ -+ - - #ifdef USE_NSCD - /* Nonzero if this is the nscd process. */ -@@ -109,20 +136,22 @@ __nss_database_lookup (const char *database, const char *alternate_name, - const char *defconfig, service_user **ni) - { - /* Prevent multiple threads to change the service table. */ -- __libc_lock_lock (lock); -+ lock_nsswitch; - - /* Reconsider database variable in case some other thread called - `__nss_configure_lookup' while we waited for the lock. */ - if (*ni != NULL) - { -- __libc_lock_unlock (lock); -+ unlock_nsswitch; - return 0; - } - -+#if __OPTION_EGLIBC_NSSWITCH - /* Are we initialized yet? */ - if (service_table == NULL) - /* Read config file. */ - service_table = nss_parse_file (_PATH_NSSWITCH_CONF); -+#endif - - /* Test whether configuration data is available. */ - if (service_table != NULL) -@@ -144,6 +173,7 @@ __nss_database_lookup (const char *database, const char *alternate_name, - *ni = entry->service; - } - -+#if __OPTION_EGLIBC_NSSWITCH - /* No configuration data is available, either because nsswitch.conf - doesn't exist or because it doesn't have a line for this database. - -@@ -166,13 +196,23 @@ __nss_database_lookup (const char *database, const char *alternate_name, - { - entry->next = defconfig_entries; - entry->service = *ni; -- entry->name[0] = '\0'; -+ entry->name = ""; - defconfig_entries = entry; - } - } - } -+#else -+ /* Without the dynamic behavior, we can't process defconfig. The -+ databases the user specified at library build time are all you -+ get. */ -+ if (*ni == NULL) -+ { -+ unlock_nsswitch; -+ return -1; -+ } -+#endif - -- __libc_lock_unlock (lock); -+ unlock_nsswitch; - - return *ni != NULL ? 0 : -1; - } -@@ -252,6 +292,7 @@ __nss_next2 (service_user **ni, const char *fct_name, const char *fct2_name, - libc_hidden_def (__nss_next2) - - -+#if __OPTION_EGLIBC_NSSWITCH - int - attribute_compat_text_section - __nss_next (service_user **ni, const char *fct_name, void **fctp, int status, -@@ -300,13 +341,13 @@ __nss_configure_lookup (const char *dbname, const char *service_line) - } - - /* Prevent multiple threads to change the service table. */ -- __libc_lock_lock (lock); -+ lock_nsswitch; - - /* Install new rules. */ - *databases[cnt].dbp = new_db; - __nss_database_custom[cnt] = true; - -- __libc_lock_unlock (lock); -+ unlock_nsswitch; - - return 0; - } -@@ -402,7 +443,7 @@ __nss_lookup_function (service_user *ni, const char *fct_name) - void **found, *result; - - /* We now modify global data. Protect it. */ -- __libc_lock_lock (lock); -+ lock_nsswitch; - - /* Search the tree of functions previously requested. Data in the - tree are `known_function' structures, whose first member is a -@@ -413,7 +454,7 @@ __nss_lookup_function (service_user *ni, const char *fct_name) - enough to a pointer to our structure to use as a lookup key that - will be passed to `known_compare' (above). */ - -- found = __tsearch (&fct_name, &ni->known, &known_compare); -+ found = __tsearch (&fct_name, &ni->known.tree, &known_compare); - if (found == NULL) - /* This means out-of-memory. */ - result = NULL; -@@ -440,7 +481,7 @@ __nss_lookup_function (service_user *ni, const char *fct_name) - #endif - /* Oops. We can't instantiate this node properly. - Remove it from the tree. */ -- __tdelete (&fct_name, &ni->known, &known_compare); -+ __tdelete (&fct_name, &ni->known.tree, &known_compare); - free (known); - result = NULL; - } -@@ -520,13 +561,43 @@ __nss_lookup_function (service_user *ni, const char *fct_name) - } - - /* Remove the lock. */ -- __libc_lock_unlock (lock); -+ unlock_nsswitch; - - return result; - } - libc_hidden_def (__nss_lookup_function) - - -+#else /* below if ! __OPTION_EGLIBC_NSSWITCH */ -+ -+ -+int -+__nss_configure_lookup (const char *dbname, const char *service_line) -+{ -+ /* We can't dynamically configure lookup without -+ OPTION_EGLIBC_NSSWITCH. */ -+ __set_errno (EINVAL); -+ return -1; -+} -+ -+ -+void * -+__nss_lookup_function (service_user *ni, const char *fct_name) -+{ -+ int i; -+ const known_function **known = ni->known.array; -+ -+ for (i = 0; known[i]; i++) -+ if (strcmp (fct_name, known[i]->fct_name) == 0) -+ return known[i]->fct_ptr; -+ -+ return NULL; -+} -+libc_hidden_def (__nss_lookup_function) -+#endif -+ -+ -+#if __OPTION_EGLIBC_NSSWITCH - static name_database * - internal_function - nss_parse_file (const char *fname) -@@ -632,8 +703,10 @@ nss_parse_service_list (const char *line) - + (line - name + 1)); - if (new_service == NULL) - return result; -+ new_service->name = (char *) (new_service + 1); - -- *((char *) __mempcpy (new_service->name, name, line - name)) = '\0'; -+ *((char *) __mempcpy ((char *) new_service->name, name, line - name)) -+ = '\0'; - - /* Set default actions. */ - new_service->actions[2 + NSS_STATUS_TRYAGAIN] = NSS_ACTION_CONTINUE; -@@ -642,7 +715,7 @@ nss_parse_service_list (const char *line) - new_service->actions[2 + NSS_STATUS_SUCCESS] = NSS_ACTION_RETURN; - new_service->actions[2 + NSS_STATUS_RETURN] = NSS_ACTION_RETURN; - new_service->library = NULL; -- new_service->known = NULL; -+ new_service->known.tree = NULL; - new_service->next = NULL; - - while (isspace (line[0])) -@@ -778,9 +851,10 @@ nss_getline (char *line) - result = (name_database_entry *) malloc (sizeof (name_database_entry) + len); - if (result == NULL) - return NULL; -+ result->name = (char *) (result + 1); - - /* Save the database name. */ -- memcpy (result->name, name, len); -+ memcpy ((char *) result->name, name, len); - - /* Parse the list of services. */ - result->service = nss_parse_service_list (line); -@@ -816,6 +890,7 @@ nss_new_service (name_database *database, const char *name) - return *currentp; - } - #endif -+#endif /* __OPTION_EGLIBC_NSSWITCH */ - - - #if defined SHARED && defined USE_NSCD -@@ -834,6 +909,7 @@ nss_load_all_libraries (const char *service, const char *def) - } - - -+#if __OPTION_EGLIBC_INET - /* Called by nscd and nscd alone. */ - void - __nss_disable_nscd (void (*cb) (size_t, struct traced_file *)) -@@ -857,8 +933,10 @@ __nss_disable_nscd (void (*cb) (size_t, struct traced_file *)) - __nss_not_use_nscd_services = -1; - __nss_not_use_nscd_netgroup = -1; - } -+#endif /* __OPTION_EGLIBC_INET */ - #endif - -+#if __OPTION_EGLIBC_NSSWITCH - static void - free_database_entries (name_database_entry *entry) - { -@@ -871,8 +949,8 @@ free_database_entries (name_database_entry *entry) - { - service_user *olds = service; - -- if (service->known != NULL) -- __tdestroy (service->known, free); -+ if (service->known.tree != NULL) -+ __tdestroy (service->known.tree, free); - - service = service->next; - free (olds); -@@ -926,3 +1004,4 @@ libc_freeres_fn (free_mem) - - free (top); - } -+#endif /* __OPTION_EGLIBC_NSSWITCH */ -diff --git a/nss/nsswitch.h b/nss/nsswitch.h -index a5318fa..1730977 100644 ---- a/nss/nsswitch.h -+++ b/nss/nsswitch.h -@@ -65,10 +65,20 @@ typedef struct service_user - lookup_actions actions[5]; - /* Link to the underlying library object. */ - service_library *library; -- /* Collection of known functions. */ -- void *known; -+ /* Collection of known functions. -+ -+ With OPTION_EGLIBC_NSSWITCH enabled, this is the root of a -+ 'tsearch'-style tree. -+ -+ With OPTION_EGLIBC_NSSWITCH disabled, this is an array of -+ pointers to known_function structures, NULL-terminated. */ -+ union -+ { -+ void *tree; -+ const known_function **array; -+ } known; - /* Name of the service (`files', `dns', `nis', ...). */ -- char name[0]; -+ const char *name; - } service_user; - - /* To access the action based on the status value use this macro. */ -@@ -82,7 +92,7 @@ typedef struct name_database_entry - /* List of service to be used. */ - service_user *service; - /* Name of the database. */ -- char name[0]; -+ const char *name; - } name_database_entry; - - -diff --git a/posix/Makefile b/posix/Makefile -index 15e8818..609ed03 100644 ---- a/posix/Makefile -+++ b/posix/Makefile -@@ -18,6 +18,8 @@ - # - # Sub-makefile for POSIX portion of the library. - # -+include ../option-groups.mak -+ - subdir := posix - - include ../Makeconfig -@@ -43,13 +45,24 @@ routines := \ - getpgid setpgid getpgrp bsd-getpgrp setpgrp getsid setsid \ - getresuid getresgid setresuid setresgid \ - pathconf sysconf fpathconf \ -- glob glob64 fnmatch regex \ -+ glob glob64 fnmatch \ - confstr \ - getopt getopt1 getopt_init \ - sched_setp sched_getp sched_sets sched_gets sched_yield sched_primax \ - sched_primin sched_rr_gi sched_getaffinity sched_setaffinity \ -- getaddrinfo gai_strerror wordexp \ - pread pwrite pread64 pwrite64 \ -+ posix_madvise \ -+ get_child_max sched_cpucount sched_cpualloc sched_cpufree -+ -+routines-$(OPTION_EGLIBC_INET) += getaddrinfo gai_strerror -+ -+ifeq (y,$(OPTION_POSIX_REGEXP_GLIBC)) -+routines-$(OPTION_POSIX_REGEXP) += regex -+else -+routines-$(OPTION_POSIX_REGEXP) += xregex -+endif -+ -+routines-$(OPTION_EGLIBC_SPAWN) += \ - spawn_faction_init spawn_faction_destroy spawn_faction_addclose \ - spawn_faction_addopen spawn_faction_adddup2 \ - spawnattr_init spawnattr_destroy \ -@@ -61,37 +74,54 @@ routines := \ - posix_madvise \ - get_child_max sched_cpucount sched_cpualloc sched_cpufree - -+routines-$(OPTION_EGLIBC_WORDEXP) += wordexp -+ - aux := init-posix environ --tests := tstgetopt testfnm runtests runptests \ -+tests := tstgetopt testfnm runtests \ - tst-preadwrite tst-preadwrite64 test-vfork regexbug1 \ -- tst-mmap tst-getaddrinfo tst-truncate \ -- tst-truncate64 tst-fork tst-fnmatch tst-regexloc tst-dir \ -- tst-chmod bug-regex1 bug-regex2 bug-regex3 bug-regex4 \ -- tst-gnuglob tst-regex bug-regex5 bug-regex6 bug-regex7 \ -- bug-regex8 bug-regex9 bug-regex10 bug-regex11 bug-regex12 \ -- bug-regex13 bug-regex14 bug-regex15 bug-regex16 \ -- bug-regex17 bug-regex18 bug-regex19 bug-regex20 \ -- bug-regex21 bug-regex22 bug-regex23 bug-regex24 \ -- bug-regex25 bug-regex26 bug-regex27 bug-regex28 \ -+ tst-mmap tst-truncate \ -+ tst-truncate64 tst-fork tst-dir \ -+ tst-chmod bug-regex2 bug-regex3 bug-regex4 \ -+ tst-gnuglob bug-regex6 bug-regex7 \ -+ bug-regex8 bug-regex9 bug-regex10 bug-regex12 \ -+ bug-regex14 bug-regex15 \ -+ bug-regex21 bug-regex24 \ -+ bug-regex27 bug-regex28 \ - bug-regex29 bug-regex30 bug-regex31 bug-regex32 \ -- bug-regex33 tst-nice tst-nanosleep tst-regex2 \ -- transbug tst-rxspencer tst-pcre tst-boost \ -- bug-ga1 tst-vfork1 tst-vfork2 tst-vfork3 tst-waitid \ -- tst-getaddrinfo2 bug-glob1 bug-glob2 bug-glob3 tst-sysconf \ -+ tst-nice tst-nanosleep \ -+ transbug \ -+ tst-vfork1 tst-vfork2 tst-vfork3 tst-waitid \ -+ bug-glob1 bug-glob2 bug-glob3 tst-sysconf \ - tst-execvp1 tst-execvp2 tst-execlp1 tst-execlp2 \ - tst-execv1 tst-execv2 tst-execl1 tst-execl2 \ - tst-execve1 tst-execve2 tst-execle1 tst-execle2 \ -- tst-execvp3 tst-execvp4 tst-rfc3484 tst-rfc3484-2 \ -- tst-rfc3484-3 \ -- tst-getaddrinfo3 tst-fnmatch2 tst-cpucount tst-cpuset \ -+ tst-execvp3 tst-execvp4 \ -+ tst-fnmatch2 tst-cpucount tst-cpuset \ - bug-getopt1 bug-getopt2 bug-getopt3 bug-getopt4 \ - bug-getopt5 tst-getopt_long1 bug-regex34 bug-regex35 \ - tst-pathconf tst-getaddrinfo4 tst-rxspencer-no-utf8 \ - tst-fnmatch3 bug-regex36 tst-getaddrinfo5 --xtests := bug-ga2 -+ -+tests-$(OPTION_EGLIBC_LOCALE_CODE) \ -+ += tst-fnmatch tst-regexloc bug-regex1 bug-regex5 \ -+ bug-regex23 bug-regex25 bug-regex32 bug-regex33 -+tests-$(OPTION_EGLIBC_INET) \ -+ += tst-getaddrinfo bug-ga1 tst-getaddrinfo2 \ -+ tst-rfc3484 tst-rfc3484-2 tst-rfc3484-3 tst-getaddrinfo3 -+tests-$(OPTION_POSIX_REGEXP_GLIBC) \ -+ += runptests bug-regex11 bug-regex13 bug-regex16 \ -+ tst-regex2 tst-rxspencer tst-pcre tst-boost -+ifeq (yy,$(OPTION_EGLIBC_LOCALE_CODE)$(OPTION_POSIX_REGEXP_GLIBC)) -+tests += tst-regex bug-regex17 bug-regex18 bug-regex19 bug-regex20 \ -+ bug-regex22 bug-regex26 -+endif -+xtests-$(OPTION_EGLIBC_INET) += bug-ga2 -+ - ifeq (yes,$(build-shared)) - test-srcs := globtest --tests += wordexp-test tst-exec tst-spawn -+tests += tst-exec -+tests-$(OPTION_EGLIBC_SPAWN) += tst-spawn -+tests-$(OPTION_EGLIBC_WORDEXP) += wordexp-test - endif - tests-static = tst-exec-static tst-spawn-static - tests += $(tests-static) -@@ -117,7 +147,10 @@ generated += $(addprefix wordexp-test-result, 1 2 3 4 5 6 7 8 9 10) \ - - ifeq ($(run-built-tests),yes) - ifeq (yes,$(build-shared)) --tests-special += $(objpfx)globtest.out $(objpfx)wordexp-tst.out -+tests-special += $(objpfx)globtest.out -+ifeq (y,$(OPTION_EGLIBC_WORDEXP)) -+tests-special += $(objpfx)wordexp-tst.out -+endif - endif - endif - -@@ -125,12 +158,16 @@ endif - # XXX Please note that for now we ignore the result of this test. - tests-special += $(objpfx)annexc.out - ifeq ($(run-built-tests),yes) --tests-special += $(objpfx)bug-regex2-mem.out $(objpfx)bug-regex14-mem.out \ -+tests-special += $(objpfx)bug-regex2-mem.out \ - $(objpfx)bug-regex21-mem.out $(objpfx)bug-regex31-mem.out \ -- $(objpfx)tst-rxspencer-no-utf8-mem.out $(objpfx)tst-pcre-mem.out \ -- $(objpfx)tst-boost-mem.out $(objpfx)tst-getconf.out \ -+ $(objpfx)tst-getconf.out \ - $(objpfx)bug-glob2-mem.out $(objpfx)tst-vfork3-mem.out \ - $(objpfx)tst-fnmatch-mem.out $(objpfx)bug-regex36-mem.out -+ifeq (y,$(OPTION_POSIX_REGEXP_GLIBC)) -+tests-special += $(objpfx)bug-regex14-mem.out $(objpfx)tst-rxspencer-no-utf8-mem.out \ -+ $(objpfx)tst-pcre-mem.out $(objpfx)tst-boost-mem.out -+endif -+ - xtests-special += $(objpfx)bug-ga2-mem.out - endif - -@@ -143,6 +180,8 @@ $(objpfx)globtest.out: globtest.sh $(objpfx)globtest - $(SHELL) $< $(common-objpfx) '$(test-via-rtld-prefix)' \ - '$(test-program-prefix)' '$(test-wrapper-env)'; \ - $(evaluate-test) -+LDLIBS-globtest += $(shell cat $(common-objpfx)nss/fixed-nsswitch-libs) -+ - $(objpfx)wordexp-tst.out: wordexp-tst.sh $(objpfx)wordexp-test - $(SHELL) $< $(common-objpfx) '$(test-program-prefix-before-env)' \ - '$(run-program-env)' '$(test-program-prefix-after-env)'; \ -@@ -205,7 +244,10 @@ tst-dir-ARGS = `pwd` `cd $(common-objdir)/$(subdir); pwd` `cd $(common-objdir); - tst-chmod-ARGS = $(objdir) - tst-vfork3-ARGS = --test-dir=$(objpfx) - --tst-rxspencer-ARGS = --utf8 rxspencer/tests -+tst-rxspencer-ARGS = rxspencer/tests -+ifeq (y,$(OPTION_EGLIBC_LOCALE_CODE)) -+tst-rxspencer-ARGS += --utf8 -+endif - tst-rxspencer-no-utf8-ARGS = rxspencer/tests - tst-pcre-ARGS = PCRE.tests - tst-boost-ARGS = BOOST.tests -diff --git a/posix/bug-regex1.c b/posix/bug-regex1.c -index 38eb543..17cd1a0 100644 ---- a/posix/bug-regex1.c -+++ b/posix/bug-regex1.c -@@ -4,6 +4,7 @@ - #include <string.h> - #include <regex.h> - #include <wchar.h> -+#include <gnu/option-groups.h> - - int - main (void) -@@ -17,7 +18,9 @@ main (void) - memset (®ex, '\0', sizeof (regex)); - - setlocale (LC_ALL, "de_DE.ISO-8859-1"); -+#if __OPTION_POSIX_WIDE_CHAR_DEVICE_IO - fwide (stdout, -1); -+#endif - - re_set_syntax (RE_SYNTAX_POSIX_EGREP | RE_DEBUG); - -diff --git a/posix/bug-regex6.c b/posix/bug-regex6.c -index efcc890..3b270c7 100644 ---- a/posix/bug-regex6.c -+++ b/posix/bug-regex6.c -@@ -22,6 +22,7 @@ - #include <string.h> - #include <sys/types.h> - #include <regex.h> -+#include <gnu/option-groups.h> - - - int -@@ -30,7 +31,12 @@ main (int argc, char *argv[]) - regex_t re; - regmatch_t mat[10]; - int i, j, ret = 0; -- const char *locales[] = { "C", "de_DE.UTF-8" }; -+ const char *locales[] = { -+ "C", -+#if __OPTION_EGLIBC_LOCALE_CODE -+ "de_DE.UTF-8" -+#endif -+ }; - const char *string = "http://www.regex.com/pattern/matching.html#intro"; - regmatch_t expect[10] = { - { 0, 48 }, { 0, 5 }, { 0, 4 }, { 5, 20 }, { 7, 20 }, { 20, 42 }, -diff --git a/posix/fnmatch.c b/posix/fnmatch.c -index fd85efa..01cc9fe 100644 ---- a/posix/fnmatch.c -+++ b/posix/fnmatch.c -@@ -30,6 +30,10 @@ - #include <ctype.h> - #include <string.h> - -+#if defined _LIBC -+# include <gnu/option-groups.h> -+#endif -+ - #if defined STDC_HEADERS || defined _LIBC - # include <stdlib.h> - #endif -@@ -131,7 +135,7 @@ extern int fnmatch (const char *pattern, const char *string, int flags); - # define ISWCTYPE(WC, WT) iswctype (WC, WT) - # endif - --# if (HAVE_MBSTATE_T && HAVE_MBSRTOWCS) || _LIBC -+# if (HAVE_MBSTATE_T && HAVE_MBSRTOWCS && _LIBC && __OPTION_EGLIBC_LOCALE_CODE) - /* In this case we are implementing the multibyte character handling. */ - # define HANDLE_MULTIBYTE 1 - # endif -diff --git a/posix/fnmatch_loop.c b/posix/fnmatch_loop.c -index f46c9df..74e1754 100644 ---- a/posix/fnmatch_loop.c -+++ b/posix/fnmatch_loop.c -@@ -15,6 +15,8 @@ - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -+#include <gnu/option-groups.h> -+ - #include <stdint.h> - - struct STRUCT -@@ -54,10 +56,15 @@ FCT (pattern, string, string_end, no_leading_period, flags, ends, alloca_used) - const char *collseq = (const char *) - _NL_CURRENT(LC_COLLATE, _NL_COLLATE_COLLSEQWC); - # else -+# if __OPTION_EGLIBC_LOCALE_CODE - const UCHAR *collseq = (const UCHAR *) - _NL_CURRENT(LC_COLLATE, _NL_COLLATE_COLLSEQMB); --# endif --#endif -+# define COLLSEQ_BYTE_LOOKUP(ix) (collseq[(ix)]) -+# else -+# define COLLSEQ_BYTE_LOOKUP(ix) (ix) -+# endif /* __OPTION_EGLIBC_LOCALE_CODE */ -+# endif /* WIDE_CHAR_VERSION */ -+#endif /* _LIBC */ - - while ((c = *p++) != L('\0')) - { -@@ -277,7 +284,7 @@ FCT (pattern, string, string_end, no_leading_period, flags, ends, alloca_used) - /* Leave room for the null. */ - CHAR str[CHAR_CLASS_MAX_LENGTH + 1]; - size_t c1 = 0; --#if defined _LIBC || (defined HAVE_WCTYPE_H && defined HAVE_WCHAR_H) -+#if defined _LIBC ? __OPTION_POSIX_C_LANG_WIDE_CHAR : (defined HAVE_WCTYPE_H && defined HAVE_WCHAR_H) - wctype_t wt; - #endif - const CHAR *startp = p; -@@ -307,7 +314,7 @@ FCT (pattern, string, string_end, no_leading_period, flags, ends, alloca_used) - } - str[c1] = L('\0'); - --#if defined _LIBC || (defined HAVE_WCTYPE_H && defined HAVE_WCHAR_H) -+#if defined _LIBC ? __OPTION_POSIX_C_LANG_WIDE_CHAR : (defined HAVE_WCTYPE_H && defined HAVE_WCHAR_H) - wt = IS_CHAR_CLASS (str); - if (wt == 0) - /* Invalid character class name. */ -@@ -680,8 +687,10 @@ FCT (pattern, string, string_end, no_leading_period, flags, ends, alloca_used) - else - lcollseq = __collseq_table_lookup (collseq, cold); - # else -- fcollseq = collseq[fn]; -- lcollseq = is_seqval ? cold : collseq[(UCHAR) cold]; -+ fcollseq = COLLSEQ_BYTE_LOOKUP (fn); -+ lcollseq = (is_seqval -+ ? cold -+ : COLLSEQ_BYTE_LOOKUP ((UCHAR) cold)); - # endif - - is_seqval = 0; -@@ -857,7 +866,7 @@ FCT (pattern, string, string_end, no_leading_period, flags, ends, alloca_used) - goto matched; - } - # else -- hcollseq = collseq[cend]; -+ hcollseq = COLLSEQ_BYTE_LOOKUP (cend); - # endif - } - -diff --git a/posix/glob.c b/posix/glob.c -index d65e55d..1ac00a1 100644 ---- a/posix/glob.c -+++ b/posix/glob.c -@@ -25,6 +25,9 @@ - #include <sys/types.h> - #include <sys/stat.h> - #include <stddef.h> -+#ifdef _LIBC -+# include <gnu/option-groups.h> -+#endif - - /* Outcomment the following line for production quality code. */ - /* #define NDEBUG 1 */ -@@ -607,6 +610,7 @@ glob (pattern, flags, errfunc, pglob) - if (home_dir == NULL || home_dir[0] == '\0') - home_dir = "c:/users/default"; /* poor default */ - # else -+# if ! _LIBC || __OPTION_EGLIBC_GETLOGIN - if (home_dir == NULL || home_dir[0] == '\0') - { - int success; -@@ -623,19 +627,19 @@ glob (pattern, flags, errfunc, pglob) - if (success) - { - struct passwd *p; --# if defined HAVE_GETPWNAM_R || defined _LIBC -+# if defined HAVE_GETPWNAM_R || defined _LIBC - long int pwbuflen = GETPW_R_SIZE_MAX (); - char *pwtmpbuf; - struct passwd pwbuf; - int malloc_pwtmpbuf = 0; - int save = errno; - --# ifndef _LIBC -+# ifndef _LIBC - if (pwbuflen == -1) - /* `sysconf' does not support _SC_GETPW_R_SIZE_MAX. - Try a moderate value. */ - pwbuflen = 1024; --# endif -+# endif - if (__libc_use_alloca (alloca_used + pwbuflen)) - pwtmpbuf = alloca_account (pwbuflen, alloca_used); - else -@@ -682,9 +686,9 @@ glob (pattern, flags, errfunc, pglob) - } - __set_errno (save); - } --# else -+# else - p = getpwnam (name); --# endif -+# endif - if (p != NULL) - { - if (!malloc_pwtmpbuf) -@@ -713,6 +717,7 @@ glob (pattern, flags, errfunc, pglob) - } - } - } -+# endif /* ! _LIBC || __OPTION_EGLIBC_GETLOGIN */ - if (home_dir == NULL || home_dir[0] == '\0') - { - if (flags & GLOB_TILDE_CHECK) -diff --git a/posix/regcomp.c b/posix/regcomp.c -index bf8aa16..6a41251 100644 ---- a/posix/regcomp.c -+++ b/posix/regcomp.c -@@ -18,6 +18,7 @@ - <http://www.gnu.org/licenses/>. */ - - #include <stdint.h> -+#include <gnu/option-groups.h> - - #ifdef _LIBC - # include <locale/weight.h> -@@ -309,7 +310,7 @@ re_compile_fastmap_iter (regex_t *bufp, const re_dfastate_t *init_state, - { - re_dfa_t *dfa = (re_dfa_t *) bufp->buffer; - int node_cnt; -- int icase = (dfa->mb_cur_max == 1 && (bufp->syntax & RE_ICASE)); -+ int icase = (dfa_mb_cur_max (dfa) == 1 && (bufp->syntax & RE_ICASE)); - for (node_cnt = 0; node_cnt < init_state->nodes.nelem; ++node_cnt) - { - int node = init_state->nodes.elems[node_cnt]; -@@ -319,9 +320,9 @@ re_compile_fastmap_iter (regex_t *bufp, const re_dfastate_t *init_state, - { - re_set_fastmap (fastmap, icase, dfa->nodes[node].opr.c); - #ifdef RE_ENABLE_I18N -- if ((bufp->syntax & RE_ICASE) && dfa->mb_cur_max > 1) -+ if ((bufp->syntax & RE_ICASE) && dfa_mb_cur_max (dfa) > 1) - { -- unsigned char *buf = alloca (dfa->mb_cur_max), *p; -+ unsigned char *buf = alloca (dfa_mb_cur_max (dfa)), *p; - wchar_t wc; - mbstate_t state; - -@@ -352,7 +353,11 @@ re_compile_fastmap_iter (regex_t *bufp, const re_dfastate_t *init_state, - re_set_fastmap (fastmap, icase, ch); - } - } --#ifdef RE_ENABLE_I18N -+ -+ /* When OPTION_EGLIBC_LOCALE_CODE is disabled, the current -+ locale is always C, which has no rules and no multi-byte -+ characters. */ -+#if defined RE_ENABLE_I18N && __OPTION_EGLIBC_LOCALE_CODE - else if (type == COMPLEX_BRACKET) - { - re_charset_t *cset = dfa->nodes[node].opr.mbcset; -@@ -380,7 +385,7 @@ re_compile_fastmap_iter (regex_t *bufp, const re_dfastate_t *init_state, - i.e. where we would not find an invalid sequence. This only - applies to multibyte character sets; for single byte character - sets, the SIMPLE_BRACKET again suffices. */ -- if (dfa->mb_cur_max > 1 -+ if (dfa_mb_cur_max (dfa) > 1 - && (cset->nchar_classes || cset->non_match || cset->nranges - # ifdef _LIBC - || cset->nequiv_classes -@@ -408,7 +413,7 @@ re_compile_fastmap_iter (regex_t *bufp, const re_dfastate_t *init_state, - memset (&state, '\0', sizeof (state)); - if (__wcrtomb (buf, cset->mbchars[i], &state) != (size_t) -1) - re_set_fastmap (fastmap, icase, *(unsigned char *) buf); -- if ((bufp->syntax & RE_ICASE) && dfa->mb_cur_max > 1) -+ if ((bufp->syntax & RE_ICASE) && dfa_mb_cur_max (dfa) > 1) - { - if (__wcrtomb (buf, __towlower (cset->mbchars[i]), &state) - != (size_t) -1) -@@ -417,7 +422,7 @@ re_compile_fastmap_iter (regex_t *bufp, const re_dfastate_t *init_state, - } - } - } --#endif /* RE_ENABLE_I18N */ -+#endif /* RE_ENABLE_I18N && __OPTION_EGLIBC_LOCALE_CODE */ - else if (type == OP_PERIOD - #ifdef RE_ENABLE_I18N - || type == OP_UTF8_PERIOD -@@ -860,11 +865,15 @@ init_dfa (re_dfa_t *dfa, size_t pat_len) - - dfa->mb_cur_max = MB_CUR_MAX; - #ifdef _LIBC -- if (dfa->mb_cur_max == 6 -+ if (dfa_mb_cur_max (dfa) == 6 - && strcmp (_NL_CURRENT (LC_CTYPE, _NL_CTYPE_CODESET_NAME), "UTF-8") == 0) - dfa->is_utf8 = 1; -+# if __OPTION_EGLIBC_LOCALE_CODE - dfa->map_notascii = (_NL_CURRENT_WORD (LC_CTYPE, _NL_CTYPE_MAP_TO_NONASCII) - != 0); -+# else -+ dfa->map_notascii = 0; -+# endif - #else - # ifdef HAVE_LANGINFO_CODESET - codeset_name = nl_langinfo (CODESET); -@@ -890,7 +899,7 @@ init_dfa (re_dfa_t *dfa, size_t pat_len) - #endif - - #ifdef RE_ENABLE_I18N -- if (dfa->mb_cur_max > 1) -+ if (dfa_mb_cur_max (dfa) > 1) - { - if (dfa->is_utf8) - dfa->sb_char = (re_bitset_ptr_t) utf8_sb_map; -@@ -1788,7 +1797,7 @@ peek_token (re_token_t *token, re_string_t *input, reg_syntax_t syntax) - token->word_char = 0; - #ifdef RE_ENABLE_I18N - token->mb_partial = 0; -- if (input->mb_cur_max > 1 && -+ if (string_mb_cur_max (input) > 1 && - !re_string_first_byte (input, re_string_cur_idx (input))) - { - token->type = CHARACTER; -@@ -1809,7 +1818,7 @@ peek_token (re_token_t *token, re_string_t *input, reg_syntax_t syntax) - token->opr.c = c2; - token->type = CHARACTER; - #ifdef RE_ENABLE_I18N -- if (input->mb_cur_max > 1) -+ if (string_mb_cur_max (input) > 1) - { - wint_t wc = re_string_wchar_at (input, - re_string_cur_idx (input) + 1); -@@ -1923,7 +1932,7 @@ peek_token (re_token_t *token, re_string_t *input, reg_syntax_t syntax) - - token->type = CHARACTER; - #ifdef RE_ENABLE_I18N -- if (input->mb_cur_max > 1) -+ if (string_mb_cur_max (input) > 1) - { - wint_t wc = re_string_wchar_at (input, re_string_cur_idx (input)); - token->word_char = IS_WIDE_WORD_CHAR (wc) != 0; -@@ -2023,7 +2032,7 @@ peek_token_bracket (re_token_t *token, re_string_t *input, reg_syntax_t syntax) - token->opr.c = c; - - #ifdef RE_ENABLE_I18N -- if (input->mb_cur_max > 1 && -+ if (string_mb_cur_max (input) > 1 && - !re_string_first_byte (input, re_string_cur_idx (input))) - { - token->type = CHARACTER; -@@ -2246,7 +2255,7 @@ parse_expression (re_string_t *regexp, regex_t *preg, re_token_t *token, - return NULL; - } - #ifdef RE_ENABLE_I18N -- if (dfa->mb_cur_max > 1) -+ if (dfa_mb_cur_max (dfa) > 1) - { - while (!re_string_eoi (regexp) - && !re_string_first_byte (regexp, re_string_cur_idx (regexp))) -@@ -2384,7 +2393,7 @@ parse_expression (re_string_t *regexp, regex_t *preg, re_token_t *token, - *err = REG_ESPACE; - return NULL; - } -- if (dfa->mb_cur_max > 1) -+ if (dfa_mb_cur_max (dfa) > 1) - dfa->has_mb_node = 1; - break; - case OP_WORD: -@@ -2690,7 +2699,7 @@ build_range_exp (bitset_t sbcset, bracket_elem_t *start_elem, - However, for !_LIBC we have no collation elements: if the - character set is single byte, the single byte character set - that we build below suffices. parse_bracket_exp passes -- no MBCSET if dfa->mb_cur_max == 1. */ -+ no MBCSET if dfa_mb_cur_max (dfa) == 1. */ - if (mbcset) - { - /* Check the space of the arrays. */ -@@ -2786,7 +2795,13 @@ parse_bracket_exp (re_string_t *regexp, re_dfa_t *dfa, re_token_t *token, - reg_syntax_t syntax, reg_errcode_t *err) - { - #ifdef _LIBC -+#if __OPTION_EGLIBC_LOCALE_CODE - const unsigned char *collseqmb; -+# define COLLSEQMB_LOOKUP(ix) (collseqmb[(ix)]) -+#else -+# define COLLSEQMB_LOOKUP(ix) (ix) -+#endif -+ - const char *collseqwc; - uint32_t nrules; - int32_t table_size; -@@ -2834,18 +2849,20 @@ parse_bracket_exp (re_string_t *regexp, re_dfa_t *dfa, re_token_t *token, - if (MB_CUR_MAX == 1) - */ - if (nrules == 0) -- return collseqmb[br_elem->opr.ch]; -+ return COLLSEQMB_LOOKUP (br_elem->opr.ch); - else - { - wint_t wc = __btowc (br_elem->opr.ch); - return __collseq_table_lookup (collseqwc, wc); - } - } -+#if __OPTION_EGLIBC_LOCALE_CODE - else if (br_elem->type == MB_CHAR) - { - if (nrules != 0) - return __collseq_table_lookup (collseqwc, br_elem->opr.wch); - } -+#endif - else if (br_elem->type == COLL_SYM) - { - size_t sym_name_len = strlen ((char *) br_elem->opr.name); -@@ -2876,11 +2893,11 @@ parse_bracket_exp (re_string_t *regexp, re_dfa_t *dfa, re_token_t *token, - { - /* No valid character. Match it as a single byte - character. */ -- return collseqmb[br_elem->opr.name[0]]; -+ return COLLSEQMB_LOOKUP (br_elem->opr.name[0]); - } - } - else if (sym_name_len == 1) -- return collseqmb[br_elem->opr.name[0]]; -+ return COLLSEQMB_LOOKUP (br_elem->opr.name[0]); - } - return UINT_MAX; - } -@@ -2920,7 +2937,7 @@ parse_bracket_exp (re_string_t *regexp, re_dfa_t *dfa, re_token_t *token, - However, if we have no collation elements, and the character set - is single byte, the single byte character set that we - build below suffices. */ -- if (nrules > 0 || dfa->mb_cur_max > 1) -+ if (nrules > 0 || dfa_mb_cur_max (dfa) > 1) - { - /* Check the space of the arrays. */ - if (BE (*range_alloc == mbcset->nranges, 0)) -@@ -2957,7 +2974,7 @@ parse_bracket_exp (re_string_t *regexp, re_dfa_t *dfa, re_token_t *token, - if (MB_CUR_MAX == 1) - */ - if (nrules == 0) -- ch_collseq = collseqmb[ch]; -+ ch_collseq = COLLSEQMB_LOOKUP (ch); - else - ch_collseq = __collseq_table_lookup (collseqwc, __btowc (ch)); - if (start_collseq <= ch_collseq && ch_collseq <= end_collseq) -@@ -3035,7 +3052,10 @@ parse_bracket_exp (re_string_t *regexp, re_dfa_t *dfa, re_token_t *token, - re_bitset_ptr_t sbcset; - #ifdef RE_ENABLE_I18N - re_charset_t *mbcset; -- int coll_sym_alloc = 0, range_alloc = 0, mbchar_alloc = 0; -+ int coll_sym_alloc = 0, range_alloc = 0; -+#if __OPTION_EGLIBC_LOCALE_CODE -+ int mbchar_alloc = 0; -+#endif - int equiv_class_alloc = 0, char_class_alloc = 0; - #endif /* not RE_ENABLE_I18N */ - int non_match = 0; -@@ -3043,9 +3063,15 @@ parse_bracket_exp (re_string_t *regexp, re_dfa_t *dfa, re_token_t *token, - int token_len; - int first_round = 1; - #ifdef _LIBC -+#if __OPTION_EGLIBC_LOCALE_CODE - collseqmb = (const unsigned char *) - _NL_CURRENT (LC_COLLATE, _NL_COLLATE_COLLSEQMB); - nrules = _NL_CURRENT_WORD (LC_COLLATE, _NL_COLLATE_NRULES); -+#else -+ /* This is true when OPTION_EGLIBC_LOCALE_CODE is disabled, but the -+ compiler can't figure that out. */ -+ nrules = 0; -+#endif - if (nrules) - { - /* -@@ -3175,7 +3201,7 @@ parse_bracket_exp (re_string_t *regexp, re_dfa_t *dfa, re_token_t *token, - #else - # ifdef RE_ENABLE_I18N - *err = build_range_exp (sbcset, -- dfa->mb_cur_max > 1 ? mbcset : NULL, -+ dfa_mb_cur_max (dfa) > 1 ? mbcset : NULL, - &range_alloc, &start_elem, &end_elem); - # else - *err = build_range_exp (sbcset, &start_elem, &end_elem); -@@ -3191,7 +3217,7 @@ parse_bracket_exp (re_string_t *regexp, re_dfa_t *dfa, re_token_t *token, - case SB_CHAR: - bitset_set (sbcset, start_elem.opr.ch); - break; --#ifdef RE_ENABLE_I18N -+#if defined RE_ENABLE_I18N && __OPTION_EGLIBC_LOCALE_CODE - case MB_CHAR: - /* Check whether the array has enough space. */ - if (BE (mbchar_alloc == mbcset->nmbchars, 0)) -@@ -3209,7 +3235,7 @@ parse_bracket_exp (re_string_t *regexp, re_dfa_t *dfa, re_token_t *token, - } - mbcset->mbchars[mbcset->nmbchars++] = start_elem.opr.wch; - break; --#endif /* RE_ENABLE_I18N */ -+#endif /* RE_ENABLE_I18N && __OPTION_EGLIBC_LOCALE_CODE */ - case EQUIV_CLASS: - *err = build_equiv_class (sbcset, - #ifdef RE_ENABLE_I18N -@@ -3259,11 +3285,11 @@ parse_bracket_exp (re_string_t *regexp, re_dfa_t *dfa, re_token_t *token, - - #ifdef RE_ENABLE_I18N - /* Ensure only single byte characters are set. */ -- if (dfa->mb_cur_max > 1) -+ if (dfa_mb_cur_max (dfa) > 1) - bitset_mask (sbcset, dfa->sb_char); - - if (mbcset->nmbchars || mbcset->ncoll_syms || mbcset->nequiv_classes -- || mbcset->nranges || (dfa->mb_cur_max > 1 && (mbcset->nchar_classes -+ || mbcset->nranges || (dfa_mb_cur_max (dfa) > 1 && (mbcset->nchar_classes - || mbcset->non_match))) - { - bin_tree_t *mbc_tree; -@@ -3332,7 +3358,7 @@ parse_bracket_element (bracket_elem_t *elem, re_string_t *regexp, - re_token_t *token, int token_len, re_dfa_t *dfa, - reg_syntax_t syntax, int accept_hyphen) - { --#ifdef RE_ENABLE_I18N -+#if defined RE_ENABLE_I18N && __OPTION_EGLIBC_LOCALE_CODE - int cur_char_size; - cur_char_size = re_string_char_size_at (regexp, re_string_cur_idx (regexp)); - if (cur_char_size > 1) -@@ -3342,7 +3368,7 @@ parse_bracket_element (bracket_elem_t *elem, re_string_t *regexp, - re_string_skip_bytes (regexp, cur_char_size); - return REG_NOERROR; - } --#endif /* RE_ENABLE_I18N */ -+#endif /* RE_ENABLE_I18N && __OPTION_EGLIBC_LOCALE_CODE */ - re_string_skip_bytes (regexp, token_len); /* Skip a token. */ - if (token->type == OP_OPEN_COLL_ELEM || token->type == OP_OPEN_CHAR_CLASS - || token->type == OP_OPEN_EQUIV_CLASS) -@@ -3422,7 +3448,9 @@ build_equiv_class (bitset_t sbcset, re_charset_t *mbcset, - build_equiv_class (bitset_t sbcset, const unsigned char *name) - #endif /* not RE_ENABLE_I18N */ - { --#ifdef _LIBC -+ /* When __OPTION_EGLIBC_LOCALE_CODE is disabled, only the C locale -+ is supported; it has no collation rules. */ -+#if defined _LIBC && __OPTION_EGLIBC_LOCALE_CODE - uint32_t nrules = _NL_CURRENT_WORD (LC_COLLATE, _NL_COLLATE_NRULES); - if (nrules != 0) - { -@@ -3492,7 +3520,7 @@ build_equiv_class (bitset_t sbcset, const unsigned char *name) - mbcset->equiv_classes[mbcset->nequiv_classes++] = idx1; - } - else --#endif /* _LIBC */ -+#endif /* _LIBC && __OPTION_EGLIBC_LOCALE_CODE */ - { - if (BE (strlen ((const char *) name) != 1, 0)) - return REG_ECOLLATE; -@@ -3526,7 +3554,7 @@ build_charclass (RE_TRANSLATE_TYPE trans, bitset_t sbcset, - && (strcmp (name, "upper") == 0 || strcmp (name, "lower") == 0)) - name = "alpha"; - --#ifdef RE_ENABLE_I18N -+#if defined RE_ENABLE_I18N && __OPTION_EGLIBC_LOCALE_CODE - /* Check the space of the arrays. */ - if (BE (*char_class_alloc == mbcset->nchar_classes, 0)) - { -@@ -3542,7 +3570,7 @@ build_charclass (RE_TRANSLATE_TYPE trans, bitset_t sbcset, - *char_class_alloc = new_char_class_alloc; - } - mbcset->char_classes[mbcset->nchar_classes++] = __wctype (name); --#endif /* RE_ENABLE_I18N */ -+#endif /* RE_ENABLE_I18N && __OPTION_EGLIBC_LOCALE_CODE */ - - #define BUILD_CHARCLASS_LOOP(ctype_func) \ - do { \ -@@ -3653,7 +3681,7 @@ build_charclass_op (re_dfa_t *dfa, RE_TRANSLATE_TYPE trans, - - #ifdef RE_ENABLE_I18N - /* Ensure only single byte characters are set. */ -- if (dfa->mb_cur_max > 1) -+ if (dfa_mb_cur_max (dfa) > 1) - bitset_mask (sbcset, dfa->sb_char); - #endif - -@@ -3665,7 +3693,7 @@ build_charclass_op (re_dfa_t *dfa, RE_TRANSLATE_TYPE trans, - goto build_word_op_espace; - - #ifdef RE_ENABLE_I18N -- if (dfa->mb_cur_max > 1) -+ if (dfa_mb_cur_max (dfa) > 1) - { - bin_tree_t *mbc_tree; - /* Build a tree for complex bracket. */ -diff --git a/posix/regex.h b/posix/regex.h -index 5b1981e..2941f94 100644 ---- a/posix/regex.h -+++ b/posix/regex.h -@@ -21,6 +21,7 @@ - #define _REGEX_H 1 - - #include <sys/types.h> -+#include <gnu/option-groups.h> - - /* Allow the use in C++ code. */ - #ifdef __cplusplus -@@ -156,6 +157,8 @@ typedef unsigned long int reg_syntax_t; - treated as 'a\{1'. */ - # define RE_INVALID_INTERVAL_ORD (RE_DEBUG << 1) - -+/* EGLIBC: Old regex implementation does not support these. */ -+# if __OPTION_POSIX_REGEXP_GLIBC - /* If this bit is set, then ignore case when matching. - If not set, then case is significant. */ - # define RE_ICASE (RE_INVALID_INTERVAL_ORD << 1) -@@ -172,6 +175,7 @@ typedef unsigned long int reg_syntax_t; - /* If this bit is set, then no_sub will be set to 1 during - re_compile_pattern. */ - # define RE_NO_SUB (RE_CONTEXT_INVALID_DUP << 1) -+# endif /* __OPTION_POSIX_REGEXP_GLIBC */ - #endif - - /* This global variable defines the particular regexp syntax to use (for -@@ -231,8 +235,13 @@ extern reg_syntax_t re_syntax_options; - (RE_CHAR_CLASSES | RE_DOT_NEWLINE | RE_DOT_NOT_NULL \ - | RE_INTERVALS | RE_NO_EMPTY_RANGES) - -+#if __OPTION_POSIX_REGEXP_GLIBC - #define RE_SYNTAX_POSIX_BASIC \ - (_RE_SYNTAX_POSIX_COMMON | RE_BK_PLUS_QM | RE_CONTEXT_INVALID_DUP) -+#else -+#define RE_SYNTAX_POSIX_BASIC \ -+ (_RE_SYNTAX_POSIX_COMMON | RE_BK_PLUS_QM) -+#endif - - /* Differs from ..._POSIX_BASIC only in that RE_BK_PLUS_QM becomes - RE_LIMITED_OPS, i.e., \? \+ \| are not recognized. Actually, this -@@ -298,9 +307,11 @@ extern reg_syntax_t re_syntax_options; - /* Like REG_NOTBOL, except for the end-of-line. */ - #define REG_NOTEOL (1 << 1) - -+#if __OPTION_POSIX_REGEXP_GLIBC - /* Use PMATCH[0] to delimit the start and end of the search in the - buffer. */ - #define REG_STARTEND (1 << 2) -+#endif - - - /* If any error codes are removed, changed, or added, update the -diff --git a/posix/regex_internal.c b/posix/regex_internal.c -index 8597d7e..d53b2a8 100644 ---- a/posix/regex_internal.c -+++ b/posix/regex_internal.c -@@ -43,8 +43,8 @@ re_string_allocate (re_string_t *pstr, const char *str, int len, int init_len, - int init_buf_len; - - /* Ensure at least one character fits into the buffers. */ -- if (init_len < dfa->mb_cur_max) -- init_len = dfa->mb_cur_max; -+ if (init_len < dfa_mb_cur_max (dfa)) -+ init_len = dfa_mb_cur_max (dfa); - init_buf_len = (len + 1 < init_len) ? len + 1: init_len; - re_string_construct_common (str, len, pstr, trans, icase, dfa); - -@@ -55,7 +55,7 @@ re_string_allocate (re_string_t *pstr, const char *str, int len, int init_len, - pstr->word_char = dfa->word_char; - pstr->word_ops_used = dfa->word_ops_used; - pstr->mbs = pstr->mbs_allocated ? pstr->mbs : (unsigned char *) str; -- pstr->valid_len = (pstr->mbs_allocated || dfa->mb_cur_max > 1) ? 0 : len; -+ pstr->valid_len = (pstr->mbs_allocated || dfa_mb_cur_max (dfa) > 1) ? 0 : len; - pstr->valid_raw_len = pstr->valid_len; - return REG_NOERROR; - } -@@ -82,7 +82,7 @@ re_string_construct (re_string_t *pstr, const char *str, int len, - if (icase) - { - #ifdef RE_ENABLE_I18N -- if (dfa->mb_cur_max > 1) -+ if (dfa_mb_cur_max (dfa) > 1) - { - while (1) - { -@@ -91,7 +91,7 @@ re_string_construct (re_string_t *pstr, const char *str, int len, - return ret; - if (pstr->valid_raw_len >= len) - break; -- if (pstr->bufs_len > pstr->valid_len + dfa->mb_cur_max) -+ if (pstr->bufs_len > pstr->valid_len + dfa_mb_cur_max (dfa)) - break; - ret = re_string_realloc_buffers (pstr, pstr->bufs_len * 2); - if (BE (ret != REG_NOERROR, 0)) -@@ -105,7 +105,7 @@ re_string_construct (re_string_t *pstr, const char *str, int len, - else - { - #ifdef RE_ENABLE_I18N -- if (dfa->mb_cur_max > 1) -+ if (dfa_mb_cur_max (dfa) > 1) - build_wcs_buffer (pstr); - else - #endif /* RE_ENABLE_I18N */ -@@ -130,7 +130,7 @@ internal_function __attribute_warn_unused_result__ - re_string_realloc_buffers (re_string_t *pstr, int new_buf_len) - { - #ifdef RE_ENABLE_I18N -- if (pstr->mb_cur_max > 1) -+ if (string_mb_cur_max (pstr) > 1) - { - wint_t *new_wcs; - -@@ -177,7 +177,7 @@ re_string_construct_common (const char *str, int len, re_string_t *pstr, - pstr->trans = trans; - pstr->icase = icase ? 1 : 0; - pstr->mbs_allocated = (trans != NULL || icase); -- pstr->mb_cur_max = dfa->mb_cur_max; -+ pstr->mb_cur_max = dfa_mb_cur_max (dfa); - pstr->is_utf8 = dfa->is_utf8; - pstr->map_notascii = dfa->map_notascii; - pstr->stop = pstr->len; -@@ -203,7 +203,7 @@ build_wcs_buffer (re_string_t *pstr) - { - #ifdef _LIBC - unsigned char buf[MB_LEN_MAX]; -- assert (MB_LEN_MAX >= pstr->mb_cur_max); -+ assert (MB_LEN_MAX >= string_mb_cur_max (pstr)); - #else - unsigned char buf[64]; - #endif -@@ -226,7 +226,7 @@ build_wcs_buffer (re_string_t *pstr) - { - int i, ch; - -- for (i = 0; i < pstr->mb_cur_max && i < remain_len; ++i) -+ for (i = 0; i < string_mb_cur_max (pstr) && i < remain_len; ++i) - { - ch = pstr->raw_mbs [pstr->raw_mbs_idx + byte_idx + i]; - buf[i] = pstr->mbs[byte_idx + i] = pstr->trans[ch]; -@@ -275,7 +275,7 @@ build_wcs_upper_buffer (re_string_t *pstr) - size_t mbclen; - #ifdef _LIBC - char buf[MB_LEN_MAX]; -- assert (MB_LEN_MAX >= pstr->mb_cur_max); -+ assert (MB_LEN_MAX >= string_mb_cur_max (pstr)); - #else - char buf[64]; - #endif -@@ -369,7 +369,7 @@ build_wcs_upper_buffer (re_string_t *pstr) - { - int i, ch; - -- for (i = 0; i < pstr->mb_cur_max && i < remain_len; ++i) -+ for (i = 0; i < string_mb_cur_max (pstr) && i < remain_len; ++i) - { - ch = pstr->raw_mbs [pstr->raw_mbs_idx + src_idx + i]; - buf[i] = pstr->trans[ch]; -@@ -567,8 +567,9 @@ re_string_translate_buffer (re_string_t *pstr) - } - - /* This function re-construct the buffers. -- Concretely, convert to wide character in case of pstr->mb_cur_max > 1, -- convert to upper case in case of REG_ICASE, apply translation. */ -+ Concretely, convert to wide character in case of -+ string_mb_cur_max (pstr) > 1, convert to upper case in case of -+ REG_ICASE, apply translation. */ - - static reg_errcode_t - internal_function __attribute_warn_unused_result__ -@@ -579,7 +580,7 @@ re_string_reconstruct (re_string_t *pstr, int idx, int eflags) - { - /* Reset buffer. */ - #ifdef RE_ENABLE_I18N -- if (pstr->mb_cur_max > 1) -+ if (string_mb_cur_max (pstr) > 1) - memset (&pstr->cur_state, '\0', sizeof (mbstate_t)); - #endif /* RE_ENABLE_I18N */ - pstr->len = pstr->raw_len; -@@ -670,7 +671,7 @@ re_string_reconstruct (re_string_t *pstr, int idx, int eflags) - pstr->tip_context = re_string_context_at (pstr, offset - 1, - eflags); - #ifdef RE_ENABLE_I18N -- if (pstr->mb_cur_max > 1) -+ if (string_mb_cur_max (pstr) > 1) - memmove (pstr->wcs, pstr->wcs + offset, - (pstr->valid_len - offset) * sizeof (wint_t)); - #endif /* RE_ENABLE_I18N */ -@@ -699,7 +700,7 @@ re_string_reconstruct (re_string_t *pstr, int idx, int eflags) - #endif - pstr->valid_len = 0; - #ifdef RE_ENABLE_I18N -- if (pstr->mb_cur_max > 1) -+ if (string_mb_cur_max (pstr) > 1) - { - int wcs_idx; - wint_t wc = WEOF; -@@ -711,7 +712,7 @@ re_string_reconstruct (re_string_t *pstr, int idx, int eflags) - /* Special case UTF-8. Multi-byte chars start with any - byte other than 0x80 - 0xbf. */ - raw = pstr->raw_mbs + pstr->raw_mbs_idx; -- end = raw + (offset - pstr->mb_cur_max); -+ end = raw + (offset - string_mb_cur_max (pstr)); - if (end < pstr->raw_mbs) - end = pstr->raw_mbs; - p = raw + offset - 1; -@@ -803,7 +804,7 @@ re_string_reconstruct (re_string_t *pstr, int idx, int eflags) - - /* Then build the buffers. */ - #ifdef RE_ENABLE_I18N -- if (pstr->mb_cur_max > 1) -+ if (string_mb_cur_max (pstr) > 1) - { - if (pstr->icase) - { -@@ -841,7 +842,7 @@ re_string_peek_byte_case (const re_string_t *pstr, int idx) - return re_string_peek_byte (pstr, idx); - - #ifdef RE_ENABLE_I18N -- if (pstr->mb_cur_max > 1 -+ if (string_mb_cur_max (pstr) > 1 - && ! re_string_is_single_byte_char (pstr, pstr->cur_idx + idx)) - return re_string_peek_byte (pstr, idx); - #endif -@@ -930,7 +931,7 @@ re_string_context_at (const re_string_t *input, int idx, int eflags) - return ((eflags & REG_NOTEOL) ? CONTEXT_ENDBUF - : CONTEXT_NEWLINE | CONTEXT_ENDBUF); - #ifdef RE_ENABLE_I18N -- if (input->mb_cur_max > 1) -+ if (string_mb_cur_max (input) > 1) - { - wint_t wc; - int wc_idx = idx; -@@ -1444,7 +1445,7 @@ re_dfa_add_node (re_dfa_t *dfa, re_token_t token) - dfa->nodes[dfa->nodes_len].constraint = 0; - #ifdef RE_ENABLE_I18N - dfa->nodes[dfa->nodes_len].accept_mb = -- (type == OP_PERIOD && dfa->mb_cur_max > 1) || type == COMPLEX_BRACKET; -+ (type == OP_PERIOD && dfa_mb_cur_max (dfa) > 1) || type == COMPLEX_BRACKET; - #endif - dfa->nexts[dfa->nodes_len] = -1; - re_node_set_init_empty (dfa->edests + dfa->nodes_len); -diff --git a/posix/regex_internal.h b/posix/regex_internal.h -index 154e969..c43909a 100644 ---- a/posix/regex_internal.h -+++ b/posix/regex_internal.h -@@ -26,6 +26,10 @@ - #include <stdlib.h> - #include <string.h> - -+#if defined _LIBC -+# include <gnu/option-groups.h> -+#endif -+ - #if defined HAVE_LANGINFO_H || defined HAVE_LANGINFO_CODESET || defined _LIBC - # include <langinfo.h> - #endif -@@ -369,6 +373,13 @@ struct re_string_t - }; - typedef struct re_string_t re_string_t; - -+/* When OPTION_EGLIBC_LOCALE_CODE is disabled, this is always 1; -+ help the compiler make use of that fact. */ -+#if __OPTION_EGLIBC_LOCALE_CODE -+# define string_mb_cur_max(str) ((str)->mb_cur_max + 0) -+#else -+# define string_mb_cur_max(str) (1) -+#endif - - struct re_dfa_t; - typedef struct re_dfa_t re_dfa_t; -@@ -654,6 +665,14 @@ struct re_dfa_t - __libc_lock_define (, lock) - }; - -+/* When OPTION_EGLIBC_LOCALE_CODE is disabled, this is always 1; -+ help the compiler make use of that fact. */ -+#if __OPTION_EGLIBC_LOCALE_CODE -+# define dfa_mb_cur_max(dfa) ((dfa)->mb_cur_max + 0) -+#else -+# define dfa_mb_cur_max(dfa) (1) -+#endif -+ - #define re_node_set_init_empty(set) memset (set, '\0', sizeof (re_node_set)) - #define re_node_set_remove(set,id) \ - (re_node_set_remove_at (set, re_node_set_contains (set, id) - 1)) -@@ -714,7 +733,7 @@ internal_function __attribute__ ((pure, unused)) - re_string_char_size_at (const re_string_t *pstr, int idx) - { - int byte_idx; -- if (pstr->mb_cur_max == 1) -+ if (string_mb_cur_max (pstr) == 1) - return 1; - for (byte_idx = 1; idx + byte_idx < pstr->valid_len; ++byte_idx) - if (pstr->wcs[idx + byte_idx] != WEOF) -@@ -726,7 +745,7 @@ static wint_t - internal_function __attribute__ ((pure, unused)) - re_string_wchar_at (const re_string_t *pstr, int idx) - { -- if (pstr->mb_cur_max == 1) -+ if (string_mb_cur_max (pstr) == 1) - return (wint_t) pstr->mbs[idx]; - return (wint_t) pstr->wcs[idx]; - } -diff --git a/posix/regexec-compat.c b/posix/regexec-compat.c -new file mode 100644 -index 0000000..0f9b7c7 ---- /dev/null -+++ b/posix/regexec-compat.c -@@ -0,0 +1,39 @@ -+/* Extended regular expression matching and search library. -+ Copyright (C) 2008 Free Software Foundation, Inc. -+ This file is part of the GNU C Library. -+ Contributed by Isamu Hasegawa <isamu@yamato.ibm.com>. -+ -+ The GNU C 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.1 of the License, or (at your option) any later version. -+ -+ The GNU C 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 the GNU C Library; if not, write to the Free -+ Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA -+ 02111-1307 USA. */ -+ -+#ifdef _LIBC -+# include <shlib-compat.h> -+versioned_symbol (libc, __regexec, regexec, GLIBC_2_3_4); -+ -+# if SHLIB_COMPAT (libc, GLIBC_2_0, GLIBC_2_3_4) -+__typeof__ (__regexec) __compat_regexec; -+ -+int -+attribute_compat_text_section -+__compat_regexec (const regex_t *__restrict preg, -+ const char *__restrict string, size_t nmatch, -+ regmatch_t pmatch[], int eflags) -+{ -+ return regexec (preg, string, nmatch, pmatch, -+ eflags & (REG_NOTBOL | REG_NOTEOL)); -+} -+compat_symbol (libc, __compat_regexec, regexec, GLIBC_2_0); -+# endif -+#endif -diff --git a/posix/regexec.c b/posix/regexec.c -index 70cd606..e3b49e4 100644 ---- a/posix/regexec.c -+++ b/posix/regexec.c -@@ -18,6 +18,7 @@ - <http://www.gnu.org/licenses/>. */ - - #include <stdint.h> -+#include <gnu/option-groups.h> - - static reg_errcode_t match_ctx_init (re_match_context_t *cache, int eflags, - int n) internal_function; -@@ -186,11 +187,11 @@ static int build_trtable (const re_dfa_t *dfa, - static int check_node_accept_bytes (const re_dfa_t *dfa, int node_idx, - const re_string_t *input, int idx) - internal_function; --# ifdef _LIBC -+# if defined _LIBC && __OPTION_EGLIBC_LOCALE_CODE - static unsigned int find_collation_sequence_value (const unsigned char *mbs, - size_t name_len) - internal_function; --# endif /* _LIBC */ -+# endif /* _LIBC && __OPTION_EGLIBC_LOCALE_CODE */ - #endif /* RE_ENABLE_I18N */ - static int group_nodes_into_DFAstates (const re_dfa_t *dfa, - const re_dfastate_t *state, -@@ -255,25 +256,9 @@ regexec (preg, string, nmatch, pmatch, eflags) - return err != REG_NOERROR; - } - --#ifdef _LIBC --# include <shlib-compat.h> --versioned_symbol (libc, __regexec, regexec, GLIBC_2_3_4); -- --# if SHLIB_COMPAT (libc, GLIBC_2_0, GLIBC_2_3_4) --__typeof__ (__regexec) __compat_regexec; -- --int --attribute_compat_text_section --__compat_regexec (const regex_t *__restrict preg, -- const char *__restrict string, size_t nmatch, -- regmatch_t pmatch[], int eflags) --{ -- return regexec (preg, string, nmatch, pmatch, -- eflags & (REG_NOTBOL | REG_NOTEOL)); --} --compat_symbol (libc, __compat_regexec, regexec, GLIBC_2_0); --# endif --#endif -+/* EGLIBC: The code that used to be here was move to a separate file -+ so that it can be shared with xregex.c. */ -+#include "regexec-compat.c" - - /* Entry points for GNU code. */ - -@@ -728,7 +713,7 @@ re_search_internal (preg, string, length, start, range, stop, nmatch, pmatch, - incr = (range < 0) ? -1 : 1; - left_lim = (range < 0) ? start + range : start; - right_lim = (range < 0) ? start : start + range; -- sb = dfa->mb_cur_max == 1; -+ sb = dfa_mb_cur_max (dfa) == 1; - match_kind = - (fastmap - ? ((sb || !(preg->syntax & RE_ICASE || t) ? 4 : 0) -@@ -3448,7 +3433,7 @@ out_free: - if (BE (dest_states_word[i] == NULL && err != REG_NOERROR, 0)) - goto out_free; - -- if (dest_states[i] != dest_states_word[i] && dfa->mb_cur_max > 1) -+ if (dest_states[i] != dest_states_word[i] && dfa_mb_cur_max (dfa) > 1) - need_word_trtable = 1; - - dest_states_nl[i] = re_acquire_state_context (&err, dfa, &follows, -@@ -3590,7 +3575,7 @@ group_nodes_into_DFAstates (const re_dfa_t *dfa, const re_dfastate_t *state, - else if (type == OP_PERIOD) - { - #ifdef RE_ENABLE_I18N -- if (dfa->mb_cur_max > 1) -+ if (dfa_mb_cur_max (dfa) > 1) - bitset_merge (accepts, dfa->sb_char); - else - #endif -@@ -3641,7 +3626,7 @@ group_nodes_into_DFAstates (const re_dfa_t *dfa, const re_dfastate_t *state, - continue; - } - #ifdef RE_ENABLE_I18N -- if (dfa->mb_cur_max > 1) -+ if (dfa_mb_cur_max (dfa) > 1) - for (j = 0; j < BITSET_WORDS; ++j) - any_set |= (accepts[j] &= (dfa->word_char[j] | ~dfa->sb_char[j])); - else -@@ -3660,7 +3645,7 @@ group_nodes_into_DFAstates (const re_dfa_t *dfa, const re_dfastate_t *state, - continue; - } - #ifdef RE_ENABLE_I18N -- if (dfa->mb_cur_max > 1) -+ if (dfa_mb_cur_max (dfa) > 1) - for (j = 0; j < BITSET_WORDS; ++j) - any_set |= (accepts[j] &= ~(dfa->word_char[j] & dfa->sb_char[j])); - else -@@ -3836,12 +3821,6 @@ check_node_accept_bytes (const re_dfa_t *dfa, int node_idx, - if (node->type == COMPLEX_BRACKET) - { - const re_charset_t *cset = node->opr.mbcset; --# ifdef _LIBC -- const unsigned char *pin -- = ((const unsigned char *) re_string_get_buffer (input) + str_idx); -- int j; -- uint32_t nrules; --# endif /* _LIBC */ - int match_len = 0; - wchar_t wc = ((cset->nranges || cset->nchar_classes || cset->nmbchars) - ? re_string_wchar_at (input, str_idx) : 0); -@@ -3853,6 +3832,7 @@ check_node_accept_bytes (const re_dfa_t *dfa, int node_idx, - match_len = char_len; - goto check_node_accept_bytes_match; - } -+#if __OPTION_EGLIBC_LOCALE_CODE - /* match with character_class? */ - for (i = 0; i < cset->nchar_classes; ++i) - { -@@ -3863,14 +3843,22 @@ check_node_accept_bytes (const re_dfa_t *dfa, int node_idx, - goto check_node_accept_bytes_match; - } - } -+#endif -+ -+ /* When __OPTION_EGLIBC_LOCALE_CODE is disabled, only the C -+ locale is supported; it has no collation rules. */ -+# if defined _LIBC && __OPTION_EGLIBC_LOCALE_CODE -+ const unsigned char *pin -+ = ((const unsigned char *) re_string_get_buffer (input) + str_idx); -+ int j; -+ uint32_t nrules; - --# ifdef _LIBC - nrules = _NL_CURRENT_WORD (LC_COLLATE, _NL_COLLATE_NRULES); - if (nrules != 0) - { - unsigned int in_collseq = 0; - const int32_t *table, *indirect; -- const unsigned char *weights, *extra; -+ const unsigned char *weights, *extra = NULL; - const char *collseqwc; - - /* match with collating_symbol? */ -@@ -3955,8 +3943,12 @@ check_node_accept_bytes (const re_dfa_t *dfa, int node_idx, - } - } - else --# endif /* _LIBC */ -+# endif /* _LIBC && __OPTION_EGLIBC_LOCALE_CODE */ - { -+ /* In the _LIBC version, if OPTION_EGLIBC_LOCALE_CODE is -+ disabled, there can be no multibyte range endpoints, and -+ cset->nranges is always zero. */ -+#if __OPTION_EGLIBC_LOCALE_CODE - /* match with range expression? */ - #if __GNUC__ >= 2 - wchar_t cmp_buf[] = {L'\0', L'\0', wc, L'\0', L'\0', L'\0'}; -@@ -3975,6 +3967,7 @@ check_node_accept_bytes (const re_dfa_t *dfa, int node_idx, - goto check_node_accept_bytes_match; - } - } -+#endif /* __OPTION_EGLIBC_LOCALE_CODE */ - } - check_node_accept_bytes_match: - if (!cset->non_match) -@@ -3990,7 +3983,7 @@ check_node_accept_bytes (const re_dfa_t *dfa, int node_idx, - return 0; - } - --# ifdef _LIBC -+# if defined _LIBC && __OPTION_EGLIBC_LOCALE_CODE - static unsigned int - internal_function - find_collation_sequence_value (const unsigned char *mbs, size_t mbs_len) -@@ -4048,7 +4041,7 @@ find_collation_sequence_value (const unsigned char *mbs, size_t mbs_len) - return UINT_MAX; - } - } --# endif /* _LIBC */ -+# endif /* _LIBC && __OPTION_EGLIBC_LOCALE_CODE */ - #endif /* RE_ENABLE_I18N */ - - /* Check whether the node accepts the byte which is IDX-th -@@ -4139,7 +4132,7 @@ extend_buffers (re_match_context_t *mctx, int min_len) - if (pstr->icase) - { - #ifdef RE_ENABLE_I18N -- if (pstr->mb_cur_max > 1) -+ if (string_mb_cur_max (pstr) > 1) - { - ret = build_wcs_upper_buffer (pstr); - if (BE (ret != REG_NOERROR, 0)) -@@ -4152,7 +4145,7 @@ extend_buffers (re_match_context_t *mctx, int min_len) - else - { - #ifdef RE_ENABLE_I18N -- if (pstr->mb_cur_max > 1) -+ if (string_mb_cur_max (pstr) > 1) - build_wcs_buffer (pstr); - else - #endif /* RE_ENABLE_I18N */ -diff --git a/posix/xregex.c b/posix/xregex.c -new file mode 100644 -index 0000000..d3f7ace ---- /dev/null -+++ b/posix/xregex.c -@@ -0,0 +1,8215 @@ -+/* Extended regular expression matching and search library, -+ version 0.12. -+ (Implements POSIX draft P1003.2/D11.2, except for some of the -+ internationalization features.) -+ -+ Copyright (C) 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, -+ 2002, 2005 Free Software Foundation, Inc. -+ This file is part of the GNU C Library. -+ -+ The GNU C 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.1 of the License, or (at your option) any later version. -+ -+ The GNU C 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 the GNU C Library; if not, write to the Free -+ Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA -+ 02110-1301 USA. */ -+ -+/* AIX requires this to be the first thing in the file. */ -+#if defined _AIX && !defined __GNUC__ && !defined REGEX_MALLOC -+ #pragma alloca -+#endif -+ -+#undef _GNU_SOURCE -+#define _GNU_SOURCE -+ -+#ifndef INSIDE_RECURSION -+# ifdef HAVE_CONFIG_H -+# include <config.h> -+# endif -+#endif -+ -+/*#include <ansidecl.h>*/ -+ -+ -+#ifndef INSIDE_RECURSION -+ -+# if defined STDC_HEADERS && !defined emacs -+# include <stddef.h> -+# else -+/* We need this for `regex.h', and perhaps for the Emacs include files. */ -+# include <sys/types.h> -+# endif -+ -+# if (defined HAVE_WCTYPE_H && defined HAVE_WCHAR_H && defined HAVE_BTOWC) -+# define WIDE_CHAR_SUPPORT (HAVE_WCTYPE_H && HAVE_WCHAR_H && HAVE_BTOWC) -+# else -+# define WIDE_CHAR_SUPPORT 0 -+# endif -+/* For platform which support the ISO C amendement 1 functionality we -+ support user defined character classes. */ -+# if WIDE_CHAR_SUPPORT -+/* Solaris 2.5 has a bug: <wchar.h> must be included before <wctype.h>. */ -+# include <wchar.h> -+# include <wctype.h> -+# endif -+ -+# ifdef _LIBC -+/* We have to keep the namespace clean. */ -+# define regfree(preg) __regfree (preg) -+# define regexec(pr, st, nm, pm, ef) __regexec (pr, st, nm, pm, ef) -+# define regcomp(preg, pattern, cflags) __regcomp (preg, pattern, cflags) -+# define regerror(errcode, preg, errbuf, errbuf_size) \ -+ __regerror(errcode, preg, errbuf, errbuf_size) -+# define re_set_registers(bu, re, nu, st, en) \ -+ __re_set_registers (bu, re, nu, st, en) -+# define re_match_2(bufp, string1, size1, string2, size2, pos, regs, stop) \ -+ __re_match_2 (bufp, string1, size1, string2, size2, pos, regs, stop) -+# define re_match(bufp, string, size, pos, regs) \ -+ __re_match (bufp, string, size, pos, regs) -+# define re_search(bufp, string, size, startpos, range, regs) \ -+ __re_search (bufp, string, size, startpos, range, regs) -+# define re_compile_pattern(pattern, length, bufp) \ -+ __re_compile_pattern (pattern, length, bufp) -+# define re_set_syntax(syntax) __re_set_syntax (syntax) -+# define re_search_2(bufp, st1, s1, st2, s2, startpos, range, regs, stop) \ -+ __re_search_2 (bufp, st1, s1, st2, s2, startpos, range, regs, stop) -+# define re_compile_fastmap(bufp) __re_compile_fastmap (bufp) -+ -+# define btowc __btowc -+ -+/* We are also using some library internals. */ -+# include <locale/localeinfo.h> -+# include <locale/elem-hash.h> -+# include <langinfo.h> -+# include <locale/coll-lookup.h> -+# endif -+ -+/* This is for other GNU distributions with internationalized messages. */ -+# if (HAVE_LIBINTL_H && ENABLE_NLS) || defined _LIBC -+# include <libintl.h> -+# ifdef _LIBC -+# undef gettext -+# define gettext(msgid) __dcgettext ("libc", msgid, LC_MESSAGES) -+# endif -+# else -+# define gettext(msgid) (msgid) -+# endif -+ -+# ifndef gettext_noop -+/* This define is so xgettext can find the internationalizable -+ strings. */ -+# define gettext_noop(String) String -+# endif -+ -+/* The `emacs' switch turns on certain matching commands -+ that make sense only in Emacs. */ -+# ifdef emacs -+ -+# include "lisp.h" -+# include "buffer.h" -+# include "syntax.h" -+ -+# else /* not emacs */ -+ -+/* If we are not linking with Emacs proper, -+ we can't use the relocating allocator -+ even if config.h says that we can. */ -+# undef REL_ALLOC -+ -+# if defined STDC_HEADERS || defined _LIBC -+# include <stdlib.h> -+# else -+char *malloc (); -+char *realloc (); -+# endif -+ -+/* When used in Emacs's lib-src, we need to get bzero and bcopy somehow. -+ If nothing else has been done, use the method below. */ -+# ifdef INHIBIT_STRING_HEADER -+# if !(defined HAVE_BZERO && defined HAVE_BCOPY) -+# if !defined bzero && !defined bcopy -+# undef INHIBIT_STRING_HEADER -+# endif -+# endif -+# endif -+ -+/* This is the normal way of making sure we have a bcopy and a bzero. -+ This is used in most programs--a few other programs avoid this -+ by defining INHIBIT_STRING_HEADER. */ -+# ifndef INHIBIT_STRING_HEADER -+# if defined HAVE_STRING_H || defined STDC_HEADERS || defined _LIBC -+# include <string.h> -+# ifndef bzero -+# ifndef _LIBC -+# define bzero(s, n) (memset (s, '\0', n), (s)) -+# else -+# define bzero(s, n) __bzero (s, n) -+# endif -+# endif -+# else -+# include <strings.h> -+# ifndef memcmp -+# define memcmp(s1, s2, n) bcmp (s1, s2, n) -+# endif -+# ifndef memcpy -+# define memcpy(d, s, n) (bcopy (s, d, n), (d)) -+# endif -+# endif -+# endif -+ -+/* Define the syntax stuff for \<, \>, etc. */ -+ -+/* This must be nonzero for the wordchar and notwordchar pattern -+ commands in re_match_2. */ -+# ifndef Sword -+# define Sword 1 -+# endif -+ -+# ifdef SWITCH_ENUM_BUG -+# define SWITCH_ENUM_CAST(x) ((int)(x)) -+# else -+# define SWITCH_ENUM_CAST(x) (x) -+# endif -+ -+# endif /* not emacs */ -+ -+# if defined _LIBC || HAVE_LIMITS_H -+# include <limits.h> -+# endif -+ -+# ifndef MB_LEN_MAX -+# define MB_LEN_MAX 1 -+# endif -+ -+/* Get the interface, including the syntax bits. */ -+# include "regex.h" -+ -+/* isalpha etc. are used for the character classes. */ -+# include <ctype.h> -+ -+/* Jim Meyering writes: -+ -+ "... Some ctype macros are valid only for character codes that -+ isascii says are ASCII (SGI's IRIX-4.0.5 is one such system --when -+ using /bin/cc or gcc but without giving an ansi option). So, all -+ ctype uses should be through macros like ISPRINT... If -+ STDC_HEADERS is defined, then autoconf has verified that the ctype -+ macros don't need to be guarded with references to isascii. ... -+ Defining isascii to 1 should let any compiler worth its salt -+ eliminate the && through constant folding." -+ Solaris defines some of these symbols so we must undefine them first. */ -+ -+# undef ISASCII -+# if defined STDC_HEADERS || (!defined isascii && !defined HAVE_ISASCII) -+# define ISASCII(c) 1 -+# else -+# define ISASCII(c) isascii(c) -+# endif -+ -+# ifdef isblank -+# define ISBLANK(c) (ISASCII (c) && isblank (c)) -+# else -+# define ISBLANK(c) ((c) == ' ' || (c) == '\t') -+# endif -+# ifdef isgraph -+# define ISGRAPH(c) (ISASCII (c) && isgraph (c)) -+# else -+# define ISGRAPH(c) (ISASCII (c) && isprint (c) && !isspace (c)) -+# endif -+ -+# undef ISPRINT -+# define ISPRINT(c) (ISASCII (c) && isprint (c)) -+# define ISDIGIT(c) (ISASCII (c) && isdigit (c)) -+# define ISALNUM(c) (ISASCII (c) && isalnum (c)) -+# define ISALPHA(c) (ISASCII (c) && isalpha (c)) -+# define ISCNTRL(c) (ISASCII (c) && iscntrl (c)) -+# define ISLOWER(c) (ISASCII (c) && islower (c)) -+# define ISPUNCT(c) (ISASCII (c) && ispunct (c)) -+# define ISSPACE(c) (ISASCII (c) && isspace (c)) -+# define ISUPPER(c) (ISASCII (c) && isupper (c)) -+# define ISXDIGIT(c) (ISASCII (c) && isxdigit (c)) -+ -+# ifdef _tolower -+# define TOLOWER(c) _tolower(c) -+# else -+# define TOLOWER(c) tolower(c) -+# endif -+ -+# ifndef NULL -+# define NULL (void *)0 -+# endif -+ -+/* We remove any previous definition of `SIGN_EXTEND_CHAR', -+ since ours (we hope) works properly with all combinations of -+ machines, compilers, `char' and `unsigned char' argument types. -+ (Per Bothner suggested the basic approach.) */ -+# undef SIGN_EXTEND_CHAR -+# if __STDC__ -+# define SIGN_EXTEND_CHAR(c) ((signed char) (c)) -+# else /* not __STDC__ */ -+/* As in Harbison and Steele. */ -+# define SIGN_EXTEND_CHAR(c) ((((unsigned char) (c)) ^ 128) - 128) -+# endif -+ -+# ifndef emacs -+/* How many characters in the character set. */ -+# define CHAR_SET_SIZE 256 -+ -+# ifdef SYNTAX_TABLE -+ -+extern char *re_syntax_table; -+ -+# else /* not SYNTAX_TABLE */ -+ -+static char re_syntax_table[CHAR_SET_SIZE]; -+ -+static void init_syntax_once (void); -+ -+static void -+init_syntax_once (void) -+{ -+ register int c; -+ static int done = 0; -+ -+ if (done) -+ return; -+ bzero (re_syntax_table, sizeof re_syntax_table); -+ -+ for (c = 0; c < CHAR_SET_SIZE; ++c) -+ if (ISALNUM (c)) -+ re_syntax_table[c] = Sword; -+ -+ re_syntax_table['_'] = Sword; -+ -+ done = 1; -+} -+ -+# endif /* not SYNTAX_TABLE */ -+ -+# define SYNTAX(c) re_syntax_table[(unsigned char) (c)] -+ -+# endif /* emacs */ -+ -+/* Integer type for pointers. */ -+# if !defined _LIBC && !defined HAVE_UINTPTR_T -+typedef unsigned long int uintptr_t; -+# endif -+ -+/* Should we use malloc or alloca? If REGEX_MALLOC is not defined, we -+ use `alloca' instead of `malloc'. This is because using malloc in -+ re_search* or re_match* could cause memory leaks when C-g is used in -+ Emacs; also, malloc is slower and causes storage fragmentation. On -+ the other hand, malloc is more portable, and easier to debug. -+ -+ Because we sometimes use alloca, some routines have to be macros, -+ not functions -- `alloca'-allocated space disappears at the end of the -+ function it is called in. */ -+ -+# ifdef REGEX_MALLOC -+ -+# define REGEX_ALLOCATE malloc -+# define REGEX_REALLOCATE(source, osize, nsize) realloc (source, nsize) -+# define REGEX_FREE free -+ -+# else /* not REGEX_MALLOC */ -+ -+/* Emacs already defines alloca, sometimes. */ -+# ifndef alloca -+ -+/* Make alloca work the best possible way. */ -+# ifdef __GNUC__ -+# define alloca __builtin_alloca -+# else /* not __GNUC__ */ -+# if HAVE_ALLOCA_H -+# include <alloca.h> -+# endif /* HAVE_ALLOCA_H */ -+# endif /* not __GNUC__ */ -+ -+# endif /* not alloca */ -+ -+# define REGEX_ALLOCATE alloca -+ -+/* Assumes a `char *destination' variable. */ -+# define REGEX_REALLOCATE(source, osize, nsize) \ -+ (destination = (char *) alloca (nsize), \ -+ memcpy (destination, source, osize)) -+ -+/* No need to do anything to free, after alloca. */ -+# define REGEX_FREE(arg) ((void)0) /* Do nothing! But inhibit gcc warning. */ -+ -+# endif /* not REGEX_MALLOC */ -+ -+/* Define how to allocate the failure stack. */ -+ -+# if defined REL_ALLOC && defined REGEX_MALLOC -+ -+# define REGEX_ALLOCATE_STACK(size) \ -+ r_alloc (&failure_stack_ptr, (size)) -+# define REGEX_REALLOCATE_STACK(source, osize, nsize) \ -+ r_re_alloc (&failure_stack_ptr, (nsize)) -+# define REGEX_FREE_STACK(ptr) \ -+ r_alloc_free (&failure_stack_ptr) -+ -+# else /* not using relocating allocator */ -+ -+# ifdef REGEX_MALLOC -+ -+# define REGEX_ALLOCATE_STACK malloc -+# define REGEX_REALLOCATE_STACK(source, osize, nsize) realloc (source, nsize) -+# define REGEX_FREE_STACK free -+ -+# else /* not REGEX_MALLOC */ -+ -+# define REGEX_ALLOCATE_STACK alloca -+ -+# define REGEX_REALLOCATE_STACK(source, osize, nsize) \ -+ REGEX_REALLOCATE (source, osize, nsize) -+/* No need to explicitly free anything. */ -+# define REGEX_FREE_STACK(arg) -+ -+# endif /* not REGEX_MALLOC */ -+# endif /* not using relocating allocator */ -+ -+ -+/* True if `size1' is non-NULL and PTR is pointing anywhere inside -+ `string1' or just past its end. This works if PTR is NULL, which is -+ a good thing. */ -+# define FIRST_STRING_P(ptr) \ -+ (size1 && string1 <= (ptr) && (ptr) <= string1 + size1) -+ -+/* (Re)Allocate N items of type T using malloc, or fail. */ -+# define TALLOC(n, t) ((t *) malloc ((n) * sizeof (t))) -+# define RETALLOC(addr, n, t) ((addr) = (t *) realloc (addr, (n) * sizeof (t))) -+# define RETALLOC_IF(addr, n, t) \ -+ if (addr) RETALLOC((addr), (n), t); else (addr) = TALLOC ((n), t) -+# define REGEX_TALLOC(n, t) ((t *) REGEX_ALLOCATE ((n) * sizeof (t))) -+ -+# define BYTEWIDTH 8 /* In bits. */ -+ -+# define STREQ(s1, s2) ((strcmp (s1, s2) == 0)) -+ -+# undef MAX -+# undef MIN -+# define MAX(a, b) ((a) > (b) ? (a) : (b)) -+# define MIN(a, b) ((a) < (b) ? (a) : (b)) -+ -+typedef char boolean; -+# define false 0 -+# define true 1 -+ -+static reg_errcode_t byte_regex_compile (const char *pattern, size_t size, -+ reg_syntax_t syntax, -+ struct re_pattern_buffer *bufp); -+ -+static int byte_re_match_2_internal (struct re_pattern_buffer *bufp, -+ const char *string1, int size1, -+ const char *string2, int size2, -+ int pos, -+ struct re_registers *regs, -+ int stop); -+static int byte_re_search_2 (struct re_pattern_buffer *bufp, -+ const char *string1, int size1, -+ const char *string2, int size2, -+ int startpos, int range, -+ struct re_registers *regs, int stop); -+static int byte_re_compile_fastmap (struct re_pattern_buffer *bufp); -+ -+#ifdef MBS_SUPPORT -+static reg_errcode_t wcs_regex_compile (const char *pattern, size_t size, -+ reg_syntax_t syntax, -+ struct re_pattern_buffer *bufp); -+ -+ -+static int wcs_re_match_2_internal (struct re_pattern_buffer *bufp, -+ const char *cstring1, int csize1, -+ const char *cstring2, int csize2, -+ int pos, -+ struct re_registers *regs, -+ int stop, -+ wchar_t *string1, int size1, -+ wchar_t *string2, int size2, -+ int *mbs_offset1, int *mbs_offset2); -+static int wcs_re_search_2 (struct re_pattern_buffer *bufp, -+ const char *string1, int size1, -+ const char *string2, int size2, -+ int startpos, int range, -+ struct re_registers *regs, int stop); -+static int wcs_re_compile_fastmap (struct re_pattern_buffer *bufp); -+#endif -+ -+/* These are the command codes that appear in compiled regular -+ expressions. Some opcodes are followed by argument bytes. A -+ command code can specify any interpretation whatsoever for its -+ arguments. Zero bytes may appear in the compiled regular expression. */ -+ -+typedef enum -+{ -+ no_op = 0, -+ -+ /* Succeed right away--no more backtracking. */ -+ succeed, -+ -+ /* Followed by one byte giving n, then by n literal bytes. */ -+ exactn, -+ -+# ifdef MBS_SUPPORT -+ /* Same as exactn, but contains binary data. */ -+ exactn_bin, -+# endif -+ -+ /* Matches any (more or less) character. */ -+ anychar, -+ -+ /* Matches any one char belonging to specified set. First -+ following byte is number of bitmap bytes. Then come bytes -+ for a bitmap saying which chars are in. Bits in each byte -+ are ordered low-bit-first. A character is in the set if its -+ bit is 1. A character too large to have a bit in the map is -+ automatically not in the set. */ -+ /* ifdef MBS_SUPPORT, following element is length of character -+ classes, length of collating symbols, length of equivalence -+ classes, length of character ranges, and length of characters. -+ Next, character class element, collating symbols elements, -+ equivalence class elements, range elements, and character -+ elements follow. -+ See regex_compile function. */ -+ charset, -+ -+ /* Same parameters as charset, but match any character that is -+ not one of those specified. */ -+ charset_not, -+ -+ /* Start remembering the text that is matched, for storing in a -+ register. Followed by one byte with the register number, in -+ the range 0 to one less than the pattern buffer's re_nsub -+ field. Then followed by one byte with the number of groups -+ inner to this one. (This last has to be part of the -+ start_memory only because we need it in the on_failure_jump -+ of re_match_2.) */ -+ start_memory, -+ -+ /* Stop remembering the text that is matched and store it in a -+ memory register. Followed by one byte with the register -+ number, in the range 0 to one less than `re_nsub' in the -+ pattern buffer, and one byte with the number of inner groups, -+ just like `start_memory'. (We need the number of inner -+ groups here because we don't have any easy way of finding the -+ corresponding start_memory when we're at a stop_memory.) */ -+ stop_memory, -+ -+ /* Match a duplicate of something remembered. Followed by one -+ byte containing the register number. */ -+ duplicate, -+ -+ /* Fail unless at beginning of line. */ -+ begline, -+ -+ /* Fail unless at end of line. */ -+ endline, -+ -+ /* Succeeds if at beginning of buffer (if emacs) or at beginning -+ of string to be matched (if not). */ -+ begbuf, -+ -+ /* Analogously, for end of buffer/string. */ -+ endbuf, -+ -+ /* Followed by two byte relative address to which to jump. */ -+ jump, -+ -+ /* Same as jump, but marks the end of an alternative. */ -+ jump_past_alt, -+ -+ /* Followed by two-byte relative address of place to resume at -+ in case of failure. */ -+ /* ifdef MBS_SUPPORT, the size of address is 1. */ -+ on_failure_jump, -+ -+ /* Like on_failure_jump, but pushes a placeholder instead of the -+ current string position when executed. */ -+ on_failure_keep_string_jump, -+ -+ /* Throw away latest failure point and then jump to following -+ two-byte relative address. */ -+ /* ifdef MBS_SUPPORT, the size of address is 1. */ -+ pop_failure_jump, -+ -+ /* Change to pop_failure_jump if know won't have to backtrack to -+ match; otherwise change to jump. This is used to jump -+ back to the beginning of a repeat. If what follows this jump -+ clearly won't match what the repeat does, such that we can be -+ sure that there is no use backtracking out of repetitions -+ already matched, then we change it to a pop_failure_jump. -+ Followed by two-byte address. */ -+ /* ifdef MBS_SUPPORT, the size of address is 1. */ -+ maybe_pop_jump, -+ -+ /* Jump to following two-byte address, and push a dummy failure -+ point. This failure point will be thrown away if an attempt -+ is made to use it for a failure. A `+' construct makes this -+ before the first repeat. Also used as an intermediary kind -+ of jump when compiling an alternative. */ -+ /* ifdef MBS_SUPPORT, the size of address is 1. */ -+ dummy_failure_jump, -+ -+ /* Push a dummy failure point and continue. Used at the end of -+ alternatives. */ -+ push_dummy_failure, -+ -+ /* Followed by two-byte relative address and two-byte number n. -+ After matching N times, jump to the address upon failure. */ -+ /* ifdef MBS_SUPPORT, the size of address is 1. */ -+ succeed_n, -+ -+ /* Followed by two-byte relative address, and two-byte number n. -+ Jump to the address N times, then fail. */ -+ /* ifdef MBS_SUPPORT, the size of address is 1. */ -+ jump_n, -+ -+ /* Set the following two-byte relative address to the -+ subsequent two-byte number. The address *includes* the two -+ bytes of number. */ -+ /* ifdef MBS_SUPPORT, the size of address is 1. */ -+ set_number_at, -+ -+ wordchar, /* Matches any word-constituent character. */ -+ notwordchar, /* Matches any char that is not a word-constituent. */ -+ -+ wordbeg, /* Succeeds if at word beginning. */ -+ wordend, /* Succeeds if at word end. */ -+ -+ wordbound, /* Succeeds if at a word boundary. */ -+ notwordbound /* Succeeds if not at a word boundary. */ -+ -+# ifdef emacs -+ ,before_dot, /* Succeeds if before point. */ -+ at_dot, /* Succeeds if at point. */ -+ after_dot, /* Succeeds if after point. */ -+ -+ /* Matches any character whose syntax is specified. Followed by -+ a byte which contains a syntax code, e.g., Sword. */ -+ syntaxspec, -+ -+ /* Matches any character whose syntax is not that specified. */ -+ notsyntaxspec -+# endif /* emacs */ -+} re_opcode_t; -+#endif /* not INSIDE_RECURSION */ -+ -+ -+#ifdef BYTE -+# define CHAR_T char -+# define UCHAR_T unsigned char -+# define COMPILED_BUFFER_VAR bufp->buffer -+# define OFFSET_ADDRESS_SIZE 2 -+# define PREFIX(name) byte_##name -+# define ARG_PREFIX(name) name -+# define PUT_CHAR(c) putchar (c) -+# include <locale/weight.h> -+# define FINDIDX findidx -+#else -+# ifdef WCHAR -+# define CHAR_T wchar_t -+# define UCHAR_T wchar_t -+# define COMPILED_BUFFER_VAR wc_buffer -+# define OFFSET_ADDRESS_SIZE 1 /* the size which STORE_NUMBER macro use */ -+# define CHAR_CLASS_SIZE ((__alignof__(wctype_t)+sizeof(wctype_t))/sizeof(CHAR_T)+1) -+# define PREFIX(name) wcs_##name -+# define ARG_PREFIX(name) c##name -+/* Should we use wide stream?? */ -+# define PUT_CHAR(c) printf ("%C", c); -+# define TRUE 1 -+# define FALSE 0 -+# define findidx findidxwc -+# include <locale/weightwc.h> -+# undef findidx -+# define FINDIDX findidxwc -+# else -+# ifdef MBS_SUPPORT -+# define WCHAR -+# define INSIDE_RECURSION -+# include "xregex.c" -+# undef INSIDE_RECURSION -+# endif -+# define BYTE -+# define INSIDE_RECURSION -+# include "xregex.c" -+# undef INSIDE_RECURSION -+# endif -+#endif -+ -+#ifdef INSIDE_RECURSION -+/* Common operations on the compiled pattern. */ -+ -+/* Store NUMBER in two contiguous bytes starting at DESTINATION. */ -+/* ifdef MBS_SUPPORT, we store NUMBER in 1 element. */ -+ -+# ifdef WCHAR -+# define STORE_NUMBER(destination, number) \ -+ do { \ -+ *(destination) = (UCHAR_T)(number); \ -+ } while (0) -+# else /* BYTE */ -+# define STORE_NUMBER(destination, number) \ -+ do { \ -+ (destination)[0] = (number) & 0377; \ -+ (destination)[1] = (number) >> 8; \ -+ } while (0) -+# endif /* WCHAR */ -+ -+/* Same as STORE_NUMBER, except increment DESTINATION to -+ the byte after where the number is stored. Therefore, DESTINATION -+ must be an lvalue. */ -+/* ifdef MBS_SUPPORT, we store NUMBER in 1 element. */ -+ -+# define STORE_NUMBER_AND_INCR(destination, number) \ -+ do { \ -+ STORE_NUMBER (destination, number); \ -+ (destination) += OFFSET_ADDRESS_SIZE; \ -+ } while (0) -+ -+/* Put into DESTINATION a number stored in two contiguous bytes starting -+ at SOURCE. */ -+/* ifdef MBS_SUPPORT, we store NUMBER in 1 element. */ -+ -+# ifdef WCHAR -+# define EXTRACT_NUMBER(destination, source) \ -+ do { \ -+ (destination) = *(source); \ -+ } while (0) -+# else /* BYTE */ -+# define EXTRACT_NUMBER(destination, source) \ -+ do { \ -+ (destination) = *(source) & 0377; \ -+ (destination) += SIGN_EXTEND_CHAR (*((source) + 1)) << 8; \ -+ } while (0) -+# endif -+ -+# ifdef DEBUG -+static void PREFIX(extract_number) (int *dest, UCHAR_T *source); -+static void -+PREFIX(extract_number) (int *dest, UCHAR_T *source) -+{ -+# ifdef WCHAR -+ *dest = *source; -+# else /* BYTE */ -+ int temp = SIGN_EXTEND_CHAR (*(source + 1)); -+ *dest = *source & 0377; -+ *dest += temp << 8; -+# endif -+} -+ -+# ifndef EXTRACT_MACROS /* To debug the macros. */ -+# undef EXTRACT_NUMBER -+# define EXTRACT_NUMBER(dest, src) PREFIX(extract_number) (&dest, src) -+# endif /* not EXTRACT_MACROS */ -+ -+# endif /* DEBUG */ -+ -+/* Same as EXTRACT_NUMBER, except increment SOURCE to after the number. -+ SOURCE must be an lvalue. */ -+ -+# define EXTRACT_NUMBER_AND_INCR(destination, source) \ -+ do { \ -+ EXTRACT_NUMBER (destination, source); \ -+ (source) += OFFSET_ADDRESS_SIZE; \ -+ } while (0) -+ -+# ifdef DEBUG -+static void PREFIX(extract_number_and_incr) (int *destination, -+ UCHAR_T **source); -+static void -+PREFIX(extract_number_and_incr) (int *destination, UCHAR_T **source) -+{ -+ PREFIX(extract_number) (destination, *source); -+ *source += OFFSET_ADDRESS_SIZE; -+} -+ -+# ifndef EXTRACT_MACROS -+# undef EXTRACT_NUMBER_AND_INCR -+# define EXTRACT_NUMBER_AND_INCR(dest, src) \ -+ PREFIX(extract_number_and_incr) (&dest, &src) -+# endif /* not EXTRACT_MACROS */ -+ -+# endif /* DEBUG */ -+ -+ -+ -+/* If DEBUG is defined, Regex prints many voluminous messages about what -+ it is doing (if the variable `debug' is nonzero). If linked with the -+ main program in `iregex.c', you can enter patterns and strings -+ interactively. And if linked with the main program in `main.c' and -+ the other test files, you can run the already-written tests. */ -+ -+# ifdef DEBUG -+ -+# ifndef DEFINED_ONCE -+ -+/* We use standard I/O for debugging. */ -+# include <stdio.h> -+ -+/* It is useful to test things that ``must'' be true when debugging. */ -+# include <assert.h> -+ -+static int debug; -+ -+# define DEBUG_STATEMENT(e) e -+# define DEBUG_PRINT1(x) if (debug) printf (x) -+# define DEBUG_PRINT2(x1, x2) if (debug) printf (x1, x2) -+# define DEBUG_PRINT3(x1, x2, x3) if (debug) printf (x1, x2, x3) -+# define DEBUG_PRINT4(x1, x2, x3, x4) if (debug) printf (x1, x2, x3, x4) -+# endif /* not DEFINED_ONCE */ -+ -+# define DEBUG_PRINT_COMPILED_PATTERN(p, s, e) \ -+ if (debug) PREFIX(print_partial_compiled_pattern) (s, e) -+# define DEBUG_PRINT_DOUBLE_STRING(w, s1, sz1, s2, sz2) \ -+ if (debug) PREFIX(print_double_string) (w, s1, sz1, s2, sz2) -+ -+ -+/* Print the fastmap in human-readable form. */ -+ -+# ifndef DEFINED_ONCE -+void -+print_fastmap (char *fastmap) -+{ -+ unsigned was_a_range = 0; -+ unsigned i = 0; -+ -+ while (i < (1 << BYTEWIDTH)) -+ { -+ if (fastmap[i++]) -+ { -+ was_a_range = 0; -+ putchar (i - 1); -+ while (i < (1 << BYTEWIDTH) && fastmap[i]) -+ { -+ was_a_range = 1; -+ i++; -+ } -+ if (was_a_range) -+ { -+ printf ("-"); -+ putchar (i - 1); -+ } -+ } -+ } -+ putchar ('\n'); -+} -+# endif /* not DEFINED_ONCE */ -+ -+ -+/* Print a compiled pattern string in human-readable form, starting at -+ the START pointer into it and ending just before the pointer END. */ -+ -+void -+PREFIX(print_partial_compiled_pattern) (UCHAR_T *start, UCHAR_T *end) -+{ -+ int mcnt, mcnt2; -+ UCHAR_T *p1; -+ UCHAR_T *p = start; -+ UCHAR_T *pend = end; -+ -+ if (start == NULL) -+ { -+ printf ("(null)\n"); -+ return; -+ } -+ -+ /* Loop over pattern commands. */ -+ while (p < pend) -+ { -+# ifdef _LIBC -+ printf ("%td:\t", p - start); -+# else -+ printf ("%ld:\t", (long int) (p - start)); -+# endif -+ -+ switch ((re_opcode_t) *p++) -+ { -+ case no_op: -+ printf ("/no_op"); -+ break; -+ -+ case exactn: -+ mcnt = *p++; -+ printf ("/exactn/%d", mcnt); -+ do -+ { -+ putchar ('/'); -+ PUT_CHAR (*p++); -+ } -+ while (--mcnt); -+ break; -+ -+# ifdef MBS_SUPPORT -+ case exactn_bin: -+ mcnt = *p++; -+ printf ("/exactn_bin/%d", mcnt); -+ do -+ { -+ printf("/%lx", (long int) *p++); -+ } -+ while (--mcnt); -+ break; -+# endif /* MBS_SUPPORT */ -+ -+ case start_memory: -+ mcnt = *p++; -+ printf ("/start_memory/%d/%ld", mcnt, (long int) *p++); -+ break; -+ -+ case stop_memory: -+ mcnt = *p++; -+ printf ("/stop_memory/%d/%ld", mcnt, (long int) *p++); -+ break; -+ -+ case duplicate: -+ printf ("/duplicate/%ld", (long int) *p++); -+ break; -+ -+ case anychar: -+ printf ("/anychar"); -+ break; -+ -+ case charset: -+ case charset_not: -+ { -+# ifdef WCHAR -+ int i, length; -+ wchar_t *workp = p; -+ printf ("/charset [%s", -+ (re_opcode_t) *(workp - 1) == charset_not ? "^" : ""); -+ p += 5; -+ length = *workp++; /* the length of char_classes */ -+ for (i=0 ; i<length ; i++) -+ printf("[:%lx:]", (long int) *p++); -+ length = *workp++; /* the length of collating_symbol */ -+ for (i=0 ; i<length ;) -+ { -+ printf("[."); -+ while(*p != 0) -+ PUT_CHAR((i++,*p++)); -+ i++,p++; -+ printf(".]"); -+ } -+ length = *workp++; /* the length of equivalence_class */ -+ for (i=0 ; i<length ;) -+ { -+ printf("[="); -+ while(*p != 0) -+ PUT_CHAR((i++,*p++)); -+ i++,p++; -+ printf("=]"); -+ } -+ length = *workp++; /* the length of char_range */ -+ for (i=0 ; i<length ; i++) -+ { -+ wchar_t range_start = *p++; -+ wchar_t range_end = *p++; -+ printf("%C-%C", range_start, range_end); -+ } -+ length = *workp++; /* the length of char */ -+ for (i=0 ; i<length ; i++) -+ printf("%C", *p++); -+ putchar (']'); -+# else -+ register int c, last = -100; -+ register int in_range = 0; -+ -+ printf ("/charset [%s", -+ (re_opcode_t) *(p - 1) == charset_not ? "^" : ""); -+ -+ assert (p + *p < pend); -+ -+ for (c = 0; c < 256; c++) -+ if (c / 8 < *p -+ && (p[1 + (c/8)] & (1 << (c % 8)))) -+ { -+ /* Are we starting a range? */ -+ if (last + 1 == c && ! in_range) -+ { -+ putchar ('-'); -+ in_range = 1; -+ } -+ /* Have we broken a range? */ -+ else if (last + 1 != c && in_range) -+ { -+ putchar (last); -+ in_range = 0; -+ } -+ -+ if (! in_range) -+ putchar (c); -+ -+ last = c; -+ } -+ -+ if (in_range) -+ putchar (last); -+ -+ putchar (']'); -+ -+ p += 1 + *p; -+# endif /* WCHAR */ -+ } -+ break; -+ -+ case begline: -+ printf ("/begline"); -+ break; -+ -+ case endline: -+ printf ("/endline"); -+ break; -+ -+ case on_failure_jump: -+ PREFIX(extract_number_and_incr) (&mcnt, &p); -+# ifdef _LIBC -+ printf ("/on_failure_jump to %td", p + mcnt - start); -+# else -+ printf ("/on_failure_jump to %ld", (long int) (p + mcnt - start)); -+# endif -+ break; -+ -+ case on_failure_keep_string_jump: -+ PREFIX(extract_number_and_incr) (&mcnt, &p); -+# ifdef _LIBC -+ printf ("/on_failure_keep_string_jump to %td", p + mcnt - start); -+# else -+ printf ("/on_failure_keep_string_jump to %ld", -+ (long int) (p + mcnt - start)); -+# endif -+ break; -+ -+ case dummy_failure_jump: -+ PREFIX(extract_number_and_incr) (&mcnt, &p); -+# ifdef _LIBC -+ printf ("/dummy_failure_jump to %td", p + mcnt - start); -+# else -+ printf ("/dummy_failure_jump to %ld", (long int) (p + mcnt - start)); -+# endif -+ break; -+ -+ case push_dummy_failure: -+ printf ("/push_dummy_failure"); -+ break; -+ -+ case maybe_pop_jump: -+ PREFIX(extract_number_and_incr) (&mcnt, &p); -+# ifdef _LIBC -+ printf ("/maybe_pop_jump to %td", p + mcnt - start); -+# else -+ printf ("/maybe_pop_jump to %ld", (long int) (p + mcnt - start)); -+# endif -+ break; -+ -+ case pop_failure_jump: -+ PREFIX(extract_number_and_incr) (&mcnt, &p); -+# ifdef _LIBC -+ printf ("/pop_failure_jump to %td", p + mcnt - start); -+# else -+ printf ("/pop_failure_jump to %ld", (long int) (p + mcnt - start)); -+# endif -+ break; -+ -+ case jump_past_alt: -+ PREFIX(extract_number_and_incr) (&mcnt, &p); -+# ifdef _LIBC -+ printf ("/jump_past_alt to %td", p + mcnt - start); -+# else -+ printf ("/jump_past_alt to %ld", (long int) (p + mcnt - start)); -+# endif -+ break; -+ -+ case jump: -+ PREFIX(extract_number_and_incr) (&mcnt, &p); -+# ifdef _LIBC -+ printf ("/jump to %td", p + mcnt - start); -+# else -+ printf ("/jump to %ld", (long int) (p + mcnt - start)); -+# endif -+ break; -+ -+ case succeed_n: -+ PREFIX(extract_number_and_incr) (&mcnt, &p); -+ p1 = p + mcnt; -+ PREFIX(extract_number_and_incr) (&mcnt2, &p); -+# ifdef _LIBC -+ printf ("/succeed_n to %td, %d times", p1 - start, mcnt2); -+# else -+ printf ("/succeed_n to %ld, %d times", -+ (long int) (p1 - start), mcnt2); -+# endif -+ break; -+ -+ case jump_n: -+ PREFIX(extract_number_and_incr) (&mcnt, &p); -+ p1 = p + mcnt; -+ PREFIX(extract_number_and_incr) (&mcnt2, &p); -+ printf ("/jump_n to %d, %d times", p1 - start, mcnt2); -+ break; -+ -+ case set_number_at: -+ PREFIX(extract_number_and_incr) (&mcnt, &p); -+ p1 = p + mcnt; -+ PREFIX(extract_number_and_incr) (&mcnt2, &p); -+# ifdef _LIBC -+ printf ("/set_number_at location %td to %d", p1 - start, mcnt2); -+# else -+ printf ("/set_number_at location %ld to %d", -+ (long int) (p1 - start), mcnt2); -+# endif -+ break; -+ -+ case wordbound: -+ printf ("/wordbound"); -+ break; -+ -+ case notwordbound: -+ printf ("/notwordbound"); -+ break; -+ -+ case wordbeg: -+ printf ("/wordbeg"); -+ break; -+ -+ case wordend: -+ printf ("/wordend"); -+ break; -+ -+# ifdef emacs -+ case before_dot: -+ printf ("/before_dot"); -+ break; -+ -+ case at_dot: -+ printf ("/at_dot"); -+ break; -+ -+ case after_dot: -+ printf ("/after_dot"); -+ break; -+ -+ case syntaxspec: -+ printf ("/syntaxspec"); -+ mcnt = *p++; -+ printf ("/%d", mcnt); -+ break; -+ -+ case notsyntaxspec: -+ printf ("/notsyntaxspec"); -+ mcnt = *p++; -+ printf ("/%d", mcnt); -+ break; -+# endif /* emacs */ -+ -+ case wordchar: -+ printf ("/wordchar"); -+ break; -+ -+ case notwordchar: -+ printf ("/notwordchar"); -+ break; -+ -+ case begbuf: -+ printf ("/begbuf"); -+ break; -+ -+ case endbuf: -+ printf ("/endbuf"); -+ break; -+ -+ default: -+ printf ("?%ld", (long int) *(p-1)); -+ } -+ -+ putchar ('\n'); -+ } -+ -+# ifdef _LIBC -+ printf ("%td:\tend of pattern.\n", p - start); -+# else -+ printf ("%ld:\tend of pattern.\n", (long int) (p - start)); -+# endif -+} -+ -+ -+void -+PREFIX(print_compiled_pattern) (struct re_pattern_buffer *bufp) -+{ -+ UCHAR_T *buffer = (UCHAR_T*) bufp->buffer; -+ -+ PREFIX(print_partial_compiled_pattern) (buffer, buffer -+ + bufp->used / sizeof(UCHAR_T)); -+ printf ("%ld bytes used/%ld bytes allocated.\n", -+ bufp->used, bufp->allocated); -+ -+ if (bufp->fastmap_accurate && bufp->fastmap) -+ { -+ printf ("fastmap: "); -+ print_fastmap (bufp->fastmap); -+ } -+ -+# ifdef _LIBC -+ printf ("re_nsub: %Zd\t", bufp->re_nsub); -+# else -+ printf ("re_nsub: %ld\t", (long int) bufp->re_nsub); -+# endif -+ printf ("regs_alloc: %d\t", bufp->regs_allocated); -+ printf ("can_be_null: %d\t", bufp->can_be_null); -+ printf ("newline_anchor: %d\n", bufp->newline_anchor); -+ printf ("no_sub: %d\t", bufp->no_sub); -+ printf ("not_bol: %d\t", bufp->not_bol); -+ printf ("not_eol: %d\t", bufp->not_eol); -+ printf ("syntax: %lx\n", bufp->syntax); -+ /* Perhaps we should print the translate table? */ -+} -+ -+ -+void -+PREFIX(print_double_string) (const CHAR_T *where, const CHAR_T *string1, -+ int size1, const CHAR_T *string2, int size2) -+{ -+ int this_char; -+ -+ if (where == NULL) -+ printf ("(null)"); -+ else -+ { -+ int cnt; -+ -+ if (FIRST_STRING_P (where)) -+ { -+ for (this_char = where - string1; this_char < size1; this_char++) -+ PUT_CHAR (string1[this_char]); -+ -+ where = string2; -+ } -+ -+ cnt = 0; -+ for (this_char = where - string2; this_char < size2; this_char++) -+ { -+ PUT_CHAR (string2[this_char]); -+ if (++cnt > 100) -+ { -+ fputs ("...", stdout); -+ break; -+ } -+ } -+ } -+} -+ -+# ifndef DEFINED_ONCE -+void -+printchar (int c) -+{ -+ putc (c, stderr); -+} -+# endif -+ -+# else /* not DEBUG */ -+ -+# ifndef DEFINED_ONCE -+# undef assert -+# define assert(e) -+ -+# define DEBUG_STATEMENT(e) -+# define DEBUG_PRINT1(x) -+# define DEBUG_PRINT2(x1, x2) -+# define DEBUG_PRINT3(x1, x2, x3) -+# define DEBUG_PRINT4(x1, x2, x3, x4) -+# endif /* not DEFINED_ONCE */ -+# define DEBUG_PRINT_COMPILED_PATTERN(p, s, e) -+# define DEBUG_PRINT_DOUBLE_STRING(w, s1, sz1, s2, sz2) -+ -+# endif /* not DEBUG */ -+ -+ -+ -+# ifdef WCHAR -+/* This convert a multibyte string to a wide character string. -+ And write their correspondances to offset_buffer(see below) -+ and write whether each wchar_t is binary data to is_binary. -+ This assume invalid multibyte sequences as binary data. -+ We assume offset_buffer and is_binary is already allocated -+ enough space. */ -+ -+static size_t convert_mbs_to_wcs (CHAR_T *dest, const unsigned char* src, -+ size_t len, int *offset_buffer, -+ char *is_binary); -+static size_t -+convert_mbs_to_wcs (CHAR_T *dest, const unsigned char*src, size_t len, -+ int *offset_buffer, char *is_binary) -+ /* It hold correspondances between src(char string) and -+ dest(wchar_t string) for optimization. -+ e.g. src = "xxxyzz" -+ dest = {'X', 'Y', 'Z'} -+ (each "xxx", "y" and "zz" represent one multibyte character -+ corresponding to 'X', 'Y' and 'Z'.) -+ offset_buffer = {0, 0+3("xxx"), 0+3+1("y"), 0+3+1+2("zz")} -+ = {0, 3, 4, 6} -+ */ -+{ -+ wchar_t *pdest = dest; -+ const unsigned char *psrc = src; -+ size_t wc_count = 0; -+ -+ mbstate_t mbs; -+ int i, consumed; -+ size_t mb_remain = len; -+ size_t mb_count = 0; -+ -+ /* Initialize the conversion state. */ -+ memset (&mbs, 0, sizeof (mbstate_t)); -+ -+ offset_buffer[0] = 0; -+ for( ; mb_remain > 0 ; ++wc_count, ++pdest, mb_remain -= consumed, -+ psrc += consumed) -+ { -+#ifdef _LIBC -+ consumed = __mbrtowc (pdest, psrc, mb_remain, &mbs); -+#else -+ consumed = mbrtowc (pdest, psrc, mb_remain, &mbs); -+#endif -+ -+ if (consumed <= 0) -+ /* failed to convert. maybe src contains binary data. -+ So we consume 1 byte manualy. */ -+ { -+ *pdest = *psrc; -+ consumed = 1; -+ is_binary[wc_count] = TRUE; -+ } -+ else -+ is_binary[wc_count] = FALSE; -+ /* In sjis encoding, we use yen sign as escape character in -+ place of reverse solidus. So we convert 0x5c(yen sign in -+ sjis) to not 0xa5(yen sign in UCS2) but 0x5c(reverse -+ solidus in UCS2). */ -+ if (consumed == 1 && (int) *psrc == 0x5c && (int) *pdest == 0xa5) -+ *pdest = (wchar_t) *psrc; -+ -+ offset_buffer[wc_count + 1] = mb_count += consumed; -+ } -+ -+ /* Fill remain of the buffer with sentinel. */ -+ for (i = wc_count + 1 ; i <= len ; i++) -+ offset_buffer[i] = mb_count + 1; -+ -+ return wc_count; -+} -+ -+# endif /* WCHAR */ -+ -+#else /* not INSIDE_RECURSION */ -+ -+/* Set by `re_set_syntax' to the current regexp syntax to recognize. Can -+ also be assigned to arbitrarily: each pattern buffer stores its own -+ syntax, so it can be changed between regex compilations. */ -+/* This has no initializer because initialized variables in Emacs -+ become read-only after dumping. */ -+reg_syntax_t re_syntax_options; -+ -+ -+/* Specify the precise syntax of regexps for compilation. This provides -+ for compatibility for various utilities which historically have -+ different, incompatible syntaxes. -+ -+ The argument SYNTAX is a bit mask comprised of the various bits -+ defined in regex.h. We return the old syntax. */ -+ -+reg_syntax_t -+re_set_syntax (reg_syntax_t syntax) -+{ -+ reg_syntax_t ret = re_syntax_options; -+ -+ re_syntax_options = syntax; -+# ifdef DEBUG -+ if (syntax & RE_DEBUG) -+ debug = 1; -+ else if (debug) /* was on but now is not */ -+ debug = 0; -+# endif /* DEBUG */ -+ return ret; -+} -+# ifdef _LIBC -+weak_alias (__re_set_syntax, re_set_syntax) -+# endif -+ -+/* This table gives an error message for each of the error codes listed -+ in regex.h. Obviously the order here has to be same as there. -+ POSIX doesn't require that we do anything for REG_NOERROR, -+ but why not be nice? */ -+ -+static const char *re_error_msgid[] = -+ { -+ gettext_noop ("Success"), /* REG_NOERROR */ -+ gettext_noop ("No match"), /* REG_NOMATCH */ -+ gettext_noop ("Invalid regular expression"), /* REG_BADPAT */ -+ gettext_noop ("Invalid collation character"), /* REG_ECOLLATE */ -+ gettext_noop ("Invalid character class name"), /* REG_ECTYPE */ -+ gettext_noop ("Trailing backslash"), /* REG_EESCAPE */ -+ gettext_noop ("Invalid back reference"), /* REG_ESUBREG */ -+ gettext_noop ("Unmatched [ or [^"), /* REG_EBRACK */ -+ gettext_noop ("Unmatched ( or \\("), /* REG_EPAREN */ -+ gettext_noop ("Unmatched \\{"), /* REG_EBRACE */ -+ gettext_noop ("Invalid content of \\{\\}"), /* REG_BADBR */ -+ gettext_noop ("Invalid range end"), /* REG_ERANGE */ -+ gettext_noop ("Memory exhausted"), /* REG_ESPACE */ -+ gettext_noop ("Invalid preceding regular expression"), /* REG_BADRPT */ -+ gettext_noop ("Premature end of regular expression"), /* REG_EEND */ -+ gettext_noop ("Regular expression too big"), /* REG_ESIZE */ -+ gettext_noop ("Unmatched ) or \\)") /* REG_ERPAREN */ -+ }; -+ -+#endif /* INSIDE_RECURSION */ -+ -+#ifndef DEFINED_ONCE -+/* Avoiding alloca during matching, to placate r_alloc. */ -+ -+/* Define MATCH_MAY_ALLOCATE unless we need to make sure that the -+ searching and matching functions should not call alloca. On some -+ systems, alloca is implemented in terms of malloc, and if we're -+ using the relocating allocator routines, then malloc could cause a -+ relocation, which might (if the strings being searched are in the -+ ralloc heap) shift the data out from underneath the regexp -+ routines. -+ -+ Here's another reason to avoid allocation: Emacs -+ processes input from X in a signal handler; processing X input may -+ call malloc; if input arrives while a matching routine is calling -+ malloc, then we're scrod. But Emacs can't just block input while -+ calling matching routines; then we don't notice interrupts when -+ they come in. So, Emacs blocks input around all regexp calls -+ except the matching calls, which it leaves unprotected, in the -+ faith that they will not malloc. */ -+ -+/* Normally, this is fine. */ -+# define MATCH_MAY_ALLOCATE -+ -+/* When using GNU C, we are not REALLY using the C alloca, no matter -+ what config.h may say. So don't take precautions for it. */ -+# ifdef __GNUC__ -+# undef C_ALLOCA -+# endif -+ -+/* The match routines may not allocate if (1) they would do it with malloc -+ and (2) it's not safe for them to use malloc. -+ Note that if REL_ALLOC is defined, matching would not use malloc for the -+ failure stack, but we would still use it for the register vectors; -+ so REL_ALLOC should not affect this. */ -+# if (defined C_ALLOCA || defined REGEX_MALLOC) && defined emacs -+# undef MATCH_MAY_ALLOCATE -+# endif -+#endif /* not DEFINED_ONCE */ -+ -+#ifdef INSIDE_RECURSION -+/* Failure stack declarations and macros; both re_compile_fastmap and -+ re_match_2 use a failure stack. These have to be macros because of -+ REGEX_ALLOCATE_STACK. */ -+ -+ -+/* Number of failure points for which to initially allocate space -+ when matching. If this number is exceeded, we allocate more -+ space, so it is not a hard limit. */ -+# ifndef INIT_FAILURE_ALLOC -+# define INIT_FAILURE_ALLOC 5 -+# endif -+ -+/* Roughly the maximum number of failure points on the stack. Would be -+ exactly that if always used MAX_FAILURE_ITEMS items each time we failed. -+ This is a variable only so users of regex can assign to it; we never -+ change it ourselves. */ -+ -+ -+# ifndef DEFINED_ONCE -+ -+# ifdef INT_IS_16BIT -+# define RE_M_F_TYPE long int -+# else -+# define RE_M_F_TYPE int -+# endif /* INT_IS_16BIT */ -+ -+# ifdef MATCH_MAY_ALLOCATE -+/* 4400 was enough to cause a crash on Alpha OSF/1, -+ whose default stack limit is 2mb. */ -+# define RE_M_F_DEFAULT 4000 -+# else -+# define RE_M_F_DEFAULT 2000 -+# endif /* MATCH_MAY_ALLOCATE */ -+ -+# include <shlib-compat.h> -+ -+# if SHLIB_COMPAT (libc, GLIBC_2_0, GLIBC_2_3) -+link_warning (re_max_failures, "the 're_max_failures' variable is obsolete and will go away.") -+RE_M_F_TYPE re_max_failures = RE_M_F_DEFAULT; -+# else -+RE_M_F_TYPE re_max_failures attribute_hidden = RE_M_F_DEFAULT; -+# endif /* SHLIB_COMPAT */ -+ -+# undef RE_M_F_TYPE -+# undef RE_M_F_DEFAULT -+ -+# endif /* DEFINED_ONCE */ -+ -+# ifdef INT_IS_16BIT -+ -+union PREFIX(fail_stack_elt) -+{ -+ UCHAR_T *pointer; -+ long int integer; -+}; -+ -+typedef union PREFIX(fail_stack_elt) PREFIX(fail_stack_elt_t); -+ -+typedef struct -+{ -+ PREFIX(fail_stack_elt_t) *stack; -+ unsigned long int size; -+ unsigned long int avail; /* Offset of next open position. */ -+} PREFIX(fail_stack_type); -+ -+# else /* not INT_IS_16BIT */ -+ -+union PREFIX(fail_stack_elt) -+{ -+ UCHAR_T *pointer; -+ int integer; -+}; -+ -+typedef union PREFIX(fail_stack_elt) PREFIX(fail_stack_elt_t); -+ -+typedef struct -+{ -+ PREFIX(fail_stack_elt_t) *stack; -+ unsigned size; -+ unsigned avail; /* Offset of next open position. */ -+} PREFIX(fail_stack_type); -+ -+# endif /* INT_IS_16BIT */ -+ -+# ifndef DEFINED_ONCE -+# define FAIL_STACK_EMPTY() (fail_stack.avail == 0) -+# define FAIL_STACK_PTR_EMPTY() (fail_stack_ptr->avail == 0) -+# define FAIL_STACK_FULL() (fail_stack.avail == fail_stack.size) -+# endif -+ -+ -+/* Define macros to initialize and free the failure stack. -+ Do `return -2' if the alloc fails. */ -+ -+# ifdef MATCH_MAY_ALLOCATE -+# define INIT_FAIL_STACK() \ -+ do { \ -+ fail_stack.stack = (PREFIX(fail_stack_elt_t) *) \ -+ REGEX_ALLOCATE_STACK (INIT_FAILURE_ALLOC * sizeof (PREFIX(fail_stack_elt_t))); \ -+ \ -+ if (fail_stack.stack == NULL) \ -+ return -2; \ -+ \ -+ fail_stack.size = INIT_FAILURE_ALLOC; \ -+ fail_stack.avail = 0; \ -+ } while (0) -+ -+# define RESET_FAIL_STACK() REGEX_FREE_STACK (fail_stack.stack) -+# else -+# define INIT_FAIL_STACK() \ -+ do { \ -+ fail_stack.avail = 0; \ -+ } while (0) -+ -+# define RESET_FAIL_STACK() -+# endif -+ -+ -+/* Double the size of FAIL_STACK, up to approximately `re_max_failures' items. -+ -+ Return 1 if succeeds, and 0 if either ran out of memory -+ allocating space for it or it was already too large. -+ -+ REGEX_REALLOCATE_STACK requires `destination' be declared. */ -+ -+# define DOUBLE_FAIL_STACK(fail_stack) \ -+ ((fail_stack).size > (unsigned) (re_max_failures * MAX_FAILURE_ITEMS) \ -+ ? 0 \ -+ : ((fail_stack).stack = (PREFIX(fail_stack_elt_t) *) \ -+ REGEX_REALLOCATE_STACK ((fail_stack).stack, \ -+ (fail_stack).size * sizeof (PREFIX(fail_stack_elt_t)), \ -+ ((fail_stack).size << 1) * sizeof (PREFIX(fail_stack_elt_t))),\ -+ \ -+ (fail_stack).stack == NULL \ -+ ? 0 \ -+ : ((fail_stack).size <<= 1, \ -+ 1))) -+ -+ -+/* Push pointer POINTER on FAIL_STACK. -+ Return 1 if was able to do so and 0 if ran out of memory allocating -+ space to do so. */ -+# define PUSH_PATTERN_OP(POINTER, FAIL_STACK) \ -+ ((FAIL_STACK_FULL () \ -+ && !DOUBLE_FAIL_STACK (FAIL_STACK)) \ -+ ? 0 \ -+ : ((FAIL_STACK).stack[(FAIL_STACK).avail++].pointer = POINTER, \ -+ 1)) -+ -+/* Push a pointer value onto the failure stack. -+ Assumes the variable `fail_stack'. Probably should only -+ be called from within `PUSH_FAILURE_POINT'. */ -+# define PUSH_FAILURE_POINTER(item) \ -+ fail_stack.stack[fail_stack.avail++].pointer = (UCHAR_T *) (item) -+ -+/* This pushes an integer-valued item onto the failure stack. -+ Assumes the variable `fail_stack'. Probably should only -+ be called from within `PUSH_FAILURE_POINT'. */ -+# define PUSH_FAILURE_INT(item) \ -+ fail_stack.stack[fail_stack.avail++].integer = (item) -+ -+/* Push a fail_stack_elt_t value onto the failure stack. -+ Assumes the variable `fail_stack'. Probably should only -+ be called from within `PUSH_FAILURE_POINT'. */ -+# define PUSH_FAILURE_ELT(item) \ -+ fail_stack.stack[fail_stack.avail++] = (item) -+ -+/* These three POP... operations complement the three PUSH... operations. -+ All assume that `fail_stack' is nonempty. */ -+# define POP_FAILURE_POINTER() fail_stack.stack[--fail_stack.avail].pointer -+# define POP_FAILURE_INT() fail_stack.stack[--fail_stack.avail].integer -+# define POP_FAILURE_ELT() fail_stack.stack[--fail_stack.avail] -+ -+/* Used to omit pushing failure point id's when we're not debugging. */ -+# ifdef DEBUG -+# define DEBUG_PUSH PUSH_FAILURE_INT -+# define DEBUG_POP(item_addr) *(item_addr) = POP_FAILURE_INT () -+# else -+# define DEBUG_PUSH(item) -+# define DEBUG_POP(item_addr) -+# endif -+ -+ -+/* Push the information about the state we will need -+ if we ever fail back to it. -+ -+ Requires variables fail_stack, regstart, regend, reg_info, and -+ num_regs_pushed be declared. DOUBLE_FAIL_STACK requires `destination' -+ be declared. -+ -+ Does `return FAILURE_CODE' if runs out of memory. */ -+ -+# define PUSH_FAILURE_POINT(pattern_place, string_place, failure_code) \ -+ do { \ -+ char *destination; \ -+ /* Must be int, so when we don't save any registers, the arithmetic \ -+ of 0 + -1 isn't done as unsigned. */ \ -+ /* Can't be int, since there is not a shred of a guarantee that int \ -+ is wide enough to hold a value of something to which pointer can \ -+ be assigned */ \ -+ active_reg_t this_reg; \ -+ \ -+ DEBUG_STATEMENT (failure_id++); \ -+ DEBUG_STATEMENT (nfailure_points_pushed++); \ -+ DEBUG_PRINT2 ("\nPUSH_FAILURE_POINT #%u:\n", failure_id); \ -+ DEBUG_PRINT2 (" Before push, next avail: %d\n", (fail_stack).avail);\ -+ DEBUG_PRINT2 (" size: %d\n", (fail_stack).size);\ -+ \ -+ DEBUG_PRINT2 (" slots needed: %ld\n", NUM_FAILURE_ITEMS); \ -+ DEBUG_PRINT2 (" available: %d\n", REMAINING_AVAIL_SLOTS); \ -+ \ -+ /* Ensure we have enough space allocated for what we will push. */ \ -+ while (REMAINING_AVAIL_SLOTS < NUM_FAILURE_ITEMS) \ -+ { \ -+ if (!DOUBLE_FAIL_STACK (fail_stack)) \ -+ return failure_code; \ -+ \ -+ DEBUG_PRINT2 ("\n Doubled stack; size now: %d\n", \ -+ (fail_stack).size); \ -+ DEBUG_PRINT2 (" slots available: %d\n", REMAINING_AVAIL_SLOTS);\ -+ } \ -+ \ -+ /* Push the info, starting with the registers. */ \ -+ DEBUG_PRINT1 ("\n"); \ -+ \ -+ if (1) \ -+ for (this_reg = lowest_active_reg; this_reg <= highest_active_reg; \ -+ this_reg++) \ -+ { \ -+ DEBUG_PRINT2 (" Pushing reg: %lu\n", this_reg); \ -+ DEBUG_STATEMENT (num_regs_pushed++); \ -+ \ -+ DEBUG_PRINT2 (" start: %p\n", regstart[this_reg]); \ -+ PUSH_FAILURE_POINTER (regstart[this_reg]); \ -+ \ -+ DEBUG_PRINT2 (" end: %p\n", regend[this_reg]); \ -+ PUSH_FAILURE_POINTER (regend[this_reg]); \ -+ \ -+ DEBUG_PRINT2 (" info: %p\n ", \ -+ reg_info[this_reg].word.pointer); \ -+ DEBUG_PRINT2 (" match_null=%d", \ -+ REG_MATCH_NULL_STRING_P (reg_info[this_reg])); \ -+ DEBUG_PRINT2 (" active=%d", IS_ACTIVE (reg_info[this_reg])); \ -+ DEBUG_PRINT2 (" matched_something=%d", \ -+ MATCHED_SOMETHING (reg_info[this_reg])); \ -+ DEBUG_PRINT2 (" ever_matched=%d", \ -+ EVER_MATCHED_SOMETHING (reg_info[this_reg])); \ -+ DEBUG_PRINT1 ("\n"); \ -+ PUSH_FAILURE_ELT (reg_info[this_reg].word); \ -+ } \ -+ \ -+ DEBUG_PRINT2 (" Pushing low active reg: %ld\n", lowest_active_reg);\ -+ PUSH_FAILURE_INT (lowest_active_reg); \ -+ \ -+ DEBUG_PRINT2 (" Pushing high active reg: %ld\n", highest_active_reg);\ -+ PUSH_FAILURE_INT (highest_active_reg); \ -+ \ -+ DEBUG_PRINT2 (" Pushing pattern %p:\n", pattern_place); \ -+ DEBUG_PRINT_COMPILED_PATTERN (bufp, pattern_place, pend); \ -+ PUSH_FAILURE_POINTER (pattern_place); \ -+ \ -+ DEBUG_PRINT2 (" Pushing string %p: `", string_place); \ -+ DEBUG_PRINT_DOUBLE_STRING (string_place, string1, size1, string2, \ -+ size2); \ -+ DEBUG_PRINT1 ("'\n"); \ -+ PUSH_FAILURE_POINTER (string_place); \ -+ \ -+ DEBUG_PRINT2 (" Pushing failure id: %u\n", failure_id); \ -+ DEBUG_PUSH (failure_id); \ -+ } while (0) -+ -+# ifndef DEFINED_ONCE -+/* This is the number of items that are pushed and popped on the stack -+ for each register. */ -+# define NUM_REG_ITEMS 3 -+ -+/* Individual items aside from the registers. */ -+# ifdef DEBUG -+# define NUM_NONREG_ITEMS 5 /* Includes failure point id. */ -+# else -+# define NUM_NONREG_ITEMS 4 -+# endif -+ -+/* We push at most this many items on the stack. */ -+/* We used to use (num_regs - 1), which is the number of registers -+ this regexp will save; but that was changed to 5 -+ to avoid stack overflow for a regexp with lots of parens. */ -+# define MAX_FAILURE_ITEMS (5 * NUM_REG_ITEMS + NUM_NONREG_ITEMS) -+ -+/* We actually push this many items. */ -+# define NUM_FAILURE_ITEMS \ -+ (((0 \ -+ ? 0 : highest_active_reg - lowest_active_reg + 1) \ -+ * NUM_REG_ITEMS) \ -+ + NUM_NONREG_ITEMS) -+ -+/* How many items can still be added to the stack without overflowing it. */ -+# define REMAINING_AVAIL_SLOTS ((fail_stack).size - (fail_stack).avail) -+# endif /* not DEFINED_ONCE */ -+ -+ -+/* Pops what PUSH_FAIL_STACK pushes. -+ -+ We restore into the parameters, all of which should be lvalues: -+ STR -- the saved data position. -+ PAT -- the saved pattern position. -+ LOW_REG, HIGH_REG -- the highest and lowest active registers. -+ REGSTART, REGEND -- arrays of string positions. -+ REG_INFO -- array of information about each subexpression. -+ -+ Also assumes the variables `fail_stack' and (if debugging), `bufp', -+ `pend', `string1', `size1', `string2', and `size2'. */ -+# define POP_FAILURE_POINT(str, pat, low_reg, high_reg, regstart, regend, reg_info)\ -+{ \ -+ DEBUG_STATEMENT (unsigned failure_id;) \ -+ active_reg_t this_reg; \ -+ const UCHAR_T *string_temp; \ -+ \ -+ assert (!FAIL_STACK_EMPTY ()); \ -+ \ -+ /* Remove failure points and point to how many regs pushed. */ \ -+ DEBUG_PRINT1 ("POP_FAILURE_POINT:\n"); \ -+ DEBUG_PRINT2 (" Before pop, next avail: %d\n", fail_stack.avail); \ -+ DEBUG_PRINT2 (" size: %d\n", fail_stack.size); \ -+ \ -+ assert (fail_stack.avail >= NUM_NONREG_ITEMS); \ -+ \ -+ DEBUG_POP (&failure_id); \ -+ DEBUG_PRINT2 (" Popping failure id: %u\n", failure_id); \ -+ \ -+ /* If the saved string location is NULL, it came from an \ -+ on_failure_keep_string_jump opcode, and we want to throw away the \ -+ saved NULL, thus retaining our current position in the string. */ \ -+ string_temp = POP_FAILURE_POINTER (); \ -+ if (string_temp != NULL) \ -+ str = (const CHAR_T *) string_temp; \ -+ \ -+ DEBUG_PRINT2 (" Popping string %p: `", str); \ -+ DEBUG_PRINT_DOUBLE_STRING (str, string1, size1, string2, size2); \ -+ DEBUG_PRINT1 ("'\n"); \ -+ \ -+ pat = (UCHAR_T *) POP_FAILURE_POINTER (); \ -+ DEBUG_PRINT2 (" Popping pattern %p:\n", pat); \ -+ DEBUG_PRINT_COMPILED_PATTERN (bufp, pat, pend); \ -+ \ -+ /* Restore register info. */ \ -+ high_reg = (active_reg_t) POP_FAILURE_INT (); \ -+ DEBUG_PRINT2 (" Popping high active reg: %ld\n", high_reg); \ -+ \ -+ low_reg = (active_reg_t) POP_FAILURE_INT (); \ -+ DEBUG_PRINT2 (" Popping low active reg: %ld\n", low_reg); \ -+ \ -+ if (1) \ -+ for (this_reg = high_reg; this_reg >= low_reg; this_reg--) \ -+ { \ -+ DEBUG_PRINT2 (" Popping reg: %ld\n", this_reg); \ -+ \ -+ reg_info[this_reg].word = POP_FAILURE_ELT (); \ -+ DEBUG_PRINT2 (" info: %p\n", \ -+ reg_info[this_reg].word.pointer); \ -+ \ -+ regend[this_reg] = (const CHAR_T *) POP_FAILURE_POINTER (); \ -+ DEBUG_PRINT2 (" end: %p\n", regend[this_reg]); \ -+ \ -+ regstart[this_reg] = (const CHAR_T *) POP_FAILURE_POINTER (); \ -+ DEBUG_PRINT2 (" start: %p\n", regstart[this_reg]); \ -+ } \ -+ else \ -+ { \ -+ for (this_reg = highest_active_reg; this_reg > high_reg; this_reg--) \ -+ { \ -+ reg_info[this_reg].word.integer = 0; \ -+ regend[this_reg] = 0; \ -+ regstart[this_reg] = 0; \ -+ } \ -+ highest_active_reg = high_reg; \ -+ } \ -+ \ -+ set_regs_matched_done = 0; \ -+ DEBUG_STATEMENT (nfailure_points_popped++); \ -+} /* POP_FAILURE_POINT */ -+ -+/* Structure for per-register (a.k.a. per-group) information. -+ Other register information, such as the -+ starting and ending positions (which are addresses), and the list of -+ inner groups (which is a bits list) are maintained in separate -+ variables. -+ -+ We are making a (strictly speaking) nonportable assumption here: that -+ the compiler will pack our bit fields into something that fits into -+ the type of `word', i.e., is something that fits into one item on the -+ failure stack. */ -+ -+ -+/* Declarations and macros for re_match_2. */ -+ -+typedef union -+{ -+ PREFIX(fail_stack_elt_t) word; -+ struct -+ { -+ /* This field is one if this group can match the empty string, -+ zero if not. If not yet determined, `MATCH_NULL_UNSET_VALUE'. */ -+# define MATCH_NULL_UNSET_VALUE 3 -+ unsigned match_null_string_p : 2; -+ unsigned is_active : 1; -+ unsigned matched_something : 1; -+ unsigned ever_matched_something : 1; -+ } bits; -+} PREFIX(register_info_type); -+ -+# ifndef DEFINED_ONCE -+# define REG_MATCH_NULL_STRING_P(R) ((R).bits.match_null_string_p) -+# define IS_ACTIVE(R) ((R).bits.is_active) -+# define MATCHED_SOMETHING(R) ((R).bits.matched_something) -+# define EVER_MATCHED_SOMETHING(R) ((R).bits.ever_matched_something) -+ -+ -+/* Call this when have matched a real character; it sets `matched' flags -+ for the subexpressions which we are currently inside. Also records -+ that those subexprs have matched. */ -+# define SET_REGS_MATCHED() \ -+ do \ -+ { \ -+ if (!set_regs_matched_done) \ -+ { \ -+ active_reg_t r; \ -+ set_regs_matched_done = 1; \ -+ for (r = lowest_active_reg; r <= highest_active_reg; r++) \ -+ { \ -+ MATCHED_SOMETHING (reg_info[r]) \ -+ = EVER_MATCHED_SOMETHING (reg_info[r]) \ -+ = 1; \ -+ } \ -+ } \ -+ } \ -+ while (0) -+# endif /* not DEFINED_ONCE */ -+ -+/* Registers are set to a sentinel when they haven't yet matched. */ -+static CHAR_T PREFIX(reg_unset_dummy); -+# define REG_UNSET_VALUE (&PREFIX(reg_unset_dummy)) -+# define REG_UNSET(e) ((e) == REG_UNSET_VALUE) -+ -+/* Subroutine declarations and macros for regex_compile. */ -+static void PREFIX(store_op1) (re_opcode_t op, UCHAR_T *loc, int arg); -+static void PREFIX(store_op2) (re_opcode_t op, UCHAR_T *loc, -+ int arg1, int arg2); -+static void PREFIX(insert_op1) (re_opcode_t op, UCHAR_T *loc, -+ int arg, UCHAR_T *end); -+static void PREFIX(insert_op2) (re_opcode_t op, UCHAR_T *loc, -+ int arg1, int arg2, UCHAR_T *end); -+static boolean PREFIX(at_begline_loc_p) (const CHAR_T *pattern, -+ const CHAR_T *p, -+ reg_syntax_t syntax); -+static boolean PREFIX(at_endline_loc_p) (const CHAR_T *p, -+ const CHAR_T *pend, -+ reg_syntax_t syntax); -+# ifdef WCHAR -+static reg_errcode_t wcs_compile_range (CHAR_T range_start, -+ const CHAR_T **p_ptr, -+ const CHAR_T *pend, -+ char *translate, -+ reg_syntax_t syntax, -+ UCHAR_T *b, -+ CHAR_T *char_set); -+static void insert_space (int num, CHAR_T *loc, CHAR_T *end); -+# else /* BYTE */ -+static reg_errcode_t byte_compile_range (unsigned int range_start, -+ const char **p_ptr, -+ const char *pend, -+ RE_TRANSLATE_TYPE translate, -+ reg_syntax_t syntax, -+ unsigned char *b); -+# endif /* WCHAR */ -+ -+/* Fetch the next character in the uncompiled pattern---translating it -+ if necessary. Also cast from a signed character in the constant -+ string passed to us by the user to an unsigned char that we can use -+ as an array index (in, e.g., `translate'). */ -+/* ifdef MBS_SUPPORT, we translate only if character <= 0xff, -+ because it is impossible to allocate 4GB array for some encodings -+ which have 4 byte character_set like UCS4. */ -+# ifndef PATFETCH -+# ifdef WCHAR -+# define PATFETCH(c) \ -+ do {if (p == pend) return REG_EEND; \ -+ c = (UCHAR_T) *p++; \ -+ if (translate && (c <= 0xff)) c = (UCHAR_T) translate[c]; \ -+ } while (0) -+# else /* BYTE */ -+# define PATFETCH(c) \ -+ do {if (p == pend) return REG_EEND; \ -+ c = (unsigned char) *p++; \ -+ if (translate) c = (unsigned char) translate[c]; \ -+ } while (0) -+# endif /* WCHAR */ -+# endif -+ -+/* Fetch the next character in the uncompiled pattern, with no -+ translation. */ -+# define PATFETCH_RAW(c) \ -+ do {if (p == pend) return REG_EEND; \ -+ c = (UCHAR_T) *p++; \ -+ } while (0) -+ -+/* Go backwards one character in the pattern. */ -+# define PATUNFETCH p-- -+ -+ -+/* If `translate' is non-null, return translate[D], else just D. We -+ cast the subscript to translate because some data is declared as -+ `char *', to avoid warnings when a string constant is passed. But -+ when we use a character as a subscript we must make it unsigned. */ -+/* ifdef MBS_SUPPORT, we translate only if character <= 0xff, -+ because it is impossible to allocate 4GB array for some encodings -+ which have 4 byte character_set like UCS4. */ -+ -+# ifndef TRANSLATE -+# ifdef WCHAR -+# define TRANSLATE(d) \ -+ ((translate && ((UCHAR_T) (d)) <= 0xff) \ -+ ? (char) translate[(unsigned char) (d)] : (d)) -+# else /* BYTE */ -+# define TRANSLATE(d) \ -+ (translate ? (char) translate[(unsigned char) (d)] : (char) (d)) -+# endif /* WCHAR */ -+# endif -+ -+ -+/* Macros for outputting the compiled pattern into `buffer'. */ -+ -+/* If the buffer isn't allocated when it comes in, use this. */ -+# define INIT_BUF_SIZE (32 * sizeof(UCHAR_T)) -+ -+/* Make sure we have at least N more bytes of space in buffer. */ -+# ifdef WCHAR -+# define GET_BUFFER_SPACE(n) \ -+ while (((unsigned long)b - (unsigned long)COMPILED_BUFFER_VAR \ -+ + (n)*sizeof(CHAR_T)) > bufp->allocated) \ -+ EXTEND_BUFFER () -+# else /* BYTE */ -+# define GET_BUFFER_SPACE(n) \ -+ while ((unsigned long) (b - bufp->buffer + (n)) > bufp->allocated) \ -+ EXTEND_BUFFER () -+# endif /* WCHAR */ -+ -+/* Make sure we have one more byte of buffer space and then add C to it. */ -+# define BUF_PUSH(c) \ -+ do { \ -+ GET_BUFFER_SPACE (1); \ -+ *b++ = (UCHAR_T) (c); \ -+ } while (0) -+ -+ -+/* Ensure we have two more bytes of buffer space and then append C1 and C2. */ -+# define BUF_PUSH_2(c1, c2) \ -+ do { \ -+ GET_BUFFER_SPACE (2); \ -+ *b++ = (UCHAR_T) (c1); \ -+ *b++ = (UCHAR_T) (c2); \ -+ } while (0) -+ -+ -+/* As with BUF_PUSH_2, except for three bytes. */ -+# define BUF_PUSH_3(c1, c2, c3) \ -+ do { \ -+ GET_BUFFER_SPACE (3); \ -+ *b++ = (UCHAR_T) (c1); \ -+ *b++ = (UCHAR_T) (c2); \ -+ *b++ = (UCHAR_T) (c3); \ -+ } while (0) -+ -+/* Store a jump with opcode OP at LOC to location TO. We store a -+ relative address offset by the three bytes the jump itself occupies. */ -+# define STORE_JUMP(op, loc, to) \ -+ PREFIX(store_op1) (op, loc, (int) ((to) - (loc) - (1 + OFFSET_ADDRESS_SIZE))) -+ -+/* Likewise, for a two-argument jump. */ -+# define STORE_JUMP2(op, loc, to, arg) \ -+ PREFIX(store_op2) (op, loc, (int) ((to) - (loc) - (1 + OFFSET_ADDRESS_SIZE)), arg) -+ -+/* Like `STORE_JUMP', but for inserting. Assume `b' is the buffer end. */ -+# define INSERT_JUMP(op, loc, to) \ -+ PREFIX(insert_op1) (op, loc, (int) ((to) - (loc) - (1 + OFFSET_ADDRESS_SIZE)), b) -+ -+/* Like `STORE_JUMP2', but for inserting. Assume `b' is the buffer end. */ -+# define INSERT_JUMP2(op, loc, to, arg) \ -+ PREFIX(insert_op2) (op, loc, (int) ((to) - (loc) - (1 + OFFSET_ADDRESS_SIZE)),\ -+ arg, b) -+ -+/* This is not an arbitrary limit: the arguments which represent offsets -+ into the pattern are two bytes long. So if 2^16 bytes turns out to -+ be too small, many things would have to change. */ -+/* Any other compiler which, like MSC, has allocation limit below 2^16 -+ bytes will have to use approach similar to what was done below for -+ MSC and drop MAX_BUF_SIZE a bit. Otherwise you may end up -+ reallocating to 0 bytes. Such thing is not going to work too well. -+ You have been warned!! */ -+# ifndef DEFINED_ONCE -+# if defined _MSC_VER && !defined WIN32 -+/* Microsoft C 16-bit versions limit malloc to approx 65512 bytes. -+ The REALLOC define eliminates a flurry of conversion warnings, -+ but is not required. */ -+# define MAX_BUF_SIZE 65500L -+# define REALLOC(p,s) realloc ((p), (size_t) (s)) -+# else -+# define MAX_BUF_SIZE (1L << 16) -+# define REALLOC(p,s) realloc ((p), (s)) -+# endif -+ -+/* Extend the buffer by twice its current size via realloc and -+ reset the pointers that pointed into the old block to point to the -+ correct places in the new one. If extending the buffer results in it -+ being larger than MAX_BUF_SIZE, then flag memory exhausted. */ -+# ifndef __BOUNDED_POINTERS__ -+# define __BOUNDED_POINTERS__ 0 -+# endif -+# if __BOUNDED_POINTERS__ -+# define SET_HIGH_BOUND(P) (__ptrhigh (P) = __ptrlow (P) + bufp->allocated) -+# define MOVE_BUFFER_POINTER(P) \ -+ (__ptrlow (P) += incr, SET_HIGH_BOUND (P), __ptrvalue (P) += incr) -+# define ELSE_EXTEND_BUFFER_HIGH_BOUND \ -+ else \ -+ { \ -+ SET_HIGH_BOUND (b); \ -+ SET_HIGH_BOUND (begalt); \ -+ if (fixup_alt_jump) \ -+ SET_HIGH_BOUND (fixup_alt_jump); \ -+ if (laststart) \ -+ SET_HIGH_BOUND (laststart); \ -+ if (pending_exact) \ -+ SET_HIGH_BOUND (pending_exact); \ -+ } -+# else -+# define MOVE_BUFFER_POINTER(P) (P) += incr -+# define ELSE_EXTEND_BUFFER_HIGH_BOUND -+# endif -+# endif /* not DEFINED_ONCE */ -+ -+# ifdef WCHAR -+# define EXTEND_BUFFER() \ -+ do { \ -+ UCHAR_T *old_buffer = COMPILED_BUFFER_VAR; \ -+ int wchar_count; \ -+ if (bufp->allocated + sizeof(UCHAR_T) > MAX_BUF_SIZE) \ -+ return REG_ESIZE; \ -+ bufp->allocated <<= 1; \ -+ if (bufp->allocated > MAX_BUF_SIZE) \ -+ bufp->allocated = MAX_BUF_SIZE; \ -+ /* How many characters the new buffer can have? */ \ -+ wchar_count = bufp->allocated / sizeof(UCHAR_T); \ -+ if (wchar_count == 0) wchar_count = 1; \ -+ /* Truncate the buffer to CHAR_T align. */ \ -+ bufp->allocated = wchar_count * sizeof(UCHAR_T); \ -+ RETALLOC (COMPILED_BUFFER_VAR, wchar_count, UCHAR_T); \ -+ bufp->buffer = (char*)COMPILED_BUFFER_VAR; \ -+ if (COMPILED_BUFFER_VAR == NULL) \ -+ return REG_ESPACE; \ -+ /* If the buffer moved, move all the pointers into it. */ \ -+ if (old_buffer != COMPILED_BUFFER_VAR) \ -+ { \ -+ int incr = COMPILED_BUFFER_VAR - old_buffer; \ -+ MOVE_BUFFER_POINTER (b); \ -+ MOVE_BUFFER_POINTER (begalt); \ -+ if (fixup_alt_jump) \ -+ MOVE_BUFFER_POINTER (fixup_alt_jump); \ -+ if (laststart) \ -+ MOVE_BUFFER_POINTER (laststart); \ -+ if (pending_exact) \ -+ MOVE_BUFFER_POINTER (pending_exact); \ -+ } \ -+ ELSE_EXTEND_BUFFER_HIGH_BOUND \ -+ } while (0) -+# else /* BYTE */ -+# define EXTEND_BUFFER() \ -+ do { \ -+ UCHAR_T *old_buffer = COMPILED_BUFFER_VAR; \ -+ if (bufp->allocated == MAX_BUF_SIZE) \ -+ return REG_ESIZE; \ -+ bufp->allocated <<= 1; \ -+ if (bufp->allocated > MAX_BUF_SIZE) \ -+ bufp->allocated = MAX_BUF_SIZE; \ -+ bufp->buffer = (UCHAR_T *) REALLOC (COMPILED_BUFFER_VAR, \ -+ bufp->allocated); \ -+ if (COMPILED_BUFFER_VAR == NULL) \ -+ return REG_ESPACE; \ -+ /* If the buffer moved, move all the pointers into it. */ \ -+ if (old_buffer != COMPILED_BUFFER_VAR) \ -+ { \ -+ int incr = COMPILED_BUFFER_VAR - old_buffer; \ -+ MOVE_BUFFER_POINTER (b); \ -+ MOVE_BUFFER_POINTER (begalt); \ -+ if (fixup_alt_jump) \ -+ MOVE_BUFFER_POINTER (fixup_alt_jump); \ -+ if (laststart) \ -+ MOVE_BUFFER_POINTER (laststart); \ -+ if (pending_exact) \ -+ MOVE_BUFFER_POINTER (pending_exact); \ -+ } \ -+ ELSE_EXTEND_BUFFER_HIGH_BOUND \ -+ } while (0) -+# endif /* WCHAR */ -+ -+# ifndef DEFINED_ONCE -+/* Since we have one byte reserved for the register number argument to -+ {start,stop}_memory, the maximum number of groups we can report -+ things about is what fits in that byte. */ -+# define MAX_REGNUM 255 -+ -+/* But patterns can have more than `MAX_REGNUM' registers. We just -+ ignore the excess. */ -+typedef unsigned regnum_t; -+ -+ -+/* Macros for the compile stack. */ -+ -+/* Since offsets can go either forwards or backwards, this type needs to -+ be able to hold values from -(MAX_BUF_SIZE - 1) to MAX_BUF_SIZE - 1. */ -+/* int may be not enough when sizeof(int) == 2. */ -+typedef long pattern_offset_t; -+ -+typedef struct -+{ -+ pattern_offset_t begalt_offset; -+ pattern_offset_t fixup_alt_jump; -+ pattern_offset_t inner_group_offset; -+ pattern_offset_t laststart_offset; -+ regnum_t regnum; -+} compile_stack_elt_t; -+ -+ -+typedef struct -+{ -+ compile_stack_elt_t *stack; -+ unsigned size; -+ unsigned avail; /* Offset of next open position. */ -+} compile_stack_type; -+ -+ -+# define INIT_COMPILE_STACK_SIZE 32 -+ -+# define COMPILE_STACK_EMPTY (compile_stack.avail == 0) -+# define COMPILE_STACK_FULL (compile_stack.avail == compile_stack.size) -+ -+/* The next available element. */ -+# define COMPILE_STACK_TOP (compile_stack.stack[compile_stack.avail]) -+ -+# endif /* not DEFINED_ONCE */ -+ -+/* Set the bit for character C in a list. */ -+# ifndef DEFINED_ONCE -+# define SET_LIST_BIT(c) \ -+ (b[((unsigned char) (c)) / BYTEWIDTH] \ -+ |= 1 << (((unsigned char) c) % BYTEWIDTH)) -+# endif /* DEFINED_ONCE */ -+ -+/* Get the next unsigned number in the uncompiled pattern. */ -+# define GET_UNSIGNED_NUMBER(num) \ -+ { \ -+ while (p != pend) \ -+ { \ -+ PATFETCH (c); \ -+ if (c < '0' || c > '9') \ -+ break; \ -+ if (num <= RE_DUP_MAX) \ -+ { \ -+ if (num < 0) \ -+ num = 0; \ -+ num = num * 10 + c - '0'; \ -+ } \ -+ } \ -+ } -+ -+# ifndef DEFINED_ONCE -+# if WIDE_CHAR_SUPPORT -+/* The GNU C library provides support for user-defined character classes -+ and the functions from ISO C amendement 1. */ -+# ifdef CHARCLASS_NAME_MAX -+# define CHAR_CLASS_MAX_LENGTH CHARCLASS_NAME_MAX -+# else -+/* This shouldn't happen but some implementation might still have this -+ problem. Use a reasonable default value. */ -+# define CHAR_CLASS_MAX_LENGTH 256 -+# endif -+ -+# ifdef _LIBC -+# define IS_CHAR_CLASS(string) __wctype (string) -+# else -+# define IS_CHAR_CLASS(string) wctype (string) -+# endif -+# else -+# define CHAR_CLASS_MAX_LENGTH 6 /* Namely, `xdigit'. */ -+ -+# define IS_CHAR_CLASS(string) \ -+ (STREQ (string, "alpha") || STREQ (string, "upper") \ -+ || STREQ (string, "lower") || STREQ (string, "digit") \ -+ || STREQ (string, "alnum") || STREQ (string, "xdigit") \ -+ || STREQ (string, "space") || STREQ (string, "print") \ -+ || STREQ (string, "punct") || STREQ (string, "graph") \ -+ || STREQ (string, "cntrl") || STREQ (string, "blank")) -+# endif -+# endif /* DEFINED_ONCE */ -+ -+# ifndef MATCH_MAY_ALLOCATE -+ -+/* If we cannot allocate large objects within re_match_2_internal, -+ we make the fail stack and register vectors global. -+ The fail stack, we grow to the maximum size when a regexp -+ is compiled. -+ The register vectors, we adjust in size each time we -+ compile a regexp, according to the number of registers it needs. */ -+ -+static PREFIX(fail_stack_type) fail_stack; -+ -+/* Size with which the following vectors are currently allocated. -+ That is so we can make them bigger as needed, -+ but never make them smaller. */ -+# ifdef DEFINED_ONCE -+static int regs_allocated_size; -+ -+static const char ** regstart, ** regend; -+static const char ** old_regstart, ** old_regend; -+static const char **best_regstart, **best_regend; -+static const char **reg_dummy; -+# endif /* DEFINED_ONCE */ -+ -+static PREFIX(register_info_type) *PREFIX(reg_info); -+static PREFIX(register_info_type) *PREFIX(reg_info_dummy); -+ -+/* Make the register vectors big enough for NUM_REGS registers, -+ but don't make them smaller. */ -+ -+static void -+PREFIX(regex_grow_registers) (int num_regs) -+{ -+ if (num_regs > regs_allocated_size) -+ { -+ RETALLOC_IF (regstart, num_regs, const char *); -+ RETALLOC_IF (regend, num_regs, const char *); -+ RETALLOC_IF (old_regstart, num_regs, const char *); -+ RETALLOC_IF (old_regend, num_regs, const char *); -+ RETALLOC_IF (best_regstart, num_regs, const char *); -+ RETALLOC_IF (best_regend, num_regs, const char *); -+ RETALLOC_IF (PREFIX(reg_info), num_regs, PREFIX(register_info_type)); -+ RETALLOC_IF (reg_dummy, num_regs, const char *); -+ RETALLOC_IF (PREFIX(reg_info_dummy), num_regs, PREFIX(register_info_type)); -+ -+ regs_allocated_size = num_regs; -+ } -+} -+ -+# endif /* not MATCH_MAY_ALLOCATE */ -+ -+# ifndef DEFINED_ONCE -+static boolean group_in_compile_stack (compile_stack_type compile_stack, -+ regnum_t regnum); -+# endif /* not DEFINED_ONCE */ -+ -+/* `regex_compile' compiles PATTERN (of length SIZE) according to SYNTAX. -+ Returns one of error codes defined in `regex.h', or zero for success. -+ -+ Assumes the `allocated' (and perhaps `buffer') and `translate' -+ fields are set in BUFP on entry. -+ -+ If it succeeds, results are put in BUFP (if it returns an error, the -+ contents of BUFP are undefined): -+ `buffer' is the compiled pattern; -+ `syntax' is set to SYNTAX; -+ `used' is set to the length of the compiled pattern; -+ `fastmap_accurate' is zero; -+ `re_nsub' is the number of subexpressions in PATTERN; -+ `not_bol' and `not_eol' are zero; -+ -+ The `fastmap' and `newline_anchor' fields are neither -+ examined nor set. */ -+ -+/* Return, freeing storage we allocated. */ -+# ifdef WCHAR -+# define FREE_STACK_RETURN(value) \ -+ return (free(pattern), free(mbs_offset), free(is_binary), free (compile_stack.stack), value) -+# else -+# define FREE_STACK_RETURN(value) \ -+ return (free (compile_stack.stack), value) -+# endif /* WCHAR */ -+ -+static reg_errcode_t -+PREFIX(regex_compile) (const char *ARG_PREFIX(pattern), -+ size_t ARG_PREFIX(size), reg_syntax_t syntax, -+ struct re_pattern_buffer *bufp) -+{ -+ /* We fetch characters from PATTERN here. Even though PATTERN is -+ `char *' (i.e., signed), we declare these variables as unsigned, so -+ they can be reliably used as array indices. */ -+ register UCHAR_T c, c1; -+ -+#ifdef WCHAR -+ /* A temporary space to keep wchar_t pattern and compiled pattern. */ -+ CHAR_T *pattern, *COMPILED_BUFFER_VAR; -+ size_t size; -+ /* offset buffer for optimization. See convert_mbs_to_wc. */ -+ int *mbs_offset = NULL; -+ /* It hold whether each wchar_t is binary data or not. */ -+ char *is_binary = NULL; -+ /* A flag whether exactn is handling binary data or not. */ -+ char is_exactn_bin = FALSE; -+#endif /* WCHAR */ -+ -+ /* A random temporary spot in PATTERN. */ -+ const CHAR_T *p1; -+ -+ /* Points to the end of the buffer, where we should append. */ -+ register UCHAR_T *b; -+ -+ /* Keeps track of unclosed groups. */ -+ compile_stack_type compile_stack; -+ -+ /* Points to the current (ending) position in the pattern. */ -+#ifdef WCHAR -+ const CHAR_T *p; -+ const CHAR_T *pend; -+#else /* BYTE */ -+ const CHAR_T *p = pattern; -+ const CHAR_T *pend = pattern + size; -+#endif /* WCHAR */ -+ -+ /* How to translate the characters in the pattern. */ -+ RE_TRANSLATE_TYPE translate = bufp->translate; -+ -+ /* Address of the count-byte of the most recently inserted `exactn' -+ command. This makes it possible to tell if a new exact-match -+ character can be added to that command or if the character requires -+ a new `exactn' command. */ -+ UCHAR_T *pending_exact = 0; -+ -+ /* Address of start of the most recently finished expression. -+ This tells, e.g., postfix * where to find the start of its -+ operand. Reset at the beginning of groups and alternatives. */ -+ UCHAR_T *laststart = 0; -+ -+ /* Address of beginning of regexp, or inside of last group. */ -+ UCHAR_T *begalt; -+ -+ /* Address of the place where a forward jump should go to the end of -+ the containing expression. Each alternative of an `or' -- except the -+ last -- ends with a forward jump of this sort. */ -+ UCHAR_T *fixup_alt_jump = 0; -+ -+ /* Counts open-groups as they are encountered. Remembered for the -+ matching close-group on the compile stack, so the same register -+ number is put in the stop_memory as the start_memory. */ -+ regnum_t regnum = 0; -+ -+#ifdef WCHAR -+ /* Initialize the wchar_t PATTERN and offset_buffer. */ -+ p = pend = pattern = TALLOC(csize + 1, CHAR_T); -+ mbs_offset = TALLOC(csize + 1, int); -+ is_binary = TALLOC(csize + 1, char); -+ if (pattern == NULL || mbs_offset == NULL || is_binary == NULL) -+ { -+ free(pattern); -+ free(mbs_offset); -+ free(is_binary); -+ return REG_ESPACE; -+ } -+ pattern[csize] = L'\0'; /* sentinel */ -+ size = convert_mbs_to_wcs(pattern, cpattern, csize, mbs_offset, is_binary); -+ pend = p + size; -+ if (size < 0) -+ { -+ free(pattern); -+ free(mbs_offset); -+ free(is_binary); -+ return REG_BADPAT; -+ } -+#endif -+ -+#ifdef DEBUG -+ DEBUG_PRINT1 ("\nCompiling pattern: "); -+ if (debug) -+ { -+ unsigned debug_count; -+ -+ for (debug_count = 0; debug_count < size; debug_count++) -+ PUT_CHAR (pattern[debug_count]); -+ putchar ('\n'); -+ } -+#endif /* DEBUG */ -+ -+ /* Initialize the compile stack. */ -+ compile_stack.stack = TALLOC (INIT_COMPILE_STACK_SIZE, compile_stack_elt_t); -+ if (compile_stack.stack == NULL) -+ { -+#ifdef WCHAR -+ free(pattern); -+ free(mbs_offset); -+ free(is_binary); -+#endif -+ return REG_ESPACE; -+ } -+ -+ compile_stack.size = INIT_COMPILE_STACK_SIZE; -+ compile_stack.avail = 0; -+ -+ /* Initialize the pattern buffer. */ -+ bufp->syntax = syntax; -+ bufp->fastmap_accurate = 0; -+ bufp->not_bol = bufp->not_eol = 0; -+ -+ /* Set `used' to zero, so that if we return an error, the pattern -+ printer (for debugging) will think there's no pattern. We reset it -+ at the end. */ -+ bufp->used = 0; -+ -+ /* Always count groups, whether or not bufp->no_sub is set. */ -+ bufp->re_nsub = 0; -+ -+#if !defined emacs && !defined SYNTAX_TABLE -+ /* Initialize the syntax table. */ -+ init_syntax_once (); -+#endif -+ -+ if (bufp->allocated == 0) -+ { -+ if (bufp->buffer) -+ { /* If zero allocated, but buffer is non-null, try to realloc -+ enough space. This loses if buffer's address is bogus, but -+ that is the user's responsibility. */ -+#ifdef WCHAR -+ /* Free bufp->buffer and allocate an array for wchar_t pattern -+ buffer. */ -+ free(bufp->buffer); -+ COMPILED_BUFFER_VAR = TALLOC (INIT_BUF_SIZE/sizeof(UCHAR_T), -+ UCHAR_T); -+#else -+ RETALLOC (COMPILED_BUFFER_VAR, INIT_BUF_SIZE, UCHAR_T); -+#endif /* WCHAR */ -+ } -+ else -+ { /* Caller did not allocate a buffer. Do it for them. */ -+ COMPILED_BUFFER_VAR = TALLOC (INIT_BUF_SIZE / sizeof(UCHAR_T), -+ UCHAR_T); -+ } -+ -+ if (!COMPILED_BUFFER_VAR) FREE_STACK_RETURN (REG_ESPACE); -+#ifdef WCHAR -+ bufp->buffer = (char*)COMPILED_BUFFER_VAR; -+#endif /* WCHAR */ -+ bufp->allocated = INIT_BUF_SIZE; -+ } -+#ifdef WCHAR -+ else -+ COMPILED_BUFFER_VAR = (UCHAR_T*) bufp->buffer; -+#endif -+ -+ begalt = b = COMPILED_BUFFER_VAR; -+ -+ /* Loop through the uncompiled pattern until we're at the end. */ -+ while (p != pend) -+ { -+ PATFETCH (c); -+ -+ switch (c) -+ { -+ case '^': -+ { -+ if ( /* If at start of pattern, it's an operator. */ -+ p == pattern + 1 -+ /* If context independent, it's an operator. */ -+ || syntax & RE_CONTEXT_INDEP_ANCHORS -+ /* Otherwise, depends on what's come before. */ -+ || PREFIX(at_begline_loc_p) (pattern, p, syntax)) -+ BUF_PUSH (begline); -+ else -+ goto normal_char; -+ } -+ break; -+ -+ -+ case '$': -+ { -+ if ( /* If at end of pattern, it's an operator. */ -+ p == pend -+ /* If context independent, it's an operator. */ -+ || syntax & RE_CONTEXT_INDEP_ANCHORS -+ /* Otherwise, depends on what's next. */ -+ || PREFIX(at_endline_loc_p) (p, pend, syntax)) -+ BUF_PUSH (endline); -+ else -+ goto normal_char; -+ } -+ break; -+ -+ -+ case '+': -+ case '?': -+ if ((syntax & RE_BK_PLUS_QM) -+ || (syntax & RE_LIMITED_OPS)) -+ goto normal_char; -+ handle_plus: -+ case '*': -+ /* If there is no previous pattern... */ -+ if (!laststart) -+ { -+ if (syntax & RE_CONTEXT_INVALID_OPS) -+ FREE_STACK_RETURN (REG_BADRPT); -+ else if (!(syntax & RE_CONTEXT_INDEP_OPS)) -+ goto normal_char; -+ } -+ -+ { -+ /* Are we optimizing this jump? */ -+ boolean keep_string_p = false; -+ -+ /* 1 means zero (many) matches is allowed. */ -+ char zero_times_ok = 0, many_times_ok = 0; -+ -+ /* If there is a sequence of repetition chars, collapse it -+ down to just one (the right one). We can't combine -+ interval operators with these because of, e.g., `a{2}*', -+ which should only match an even number of `a's. */ -+ -+ for (;;) -+ { -+ zero_times_ok |= c != '+'; -+ many_times_ok |= c != '?'; -+ -+ if (p == pend) -+ break; -+ -+ PATFETCH (c); -+ -+ if (c == '*' -+ || (!(syntax & RE_BK_PLUS_QM) && (c == '+' || c == '?'))) -+ ; -+ -+ else if (syntax & RE_BK_PLUS_QM && c == '\\') -+ { -+ if (p == pend) FREE_STACK_RETURN (REG_EESCAPE); -+ -+ PATFETCH (c1); -+ if (!(c1 == '+' || c1 == '?')) -+ { -+ PATUNFETCH; -+ PATUNFETCH; -+ break; -+ } -+ -+ c = c1; -+ } -+ else -+ { -+ PATUNFETCH; -+ break; -+ } -+ -+ /* If we get here, we found another repeat character. */ -+ } -+ -+ /* Star, etc. applied to an empty pattern is equivalent -+ to an empty pattern. */ -+ if (!laststart) -+ break; -+ -+ /* Now we know whether or not zero matches is allowed -+ and also whether or not two or more matches is allowed. */ -+ if (many_times_ok) -+ { /* More than one repetition is allowed, so put in at the -+ end a backward relative jump from `b' to before the next -+ jump we're going to put in below (which jumps from -+ laststart to after this jump). -+ -+ But if we are at the `*' in the exact sequence `.*\n', -+ insert an unconditional jump backwards to the ., -+ instead of the beginning of the loop. This way we only -+ push a failure point once, instead of every time -+ through the loop. */ -+ assert (p - 1 > pattern); -+ -+ /* Allocate the space for the jump. */ -+ GET_BUFFER_SPACE (1 + OFFSET_ADDRESS_SIZE); -+ -+ /* We know we are not at the first character of the pattern, -+ because laststart was nonzero. And we've already -+ incremented `p', by the way, to be the character after -+ the `*'. Do we have to do something analogous here -+ for null bytes, because of RE_DOT_NOT_NULL? */ -+ if (TRANSLATE (*(p - 2)) == TRANSLATE ('.') -+ && zero_times_ok -+ && p < pend && TRANSLATE (*p) == TRANSLATE ('\n') -+ && !(syntax & RE_DOT_NEWLINE)) -+ { /* We have .*\n. */ -+ STORE_JUMP (jump, b, laststart); -+ keep_string_p = true; -+ } -+ else -+ /* Anything else. */ -+ STORE_JUMP (maybe_pop_jump, b, laststart - -+ (1 + OFFSET_ADDRESS_SIZE)); -+ -+ /* We've added more stuff to the buffer. */ -+ b += 1 + OFFSET_ADDRESS_SIZE; -+ } -+ -+ /* On failure, jump from laststart to b + 3, which will be the -+ end of the buffer after this jump is inserted. */ -+ /* ifdef WCHAR, 'b + 1 + OFFSET_ADDRESS_SIZE' instead of -+ 'b + 3'. */ -+ GET_BUFFER_SPACE (1 + OFFSET_ADDRESS_SIZE); -+ INSERT_JUMP (keep_string_p ? on_failure_keep_string_jump -+ : on_failure_jump, -+ laststart, b + 1 + OFFSET_ADDRESS_SIZE); -+ pending_exact = 0; -+ b += 1 + OFFSET_ADDRESS_SIZE; -+ -+ if (!zero_times_ok) -+ { -+ /* At least one repetition is required, so insert a -+ `dummy_failure_jump' before the initial -+ `on_failure_jump' instruction of the loop. This -+ effects a skip over that instruction the first time -+ we hit that loop. */ -+ GET_BUFFER_SPACE (1 + OFFSET_ADDRESS_SIZE); -+ INSERT_JUMP (dummy_failure_jump, laststart, laststart + -+ 2 + 2 * OFFSET_ADDRESS_SIZE); -+ b += 1 + OFFSET_ADDRESS_SIZE; -+ } -+ } -+ break; -+ -+ -+ case '.': -+ laststart = b; -+ BUF_PUSH (anychar); -+ break; -+ -+ -+ case '[': -+ { -+ boolean had_char_class = false; -+#ifdef WCHAR -+ CHAR_T range_start = 0xffffffff; -+#else -+ unsigned int range_start = 0xffffffff; -+#endif -+ if (p == pend) FREE_STACK_RETURN (REG_EBRACK); -+ -+#ifdef WCHAR -+ /* We assume a charset(_not) structure as a wchar_t array. -+ charset[0] = (re_opcode_t) charset(_not) -+ charset[1] = l (= length of char_classes) -+ charset[2] = m (= length of collating_symbols) -+ charset[3] = n (= length of equivalence_classes) -+ charset[4] = o (= length of char_ranges) -+ charset[5] = p (= length of chars) -+ -+ charset[6] = char_class (wctype_t) -+ charset[6+CHAR_CLASS_SIZE] = char_class (wctype_t) -+ ... -+ charset[l+5] = char_class (wctype_t) -+ -+ charset[l+6] = collating_symbol (wchar_t) -+ ... -+ charset[l+m+5] = collating_symbol (wchar_t) -+ ifdef _LIBC we use the index if -+ _NL_COLLATE_SYMB_EXTRAMB instead of -+ wchar_t string. -+ -+ charset[l+m+6] = equivalence_classes (wchar_t) -+ ... -+ charset[l+m+n+5] = equivalence_classes (wchar_t) -+ ifdef _LIBC we use the index in -+ _NL_COLLATE_WEIGHT instead of -+ wchar_t string. -+ -+ charset[l+m+n+6] = range_start -+ charset[l+m+n+7] = range_end -+ ... -+ charset[l+m+n+2o+4] = range_start -+ charset[l+m+n+2o+5] = range_end -+ ifdef _LIBC we use the value looked up -+ in _NL_COLLATE_COLLSEQ instead of -+ wchar_t character. -+ -+ charset[l+m+n+2o+6] = char -+ ... -+ charset[l+m+n+2o+p+5] = char -+ -+ */ -+ -+ /* We need at least 6 spaces: the opcode, the length of -+ char_classes, the length of collating_symbols, the length of -+ equivalence_classes, the length of char_ranges, the length of -+ chars. */ -+ GET_BUFFER_SPACE (6); -+ -+ /* Save b as laststart. And We use laststart as the pointer -+ to the first element of the charset here. -+ In other words, laststart[i] indicates charset[i]. */ -+ laststart = b; -+ -+ /* We test `*p == '^' twice, instead of using an if -+ statement, so we only need one BUF_PUSH. */ -+ BUF_PUSH (*p == '^' ? charset_not : charset); -+ if (*p == '^') -+ p++; -+ -+ /* Push the length of char_classes, the length of -+ collating_symbols, the length of equivalence_classes, the -+ length of char_ranges and the length of chars. */ -+ BUF_PUSH_3 (0, 0, 0); -+ BUF_PUSH_2 (0, 0); -+ -+ /* Remember the first position in the bracket expression. */ -+ p1 = p; -+ -+ /* charset_not matches newline according to a syntax bit. */ -+ if ((re_opcode_t) b[-6] == charset_not -+ && (syntax & RE_HAT_LISTS_NOT_NEWLINE)) -+ { -+ BUF_PUSH('\n'); -+ laststart[5]++; /* Update the length of characters */ -+ } -+ -+ /* Read in characters and ranges, setting map bits. */ -+ for (;;) -+ { -+ if (p == pend) FREE_STACK_RETURN (REG_EBRACK); -+ -+ PATFETCH (c); -+ -+ /* \ might escape characters inside [...] and [^...]. */ -+ if ((syntax & RE_BACKSLASH_ESCAPE_IN_LISTS) && c == '\\') -+ { -+ if (p == pend) FREE_STACK_RETURN (REG_EESCAPE); -+ -+ PATFETCH (c1); -+ BUF_PUSH(c1); -+ laststart[5]++; /* Update the length of chars */ -+ range_start = c1; -+ continue; -+ } -+ -+ /* Could be the end of the bracket expression. If it's -+ not (i.e., when the bracket expression is `[]' so -+ far), the ']' character bit gets set way below. */ -+ if (c == ']' && p != p1 + 1) -+ break; -+ -+ /* Look ahead to see if it's a range when the last thing -+ was a character class. */ -+ if (had_char_class && c == '-' && *p != ']') -+ FREE_STACK_RETURN (REG_ERANGE); -+ -+ /* Look ahead to see if it's a range when the last thing -+ was a character: if this is a hyphen not at the -+ beginning or the end of a list, then it's the range -+ operator. */ -+ if (c == '-' -+ && !(p - 2 >= pattern && p[-2] == '[') -+ && !(p - 3 >= pattern && p[-3] == '[' && p[-2] == '^') -+ && *p != ']') -+ { -+ reg_errcode_t ret; -+ /* Allocate the space for range_start and range_end. */ -+ GET_BUFFER_SPACE (2); -+ /* Update the pointer to indicate end of buffer. */ -+ b += 2; -+ ret = wcs_compile_range (range_start, &p, pend, translate, -+ syntax, b, laststart); -+ if (ret != REG_NOERROR) FREE_STACK_RETURN (ret); -+ range_start = 0xffffffff; -+ } -+ else if (p[0] == '-' && p[1] != ']') -+ { /* This handles ranges made up of characters only. */ -+ reg_errcode_t ret; -+ -+ /* Move past the `-'. */ -+ PATFETCH (c1); -+ /* Allocate the space for range_start and range_end. */ -+ GET_BUFFER_SPACE (2); -+ /* Update the pointer to indicate end of buffer. */ -+ b += 2; -+ ret = wcs_compile_range (c, &p, pend, translate, syntax, b, -+ laststart); -+ if (ret != REG_NOERROR) FREE_STACK_RETURN (ret); -+ range_start = 0xffffffff; -+ } -+ -+ /* See if we're at the beginning of a possible character -+ class. */ -+ else if (syntax & RE_CHAR_CLASSES && c == '[' && *p == ':') -+ { /* Leave room for the null. */ -+ char str[CHAR_CLASS_MAX_LENGTH + 1]; -+ -+ PATFETCH (c); -+ c1 = 0; -+ -+ /* If pattern is `[[:'. */ -+ if (p == pend) FREE_STACK_RETURN (REG_EBRACK); -+ -+ for (;;) -+ { -+ PATFETCH (c); -+ if ((c == ':' && *p == ']') || p == pend) -+ break; -+ if (c1 < CHAR_CLASS_MAX_LENGTH) -+ str[c1++] = c; -+ else -+ /* This is in any case an invalid class name. */ -+ str[0] = '\0'; -+ } -+ str[c1] = '\0'; -+ -+ /* If isn't a word bracketed by `[:' and `:]': -+ undo the ending character, the letters, and leave -+ the leading `:' and `[' (but store them as character). */ -+ if (c == ':' && *p == ']') -+ { -+ wctype_t wt; -+ uintptr_t alignedp; -+ -+ /* Query the character class as wctype_t. */ -+ wt = IS_CHAR_CLASS (str); -+ if (wt == 0) -+ FREE_STACK_RETURN (REG_ECTYPE); -+ -+ /* Throw away the ] at the end of the character -+ class. */ -+ PATFETCH (c); -+ -+ if (p == pend) FREE_STACK_RETURN (REG_EBRACK); -+ -+ /* Allocate the space for character class. */ -+ GET_BUFFER_SPACE(CHAR_CLASS_SIZE); -+ /* Update the pointer to indicate end of buffer. */ -+ b += CHAR_CLASS_SIZE; -+ /* Move data which follow character classes -+ not to violate the data. */ -+ insert_space(CHAR_CLASS_SIZE, -+ laststart + 6 + laststart[1], -+ b - 1); -+ alignedp = ((uintptr_t)(laststart + 6 + laststart[1]) -+ + __alignof__(wctype_t) - 1) -+ & ~(uintptr_t)(__alignof__(wctype_t) - 1); -+ /* Store the character class. */ -+ *((wctype_t*)alignedp) = wt; -+ /* Update length of char_classes */ -+ laststart[1] += CHAR_CLASS_SIZE; -+ -+ had_char_class = true; -+ } -+ else -+ { -+ c1++; -+ while (c1--) -+ PATUNFETCH; -+ BUF_PUSH ('['); -+ BUF_PUSH (':'); -+ laststart[5] += 2; /* Update the length of characters */ -+ range_start = ':'; -+ had_char_class = false; -+ } -+ } -+ else if (syntax & RE_CHAR_CLASSES && c == '[' && (*p == '=' -+ || *p == '.')) -+ { -+ CHAR_T str[128]; /* Should be large enough. */ -+ CHAR_T delim = *p; /* '=' or '.' */ -+# ifdef _LIBC -+ uint32_t nrules = -+ _NL_CURRENT_WORD (LC_COLLATE, _NL_COLLATE_NRULES); -+# endif -+ PATFETCH (c); -+ c1 = 0; -+ -+ /* If pattern is `[[=' or '[[.'. */ -+ if (p == pend) FREE_STACK_RETURN (REG_EBRACK); -+ -+ for (;;) -+ { -+ PATFETCH (c); -+ if ((c == delim && *p == ']') || p == pend) -+ break; -+ if (c1 < sizeof (str) - 1) -+ str[c1++] = c; -+ else -+ /* This is in any case an invalid class name. */ -+ str[0] = '\0'; -+ } -+ str[c1] = '\0'; -+ -+ if (c == delim && *p == ']' && str[0] != '\0') -+ { -+ unsigned int i, offset; -+ /* If we have no collation data we use the default -+ collation in which each character is in a class -+ by itself. It also means that ASCII is the -+ character set and therefore we cannot have character -+ with more than one byte in the multibyte -+ representation. */ -+ -+ /* If not defined _LIBC, we push the name and -+ `\0' for the sake of matching performance. */ -+ int datasize = c1 + 1; -+ -+# ifdef _LIBC -+ int32_t idx = 0; -+ if (nrules == 0) -+# endif -+ { -+ if (c1 != 1) -+ FREE_STACK_RETURN (REG_ECOLLATE); -+ } -+# ifdef _LIBC -+ else -+ { -+ const int32_t *table; -+ const int32_t *weights; -+ const int32_t *extra; -+ const int32_t *indirect; -+ wint_t *cp; -+ -+ if(delim == '=') -+ { -+ /* We push the index for equivalence class. */ -+ cp = (wint_t*)str; -+ -+ table = (const int32_t *) -+ _NL_CURRENT (LC_COLLATE, -+ _NL_COLLATE_TABLEWC); -+ weights = (const int32_t *) -+ _NL_CURRENT (LC_COLLATE, -+ _NL_COLLATE_WEIGHTWC); -+ extra = (const wint_t *) -+ _NL_CURRENT (LC_COLLATE, -+ _NL_COLLATE_EXTRAWC); -+ indirect = (const int32_t *) -+ _NL_CURRENT (LC_COLLATE, -+ _NL_COLLATE_INDIRECTWC); -+ -+ idx = FINDIDX (table, indirect, extra, &cp, 1); -+ if (idx == 0 || cp < (wint_t*) str + c1) -+ /* This is no valid character. */ -+ FREE_STACK_RETURN (REG_ECOLLATE); -+ -+ str[0] = (wchar_t)idx; -+ } -+ else /* delim == '.' */ -+ { -+ /* We push collation sequence value -+ for collating symbol. */ -+ int32_t table_size; -+ const int32_t *symb_table; -+ const unsigned char *extra; -+ int32_t idx; -+ int32_t elem; -+ int32_t second; -+ int32_t hash; -+ char char_str[c1]; -+ -+ /* We have to convert the name to a single-byte -+ string. This is possible since the names -+ consist of ASCII characters and the internal -+ representation is UCS4. */ -+ for (i = 0; i < c1; ++i) -+ char_str[i] = str[i]; -+ -+ table_size = -+ _NL_CURRENT_WORD (LC_COLLATE, -+ _NL_COLLATE_SYMB_HASH_SIZEMB); -+ symb_table = (const int32_t *) -+ _NL_CURRENT (LC_COLLATE, -+ _NL_COLLATE_SYMB_TABLEMB); -+ extra = (const unsigned char *) -+ _NL_CURRENT (LC_COLLATE, -+ _NL_COLLATE_SYMB_EXTRAMB); -+ -+ /* Locate the character in the hashing table. */ -+ hash = elem_hash (char_str, c1); -+ -+ idx = 0; -+ elem = hash % table_size; -+ second = hash % (table_size - 2); -+ while (symb_table[2 * elem] != 0) -+ { -+ /* First compare the hashing value. */ -+ if (symb_table[2 * elem] == hash -+ && c1 == extra[symb_table[2 * elem + 1]] -+ && memcmp (char_str, -+ &extra[symb_table[2 * elem + 1] -+ + 1], c1) == 0) -+ { -+ /* Yep, this is the entry. */ -+ idx = symb_table[2 * elem + 1]; -+ idx += 1 + extra[idx]; -+ break; -+ } -+ -+ /* Next entry. */ -+ elem += second; -+ } -+ -+ if (symb_table[2 * elem] != 0) -+ { -+ /* Compute the index of the byte sequence -+ in the table. */ -+ idx += 1 + extra[idx]; -+ /* Adjust for the alignment. */ -+ idx = (idx + 3) & ~3; -+ -+ str[0] = (wchar_t) idx + 4; -+ } -+ else if (symb_table[2 * elem] == 0 && c1 == 1) -+ { -+ /* No valid character. Match it as a -+ single byte character. */ -+ had_char_class = false; -+ BUF_PUSH(str[0]); -+ /* Update the length of characters */ -+ laststart[5]++; -+ range_start = str[0]; -+ -+ /* Throw away the ] at the end of the -+ collating symbol. */ -+ PATFETCH (c); -+ /* exit from the switch block. */ -+ continue; -+ } -+ else -+ FREE_STACK_RETURN (REG_ECOLLATE); -+ } -+ datasize = 1; -+ } -+# endif -+ /* Throw away the ] at the end of the equivalence -+ class (or collating symbol). */ -+ PATFETCH (c); -+ -+ /* Allocate the space for the equivalence class -+ (or collating symbol) (and '\0' if needed). */ -+ GET_BUFFER_SPACE(datasize); -+ /* Update the pointer to indicate end of buffer. */ -+ b += datasize; -+ -+ if (delim == '=') -+ { /* equivalence class */ -+ /* Calculate the offset of char_ranges, -+ which is next to equivalence_classes. */ -+ offset = laststart[1] + laststart[2] -+ + laststart[3] +6; -+ /* Insert space. */ -+ insert_space(datasize, laststart + offset, b - 1); -+ -+ /* Write the equivalence_class and \0. */ -+ for (i = 0 ; i < datasize ; i++) -+ laststart[offset + i] = str[i]; -+ -+ /* Update the length of equivalence_classes. */ -+ laststart[3] += datasize; -+ had_char_class = true; -+ } -+ else /* delim == '.' */ -+ { /* collating symbol */ -+ /* Calculate the offset of the equivalence_classes, -+ which is next to collating_symbols. */ -+ offset = laststart[1] + laststart[2] + 6; -+ /* Insert space and write the collationg_symbol -+ and \0. */ -+ insert_space(datasize, laststart + offset, b-1); -+ for (i = 0 ; i < datasize ; i++) -+ laststart[offset + i] = str[i]; -+ -+ /* In re_match_2_internal if range_start < -1, we -+ assume -range_start is the offset of the -+ collating symbol which is specified as -+ the character of the range start. So we assign -+ -(laststart[1] + laststart[2] + 6) to -+ range_start. */ -+ range_start = -(laststart[1] + laststart[2] + 6); -+ /* Update the length of collating_symbol. */ -+ laststart[2] += datasize; -+ had_char_class = false; -+ } -+ } -+ else -+ { -+ c1++; -+ while (c1--) -+ PATUNFETCH; -+ BUF_PUSH ('['); -+ BUF_PUSH (delim); -+ laststart[5] += 2; /* Update the length of characters */ -+ range_start = delim; -+ had_char_class = false; -+ } -+ } -+ else -+ { -+ had_char_class = false; -+ BUF_PUSH(c); -+ laststart[5]++; /* Update the length of characters */ -+ range_start = c; -+ } -+ } -+ -+#else /* BYTE */ -+ /* Ensure that we have enough space to push a charset: the -+ opcode, the length count, and the bitset; 34 bytes in all. */ -+ GET_BUFFER_SPACE (34); -+ -+ laststart = b; -+ -+ /* We test `*p == '^' twice, instead of using an if -+ statement, so we only need one BUF_PUSH. */ -+ BUF_PUSH (*p == '^' ? charset_not : charset); -+ if (*p == '^') -+ p++; -+ -+ /* Remember the first position in the bracket expression. */ -+ p1 = p; -+ -+ /* Push the number of bytes in the bitmap. */ -+ BUF_PUSH ((1 << BYTEWIDTH) / BYTEWIDTH); -+ -+ /* Clear the whole map. */ -+ bzero (b, (1 << BYTEWIDTH) / BYTEWIDTH); -+ -+ /* charset_not matches newline according to a syntax bit. */ -+ if ((re_opcode_t) b[-2] == charset_not -+ && (syntax & RE_HAT_LISTS_NOT_NEWLINE)) -+ SET_LIST_BIT ('\n'); -+ -+ /* Read in characters and ranges, setting map bits. */ -+ for (;;) -+ { -+ if (p == pend) FREE_STACK_RETURN (REG_EBRACK); -+ -+ PATFETCH (c); -+ -+ /* \ might escape characters inside [...] and [^...]. */ -+ if ((syntax & RE_BACKSLASH_ESCAPE_IN_LISTS) && c == '\\') -+ { -+ if (p == pend) FREE_STACK_RETURN (REG_EESCAPE); -+ -+ PATFETCH (c1); -+ SET_LIST_BIT (c1); -+ range_start = c1; -+ continue; -+ } -+ -+ /* Could be the end of the bracket expression. If it's -+ not (i.e., when the bracket expression is `[]' so -+ far), the ']' character bit gets set way below. */ -+ if (c == ']' && p != p1 + 1) -+ break; -+ -+ /* Look ahead to see if it's a range when the last thing -+ was a character class. */ -+ if (had_char_class && c == '-' && *p != ']') -+ FREE_STACK_RETURN (REG_ERANGE); -+ -+ /* Look ahead to see if it's a range when the last thing -+ was a character: if this is a hyphen not at the -+ beginning or the end of a list, then it's the range -+ operator. */ -+ if (c == '-' -+ && !(p - 2 >= pattern && p[-2] == '[') -+ && !(p - 3 >= pattern && p[-3] == '[' && p[-2] == '^') -+ && *p != ']') -+ { -+ reg_errcode_t ret -+ = byte_compile_range (range_start, &p, pend, translate, -+ syntax, b); -+ if (ret != REG_NOERROR) FREE_STACK_RETURN (ret); -+ range_start = 0xffffffff; -+ } -+ -+ else if (p[0] == '-' && p[1] != ']') -+ { /* This handles ranges made up of characters only. */ -+ reg_errcode_t ret; -+ -+ /* Move past the `-'. */ -+ PATFETCH (c1); -+ -+ ret = byte_compile_range (c, &p, pend, translate, syntax, b); -+ if (ret != REG_NOERROR) FREE_STACK_RETURN (ret); -+ range_start = 0xffffffff; -+ } -+ -+ /* See if we're at the beginning of a possible character -+ class. */ -+ -+ else if (syntax & RE_CHAR_CLASSES && c == '[' && *p == ':') -+ { /* Leave room for the null. */ -+ char str[CHAR_CLASS_MAX_LENGTH + 1]; -+ -+ PATFETCH (c); -+ c1 = 0; -+ -+ /* If pattern is `[[:'. */ -+ if (p == pend) FREE_STACK_RETURN (REG_EBRACK); -+ -+ for (;;) -+ { -+ PATFETCH (c); -+ if ((c == ':' && *p == ']') || p == pend) -+ break; -+ if (((int) c1) < CHAR_CLASS_MAX_LENGTH) -+ str[c1++] = c; -+ else -+ /* This is in any case an invalid class name. */ -+ str[0] = '\0'; -+ } -+ str[c1] = '\0'; -+ -+ /* If isn't a word bracketed by `[:' and `:]': -+ undo the ending character, the letters, and leave -+ the leading `:' and `[' (but set bits for them). */ -+ if (c == ':' && *p == ']') -+ { -+# if WIDE_CHAR_SUPPORT -+ boolean is_lower = STREQ (str, "lower"); -+ boolean is_upper = STREQ (str, "upper"); -+ wctype_t wt; -+ int ch; -+ -+ wt = IS_CHAR_CLASS (str); -+ if (wt == 0) -+ FREE_STACK_RETURN (REG_ECTYPE); -+ -+ /* Throw away the ] at the end of the character -+ class. */ -+ PATFETCH (c); -+ -+ if (p == pend) FREE_STACK_RETURN (REG_EBRACK); -+ -+ for (ch = 0; ch < 1 << BYTEWIDTH; ++ch) -+ { -+# ifdef _LIBC -+ if (__iswctype (__btowc (ch), wt)) -+ SET_LIST_BIT (ch); -+# else -+ if (iswctype (btowc (ch), wt)) -+ SET_LIST_BIT (ch); -+# endif -+ -+ if (translate && (is_upper || is_lower) -+ && (ISUPPER (ch) || ISLOWER (ch))) -+ SET_LIST_BIT (ch); -+ } -+ -+ had_char_class = true; -+# else -+ int ch; -+ boolean is_alnum = STREQ (str, "alnum"); -+ boolean is_alpha = STREQ (str, "alpha"); -+ boolean is_blank = STREQ (str, "blank"); -+ boolean is_cntrl = STREQ (str, "cntrl"); -+ boolean is_digit = STREQ (str, "digit"); -+ boolean is_graph = STREQ (str, "graph"); -+ boolean is_lower = STREQ (str, "lower"); -+ boolean is_print = STREQ (str, "print"); -+ boolean is_punct = STREQ (str, "punct"); -+ boolean is_space = STREQ (str, "space"); -+ boolean is_upper = STREQ (str, "upper"); -+ boolean is_xdigit = STREQ (str, "xdigit"); -+ -+ if (!IS_CHAR_CLASS (str)) -+ FREE_STACK_RETURN (REG_ECTYPE); -+ -+ /* Throw away the ] at the end of the character -+ class. */ -+ PATFETCH (c); -+ -+ if (p == pend) FREE_STACK_RETURN (REG_EBRACK); -+ -+ for (ch = 0; ch < 1 << BYTEWIDTH; ch++) -+ { -+ /* This was split into 3 if's to -+ avoid an arbitrary limit in some compiler. */ -+ if ( (is_alnum && ISALNUM (ch)) -+ || (is_alpha && ISALPHA (ch)) -+ || (is_blank && ISBLANK (ch)) -+ || (is_cntrl && ISCNTRL (ch))) -+ SET_LIST_BIT (ch); -+ if ( (is_digit && ISDIGIT (ch)) -+ || (is_graph && ISGRAPH (ch)) -+ || (is_lower && ISLOWER (ch)) -+ || (is_print && ISPRINT (ch))) -+ SET_LIST_BIT (ch); -+ if ( (is_punct && ISPUNCT (ch)) -+ || (is_space && ISSPACE (ch)) -+ || (is_upper && ISUPPER (ch)) -+ || (is_xdigit && ISXDIGIT (ch))) -+ SET_LIST_BIT (ch); -+ if ( translate && (is_upper || is_lower) -+ && (ISUPPER (ch) || ISLOWER (ch))) -+ SET_LIST_BIT (ch); -+ } -+ had_char_class = true; -+# endif /* libc || wctype.h */ -+ } -+ else -+ { -+ c1++; -+ while (c1--) -+ PATUNFETCH; -+ SET_LIST_BIT ('['); -+ SET_LIST_BIT (':'); -+ range_start = ':'; -+ had_char_class = false; -+ } -+ } -+ else if (syntax & RE_CHAR_CLASSES && c == '[' && *p == '=') -+ { -+ unsigned char str[MB_LEN_MAX + 1]; -+# ifdef _LIBC -+ uint32_t nrules = -+ _NL_CURRENT_WORD (LC_COLLATE, _NL_COLLATE_NRULES); -+# endif -+ -+ PATFETCH (c); -+ c1 = 0; -+ -+ /* If pattern is `[[='. */ -+ if (p == pend) FREE_STACK_RETURN (REG_EBRACK); -+ -+ for (;;) -+ { -+ PATFETCH (c); -+ if ((c == '=' && *p == ']') || p == pend) -+ break; -+ if (c1 < MB_LEN_MAX) -+ str[c1++] = c; -+ else -+ /* This is in any case an invalid class name. */ -+ str[0] = '\0'; -+ } -+ str[c1] = '\0'; -+ -+ if (c == '=' && *p == ']' && str[0] != '\0') -+ { -+ /* If we have no collation data we use the default -+ collation in which each character is in a class -+ by itself. It also means that ASCII is the -+ character set and therefore we cannot have character -+ with more than one byte in the multibyte -+ representation. */ -+# ifdef _LIBC -+ if (nrules == 0) -+# endif -+ { -+ if (c1 != 1) -+ FREE_STACK_RETURN (REG_ECOLLATE); -+ -+ /* Throw away the ] at the end of the equivalence -+ class. */ -+ PATFETCH (c); -+ -+ /* Set the bit for the character. */ -+ SET_LIST_BIT (str[0]); -+ } -+# ifdef _LIBC -+ else -+ { -+ /* Try to match the byte sequence in `str' against -+ those known to the collate implementation. -+ First find out whether the bytes in `str' are -+ actually from exactly one character. */ -+ const int32_t *table; -+ const unsigned char *weights; -+ const unsigned char *extra; -+ const int32_t *indirect; -+ int32_t idx; -+ const unsigned char *cp = str; -+ int ch; -+ -+ table = (const int32_t *) -+ _NL_CURRENT (LC_COLLATE, _NL_COLLATE_TABLEMB); -+ weights = (const unsigned char *) -+ _NL_CURRENT (LC_COLLATE, _NL_COLLATE_WEIGHTMB); -+ extra = (const unsigned char *) -+ _NL_CURRENT (LC_COLLATE, _NL_COLLATE_EXTRAMB); -+ indirect = (const int32_t *) -+ _NL_CURRENT (LC_COLLATE, _NL_COLLATE_INDIRECTMB); -+ idx = FINDIDX (table, indirect, extra, &cp, 1); -+ if (idx == 0 || cp < str + c1) -+ /* This is no valid character. */ -+ FREE_STACK_RETURN (REG_ECOLLATE); -+ -+ /* Throw away the ] at the end of the equivalence -+ class. */ -+ PATFETCH (c); -+ -+ /* Now we have to go throught the whole table -+ and find all characters which have the same -+ first level weight. -+ -+ XXX Note that this is not entirely correct. -+ we would have to match multibyte sequences -+ but this is not possible with the current -+ implementation. */ -+ for (ch = 1; ch < 256; ++ch) -+ /* XXX This test would have to be changed if we -+ would allow matching multibyte sequences. */ -+ if (table[ch] > 0) -+ { -+ int32_t idx2 = table[ch]; -+ size_t len = weights[idx2]; -+ -+ /* Test whether the lenghts match. */ -+ if (weights[idx] == len) -+ { -+ /* They do. New compare the bytes of -+ the weight. */ -+ size_t cnt = 0; -+ -+ while (cnt < len -+ && (weights[idx + 1 + cnt] -+ == weights[idx2 + 1 + cnt])) -+ ++cnt; -+ -+ if (cnt == len) -+ /* They match. Mark the character as -+ acceptable. */ -+ SET_LIST_BIT (ch); -+ } -+ } -+ } -+# endif -+ had_char_class = true; -+ } -+ else -+ { -+ c1++; -+ while (c1--) -+ PATUNFETCH; -+ SET_LIST_BIT ('['); -+ SET_LIST_BIT ('='); -+ range_start = '='; -+ had_char_class = false; -+ } -+ } -+ else if (syntax & RE_CHAR_CLASSES && c == '[' && *p == '.') -+ { -+ unsigned char str[128]; /* Should be large enough. */ -+# ifdef _LIBC -+ uint32_t nrules = -+ _NL_CURRENT_WORD (LC_COLLATE, _NL_COLLATE_NRULES); -+# endif -+ -+ PATFETCH (c); -+ c1 = 0; -+ -+ /* If pattern is `[[.'. */ -+ if (p == pend) FREE_STACK_RETURN (REG_EBRACK); -+ -+ for (;;) -+ { -+ PATFETCH (c); -+ if ((c == '.' && *p == ']') || p == pend) -+ break; -+ if (c1 < sizeof (str)) -+ str[c1++] = c; -+ else -+ /* This is in any case an invalid class name. */ -+ str[0] = '\0'; -+ } -+ str[c1] = '\0'; -+ -+ if (c == '.' && *p == ']' && str[0] != '\0') -+ { -+ /* If we have no collation data we use the default -+ collation in which each character is the name -+ for its own class which contains only the one -+ character. It also means that ASCII is the -+ character set and therefore we cannot have character -+ with more than one byte in the multibyte -+ representation. */ -+# ifdef _LIBC -+ if (nrules == 0) -+# endif -+ { -+ if (c1 != 1) -+ FREE_STACK_RETURN (REG_ECOLLATE); -+ -+ /* Throw away the ] at the end of the equivalence -+ class. */ -+ PATFETCH (c); -+ -+ /* Set the bit for the character. */ -+ SET_LIST_BIT (str[0]); -+ range_start = ((const unsigned char *) str)[0]; -+ } -+# ifdef _LIBC -+ else -+ { -+ /* Try to match the byte sequence in `str' against -+ those known to the collate implementation. -+ First find out whether the bytes in `str' are -+ actually from exactly one character. */ -+ int32_t table_size; -+ const int32_t *symb_table; -+ const unsigned char *extra; -+ int32_t idx; -+ int32_t elem; -+ int32_t second; -+ int32_t hash; -+ -+ table_size = -+ _NL_CURRENT_WORD (LC_COLLATE, -+ _NL_COLLATE_SYMB_HASH_SIZEMB); -+ symb_table = (const int32_t *) -+ _NL_CURRENT (LC_COLLATE, -+ _NL_COLLATE_SYMB_TABLEMB); -+ extra = (const unsigned char *) -+ _NL_CURRENT (LC_COLLATE, -+ _NL_COLLATE_SYMB_EXTRAMB); -+ -+ /* Locate the character in the hashing table. */ -+ hash = elem_hash ((const char *) str, c1); -+ -+ idx = 0; -+ elem = hash % table_size; -+ second = hash % (table_size - 2); -+ while (symb_table[2 * elem] != 0) -+ { -+ /* First compare the hashing value. */ -+ if (symb_table[2 * elem] == hash -+ && c1 == extra[symb_table[2 * elem + 1]] -+ && memcmp (str, -+ &extra[symb_table[2 * elem + 1] -+ + 1], -+ c1) == 0) -+ { -+ /* Yep, this is the entry. */ -+ idx = symb_table[2 * elem + 1]; -+ idx += 1 + extra[idx]; -+ break; -+ } -+ -+ /* Next entry. */ -+ elem += second; -+ } -+ -+ if (symb_table[2 * elem] == 0) -+ /* This is no valid character. */ -+ FREE_STACK_RETURN (REG_ECOLLATE); -+ -+ /* Throw away the ] at the end of the equivalence -+ class. */ -+ PATFETCH (c); -+ -+ /* Now add the multibyte character(s) we found -+ to the accept list. -+ -+ XXX Note that this is not entirely correct. -+ we would have to match multibyte sequences -+ but this is not possible with the current -+ implementation. Also, we have to match -+ collating symbols, which expand to more than -+ one file, as a whole and not allow the -+ individual bytes. */ -+ c1 = extra[idx++]; -+ if (c1 == 1) -+ range_start = extra[idx]; -+ while (c1-- > 0) -+ { -+ SET_LIST_BIT (extra[idx]); -+ ++idx; -+ } -+ } -+# endif -+ had_char_class = false; -+ } -+ else -+ { -+ c1++; -+ while (c1--) -+ PATUNFETCH; -+ SET_LIST_BIT ('['); -+ SET_LIST_BIT ('.'); -+ range_start = '.'; -+ had_char_class = false; -+ } -+ } -+ else -+ { -+ had_char_class = false; -+ SET_LIST_BIT (c); -+ range_start = c; -+ } -+ } -+ -+ /* Discard any (non)matching list bytes that are all 0 at the -+ end of the map. Decrease the map-length byte too. */ -+ while ((int) b[-1] > 0 && b[b[-1] - 1] == 0) -+ b[-1]--; -+ b += b[-1]; -+#endif /* WCHAR */ -+ } -+ break; -+ -+ -+ case '(': -+ if (syntax & RE_NO_BK_PARENS) -+ goto handle_open; -+ else -+ goto normal_char; -+ -+ -+ case ')': -+ if (syntax & RE_NO_BK_PARENS) -+ goto handle_close; -+ else -+ goto normal_char; -+ -+ -+ case '\n': -+ if (syntax & RE_NEWLINE_ALT) -+ goto handle_alt; -+ else -+ goto normal_char; -+ -+ -+ case '|': -+ if (syntax & RE_NO_BK_VBAR) -+ goto handle_alt; -+ else -+ goto normal_char; -+ -+ -+ case '{': -+ if (syntax & RE_INTERVALS && syntax & RE_NO_BK_BRACES) -+ goto handle_interval; -+ else -+ goto normal_char; -+ -+ -+ case '\\': -+ if (p == pend) FREE_STACK_RETURN (REG_EESCAPE); -+ -+ /* Do not translate the character after the \, so that we can -+ distinguish, e.g., \B from \b, even if we normally would -+ translate, e.g., B to b. */ -+ PATFETCH_RAW (c); -+ -+ switch (c) -+ { -+ case '(': -+ if (syntax & RE_NO_BK_PARENS) -+ goto normal_backslash; -+ -+ handle_open: -+ bufp->re_nsub++; -+ regnum++; -+ -+ if (COMPILE_STACK_FULL) -+ { -+ RETALLOC (compile_stack.stack, compile_stack.size << 1, -+ compile_stack_elt_t); -+ if (compile_stack.stack == NULL) return REG_ESPACE; -+ -+ compile_stack.size <<= 1; -+ } -+ -+ /* These are the values to restore when we hit end of this -+ group. They are all relative offsets, so that if the -+ whole pattern moves because of realloc, they will still -+ be valid. */ -+ COMPILE_STACK_TOP.begalt_offset = begalt - COMPILED_BUFFER_VAR; -+ COMPILE_STACK_TOP.fixup_alt_jump -+ = fixup_alt_jump ? fixup_alt_jump - COMPILED_BUFFER_VAR + 1 : 0; -+ COMPILE_STACK_TOP.laststart_offset = b - COMPILED_BUFFER_VAR; -+ COMPILE_STACK_TOP.regnum = regnum; -+ -+ /* We will eventually replace the 0 with the number of -+ groups inner to this one. But do not push a -+ start_memory for groups beyond the last one we can -+ represent in the compiled pattern. */ -+ if (regnum <= MAX_REGNUM) -+ { -+ COMPILE_STACK_TOP.inner_group_offset = b -+ - COMPILED_BUFFER_VAR + 2; -+ BUF_PUSH_3 (start_memory, regnum, 0); -+ } -+ -+ compile_stack.avail++; -+ -+ fixup_alt_jump = 0; -+ laststart = 0; -+ begalt = b; -+ /* If we've reached MAX_REGNUM groups, then this open -+ won't actually generate any code, so we'll have to -+ clear pending_exact explicitly. */ -+ pending_exact = 0; -+ break; -+ -+ -+ case ')': -+ if (syntax & RE_NO_BK_PARENS) goto normal_backslash; -+ -+ if (COMPILE_STACK_EMPTY) -+ { -+ if (syntax & RE_UNMATCHED_RIGHT_PAREN_ORD) -+ goto normal_backslash; -+ else -+ FREE_STACK_RETURN (REG_ERPAREN); -+ } -+ -+ handle_close: -+ if (fixup_alt_jump) -+ { /* Push a dummy failure point at the end of the -+ alternative for a possible future -+ `pop_failure_jump' to pop. See comments at -+ `push_dummy_failure' in `re_match_2'. */ -+ BUF_PUSH (push_dummy_failure); -+ -+ /* We allocated space for this jump when we assigned -+ to `fixup_alt_jump', in the `handle_alt' case below. */ -+ STORE_JUMP (jump_past_alt, fixup_alt_jump, b - 1); -+ } -+ -+ /* See similar code for backslashed left paren above. */ -+ if (COMPILE_STACK_EMPTY) -+ { -+ if (syntax & RE_UNMATCHED_RIGHT_PAREN_ORD) -+ goto normal_char; -+ else -+ FREE_STACK_RETURN (REG_ERPAREN); -+ } -+ -+ /* Since we just checked for an empty stack above, this -+ ``can't happen''. */ -+ assert (compile_stack.avail != 0); -+ { -+ /* We don't just want to restore into `regnum', because -+ later groups should continue to be numbered higher, -+ as in `(ab)c(de)' -- the second group is #2. */ -+ regnum_t this_group_regnum; -+ -+ compile_stack.avail--; -+ begalt = COMPILED_BUFFER_VAR + COMPILE_STACK_TOP.begalt_offset; -+ fixup_alt_jump -+ = COMPILE_STACK_TOP.fixup_alt_jump -+ ? COMPILED_BUFFER_VAR + COMPILE_STACK_TOP.fixup_alt_jump - 1 -+ : 0; -+ laststart = COMPILED_BUFFER_VAR + COMPILE_STACK_TOP.laststart_offset; -+ this_group_regnum = COMPILE_STACK_TOP.regnum; -+ /* If we've reached MAX_REGNUM groups, then this open -+ won't actually generate any code, so we'll have to -+ clear pending_exact explicitly. */ -+ pending_exact = 0; -+ -+ /* We're at the end of the group, so now we know how many -+ groups were inside this one. */ -+ if (this_group_regnum <= MAX_REGNUM) -+ { -+ UCHAR_T *inner_group_loc -+ = COMPILED_BUFFER_VAR + COMPILE_STACK_TOP.inner_group_offset; -+ -+ *inner_group_loc = regnum - this_group_regnum; -+ BUF_PUSH_3 (stop_memory, this_group_regnum, -+ regnum - this_group_regnum); -+ } -+ } -+ break; -+ -+ -+ case '|': /* `\|'. */ -+ if (syntax & RE_LIMITED_OPS || syntax & RE_NO_BK_VBAR) -+ goto normal_backslash; -+ handle_alt: -+ if (syntax & RE_LIMITED_OPS) -+ goto normal_char; -+ -+ /* Insert before the previous alternative a jump which -+ jumps to this alternative if the former fails. */ -+ GET_BUFFER_SPACE (1 + OFFSET_ADDRESS_SIZE); -+ INSERT_JUMP (on_failure_jump, begalt, -+ b + 2 + 2 * OFFSET_ADDRESS_SIZE); -+ pending_exact = 0; -+ b += 1 + OFFSET_ADDRESS_SIZE; -+ -+ /* The alternative before this one has a jump after it -+ which gets executed if it gets matched. Adjust that -+ jump so it will jump to this alternative's analogous -+ jump (put in below, which in turn will jump to the next -+ (if any) alternative's such jump, etc.). The last such -+ jump jumps to the correct final destination. A picture: -+ _____ _____ -+ | | | | -+ | v | v -+ a | b | c -+ -+ If we are at `b', then fixup_alt_jump right now points to a -+ three-byte space after `a'. We'll put in the jump, set -+ fixup_alt_jump to right after `b', and leave behind three -+ bytes which we'll fill in when we get to after `c'. */ -+ -+ if (fixup_alt_jump) -+ STORE_JUMP (jump_past_alt, fixup_alt_jump, b); -+ -+ /* Mark and leave space for a jump after this alternative, -+ to be filled in later either by next alternative or -+ when know we're at the end of a series of alternatives. */ -+ fixup_alt_jump = b; -+ GET_BUFFER_SPACE (1 + OFFSET_ADDRESS_SIZE); -+ b += 1 + OFFSET_ADDRESS_SIZE; -+ -+ laststart = 0; -+ begalt = b; -+ break; -+ -+ -+ case '{': -+ /* If \{ is a literal. */ -+ if (!(syntax & RE_INTERVALS) -+ /* If we're at `\{' and it's not the open-interval -+ operator. */ -+ || (syntax & RE_NO_BK_BRACES)) -+ goto normal_backslash; -+ -+ handle_interval: -+ { -+ /* If got here, then the syntax allows intervals. */ -+ -+ /* At least (most) this many matches must be made. */ -+ int lower_bound = -1, upper_bound = -1; -+ -+ /* Place in the uncompiled pattern (i.e., just after -+ the '{') to go back to if the interval is invalid. */ -+ const CHAR_T *beg_interval = p; -+ -+ if (p == pend) -+ goto invalid_interval; -+ -+ GET_UNSIGNED_NUMBER (lower_bound); -+ -+ if (c == ',') -+ { -+ GET_UNSIGNED_NUMBER (upper_bound); -+ if (upper_bound < 0) -+ upper_bound = RE_DUP_MAX; -+ } -+ else -+ /* Interval such as `{1}' => match exactly once. */ -+ upper_bound = lower_bound; -+ -+ if (! (0 <= lower_bound && lower_bound <= upper_bound)) -+ goto invalid_interval; -+ -+ if (!(syntax & RE_NO_BK_BRACES)) -+ { -+ if (c != '\\' || p == pend) -+ goto invalid_interval; -+ PATFETCH (c); -+ } -+ -+ if (c != '}') -+ goto invalid_interval; -+ -+ /* If it's invalid to have no preceding re. */ -+ if (!laststart) -+ { -+ if (syntax & RE_CONTEXT_INVALID_OPS -+ && !(syntax & RE_INVALID_INTERVAL_ORD)) -+ FREE_STACK_RETURN (REG_BADRPT); -+ else if (syntax & RE_CONTEXT_INDEP_OPS) -+ laststart = b; -+ else -+ goto unfetch_interval; -+ } -+ -+ /* We just parsed a valid interval. */ -+ -+ if (RE_DUP_MAX < upper_bound) -+ FREE_STACK_RETURN (REG_BADBR); -+ -+ /* If the upper bound is zero, don't want to succeed at -+ all; jump from `laststart' to `b + 3', which will be -+ the end of the buffer after we insert the jump. */ -+ /* ifdef WCHAR, 'b + 1 + OFFSET_ADDRESS_SIZE' -+ instead of 'b + 3'. */ -+ if (upper_bound == 0) -+ { -+ GET_BUFFER_SPACE (1 + OFFSET_ADDRESS_SIZE); -+ INSERT_JUMP (jump, laststart, b + 1 -+ + OFFSET_ADDRESS_SIZE); -+ b += 1 + OFFSET_ADDRESS_SIZE; -+ } -+ -+ /* Otherwise, we have a nontrivial interval. When -+ we're all done, the pattern will look like: -+ set_number_at <jump count> <upper bound> -+ set_number_at <succeed_n count> <lower bound> -+ succeed_n <after jump addr> <succeed_n count> -+ <body of loop> -+ jump_n <succeed_n addr> <jump count> -+ (The upper bound and `jump_n' are omitted if -+ `upper_bound' is 1, though.) */ -+ else -+ { /* If the upper bound is > 1, we need to insert -+ more at the end of the loop. */ -+ unsigned nbytes = 2 + 4 * OFFSET_ADDRESS_SIZE + -+ (upper_bound > 1) * (2 + 4 * OFFSET_ADDRESS_SIZE); -+ -+ GET_BUFFER_SPACE (nbytes); -+ -+ /* Initialize lower bound of the `succeed_n', even -+ though it will be set during matching by its -+ attendant `set_number_at' (inserted next), -+ because `re_compile_fastmap' needs to know. -+ Jump to the `jump_n' we might insert below. */ -+ INSERT_JUMP2 (succeed_n, laststart, -+ b + 1 + 2 * OFFSET_ADDRESS_SIZE -+ + (upper_bound > 1) * (1 + 2 * OFFSET_ADDRESS_SIZE) -+ , lower_bound); -+ b += 1 + 2 * OFFSET_ADDRESS_SIZE; -+ -+ /* Code to initialize the lower bound. Insert -+ before the `succeed_n'. The `5' is the last two -+ bytes of this `set_number_at', plus 3 bytes of -+ the following `succeed_n'. */ -+ /* ifdef WCHAR, The '1+2*OFFSET_ADDRESS_SIZE' -+ is the 'set_number_at', plus '1+OFFSET_ADDRESS_SIZE' -+ of the following `succeed_n'. */ -+ PREFIX(insert_op2) (set_number_at, laststart, 1 -+ + 2 * OFFSET_ADDRESS_SIZE, lower_bound, b); -+ b += 1 + 2 * OFFSET_ADDRESS_SIZE; -+ -+ if (upper_bound > 1) -+ { /* More than one repetition is allowed, so -+ append a backward jump to the `succeed_n' -+ that starts this interval. -+ -+ When we've reached this during matching, -+ we'll have matched the interval once, so -+ jump back only `upper_bound - 1' times. */ -+ STORE_JUMP2 (jump_n, b, laststart -+ + 2 * OFFSET_ADDRESS_SIZE + 1, -+ upper_bound - 1); -+ b += 1 + 2 * OFFSET_ADDRESS_SIZE; -+ -+ /* The location we want to set is the second -+ parameter of the `jump_n'; that is `b-2' as -+ an absolute address. `laststart' will be -+ the `set_number_at' we're about to insert; -+ `laststart+3' the number to set, the source -+ for the relative address. But we are -+ inserting into the middle of the pattern -- -+ so everything is getting moved up by 5. -+ Conclusion: (b - 2) - (laststart + 3) + 5, -+ i.e., b - laststart. -+ -+ We insert this at the beginning of the loop -+ so that if we fail during matching, we'll -+ reinitialize the bounds. */ -+ PREFIX(insert_op2) (set_number_at, laststart, -+ b - laststart, -+ upper_bound - 1, b); -+ b += 1 + 2 * OFFSET_ADDRESS_SIZE; -+ } -+ } -+ pending_exact = 0; -+ break; -+ -+ invalid_interval: -+ if (!(syntax & RE_INVALID_INTERVAL_ORD)) -+ FREE_STACK_RETURN (p == pend ? REG_EBRACE : REG_BADBR); -+ unfetch_interval: -+ /* Match the characters as literals. */ -+ p = beg_interval; -+ c = '{'; -+ if (syntax & RE_NO_BK_BRACES) -+ goto normal_char; -+ else -+ goto normal_backslash; -+ } -+ -+#ifdef emacs -+ /* There is no way to specify the before_dot and after_dot -+ operators. rms says this is ok. --karl */ -+ case '=': -+ BUF_PUSH (at_dot); -+ break; -+ -+ case 's': -+ laststart = b; -+ PATFETCH (c); -+ BUF_PUSH_2 (syntaxspec, syntax_spec_code[c]); -+ break; -+ -+ case 'S': -+ laststart = b; -+ PATFETCH (c); -+ BUF_PUSH_2 (notsyntaxspec, syntax_spec_code[c]); -+ break; -+#endif /* emacs */ -+ -+ -+ case 'w': -+ if (syntax & RE_NO_GNU_OPS) -+ goto normal_char; -+ laststart = b; -+ BUF_PUSH (wordchar); -+ break; -+ -+ -+ case 'W': -+ if (syntax & RE_NO_GNU_OPS) -+ goto normal_char; -+ laststart = b; -+ BUF_PUSH (notwordchar); -+ break; -+ -+ -+ case '<': -+ if (syntax & RE_NO_GNU_OPS) -+ goto normal_char; -+ BUF_PUSH (wordbeg); -+ break; -+ -+ case '>': -+ if (syntax & RE_NO_GNU_OPS) -+ goto normal_char; -+ BUF_PUSH (wordend); -+ break; -+ -+ case 'b': -+ if (syntax & RE_NO_GNU_OPS) -+ goto normal_char; -+ BUF_PUSH (wordbound); -+ break; -+ -+ case 'B': -+ if (syntax & RE_NO_GNU_OPS) -+ goto normal_char; -+ BUF_PUSH (notwordbound); -+ break; -+ -+ case '`': -+ if (syntax & RE_NO_GNU_OPS) -+ goto normal_char; -+ BUF_PUSH (begbuf); -+ break; -+ -+ case '\'': -+ if (syntax & RE_NO_GNU_OPS) -+ goto normal_char; -+ BUF_PUSH (endbuf); -+ break; -+ -+ case '1': case '2': case '3': case '4': case '5': -+ case '6': case '7': case '8': case '9': -+ if (syntax & RE_NO_BK_REFS) -+ goto normal_char; -+ -+ c1 = c - '0'; -+ -+ if (c1 > regnum) -+ FREE_STACK_RETURN (REG_ESUBREG); -+ -+ /* Can't back reference to a subexpression if inside of it. */ -+ if (group_in_compile_stack (compile_stack, (regnum_t) c1)) -+ goto normal_char; -+ -+ laststart = b; -+ BUF_PUSH_2 (duplicate, c1); -+ break; -+ -+ -+ case '+': -+ case '?': -+ if (syntax & RE_BK_PLUS_QM) -+ goto handle_plus; -+ else -+ goto normal_backslash; -+ -+ default: -+ normal_backslash: -+ /* You might think it would be useful for \ to mean -+ not to translate; but if we don't translate it -+ it will never match anything. */ -+ c = TRANSLATE (c); -+ goto normal_char; -+ } -+ break; -+ -+ -+ default: -+ /* Expects the character in `c'. */ -+ normal_char: -+ /* If no exactn currently being built. */ -+ if (!pending_exact -+#ifdef WCHAR -+ /* If last exactn handle binary(or character) and -+ new exactn handle character(or binary). */ -+ || is_exactn_bin != is_binary[p - 1 - pattern] -+#endif /* WCHAR */ -+ -+ /* If last exactn not at current position. */ -+ || pending_exact + *pending_exact + 1 != b -+ -+ /* We have only one byte following the exactn for the count. */ -+ || *pending_exact == (1 << BYTEWIDTH) - 1 -+ -+ /* If followed by a repetition operator. */ -+ || *p == '*' || *p == '^' -+ || ((syntax & RE_BK_PLUS_QM) -+ ? *p == '\\' && (p[1] == '+' || p[1] == '?') -+ : (*p == '+' || *p == '?')) -+ || ((syntax & RE_INTERVALS) -+ && ((syntax & RE_NO_BK_BRACES) -+ ? *p == '{' -+ : (p[0] == '\\' && p[1] == '{')))) -+ { -+ /* Start building a new exactn. */ -+ -+ laststart = b; -+ -+#ifdef WCHAR -+ /* Is this exactn binary data or character? */ -+ is_exactn_bin = is_binary[p - 1 - pattern]; -+ if (is_exactn_bin) -+ BUF_PUSH_2 (exactn_bin, 0); -+ else -+ BUF_PUSH_2 (exactn, 0); -+#else -+ BUF_PUSH_2 (exactn, 0); -+#endif /* WCHAR */ -+ pending_exact = b - 1; -+ } -+ -+ BUF_PUSH (c); -+ (*pending_exact)++; -+ break; -+ } /* switch (c) */ -+ } /* while p != pend */ -+ -+ -+ /* Through the pattern now. */ -+ -+ if (fixup_alt_jump) -+ STORE_JUMP (jump_past_alt, fixup_alt_jump, b); -+ -+ if (!COMPILE_STACK_EMPTY) -+ FREE_STACK_RETURN (REG_EPAREN); -+ -+ /* If we don't want backtracking, force success -+ the first time we reach the end of the compiled pattern. */ -+ if (syntax & RE_NO_POSIX_BACKTRACKING) -+ BUF_PUSH (succeed); -+ -+#ifdef WCHAR -+ free (pattern); -+ free (mbs_offset); -+ free (is_binary); -+#endif -+ free (compile_stack.stack); -+ -+ /* We have succeeded; set the length of the buffer. */ -+#ifdef WCHAR -+ bufp->used = (uintptr_t) b - (uintptr_t) COMPILED_BUFFER_VAR; -+#else -+ bufp->used = b - bufp->buffer; -+#endif -+ -+#ifdef DEBUG -+ if (debug) -+ { -+ DEBUG_PRINT1 ("\nCompiled pattern: \n"); -+ PREFIX(print_compiled_pattern) (bufp); -+ } -+#endif /* DEBUG */ -+ -+#ifndef MATCH_MAY_ALLOCATE -+ /* Initialize the failure stack to the largest possible stack. This -+ isn't necessary unless we're trying to avoid calling alloca in -+ the search and match routines. */ -+ { -+ int num_regs = bufp->re_nsub + 1; -+ -+ /* Since DOUBLE_FAIL_STACK refuses to double only if the current size -+ is strictly greater than re_max_failures, the largest possible stack -+ is 2 * re_max_failures failure points. */ -+ if (fail_stack.size < (2 * re_max_failures * MAX_FAILURE_ITEMS)) -+ { -+ fail_stack.size = (2 * re_max_failures * MAX_FAILURE_ITEMS); -+ -+# ifdef emacs -+ if (! fail_stack.stack) -+ fail_stack.stack -+ = (PREFIX(fail_stack_elt_t) *) xmalloc (fail_stack.size -+ * sizeof (PREFIX(fail_stack_elt_t))); -+ else -+ fail_stack.stack -+ = (PREFIX(fail_stack_elt_t) *) xrealloc (fail_stack.stack, -+ (fail_stack.size -+ * sizeof (PREFIX(fail_stack_elt_t)))); -+# else /* not emacs */ -+ if (! fail_stack.stack) -+ fail_stack.stack -+ = (PREFIX(fail_stack_elt_t) *) malloc (fail_stack.size -+ * sizeof (PREFIX(fail_stack_elt_t))); -+ else -+ fail_stack.stack -+ = (PREFIX(fail_stack_elt_t) *) realloc (fail_stack.stack, -+ (fail_stack.size -+ * sizeof (PREFIX(fail_stack_elt_t)))); -+# endif /* not emacs */ -+ } -+ -+ PREFIX(regex_grow_registers) (num_regs); -+ } -+#endif /* not MATCH_MAY_ALLOCATE */ -+ -+ return REG_NOERROR; -+} /* regex_compile */ -+ -+/* Subroutines for `regex_compile'. */ -+ -+/* Store OP at LOC followed by two-byte integer parameter ARG. */ -+/* ifdef WCHAR, integer parameter is 1 wchar_t. */ -+ -+static void -+PREFIX(store_op1) (re_opcode_t op, UCHAR_T *loc, int arg) -+{ -+ *loc = (UCHAR_T) op; -+ STORE_NUMBER (loc + 1, arg); -+} -+ -+ -+/* Like `store_op1', but for two two-byte parameters ARG1 and ARG2. */ -+/* ifdef WCHAR, integer parameter is 1 wchar_t. */ -+ -+static void -+PREFIX(store_op2) (re_opcode_t op, UCHAR_T *loc, int arg1, int arg2) -+{ -+ *loc = (UCHAR_T) op; -+ STORE_NUMBER (loc + 1, arg1); -+ STORE_NUMBER (loc + 1 + OFFSET_ADDRESS_SIZE, arg2); -+} -+ -+ -+/* Copy the bytes from LOC to END to open up three bytes of space at LOC -+ for OP followed by two-byte integer parameter ARG. */ -+/* ifdef WCHAR, integer parameter is 1 wchar_t. */ -+ -+static void -+PREFIX(insert_op1) (re_opcode_t op, UCHAR_T *loc, int arg, UCHAR_T *end) -+{ -+ register UCHAR_T *pfrom = end; -+ register UCHAR_T *pto = end + 1 + OFFSET_ADDRESS_SIZE; -+ -+ while (pfrom != loc) -+ *--pto = *--pfrom; -+ -+ PREFIX(store_op1) (op, loc, arg); -+} -+ -+ -+/* Like `insert_op1', but for two two-byte parameters ARG1 and ARG2. */ -+/* ifdef WCHAR, integer parameter is 1 wchar_t. */ -+ -+static void -+PREFIX(insert_op2) (re_opcode_t op, UCHAR_T *loc, int arg1, -+ int arg2, UCHAR_T *end) -+{ -+ register UCHAR_T *pfrom = end; -+ register UCHAR_T *pto = end + 1 + 2 * OFFSET_ADDRESS_SIZE; -+ -+ while (pfrom != loc) -+ *--pto = *--pfrom; -+ -+ PREFIX(store_op2) (op, loc, arg1, arg2); -+} -+ -+ -+/* P points to just after a ^ in PATTERN. Return true if that ^ comes -+ after an alternative or a begin-subexpression. We assume there is at -+ least one character before the ^. */ -+ -+static boolean -+PREFIX(at_begline_loc_p) (const CHAR_T *pattern, const CHAR_T *p, -+ reg_syntax_t syntax) -+{ -+ const CHAR_T *prev = p - 2; -+ boolean prev_prev_backslash = prev > pattern && prev[-1] == '\\'; -+ -+ return -+ /* After a subexpression? */ -+ (*prev == '(' && (syntax & RE_NO_BK_PARENS || prev_prev_backslash)) -+ /* After an alternative? */ -+ || (*prev == '|' && (syntax & RE_NO_BK_VBAR || prev_prev_backslash)); -+} -+ -+ -+/* The dual of at_begline_loc_p. This one is for $. We assume there is -+ at least one character after the $, i.e., `P < PEND'. */ -+ -+static boolean -+PREFIX(at_endline_loc_p) (const CHAR_T *p, const CHAR_T *pend, -+ reg_syntax_t syntax) -+{ -+ const CHAR_T *next = p; -+ boolean next_backslash = *next == '\\'; -+ const CHAR_T *next_next = p + 1 < pend ? p + 1 : 0; -+ -+ return -+ /* Before a subexpression? */ -+ (syntax & RE_NO_BK_PARENS ? *next == ')' -+ : next_backslash && next_next && *next_next == ')') -+ /* Before an alternative? */ -+ || (syntax & RE_NO_BK_VBAR ? *next == '|' -+ : next_backslash && next_next && *next_next == '|'); -+} -+ -+#else /* not INSIDE_RECURSION */ -+ -+/* Returns true if REGNUM is in one of COMPILE_STACK's elements and -+ false if it's not. */ -+ -+static boolean -+group_in_compile_stack (compile_stack_type compile_stack, regnum_t regnum) -+{ -+ int this_element; -+ -+ for (this_element = compile_stack.avail - 1; -+ this_element >= 0; -+ this_element--) -+ if (compile_stack.stack[this_element].regnum == regnum) -+ return true; -+ -+ return false; -+} -+#endif /* not INSIDE_RECURSION */ -+ -+#ifdef INSIDE_RECURSION -+ -+#ifdef WCHAR -+/* This insert space, which size is "num", into the pattern at "loc". -+ "end" must point the end of the allocated buffer. */ -+static void -+insert_space (int num, CHAR_T *loc, CHAR_T *end) -+{ -+ register CHAR_T *pto = end; -+ register CHAR_T *pfrom = end - num; -+ -+ while (pfrom >= loc) -+ *pto-- = *pfrom--; -+} -+#endif /* WCHAR */ -+ -+#ifdef WCHAR -+static reg_errcode_t -+wcs_compile_range (CHAR_T range_start_char, const CHAR_T **p_ptr, -+ const CHAR_T *pend, RE_TRANSLATE_TYPE translate, -+ reg_syntax_t syntax, CHAR_T *b, CHAR_T *char_set) -+{ -+ const CHAR_T *p = *p_ptr; -+ CHAR_T range_start, range_end; -+ reg_errcode_t ret; -+# ifdef _LIBC -+ uint32_t nrules; -+ uint32_t start_val, end_val; -+# endif -+ if (p == pend) -+ return REG_ERANGE; -+ -+# ifdef _LIBC -+ nrules = _NL_CURRENT_WORD (LC_COLLATE, _NL_COLLATE_NRULES); -+ if (nrules != 0) -+ { -+ const char *collseq = (const char *) _NL_CURRENT(LC_COLLATE, -+ _NL_COLLATE_COLLSEQWC); -+ const unsigned char *extra = (const unsigned char *) -+ _NL_CURRENT (LC_COLLATE, _NL_COLLATE_SYMB_EXTRAMB); -+ -+ if (range_start_char < -1) -+ { -+ /* range_start is a collating symbol. */ -+ int32_t *wextra; -+ /* Retreive the index and get collation sequence value. */ -+ wextra = (int32_t*)(extra + char_set[-range_start_char]); -+ start_val = wextra[1 + *wextra]; -+ } -+ else -+ start_val = collseq_table_lookup(collseq, TRANSLATE(range_start_char)); -+ -+ end_val = collseq_table_lookup (collseq, TRANSLATE (p[0])); -+ -+ /* Report an error if the range is empty and the syntax prohibits -+ this. */ -+ ret = ((syntax & RE_NO_EMPTY_RANGES) -+ && (start_val > end_val))? REG_ERANGE : REG_NOERROR; -+ -+ /* Insert space to the end of the char_ranges. */ -+ insert_space(2, b - char_set[5] - 2, b - 1); -+ *(b - char_set[5] - 2) = (wchar_t)start_val; -+ *(b - char_set[5] - 1) = (wchar_t)end_val; -+ char_set[4]++; /* ranges_index */ -+ } -+ else -+# endif -+ { -+ range_start = (range_start_char >= 0)? TRANSLATE (range_start_char): -+ range_start_char; -+ range_end = TRANSLATE (p[0]); -+ /* Report an error if the range is empty and the syntax prohibits -+ this. */ -+ ret = ((syntax & RE_NO_EMPTY_RANGES) -+ && (range_start > range_end))? REG_ERANGE : REG_NOERROR; -+ -+ /* Insert space to the end of the char_ranges. */ -+ insert_space(2, b - char_set[5] - 2, b - 1); -+ *(b - char_set[5] - 2) = range_start; -+ *(b - char_set[5] - 1) = range_end; -+ char_set[4]++; /* ranges_index */ -+ } -+ /* Have to increment the pointer into the pattern string, so the -+ caller isn't still at the ending character. */ -+ (*p_ptr)++; -+ -+ return ret; -+} -+#else /* BYTE */ -+/* Read the ending character of a range (in a bracket expression) from the -+ uncompiled pattern *P_PTR (which ends at PEND). We assume the -+ starting character is in `P[-2]'. (`P[-1]' is the character `-'.) -+ Then we set the translation of all bits between the starting and -+ ending characters (inclusive) in the compiled pattern B. -+ -+ Return an error code. -+ -+ We use these short variable names so we can use the same macros as -+ `regex_compile' itself. */ -+ -+static reg_errcode_t -+byte_compile_range (unsigned int range_start_char, const char **p_ptr, -+ const char *pend, RE_TRANSLATE_TYPE translate, -+ reg_syntax_t syntax, unsigned char *b) -+{ -+ unsigned this_char; -+ const char *p = *p_ptr; -+ reg_errcode_t ret; -+# if _LIBC -+ const unsigned char *collseq; -+ unsigned int start_colseq; -+ unsigned int end_colseq; -+# else -+ unsigned end_char; -+# endif -+ -+ if (p == pend) -+ return REG_ERANGE; -+ -+ /* Have to increment the pointer into the pattern string, so the -+ caller isn't still at the ending character. */ -+ (*p_ptr)++; -+ -+ /* Report an error if the range is empty and the syntax prohibits this. */ -+ ret = syntax & RE_NO_EMPTY_RANGES ? REG_ERANGE : REG_NOERROR; -+ -+# if _LIBC -+ collseq = (const unsigned char *) _NL_CURRENT (LC_COLLATE, -+ _NL_COLLATE_COLLSEQMB); -+ -+ start_colseq = collseq[(unsigned char) TRANSLATE (range_start_char)]; -+ end_colseq = collseq[(unsigned char) TRANSLATE (p[0])]; -+ for (this_char = 0; this_char <= (unsigned char) -1; ++this_char) -+ { -+ unsigned int this_colseq = collseq[(unsigned char) TRANSLATE (this_char)]; -+ -+ if (start_colseq <= this_colseq && this_colseq <= end_colseq) -+ { -+ SET_LIST_BIT (TRANSLATE (this_char)); -+ ret = REG_NOERROR; -+ } -+ } -+# else -+ /* Here we see why `this_char' has to be larger than an `unsigned -+ char' -- we would otherwise go into an infinite loop, since all -+ characters <= 0xff. */ -+ range_start_char = TRANSLATE (range_start_char); -+ /* TRANSLATE(p[0]) is casted to char (not unsigned char) in TRANSLATE, -+ and some compilers cast it to int implicitly, so following for_loop -+ may fall to (almost) infinite loop. -+ e.g. If translate[p[0]] = 0xff, end_char may equals to 0xffffffff. -+ To avoid this, we cast p[0] to unsigned int and truncate it. */ -+ end_char = ((unsigned)TRANSLATE(p[0]) & ((1 << BYTEWIDTH) - 1)); -+ -+ for (this_char = range_start_char; this_char <= end_char; ++this_char) -+ { -+ SET_LIST_BIT (TRANSLATE (this_char)); -+ ret = REG_NOERROR; -+ } -+# endif -+ -+ return ret; -+} -+#endif /* WCHAR */ -+ -+/* re_compile_fastmap computes a ``fastmap'' for the compiled pattern in -+ BUFP. A fastmap records which of the (1 << BYTEWIDTH) possible -+ characters can start a string that matches the pattern. This fastmap -+ is used by re_search to skip quickly over impossible starting points. -+ -+ The caller must supply the address of a (1 << BYTEWIDTH)-byte data -+ area as BUFP->fastmap. -+ -+ We set the `fastmap', `fastmap_accurate', and `can_be_null' fields in -+ the pattern buffer. -+ -+ Returns 0 if we succeed, -2 if an internal error. */ -+ -+#ifdef WCHAR -+/* local function for re_compile_fastmap. -+ truncate wchar_t character to char. */ -+static unsigned char truncate_wchar (CHAR_T c); -+ -+static unsigned char -+truncate_wchar (CHAR_T c) -+{ -+ unsigned char buf[MB_CUR_MAX]; -+ mbstate_t state; -+ int retval; -+ memset (&state, '\0', sizeof (state)); -+# ifdef _LIBC -+ retval = __wcrtomb (buf, c, &state); -+# else -+ retval = wcrtomb (buf, c, &state); -+# endif -+ return retval > 0 ? buf[0] : (unsigned char) c; -+} -+#endif /* WCHAR */ -+ -+static int -+PREFIX(re_compile_fastmap) (struct re_pattern_buffer *bufp) -+{ -+ int j, k; -+#ifdef MATCH_MAY_ALLOCATE -+ PREFIX(fail_stack_type) fail_stack; -+#endif -+#ifndef REGEX_MALLOC -+ char *destination; -+#endif -+ -+ register char *fastmap = bufp->fastmap; -+ -+#ifdef WCHAR -+ /* We need to cast pattern to (wchar_t*), because we casted this compiled -+ pattern to (char*) in regex_compile. */ -+ UCHAR_T *pattern = (UCHAR_T*)bufp->buffer; -+ register UCHAR_T *pend = (UCHAR_T*) (bufp->buffer + bufp->used); -+#else /* BYTE */ -+ UCHAR_T *pattern = bufp->buffer; -+ register UCHAR_T *pend = pattern + bufp->used; -+#endif /* WCHAR */ -+ UCHAR_T *p = pattern; -+ -+#ifdef REL_ALLOC -+ /* This holds the pointer to the failure stack, when -+ it is allocated relocatably. */ -+ fail_stack_elt_t *failure_stack_ptr; -+#endif -+ -+ /* Assume that each path through the pattern can be null until -+ proven otherwise. We set this false at the bottom of switch -+ statement, to which we get only if a particular path doesn't -+ match the empty string. */ -+ boolean path_can_be_null = true; -+ -+ /* We aren't doing a `succeed_n' to begin with. */ -+ boolean succeed_n_p = false; -+ -+ assert (fastmap != NULL && p != NULL); -+ -+ INIT_FAIL_STACK (); -+ bzero (fastmap, 1 << BYTEWIDTH); /* Assume nothing's valid. */ -+ bufp->fastmap_accurate = 1; /* It will be when we're done. */ -+ bufp->can_be_null = 0; -+ -+ while (1) -+ { -+ if (p == pend || *p == (UCHAR_T) succeed) -+ { -+ /* We have reached the (effective) end of pattern. */ -+ if (!FAIL_STACK_EMPTY ()) -+ { -+ bufp->can_be_null |= path_can_be_null; -+ -+ /* Reset for next path. */ -+ path_can_be_null = true; -+ -+ p = fail_stack.stack[--fail_stack.avail].pointer; -+ -+ continue; -+ } -+ else -+ break; -+ } -+ -+ /* We should never be about to go beyond the end of the pattern. */ -+ assert (p < pend); -+ -+ switch (SWITCH_ENUM_CAST ((re_opcode_t) *p++)) -+ { -+ -+ /* I guess the idea here is to simply not bother with a fastmap -+ if a backreference is used, since it's too hard to figure out -+ the fastmap for the corresponding group. Setting -+ `can_be_null' stops `re_search_2' from using the fastmap, so -+ that is all we do. */ -+ case duplicate: -+ bufp->can_be_null = 1; -+ goto done; -+ -+ -+ /* Following are the cases which match a character. These end -+ with `break'. */ -+ -+#ifdef WCHAR -+ case exactn: -+ fastmap[truncate_wchar(p[1])] = 1; -+ break; -+#else /* BYTE */ -+ case exactn: -+ fastmap[p[1]] = 1; -+ break; -+#endif /* WCHAR */ -+#ifdef MBS_SUPPORT -+ case exactn_bin: -+ fastmap[p[1]] = 1; -+ break; -+#endif -+ -+#ifdef WCHAR -+ /* It is hard to distinguish fastmap from (multi byte) characters -+ which depends on current locale. */ -+ case charset: -+ case charset_not: -+ case wordchar: -+ case notwordchar: -+ bufp->can_be_null = 1; -+ goto done; -+#else /* BYTE */ -+ case charset: -+ for (j = *p++ * BYTEWIDTH - 1; j >= 0; j--) -+ if (p[j / BYTEWIDTH] & (1 << (j % BYTEWIDTH))) -+ fastmap[j] = 1; -+ break; -+ -+ -+ case charset_not: -+ /* Chars beyond end of map must be allowed. */ -+ for (j = *p * BYTEWIDTH; j < (1 << BYTEWIDTH); j++) -+ fastmap[j] = 1; -+ -+ for (j = *p++ * BYTEWIDTH - 1; j >= 0; j--) -+ if (!(p[j / BYTEWIDTH] & (1 << (j % BYTEWIDTH)))) -+ fastmap[j] = 1; -+ break; -+ -+ -+ case wordchar: -+ for (j = 0; j < (1 << BYTEWIDTH); j++) -+ if (SYNTAX (j) == Sword) -+ fastmap[j] = 1; -+ break; -+ -+ -+ case notwordchar: -+ for (j = 0; j < (1 << BYTEWIDTH); j++) -+ if (SYNTAX (j) != Sword) -+ fastmap[j] = 1; -+ break; -+#endif /* WCHAR */ -+ -+ case anychar: -+ { -+ int fastmap_newline = fastmap['\n']; -+ -+ /* `.' matches anything ... */ -+ for (j = 0; j < (1 << BYTEWIDTH); j++) -+ fastmap[j] = 1; -+ -+ /* ... except perhaps newline. */ -+ if (!(bufp->syntax & RE_DOT_NEWLINE)) -+ fastmap['\n'] = fastmap_newline; -+ -+ /* Return if we have already set `can_be_null'; if we have, -+ then the fastmap is irrelevant. Something's wrong here. */ -+ else if (bufp->can_be_null) -+ goto done; -+ -+ /* Otherwise, have to check alternative paths. */ -+ break; -+ } -+ -+#ifdef emacs -+ case syntaxspec: -+ k = *p++; -+ for (j = 0; j < (1 << BYTEWIDTH); j++) -+ if (SYNTAX (j) == (enum syntaxcode) k) -+ fastmap[j] = 1; -+ break; -+ -+ -+ case notsyntaxspec: -+ k = *p++; -+ for (j = 0; j < (1 << BYTEWIDTH); j++) -+ if (SYNTAX (j) != (enum syntaxcode) k) -+ fastmap[j] = 1; -+ break; -+ -+ -+ /* All cases after this match the empty string. These end with -+ `continue'. */ -+ -+ -+ case before_dot: -+ case at_dot: -+ case after_dot: -+ continue; -+#endif /* emacs */ -+ -+ -+ case no_op: -+ case begline: -+ case endline: -+ case begbuf: -+ case endbuf: -+ case wordbound: -+ case notwordbound: -+ case wordbeg: -+ case wordend: -+ case push_dummy_failure: -+ continue; -+ -+ -+ case jump_n: -+ case pop_failure_jump: -+ case maybe_pop_jump: -+ case jump: -+ case jump_past_alt: -+ case dummy_failure_jump: -+ EXTRACT_NUMBER_AND_INCR (j, p); -+ p += j; -+ if (j > 0) -+ continue; -+ -+ /* Jump backward implies we just went through the body of a -+ loop and matched nothing. Opcode jumped to should be -+ `on_failure_jump' or `succeed_n'. Just treat it like an -+ ordinary jump. For a * loop, it has pushed its failure -+ point already; if so, discard that as redundant. */ -+ if ((re_opcode_t) *p != on_failure_jump -+ && (re_opcode_t) *p != succeed_n) -+ continue; -+ -+ p++; -+ EXTRACT_NUMBER_AND_INCR (j, p); -+ p += j; -+ -+ /* If what's on the stack is where we are now, pop it. */ -+ if (!FAIL_STACK_EMPTY () -+ && fail_stack.stack[fail_stack.avail - 1].pointer == p) -+ fail_stack.avail--; -+ -+ continue; -+ -+ -+ case on_failure_jump: -+ case on_failure_keep_string_jump: -+ handle_on_failure_jump: -+ EXTRACT_NUMBER_AND_INCR (j, p); -+ -+ /* For some patterns, e.g., `(a?)?', `p+j' here points to the -+ end of the pattern. We don't want to push such a point, -+ since when we restore it above, entering the switch will -+ increment `p' past the end of the pattern. We don't need -+ to push such a point since we obviously won't find any more -+ fastmap entries beyond `pend'. Such a pattern can match -+ the null string, though. */ -+ if (p + j < pend) -+ { -+ if (!PUSH_PATTERN_OP (p + j, fail_stack)) -+ { -+ RESET_FAIL_STACK (); -+ return -2; -+ } -+ } -+ else -+ bufp->can_be_null = 1; -+ -+ if (succeed_n_p) -+ { -+ EXTRACT_NUMBER_AND_INCR (k, p); /* Skip the n. */ -+ succeed_n_p = false; -+ } -+ -+ continue; -+ -+ -+ case succeed_n: -+ /* Get to the number of times to succeed. */ -+ p += OFFSET_ADDRESS_SIZE; -+ -+ /* Increment p past the n for when k != 0. */ -+ EXTRACT_NUMBER_AND_INCR (k, p); -+ if (k == 0) -+ { -+ p -= 2 * OFFSET_ADDRESS_SIZE; -+ succeed_n_p = true; /* Spaghetti code alert. */ -+ goto handle_on_failure_jump; -+ } -+ continue; -+ -+ -+ case set_number_at: -+ p += 2 * OFFSET_ADDRESS_SIZE; -+ continue; -+ -+ -+ case start_memory: -+ case stop_memory: -+ p += 2; -+ continue; -+ -+ -+ default: -+ abort (); /* We have listed all the cases. */ -+ } /* switch *p++ */ -+ -+ /* Getting here means we have found the possible starting -+ characters for one path of the pattern -- and that the empty -+ string does not match. We need not follow this path further. -+ Instead, look at the next alternative (remembered on the -+ stack), or quit if no more. The test at the top of the loop -+ does these things. */ -+ path_can_be_null = false; -+ p = pend; -+ } /* while p */ -+ -+ /* Set `can_be_null' for the last path (also the first path, if the -+ pattern is empty). */ -+ bufp->can_be_null |= path_can_be_null; -+ -+ done: -+ RESET_FAIL_STACK (); -+ return 0; -+} -+ -+#else /* not INSIDE_RECURSION */ -+ -+int -+re_compile_fastmap (struct re_pattern_buffer *bufp) -+{ -+# ifdef MBS_SUPPORT -+ if (MB_CUR_MAX != 1) -+ return wcs_re_compile_fastmap(bufp); -+ else -+# endif -+ return byte_re_compile_fastmap(bufp); -+} /* re_compile_fastmap */ -+#ifdef _LIBC -+weak_alias (__re_compile_fastmap, re_compile_fastmap) -+#endif -+ -+ -+/* Set REGS to hold NUM_REGS registers, storing them in STARTS and -+ ENDS. Subsequent matches using PATTERN_BUFFER and REGS will use -+ this memory for recording register information. STARTS and ENDS -+ must be allocated using the malloc library routine, and must each -+ be at least NUM_REGS * sizeof (regoff_t) bytes long. -+ -+ If NUM_REGS == 0, then subsequent matches should allocate their own -+ register data. -+ -+ Unless this function is called, the first search or match using -+ PATTERN_BUFFER will allocate its own register data, without -+ freeing the old data. */ -+ -+void -+re_set_registers (struct re_pattern_buffer *bufp, -+ struct re_registers *regs, unsigned num_regs, -+ regoff_t *starts, regoff_t *ends) -+{ -+ if (num_regs) -+ { -+ bufp->regs_allocated = REGS_REALLOCATE; -+ regs->num_regs = num_regs; -+ regs->start = starts; -+ regs->end = ends; -+ } -+ else -+ { -+ bufp->regs_allocated = REGS_UNALLOCATED; -+ regs->num_regs = 0; -+ regs->start = regs->end = (regoff_t *) 0; -+ } -+} -+#ifdef _LIBC -+weak_alias (__re_set_registers, re_set_registers) -+#endif -+ -+/* Searching routines. */ -+ -+/* Like re_search_2, below, but only one string is specified, and -+ doesn't let you say where to stop matching. */ -+ -+int -+re_search (struct re_pattern_buffer *bufp, const char *string, int size, -+ int startpos, int range, struct re_registers *regs) -+{ -+ return re_search_2 (bufp, NULL, 0, string, size, startpos, range, -+ regs, size); -+} -+#ifdef _LIBC -+weak_alias (__re_search, re_search) -+#endif -+ -+ -+/* Using the compiled pattern in BUFP->buffer, first tries to match the -+ virtual concatenation of STRING1 and STRING2, starting first at index -+ STARTPOS, then at STARTPOS + 1, and so on. -+ -+ STRING1 and STRING2 have length SIZE1 and SIZE2, respectively. -+ -+ RANGE is how far to scan while trying to match. RANGE = 0 means try -+ only at STARTPOS; in general, the last start tried is STARTPOS + -+ RANGE. -+ -+ In REGS, return the indices of the virtual concatenation of STRING1 -+ and STRING2 that matched the entire BUFP->buffer and its contained -+ subexpressions. -+ -+ Do not consider matching one past the index STOP in the virtual -+ concatenation of STRING1 and STRING2. -+ -+ We return either the position in the strings at which the match was -+ found, -1 if no match, or -2 if error (such as failure -+ stack overflow). */ -+ -+int -+re_search_2 (struct re_pattern_buffer *bufp, const char *string1, int size1, -+ const char *string2, int size2, int startpos, int range, -+ struct re_registers *regs, int stop) -+{ -+# ifdef MBS_SUPPORT -+ if (MB_CUR_MAX != 1) -+ return wcs_re_search_2 (bufp, string1, size1, string2, size2, startpos, -+ range, regs, stop); -+ else -+# endif -+ return byte_re_search_2 (bufp, string1, size1, string2, size2, startpos, -+ range, regs, stop); -+} /* re_search_2 */ -+#ifdef _LIBC -+weak_alias (__re_search_2, re_search_2) -+#endif -+ -+#endif /* not INSIDE_RECURSION */ -+ -+#ifdef INSIDE_RECURSION -+ -+#ifdef MATCH_MAY_ALLOCATE -+# define FREE_VAR(var) if (var) REGEX_FREE (var); var = NULL -+#else -+# define FREE_VAR(var) if (var) free (var); var = NULL -+#endif -+ -+#ifdef WCHAR -+# define MAX_ALLOCA_SIZE 2000 -+ -+# define FREE_WCS_BUFFERS() \ -+ do { \ -+ if (size1 > MAX_ALLOCA_SIZE) \ -+ { \ -+ free (wcs_string1); \ -+ free (mbs_offset1); \ -+ } \ -+ else \ -+ { \ -+ FREE_VAR (wcs_string1); \ -+ FREE_VAR (mbs_offset1); \ -+ } \ -+ if (size2 > MAX_ALLOCA_SIZE) \ -+ { \ -+ free (wcs_string2); \ -+ free (mbs_offset2); \ -+ } \ -+ else \ -+ { \ -+ FREE_VAR (wcs_string2); \ -+ FREE_VAR (mbs_offset2); \ -+ } \ -+ } while (0) -+ -+#endif -+ -+ -+static int -+PREFIX(re_search_2) (struct re_pattern_buffer *bufp, const char *string1, -+ int size1, const char *string2, int size2, -+ int startpos, int range, -+ struct re_registers *regs, int stop) -+{ -+ int val; -+ register char *fastmap = bufp->fastmap; -+ register RE_TRANSLATE_TYPE translate = bufp->translate; -+ int total_size = size1 + size2; -+ int endpos = startpos + range; -+#ifdef WCHAR -+ /* We need wchar_t* buffers correspond to cstring1, cstring2. */ -+ wchar_t *wcs_string1 = NULL, *wcs_string2 = NULL; -+ /* We need the size of wchar_t buffers correspond to csize1, csize2. */ -+ int wcs_size1 = 0, wcs_size2 = 0; -+ /* offset buffer for optimizatoin. See convert_mbs_to_wc. */ -+ int *mbs_offset1 = NULL, *mbs_offset2 = NULL; -+ /* They hold whether each wchar_t is binary data or not. */ -+ char *is_binary = NULL; -+#endif /* WCHAR */ -+ -+ /* Check for out-of-range STARTPOS. */ -+ if (startpos < 0 || startpos > total_size) -+ return -1; -+ -+ /* Fix up RANGE if it might eventually take us outside -+ the virtual concatenation of STRING1 and STRING2. -+ Make sure we won't move STARTPOS below 0 or above TOTAL_SIZE. */ -+ if (endpos < 0) -+ range = 0 - startpos; -+ else if (endpos > total_size) -+ range = total_size - startpos; -+ -+ /* If the search isn't to be a backwards one, don't waste time in a -+ search for a pattern that must be anchored. */ -+ if (bufp->used > 0 && range > 0 -+ && ((re_opcode_t) bufp->buffer[0] == begbuf -+ /* `begline' is like `begbuf' if it cannot match at newlines. */ -+ || ((re_opcode_t) bufp->buffer[0] == begline -+ && !bufp->newline_anchor))) -+ { -+ if (startpos > 0) -+ return -1; -+ else -+ range = 1; -+ } -+ -+#ifdef emacs -+ /* In a forward search for something that starts with \=. -+ don't keep searching past point. */ -+ if (bufp->used > 0 && (re_opcode_t) bufp->buffer[0] == at_dot && range > 0) -+ { -+ range = PT - startpos; -+ if (range <= 0) -+ return -1; -+ } -+#endif /* emacs */ -+ -+ /* Update the fastmap now if not correct already. */ -+ if (fastmap && !bufp->fastmap_accurate) -+ if (re_compile_fastmap (bufp) == -2) -+ return -2; -+ -+#ifdef WCHAR -+ /* Allocate wchar_t array for wcs_string1 and wcs_string2 and -+ fill them with converted string. */ -+ if (size1 != 0) -+ { -+ if (size1 > MAX_ALLOCA_SIZE) -+ { -+ wcs_string1 = TALLOC (size1 + 1, CHAR_T); -+ mbs_offset1 = TALLOC (size1 + 1, int); -+ is_binary = TALLOC (size1 + 1, char); -+ } -+ else -+ { -+ wcs_string1 = REGEX_TALLOC (size1 + 1, CHAR_T); -+ mbs_offset1 = REGEX_TALLOC (size1 + 1, int); -+ is_binary = REGEX_TALLOC (size1 + 1, char); -+ } -+ if (!wcs_string1 || !mbs_offset1 || !is_binary) -+ { -+ if (size1 > MAX_ALLOCA_SIZE) -+ { -+ free (wcs_string1); -+ free (mbs_offset1); -+ free (is_binary); -+ } -+ else -+ { -+ FREE_VAR (wcs_string1); -+ FREE_VAR (mbs_offset1); -+ FREE_VAR (is_binary); -+ } -+ return -2; -+ } -+ wcs_size1 = convert_mbs_to_wcs(wcs_string1, string1, size1, -+ mbs_offset1, is_binary); -+ wcs_string1[wcs_size1] = L'\0'; /* for a sentinel */ -+ if (size1 > MAX_ALLOCA_SIZE) -+ free (is_binary); -+ else -+ FREE_VAR (is_binary); -+ } -+ if (size2 != 0) -+ { -+ if (size2 > MAX_ALLOCA_SIZE) -+ { -+ wcs_string2 = TALLOC (size2 + 1, CHAR_T); -+ mbs_offset2 = TALLOC (size2 + 1, int); -+ is_binary = TALLOC (size2 + 1, char); -+ } -+ else -+ { -+ wcs_string2 = REGEX_TALLOC (size2 + 1, CHAR_T); -+ mbs_offset2 = REGEX_TALLOC (size2 + 1, int); -+ is_binary = REGEX_TALLOC (size2 + 1, char); -+ } -+ if (!wcs_string2 || !mbs_offset2 || !is_binary) -+ { -+ FREE_WCS_BUFFERS (); -+ if (size2 > MAX_ALLOCA_SIZE) -+ free (is_binary); -+ else -+ FREE_VAR (is_binary); -+ return -2; -+ } -+ wcs_size2 = convert_mbs_to_wcs(wcs_string2, string2, size2, -+ mbs_offset2, is_binary); -+ wcs_string2[wcs_size2] = L'\0'; /* for a sentinel */ -+ if (size2 > MAX_ALLOCA_SIZE) -+ free (is_binary); -+ else -+ FREE_VAR (is_binary); -+ } -+#endif /* WCHAR */ -+ -+ -+ /* Loop through the string, looking for a place to start matching. */ -+ for (;;) -+ { -+ /* If a fastmap is supplied, skip quickly over characters that -+ cannot be the start of a match. If the pattern can match the -+ null string, however, we don't need to skip characters; we want -+ the first null string. */ -+ if (fastmap && startpos < total_size && !bufp->can_be_null) -+ { -+ if (range > 0) /* Searching forwards. */ -+ { -+ register const char *d; -+ register int lim = 0; -+ int irange = range; -+ -+ if (startpos < size1 && startpos + range >= size1) -+ lim = range - (size1 - startpos); -+ -+ d = (startpos >= size1 ? string2 - size1 : string1) + startpos; -+ -+ /* Written out as an if-else to avoid testing `translate' -+ inside the loop. */ -+ if (translate) -+ while (range > lim -+ && !fastmap[(unsigned char) -+ translate[(unsigned char) *d++]]) -+ range--; -+ else -+ while (range > lim && !fastmap[(unsigned char) *d++]) -+ range--; -+ -+ startpos += irange - range; -+ } -+ else /* Searching backwards. */ -+ { -+ register CHAR_T c = (size1 == 0 || startpos >= size1 -+ ? string2[startpos - size1] -+ : string1[startpos]); -+ -+ if (!fastmap[(unsigned char) TRANSLATE (c)]) -+ goto advance; -+ } -+ } -+ -+ /* If can't match the null string, and that's all we have left, fail. */ -+ if (range >= 0 && startpos == total_size && fastmap -+ && !bufp->can_be_null) -+ { -+#ifdef WCHAR -+ FREE_WCS_BUFFERS (); -+#endif -+ return -1; -+ } -+ -+#ifdef WCHAR -+ val = wcs_re_match_2_internal (bufp, string1, size1, string2, -+ size2, startpos, regs, stop, -+ wcs_string1, wcs_size1, -+ wcs_string2, wcs_size2, -+ mbs_offset1, mbs_offset2); -+#else /* BYTE */ -+ val = byte_re_match_2_internal (bufp, string1, size1, string2, -+ size2, startpos, regs, stop); -+#endif /* BYTE */ -+ -+#ifndef REGEX_MALLOC -+# ifdef C_ALLOCA -+ alloca (0); -+# endif -+#endif -+ -+ if (val >= 0) -+ { -+#ifdef WCHAR -+ FREE_WCS_BUFFERS (); -+#endif -+ return startpos; -+ } -+ -+ if (val == -2) -+ { -+#ifdef WCHAR -+ FREE_WCS_BUFFERS (); -+#endif -+ return -2; -+ } -+ -+ advance: -+ if (!range) -+ break; -+ else if (range > 0) -+ { -+ range--; -+ startpos++; -+ } -+ else -+ { -+ range++; -+ startpos--; -+ } -+ } -+#ifdef WCHAR -+ FREE_WCS_BUFFERS (); -+#endif -+ return -1; -+} -+ -+#ifdef WCHAR -+/* This converts PTR, a pointer into one of the search wchar_t strings -+ `string1' and `string2' into an multibyte string offset from the -+ beginning of that string. We use mbs_offset to optimize. -+ See convert_mbs_to_wcs. */ -+# define POINTER_TO_OFFSET(ptr) \ -+ (FIRST_STRING_P (ptr) \ -+ ? ((regoff_t)(mbs_offset1 != NULL? mbs_offset1[(ptr)-string1] : 0)) \ -+ : ((regoff_t)((mbs_offset2 != NULL? mbs_offset2[(ptr)-string2] : 0) \ -+ + csize1))) -+#else /* BYTE */ -+/* This converts PTR, a pointer into one of the search strings `string1' -+ and `string2' into an offset from the beginning of that string. */ -+# define POINTER_TO_OFFSET(ptr) \ -+ (FIRST_STRING_P (ptr) \ -+ ? ((regoff_t) ((ptr) - string1)) \ -+ : ((regoff_t) ((ptr) - string2 + size1))) -+#endif /* WCHAR */ -+ -+/* Macros for dealing with the split strings in re_match_2. */ -+ -+#define MATCHING_IN_FIRST_STRING (dend == end_match_1) -+ -+/* Call before fetching a character with *d. This switches over to -+ string2 if necessary. */ -+#define PREFETCH() \ -+ while (d == dend) \ -+ { \ -+ /* End of string2 => fail. */ \ -+ if (dend == end_match_2) \ -+ goto fail; \ -+ /* End of string1 => advance to string2. */ \ -+ d = string2; \ -+ dend = end_match_2; \ -+ } -+ -+/* Test if at very beginning or at very end of the virtual concatenation -+ of `string1' and `string2'. If only one string, it's `string2'. */ -+#define AT_STRINGS_BEG(d) ((d) == (size1 ? string1 : string2) || !size2) -+#define AT_STRINGS_END(d) ((d) == end2) -+ -+ -+/* Test if D points to a character which is word-constituent. We have -+ two special cases to check for: if past the end of string1, look at -+ the first character in string2; and if before the beginning of -+ string2, look at the last character in string1. */ -+#ifdef WCHAR -+/* Use internationalized API instead of SYNTAX. */ -+# define WORDCHAR_P(d) \ -+ (iswalnum ((wint_t)((d) == end1 ? *string2 \ -+ : (d) == string2 - 1 ? *(end1 - 1) : *(d))) != 0 \ -+ || ((d) == end1 ? *string2 \ -+ : (d) == string2 - 1 ? *(end1 - 1) : *(d)) == L'_') -+#else /* BYTE */ -+# define WORDCHAR_P(d) \ -+ (SYNTAX ((d) == end1 ? *string2 \ -+ : (d) == string2 - 1 ? *(end1 - 1) : *(d)) \ -+ == Sword) -+#endif /* WCHAR */ -+ -+/* Disabled due to a compiler bug -- see comment at case wordbound */ -+#if 0 -+/* Test if the character before D and the one at D differ with respect -+ to being word-constituent. */ -+#define AT_WORD_BOUNDARY(d) \ -+ (AT_STRINGS_BEG (d) || AT_STRINGS_END (d) \ -+ || WORDCHAR_P (d - 1) != WORDCHAR_P (d)) -+#endif -+ -+/* Free everything we malloc. */ -+#ifdef MATCH_MAY_ALLOCATE -+# ifdef WCHAR -+# define FREE_VARIABLES() \ -+ do { \ -+ REGEX_FREE_STACK (fail_stack.stack); \ -+ FREE_VAR (regstart); \ -+ FREE_VAR (regend); \ -+ FREE_VAR (old_regstart); \ -+ FREE_VAR (old_regend); \ -+ FREE_VAR (best_regstart); \ -+ FREE_VAR (best_regend); \ -+ FREE_VAR (reg_info); \ -+ FREE_VAR (reg_dummy); \ -+ FREE_VAR (reg_info_dummy); \ -+ if (!cant_free_wcs_buf) \ -+ { \ -+ FREE_VAR (string1); \ -+ FREE_VAR (string2); \ -+ FREE_VAR (mbs_offset1); \ -+ FREE_VAR (mbs_offset2); \ -+ } \ -+ } while (0) -+# else /* BYTE */ -+# define FREE_VARIABLES() \ -+ do { \ -+ REGEX_FREE_STACK (fail_stack.stack); \ -+ FREE_VAR (regstart); \ -+ FREE_VAR (regend); \ -+ FREE_VAR (old_regstart); \ -+ FREE_VAR (old_regend); \ -+ FREE_VAR (best_regstart); \ -+ FREE_VAR (best_regend); \ -+ FREE_VAR (reg_info); \ -+ FREE_VAR (reg_dummy); \ -+ FREE_VAR (reg_info_dummy); \ -+ } while (0) -+# endif /* WCHAR */ -+#else -+# ifdef WCHAR -+# define FREE_VARIABLES() \ -+ do { \ -+ if (!cant_free_wcs_buf) \ -+ { \ -+ FREE_VAR (string1); \ -+ FREE_VAR (string2); \ -+ FREE_VAR (mbs_offset1); \ -+ FREE_VAR (mbs_offset2); \ -+ } \ -+ } while (0) -+# else /* BYTE */ -+# define FREE_VARIABLES() ((void)0) /* Do nothing! But inhibit gcc warning. */ -+# endif /* WCHAR */ -+#endif /* not MATCH_MAY_ALLOCATE */ -+ -+/* These values must meet several constraints. They must not be valid -+ register values; since we have a limit of 255 registers (because -+ we use only one byte in the pattern for the register number), we can -+ use numbers larger than 255. They must differ by 1, because of -+ NUM_FAILURE_ITEMS above. And the value for the lowest register must -+ be larger than the value for the highest register, so we do not try -+ to actually save any registers when none are active. */ -+#define NO_HIGHEST_ACTIVE_REG (1 << BYTEWIDTH) -+#define NO_LOWEST_ACTIVE_REG (NO_HIGHEST_ACTIVE_REG + 1) -+ -+#else /* not INSIDE_RECURSION */ -+/* Matching routines. */ -+ -+#ifndef emacs /* Emacs never uses this. */ -+/* re_match is like re_match_2 except it takes only a single string. */ -+ -+int -+re_match (struct re_pattern_buffer *bufp, const char *string, -+ int size, int pos, struct re_registers *regs) -+{ -+ int result; -+# ifdef MBS_SUPPORT -+ if (MB_CUR_MAX != 1) -+ result = wcs_re_match_2_internal (bufp, NULL, 0, string, size, -+ pos, regs, size, -+ NULL, 0, NULL, 0, NULL, NULL); -+ else -+# endif -+ result = byte_re_match_2_internal (bufp, NULL, 0, string, size, -+ pos, regs, size); -+# ifndef REGEX_MALLOC -+# ifdef C_ALLOCA -+ alloca (0); -+# endif -+# endif -+ return result; -+} -+# ifdef _LIBC -+weak_alias (__re_match, re_match) -+# endif -+#endif /* not emacs */ -+ -+#endif /* not INSIDE_RECURSION */ -+ -+#ifdef INSIDE_RECURSION -+static boolean PREFIX(group_match_null_string_p) (UCHAR_T **p, -+ UCHAR_T *end, -+ PREFIX(register_info_type) *reg_info); -+static boolean PREFIX(alt_match_null_string_p) (UCHAR_T *p, -+ UCHAR_T *end, -+ PREFIX(register_info_type) *reg_info); -+static boolean PREFIX(common_op_match_null_string_p) (UCHAR_T **p, -+ UCHAR_T *end, -+ PREFIX(register_info_type) *reg_info); -+static int PREFIX(bcmp_translate) (const CHAR_T *s1, const CHAR_T *s2, -+ register int len, -+ RE_TRANSLATE_TYPE translate); -+#else /* not INSIDE_RECURSION */ -+ -+/* re_match_2 matches the compiled pattern in BUFP against the -+ the (virtual) concatenation of STRING1 and STRING2 (of length SIZE1 -+ and SIZE2, respectively). We start matching at POS, and stop -+ matching at STOP. -+ -+ If REGS is non-null and the `no_sub' field of BUFP is nonzero, we -+ store offsets for the substring each group matched in REGS. See the -+ documentation for exactly how many groups we fill. -+ -+ We return -1 if no match, -2 if an internal error (such as the -+ failure stack overflowing). Otherwise, we return the length of the -+ matched substring. */ -+ -+int -+re_match_2 (struct re_pattern_buffer *bufp, const char *string1, int size1, -+ const char *string2, int size2, int pos, -+ struct re_registers *regs, int stop) -+{ -+ int result; -+# ifdef MBS_SUPPORT -+ if (MB_CUR_MAX != 1) -+ result = wcs_re_match_2_internal (bufp, string1, size1, string2, size2, -+ pos, regs, stop, -+ NULL, 0, NULL, 0, NULL, NULL); -+ else -+# endif -+ result = byte_re_match_2_internal (bufp, string1, size1, string2, size2, -+ pos, regs, stop); -+ -+#ifndef REGEX_MALLOC -+# ifdef C_ALLOCA -+ alloca (0); -+# endif -+#endif -+ return result; -+} -+#ifdef _LIBC -+weak_alias (__re_match_2, re_match_2) -+#endif -+ -+#endif /* not INSIDE_RECURSION */ -+ -+#ifdef INSIDE_RECURSION -+ -+#ifdef WCHAR -+static int count_mbs_length (int *, int); -+ -+/* This check the substring (from 0, to length) of the multibyte string, -+ to which offset_buffer correspond. And count how many wchar_t_characters -+ the substring occupy. We use offset_buffer to optimization. -+ See convert_mbs_to_wcs. */ -+ -+static int -+count_mbs_length(int *offset_buffer, int length) -+{ -+ int upper, lower; -+ -+ /* Check whether the size is valid. */ -+ if (length < 0) -+ return -1; -+ -+ if (offset_buffer == NULL) -+ return 0; -+ -+ /* If there are no multibyte character, offset_buffer[i] == i. -+ Optmize for this case. */ -+ if (offset_buffer[length] == length) -+ return length; -+ -+ /* Set up upper with length. (because for all i, offset_buffer[i] >= i) */ -+ upper = length; -+ lower = 0; -+ -+ while (true) -+ { -+ int middle = (lower + upper) / 2; -+ if (middle == lower || middle == upper) -+ break; -+ if (offset_buffer[middle] > length) -+ upper = middle; -+ else if (offset_buffer[middle] < length) -+ lower = middle; -+ else -+ return middle; -+ } -+ -+ return -1; -+} -+#endif /* WCHAR */ -+ -+/* This is a separate function so that we can force an alloca cleanup -+ afterwards. */ -+#ifdef WCHAR -+static int -+wcs_re_match_2_internal (struct re_pattern_buffer *bufp, -+ const char *cstring1, int csize1, -+ const char *cstring2, int csize2, -+ int pos, -+ struct re_registers *regs, -+ int stop, -+ /* string1 == string2 == NULL means string1/2, size1/2 and -+ mbs_offset1/2 need seting up in this function. */ -+ /* We need wchar_t* buffers correspond to cstring1, cstring2. */ -+ wchar_t *string1, int size1, -+ wchar_t *string2, int size2, -+ /* offset buffer for optimizatoin. See convert_mbs_to_wc. */ -+ int *mbs_offset1, int *mbs_offset2) -+#else /* BYTE */ -+static int -+byte_re_match_2_internal (struct re_pattern_buffer *bufp, -+ const char *string1, int size1, -+ const char *string2, int size2, -+ int pos, -+ struct re_registers *regs, int stop) -+#endif /* BYTE */ -+{ -+ /* General temporaries. */ -+ int mcnt; -+ UCHAR_T *p1; -+#ifdef WCHAR -+ /* They hold whether each wchar_t is binary data or not. */ -+ char *is_binary = NULL; -+ /* If true, we can't free string1/2, mbs_offset1/2. */ -+ int cant_free_wcs_buf = 1; -+#endif /* WCHAR */ -+ -+ /* Just past the end of the corresponding string. */ -+ const CHAR_T *end1, *end2; -+ -+ /* Pointers into string1 and string2, just past the last characters in -+ each to consider matching. */ -+ const CHAR_T *end_match_1, *end_match_2; -+ -+ /* Where we are in the data, and the end of the current string. */ -+ const CHAR_T *d, *dend; -+ -+ /* Where we are in the pattern, and the end of the pattern. */ -+#ifdef WCHAR -+ UCHAR_T *pattern, *p; -+ register UCHAR_T *pend; -+#else /* BYTE */ -+ UCHAR_T *p = bufp->buffer; -+ register UCHAR_T *pend = p + bufp->used; -+#endif /* WCHAR */ -+ -+ /* Mark the opcode just after a start_memory, so we can test for an -+ empty subpattern when we get to the stop_memory. */ -+ UCHAR_T *just_past_start_mem = 0; -+ -+ /* We use this to map every character in the string. */ -+ RE_TRANSLATE_TYPE translate = bufp->translate; -+ -+ /* Failure point stack. Each place that can handle a failure further -+ down the line pushes a failure point on this stack. It consists of -+ restart, regend, and reg_info for all registers corresponding to -+ the subexpressions we're currently inside, plus the number of such -+ registers, and, finally, two char *'s. The first char * is where -+ to resume scanning the pattern; the second one is where to resume -+ scanning the strings. If the latter is zero, the failure point is -+ a ``dummy''; if a failure happens and the failure point is a dummy, -+ it gets discarded and the next next one is tried. */ -+#ifdef MATCH_MAY_ALLOCATE /* otherwise, this is global. */ -+ PREFIX(fail_stack_type) fail_stack; -+#endif -+#ifdef DEBUG -+ static unsigned failure_id; -+ unsigned nfailure_points_pushed = 0, nfailure_points_popped = 0; -+#endif -+ -+#ifdef REL_ALLOC -+ /* This holds the pointer to the failure stack, when -+ it is allocated relocatably. */ -+ fail_stack_elt_t *failure_stack_ptr; -+#endif -+ -+ /* We fill all the registers internally, independent of what we -+ return, for use in backreferences. The number here includes -+ an element for register zero. */ -+ size_t num_regs = bufp->re_nsub + 1; -+ -+ /* The currently active registers. */ -+ active_reg_t lowest_active_reg = NO_LOWEST_ACTIVE_REG; -+ active_reg_t highest_active_reg = NO_HIGHEST_ACTIVE_REG; -+ -+ /* Information on the contents of registers. These are pointers into -+ the input strings; they record just what was matched (on this -+ attempt) by a subexpression part of the pattern, that is, the -+ regnum-th regstart pointer points to where in the pattern we began -+ matching and the regnum-th regend points to right after where we -+ stopped matching the regnum-th subexpression. (The zeroth register -+ keeps track of what the whole pattern matches.) */ -+#ifdef MATCH_MAY_ALLOCATE /* otherwise, these are global. */ -+ const CHAR_T **regstart, **regend; -+#endif -+ -+ /* If a group that's operated upon by a repetition operator fails to -+ match anything, then the register for its start will need to be -+ restored because it will have been set to wherever in the string we -+ are when we last see its open-group operator. Similarly for a -+ register's end. */ -+#ifdef MATCH_MAY_ALLOCATE /* otherwise, these are global. */ -+ const CHAR_T **old_regstart, **old_regend; -+#endif -+ -+ /* The is_active field of reg_info helps us keep track of which (possibly -+ nested) subexpressions we are currently in. The matched_something -+ field of reg_info[reg_num] helps us tell whether or not we have -+ matched any of the pattern so far this time through the reg_num-th -+ subexpression. These two fields get reset each time through any -+ loop their register is in. */ -+#ifdef MATCH_MAY_ALLOCATE /* otherwise, this is global. */ -+ PREFIX(register_info_type) *reg_info; -+#endif -+ -+ /* The following record the register info as found in the above -+ variables when we find a match better than any we've seen before. -+ This happens as we backtrack through the failure points, which in -+ turn happens only if we have not yet matched the entire string. */ -+ unsigned best_regs_set = false; -+#ifdef MATCH_MAY_ALLOCATE /* otherwise, these are global. */ -+ const CHAR_T **best_regstart, **best_regend; -+#endif -+ -+ /* Logically, this is `best_regend[0]'. But we don't want to have to -+ allocate space for that if we're not allocating space for anything -+ else (see below). Also, we never need info about register 0 for -+ any of the other register vectors, and it seems rather a kludge to -+ treat `best_regend' differently than the rest. So we keep track of -+ the end of the best match so far in a separate variable. We -+ initialize this to NULL so that when we backtrack the first time -+ and need to test it, it's not garbage. */ -+ const CHAR_T *match_end = NULL; -+ -+ /* This helps SET_REGS_MATCHED avoid doing redundant work. */ -+ int set_regs_matched_done = 0; -+ -+ /* Used when we pop values we don't care about. */ -+#ifdef MATCH_MAY_ALLOCATE /* otherwise, these are global. */ -+ const CHAR_T **reg_dummy; -+ PREFIX(register_info_type) *reg_info_dummy; -+#endif -+ -+#ifdef DEBUG -+ /* Counts the total number of registers pushed. */ -+ unsigned num_regs_pushed = 0; -+#endif -+ -+ DEBUG_PRINT1 ("\n\nEntering re_match_2.\n"); -+ -+ INIT_FAIL_STACK (); -+ -+#ifdef MATCH_MAY_ALLOCATE -+ /* Do not bother to initialize all the register variables if there are -+ no groups in the pattern, as it takes a fair amount of time. If -+ there are groups, we include space for register 0 (the whole -+ pattern), even though we never use it, since it simplifies the -+ array indexing. We should fix this. */ -+ if (bufp->re_nsub) -+ { -+ regstart = REGEX_TALLOC (num_regs, const CHAR_T *); -+ regend = REGEX_TALLOC (num_regs, const CHAR_T *); -+ old_regstart = REGEX_TALLOC (num_regs, const CHAR_T *); -+ old_regend = REGEX_TALLOC (num_regs, const CHAR_T *); -+ best_regstart = REGEX_TALLOC (num_regs, const CHAR_T *); -+ best_regend = REGEX_TALLOC (num_regs, const CHAR_T *); -+ reg_info = REGEX_TALLOC (num_regs, PREFIX(register_info_type)); -+ reg_dummy = REGEX_TALLOC (num_regs, const CHAR_T *); -+ reg_info_dummy = REGEX_TALLOC (num_regs, PREFIX(register_info_type)); -+ -+ if (!(regstart && regend && old_regstart && old_regend && reg_info -+ && best_regstart && best_regend && reg_dummy && reg_info_dummy)) -+ { -+ FREE_VARIABLES (); -+ return -2; -+ } -+ } -+ else -+ { -+ /* We must initialize all our variables to NULL, so that -+ `FREE_VARIABLES' doesn't try to free them. */ -+ regstart = regend = old_regstart = old_regend = best_regstart -+ = best_regend = reg_dummy = NULL; -+ reg_info = reg_info_dummy = (PREFIX(register_info_type) *) NULL; -+ } -+#endif /* MATCH_MAY_ALLOCATE */ -+ -+ /* The starting position is bogus. */ -+#ifdef WCHAR -+ if (pos < 0 || pos > csize1 + csize2) -+#else /* BYTE */ -+ if (pos < 0 || pos > size1 + size2) -+#endif -+ { -+ FREE_VARIABLES (); -+ return -1; -+ } -+ -+#ifdef WCHAR -+ /* Allocate wchar_t array for string1 and string2 and -+ fill them with converted string. */ -+ if (string1 == NULL && string2 == NULL) -+ { -+ /* We need seting up buffers here. */ -+ -+ /* We must free wcs buffers in this function. */ -+ cant_free_wcs_buf = 0; -+ -+ if (csize1 != 0) -+ { -+ string1 = REGEX_TALLOC (csize1 + 1, CHAR_T); -+ mbs_offset1 = REGEX_TALLOC (csize1 + 1, int); -+ is_binary = REGEX_TALLOC (csize1 + 1, char); -+ if (!string1 || !mbs_offset1 || !is_binary) -+ { -+ FREE_VAR (string1); -+ FREE_VAR (mbs_offset1); -+ FREE_VAR (is_binary); -+ return -2; -+ } -+ } -+ if (csize2 != 0) -+ { -+ string2 = REGEX_TALLOC (csize2 + 1, CHAR_T); -+ mbs_offset2 = REGEX_TALLOC (csize2 + 1, int); -+ is_binary = REGEX_TALLOC (csize2 + 1, char); -+ if (!string2 || !mbs_offset2 || !is_binary) -+ { -+ FREE_VAR (string1); -+ FREE_VAR (mbs_offset1); -+ FREE_VAR (string2); -+ FREE_VAR (mbs_offset2); -+ FREE_VAR (is_binary); -+ return -2; -+ } -+ size2 = convert_mbs_to_wcs(string2, cstring2, csize2, -+ mbs_offset2, is_binary); -+ string2[size2] = L'\0'; /* for a sentinel */ -+ FREE_VAR (is_binary); -+ } -+ } -+ -+ /* We need to cast pattern to (wchar_t*), because we casted this compiled -+ pattern to (char*) in regex_compile. */ -+ p = pattern = (CHAR_T*)bufp->buffer; -+ pend = (CHAR_T*)(bufp->buffer + bufp->used); -+ -+#endif /* WCHAR */ -+ -+ /* Initialize subexpression text positions to -1 to mark ones that no -+ start_memory/stop_memory has been seen for. Also initialize the -+ register information struct. */ -+ for (mcnt = 1; (unsigned) mcnt < num_regs; mcnt++) -+ { -+ regstart[mcnt] = regend[mcnt] -+ = old_regstart[mcnt] = old_regend[mcnt] = REG_UNSET_VALUE; -+ -+ REG_MATCH_NULL_STRING_P (reg_info[mcnt]) = MATCH_NULL_UNSET_VALUE; -+ IS_ACTIVE (reg_info[mcnt]) = 0; -+ MATCHED_SOMETHING (reg_info[mcnt]) = 0; -+ EVER_MATCHED_SOMETHING (reg_info[mcnt]) = 0; -+ } -+ -+ /* We move `string1' into `string2' if the latter's empty -- but not if -+ `string1' is null. */ -+ if (size2 == 0 && string1 != NULL) -+ { -+ string2 = string1; -+ size2 = size1; -+ string1 = 0; -+ size1 = 0; -+#ifdef WCHAR -+ mbs_offset2 = mbs_offset1; -+ csize2 = csize1; -+ mbs_offset1 = NULL; -+ csize1 = 0; -+#endif -+ } -+ end1 = string1 + size1; -+ end2 = string2 + size2; -+ -+ /* Compute where to stop matching, within the two strings. */ -+#ifdef WCHAR -+ if (stop <= csize1) -+ { -+ mcnt = count_mbs_length(mbs_offset1, stop); -+ end_match_1 = string1 + mcnt; -+ end_match_2 = string2; -+ } -+ else -+ { -+ if (stop > csize1 + csize2) -+ stop = csize1 + csize2; -+ end_match_1 = end1; -+ mcnt = count_mbs_length(mbs_offset2, stop-csize1); -+ end_match_2 = string2 + mcnt; -+ } -+ if (mcnt < 0) -+ { /* count_mbs_length return error. */ -+ FREE_VARIABLES (); -+ return -1; -+ } -+#else -+ if (stop <= size1) -+ { -+ end_match_1 = string1 + stop; -+ end_match_2 = string2; -+ } -+ else -+ { -+ end_match_1 = end1; -+ end_match_2 = string2 + stop - size1; -+ } -+#endif /* WCHAR */ -+ -+ /* `p' scans through the pattern as `d' scans through the data. -+ `dend' is the end of the input string that `d' points within. `d' -+ is advanced into the following input string whenever necessary, but -+ this happens before fetching; therefore, at the beginning of the -+ loop, `d' can be pointing at the end of a string, but it cannot -+ equal `string2'. */ -+#ifdef WCHAR -+ if (size1 > 0 && pos <= csize1) -+ { -+ mcnt = count_mbs_length(mbs_offset1, pos); -+ d = string1 + mcnt; -+ dend = end_match_1; -+ } -+ else -+ { -+ mcnt = count_mbs_length(mbs_offset2, pos-csize1); -+ d = string2 + mcnt; -+ dend = end_match_2; -+ } -+ -+ if (mcnt < 0) -+ { /* count_mbs_length return error. */ -+ FREE_VARIABLES (); -+ return -1; -+ } -+#else -+ if (size1 > 0 && pos <= size1) -+ { -+ d = string1 + pos; -+ dend = end_match_1; -+ } -+ else -+ { -+ d = string2 + pos - size1; -+ dend = end_match_2; -+ } -+#endif /* WCHAR */ -+ -+ DEBUG_PRINT1 ("The compiled pattern is:\n"); -+ DEBUG_PRINT_COMPILED_PATTERN (bufp, p, pend); -+ DEBUG_PRINT1 ("The string to match is: `"); -+ DEBUG_PRINT_DOUBLE_STRING (d, string1, size1, string2, size2); -+ DEBUG_PRINT1 ("'\n"); -+ -+ /* This loops over pattern commands. It exits by returning from the -+ function if the match is complete, or it drops through if the match -+ fails at this starting point in the input data. */ -+ for (;;) -+ { -+#ifdef _LIBC -+ DEBUG_PRINT2 ("\n%p: ", p); -+#else -+ DEBUG_PRINT2 ("\n0x%x: ", p); -+#endif -+ -+ if (p == pend) -+ { /* End of pattern means we might have succeeded. */ -+ DEBUG_PRINT1 ("end of pattern ... "); -+ -+ /* If we haven't matched the entire string, and we want the -+ longest match, try backtracking. */ -+ if (d != end_match_2) -+ { -+ /* 1 if this match ends in the same string (string1 or string2) -+ as the best previous match. */ -+ boolean same_str_p = (FIRST_STRING_P (match_end) -+ == MATCHING_IN_FIRST_STRING); -+ /* 1 if this match is the best seen so far. */ -+ boolean best_match_p; -+ -+ /* AIX compiler got confused when this was combined -+ with the previous declaration. */ -+ if (same_str_p) -+ best_match_p = d > match_end; -+ else -+ best_match_p = !MATCHING_IN_FIRST_STRING; -+ -+ DEBUG_PRINT1 ("backtracking.\n"); -+ -+ if (!FAIL_STACK_EMPTY ()) -+ { /* More failure points to try. */ -+ -+ /* If exceeds best match so far, save it. */ -+ if (!best_regs_set || best_match_p) -+ { -+ best_regs_set = true; -+ match_end = d; -+ -+ DEBUG_PRINT1 ("\nSAVING match as best so far.\n"); -+ -+ for (mcnt = 1; (unsigned) mcnt < num_regs; mcnt++) -+ { -+ best_regstart[mcnt] = regstart[mcnt]; -+ best_regend[mcnt] = regend[mcnt]; -+ } -+ } -+ goto fail; -+ } -+ -+ /* If no failure points, don't restore garbage. And if -+ last match is real best match, don't restore second -+ best one. */ -+ else if (best_regs_set && !best_match_p) -+ { -+ restore_best_regs: -+ /* Restore best match. It may happen that `dend == -+ end_match_1' while the restored d is in string2. -+ For example, the pattern `x.*y.*z' against the -+ strings `x-' and `y-z-', if the two strings are -+ not consecutive in memory. */ -+ DEBUG_PRINT1 ("Restoring best registers.\n"); -+ -+ d = match_end; -+ dend = ((d >= string1 && d <= end1) -+ ? end_match_1 : end_match_2); -+ -+ for (mcnt = 1; (unsigned) mcnt < num_regs; mcnt++) -+ { -+ regstart[mcnt] = best_regstart[mcnt]; -+ regend[mcnt] = best_regend[mcnt]; -+ } -+ } -+ } /* d != end_match_2 */ -+ -+ succeed_label: -+ DEBUG_PRINT1 ("Accepting match.\n"); -+ /* If caller wants register contents data back, do it. */ -+ if (regs && !bufp->no_sub) -+ { -+ /* Have the register data arrays been allocated? */ -+ if (bufp->regs_allocated == REGS_UNALLOCATED) -+ { /* No. So allocate them with malloc. We need one -+ extra element beyond `num_regs' for the `-1' marker -+ GNU code uses. */ -+ regs->num_regs = MAX (RE_NREGS, num_regs + 1); -+ regs->start = TALLOC (regs->num_regs, regoff_t); -+ regs->end = TALLOC (regs->num_regs, regoff_t); -+ if (regs->start == NULL || regs->end == NULL) -+ { -+ FREE_VARIABLES (); -+ return -2; -+ } -+ bufp->regs_allocated = REGS_REALLOCATE; -+ } -+ else if (bufp->regs_allocated == REGS_REALLOCATE) -+ { /* Yes. If we need more elements than were already -+ allocated, reallocate them. If we need fewer, just -+ leave it alone. */ -+ if (regs->num_regs < num_regs + 1) -+ { -+ regs->num_regs = num_regs + 1; -+ RETALLOC (regs->start, regs->num_regs, regoff_t); -+ RETALLOC (regs->end, regs->num_regs, regoff_t); -+ if (regs->start == NULL || regs->end == NULL) -+ { -+ FREE_VARIABLES (); -+ return -2; -+ } -+ } -+ } -+ else -+ { -+ /* These braces fend off a "empty body in an else-statement" -+ warning under GCC when assert expands to nothing. */ -+ assert (bufp->regs_allocated == REGS_FIXED); -+ } -+ -+ /* Convert the pointer data in `regstart' and `regend' to -+ indices. Register zero has to be set differently, -+ since we haven't kept track of any info for it. */ -+ if (regs->num_regs > 0) -+ { -+ regs->start[0] = pos; -+#ifdef WCHAR -+ if (MATCHING_IN_FIRST_STRING) -+ regs->end[0] = mbs_offset1 != NULL ? -+ mbs_offset1[d-string1] : 0; -+ else -+ regs->end[0] = csize1 + (mbs_offset2 != NULL ? -+ mbs_offset2[d-string2] : 0); -+#else -+ regs->end[0] = (MATCHING_IN_FIRST_STRING -+ ? ((regoff_t) (d - string1)) -+ : ((regoff_t) (d - string2 + size1))); -+#endif /* WCHAR */ -+ } -+ -+ /* Go through the first `min (num_regs, regs->num_regs)' -+ registers, since that is all we initialized. */ -+ for (mcnt = 1; (unsigned) mcnt < MIN (num_regs, regs->num_regs); -+ mcnt++) -+ { -+ if (REG_UNSET (regstart[mcnt]) || REG_UNSET (regend[mcnt])) -+ regs->start[mcnt] = regs->end[mcnt] = -1; -+ else -+ { -+ regs->start[mcnt] -+ = (regoff_t) POINTER_TO_OFFSET (regstart[mcnt]); -+ regs->end[mcnt] -+ = (regoff_t) POINTER_TO_OFFSET (regend[mcnt]); -+ } -+ } -+ -+ /* If the regs structure we return has more elements than -+ were in the pattern, set the extra elements to -1. If -+ we (re)allocated the registers, this is the case, -+ because we always allocate enough to have at least one -+ -1 at the end. */ -+ for (mcnt = num_regs; (unsigned) mcnt < regs->num_regs; mcnt++) -+ regs->start[mcnt] = regs->end[mcnt] = -1; -+ } /* regs && !bufp->no_sub */ -+ -+ DEBUG_PRINT4 ("%u failure points pushed, %u popped (%u remain).\n", -+ nfailure_points_pushed, nfailure_points_popped, -+ nfailure_points_pushed - nfailure_points_popped); -+ DEBUG_PRINT2 ("%u registers pushed.\n", num_regs_pushed); -+ -+#ifdef WCHAR -+ if (MATCHING_IN_FIRST_STRING) -+ mcnt = mbs_offset1 != NULL ? mbs_offset1[d-string1] : 0; -+ else -+ mcnt = (mbs_offset2 != NULL ? mbs_offset2[d-string2] : 0) + -+ csize1; -+ mcnt -= pos; -+#else -+ mcnt = d - pos - (MATCHING_IN_FIRST_STRING -+ ? string1 -+ : string2 - size1); -+#endif /* WCHAR */ -+ -+ DEBUG_PRINT2 ("Returning %d from re_match_2.\n", mcnt); -+ -+ FREE_VARIABLES (); -+ return mcnt; -+ } -+ -+ /* Otherwise match next pattern command. */ -+ switch (SWITCH_ENUM_CAST ((re_opcode_t) *p++)) -+ { -+ /* Ignore these. Used to ignore the n of succeed_n's which -+ currently have n == 0. */ -+ case no_op: -+ DEBUG_PRINT1 ("EXECUTING no_op.\n"); -+ break; -+ -+ case succeed: -+ DEBUG_PRINT1 ("EXECUTING succeed.\n"); -+ goto succeed_label; -+ -+ /* Match the next n pattern characters exactly. The following -+ byte in the pattern defines n, and the n bytes after that -+ are the characters to match. */ -+ case exactn: -+#ifdef MBS_SUPPORT -+ case exactn_bin: -+#endif -+ mcnt = *p++; -+ DEBUG_PRINT2 ("EXECUTING exactn %d.\n", mcnt); -+ -+ /* This is written out as an if-else so we don't waste time -+ testing `translate' inside the loop. */ -+ if (translate) -+ { -+ do -+ { -+ PREFETCH (); -+#ifdef WCHAR -+ if (*d <= 0xff) -+ { -+ if ((UCHAR_T) translate[(unsigned char) *d++] -+ != (UCHAR_T) *p++) -+ goto fail; -+ } -+ else -+ { -+ if (*d++ != (CHAR_T) *p++) -+ goto fail; -+ } -+#else -+ if ((UCHAR_T) translate[(unsigned char) *d++] -+ != (UCHAR_T) *p++) -+ goto fail; -+#endif /* WCHAR */ -+ } -+ while (--mcnt); -+ } -+ else -+ { -+ do -+ { -+ PREFETCH (); -+ if (*d++ != (CHAR_T) *p++) goto fail; -+ } -+ while (--mcnt); -+ } -+ SET_REGS_MATCHED (); -+ break; -+ -+ -+ /* Match any character except possibly a newline or a null. */ -+ case anychar: -+ DEBUG_PRINT1 ("EXECUTING anychar.\n"); -+ -+ PREFETCH (); -+ -+ if ((!(bufp->syntax & RE_DOT_NEWLINE) && TRANSLATE (*d) == '\n') -+ || (bufp->syntax & RE_DOT_NOT_NULL && TRANSLATE (*d) == '\000')) -+ goto fail; -+ -+ SET_REGS_MATCHED (); -+ DEBUG_PRINT2 (" Matched `%ld'.\n", (long int) *d); -+ d++; -+ break; -+ -+ -+ case charset: -+ case charset_not: -+ { -+ register UCHAR_T c; -+#ifdef WCHAR -+ unsigned int i, char_class_length, coll_symbol_length, -+ equiv_class_length, ranges_length, chars_length, length; -+ CHAR_T *workp, *workp2, *charset_top; -+#define WORK_BUFFER_SIZE 128 -+ CHAR_T str_buf[WORK_BUFFER_SIZE]; -+# ifdef _LIBC -+ uint32_t nrules; -+# endif /* _LIBC */ -+#endif /* WCHAR */ -+ boolean negate = (re_opcode_t) *(p - 1) == charset_not; -+ -+ DEBUG_PRINT2 ("EXECUTING charset%s.\n", negate ? "_not" : ""); -+ PREFETCH (); -+ c = TRANSLATE (*d); /* The character to match. */ -+#ifdef WCHAR -+# ifdef _LIBC -+ nrules = _NL_CURRENT_WORD (LC_COLLATE, _NL_COLLATE_NRULES); -+# endif /* _LIBC */ -+ charset_top = p - 1; -+ char_class_length = *p++; -+ coll_symbol_length = *p++; -+ equiv_class_length = *p++; -+ ranges_length = *p++; -+ chars_length = *p++; -+ /* p points charset[6], so the address of the next instruction -+ (charset[l+m+n+2o+k+p']) equals p[l+m+n+2*o+p'], -+ where l=length of char_classes, m=length of collating_symbol, -+ n=equivalence_class, o=length of char_range, -+ p'=length of character. */ -+ workp = p; -+ /* Update p to indicate the next instruction. */ -+ p += char_class_length + coll_symbol_length+ equiv_class_length + -+ 2*ranges_length + chars_length; -+ -+ /* match with char_class? */ -+ for (i = 0; i < char_class_length ; i += CHAR_CLASS_SIZE) -+ { -+ wctype_t wctype; -+ uintptr_t alignedp = ((uintptr_t)workp -+ + __alignof__(wctype_t) - 1) -+ & ~(uintptr_t)(__alignof__(wctype_t) - 1); -+ wctype = *((wctype_t*)alignedp); -+ workp += CHAR_CLASS_SIZE; -+# ifdef _LIBC -+ if (__iswctype((wint_t)c, wctype)) -+ goto char_set_matched; -+# else -+ if (iswctype((wint_t)c, wctype)) -+ goto char_set_matched; -+# endif -+ } -+ -+ /* match with collating_symbol? */ -+# ifdef _LIBC -+ if (nrules != 0) -+ { -+ const unsigned char *extra = (const unsigned char *) -+ _NL_CURRENT (LC_COLLATE, _NL_COLLATE_SYMB_EXTRAMB); -+ -+ for (workp2 = workp + coll_symbol_length ; workp < workp2 ; -+ workp++) -+ { -+ int32_t *wextra; -+ wextra = (int32_t*)(extra + *workp++); -+ for (i = 0; i < *wextra; ++i) -+ if (TRANSLATE(d[i]) != wextra[1 + i]) -+ break; -+ -+ if (i == *wextra) -+ { -+ /* Update d, however d will be incremented at -+ char_set_matched:, we decrement d here. */ -+ d += i - 1; -+ goto char_set_matched; -+ } -+ } -+ } -+ else /* (nrules == 0) */ -+# endif -+ /* If we can't look up collation data, we use wcscoll -+ instead. */ -+ { -+ for (workp2 = workp + coll_symbol_length ; workp < workp2 ;) -+ { -+ const CHAR_T *backup_d = d, *backup_dend = dend; -+# ifdef _LIBC -+ length = __wcslen (workp); -+# else -+ length = wcslen (workp); -+# endif -+ -+ /* If wcscoll(the collating symbol, whole string) > 0, -+ any substring of the string never match with the -+ collating symbol. */ -+# ifdef _LIBC -+ if (__wcscoll (workp, d) > 0) -+# else -+ if (wcscoll (workp, d) > 0) -+# endif -+ { -+ workp += length + 1; -+ continue; -+ } -+ -+ /* First, we compare the collating symbol with -+ the first character of the string. -+ If it don't match, we add the next character to -+ the compare buffer in turn. */ -+ for (i = 0 ; i < WORK_BUFFER_SIZE-1 ; i++, d++) -+ { -+ int match; -+ if (d == dend) -+ { -+ if (dend == end_match_2) -+ break; -+ d = string2; -+ dend = end_match_2; -+ } -+ -+ /* add next character to the compare buffer. */ -+ str_buf[i] = TRANSLATE(*d); -+ str_buf[i+1] = '\0'; -+ -+# ifdef _LIBC -+ match = __wcscoll (workp, str_buf); -+# else -+ match = wcscoll (workp, str_buf); -+# endif -+ if (match == 0) -+ goto char_set_matched; -+ -+ if (match < 0) -+ /* (str_buf > workp) indicate (str_buf + X > workp), -+ because for all X (str_buf + X > str_buf). -+ So we don't need continue this loop. */ -+ break; -+ -+ /* Otherwise(str_buf < workp), -+ (str_buf+next_character) may equals (workp). -+ So we continue this loop. */ -+ } -+ /* not matched */ -+ d = backup_d; -+ dend = backup_dend; -+ workp += length + 1; -+ } -+ } -+ /* match with equivalence_class? */ -+# ifdef _LIBC -+ if (nrules != 0) -+ { -+ const CHAR_T *backup_d = d, *backup_dend = dend; -+ /* Try to match the equivalence class against -+ those known to the collate implementation. */ -+ const int32_t *table; -+ const int32_t *weights; -+ const int32_t *extra; -+ const int32_t *indirect; -+ int32_t idx, idx2; -+ wint_t *cp; -+ size_t len; -+ -+ table = (const int32_t *) -+ _NL_CURRENT (LC_COLLATE, _NL_COLLATE_TABLEWC); -+ weights = (const wint_t *) -+ _NL_CURRENT (LC_COLLATE, _NL_COLLATE_WEIGHTWC); -+ extra = (const wint_t *) -+ _NL_CURRENT (LC_COLLATE, _NL_COLLATE_EXTRAWC); -+ indirect = (const int32_t *) -+ _NL_CURRENT (LC_COLLATE, _NL_COLLATE_INDIRECTWC); -+ -+ /* Write 1 collating element to str_buf, and -+ get its index. */ -+ idx2 = 0; -+ -+ for (i = 0 ; idx2 == 0 && i < WORK_BUFFER_SIZE - 1; i++) -+ { -+ cp = (wint_t*)str_buf; -+ if (d == dend) -+ { -+ if (dend == end_match_2) -+ break; -+ d = string2; -+ dend = end_match_2; -+ } -+ str_buf[i] = TRANSLATE(*(d+i)); -+ str_buf[i+1] = '\0'; /* sentinel */ -+ idx2 = FINDIDX (table, indirect, extra, &cp, 1); -+ } -+ -+ /* Update d, however d will be incremented at -+ char_set_matched:, we decrement d here. */ -+ d = backup_d + ((wchar_t*)cp - (wchar_t*)str_buf - 1); -+ if (d >= dend) -+ { -+ if (dend == end_match_2) -+ d = dend; -+ else -+ { -+ d = string2; -+ dend = end_match_2; -+ } -+ } -+ -+ len = weights[idx2]; -+ -+ for (workp2 = workp + equiv_class_length ; workp < workp2 ; -+ workp++) -+ { -+ idx = (int32_t)*workp; -+ /* We already checked idx != 0 in regex_compile. */ -+ -+ if (idx2 != 0 && len == weights[idx]) -+ { -+ int cnt = 0; -+ while (cnt < len && (weights[idx + 1 + cnt] -+ == weights[idx2 + 1 + cnt])) -+ ++cnt; -+ -+ if (cnt == len) -+ goto char_set_matched; -+ } -+ } -+ /* not matched */ -+ d = backup_d; -+ dend = backup_dend; -+ } -+ else /* (nrules == 0) */ -+# endif -+ /* If we can't look up collation data, we use wcscoll -+ instead. */ -+ { -+ for (workp2 = workp + equiv_class_length ; workp < workp2 ;) -+ { -+ const CHAR_T *backup_d = d, *backup_dend = dend; -+# ifdef _LIBC -+ length = __wcslen (workp); -+# else -+ length = wcslen (workp); -+# endif -+ -+ /* If wcscoll(the collating symbol, whole string) > 0, -+ any substring of the string never match with the -+ collating symbol. */ -+# ifdef _LIBC -+ if (__wcscoll (workp, d) > 0) -+# else -+ if (wcscoll (workp, d) > 0) -+# endif -+ { -+ workp += length + 1; -+ break; -+ } -+ -+ /* First, we compare the equivalence class with -+ the first character of the string. -+ If it don't match, we add the next character to -+ the compare buffer in turn. */ -+ for (i = 0 ; i < WORK_BUFFER_SIZE - 1 ; i++, d++) -+ { -+ int match; -+ if (d == dend) -+ { -+ if (dend == end_match_2) -+ break; -+ d = string2; -+ dend = end_match_2; -+ } -+ -+ /* add next character to the compare buffer. */ -+ str_buf[i] = TRANSLATE(*d); -+ str_buf[i+1] = '\0'; -+ -+# ifdef _LIBC -+ match = __wcscoll (workp, str_buf); -+# else -+ match = wcscoll (workp, str_buf); -+# endif -+ -+ if (match == 0) -+ goto char_set_matched; -+ -+ if (match < 0) -+ /* (str_buf > workp) indicate (str_buf + X > workp), -+ because for all X (str_buf + X > str_buf). -+ So we don't need continue this loop. */ -+ break; -+ -+ /* Otherwise(str_buf < workp), -+ (str_buf+next_character) may equals (workp). -+ So we continue this loop. */ -+ } -+ /* not matched */ -+ d = backup_d; -+ dend = backup_dend; -+ workp += length + 1; -+ } -+ } -+ -+ /* match with char_range? */ -+# ifdef _LIBC -+ if (nrules != 0) -+ { -+ uint32_t collseqval; -+ const char *collseq = (const char *) -+ _NL_CURRENT(LC_COLLATE, _NL_COLLATE_COLLSEQWC); -+ -+ collseqval = collseq_table_lookup (collseq, c); -+ -+ for (; workp < p - chars_length ;) -+ { -+ uint32_t start_val, end_val; -+ -+ /* We already compute the collation sequence value -+ of the characters (or collating symbols). */ -+ start_val = (uint32_t) *workp++; /* range_start */ -+ end_val = (uint32_t) *workp++; /* range_end */ -+ -+ if (start_val <= collseqval && collseqval <= end_val) -+ goto char_set_matched; -+ } -+ } -+ else -+# endif -+ { -+ /* We set range_start_char at str_buf[0], range_end_char -+ at str_buf[4], and compared char at str_buf[2]. */ -+ str_buf[1] = 0; -+ str_buf[2] = c; -+ str_buf[3] = 0; -+ str_buf[5] = 0; -+ for (; workp < p - chars_length ;) -+ { -+ wchar_t *range_start_char, *range_end_char; -+ -+ /* match if (range_start_char <= c <= range_end_char). */ -+ -+ /* If range_start(or end) < 0, we assume -range_start(end) -+ is the offset of the collating symbol which is specified -+ as the character of the range start(end). */ -+ -+ /* range_start */ -+ if (*workp < 0) -+ range_start_char = charset_top - (*workp++); -+ else -+ { -+ str_buf[0] = *workp++; -+ range_start_char = str_buf; -+ } -+ -+ /* range_end */ -+ if (*workp < 0) -+ range_end_char = charset_top - (*workp++); -+ else -+ { -+ str_buf[4] = *workp++; -+ range_end_char = str_buf + 4; -+ } -+ -+# ifdef _LIBC -+ if (__wcscoll (range_start_char, str_buf+2) <= 0 -+ && __wcscoll (str_buf+2, range_end_char) <= 0) -+# else -+ if (wcscoll (range_start_char, str_buf+2) <= 0 -+ && wcscoll (str_buf+2, range_end_char) <= 0) -+# endif -+ goto char_set_matched; -+ } -+ } -+ -+ /* match with char? */ -+ for (; workp < p ; workp++) -+ if (c == *workp) -+ goto char_set_matched; -+ -+ negate = !negate; -+ -+ char_set_matched: -+ if (negate) goto fail; -+#else -+ /* Cast to `unsigned' instead of `unsigned char' in case the -+ bit list is a full 32 bytes long. */ -+ if (c < (unsigned) (*p * BYTEWIDTH) -+ && p[1 + c / BYTEWIDTH] & (1 << (c % BYTEWIDTH))) -+ negate = !negate; -+ -+ p += 1 + *p; -+ -+ if (!negate) goto fail; -+#undef WORK_BUFFER_SIZE -+#endif /* WCHAR */ -+ SET_REGS_MATCHED (); -+ d++; -+ break; -+ } -+ -+ -+ /* The beginning of a group is represented by start_memory. -+ The arguments are the register number in the next byte, and the -+ number of groups inner to this one in the next. The text -+ matched within the group is recorded (in the internal -+ registers data structure) under the register number. */ -+ case start_memory: -+ DEBUG_PRINT3 ("EXECUTING start_memory %ld (%ld):\n", -+ (long int) *p, (long int) p[1]); -+ -+ /* Find out if this group can match the empty string. */ -+ p1 = p; /* To send to group_match_null_string_p. */ -+ -+ if (REG_MATCH_NULL_STRING_P (reg_info[*p]) == MATCH_NULL_UNSET_VALUE) -+ REG_MATCH_NULL_STRING_P (reg_info[*p]) -+ = PREFIX(group_match_null_string_p) (&p1, pend, reg_info); -+ -+ /* Save the position in the string where we were the last time -+ we were at this open-group operator in case the group is -+ operated upon by a repetition operator, e.g., with `(a*)*b' -+ against `ab'; then we want to ignore where we are now in -+ the string in case this attempt to match fails. */ -+ old_regstart[*p] = REG_MATCH_NULL_STRING_P (reg_info[*p]) -+ ? REG_UNSET (regstart[*p]) ? d : regstart[*p] -+ : regstart[*p]; -+ DEBUG_PRINT2 (" old_regstart: %d\n", -+ POINTER_TO_OFFSET (old_regstart[*p])); -+ -+ regstart[*p] = d; -+ DEBUG_PRINT2 (" regstart: %d\n", POINTER_TO_OFFSET (regstart[*p])); -+ -+ IS_ACTIVE (reg_info[*p]) = 1; -+ MATCHED_SOMETHING (reg_info[*p]) = 0; -+ -+ /* Clear this whenever we change the register activity status. */ -+ set_regs_matched_done = 0; -+ -+ /* This is the new highest active register. */ -+ highest_active_reg = *p; -+ -+ /* If nothing was active before, this is the new lowest active -+ register. */ -+ if (lowest_active_reg == NO_LOWEST_ACTIVE_REG) -+ lowest_active_reg = *p; -+ -+ /* Move past the register number and inner group count. */ -+ p += 2; -+ just_past_start_mem = p; -+ -+ break; -+ -+ -+ /* The stop_memory opcode represents the end of a group. Its -+ arguments are the same as start_memory's: the register -+ number, and the number of inner groups. */ -+ case stop_memory: -+ DEBUG_PRINT3 ("EXECUTING stop_memory %ld (%ld):\n", -+ (long int) *p, (long int) p[1]); -+ -+ /* We need to save the string position the last time we were at -+ this close-group operator in case the group is operated -+ upon by a repetition operator, e.g., with `((a*)*(b*)*)*' -+ against `aba'; then we want to ignore where we are now in -+ the string in case this attempt to match fails. */ -+ old_regend[*p] = REG_MATCH_NULL_STRING_P (reg_info[*p]) -+ ? REG_UNSET (regend[*p]) ? d : regend[*p] -+ : regend[*p]; -+ DEBUG_PRINT2 (" old_regend: %d\n", -+ POINTER_TO_OFFSET (old_regend[*p])); -+ -+ regend[*p] = d; -+ DEBUG_PRINT2 (" regend: %d\n", POINTER_TO_OFFSET (regend[*p])); -+ -+ /* This register isn't active anymore. */ -+ IS_ACTIVE (reg_info[*p]) = 0; -+ -+ /* Clear this whenever we change the register activity status. */ -+ set_regs_matched_done = 0; -+ -+ /* If this was the only register active, nothing is active -+ anymore. */ -+ if (lowest_active_reg == highest_active_reg) -+ { -+ lowest_active_reg = NO_LOWEST_ACTIVE_REG; -+ highest_active_reg = NO_HIGHEST_ACTIVE_REG; -+ } -+ else -+ { /* We must scan for the new highest active register, since -+ it isn't necessarily one less than now: consider -+ (a(b)c(d(e)f)g). When group 3 ends, after the f), the -+ new highest active register is 1. */ -+ UCHAR_T r = *p - 1; -+ while (r > 0 && !IS_ACTIVE (reg_info[r])) -+ r--; -+ -+ /* If we end up at register zero, that means that we saved -+ the registers as the result of an `on_failure_jump', not -+ a `start_memory', and we jumped to past the innermost -+ `stop_memory'. For example, in ((.)*) we save -+ registers 1 and 2 as a result of the *, but when we pop -+ back to the second ), we are at the stop_memory 1. -+ Thus, nothing is active. */ -+ if (r == 0) -+ { -+ lowest_active_reg = NO_LOWEST_ACTIVE_REG; -+ highest_active_reg = NO_HIGHEST_ACTIVE_REG; -+ } -+ else -+ highest_active_reg = r; -+ } -+ -+ /* If just failed to match something this time around with a -+ group that's operated on by a repetition operator, try to -+ force exit from the ``loop'', and restore the register -+ information for this group that we had before trying this -+ last match. */ -+ if ((!MATCHED_SOMETHING (reg_info[*p]) -+ || just_past_start_mem == p - 1) -+ && (p + 2) < pend) -+ { -+ boolean is_a_jump_n = false; -+ -+ p1 = p + 2; -+ mcnt = 0; -+ switch ((re_opcode_t) *p1++) -+ { -+ case jump_n: -+ is_a_jump_n = true; -+ case pop_failure_jump: -+ case maybe_pop_jump: -+ case jump: -+ case dummy_failure_jump: -+ EXTRACT_NUMBER_AND_INCR (mcnt, p1); -+ if (is_a_jump_n) -+ p1 += OFFSET_ADDRESS_SIZE; -+ break; -+ -+ default: -+ /* do nothing */ ; -+ } -+ p1 += mcnt; -+ -+ /* If the next operation is a jump backwards in the pattern -+ to an on_failure_jump right before the start_memory -+ corresponding to this stop_memory, exit from the loop -+ by forcing a failure after pushing on the stack the -+ on_failure_jump's jump in the pattern, and d. */ -+ if (mcnt < 0 && (re_opcode_t) *p1 == on_failure_jump -+ && (re_opcode_t) p1[1+OFFSET_ADDRESS_SIZE] == start_memory -+ && p1[2+OFFSET_ADDRESS_SIZE] == *p) -+ { -+ /* If this group ever matched anything, then restore -+ what its registers were before trying this last -+ failed match, e.g., with `(a*)*b' against `ab' for -+ regstart[1], and, e.g., with `((a*)*(b*)*)*' -+ against `aba' for regend[3]. -+ -+ Also restore the registers for inner groups for, -+ e.g., `((a*)(b*))*' against `aba' (register 3 would -+ otherwise get trashed). */ -+ -+ if (EVER_MATCHED_SOMETHING (reg_info[*p])) -+ { -+ unsigned r; -+ -+ EVER_MATCHED_SOMETHING (reg_info[*p]) = 0; -+ -+ /* Restore this and inner groups' (if any) registers. */ -+ for (r = *p; r < (unsigned) *p + (unsigned) *(p + 1); -+ r++) -+ { -+ regstart[r] = old_regstart[r]; -+ -+ /* xx why this test? */ -+ if (old_regend[r] >= regstart[r]) -+ regend[r] = old_regend[r]; -+ } -+ } -+ p1++; -+ EXTRACT_NUMBER_AND_INCR (mcnt, p1); -+ PUSH_FAILURE_POINT (p1 + mcnt, d, -2); -+ -+ goto fail; -+ } -+ } -+ -+ /* Move past the register number and the inner group count. */ -+ p += 2; -+ break; -+ -+ -+ /* \<digit> has been turned into a `duplicate' command which is -+ followed by the numeric value of <digit> as the register number. */ -+ case duplicate: -+ { -+ register const CHAR_T *d2, *dend2; -+ int regno = *p++; /* Get which register to match against. */ -+ DEBUG_PRINT2 ("EXECUTING duplicate %d.\n", regno); -+ -+ /* Can't back reference a group which we've never matched. */ -+ if (REG_UNSET (regstart[regno]) || REG_UNSET (regend[regno])) -+ goto fail; -+ -+ /* Where in input to try to start matching. */ -+ d2 = regstart[regno]; -+ -+ /* Where to stop matching; if both the place to start and -+ the place to stop matching are in the same string, then -+ set to the place to stop, otherwise, for now have to use -+ the end of the first string. */ -+ -+ dend2 = ((FIRST_STRING_P (regstart[regno]) -+ == FIRST_STRING_P (regend[regno])) -+ ? regend[regno] : end_match_1); -+ for (;;) -+ { -+ /* If necessary, advance to next segment in register -+ contents. */ -+ while (d2 == dend2) -+ { -+ if (dend2 == end_match_2) break; -+ if (dend2 == regend[regno]) break; -+ -+ /* End of string1 => advance to string2. */ -+ d2 = string2; -+ dend2 = regend[regno]; -+ } -+ /* At end of register contents => success */ -+ if (d2 == dend2) break; -+ -+ /* If necessary, advance to next segment in data. */ -+ PREFETCH (); -+ -+ /* How many characters left in this segment to match. */ -+ mcnt = dend - d; -+ -+ /* Want how many consecutive characters we can match in -+ one shot, so, if necessary, adjust the count. */ -+ if (mcnt > dend2 - d2) -+ mcnt = dend2 - d2; -+ -+ /* Compare that many; failure if mismatch, else move -+ past them. */ -+ if (translate -+ ? PREFIX(bcmp_translate) (d, d2, mcnt, translate) -+ : memcmp (d, d2, mcnt*sizeof(UCHAR_T))) -+ goto fail; -+ d += mcnt, d2 += mcnt; -+ -+ /* Do this because we've match some characters. */ -+ SET_REGS_MATCHED (); -+ } -+ } -+ break; -+ -+ -+ /* begline matches the empty string at the beginning of the string -+ (unless `not_bol' is set in `bufp'), and, if -+ `newline_anchor' is set, after newlines. */ -+ case begline: -+ DEBUG_PRINT1 ("EXECUTING begline.\n"); -+ -+ if (AT_STRINGS_BEG (d)) -+ { -+ if (!bufp->not_bol) break; -+ } -+ else if (d[-1] == '\n' && bufp->newline_anchor) -+ { -+ break; -+ } -+ /* In all other cases, we fail. */ -+ goto fail; -+ -+ -+ /* endline is the dual of begline. */ -+ case endline: -+ DEBUG_PRINT1 ("EXECUTING endline.\n"); -+ -+ if (AT_STRINGS_END (d)) -+ { -+ if (!bufp->not_eol) break; -+ } -+ -+ /* We have to ``prefetch'' the next character. */ -+ else if ((d == end1 ? *string2 : *d) == '\n' -+ && bufp->newline_anchor) -+ { -+ break; -+ } -+ goto fail; -+ -+ -+ /* Match at the very beginning of the data. */ -+ case begbuf: -+ DEBUG_PRINT1 ("EXECUTING begbuf.\n"); -+ if (AT_STRINGS_BEG (d)) -+ break; -+ goto fail; -+ -+ -+ /* Match at the very end of the data. */ -+ case endbuf: -+ DEBUG_PRINT1 ("EXECUTING endbuf.\n"); -+ if (AT_STRINGS_END (d)) -+ break; -+ goto fail; -+ -+ -+ /* on_failure_keep_string_jump is used to optimize `.*\n'. It -+ pushes NULL as the value for the string on the stack. Then -+ `pop_failure_point' will keep the current value for the -+ string, instead of restoring it. To see why, consider -+ matching `foo\nbar' against `.*\n'. The .* matches the foo; -+ then the . fails against the \n. But the next thing we want -+ to do is match the \n against the \n; if we restored the -+ string value, we would be back at the foo. -+ -+ Because this is used only in specific cases, we don't need to -+ check all the things that `on_failure_jump' does, to make -+ sure the right things get saved on the stack. Hence we don't -+ share its code. The only reason to push anything on the -+ stack at all is that otherwise we would have to change -+ `anychar's code to do something besides goto fail in this -+ case; that seems worse than this. */ -+ case on_failure_keep_string_jump: -+ DEBUG_PRINT1 ("EXECUTING on_failure_keep_string_jump"); -+ -+ EXTRACT_NUMBER_AND_INCR (mcnt, p); -+#ifdef _LIBC -+ DEBUG_PRINT3 (" %d (to %p):\n", mcnt, p + mcnt); -+#else -+ DEBUG_PRINT3 (" %d (to 0x%x):\n", mcnt, p + mcnt); -+#endif -+ -+ PUSH_FAILURE_POINT (p + mcnt, NULL, -2); -+ break; -+ -+ -+ /* Uses of on_failure_jump: -+ -+ Each alternative starts with an on_failure_jump that points -+ to the beginning of the next alternative. Each alternative -+ except the last ends with a jump that in effect jumps past -+ the rest of the alternatives. (They really jump to the -+ ending jump of the following alternative, because tensioning -+ these jumps is a hassle.) -+ -+ Repeats start with an on_failure_jump that points past both -+ the repetition text and either the following jump or -+ pop_failure_jump back to this on_failure_jump. */ -+ case on_failure_jump: -+ on_failure: -+ DEBUG_PRINT1 ("EXECUTING on_failure_jump"); -+ -+ EXTRACT_NUMBER_AND_INCR (mcnt, p); -+#ifdef _LIBC -+ DEBUG_PRINT3 (" %d (to %p)", mcnt, p + mcnt); -+#else -+ DEBUG_PRINT3 (" %d (to 0x%x)", mcnt, p + mcnt); -+#endif -+ -+ /* If this on_failure_jump comes right before a group (i.e., -+ the original * applied to a group), save the information -+ for that group and all inner ones, so that if we fail back -+ to this point, the group's information will be correct. -+ For example, in \(a*\)*\1, we need the preceding group, -+ and in \(zz\(a*\)b*\)\2, we need the inner group. */ -+ -+ /* We can't use `p' to check ahead because we push -+ a failure point to `p + mcnt' after we do this. */ -+ p1 = p; -+ -+ /* We need to skip no_op's before we look for the -+ start_memory in case this on_failure_jump is happening as -+ the result of a completed succeed_n, as in \(a\)\{1,3\}b\1 -+ against aba. */ -+ while (p1 < pend && (re_opcode_t) *p1 == no_op) -+ p1++; -+ -+ if (p1 < pend && (re_opcode_t) *p1 == start_memory) -+ { -+ /* We have a new highest active register now. This will -+ get reset at the start_memory we are about to get to, -+ but we will have saved all the registers relevant to -+ this repetition op, as described above. */ -+ highest_active_reg = *(p1 + 1) + *(p1 + 2); -+ if (lowest_active_reg == NO_LOWEST_ACTIVE_REG) -+ lowest_active_reg = *(p1 + 1); -+ } -+ -+ DEBUG_PRINT1 (":\n"); -+ PUSH_FAILURE_POINT (p + mcnt, d, -2); -+ break; -+ -+ -+ /* A smart repeat ends with `maybe_pop_jump'. -+ We change it to either `pop_failure_jump' or `jump'. */ -+ case maybe_pop_jump: -+ EXTRACT_NUMBER_AND_INCR (mcnt, p); -+ DEBUG_PRINT2 ("EXECUTING maybe_pop_jump %d.\n", mcnt); -+ { -+ register UCHAR_T *p2 = p; -+ -+ /* Compare the beginning of the repeat with what in the -+ pattern follows its end. If we can establish that there -+ is nothing that they would both match, i.e., that we -+ would have to backtrack because of (as in, e.g., `a*a') -+ then we can change to pop_failure_jump, because we'll -+ never have to backtrack. -+ -+ This is not true in the case of alternatives: in -+ `(a|ab)*' we do need to backtrack to the `ab' alternative -+ (e.g., if the string was `ab'). But instead of trying to -+ detect that here, the alternative has put on a dummy -+ failure point which is what we will end up popping. */ -+ -+ /* Skip over open/close-group commands. -+ If what follows this loop is a ...+ construct, -+ look at what begins its body, since we will have to -+ match at least one of that. */ -+ while (1) -+ { -+ if (p2 + 2 < pend -+ && ((re_opcode_t) *p2 == stop_memory -+ || (re_opcode_t) *p2 == start_memory)) -+ p2 += 3; -+ else if (p2 + 2 + 2 * OFFSET_ADDRESS_SIZE < pend -+ && (re_opcode_t) *p2 == dummy_failure_jump) -+ p2 += 2 + 2 * OFFSET_ADDRESS_SIZE; -+ else -+ break; -+ } -+ -+ p1 = p + mcnt; -+ /* p1[0] ... p1[2] are the `on_failure_jump' corresponding -+ to the `maybe_finalize_jump' of this case. Examine what -+ follows. */ -+ -+ /* If we're at the end of the pattern, we can change. */ -+ if (p2 == pend) -+ { -+ /* Consider what happens when matching ":\(.*\)" -+ against ":/". I don't really understand this code -+ yet. */ -+ p[-(1+OFFSET_ADDRESS_SIZE)] = (UCHAR_T) -+ pop_failure_jump; -+ DEBUG_PRINT1 -+ (" End of pattern: change to `pop_failure_jump'.\n"); -+ } -+ -+ else if ((re_opcode_t) *p2 == exactn -+#ifdef MBS_SUPPORT -+ || (re_opcode_t) *p2 == exactn_bin -+#endif -+ || (bufp->newline_anchor && (re_opcode_t) *p2 == endline)) -+ { -+ register UCHAR_T c -+ = *p2 == (UCHAR_T) endline ? '\n' : p2[2]; -+ -+ if (((re_opcode_t) p1[1+OFFSET_ADDRESS_SIZE] == exactn -+#ifdef MBS_SUPPORT -+ || (re_opcode_t) p1[1+OFFSET_ADDRESS_SIZE] == exactn_bin -+#endif -+ ) && p1[3+OFFSET_ADDRESS_SIZE] != c) -+ { -+ p[-(1+OFFSET_ADDRESS_SIZE)] = (UCHAR_T) -+ pop_failure_jump; -+#ifdef WCHAR -+ DEBUG_PRINT3 (" %C != %C => pop_failure_jump.\n", -+ (wint_t) c, -+ (wint_t) p1[3+OFFSET_ADDRESS_SIZE]); -+#else -+ DEBUG_PRINT3 (" %c != %c => pop_failure_jump.\n", -+ (char) c, -+ (char) p1[3+OFFSET_ADDRESS_SIZE]); -+#endif -+ } -+ -+#ifndef WCHAR -+ else if ((re_opcode_t) p1[3] == charset -+ || (re_opcode_t) p1[3] == charset_not) -+ { -+ int negate = (re_opcode_t) p1[3] == charset_not; -+ -+ if (c < (unsigned) (p1[4] * BYTEWIDTH) -+ && p1[5 + c / BYTEWIDTH] & (1 << (c % BYTEWIDTH))) -+ negate = !negate; -+ -+ /* `negate' is equal to 1 if c would match, which means -+ that we can't change to pop_failure_jump. */ -+ if (!negate) -+ { -+ p[-3] = (unsigned char) pop_failure_jump; -+ DEBUG_PRINT1 (" No match => pop_failure_jump.\n"); -+ } -+ } -+#endif /* not WCHAR */ -+ } -+#ifndef WCHAR -+ else if ((re_opcode_t) *p2 == charset) -+ { -+ /* We win if the first character of the loop is not part -+ of the charset. */ -+ if ((re_opcode_t) p1[3] == exactn -+ && ! ((int) p2[1] * BYTEWIDTH > (int) p1[5] -+ && (p2[2 + p1[5] / BYTEWIDTH] -+ & (1 << (p1[5] % BYTEWIDTH))))) -+ { -+ p[-3] = (unsigned char) pop_failure_jump; -+ DEBUG_PRINT1 (" No match => pop_failure_jump.\n"); -+ } -+ -+ else if ((re_opcode_t) p1[3] == charset_not) -+ { -+ int idx; -+ /* We win if the charset_not inside the loop -+ lists every character listed in the charset after. */ -+ for (idx = 0; idx < (int) p2[1]; idx++) -+ if (! (p2[2 + idx] == 0 -+ || (idx < (int) p1[4] -+ && ((p2[2 + idx] & ~ p1[5 + idx]) == 0)))) -+ break; -+ -+ if (idx == p2[1]) -+ { -+ p[-3] = (unsigned char) pop_failure_jump; -+ DEBUG_PRINT1 (" No match => pop_failure_jump.\n"); -+ } -+ } -+ else if ((re_opcode_t) p1[3] == charset) -+ { -+ int idx; -+ /* We win if the charset inside the loop -+ has no overlap with the one after the loop. */ -+ for (idx = 0; -+ idx < (int) p2[1] && idx < (int) p1[4]; -+ idx++) -+ if ((p2[2 + idx] & p1[5 + idx]) != 0) -+ break; -+ -+ if (idx == p2[1] || idx == p1[4]) -+ { -+ p[-3] = (unsigned char) pop_failure_jump; -+ DEBUG_PRINT1 (" No match => pop_failure_jump.\n"); -+ } -+ } -+ } -+#endif /* not WCHAR */ -+ } -+ p -= OFFSET_ADDRESS_SIZE; /* Point at relative address again. */ -+ if ((re_opcode_t) p[-1] != pop_failure_jump) -+ { -+ p[-1] = (UCHAR_T) jump; -+ DEBUG_PRINT1 (" Match => jump.\n"); -+ goto unconditional_jump; -+ } -+ /* Note fall through. */ -+ -+ -+ /* The end of a simple repeat has a pop_failure_jump back to -+ its matching on_failure_jump, where the latter will push a -+ failure point. The pop_failure_jump takes off failure -+ points put on by this pop_failure_jump's matching -+ on_failure_jump; we got through the pattern to here from the -+ matching on_failure_jump, so didn't fail. */ -+ case pop_failure_jump: -+ { -+ /* We need to pass separate storage for the lowest and -+ highest registers, even though we don't care about the -+ actual values. Otherwise, we will restore only one -+ register from the stack, since lowest will == highest in -+ `pop_failure_point'. */ -+ active_reg_t dummy_low_reg, dummy_high_reg; -+ UCHAR_T *pdummy __attribute__ ((unused)) = NULL; -+ const CHAR_T *sdummy __attribute__ ((unused)) = NULL; -+ -+ DEBUG_PRINT1 ("EXECUTING pop_failure_jump.\n"); -+ POP_FAILURE_POINT (sdummy, pdummy, -+ dummy_low_reg, dummy_high_reg, -+ reg_dummy, reg_dummy, reg_info_dummy); -+ } -+ /* Note fall through. */ -+ -+ unconditional_jump: -+#ifdef _LIBC -+ DEBUG_PRINT2 ("\n%p: ", p); -+#else -+ DEBUG_PRINT2 ("\n0x%x: ", p); -+#endif -+ /* Note fall through. */ -+ -+ /* Unconditionally jump (without popping any failure points). */ -+ case jump: -+ EXTRACT_NUMBER_AND_INCR (mcnt, p); /* Get the amount to jump. */ -+ DEBUG_PRINT2 ("EXECUTING jump %d ", mcnt); -+ p += mcnt; /* Do the jump. */ -+#ifdef _LIBC -+ DEBUG_PRINT2 ("(to %p).\n", p); -+#else -+ DEBUG_PRINT2 ("(to 0x%x).\n", p); -+#endif -+ break; -+ -+ -+ /* We need this opcode so we can detect where alternatives end -+ in `group_match_null_string_p' et al. */ -+ case jump_past_alt: -+ DEBUG_PRINT1 ("EXECUTING jump_past_alt.\n"); -+ goto unconditional_jump; -+ -+ -+ /* Normally, the on_failure_jump pushes a failure point, which -+ then gets popped at pop_failure_jump. We will end up at -+ pop_failure_jump, also, and with a pattern of, say, `a+', we -+ are skipping over the on_failure_jump, so we have to push -+ something meaningless for pop_failure_jump to pop. */ -+ case dummy_failure_jump: -+ DEBUG_PRINT1 ("EXECUTING dummy_failure_jump.\n"); -+ /* It doesn't matter what we push for the string here. What -+ the code at `fail' tests is the value for the pattern. */ -+ PUSH_FAILURE_POINT (NULL, NULL, -2); -+ goto unconditional_jump; -+ -+ -+ /* At the end of an alternative, we need to push a dummy failure -+ point in case we are followed by a `pop_failure_jump', because -+ we don't want the failure point for the alternative to be -+ popped. For example, matching `(a|ab)*' against `aab' -+ requires that we match the `ab' alternative. */ -+ case push_dummy_failure: -+ DEBUG_PRINT1 ("EXECUTING push_dummy_failure.\n"); -+ /* See comments just above at `dummy_failure_jump' about the -+ two zeroes. */ -+ PUSH_FAILURE_POINT (NULL, NULL, -2); -+ break; -+ -+ /* Have to succeed matching what follows at least n times. -+ After that, handle like `on_failure_jump'. */ -+ case succeed_n: -+ EXTRACT_NUMBER (mcnt, p + OFFSET_ADDRESS_SIZE); -+ DEBUG_PRINT2 ("EXECUTING succeed_n %d.\n", mcnt); -+ -+ assert (mcnt >= 0); -+ /* Originally, this is how many times we HAVE to succeed. */ -+ if (mcnt > 0) -+ { -+ mcnt--; -+ p += OFFSET_ADDRESS_SIZE; -+ STORE_NUMBER_AND_INCR (p, mcnt); -+#ifdef _LIBC -+ DEBUG_PRINT3 (" Setting %p to %d.\n", p - OFFSET_ADDRESS_SIZE -+ , mcnt); -+#else -+ DEBUG_PRINT3 (" Setting 0x%x to %d.\n", p - OFFSET_ADDRESS_SIZE -+ , mcnt); -+#endif -+ } -+ else if (mcnt == 0) -+ { -+#ifdef _LIBC -+ DEBUG_PRINT2 (" Setting two bytes from %p to no_op.\n", -+ p + OFFSET_ADDRESS_SIZE); -+#else -+ DEBUG_PRINT2 (" Setting two bytes from 0x%x to no_op.\n", -+ p + OFFSET_ADDRESS_SIZE); -+#endif /* _LIBC */ -+ -+#ifdef WCHAR -+ p[1] = (UCHAR_T) no_op; -+#else -+ p[2] = (UCHAR_T) no_op; -+ p[3] = (UCHAR_T) no_op; -+#endif /* WCHAR */ -+ goto on_failure; -+ } -+ break; -+ -+ case jump_n: -+ EXTRACT_NUMBER (mcnt, p + OFFSET_ADDRESS_SIZE); -+ DEBUG_PRINT2 ("EXECUTING jump_n %d.\n", mcnt); -+ -+ /* Originally, this is how many times we CAN jump. */ -+ if (mcnt) -+ { -+ mcnt--; -+ STORE_NUMBER (p + OFFSET_ADDRESS_SIZE, mcnt); -+ -+#ifdef _LIBC -+ DEBUG_PRINT3 (" Setting %p to %d.\n", p + OFFSET_ADDRESS_SIZE, -+ mcnt); -+#else -+ DEBUG_PRINT3 (" Setting 0x%x to %d.\n", p + OFFSET_ADDRESS_SIZE, -+ mcnt); -+#endif /* _LIBC */ -+ goto unconditional_jump; -+ } -+ /* If don't have to jump any more, skip over the rest of command. */ -+ else -+ p += 2 * OFFSET_ADDRESS_SIZE; -+ break; -+ -+ case set_number_at: -+ { -+ DEBUG_PRINT1 ("EXECUTING set_number_at.\n"); -+ -+ EXTRACT_NUMBER_AND_INCR (mcnt, p); -+ p1 = p + mcnt; -+ EXTRACT_NUMBER_AND_INCR (mcnt, p); -+#ifdef _LIBC -+ DEBUG_PRINT3 (" Setting %p to %d.\n", p1, mcnt); -+#else -+ DEBUG_PRINT3 (" Setting 0x%x to %d.\n", p1, mcnt); -+#endif -+ STORE_NUMBER (p1, mcnt); -+ break; -+ } -+ -+#if 0 -+ /* The DEC Alpha C compiler 3.x generates incorrect code for the -+ test WORDCHAR_P (d - 1) != WORDCHAR_P (d) in the expansion of -+ AT_WORD_BOUNDARY, so this code is disabled. Expanding the -+ macro and introducing temporary variables works around the bug. */ -+ -+ case wordbound: -+ DEBUG_PRINT1 ("EXECUTING wordbound.\n"); -+ if (AT_WORD_BOUNDARY (d)) -+ break; -+ goto fail; -+ -+ case notwordbound: -+ DEBUG_PRINT1 ("EXECUTING notwordbound.\n"); -+ if (AT_WORD_BOUNDARY (d)) -+ goto fail; -+ break; -+#else -+ case wordbound: -+ { -+ boolean prevchar, thischar; -+ -+ DEBUG_PRINT1 ("EXECUTING wordbound.\n"); -+ if (AT_STRINGS_BEG (d) || AT_STRINGS_END (d)) -+ break; -+ -+ prevchar = WORDCHAR_P (d - 1); -+ thischar = WORDCHAR_P (d); -+ if (prevchar != thischar) -+ break; -+ goto fail; -+ } -+ -+ case notwordbound: -+ { -+ boolean prevchar, thischar; -+ -+ DEBUG_PRINT1 ("EXECUTING notwordbound.\n"); -+ if (AT_STRINGS_BEG (d) || AT_STRINGS_END (d)) -+ goto fail; -+ -+ prevchar = WORDCHAR_P (d - 1); -+ thischar = WORDCHAR_P (d); -+ if (prevchar != thischar) -+ goto fail; -+ break; -+ } -+#endif -+ -+ case wordbeg: -+ DEBUG_PRINT1 ("EXECUTING wordbeg.\n"); -+ if (!AT_STRINGS_END (d) && WORDCHAR_P (d) -+ && (AT_STRINGS_BEG (d) || !WORDCHAR_P (d - 1))) -+ break; -+ goto fail; -+ -+ case wordend: -+ DEBUG_PRINT1 ("EXECUTING wordend.\n"); -+ if (!AT_STRINGS_BEG (d) && WORDCHAR_P (d - 1) -+ && (AT_STRINGS_END (d) || !WORDCHAR_P (d))) -+ break; -+ goto fail; -+ -+#ifdef emacs -+ case before_dot: -+ DEBUG_PRINT1 ("EXECUTING before_dot.\n"); -+ if (PTR_CHAR_POS ((unsigned char *) d) >= point) -+ goto fail; -+ break; -+ -+ case at_dot: -+ DEBUG_PRINT1 ("EXECUTING at_dot.\n"); -+ if (PTR_CHAR_POS ((unsigned char *) d) != point) -+ goto fail; -+ break; -+ -+ case after_dot: -+ DEBUG_PRINT1 ("EXECUTING after_dot.\n"); -+ if (PTR_CHAR_POS ((unsigned char *) d) <= point) -+ goto fail; -+ break; -+ -+ case syntaxspec: -+ DEBUG_PRINT2 ("EXECUTING syntaxspec %d.\n", mcnt); -+ mcnt = *p++; -+ goto matchsyntax; -+ -+ case wordchar: -+ DEBUG_PRINT1 ("EXECUTING Emacs wordchar.\n"); -+ mcnt = (int) Sword; -+ matchsyntax: -+ PREFETCH (); -+ /* Can't use *d++ here; SYNTAX may be an unsafe macro. */ -+ d++; -+ if (SYNTAX (d[-1]) != (enum syntaxcode) mcnt) -+ goto fail; -+ SET_REGS_MATCHED (); -+ break; -+ -+ case notsyntaxspec: -+ DEBUG_PRINT2 ("EXECUTING notsyntaxspec %d.\n", mcnt); -+ mcnt = *p++; -+ goto matchnotsyntax; -+ -+ case notwordchar: -+ DEBUG_PRINT1 ("EXECUTING Emacs notwordchar.\n"); -+ mcnt = (int) Sword; -+ matchnotsyntax: -+ PREFETCH (); -+ /* Can't use *d++ here; SYNTAX may be an unsafe macro. */ -+ d++; -+ if (SYNTAX (d[-1]) == (enum syntaxcode) mcnt) -+ goto fail; -+ SET_REGS_MATCHED (); -+ break; -+ -+#else /* not emacs */ -+ case wordchar: -+ DEBUG_PRINT1 ("EXECUTING non-Emacs wordchar.\n"); -+ PREFETCH (); -+ if (!WORDCHAR_P (d)) -+ goto fail; -+ SET_REGS_MATCHED (); -+ d++; -+ break; -+ -+ case notwordchar: -+ DEBUG_PRINT1 ("EXECUTING non-Emacs notwordchar.\n"); -+ PREFETCH (); -+ if (WORDCHAR_P (d)) -+ goto fail; -+ SET_REGS_MATCHED (); -+ d++; -+ break; -+#endif /* not emacs */ -+ -+ default: -+ abort (); -+ } -+ continue; /* Successfully executed one pattern command; keep going. */ -+ -+ -+ /* We goto here if a matching operation fails. */ -+ fail: -+ if (!FAIL_STACK_EMPTY ()) -+ { /* A restart point is known. Restore to that state. */ -+ DEBUG_PRINT1 ("\nFAIL:\n"); -+ POP_FAILURE_POINT (d, p, -+ lowest_active_reg, highest_active_reg, -+ regstart, regend, reg_info); -+ -+ /* If this failure point is a dummy, try the next one. */ -+ if (!p) -+ goto fail; -+ -+ /* If we failed to the end of the pattern, don't examine *p. */ -+ assert (p <= pend); -+ if (p < pend) -+ { -+ boolean is_a_jump_n = false; -+ -+ /* If failed to a backwards jump that's part of a repetition -+ loop, need to pop this failure point and use the next one. */ -+ switch ((re_opcode_t) *p) -+ { -+ case jump_n: -+ is_a_jump_n = true; -+ case maybe_pop_jump: -+ case pop_failure_jump: -+ case jump: -+ p1 = p + 1; -+ EXTRACT_NUMBER_AND_INCR (mcnt, p1); -+ p1 += mcnt; -+ -+ if ((is_a_jump_n && (re_opcode_t) *p1 == succeed_n) -+ || (!is_a_jump_n -+ && (re_opcode_t) *p1 == on_failure_jump)) -+ goto fail; -+ break; -+ default: -+ /* do nothing */ ; -+ } -+ } -+ -+ if (d >= string1 && d <= end1) -+ dend = end_match_1; -+ } -+ else -+ break; /* Matching at this starting point really fails. */ -+ } /* for (;;) */ -+ -+ if (best_regs_set) -+ goto restore_best_regs; -+ -+ FREE_VARIABLES (); -+ -+ return -1; /* Failure to match. */ -+} /* re_match_2 */ -+ -+/* Subroutine definitions for re_match_2. */ -+ -+ -+/* We are passed P pointing to a register number after a start_memory. -+ -+ Return true if the pattern up to the corresponding stop_memory can -+ match the empty string, and false otherwise. -+ -+ If we find the matching stop_memory, sets P to point to one past its number. -+ Otherwise, sets P to an undefined byte less than or equal to END. -+ -+ We don't handle duplicates properly (yet). */ -+ -+static boolean -+PREFIX(group_match_null_string_p) (UCHAR_T **p, UCHAR_T *end, -+ PREFIX(register_info_type) *reg_info) -+{ -+ int mcnt; -+ /* Point to after the args to the start_memory. */ -+ UCHAR_T *p1 = *p + 2; -+ -+ while (p1 < end) -+ { -+ /* Skip over opcodes that can match nothing, and return true or -+ false, as appropriate, when we get to one that can't, or to the -+ matching stop_memory. */ -+ -+ switch ((re_opcode_t) *p1) -+ { -+ /* Could be either a loop or a series of alternatives. */ -+ case on_failure_jump: -+ p1++; -+ EXTRACT_NUMBER_AND_INCR (mcnt, p1); -+ -+ /* If the next operation is not a jump backwards in the -+ pattern. */ -+ -+ if (mcnt >= 0) -+ { -+ /* Go through the on_failure_jumps of the alternatives, -+ seeing if any of the alternatives cannot match nothing. -+ The last alternative starts with only a jump, -+ whereas the rest start with on_failure_jump and end -+ with a jump, e.g., here is the pattern for `a|b|c': -+ -+ /on_failure_jump/0/6/exactn/1/a/jump_past_alt/0/6 -+ /on_failure_jump/0/6/exactn/1/b/jump_past_alt/0/3 -+ /exactn/1/c -+ -+ So, we have to first go through the first (n-1) -+ alternatives and then deal with the last one separately. */ -+ -+ -+ /* Deal with the first (n-1) alternatives, which start -+ with an on_failure_jump (see above) that jumps to right -+ past a jump_past_alt. */ -+ -+ while ((re_opcode_t) p1[mcnt-(1+OFFSET_ADDRESS_SIZE)] == -+ jump_past_alt) -+ { -+ /* `mcnt' holds how many bytes long the alternative -+ is, including the ending `jump_past_alt' and -+ its number. */ -+ -+ if (!PREFIX(alt_match_null_string_p) (p1, p1 + mcnt - -+ (1 + OFFSET_ADDRESS_SIZE), -+ reg_info)) -+ return false; -+ -+ /* Move to right after this alternative, including the -+ jump_past_alt. */ -+ p1 += mcnt; -+ -+ /* Break if it's the beginning of an n-th alternative -+ that doesn't begin with an on_failure_jump. */ -+ if ((re_opcode_t) *p1 != on_failure_jump) -+ break; -+ -+ /* Still have to check that it's not an n-th -+ alternative that starts with an on_failure_jump. */ -+ p1++; -+ EXTRACT_NUMBER_AND_INCR (mcnt, p1); -+ if ((re_opcode_t) p1[mcnt-(1+OFFSET_ADDRESS_SIZE)] != -+ jump_past_alt) -+ { -+ /* Get to the beginning of the n-th alternative. */ -+ p1 -= 1 + OFFSET_ADDRESS_SIZE; -+ break; -+ } -+ } -+ -+ /* Deal with the last alternative: go back and get number -+ of the `jump_past_alt' just before it. `mcnt' contains -+ the length of the alternative. */ -+ EXTRACT_NUMBER (mcnt, p1 - OFFSET_ADDRESS_SIZE); -+ -+ if (!PREFIX(alt_match_null_string_p) (p1, p1 + mcnt, reg_info)) -+ return false; -+ -+ p1 += mcnt; /* Get past the n-th alternative. */ -+ } /* if mcnt > 0 */ -+ break; -+ -+ -+ case stop_memory: -+ assert (p1[1] == **p); -+ *p = p1 + 2; -+ return true; -+ -+ -+ default: -+ if (!PREFIX(common_op_match_null_string_p) (&p1, end, reg_info)) -+ return false; -+ } -+ } /* while p1 < end */ -+ -+ return false; -+} /* group_match_null_string_p */ -+ -+ -+/* Similar to group_match_null_string_p, but doesn't deal with alternatives: -+ It expects P to be the first byte of a single alternative and END one -+ byte past the last. The alternative can contain groups. */ -+ -+static boolean -+PREFIX(alt_match_null_string_p) (UCHAR_T *p, UCHAR_T *end, -+ PREFIX(register_info_type) *reg_info) -+{ -+ int mcnt; -+ UCHAR_T *p1 = p; -+ -+ while (p1 < end) -+ { -+ /* Skip over opcodes that can match nothing, and break when we get -+ to one that can't. */ -+ -+ switch ((re_opcode_t) *p1) -+ { -+ /* It's a loop. */ -+ case on_failure_jump: -+ p1++; -+ EXTRACT_NUMBER_AND_INCR (mcnt, p1); -+ p1 += mcnt; -+ break; -+ -+ default: -+ if (!PREFIX(common_op_match_null_string_p) (&p1, end, reg_info)) -+ return false; -+ } -+ } /* while p1 < end */ -+ -+ return true; -+} /* alt_match_null_string_p */ -+ -+ -+/* Deals with the ops common to group_match_null_string_p and -+ alt_match_null_string_p. -+ -+ Sets P to one after the op and its arguments, if any. */ -+ -+static boolean -+PREFIX(common_op_match_null_string_p) (UCHAR_T **p, UCHAR_T *end, -+ PREFIX(register_info_type) *reg_info) -+{ -+ int mcnt; -+ boolean ret; -+ int reg_no; -+ UCHAR_T *p1 = *p; -+ -+ switch ((re_opcode_t) *p1++) -+ { -+ case no_op: -+ case begline: -+ case endline: -+ case begbuf: -+ case endbuf: -+ case wordbeg: -+ case wordend: -+ case wordbound: -+ case notwordbound: -+#ifdef emacs -+ case before_dot: -+ case at_dot: -+ case after_dot: -+#endif -+ break; -+ -+ case start_memory: -+ reg_no = *p1; -+ assert (reg_no > 0 && reg_no <= MAX_REGNUM); -+ ret = PREFIX(group_match_null_string_p) (&p1, end, reg_info); -+ -+ /* Have to set this here in case we're checking a group which -+ contains a group and a back reference to it. */ -+ -+ if (REG_MATCH_NULL_STRING_P (reg_info[reg_no]) == MATCH_NULL_UNSET_VALUE) -+ REG_MATCH_NULL_STRING_P (reg_info[reg_no]) = ret; -+ -+ if (!ret) -+ return false; -+ break; -+ -+ /* If this is an optimized succeed_n for zero times, make the jump. */ -+ case jump: -+ EXTRACT_NUMBER_AND_INCR (mcnt, p1); -+ if (mcnt >= 0) -+ p1 += mcnt; -+ else -+ return false; -+ break; -+ -+ case succeed_n: -+ /* Get to the number of times to succeed. */ -+ p1 += OFFSET_ADDRESS_SIZE; -+ EXTRACT_NUMBER_AND_INCR (mcnt, p1); -+ -+ if (mcnt == 0) -+ { -+ p1 -= 2 * OFFSET_ADDRESS_SIZE; -+ EXTRACT_NUMBER_AND_INCR (mcnt, p1); -+ p1 += mcnt; -+ } -+ else -+ return false; -+ break; -+ -+ case duplicate: -+ if (!REG_MATCH_NULL_STRING_P (reg_info[*p1])) -+ return false; -+ break; -+ -+ case set_number_at: -+ p1 += 2 * OFFSET_ADDRESS_SIZE; -+ -+ default: -+ /* All other opcodes mean we cannot match the empty string. */ -+ return false; -+ } -+ -+ *p = p1; -+ return true; -+} /* common_op_match_null_string_p */ -+ -+ -+/* Return zero if TRANSLATE[S1] and TRANSLATE[S2] are identical for LEN -+ bytes; nonzero otherwise. */ -+ -+static int -+PREFIX(bcmp_translate) (const CHAR_T *s1, const CHAR_T *s2, register int len, -+ RE_TRANSLATE_TYPE translate) -+{ -+ register const UCHAR_T *p1 = (const UCHAR_T *) s1; -+ register const UCHAR_T *p2 = (const UCHAR_T *) s2; -+ while (len) -+ { -+#ifdef WCHAR -+ if (((*p1<=0xff)?translate[*p1++]:*p1++) -+ != ((*p2<=0xff)?translate[*p2++]:*p2++)) -+ return 1; -+#else /* BYTE */ -+ if (translate[*p1++] != translate[*p2++]) return 1; -+#endif /* WCHAR */ -+ len--; -+ } -+ return 0; -+} -+ -+ -+#else /* not INSIDE_RECURSION */ -+ -+/* Entry points for GNU code. */ -+ -+/* re_compile_pattern is the GNU regular expression compiler: it -+ compiles PATTERN (of length SIZE) and puts the result in BUFP. -+ Returns 0 if the pattern was valid, otherwise an error string. -+ -+ Assumes the `allocated' (and perhaps `buffer') and `translate' fields -+ are set in BUFP on entry. -+ -+ We call regex_compile to do the actual compilation. */ -+ -+const char * -+re_compile_pattern (const char *pattern, size_t length, -+ struct re_pattern_buffer *bufp) -+{ -+ reg_errcode_t ret; -+ -+ /* GNU code is written to assume at least RE_NREGS registers will be set -+ (and at least one extra will be -1). */ -+ bufp->regs_allocated = REGS_UNALLOCATED; -+ -+ /* And GNU code determines whether or not to get register information -+ by passing null for the REGS argument to re_match, etc., not by -+ setting no_sub. */ -+ bufp->no_sub = 0; -+ -+ /* Match anchors at newline. */ -+ bufp->newline_anchor = 1; -+ -+# ifdef MBS_SUPPORT -+ if (MB_CUR_MAX != 1) -+ ret = wcs_regex_compile (pattern, length, re_syntax_options, bufp); -+ else -+# endif -+ ret = byte_regex_compile (pattern, length, re_syntax_options, bufp); -+ -+ if (!ret) -+ return NULL; -+ return gettext (re_error_msgid[(int) ret]); -+} -+#ifdef _LIBC -+weak_alias (__re_compile_pattern, re_compile_pattern) -+#endif -+ -+/* Entry points compatible with 4.2 BSD regex library. We don't define -+ them unless specifically requested. */ -+ -+#if defined _REGEX_RE_COMP || defined _LIBC -+ -+/* BSD has one and only one pattern buffer. */ -+static struct re_pattern_buffer re_comp_buf; -+ -+char * -+#ifdef _LIBC -+/* Make these definitions weak in libc, so POSIX programs can redefine -+ these names if they don't use our functions, and still use -+ regcomp/regexec below without link errors. */ -+weak_function -+#endif -+re_comp (const char *s) -+{ -+ reg_errcode_t ret; -+ -+ if (!s) -+ { -+ if (!re_comp_buf.buffer) -+ return (char *) gettext ("No previous regular expression"); -+ return 0; -+ } -+ -+ if (!re_comp_buf.buffer) -+ { -+ re_comp_buf.buffer = (unsigned char *) malloc (200); -+ if (re_comp_buf.buffer == NULL) -+ return (char *) gettext (re_error_msgid[(int) REG_ESPACE]); -+ re_comp_buf.allocated = 200; -+ -+ re_comp_buf.fastmap = (char *) malloc (1 << BYTEWIDTH); -+ if (re_comp_buf.fastmap == NULL) -+ return (char *) gettext (re_error_msgid[(int) REG_ESPACE]); -+ } -+ -+ /* Since `re_exec' always passes NULL for the `regs' argument, we -+ don't need to initialize the pattern buffer fields which affect it. */ -+ -+ /* Match anchors at newlines. */ -+ re_comp_buf.newline_anchor = 1; -+ -+# ifdef MBS_SUPPORT -+ if (MB_CUR_MAX != 1) -+ ret = wcs_regex_compile (s, strlen (s), re_syntax_options, &re_comp_buf); -+ else -+# endif -+ ret = byte_regex_compile (s, strlen (s), re_syntax_options, &re_comp_buf); -+ -+ if (!ret) -+ return NULL; -+ -+ /* Yes, we're discarding `const' here if !HAVE_LIBINTL. */ -+ return (char *) gettext (re_error_msgid[(int) ret]); -+} -+ -+ -+int -+#ifdef _LIBC -+weak_function -+#endif -+re_exec (const char *s) -+{ -+ const int len = strlen (s); -+ return -+ 0 <= re_search (&re_comp_buf, s, len, 0, len, (struct re_registers *) 0); -+} -+ -+#endif /* _REGEX_RE_COMP */ -+ -+/* POSIX.2 functions. Don't define these for Emacs. */ -+ -+#ifndef emacs -+ -+/* regcomp takes a regular expression as a string and compiles it. -+ -+ PREG is a regex_t *. We do not expect any fields to be initialized, -+ since POSIX says we shouldn't. Thus, we set -+ -+ `buffer' to the compiled pattern; -+ `used' to the length of the compiled pattern; -+ `syntax' to RE_SYNTAX_POSIX_EXTENDED if the -+ REG_EXTENDED bit in CFLAGS is set; otherwise, to -+ RE_SYNTAX_POSIX_BASIC; -+ `newline_anchor' to REG_NEWLINE being set in CFLAGS; -+ `fastmap' to an allocated space for the fastmap; -+ `fastmap_accurate' to zero; -+ `re_nsub' to the number of subexpressions in PATTERN. -+ -+ PATTERN is the address of the pattern string. -+ -+ CFLAGS is a series of bits which affect compilation. -+ -+ If REG_EXTENDED is set, we use POSIX extended syntax; otherwise, we -+ use POSIX basic syntax. -+ -+ If REG_NEWLINE is set, then . and [^...] don't match newline. -+ Also, regexec will try a match beginning after every newline. -+ -+ If REG_ICASE is set, then we considers upper- and lowercase -+ versions of letters to be equivalent when matching. -+ -+ If REG_NOSUB is set, then when PREG is passed to regexec, that -+ routine will report only success or failure, and nothing about the -+ registers. -+ -+ It returns 0 if it succeeds, nonzero if it doesn't. (See regex.h for -+ the return codes and their meanings.) */ -+ -+int -+regcomp (regex_t *preg, const char *pattern, int cflags) -+{ -+ reg_errcode_t ret; -+ reg_syntax_t syntax -+ = (cflags & REG_EXTENDED) ? -+ RE_SYNTAX_POSIX_EXTENDED : RE_SYNTAX_POSIX_BASIC; -+ -+ /* regex_compile will allocate the space for the compiled pattern. */ -+ preg->buffer = 0; -+ preg->allocated = 0; -+ preg->used = 0; -+ -+ /* Try to allocate space for the fastmap. */ -+ preg->fastmap = (char *) malloc (1 << BYTEWIDTH); -+ -+ if (cflags & REG_ICASE) -+ { -+ int i; -+ -+ preg->translate -+ = (RE_TRANSLATE_TYPE) malloc (CHAR_SET_SIZE -+ * sizeof (*(RE_TRANSLATE_TYPE)0)); -+ if (preg->translate == NULL) -+ return (int) REG_ESPACE; -+ -+ /* Map uppercase characters to corresponding lowercase ones. */ -+ for (i = 0; i < CHAR_SET_SIZE; i++) -+ preg->translate[i] = ISUPPER (i) ? TOLOWER (i) : i; -+ } -+ else -+ preg->translate = NULL; -+ -+ /* If REG_NEWLINE is set, newlines are treated differently. */ -+ if (cflags & REG_NEWLINE) -+ { /* REG_NEWLINE implies neither . nor [^...] match newline. */ -+ syntax &= ~RE_DOT_NEWLINE; -+ syntax |= RE_HAT_LISTS_NOT_NEWLINE; -+ /* It also changes the matching behavior. */ -+ preg->newline_anchor = 1; -+ } -+ else -+ preg->newline_anchor = 0; -+ -+ preg->no_sub = !!(cflags & REG_NOSUB); -+ -+ /* POSIX says a null character in the pattern terminates it, so we -+ can use strlen here in compiling the pattern. */ -+# ifdef MBS_SUPPORT -+ if (MB_CUR_MAX != 1) -+ ret = wcs_regex_compile (pattern, strlen (pattern), syntax, preg); -+ else -+# endif -+ ret = byte_regex_compile (pattern, strlen (pattern), syntax, preg); -+ -+ /* POSIX doesn't distinguish between an unmatched open-group and an -+ unmatched close-group: both are REG_EPAREN. */ -+ if (ret == REG_ERPAREN) ret = REG_EPAREN; -+ -+ if (ret == REG_NOERROR && preg->fastmap) -+ { -+ /* Compute the fastmap now, since regexec cannot modify the pattern -+ buffer. */ -+ if (re_compile_fastmap (preg) == -2) -+ { -+ /* Some error occurred while computing the fastmap, just forget -+ about it. */ -+ free (preg->fastmap); -+ preg->fastmap = NULL; -+ } -+ } -+ -+ return (int) ret; -+} -+#ifdef _LIBC -+weak_alias (__regcomp, regcomp) -+#endif -+ -+ -+/* regexec searches for a given pattern, specified by PREG, in the -+ string STRING. -+ -+ If NMATCH is zero or REG_NOSUB was set in the cflags argument to -+ `regcomp', we ignore PMATCH. Otherwise, we assume PMATCH has at -+ least NMATCH elements, and we set them to the offsets of the -+ corresponding matched substrings. -+ -+ EFLAGS specifies `execution flags' which affect matching: if -+ REG_NOTBOL is set, then ^ does not match at the beginning of the -+ string; if REG_NOTEOL is set, then $ does not match at the end. -+ -+ We return 0 if we find a match and REG_NOMATCH if not. */ -+ -+int -+regexec (const regex_t *preg, const char *string, size_t nmatch, -+ regmatch_t pmatch[], int eflags) -+{ -+ int ret; -+ struct re_registers regs; -+ regex_t private_preg; -+ int len = strlen (string); -+ boolean want_reg_info = !preg->no_sub && nmatch > 0; -+ -+ private_preg = *preg; -+ -+ private_preg.not_bol = !!(eflags & REG_NOTBOL); -+ private_preg.not_eol = !!(eflags & REG_NOTEOL); -+ -+ /* The user has told us exactly how many registers to return -+ information about, via `nmatch'. We have to pass that on to the -+ matching routines. */ -+ private_preg.regs_allocated = REGS_FIXED; -+ -+ if (want_reg_info) -+ { -+ regs.num_regs = nmatch; -+ regs.start = TALLOC (nmatch * 2, regoff_t); -+ if (regs.start == NULL) -+ return (int) REG_NOMATCH; -+ regs.end = regs.start + nmatch; -+ } -+ -+ /* Perform the searching operation. */ -+ ret = re_search (&private_preg, string, len, -+ /* start: */ 0, /* range: */ len, -+ want_reg_info ? ®s : (struct re_registers *) 0); -+ -+ /* Copy the register information to the POSIX structure. */ -+ if (want_reg_info) -+ { -+ if (ret >= 0) -+ { -+ unsigned r; -+ -+ for (r = 0; r < nmatch; r++) -+ { -+ pmatch[r].rm_so = regs.start[r]; -+ pmatch[r].rm_eo = regs.end[r]; -+ } -+ } -+ -+ /* If we needed the temporary register info, free the space now. */ -+ free (regs.start); -+ } -+ -+ /* We want zero return to mean success, unlike `re_search'. */ -+ return ret >= 0 ? (int) REG_NOERROR : (int) REG_NOMATCH; -+} -+#ifdef _LIBC -+/* EGLIBC: This is handled in regexec-compat.c. */ -+/*weak_alias (__regexec, regexec)*/ -+#include "regexec-compat.c" -+#endif -+ -+ -+/* Returns a message corresponding to an error code, ERRCODE, returned -+ from either regcomp or regexec. We don't use PREG here. */ -+ -+size_t -+regerror (int errcode, const regex_t *preg __attribute__ ((unused)), -+ char *errbuf, size_t errbuf_size) -+{ -+ const char *msg; -+ size_t msg_size; -+ -+ if (errcode < 0 -+ || errcode >= (int) (sizeof (re_error_msgid) -+ / sizeof (re_error_msgid[0]))) -+ /* Only error codes returned by the rest of the code should be passed -+ to this routine. If we are given anything else, or if other regex -+ code generates an invalid error code, then the program has a bug. -+ Dump core so we can fix it. */ -+ abort (); -+ -+ msg = gettext (re_error_msgid[errcode]); -+ -+ msg_size = strlen (msg) + 1; /* Includes the null. */ -+ -+ if (errbuf_size != 0) -+ { -+ if (msg_size > errbuf_size) -+ { -+#if defined HAVE_MEMPCPY || defined _LIBC -+ *((char *) mempcpy (errbuf, msg, errbuf_size - 1)) = '\0'; -+#else -+ memcpy (errbuf, msg, errbuf_size - 1); -+ errbuf[errbuf_size - 1] = 0; -+#endif -+ } -+ else -+ memcpy (errbuf, msg, msg_size); -+ } -+ -+ return msg_size; -+} -+#ifdef _LIBC -+weak_alias (__regerror, regerror) -+#endif -+ -+ -+/* Free dynamically allocated space used by PREG. */ -+ -+void -+regfree (regex_t *preg) -+{ -+ if (preg->buffer != NULL) -+ free (preg->buffer); -+ preg->buffer = NULL; -+ -+ preg->allocated = 0; -+ preg->used = 0; -+ -+ if (preg->fastmap != NULL) -+ free (preg->fastmap); -+ preg->fastmap = NULL; -+ preg->fastmap_accurate = 0; -+ -+ if (preg->translate != NULL) -+ free (preg->translate); -+ preg->translate = NULL; -+} -+#ifdef _LIBC -+weak_alias (__regfree, regfree) -+#endif -+ -+#endif /* not emacs */ -+ -+#endif /* not INSIDE_RECURSION */ -+ -+ -+#undef STORE_NUMBER -+#undef STORE_NUMBER_AND_INCR -+#undef EXTRACT_NUMBER -+#undef EXTRACT_NUMBER_AND_INCR -+ -+#undef DEBUG_PRINT_COMPILED_PATTERN -+#undef DEBUG_PRINT_DOUBLE_STRING -+ -+#undef INIT_FAIL_STACK -+#undef RESET_FAIL_STACK -+#undef DOUBLE_FAIL_STACK -+#undef PUSH_PATTERN_OP -+#undef PUSH_FAILURE_POINTER -+#undef PUSH_FAILURE_INT -+#undef PUSH_FAILURE_ELT -+#undef POP_FAILURE_POINTER -+#undef POP_FAILURE_INT -+#undef POP_FAILURE_ELT -+#undef DEBUG_PUSH -+#undef DEBUG_POP -+#undef PUSH_FAILURE_POINT -+#undef POP_FAILURE_POINT -+ -+#undef REG_UNSET_VALUE -+#undef REG_UNSET -+ -+#undef PATFETCH -+#undef PATFETCH_RAW -+#undef PATUNFETCH -+#undef TRANSLATE -+ -+#undef INIT_BUF_SIZE -+#undef GET_BUFFER_SPACE -+#undef BUF_PUSH -+#undef BUF_PUSH_2 -+#undef BUF_PUSH_3 -+#undef STORE_JUMP -+#undef STORE_JUMP2 -+#undef INSERT_JUMP -+#undef INSERT_JUMP2 -+#undef EXTEND_BUFFER -+#undef GET_UNSIGNED_NUMBER -+#undef FREE_STACK_RETURN -+ -+# undef POINTER_TO_OFFSET -+# undef MATCHING_IN_FRST_STRING -+# undef PREFETCH -+# undef AT_STRINGS_BEG -+# undef AT_STRINGS_END -+# undef WORDCHAR_P -+# undef FREE_VAR -+# undef FREE_VARIABLES -+# undef NO_HIGHEST_ACTIVE_REG -+# undef NO_LOWEST_ACTIVE_REG -+ -+# undef CHAR_T -+# undef UCHAR_T -+# undef COMPILED_BUFFER_VAR -+# undef OFFSET_ADDRESS_SIZE -+# undef CHAR_CLASS_SIZE -+# undef PREFIX -+# undef ARG_PREFIX -+# undef PUT_CHAR -+# undef BYTE -+# undef WCHAR -+ -+# define DEFINED_ONCE -diff --git a/pwd/Makefile b/pwd/Makefile -index 7f6de03..916d546 100644 ---- a/pwd/Makefile -+++ b/pwd/Makefile -@@ -18,6 +18,8 @@ - # - # Sub-makefile for pwd portion of the library. - # -+include ../option-groups.mak -+ - subdir := pwd - - include ../Makeconfig -diff --git a/resolv/Makefile b/resolv/Makefile -index 1dcb75f..2e4b630 100644 ---- a/resolv/Makefile -+++ b/resolv/Makefile -@@ -18,6 +18,8 @@ - # - # Sub-makefile for resolv portion of the library. - # -+include ../option-groups.mak -+ - subdir := resolv - - include ../Makeconfig -@@ -27,21 +29,22 @@ headers := resolv.h \ - arpa/nameser.h arpa/nameser_compat.h \ - sys/bitypes.h - --routines := herror inet_addr inet_ntop inet_pton nsap_addr res_init \ -- res_hconf res_libc res-state -+routines-$(OPTION_EGLIBC_INET) \ -+ += herror inet_addr inet_ntop inet_pton nsap_addr res_init \ -+ res_hconf res_libc res-state - --tests = tst-aton tst-leaks tst-inet_ntop --xtests = tst-leaks2 -+tests-$(OPTION_EGLIBC_INET) += tst-aton tst-leaks tst-inet_ntop -+xtests-$(OPTION_EGLIBC_INET) += tst-leaks2 - - generate := mtrace-tst-leaks.out tst-leaks.mtrace tst-leaks2.mtrace - --extra-libs := libresolv libnss_dns -+extra-libs-$(OPTION_EGLIBC_INET) += libresolv libnss_dns - ifeq ($(have-thread-library),yes) --extra-libs += libanl --routines += gai_sigqueue -+extra-libs-$(OPTION_EGLIBC_INET_ANL) += libanl -+routines-$(OPTION_EGLIBC_INET) += gai_sigqueue - tests += tst-res_hconf_reorder - endif --extra-libs-others = $(extra-libs) -+extra-libs-others-y += $(extra-libs-y) - libresolv-routines := gethnamaddr res_comp res_debug \ - res_data res_mkquery res_query res_send \ - inet_net_ntop inet_net_pton inet_neta base64 \ -@@ -61,7 +64,7 @@ routines += $(libnss_dns-routines) $(libresolv-routines) - static-only-routines += $(libnss_dns-routines) $(libresolv-routines) - endif - --ifeq (yesyes,$(build-shared)$(have-thread-library)) -+ifeq (yesyesy,$(build-shared)$(have-thread-library)$(OPTION_EGLIBC_INET_ANL)) - tests: $(objpfx)ga_test - endif - -diff --git a/stdio-common/Makefile b/stdio-common/Makefile -index d0bf0e1..8655801 100644 ---- a/stdio-common/Makefile -+++ b/stdio-common/Makefile -@@ -18,6 +18,8 @@ - # - # Specific makefile for stdio-common. - # -+include ../option-groups.mak -+ - subdir := stdio-common - - include ../Makeconfig -@@ -30,7 +32,7 @@ routines := \ - vfprintf vprintf printf_fp reg-printf printf-prs printf_fphex \ - reg-modifier reg-type \ - printf_size fprintf printf snprintf sprintf asprintf dprintf \ -- vfwprintf vfscanf vfwscanf \ -+ vfscanf \ - fscanf scanf sscanf \ - perror psignal \ - tmpfile tmpfile64 tmpnam tmpnam_r tempnam tempname \ -@@ -41,23 +43,36 @@ routines := \ - isoc99_vsscanf \ - psiginfo - --aux := errlist siglist printf-parsemb printf-parsewc fxprintf -+# Ideally, _itowa and itowa-digits would be in this option group as -+# well, but it is used unconditionally by printf_fp and printf_fphex, -+# and it didn't seem straightforward to disentangle it. -+routines-$(OPTION_POSIX_C_LANG_WIDE_CHAR) \ -+ += vfwprintf vfwscanf -+ -+aux := errlist siglist printf-parsemb fxprintf -+aux-$(OPTION_POSIX_C_LANG_WIDE_CHAR) += printf-parsewc - - tests := tstscanf test_rdwr test-popen tstgetln test-fseek \ - temptest tst-fileno test-fwrite tst-ungetc tst-ferror \ - xbug errnobug \ - bug1 bug2 bug3 bug4 bug5 bug6 bug7 bug8 bug9 bug10 bug11 bug12 bug13 \ -- tfformat tiformat tllformat tstdiomisc tst-printfsz tst-wc-printf \ -+ tfformat tiformat tllformat tstdiomisc tst-printfsz \ - scanf1 scanf2 scanf3 scanf4 scanf5 scanf7 scanf8 scanf9 scanf10 \ -- scanf11 scanf12 tst-tmpnam tst-cookie tst-obprintf tst-sscanf \ -- tst-swprintf tst-fseek tst-fmemopen test-vfprintf tst-gets \ -- tst-perror tst-sprintf tst-rndseek tst-fdopen tst-fphex bug14 \ -+ scanf11 scanf12 tst-tmpnam tst-cookie tst-obprintf \ -+ tst-fseek tst-fmemopen tst-gets \ -+ tst-sprintf tst-rndseek tst-fdopen tst-fphex \ - tst-popen tst-unlockedio tst-fmemopen2 tst-put-error tst-fgets \ -- tst-fwrite bug16 bug17 tst-swscanf tst-sprintf2 bug18 bug18a \ -- bug19 bug19a tst-popen2 scanf13 scanf14 scanf15 bug20 bug21 bug22 \ -- scanf16 scanf17 tst-setvbuf1 tst-grouping bug23 bug24 \ -- bug-vfprintf-nargs tst-long-dbl-fphex tst-fphex-wide tst-sprintf3 \ -+ tst-fwrite bug16 bug17 tst-sprintf2 bug18 \ -+ bug19 tst-popen2 scanf14 scanf15 bug21 bug22 \ -+ scanf16 scanf17 tst-setvbuf1 bug23 bug24 \ -+ bug-vfprintf-nargs tst-sprintf3 \ - bug25 tst-printf-round bug23-2 bug23-3 bug23-4 bug26 tst-fmemopen3 -+tests-$(OPTION_EGLIBC_LOCALE_CODE) \ -+ += tst-sscanf tst-swprintf test-vfprintf bug14 scanf13 tst-grouping -+tests-$(OPTION_POSIX_WIDE_CHAR_DEVICE_IO) \ -+ += tst-perror bug19a bug20 tst-long-dbl-fphex tst-fphex-wide -+tests-$(OPTION_POSIX_C_LANG_WIDE_CHAR) \ -+ += bug18a tst-swscanf tst-wc-printf - - test-srcs = tst-unbputc tst-printf - -diff --git a/stdio-common/_i18n_number.h b/stdio-common/_i18n_number.h -index 3c73044..ac62b3a 100644 ---- a/stdio-common/_i18n_number.h -+++ b/stdio-common/_i18n_number.h -@@ -19,10 +19,13 @@ - #include <stdbool.h> - #include <wchar.h> - #include <wctype.h> -+#include <gnu/option-groups.h> - - #include "../locale/outdigits.h" - #include "../locale/outdigitswc.h" - -+#if __OPTION_EGLIBC_LOCALE_CODE -+ - static CHAR_T * - _i18n_number_rewrite (CHAR_T *w, CHAR_T *rear_ptr, CHAR_T *end) - { -@@ -115,3 +118,13 @@ _i18n_number_rewrite (CHAR_T *w, CHAR_T *rear_ptr, CHAR_T *end) - - return w; - } -+ -+#else -+ -+static CHAR_T * -+_i18n_number_rewrite (CHAR_T *w, CHAR_T *rear_ptr, CHAR_T *end) -+{ -+ return w; -+} -+ -+#endif -diff --git a/stdio-common/fxprintf.c b/stdio-common/fxprintf.c -index 7b2eb94..8476076 100644 ---- a/stdio-common/fxprintf.c -+++ b/stdio-common/fxprintf.c -@@ -23,6 +23,7 @@ - #include <wchar.h> - #include <string.h> - #include <libioP.h> -+#include <gnu/option-groups.h> - - - int -@@ -37,6 +38,7 @@ __fxprintf (FILE *fp, const char *fmt, ...) - int res; - if (_IO_fwide (fp, 0) > 0) - { -+#if __OPTION_POSIX_WIDE_CHAR_DEVICE_IO - size_t len = strlen (fmt) + 1; - wchar_t wfmt[len]; - for (size_t i = 0; i < len; ++i) -@@ -45,6 +47,9 @@ __fxprintf (FILE *fp, const char *fmt, ...) - wfmt[i] = fmt[i]; - } - res = __vfwprintf (fp, wfmt, ap); -+#else -+ abort(); -+#endif - } - else - res = _IO_vfprintf (fp, fmt, ap); -diff --git a/stdio-common/printf_fp.c b/stdio-common/printf_fp.c -index 3023b20..bd0df66 100644 ---- a/stdio-common/printf_fp.c -+++ b/stdio-common/printf_fp.c -@@ -39,6 +39,7 @@ - #include <unistd.h> - #include <stdlib.h> - #include <wchar.h> -+#include <gnu/option-groups.h> - #include <stdbool.h> - #include <rounding-mode.h> - -@@ -142,6 +143,10 @@ extern mp_size_t __mpn_extract_long_double (mp_ptr res_ptr, mp_size_t size, - extern unsigned int __guess_grouping (unsigned int intdig_max, - const char *grouping); - -+/* Ideally, when OPTION_EGLIBC_LOCALE_CODE is disabled, this should do -+ all its work in ordinary characters, rather than doing it in wide -+ characters and then converting at the end. But that is a challenge -+ for another day. */ - - static wchar_t *group_number (wchar_t *buf, wchar_t *bufend, - unsigned int intdig_no, const char *grouping, -@@ -251,7 +256,14 @@ ___printf_fp (FILE *fp, - mp_limb_t cy; - - /* Nonzero if this is output on a wide character stream. */ -+#if __OPTION_POSIX_C_LANG_WIDE_CHAR - int wide = info->wide; -+#else -+ /* This should never be called on a wide-oriented stream when -+ OPTION_POSIX_C_LANG_WIDE_CHAR is disabled, but the compiler can't -+ be trusted to figure that out. */ -+ const int wide = 0; -+#endif - - /* Buffer in which we produce the output. */ - wchar_t *wbuffer = NULL; -@@ -261,6 +273,7 @@ ___printf_fp (FILE *fp, - p.expsign = 0; - - /* Figure out the decimal point character. */ -+#if __OPTION_EGLIBC_LOCALE_CODE - if (info->extra == 0) - { - decimal = _NL_CURRENT (LC_NUMERIC, DECIMAL_POINT); -@@ -280,7 +293,13 @@ ___printf_fp (FILE *fp, - /* The decimal point character must not be zero. */ - assert (*decimal != '\0'); - assert (decimalwc != L'\0'); -+#else -+ /* Hard-code values from 'C' locale. */ -+ decimal = "."; -+ decimalwc = L'.'; -+#endif - -+#if __OPTION_EGLIBC_LOCALE_CODE - if (info->group) - { - if (info->extra == 0) -@@ -324,6 +343,9 @@ ___printf_fp (FILE *fp, - } - else - grouping = NULL; -+#else -+ grouping = NULL; -+#endif - - /* Fetch the argument value. */ - #ifndef __NO_LONG_DOUBLE_MATH -diff --git a/stdio-common/printf_fphex.c b/stdio-common/printf_fphex.c -index 6c3b5e9..f660ce0 100644 ---- a/stdio-common/printf_fphex.c -+++ b/stdio-common/printf_fphex.c -@@ -28,6 +28,7 @@ - #include <_itoa.h> - #include <_itowa.h> - #include <locale/localeinfo.h> -+#include <gnu/option-groups.h> - #include <stdbool.h> - #include <rounding-mode.h> - -@@ -139,10 +140,18 @@ __printf_fphex (FILE *fp, - int done = 0; - - /* Nonzero if this is output on a wide character stream. */ -+#if __OPTION_POSIX_C_LANG_WIDE_CHAR - int wide = info->wide; -+#else -+ /* This should never be called on a wide-oriented stream when -+ OPTION_POSIX_C_LANG_WIDE_CHAR is disabled, but the compiler can't -+ be trusted to figure that out. */ -+ const int wide = 0; -+#endif - - - /* Figure out the decimal point character. */ -+#if __OPTION_EGLIBC_LOCALE_CODE - if (info->extra == 0) - { - decimal = _NL_CURRENT (LC_NUMERIC, DECIMAL_POINT); -@@ -156,6 +165,10 @@ __printf_fphex (FILE *fp, - } - /* The decimal point character must never be zero. */ - assert (*decimal != '\0' && decimalwc != L'\0'); -+#else -+ decimal = "."; -+ decimalwc = L'.'; -+#endif - - - /* Fetch the argument value. */ -diff --git a/stdio-common/printf_size.c b/stdio-common/printf_size.c -index 7dcd58e..6fb7491 100644 ---- a/stdio-common/printf_size.c -+++ b/stdio-common/printf_size.c -@@ -23,6 +23,7 @@ - #include <math.h> - #include <printf.h> - #include <libioP.h> -+#include <gnu/option-groups.h> - - - /* This defines make it possible to use the same code for GNU C library and -@@ -116,7 +117,14 @@ __printf_size (FILE *fp, const struct printf_info *info, - - struct printf_info fp_info; - int done = 0; -+#if __OPTION_POSIX_C_LANG_WIDE_CHAR - int wide = info->wide; -+#else -+ /* This should never be called on a wide-oriented stream when -+ OPTION_POSIX_C_LANG_WIDE_CHAR is disabled, but the compiler can't -+ be trusted to figure that out. */ -+ const int wide = 0; -+#endif - int res; - - /* Fetch the argument value. */ -diff --git a/stdio-common/scanf14.c b/stdio-common/scanf14.c -index cffccb0..6cc260a 100644 ---- a/stdio-common/scanf14.c -+++ b/stdio-common/scanf14.c -@@ -3,6 +3,7 @@ - #include <string.h> - #include <wchar.h> - #include <libc-internal.h> -+#include <gnu/option-groups.h> - - #define FAIL() \ - do { \ -@@ -48,6 +49,7 @@ main (void) - /* See explanation above. */ - DIAG_PUSH_NEEDS_COMMENT; - DIAG_IGNORE_NEEDS_COMMENT (4.9, "-Wformat"); -+#if __OPTION_EGLIBC_LOCALE_CODE - if (sscanf (" 3.25S x", "%4aS%3c", &lsp, c) != 2) - FAIL (); - else -@@ -57,6 +59,7 @@ main (void) - memset (lsp, 'x', sizeof L"3.25"); - free (lsp); - } -+#endif - if (sscanf ("4.25[0-9.] x", "%a[0-9.]%8c", &sp, c) != 2) - FAIL (); - else -diff --git a/stdio-common/tst-popen.c b/stdio-common/tst-popen.c -index 5def27f..7c9b91e 100644 ---- a/stdio-common/tst-popen.c -+++ b/stdio-common/tst-popen.c -@@ -19,6 +19,7 @@ - #include <stdio.h> - #include <string.h> - #include <wchar.h> -+#include <gnu/option-groups.h> - - static int - do_test (void) -@@ -34,12 +35,14 @@ do_test (void) - return 1; - } - -+#if __OPTION_POSIX_WIDE_CHAR_DEVICE_IO - /* POSIX says that pipe streams are byte-oriented. */ - if (fwide (f, 0) >= 0) - { - puts ("popen did not return byte-oriented stream"); - result = 1; - } -+#endif - - if (getline (&line, &len, f) != 5) - { -diff --git a/stdio-common/tst-sprintf.c b/stdio-common/tst-sprintf.c -index d5284b9..f1e3d21 100644 ---- a/stdio-common/tst-sprintf.c -+++ b/stdio-common/tst-sprintf.c -@@ -3,7 +3,7 @@ - #include <locale.h> - #include <string.h> - #include <libc-internal.h> -- -+#include <gnu/option-groups.h> - - static int - do_test (void) -@@ -11,12 +11,14 @@ do_test (void) - char buf[100]; - int result = 0; - -+#if __OPTION_POSIX_C_LANG_WIDE_CHAR - if (sprintf (buf, "%.0ls", L"foo") != 0 - || strlen (buf) != 0) - { - puts ("sprintf (buf, \"%.0ls\", L\"foo\") produced some output"); - result = 1; - } -+#endif /* __OPTION_POSIX_C_LANG_WIDE_CHAR */ - - #define SIZE (1024*70000) - #define STR(x) #x -diff --git a/stdio-common/tstdiomisc.c b/stdio-common/tstdiomisc.c -index 5548a71..31ed024 100644 ---- a/stdio-common/tstdiomisc.c -+++ b/stdio-common/tstdiomisc.c -@@ -4,6 +4,7 @@ - #include <string.h> - #include <wchar.h> - #include <libc-internal.h> -+#include <gnu/option-groups.h> - - static int - t1 (void) -@@ -134,6 +135,7 @@ F (void) - printf ("expected \"-inf -INF -inf -INF -inf -INF -inf -INF\", got \"%s\"\n", - buf); - -+#if __OPTION_POSIX_C_LANG_WIDE_CHAR - swprintf (wbuf, sizeof wbuf / sizeof (wbuf[0]), L"%a %A %e %E %f %F %g %G", - qnanval, qnanval, qnanval, qnanval, - qnanval, qnanval, qnanval, qnanval); -@@ -171,6 +173,7 @@ F (void) - result |= wcscmp (wbuf, L"-inf -INF -inf -INF -inf -INF -inf -INF") != 0; - printf ("expected L\"-inf -INF -inf -INF -inf -INF -inf -INF\", got L\"%S\"\n", - wbuf); -+#endif /* __OPTION_POSIX_C_LANG_WIDE_CHAR */ - - lqnanval = NAN; - -@@ -215,6 +218,7 @@ F (void) - printf ("expected \"-inf -INF -inf -INF -inf -INF -inf -INF\", got \"%s\"\n", - buf); - -+#if __OPTION_POSIX_C_LANG_WIDE_CHAR - swprintf (wbuf, sizeof wbuf / sizeof (wbuf[0]), - L"%La %LA %Le %LE %Lf %LF %Lg %LG", - lqnanval, lqnanval, lqnanval, lqnanval, -@@ -259,6 +263,7 @@ F (void) - result |= wcscmp (wbuf, L"-inf -INF -inf -INF -inf -INF -inf -INF") != 0; - printf ("expected L\"-inf -INF -inf -INF -inf -INF -inf -INF\", got L\"%S\"\n", - wbuf); -+#endif /* __OPTION_POSIX_C_LANG_WIDE_CHAR */ - - return result; - } -diff --git a/stdio-common/vfprintf.c b/stdio-common/vfprintf.c -index 0592e70..f21d973 100644 ---- a/stdio-common/vfprintf.c -+++ b/stdio-common/vfprintf.c -@@ -29,6 +29,7 @@ - #include <_itoa.h> - #include <locale/localeinfo.h> - #include <stdio.h> -+#include <gnu/option-groups.h> - - /* This code is shared between the standard stdio implementation found - in GNU C library and the libio implementation originally found in -@@ -140,6 +141,18 @@ typedef wchar_t THOUSANDS_SEP_T; - # define EOF WEOF - #endif - -+#if __OPTION_POSIX_C_LANG_WIDE_CHAR -+# define MULTIBYTE_SUPPORT (1) -+#else -+# define MULTIBYTE_SUPPORT (0) -+#endif -+ -+#if __OPTION_EGLIBC_LOCALE_CODE -+# define LOCALE_SUPPORT (1) -+#else -+# define LOCALE_SUPPORT (0) -+#endif -+ - #include "_i18n_number.h" - - /* Include the shared code for parsing the format string. */ -@@ -1065,8 +1078,11 @@ static const uint8_t jump_table[] = - # define process_string_arg(fspec) \ - LABEL (form_character): \ - /* Character. */ \ -- if (is_long) \ -- goto LABEL (form_wcharacter); \ -+ if (is_long) \ -+ { \ -+ assert (MULTIBYTE_SUPPORT); \ -+ goto LABEL (form_wcharacter); \ -+ } \ - --width; /* Account for the character itself. */ \ - if (!left) \ - PAD (' '); \ -@@ -1079,6 +1095,7 @@ static const uint8_t jump_table[] = - break; \ - \ - LABEL (form_wcharacter): \ -+ assert (MULTIBYTE_SUPPORT); \ - { \ - /* Wide character. */ \ - char buf[MB_CUR_MAX]; \ -@@ -1145,6 +1162,7 @@ static const uint8_t jump_table[] = - } \ - else \ - { \ -+ assert (MULTIBYTE_SUPPORT); \ - const wchar_t *s2 = (const wchar_t *) string; \ - mbstate_t mbstate; \ - \ -@@ -1399,7 +1417,9 @@ vfprintf (FILE *s, const CHAR_T *format, va_list ap) - LABEL (flag_quote): - group = 1; - -- if (grouping == (const char *) -1) -+ if (! LOCALE_SUPPORT) -+ grouping = NULL; -+ else if (grouping == (const char *) -1) - { - #ifdef COMPILE_WPRINTF - thousands_sep = _NL_CURRENT_WORD (LC_NUMERIC, -@@ -1728,8 +1748,9 @@ printf_positional (_IO_FILE *s, const CHAR_T *format, int readonly_format, - size_t cnt; - - CHAR_T *workstart = NULL; -- -- if (grouping == (const char *) -1) -+ if (! LOCALE_SUPPORT) -+ grouping = NULL; -+ else if (grouping == (const char *) -1) - { - #ifdef COMPILE_WPRINTF - thousands_sep = _NL_CURRENT_WORD (LC_NUMERIC, -diff --git a/stdio-common/vfscanf.c b/stdio-common/vfscanf.c -index 0e204e7..66cc0af 100644 ---- a/stdio-common/vfscanf.c -+++ b/stdio-common/vfscanf.c -@@ -29,6 +29,7 @@ - #include <wctype.h> - #include <bits/libc-lock.h> - #include <locale/localeinfo.h> -+#include <gnu/option-groups.h> - - #ifdef __GNUC__ - # define HAVE_LONGLONG -@@ -133,6 +134,12 @@ - # define WINT_T int - #endif - -+#if __OPTION_POSIX_C_LANG_WIDE_CHAR -+# define MULTIBYTE_SUPPORT (1) -+#else -+# define MULTIBYTE_SUPPORT (0) -+#endif -+ - #define encode_error() do { \ - errval = 4; \ - __set_errno (EILSEQ); \ -@@ -316,24 +323,35 @@ _IO_vfscanf_internal (_IO_FILE *s, const char *format, _IO_va_list argptr, - ARGCHECK (s, format); - - { --#ifndef COMPILE_WSCANF -+#if __OPTION_EGLIBC_LOCALE_CODE && !defined (COMPILE_WSCANF) - struct __locale_data *const curnumeric = loc->__locales[LC_NUMERIC]; - #endif - -+#if __OPTION_EGLIBC_LOCALE_CODE - /* Figure out the decimal point character. */ --#ifdef COMPILE_WSCANF -+# ifdef COMPILE_WSCANF - decimal = _NL_CURRENT_WORD (LC_NUMERIC, _NL_NUMERIC_DECIMAL_POINT_WC); --#else -+# else - decimal = curnumeric->values[_NL_ITEM_INDEX (DECIMAL_POINT)].string; --#endif -+# endif - /* Figure out the thousands separator character. */ --#ifdef COMPILE_WSCANF -+# ifdef COMPILE_WSCANF - thousands = _NL_CURRENT_WORD (LC_NUMERIC, _NL_NUMERIC_THOUSANDS_SEP_WC); --#else -+# else - thousands = curnumeric->values[_NL_ITEM_INDEX (THOUSANDS_SEP)].string; - if (*thousands == '\0') - thousands = NULL; --#endif -+# endif -+#else /* if ! __OPTION_EGLIBC_LOCALE_CODE */ -+ /* Hard-code values from the C locale. */ -+# ifdef COMPILE_WSCANF -+ decimal = L'.'; -+ thousands = L'\0'; -+# else -+ decimal = "."; -+ thousands = NULL; -+# endif -+#endif /* __OPTION_EGLIBC_LOCALE_CODE */ - } - - /* Lock the stream. */ -@@ -385,6 +403,8 @@ _IO_vfscanf_internal (_IO_FILE *s, const char *format, _IO_va_list argptr, - #ifndef COMPILE_WSCANF - if (!isascii ((unsigned char) *f)) - { -+ assert (MULTIBYTE_SUPPORT); -+ - /* Non-ASCII, may be a multibyte. */ - int len = __mbrlen (f, strlen (f), &state); - if (len > 0) -@@ -830,6 +850,8 @@ _IO_vfscanf_internal (_IO_FILE *s, const char *format, _IO_va_list argptr, - } - /* FALLTHROUGH */ - case L_('C'): -+ assert (MULTIBYTE_SUPPORT); -+ - if (width == -1) - width = 1; - -@@ -1172,6 +1194,8 @@ _IO_vfscanf_internal (_IO_FILE *s, const char *format, _IO_va_list argptr, - /* FALLTHROUGH */ - - case L_('S'): -+ assert (MULTIBYTE_SUPPORT); -+ - { - #ifndef COMPILE_WSCANF - mbstate_t cstate; -@@ -1419,10 +1443,17 @@ _IO_vfscanf_internal (_IO_FILE *s, const char *format, _IO_va_list argptr, - const char *mbdigits[10]; - const char *mbdigits_extended[10]; - #endif -+#if __OPTION_EGLIBC_LOCALE_CODE - /* "to_inpunct" is a map from ASCII digits to their - equivalent in locale. This is defined for locales - which use an extra digits set. */ - wctrans_t map = __wctrans ("to_inpunct"); -+#else -+ /* This will always be the case when -+ OPTION_EGLIBC_LOCALE_CODE is disabled, but the -+ compiler can't figure that out. */ -+ wctrans_t map = NULL; -+#endif - int n; - - from_level = 0; -@@ -2088,6 +2119,7 @@ _IO_vfscanf_internal (_IO_FILE *s, const char *format, _IO_va_list argptr, - --width; - } - -+#if __OPTION_EGLIBC_LOCALE_CODE - wctrans_t map; - if (__builtin_expect ((flags & I18N) != 0, 0) - /* Hexadecimal floats make no sense, fixing localized -@@ -2304,6 +2336,7 @@ _IO_vfscanf_internal (_IO_FILE *s, const char *format, _IO_va_list argptr, - ; - #endif - } -+#endif /* __OPTION_EGLIBC_LOCALE_CODE */ - - /* Have we read any character? If we try to read a number - in hexadecimal notation and we have read only the `0x' -@@ -2343,7 +2376,10 @@ _IO_vfscanf_internal (_IO_FILE *s, const char *format, _IO_va_list argptr, - - case L_('['): /* Character class. */ - if (flags & LONG) -- STRING_ARG (wstr, wchar_t, 100); -+ { -+ assert (MULTIBYTE_SUPPORT); -+ STRING_ARG (wstr, wchar_t, 100); -+ } - else - STRING_ARG (str, char, 100); - -@@ -2417,6 +2453,7 @@ _IO_vfscanf_internal (_IO_FILE *s, const char *format, _IO_va_list argptr, - if (flags & LONG) - { - size_t now = read_in; -+ assert (MULTIBYTE_SUPPORT); - #ifdef COMPILE_WSCANF - if (__glibc_unlikely (inchar () == WEOF)) - input_error (); -diff --git a/stdlib/Makefile b/stdlib/Makefile -index 402466a..7e7e304 100644 ---- a/stdlib/Makefile -+++ b/stdlib/Makefile -@@ -18,6 +18,8 @@ - # - # Makefile for stdlib routines - # -+include ../option-groups.mak -+ - subdir := stdlib - - include ../Makeconfig -@@ -30,7 +32,7 @@ headers := stdlib.h bits/stdlib.h bits/stdlib-ldbl.h bits/stdlib-float.h \ - alloca.h fmtmsg.h \ - bits/stdlib-bsearch.h - --routines := \ -+routines-y := \ - atof atoi atol atoll \ - abort \ - bsearch qsort msort \ -@@ -39,7 +41,6 @@ routines := \ - quick_exit at_quick_exit cxa_at_quick_exit cxa_thread_atexit_impl \ - abs labs llabs \ - div ldiv lldiv \ -- mblen mbstowcs mbtowc wcstombs wctomb \ - random random_r rand rand_r \ - drand48 erand48 lrand48 nrand48 mrand48 jrand48 \ - srand48 seed48 lcong48 \ -@@ -52,9 +53,18 @@ routines := \ - strtof_l strtod_l strtold_l \ - system canonicalize \ - a64l l64a \ -- rpmatch strfmon strfmon_l getsubopt xpg_basename fmtmsg \ -- strtoimax strtoumax wcstoimax wcstoumax \ -+ getsubopt xpg_basename \ -+ strtoimax strtoumax \ - getcontext setcontext makecontext swapcontext -+routines-$(OPTION_EGLIBC_LOCALE_CODE) += \ -+ strfmon strfmon_l -+routines-$(OPTION_POSIX_C_LANG_WIDE_CHAR) += \ -+ mblen mbstowcs mbtowc wcstombs wctomb \ -+ wcstoimax wcstoumax -+ifeq (yy,$(OPTION_EGLIBC_LOCALE_CODE)$(OPTION_POSIX_REGEXP)) -+routines-y += rpmatch -+endif -+routines-$(OPTION_EGLIBC_FMTMSG) += fmtmsg - aux = grouping groupingwc tens_in_limb - - # These routines will be omitted from the libc shared object. -@@ -62,20 +72,24 @@ aux = grouping groupingwc tens_in_limb - # linked against when the shared library will be used. - static-only-routines = atexit at_quick_exit - --test-srcs := tst-fmtmsg --tests := tst-strtol tst-strtod testmb testrand testsort testdiv \ -+test-srcs-$(OPTION_EGLIBC_FMTMSG) := tst-fmtmsg -+tests := tst-strtol tst-strtod testrand testsort testdiv \ - test-canon test-canon2 tst-strtoll tst-environ \ - tst-xpg-basename tst-random tst-random2 tst-bsearch \ - tst-limits tst-rand48 bug-strtod tst-setcontext \ -- tst-setcontext2 test-a64l tst-qsort tst-system testmb2 \ -- bug-strtod2 tst-atof1 tst-atof2 tst-strtod2 tst-strtod3 \ -- tst-rand48-2 tst-makecontext tst-strtod4 tst-strtod5 \ -+ tst-setcontext2 test-a64l tst-qsort tst-system \ -+ bug-strtod2 tst-atof1 tst-atof2 tst-strtod2 \ -+ tst-rand48-2 tst-makecontext \ - tst-qsort2 tst-makecontext2 tst-strtod6 tst-unsetenv1 \ - tst-makecontext3 bug-getcontext bug-fmtmsg1 \ - tst-secure-getenv tst-strtod-overflow tst-strtod-round \ - tst-tininess tst-strtod-underflow tst-tls-atexit \ - tst-setcontext3 tst-tls-atexit-nodelete - tests-static := tst-secure-getenv -+tests-$(OPTION_EGLIBC_LOCALE_CODE) \ -+ += tst-strtod3 tst-strtod4 tst-strtod5 testmb2 -+tests-$(OPTION_POSIX_C_LANG_WIDE_CHAR) \ -+ += testmb - - modules-names = tst-tls-atexit-lib - -@@ -116,8 +130,10 @@ CFLAGS-tst-makecontext2.c = $(stack-align-test-flags) - tests-special += $(objpfx)isomac.out - - ifeq ($(run-built-tests),yes) -+ifeq (y,$(OPTION_EGLIBC_FMTMSG)) - tests-special += $(objpfx)tst-fmtmsg.out - endif -+endif - - include ../Rules - -diff --git a/stdlib/strtod_l.c b/stdlib/strtod_l.c -index e13ab1e..63efe41 100644 ---- a/stdlib/strtod_l.c -+++ b/stdlib/strtod_l.c -@@ -17,6 +17,7 @@ - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -+#include <gnu/option-groups.h> - #include <xlocale.h> - - extern double ____strtod_l_internal (const char *, char **, int, __locale_t); -@@ -548,6 +549,7 @@ ____STRTOF_INTERNAL (nptr, endptr, group, loc) - /* Used in several places. */ - int cnt; - -+#if __OPTION_EGLIBC_LOCALE_CODE - struct __locale_data *current = loc->__locales[LC_NUMERIC]; - - if (__glibc_unlikely (group)) -@@ -586,6 +588,17 @@ ____STRTOF_INTERNAL (nptr, endptr, group, loc) - decimal_len = strlen (decimal); - assert (decimal_len > 0); - #endif -+#else /* if ! __OPTION_EGLIBC_LOCALE_CODE */ -+ /* Hard-code values from the 'C' locale. */ -+ grouping = NULL; -+#ifdef USE_WIDE_CHAR -+ decimal = L'.'; -+# define decimal_len 1 -+#else -+ decimal = "."; -+ decimal_len = 1; -+#endif -+#endif /* __OPTION_EGLIBC_LOCALE_CODE */ - - /* Prepare number representation. */ - exponent = 0; -diff --git a/stdlib/tst-strtod.c b/stdlib/tst-strtod.c -index a469208..28fb423 100644 ---- a/stdlib/tst-strtod.c -+++ b/stdlib/tst-strtod.c -@@ -23,6 +23,7 @@ - #include <errno.h> - #include <string.h> - #include <math.h> -+#include <gnu/option-groups.h> - - struct ltest - { -@@ -176,7 +177,9 @@ main (int argc, char ** argv) - - status |= long_dbl (); - -+#if __OPTION_EGLIBC_LOCALE_CODE - status |= locale_test (); -+#endif - - return status ? EXIT_FAILURE : EXIT_SUCCESS; - } -@@ -219,6 +222,7 @@ long_dbl (void) - return 0; - } - -+#if __OPTION_EGLIBC_LOCALE_CODE - /* Perform a few tests in a locale with thousands separators. */ - static int - locale_test (void) -@@ -276,3 +280,4 @@ locale_test (void) - - return result; - } -+#endif /* __OPTION_EGLIBC_LOCALE_CODE */ -diff --git a/streams/Makefile b/streams/Makefile -index a8a6162..ceb423f 100644 ---- a/streams/Makefile -+++ b/streams/Makefile -@@ -18,11 +18,14 @@ - # - # Makefile for streams. - # -+include ../option-groups.mak -+ - subdir := streams - - include ../Makeconfig - - headers = stropts.h sys/stropts.h bits/stropts.h bits/xtitypes.h --routines = isastream getmsg getpmsg putmsg putpmsg fattach fdetach -+routines-$(OPTION_EGLIBC_STREAMS) \ -+ += isastream getmsg getpmsg putmsg putpmsg fattach fdetach - - include ../Rules -diff --git a/string/Makefile b/string/Makefile -index 8424a61..5988834 100644 ---- a/string/Makefile -+++ b/string/Makefile -@@ -18,6 +18,8 @@ - # - # Sub-makefile for string portion of library. - # -+include ../option-groups.mak -+ - subdir := string - - include ../Makeconfig -@@ -39,10 +41,12 @@ routines := strcat strchr strcmp strcoll strcpy strcspn \ - $(addprefix argz-,append count create ctsep next \ - delete extract insert stringify \ - addsep replace) \ -- envz basename \ -+ basename \ - strcoll_l strxfrm_l string-inlines memrchr \ - xpg-strerror strerror_l - -+routines-$(OPTION_EGLIBC_ENVZ) += envz -+ - strop-tests := memchr memcmp memcpy memmove mempcpy memset memccpy \ - stpcpy stpncpy strcat strchr strcmp strcpy strcspn \ - strlen strncmp strncpy strpbrk strrchr strspn memmem \ -@@ -51,10 +55,12 @@ strop-tests := memchr memcmp memcpy memmove mempcpy memset memccpy \ - tests := tester inl-tester noinl-tester testcopy test-ffs \ - tst-strlen stratcliff tst-svc tst-inlcall \ - bug-strncat1 bug-strspn1 bug-strpbrk1 tst-bswap \ -- tst-strtok tst-strxfrm bug-strcoll1 tst-strfry \ -+ tst-strtok tst-strfry \ - bug-strtok1 $(addprefix test-,$(strop-tests)) \ -- bug-envz1 tst-strxfrm2 tst-endian tst-svc2 \ -- tst-strtok_r -+ tst-strxfrm2 tst-endian tst-svc2 tst-strtok_r -+tests-$(OPTION_EGLIBC_ENVZ) += bug-envz1 -+tests-$(OPTION_EGLIBC_LOCALE_CODE) \ -+ += tst-strxfrm bug-strcoll1 - - xtests = tst-strcoll-overflow - -diff --git a/string/strcoll_l.c b/string/strcoll_l.c -index 8f1225f..b36b18c 100644 ---- a/string/strcoll_l.c -+++ b/string/strcoll_l.c -@@ -24,6 +24,7 @@ - #include <stdint.h> - #include <string.h> - #include <sys/param.h> -+#include <gnu/option-groups.h> - - #ifndef STRING_TYPE - # define STRING_TYPE char -@@ -260,7 +261,11 @@ int - STRCOLL (const STRING_TYPE *s1, const STRING_TYPE *s2, __locale_t l) - { - struct __locale_data *current = l->__locales[LC_COLLATE]; -+#if __OPTION_EGLIBC_LOCALE_CODE - uint_fast32_t nrules = current->values[_NL_ITEM_INDEX (_NL_COLLATE_NRULES)].word; -+#else -+ const uint_fast32_t nrules = 0; -+#endif - /* We don't assign the following values right away since it might be - unnecessary in case there are no rules. */ - const unsigned char *rulesets; -diff --git a/string/strerror_l.c b/string/strerror_l.c -index 2ed78b5..6584813 100644 ---- a/string/strerror_l.c -+++ b/string/strerror_l.c -@@ -21,6 +21,7 @@ - #include <stdlib.h> - #include <string.h> - #include <sys/param.h> -+#include <gnu/option-groups.h> - - - static __thread char *last_value; -@@ -29,10 +30,14 @@ static __thread char *last_value; - static const char * - translate (const char *str, locale_t loc) - { -+#if __OPTION_EGLIBC_LOCALE_CODE - locale_t oldloc = __uselocale (loc); - const char *res = _(str); - __uselocale (oldloc); - return res; -+#else -+ return str; -+#endif - } - - -diff --git a/string/strxfrm_l.c b/string/strxfrm_l.c -index 8b61ea2..41fdc22 100644 ---- a/string/strxfrm_l.c -+++ b/string/strxfrm_l.c -@@ -24,6 +24,7 @@ - #include <stdlib.h> - #include <string.h> - #include <sys/param.h> -+#include <gnu/option-groups.h> - - #ifndef STRING_TYPE - # define STRING_TYPE char -@@ -669,7 +670,11 @@ STRXFRM (STRING_TYPE *dest, const STRING_TYPE *src, size_t n, __locale_t l) - { - locale_data_t l_data; - struct __locale_data *current = l->__locales[LC_COLLATE]; -+#if __OPTION_EGLIBC_LOCALE_CODE - l_data.nrules = current->values[_NL_ITEM_INDEX (_NL_COLLATE_NRULES)].word; -+#else -+ l_data.nrules = 0; -+#endif - - /* Handle byte comparison case. */ - if (l_data.nrules == 0) -diff --git a/string/test-strcmp.c b/string/test-strcmp.c -index dc4ba6f..a978656 100644 ---- a/string/test-strcmp.c -+++ b/string/test-strcmp.c -@@ -329,34 +329,6 @@ check (void) - FOR_EACH_IMPL (impl, 0) - check_result (impl, s1 + i1, s2 + i2, exp_result); - } -- -- /* Test cases where there are multiple zero bytes after the first. */ -- -- for (size_t i = 0; i < 16 + 1; i++) -- { -- s1[i] = 0x00; -- s2[i] = 0x00; -- } -- -- for (size_t i = 0; i < 16; i++) -- { -- int exp_result; -- -- for (int val = 0x01; val < 0x100; val++) -- { -- for (size_t j = 0; j < i; j++) -- { -- s1[j] = val; -- s2[j] = val; -- } -- -- s2[i] = val; -- -- exp_result = SIMPLE_STRCMP (s1, s2); -- FOR_EACH_IMPL (impl, 0) -- check_result (impl, s1, s2, exp_result); -- } -- } - } - - -diff --git a/string/tst-strxfrm.c b/string/tst-strxfrm.c -index f48cfc0..c3a51f9 100644 ---- a/string/tst-strxfrm.c -+++ b/string/tst-strxfrm.c -@@ -3,6 +3,7 @@ - #include <stdio.h> - #include <stdlib.h> - #include <string.h> -+#include <gnu/option-groups.h> - - - char const string[] = ""; -@@ -64,8 +65,10 @@ do_test (void) - int result = 0; - - result |= test ("C"); -+#if __OPTION_EGLIBC_LOCALE_CODE - result |= test ("en_US.ISO-8859-1"); - result |= test ("de_DE.UTF-8"); -+#endif - - return result; - } -diff --git a/string/tst-strxfrm2.c b/string/tst-strxfrm2.c -index d5a1115..19c7f30 100644 ---- a/string/tst-strxfrm2.c -+++ b/string/tst-strxfrm2.c -@@ -1,6 +1,7 @@ - #include <locale.h> - #include <stdio.h> - #include <string.h> -+#include <gnu/option-groups.h> - - static int - do_test (void) -@@ -38,6 +39,7 @@ do_test (void) - res = 1; - } - -+#if __OPTION_EGLIBC_LOCALE_CODE - if (setlocale (LC_ALL, "de_DE.UTF-8") == NULL) - { - puts ("setlocale failed"); -@@ -75,6 +77,7 @@ do_test (void) - res = 1; - } - } -+#endif - - return res; - } -diff --git a/sunrpc/Makefile b/sunrpc/Makefile -index 60caa0a..5bc70ab 100644 ---- a/sunrpc/Makefile -+++ b/sunrpc/Makefile -@@ -18,6 +18,8 @@ - # - # Sub-makefile for sunrpc portion of the library. - # -+include ../option-groups.mak -+ - subdir := sunrpc - - include ../Makeconfig -@@ -55,7 +57,6 @@ headers-in-tirpc = $(addprefix rpc/,auth.h auth_unix.h clnt.h pmap_clnt.h \ - headers-not-in-tirpc = $(addprefix rpc/,key_prot.h rpc_des.h) \ - $(rpcsvc:%=rpcsvc/%) rpcsvc/bootparam.h - headers = rpc/netdb.h --install-others = $(inst_sysconfdir)/rpc - generated += $(rpcsvc:%.x=rpcsvc/%.h) $(rpcsvc:%.x=x%.c) $(rpcsvc:%.x=x%.stmp) \ - $(rpcsvc:%.x=rpcsvc/%.stmp) rpcgen - generated-dirs += rpcsvc -@@ -65,20 +66,28 @@ headers += $(headers-in-tirpc) $(headers-not-in-tirpc) - endif - - ifeq ($(build-shared),yes) --need-export-routines := auth_des auth_unix clnt_gen clnt_perr clnt_tcp \ -+need-export-routines-$(OPTION_EGLIBC_SUNRPC) := \ -+ auth_des auth_unix clnt_gen clnt_perr clnt_tcp \ - clnt_udp get_myaddr key_call netname pm_getport \ -- rpc_thread svc svc_tcp svc_udp xcrypt xdr_array xdr \ -+ rpc_thread svc svc_tcp svc_udp xdr_array xdr \ - xdr_intXX_t xdr_mem xdr_ref xdr_sizeof xdr_stdio \ - svc_run -+need-export-routines-y += xcrypt -+need-export-routines := $(need-export-routines-y) - --routines := auth_none authuxprot bindrsvprt clnt_raw clnt_simp \ -+routines-$(OPTION_EGLIBC_SUNRPC) := \ -+ auth_none authuxprot bindrsvprt clnt_raw clnt_simp \ - rpc_dtable getrpcport pmap_clnt pm_getmaps pmap_prot pmap_prot2 \ - pmap_rmt rpc_prot rpc_common rpc_cmsg svc_auth svc_authux svc_raw \ - svc_simple xdr_float xdr_rec publickey authdes_prot \ -- des_crypt des_impl des_soft key_prot openchild rtime svcauth_des \ -+ key_prot openchild rtime svcauth_des \ - getrpcent getrpcbyname getrpcbynumber \ - getrpcent_r getrpcbyname_r getrpcbynumber_r \ -- clnt_unix svc_unix create_xid $(need-export-routines) -+ clnt_unix svc_unix create_xid -+ -+# xdecrypt is also used by nss/nss_files/files-key.c. -+routines-y += des_crypt des_impl des_soft $(need-export-routines) -+ - ifneq ($(link-obsolete-rpc),yes) - # We only add the RPC for compatibility to libc.so. - shared-only-routines = $(routines) -@@ -87,25 +96,28 @@ endif - - # We do not build rpcinfo anymore. It is not needed for a bootstrap - # and not wanted on complete systems. --# others := rpcinfo --# install-sbin := rpcinfo --install-bin := rpcgen -+# others-$(OPTION_EGLIBC_SUNRPC) += rpcinfo -+# install-sbin-$(OPTION_EGLIBC_SUNRPC) += rpcinfo -+install-bin-$(OPTION_EGLIBC_SUNRPC) += rpcgen - rpcgen-objs = rpc_main.o rpc_hout.o rpc_cout.o rpc_parse.o \ - rpc_scan.o rpc_util.o rpc_svcout.o rpc_clntout.o \ - rpc_tblout.o rpc_sample.o --extra-objs = $(rpcgen-objs) $(addprefix cross-,$(rpcgen-objs)) --others += rpcgen -+extra-objs-$(OPTION_EGLIBC_SUNRPC) = $(rpcgen-objs) $(addprefix cross-,$(rpcgen-objs)) -+others-$(OPTION_EGLIBC_SUNRPC) += rpcgen -+ -+install-others-$(OPTION_EGLIBC_SUNRPC) += $(inst_sysconfdir)/rpc - --tests = tst-xdrmem tst-xdrmem2 test-rpcent --xtests := tst-getmyaddr -+tests-$(OPTION_EGLIBC_SUNRPC) = tst-xdrmem tst-xdrmem2 test-rpcent -+xtests-$(OPTION_EGLIBC_SUNRPC) := tst-getmyaddr - - ifeq ($(have-thread-library),yes) --xtests += thrsvc -+xtests-$(OPTION_EGLIBC_SUNRPC) += thrsvc - endif - - headers += $(rpcsvc:%.x=rpcsvc/%.h) --extra-libs := librpcsvc --extra-libs-others := librpcsvc # Make it in `others' pass, not `lib' pass. -+extra-libs-$(OPTION_EGLIBC_SUNRPC) += librpcsvc -+# Make it in `others' pass, not `lib' pass. -+extra-libs-others-y += $(extra-libs-y) - librpcsvc-routines = $(rpcsvc:%.x=x%) - librpcsvc-inhibit-o = .os # Build no shared rpcsvc library. - omit-deps = $(librpcsvc-routines) -diff --git a/sysdeps/arm/Makefile b/sysdeps/arm/Makefile -index 17c129b..543791a 100644 ---- a/sysdeps/arm/Makefile -+++ b/sysdeps/arm/Makefile -@@ -37,10 +37,13 @@ ifeq ($(subdir),csu) - # get offset to rtld_global._dl_hwcap - gen-as-const-headers += rtld-global-offsets.sym tlsdesc.sym - aeabi_constants = aeabi_lcsts aeabi_sighandlers aeabi_math --aeabi_routines = aeabi_assert aeabi_localeconv aeabi_errno_addr \ -+aeabi_routines = aeabi_assert aeabi_errno_addr \ - aeabi_mb_cur_max aeabi_atexit aeabi_memclr aeabi_memcpy \ - aeabi_memmove aeabi_memset \ - aeabi_read_tp libc-aeabi_read_tp -+ifeq (y,$(OPTION_EGLIBC_LOCALE_CODE)) -+aeabi_routines += aeabi_localeconv -+endif - - sysdep_routines += $(aeabi_constants) $(aeabi_routines) - static-only-routines += $(aeabi_constants) aeabi_read_tp -diff --git a/sysdeps/generic/ldsodefs.h b/sysdeps/generic/ldsodefs.h -index 7a0fe8d..a3e2c0a 100644 ---- a/sysdeps/generic/ldsodefs.h -+++ b/sysdeps/generic/ldsodefs.h -@@ -435,6 +435,12 @@ extern struct rtld_global _rtld_global __rtld_global_attribute__; - # undef __rtld_global_attribute__ - #endif - -+#if __OPTION_EGLIBC_RTLD_DEBUG -+# define GLRO_dl_debug_mask GLRO(dl_debug_mask) -+#else -+# define GLRO_dl_debug_mask 0 -+#endif -+ - #ifndef SHARED - # define GLRO(name) _##name - #else -@@ -447,8 +453,10 @@ struct rtld_global_ro - { - #endif - -+#if __OPTION_EGLIBC_RTLD_DEBUG - /* If nonzero the appropriate debug information is printed. */ - EXTERN int _dl_debug_mask; -+#endif - #define DL_DEBUG_LIBS (1 << 0) - #define DL_DEBUG_IMPCALLS (1 << 1) - #define DL_DEBUG_BINDINGS (1 << 2) -diff --git a/sysdeps/gnu/Makefile b/sysdeps/gnu/Makefile -index ea68037..3175cc3 100644 ---- a/sysdeps/gnu/Makefile -+++ b/sysdeps/gnu/Makefile -@@ -59,7 +59,8 @@ $(foreach o,$(object-suffixes) $(object-suffixes:=.d),\ - endif - - ifeq ($(subdir),login) --sysdep_routines += setutxent getutxent endutxent getutxid getutxline \ -+sysdep_routines-$(OPTION_EGLIBC_UTMPX) \ -+ += setutxent getutxent endutxent getutxid getutxline \ - pututxline utmpxname updwtmpx getutmpx getutmp - - sysdep_headers += utmpx.h bits/utmpx.h -diff --git a/sysdeps/ieee754/ldbl-opt/Makefile b/sysdeps/ieee754/ldbl-opt/Makefile -index 222122d..4509357 100644 ---- a/sysdeps/ieee754/ldbl-opt/Makefile -+++ b/sysdeps/ieee754/ldbl-opt/Makefile -@@ -11,19 +11,18 @@ libm-routines += s_nexttowardfd - routines += math_ldbl_opt nldbl-compat - - extra-libs += libnldbl --libnldbl-calls = asprintf dprintf fprintf fscanf fwprintf fwscanf iovfscanf \ -+libnldbl-calls = asprintf dprintf fprintf fscanf iovfscanf \ - obstack_printf obstack_vprintf printf scanf snprintf \ -- sprintf sscanf swprintf swscanf vasprintf vdprintf vfprintf \ -- vfscanf vfwprintf vfwscanf vprintf vscanf vsnprintf \ -- vsprintf vsscanf vswprintf vswscanf vwprintf vwscanf \ -- wprintf wscanf printf_fp printf_size \ -- fprintf_chk fwprintf_chk printf_chk snprintf_chk sprintf_chk \ -- swprintf_chk vfprintf_chk vfwprintf_chk vprintf_chk \ -- vsnprintf_chk vsprintf_chk vswprintf_chk vwprintf_chk \ -- wprintf_chk asprintf_chk vasprintf_chk dprintf_chk \ -+ sprintf sscanf vasprintf vdprintf vfprintf \ -+ vfscanf vprintf vscanf vsnprintf \ -+ vsprintf vsscanf \ -+ printf_fp printf_size \ -+ fprintf_chk printf_chk snprintf_chk sprintf_chk \ -+ vfprintf_chk vprintf_chk \ -+ vsnprintf_chk vsprintf_chk \ -+ asprintf_chk vasprintf_chk dprintf_chk \ - vdprintf_chk obstack_printf_chk obstack_vprintf_chk \ - syslog syslog_chk vsyslog vsyslog_chk \ -- strfmon strfmon_l \ - strtold strtold_l strtoldint wcstold wcstold_l wcstoldint \ - qecvt qfcvt qgcvt qecvt_r qfcvt_r \ - isinf isnan finite signbit scalb log2 lgamma_r ceil \ -@@ -38,9 +37,15 @@ libnldbl-calls = asprintf dprintf fprintf fscanf fwprintf fwscanf iovfscanf \ - casinh cexp clog cproj csin csinh csqrt ctan ctanh cpow \ - cabs carg cimag creal clog10 \ - isoc99_scanf isoc99_fscanf isoc99_sscanf \ -- isoc99_vscanf isoc99_vfscanf isoc99_vsscanf \ -+ isoc99_vscanf isoc99_vfscanf isoc99_vsscanf -+libnldbl-calls-$(OPTION_EGLIBC_LOCALE_CODE) += strfmon strfmon_l -+libnldbl-calls-$(OPTION_POSIX_WIDE_CHAR_DEVICE_IO) += fwprintf fwscanf \ -+ swprintf swscanf vfwprintf vfwscanf vswprintf vswscanf \ -+ vwprintf vwscanf wprintf wscanf fwprintf_chk swprintf_chk \ -+ vfwprintf_chk vswprintf_chk vwprintf_chk wprintf_chk \ - isoc99_wscanf isoc99_fwscanf isoc99_swscanf \ - isoc99_vwscanf isoc99_vfwscanf isoc99_vswscanf -+libnldbl-calls += $(libnldbl-calls-y) - libnldbl-routines = $(libnldbl-calls:%=nldbl-%) - libnldbl-inhibit-o = $(object-suffixes) - libnldbl-static-only-routines = $(libnldbl-routines) -diff --git a/sysdeps/ieee754/ldbl-opt/nldbl-compat.c b/sysdeps/ieee754/ldbl-opt/nldbl-compat.c -index 0198886..55501cd 100644 ---- a/sysdeps/ieee754/ldbl-opt/nldbl-compat.c -+++ b/sysdeps/ieee754/ldbl-opt/nldbl-compat.c -@@ -26,6 +26,7 @@ - #include <locale/localeinfo.h> - #include <sys/syslog.h> - #include <bits/libc-lock.h> -+#include <gnu/option-groups.h> - - #include "nldbl-compat.h" - -@@ -33,20 +34,14 @@ libc_hidden_proto (__nldbl_vfprintf) - libc_hidden_proto (__nldbl_vsscanf) - libc_hidden_proto (__nldbl_vsprintf) - libc_hidden_proto (__nldbl_vfscanf) --libc_hidden_proto (__nldbl_vfwscanf) - libc_hidden_proto (__nldbl_vdprintf) --libc_hidden_proto (__nldbl_vswscanf) --libc_hidden_proto (__nldbl_vfwprintf) --libc_hidden_proto (__nldbl_vswprintf) - libc_hidden_proto (__nldbl_vsnprintf) - libc_hidden_proto (__nldbl_vasprintf) - libc_hidden_proto (__nldbl_obstack_vprintf) --libc_hidden_proto (__nldbl___vfwprintf_chk) - libc_hidden_proto (__nldbl___vsnprintf_chk) - libc_hidden_proto (__nldbl___vfprintf_chk) - libc_hidden_proto (__nldbl___vsyslog_chk) - libc_hidden_proto (__nldbl___vsprintf_chk) --libc_hidden_proto (__nldbl___vswprintf_chk) - libc_hidden_proto (__nldbl___vasprintf_chk) - libc_hidden_proto (__nldbl___vdprintf_chk) - libc_hidden_proto (__nldbl___obstack_vprintf_chk) -@@ -54,8 +49,17 @@ libc_hidden_proto (__nldbl___vstrfmon) - libc_hidden_proto (__nldbl___vstrfmon_l) - libc_hidden_proto (__nldbl___isoc99_vsscanf) - libc_hidden_proto (__nldbl___isoc99_vfscanf) -+ -+#if __OPTION_POSIX_WIDE_CHAR_DEVICE_IO -+libc_hidden_proto (__nldbl_vfwscanf) -+libc_hidden_proto (__nldbl_vswscanf) -+libc_hidden_proto (__nldbl_vfwprintf) -+libc_hidden_proto (__nldbl_vswprintf) -+libc_hidden_proto (__nldbl___vfwprintf_chk) -+libc_hidden_proto (__nldbl___vswprintf_chk) - libc_hidden_proto (__nldbl___isoc99_vswscanf) - libc_hidden_proto (__nldbl___isoc99_vfwscanf) -+#endif - - static void - __nldbl_cleanup (void *arg) -@@ -117,6 +121,7 @@ __nldbl_fprintf (FILE *stream, const char *fmt, ...) - } - weak_alias (__nldbl_fprintf, __nldbl__IO_fprintf) - -+#if __OPTION_POSIX_WIDE_CHAR_DEVICE_IO - int - attribute_compat_text_section weak_function - __nldbl_fwprintf (FILE *stream, const wchar_t *fmt, ...) -@@ -130,6 +135,7 @@ __nldbl_fwprintf (FILE *stream, const wchar_t *fmt, ...) - - return done; - } -+#endif - - int - attribute_compat_text_section -@@ -226,6 +232,7 @@ __nldbl_snprintf (char *s, size_t maxlen, const char *fmt, ...) - return done; - } - -+#if __OPTION_POSIX_WIDE_CHAR_DEVICE_IO - int - attribute_compat_text_section - __nldbl_swprintf (wchar_t *s, size_t n, const wchar_t *fmt, ...) -@@ -239,6 +246,7 @@ __nldbl_swprintf (wchar_t *s, size_t n, const wchar_t *fmt, ...) - - return done; - } -+#endif - - int - attribute_compat_text_section weak_function -@@ -264,6 +272,7 @@ __nldbl_vdprintf (int d, const char *fmt, va_list arg) - } - libc_hidden_def (__nldbl_vdprintf) - -+#if __OPTION_POSIX_WIDE_CHAR_DEVICE_IO - int - attribute_compat_text_section weak_function - __nldbl_vfwprintf (FILE *s, const wchar_t *fmt, va_list ap) -@@ -275,6 +284,7 @@ __nldbl_vfwprintf (FILE *s, const wchar_t *fmt, va_list ap) - return res; - } - libc_hidden_def (__nldbl_vfwprintf) -+#endif - - int - attribute_compat_text_section -@@ -297,6 +307,7 @@ __nldbl_vsnprintf (char *string, size_t maxlen, const char *fmt, - libc_hidden_def (__nldbl_vsnprintf) - weak_alias (__nldbl_vsnprintf, __nldbl___vsnprintf) - -+#if __OPTION_POSIX_WIDE_CHAR_DEVICE_IO - int - attribute_compat_text_section weak_function - __nldbl_vswprintf (wchar_t *string, size_t maxlen, const wchar_t *fmt, -@@ -330,6 +341,7 @@ __nldbl_wprintf (const wchar_t *fmt, ...) - - return done; - } -+#endif - - int - attribute_compat_text_section -@@ -419,6 +431,7 @@ __nldbl_scanf (const char *fmt, ...) - return done; - } - -+#if __OPTION_POSIX_WIDE_CHAR_DEVICE_IO - int - attribute_compat_text_section - __nldbl_vfwscanf (FILE *s, const wchar_t *fmt, va_list ap) -@@ -491,6 +504,7 @@ __nldbl_wscanf (const wchar_t *fmt, ...) - - return done; - } -+#endif - - int - attribute_compat_text_section -@@ -506,6 +520,7 @@ __nldbl___fprintf_chk (FILE *stream, int flag, const char *fmt, ...) - return done; - } - -+#if __OPTION_POSIX_WIDE_CHAR_DEVICE_IO - int - attribute_compat_text_section - __nldbl___fwprintf_chk (FILE *stream, int flag, const wchar_t *fmt, ...) -@@ -519,6 +534,7 @@ __nldbl___fwprintf_chk (FILE *stream, int flag, const wchar_t *fmt, ...) - - return done; - } -+#endif - - int - attribute_compat_text_section -@@ -563,6 +579,7 @@ __nldbl___sprintf_chk (char *s, int flag, size_t slen, const char *fmt, ...) - return done; - } - -+#if __OPTION_POSIX_WIDE_CHAR_DEVICE_IO - int - attribute_compat_text_section - __nldbl___swprintf_chk (wchar_t *s, size_t n, int flag, size_t slen, -@@ -577,6 +594,7 @@ __nldbl___swprintf_chk (wchar_t *s, size_t n, int flag, size_t slen, - - return done; - } -+#endif - - int - attribute_compat_text_section -@@ -590,6 +608,7 @@ __nldbl___vfprintf_chk (FILE *s, int flag, const char *fmt, va_list ap) - } - libc_hidden_def (__nldbl___vfprintf_chk) - -+#if __OPTION_POSIX_WIDE_CHAR_DEVICE_IO - int - attribute_compat_text_section - __nldbl___vfwprintf_chk (FILE *s, int flag, const wchar_t *fmt, va_list ap) -@@ -601,6 +620,7 @@ __nldbl___vfwprintf_chk (FILE *s, int flag, const wchar_t *fmt, va_list ap) - return res; - } - libc_hidden_def (__nldbl___vfwprintf_chk) -+#endif - - int - attribute_compat_text_section -@@ -635,6 +655,7 @@ __nldbl___vsprintf_chk (char *string, int flag, size_t slen, const char *fmt, - } - libc_hidden_def (__nldbl___vsprintf_chk) - -+#if __OPTION_POSIX_WIDE_CHAR_DEVICE_IO - int - attribute_compat_text_section - __nldbl___vswprintf_chk (wchar_t *string, size_t maxlen, int flag, size_t slen, -@@ -668,6 +689,7 @@ __nldbl___wprintf_chk (int flag, const wchar_t *fmt, ...) - - return done; - } -+#endif - - int - attribute_compat_text_section -@@ -775,6 +797,7 @@ __nldbl___printf_fp (FILE *fp, const struct printf_info *info, - return ___printf_fp (fp, &info_no_ldbl, args); - } - -+#if __OPTION_EGLIBC_LOCALE_CODE - ssize_t - attribute_compat_text_section - __nldbl_strfmon (char *s, size_t maxsize, const char *format, ...) -@@ -829,6 +852,7 @@ __nldbl___vstrfmon_l (char *s, size_t maxsize, __locale_t loc, - return res; - } - libc_hidden_def (__nldbl___vstrfmon_l) -+#endif - - void - attribute_compat_text_section -@@ -941,6 +965,7 @@ __nldbl___isoc99_scanf (const char *fmt, ...) - return done; - } - -+#if __OPTION_POSIX_WIDE_CHAR_DEVICE_IO - int - attribute_compat_text_section - __nldbl___isoc99_vfwscanf (FILE *s, const wchar_t *fmt, va_list ap) -@@ -1014,6 +1039,7 @@ __nldbl___isoc99_wscanf (const wchar_t *fmt, ...) - - return done; - } -+#endif - - #if LONG_DOUBLE_COMPAT(libc, GLIBC_2_0) - compat_symbol (libc, __nldbl__IO_printf, _IO_printf, GLIBC_2_0); -@@ -1057,6 +1083,7 @@ compat_symbol (libc, __nldbl_printf_size, printf_size, GLIBC_2_1); - compat_symbol (libc, __nldbl___strfmon_l, __strfmon_l, GLIBC_2_1); - #endif - #if LONG_DOUBLE_COMPAT(libc, GLIBC_2_2) -+# if __OPTION_POSIX_WIDE_CHAR_DEVICE_IO - compat_symbol (libc, __nldbl_swprintf, swprintf, GLIBC_2_2); - compat_symbol (libc, __nldbl_vwprintf, vwprintf, GLIBC_2_2); - compat_symbol (libc, __nldbl_wprintf, wprintf, GLIBC_2_2); -@@ -1069,6 +1096,7 @@ compat_symbol (libc, __nldbl_vfwscanf, vfwscanf, GLIBC_2_2); - compat_symbol (libc, __nldbl_vswscanf, vswscanf, GLIBC_2_2); - compat_symbol (libc, __nldbl_vwscanf, vwscanf, GLIBC_2_2); - compat_symbol (libc, __nldbl_wscanf, wscanf, GLIBC_2_2); -+# endif - #endif - #if LONG_DOUBLE_COMPAT(libc, GLIBC_2_3) - compat_symbol (libc, __nldbl_strfmon_l, strfmon_l, GLIBC_2_3); -diff --git a/sysdeps/ieee754/ldbl-opt/nldbl-compat.h b/sysdeps/ieee754/ldbl-opt/nldbl-compat.h -index 0d2c8af..f4cea50 100644 ---- a/sysdeps/ieee754/ldbl-opt/nldbl-compat.h -+++ b/sysdeps/ieee754/ldbl-opt/nldbl-compat.h -@@ -30,6 +30,7 @@ - #include <math.h> - #include <monetary.h> - #include <sys/syslog.h> -+#include <gnu/option-groups.h> - - - /* Declare the __nldbl_NAME function the wrappers call that's in libc.so. */ -@@ -37,19 +38,15 @@ - - NLDBL_DECL (_IO_vfscanf); - NLDBL_DECL (vfscanf); --NLDBL_DECL (vfwscanf); - NLDBL_DECL (obstack_vprintf); - NLDBL_DECL (vasprintf); - NLDBL_DECL (dprintf); - NLDBL_DECL (vdprintf); - NLDBL_DECL (fprintf); - NLDBL_DECL (vfprintf); --NLDBL_DECL (vfwprintf); - NLDBL_DECL (vsnprintf); - NLDBL_DECL (vsprintf); - NLDBL_DECL (vsscanf); --NLDBL_DECL (vswprintf); --NLDBL_DECL (vswscanf); - NLDBL_DECL (__asprintf); - NLDBL_DECL (asprintf); - NLDBL_DECL (__printf_fp); -@@ -66,12 +63,18 @@ NLDBL_DECL (__isoc99_sscanf); - NLDBL_DECL (__isoc99_vscanf); - NLDBL_DECL (__isoc99_vfscanf); - NLDBL_DECL (__isoc99_vsscanf); -+#if __OPTION_POSIX_WIDE_CHAR_DEVICE_IO -+NLDBL_DECL (vfwscanf); -+NLDBL_DECL (vfwprintf); -+NLDBL_DECL (vswprintf); -+NLDBL_DECL (vswscanf); - NLDBL_DECL (__isoc99_wscanf); - NLDBL_DECL (__isoc99_fwscanf); - NLDBL_DECL (__isoc99_swscanf); - NLDBL_DECL (__isoc99_vwscanf); - NLDBL_DECL (__isoc99_vfwscanf); - NLDBL_DECL (__isoc99_vswscanf); -+#endif - - /* This one does not exist in the normal interface, only - __nldbl___vstrfmon really exists. */ -@@ -82,22 +85,23 @@ extern ssize_t __nldbl___vstrfmon (char *, size_t, const char *, va_list) - since we don't compile with _FORTIFY_SOURCE. */ - extern int __nldbl___vfprintf_chk (FILE *__restrict, int, - const char *__restrict, _G_va_list); --extern int __nldbl___vfwprintf_chk (FILE *__restrict, int, -- const wchar_t *__restrict, __gnuc_va_list); - extern int __nldbl___vsprintf_chk (char *__restrict, int, size_t, - const char *__restrict, _G_va_list) __THROW; - extern int __nldbl___vsnprintf_chk (char *__restrict, size_t, int, size_t, - const char *__restrict, _G_va_list) - __THROW; --extern int __nldbl___vswprintf_chk (wchar_t *__restrict, size_t, int, size_t, -- const wchar_t *__restrict, __gnuc_va_list) -- __THROW; - extern int __nldbl___vasprintf_chk (char **, int, const char *, _G_va_list) - __THROW; - extern int __nldbl___vdprintf_chk (int, int, const char *, _G_va_list); - extern int __nldbl___obstack_vprintf_chk (struct obstack *, int, const char *, - _G_va_list) __THROW; - extern void __nldbl___vsyslog_chk (int, int, const char *, va_list); -- -+#if __OPTION_POSIX_WIDE_CHAR_DEVICE_IO -+extern int __nldbl___vfwprintf_chk (FILE *__restrict, int, -+ const wchar_t *__restrict, __gnuc_va_list); -+extern int __nldbl___vswprintf_chk (wchar_t *__restrict, size_t, int, size_t, -+ const wchar_t *__restrict, __gnuc_va_list) -+ __THROW; -+#endif - - #endif /* __NLDBL_COMPAT_H */ -diff --git a/sysdeps/nptl/Makefile b/sysdeps/nptl/Makefile -index e9339a3..782009b 100644 ---- a/sysdeps/nptl/Makefile -+++ b/sysdeps/nptl/Makefile -@@ -18,6 +18,9 @@ - - ifeq ($(subdir),nptl) - libpthread-sysdep_routines += errno-loc -+ifeq ($(OPTION_EGLIBC_BIG_MACROS),n) -+sysdep_routines += small-macros-fns -+endif - endif - - ifeq ($(subdir),rt) -diff --git a/sysdeps/nptl/bits/libc-lock.h b/sysdeps/nptl/bits/libc-lock.h -index 5599cf1..b839378 100644 ---- a/sysdeps/nptl/bits/libc-lock.h -+++ b/sysdeps/nptl/bits/libc-lock.h -@@ -24,6 +24,14 @@ - #include <stddef.h> - - -+#ifdef _LIBC -+# include <lowlevellock.h> -+# include <tls.h> -+# include <pthread-functions.h> -+# include <errno.h> /* For EBUSY. */ -+# include <gnu/option-groups.h> /* For __OPTION_EGLIBC_BIG_MACROS. */ -+#endif -+ - /* Mutex type. */ - #if defined _LIBC || defined _IO_MTSAFE_IO - # if (!IS_IN (libc) && !IS_IN (libpthread)) || !defined _LIBC -@@ -87,6 +95,15 @@ typedef struct __libc_lock_recursive_opaque__ __libc_lock_recursive_t; - - /* Lock the recursive named lock variable. */ - #if defined _LIBC && (IS_IN (libc) || IS_IN (libpthread)) -+# if __OPTION_EGLIBC_BIG_MACROS != 1 -+/* EGLIBC: Declare wrapper function for a big macro if either -+ !__OPTION_EGLIBC_BIG_MACROS or we are using a back door from -+ small-macros-fns.c (__OPTION_EGLIBC_BIG_MACROS == 2). */ -+extern void __libc_lock_lock_recursive_fn (__libc_lock_recursive_t *); -+libc_hidden_proto (__libc_lock_lock_recursive_fn); -+# endif /* __OPTION_EGLIBC_BIG_MACROS != 1 */ -+# if __OPTION_EGLIBC_BIG_MACROS -+ - # define __libc_lock_lock_recursive(NAME) \ - do { \ - void *self = THREAD_SELF; \ -@@ -97,6 +114,10 @@ typedef struct __libc_lock_recursive_opaque__ __libc_lock_recursive_t; - } \ - ++(NAME).cnt; \ - } while (0) -+# else -+# define __libc_lock_lock_recursive(NAME) \ -+ __libc_lock_lock_recursive_fn (&(NAME)) -+# endif /* __OPTION_EGLIBC_BIG_MACROS */ - #else - # define __libc_lock_lock_recursive(NAME) \ - __libc_maybe_call (__pthread_mutex_lock, (&(NAME).mutex), 0) -@@ -104,6 +125,14 @@ typedef struct __libc_lock_recursive_opaque__ __libc_lock_recursive_t; - - /* Try to lock the recursive named lock variable. */ - #if defined _LIBC && (IS_IN (libc) || IS_IN (libpthread)) -+# if __OPTION_EGLIBC_BIG_MACROS != 1 -+/* EGLIBC: Declare wrapper function for a big macro if either -+ !__OPTION_EGLIBC_BIG_MACROS or we are using a back door from -+ small-macros-fns.c (__OPTION_EGLIBC_BIG_MACROS == 2). */ -+extern int __libc_lock_trylock_recursive_fn (__libc_lock_recursive_t *); -+libc_hidden_proto (__libc_lock_trylock_recursive_fn); -+# endif /* __OPTION_EGLIBC_BIG_MACROS != 1 */ -+# if __OPTION_EGLIBC_BIG_MACROS - # define __libc_lock_trylock_recursive(NAME) \ - ({ \ - int result = 0; \ -@@ -122,6 +151,10 @@ typedef struct __libc_lock_recursive_opaque__ __libc_lock_recursive_t; - ++(NAME).cnt; \ - result; \ - }) -+# else -+# define __libc_lock_trylock_recursive(NAME) \ -+ __libc_lock_trylock_recursive_fn (&(NAME)) -+# endif /* __OPTION_EGLIBC_BIG_MACROS */ - #else - # define __libc_lock_trylock_recursive(NAME) \ - __libc_maybe_call (__pthread_mutex_trylock, (&(NAME).mutex), 0) -@@ -129,6 +162,14 @@ typedef struct __libc_lock_recursive_opaque__ __libc_lock_recursive_t; - - /* Unlock the recursive named lock variable. */ - #if defined _LIBC && (IS_IN (libc) || IS_IN (libpthread)) -+# if __OPTION_EGLIBC_BIG_MACROS != 1 -+/* EGLIBC: Declare wrapper function for a big macro if either -+ !__OPTION_EGLIBC_BIG_MACROS, or we are using a back door from -+ small-macros-fns.c (__OPTION_EGLIBC_BIG_MACROS == 2). */ -+extern void __libc_lock_unlock_recursive_fn (__libc_lock_recursive_t *); -+libc_hidden_proto (__libc_lock_unlock_recursive_fn); -+# endif /* __OPTION_EGLIBC_BIG_MACROS != 1 */ -+# if __OPTION_EGLIBC_BIG_MACROS - /* We do no error checking here. */ - # define __libc_lock_unlock_recursive(NAME) \ - do { \ -@@ -138,6 +179,10 @@ typedef struct __libc_lock_recursive_opaque__ __libc_lock_recursive_t; - lll_unlock ((NAME).lock, LLL_PRIVATE); \ - } \ - } while (0) -+# else -+# define __libc_lock_unlock_recursive(NAME) \ -+ __libc_lock_unlock_recursive_fn (&(NAME)) -+# endif /* __OPTION_EGLIBC_BIG_MACROS */ - #else - # define __libc_lock_unlock_recursive(NAME) \ - __libc_maybe_call (__pthread_mutex_unlock, (&(NAME).mutex), 0) -diff --git a/sysdeps/nptl/bits/libc-lockP.h b/sysdeps/nptl/bits/libc-lockP.h -index f55f621..da98869 100644 ---- a/sysdeps/nptl/bits/libc-lockP.h -+++ b/sysdeps/nptl/bits/libc-lockP.h -@@ -33,6 +33,8 @@ - #include <lowlevellock.h> - #include <tls.h> - #include <pthread-functions.h> -+#include <errno.h> /* For EBUSY. */ -+#include <gnu/option-groups.h> /* For __OPTION_EGLIBC_BIG_MACROS. */ - - #if IS_IN (libpthread) - /* This gets us the declarations of the __pthread_* internal names, -@@ -171,10 +173,22 @@ typedef pthread_key_t __libc_key_t; - - /* Lock the named lock variable. */ - #if IS_IN (libc) || IS_IN (libpthread) --# ifndef __libc_lock_lock --# define __libc_lock_lock(NAME) \ -+# if __OPTION_EGLIBC_BIG_MACROS != 1 -+/* EGLIBC: Declare wrapper function for a big macro if either -+ !__OPTION_EGLIBC_BIG_MACROS or we are using a back door from -+ small-macros-fns.c (__OPTION_EGLIBC_BIG_MACROS == 2). */ -+extern void __libc_lock_lock_fn (__libc_lock_t *); -+libc_hidden_proto (__libc_lock_lock_fn); -+# endif /* __OPTION_EGLIBC_BIG_MACROS != 1 */ -+# if __OPTION_EGLIBC_BIG_MACROS -+# ifndef __libc_lock_lock -+# define __libc_lock_lock(NAME) \ - ({ lll_lock (NAME, LLL_PRIVATE); 0; }) --# endif -+# endif -+# else -+# define __libc_lock_lock(NAME) \ -+ __libc_lock_lock_fn (&(NAME)) -+# endif /* __OPTION_EGLIBC_BIG_MACROS */ - #else - # undef __libc_lock_lock - # define __libc_lock_lock(NAME) \ -@@ -187,10 +201,22 @@ typedef pthread_key_t __libc_key_t; - - /* Try to lock the named lock variable. */ - #if IS_IN (libc) || IS_IN (libpthread) --# ifndef __libc_lock_trylock --# define __libc_lock_trylock(NAME) \ -+# if __OPTION_EGLIBC_BIG_MACROS != 1 -+/* EGLIBC: Declare wrapper function for a big macro if either -+ !__OPTION_EGLIBC_BIG_MACROS or we are using a back door from -+ small-macros-fns.c (__OPTION_EGLIBC_BIG_MACROS == 2). */ -+extern int __libc_lock_trylock_fn (__libc_lock_t *); -+libc_hidden_proto (__libc_lock_trylock_fn); -+# endif /* __OPTION_EGLIBC_BIG_MACROS != 1 */ -+# if __OPTION_EGLIBC_BIG_MACROS -+# ifndef __libc_lock_trylock -+# define __libc_lock_trylock(NAME) \ - lll_trylock (NAME) --# endif -+# endif -+# else -+# define __libc_lock_trylock(NAME) \ -+ __libc_lock_trylock_fn (&(NAME)) -+# endif /* __OPTION_EGLIBC_BIG_MACROS */ - #else - # undef __libc_lock_trylock - # define __libc_lock_trylock(NAME) \ -@@ -206,8 +232,20 @@ typedef pthread_key_t __libc_key_t; - - /* Unlock the named lock variable. */ - #if IS_IN (libc) || IS_IN (libpthread) -+# if __OPTION_EGLIBC_BIG_MACROS != 1 -+/* EGLIBC: Declare wrapper function for a big macro if either -+ !__OPTION_EGLIBC_BIG_MACROS, or we are using a back door from -+ small-macros-fns.c (__OPTION_EGLIBC_BIG_MACROS == 2). */ -+extern void __libc_lock_unlock_fn (__libc_lock_t *); -+libc_hidden_proto (__libc_lock_unlock_fn); -+# endif /* __OPTION_EGLIBC_BIG_MACROS != 1 */ -+# if __OPTION_EGLIBC_BIG_MACROS - # define __libc_lock_unlock(NAME) \ - lll_unlock (NAME, LLL_PRIVATE) -+# else -+# define __libc_lock_unlock(NAME) \ -+ __libc_lock_unlock_fn (&(NAME)) -+# endif /* __OPTION_EGLIBC_BIG_MACROS */ - #else - # define __libc_lock_unlock(NAME) \ - __libc_maybe_call (__pthread_mutex_unlock, (&(NAME)), 0) -diff --git a/sysdeps/nptl/small-macros-fns.c b/sysdeps/nptl/small-macros-fns.c -new file mode 100644 -index 0000000..f751053 ---- /dev/null -+++ b/sysdeps/nptl/small-macros-fns.c -@@ -0,0 +1,72 @@ -+/* EGLIBC: function wrappers for big macros. -+ Copyright (C) 2009 Free Software Foundation, Inc. -+ This file is part of the GNU C Library. -+ -+ The GNU C 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.1 of the -+ License, or (at your option) any later version. -+ -+ The GNU C 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 the GNU C Library; see the file COPYING.LIB. If not, -+ write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, -+ Boston, MA 02111-1307, USA. */ -+ -+#include <gnu/option-groups.h> -+ -+/* Handle macros from ./bits/libc-lock.h. */ -+#if defined _LIBC && (!defined NOT_IN_libc || defined IS_IN_libpthread) -+ -+/* Get the macros for function bodies through a back door. */ -+# undef __OPTION_EGLIBC_BIG_MACROS -+# define __OPTION_EGLIBC_BIG_MACROS 2 -+# include <bits/libc-lock.h> -+ -+void -+__libc_lock_lock_fn (__libc_lock_t *name) -+{ -+ __libc_lock_lock (*name); -+} -+libc_hidden_def (__libc_lock_lock_fn); -+ -+void -+__libc_lock_lock_recursive_fn (__libc_lock_recursive_t *name) -+{ -+ __libc_lock_lock_recursive (*name); -+} -+libc_hidden_def (__libc_lock_lock_recursive_fn); -+ -+int -+__libc_lock_trylock_fn (__libc_lock_t *name) -+{ -+ return __libc_lock_trylock (*name); -+} -+libc_hidden_def (__libc_lock_trylock_fn); -+ -+int -+__libc_lock_trylock_recursive_fn (__libc_lock_recursive_t *name) -+{ -+ return __libc_lock_trylock_recursive (*name); -+} -+libc_hidden_def (__libc_lock_trylock_recursive_fn); -+ -+void -+__libc_lock_unlock_fn (__libc_lock_t *name) -+{ -+ __libc_lock_unlock (*name); -+} -+libc_hidden_def (__libc_lock_unlock_fn); -+ -+void -+__libc_lock_unlock_recursive_fn (__libc_lock_recursive_t *name) -+{ -+ __libc_lock_unlock_recursive (*name); -+} -+libc_hidden_def (__libc_lock_unlock_recursive_fn); -+ -+#endif /*defined _LIBC && (!defined NOT_IN_libc || defined IS_IN_libpthread)*/ -diff --git a/sysdeps/unix/sysv/linux/gethostid.c b/sysdeps/unix/sysv/linux/gethostid.c -index 26e4692..d0a26c8 100644 ---- a/sysdeps/unix/sysv/linux/gethostid.c -+++ b/sysdeps/unix/sysv/linux/gethostid.c -@@ -21,6 +21,7 @@ - #include <unistd.h> - #include <netdb.h> - #include <not-cancel.h> -+#include <gnu/option-groups.h> - - #define HOSTIDFILE "/etc/hostid" - -@@ -89,6 +90,7 @@ gethostid (void) - return id; - } - -+#if __OPTION_EGLIBC_INET - /* Getting from the file was not successful. An intelligent guess for - a unique number of a host is its IP address. Return this. */ - if (__gethostname (hostname, MAXHOSTNAMELEN) < 0 || hostname[0] == '\0') -@@ -115,5 +117,9 @@ gethostid (void) - /* For the return value to be not exactly the IP address we do some - bit fiddling. */ - return (int32_t) (in.s_addr << 16 | in.s_addr >> 16); -+#else -+ /* Return an arbitrary value. */ -+ return 0; -+#endif - } - #endif -diff --git a/sysdeps/unix/sysv/linux/libc_fatal.c b/sysdeps/unix/sysv/linux/libc_fatal.c -index 53a8bbb..cb110d4 100644 ---- a/sysdeps/unix/sysv/linux/libc_fatal.c -+++ b/sysdeps/unix/sysv/linux/libc_fatal.c -@@ -23,6 +23,7 @@ - #include <string.h> - #include <sys/mman.h> - #include <sys/uio.h> -+#include <gnu/option-groups.h> - - static bool - writev_for_fatal (int fd, const struct iovec *iov, size_t niov, size_t total) -@@ -40,6 +41,7 @@ writev_for_fatal (int fd, const struct iovec *iov, size_t niov, size_t total) - static void - backtrace_and_maps (int do_abort, bool written, int fd) - { -+#if __OPTION_EGLIBC_BACKTRACE - if (do_abort > 1 && written) - { - void *addrs[64]; -@@ -62,6 +64,7 @@ backtrace_and_maps (int do_abort, bool written, int fd) - close_not_cancel_no_status (fd2); - } - } -+#endif /* __OPTION_EGLIBC_BACKTRACE */ - } - #define BEFORE_ABORT backtrace_and_maps - -diff --git a/time/Makefile b/time/Makefile -index a411f62..2d022ca 100644 ---- a/time/Makefile -+++ b/time/Makefile -@@ -18,6 +18,8 @@ - # - # Makefile for time routines - # -+include ../option-groups.mak -+ - subdir := time - - include ../Makeconfig -@@ -30,15 +32,23 @@ routines := offtime asctime clock ctime ctime_r difftime \ - tzfile getitimer setitimer \ - stime dysize timegm ftime \ - getdate strptime strptime_l \ -- strftime wcsftime strftime_l wcsftime_l \ -+ strftime strftime_l \ - timespec_get --aux := era alt_digit lc-time-cleanup - --tests := test_time clocktest tst-posixtz tst-strptime tst_wcsftime \ -- tst-getdate tst-mktime tst-mktime2 tst-ftime_l tst-strftime \ -+routines-$(OPTION_POSIX_C_LANG_WIDE_CHAR) \ -+ := wcsftime wcsftime_l -+aux-$(OPTION_EGLIBC_LOCALE_CODE) += alt_digit era lc-time-cleanup -+ -+tests := test_time clocktest tst-posixtz \ -+ tst-getdate tst-mktime tst-mktime2 tst-strftime \ - tst-mktime3 tst-strptime2 bug-asctime bug-asctime_r bug-mktime1 \ - tst-strptime3 bug-getdate1 tst-strptime-whitespace tst-ftime - -+tests-$(OPTION_EGLIBC_LOCALE_CODE) \ -+ += tst-strptime tst-ftime_l -+tests-$(OPTION_POSIX_WIDE_CHAR_DEVICE_IO) \ -+ += tst_wcsftime -+ - include ../Rules - - tz-cflags = -DTZDIR='"$(zonedir)"' \ -diff --git a/time/strftime_l.c b/time/strftime_l.c -index b48ef34..bfdd618 100644 ---- a/time/strftime_l.c -+++ b/time/strftime_l.c -@@ -35,6 +35,10 @@ - # include "../locale/localeinfo.h" - #endif - -+#ifdef _LIBC -+# include <gnu/option-groups.h> -+#endif -+ - #if defined emacs && !defined HAVE_BCOPY - # define HAVE_MEMCPY 1 - #endif -@@ -882,7 +886,7 @@ __strftime_internal (s, maxsize, format, tp, tzset_called ut_argument - case L_('C'): - if (modifier == L_('E')) - { --#if HAVE_STRUCT_ERA_ENTRY -+#if (! _LIBC || __OPTION_EGLIBC_LOCALE_CODE) && HAVE_STRUCT_ERA_ENTRY - struct era_entry *era = _nl_get_era_entry (tp HELPER_LOCALE_ARG); - if (era) - { -@@ -955,7 +959,7 @@ __strftime_internal (s, maxsize, format, tp, tzset_called ut_argument - - if (modifier == L_('O') && 0 <= number_value) - { --#ifdef _NL_CURRENT -+#if (! _LIBC || __OPTION_EGLIBC_LOCALE_CODE) && defined (_NL_CURRENT) - /* Get the locale specific alternate representation of - the number NUMBER_VALUE. If none exist NULL is returned. */ - const CHAR_T *cp = nl_get_alt_digit (number_value -@@ -1260,7 +1264,7 @@ __strftime_internal (s, maxsize, format, tp, tzset_called ut_argument - case L_('Y'): - if (modifier == 'E') - { --#if HAVE_STRUCT_ERA_ENTRY -+#if (! _LIBC || __OPTION_EGLIBC_LOCALE_CODE) && HAVE_STRUCT_ERA_ENTRY - struct era_entry *era = _nl_get_era_entry (tp HELPER_LOCALE_ARG); - if (era) - { -@@ -1285,7 +1289,7 @@ __strftime_internal (s, maxsize, format, tp, tzset_called ut_argument - case L_('y'): - if (modifier == L_('E')) - { --#if HAVE_STRUCT_ERA_ENTRY -+#if (! _LIBC || __OPTION_EGLIBC_LOCALE_CODE) && HAVE_STRUCT_ERA_ENTRY - struct era_entry *era = _nl_get_era_entry (tp HELPER_LOCALE_ARG); - if (era) - { -diff --git a/time/strptime_l.c b/time/strptime_l.c -index 5640cce..784ccbc 100644 ---- a/time/strptime_l.c -+++ b/time/strptime_l.c -@@ -29,6 +29,7 @@ - - #ifdef _LIBC - # define HAVE_LOCALTIME_R 0 -+# include <gnu/option-groups.h> - # include "../locale/localeinfo.h" - #endif - -@@ -84,7 +85,7 @@ localtime_r (t, tp) - if (val < from || val > to) \ - return NULL; \ - } while (0) --#ifdef _NL_CURRENT -+#if (! _LIBC || __OPTION_EGLIBC_LOCALE_CODE) && defined (_NL_CURRENT) - # define get_alt_number(from, to, n) \ - ({ \ - __label__ do_normal; \ -@@ -257,8 +258,10 @@ __strptime_internal (rp, fmt, tmp, statep LOCALE_PARAM) - int cnt; - int cnt_longest; - size_t val; -+#if ! _LIBC || __OPTION_EGLIBC_LOCALE_CODE - size_t num_eras; - struct era_entry *era = NULL; -+#endif - enum ptime_locale_status { not, loc, raw } decided_longest; - struct __strptime_state - { -@@ -820,6 +823,7 @@ __strptime_internal (rp, fmt, tmp, statep LOCALE_PARAM) - s.want_xday = 1; - break; - case 'C': -+#if ! _LIBC || __OPTION_EGLIBC_LOCALE_CODE - if (s.decided != raw) - { - if (s.era_cnt >= 0) -@@ -856,10 +860,12 @@ __strptime_internal (rp, fmt, tmp, statep LOCALE_PARAM) - - s.decided = raw; - } -+#endif - /* The C locale has no era information, so use the - normal representation. */ - goto match_century; - case 'y': -+#if ! _LIBC || __OPTION_EGLIBC_LOCALE_CODE - if (s.decided != raw) - { - get_number(0, 9999, 4); -@@ -918,9 +924,10 @@ __strptime_internal (rp, fmt, tmp, statep LOCALE_PARAM) - - s.decided = raw; - } -- -+#endif - goto match_year_in_century; - case 'Y': -+#if ! _LIBC || __OPTION_EGLIBC_LOCALE_CODE - if (s.decided != raw) - { - num_eras = _NL_CURRENT_WORD (LC_TIME, -@@ -948,6 +955,7 @@ __strptime_internal (rp, fmt, tmp, statep LOCALE_PARAM) - - s.decided = raw; - } -+#endif - get_number (0, 9999, 4); - tm->tm_year = val - 1900; - s.want_century = 0; -@@ -1118,6 +1126,7 @@ __strptime_internal (rp, fmt, tmp, statep LOCALE_PARAM) - tm->tm_year = (s.century - 19) * 100; - } - -+#if ! _LIBC || __OPTION_EGLIBC_LOCALE_CODE - if (s.era_cnt != -1) - { - era = _nl_select_era_entry (s.era_cnt HELPER_LOCALE_ARG); -@@ -1132,6 +1141,7 @@ __strptime_internal (rp, fmt, tmp, statep LOCALE_PARAM) - tm->tm_year = era->start_date[0]; - } - else -+#endif - if (s.want_era) - { - /* No era found but we have seen an E modifier. Rectify some -diff --git a/timezone/Makefile b/timezone/Makefile -index 886b06e..f922684 100644 ---- a/timezone/Makefile -+++ b/timezone/Makefile -@@ -127,7 +127,7 @@ $(testdata)/XT%: testdata/XT% - - $(objpfx)tzselect: tzselect.ksh $(common-objpfx)config.make - sed -e 's|/bin/bash|/bin/sh|' \ -- -e 's|TZDIR=[^}]*|TZDIR=$(zonedir)|' \ -+ -e '/TZDIR=/s|\$$(pwd)|$(zonedir)|' \ - -e '/TZVERSION=/s|see_Makefile|"$(version)"|' \ - -e '/PKGVERSION=/s|=.*|="$(PKGVERSION)"|' \ - -e '/REPORT_BUGS_TO=/s|=.*|="$(REPORT_BUGS_TO)"|' \ -diff --git a/wcsmbs/Makefile b/wcsmbs/Makefile -index 44a4494..db9fc24 100644 ---- a/wcsmbs/Makefile -+++ b/wcsmbs/Makefile -@@ -18,15 +18,21 @@ - # - # Sub-makefile for wcsmbs portion of the library. - # -+include ../option-groups.mak -+ - subdir := wcsmbs - - include ../Makeconfig - - headers := wchar.h bits/wchar.h bits/wchar2.h bits/wchar-ldbl.h uchar.h - --routines := wcscat wcschr wcscmp wcscpy wcscspn wcsdup wcslen wcsncat \ -+# These functions are used by printf_fp.c, even in the plain case; see -+# comments there for OPTION_EGLIBC_LOCALE_CODE. -+routines := wmemcpy wmemset -+routines-$(OPTION_POSIX_C_LANG_WIDE_CHAR) \ -+ := wcscat wcschr wcscmp wcscpy wcscspn wcsdup wcslen wcsncat \ - wcsncmp wcsncpy wcspbrk wcsrchr wcsspn wcstok wcsstr wmemchr \ -- wmemcmp wmemcpy wmemmove wmemset wcpcpy wcpncpy wmempcpy \ -+ wmemcmp wmemmove wcpcpy wcpncpy wmempcpy \ - btowc wctob mbsinit \ - mbrlen mbrtowc wcrtomb mbsrtowcs wcsrtombs \ - mbsnrtowcs wcsnrtombs wcsnlen wcschrnul \ -@@ -38,14 +44,21 @@ routines := wcscat wcschr wcscmp wcscpy wcscspn wcsdup wcslen wcsncat \ - wcscoll_l wcsxfrm_l \ - wcscasecmp wcsncase wcscasecmp_l wcsncase_l \ - wcsmbsload mbsrtowcs_l \ -- isoc99_wscanf isoc99_vwscanf isoc99_fwscanf isoc99_vfwscanf \ - isoc99_swscanf isoc99_vswscanf \ - mbrtoc16 c16rtomb - --strop-tests := wcscmp wcsncmp wmemcmp wcslen wcschr wcsrchr wcscpy --tests := tst-wcstof wcsmbs-tst1 tst-wcsnlen tst-btowc tst-mbrtowc \ -- tst-wcrtomb tst-wcpncpy tst-mbsrtowcs tst-wchar-h tst-mbrtowc2 \ -- tst-c16c32-1 wcsatcliff $(addprefix test-,$(strop-tests)) -+routines-$(OPTION_POSIX_WIDE_CHAR_DEVICE_IO) \ -+ += isoc99_wscanf isoc99_vwscanf isoc99_fwscanf isoc99_vfwscanf -+ -+strop-tests := wcscmp wmemcmp wmemcmp wcslen wcschr wcsrchr wcscpy -+ -+tests := tst-wchar-h -+tests-$(OPTION_EGLIBC_LOCALE_CODE) \ -+ += tst-btowc tst-mbrtowc tst-mbrtowc2 tst-wcrtomb tst-c16c32-1 -+tests-$(OPTION_POSIX_C_LANG_WIDE_CHAR) \ -+ += tst-wcstof wcsmbs-tst1 tst-wcsnlen \ -+ tst-wcpncpy tst-mbsrtowcs \ -+ wcsatcliff $(addprefix test-,$(strop-tests)) - - include ../Rules - -diff --git a/wcsmbs/wcsmbsload.c b/wcsmbs/wcsmbsload.c -index 6bb49bc..2ab9d07 100644 ---- a/wcsmbs/wcsmbsload.c -+++ b/wcsmbs/wcsmbsload.c -@@ -21,6 +21,7 @@ - #include <limits.h> - #include <stdlib.h> - #include <string.h> -+#include <gnu/option-groups.h> - - #include <locale/localeinfo.h> - #include <wcsmbsload.h> -@@ -143,6 +144,7 @@ __wcsmbs_getfct (const char *to, const char *from, size_t *nstepsp) - }) - - -+#if __OPTION_EGLIBC_LOCALE_CODE - /* Some of the functions here must not be used while setlocale is called. */ - __libc_rwlock_define (extern, __libc_setlocale_lock attribute_hidden) - -@@ -211,6 +213,17 @@ __wcsmbs_load_conv (struct __locale_data *new_category) - - __libc_rwlock_unlock (__libc_setlocale_lock); - } -+#else -+void -+internal_function -+__wcsmbs_load_conv (struct __locale_data *new_category) -+{ -+ /* When OPTION_EGLIBC_LOCALE_CODE is disabled, we should never reach -+ this point: there is no way to change locales, so every locale -+ passed to get_gconv_fcts should be _nl_C_LC_CTYPE. */ -+ abort (); -+} -+#endif - - - /* Clone the current conversion function set. */ -diff --git a/wctype/Makefile b/wctype/Makefile -index c56f07c..4e8af43 100644 ---- a/wctype/Makefile -+++ b/wctype/Makefile -@@ -18,14 +18,20 @@ - # - # Sub-makefile for wctype portion of the library. - # -+include ../option-groups.mak -+ - subdir := wctype - - include ../Makeconfig - - headers := wctype.h --routines := wcfuncs wctype iswctype wctrans towctrans \ -- wcfuncs_l wctype_l iswctype_l wctrans_l towctrans_l -- --tests := test_wctype test_wcfuncs bug-wctypeh -+routines := wctrans towctrans towctrans_l -+routines-$(OPTION_POSIX_C_LANG_WIDE_CHAR) \ -+ := wcfuncs wctype iswctype \ -+ wcfuncs_l wctype_l iswctype_l wctrans_l -+ -+tests := -+tests-$(OPTION_POSIX_C_LANG_WIDE_CHAR) \ -+ += test_wctype test_wcfuncs bug-wctypeh - - include ../Rules --- -2.1.4 - diff --git a/yocto-poky/meta/recipes-core/glibc/glibc/0025-eglibc-Forward-port-cross-locale-generation-support.patch b/yocto-poky/meta/recipes-core/glibc/glibc/0025-eglibc-Forward-port-cross-locale-generation-support.patch new file mode 100644 index 000000000..68d11192a --- /dev/null +++ b/yocto-poky/meta/recipes-core/glibc/glibc/0025-eglibc-Forward-port-cross-locale-generation-support.patch @@ -0,0 +1,566 @@ +From a5695930aec68b3f501e475d8705cddbb63f695e Mon Sep 17 00:00:00 2001 +From: Khem Raj <raj.khem@gmail.com> +Date: Wed, 18 Mar 2015 01:33:49 +0000 +Subject: [PATCH 25/25] eglibc: Forward port cross locale generation support + +Upstream-Status: Pending + +Signed-off-by: Khem Raj <raj.khem@gmail.com> +--- + locale/Makefile | 3 ++- + locale/catnames.c | 48 +++++++++++++++++++++++++++++++++++ + locale/localeinfo.h | 2 +- + locale/programs/charmap-dir.c | 6 +++++ + locale/programs/ld-collate.c | 17 ++++++------- + locale/programs/ld-ctype.c | 27 ++++++++++---------- + locale/programs/ld-time.c | 31 +++++++++++++++-------- + locale/programs/linereader.c | 2 +- + locale/programs/localedef.c | 8 ++++++ + locale/programs/locfile.c | 5 +++- + locale/programs/locfile.h | 59 +++++++++++++++++++++++++++++++++++++++++-- + locale/setlocale.c | 30 ---------------------- + 12 files changed, 169 insertions(+), 69 deletions(-) + create mode 100644 locale/catnames.c + +diff --git a/locale/Makefile b/locale/Makefile +index 75afbe1..d32523b 100644 +--- a/locale/Makefile ++++ b/locale/Makefile +@@ -25,7 +25,8 @@ include ../Makeconfig + headers = locale.h bits/locale.h langinfo.h xlocale.h + routines = setlocale findlocale loadlocale loadarchive \ + localeconv nl_langinfo nl_langinfo_l mb_cur_max \ +- newlocale duplocale freelocale uselocale ++ newlocale duplocale freelocale uselocale \ ++ catnames + tests = tst-C-locale tst-locname tst-duplocale + categories = ctype messages monetary numeric time paper name \ + address telephone measurement identification collate +diff --git a/locale/catnames.c b/locale/catnames.c +new file mode 100644 +index 0000000..9fad357 +--- /dev/null ++++ b/locale/catnames.c +@@ -0,0 +1,48 @@ ++/* Copyright (C) 2006 Free Software Foundation, Inc. ++ This file is part of the GNU C Library. ++ ++ The GNU C 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.1 of the License, or (at your option) any later version. ++ ++ The GNU C 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 the GNU C Library; if not, write to the Free ++ Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ++ 02111-1307 USA. */ ++ ++#include "localeinfo.h" ++ ++/* Define an array of category names (also the environment variable names). */ ++const union catnamestr_t _nl_category_names attribute_hidden = ++ { ++ { ++#define DEFINE_CATEGORY(category, category_name, items, a) \ ++ category_name, ++#include "categories.def" ++#undef DEFINE_CATEGORY ++ } ++ }; ++ ++const uint8_t _nl_category_name_idxs[__LC_LAST] attribute_hidden = ++ { ++#define DEFINE_CATEGORY(category, category_name, items, a) \ ++ [category] = offsetof (union catnamestr_t, CATNAMEMF (__LINE__)), ++#include "categories.def" ++#undef DEFINE_CATEGORY ++ }; ++ ++/* An array of their lengths, for convenience. */ ++const uint8_t _nl_category_name_sizes[] attribute_hidden = ++ { ++#define DEFINE_CATEGORY(category, category_name, items, a) \ ++ [category] = sizeof (category_name) - 1, ++#include "categories.def" ++#undef DEFINE_CATEGORY ++ [LC_ALL] = sizeof ("LC_ALL") - 1 ++ }; +diff --git a/locale/localeinfo.h b/locale/localeinfo.h +index 789da44..4ac9249 100644 +--- a/locale/localeinfo.h ++++ b/locale/localeinfo.h +@@ -224,7 +224,7 @@ __libc_tsd_define (extern, __locale_t, LOCALE) + unused. We can manage this playing some tricks with weak references. + But with thread-local locale settings, it becomes quite ungainly unless + we can use __thread variables. So only in that case do we attempt this. */ +-#ifndef SHARED ++#if !defined SHARED && !defined IN_GLIBC_LOCALEDEF + # include <tls.h> + # define NL_CURRENT_INDIRECT 1 + #endif +diff --git a/locale/programs/charmap-dir.c b/locale/programs/charmap-dir.c +index cf7adea..ef3b811 100644 +--- a/locale/programs/charmap-dir.c ++++ b/locale/programs/charmap-dir.c +@@ -19,7 +19,9 @@ + #include <error.h> + #include <fcntl.h> + #include <libintl.h> ++#ifndef NO_UNCOMPRESS + #include <spawn.h> ++#endif + #include <stdio.h> + #include <stdlib.h> + #include <string.h> +@@ -156,6 +158,7 @@ charmap_closedir (CHARMAP_DIR *cdir) + return closedir (dir); + } + ++#ifndef NO_UNCOMPRESS + /* Creates a subprocess decompressing the given pathname, and returns + a stream reading its output (the decompressed data). */ + static +@@ -204,6 +207,7 @@ fopen_uncompressed (const char *pathname, const char *compressor) + } + return NULL; + } ++#endif + + /* Opens a charmap for reading, given its name (not an alias name). */ + FILE * +@@ -226,6 +230,7 @@ charmap_open (const char *directory, const char *name) + if (stream != NULL) + return stream; + ++#ifndef NO_UNCOMPRESS + memcpy (p, ".gz", 4); + stream = fopen_uncompressed (pathname, "gzip"); + if (stream != NULL) +@@ -235,6 +240,7 @@ charmap_open (const char *directory, const char *name) + stream = fopen_uncompressed (pathname, "bzip2"); + if (stream != NULL) + return stream; ++#endif + + return NULL; + } +diff --git a/locale/programs/ld-collate.c b/locale/programs/ld-collate.c +index dc0fe30..3c88c6d 100644 +--- a/locale/programs/ld-collate.c ++++ b/locale/programs/ld-collate.c +@@ -350,7 +350,7 @@ new_element (struct locale_collate_t *collate, const char *mbs, size_t mbslen, + } + if (wcs != NULL) + { +- size_t nwcs = wcslen ((wchar_t *) wcs); ++ size_t nwcs = wcslen_uint32 (wcs); + uint32_t zero = 0; + /* Handle <U0000> as a single character. */ + if (nwcs == 0) +@@ -1776,8 +1776,7 @@ symbol `%s' has the same encoding as"), (*eptr)->name); + + if ((*eptr)->nwcs == runp->nwcs) + { +- int c = wmemcmp ((wchar_t *) (*eptr)->wcs, +- (wchar_t *) runp->wcs, runp->nwcs); ++ int c = wmemcmp_uint32 ((*eptr)->wcs, runp->wcs, runp->nwcs); + + if (c == 0) + { +@@ -2010,9 +2009,9 @@ add_to_tablewc (uint32_t ch, struct element_t *runp) + one consecutive entry. */ + if (runp->wcnext != NULL + && runp->nwcs == runp->wcnext->nwcs +- && wmemcmp ((wchar_t *) runp->wcs, +- (wchar_t *)runp->wcnext->wcs, +- runp->nwcs - 1) == 0 ++ && wmemcmp_uint32 (runp->wcs, ++ runp->wcnext->wcs, ++ runp->nwcs - 1) == 0 + && (runp->wcs[runp->nwcs - 1] + == runp->wcnext->wcs[runp->nwcs - 1] + 1)) + { +@@ -2036,9 +2035,9 @@ add_to_tablewc (uint32_t ch, struct element_t *runp) + runp = runp->wcnext; + while (runp->wcnext != NULL + && runp->nwcs == runp->wcnext->nwcs +- && wmemcmp ((wchar_t *) runp->wcs, +- (wchar_t *)runp->wcnext->wcs, +- runp->nwcs - 1) == 0 ++ && wmemcmp_uint32 (runp->wcs, ++ runp->wcnext->wcs, ++ runp->nwcs - 1) == 0 + && (runp->wcs[runp->nwcs - 1] + == runp->wcnext->wcs[runp->nwcs - 1] + 1)); + +diff --git a/locale/programs/ld-ctype.c b/locale/programs/ld-ctype.c +index 3f464ef..b7b6b51 100644 +--- a/locale/programs/ld-ctype.c ++++ b/locale/programs/ld-ctype.c +@@ -926,7 +926,7 @@ ctype_output (struct localedef_t *locale, const struct charmap_t *charmap, + allocate_arrays (ctype, charmap, ctype->repertoire); + + default_missing_len = (ctype->default_missing +- ? wcslen ((wchar_t *) ctype->default_missing) ++ ? wcslen_uint32 (ctype->default_missing) + : 0); + + init_locale_data (&file, nelems); +@@ -1937,7 +1937,7 @@ read_translit_entry (struct linereader *ldfile, struct locale_ctype_t *ctype, + ignore = 1; + else + /* This value is usable. */ +- obstack_grow (ob, to_wstr, wcslen ((wchar_t *) to_wstr) * 4); ++ obstack_grow (ob, to_wstr, wcslen_uint32 (to_wstr) * 4); + + first = 0; + } +@@ -2471,8 +2471,8 @@ with character code range values one must use the absolute ellipsis `...'")); + } + + handle_tok_digit: +- class_bit = _ISwdigit; +- class256_bit = _ISdigit; ++ class_bit = BITw (tok_digit); ++ class256_bit = BIT (tok_digit); + handle_digits = 1; + goto read_charclass; + +@@ -3929,8 +3929,7 @@ allocate_arrays (struct locale_ctype_t *ctype, const struct charmap_t *charmap, + + while (idx < number) + { +- int res = wcscmp ((const wchar_t *) sorted[idx]->from, +- (const wchar_t *) runp->from); ++ int res = wcscmp_uint32 (sorted[idx]->from, runp->from); + if (res == 0) + { + replace = 1; +@@ -3967,11 +3966,11 @@ allocate_arrays (struct locale_ctype_t *ctype, const struct charmap_t *charmap, + for (size_t cnt = 0; cnt < number; ++cnt) + { + struct translit_to_t *srunp; +- from_len += wcslen ((const wchar_t *) sorted[cnt]->from) + 1; ++ from_len += wcslen_uint32 (sorted[cnt]->from) + 1; + srunp = sorted[cnt]->to; + while (srunp != NULL) + { +- to_len += wcslen ((const wchar_t *) srunp->str) + 1; ++ to_len += wcslen_uint32 (srunp->str) + 1; + srunp = srunp->next; + } + /* Plus one for the extra NUL character marking the end of +@@ -3995,18 +3994,18 @@ allocate_arrays (struct locale_ctype_t *ctype, const struct charmap_t *charmap, + ctype->translit_from_idx[cnt] = from_len; + ctype->translit_to_idx[cnt] = to_len; + +- len = wcslen ((const wchar_t *) sorted[cnt]->from) + 1; +- wmemcpy ((wchar_t *) &ctype->translit_from_tbl[from_len], +- (const wchar_t *) sorted[cnt]->from, len); ++ len = wcslen_uint32 (sorted[cnt]->from) + 1; ++ wmemcpy_uint32 (&ctype->translit_from_tbl[from_len], ++ sorted[cnt]->from, len); + from_len += len; + + ctype->translit_to_idx[cnt] = to_len; + srunp = sorted[cnt]->to; + while (srunp != NULL) + { +- len = wcslen ((const wchar_t *) srunp->str) + 1; +- wmemcpy ((wchar_t *) &ctype->translit_to_tbl[to_len], +- (const wchar_t *) srunp->str, len); ++ len = wcslen_uint32 (srunp->str) + 1; ++ wmemcpy_uint32 (&ctype->translit_to_tbl[to_len], ++ srunp->str, len); + to_len += len; + srunp = srunp->next; + } +diff --git a/locale/programs/ld-time.c b/locale/programs/ld-time.c +index db490c6..75dc505 100644 +--- a/locale/programs/ld-time.c ++++ b/locale/programs/ld-time.c +@@ -215,8 +215,10 @@ No definition for %s category found"), "LC_TIME")); + } + else + { ++ static const uint32_t wt_fmt_ampm[] ++ = { '%','I',':','%','M',':','%','S',' ','%','p',0 }; + time->t_fmt_ampm = "%I:%M:%S %p"; +- time->wt_fmt_ampm = (const uint32_t *) L"%I:%M:%S %p"; ++ time->wt_fmt_ampm = wt_fmt_ampm; + } + } + +@@ -226,7 +228,7 @@ No definition for %s category found"), "LC_TIME")); + const int days_per_month[12] = { 31, 29, 31, 30, 31, 30, + 31, 31, 30, 31 ,30, 31 }; + size_t idx; +- wchar_t *wstr; ++ uint32_t *wstr; + + time->era_entries = + (struct era_data *) xmalloc (time->num_era +@@ -464,18 +466,18 @@ No definition for %s category found"), "LC_TIME")); + } + + /* Now generate the wide character name and format. */ +- wstr = wcschr ((wchar_t *) time->wera[idx], L':');/* end direction */ +- wstr = wstr ? wcschr (wstr + 1, L':') : NULL; /* end offset */ +- wstr = wstr ? wcschr (wstr + 1, L':') : NULL; /* end start */ +- wstr = wstr ? wcschr (wstr + 1, L':') : NULL; /* end end */ ++ wstr = wcschr_uint32 (time->wera[idx], L':'); /* end direction */ ++ wstr = wstr ? wcschr_uint32 (wstr + 1, L':') : NULL; /* end offset */ ++ wstr = wstr ? wcschr_uint32 (wstr + 1, L':') : NULL; /* end start */ ++ wstr = wstr ? wcschr_uint32 (wstr + 1, L':') : NULL; /* end end */ + if (wstr != NULL) + { +- time->era_entries[idx].wname = (uint32_t *) wstr + 1; +- wstr = wcschr (wstr + 1, L':'); /* end name */ ++ time->era_entries[idx].wname = wstr + 1; ++ wstr = wcschr_uint32 (wstr + 1, L':'); /* end name */ + if (wstr != NULL) + { + *wstr = L'\0'; +- time->era_entries[idx].wformat = (uint32_t *) wstr + 1; ++ time->era_entries[idx].wformat = wstr + 1; + } + else + time->era_entries[idx].wname = +@@ -530,7 +532,16 @@ No definition for %s category found"), "LC_TIME")); + if (time->date_fmt == NULL) + time->date_fmt = "%a %b %e %H:%M:%S %Z %Y"; + if (time->wdate_fmt == NULL) +- time->wdate_fmt = (const uint32_t *) L"%a %b %e %H:%M:%S %Z %Y"; ++ { ++ static const uint32_t wdate_fmt[] = ++ { '%','a',' ', ++ '%','b',' ', ++ '%','e',' ', ++ '%','H',':','%','M',':','%','S',' ', ++ '%','Z',' ', ++ '%','Y',0 }; ++ time->wdate_fmt = wdate_fmt; ++ } + } + + +diff --git a/locale/programs/linereader.c b/locale/programs/linereader.c +index 2e05130..653b68c 100644 +--- a/locale/programs/linereader.c ++++ b/locale/programs/linereader.c +@@ -595,7 +595,7 @@ get_string (struct linereader *lr, const struct charmap_t *charmap, + { + int return_widestr = lr->return_widestr; + char *buf; +- wchar_t *buf2 = NULL; ++ uint32_t *buf2 = NULL; + size_t bufact; + size_t bufmax = 56; + +diff --git a/locale/programs/localedef.c b/locale/programs/localedef.c +index fd6ca51..328d36c 100644 +--- a/locale/programs/localedef.c ++++ b/locale/programs/localedef.c +@@ -114,6 +114,7 @@ void (*argp_program_version_hook) (FILE *, struct argp_state *) = print_version; + #define OPT_LIST_ARCHIVE 309 + #define OPT_LITTLE_ENDIAN 400 + #define OPT_BIG_ENDIAN 401 ++#define OPT_UINT32_ALIGN 402 + + /* Definitions of arguments for argp functions. */ + static const struct argp_option options[] = +@@ -150,6 +151,8 @@ static const struct argp_option options[] = + N_("Generate little-endian output") }, + { "big-endian", OPT_BIG_ENDIAN, NULL, 0, + N_("Generate big-endian output") }, ++ { "uint32-align", OPT_UINT32_ALIGN, "ALIGNMENT", 0, ++ N_("Set the target's uint32_t alignment in bytes (default 4)") }, + { NULL, 0, NULL, 0, NULL } + }; + +@@ -239,12 +242,14 @@ main (int argc, char *argv[]) + ctype locale. (P1003.2 4.35.5.2) */ + setlocale (LC_CTYPE, "POSIX"); + ++#ifndef NO_SYSCONF + /* Look whether the system really allows locale definitions. POSIX + defines error code 3 for this situation so I think it must be + a fatal error (see P1003.2 4.35.8). */ + if (sysconf (_SC_2_LOCALEDEF) < 0) + WITH_CUR_LOCALE (error (3, 0, _("\ + FATAL: system does not define `_POSIX2_LOCALEDEF'"))); ++#endif + + /* Process charmap file. */ + charmap = charmap_read (charmap_file, verbose, 1, be_quiet, 1); +@@ -338,6 +343,9 @@ parse_opt (int key, char *arg, struct argp_state *state) + case OPT_BIG_ENDIAN: + set_big_endian (true); + break; ++ case OPT_UINT32_ALIGN: ++ uint32_align_mask = strtol (arg, NULL, 0) - 1; ++ break; + case 'c': + force_output = 1; + break; +diff --git a/locale/programs/locfile.c b/locale/programs/locfile.c +index 33da52e..f790c4c 100644 +--- a/locale/programs/locfile.c ++++ b/locale/programs/locfile.c +@@ -544,6 +544,9 @@ compare_files (const char *filename1, const char *filename2, size_t size, + machine running localedef. */ + bool swap_endianness_p; + ++/* The target's value of __align__(uint32_t) - 1. */ ++unsigned int uint32_align_mask = 3; ++ + /* When called outside a start_locale_structure/end_locale_structure + or start_locale_prelude/end_locale_prelude block, record that the + next byte in FILE's obstack will be the first byte of a new element. +@@ -621,7 +624,7 @@ add_locale_string (struct locale_file *file, const char *string) + void + add_locale_wstring (struct locale_file *file, const uint32_t *string) + { +- add_locale_uint32_array (file, string, wcslen ((const wchar_t *) string) + 1); ++ add_locale_uint32_array (file, string, wcslen_uint32 (string) + 1); + } + + /* Record that FILE's next element is the 32-bit integer VALUE. */ +diff --git a/locale/programs/locfile.h b/locale/programs/locfile.h +index 6fc441b..118b171 100644 +--- a/locale/programs/locfile.h ++++ b/locale/programs/locfile.h +@@ -71,6 +71,8 @@ extern void write_all_categories (struct localedef_t *definitions, + + extern bool swap_endianness_p; + ++extern unsigned int uint32_align_mask; ++ + /* Change the output to be big-endian if BIG_ENDIAN is true and + little-endian otherwise. */ + static inline void +@@ -89,7 +91,8 @@ maybe_swap_uint32 (uint32_t value) + } + + /* Likewise, but munge an array of N uint32_ts starting at ARRAY. */ +-static inline void ++static void ++__attribute__ ((unused)) + maybe_swap_uint32_array (uint32_t *array, size_t n) + { + if (swap_endianness_p) +@@ -99,7 +102,8 @@ maybe_swap_uint32_array (uint32_t *array, size_t n) + + /* Like maybe_swap_uint32_array, but the array of N elements is at + the end of OBSTACK's current object. */ +-static inline void ++static void ++__attribute__ ((unused)) + maybe_swap_uint32_obstack (struct obstack *obstack, size_t n) + { + maybe_swap_uint32_array ((uint32_t *) obstack_next_free (obstack) - n, n); +@@ -276,4 +280,55 @@ extern void identification_output (struct localedef_t *locale, + const struct charmap_t *charmap, + const char *output_path); + ++static size_t wcslen_uint32 (const uint32_t *str) __attribute__ ((unused)); ++static uint32_t * wmemcpy_uint32 (uint32_t *s1, const uint32_t *s2, size_t n) __attribute__ ((unused)); ++static uint32_t * wcschr_uint32 (const uint32_t *s, uint32_t ch) __attribute__ ((unused)); ++static int wcscmp_uint32 (const uint32_t *s1, const uint32_t *s2) __attribute__ ((unused)); ++static int wmemcmp_uint32 (const uint32_t *s1, const uint32_t *s2, size_t n) __attribute__ ((unused)); ++ ++static size_t ++wcslen_uint32 (const uint32_t *str) ++{ ++ size_t len = 0; ++ while (str[len] != 0) ++ len++; ++ return len; ++} ++ ++static int ++wmemcmp_uint32 (const uint32_t *s1, const uint32_t *s2, size_t n) ++{ ++ while (n-- != 0) ++ { ++ int diff = *s1++ - *s2++; ++ if (diff != 0) ++ return diff; ++ } ++ return 0; ++} ++ ++static int ++wcscmp_uint32 (const uint32_t *s1, const uint32_t *s2) ++{ ++ while (*s1 != 0 && *s1 == *s2) ++ s1++, s2++; ++ return *s1 - *s2; ++} ++ ++static uint32_t * ++wmemcpy_uint32 (uint32_t *s1, const uint32_t *s2, size_t n) ++{ ++ return memcpy (s1, s2, n * sizeof (uint32_t)); ++} ++ ++static uint32_t * ++wcschr_uint32 (const uint32_t *s, uint32_t ch) ++{ ++ do ++ if (*s == ch) ++ return (uint32_t *) s; ++ while (*s++ != 0); ++ return 0; ++} ++ + #endif /* locfile.h */ +diff --git a/locale/setlocale.c b/locale/setlocale.c +index ead030d..b551332 100644 +--- a/locale/setlocale.c ++++ b/locale/setlocale.c +@@ -64,36 +64,6 @@ static char *const _nl_current_used[] = + #endif + + +-/* Define an array of category names (also the environment variable names). */ +-const union catnamestr_t _nl_category_names attribute_hidden = +- { +- { +-#define DEFINE_CATEGORY(category, category_name, items, a) \ +- category_name, +-#include "categories.def" +-#undef DEFINE_CATEGORY +- } +- }; +- +-const uint8_t _nl_category_name_idxs[__LC_LAST] attribute_hidden = +- { +-#define DEFINE_CATEGORY(category, category_name, items, a) \ +- [category] = offsetof (union catnamestr_t, CATNAMEMF (__LINE__)), +-#include "categories.def" +-#undef DEFINE_CATEGORY +- }; +- +-/* An array of their lengths, for convenience. */ +-const uint8_t _nl_category_name_sizes[] attribute_hidden = +- { +-#define DEFINE_CATEGORY(category, category_name, items, a) \ +- [category] = sizeof (category_name) - 1, +-#include "categories.def" +-#undef DEFINE_CATEGORY +- [LC_ALL] = sizeof ("LC_ALL") - 1 +- }; +- +- + #ifdef NL_CURRENT_INDIRECT + # define WEAK_POSTLOAD(postload) weak_extern (postload) + #else +-- +2.6.4 + diff --git a/yocto-poky/meta/recipes-core/glibc/glibc/0026-When-disabling-SSE-make-sure-fpmath-is-not-set-to-us.patch b/yocto-poky/meta/recipes-core/glibc/glibc/0026-When-disabling-SSE-make-sure-fpmath-is-not-set-to-us.patch new file mode 100644 index 000000000..2b889a94c --- /dev/null +++ b/yocto-poky/meta/recipes-core/glibc/glibc/0026-When-disabling-SSE-make-sure-fpmath-is-not-set-to-us.patch @@ -0,0 +1,48 @@ +From 97fe7f1b23ea1f17533884b8fa7f7eb40087d558 Mon Sep 17 00:00:00 2001 +From: Khem Raj <raj.khem@gmail.com> +Date: Tue, 5 Jan 2016 17:50:00 -0800 +Subject: [PATCH] When disabling SSE, make sure -fpmath is not set to use SSE + either + +This fixes errors when we inject sse options through CFLAGS and now +that we have -Werror turned on by default this warning turns to become +error on x86 + +gcc -m32 -march=core2 -mtune=core2 -msse3 -mfpmath=sse -x c /dev/null -S +-mno-sse -mno-mmx + +generates warning +/dev/null:1:0: warning: SSE instruction set disabled, using 387 +arithmetics + +where as + +gcc -m32 -march=core2 -mtune=core2 -msse3 -mfpmath=sse -x c /dev/null -S +-mno-sse -mno-mmx -mfpmath=387 + +Generates no warnings + +Signed-off-by: Khem Raj <raj.khem@gmail.com> +--- +Upstream-Status: Submitted + + ChangeLog | 5 +++++ + sysdeps/i386/Makefile | 2 +- + 2 files changed, 6 insertions(+), 1 deletion(-) + +diff --git a/sysdeps/i386/Makefile b/sysdeps/i386/Makefile +index 168512f..70153b3 100644 +--- a/sysdeps/i386/Makefile ++++ b/sysdeps/i386/Makefile +@@ -89,7 +89,7 @@ ifeq ($(subdir),elf) + # the first 3 mm/xmm/ymm/zmm registers are used to pass vector parameters + # which must be preserved. + CFLAGS-.os += $(if $(filter $(@F),$(patsubst %,%.os,$(all-rtld-routines))),\ +- -mno-sse -mno-mmx) ++ -mno-sse -mno-mmx -mfpmath=387) + + tests-special += $(objpfx)tst-ld-sse-use.out + $(objpfx)tst-ld-sse-use.out: ../sysdeps/i386/tst-ld-sse-use.sh $(objpfx)ld.so +-- +2.6.4 + diff --git a/yocto-poky/meta/recipes-core/glibc/glibc/0026-eglibc-dl_debug_mask-is-controlled-by-__OPTION_EGLIB.patch b/yocto-poky/meta/recipes-core/glibc/glibc/0026-eglibc-dl_debug_mask-is-controlled-by-__OPTION_EGLIB.patch deleted file mode 100644 index 6b611dbde..000000000 --- a/yocto-poky/meta/recipes-core/glibc/glibc/0026-eglibc-dl_debug_mask-is-controlled-by-__OPTION_EGLIB.patch +++ /dev/null @@ -1,556 +0,0 @@ -From ba069b3107f5ad200c4ab95e69cf368e2353b00a Mon Sep 17 00:00:00 2001 -From: Khem Raj <raj.khem@gmail.com> -Date: Wed, 18 Mar 2015 00:46:50 +0000 -Subject: [PATCH 26/27] eglibc: dl_debug_mask is controlled by - __OPTION_EGLIBC_RTLD_DEBUG - -use GLRO_dl_debug_mask - -Singed-off-by: Khem Raj <raj.khem@gmail.com> - -Upstream-Status: Pending ---- - csu/libc-start.c | 4 ++-- - elf/dl-cache.c | 4 ++-- - elf/dl-close.c | 6 +++--- - elf/dl-conflict.c | 2 +- - elf/dl-deps.c | 6 +++--- - elf/dl-error.c | 2 +- - elf/dl-fini.c | 4 ++-- - elf/dl-init.c | 4 ++-- - elf/dl-load.c | 16 ++++++++-------- - elf/dl-lookup.c | 14 +++++++------- - elf/dl-object.c | 2 +- - elf/dl-open.c | 10 +++++----- - elf/dl-reloc.c | 2 +- - elf/dl-version.c | 2 +- - elf/get-dynamic-info.h | 2 +- - elf/rtld.c | 22 +++++++++++----------- - 16 files changed, 51 insertions(+), 51 deletions(-) - -diff --git a/csu/libc-start.c b/csu/libc-start.c -index 0afa7c0..2151fb6 100644 ---- a/csu/libc-start.c -+++ b/csu/libc-start.c -@@ -238,7 +238,7 @@ LIBC_START_MAIN (int (*main) (int, char **, char ** MAIN_AUXVEC_DECL), - - /* Call the initializer of the program, if any. */ - #ifdef SHARED -- if (__builtin_expect (GLRO(dl_debug_mask) & DL_DEBUG_IMPCALLS, 0)) -+ if (__builtin_expect (GLRO_dl_debug_mask & DL_DEBUG_IMPCALLS, 0)) - GLRO(dl_debug_printf) ("\ninitialize program: %s\n\n", argv[0]); - #endif - if (init) -@@ -261,7 +261,7 @@ LIBC_START_MAIN (int (*main) (int, char **, char ** MAIN_AUXVEC_DECL), - #endif - - #ifdef SHARED -- if (__glibc_unlikely (GLRO(dl_debug_mask) & DL_DEBUG_IMPCALLS)) -+ if (__glibc_unlikely (GLRO_dl_debug_mask & DL_DEBUG_IMPCALLS)) - GLRO(dl_debug_printf) ("\ntransferring control: %s\n\n", argv[0]); - #endif - -diff --git a/elf/dl-cache.c b/elf/dl-cache.c -index 862f1d8..dab9c51 100644 ---- a/elf/dl-cache.c -+++ b/elf/dl-cache.c -@@ -194,7 +194,7 @@ _dl_load_cache_lookup (const char *name) - const char *best; - - /* Print a message if the loading of libs is traced. */ -- if (__glibc_unlikely (GLRO(dl_debug_mask) & DL_DEBUG_LIBS)) -+ if (__glibc_unlikely (GLRO_dl_debug_mask & DL_DEBUG_LIBS)) - _dl_debug_printf (" search cache=%s\n", LD_SO_CACHE); - - if (cache == NULL) -@@ -292,7 +292,7 @@ _dl_load_cache_lookup (const char *name) - } - - /* Print our result if wanted. */ -- if (__builtin_expect (GLRO(dl_debug_mask) & DL_DEBUG_LIBS, 0) -+ if (__builtin_expect (GLRO_dl_debug_mask & DL_DEBUG_LIBS, 0) - && best != NULL) - _dl_debug_printf (" trying file=%s\n", best); - -diff --git a/elf/dl-close.c b/elf/dl-close.c -index c897247..b1b4bd5 100644 ---- a/elf/dl-close.c -+++ b/elf/dl-close.c -@@ -125,7 +125,7 @@ _dl_close_worker (struct link_map *map, bool force) - dl_close_state = rerun; - - /* There are still references to this object. Do nothing more. */ -- if (__glibc_unlikely (GLRO(dl_debug_mask) & DL_DEBUG_FILES)) -+ if (__glibc_unlikely (GLRO_dl_debug_mask & DL_DEBUG_FILES)) - _dl_debug_printf ("\nclosing file=%s; direct_opencount=%u\n", - map->l_name, map->l_direct_opencount); - -@@ -269,7 +269,7 @@ _dl_close_worker (struct link_map *map, bool force) - if (imap->l_init_called) - { - /* When debugging print a message first. */ -- if (__builtin_expect (GLRO(dl_debug_mask) & DL_DEBUG_IMPCALLS, -+ if (__builtin_expect (GLRO_dl_debug_mask & DL_DEBUG_IMPCALLS, - 0)) - _dl_debug_printf ("\ncalling fini: %s [%lu]\n\n", - imap->l_name, nsid); -@@ -711,7 +711,7 @@ _dl_close_worker (struct link_map *map, bool force) - free (imap->l_reldeps); - - /* Print debugging message. */ -- if (__glibc_unlikely (GLRO(dl_debug_mask) & DL_DEBUG_FILES)) -+ if (__glibc_unlikely (GLRO_dl_debug_mask & DL_DEBUG_FILES)) - _dl_debug_printf ("\nfile=%s [%lu]; destroying link map\n", - imap->l_name, imap->l_ns); - -diff --git a/elf/dl-conflict.c b/elf/dl-conflict.c -index 47a946e..e6a3f21 100644 ---- a/elf/dl-conflict.c -+++ b/elf/dl-conflict.c -@@ -32,7 +32,7 @@ _dl_resolve_conflicts (struct link_map *l, ElfW(Rela) *conflict, - ElfW(Rela) *conflictend) - { - #if ! ELF_MACHINE_NO_RELA -- if (__glibc_unlikely (GLRO(dl_debug_mask) & DL_DEBUG_RELOC)) -+ if (__glibc_unlikely (GLRO_dl_debug_mask & DL_DEBUG_RELOC)) - _dl_debug_printf ("\nconflict processing: %s\n", DSO_FILENAME (l->l_name)); - - { -diff --git a/elf/dl-deps.c b/elf/dl-deps.c -index eee146a..1a4b004 100644 ---- a/elf/dl-deps.c -+++ b/elf/dl-deps.c -@@ -127,7 +127,7 @@ empty dynamic string token substitution")); \ - else \ - { \ - /* This is for DT_AUXILIARY. */ \ -- if (__glibc_unlikely (GLRO(dl_debug_mask) & DL_DEBUG_LIBS)) \ -+ if (__glibc_unlikely (GLRO_dl_debug_mask & DL_DEBUG_LIBS)) \ - _dl_debug_printf (N_("\ - cannot load auxiliary `%s' because of empty dynamic string token " \ - "substitution\n"), __str); \ -@@ -303,7 +303,7 @@ _dl_map_object_deps (struct link_map *map, - args.name = name; - - /* Say that we are about to load an auxiliary library. */ -- if (__builtin_expect (GLRO(dl_debug_mask) & DL_DEBUG_LIBS, -+ if (__builtin_expect (GLRO_dl_debug_mask & DL_DEBUG_LIBS, - 0)) - _dl_debug_printf ("load auxiliary object=%s" - " requested by file=%s\n", -@@ -520,7 +520,7 @@ _dl_map_object_deps (struct link_map *map, - runp->map->l_reserved = 0; - } - -- if (__builtin_expect (GLRO(dl_debug_mask) & DL_DEBUG_PRELINK, 0) != 0 -+ if (__builtin_expect (GLRO_dl_debug_mask & DL_DEBUG_PRELINK, 0) != 0 - && map == GL(dl_ns)[LM_ID_BASE]._ns_loaded) - { - /* If we are to compute conflicts, we have to build local scope -diff --git a/elf/dl-error.c b/elf/dl-error.c -index 0fc3fd8..ea82f4d 100644 ---- a/elf/dl-error.c -+++ b/elf/dl-error.c -@@ -139,7 +139,7 @@ internal_function - _dl_signal_cerror (int errcode, const char *objname, const char *occation, - const char *errstring) - { -- if (__builtin_expect (GLRO(dl_debug_mask) -+ if (__builtin_expect (GLRO_dl_debug_mask - & ~(DL_DEBUG_STATISTICS|DL_DEBUG_PRELINK), 0)) - _dl_debug_printf ("%s: error: %s: %s (%s)\n", objname, occation, - errstring, receiver ? "continued" : "fatal"); -diff --git a/elf/dl-fini.c b/elf/dl-fini.c -index 6cfe651..f59f7fe 100644 ---- a/elf/dl-fini.c -+++ b/elf/dl-fini.c -@@ -234,7 +234,7 @@ _dl_fini (void) - || l->l_info[DT_FINI] != NULL) - { - /* When debugging print a message first. */ -- if (__builtin_expect (GLRO(dl_debug_mask) -+ if (__builtin_expect (GLRO_dl_debug_mask - & DL_DEBUG_IMPCALLS, 0)) - _dl_debug_printf ("\ncalling fini: %s [%lu]\n\n", - DSO_FILENAME (l->l_name), -@@ -286,7 +286,7 @@ _dl_fini (void) - goto again; - } - -- if (__glibc_unlikely (GLRO(dl_debug_mask) & DL_DEBUG_STATISTICS)) -+ if (__glibc_unlikely (GLRO_dl_debug_mask & DL_DEBUG_STATISTICS)) - _dl_debug_printf ("\nruntime linker statistics:\n" - " final number of relocations: %lu\n" - "final number of relocations from cache: %lu\n", -diff --git a/elf/dl-init.c b/elf/dl-init.c -index 2f85731..e46e8b6 100644 ---- a/elf/dl-init.c -+++ b/elf/dl-init.c -@@ -46,7 +46,7 @@ call_init (struct link_map *l, int argc, char **argv, char **env) - return; - - /* Print a debug message if wanted. */ -- if (__glibc_unlikely (GLRO(dl_debug_mask) & DL_DEBUG_IMPCALLS)) -+ if (__glibc_unlikely (GLRO_dl_debug_mask & DL_DEBUG_IMPCALLS)) - _dl_debug_printf ("\ncalling init: %s\n\n", - DSO_FILENAME (l->l_name)); - -@@ -96,7 +96,7 @@ _dl_init (struct link_map *main_map, int argc, char **argv, char **env) - ElfW(Addr) *addrs; - unsigned int cnt; - -- if (__glibc_unlikely (GLRO(dl_debug_mask) & DL_DEBUG_IMPCALLS)) -+ if (__glibc_unlikely (GLRO_dl_debug_mask & DL_DEBUG_IMPCALLS)) - _dl_debug_printf ("\ncalling preinit: %s\n\n", - DSO_FILENAME (main_map->l_name)); - -diff --git a/elf/dl-load.c b/elf/dl-load.c -index f664f50..8c28744 100644 ---- a/elf/dl-load.c -+++ b/elf/dl-load.c -@@ -943,7 +943,7 @@ _dl_map_object_from_fd (const char *name, int fd, struct filebuf *fbp, - } - - /* Print debugging message. */ -- if (__glibc_unlikely (GLRO(dl_debug_mask) & DL_DEBUG_FILES)) -+ if (__glibc_unlikely (GLRO_dl_debug_mask & DL_DEBUG_FILES)) - _dl_debug_printf ("file=%s [%lu]; generating link map\n", name, nsid); - - /* This is the ELF header. We read it in `open_verify'. */ -@@ -1347,7 +1347,7 @@ cannot enable executable stack as shared object requires"); - - l->l_entry += l->l_addr; - -- if (__glibc_unlikely (GLRO(dl_debug_mask) & DL_DEBUG_FILES)) -+ if (__glibc_unlikely (GLRO_dl_debug_mask & DL_DEBUG_FILES)) - _dl_debug_printf ("\ - dynamic: 0x%0*lx base: 0x%0*lx size: 0x%0*Zx\n\ - entry: 0x%0*lx phdr: 0x%0*lx phnum: %*u\n\n", -@@ -1789,7 +1789,7 @@ open_path (const char *name, size_t namelen, int mode, - - /* If we are debugging the search for libraries print the path - now if it hasn't happened now. */ -- if (__glibc_unlikely (GLRO(dl_debug_mask) & DL_DEBUG_LIBS) -+ if (__glibc_unlikely (GLRO_dl_debug_mask & DL_DEBUG_LIBS) - && current_what != this_dir->what) - { - current_what = this_dir->what; -@@ -1810,7 +1810,7 @@ open_path (const char *name, size_t namelen, int mode, - - buf); - - /* Print name we try if this is wanted. */ -- if (__glibc_unlikely (GLRO(dl_debug_mask) & DL_DEBUG_LIBS)) -+ if (__glibc_unlikely (GLRO_dl_debug_mask & DL_DEBUG_LIBS)) - _dl_debug_printf (" trying file=%s\n", buf); - - fd = open_verify (buf, fbp, loader, whatcode, mode, -@@ -1955,7 +1955,7 @@ _dl_map_object (struct link_map *loader, const char *name, - } - - /* Display information if we are debugging. */ -- if (__glibc_unlikely (GLRO(dl_debug_mask) & DL_DEBUG_FILES) -+ if (__glibc_unlikely (GLRO_dl_debug_mask & DL_DEBUG_FILES) - && loader != NULL) - _dl_debug_printf ((mode & __RTLD_CALLMAP) == 0 - ? "\nfile=%s [%lu]; needed by %s [%lu]\n" -@@ -1997,7 +1997,7 @@ _dl_map_object (struct link_map *loader, const char *name, - - size_t namelen = strlen (name) + 1; - -- if (__glibc_unlikely (GLRO(dl_debug_mask) & DL_DEBUG_LIBS)) -+ if (__glibc_unlikely (GLRO_dl_debug_mask & DL_DEBUG_LIBS)) - _dl_debug_printf ("find library=%s [%lu]; searching\n", name, nsid); - - fd = -1; -@@ -2119,7 +2119,7 @@ _dl_map_object (struct link_map *loader, const char *name, - #endif - - /* Add another newline when we are tracing the library loading. */ -- if (__glibc_unlikely (GLRO(dl_debug_mask) & DL_DEBUG_LIBS)) -+ if (__glibc_unlikely (GLRO_dl_debug_mask & DL_DEBUG_LIBS)) - _dl_debug_printf ("\n"); - } - else -@@ -2152,7 +2152,7 @@ _dl_map_object (struct link_map *loader, const char *name, - if (__glibc_unlikely (fd == -1)) - { - if (trace_mode -- && __glibc_likely ((GLRO(dl_debug_mask) & DL_DEBUG_PRELINK) == 0)) -+ && __glibc_likely ((GLRO_dl_debug_mask & DL_DEBUG_PRELINK) == 0)) - { - /* We haven't found an appropriate library. But since we - are only interested in the list of libraries this isn't -diff --git a/elf/dl-lookup.c b/elf/dl-lookup.c -index 11cb44b..588c3e4 100644 ---- a/elf/dl-lookup.c -+++ b/elf/dl-lookup.c -@@ -302,7 +302,7 @@ do_lookup_unique (const char *undef_name, uint_fast32_t new_hash, - hash table. */ - if (__glibc_unlikely (tab->size)) - { -- assert (GLRO(dl_debug_mask) & DL_DEBUG_PRELINK); -+ assert (GLRO_dl_debug_mask & DL_DEBUG_PRELINK); - goto success; - } - #endif -@@ -378,7 +378,7 @@ do_lookup_x (const char *undef_name, uint_fast32_t new_hash, - continue; - - /* Print some debugging info if wanted. */ -- if (__glibc_unlikely (GLRO(dl_debug_mask) & DL_DEBUG_SYMBOLS)) -+ if (__glibc_unlikely (GLRO_dl_debug_mask & DL_DEBUG_SYMBOLS)) - _dl_debug_printf ("symbol=%s; lookup in file=%s [%lu]\n", - undef_name, DSO_FILENAME (map->l_name), - map->l_ns); -@@ -755,7 +755,7 @@ add_dependency (struct link_map *undef_map, struct link_map *map, int flags) - } - - /* Display information if we are debugging. */ -- if (__glibc_unlikely (GLRO(dl_debug_mask) & DL_DEBUG_FILES)) -+ if (__glibc_unlikely (GLRO_dl_debug_mask & DL_DEBUG_FILES)) - _dl_debug_printf ("\ - \nfile=%s [%lu]; needed by %s [%lu] (relocation dependency)\n\n", - DSO_FILENAME (map->l_name), -@@ -859,7 +859,7 @@ _dl_lookup_symbol_x (const char *undef_name, struct link_map *undef_map, - { - if ((*ref == NULL || ELFW(ST_BIND) ((*ref)->st_info) != STB_WEAK) - && skip_map == NULL -- && !(GLRO(dl_debug_mask) & DL_DEBUG_UNUSED)) -+ && !(GLRO_dl_debug_mask & DL_DEBUG_UNUSED)) - { - /* We could find no value for a strong reference. */ - const char *reference_name = undef_map ? undef_map->l_name : ""; -@@ -935,7 +935,7 @@ _dl_lookup_symbol_x (const char *undef_name, struct link_map *undef_map, - if (__glibc_unlikely (current_value.m->l_used == 0)) - current_value.m->l_used = 1; - -- if (__glibc_unlikely (GLRO(dl_debug_mask) -+ if (__glibc_unlikely (GLRO_dl_debug_mask - & (DL_DEBUG_BINDINGS|DL_DEBUG_PRELINK))) - _dl_debug_bindings (undef_name, undef_map, ref, - ¤t_value, version, type_class, protected); -@@ -1000,7 +1000,7 @@ _dl_debug_bindings (const char *undef_name, struct link_map *undef_map, - { - const char *reference_name = undef_map->l_name; - -- if (GLRO(dl_debug_mask) & DL_DEBUG_BINDINGS) -+ if (GLRO_dl_debug_mask & DL_DEBUG_BINDINGS) - { - _dl_debug_printf ("binding file %s [%lu] to %s [%lu]: %s symbol `%s'", - DSO_FILENAME (reference_name), -@@ -1014,7 +1014,7 @@ _dl_debug_bindings (const char *undef_name, struct link_map *undef_map, - _dl_debug_printf_c ("\n"); - } - #ifdef SHARED -- if (GLRO(dl_debug_mask) & DL_DEBUG_PRELINK) -+ if (GLRO_dl_debug_mask & DL_DEBUG_PRELINK) - { - int conflict = 0; - struct sym_val val = { NULL, NULL }; -diff --git a/elf/dl-object.c b/elf/dl-object.c -index 1d58bbc..938a257 100644 ---- a/elf/dl-object.c -+++ b/elf/dl-object.c -@@ -98,7 +98,7 @@ _dl_new_object (char *realname, const char *libname, int type, - new->l_type = type; - /* If we set the bit now since we know it is never used we avoid - dirtying the cache line later. */ -- if ((GLRO(dl_debug_mask) & DL_DEBUG_UNUSED) == 0) -+ if ((GLRO_dl_debug_mask & DL_DEBUG_UNUSED) == 0) - new->l_used = 1; - new->l_loader = loader; - #if NO_TLS_OFFSET != 0 -diff --git a/elf/dl-open.c b/elf/dl-open.c -index 2db1c02..1288604 100644 ---- a/elf/dl-open.c -+++ b/elf/dl-open.c -@@ -147,7 +147,7 @@ add_to_global (struct link_map *new) - ns->_ns_main_searchlist->r_list[new_nlist++] = map; - - /* We modify the global scope. Report this. */ -- if (__glibc_unlikely (GLRO(dl_debug_mask) & DL_DEBUG_SCOPES)) -+ if (__glibc_unlikely (GLRO_dl_debug_mask & DL_DEBUG_SCOPES)) - _dl_debug_printf ("\nadd %s [%lu] to global scope\n", - map->l_name, map->l_ns); - } -@@ -251,7 +251,7 @@ dl_open_worker (void *a) - if (__glibc_unlikely (new->l_searchlist.r_list != NULL)) - { - /* Let the user know about the opencount. */ -- if (__glibc_unlikely (GLRO(dl_debug_mask) & DL_DEBUG_FILES)) -+ if (__glibc_unlikely (GLRO_dl_debug_mask & DL_DEBUG_FILES)) - _dl_debug_printf ("opening file=%s [%lu]; direct_opencount=%u\n\n", - new->l_name, new->l_ns, new->l_direct_opencount); - -@@ -302,7 +302,7 @@ dl_open_worker (void *a) - LIBC_PROBE (map_complete, 3, args->nsid, r, new); - - /* Print scope information. */ -- if (__glibc_unlikely (GLRO(dl_debug_mask) & DL_DEBUG_SCOPES)) -+ if (__glibc_unlikely (GLRO_dl_debug_mask & DL_DEBUG_SCOPES)) - _dl_show_scope (new, 0); - - /* Only do lazy relocation if `LD_BIND_NOW' is not set. */ -@@ -519,7 +519,7 @@ dl_open_worker (void *a) - } - - /* Print scope information. */ -- if (__glibc_unlikely (GLRO(dl_debug_mask) & DL_DEBUG_SCOPES)) -+ if (__glibc_unlikely (GLRO_dl_debug_mask & DL_DEBUG_SCOPES)) - _dl_show_scope (imap, from_scope); - } - -@@ -577,7 +577,7 @@ TLS generation counter wrapped! Please report this.")); - #endif - - /* Let the user know about the opencount. */ -- if (__glibc_unlikely (GLRO(dl_debug_mask) & DL_DEBUG_FILES)) -+ if (__glibc_unlikely (GLRO_dl_debug_mask & DL_DEBUG_FILES)) - _dl_debug_printf ("opening file=%s [%lu]; direct_opencount=%u\n\n", - new->l_name, new->l_ns, new->l_direct_opencount); - } -diff --git a/elf/dl-reloc.c b/elf/dl-reloc.c -index 61252d7..4c83815 100644 ---- a/elf/dl-reloc.c -+++ b/elf/dl-reloc.c -@@ -178,7 +178,7 @@ _dl_relocate_object (struct link_map *l, struct r_scope_elem *scope[], - && __builtin_expect (l->l_info[DT_BIND_NOW] != NULL, 0)) - lazy = 0; - -- if (__glibc_unlikely (GLRO(dl_debug_mask) & DL_DEBUG_RELOC)) -+ if (__glibc_unlikely (GLRO_dl_debug_mask & DL_DEBUG_RELOC)) - _dl_debug_printf ("\nrelocation processing: %s%s\n", - DSO_FILENAME (l->l_name), lazy ? " (lazy)" : ""); - -diff --git a/elf/dl-version.c b/elf/dl-version.c -index f6e5cd9..320628c 100644 ---- a/elf/dl-version.c -+++ b/elf/dl-version.c -@@ -82,7 +82,7 @@ match_symbol (const char *name, Lmid_t ns, ElfW(Word) hash, const char *string, - int result = 0; - - /* Display information about what we are doing while debugging. */ -- if (__glibc_unlikely (GLRO(dl_debug_mask) & DL_DEBUG_VERSIONS)) -+ if (__glibc_unlikely (GLRO_dl_debug_mask & DL_DEBUG_VERSIONS)) - _dl_debug_printf ("\ - checking for version `%s' in file %s [%lu] required by file %s [%lu]\n", - string, DSO_FILENAME (map->l_name), -diff --git a/elf/get-dynamic-info.h b/elf/get-dynamic-info.h -index dc8359d..7774fda 100644 ---- a/elf/get-dynamic-info.h -+++ b/elf/get-dynamic-info.h -@@ -166,7 +166,7 @@ elf_get_dynamic_info (struct link_map *l, ElfW(Dyn) *temp) - them. Therefore to avoid breaking existing applications the - best we can do is add a warning during debugging with the - intent of notifying the user of the problem. */ -- if (__builtin_expect (GLRO(dl_debug_mask) & DL_DEBUG_FILES, 0) -+ if (__builtin_expect (GLRO_dl_debug_mask & DL_DEBUG_FILES, 0) - && l->l_flags_1 & ~DT_1_SUPPORTED_MASK) - _dl_debug_printf ("\nWARNING: Unsupported flag value(s) of 0x%x in DT_FLAGS_1.\n", - l->l_flags_1 & ~DT_1_SUPPORTED_MASK); -diff --git a/elf/rtld.c b/elf/rtld.c -index fc3a2db..59c4637 100644 ---- a/elf/rtld.c -+++ b/elf/rtld.c -@@ -323,7 +323,7 @@ _dl_start_final (void *arg, struct dl_start_final_info *info) - } - #endif - -- if (__glibc_unlikely (GLRO(dl_debug_mask) & DL_DEBUG_STATISTICS)) -+ if (__glibc_unlikely (GLRO_dl_debug_mask & DL_DEBUG_STATISTICS)) - { - #ifndef HP_TIMING_NONAVAIL - print_statistics (&rtld_total_time); -@@ -1701,7 +1701,7 @@ ERROR: ld.so: object '%s' cannot be loaded as audit interface: %s; ignored.\n", - after relocation. */ - struct link_map *l; - -- if (GLRO(dl_debug_mask) & DL_DEBUG_PRELINK) -+ if (GLRO_dl_debug_mask & DL_DEBUG_PRELINK) - { - struct r_scope_elem *scope = &main_map->l_searchlist; - -@@ -1731,7 +1731,7 @@ ERROR: ld.so: object '%s' cannot be loaded as audit interface: %s; ignored.\n", - _dl_printf ("\n"); - } - } -- else if (GLRO(dl_debug_mask) & DL_DEBUG_UNUSED) -+ else if (GLRO_dl_debug_mask & DL_DEBUG_UNUSED) - { - /* Look through the dependencies of the main executable - and determine which of them is not actually -@@ -1839,7 +1839,7 @@ ERROR: ld.so: object '%s' cannot be loaded as audit interface: %s; ignored.\n", - } - } - -- if ((GLRO(dl_debug_mask) & DL_DEBUG_PRELINK) -+ if ((GLRO_dl_debug_mask & DL_DEBUG_PRELINK) - && rtld_multiple_ref) - { - /* Mark the link map as not yet relocated again. */ -@@ -1972,7 +1972,7 @@ ERROR: ld.so: object '%s' cannot be loaded as audit interface: %s; ignored.\n", - if (r_list == r_listend && liblist == liblistend) - prelinked = true; - -- if (__glibc_unlikely (GLRO(dl_debug_mask) & DL_DEBUG_LIBS)) -+ if (__glibc_unlikely (GLRO_dl_debug_mask & DL_DEBUG_LIBS)) - _dl_debug_printf ("\nprelink checking: %s\n", - prelinked ? "ok" : "failed"); - } -@@ -1990,7 +1990,7 @@ ERROR: ld.so: object '%s' cannot be loaded as audit interface: %s; ignored.\n", - GLRO(dl_init_all_dirs) = GL(dl_all_dirs); - - /* Print scope information. */ -- if (__glibc_unlikely (GLRO(dl_debug_mask) & DL_DEBUG_SCOPES)) -+ if (__glibc_unlikely (GLRO_dl_debug_mask & DL_DEBUG_SCOPES)) - { - _dl_debug_printf ("\nInitial object scopes\n"); - -@@ -2265,7 +2265,7 @@ process_dl_debug (const char *dl_debug) - if (debopts[cnt].len == len - && memcmp (dl_debug, debopts[cnt].name, len) == 0) - { -- GLRO(dl_debug_mask) |= debopts[cnt].mask; -+ GLRO_dl_debug_mask |= debopts[cnt].mask; - any_debug = 1; - break; - } -@@ -2286,7 +2286,7 @@ warning: debug option `%s' unknown; try LD_DEBUG=help\n", copy); - ++dl_debug; - } - -- if (GLRO(dl_debug_mask) & DL_DEBUG_UNUSED) -+ if (GLRO_dl_debug_mask & DL_DEBUG_UNUSED) - { - /* In order to get an accurate picture of whether a particular - DT_NEEDED entry is actually used we have to process both -@@ -2294,7 +2294,7 @@ warning: debug option `%s' unknown; try LD_DEBUG=help\n", copy); - GLRO(dl_lazy) = 0; - } - -- if (GLRO(dl_debug_mask) & DL_DEBUG_HELP) -+ if (GLRO_dl_debug_mask & DL_DEBUG_HELP) - { - size_t cnt; - -@@ -2499,7 +2499,7 @@ process_envvars (enum mode *modep) - mode = trace; - GLRO(dl_verbose) = 1; - #if __OPTION_EGLIBC_RTLD_DEBUG -- GLRO(dl_debug_mask) |= DL_DEBUG_PRELINK; -+ GLRO_dl_debug_mask |= DL_DEBUG_PRELINK; - #endif - GLRO(dl_trace_prelink) = &envline[17]; - } -@@ -2548,7 +2548,7 @@ process_envvars (enum mode *modep) - { - unsetenv ("MALLOC_CHECK_"); - #if __OPTION_EGLIBC_RTLD_DEBUG -- GLRO(dl_debug_mask) = 0; -+ GLRO_dl_debug_mask = 0; - #endif - } - --- -2.1.4 - diff --git a/yocto-poky/meta/recipes-core/glibc/glibc/0027-eglibc-use-option-groups-Conditionally-exclude-c-tes.patch b/yocto-poky/meta/recipes-core/glibc/glibc/0027-eglibc-use-option-groups-Conditionally-exclude-c-tes.patch deleted file mode 100644 index 4106167df..000000000 --- a/yocto-poky/meta/recipes-core/glibc/glibc/0027-eglibc-use-option-groups-Conditionally-exclude-c-tes.patch +++ /dev/null @@ -1,145 +0,0 @@ -From e98779aa56fae0346dff2d0b72acadd0eaf01891 Mon Sep 17 00:00:00 2001 -From: Khem Raj <raj.khem@gmail.com> -Date: Wed, 27 May 2015 16:10:50 -0700 -Subject: [PATCH 27/27] eglibc-use-option-groups: Conditionally exclude c++ - tests - - Some test programs written in c++ are still included in spite of - "libc-cxx-tests" being omitted from DISTRO_FEATURES_LIBC. - All .cc programs are compiled with g++. - g++ automatically specifies linking against the C++ library. - This patch conditionally excludes the following tests as well: - - bug-atexit3-lib.cc - tst-cancel24.cc - tst-cancel24-static.cc - tst-unique3lib.cc - tst-unique3lib2.cc - tst-unique4lib.cc - tst-unique3.cc - tst-unique4.cc - - Tested with DISTRO_FEATURES_LIBC_remove = " libc-cxx-tests" - - [YOCTO #7003] - -Signed-off-by: Juro Bystricky <juro.bystricky@intel.com> -Signed-off-by: Khem Raj <raj.khem@gmail.com> ---- - dlfcn/Makefile | 8 ++++++-- - elf/Makefile | 19 ++++++++++++++----- - nptl/Makefile | 12 ++++++++++-- - 3 files changed, 30 insertions(+), 9 deletions(-) - -diff --git a/dlfcn/Makefile b/dlfcn/Makefile -index 3827607..920bd58 100644 ---- a/dlfcn/Makefile -+++ b/dlfcn/Makefile -@@ -39,16 +39,20 @@ ifeq (yes,$(build-shared)) - tests = glrefmain failtest tst-dladdr default errmsg1 tstcxaatexit \ - bug-dlopen1 bug-dlsym1 tst-dlinfo bug-atexit1 bug-atexit2 \ - tstatexit bug-dl-leaf tst-rec-dlopen --endif -- - tests-$(OPTION_EGLIBC_CXX_TESTS) += bug-atexit3 - -+endif -+ - modules-names = glreflib1 glreflib2 glreflib3 failtestmod defaultmod1 \ - defaultmod2 errmsg1mod modatexit modcxaatexit \ - bug-dlsym1-lib1 bug-dlsym1-lib2 bug-atexit1-lib \ - bug-atexit2-lib bug-dl-leaf-lib \ - bug-dl-leaf-lib-cb moddummy1 moddummy2 - -+ifeq (y,$(OPTION_EGLIBC_CXX_TESTS)) -+modules-names += bug-atexit3-lib -+endif -+ - failtestmod.so-no-z-defs = yes - glreflib2.so-no-z-defs = yes - errmsg1mod.so-no-z-defs = yes -diff --git a/elf/Makefile b/elf/Makefile -index 71a18a1..26fe3c5 100644 ---- a/elf/Makefile -+++ b/elf/Makefile -@@ -17,6 +17,8 @@ - - # Makefile for elf subdirectory of GNU C Library. - -+include ../option-groups.mak -+ - subdir := elf - - include ../Makeconfig -@@ -145,12 +147,15 @@ tests += loadtest restest1 preloadtest loadfail multiload origtest resolvfail \ - unload3 unload4 unload5 unload6 unload7 unload8 tst-global1 order2 \ - tst-audit1 tst-audit2 tst-audit8 tst-audit9 \ - tst-stackguard1 tst-addr1 tst-thrlock \ -- tst-unique1 tst-unique2 $(if $(CXX),tst-unique3 tst-unique4 \ -- tst-nodelete) \ -+ tst-unique1 tst-unique2 \ - tst-initorder tst-initorder2 tst-relsort1 tst-null-argv \ - tst-ptrguard1 tst-tlsalign tst-tlsalign-extern tst-nodelete-opened \ - tst-nodelete2 - # reldep9 -+ifeq (y,$(OPTION_EGLIBC_CXX_TESTS)) -+tests += $(if $(CXX),tst-unique3 tst-unique4 tst-nodelete) -+endif -+ - ifeq ($(build-hardcoded-path-in-tests),yes) - tests += tst-dlopen-aout - LDFLAGS-tst-dlopen-aout = $(no-pie-ldflag) -@@ -209,9 +214,6 @@ modules-names = testobj1 testobj2 testobj3 testobj4 testobj5 testobj6 \ - tst-unique1mod1 tst-unique1mod2 \ - tst-unique2mod1 tst-unique2mod2 \ - tst-auditmod9a tst-auditmod9b \ -- $(if $(CXX),tst-unique3lib tst-unique3lib2 tst-unique4lib \ -- tst-nodelete-uniquemod tst-nodelete-rtldmod \ -- tst-nodelete-zmod) \ - tst-initordera1 tst-initorderb1 \ - tst-initordera2 tst-initorderb2 \ - tst-initordera3 tst-initordera4 \ -@@ -220,6 +222,13 @@ modules-names = testobj1 testobj2 testobj3 testobj4 testobj5 testobj6 \ - tst-relsort1mod1 tst-relsort1mod2 tst-array2dep \ - tst-array5dep tst-null-argv-lib \ - tst-tlsalign-lib tst-nodelete-opened-lib tst-nodelete2mod -+ -+ifeq (y,$(OPTION_EGLIBC_CXX_TESTS)) -+modules-names += $(if $(CXX),tst-unique3lib tst-unique3lib2 tst-unique4lib \ -+ tst-nodelete-uniquemod tst-nodelete-rtldmod \ -+ tst-nodelete-zmod) -+endif -+ - ifeq (yes,$(have-protected-data)) - modules-names += tst-protected1moda tst-protected1modb - tests += tst-protected1a tst-protected1b -diff --git a/nptl/Makefile b/nptl/Makefile -index 596ca3c..50a708b 100644 ---- a/nptl/Makefile -+++ b/nptl/Makefile -@@ -390,12 +390,20 @@ link-libc-static := $(common-objpfx)libc.a $(static-gnulib) \ - $(common-objpfx)libc.a - - tests-static += tst-locale1 tst-locale2 tst-stackguard1-static \ -- tst-cancel21-static tst-cancel24-static tst-cond8-static \ -+ tst-cancel21-static tst-cond8-static \ - tst-mutex8-static tst-mutexpi8-static tst-sem11-static \ - tst-sem12-static --tests += tst-stackguard1-static tst-cancel21-static tst-cancel24-static \ -+ -+ifeq (y,$(OPTION_EGLIBC_CXX_TESTS)) -+tests-static += tst-cancel24-static -+endif -+ -+tests += tst-stackguard1-static tst-cancel21-static \ - tst-cond8-static tst-mutex8-static tst-mutexpi8-static \ - tst-sem11-static tst-sem12-static -+ -+tests-$(OPTION_EGLIBC_CXX_TESTS) += tst-cancel24-static -+ - xtests-static += tst-setuid1-static - - # These tests are linked with libc before libpthread --- -2.1.4 - diff --git a/yocto-poky/meta/recipes-core/glibc/glibc/0028-Clear-ELF_RTYPE_CLASS_EXTERN_PROTECTED_DATA-for-prel.patch b/yocto-poky/meta/recipes-core/glibc/glibc/0028-Clear-ELF_RTYPE_CLASS_EXTERN_PROTECTED_DATA-for-prel.patch deleted file mode 100644 index 3455df1cf..000000000 --- a/yocto-poky/meta/recipes-core/glibc/glibc/0028-Clear-ELF_RTYPE_CLASS_EXTERN_PROTECTED_DATA-for-prel.patch +++ /dev/null @@ -1,84 +0,0 @@ -From cadaf1336332ca7bcdfe4a400776e5782a20e26d Mon Sep 17 00:00:00 2001 -From: "H.J. Lu" <hjl.tools@gmail.com> -Date: Wed, 28 Oct 2015 07:49:44 -0700 -Subject: [PATCH] Keep only ELF_RTYPE_CLASS_{PLT|COPY} bits for prelink - -prelink runs ld.so with the environment variable LD_TRACE_PRELINKING -set to dump the relocation type class from _dl_debug_bindings. prelink -has the following relocation type classes: - - #define RTYPE_CLASS_VALID 8 - #define RTYPE_CLASS_PLT (8|1) - #define RTYPE_CLASS_COPY (8|2) - #define RTYPE_CLASS_TLS (8|4) - -where ELF_RTYPE_CLASS_EXTERN_PROTECTED_DATA has a conflict with -RTYPE_CLASS_TLS. - -Since prelink only uses ELF_RTYPE_CLASS_PLT and ELF_RTYPE_CLASS_COPY -bits, we should clear the other bits when the DL_DEBUG_PRELINK bit is -set. - - [BZ #19178] - * elf/dl-lookup.c (RTYPE_CLASS_VALID): New. - (RTYPE_CLASS_PLT): Likewise. - (RTYPE_CLASS_COPY): Likewise. - (RTYPE_CLASS_TLS): Likewise. - (_dl_debug_bindings): Use RTYPE_CLASS_TLS and RTYPE_CLASS_VALID - to set relocation type class for DL_DEBUG_PRELINK. Keep only - ELF_RTYPE_CLASS_PLT and ELF_RTYPE_CLASS_COPY bits for - DL_DEBUG_PRELINK. - -Upstream-Status: submitted (https://sourceware.org/bugzilla/show_bug.cgi?id=19178) - -Signed-off-by: Mark Hatle <mark.hatle@windriver.com> ---- - elf/dl-lookup.c | 21 +++++++++++++++++++-- - 1 file changed, 19 insertions(+), 2 deletions(-) - -diff --git a/elf/dl-lookup.c b/elf/dl-lookup.c -index 581fb20..6ae6cc3 100644 ---- a/elf/dl-lookup.c -+++ b/elf/dl-lookup.c -@@ -1016,6 +1016,18 @@ _dl_debug_bindings (const char *undef_name, struct link_map *undef_map, - #ifdef SHARED - if (GLRO(dl_debug_mask) & DL_DEBUG_PRELINK) - { -+/* ELF_RTYPE_CLASS_XXX must match RTYPE_CLASS_XXX used by prelink with -+ LD_TRACE_PRELINKING. */ -+#define RTYPE_CLASS_VALID 8 -+#define RTYPE_CLASS_PLT (8|1) -+#define RTYPE_CLASS_COPY (8|2) -+#define RTYPE_CLASS_TLS (8|4) -+#if ELF_RTYPE_CLASS_PLT != 0 && ELF_RTYPE_CLASS_PLT != 1 -+# error ELF_RTYPE_CLASS_PLT must be 0 or 1! -+#endif -+#if ELF_RTYPE_CLASS_COPY != 0 && ELF_RTYPE_CLASS_COPY != 2 -+# error ELF_RTYPE_CLASS_COPY must be 0 or 2! -+#endif - int conflict = 0; - struct sym_val val = { NULL, NULL }; - -@@ -1071,12 +1083,17 @@ _dl_debug_bindings (const char *undef_name, struct link_map *undef_map, - - if (value->s) - { -+ /* Keep only ELF_RTYPE_CLASS_PLT and ELF_RTYPE_CLASS_COPY -+ bits since since prelink only uses them. */ -+ type_class &= ELF_RTYPE_CLASS_PLT | ELF_RTYPE_CLASS_COPY; - if (__glibc_unlikely (ELFW(ST_TYPE) (value->s->st_info) - == STT_TLS)) -- type_class = 4; -+ /* Clear the RTYPE_CLASS_VALID bit in RTYPE_CLASS_TLS. */ -+ type_class = RTYPE_CLASS_TLS & ~RTYPE_CLASS_VALID; - else if (__glibc_unlikely (ELFW(ST_TYPE) (value->s->st_info) - == STT_GNU_IFUNC)) -- type_class |= 8; -+ /* Set the RTYPE_CLASS_VALID bit. */ -+ type_class |= RTYPE_CLASS_VALID; - } - - if (conflict --- -1.9.3 - diff --git a/yocto-poky/meta/recipes-core/glibc/glibc/CVE-2015-7547.patch b/yocto-poky/meta/recipes-core/glibc/glibc/CVE-2015-7547.patch deleted file mode 100644 index 4e539f849..000000000 --- a/yocto-poky/meta/recipes-core/glibc/glibc/CVE-2015-7547.patch +++ /dev/null @@ -1,642 +0,0 @@ -From e9db92d3acfe1822d56d11abcea5bfc4c41cf6ca Mon Sep 17 00:00:00 2001 -From: Carlos O'Donell <carlos@systemhalted.org> -Date: Tue, 16 Feb 2016 21:26:37 -0500 -Subject: [PATCH] CVE-2015-7547: getaddrinfo() stack-based buffer overflow (Bug - 18665). - -* A stack-based buffer overflow was found in libresolv when invoked from - libnss_dns, allowing specially crafted DNS responses to seize control - of execution flow in the DNS client. The buffer overflow occurs in - the functions send_dg (send datagram) and send_vc (send TCP) for the - NSS module libnss_dns.so.2 when calling getaddrinfo with AF_UNSPEC - family. The use of AF_UNSPEC triggers the low-level resolver code to - send out two parallel queries for A and AAAA. A mismanagement of the - buffers used for those queries could result in the response of a query - writing beyond the alloca allocated buffer created by - _nss_dns_gethostbyname4_r. Buffer management is simplified to remove - the overflow. Thanks to the Google Security Team and Red Hat for - reporting the security impact of this issue, and Robert Holiday of - Ciena for reporting the related bug 18665. (CVE-2015-7547) - -See also: -https://sourceware.org/ml/libc-alpha/2016-02/msg00416.html -https://sourceware.org/ml/libc-alpha/2016-02/msg00418.html - -Upstream-Status: Backport -CVE: CVE-2015-7547 - -https://sourceware.org/git/?p=glibc.git;a=commit;h=e9db92d3acfe1822d56d11abcea5bfc4c41cf6ca -minor tweeking to apply to Changelog and res_send.c - -Signed-off-by: Armin Kuster <akuster@mvista.com> - ---- - ChangeLog | 17 ++- - NEWS | 14 +++ - resolv/nss_dns/dns-host.c | 111 +++++++++++++++++++- - resolv/res_query.c | 3 + - resolv/res_send.c | 260 +++++++++++++++++++++++++++++++++++----------- - 5 files changed, 339 insertions(+), 66 deletions(-) - -Index: git/NEWS -=================================================================== ---- git.orig/NEWS -+++ git/NEWS -@@ -105,6 +105,20 @@ Security related changes: - depending on the length of the string passed as an argument to the - functions. Reported by Joseph Myers. - -+* A stack-based buffer overflow was found in libresolv when invoked from -+ libnss_dns, allowing specially crafted DNS responses to seize control -+ of execution flow in the DNS client. The buffer overflow occurs in -+ the functions send_dg (send datagram) and send_vc (send TCP) for the -+ NSS module libnss_dns.so.2 when calling getaddrinfo with AF_UNSPEC -+ family. The use of AF_UNSPEC triggers the low-level resolver code to -+ send out two parallel queries for A and AAAA. A mismanagement of the -+ buffers used for those queries could result in the response of a query -+ writing beyond the alloca allocated buffer created by -+ _nss_dns_gethostbyname4_r. Buffer management is simplified to remove -+ the overflow. Thanks to the Google Security Team and Red Hat for -+ reporting the security impact of this issue, and Robert Holiday of -+ Ciena for reporting the related bug 18665. (CVE-2015-7547) -+ - * The following bugs are resolved with this release: - - 6652, 10672, 12674, 12847, 12926, 13862, 14132, 14138, 14171, 14498, -Index: git/resolv/nss_dns/dns-host.c -=================================================================== ---- git.orig/resolv/nss_dns/dns-host.c -+++ git/resolv/nss_dns/dns-host.c -@@ -1031,7 +1031,10 @@ gaih_getanswer_slice (const querybuf *an - int h_namelen = 0; - - if (ancount == 0) -- return NSS_STATUS_NOTFOUND; -+ { -+ *h_errnop = HOST_NOT_FOUND; -+ return NSS_STATUS_NOTFOUND; -+ } - - while (ancount-- > 0 && cp < end_of_message && had_error == 0) - { -@@ -1208,7 +1211,14 @@ gaih_getanswer_slice (const querybuf *an - /* Special case here: if the resolver sent a result but it only - contains a CNAME while we are looking for a T_A or T_AAAA record, - we fail with NOTFOUND instead of TRYAGAIN. */ -- return canon == NULL ? NSS_STATUS_TRYAGAIN : NSS_STATUS_NOTFOUND; -+ if (canon != NULL) -+ { -+ *h_errnop = HOST_NOT_FOUND; -+ return NSS_STATUS_NOTFOUND; -+ } -+ -+ *h_errnop = NETDB_INTERNAL; -+ return NSS_STATUS_TRYAGAIN; - } - - -@@ -1222,11 +1232,101 @@ gaih_getanswer (const querybuf *answer1, - - enum nss_status status = NSS_STATUS_NOTFOUND; - -+ /* Combining the NSS status of two distinct queries requires some -+ compromise and attention to symmetry (A or AAAA queries can be -+ returned in any order). What follows is a breakdown of how this -+ code is expected to work and why. We discuss only SUCCESS, -+ TRYAGAIN, NOTFOUND and UNAVAIL, since they are the only returns -+ that apply (though RETURN and MERGE exist). We make a distinction -+ between TRYAGAIN (recoverable) and TRYAGAIN' (not-recoverable). -+ A recoverable TRYAGAIN is almost always due to buffer size issues -+ and returns ERANGE in errno and the caller is expected to retry -+ with a larger buffer. -+ -+ Lastly, you may be tempted to make significant changes to the -+ conditions in this code to bring about symmetry between responses. -+ Please don't change anything without due consideration for -+ expected application behaviour. Some of the synthesized responses -+ aren't very well thought out and sometimes appear to imply that -+ IPv4 responses are always answer 1, and IPv6 responses are always -+ answer 2, but that's not true (see the implementation of send_dg -+ and send_vc to see response can arrive in any order, particularly -+ for UDP). However, we expect it holds roughly enough of the time -+ that this code works, but certainly needs to be fixed to make this -+ a more robust implementation. -+ -+ ---------------------------------------------- -+ | Answer 1 Status / | Synthesized | Reason | -+ | Answer 2 Status | Status | | -+ |--------------------------------------------| -+ | SUCCESS/SUCCESS | SUCCESS | [1] | -+ | SUCCESS/TRYAGAIN | TRYAGAIN | [5] | -+ | SUCCESS/TRYAGAIN' | SUCCESS | [1] | -+ | SUCCESS/NOTFOUND | SUCCESS | [1] | -+ | SUCCESS/UNAVAIL | SUCCESS | [1] | -+ | TRYAGAIN/SUCCESS | TRYAGAIN | [2] | -+ | TRYAGAIN/TRYAGAIN | TRYAGAIN | [2] | -+ | TRYAGAIN/TRYAGAIN' | TRYAGAIN | [2] | -+ | TRYAGAIN/NOTFOUND | TRYAGAIN | [2] | -+ | TRYAGAIN/UNAVAIL | TRYAGAIN | [2] | -+ | TRYAGAIN'/SUCCESS | SUCCESS | [3] | -+ | TRYAGAIN'/TRYAGAIN | TRYAGAIN | [3] | -+ | TRYAGAIN'/TRYAGAIN' | TRYAGAIN' | [3] | -+ | TRYAGAIN'/NOTFOUND | TRYAGAIN' | [3] | -+ | TRYAGAIN'/UNAVAIL | UNAVAIL | [3] | -+ | NOTFOUND/SUCCESS | SUCCESS | [3] | -+ | NOTFOUND/TRYAGAIN | TRYAGAIN | [3] | -+ | NOTFOUND/TRYAGAIN' | TRYAGAIN' | [3] | -+ | NOTFOUND/NOTFOUND | NOTFOUND | [3] | -+ | NOTFOUND/UNAVAIL | UNAVAIL | [3] | -+ | UNAVAIL/SUCCESS | UNAVAIL | [4] | -+ | UNAVAIL/TRYAGAIN | UNAVAIL | [4] | -+ | UNAVAIL/TRYAGAIN' | UNAVAIL | [4] | -+ | UNAVAIL/NOTFOUND | UNAVAIL | [4] | -+ | UNAVAIL/UNAVAIL | UNAVAIL | [4] | -+ ---------------------------------------------- -+ -+ [1] If the first response is a success we return success. -+ This ignores the state of the second answer and in fact -+ incorrectly sets errno and h_errno to that of the second -+ answer. However because the response is a success we ignore -+ *errnop and *h_errnop (though that means you touched errno on -+ success). We are being conservative here and returning the -+ likely IPv4 response in the first answer as a success. -+ -+ [2] If the first response is a recoverable TRYAGAIN we return -+ that instead of looking at the second response. The -+ expectation here is that we have failed to get an IPv4 response -+ and should retry both queries. -+ -+ [3] If the first response was not a SUCCESS and the second -+ response is not NOTFOUND (had a SUCCESS, need to TRYAGAIN, -+ or failed entirely e.g. TRYAGAIN' and UNAVAIL) then use the -+ result from the second response, otherwise the first responses -+ status is used. Again we have some odd side-effects when the -+ second response is NOTFOUND because we overwrite *errnop and -+ *h_errnop that means that a first answer of NOTFOUND might see -+ its *errnop and *h_errnop values altered. Whether it matters -+ in practice that a first response NOTFOUND has the wrong -+ *errnop and *h_errnop is undecided. -+ -+ [4] If the first response is UNAVAIL we return that instead of -+ looking at the second response. The expectation here is that -+ it will have failed similarly e.g. configuration failure. -+ -+ [5] Testing this code is complicated by the fact that truncated -+ second response buffers might be returned as SUCCESS if the -+ first answer is a SUCCESS. To fix this we add symmetry to -+ TRYAGAIN with the second response. If the second response -+ is a recoverable error we now return TRYAGIN even if the first -+ response was SUCCESS. */ -+ - if (anslen1 > 0) - status = gaih_getanswer_slice(answer1, anslen1, qname, - &pat, &buffer, &buflen, - errnop, h_errnop, ttlp, - &first); -+ - if ((status == NSS_STATUS_SUCCESS || status == NSS_STATUS_NOTFOUND - || (status == NSS_STATUS_TRYAGAIN - /* We want to look at the second answer in case of an -@@ -1242,8 +1342,15 @@ gaih_getanswer (const querybuf *answer1, - &pat, &buffer, &buflen, - errnop, h_errnop, ttlp, - &first); -+ /* Use the second response status in some cases. */ - if (status != NSS_STATUS_SUCCESS && status2 != NSS_STATUS_NOTFOUND) - status = status2; -+ /* Do not return a truncated second response (unless it was -+ unavoidable e.g. unrecoverable TRYAGAIN). */ -+ if (status == NSS_STATUS_SUCCESS -+ && (status2 == NSS_STATUS_TRYAGAIN -+ && *errnop == ERANGE && *h_errnop != NO_RECOVERY)) -+ status = NSS_STATUS_TRYAGAIN; - } - - return status; -Index: git/resolv/res_query.c -=================================================================== ---- git.orig/resolv/res_query.c -+++ git/resolv/res_query.c -@@ -396,6 +396,7 @@ __libc_res_nsearch(res_state statp, - { - free (*answerp2); - *answerp2 = NULL; -+ *nanswerp2 = 0; - *answerp2_malloced = 0; - } - } -@@ -447,6 +448,7 @@ __libc_res_nsearch(res_state statp, - { - free (*answerp2); - *answerp2 = NULL; -+ *nanswerp2 = 0; - *answerp2_malloced = 0; - } - -@@ -521,6 +523,7 @@ __libc_res_nsearch(res_state statp, - { - free (*answerp2); - *answerp2 = NULL; -+ *nanswerp2 = 0; - *answerp2_malloced = 0; - } - if (saved_herrno != -1) -Index: git/resolv/res_send.c -=================================================================== ---- git.orig/resolv/res_send.c -+++ git/resolv/res_send.c -@@ -1,3 +1,20 @@ -+/* Copyright (C) 2016 Free Software Foundation, Inc. -+ This file is part of the GNU C Library. -+ -+ The GNU C 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.1 of the License, or (at your option) any later version. -+ -+ The GNU C 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 the GNU C Library; if not, see -+ <http://www.gnu.org/licenses/>. */ -+ - /* - * Copyright (c) 1985, 1989, 1993 - * The Regents of the University of California. All rights reserved. -@@ -363,6 +380,8 @@ __libc_res_nsend(res_state statp, const - #ifdef USE_HOOKS - if (__glibc_unlikely (statp->qhook || statp->rhook)) { - if (anssiz < MAXPACKET && ansp) { -+ /* Always allocate MAXPACKET, callers expect -+ this specific size. */ - u_char *buf = malloc (MAXPACKET); - if (buf == NULL) - return (-1); -@@ -638,6 +657,77 @@ get_nsaddr (res_state statp, int n) - return (struct sockaddr *) (void *) &statp->nsaddr_list[n]; - } - -+/* The send_vc function is responsible for sending a DNS query over TCP -+ to the nameserver numbered NS from the res_state STATP i.e. -+ EXT(statp).nssocks[ns]. The function supports sending both IPv4 and -+ IPv6 queries at the same serially on the same socket. -+ -+ Please note that for TCP there is no way to disable sending both -+ queries, unlike UDP, which honours RES_SNGLKUP and RES_SNGLKUPREOP -+ and sends the queries serially and waits for the result after each -+ sent query. This implemetnation should be corrected to honour these -+ options. -+ -+ Please also note that for TCP we send both queries over the same -+ socket one after another. This technically violates best practice -+ since the server is allowed to read the first query, respond, and -+ then close the socket (to service another client). If the server -+ does this, then the remaining second query in the socket data buffer -+ will cause the server to send the client an RST which will arrive -+ asynchronously and the client's OS will likely tear down the socket -+ receive buffer resulting in a potentially short read and lost -+ response data. This will force the client to retry the query again, -+ and this process may repeat until all servers and connection resets -+ are exhausted and then the query will fail. It's not known if this -+ happens with any frequency in real DNS server implementations. This -+ implementation should be corrected to use two sockets by default for -+ parallel queries. -+ -+ The query stored in BUF of BUFLEN length is sent first followed by -+ the query stored in BUF2 of BUFLEN2 length. Queries are sent -+ serially on the same socket. -+ -+ Answers to the query are stored firstly in *ANSP up to a max of -+ *ANSSIZP bytes. If more than *ANSSIZP bytes are needed and ANSCP -+ is non-NULL (to indicate that modifying the answer buffer is allowed) -+ then malloc is used to allocate a new response buffer and ANSCP and -+ ANSP will both point to the new buffer. If more than *ANSSIZP bytes -+ are needed but ANSCP is NULL, then as much of the response as -+ possible is read into the buffer, but the results will be truncated. -+ When truncation happens because of a small answer buffer the DNS -+ packets header field TC will bet set to 1, indicating a truncated -+ message and the rest of the socket data will be read and discarded. -+ -+ Answers to the query are stored secondly in *ANSP2 up to a max of -+ *ANSSIZP2 bytes, with the actual response length stored in -+ *RESPLEN2. If more than *ANSSIZP bytes are needed and ANSP2 -+ is non-NULL (required for a second query) then malloc is used to -+ allocate a new response buffer, *ANSSIZP2 is set to the new buffer -+ size and *ANSP2_MALLOCED is set to 1. -+ -+ The ANSP2_MALLOCED argument will eventually be removed as the -+ change in buffer pointer can be used to detect the buffer has -+ changed and that the caller should use free on the new buffer. -+ -+ Note that the answers may arrive in any order from the server and -+ therefore the first and second answer buffers may not correspond to -+ the first and second queries. -+ -+ It is not supported to call this function with a non-NULL ANSP2 -+ but a NULL ANSCP. Put another way, you can call send_vc with a -+ single unmodifiable buffer or two modifiable buffers, but no other -+ combination is supported. -+ -+ It is the caller's responsibility to free the malloc allocated -+ buffers by detecting that the pointers have changed from their -+ original values i.e. *ANSCP or *ANSP2 has changed. -+ -+ If errors are encountered then *TERRNO is set to an appropriate -+ errno value and a zero result is returned for a recoverable error, -+ and a less-than zero result is returned for a non-recoverable error. -+ -+ If no errors are encountered then *TERRNO is left unmodified and -+ a the length of the first response in bytes is returned. */ - static int - send_vc(res_state statp, - const u_char *buf, int buflen, const u_char *buf2, int buflen2, -@@ -647,11 +737,7 @@ send_vc(res_state statp, - { - const HEADER *hp = (HEADER *) buf; - const HEADER *hp2 = (HEADER *) buf2; -- u_char *ans = *ansp; -- int orig_anssizp = *anssizp; -- // XXX REMOVE -- // int anssiz = *anssizp; -- HEADER *anhp = (HEADER *) ans; -+ HEADER *anhp = (HEADER *) *ansp; - struct sockaddr *nsap = get_nsaddr (statp, ns); - int truncating, connreset, n; - /* On some architectures compiler might emit a warning indicating -@@ -743,6 +829,8 @@ send_vc(res_state statp, - * Receive length & response - */ - int recvresp1 = 0; -+ /* Skip the second response if there is no second query. -+ To do that we mark the second response as received. */ - int recvresp2 = buf2 == NULL; - uint16_t rlen16; - read_len: -@@ -779,40 +867,14 @@ send_vc(res_state statp, - u_char **thisansp; - int *thisresplenp; - if ((recvresp1 | recvresp2) == 0 || buf2 == NULL) { -+ /* We have not received any responses -+ yet or we only have one response to -+ receive. */ - thisanssizp = anssizp; - thisansp = anscp ?: ansp; - assert (anscp != NULL || ansp2 == NULL); - thisresplenp = &resplen; - } else { -- if (*anssizp != MAXPACKET) { -- /* No buffer allocated for the first -- reply. We can try to use the rest -- of the user-provided buffer. */ --#if __GNUC_PREREQ (4, 7) -- DIAG_PUSH_NEEDS_COMMENT; -- DIAG_IGNORE_NEEDS_COMMENT (5, "-Wmaybe-uninitialized"); --#endif --#if _STRING_ARCH_unaligned -- *anssizp2 = orig_anssizp - resplen; -- *ansp2 = *ansp + resplen; --#else -- int aligned_resplen -- = ((resplen + __alignof__ (HEADER) - 1) -- & ~(__alignof__ (HEADER) - 1)); -- *anssizp2 = orig_anssizp - aligned_resplen; -- *ansp2 = *ansp + aligned_resplen; --#endif --#if __GNUC_PREREQ (4, 7) -- DIAG_POP_NEEDS_COMMENT; --#endif -- } else { -- /* The first reply did not fit into the -- user-provided buffer. Maybe the second -- answer will. */ -- *anssizp2 = orig_anssizp; -- *ansp2 = *ansp; -- } -- - thisanssizp = anssizp2; - thisansp = ansp2; - thisresplenp = resplen2; -@@ -820,10 +882,14 @@ send_vc(res_state statp, - anhp = (HEADER *) *thisansp; - - *thisresplenp = rlen; -- if (rlen > *thisanssizp) { -- /* Yes, we test ANSCP here. If we have two buffers -- both will be allocatable. */ -- if (__glibc_likely (anscp != NULL)) { -+ /* Is the answer buffer too small? */ -+ if (*thisanssizp < rlen) { -+ /* If the current buffer is not the the static -+ user-supplied buffer then we can reallocate -+ it. */ -+ if (thisansp != NULL && thisansp != ansp) { -+ /* Always allocate MAXPACKET, callers expect -+ this specific size. */ - u_char *newp = malloc (MAXPACKET); - if (newp == NULL) { - *terrno = ENOMEM; -@@ -835,6 +901,9 @@ send_vc(res_state statp, - if (thisansp == ansp2) - *ansp2_malloced = 1; - anhp = (HEADER *) newp; -+ /* A uint16_t can't be larger than MAXPACKET -+ thus it's safe to allocate MAXPACKET but -+ read RLEN bytes instead. */ - len = rlen; - } else { - Dprint(statp->options & RES_DEBUG, -@@ -997,6 +1066,66 @@ reopen (res_state statp, int *terrno, in - return 1; - } - -+/* The send_dg function is responsible for sending a DNS query over UDP -+ to the nameserver numbered NS from the res_state STATP i.e. -+ EXT(statp).nssocks[ns]. The function supports IPv4 and IPv6 queries -+ along with the ability to send the query in parallel for both stacks -+ (default) or serially (RES_SINGLKUP). It also supports serial lookup -+ with a close and reopen of the socket used to talk to the server -+ (RES_SNGLKUPREOP) to work around broken name servers. -+ -+ The query stored in BUF of BUFLEN length is sent first followed by -+ the query stored in BUF2 of BUFLEN2 length. Queries are sent -+ in parallel (default) or serially (RES_SINGLKUP or RES_SNGLKUPREOP). -+ -+ Answers to the query are stored firstly in *ANSP up to a max of -+ *ANSSIZP bytes. If more than *ANSSIZP bytes are needed and ANSCP -+ is non-NULL (to indicate that modifying the answer buffer is allowed) -+ then malloc is used to allocate a new response buffer and ANSCP and -+ ANSP will both point to the new buffer. If more than *ANSSIZP bytes -+ are needed but ANSCP is NULL, then as much of the response as -+ possible is read into the buffer, but the results will be truncated. -+ When truncation happens because of a small answer buffer the DNS -+ packets header field TC will bet set to 1, indicating a truncated -+ message, while the rest of the UDP packet is discarded. -+ -+ Answers to the query are stored secondly in *ANSP2 up to a max of -+ *ANSSIZP2 bytes, with the actual response length stored in -+ *RESPLEN2. If more than *ANSSIZP bytes are needed and ANSP2 -+ is non-NULL (required for a second query) then malloc is used to -+ allocate a new response buffer, *ANSSIZP2 is set to the new buffer -+ size and *ANSP2_MALLOCED is set to 1. -+ -+ The ANSP2_MALLOCED argument will eventually be removed as the -+ change in buffer pointer can be used to detect the buffer has -+ changed and that the caller should use free on the new buffer. -+ -+ Note that the answers may arrive in any order from the server and -+ therefore the first and second answer buffers may not correspond to -+ the first and second queries. -+ -+ It is not supported to call this function with a non-NULL ANSP2 -+ but a NULL ANSCP. Put another way, you can call send_vc with a -+ single unmodifiable buffer or two modifiable buffers, but no other -+ combination is supported. -+ -+ It is the caller's responsibility to free the malloc allocated -+ buffers by detecting that the pointers have changed from their -+ original values i.e. *ANSCP or *ANSP2 has changed. -+ -+ If an answer is truncated because of UDP datagram DNS limits then -+ *V_CIRCUIT is set to 1 and the return value non-zero to indicate to -+ the caller to retry with TCP. The value *GOTSOMEWHERE is set to 1 -+ if any progress was made reading a response from the nameserver and -+ is used by the caller to distinguish between ECONNREFUSED and -+ ETIMEDOUT (the latter if *GOTSOMEWHERE is 1). -+ -+ If errors are encountered then *TERRNO is set to an appropriate -+ errno value and a zero result is returned for a recoverable error, -+ and a less-than zero result is returned for a non-recoverable error. -+ -+ If no errors are encountered then *TERRNO is left unmodified and -+ a the length of the first response in bytes is returned. */ - static int - send_dg(res_state statp, - const u_char *buf, int buflen, const u_char *buf2, int buflen2, -@@ -1006,8 +1135,6 @@ send_dg(res_state statp, - { - const HEADER *hp = (HEADER *) buf; - const HEADER *hp2 = (HEADER *) buf2; -- u_char *ans = *ansp; -- int orig_anssizp = *anssizp; - struct timespec now, timeout, finish; - struct pollfd pfd[1]; - int ptimeout; -@@ -1040,6 +1167,8 @@ send_dg(res_state statp, - int need_recompute = 0; - int nwritten = 0; - int recvresp1 = 0; -+ /* Skip the second response if there is no second query. -+ To do that we mark the second response as received. */ - int recvresp2 = buf2 == NULL; - pfd[0].fd = EXT(statp).nssocks[ns]; - pfd[0].events = POLLOUT; -@@ -1203,55 +1332,56 @@ send_dg(res_state statp, - int *thisresplenp; - - if ((recvresp1 | recvresp2) == 0 || buf2 == NULL) { -+ /* We have not received any responses -+ yet or we only have one response to -+ receive. */ - thisanssizp = anssizp; - thisansp = anscp ?: ansp; - assert (anscp != NULL || ansp2 == NULL); - thisresplenp = &resplen; - } else { -- if (*anssizp != MAXPACKET) { -- /* No buffer allocated for the first -- reply. We can try to use the rest -- of the user-provided buffer. */ --#if _STRING_ARCH_unaligned -- *anssizp2 = orig_anssizp - resplen; -- *ansp2 = *ansp + resplen; --#else -- int aligned_resplen -- = ((resplen + __alignof__ (HEADER) - 1) -- & ~(__alignof__ (HEADER) - 1)); -- *anssizp2 = orig_anssizp - aligned_resplen; -- *ansp2 = *ansp + aligned_resplen; --#endif -- } else { -- /* The first reply did not fit into the -- user-provided buffer. Maybe the second -- answer will. */ -- *anssizp2 = orig_anssizp; -- *ansp2 = *ansp; -- } -- - thisanssizp = anssizp2; - thisansp = ansp2; - thisresplenp = resplen2; - } - - if (*thisanssizp < MAXPACKET -- /* Yes, we test ANSCP here. If we have two buffers -- both will be allocatable. */ -- && anscp -+ /* If the current buffer is not the the static -+ user-supplied buffer then we can reallocate -+ it. */ -+ && (thisansp != NULL && thisansp != ansp) - #ifdef FIONREAD -+ /* Is the size too small? */ - && (ioctl (pfd[0].fd, FIONREAD, thisresplenp) < 0 - || *thisanssizp < *thisresplenp) - #endif - ) { -+ /* Always allocate MAXPACKET, callers expect -+ this specific size. */ - u_char *newp = malloc (MAXPACKET); - if (newp != NULL) { -- *anssizp = MAXPACKET; -- *thisansp = ans = newp; -+ *thisanssizp = MAXPACKET; -+ *thisansp = newp; - if (thisansp == ansp2) - *ansp2_malloced = 1; - } - } -+ /* We could end up with truncation if anscp was NULL -+ (not allowed to change caller's buffer) and the -+ response buffer size is too small. This isn't a -+ reliable way to detect truncation because the ioctl -+ may be an inaccurate report of the UDP message size. -+ Therefore we use this only to issue debug output. -+ To do truncation accurately with UDP we need -+ MSG_TRUNC which is only available on Linux. We -+ can abstract out the Linux-specific feature in the -+ future to detect truncation. */ -+ if (__glibc_unlikely (*thisanssizp < *thisresplenp)) { -+ Dprint(statp->options & RES_DEBUG, -+ (stdout, ";; response may be truncated (UDP)\n") -+ ); -+ } -+ - HEADER *anhp = (HEADER *) *thisansp; - socklen_t fromlen = sizeof(struct sockaddr_in6); - assert (sizeof(from) <= fromlen); -Index: git/ChangeLog -=================================================================== ---- git.orig/ChangeLog -+++ git/ChangeLog -@@ -1,3 +1,18 @@ -+2016-02-15 Carlos O'Donell <carlos@redhat.com> -+ -+ [BZ #18665] -+ * resolv/nss_dns/dns-host.c (gaih_getanswer_slice): Always set -+ *herrno_p. -+ (gaih_getanswer): Document functional behviour. Return tryagain -+ if any result is tryagain. -+ * resolv/res_query.c (__libc_res_nsearch): Set buffer size to zero -+ when freed. -+ * resolv/res_send.c: Add copyright text. -+ (__libc_res_nsend): Document that MAXPACKET is expected. -+ (send_vc): Document. Remove buffer reuse. -+ (send_dg): Document. Remove buffer reuse. Set *thisanssizp to set the -+ size of the buffer. Add Dprint for truncated UDP buffer. -+ - 2015-09-26 Paul Pluzhnikov <ppluzhnikov@google.com> - - [BZ #18985] diff --git a/yocto-poky/meta/recipes-core/glibc/glibc/CVE-2015-8776.patch b/yocto-poky/meta/recipes-core/glibc/glibc/CVE-2015-8776.patch deleted file mode 100644 index 684f34417..000000000 --- a/yocto-poky/meta/recipes-core/glibc/glibc/CVE-2015-8776.patch +++ /dev/null @@ -1,155 +0,0 @@ -From d36c75fc0d44deec29635dd239b0fbd206ca49b7 Mon Sep 17 00:00:00 2001 -From: Paul Pluzhnikov <ppluzhnikov@google.com> -Date: Sat, 26 Sep 2015 13:27:48 -0700 -Subject: [PATCH] Fix BZ #18985 -- out of range data to strftime() causes a - segfault - -Upstream-Status: Backport -CVE: CVE-2015-8776 -[Yocto # 8980] - -https://sourceware.org/git/gitweb.cgi?p=glibc.git;h=d36c75fc0d44deec29635dd239b0fbd206ca49b7 - -Signed-off-by: Armin Kuster <akuster@mvista.com> - ---- - ChangeLog | 8 ++++++++ - NEWS | 2 +- - time/strftime_l.c | 20 +++++++++++++------- - time/tst-strftime.c | 52 +++++++++++++++++++++++++++++++++++++++++++++++++++- - 4 files changed, 73 insertions(+), 9 deletions(-) - -Index: git/ChangeLog -=================================================================== ---- git.orig/ChangeLog -+++ git/ChangeLog -@@ -1,3 +1,11 @@ -+2015-09-26 Paul Pluzhnikov <ppluzhnikov@google.com> -+ -+ [BZ #18985] -+ * time/strftime_l.c (a_wkday, f_wkday, a_month, f_month): Range check. -+ (__strftime_internal): Likewise. -+ * time/tst-strftime.c (do_bz18985): New test. -+ (do_test): Call it. -+ - 2015-12-04 Joseph Myers <joseph@codesourcery.com> - - [BZ #16961] -Index: git/time/strftime_l.c -=================================================================== ---- git.orig/time/strftime_l.c -+++ git/time/strftime_l.c -@@ -514,13 +514,17 @@ __strftime_internal (s, maxsize, format, - only a few elements. Dereference the pointers only if the format - requires this. Then it is ok to fail if the pointers are invalid. */ - # define a_wkday \ -- ((const CHAR_T *) _NL_CURRENT (LC_TIME, NLW(ABDAY_1) + tp->tm_wday)) -+ ((const CHAR_T *) (tp->tm_wday < 0 || tp->tm_wday > 6 \ -+ ? "?" : _NL_CURRENT (LC_TIME, NLW(ABDAY_1) + tp->tm_wday))) - # define f_wkday \ -- ((const CHAR_T *) _NL_CURRENT (LC_TIME, NLW(DAY_1) + tp->tm_wday)) -+ ((const CHAR_T *) (tp->tm_wday < 0 || tp->tm_wday > 6 \ -+ ? "?" : _NL_CURRENT (LC_TIME, NLW(DAY_1) + tp->tm_wday))) - # define a_month \ -- ((const CHAR_T *) _NL_CURRENT (LC_TIME, NLW(ABMON_1) + tp->tm_mon)) -+ ((const CHAR_T *) (tp->tm_mon < 0 || tp->tm_mon > 11 \ -+ ? "?" : _NL_CURRENT (LC_TIME, NLW(ABMON_1) + tp->tm_mon))) - # define f_month \ -- ((const CHAR_T *) _NL_CURRENT (LC_TIME, NLW(MON_1) + tp->tm_mon)) -+ ((const CHAR_T *) (tp->tm_mon < 0 || tp->tm_mon > 11 \ -+ ? "?" : _NL_CURRENT (LC_TIME, NLW(MON_1) + tp->tm_mon))) - # define ampm \ - ((const CHAR_T *) _NL_CURRENT (LC_TIME, tp->tm_hour > 11 \ - ? NLW(PM_STR) : NLW(AM_STR))) -@@ -530,8 +534,10 @@ __strftime_internal (s, maxsize, format, - # define ap_len STRLEN (ampm) - #else - # if !HAVE_STRFTIME --# define f_wkday (weekday_name[tp->tm_wday]) --# define f_month (month_name[tp->tm_mon]) -+# define f_wkday (tp->tm_wday < 0 || tp->tm_wday > 6 \ -+ ? "?" : weekday_name[tp->tm_wday]) -+# define f_month (tp->tm_mon < 0 || tp->tm_mon > 11 \ -+ ? "?" : month_name[tp->tm_mon]) - # define a_wkday f_wkday - # define a_month f_month - # define ampm (L_("AMPM") + 2 * (tp->tm_hour > 11)) -@@ -1325,7 +1331,7 @@ __strftime_internal (s, maxsize, format, - *tzset_called = true; - } - # endif -- zone = tzname[tp->tm_isdst]; -+ zone = tp->tm_isdst <= 1 ? tzname[tp->tm_isdst] : "?"; - } - #endif - if (! zone) -Index: git/time/tst-strftime.c -=================================================================== ---- git.orig/time/tst-strftime.c -+++ git/time/tst-strftime.c -@@ -4,6 +4,56 @@ - #include <time.h> - - -+static int -+do_bz18985 (void) -+{ -+ char buf[1000]; -+ struct tm ttm; -+ int rc, ret = 0; -+ -+ memset (&ttm, 1, sizeof (ttm)); -+ ttm.tm_zone = NULL; /* Dereferenced directly if non-NULL. */ -+ rc = strftime (buf, sizeof (buf), "%a %A %b %B %c %z %Z", &ttm); -+ -+ if (rc == 66) -+ { -+ const char expected[] -+ = "? ? ? ? ? ? 16843009 16843009:16843009:16843009 16844909 +467836 ?"; -+ if (0 != strcmp (buf, expected)) -+ { -+ printf ("expected:\n %s\ngot:\n %s\n", expected, buf); -+ ret += 1; -+ } -+ } -+ else -+ { -+ printf ("expected 66, got %d\n", rc); -+ ret += 1; -+ } -+ -+ /* Check negative values as well. */ -+ memset (&ttm, 0xFF, sizeof (ttm)); -+ ttm.tm_zone = NULL; /* Dereferenced directly if non-NULL. */ -+ rc = strftime (buf, sizeof (buf), "%a %A %b %B %c %z %Z", &ttm); -+ -+ if (rc == 30) -+ { -+ const char expected[] = "? ? ? ? ? ? -1 -1:-1:-1 1899 "; -+ if (0 != strcmp (buf, expected)) -+ { -+ printf ("expected:\n %s\ngot:\n %s\n", expected, buf); -+ ret += 1; -+ } -+ } -+ else -+ { -+ printf ("expected 30, got %d\n", rc); -+ ret += 1; -+ } -+ -+ return ret; -+} -+ - static struct - { - const char *fmt; -@@ -104,7 +154,7 @@ do_test (void) - } - } - -- return result; -+ return result + do_bz18985 (); - } - - #define TEST_FUNCTION do_test () diff --git a/yocto-poky/meta/recipes-core/glibc/glibc/CVE-2015-8777.patch b/yocto-poky/meta/recipes-core/glibc/glibc/CVE-2015-8777.patch deleted file mode 100644 index eeab72d65..000000000 --- a/yocto-poky/meta/recipes-core/glibc/glibc/CVE-2015-8777.patch +++ /dev/null @@ -1,123 +0,0 @@ -From a014cecd82b71b70a6a843e250e06b541ad524f7 Mon Sep 17 00:00:00 2001 -From: Florian Weimer <fweimer@redhat.com> -Date: Thu, 15 Oct 2015 09:23:07 +0200 -Subject: [PATCH] Always enable pointer guard [BZ #18928] - -Honoring the LD_POINTER_GUARD environment variable in AT_SECURE mode -has security implications. This commit enables pointer guard -unconditionally, and the environment variable is now ignored. - - [BZ #18928] - * sysdeps/generic/ldsodefs.h (struct rtld_global_ro): Remove - _dl_pointer_guard member. - * elf/rtld.c (_rtld_global_ro): Remove _dl_pointer_guard - initializer. - (security_init): Always set up pointer guard. - (process_envvars): Do not process LD_POINTER_GUARD. - -Upstream-Status: Backport -CVE: CVE-2015-8777 -[Yocto # 8980] - -https://sourceware.org/git/gitweb.cgi?p=glibc.git;a=commit;h=a014cecd82b71b70a6a843e250e06b541ad524f7 - -Signed-off-by: Armin Kuster <akuster@mvista.com> - ---- - ChangeLog | 10 ++++++++++ - NEWS | 13 ++++++++----- - elf/rtld.c | 15 ++++----------- - sysdeps/generic/ldsodefs.h | 3 --- - 4 files changed, 22 insertions(+), 19 deletions(-) - -Index: git/ChangeLog -=================================================================== ---- git.orig/ChangeLog -+++ git/ChangeLog -@@ -1,3 +1,14 @@ -+2015-10-15 Florian Weimer <fweimer@redhat.com> -+ -+ [BZ #18928] -+ * sysdeps/generic/ldsodefs.h (struct rtld_global_ro): Remove -+ _dl_pointer_guard member. -+ * elf/rtld.c (_rtld_global_ro): Remove _dl_pointer_guard -+ initializer. -+ (security_init): Always set up pointer guard. -+ (process_envvars): Do not process LD_POINTER_GUARD. -+ -+ - 2015-08-10 Maxim Ostapenko <m.ostapenko@partner.samsung.com> - - [BZ #18778] -Index: git/NEWS -=================================================================== ---- git.orig/NEWS -+++ git/NEWS -@@ -34,7 +34,10 @@ Version 2.22 - 18533, 18534, 18536, 18539, 18540, 18542, 18544, 18545, 18546, 18547, - 18549, 18553, 18557, 18558, 18569, 18583, 18585, 18586, 18592, 18593, - 18594, 18602, 18612, 18613, 18619, 18633, 18635, 18641, 18643, 18648, -- 18657, 18676, 18694, 18696. -+ 18657, 18676, 18694, 18696, 18928. -+ -+* The LD_POINTER_GUARD environment variable can no longer be used to -+ disable the pointer guard feature. It is always enabled. - - * Cache information can be queried via sysconf() function on s390 e.g. with - _SC_LEVEL1_ICACHE_SIZE as argument. -Index: git/elf/rtld.c -=================================================================== ---- git.orig/elf/rtld.c -+++ git/elf/rtld.c -@@ -163,7 +163,6 @@ struct rtld_global_ro _rtld_global_ro at - ._dl_hwcap_mask = HWCAP_IMPORTANT, - ._dl_lazy = 1, - ._dl_fpu_control = _FPU_DEFAULT, -- ._dl_pointer_guard = 1, - ._dl_pagesize = EXEC_PAGESIZE, - ._dl_inhibit_cache = 0, - -@@ -710,15 +709,12 @@ security_init (void) - #endif - - /* Set up the pointer guard as well, if necessary. */ -- if (GLRO(dl_pointer_guard)) -- { -- uintptr_t pointer_chk_guard = _dl_setup_pointer_guard (_dl_random, -- stack_chk_guard); -+ uintptr_t pointer_chk_guard -+ = _dl_setup_pointer_guard (_dl_random, stack_chk_guard); - #ifdef THREAD_SET_POINTER_GUARD -- THREAD_SET_POINTER_GUARD (pointer_chk_guard); -+ THREAD_SET_POINTER_GUARD (pointer_chk_guard); - #endif -- __pointer_chk_guard_local = pointer_chk_guard; -- } -+ __pointer_chk_guard_local = pointer_chk_guard; - - /* We do not need the _dl_random value anymore. The less - information we leave behind, the better, so clear the -@@ -2478,9 +2474,6 @@ process_envvars (enum mode *modep) - GLRO(dl_use_load_bias) = envline[14] == '1' ? -1 : 0; - break; - } -- -- if (memcmp (envline, "POINTER_GUARD", 13) == 0) -- GLRO(dl_pointer_guard) = envline[14] != '0'; - break; - - case 14: -Index: git/sysdeps/generic/ldsodefs.h -=================================================================== ---- git.orig/sysdeps/generic/ldsodefs.h -+++ git/sysdeps/generic/ldsodefs.h -@@ -600,9 +600,6 @@ struct rtld_global_ro - /* List of auditing interfaces. */ - struct audit_ifaces *_dl_audit; - unsigned int _dl_naudit; -- -- /* 0 if internal pointer values should not be guarded, 1 if they should. */ -- EXTERN int _dl_pointer_guard; - }; - # define __rtld_global_attribute__ - # if IS_IN (rtld) diff --git a/yocto-poky/meta/recipes-core/glibc/glibc/CVE-2015-8779.patch b/yocto-poky/meta/recipes-core/glibc/glibc/CVE-2015-8779.patch deleted file mode 100644 index 4dc93c769..000000000 --- a/yocto-poky/meta/recipes-core/glibc/glibc/CVE-2015-8779.patch +++ /dev/null @@ -1,262 +0,0 @@ -From 0f58539030e436449f79189b6edab17d7479796e Mon Sep 17 00:00:00 2001 -From: Paul Pluzhnikov <ppluzhnikov@google.com> -Date: Sat, 8 Aug 2015 15:53:03 -0700 -Subject: [PATCH] Fix BZ #17905 - -Upstream-Status: Backport -CVE: CVE-2015-8779 -[Yocto # 8980] - -https://sourceware.org/git/gitweb.cgi?p=glibc.git;h=0f58539030e436449f79189b6edab17d7479796e - -Signed-off-by: Armin Kuster <akuster@mvista.com> - ---- - ChangeLog | 8 ++++++++ - NEWS | 2 +- - catgets/Makefile | 9 ++++++++- - catgets/catgets.c | 19 ++++++++++++------- - catgets/open_catalog.c | 23 ++++++++++++++--------- - catgets/tst-catgets.c | 31 +++++++++++++++++++++++++++++++ - 6 files changed, 74 insertions(+), 18 deletions(-) - -Index: git/catgets/Makefile -=================================================================== ---- git.orig/catgets/Makefile -+++ git/catgets/Makefile -@@ -37,6 +37,7 @@ ifeq (y,$(OPTION_EGLIBC_CATGETS)) - ifeq ($(run-built-tests),yes) - tests-special += $(objpfx)de/libc.cat $(objpfx)test1.cat $(objpfx)test2.cat \ - $(objpfx)sample.SJIS.cat $(objpfx)test-gencat.out -+tests-special += $(objpfx)tst-catgets-mem.out - endif - endif - gencat-modules = xmalloc -@@ -53,9 +54,11 @@ catgets-CPPFLAGS := -DNLSPATH='"$(msgcat - - generated += de.msg test1.cat test1.h test2.cat test2.h sample.SJIS.cat \ - test-gencat.h -+generated += tst-catgets.mtrace tst-catgets-mem.out -+ - generated-dirs += de - --tst-catgets-ENV = NLSPATH="$(objpfx)%l/%N.cat" LANG=de -+tst-catgets-ENV = NLSPATH="$(objpfx)%l/%N.cat" LANG=de MALLOC_TRACE=$(objpfx)tst-catgets.mtrace - - ifeq ($(run-built-tests),yes) - # This test just checks whether the program produces any error or not. -@@ -89,4 +92,8 @@ $(objpfx)test-gencat.out: test-gencat.sh - $(objpfx)sample.SJIS.cat: sample.SJIS $(objpfx)gencat - $(built-program-cmd) -H $(objpfx)test-gencat.h < $(word 1,$^) > $@; \ - $(evaluate-test) -+ -+$(objpfx)tst-catgets-mem.out: $(objpfx)tst-catgets.out -+ $(common-objpfx)malloc/mtrace $(objpfx)tst-catgets.mtrace > $@; \ -+ $(evaluate-test) - endif -Index: git/catgets/catgets.c -=================================================================== ---- git.orig/catgets/catgets.c -+++ git/catgets/catgets.c -@@ -16,7 +16,6 @@ - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - --#include <alloca.h> - #include <errno.h> - #include <locale.h> - #include <nl_types.h> -@@ -35,6 +34,7 @@ catopen (const char *cat_name, int flag) - __nl_catd result; - const char *env_var = NULL; - const char *nlspath = NULL; -+ char *tmp = NULL; - - if (strchr (cat_name, '/') == NULL) - { -@@ -54,7 +54,10 @@ catopen (const char *cat_name, int flag) - { - /* Append the system dependent directory. */ - size_t len = strlen (nlspath) + 1 + sizeof NLSPATH; -- char *tmp = alloca (len); -+ tmp = malloc (len); -+ -+ if (__glibc_unlikely (tmp == NULL)) -+ return (nl_catd) -1; - - __stpcpy (__stpcpy (__stpcpy (tmp, nlspath), ":"), NLSPATH); - nlspath = tmp; -@@ -65,16 +68,18 @@ catopen (const char *cat_name, int flag) - - result = (__nl_catd) malloc (sizeof (*result)); - if (result == NULL) -- /* We cannot get enough memory. */ -- return (nl_catd) -1; -- -- if (__open_catalog (cat_name, nlspath, env_var, result) != 0) -+ { -+ /* We cannot get enough memory. */ -+ result = (nl_catd) -1; -+ } -+ else if (__open_catalog (cat_name, nlspath, env_var, result) != 0) - { - /* Couldn't open the file. */ - free ((void *) result); -- return (nl_catd) -1; -+ result = (nl_catd) -1; - } - -+ free (tmp); - return (nl_catd) result; - } - -Index: git/catgets/open_catalog.c -=================================================================== ---- git.orig/catgets/open_catalog.c -+++ git/catgets/open_catalog.c -@@ -47,6 +47,7 @@ __open_catalog (const char *cat_name, co - size_t tab_size; - const char *lastp; - int result = -1; -+ char *buf = NULL; - - if (strchr (cat_name, '/') != NULL || nlspath == NULL) - fd = open_not_cancel_2 (cat_name, O_RDONLY); -@@ -57,23 +58,23 @@ __open_catalog (const char *cat_name, co - if (__glibc_unlikely (bufact + (n) >= bufmax)) \ - { \ - char *old_buf = buf; \ -- bufmax += 256 + (n); \ -- buf = (char *) alloca (bufmax); \ -- memcpy (buf, old_buf, bufact); \ -+ bufmax += (bufmax < 256 + (n)) ? 256 + (n) : bufmax; \ -+ buf = realloc (buf, bufmax); \ -+ if (__glibc_unlikely (buf == NULL)) \ -+ { \ -+ free (old_buf); \ -+ return -1; \ -+ } \ - } - - /* The RUN_NLSPATH variable contains a colon separated list of - descriptions where we expect to find catalogs. We have to - recognize certain % substitutions and stop when we found the - first existing file. */ -- char *buf; - size_t bufact; -- size_t bufmax; -+ size_t bufmax = 0; - size_t len; - -- buf = NULL; -- bufmax = 0; -- - fd = -1; - while (*run_nlspath != '\0') - { -@@ -188,7 +189,10 @@ __open_catalog (const char *cat_name, co - - /* Avoid dealing with directories and block devices */ - if (__builtin_expect (fd, 0) < 0) -- return -1; -+ { -+ free (buf); -+ return -1; -+ } - - if (__builtin_expect (__fxstat64 (_STAT_VER, fd, &st), 0) < 0) - goto close_unlock_return; -@@ -325,6 +329,7 @@ __open_catalog (const char *cat_name, co - /* Release the lock again. */ - close_unlock_return: - close_not_cancel_no_status (fd); -+ free (buf); - - return result; - } -Index: git/catgets/tst-catgets.c -=================================================================== ---- git.orig/catgets/tst-catgets.c -+++ git/catgets/tst-catgets.c -@@ -1,7 +1,10 @@ -+#include <assert.h> - #include <mcheck.h> - #include <nl_types.h> - #include <stdio.h> -+#include <stdlib.h> - #include <string.h> -+#include <sys/resource.h> - - - static const char *msgs[] = -@@ -12,6 +15,33 @@ static const char *msgs[] = - }; - #define nmsgs (sizeof (msgs) / sizeof (msgs[0])) - -+ -+/* Test for unbounded alloca. */ -+static int -+do_bz17905 (void) -+{ -+ char *buf; -+ struct rlimit rl; -+ nl_catd result; -+ -+ const int sz = 1024 * 1024; -+ -+ getrlimit (RLIMIT_STACK, &rl); -+ rl.rlim_cur = sz; -+ setrlimit (RLIMIT_STACK, &rl); -+ -+ buf = malloc (sz + 1); -+ memset (buf, 'A', sz); -+ buf[sz] = '\0'; -+ setenv ("NLSPATH", buf, 1); -+ -+ result = catopen (buf, NL_CAT_LOCALE); -+ assert (result == (nl_catd) -1); -+ -+ free (buf); -+ return 0; -+} -+ - #define ROUNDS 5 - - static int -@@ -62,6 +92,7 @@ do_test (void) - } - } - -+ result += do_bz17905 (); - return result; - } - -Index: git/ChangeLog -=================================================================== ---- git.orig/ChangeLog -+++ git/ChangeLog -@@ -1,3 +1,11 @@ -+2015-08-08 Paul Pluzhnikov <ppluzhnikov@google.com> -+ -+ [BZ #17905] -+ * catgets/Makefile (tst-catgets-mem): New test. -+ * catgets/catgets.c (catopen): Don't use unbounded alloca. -+ * catgets/open_catalog.c (__open_catalog): Likewise. -+ * catgets/tst-catgets.c (do_bz17905): Test unbounded alloca. -+ - 2015-10-15 Florian Weimer <fweimer@redhat.com> - - [BZ #18928] -Index: git/NEWS -=================================================================== ---- git.orig/NEWS -+++ git/NEWS -@@ -9,7 +9,7 @@ Version 2.22.1 - - * The following bugs are resolved with this release: - -- 18778, 18781, 18787. -+ 18778, 18781, 18787, 17905. - - Version 2.22 - diff --git a/yocto-poky/meta/recipes-core/glibc/glibc/CVE-2015-9761_1.patch b/yocto-poky/meta/recipes-core/glibc/glibc/CVE-2015-9761_1.patch deleted file mode 100644 index 3aca91331..000000000 --- a/yocto-poky/meta/recipes-core/glibc/glibc/CVE-2015-9761_1.patch +++ /dev/null @@ -1,1039 +0,0 @@ -From e02cabecf0d025ec4f4ddee290bdf7aadb873bb3 Mon Sep 17 00:00:00 2001 -From: Joseph Myers <joseph@codesourcery.com> -Date: Tue, 24 Nov 2015 22:24:52 +0000 -Subject: [PATCH] Refactor strtod parsing of NaN payloads. - -The nan* functions handle their string argument by constructing a -NAN(...) string on the stack as a VLA and passing it to strtod -functions. - -This approach has problems discussed in bug 16961 and bug 16962: the -stack usage is unbounded, and it gives incorrect results in certain -cases where the argument is not a valid n-char-sequence. - -The natural fix for both issues is to refactor the NaN payload parsing -out of strtod into a separate function that the nan* functions can -call directly, so that no temporary string needs constructing on the -stack at all. This patch does that refactoring in preparation for -fixing those bugs (but without actually using the new functions from -nan* - which will also require exporting them from libc at version -GLIBC_PRIVATE). This patch is not intended to change any user-visible -behavior, so no tests are added (fixes for the above bugs will of -course add tests for them). - -This patch builds on my recent fixes for strtol and strtod issues in -Turkish locales. Given those fixes, the parsing of NaN payloads is -locale-independent; thus, the new functions do not need to take a -locale_t argument. - -Tested for x86_64, x86, mips64 and powerpc. - - * stdlib/strtod_nan.c: New file. - * stdlib/strtod_nan_double.h: Likewise. - * stdlib/strtod_nan_float.h: Likewise. - * stdlib/strtod_nan_main.c: Likewise. - * stdlib/strtod_nan_narrow.h: Likewise. - * stdlib/strtod_nan_wide.h: Likewise. - * stdlib/strtof_nan.c: Likewise. - * stdlib/strtold_nan.c: Likewise. - * sysdeps/ieee754/ldbl-128/strtod_nan_ldouble.h: Likewise. - * sysdeps/ieee754/ldbl-128ibm/strtod_nan_ldouble.h: Likewise. - * sysdeps/ieee754/ldbl-96/strtod_nan_ldouble.h: Likewise. - * wcsmbs/wcstod_nan.c: Likewise. - * wcsmbs/wcstof_nan.c: Likewise. - * wcsmbs/wcstold_nan.c: Likewise. - * stdlib/Makefile (routines): Add strtof_nan, strtod_nan and - strtold_nan. - * wcsmbs/Makefile (routines): Add wcstod_nan, wcstold_nan and - wcstof_nan. - * include/stdlib.h (__strtof_nan): Declare and use - libc_hidden_proto. - (__strtod_nan): Likewise. - (__strtold_nan): Likewise. - (__wcstof_nan): Likewise. - (__wcstod_nan): Likewise. - (__wcstold_nan): Likewise. - * include/wchar.h (____wcstoull_l_internal): Declare. - * stdlib/strtod_l.c: Do not include <ieee754.h>. - (____strtoull_l_internal): Remove declaration. - (STRTOF_NAN): Define macro. - (SET_MANTISSA): Remove macro. - (STRTOULL): Likewise. - (____STRTOF_INTERNAL): Use STRTOF_NAN to parse NaN payload. - * stdlib/strtof_l.c (____strtoull_l_internal): Remove declaration. - (STRTOF_NAN): Define macro. - (SET_MANTISSA): Remove macro. - * sysdeps/ieee754/ldbl-128/strtold_l.c (STRTOF_NAN): Define macro. - (SET_MANTISSA): Remove macro. - * sysdeps/ieee754/ldbl-128ibm/strtold_l.c (STRTOF_NAN): Define - macro. - (SET_MANTISSA): Remove macro. - * sysdeps/ieee754/ldbl-64-128/strtold_l.c (STRTOF_NAN): Define - macro. - (SET_MANTISSA): Remove macro. - * sysdeps/ieee754/ldbl-96/strtold_l.c (STRTOF_NAN): Define macro. - (SET_MANTISSA): Remove macro. - * wcsmbs/wcstod_l.c (____wcstoull_l_internal): Remove declaration. - * wcsmbs/wcstof_l.c (____wcstoull_l_internal): Likewise. - * wcsmbs/wcstold_l.c (____wcstoull_l_internal): Likewise. - -Upstream-Status: Backport -CVE: CVE-2015-9761 patch #1 -[Yocto # 8980] - -https://sourceware.org/git/gitweb.cgi?p=glibc.git;h=e02cabecf0d025ec4f4ddee290bdf7aadb873bb3 - -Signed-off-by: Armin Kuster <akuster@mvista.com> - ---- - ChangeLog | 49 ++++++++++++++++++ - include/stdlib.h | 18 +++++++ - include/wchar.h | 3 ++ - stdlib/Makefile | 1 + - stdlib/strtod_l.c | 48 ++++-------------- - stdlib/strtod_nan.c | 24 +++++++++ - stdlib/strtod_nan_double.h | 30 +++++++++++ - stdlib/strtod_nan_float.h | 29 +++++++++++ - stdlib/strtod_nan_main.c | 63 ++++++++++++++++++++++++ - stdlib/strtod_nan_narrow.h | 22 +++++++++ - stdlib/strtod_nan_wide.h | 22 +++++++++ - stdlib/strtof_l.c | 11 +---- - stdlib/strtof_nan.c | 24 +++++++++ - stdlib/strtold_nan.c | 30 +++++++++++ - sysdeps/ieee754/ldbl-128/strtod_nan_ldouble.h | 33 +++++++++++++ - sysdeps/ieee754/ldbl-128/strtold_l.c | 13 +---- - sysdeps/ieee754/ldbl-128ibm/strtod_nan_ldouble.h | 30 +++++++++++ - sysdeps/ieee754/ldbl-128ibm/strtold_l.c | 10 +--- - sysdeps/ieee754/ldbl-64-128/strtold_l.c | 13 +---- - sysdeps/ieee754/ldbl-96/strtod_nan_ldouble.h | 30 +++++++++++ - sysdeps/ieee754/ldbl-96/strtold_l.c | 10 +--- - wcsmbs/Makefile | 1 + - wcsmbs/wcstod_l.c | 3 -- - wcsmbs/wcstod_nan.c | 23 +++++++++ - wcsmbs/wcstof_l.c | 3 -- - wcsmbs/wcstof_nan.c | 23 +++++++++ - wcsmbs/wcstold_l.c | 3 -- - wcsmbs/wcstold_nan.c | 30 +++++++++++ - 28 files changed, 504 insertions(+), 95 deletions(-) - create mode 100644 stdlib/strtod_nan.c - create mode 100644 stdlib/strtod_nan_double.h - create mode 100644 stdlib/strtod_nan_float.h - create mode 100644 stdlib/strtod_nan_main.c - create mode 100644 stdlib/strtod_nan_narrow.h - create mode 100644 stdlib/strtod_nan_wide.h - create mode 100644 stdlib/strtof_nan.c - create mode 100644 stdlib/strtold_nan.c - create mode 100644 sysdeps/ieee754/ldbl-128/strtod_nan_ldouble.h - create mode 100644 sysdeps/ieee754/ldbl-128ibm/strtod_nan_ldouble.h - create mode 100644 sysdeps/ieee754/ldbl-96/strtod_nan_ldouble.h - create mode 100644 wcsmbs/wcstod_nan.c - create mode 100644 wcsmbs/wcstof_nan.c - create mode 100644 wcsmbs/wcstold_nan.c - -Index: git/include/stdlib.h -=================================================================== ---- git.orig/include/stdlib.h -+++ git/include/stdlib.h -@@ -203,6 +203,24 @@ libc_hidden_proto (strtoll) - libc_hidden_proto (strtoul) - libc_hidden_proto (strtoull) - -+extern float __strtof_nan (const char *, char **, char) internal_function; -+extern double __strtod_nan (const char *, char **, char) internal_function; -+extern long double __strtold_nan (const char *, char **, char) -+ internal_function; -+extern float __wcstof_nan (const wchar_t *, wchar_t **, wchar_t) -+ internal_function; -+extern double __wcstod_nan (const wchar_t *, wchar_t **, wchar_t) -+ internal_function; -+extern long double __wcstold_nan (const wchar_t *, wchar_t **, wchar_t) -+ internal_function; -+ -+libc_hidden_proto (__strtof_nan) -+libc_hidden_proto (__strtod_nan) -+libc_hidden_proto (__strtold_nan) -+libc_hidden_proto (__wcstof_nan) -+libc_hidden_proto (__wcstod_nan) -+libc_hidden_proto (__wcstold_nan) -+ - extern char *__ecvt (double __value, int __ndigit, int *__restrict __decpt, - int *__restrict __sign); - extern char *__fcvt (double __value, int __ndigit, int *__restrict __decpt, -Index: git/include/wchar.h -=================================================================== ---- git.orig/include/wchar.h -+++ git/include/wchar.h -@@ -52,6 +52,9 @@ extern unsigned long long int __wcstoull - __restrict __endptr, - int __base, - int __group) __THROW; -+extern unsigned long long int ____wcstoull_l_internal (const wchar_t *, -+ wchar_t **, int, int, -+ __locale_t); - libc_hidden_proto (__wcstof_internal) - libc_hidden_proto (__wcstod_internal) - libc_hidden_proto (__wcstold_internal) -Index: git/stdlib/Makefile -=================================================================== ---- git.orig/stdlib/Makefile -+++ git/stdlib/Makefile -@@ -51,6 +51,7 @@ routines-y := \ - strtol_l strtoul_l strtoll_l strtoull_l \ - strtof strtod strtold \ - strtof_l strtod_l strtold_l \ -+ strtof_nan strtod_nan strtold_nan \ - system canonicalize \ - a64l l64a \ - getsubopt xpg_basename \ -Index: git/stdlib/strtod_l.c -=================================================================== ---- git.orig/stdlib/strtod_l.c -+++ git/stdlib/strtod_l.c -@@ -21,8 +21,6 @@ - #include <xlocale.h> - - extern double ____strtod_l_internal (const char *, char **, int, __locale_t); --extern unsigned long long int ____strtoull_l_internal (const char *, char **, -- int, int, __locale_t); - - /* Configuration part. These macros are defined by `strtold.c', - `strtof.c', `wcstod.c', `wcstold.c', and `wcstof.c' to produce the -@@ -34,27 +32,20 @@ extern unsigned long long int ____strtou - # ifdef USE_WIDE_CHAR - # define STRTOF wcstod_l - # define __STRTOF __wcstod_l -+# define STRTOF_NAN __wcstod_nan - # else - # define STRTOF strtod_l - # define __STRTOF __strtod_l -+# define STRTOF_NAN __strtod_nan - # endif - # define MPN2FLOAT __mpn_construct_double - # define FLOAT_HUGE_VAL HUGE_VAL --# define SET_MANTISSA(flt, mant) \ -- do { union ieee754_double u; \ -- u.d = (flt); \ -- u.ieee_nan.mantissa0 = (mant) >> 32; \ -- u.ieee_nan.mantissa1 = (mant); \ -- if ((u.ieee.mantissa0 | u.ieee.mantissa1) != 0) \ -- (flt) = u.d; \ -- } while (0) - #endif - /* End of configuration part. */ - - #include <ctype.h> - #include <errno.h> - #include <float.h> --#include <ieee754.h> - #include "../locale/localeinfo.h" - #include <locale.h> - #include <math.h> -@@ -105,7 +96,6 @@ extern unsigned long long int ____strtou - # define TOLOWER_C(Ch) __towlower_l ((Ch), _nl_C_locobj_ptr) - # define STRNCASECMP(S1, S2, N) \ - __wcsncasecmp_l ((S1), (S2), (N), _nl_C_locobj_ptr) --# define STRTOULL(S, E, B) ____wcstoull_l_internal ((S), (E), (B), 0, loc) - #else - # define STRING_TYPE char - # define CHAR_TYPE char -@@ -117,7 +107,6 @@ extern unsigned long long int ____strtou - # define TOLOWER_C(Ch) __tolower_l ((Ch), _nl_C_locobj_ptr) - # define STRNCASECMP(S1, S2, N) \ - __strncasecmp_l ((S1), (S2), (N), _nl_C_locobj_ptr) --# define STRTOULL(S, E, B) ____strtoull_l_internal ((S), (E), (B), 0, loc) - #endif - - -@@ -668,33 +657,14 @@ ____STRTOF_INTERNAL (nptr, endptr, group - if (*cp == L_('(')) - { - const STRING_TYPE *startp = cp; -- do -- ++cp; -- while ((*cp >= L_('0') && *cp <= L_('9')) -- || ({ CHAR_TYPE lo = TOLOWER (*cp); -- lo >= L_('a') && lo <= L_('z'); }) -- || *cp == L_('_')); -- -- if (*cp != L_(')')) -- /* The closing brace is missing. Only match the NAN -- part. */ -- cp = startp; -+ STRING_TYPE *endp; -+ retval = STRTOF_NAN (cp + 1, &endp, L_(')')); -+ if (*endp == L_(')')) -+ /* Consume the closing parenthesis. */ -+ cp = endp + 1; - else -- { -- /* This is a system-dependent way to specify the -- bitmask used for the NaN. We expect it to be -- a number which is put in the mantissa of the -- number. */ -- STRING_TYPE *endp; -- unsigned long long int mant; -- -- mant = STRTOULL (startp + 1, &endp, 0); -- if (endp == cp) -- SET_MANTISSA (retval, mant); -- -- /* Consume the closing brace. */ -- ++cp; -- } -+ /* Only match the NAN part. */ -+ cp = startp; - } - - if (endptr != NULL) -Index: git/stdlib/strtod_nan.c -=================================================================== ---- /dev/null -+++ git/stdlib/strtod_nan.c -@@ -0,0 +1,24 @@ -+/* Convert string for NaN payload to corresponding NaN. Narrow -+ strings, double. -+ Copyright (C) 2015 Free Software Foundation, Inc. -+ This file is part of the GNU C Library. -+ -+ The GNU C 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.1 of the License, or (at your option) any later version. -+ -+ The GNU C 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 the GNU C Library; if not, see -+ <http://www.gnu.org/licenses/>. */ -+ -+#include <strtod_nan_narrow.h> -+#include <strtod_nan_double.h> -+ -+#define STRTOD_NAN __strtod_nan -+#include <strtod_nan_main.c> -Index: git/stdlib/strtod_nan_double.h -=================================================================== ---- /dev/null -+++ git/stdlib/strtod_nan_double.h -@@ -0,0 +1,30 @@ -+/* Convert string for NaN payload to corresponding NaN. For double. -+ Copyright (C) 1997-2015 Free Software Foundation, Inc. -+ This file is part of the GNU C Library. -+ -+ The GNU C 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.1 of the License, or (at your option) any later version. -+ -+ The GNU C 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 the GNU C Library; if not, see -+ <http://www.gnu.org/licenses/>. */ -+ -+#define FLOAT double -+#define SET_MANTISSA(flt, mant) \ -+ do \ -+ { \ -+ union ieee754_double u; \ -+ u.d = (flt); \ -+ u.ieee_nan.mantissa0 = (mant) >> 32; \ -+ u.ieee_nan.mantissa1 = (mant); \ -+ if ((u.ieee.mantissa0 | u.ieee.mantissa1) != 0) \ -+ (flt) = u.d; \ -+ } \ -+ while (0) -Index: git/stdlib/strtod_nan_float.h -=================================================================== ---- /dev/null -+++ git/stdlib/strtod_nan_float.h -@@ -0,0 +1,29 @@ -+/* Convert string for NaN payload to corresponding NaN. For float. -+ Copyright (C) 1997-2015 Free Software Foundation, Inc. -+ This file is part of the GNU C Library. -+ -+ The GNU C 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.1 of the License, or (at your option) any later version. -+ -+ The GNU C 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 the GNU C Library; if not, see -+ <http://www.gnu.org/licenses/>. */ -+ -+#define FLOAT float -+#define SET_MANTISSA(flt, mant) \ -+ do \ -+ { \ -+ union ieee754_float u; \ -+ u.f = (flt); \ -+ u.ieee_nan.mantissa = (mant); \ -+ if (u.ieee.mantissa != 0) \ -+ (flt) = u.f; \ -+ } \ -+ while (0) -Index: git/stdlib/strtod_nan_main.c -=================================================================== ---- /dev/null -+++ git/stdlib/strtod_nan_main.c -@@ -0,0 +1,63 @@ -+/* Convert string for NaN payload to corresponding NaN. -+ Copyright (C) 1997-2015 Free Software Foundation, Inc. -+ This file is part of the GNU C Library. -+ -+ The GNU C 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.1 of the License, or (at your option) any later version. -+ -+ The GNU C 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 the GNU C Library; if not, see -+ <http://www.gnu.org/licenses/>. */ -+ -+#include <ieee754.h> -+#include <locale.h> -+#include <math.h> -+#include <stdlib.h> -+#include <wchar.h> -+ -+ -+/* If STR starts with an optional n-char-sequence as defined by ISO C -+ (a sequence of ASCII letters, digits and underscores), followed by -+ ENDC, return a NaN whose payload is set based on STR. Otherwise, -+ return a default NAN. If ENDPTR is not NULL, set *ENDPTR to point -+ to the character after the initial n-char-sequence. */ -+ -+internal_function -+FLOAT -+STRTOD_NAN (const STRING_TYPE *str, STRING_TYPE **endptr, STRING_TYPE endc) -+{ -+ const STRING_TYPE *cp = str; -+ -+ while ((*cp >= L_('0') && *cp <= L_('9')) -+ || (*cp >= L_('A') && *cp <= L_('Z')) -+ || (*cp >= L_('a') && *cp <= L_('z')) -+ || *cp == L_('_')) -+ ++cp; -+ -+ FLOAT retval = NAN; -+ if (*cp != endc) -+ goto out; -+ -+ /* This is a system-dependent way to specify the bitmask used for -+ the NaN. We expect it to be a number which is put in the -+ mantissa of the number. */ -+ STRING_TYPE *endp; -+ unsigned long long int mant; -+ -+ mant = STRTOULL (str, &endp, 0); -+ if (endp == cp) -+ SET_MANTISSA (retval, mant); -+ -+ out: -+ if (endptr != NULL) -+ *endptr = (STRING_TYPE *) cp; -+ return retval; -+} -+libc_hidden_def (STRTOD_NAN) -Index: git/stdlib/strtod_nan_narrow.h -=================================================================== ---- /dev/null -+++ git/stdlib/strtod_nan_narrow.h -@@ -0,0 +1,22 @@ -+/* Convert string for NaN payload to corresponding NaN. Narrow strings. -+ Copyright (C) 1997-2015 Free Software Foundation, Inc. -+ This file is part of the GNU C Library. -+ -+ The GNU C 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.1 of the License, or (at your option) any later version. -+ -+ The GNU C 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 the GNU C Library; if not, see -+ <http://www.gnu.org/licenses/>. */ -+ -+#define STRING_TYPE char -+#define L_(Ch) Ch -+#define STRTOULL(S, E, B) ____strtoull_l_internal ((S), (E), (B), 0, \ -+ _nl_C_locobj_ptr) -Index: git/stdlib/strtod_nan_wide.h -=================================================================== ---- /dev/null -+++ git/stdlib/strtod_nan_wide.h -@@ -0,0 +1,22 @@ -+/* Convert string for NaN payload to corresponding NaN. Wide strings. -+ Copyright (C) 1997-2015 Free Software Foundation, Inc. -+ This file is part of the GNU C Library. -+ -+ The GNU C 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.1 of the License, or (at your option) any later version. -+ -+ The GNU C 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 the GNU C Library; if not, see -+ <http://www.gnu.org/licenses/>. */ -+ -+#define STRING_TYPE wchar_t -+#define L_(Ch) L##Ch -+#define STRTOULL(S, E, B) ____wcstoull_l_internal ((S), (E), (B), 0, \ -+ _nl_C_locobj_ptr) -Index: git/stdlib/strtof_l.c -=================================================================== ---- git.orig/stdlib/strtof_l.c -+++ git/stdlib/strtof_l.c -@@ -20,26 +20,19 @@ - #include <xlocale.h> - - extern float ____strtof_l_internal (const char *, char **, int, __locale_t); --extern unsigned long long int ____strtoull_l_internal (const char *, char **, -- int, int, __locale_t); - - #define FLOAT float - #define FLT FLT - #ifdef USE_WIDE_CHAR - # define STRTOF wcstof_l - # define __STRTOF __wcstof_l -+# define STRTOF_NAN __wcstof_nan - #else - # define STRTOF strtof_l - # define __STRTOF __strtof_l -+# define STRTOF_NAN __strtof_nan - #endif - #define MPN2FLOAT __mpn_construct_float - #define FLOAT_HUGE_VAL HUGE_VALF --#define SET_MANTISSA(flt, mant) \ -- do { union ieee754_float u; \ -- u.f = (flt); \ -- u.ieee_nan.mantissa = (mant); \ -- if (u.ieee.mantissa != 0) \ -- (flt) = u.f; \ -- } while (0) - - #include "strtod_l.c" -Index: git/stdlib/strtof_nan.c -=================================================================== ---- /dev/null -+++ git/stdlib/strtof_nan.c -@@ -0,0 +1,24 @@ -+/* Convert string for NaN payload to corresponding NaN. Narrow -+ strings, float. -+ Copyright (C) 2015 Free Software Foundation, Inc. -+ This file is part of the GNU C Library. -+ -+ The GNU C 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.1 of the License, or (at your option) any later version. -+ -+ The GNU C 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 the GNU C Library; if not, see -+ <http://www.gnu.org/licenses/>. */ -+ -+#include <strtod_nan_narrow.h> -+#include <strtod_nan_float.h> -+ -+#define STRTOD_NAN __strtof_nan -+#include <strtod_nan_main.c> -Index: git/stdlib/strtold_nan.c -=================================================================== ---- /dev/null -+++ git/stdlib/strtold_nan.c -@@ -0,0 +1,30 @@ -+/* Convert string for NaN payload to corresponding NaN. Narrow -+ strings, long double. -+ Copyright (C) 2015 Free Software Foundation, Inc. -+ This file is part of the GNU C Library. -+ -+ The GNU C 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.1 of the License, or (at your option) any later version. -+ -+ The GNU C 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 the GNU C Library; if not, see -+ <http://www.gnu.org/licenses/>. */ -+ -+#include <math.h> -+ -+/* This function is unused if long double and double have the same -+ representation. */ -+#ifndef __NO_LONG_DOUBLE_MATH -+# include <strtod_nan_narrow.h> -+# include <strtod_nan_ldouble.h> -+ -+# define STRTOD_NAN __strtold_nan -+# include <strtod_nan_main.c> -+#endif -Index: git/sysdeps/ieee754/ldbl-128/strtod_nan_ldouble.h -=================================================================== ---- /dev/null -+++ git/sysdeps/ieee754/ldbl-128/strtod_nan_ldouble.h -@@ -0,0 +1,33 @@ -+/* Convert string for NaN payload to corresponding NaN. For ldbl-128. -+ Copyright (C) 1997-2015 Free Software Foundation, Inc. -+ This file is part of the GNU C Library. -+ -+ The GNU C 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.1 of the License, or (at your option) any later version. -+ -+ The GNU C 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 the GNU C Library; if not, see -+ <http://www.gnu.org/licenses/>. */ -+ -+#define FLOAT long double -+#define SET_MANTISSA(flt, mant) \ -+ do \ -+ { \ -+ union ieee854_long_double u; \ -+ u.d = (flt); \ -+ u.ieee_nan.mantissa0 = 0; \ -+ u.ieee_nan.mantissa1 = 0; \ -+ u.ieee_nan.mantissa2 = (mant) >> 32; \ -+ u.ieee_nan.mantissa3 = (mant); \ -+ if ((u.ieee.mantissa0 | u.ieee.mantissa1 \ -+ | u.ieee.mantissa2 | u.ieee.mantissa3) != 0) \ -+ (flt) = u.d; \ -+ } \ -+ while (0) -Index: git/sysdeps/ieee754/ldbl-128/strtold_l.c -=================================================================== ---- git.orig/sysdeps/ieee754/ldbl-128/strtold_l.c -+++ git/sysdeps/ieee754/ldbl-128/strtold_l.c -@@ -25,22 +25,13 @@ - #ifdef USE_WIDE_CHAR - # define STRTOF wcstold_l - # define __STRTOF __wcstold_l -+# define STRTOF_NAN __wcstold_nan - #else - # define STRTOF strtold_l - # define __STRTOF __strtold_l -+# define STRTOF_NAN __strtold_nan - #endif - #define MPN2FLOAT __mpn_construct_long_double - #define FLOAT_HUGE_VAL HUGE_VALL --#define SET_MANTISSA(flt, mant) \ -- do { union ieee854_long_double u; \ -- u.d = (flt); \ -- u.ieee_nan.mantissa0 = 0; \ -- u.ieee_nan.mantissa1 = 0; \ -- u.ieee_nan.mantissa2 = (mant) >> 32; \ -- u.ieee_nan.mantissa3 = (mant); \ -- if ((u.ieee.mantissa0 | u.ieee.mantissa1 \ -- | u.ieee.mantissa2 | u.ieee.mantissa3) != 0) \ -- (flt) = u.d; \ -- } while (0) - - #include <strtod_l.c> -Index: git/sysdeps/ieee754/ldbl-128ibm/strtod_nan_ldouble.h -=================================================================== ---- /dev/null -+++ git/sysdeps/ieee754/ldbl-128ibm/strtod_nan_ldouble.h -@@ -0,0 +1,30 @@ -+/* Convert string for NaN payload to corresponding NaN. For ldbl-128ibm. -+ Copyright (C) 1997-2015 Free Software Foundation, Inc. -+ This file is part of the GNU C Library. -+ -+ The GNU C 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.1 of the License, or (at your option) any later version. -+ -+ The GNU C 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 the GNU C Library; if not, see -+ <http://www.gnu.org/licenses/>. */ -+ -+#define FLOAT long double -+#define SET_MANTISSA(flt, mant) \ -+ do \ -+ { \ -+ union ibm_extended_long_double u; \ -+ u.ld = (flt); \ -+ u.d[0].ieee_nan.mantissa0 = (mant) >> 32; \ -+ u.d[0].ieee_nan.mantissa1 = (mant); \ -+ if ((u.d[0].ieee.mantissa0 | u.d[0].ieee.mantissa1) != 0) \ -+ (flt) = u.ld; \ -+ } \ -+ while (0) -Index: git/sysdeps/ieee754/ldbl-128ibm/strtold_l.c -=================================================================== ---- git.orig/sysdeps/ieee754/ldbl-128ibm/strtold_l.c -+++ git/sysdeps/ieee754/ldbl-128ibm/strtold_l.c -@@ -30,25 +30,19 @@ extern long double ____new_wcstold_l (co - # define STRTOF __new_wcstold_l - # define __STRTOF ____new_wcstold_l - # define ____STRTOF_INTERNAL ____wcstold_l_internal -+# define STRTOF_NAN __wcstold_nan - #else - extern long double ____new_strtold_l (const char *, char **, __locale_t); - # define STRTOF __new_strtold_l - # define __STRTOF ____new_strtold_l - # define ____STRTOF_INTERNAL ____strtold_l_internal -+# define STRTOF_NAN __strtold_nan - #endif - extern __typeof (__STRTOF) STRTOF; - libc_hidden_proto (__STRTOF) - libc_hidden_proto (STRTOF) - #define MPN2FLOAT __mpn_construct_long_double - #define FLOAT_HUGE_VAL HUGE_VALL --# define SET_MANTISSA(flt, mant) \ -- do { union ibm_extended_long_double u; \ -- u.ld = (flt); \ -- u.d[0].ieee_nan.mantissa0 = (mant) >> 32; \ -- u.d[0].ieee_nan.mantissa1 = (mant); \ -- if ((u.d[0].ieee.mantissa0 | u.d[0].ieee.mantissa1) != 0) \ -- (flt) = u.ld; \ -- } while (0) - - #include <strtod_l.c> - -Index: git/sysdeps/ieee754/ldbl-64-128/strtold_l.c -=================================================================== ---- git.orig/sysdeps/ieee754/ldbl-64-128/strtold_l.c -+++ git/sysdeps/ieee754/ldbl-64-128/strtold_l.c -@@ -30,28 +30,19 @@ extern long double ____new_wcstold_l (co - # define STRTOF __new_wcstold_l - # define __STRTOF ____new_wcstold_l - # define ____STRTOF_INTERNAL ____wcstold_l_internal -+# define STRTOF_NAN __wcstold_nan - #else - extern long double ____new_strtold_l (const char *, char **, __locale_t); - # define STRTOF __new_strtold_l - # define __STRTOF ____new_strtold_l - # define ____STRTOF_INTERNAL ____strtold_l_internal -+# define STRTOF_NAN __strtold_nan - #endif - extern __typeof (__STRTOF) STRTOF; - libc_hidden_proto (__STRTOF) - libc_hidden_proto (STRTOF) - #define MPN2FLOAT __mpn_construct_long_double - #define FLOAT_HUGE_VAL HUGE_VALL --#define SET_MANTISSA(flt, mant) \ -- do { union ieee854_long_double u; \ -- u.d = (flt); \ -- u.ieee_nan.mantissa0 = 0; \ -- u.ieee_nan.mantissa1 = 0; \ -- u.ieee_nan.mantissa2 = (mant) >> 32; \ -- u.ieee_nan.mantissa3 = (mant); \ -- if ((u.ieee.mantissa0 | u.ieee.mantissa1 \ -- | u.ieee.mantissa2 | u.ieee.mantissa3) != 0) \ -- (flt) = u.d; \ -- } while (0) - - #include <strtod_l.c> - -Index: git/sysdeps/ieee754/ldbl-96/strtod_nan_ldouble.h -=================================================================== ---- /dev/null -+++ git/sysdeps/ieee754/ldbl-96/strtod_nan_ldouble.h -@@ -0,0 +1,30 @@ -+/* Convert string for NaN payload to corresponding NaN. For ldbl-96. -+ Copyright (C) 1997-2015 Free Software Foundation, Inc. -+ This file is part of the GNU C Library. -+ -+ The GNU C 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.1 of the License, or (at your option) any later version. -+ -+ The GNU C 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 the GNU C Library; if not, see -+ <http://www.gnu.org/licenses/>. */ -+ -+#define FLOAT long double -+#define SET_MANTISSA(flt, mant) \ -+ do \ -+ { \ -+ union ieee854_long_double u; \ -+ u.d = (flt); \ -+ u.ieee_nan.mantissa0 = (mant) >> 32; \ -+ u.ieee_nan.mantissa1 = (mant); \ -+ if ((u.ieee.mantissa0 | u.ieee.mantissa1) != 0) \ -+ (flt) = u.d; \ -+ } \ -+ while (0) -Index: git/sysdeps/ieee754/ldbl-96/strtold_l.c -=================================================================== ---- git.orig/sysdeps/ieee754/ldbl-96/strtold_l.c -+++ git/sysdeps/ieee754/ldbl-96/strtold_l.c -@@ -25,19 +25,13 @@ - #ifdef USE_WIDE_CHAR - # define STRTOF wcstold_l - # define __STRTOF __wcstold_l -+# define STRTOF_NAN __wcstold_nan - #else - # define STRTOF strtold_l - # define __STRTOF __strtold_l -+# define STRTOF_NAN __strtold_nan - #endif - #define MPN2FLOAT __mpn_construct_long_double - #define FLOAT_HUGE_VAL HUGE_VALL --#define SET_MANTISSA(flt, mant) \ -- do { union ieee854_long_double u; \ -- u.d = (flt); \ -- u.ieee_nan.mantissa0 = (mant) >> 32; \ -- u.ieee_nan.mantissa1 = (mant); \ -- if ((u.ieee.mantissa0 | u.ieee.mantissa1) != 0) \ -- (flt) = u.d; \ -- } while (0) - - #include <stdlib/strtod_l.c> -Index: git/wcsmbs/Makefile -=================================================================== ---- git.orig/wcsmbs/Makefile -+++ git/wcsmbs/Makefile -@@ -39,6 +39,7 @@ routines-$(OPTION_POSIX_C_LANG_WIDE_CHAR - wcstol wcstoul wcstoll wcstoull wcstod wcstold wcstof \ - wcstol_l wcstoul_l wcstoll_l wcstoull_l \ - wcstod_l wcstold_l wcstof_l \ -+ wcstod_nan wcstold_nan wcstof_nan \ - wcscoll wcsxfrm \ - wcwidth wcswidth \ - wcscoll_l wcsxfrm_l \ -Index: git/wcsmbs/wcstod_l.c -=================================================================== ---- git.orig/wcsmbs/wcstod_l.c -+++ git/wcsmbs/wcstod_l.c -@@ -23,9 +23,6 @@ - - extern double ____wcstod_l_internal (const wchar_t *, wchar_t **, int, - __locale_t); --extern unsigned long long int ____wcstoull_l_internal (const wchar_t *, -- wchar_t **, int, int, -- __locale_t); - - #define USE_WIDE_CHAR 1 - -Index: git/wcsmbs/wcstod_nan.c -=================================================================== ---- /dev/null -+++ git/wcsmbs/wcstod_nan.c -@@ -0,0 +1,23 @@ -+/* Convert string for NaN payload to corresponding NaN. Wide strings, double. -+ Copyright (C) 2015 Free Software Foundation, Inc. -+ This file is part of the GNU C Library. -+ -+ The GNU C 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.1 of the License, or (at your option) any later version. -+ -+ The GNU C 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 the GNU C Library; if not, see -+ <http://www.gnu.org/licenses/>. */ -+ -+#include "../stdlib/strtod_nan_wide.h" -+#include "../stdlib/strtod_nan_double.h" -+ -+#define STRTOD_NAN __wcstod_nan -+#include "../stdlib/strtod_nan_main.c" -Index: git/wcsmbs/wcstof_l.c -=================================================================== ---- git.orig/wcsmbs/wcstof_l.c -+++ git/wcsmbs/wcstof_l.c -@@ -25,8 +25,5 @@ - - extern float ____wcstof_l_internal (const wchar_t *, wchar_t **, int, - __locale_t); --extern unsigned long long int ____wcstoull_l_internal (const wchar_t *, -- wchar_t **, int, int, -- __locale_t); - - #include <stdlib/strtof_l.c> -Index: git/wcsmbs/wcstof_nan.c -=================================================================== ---- /dev/null -+++ git/wcsmbs/wcstof_nan.c -@@ -0,0 +1,23 @@ -+/* Convert string for NaN payload to corresponding NaN. Wide strings, float. -+ Copyright (C) 2015 Free Software Foundation, Inc. -+ This file is part of the GNU C Library. -+ -+ The GNU C 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.1 of the License, or (at your option) any later version. -+ -+ The GNU C 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 the GNU C Library; if not, see -+ <http://www.gnu.org/licenses/>. */ -+ -+#include "../stdlib/strtod_nan_wide.h" -+#include "../stdlib/strtod_nan_float.h" -+ -+#define STRTOD_NAN __wcstof_nan -+#include "../stdlib/strtod_nan_main.c" -Index: git/wcsmbs/wcstold_l.c -=================================================================== ---- git.orig/wcsmbs/wcstold_l.c -+++ git/wcsmbs/wcstold_l.c -@@ -24,8 +24,5 @@ - - extern long double ____wcstold_l_internal (const wchar_t *, wchar_t **, int, - __locale_t); --extern unsigned long long int ____wcstoull_l_internal (const wchar_t *, -- wchar_t **, int, int, -- __locale_t); - - #include <strtold_l.c> -Index: git/wcsmbs/wcstold_nan.c -=================================================================== ---- /dev/null -+++ git/wcsmbs/wcstold_nan.c -@@ -0,0 +1,30 @@ -+/* Convert string for NaN payload to corresponding NaN. Wide strings, -+ long double. -+ Copyright (C) 2015 Free Software Foundation, Inc. -+ This file is part of the GNU C Library. -+ -+ The GNU C 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.1 of the License, or (at your option) any later version. -+ -+ The GNU C 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 the GNU C Library; if not, see -+ <http://www.gnu.org/licenses/>. */ -+ -+#include <math.h> -+ -+/* This function is unused if long double and double have the same -+ representation. */ -+#ifndef __NO_LONG_DOUBLE_MATH -+# include "../stdlib/strtod_nan_wide.h" -+# include <strtod_nan_ldouble.h> -+ -+# define STRTOD_NAN __wcstold_nan -+# include "../stdlib/strtod_nan_main.c" -+#endif -Index: git/ChangeLog -=================================================================== ---- git.orig/ChangeLog -+++ git/ChangeLog -@@ -1,3 +1,57 @@ -+2015-11-24 Joseph Myers <joseph@codesourcery.com> -+ -+ * stdlib/strtod_nan.c: New file. -+ * stdlib/strtod_nan_double.h: Likewise. -+ * stdlib/strtod_nan_float.h: Likewise. -+ * stdlib/strtod_nan_main.c: Likewise. -+ * stdlib/strtod_nan_narrow.h: Likewise. -+ * stdlib/strtod_nan_wide.h: Likewise. -+ * stdlib/strtof_nan.c: Likewise. -+ * stdlib/strtold_nan.c: Likewise. -+ * sysdeps/ieee754/ldbl-128/strtod_nan_ldouble.h: Likewise. -+ * sysdeps/ieee754/ldbl-128ibm/strtod_nan_ldouble.h: Likewise. -+ * sysdeps/ieee754/ldbl-96/strtod_nan_ldouble.h: Likewise. -+ * wcsmbs/wcstod_nan.c: Likewise. -+ * wcsmbs/wcstof_nan.c: Likewise. -+ * wcsmbs/wcstold_nan.c: Likewise. -+ * stdlib/Makefile (routines): Add strtof_nan, strtod_nan and -+ strtold_nan. -+ * wcsmbs/Makefile (routines): Add wcstod_nan, wcstold_nan and -+ wcstof_nan. -+ * include/stdlib.h (__strtof_nan): Declare and use -+ libc_hidden_proto. -+ (__strtod_nan): Likewise. -+ (__strtold_nan): Likewise. -+ (__wcstof_nan): Likewise. -+ (__wcstod_nan): Likewise. -+ (__wcstold_nan): Likewise. -+ * include/wchar.h (____wcstoull_l_internal): Declare. -+ * stdlib/strtod_l.c: Do not include <ieee754.h>. -+ (____strtoull_l_internal): Remove declaration. -+ (STRTOF_NAN): Define macro. -+ (SET_MANTISSA): Remove macro. -+ (STRTOULL): Likewise. -+ (____STRTOF_INTERNAL): Use STRTOF_NAN to parse NaN payload. -+ * stdlib/strtof_l.c (____strtoull_l_internal): Remove declaration. -+ (STRTOF_NAN): Define macro. -+ (SET_MANTISSA): Remove macro. -+ * sysdeps/ieee754/ldbl-128/strtold_l.c (STRTOF_NAN): Define macro. -+ (SET_MANTISSA): Remove macro. -+ * sysdeps/ieee754/ldbl-128ibm/strtold_l.c (STRTOF_NAN): Define -+ macro. -+ (SET_MANTISSA): Remove macro. -+ * sysdeps/ieee754/ldbl-64-128/strtold_l.c (STRTOF_NAN): Define -+ macro. -+ (SET_MANTISSA): Remove macro. -+ * sysdeps/ieee754/ldbl-96/strtold_l.c (STRTOF_NAN): Define macro. -+ (SET_MANTISSA): Remove macro. -+ * wcsmbs/wcstod_l.c (____wcstoull_l_internal): Remove declaration. -+ * wcsmbs/wcstof_l.c (____wcstoull_l_internal): Likewise. -+ * wcsmbs/wcstold_l.c (____wcstoull_l_internal): Likewise. -+ -+ [BZ #19266] -+ * stdlib/strtod_l.c (____STRTOF_INTERNAL): Check directly for -+ upper case and lower case letters inside NAN(), not using TOLOWER. - 2015-08-08 Paul Pluzhnikov <ppluzhnikov@google.com> - - [BZ #17905] diff --git a/yocto-poky/meta/recipes-core/glibc/glibc/CVE-2015-9761_2.patch b/yocto-poky/meta/recipes-core/glibc/glibc/CVE-2015-9761_2.patch deleted file mode 100644 index e30307fbc..000000000 --- a/yocto-poky/meta/recipes-core/glibc/glibc/CVE-2015-9761_2.patch +++ /dev/null @@ -1,385 +0,0 @@ -From 8f5e8b01a1da2a207228f2072c934fa5918554b8 Mon Sep 17 00:00:00 2001 -From: Joseph Myers <joseph@codesourcery.com> -Date: Fri, 4 Dec 2015 20:36:28 +0000 -Subject: [PATCH] Fix nan functions handling of payload strings (bug 16961, bug - 16962). - -The nan, nanf and nanl functions handle payload strings by doing e.g.: - - if (tagp[0] != '\0') - { - char buf[6 + strlen (tagp)]; - sprintf (buf, "NAN(%s)", tagp); - return strtod (buf, NULL); - } - -This is an unbounded stack allocation based on the length of the -argument. Furthermore, if the argument starts with an n-char-sequence -followed by ')', that n-char-sequence is wrongly treated as -significant for determining the payload of the resulting NaN, when ISO -C says the call should be equivalent to strtod ("NAN", NULL), without -being affected by that initial n-char-sequence. This patch fixes both -those problems by using the __strtod_nan etc. functions recently -factored out of strtod etc. for that purpose, with those functions -being exported from libc at version GLIBC_PRIVATE. - -Tested for x86_64, x86, mips64 and powerpc. - - [BZ #16961] - [BZ #16962] - * math/s_nan.c (__nan): Use __strtod_nan instead of constructing a - string on the stack for strtod. - * math/s_nanf.c (__nanf): Use __strtof_nan instead of constructing - a string on the stack for strtof. - * math/s_nanl.c (__nanl): Use __strtold_nan instead of - constructing a string on the stack for strtold. - * stdlib/Versions (libc): Add __strtof_nan, __strtod_nan and - __strtold_nan to GLIBC_PRIVATE. - * math/test-nan-overflow.c: New file. - * math/test-nan-payload.c: Likewise. - * math/Makefile (tests): Add test-nan-overflow and - test-nan-payload. - -Upstream-Status: Backport -CVE: CVE-2015-9761 patch #2 -[Yocto # 8980] - -https://sourceware.org/git/gitweb.cgi?p=glibc.git;h=8f5e8b01a1da2a207228f2072c934fa5918554b8 - -Signed-off-by: Armin Kuster <akuster@mvista.com> - ---- - ChangeLog | 17 +++++++ - NEWS | 6 +++ - math/Makefile | 3 +- - math/s_nan.c | 9 +--- - math/s_nanf.c | 9 +--- - math/s_nanl.c | 9 +--- - math/test-nan-overflow.c | 66 +++++++++++++++++++++++++ - math/test-nan-payload.c | 122 +++++++++++++++++++++++++++++++++++++++++++++++ - stdlib/Versions | 1 + - 9 files changed, 217 insertions(+), 25 deletions(-) - create mode 100644 math/test-nan-overflow.c - create mode 100644 math/test-nan-payload.c - -Index: git/ChangeLog -=================================================================== ---- git.orig/ChangeLog -+++ git/ChangeLog -@@ -1,3 +1,20 @@ -+2015-12-04 Joseph Myers <joseph@codesourcery.com> -+ -+ [BZ #16961] -+ [BZ #16962] -+ * math/s_nan.c (__nan): Use __strtod_nan instead of constructing a -+ string on the stack for strtod. -+ * math/s_nanf.c (__nanf): Use __strtof_nan instead of constructing -+ a string on the stack for strtof. -+ * math/s_nanl.c (__nanl): Use __strtold_nan instead of -+ constructing a string on the stack for strtold. -+ * stdlib/Versions (libc): Add __strtof_nan, __strtod_nan and -+ __strtold_nan to GLIBC_PRIVATE. -+ * math/test-nan-overflow.c: New file. -+ * math/test-nan-payload.c: Likewise. -+ * math/Makefile (tests): Add test-nan-overflow and -+ test-nan-payload. -+ - 2015-11-24 Joseph Myers <joseph@codesourcery.com> - - * stdlib/strtod_nan.c: New file. -Index: git/NEWS -=================================================================== ---- git.orig/NEWS -+++ git/NEWS -@@ -99,6 +99,12 @@ Version 2.22 - - Version 2.21 - -+Security related changes: -+ -+* The nan, nanf and nanl functions no longer have unbounded stack usage -+ depending on the length of the string passed as an argument to the -+ functions. Reported by Joseph Myers. -+ - * The following bugs are resolved with this release: - - 6652, 10672, 12674, 12847, 12926, 13862, 14132, 14138, 14171, 14498, -Index: git/math/Makefile -=================================================================== ---- git.orig/math/Makefile -+++ git/math/Makefile -@@ -110,6 +110,7 @@ tests = test-matherr test-fenv atest-exp - test-tgmath-ret bug-nextafter bug-nexttoward bug-tgmath1 \ - test-tgmath-int test-tgmath2 test-powl tst-CMPLX tst-CMPLX2 test-snan \ - test-fenv-tls test-fenv-preserve test-fenv-return test-fenvinline \ -+ test-nan-overflow test-nan-payload \ - $(tests-static) - tests-static = test-fpucw-static test-fpucw-ieee-static - # We do the `long double' tests only if this data type is available and -Index: git/math/s_nan.c -=================================================================== ---- git.orig/math/s_nan.c -+++ git/math/s_nan.c -@@ -28,14 +28,7 @@ - double - __nan (const char *tagp) - { -- if (tagp[0] != '\0') -- { -- char buf[6 + strlen (tagp)]; -- sprintf (buf, "NAN(%s)", tagp); -- return strtod (buf, NULL); -- } -- -- return NAN; -+ return __strtod_nan (tagp, NULL, 0); - } - weak_alias (__nan, nan) - #ifdef NO_LONG_DOUBLE -Index: git/math/s_nanf.c -=================================================================== ---- git.orig/math/s_nanf.c -+++ git/math/s_nanf.c -@@ -28,13 +28,6 @@ - float - __nanf (const char *tagp) - { -- if (tagp[0] != '\0') -- { -- char buf[6 + strlen (tagp)]; -- sprintf (buf, "NAN(%s)", tagp); -- return strtof (buf, NULL); -- } -- -- return NAN; -+ return __strtof_nan (tagp, NULL, 0); - } - weak_alias (__nanf, nanf) -Index: git/math/s_nanl.c -=================================================================== ---- git.orig/math/s_nanl.c -+++ git/math/s_nanl.c -@@ -28,13 +28,6 @@ - long double - __nanl (const char *tagp) - { -- if (tagp[0] != '\0') -- { -- char buf[6 + strlen (tagp)]; -- sprintf (buf, "NAN(%s)", tagp); -- return strtold (buf, NULL); -- } -- -- return NAN; -+ return __strtold_nan (tagp, NULL, 0); - } - weak_alias (__nanl, nanl) -Index: git/math/test-nan-overflow.c -=================================================================== ---- /dev/null -+++ git/math/test-nan-overflow.c -@@ -0,0 +1,66 @@ -+/* Test nan functions stack overflow (bug 16962). -+ Copyright (C) 2015 Free Software Foundation, Inc. -+ This file is part of the GNU C Library. -+ -+ The GNU C 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.1 of the License, or (at your option) any later version. -+ -+ The GNU C 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 the GNU C Library; if not, see -+ <http://www.gnu.org/licenses/>. */ -+ -+#include <math.h> -+#include <stdio.h> -+#include <string.h> -+#include <sys/resource.h> -+ -+#define STACK_LIM 1048576 -+#define STRING_SIZE (2 * STACK_LIM) -+ -+static int -+do_test (void) -+{ -+ int result = 0; -+ struct rlimit lim; -+ getrlimit (RLIMIT_STACK, &lim); -+ lim.rlim_cur = STACK_LIM; -+ setrlimit (RLIMIT_STACK, &lim); -+ char *nanstr = malloc (STRING_SIZE); -+ if (nanstr == NULL) -+ { -+ puts ("malloc failed, cannot test"); -+ return 77; -+ } -+ memset (nanstr, '0', STRING_SIZE - 1); -+ nanstr[STRING_SIZE - 1] = 0; -+#define NAN_TEST(TYPE, FUNC) \ -+ do \ -+ { \ -+ char *volatile p = nanstr; \ -+ volatile TYPE v = FUNC (p); \ -+ if (isnan (v)) \ -+ puts ("PASS: " #FUNC); \ -+ else \ -+ { \ -+ puts ("FAIL: " #FUNC); \ -+ result = 1; \ -+ } \ -+ } \ -+ while (0) -+ NAN_TEST (float, nanf); -+ NAN_TEST (double, nan); -+#ifndef NO_LONG_DOUBLE -+ NAN_TEST (long double, nanl); -+#endif -+ return result; -+} -+ -+#define TEST_FUNCTION do_test () -+#include "../test-skeleton.c" -Index: git/math/test-nan-payload.c -=================================================================== ---- /dev/null -+++ git/math/test-nan-payload.c -@@ -0,0 +1,122 @@ -+/* Test nan functions payload handling (bug 16961). -+ Copyright (C) 2015 Free Software Foundation, Inc. -+ This file is part of the GNU C Library. -+ -+ The GNU C 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.1 of the License, or (at your option) any later version. -+ -+ The GNU C 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 the GNU C Library; if not, see -+ <http://www.gnu.org/licenses/>. */ -+ -+#include <float.h> -+#include <math.h> -+#include <stdio.h> -+#include <stdlib.h> -+#include <string.h> -+ -+/* Avoid built-in functions. */ -+#define WRAP_NAN(FUNC, STR) \ -+ ({ const char *volatile wns = (STR); FUNC (wns); }) -+#define WRAP_STRTO(FUNC, STR) \ -+ ({ const char *volatile wss = (STR); FUNC (wss, NULL); }) -+ -+#define CHECK_IS_NAN(TYPE, A) \ -+ do \ -+ { \ -+ if (isnan (A)) \ -+ puts ("PASS: " #TYPE " " #A); \ -+ else \ -+ { \ -+ puts ("FAIL: " #TYPE " " #A); \ -+ result = 1; \ -+ } \ -+ } \ -+ while (0) -+ -+#define CHECK_SAME_NAN(TYPE, A, B) \ -+ do \ -+ { \ -+ if (memcmp (&(A), &(B), sizeof (A)) == 0) \ -+ puts ("PASS: " #TYPE " " #A " = " #B); \ -+ else \ -+ { \ -+ puts ("FAIL: " #TYPE " " #A " = " #B); \ -+ result = 1; \ -+ } \ -+ } \ -+ while (0) -+ -+#define CHECK_DIFF_NAN(TYPE, A, B) \ -+ do \ -+ { \ -+ if (memcmp (&(A), &(B), sizeof (A)) != 0) \ -+ puts ("PASS: " #TYPE " " #A " != " #B); \ -+ else \ -+ { \ -+ puts ("FAIL: " #TYPE " " #A " != " #B); \ -+ result = 1; \ -+ } \ -+ } \ -+ while (0) -+ -+/* Cannot test payloads by memcmp for formats where NaNs have padding -+ bits. */ -+#define CAN_TEST_EQ(MANT_DIG) ((MANT_DIG) != 64 && (MANT_DIG) != 106) -+ -+#define RUN_TESTS(TYPE, SFUNC, FUNC, MANT_DIG) \ -+ do \ -+ { \ -+ TYPE n123 = WRAP_NAN (FUNC, "123"); \ -+ CHECK_IS_NAN (TYPE, n123); \ -+ TYPE s123 = WRAP_STRTO (SFUNC, "NAN(123)"); \ -+ CHECK_IS_NAN (TYPE, s123); \ -+ TYPE n456 = WRAP_NAN (FUNC, "456"); \ -+ CHECK_IS_NAN (TYPE, n456); \ -+ TYPE s456 = WRAP_STRTO (SFUNC, "NAN(456)"); \ -+ CHECK_IS_NAN (TYPE, s456); \ -+ TYPE n123x = WRAP_NAN (FUNC, "123)"); \ -+ CHECK_IS_NAN (TYPE, n123x); \ -+ TYPE nemp = WRAP_NAN (FUNC, ""); \ -+ CHECK_IS_NAN (TYPE, nemp); \ -+ TYPE semp = WRAP_STRTO (SFUNC, "NAN()"); \ -+ CHECK_IS_NAN (TYPE, semp); \ -+ TYPE sx = WRAP_STRTO (SFUNC, "NAN"); \ -+ CHECK_IS_NAN (TYPE, sx); \ -+ if (CAN_TEST_EQ (MANT_DIG)) \ -+ CHECK_SAME_NAN (TYPE, n123, s123); \ -+ if (CAN_TEST_EQ (MANT_DIG)) \ -+ CHECK_SAME_NAN (TYPE, n456, s456); \ -+ if (CAN_TEST_EQ (MANT_DIG)) \ -+ CHECK_SAME_NAN (TYPE, nemp, semp); \ -+ if (CAN_TEST_EQ (MANT_DIG)) \ -+ CHECK_SAME_NAN (TYPE, n123x, sx); \ -+ CHECK_DIFF_NAN (TYPE, n123, n456); \ -+ CHECK_DIFF_NAN (TYPE, n123, nemp); \ -+ CHECK_DIFF_NAN (TYPE, n123, n123x); \ -+ CHECK_DIFF_NAN (TYPE, n456, nemp); \ -+ CHECK_DIFF_NAN (TYPE, n456, n123x); \ -+ } \ -+ while (0) -+ -+static int -+do_test (void) -+{ -+ int result = 0; -+ RUN_TESTS (float, strtof, nanf, FLT_MANT_DIG); -+ RUN_TESTS (double, strtod, nan, DBL_MANT_DIG); -+#ifndef NO_LONG_DOUBLE -+ RUN_TESTS (long double, strtold, nanl, LDBL_MANT_DIG); -+#endif -+ return result; -+} -+ -+#define TEST_FUNCTION do_test () -+#include "../test-skeleton.c" -Index: git/stdlib/Versions -=================================================================== ---- git.orig/stdlib/Versions -+++ git/stdlib/Versions -@@ -118,5 +118,6 @@ libc { - # Used from other libraries - __libc_secure_getenv; - __call_tls_dtors; -+ __strtof_nan; __strtod_nan; __strtold_nan; - } - } diff --git a/yocto-poky/meta/recipes-core/glibc/glibc/strcoll-Remove-incorrect-STRDIFF-based-optimization-.patch b/yocto-poky/meta/recipes-core/glibc/glibc/strcoll-Remove-incorrect-STRDIFF-based-optimization-.patch deleted file mode 100644 index 8ce255f11..000000000 --- a/yocto-poky/meta/recipes-core/glibc/glibc/strcoll-Remove-incorrect-STRDIFF-based-optimization-.patch +++ /dev/null @@ -1,323 +0,0 @@ -Upstream-Status: Backport - -Signed-off-by: Li Xin <lixin.fnst@cn.fujitsu.com> - -From https://sourceware.org/git/gitweb.cgi?p=glibc.git;h=6c84109cfa26f35c3dfed3acb97d347361bd5849 -Author: Carlos O'Donell <carlos@systemhalted.org> -Date: Thu Oct 8 16:34:53 2015 -0400 - - strcoll: Remove incorrect STRDIFF-based optimization (Bug 18589). - - The optimization introduced in commit - f13c2a8dff2329c6692a80176262ceaaf8a6f74e, causes regressions in - sorting for languages that have digraphs that change sort order, like - cs_CZ which sorts ch between h and i. - - My analysis shows the fast-forwarding optimization in STRCOLL advances - through a digraph while possibly stopping in the middle which results - in a subsequent skipping of the digraph and incorrect sorting. The - optimization is incorrect as implemented and because of that I'm - removing it for 2.23, and I will also commit this fix for 2.22 where - it was originally introduced. - - This patch reverts the optimization, introduces a new bug-strcoll2.c - regression test that tests both cs_CZ.UTF-8 and da_DK.ISO-8859-1 and - ensures they sort one digraph each correctly. The optimization can't be - applied without regressing this test. - - Checked on x86_64, bug-strcoll2.c fails without this patch and passes - after. This will also get a fix on 2.22 which has the same bug. - - (cherry picked from commit 87701a58e291bd7ac3b407d10a829dac52c9c16e) ---- - locale/C-collate.c | 4 +- - locale/categories.def | 1 - - locale/langinfo.h | 1 - - locale/localeinfo.h | 7 ---- - locale/programs/ld-collate.c | 9 ----- - string/bug-strcoll2.c | 95 ++++++++++++++++++++++++++++++++++++++++++++ - string/strcoll_l.c | 39 +----------------- - wcsmbs/wcscoll_l.c | 1 - - 8 files changed, 98 insertions(+), 59 deletions(-) - create mode 100644 string/bug-strcoll2.c - -diff --git a/locale/C-collate.c b/locale/C-collate.c -index d7f3c55..06dfdfa 100644 ---- a/locale/C-collate.c -+++ b/locale/C-collate.c -@@ -144,8 +144,6 @@ const struct __locale_data _nl_C_LC_COLLATE attribute_hidden = - /* _NL_COLLATE_COLLSEQWC */ - { .string = (const char *) collseqwc }, - /* _NL_COLLATE_CODESET */ -- { .string = _nl_C_codeset }, -- /* _NL_COLLATE_ENCODING_TYPE */ -- { .word = __cet_8bit } -+ { .string = _nl_C_codeset } - } - }; -diff --git a/locale/categories.def b/locale/categories.def -index 045489d..a8dda53 100644 ---- a/locale/categories.def -+++ b/locale/categories.def -@@ -58,7 +58,6 @@ DEFINE_CATEGORY - DEFINE_ELEMENT (_NL_COLLATE_COLLSEQMB, "collate-collseqmb", std, wstring) - DEFINE_ELEMENT (_NL_COLLATE_COLLSEQWC, "collate-collseqwc", std, wstring) - DEFINE_ELEMENT (_NL_COLLATE_CODESET, "collate-codeset", std, string) -- DEFINE_ELEMENT (_NL_COLLATE_ENCODING_TYPE, "collate-encoding-type", std, word) - ), NO_POSTLOAD) - - -diff --git a/locale/langinfo.h b/locale/langinfo.h -index ffc5c7f..a565d9d 100644 ---- a/locale/langinfo.h -+++ b/locale/langinfo.h -@@ -255,7 +255,6 @@ enum - _NL_COLLATE_COLLSEQMB, - _NL_COLLATE_COLLSEQWC, - _NL_COLLATE_CODESET, -- _NL_COLLATE_ENCODING_TYPE, - _NL_NUM_LC_COLLATE, - - /* LC_CTYPE category: character classification. -diff --git a/locale/localeinfo.h b/locale/localeinfo.h -index a7516c0..c076d8e 100644 ---- a/locale/localeinfo.h -+++ b/locale/localeinfo.h -@@ -110,13 +110,6 @@ enum coll_sort_rule - sort_mask - }; - --/* Collation encoding type. */ --enum collation_encoding_type --{ -- __cet_other, -- __cet_8bit, -- __cet_utf8 --}; - - /* We can map the types of the entries into a few categories. */ - enum value_type -diff --git a/locale/programs/ld-collate.c b/locale/programs/ld-collate.c -index 16e9039..3c88c6d 100644 ---- a/locale/programs/ld-collate.c -+++ b/locale/programs/ld-collate.c -@@ -32,7 +32,6 @@ - #include "linereader.h" - #include "locfile.h" - #include "elem-hash.h" --#include "../localeinfo.h" - - /* Uncomment the following line in the production version. */ - /* #define NDEBUG 1 */ -@@ -2130,8 +2129,6 @@ collate_output (struct localedef_t *locale, const struct charmap_t *charmap, - /* The words have to be handled specially. */ - if (idx == _NL_ITEM_INDEX (_NL_COLLATE_SYMB_HASH_SIZEMB)) - add_locale_uint32 (&file, 0); -- else if (idx == _NL_ITEM_INDEX (_NL_COLLATE_ENCODING_TYPE)) -- add_locale_uint32 (&file, __cet_other); - else - add_locale_empty (&file); - } -@@ -2495,12 +2492,6 @@ collate_output (struct localedef_t *locale, const struct charmap_t *charmap, - add_locale_raw_data (&file, collate->mbseqorder, 256); - add_locale_collseq_table (&file, &collate->wcseqorder); - add_locale_string (&file, charmap->code_set_name); -- if (strcmp (charmap->code_set_name, "UTF-8") == 0) -- add_locale_uint32 (&file, __cet_utf8); -- else if (charmap->mb_cur_max == 1) -- add_locale_uint32 (&file, __cet_8bit); -- else -- add_locale_uint32 (&file, __cet_other); - write_locale_data (output_path, LC_COLLATE, "LC_COLLATE", &file); - - obstack_free (&weightpool, NULL); -diff --git a/string/bug-strcoll2.c b/string/bug-strcoll2.c -new file mode 100644 -index 0000000..950b090 ---- /dev/null -+++ b/string/bug-strcoll2.c -@@ -0,0 +1,95 @@ -+/* Bug 18589: sort-test.sh fails at random. -+ * Copyright (C) 1998-2015 Free Software Foundation, Inc. -+ * This file is part of the GNU C Library. -+ * Contributed by Ulrich Drepper <drepper@cygnus.com>, 1998. -+ * -+ * The GNU C 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.1 of the License, or (at your option) any later version. -+ * -+ * The GNU C 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 the GNU C Library; if not, see -+ * <http://www.gnu.org/licenses/>. */ -+ -+#include <stdio.h> -+#include <string.h> -+#include <locale.h> -+ -+/* An incorrect strcoll optimization resulted in incorrect -+ * results from strcoll for cs_CZ and da_DK. */ -+ -+int -+test_cs_CZ (void) -+{ -+ const char t1[] = "config"; -+ const char t2[] = "choose"; -+ if (setlocale (LC_ALL, "cs_CZ.UTF-8") == NULL) -+ { -+ perror ("setlocale"); -+ return 1; -+ } -+ /* In Czech the digraph ch sorts after c, therefore we expect -+ * config to sort before choose. */ -+ int a = strcoll (t1, t2); -+ int b = strcoll (t2, t1); -+ printf ("strcoll (\"%s\", \"%s\") = %d\n", t1, t2, a); -+ printf ("strcoll (\"%s\", \"%s\") = %d\n", t2, t1, b); -+ if (a < 0 && b > 0) -+ { -+ puts ("PASS: config < choose"); -+ return 0; -+ } -+ else -+ { -+ puts ("FAIL: Wrong sorting in cz_CZ.UTF-8."); -+ return 1; -+ } -+} -+ -+int -+test_da_DK (void) -+{ -+ const char t1[] = "AS"; -+ const char t2[] = "AA"; -+ if (setlocale (LC_ALL, "da_DK.ISO-8859-1") == NULL) -+ { -+ perror ("setlocale"); -+ return 1; -+ } -+ /* AA should be treated as the last letter of the Danish alphabet, -+ * hence sorting after AS. */ -+ int a = strcoll (t1, t2); -+ int b = strcoll (t2, t1); -+ printf ("strcoll (\"%s\", \"%s\") = %d\n", t1, t2, a); -+ printf ("strcoll (\"%s\", \"%s\") = %d\n", t2, t1, b); -+ if (a < 0 && b > 0) -+ { -+ puts ("PASS: AS < AA"); -+ return 0; -+ } -+ else -+ { -+ puts ("FAIL: Wrong sorting in da_DK.ISO-8859-1"); -+ return 1; -+ } -+} -+ -+static int -+do_test (void) -+{ -+ int err = 0; -+ err |= test_cs_CZ (); -+ err |= test_da_DK (); -+ return err; -+} -+ -+#define TEST_FUNCTION do_test () -+#include "../test-skeleton.c" -+ -+ -diff --git a/string/strcoll_l.c b/string/strcoll_l.c -index b36b18c..a18b65e 100644 ---- a/string/strcoll_l.c -+++ b/string/strcoll_l.c -@@ -30,7 +30,6 @@ - # define STRING_TYPE char - # define USTRING_TYPE unsigned char - # define STRCOLL __strcoll_l --# define STRDIFF __strdiff - # define STRCMP strcmp - # define WEIGHT_H "../locale/weight.h" - # define SUFFIX MB -@@ -43,19 +42,6 @@ - #include "../locale/localeinfo.h" - #include WEIGHT_H - --#define MASK_UTF8_7BIT (1 << 7) --#define MASK_UTF8_START (3 << 6) -- --size_t --STRDIFF (const STRING_TYPE *s, const STRING_TYPE *t) --{ -- size_t n; -- -- for (n = 0; *s != '\0' && *s++ == *t++; ++n) -- continue; -- -- return n; --} - - /* Track status while looking for sequences in a string. */ - typedef struct -@@ -274,29 +260,9 @@ STRCOLL (const STRING_TYPE *s1, const STRING_TYPE *s2, __locale_t l) - const USTRING_TYPE *extra; - const int32_t *indirect; - -- /* In case there is no locale specific sort order (C / POSIX). */ - if (nrules == 0) - return STRCMP (s1, s2); - -- /* Fast forward to the position of the first difference. Needs to be -- encoding aware as the byte-by-byte comparison can stop in the middle -- of a char sequence for multibyte encodings like UTF-8. */ -- uint_fast32_t encoding = -- current->values[_NL_ITEM_INDEX (_NL_COLLATE_ENCODING_TYPE)].word; -- if (encoding != __cet_other) -- { -- size_t diff = STRDIFF (s1, s2); -- if (diff > 0) -- { -- if (encoding == __cet_utf8 && (*(s1 + diff) & MASK_UTF8_7BIT) != 0) -- do -- diff--; -- while (diff > 0 && (*(s1 + diff) & MASK_UTF8_START) != MASK_UTF8_START); -- s1 += diff; -- s2 += diff; -- } -- } -- - /* Catch empty strings. */ - if (__glibc_unlikely (*s1 == '\0') || __glibc_unlikely (*s2 == '\0')) - return (*s1 != '\0') - (*s2 != '\0'); -@@ -363,9 +329,8 @@ STRCOLL (const STRING_TYPE *s1, const STRING_TYPE *s2, __locale_t l) - byte-level comparison to ensure that we don't waste time - going through multiple passes for totally equal strings - before proceeding to subsequent passes. */ -- if (pass == 0 && encoding == __cet_other && -- STRCMP (s1, s2) == 0) -- return result; -+ if (pass == 0 && STRCMP (s1, s2) == 0) -+ return result; - else - break; - } -diff --git a/wcsmbs/wcscoll_l.c b/wcsmbs/wcscoll_l.c -index 6d9384a..87f240d 100644 ---- a/wcsmbs/wcscoll_l.c -+++ b/wcsmbs/wcscoll_l.c -@@ -23,7 +23,6 @@ - #define STRING_TYPE wchar_t - #define USTRING_TYPE wint_t - #define STRCOLL __wcscoll_l --#define STRDIFF __wcsdiff - #define STRCMP __wcscmp - #define WEIGHT_H "../locale/weightwc.h" - #define SUFFIX WC --- -1.8.4.2 - diff --git a/yocto-poky/meta/recipes-core/glibc/glibc/use_64bit_atomics.patch b/yocto-poky/meta/recipes-core/glibc/glibc/use_64bit_atomics.patch deleted file mode 100644 index eb7f2b29b..000000000 --- a/yocto-poky/meta/recipes-core/glibc/glibc/use_64bit_atomics.patch +++ /dev/null @@ -1,24 +0,0 @@ -This patch alows using 64 bit atomic instructions on a -32 bit platform. This is safe, providing x86 is Pentium or -later (would not work on i386, i486). Using 64 bit atomic -instructions bypasses code containing a bug as documented in -https://bugzilla.yoctoproject.org/show_bug.cgi?id=8140 - -Upstream-Status: TBD - -Signed-off-by: Juro Bystricky <juro.bystricky@intel.com> - - -Index: libc/sysdeps/i386/i486/bits/atomic.h -=================================================================== ---- libc.orig/sysdeps/i386/i486/bits/atomic.h -+++ libc/sysdeps/i386/i486/bits/atomic.h -@@ -54,7 +54,7 @@ typedef uintmax_t uatomic_max_t; - # endif - #endif - --#define __HAVE_64B_ATOMICS 0 -+#define __HAVE_64B_ATOMICS 1 - #define USE_ATOMIC_COMPILER_BUILTINS 0 - - diff --git a/yocto-poky/meta/recipes-core/glibc/glibc_2.22.bb b/yocto-poky/meta/recipes-core/glibc/glibc_2.23.bb index a13b7f94b..18f40660e 100644 --- a/yocto-poky/meta/recipes-core/glibc/glibc_2.22.bb +++ b/yocto-poky/meta/recipes-core/glibc/glibc_2.23.bb @@ -5,16 +5,16 @@ LIC_FILES_CHKSUM = "file://LICENSES;md5=e9a558e243b36d3209f380deb394b213 \ file://posix/rxspencer/COPYRIGHT;md5=dc5485bb394a13b2332ec1c785f5d83a \ file://COPYING.LIB;md5=4fbd65380cdd255951079008b364516c" -DEPENDS += "gperf-native kconfig-frontends-native" +DEPENDS += "gperf-native" -SRCREV ?= "a34d1c6afc86521d6ad17662a3b5362d8481514c" +SRCREV ?= "e742928c1592b43db6809db4f39e67be151cdd27" SRCBRANCH ?= "release/${PV}/master" GLIBC_GIT_URI ?= "git://sourceware.org/git/glibc.git" +UPSTREAM_CHECK_GITTAGREGEX = "(?P<pver>\d+\.\d+(\.\d+)*)" SRC_URI = "${GLIBC_GIT_URI};branch=${SRCBRANCH};name=glibc \ - file://0004-Backport-https-sourceware.org-ml-libc-ports-2007-12-.patch \ file://0005-fsl-e500-e5500-e6500-603e-fsqrt-implementation.patch \ file://0006-readlib-Add-OECORE_KNOWN_INTERPRETER_NAMES-to-known-.patch \ file://0007-ppc-sqrt-Fix-undefined-reference-to-__sqrt_finite.patch \ @@ -25,28 +25,17 @@ SRC_URI = "${GLIBC_GIT_URI};branch=${SRCBRANCH};name=glibc \ file://0012-Make-ld-version-output-matching-grok-gold-s-output.patch \ file://0013-sysdeps-gnu-configure.ac-handle-correctly-libc_cv_ro.patch \ file://0014-Add-unused-attribute.patch \ - file://0015-When-disabling-SSE-also-make-sure-that-fpmath-is-not.patch \ - file://0016-yes-within-the-path-sets-wrong-config-variables.patch \ - file://0017-timezone-re-written-tzselect-as-posix-sh.patch \ + file://0015-yes-within-the-path-sets-wrong-config-variables.patch \ + file://0016-timezone-re-written-tzselect-as-posix-sh.patch \ + file://0017-Remove-bash-dependency-for-nscd-init-script.patch \ file://0018-eglibc-Cross-building-and-testing-instructions.patch \ - file://0019-eglibc-Bring-Eglibc-option-group-infrastructure-to-g.patch \ - file://0020-eglibc-Help-bootstrap-cross-toolchain.patch \ - file://0021-eglibc-cherry-picked-from-http-www.eglibc.org-archiv.patch \ - file://0022-eglibc-Clear-cache-lines-on-ppc8xx.patch \ - file://0023-eglibc-Resolve-__fpscr_values-on-SH4.patch \ - file://0024-eglibc-Forward-port-eglibc-options-groups-support.patch \ - file://0025-eglibc-Install-PIC-archives.patch \ - file://0026-eglibc-dl_debug_mask-is-controlled-by-__OPTION_EGLIB.patch \ - file://0027-eglibc-use-option-groups-Conditionally-exclude-c-tes.patch \ - file://nscd-no-bash.patch \ - file://strcoll-Remove-incorrect-STRDIFF-based-optimization-.patch \ - file://0028-Clear-ELF_RTYPE_CLASS_EXTERN_PROTECTED_DATA-for-prel.patch \ - file://CVE-2015-8777.patch \ - file://CVE-2015-8779.patch \ - file://CVE-2015-9761_1.patch \ - file://CVE-2015-9761_2.patch \ - file://CVE-2015-8776.patch \ - file://CVE-2015-7547.patch \ + file://0019-eglibc-Help-bootstrap-cross-toolchain.patch \ + file://0020-eglibc-cherry-picked-from.patch \ + file://0021-eglibc-Clear-cache-lines-on-ppc8xx.patch \ + file://0022-eglibc-Resolve-__fpscr_values-on-SH4.patch \ + file://0023-eglibc-Install-PIC-archives.patch \ + file://0025-eglibc-Forward-port-cross-locale-generation-support.patch \ + file://0026-When-disabling-SSE-make-sure-fpmath-is-not-set-to-us.patch \ " SRC_URI += "\ @@ -58,7 +47,7 @@ SRC_URI_append_class-nativesdk = "\ file://0001-nativesdk-glibc-Look-for-host-system-ld.so.cache-as-.patch \ file://0002-nativesdk-glibc-Fix-buffer-overrun-with-a-relocated-.patch \ file://0003-nativesdk-glibc-Raise-the-size-of-arrays-containing-.patch \ - file://use_64bit_atomics.patch \ + file://0004-nativesdk-glibc-Allow-64-bit-atomics-for-x86.patch \ " S = "${WORKDIR}/git" @@ -87,7 +76,6 @@ EXTRA_OECONF = "--enable-kernel=${OLDEST_KERNEL} \ --with-headers=${STAGING_INCDIR} \ --without-selinux \ --enable-obsolete-rpc \ - --with-kconfig=${STAGING_BINDIR_NATIVE} \ ${GLIBC_EXTRA_OECONF}" EXTRA_OECONF += "${@get_libc_fpu_setting(bb, d)}" diff --git a/yocto-poky/meta/recipes-core/glibc/ldconfig-native-2.12.1/add-64-bit-flag-for-ELF64-entries.patch b/yocto-poky/meta/recipes-core/glibc/ldconfig-native-2.12.1/add-64-bit-flag-for-ELF64-entries.patch index a9af11062..f4e38d425 100644 --- a/yocto-poky/meta/recipes-core/glibc/ldconfig-native-2.12.1/add-64-bit-flag-for-ELF64-entries.patch +++ b/yocto-poky/meta/recipes-core/glibc/ldconfig-native-2.12.1/add-64-bit-flag-for-ELF64-entries.patch @@ -64,7 +64,7 @@ index 0bf0de3..6e87afc 100644 #undef check_ptr #define check_ptr(ptr) \ do \ -@@ -290,6 +295,35 @@ process_elf_file64 (const char *file_name, const char *lib, int *flag, +@@ -290,6 +295,48 @@ process_elf_file64 (const char *file_name, const char *lib, int *flag, libc5/libc6. */ *flag = FLAG_ELF; @@ -73,23 +73,36 @@ index 0bf0de3..6e87afc 100644 + switch (elf_header->e_machine) + { + case EM_IA_64: -+ *flag |= FLAG_IA64_LIB64; ++ /* Intel 64bit libraries are always libc.so.6+. */ ++ /* see sysdeps/unix/sysv/linux/ia64/readelflib.c */ ++ *flag |= FLAG_IA64_LIB64|FLAG_ELF_LIBC6; + break; + case EM_X86_64: -+ *flag |= FLAG_X8664_LIB64; ++ /* X86-64 64bit libraries are always libc.so.6+. */ ++ /* see sysdeps/unix/sysv/linux/i386/readelflib.c */ ++ *flag |= FLAG_X8664_LIB64|FLAG_ELF_LIBC6; + break; + case EM_S390: -+ *flag |= FLAG_S390_LIB64; ++ /* S/390 64bit libraries are always libc.so.6+. */ ++ /* see sysdeps/unix/sysv/linux/s390/readelflib.c */ ++ *flag |= FLAG_S390_LIB64|FLAG_ELF_LIBC6; + break; + case EM_PPC64: -+ *flag |= FLAG_POWERPC_LIB64; ++ /* PowerPC 64bit libraries are always libc.so.6+. */ ++ /* see sysdeps/unix/sysv/linux/powerpc/readelflib.c */ ++ *flag |= FLAG_POWERPC_LIB64|FLAG_ELF_LIBC6; + break; + case EM_MIPS: + case EM_MIPS_RS3_LE: -+ *flag |= FLAG_MIPS64_LIBN64; ++ /* n64 libraries are always libc.so.6+. */ ++ /* NOTE: This does not correctly distinguish NAN2008 binaries and is possibly broken */ ++ /* see sysdeps/unix/sysv/linux/mips/readelflib.c */ ++ *flag |= FLAG_MIPS64_LIBN64|FLAG_ELF_LIBC6; + break; + case EM_AARCH64: -+ *flag |= FLAG_AARCH64_LIB64; ++ /* AArch64 libraries are always libc.so.6+. */ ++ /* see sysdeps/unix/sysv/linux/arm/readelflib.c */ ++ *flag |= FLAG_AARCH64_LIB64|FLAG_ELF_LIBC6; + break; + default: + error(0, 0, "%s is a 64-bit ELF for unknown machine %lx\n", diff --git a/yocto-poky/meta/recipes-core/ifupdown/ifupdown_0.7.48.1.bb b/yocto-poky/meta/recipes-core/ifupdown/ifupdown_0.8.2.bb index 24eb87baf..732b295b8 100644 --- a/yocto-poky/meta/recipes-core/ifupdown/ifupdown_0.7.48.1.bb +++ b/yocto-poky/meta/recipes-core/ifupdown/ifupdown_0.8.2.bb @@ -6,16 +6,16 @@ the file /etc/network/interfaces." LICENSE = "GPLv2" LIC_FILES_CHKSUM = "file://COPYING;md5=94d55d512a9ba36caa9b7df079bae19f" -SRC_URI = "http://archive.ubuntu.com/ubuntu/pool/main/i/ifupdown/ifupdown_0.7.48.1ubuntu5.tar.gz \ +SRC_URI = "git://anonscm.debian.org/git/collab-maint/ifupdown.git;protocol=https \ file://defn2-c-man-don-t-rely-on-dpkg-architecture-to-set-a.patch \ file://inet-6-.defn-fix-inverted-checks-for-loopback.patch \ file://99_network \ " +SRCREV = "05ea2fd4f49bb1201aeef2a42efbcff8f336112f" EXTRA_OEMAKE = "" -# needed so we don't get default S="${WORKDIR}/ifupdown-${PV}" -S = "${WORKDIR}/ifupdown-${PV}ubuntu5" +S = "${WORKDIR}/git" inherit update-rc.d update-alternatives @@ -49,6 +49,3 @@ ALTERNATIVE_LINK_NAME[ifdown] = "${base_sbindir}/ifdown" INITSCRIPT_NAME = "ifup" INITSCRIPT_PARAMS = "start 39 S . stop 39 0 6 1 ." - -SRC_URI[md5sum] = "85ba375f3c6f26d34efb2a8575e77fc8" -SRC_URI[sha256sum] = "08dce14692c07b72b583b86c4d3ace0d9dac1928925144cc3ddde15b694ebbdf" diff --git a/yocto-poky/meta/recipes-core/images/build-appliance-image/README_VirtualBox_Guest_Additions.txt b/yocto-poky/meta/recipes-core/images/build-appliance-image/README_VirtualBox_Guest_Additions.txt new file mode 100644 index 000000000..e7298f2c3 --- /dev/null +++ b/yocto-poky/meta/recipes-core/images/build-appliance-image/README_VirtualBox_Guest_Additions.txt @@ -0,0 +1,75 @@ + +Installing VirtualBox Guest Additions +===================================== + +In order to use VirtualBox guest additions, they have to be build +first. They may have to be rebuilt each time the time you upgrade to +a new version of VirtualBox. + +Make sure VM is configured with an Optical Drive. + +Please follow these steps to install the VirtualBox Guest Additions on the +Build Appliance VM: + +1. Boot VM, select root "Terminal" instead of the default "Terminal <2>" + +2. Insert Guest additions CD into VM optical drive: + VM menu "Devices"->"Optical Drives"-> Select "VBoxGuestAdditions<version>.iso" + +3. Find your CDROM device. Typically it is /dev/hda for IDE. You can determine + the actual name <cdromedev> by viewing the cdrom info: + + # cat /proc/sys/dev/cdrom/info + + Mount the cdrom drive: + # mount -t iso9660 <cdromdev> /media/cdrom + i.e.: + # mount -t iso9660 /dev/hda /media/cdrom + +4. Build the additions: + + First, we need to build of some prerequisite utilities. + (This is only needed to be done once) + + # cd /lib/modules/<kernel-version>-yocto-standard/build + # make scripts + + Now build the guest additions: + + # /media/cdrom/VBoxLinuxAdditions.run --nox11 + + At this point, providing there were no build errors, the guest additions are + built and installed. + +5. Check if vbox additions running: + + # /etc/init.d/vboxadd status + + If not running, try manually starting: + + # /etc/init.d/vboxadd start + +6. Check if additons actually work, in particular folder sharing. + + Host: Devices->Shared Folders->Shared Folder Settings... + Add any host folder and name it (i.e. "images") + + Guest VM: create mount point for the shared folder, i.e.: + + # mkdir ~/my-host + + Mount the shared folder: (Watch out for spelling: it's vboxsf NOT vboxfs) + + # mount -t vboxsf images ~/my-host + + Verify mount, should see the contents of the shared folder: + + # ls ~/my-host + + + + + + + + diff --git a/yocto-poky/meta/recipes-core/images/build-appliance-image_12.0.1.bb b/yocto-poky/meta/recipes-core/images/build-appliance-image_14.0.0.bb index fdeadb63a..bdcb9212d 100644 --- a/yocto-poky/meta/recipes-core/images/build-appliance-image_12.0.1.bb +++ b/yocto-poky/meta/recipes-core/images/build-appliance-image_14.0.0.bb @@ -6,7 +6,7 @@ LICENSE = "MIT" LIC_FILES_CHKSUM = "file://${COREBASE}/LICENSE;md5=4d92cd373abda3937c2bc47fbc49d690 \ file://${COREBASE}/meta/COPYING.MIT;md5=3da9cfbcb788c80a0384361b4de20420" -IMAGE_INSTALL = "packagegroup-core-boot packagegroup-core-ssh-openssh packagegroup-self-hosted" +IMAGE_INSTALL = "packagegroup-core-boot packagegroup-core-ssh-openssh packagegroup-self-hosted kernel-dev kernel-devsrc " IMAGE_FEATURES += "x11-base package-management splash" @@ -19,13 +19,15 @@ APPEND += "rootfstype=ext4 quiet" DEPENDS = "zip-native" IMAGE_FSTYPES = "vmdk" -inherit core-image +inherit core-image module-base -SRCREV ?= "7fe17a2942ff03e2ec47d566fd5393f52b2eb736" -SRC_URI = "git://git.yoctoproject.org/poky;branch=jethro \ +SRCREV ?= "5f84d6545e6d7a2be8e603a1f4b1afae0dad0a9b" +SRC_URI = "git://git.yoctoproject.org/poky;branch=krogoth \ file://Yocto_Build_Appliance.vmx \ file://Yocto_Build_Appliance.vmxf \ + file://README_VirtualBox_Guest_Additions.txt \ " +BA_INCLUDE_SOURCES ??= "0" IMAGE_CMD_ext4_append () { # We don't need to reserve much space for root, 0.5% is more than enough @@ -38,14 +40,21 @@ fakeroot do_populate_poky_src () { rm -rf ${WORKDIR}/git/.git rm -f ${WORKDIR}/git/.gitignore - cp -Rp ${WORKDIR}/git ${IMAGE_ROOTFS}/home/builder/poky + cp -R ${WORKDIR}/git ${IMAGE_ROOTFS}/home/builder/poky mkdir -p ${IMAGE_ROOTFS}/home/builder/poky/build/conf mkdir -p ${IMAGE_ROOTFS}/home/builder/poky/build/downloads - cp -RpL ${DL_DIR}/* ${IMAGE_ROOTFS}/home/builder/poky/build/downloads/ + if [ ${BA_INCLUDE_SOURCES} != 0 ]; then + cp -RpL ${DL_DIR}/* ${IMAGE_ROOTFS}/home/builder/poky/build/downloads/ + # Remove the git2_* tarballs -- this is ok since we still have the git2/. + rm -rf ${IMAGE_ROOTFS}/home/builder/poky/build/downloads/git2_* + fi - # Remove the git2_* tarballs -- this is ok since we still have the git2/. - rm -rf ${IMAGE_ROOTFS}/home/builder/poky/build/downloads/git2_* + # Place the README_VirtualBox_Guest_Additions file in builders home folder. + cp ${WORKDIR}/README_VirtualBox_Guest_Additions.txt ${IMAGE_ROOTFS}/home/builder/ + + # Create a symlink, needed for out-of-tree kernel modules build + ln -snr ${IMAGE_ROOTFS}/usr/src/kernel ${IMAGE_ROOTFS}/lib/modules/${KERNEL_VERSION}/build echo "/usr/bin" > ${IMAGE_ROOTFS}/home/builder/poky/build/pseudodone echo "INHERIT += \"rm_work\"" >> ${IMAGE_ROOTFS}/home/builder/poky/build/conf/auto.conf @@ -54,13 +63,30 @@ fakeroot do_populate_poky_src () { echo "export PSEUDO_LOCALSTATEDIR=/home/builder/pseudo" >> ${IMAGE_ROOTFS}/home/builder/.bashrc echo "export PSEUDO_LIBDIR=/usr/lib/pseudo/lib64" >> ${IMAGE_ROOTFS}/home/builder/.bashrc + # Also save (for reference only) the actual SRCREV used to create this image + echo "export BA_SRCREV=${SRCREV}" >> ${IMAGE_ROOTFS}/home/builder/.bashrc + echo "" >> ${IMAGE_ROOTFS}/home/builder/.bashrc + echo "# If working behind a proxy and using the provided oe-git-proxy script" >> ${IMAGE_ROOTFS}/home/builder/.bashrc + echo "# you need to set ALL_PROXY based on your proxy settings." >> ${IMAGE_ROOTFS}/home/builder/.bashrc + echo "# Example ALL_PROXY values:" >> ${IMAGE_ROOTFS}/home/builder/.bashrc + echo "# export ALL_PROXY=https://proxy.example.com:8080" >> ${IMAGE_ROOTFS}/home/builder/.bashrc + echo "# export ALL_PROXY=socks://socks.example.com:1080" >> ${IMAGE_ROOTFS}/home/builder/.bashrc + chown builder.builder ${IMAGE_ROOTFS}/home/builder/pseudo - chown -R builder.builder ${IMAGE_ROOTFS}/home/builder/poky + chown -R builder.builder ${IMAGE_ROOTFS}/home/builder/poky + chmod -R ug+rw ${IMAGE_ROOTFS}/home/builder/poky - # Allow builder to use sudo to setup tap/tun + # Assume we will need CDROM to install guest additions + mkdir -p ${IMAGE_ROOTFS}/media/cdrom + + # Allow builder to use sudo echo "builder ALL=(ALL) NOPASSWD: ALL" >> ${IMAGE_ROOTFS}/etc/sudoers + # Load tap/tun at startup + ln -sr ${IMAGE_ROOTFS}/usr/sbin/iptables ${IMAGE_ROOTFS}/sbin/iptables + echo "tun" >> ${IMAGE_ROOTFS}/etc/modules + # Use Clearlooks GTK+ theme mkdir -p ${IMAGE_ROOTFS}/etc/gtk-2.0 echo 'gtk-theme-name = "Clearlooks"' > ${IMAGE_ROOTFS}/etc/gtk-2.0/gtkrc @@ -84,6 +110,7 @@ create_bundle_files () { zip -r ${DEPLOY_DIR_IMAGE}/Yocto_Build_Appliance-${DATETIME}.zip Yocto_Build_Appliance ln -sf Yocto_Build_Appliance-${DATETIME}.zip ${DEPLOY_DIR_IMAGE}/Yocto_Build_Appliance.zip } +create_bundle_files[vardepsexclude] = "DATETIME" python do_bundle_files() { bb.build.exec_func('create_bundle_files', d) diff --git a/yocto-poky/meta/recipes-core/images/core-image-minimal-initramfs.bb b/yocto-poky/meta/recipes-core/images/core-image-minimal-initramfs.bb index 1f0fa9580..8d7c0d2d3 100644 --- a/yocto-poky/meta/recipes-core/images/core-image-minimal-initramfs.bb +++ b/yocto-poky/meta/recipes-core/images/core-image-minimal-initramfs.bb @@ -3,7 +3,7 @@ DESCRIPTION = "Small image capable of booting a device. The kernel includes \ the Minimal RAM-based Initial Root Filesystem (initramfs), which finds the \ first 'init' program more efficiently." -PACKAGE_INSTALL = "initramfs-live-boot initramfs-live-install initramfs-live-install-efi busybox udev base-passwd ${ROOTFS_BOOTSTRAP_INSTALL}" +PACKAGE_INSTALL = "initramfs-live-boot initramfs-live-install initramfs-live-install-efi ${VIRTUAL-RUNTIME_base-utils} udev base-passwd ${ROOTFS_BOOTSTRAP_INSTALL}" # Do not pollute the initrd image with rootfs features IMAGE_FEATURES = "" @@ -17,5 +17,6 @@ IMAGE_FSTYPES = "${INITRAMFS_FSTYPES}" inherit core-image IMAGE_ROOTFS_SIZE = "8192" +IMAGE_ROOTFS_EXTRA_SPACE = "0" BAD_RECOMMENDATIONS += "busybox-syslog" diff --git a/yocto-poky/meta/recipes-core/initrdscripts/files/init-install-efi-testfs.sh b/yocto-poky/meta/recipes-core/initrdscripts/files/init-install-efi-testfs.sh index 7a0b4d440..b56210915 100644 --- a/yocto-poky/meta/recipes-core/initrdscripts/files/init-install-efi-testfs.sh +++ b/yocto-poky/meta/recipes-core/initrdscripts/files/init-install-efi-testfs.sh @@ -69,7 +69,7 @@ umount /dev/${device}* 2> /dev/null || /bin/true mkdir -p /tmp cat /proc/mounts > /etc/mtab -disk_size=$(parted /dev/${device} unit mb print | grep Disk | cut -d" " -f 3 | sed -e "s/MB//") +disk_size=$(parted /dev/${device} unit mb print | grep '^Disk .*: .*MB' | cut -d" " -f 3 | sed -e "s/MB//") testfs_size=$((disk_size*testfs_ratio/100)) rootfs_size=$((disk_size-boot_size-testfs_size)) diff --git a/yocto-poky/meta/recipes-core/initrdscripts/files/init-install-efi.sh b/yocto-poky/meta/recipes-core/initrdscripts/files/init-install-efi.sh index 0443a9d11..d58826a24 100644 --- a/yocto-poky/meta/recipes-core/initrdscripts/files/init-install-efi.sh +++ b/yocto-poky/meta/recipes-core/initrdscripts/files/init-install-efi.sh @@ -120,7 +120,7 @@ if [ ! -e /etc/mtab ]; then cat /proc/mounts > /etc/mtab fi -disk_size=$(parted ${device} unit mb print | grep Disk | cut -d" " -f 3 | sed -e "s/MB//") +disk_size=$(parted ${device} unit mb print | grep '^Disk .*: .*MB' | cut -d" " -f 3 | sed -e "s/MB//") swap_size=$((disk_size*swap_ratio/100)) rootfs_size=$((disk_size-boot_size-swap_size)) @@ -217,7 +217,7 @@ if [ -f /run/media/$1/EFI/BOOT/grub.cfg ]; then # Delete any LABEL= strings sed -i "s/ LABEL=[^ ]*/ /" $GRUBCFG # Delete any root= strings - sed -i "s/ root=[^ ]*/ /" $GRUBCFG + sed -i "s/ root=[^ ]*/ /g" $GRUBCFG # Add the root= and other standard boot options sed -i "s@linux /vmlinuz *@linux /vmlinuz root=PARTUUID=$root_part_uuid rw $rootwait quiet @" $GRUBCFG fi diff --git a/yocto-poky/meta/recipes-core/initrdscripts/files/init-install.sh b/yocto-poky/meta/recipes-core/initrdscripts/files/init-install.sh index f9e9768e4..c5623eeb2 100644 --- a/yocto-poky/meta/recipes-core/initrdscripts/files/init-install.sh +++ b/yocto-poky/meta/recipes-core/initrdscripts/files/init-install.sh @@ -116,7 +116,7 @@ if [ ! -L /etc/mtab ]; then cat /proc/mounts > /etc/mtab fi -disk_size=$(parted ${device} unit mb print | grep Disk | cut -d" " -f 3 | sed -e "s/MB//") +disk_size=$(parted ${device} unit mb print | grep '^Disk .*: .*MB' | cut -d" " -f 3 | sed -e "s/MB//") grub_version=$(grub-install -v|sed 's/.* \([0-9]\).*/\1/') @@ -141,7 +141,7 @@ swap_start=$((rootfs_end)) # 2) they are detected asynchronously (need rootwait) rootwait="" part_prefix="" -if [ ! "${device#mmcblk}" = "${device}" ]; then +if [ ! "${device#/dev/mmcblk}" = "${device}" ]; then part_prefix="p" rootwait="rootwait" fi @@ -211,13 +211,13 @@ echo "Copying rootfs files..." cp -a /src_root/* /tgt_root if [ -d /tgt_root/etc/ ] ; then if [ $grub_version -ne 0 ] ; then - boot_uuid=$(blkid -o value -s UUID ${device}2) - swap_part_uuid=$(blkid -o value -s PARTUUID ${device}4) + boot_uuid=$(blkid -o value -s UUID ${bootfs}) + swap_part_uuid=$(blkid -o value -s PARTUUID ${swap}) bootdev="UUID=$boot_uuid" swapdev=/dev/disk/by-partuuid/$swap_part_uuid else - bootdev=${device}2 - swapdev=${device}4 + bootdev=${bootfs} + swapdev=${swap} fi echo "$swapdev swap swap defaults 0 0" >> /tgt_root/etc/fstab echo "$bootdev /boot ext3 defaults 1 2" >> /tgt_root/etc/fstab @@ -234,8 +234,8 @@ mount $bootfs /boot echo "Preparing boot partition..." if [ -f /etc/grub.d/00_header -a $grub_version -ne 0 ] ; then echo "Preparing custom grub2 menu..." - root_part_uuid=$(blkid -o value -s PARTUUID ${device}3) - boot_uuid=$(blkid -o value -s UUID ${device}2) + root_part_uuid=$(blkid -o value -s PARTUUID ${rootfs}) + boot_uuid=$(blkid -o value -s UUID ${bootfs}) GRUBCFG="/boot/grub/grub.cfg" mkdir -p $(dirname $GRUBCFG) cat >$GRUBCFG <<_EOF diff --git a/yocto-poky/meta/recipes-core/initrdscripts/files/init-live.sh b/yocto-poky/meta/recipes-core/initrdscripts/files/init-live.sh index d852c5737..09fb47991 100644 --- a/yocto-poky/meta/recipes-core/initrdscripts/files/init-live.sh +++ b/yocto-poky/meta/recipes-core/initrdscripts/files/init-live.sh @@ -2,7 +2,7 @@ PATH=/sbin:/bin:/usr/sbin:/usr/bin -ROOT_MOUNT="/rootfs/" +ROOT_MOUNT="/rootfs" ROOT_IMAGE="rootfs.img" MOUNT="/bin/mount" UMOUNT="/bin/umount" @@ -169,8 +169,8 @@ mount_and_boot() { # determine which unification filesystem to use union_fs_type="" - if grep -q -w "overlayfs" /proc/filesystems; then - union_fs_type="overlayfs" + if grep -q -w "overlay" /proc/filesystems; then + union_fs_type="overlay" elif grep -q -w "aufs" /proc/filesystems; then union_fs_type="aufs" else @@ -179,14 +179,15 @@ mount_and_boot() { # make a union mount if possible case $union_fs_type in - "overlayfs") + "overlay") mkdir -p /rootfs.ro /rootfs.rw if ! mount -n --move $ROOT_MOUNT /rootfs.ro; then rm -rf /rootfs.ro /rootfs.rw fatal "Could not move rootfs mount point" else mount -t tmpfs -o rw,noatime,mode=755 tmpfs /rootfs.rw - mount -t overlayfs -o "lowerdir=/rootfs.ro,upperdir=/rootfs.rw" overlayfs $ROOT_MOUNT + mkdir -p /rootfs.rw/upperdir /rootfs.rw/work + mount -t overlay overlay -o "lowerdir=/rootfs.ro,upperdir=/rootfs.rw/upperdir,workdir=/rootfs.rw/work" $ROOT_MOUNT mkdir -p $ROOT_MOUNT/rootfs.ro $ROOT_MOUNT/rootfs.rw mount --move /rootfs.ro $ROOT_MOUNT/rootfs.ro mount --move /rootfs.rw $ROOT_MOUNT/rootfs.rw @@ -214,11 +215,7 @@ mount_and_boot() { boot_live_root } -case $label in - boot) - mount_and_boot - ;; - install|install-efi) +if [ "$label" != "boot" -a -f $label.sh ] ; then if [ -f /run/media/$i/$ISOLINUX/$ROOT_IMAGE ] ; then ./$label.sh $i/$ISOLINUX $ROOT_IMAGE $video_mode $vga_mode $console_params else @@ -226,10 +223,8 @@ case $label in fi # If we're getting here, we failed... - fatal "Installation image failed" - ;; - *) - # Not sure what boot label is provided. Try to boot to avoid locking up. - mount_and_boot - ;; -esac + fatal "Target $label failed" +fi + +mount_and_boot + diff --git a/yocto-poky/meta/recipes-core/initrdscripts/initramfs-framework/udev b/yocto-poky/meta/recipes-core/initrdscripts/initramfs-framework/udev index bb462dc44..79c886782 100644 --- a/yocto-poky/meta/recipes-core/initrdscripts/initramfs-framework/udev +++ b/yocto-poky/meta/recipes-core/initrdscripts/initramfs-framework/udev @@ -38,6 +38,7 @@ udev_run() { add_module_pre_hook "udev_shutdown_hook_handler" mkdir -p /run + mkdir -p /var/run $_UDEV_DAEMON --daemon udevadm trigger --action=add diff --git a/yocto-poky/meta/recipes-core/initrdscripts/initramfs-framework_1.0.bb b/yocto-poky/meta/recipes-core/initrdscripts/initramfs-framework_1.0.bb index 6c37b9aef..0664a95c9 100644 --- a/yocto-poky/meta/recipes-core/initrdscripts/initramfs-framework_1.0.bb +++ b/yocto-poky/meta/recipes-core/initrdscripts/initramfs-framework_1.0.bb @@ -1,7 +1,7 @@ SUMMARY = "Modular initramfs system" LICENSE = "MIT" LIC_FILES_CHKSUM = "file://${COREBASE}/meta/COPYING.MIT;md5=3da9cfbcb788c80a0384361b4de20420" -RDEPENDS_${PN} += "busybox" +RDEPENDS_${PN} += "${VIRTUAL-RUNTIME_base-utils}" PR = "r2" diff --git a/yocto-poky/meta/recipes-core/initscripts/initscripts-1.0/populate-volatile.sh b/yocto-poky/meta/recipes-core/initscripts/initscripts-1.0/populate-volatile.sh index 904037eea..ce4622a5e 100755 --- a/yocto-poky/meta/recipes-core/initscripts/initscripts-1.0/populate-volatile.sh +++ b/yocto-poky/meta/recipes-core/initscripts/initscripts-1.0/populate-volatile.sh @@ -163,6 +163,16 @@ apply_cfgfile() { continue } + [ "${TTYPE}" = "b" ] && { + TSOURCE="$TLTARGET" + [ "${VERBOSE}" != "no" ] && echo "Creating mount-bind -${TNAME}- from -${TSOURCE}-." + mount --bind "${TSOURCE}" "${TNAME}" + EXEC=" + mount --bind \"${TSOURCE}\" \"${TNAME}\"" + test "$VOLATILE_ENABLE_CACHE" = yes && echo "$EXEC" >> /etc/volatile.cache.build + continue + } + [ -L "${TNAME}" ] && { [ "${VERBOSE}" != "no" ] && echo "Found link." NEWNAME=`ls -l "${TNAME}" | sed -e 's/^.*-> \(.*\)$/\1/'` diff --git a/yocto-poky/meta/recipes-core/initscripts/initscripts-1.0/save-rtc.sh b/yocto-poky/meta/recipes-core/initscripts/initscripts-1.0/save-rtc.sh index b038fc59d..1632a5f64 100644 --- a/yocto-poky/meta/recipes-core/initscripts/initscripts-1.0/save-rtc.sh +++ b/yocto-poky/meta/recipes-core/initscripts/initscripts-1.0/save-rtc.sh @@ -10,4 +10,4 @@ ### END INIT INFO # Update the timestamp -date -u +%4Y%2m%2d%2H%2M%2S > /etc/timestamp +date -u +%4Y%2m%2d%2H%2M%2S 2>/dev/null > /etc/timestamp diff --git a/yocto-poky/meta/recipes-core/initscripts/initscripts_1.0.bb b/yocto-poky/meta/recipes-core/initscripts/initscripts_1.0.bb index f90de6e4d..148491fb2 100644 --- a/yocto-poky/meta/recipes-core/initscripts/initscripts_1.0.bb +++ b/yocto-poky/meta/recipes-core/initscripts/initscripts_1.0.bb @@ -123,7 +123,7 @@ do_install () { # update-rc.d -r ${D} rmnologin.sh start 99 2 3 4 5 . update-rc.d -r ${D} sendsigs start 20 0 6 . - update-rc.d -r ${D} urandom start 30 S 0 6 . + update-rc.d -r ${D} urandom start 38 S 0 6 . update-rc.d -r ${D} umountnfs.sh start 31 0 1 6 . update-rc.d -r ${D} umountfs start 40 0 6 . update-rc.d -r ${D} reboot start 90 6 . diff --git a/yocto-poky/meta/recipes-core/jpeg/jpeg_9a.bb b/yocto-poky/meta/recipes-core/jpeg/jpeg_9a.bb deleted file mode 100644 index ea2e65d61..000000000 --- a/yocto-poky/meta/recipes-core/jpeg/jpeg_9a.bb +++ /dev/null @@ -1,29 +0,0 @@ -SUMMARY = "libjpeg is a library for handling the JPEG (JFIF) image format" -DESCRIPTION = "libjpeg contains a library for handling the JPEG (JFIF) image format, as well as related programs for accessing the libjpeg functions." -HOMEPAGE = "http://www.ijg.org/" - -LICENSE ="BSD-3-Clause" -LIC_FILES_CHKSUM = "file://README;md5=ea93a8a2fed10106b63bc21679edacb9" - -SECTION = "libs" - -SRC_URI = "http://www.ijg.org/files/jpegsrc.v${PV}.tar.gz \ - " - -SRC_URI[md5sum] = "3353992aecaee1805ef4109aadd433e7" -SRC_URI[sha256sum] = "3a753ea48d917945dd54a2d97de388aa06ca2eb1066cbfdc6652036349fe05a7" - -inherit autotools - -PACKAGES =+ "jpeg-tools " -DESCRIPTION_jpeg-tools = "The jpeg-tools package includes the client programs for access libjpeg functionality. These tools allow for the compression, decompression, transformation and display of JPEG files." -FILES_jpeg-tools = "${bindir}/*" - -BBCLASSEXTEND = "native" - -pkg_postinst_${PN}_linuxstdbase () { - if [ ! -e $D${libdir}/libjpeg.so.62 ]; then - JPEG=`find $D${libdir} -type f -name libjpeg.so.\*.\*.\*` - ln -sf `basename $JPEG` $D${libdir}/libjpeg.so.62 - fi -} diff --git a/yocto-poky/meta/recipes-core/kbd/kbd/0003-Only-inluclude-kernel-headers-with-glibc.patch b/yocto-poky/meta/recipes-core/kbd/kbd/0003-Only-inluclude-kernel-headers-with-glibc.patch deleted file mode 100644 index 8bfcb0c7a..000000000 --- a/yocto-poky/meta/recipes-core/kbd/kbd/0003-Only-inluclude-kernel-headers-with-glibc.patch +++ /dev/null @@ -1,29 +0,0 @@ -From 3c5c7acc7ef874b919b26583d3892e21b907833f Mon Sep 17 00:00:00 2001 -From: Natanael Copa <ncopa@alpinelinux.org> -Date: Wed, 20 Aug 2014 09:00:03 +0200 -Subject: [PATCH 3/4] Only inluclude kernel headers with glibc - -This fixes compile errors with musl libc - -Signed-off-by: Natanael Copa <ncopa@alpinelinux.org> -Upstream-Status: Pending ---- - src/resizecons.c | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -diff --git a/src/resizecons.c b/src/resizecons.c -index 5f84845..691dfcc 100644 ---- a/src/resizecons.c -+++ b/src/resizecons.c -@@ -80,7 +80,7 @@ - #include <sys/ioctl.h> - #if (__GNU_LIBRARY__ >= 6) - #include <sys/perm.h> --#else -+#elif defined(__GLIBC__) - #include <linux/types.h> - #include <linux/termios.h> - #endif --- -2.1.0 - diff --git a/yocto-poky/meta/recipes-core/kbd/kbd/uclibc-stdarg.patch b/yocto-poky/meta/recipes-core/kbd/kbd/uclibc-stdarg.patch deleted file mode 100644 index be7f324ac..000000000 --- a/yocto-poky/meta/recipes-core/kbd/kbd/uclibc-stdarg.patch +++ /dev/null @@ -1,36 +0,0 @@ -In file included from keymap.h:5:0, - from ksyms.c:6: -./keymap/common.h:65:38: error: unknown type name 'va_list' - const char *format, va_list args), - ^ -./keymap/common.h:66:3: error: expected ';', ',' or ')' before 'const' - const void *data); - ^ - -Upstream-Status: Pending -Signed-off-by: Khem Raj <raj.khem@gmail.com> -Index: kbd-2.0.0/src/libkeymap/contextP.h -=================================================================== ---- kbd-2.0.0.orig/src/libkeymap/contextP.h 2013-08-13 06:46:23.000000000 -0700 -+++ kbd-2.0.0/src/libkeymap/contextP.h 2013-11-05 22:33:49.200528226 -0800 -@@ -2,7 +2,7 @@ - #define LK_CONTEXTP_H - - #include "keymap.h" -- -+#include <stdarg.h> - /** - * @brief Copy of struct kbdiacruc. - */ -Index: kbd-2.0.0/src/libkeymap/keymap/common.h -=================================================================== ---- kbd-2.0.0.orig/src/libkeymap/keymap/common.h 2013-08-13 06:46:23.000000000 -0700 -+++ kbd-2.0.0/src/libkeymap/keymap/common.h 2013-11-05 22:33:59.964528438 -0800 -@@ -6,6 +6,7 @@ - */ - - #include <keymap/context.h> -+#include <stdarg.h> - - /** Initializes the structures necessary to read and/or parse keymap. - * diff --git a/yocto-poky/meta/recipes-core/kbd/kbd_2.0.2.bb b/yocto-poky/meta/recipes-core/kbd/kbd_2.0.3.bb index 49bb6c9a3..858dc0566 100644 --- a/yocto-poky/meta/recipes-core/kbd/kbd_2.0.2.bb +++ b/yocto-poky/meta/recipes-core/kbd/kbd_2.0.3.bb @@ -11,12 +11,10 @@ RPROVIDES_${PN} = "console-tools" RCONFLICTS_${PN} = "console-tools" SRC_URI = "${KERNELORG_MIRROR}/linux/utils/${BPN}/${BP}.tar.xz \ - file://uclibc-stdarg.patch \ - file://0003-Only-inluclude-kernel-headers-with-glibc.patch \ " -SRC_URI[md5sum] = "87475eb78b1d6e6ab06686dd323ad4ba" -SRC_URI[sha256sum] = "9dfddabf96012e329c4bebb96a21aeef7c3872f624e96e8156ba542b82aeb912" +SRC_URI[md5sum] = "231b46e7142eb41ea3ae06d2ded3c208" +SRC_URI[sha256sum] = "7a899de1c0eb75f3aea737095a736f2375e1cbfbe693fc14a3fe0bfb4649fb5e" PACKAGECONFIG ?= "${@bb.utils.contains('DISTRO_FEATURES', 'pam', 'pam', '', d)}" PACKAGECONFIG[pam] = "--enable-vlock, --disable-vlock, libpam," diff --git a/yocto-poky/meta/recipes-core/libcgroup/libcgroup/musl-decls-compat.patch b/yocto-poky/meta/recipes-core/libcgroup/libcgroup/musl-decls-compat.patch new file mode 100644 index 000000000..65f4ef9a5 --- /dev/null +++ b/yocto-poky/meta/recipes-core/libcgroup/libcgroup/musl-decls-compat.patch @@ -0,0 +1,235 @@ +commit ca780b4f7f71abeeb04a585f2a4d889caaa985fa +Author: Isaac Dunham <ibid.ag@gmail.com> +Date: Fri Sep 5 22:35:32 2014 -0700 + + Remove __.*DECLS nonsense + +Upstream-Status: Pending +Signed-off-by: Khem Raj <raj.khem@gmail.com> + +Index: libcgroup-0.41/include/libcgroup/config.h +=================================================================== +--- libcgroup-0.41.orig/include/libcgroup/config.h ++++ libcgroup-0.41/include/libcgroup/config.h +@@ -9,7 +9,9 @@ + #include <features.h> + #endif + +-__BEGIN_DECLS ++#ifdef __cplusplus ++extern "C" { ++#endif + + /** + * @defgroup group_config 5. Configuration +@@ -107,6 +109,8 @@ int cgroup_config_create_template_group( + * @} + * @} + */ +-__END_DECLS ++#ifdef __cplusplus ++} ++#endif + + #endif /*_LIBCGROUP_CONFIG_H*/ +Index: libcgroup-0.41/include/libcgroup/error.h +=================================================================== +--- libcgroup-0.41.orig/include/libcgroup/error.h ++++ libcgroup-0.41/include/libcgroup/error.h +@@ -9,7 +9,9 @@ + #include <features.h> + #endif + +-__BEGIN_DECLS ++#ifdef __cplusplus ++extern "C" { ++#endif + + /** + * @defgroup group_errors 6. Error handling +@@ -99,6 +101,8 @@ int cgroup_get_last_errno(void); + * @} + * @} + */ +-__END_DECLS ++#ifdef __cplusplus ++} ++#endif + + #endif /* _LIBCGROUP_INIT_H */ +Index: libcgroup-0.41/include/libcgroup/groups.h +=================================================================== +--- libcgroup-0.41.orig/include/libcgroup/groups.h ++++ libcgroup-0.41/include/libcgroup/groups.h +@@ -11,7 +11,9 @@ + #include <stdbool.h> + #endif + +-__BEGIN_DECLS ++#ifdef __cplusplus ++extern "C" { ++#endif + + /** + * Flags for cgroup_delete_cgroup_ext(). +@@ -577,6 +579,8 @@ char *cgroup_get_cgroup_name(struct cgro + */ + + +-__END_DECLS ++#ifdef __cplusplus ++} ++#endif + + #endif /* _LIBCGROUP_GROUPS_H */ +Index: libcgroup-0.41/include/libcgroup/init.h +=================================================================== +--- libcgroup-0.41.orig/include/libcgroup/init.h ++++ libcgroup-0.41/include/libcgroup/init.h +@@ -9,7 +9,9 @@ + #include <features.h> + #endif + +-__BEGIN_DECLS ++#ifdef __cplusplus ++extern "C" { ++#endif + + /** + * @defgroup group_init 1. Initialization +@@ -58,6 +60,8 @@ int cgroup_get_subsys_mount_point(const + * @} + * @} + */ +-__END_DECLS ++#ifdef __cplusplus ++} ++#endif + + #endif /* _LIBCGROUP_INIT_H */ +Index: libcgroup-0.41/include/libcgroup/iterators.h +=================================================================== +--- libcgroup-0.41.orig/include/libcgroup/iterators.h ++++ libcgroup-0.41/include/libcgroup/iterators.h +@@ -11,7 +11,9 @@ + #include <features.h> + #endif + +-__BEGIN_DECLS ++#ifdef __cplusplus ++extern "C" { ++#endif + + /** + * @defgroup group_iterators 3. Iterators +@@ -423,6 +425,8 @@ int cgroup_get_subsys_mount_point_end(vo + * @} + */ + +-__END_DECLS ++#ifdef __cplusplus ++} ++#endif + + #endif /* _LIBCGROUP_ITERATORS_H */ +Index: libcgroup-0.41/include/libcgroup/tasks.h +=================================================================== +--- libcgroup-0.41.orig/include/libcgroup/tasks.h ++++ libcgroup-0.41/include/libcgroup/tasks.h +@@ -12,7 +12,9 @@ + #include <stdbool.h> + #endif + +-__BEGIN_DECLS ++#ifdef __cplusplus ++extern "C" { ++#endif + + /** Flags for cgroup_change_cgroup_uid_gid(). */ + enum cgflags { +@@ -204,6 +206,8 @@ int cgroup_register_unchanged_process(pi + * @} + * @} + */ +-__END_DECLS ++#ifdef __cplusplus ++} ++#endif + + #endif /* _LIBCGROUP_TASKS_H */ +Index: libcgroup-0.41/src/daemon/cgrulesengd.h +=================================================================== +--- libcgroup-0.41.orig/src/daemon/cgrulesengd.h ++++ libcgroup-0.41/src/daemon/cgrulesengd.h +@@ -17,7 +17,9 @@ + + #include <features.h> + +-__BEGIN_DECLS ++#ifdef __cplusplus ++extern "C" { ++#endif + + #include "config.h" + #include "libcgroup.h" +@@ -119,7 +121,9 @@ void cgre_flash_templates(int signum); + */ + void cgre_catch_term(int signum); + +-__END_DECLS ++#ifdef __cplusplus ++} ++#endif + + #endif /* _CGRULESENGD_H */ + +Index: libcgroup-0.41/src/libcgroup-internal.h +=================================================================== +--- libcgroup-0.41.orig/src/libcgroup-internal.h ++++ libcgroup-0.41/src/libcgroup-internal.h +@@ -16,7 +16,9 @@ + + #define __LIBCG_INTERNAL + +-__BEGIN_DECLS ++#ifdef __cplusplus ++extern "C" { ++#endif + + #include "config.h" + #include <fts.h> +@@ -279,6 +281,8 @@ extern void cgroup_dictionary_iterator_e + */ + int cg_chmod_path(const char *path, mode_t mode, int owner_is_umask); + +-__END_DECLS ++#ifdef __cplusplus ++} ++#endif + + #endif +Index: libcgroup-0.41/include/libcgroup/log.h +=================================================================== +--- libcgroup-0.41.orig/include/libcgroup/log.h ++++ libcgroup-0.41/include/libcgroup/log.h +@@ -11,7 +11,9 @@ + + #include <stdarg.h> + +-__BEGIN_DECLS ++#ifdef __cplusplus ++extern "C" { ++#endif + + /** + * @defgroup group_log 7. Logging +@@ -142,6 +144,8 @@ extern int cgroup_parse_log_level_str(co + * @} + * @} + */ +-__END_DECLS ++#ifdef __cplusplus ++} ++#endif + + #endif /* _LIBCGROUP_LOG_H */ diff --git a/yocto-poky/meta/recipes-core/libcgroup/libcgroup_0.41.bb b/yocto-poky/meta/recipes-core/libcgroup/libcgroup_0.41.bb index 52ba1d760..95979630a 100644 --- a/yocto-poky/meta/recipes-core/libcgroup/libcgroup_0.41.bb +++ b/yocto-poky/meta/recipes-core/libcgroup/libcgroup_0.41.bb @@ -11,15 +11,20 @@ inherit autotools pkgconfig DEPENDS = "bison-native flex-native ${@bb.utils.contains('DISTRO_FEATURES', 'pam', 'libpam', '', d)}" SRC_URI = "${SOURCEFORGE_MIRROR}/project/libcg/${BPN}/v0.41/${BPN}-${PV}.tar.bz2" +SRC_URI_append_libc-musl = " file://musl-decls-compat.patch" SRC_URI[md5sum] = "3dea9d50b8a5b73ff0bf1cdcb210f63f" SRC_URI[sha256sum] = "e4e38bdc7ef70645ce33740ddcca051248d56b53283c0dc6d404e17706f6fb51" +UPSTREAM_CHECK_URI = "http://sourceforge.net/projects/libcg/files/libcgroup/" + +DEPENDS_append_libc-musl = " fts " +EXTRA_OEMAKE_append_libc-musl = "LIBS=-lfts" + EXTRA_OECONF = "${@bb.utils.contains('DISTRO_FEATURES', 'pam', '--enable-pam-module-dir=${base_libdir}/security --enable-pam=yes', '--enable-pam=no', d)}" PACKAGES =+ "cgroups-pam-plugin" FILES_cgroups-pam-plugin = "${base_libdir}/security/pam_cgroup.so*" -FILES_${PN}-dbg += "${base_libdir}/security/.debug" FILES_${PN}-dev += "${base_libdir}/security/*.la" do_install_append() { diff --git a/yocto-poky/meta/recipes-core/libxml/libxml2/0001-CVE-2015-1819-Enforce-the-reader-to-run-in-constant-.patch b/yocto-poky/meta/recipes-core/libxml/libxml2/0001-CVE-2015-1819-Enforce-the-reader-to-run-in-constant-.patch deleted file mode 100644 index 96d58f9dd..000000000 --- a/yocto-poky/meta/recipes-core/libxml/libxml2/0001-CVE-2015-1819-Enforce-the-reader-to-run-in-constant-.patch +++ /dev/null @@ -1,181 +0,0 @@ -From 213f1fe0d76d30eaed6e5853057defc43e6df2c9 Mon Sep 17 00:00:00 2001 -From: Daniel Veillard <veillard@redhat.com> -Date: Tue, 14 Apr 2015 17:41:48 +0800 -Subject: [PATCH] CVE-2015-1819 Enforce the reader to run in constant memory - -One of the operation on the reader could resolve entities -leading to the classic expansion issue. Make sure the -buffer used for xmlreader operation is bounded. -Introduce a new allocation type for the buffers for this effect. - -Upstream-Status: Backport - -Signed-off-by: Yue Tao <Yue.Tao@windriver.com> -Signed-off-by: Wenzong Fan <wenzong.fan@windriver.com> ---- - buf.c | 43 ++++++++++++++++++++++++++++++++++++++++++- - include/libxml/tree.h | 3 ++- - xmlreader.c | 20 +++++++++++++++++++- - 3 files changed, 63 insertions(+), 3 deletions(-) - -diff --git a/buf.c b/buf.c -index 6efc7b6..07922ff 100644 ---- a/buf.c -+++ b/buf.c -@@ -27,6 +27,7 @@ - #include <libxml/tree.h> - #include <libxml/globals.h> - #include <libxml/tree.h> -+#include <libxml/parserInternals.h> /* for XML_MAX_TEXT_LENGTH */ - #include "buf.h" - - #define WITH_BUFFER_COMPAT -@@ -299,7 +300,8 @@ xmlBufSetAllocationScheme(xmlBufPtr buf, - if ((scheme == XML_BUFFER_ALLOC_DOUBLEIT) || - (scheme == XML_BUFFER_ALLOC_EXACT) || - (scheme == XML_BUFFER_ALLOC_HYBRID) || -- (scheme == XML_BUFFER_ALLOC_IMMUTABLE)) { -+ (scheme == XML_BUFFER_ALLOC_IMMUTABLE) || -+ (scheme == XML_BUFFER_ALLOC_BOUNDED)) { - buf->alloc = scheme; - if (buf->buffer) - buf->buffer->alloc = scheme; -@@ -458,6 +460,18 @@ xmlBufGrowInternal(xmlBufPtr buf, size_t len) { - size = buf->use + len + 100; - #endif - -+ if (buf->alloc == XML_BUFFER_ALLOC_BOUNDED) { -+ /* -+ * Used to provide parsing limits -+ */ -+ if ((buf->use + len >= XML_MAX_TEXT_LENGTH) || -+ (buf->size >= XML_MAX_TEXT_LENGTH)) { -+ xmlBufMemoryError(buf, "buffer error: text too long\n"); -+ return(0); -+ } -+ if (size >= XML_MAX_TEXT_LENGTH) -+ size = XML_MAX_TEXT_LENGTH; -+ } - if ((buf->alloc == XML_BUFFER_ALLOC_IO) && (buf->contentIO != NULL)) { - size_t start_buf = buf->content - buf->contentIO; - -@@ -739,6 +753,15 @@ xmlBufResize(xmlBufPtr buf, size_t size) - CHECK_COMPAT(buf) - - if (buf->alloc == XML_BUFFER_ALLOC_IMMUTABLE) return(0); -+ if (buf->alloc == XML_BUFFER_ALLOC_BOUNDED) { -+ /* -+ * Used to provide parsing limits -+ */ -+ if (size >= XML_MAX_TEXT_LENGTH) { -+ xmlBufMemoryError(buf, "buffer error: text too long\n"); -+ return(0); -+ } -+ } - - /* Don't resize if we don't have to */ - if (size < buf->size) -@@ -867,6 +890,15 @@ xmlBufAdd(xmlBufPtr buf, const xmlChar *str, int len) { - - needSize = buf->use + len + 2; - if (needSize > buf->size){ -+ if (buf->alloc == XML_BUFFER_ALLOC_BOUNDED) { -+ /* -+ * Used to provide parsing limits -+ */ -+ if (needSize >= XML_MAX_TEXT_LENGTH) { -+ xmlBufMemoryError(buf, "buffer error: text too long\n"); -+ return(-1); -+ } -+ } - if (!xmlBufResize(buf, needSize)){ - xmlBufMemoryError(buf, "growing buffer"); - return XML_ERR_NO_MEMORY; -@@ -938,6 +970,15 @@ xmlBufAddHead(xmlBufPtr buf, const xmlChar *str, int len) { - } - needSize = buf->use + len + 2; - if (needSize > buf->size){ -+ if (buf->alloc == XML_BUFFER_ALLOC_BOUNDED) { -+ /* -+ * Used to provide parsing limits -+ */ -+ if (needSize >= XML_MAX_TEXT_LENGTH) { -+ xmlBufMemoryError(buf, "buffer error: text too long\n"); -+ return(-1); -+ } -+ } - if (!xmlBufResize(buf, needSize)){ - xmlBufMemoryError(buf, "growing buffer"); - return XML_ERR_NO_MEMORY; -diff --git a/include/libxml/tree.h b/include/libxml/tree.h -index 2f90717..4a9b3bc 100644 ---- a/include/libxml/tree.h -+++ b/include/libxml/tree.h -@@ -76,7 +76,8 @@ typedef enum { - XML_BUFFER_ALLOC_EXACT, /* grow only to the minimal size */ - XML_BUFFER_ALLOC_IMMUTABLE, /* immutable buffer */ - XML_BUFFER_ALLOC_IO, /* special allocation scheme used for I/O */ -- XML_BUFFER_ALLOC_HYBRID /* exact up to a threshold, and doubleit thereafter */ -+ XML_BUFFER_ALLOC_HYBRID, /* exact up to a threshold, and doubleit thereafter */ -+ XML_BUFFER_ALLOC_BOUNDED /* limit the upper size of the buffer */ - } xmlBufferAllocationScheme; - - /** -diff --git a/xmlreader.c b/xmlreader.c -index f19e123..471e7e2 100644 ---- a/xmlreader.c -+++ b/xmlreader.c -@@ -2091,6 +2091,9 @@ xmlNewTextReader(xmlParserInputBufferPtr input, const char *URI) { - "xmlNewTextReader : malloc failed\n"); - return(NULL); - } -+ /* no operation on a reader should require a huge buffer */ -+ xmlBufSetAllocationScheme(ret->buffer, -+ XML_BUFFER_ALLOC_BOUNDED); - ret->sax = (xmlSAXHandler *) xmlMalloc(sizeof(xmlSAXHandler)); - if (ret->sax == NULL) { - xmlBufFree(ret->buffer); -@@ -3616,6 +3619,7 @@ xmlTextReaderConstValue(xmlTextReaderPtr reader) { - return(((xmlNsPtr) node)->href); - case XML_ATTRIBUTE_NODE:{ - xmlAttrPtr attr = (xmlAttrPtr) node; -+ const xmlChar *ret; - - if ((attr->children != NULL) && - (attr->children->type == XML_TEXT_NODE) && -@@ -3629,10 +3633,21 @@ xmlTextReaderConstValue(xmlTextReaderPtr reader) { - "xmlTextReaderSetup : malloc failed\n"); - return (NULL); - } -+ xmlBufSetAllocationScheme(reader->buffer, -+ XML_BUFFER_ALLOC_BOUNDED); - } else - xmlBufEmpty(reader->buffer); - xmlBufGetNodeContent(reader->buffer, node); -- return(xmlBufContent(reader->buffer)); -+ ret = xmlBufContent(reader->buffer); -+ if (ret == NULL) { -+ /* error on the buffer best to reallocate */ -+ xmlBufFree(reader->buffer); -+ reader->buffer = xmlBufCreateSize(100); -+ xmlBufSetAllocationScheme(reader->buffer, -+ XML_BUFFER_ALLOC_BOUNDED); -+ ret = BAD_CAST ""; -+ } -+ return(ret); - } - break; - } -@@ -5131,6 +5146,9 @@ xmlTextReaderSetup(xmlTextReaderPtr reader, - "xmlTextReaderSetup : malloc failed\n"); - return (-1); - } -+ /* no operation on a reader should require a huge buffer */ -+ xmlBufSetAllocationScheme(reader->buffer, -+ XML_BUFFER_ALLOC_BOUNDED); - if (reader->sax == NULL) - reader->sax = (xmlSAXHandler *) xmlMalloc(sizeof(xmlSAXHandler)); - if (reader->sax == NULL) { --- -1.7.9.5 - diff --git a/yocto-poky/meta/recipes-core/libxml/libxml2/0001-CVE-2015-5312-Another-entity-expansion-issue.patch b/yocto-poky/meta/recipes-core/libxml/libxml2/0001-CVE-2015-5312-Another-entity-expansion-issue.patch deleted file mode 100644 index 979618d2c..000000000 --- a/yocto-poky/meta/recipes-core/libxml/libxml2/0001-CVE-2015-5312-Another-entity-expansion-issue.patch +++ /dev/null @@ -1,39 +0,0 @@ -From 69030714cde66d525a8884bda01b9e8f0abf8e1e Mon Sep 17 00:00:00 2001 -From: David Drysdale <drysdale@google.com> -Date: Fri, 20 Nov 2015 11:13:45 +0800 -Subject: [PATCH] CVE-2015-5312 Another entity expansion issue - -For https://bugzilla.gnome.org/show_bug.cgi?id=756733 -It is one case where the code in place to detect entities expansions -failed to exit when the situation was detected, leading to DoS -Problem reported by Kostya Serebryany @ Google -Patch provided by David Drysdale @ Google - -Upstream-Status: Backport - -CVE-2015-5312 - -Signed-off-by: Armin Kuster <akuster@mvista.com> - ---- - parser.c | 4 ++++ - 1 file changed, 4 insertions(+) - -diff --git a/parser.c b/parser.c -index b7b6668..da6e729 100644 ---- a/parser.c -+++ b/parser.c -@@ -2806,6 +2806,10 @@ xmlStringLenDecodeEntities(xmlParserCtxtPtr ctxt, const xmlChar *str, int len, - 0, 0, 0); - ctxt->depth--; - -+ if ((ctxt->lastError.code == XML_ERR_ENTITY_LOOP) || -+ (ctxt->lastError.code == XML_ERR_INTERNAL_ERROR)) -+ goto int_error; -+ - if (rep != NULL) { - current = rep; - while (*current != 0) { /* non input consuming loop */ --- -2.3.5 - diff --git a/yocto-poky/meta/recipes-core/libxml/libxml2/0001-CVE-2015-7497-Avoid-an-heap-buffer-overflow-in-xmlDi.patch b/yocto-poky/meta/recipes-core/libxml/libxml2/0001-CVE-2015-7497-Avoid-an-heap-buffer-overflow-in-xmlDi.patch deleted file mode 100644 index 955c96195..000000000 --- a/yocto-poky/meta/recipes-core/libxml/libxml2/0001-CVE-2015-7497-Avoid-an-heap-buffer-overflow-in-xmlDi.patch +++ /dev/null @@ -1,40 +0,0 @@ -From 6360a31a84efe69d155ed96306b9a931a40beab9 Mon Sep 17 00:00:00 2001 -From: David Drysdale <drysdale@google.com> -Date: Fri, 20 Nov 2015 10:47:12 +0800 -Subject: [PATCH] CVE-2015-7497 Avoid an heap buffer overflow in - xmlDictComputeFastQKey - -For https://bugzilla.gnome.org/show_bug.cgi?id=756528 -It was possible to hit a negative offset in the name indexing -used to randomize the dictionary key generation -Reported and fix provided by David Drysdale @ Google - -Upstream-Status: Backport - -CVE-2015-7497 - -Signed-off-by: Armin Kuster <akuster@mvista.com> - ---- - dict.c | 5 ++++- - 1 file changed, 4 insertions(+), 1 deletion(-) - -diff --git a/dict.c b/dict.c -index 5f71d55..8c8f931 100644 ---- a/dict.c -+++ b/dict.c -@@ -486,7 +486,10 @@ xmlDictComputeFastQKey(const xmlChar *prefix, int plen, - value += 30 * (*prefix); - - if (len > 10) { -- value += name[len - (plen + 1 + 1)]; -+ int offset = len - (plen + 1 + 1); -+ if (offset < 0) -+ offset = len - (10 + 1); -+ value += name[offset]; - len = 10; - if (plen > 10) - plen = 10; --- -2.3.5 - diff --git a/yocto-poky/meta/recipes-core/libxml/libxml2/0001-CVE-2015-7500-Fix-memory-access-error-due-to-incorre.patch b/yocto-poky/meta/recipes-core/libxml/libxml2/0001-CVE-2015-7500-Fix-memory-access-error-due-to-incorre.patch deleted file mode 100644 index b4860791b..000000000 --- a/yocto-poky/meta/recipes-core/libxml/libxml2/0001-CVE-2015-7500-Fix-memory-access-error-due-to-incorre.patch +++ /dev/null @@ -1,131 +0,0 @@ -From f1063fdbe7fa66332bbb76874101c2a7b51b519f Mon Sep 17 00:00:00 2001 -From: Daniel Veillard <veillard@redhat.com> -Date: Fri, 20 Nov 2015 16:06:59 +0800 -Subject: [PATCH] CVE-2015-7500 Fix memory access error due to incorrect - entities boundaries - -For https://bugzilla.gnome.org/show_bug.cgi?id=756525 -handle properly the case where we popped out of the current entity -while processing a start tag -Reported by Kostya Serebryany @ Google - -This slightly modifies the output of 754946 in regression tests - -Upstream-Status: Backport - -CVE-2015-7500 - -Signed-off-by: Armin Kuster <akuster@mvista.com> - ---- - parser.c | 28 ++++++++++++++++++++++------ - result/errors/754946.xml.err | 7 +++++-- - 2 files changed, 27 insertions(+), 8 deletions(-) - -diff --git a/parser.c b/parser.c -index c7e4574..c5741e3 100644 ---- a/parser.c -+++ b/parser.c -@@ -9348,7 +9348,7 @@ xmlParseStartTag2(xmlParserCtxtPtr ctxt, const xmlChar **pref, - const xmlChar **atts = ctxt->atts; - int maxatts = ctxt->maxatts; - int nratts, nbatts, nbdef; -- int i, j, nbNs, attval, oldline, oldcol; -+ int i, j, nbNs, attval, oldline, oldcol, inputNr; - const xmlChar *base; - unsigned long cur; - int nsNr = ctxt->nsNr; -@@ -9367,6 +9367,7 @@ reparse: - SHRINK; - base = ctxt->input->base; - cur = ctxt->input->cur - ctxt->input->base; -+ inputNr = ctxt->inputNr; - oldline = ctxt->input->line; - oldcol = ctxt->input->col; - nbatts = 0; -@@ -9392,7 +9393,8 @@ reparse: - */ - SKIP_BLANKS; - GROW; -- if (ctxt->input->base != base) goto base_changed; -+ if ((ctxt->input->base != base) || (inputNr != ctxt->inputNr)) -+ goto base_changed; - - while (((RAW != '>') && - ((RAW != '/') || (NXT(1) != '>')) && -@@ -9403,7 +9405,7 @@ reparse: - - attname = xmlParseAttribute2(ctxt, prefix, localname, - &aprefix, &attvalue, &len, &alloc); -- if (ctxt->input->base != base) { -+ if ((ctxt->input->base != base) || (inputNr != ctxt->inputNr)) { - if ((attvalue != NULL) && (alloc != 0)) - xmlFree(attvalue); - attvalue = NULL; -@@ -9552,7 +9554,8 @@ skip_ns: - break; - } - SKIP_BLANKS; -- if (ctxt->input->base != base) goto base_changed; -+ if ((ctxt->input->base != base) || (inputNr != ctxt->inputNr)) -+ goto base_changed; - continue; - } - -@@ -9589,7 +9592,8 @@ failed: - GROW - if (ctxt->instate == XML_PARSER_EOF) - break; -- if (ctxt->input->base != base) goto base_changed; -+ if ((ctxt->input->base != base) || (inputNr != ctxt->inputNr)) -+ goto base_changed; - if ((RAW == '>') || (((RAW == '/') && (NXT(1) == '>')))) - break; - if (!IS_BLANK_CH(RAW)) { -@@ -9605,7 +9609,8 @@ failed: - break; - } - GROW; -- if (ctxt->input->base != base) goto base_changed; -+ if ((ctxt->input->base != base) || (inputNr != ctxt->inputNr)) -+ goto base_changed; - } - - /* -@@ -9772,6 +9777,17 @@ base_changed: - if ((ctxt->attallocs[j] != 0) && (atts[i] != NULL)) - xmlFree((xmlChar *) atts[i]); - } -+ -+ /* -+ * We can't switch from one entity to another in the middle -+ * of a start tag -+ */ -+ if (inputNr != ctxt->inputNr) { -+ xmlFatalErrMsg(ctxt, XML_ERR_ENTITY_BOUNDARY, -+ "Start tag doesn't start and stop in the same entity\n"); -+ return(NULL); -+ } -+ - ctxt->input->cur = ctxt->input->base + cur; - ctxt->input->line = oldline; - ctxt->input->col = oldcol; -diff --git a/result/errors/754946.xml.err b/result/errors/754946.xml.err -index 423dff5..a75088b 100644 ---- a/result/errors/754946.xml.err -+++ b/result/errors/754946.xml.err -@@ -11,6 +11,9 @@ Entity: line 1: parser error : DOCTYPE improperly terminated - Entity: line 1: - A<lbbbbbbbbbbbbbbbbbbb_ - ^ -+./test/errors/754946.xml:1: parser error : Start tag doesn't start and stop in the same entity -+>%SYSTEM;<![ -+ ^ - ./test/errors/754946.xml:1: parser error : Extra content at the end of the document --<!DOCTYPEA[<!ENTITY % -- ^ -+>%SYSTEM;<![ -+ ^ --- -2.3.5 - diff --git a/yocto-poky/meta/recipes-core/libxml/libxml2/0001-CVE-2015-8035-Fix-XZ-compression-support-loop.patch b/yocto-poky/meta/recipes-core/libxml/libxml2/0001-CVE-2015-8035-Fix-XZ-compression-support-loop.patch deleted file mode 100644 index 710735570..000000000 --- a/yocto-poky/meta/recipes-core/libxml/libxml2/0001-CVE-2015-8035-Fix-XZ-compression-support-loop.patch +++ /dev/null @@ -1,38 +0,0 @@ -From f0709e3ca8f8947f2d91ed34e92e38a4c23eae63 Mon Sep 17 00:00:00 2001 -From: Daniel Veillard <veillard@redhat.com> -Date: Tue, 3 Nov 2015 15:31:25 +0800 -Subject: [PATCH] CVE-2015-8035 Fix XZ compression support loop - -For https://bugzilla.gnome.org/show_bug.cgi?id=757466 -DoS when parsing specially crafted XML document if XZ support -is compiled in (which wasn't the case for 2.9.2 and master since -Nov 2013, fixed in next commit !) - -Upstream-Status: Backport - -CVE-2015-8035 - -Signed-off-by: Armin Kuster <akuster@mvista.com> - ---- - xzlib.c | 4 ++++ - 1 file changed, 4 insertions(+) - -diff --git a/xzlib.c b/xzlib.c -index 0dcb9f4..1fab546 100644 ---- a/xzlib.c -+++ b/xzlib.c -@@ -581,6 +581,10 @@ xz_decomp(xz_statep state) - xz_error(state, LZMA_DATA_ERROR, "compressed data error"); - return -1; - } -+ if (ret == LZMA_PROG_ERROR) { -+ xz_error(state, LZMA_PROG_ERROR, "compression error"); -+ return -1; -+ } - } while (strm->avail_out && ret != LZMA_STREAM_END); - - /* update available output and crc check value */ --- -2.3.5 - diff --git a/yocto-poky/meta/recipes-core/libxml/libxml2/0001-CVE-2015-8242-Buffer-overead-with-HTML-parser-in-pus.patch b/yocto-poky/meta/recipes-core/libxml/libxml2/0001-CVE-2015-8242-Buffer-overead-with-HTML-parser-in-pus.patch deleted file mode 100644 index 73531b3c1..000000000 --- a/yocto-poky/meta/recipes-core/libxml/libxml2/0001-CVE-2015-8242-Buffer-overead-with-HTML-parser-in-pus.patch +++ /dev/null @@ -1,49 +0,0 @@ -From 8fb4a770075628d6441fb17a1e435100e2f3b1a2 Mon Sep 17 00:00:00 2001 -From: Hugh Davenport <hugh@allthethings.co.nz> -Date: Fri, 20 Nov 2015 17:16:06 +0800 -Subject: [PATCH] CVE-2015-8242 Buffer overead with HTML parser in push mode - -For https://bugzilla.gnome.org/show_bug.cgi?id=756372 -Error in the code pointing to the codepoint in the stack for the -current char value instead of the pointer in the input that the SAX -callback expects -Reported and fixed by Hugh Davenport - -Upstream-Status: Backport - -CVE-2015-8242 - -Signed-off-by: Armin Kuster <akuster@mvista.com> - ---- - HTMLparser.c | 6 +++--- - 1 file changed, 3 insertions(+), 3 deletions(-) - -diff --git a/HTMLparser.c b/HTMLparser.c -index bdf7807..b729197 100644 ---- a/HTMLparser.c -+++ b/HTMLparser.c -@@ -5735,17 +5735,17 @@ htmlParseTryOrFinish(htmlParserCtxtPtr ctxt, int terminate) { - if (ctxt->keepBlanks) { - if (ctxt->sax->characters != NULL) - ctxt->sax->characters( -- ctxt->userData, &cur, 1); -+ ctxt->userData, &in->cur[0], 1); - } else { - if (ctxt->sax->ignorableWhitespace != NULL) - ctxt->sax->ignorableWhitespace( -- ctxt->userData, &cur, 1); -+ ctxt->userData, &in->cur[0], 1); - } - } else { - htmlCheckParagraph(ctxt); - if (ctxt->sax->characters != NULL) - ctxt->sax->characters( -- ctxt->userData, &cur, 1); -+ ctxt->userData, &in->cur[0], 1); - } - } - ctxt->token = 0; --- -2.3.5 - diff --git a/yocto-poky/meta/recipes-core/libxml/libxml2/0001-Fix-a-bug-on-name-parsing-at-the-end-of-current-inpu.patch b/yocto-poky/meta/recipes-core/libxml/libxml2/0001-Fix-a-bug-on-name-parsing-at-the-end-of-current-inpu.patch deleted file mode 100644 index a86b9ee86..000000000 --- a/yocto-poky/meta/recipes-core/libxml/libxml2/0001-Fix-a-bug-on-name-parsing-at-the-end-of-current-inpu.patch +++ /dev/null @@ -1,138 +0,0 @@ -From 51f02b0a03ea1fa6c65b3f9fd88cf60fb5803783 Mon Sep 17 00:00:00 2001 -From: Daniel Veillard <veillard@redhat.com> -Date: Tue, 15 Sep 2015 16:50:32 +0800 -Subject: [PATCH] Fix a bug on name parsing at the end of current input buffer - -For https://bugzilla.gnome.org/show_bug.cgi?id=754946 - -When hitting the end of the current input buffer while parsing -a name we could end up loosing the beginning of the name, which -led to various issues. - -Upstream-Status: backport - -Depend patch for CVE-2015-7500 - -Signed-off-by: Armin Kuster <akuster@mvista.com> ---- - parser.c | 29 ++++++++++++++++++++--------- - result/errors/754946.xml | 0 - result/errors/754946.xml.err | 16 ++++++++++++++++ - result/errors/754946.xml.str | 4 ++++ - test/errors/754946.xml | 1 + - 5 files changed, 41 insertions(+), 9 deletions(-) - create mode 100644 result/errors/754946.xml - create mode 100644 result/errors/754946.xml.err - create mode 100644 result/errors/754946.xml.str - create mode 100644 test/errors/754946.xml - -diff --git a/parser.c b/parser.c -index 0edd53b..fd29a39 100644 ---- a/parser.c -+++ b/parser.c -@@ -3491,7 +3491,14 @@ xmlParseNCNameComplex(xmlParserCtxtPtr ctxt) { - c = CUR_CHAR(l); - if (c == 0) { - count = 0; -+ /* -+ * when shrinking to extend the buffer we really need to preserve -+ * the part of the name we already parsed. Hence rolling back -+ * by current lenght. -+ */ -+ ctxt->input->cur -= l; - GROW; -+ ctxt->input->cur += l; - if (ctxt->instate == XML_PARSER_EOF) - return(NULL); - end = ctxt->input->cur; -@@ -3523,7 +3530,7 @@ xmlParseNCNameComplex(xmlParserCtxtPtr ctxt) { - - static const xmlChar * - xmlParseNCName(xmlParserCtxtPtr ctxt) { -- const xmlChar *in; -+ const xmlChar *in, *e; - const xmlChar *ret; - int count = 0; - -@@ -3535,16 +3542,19 @@ xmlParseNCName(xmlParserCtxtPtr ctxt) { - * Accelerator for simple ASCII names - */ - in = ctxt->input->cur; -- if (((*in >= 0x61) && (*in <= 0x7A)) || -- ((*in >= 0x41) && (*in <= 0x5A)) || -- (*in == '_')) { -+ e = ctxt->input->end; -+ if ((((*in >= 0x61) && (*in <= 0x7A)) || -+ ((*in >= 0x41) && (*in <= 0x5A)) || -+ (*in == '_')) && (in < e)) { - in++; -- while (((*in >= 0x61) && (*in <= 0x7A)) || -- ((*in >= 0x41) && (*in <= 0x5A)) || -- ((*in >= 0x30) && (*in <= 0x39)) || -- (*in == '_') || (*in == '-') || -- (*in == '.')) -+ while ((((*in >= 0x61) && (*in <= 0x7A)) || -+ ((*in >= 0x41) && (*in <= 0x5A)) || -+ ((*in >= 0x30) && (*in <= 0x39)) || -+ (*in == '_') || (*in == '-') || -+ (*in == '.')) && (in < e)) - in++; -+ if (in >= e) -+ goto complex; - if ((*in > 0) && (*in < 0x80)) { - count = in - ctxt->input->cur; - if ((count > XML_MAX_NAME_LENGTH) && -@@ -3562,6 +3572,7 @@ xmlParseNCName(xmlParserCtxtPtr ctxt) { - return(ret); - } - } -+complex: - return(xmlParseNCNameComplex(ctxt)); - } - -diff --git a/result/errors/754946.xml b/result/errors/754946.xml -new file mode 100644 -index 0000000..e69de29 -diff --git a/result/errors/754946.xml.err b/result/errors/754946.xml.err -new file mode 100644 -index 0000000..423dff5 ---- /dev/null -+++ b/result/errors/754946.xml.err -@@ -0,0 +1,16 @@ -+Entity: line 1: parser error : internal error: xmlParseInternalSubset: error detected in Markup declaration -+ -+ %SYSTEM; -+ ^ -+Entity: line 1: -+A<lbbbbbbbbbbbbbbbbbbb_ -+^ -+Entity: line 1: parser error : DOCTYPE improperly terminated -+ %SYSTEM; -+ ^ -+Entity: line 1: -+A<lbbbbbbbbbbbbbbbbbbb_ -+^ -+./test/errors/754946.xml:1: parser error : Extra content at the end of the document -+<!DOCTYPEA[<!ENTITY % -+ ^ -diff --git a/result/errors/754946.xml.str b/result/errors/754946.xml.str -new file mode 100644 -index 0000000..3b748cc ---- /dev/null -+++ b/result/errors/754946.xml.str -@@ -0,0 +1,4 @@ -+./test/errors/754946.xml:1: parser error : Extra content at the end of the document -+<!DOCTYPEA[<!ENTITY % -+ ^ -+./test/errors/754946.xml : failed to parse -diff --git a/test/errors/754946.xml b/test/errors/754946.xml -new file mode 100644 -index 0000000..6b5f9b0 ---- /dev/null -+++ b/test/errors/754946.xml -@@ -0,0 +1 @@ -+<!DOCTYPEA[<!ENTITY %
SYSTEM "A<lbbbbbbbbbbbbbbbbbbb_"
>%SYSTEM;<![ -\ No newline at end of file --- -2.3.5 - diff --git a/yocto-poky/meta/recipes-core/libxml/libxml2/0001-threads-Define-pthread-definitions-for-glibc-complia.patch b/yocto-poky/meta/recipes-core/libxml/libxml2/0001-threads-Define-pthread-definitions-for-glibc-complia.patch deleted file mode 100644 index c653a81af..000000000 --- a/yocto-poky/meta/recipes-core/libxml/libxml2/0001-threads-Define-pthread-definitions-for-glibc-complia.patch +++ /dev/null @@ -1,32 +0,0 @@ -From 6750cc564a17c812555cca587660240ccffaaed3 Mon Sep 17 00:00:00 2001 -From: Khem Raj <raj.khem@gmail.com> -Date: Sat, 4 Apr 2015 08:50:40 -0700 -Subject: [PATCH] threads: Define pthread* definitions for glibc compliant libs - -This code is assuming glibc but not explicitly saying it -so lets make it so. Fixes following on musl - -threads.c:80:27: error: macro "pthread_equal" requires 2 arguments, but -only 1 given -| extern int pthread_equal () - -Signed-off-by: Khem Raj <raj.khem@gmail.com> - -Upstream-Status: Pending ---- - threads.c | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -Index: libxml2-2.9.2/threads.c -=================================================================== ---- libxml2-2.9.2.orig/threads.c -+++ libxml2-2.9.2/threads.c -@@ -47,7 +47,7 @@ - #ifdef HAVE_PTHREAD_H - - static int libxml_is_threaded = -1; --#ifdef __GNUC__ -+#if defined(__GNUC__) && defined(__GLIBC__) - #ifdef linux - #if (__GNUC__ == 3 && __GNUC_MINOR__ >= 3) || (__GNUC__ > 3) - extern int pthread_once (pthread_once_t *__once_control, diff --git a/yocto-poky/meta/recipes-core/libxml/libxml2/72a46a519ce7326d9a00f0b6a7f2a8e958cd1675.patch b/yocto-poky/meta/recipes-core/libxml/libxml2/72a46a519ce7326d9a00f0b6a7f2a8e958cd1675.patch deleted file mode 100644 index 10a8112b5..000000000 --- a/yocto-poky/meta/recipes-core/libxml/libxml2/72a46a519ce7326d9a00f0b6a7f2a8e958cd1675.patch +++ /dev/null @@ -1,30 +0,0 @@ -From 72a46a519ce7326d9a00f0b6a7f2a8e958cd1675 Mon Sep 17 00:00:00 2001 -From: Daniel Veillard <veillard@redhat.com> -Date: Thu, 23 Oct 2014 11:35:36 +0800 -Subject: Fix missing entities after CVE-2014-3660 fix - -For https://bugzilla.gnome.org/show_bug.cgi?id=738805 - -The fix for CVE-2014-3660 introduced a regression in some case -where entity substitution is required and the entity is used -first in anotther entity referenced from an attribute value - -Upstream-Status: Backport - -diff --git a/parser.c b/parser.c -index 67c9dfd..a8d1b67 100644 ---- a/parser.c -+++ b/parser.c -@@ -7235,7 +7235,8 @@ xmlParseReference(xmlParserCtxtPtr ctxt) { - * far more secure as the parser will only process data coming from - * the document entity by default. - */ -- if ((ent->checked == 0) && -+ if (((ent->checked == 0) || -+ ((ent->children == NULL) && (ctxt->options & XML_PARSE_NOENT))) && - ((ent->etype != XML_EXTERNAL_GENERAL_PARSED_ENTITY) || - (ctxt->options & (XML_PARSE_NOENT | XML_PARSE_DTDVALID)))) { - unsigned long oldnbent = ctxt->nbentities; --- -cgit v0.10.1 - diff --git a/yocto-poky/meta/recipes-core/libxml/libxml2/CVE-2015-7498-Avoid-processing-entities-after-encoding-conversion-.patch b/yocto-poky/meta/recipes-core/libxml/libxml2/CVE-2015-7498-Avoid-processing-entities-after-encoding-conversion-.patch deleted file mode 100644 index 47ba8970e..000000000 --- a/yocto-poky/meta/recipes-core/libxml/libxml2/CVE-2015-7498-Avoid-processing-entities-after-encoding-conversion-.patch +++ /dev/null @@ -1,89 +0,0 @@ -From afd27c21f6b36e22682b7da20d726bce2dcb2f43 Mon Sep 17 00:00:00 2001 -From: Daniel Veillard <veillard@redhat.com> -Date: Mon, 9 Nov 2015 18:07:18 +0800 -Subject: [PATCH] Avoid processing entities after encoding conversion failures - -For https://bugzilla.gnome.org/show_bug.cgi?id=756527 -and was also raised by Chromium team in the past - -When we hit a convwersion failure when switching encoding -it is bestter to stop parsing there, this was treated as a -fatal error but the parser was continuing to process to extract -more errors, unfortunately that makes little sense as the data -is obviously corrupt and can potentially lead to unexpected behaviour. - -Upstream-Status: Backport - -CVE-2015-7498 - -Signed-off-by: Armin Kuster <akuster@mvista.com> - ---- - parser.c | 7 +++++-- - parserInternals.c | 11 ++++++++++- - 2 files changed, 15 insertions(+), 3 deletions(-) - -diff --git a/parser.c b/parser.c -index 134afe7..c79b4e8 100644 ---- a/parser.c -+++ b/parser.c -@@ -10665,7 +10665,8 @@ xmlParseXMLDecl(xmlParserCtxtPtr ctxt) { - xmlFatalErrMsg(ctxt, XML_ERR_SPACE_REQUIRED, "Blank needed here\n"); - } - xmlParseEncodingDecl(ctxt); -- if (ctxt->errNo == XML_ERR_UNSUPPORTED_ENCODING) { -+ if ((ctxt->errNo == XML_ERR_UNSUPPORTED_ENCODING) || -+ (ctxt->instate == XML_PARSER_EOF)) { - /* - * The XML REC instructs us to stop parsing right here - */ -@@ -10789,6 +10790,7 @@ xmlParseDocument(xmlParserCtxtPtr ctxt) { - - if (CUR == 0) { - xmlFatalErr(ctxt, XML_ERR_DOCUMENT_EMPTY, NULL); -+ return(-1); - } - - /* -@@ -10806,7 +10808,8 @@ xmlParseDocument(xmlParserCtxtPtr ctxt) { - * Note that we will switch encoding on the fly. - */ - xmlParseXMLDecl(ctxt); -- if (ctxt->errNo == XML_ERR_UNSUPPORTED_ENCODING) { -+ if ((ctxt->errNo == XML_ERR_UNSUPPORTED_ENCODING) || -+ (ctxt->instate == XML_PARSER_EOF)) { - /* - * The XML REC instructs us to stop parsing right here - */ -diff --git a/parserInternals.c b/parserInternals.c -index df204fd..c8230c1 100644 ---- a/parserInternals.c -+++ b/parserInternals.c -@@ -937,6 +937,7 @@ xmlSwitchEncoding(xmlParserCtxtPtr ctxt, xmlCharEncoding enc) - { - xmlCharEncodingHandlerPtr handler; - int len = -1; -+ int ret; - - if (ctxt == NULL) return(-1); - switch (enc) { -@@ -1097,7 +1098,15 @@ xmlSwitchEncoding(xmlParserCtxtPtr ctxt, xmlCharEncoding enc) - if (handler == NULL) - return(-1); - ctxt->charset = XML_CHAR_ENCODING_UTF8; -- return(xmlSwitchToEncodingInt(ctxt, handler, len)); -+ ret = xmlSwitchToEncodingInt(ctxt, handler, len); -+ if ((ret < 0) || (ctxt->errNo == XML_I18N_CONV_FAILED)) { -+ /* -+ * on encoding conversion errors, stop the parser -+ */ -+ xmlStopParser(ctxt); -+ ctxt->errNo = XML_I18N_CONV_FAILED; -+ } -+ return(ret); - } - - /** --- -2.3.5 - diff --git a/yocto-poky/meta/recipes-core/libxml/libxml2/CVE-2015-7499-1-Add-xmlHaltParser-to-stop-the-parser.patch b/yocto-poky/meta/recipes-core/libxml/libxml2/CVE-2015-7499-1-Add-xmlHaltParser-to-stop-the-parser.patch deleted file mode 100644 index e39ec65cd..000000000 --- a/yocto-poky/meta/recipes-core/libxml/libxml2/CVE-2015-7499-1-Add-xmlHaltParser-to-stop-the-parser.patch +++ /dev/null @@ -1,88 +0,0 @@ -From 28cd9cb747a94483f4aea7f0968d202c20bb4cfc Mon Sep 17 00:00:00 2001 -From: Daniel Veillard <veillard@redhat.com> -Date: Fri, 20 Nov 2015 14:55:30 +0800 -Subject: [PATCH] Add xmlHaltParser() to stop the parser - -The problem is doing it in a consistent and safe fashion -It's more complex than just setting ctxt->instate = XML_PARSER_EOF -Update the public function to reuse that new internal routine - -Upstream-Status: Backport - -CVE-2015-7499-1 - -Signed-off-by: Armin Kuster <akuster@mvista.com> - ---- - parser.c | 34 +++++++++++++++++++++++++++++----- - 1 file changed, 29 insertions(+), 5 deletions(-) - -diff --git a/parser.c b/parser.c -index da6e729..b6e99b1 100644 ---- a/parser.c -+++ b/parser.c -@@ -94,6 +94,8 @@ static xmlParserCtxtPtr - xmlCreateEntityParserCtxtInternal(const xmlChar *URL, const xmlChar *ID, - const xmlChar *base, xmlParserCtxtPtr pctx); - -+static void xmlHaltParser(xmlParserCtxtPtr ctxt); -+ - /************************************************************************ - * * - * Arbitrary limits set in the parser. See XML_PARSE_HUGE * -@@ -12625,25 +12627,47 @@ xmlCreatePushParserCtxt(xmlSAXHandlerPtr sax, void *user_data, - #endif /* LIBXML_PUSH_ENABLED */ - - /** -- * xmlStopParser: -+ * xmlHaltParser: - * @ctxt: an XML parser context - * -- * Blocks further parser processing -+ * Blocks further parser processing don't override error -+ * for internal use - */ --void --xmlStopParser(xmlParserCtxtPtr ctxt) { -+static void -+xmlHaltParser(xmlParserCtxtPtr ctxt) { - if (ctxt == NULL) - return; - ctxt->instate = XML_PARSER_EOF; -- ctxt->errNo = XML_ERR_USER_STOP; - ctxt->disableSAX = 1; - if (ctxt->input != NULL) { -+ /* -+ * in case there was a specific allocation deallocate before -+ * overriding base -+ */ -+ if (ctxt->input->free != NULL) { -+ ctxt->input->free((xmlChar *) ctxt->input->base); -+ ctxt->input->free = NULL; -+ } - ctxt->input->cur = BAD_CAST""; - ctxt->input->base = ctxt->input->cur; - } - } - - /** -+ * xmlStopParser: -+ * @ctxt: an XML parser context -+ * -+ * Blocks further parser processing -+ */ -+void -+xmlStopParser(xmlParserCtxtPtr ctxt) { -+ if (ctxt == NULL) -+ return; -+ xmlHaltParser(ctxt); -+ ctxt->errNo = XML_ERR_USER_STOP; -+} -+ -+/** - * xmlCreateIOParserCtxt: - * @sax: a SAX handler - * @user_data: The user data returned on SAX callbacks --- -2.3.5 - diff --git a/yocto-poky/meta/recipes-core/libxml/libxml2/CVE-2015-7499-2-Detect-incoherency-on-GROW.patch b/yocto-poky/meta/recipes-core/libxml/libxml2/CVE-2015-7499-2-Detect-incoherency-on-GROW.patch deleted file mode 100644 index aff392095..000000000 --- a/yocto-poky/meta/recipes-core/libxml/libxml2/CVE-2015-7499-2-Detect-incoherency-on-GROW.patch +++ /dev/null @@ -1,43 +0,0 @@ -From 35bcb1d758ed70aa7b257c9c3b3ff55e54e3d0da Mon Sep 17 00:00:00 2001 -From: Daniel Veillard <veillard@redhat.com> -Date: Fri, 20 Nov 2015 15:04:09 +0800 -Subject: [PATCH] Detect incoherency on GROW - -the current pointer to the input has to be between the base and end -if not stop everything we have an internal state error. - -Upstream-Status: Backport - -CVE-2015-7499-2 - -Signed-off-by: Armin Kuster <akuster@mvista.com> - ---- - parser.c | 9 ++++++++- - 1 file changed, 8 insertions(+), 1 deletion(-) - -diff --git a/parser.c b/parser.c -index 1810f99..ab007aa 100644 ---- a/parser.c -+++ b/parser.c -@@ -2075,9 +2075,16 @@ static void xmlGROW (xmlParserCtxtPtr ctxt) { - ((ctxt->input->buf) && (ctxt->input->buf->readcallback != (xmlInputReadCallback) xmlNop)) && - ((ctxt->options & XML_PARSE_HUGE) == 0)) { - xmlFatalErr(ctxt, XML_ERR_INTERNAL_ERROR, "Huge input lookup"); -- ctxt->instate = XML_PARSER_EOF; -+ xmlHaltParser(ctxt); -+ return; - } - xmlParserInputGrow(ctxt->input, INPUT_CHUNK); -+ if ((ctxt->input->cur > ctxt->input->end) || -+ (ctxt->input->cur < ctxt->input->base)) { -+ xmlHaltParser(ctxt); -+ xmlFatalErr(ctxt, XML_ERR_INTERNAL_ERROR, "cur index out of bound"); -+ return; -+ } - if ((ctxt->input->cur != NULL) && (*ctxt->input->cur == 0) && - (xmlParserInputGrow(ctxt->input, INPUT_CHUNK) <= 0)) - xmlPopInput(ctxt); --- -2.3.5 - diff --git a/yocto-poky/meta/recipes-core/libxml/libxml2/CVE-2015-7941-1-Stop-parsing-on-entities-boundaries-errors.patch b/yocto-poky/meta/recipes-core/libxml/libxml2/CVE-2015-7941-1-Stop-parsing-on-entities-boundaries-errors.patch deleted file mode 100644 index 11da9f9bd..000000000 --- a/yocto-poky/meta/recipes-core/libxml/libxml2/CVE-2015-7941-1-Stop-parsing-on-entities-boundaries-errors.patch +++ /dev/null @@ -1,39 +0,0 @@ -From a7dfab7411cbf545f359dd3157e5df1eb0e7ce31 Mon Sep 17 00:00:00 2001 -From: Daniel Veillard <veillard@redhat.com> -Date: Mon, 23 Feb 2015 11:17:35 +0800 -Subject: [PATCH] Stop parsing on entities boundaries errors - -For https://bugzilla.gnome.org/show_bug.cgi?id=744980 - -There are times, like on unterminated entities that it's preferable to -stop parsing, even if that means less error reporting. Entities are -feeding the parser on further processing, and if they are ill defined -then it's possible to get the parser to bug. Also do the same on -Conditional Sections if the input is broken, as the structure of -the document can't be guessed. - -Upstream-Status: Backport - -CVE-2015-7941-1 - -Signed-off-by: Armin Kuster <akuster@mvista.com> - ---- - parser.c | 1 + - 1 file changed, 1 insertion(+) - -diff --git a/parser.c b/parser.c -index a8d1b67..bbe97eb 100644 ---- a/parser.c -+++ b/parser.c -@@ -5658,6 +5658,7 @@ xmlParseEntityDecl(xmlParserCtxtPtr ctxt) { - if (RAW != '>') { - xmlFatalErrMsgStr(ctxt, XML_ERR_ENTITY_NOT_FINISHED, - "xmlParseEntityDecl: entity %s not terminated\n", name); -+ xmlStopParser(ctxt); - } else { - if (input != ctxt->input) { - xmlFatalErrMsg(ctxt, XML_ERR_ENTITY_BOUNDARY, --- -2.3.5 - diff --git a/yocto-poky/meta/recipes-core/libxml/libxml2/CVE-2015-7941-2-Cleanup-conditional-section-error-handling.patch b/yocto-poky/meta/recipes-core/libxml/libxml2/CVE-2015-7941-2-Cleanup-conditional-section-error-handling.patch deleted file mode 100644 index b7bd96053..000000000 --- a/yocto-poky/meta/recipes-core/libxml/libxml2/CVE-2015-7941-2-Cleanup-conditional-section-error-handling.patch +++ /dev/null @@ -1,56 +0,0 @@ -From 9b8512337d14c8ddf662fcb98b0135f225a1c489 Mon Sep 17 00:00:00 2001 -From: Daniel Veillard <veillard@redhat.com> -Date: Mon, 23 Feb 2015 11:29:20 +0800 -Subject: [PATCH] Cleanup conditional section error handling - -For https://bugzilla.gnome.org/show_bug.cgi?id=744980 - -The error handling of Conditional Section also need to be -straightened as the structure of the document can't be -guessed on a failure there and it's better to stop parsing -as further errors are likely to be irrelevant. - -Upstream-Status: Backport - -CVE-2015-7941-2 - -Signed-off-by: Armin Kuster <akuster@mvista.com> - ---- - parser.c | 6 ++++++ - 1 file changed, 6 insertions(+) - -diff --git a/parser.c b/parser.c -index bbe97eb..fe603ac 100644 ---- a/parser.c -+++ b/parser.c -@@ -6770,6 +6770,8 @@ xmlParseConditionalSections(xmlParserCtxtPtr ctxt) { - SKIP_BLANKS; - if (RAW != '[') { - xmlFatalErr(ctxt, XML_ERR_CONDSEC_INVALID, NULL); -+ xmlStopParser(ctxt); -+ return; - } else { - if (ctxt->input->id != id) { - xmlValidityError(ctxt, XML_ERR_ENTITY_BOUNDARY, -@@ -6830,6 +6832,8 @@ xmlParseConditionalSections(xmlParserCtxtPtr ctxt) { - SKIP_BLANKS; - if (RAW != '[') { - xmlFatalErr(ctxt, XML_ERR_CONDSEC_INVALID, NULL); -+ xmlStopParser(ctxt); -+ return; - } else { - if (ctxt->input->id != id) { - xmlValidityError(ctxt, XML_ERR_ENTITY_BOUNDARY, -@@ -6885,6 +6889,8 @@ xmlParseConditionalSections(xmlParserCtxtPtr ctxt) { - - } else { - xmlFatalErr(ctxt, XML_ERR_CONDSEC_INVALID_KEYWORD, NULL); -+ xmlStopParser(ctxt); -+ return; - } - - if (RAW == 0) --- -2.3.5 - diff --git a/yocto-poky/meta/recipes-core/libxml/libxml2/CVE-2015-7942-2-Fix-an-error-in-previous-Conditional-section-patch.patch b/yocto-poky/meta/recipes-core/libxml/libxml2/CVE-2015-7942-2-Fix-an-error-in-previous-Conditional-section-patch.patch deleted file mode 100644 index 34b60362c..000000000 --- a/yocto-poky/meta/recipes-core/libxml/libxml2/CVE-2015-7942-2-Fix-an-error-in-previous-Conditional-section-patch.patch +++ /dev/null @@ -1,35 +0,0 @@ -From 41ac9049a27f52e7a1f3b341f8714149fc88d450 Mon Sep 17 00:00:00 2001 -From: Daniel Veillard <veillard@redhat.com> -Date: Tue, 27 Oct 2015 10:53:44 +0800 -Subject: [PATCH] Fix an error in previous Conditional section patch - -an off by one mistake in the change, led to error on correct -document where the end of the included entity was exactly -the end of the conditional section, leading to regtest failure - -Upstream-Status: Backport - -CVE-2015-7942-2 - -Signed-off-by: Armin Kuster <akuster@mvista.com> - ---- - parser.c | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -diff --git a/parser.c b/parser.c -index b9217ff..d67b300 100644 ---- a/parser.c -+++ b/parser.c -@@ -6916,7 +6916,7 @@ xmlParseConditionalSections(xmlParserCtxtPtr ctxt) { - NULL, NULL); - } - if ((ctxt-> instate != XML_PARSER_EOF) && -- ((ctxt->input->cur + 3) < ctxt->input->end)) -+ ((ctxt->input->cur + 3) <= ctxt->input->end)) - SKIP(3); - } - } --- -2.3.5 - diff --git a/yocto-poky/meta/recipes-core/libxml/libxml2/CVE-2015-7942-Another-variation-of-overflow-in-Conditional-section.patch b/yocto-poky/meta/recipes-core/libxml/libxml2/CVE-2015-7942-Another-variation-of-overflow-in-Conditional-section.patch deleted file mode 100644 index 40082ec07..000000000 --- a/yocto-poky/meta/recipes-core/libxml/libxml2/CVE-2015-7942-Another-variation-of-overflow-in-Conditional-section.patch +++ /dev/null @@ -1,39 +0,0 @@ -From bd0526e66a56e75a18da8c15c4750db8f801c52d Mon Sep 17 00:00:00 2001 -From: Daniel Veillard <veillard@redhat.com> -Date: Fri, 23 Oct 2015 19:02:28 +0800 -Subject: [PATCH] Another variation of overflow in Conditional sections - -Which happen after the previous fix to -https://bugzilla.gnome.org/show_bug.cgi?id=756456 - -But stopping the parser and exiting we didn't pop the intermediary entities -and doing the SKIP there applies on an input which may be too small - -Upstream-Status: Backport - -CVE-2015-7942 - -Signed-off-by: Armin Kuster <akuster@mvista.com> - ---- - parser.c | 4 +++- - 1 file changed, 3 insertions(+), 1 deletion(-) - -diff --git a/parser.c b/parser.c -index a65e4cc..b9217ff 100644 ---- a/parser.c -+++ b/parser.c -@@ -6915,7 +6915,9 @@ xmlParseConditionalSections(xmlParserCtxtPtr ctxt) { - "All markup of the conditional section is not in the same entity\n", - NULL, NULL); - } -- SKIP(3); -+ if ((ctxt-> instate != XML_PARSER_EOF) && -+ ((ctxt->input->cur + 3) < ctxt->input->end)) -+ SKIP(3); - } - } - --- -2.3.5 - diff --git a/yocto-poky/meta/recipes-core/libxml/libxml2/CVE-2015-8241.patch b/yocto-poky/meta/recipes-core/libxml/libxml2/CVE-2015-8241.patch deleted file mode 100644 index 89a46ad17..000000000 --- a/yocto-poky/meta/recipes-core/libxml/libxml2/CVE-2015-8241.patch +++ /dev/null @@ -1,40 +0,0 @@ -From ab2b9a93ff19cedde7befbf2fcc48c6e352b6cbe Mon Sep 17 00:00:00 2001 -From: Hugh Davenport <hugh@allthethings.co.nz> -Date: Tue, 3 Nov 2015 20:40:49 +0800 -Subject: [PATCH] Avoid extra processing of MarkupDecl when EOF - -For https://bugzilla.gnome.org/show_bug.cgi?id=756263 - -One place where ctxt->instate == XML_PARSER_EOF whic was set up -by entity detection issues doesn't get noticed, and even overrided - -Upstream-status: Backport - -https://git.gnome.org/browse/libxml2/commit/?id=ab2b9a93ff19cedde7befbf2fcc48c6e352b6cbe - -CVE: CVE-2015-8241 -Signed-off-by: Armin Kuster <akuster@mvista.com> - ---- - parser.c | 8 ++++++++ - 1 file changed, 8 insertions(+) - -Index: libxml2-2.9.2/parser.c -=================================================================== ---- libxml2-2.9.2.orig/parser.c -+++ libxml2-2.9.2/parser.c -@@ -6999,6 +6999,14 @@ xmlParseMarkupDecl(xmlParserCtxtPtr ctxt - xmlParsePI(ctxt); - } - } -+ -+ /* -+ * detect requirement to exit there and act accordingly -+ * and avoid having instate overriden later on -+ */ -+ if (ctxt->instate == XML_PARSER_EOF) -+ return; -+ - /* - * This is only for internal subset. On external entities, - * the replacement is done before parsing stage diff --git a/yocto-poky/meta/recipes-core/libxml/libxml2/CVE-2015-8317-Fail-parsing-early-on-if-encoding-conversion-failed.patch b/yocto-poky/meta/recipes-core/libxml/libxml2/CVE-2015-8317-Fail-parsing-early-on-if-encoding-conversion-failed.patch deleted file mode 100644 index 59425cbfc..000000000 --- a/yocto-poky/meta/recipes-core/libxml/libxml2/CVE-2015-8317-Fail-parsing-early-on-if-encoding-conversion-failed.patch +++ /dev/null @@ -1,42 +0,0 @@ -From 709a952110e98621c9b78c4f26462a9d8333102e Mon Sep 17 00:00:00 2001 -From: Daniel Veillard <veillard@redhat.com> -Date: Mon, 29 Jun 2015 16:10:26 +0800 -Subject: [PATCH] Fail parsing early on if encoding conversion failed - -For https://bugzilla.gnome.org/show_bug.cgi?id=751631 - -If we fail conversing the current input stream while -processing the encoding declaration of the XMLDecl -then it's safer to just abort there and not try to -report further errors. - -Upstream-Status: Backport - -CVE-2015-8317 - -Signed-off-by: Armin Kuster <akuster@mvista.com> - ---- - parser.c | 6 +++++- - 1 file changed, 5 insertions(+), 1 deletion(-) - -diff --git a/parser.c b/parser.c -index a3a9568..0edd53b 100644 ---- a/parser.c -+++ b/parser.c -@@ -10471,7 +10471,11 @@ xmlParseEncodingDecl(xmlParserCtxtPtr ctxt) { - - handler = xmlFindCharEncodingHandler((const char *) encoding); - if (handler != NULL) { -- xmlSwitchToEncoding(ctxt, handler); -+ if (xmlSwitchToEncoding(ctxt, handler) < 0) { -+ /* failed to convert */ -+ ctxt->errNo = XML_ERR_UNSUPPORTED_ENCODING; -+ return(NULL); -+ } - } else { - xmlFatalErrMsgStr(ctxt, XML_ERR_UNSUPPORTED_ENCODING, - "Unsupported encoding %s\n", encoding); --- -2.3.5 - diff --git a/yocto-poky/meta/recipes-core/libxml/libxml2/CVE-2015-8710.patch b/yocto-poky/meta/recipes-core/libxml/libxml2/CVE-2015-8710.patch deleted file mode 100644 index be06cc22c..000000000 --- a/yocto-poky/meta/recipes-core/libxml/libxml2/CVE-2015-8710.patch +++ /dev/null @@ -1,71 +0,0 @@ -From e724879d964d774df9b7969fc846605aa1bac54c Mon Sep 17 00:00:00 2001 -From: Daniel Veillard <veillard@redhat.com> -Date: Fri, 30 Oct 2015 21:14:55 +0800 -Subject: [PATCH] Fix parsing short unclosed comment uninitialized access - -For https://bugzilla.gnome.org/show_bug.cgi?id=746048 -The HTML parser was too optimistic when processing comments and -didn't check for the end of the stream on the first 2 characters - -Upstream-Status: Backport - -https://git.gnome.org/browse/libxml2/commit/?id=e724879d964d774df9b7969fc846605aa1bac54c - -CVE: CVE-2015-8710 - -Signed-off-by: Armin Kuster <akuster@mvista.com> - ---- - HTMLparser.c | 21 ++++++++++++++------- - 1 file changed, 14 insertions(+), 7 deletions(-) - -Index: libxml2-2.9.2/HTMLparser.c -=================================================================== ---- libxml2-2.9.2.orig/HTMLparser.c -+++ libxml2-2.9.2/HTMLparser.c -@@ -3245,12 +3245,17 @@ htmlParseComment(htmlParserCtxtPtr ctxt) - ctxt->instate = state; - return; - } -+ len = 0; -+ buf[len] = 0; - q = CUR_CHAR(ql); -+ if (!IS_CHAR(q)) -+ goto unfinished; - NEXTL(ql); - r = CUR_CHAR(rl); -+ if (!IS_CHAR(r)) -+ goto unfinished; - NEXTL(rl); - cur = CUR_CHAR(l); -- len = 0; - while (IS_CHAR(cur) && - ((cur != '>') || - (r != '-') || (q != '-'))) { -@@ -3281,18 +3286,20 @@ htmlParseComment(htmlParserCtxtPtr ctxt) - } - } - buf[len] = 0; -- if (!IS_CHAR(cur)) { -- htmlParseErr(ctxt, XML_ERR_COMMENT_NOT_FINISHED, -- "Comment not terminated \n<!--%.50s\n", buf, NULL); -- xmlFree(buf); -- } else { -+ if (IS_CHAR(cur)) { - NEXT; - if ((ctxt->sax != NULL) && (ctxt->sax->comment != NULL) && - (!ctxt->disableSAX)) - ctxt->sax->comment(ctxt->userData, buf); - xmlFree(buf); -+ ctxt->instate = state; -+ return; - } -- ctxt->instate = state; -+ -+unfinished: -+ htmlParseErr(ctxt, XML_ERR_COMMENT_NOT_FINISHED, -+ "Comment not terminated \n<!--%.50s\n", buf, NULL); -+ xmlFree(buf); - } - - /** diff --git a/yocto-poky/meta/recipes-core/libxml/libxml2/ansidecl.patch b/yocto-poky/meta/recipes-core/libxml/libxml2/ansidecl.patch index 2452d780d..1085c680b 100644 --- a/yocto-poky/meta/recipes-core/libxml/libxml2/ansidecl.patch +++ b/yocto-poky/meta/recipes-core/libxml/libxml2/ansidecl.patch @@ -9,17 +9,17 @@ RP 2012/7/10 Upstream-Status: Inappropriate [its really a cmake bug] -Index: libxml2-2.8.0/include/libxml/xmlversion.h.in -=================================================================== ---- libxml2-2.8.0.orig/include/libxml/xmlversion.h.in 2012-07-10 11:51:52.460750573 +0000 -+++ libxml2-2.8.0/include/libxml/xmlversion.h.in 2012-07-10 11:52:41.436749397 +0000 -@@ -401,9 +401,6 @@ - #endif - - #ifdef __GNUC__ +diff --git a/configure.ac b/configure.ac +index 0260281..fdb58e9 100644 +--- a/configure.ac ++++ b/configure.ac +@@ -484 +483,0 @@ AC_CHECK_HEADERS([time.h]) +-AC_CHECK_HEADERS([ansidecl.h]) +diff --git a/include/libxml/xmlversion.h.in b/include/libxml/xmlversion.h.in +index b173be9..d10f975 100644 +--- a/include/libxml/xmlversion.h.in ++++ b/include/libxml/xmlversion.h.in +@@ -413,3 +412,0 @@ XMLPUBFUN void XMLCALL xmlCheckVersion(int version); -#ifdef HAVE_ANSIDECL_H -#include <ansidecl.h> -#endif - - /** - * ATTRIBUTE_UNUSED: diff --git a/yocto-poky/meta/recipes-core/libxml/libxml2/libxml-m4-use-pkgconfig.patch b/yocto-poky/meta/recipes-core/libxml/libxml2/libxml-m4-use-pkgconfig.patch index 0fc84070e..327716561 100644 --- a/yocto-poky/meta/recipes-core/libxml/libxml2/libxml-m4-use-pkgconfig.patch +++ b/yocto-poky/meta/recipes-core/libxml/libxml2/libxml-m4-use-pkgconfig.patch @@ -190,7 +190,7 @@ index 68cd824..5fa0a9b 100644 - LIBS="$ac_save_LIBS" - fi - fi -+ verdep=ifelse([$1], [], [], [>= $1]) ++ verdep=ifelse([$1], [], [], [">= $1"]) + PKG_CHECK_MODULES(XML, [libxml-2.0 $verdep], [$2], [$3]) - XML_CPPFLAGS="" diff --git a/yocto-poky/meta/recipes-core/libxml/libxml2/libxml2-CVE-2014-0191-fix.patch b/yocto-poky/meta/recipes-core/libxml/libxml2/libxml2-CVE-2014-0191-fix.patch deleted file mode 100644 index 1c05ae649..000000000 --- a/yocto-poky/meta/recipes-core/libxml/libxml2/libxml2-CVE-2014-0191-fix.patch +++ /dev/null @@ -1,37 +0,0 @@ -From: Daniel Veillard <veillard@redhat.com> -Date: Tue, 22 Apr 2014 15:30:56 +0800 -Subject: Do not fetch external parameter entities - -Unless explicitely asked for when validating or replacing entities -with their value. Problem pointed out by Daniel Berrange <berrange@redhat.com> - -Upstream-Status: Backport -Reference: https://access.redhat.com/security/cve/CVE-2014-0191 - -Signed-off-by: Daniel Veillard <veillard@redhat.com> -Signed-off-by: Maxin B. John <maxin.john@enea.com> ---- -diff -Naur libxml2-2.9.1-orig/parser.c libxml2-2.9.1/parser.c ---- libxml2-2.9.1-orig/parser.c 2013-04-16 15:39:18.000000000 +0200 -+++ libxml2-2.9.1/parser.c 2014-05-07 13:35:46.883687946 +0200 -@@ -2595,6 +2595,20 @@ - xmlCharEncoding enc; - - /* -+ * Note: external parsed entities will not be loaded, it is -+ * not required for a non-validating parser, unless the -+ * option of validating, or substituting entities were -+ * given. Doing so is far more secure as the parser will -+ * only process data coming from the document entity by -+ * default. -+ */ -+ if ((entity->etype == XML_EXTERNAL_PARAMETER_ENTITY) && -+ ((ctxt->options & XML_PARSE_NOENT) == 0) && -+ ((ctxt->options & XML_PARSE_DTDVALID) == 0) && -+ (ctxt->validate == 0)) -+ return; -+ -+ /* - * handle the extra spaces added before and after - * c.f. http://www.w3.org/TR/REC-xml#as-PE - * this is done independently. diff --git a/yocto-poky/meta/recipes-core/libxml/libxml2_2.9.2.bb b/yocto-poky/meta/recipes-core/libxml/libxml2_2.9.2.bb deleted file mode 100644 index 79a395cea..000000000 --- a/yocto-poky/meta/recipes-core/libxml/libxml2_2.9.2.bb +++ /dev/null @@ -1,11 +0,0 @@ -require libxml2.inc - -SRC_URI += "http://www.w3.org/XML/Test/xmlts20080827.tar.gz;name=testtar \ - file://72a46a519ce7326d9a00f0b6a7f2a8e958cd1675.patch \ - file://0001-threads-Define-pthread-definitions-for-glibc-complia.patch \ - " - -SRC_URI[libtar.md5sum] = "9e6a9aca9d155737868b3dc5fd82f788" -SRC_URI[libtar.sha256sum] = "5178c30b151d044aefb1b08bf54c3003a0ac55c59c866763997529d60770d5bc" -SRC_URI[testtar.md5sum] = "ae3d1ebe000a3972afa104ca7f0e1b4a" -SRC_URI[testtar.sha256sum] = "96151685cec997e1f9f3387e3626d61e6284d4d6e66e0e440c209286c03e9cc7" diff --git a/yocto-poky/meta/recipes-core/libxml/libxml2.inc b/yocto-poky/meta/recipes-core/libxml/libxml2_2.9.3.bb index 310d5bbc5..9c9873fbd 100644 --- a/yocto-poky/meta/recipes-core/libxml/libxml2.inc +++ b/yocto-poky/meta/recipes-core/libxml/libxml2_2.9.3.bb @@ -9,36 +9,24 @@ LIC_FILES_CHKSUM = "file://Copyright;md5=2044417e2e5006b65a8b9067b683fcf1 \ file://list.c;beginline=4;endline=13;md5=cdbfa3dee51c099edb04e39f762ee907 \ file://trio.c;beginline=5;endline=14;md5=6c025753c86d958722ec76e94cae932e" -DEPENDS =+ "zlib" +DEPENDS = "zlib" SRC_URI = "ftp://xmlsoft.org/libxml2/libxml2-${PV}.tar.gz;name=libtar \ + http://www.w3.org/XML/Test/xmlts20080827.tar.gz;name=testtar \ file://libxml-64bit.patch \ file://ansidecl.patch \ file://runtest.patch \ file://run-ptest \ - file://libxml2-CVE-2014-0191-fix.patch \ file://python-sitepackages-dir.patch \ file://libxml-m4-use-pkgconfig.patch \ file://configure.ac-fix-cross-compiling-warning.patch \ - file://0001-CVE-2015-1819-Enforce-the-reader-to-run-in-constant-.patch \ - file://CVE-2015-7941-1-Stop-parsing-on-entities-boundaries-errors.patch \ - file://CVE-2015-7941-2-Cleanup-conditional-section-error-handling.patch \ - file://CVE-2015-8317-Fail-parsing-early-on-if-encoding-conversion-failed.patch \ - file://CVE-2015-7942-Another-variation-of-overflow-in-Conditional-section.patch \ - file://CVE-2015-7942-2-Fix-an-error-in-previous-Conditional-section-patch.patch \ - file://0001-CVE-2015-8035-Fix-XZ-compression-support-loop.patch \ - file://CVE-2015-7498-Avoid-processing-entities-after-encoding-conversion-.patch \ - file://0001-CVE-2015-7497-Avoid-an-heap-buffer-overflow-in-xmlDi.patch \ - file://CVE-2015-7499-1-Add-xmlHaltParser-to-stop-the-parser.patch \ - file://CVE-2015-7499-2-Detect-incoherency-on-GROW.patch \ - file://0001-Fix-a-bug-on-name-parsing-at-the-end-of-current-inpu.patch \ - file://0001-CVE-2015-7500-Fix-memory-access-error-due-to-incorre.patch \ - file://0001-CVE-2015-8242-Buffer-overead-with-HTML-parser-in-pus.patch \ - file://0001-CVE-2015-5312-Another-entity-expansion-issue.patch \ - file://CVE-2015-8241.patch \ - file://CVE-2015-8710.patch \ " +SRC_URI[libtar.md5sum] = "daece17e045f1c107610e137ab50c179" +SRC_URI[libtar.sha256sum] = "4de9e31f46b44d34871c22f54bfc54398ef124d6f7cafb1f4a5958fbcd3ba12d" +SRC_URI[testtar.md5sum] = "ae3d1ebe000a3972afa104ca7f0e1b4a" +SRC_URI[testtar.sha256sum] = "96151685cec997e1f9f3387e3626d61e6284d4d6e66e0e440c209286c03e9cc7" + BINCONFIG = "${bindir}/xml2-config" inherit autotools pkgconfig binconfig-disabled pythonnative ptest @@ -47,32 +35,25 @@ RDEPENDS_${PN}-ptest += "python-core" RDEPENDS_${PN}-python += "python-core" -RDEPENDS_${PN}-ptest_append_libc-glibc += "glibc-gconv-ebcdic-us glibc-gconv-ibm1141" - -# We don't DEPEND on binutils for ansidecl.h so ensure we don't use the header -do_configure_prepend () { - sed -i -e '/.*ansidecl.h.*/d' ${S}/configure.ac -} +RDEPENDS_${PN}-ptest_append_libc-glibc = " glibc-gconv-ebcdic-us glibc-gconv-ibm1141" export PYTHON_SITE_PACKAGES="${PYTHON_SITEPACKAGES_DIR}" PACKAGECONFIG ??= "python" - PACKAGECONFIG[python] = "--with-python=${PYTHON},--without-python,python" + # WARNING: zlib is require for RPM use EXTRA_OECONF = "--without-debug --without-legacy --with-catalog --without-docbook --with-c14n --without-lzma --with-fexceptions" EXTRA_OECONF_class-native = "--without-legacy --without-docbook --with-c14n --without-lzma --with-zlib" EXTRA_OECONF_class-nativesdk = "--without-legacy --without-docbook --with-c14n --without-lzma --with-zlib" EXTRA_OECONF_linuxstdbase = "--with-debug --with-legacy --with-docbook --with-c14n --without-lzma --with-zlib" -# required for pythong binding +# required for python binding export HOST_SYS export BUILD_SYS export STAGING_LIBDIR export STAGING_INCDIR -export LDFLAGS += "-ldl" - python populate_packages_prepend () { # autonamer would call this libxml2-2, but we don't want that if d.getVar('DEBIAN_NAMES', True): @@ -81,14 +62,13 @@ python populate_packages_prepend () { PACKAGES += "${PN}-utils ${PN}-python" -FILES_${PN}-dbg += "${PYTHON_SITEPACKAGES_DIR}/.debug" FILES_${PN}-staticdev += "${PYTHON_SITEPACKAGES_DIR}/*.a" FILES_${PN}-dev += "${libdir}/xml2Conf.sh ${libdir}/cmake/*" FILES_${PN}-utils += "${bindir}/*" FILES_${PN}-python += "${PYTHON_SITEPACKAGES_DIR}" do_install_ptest () { - cp -r ${WORKDIR}/xmlconf ${D}${PTEST_PATH} + cp -r ${WORKDIR}/xmlconf ${D}${PTEST_PATH} } BBCLASSEXTEND = "native nativesdk" diff --git a/yocto-poky/meta/recipes-core/meta/buildtools-tarball.bb b/yocto-poky/meta/recipes-core/meta/buildtools-tarball.bb index 840434ccd..e9578cac0 100644 --- a/yocto-poky/meta/recipes-core/meta/buildtools-tarball.bb +++ b/yocto-poky/meta/recipes-core/meta/buildtools-tarball.bb @@ -23,9 +23,10 @@ TOOLCHAIN_HOST_TASK ?= "\ nativesdk-make \ nativesdk-wget \ nativesdk-ca-certificates \ + nativesdk-texinfo \ " -SDK_PACKAGE_ARCHS =+ "buildtools-dummy-${SDKPKGSUFFIX}" +SDK_PACKAGE_ARCHS += "buildtools-dummy-${SDKPKGSUFFIX}" TOOLCHAIN_OUTPUTNAME ?= "${SDK_NAME}-buildtools-nativesdk-standalone-${DISTRO_VERSION}" @@ -56,4 +57,16 @@ create_sdk_files_append () { toolchain_create_sdk_version ${SDK_OUTPUT}/${SDKPATH}/version-${SDK_SYS} echo 'export GIT_SSL_CAINFO="${SDKPATHNATIVE}${sysconfdir}/ssl/certs/ca-certificates.crt"' >>$script + + if [ "${SDKMACHINE}" = "i686" ]; then + echo 'export NO32LIBS="0"' >>$script + echo 'echo "$BB_ENV_EXTRAWHITE" | grep -q "NO32LIBS"' >>$script + echo '[ $? != 0 ] && export BB_ENV_EXTRAWHITE="NO32LIBS $BB_ENV_EXTRAWHITE"' >>$script + fi } + +# buildtools-tarball doesn't need config site +TOOLCHAIN_NEED_CONFIGSITE_CACHE = "" + +# The recipe doesn't need any default deps +INHIBIT_DEFAULT_DEPS = "1" diff --git a/yocto-poky/meta/recipes-core/meta/meta-world-pkgdata.bb b/yocto-poky/meta/recipes-core/meta/meta-world-pkgdata.bb new file mode 100644 index 000000000..3c5db5001 --- /dev/null +++ b/yocto-poky/meta/recipes-core/meta/meta-world-pkgdata.bb @@ -0,0 +1,50 @@ +SUMMARY = "Pulls in pkgdata for world" +LICENSE = "MIT" +INHIBIT_DEFAULT_DEPS = "1" + +addtask do_allpackagedata before do_build +do_allpackagedata() { + : +} +do_allpackagedata[recrdeptask] = "do_packagedata do_allpackagedata" +do_allpackagedata[noexec] = "1" + +WORLD_PKGDATADIR = "${D}/world-pkgdata" + +addtask do_collect_packagedata after do_allpackagedata +SSTATETASKS += "do_collect_packagedata" +do_collect_packagedata[sstate-inputdirs] = "${WORLD_PKGDATADIR}" +do_collect_packagedata[sstate-outputdirs] = "${STAGING_DIR_HOST}/world-pkgdata" + +python do_collect_packagedata() { + import oe.copy_buildsystem + outdir = os.path.join(d.getVar('WORLD_PKGDATADIR', True)) + bb.utils.mkdirhier(outdir) + sigfile = os.path.join(outdir, 'locked-sigs-pkgdata.inc') + oe.copy_buildsystem.generate_locked_sigs(sigfile, d) +} + +do_fetch[noexec] = "1" +do_unpack[noexec] = "1" +do_patch[noexec] = "1" +do_configure[noexec] = "1" +do_compile[noexec] = "1" +do_install[noexec] = "1" + +do_configure[deptask] = "" + +WORLD_PKGDATA_EXCLUDE ?= "" + +python calculate_extra_depends() { + exclude = '${WORLD_PKGDATA_EXCLUDE}'.split() + for p in world_target: + if p == self_pn: + continue + + if p in exclude: + continue + + deps.append(p) +} + +PACKAGES = "" diff --git a/yocto-poky/meta/recipes-core/meta/nativesdk-buildtools-perl-dummy.bb b/yocto-poky/meta/recipes-core/meta/nativesdk-buildtools-perl-dummy.bb index 904173489..2b9611160 100644 --- a/yocto-poky/meta/recipes-core/meta/nativesdk-buildtools-perl-dummy.bb +++ b/yocto-poky/meta/recipes-core/meta/nativesdk-buildtools-perl-dummy.bb @@ -4,7 +4,7 @@ LIC_FILES_CHKSUM = "file://${COMMON_LICENSE_DIR}/MIT;md5=0835ade698e0bcf8506ecda inherit allarch -PR = "r1" +PR = "r2" python() { # Put the package somewhere separate to ensure it's never used except @@ -20,7 +20,8 @@ PERLPACKAGES = "nativesdk-perl \ ALLOW_EMPTY_${PN} = "1" python populate_packages_prepend() { - d.appendVar('RPROVIDES_${PN}', '${PERLPACKAGES}') - d.appendVar('RCONFLICTS_${PN}', '${PERLPACKAGES}') + d.appendVar(d.expand('RPROVIDES_${PN}'), '${PERLPACKAGES}') + d.appendVar(d.expand('RCONFLICTS_${PN}'), '${PERLPACKAGES}') + d.appendVar(d.expand('RREPLACES_${PN}'), '${PERLPACKAGES}') } diff --git a/yocto-poky/meta/recipes-core/meta/signing-keys.bb b/yocto-poky/meta/recipes-core/meta/signing-keys.bb index cc401f3b6..e843301b2 100644 --- a/yocto-poky/meta/recipes-core/meta/signing-keys.bb +++ b/yocto-poky/meta/recipes-core/meta/signing-keys.bb @@ -3,43 +3,75 @@ DESCRIPTION = "Make public keys of the signing keys available" LICENSE = "MIT" -PACKAGES = "" - -do_fetch[noexec] = "1" -do_unpack[noexec] = "1" -do_patch[noexec] = "1" -do_configure[noexec] = "1" -do_compile[noexec] = "1" -do_install[noexec] = "1" -do_package[noexec] = "1" -do_packagedata[noexec] = "1" -do_package_write_ipk[noexec] = "1" -do_package_write_rpm[noexec] = "1" -do_package_write_deb[noexec] = "1" -do_populate_sysroot[noexec] = "1" +LIC_FILES_CHKSUM = "file://${COREBASE}/LICENSE;md5=4d92cd373abda3937c2bc47fbc49d690 \ + file://${COREBASE}/meta/COPYING.MIT;md5=3da9cfbcb788c80a0384361b4de20420" + + +inherit allarch deploy EXCLUDE_FROM_WORLD = "1" +INHIBIT_DEFAULT_DEPS = "1" + +PACKAGES =+ "${PN}-ipk ${PN}-rpm ${PN}-packagefeed" + +FILES_${PN}-rpm = "${sysconfdir}/pki/rpm-gpg" +FILES_${PN}-ipk = "${sysconfdir}/pki/ipk-gpg" +FILES_${PN}-packagefeed = "${sysconfdir}/pki/packagefeed-gpg" + +python do_get_public_keys () { + from oe.gpg_sign import get_signer -def export_gpg_pubkey(d, keyid, path): - import bb - gpg_bin = d.getVar('GPG_BIN', True) or \ - bb.utils.which(os.getenv('PATH'), "gpg") - cmd = '%s --batch --yes --export --armor -o %s %s' % \ - (gpg_bin, path, keyid) - status, output = oe.utils.getstatusoutput(cmd) - if status: - raise bb.build.FuncFailed('Failed to export gpg public key (%s): %s' % - (keyid, output)) - -python do_export_public_keys () { if d.getVar("RPM_SIGN_PACKAGES", True): # Export public key of the rpm signing key - export_gpg_pubkey(d, d.getVar("RPM_GPG_NAME", True), - d.getVar('RPM_GPG_PUBKEY', True)) + signer = get_signer(d, d.getVar('RPM_GPG_BACKEND', True)) + signer.export_pubkey(os.path.join(d.expand('${B}'), 'rpm-key'), + d.getVar('RPM_GPG_NAME', True)) + + if d.getVar("IPK_SIGN_PACKAGES", True): + # Export public key of the ipk signing key + signer = get_signer(d, d.getVar('IPK_GPG_BACKEND', True)) + signer.export_pubkey(os.path.join(d.expand('${B}'), 'ipk-key'), + d.getVar('IPK_GPG_NAME', True)) if d.getVar('PACKAGE_FEED_SIGN', True) == '1': # Export public key of the feed signing key - export_gpg_pubkey(d, d.getVar("PACKAGE_FEED_GPG_NAME", True), - d.getVar('PACKAGE_FEED_GPG_PUBKEY', True)) + signer = get_signer(d, d.getVar('PACKAGE_FEED_GPG_BACKEND', True)) + signer.export_pubkey(os.path.join(d.expand('${B}'), 'pf-key'), + d.getVar('PACKAGE_FEED_GPG_NAME', True)) +} +do_get_public_keys[cleandirs] = "${B}" +addtask get_public_keys before do_install + +do_install () { + if [ -f "${B}/rpm-key" ]; then + install -D -m 0644 "${B}/rpm-key" "${D}${sysconfdir}/pki/rpm-gpg/RPM-GPG-KEY-${DISTRO_VERSION}" + fi + if [ -f "${B}/ipk-key" ]; then + install -D -m 0644 "${B}/ipk-key" "${D}${sysconfdir}/pki/ipk-gpg/IPK-GPG-KEY-${DISTRO_VERSION}" + fi + if [ -f "${B}/pf-key" ]; then + install -D -m 0644 "${B}/pf-key" "${D}${sysconfdir}/pki/packagefeed-gpg/PACKAGEFEED-GPG-KEY-${DISTRO_VERSION}" + fi +} + +sysroot_stage_all_append () { + sysroot_stage_dir ${D}${sysconfdir}/pki ${SYSROOT_DESTDIR}${sysconfdir}/pki +} + +do_deploy () { + if [ -f "${B}/rpm-key" ]; then + install -D -m 0644 "${B}/rpm-key" "${DEPLOYDIR}/RPM-GPG-KEY-${DISTRO_VERSION}" + fi + if [ -f "${B}/ipk-key" ]; then + install -D -m 0644 "${B}/ipk-key" "${DEPLOYDIR}/IPK-GPG-KEY-${DISTRO_VERSION}" + fi + if [ -f "${B}/pf-key" ]; then + install -D -m 0644 "${B}/pf-key" "${DEPLOYDIR}/PACKAGEFEED-GPG-KEY-${DISTRO_VERSION}" + fi } -addtask do_export_public_keys before do_build +do_deploy[sstate-outputdirs] = "${DEPLOY_DIR_RPM}" +# cleandirs should possibly be in deploy.bbclass but we need it +do_deploy[cleandirs] = "${DEPLOYDIR}" +# clear stamp-extra-info since MACHINE is normally put there by deploy.bbclass +do_deploy[stamp-extra-info] = "" +addtask deploy after do_get_public_keys diff --git a/yocto-poky/meta/recipes-core/meta/uninative-tarball.bb b/yocto-poky/meta/recipes-core/meta/uninative-tarball.bb index 21f3bd985..a983e42c6 100644 --- a/yocto-poky/meta/recipes-core/meta/uninative-tarball.bb +++ b/yocto-poky/meta/recipes-core/meta/uninative-tarball.bb @@ -5,15 +5,18 @@ LIC_FILES_CHKSUM = "file://${COREBASE}/LICENSE;md5=4d92cd373abda3937c2bc47fbc49d TOOLCHAIN_TARGET_TASK = "" +# ibm850 - mcopy from mtools +# iso8859-1 - guile TOOLCHAIN_HOST_TASK = "\ nativesdk-glibc \ nativesdk-glibc-gconv-ibm850 \ + nativesdk-glibc-gconv-iso8859-1 \ nativesdk-patchelf \ " INHIBIT_DEFAULT_DEPS = "1" -TOOLCHAIN_OUTPUTNAME ?= "${BUILD_ARCH}-nativesdk-libc" +TOOLCHAIN_OUTPUTNAME ?= "${SDK_ARCH}-nativesdk-libc" RDEPENDS = "${TOOLCHAIN_HOST_TASK}" @@ -43,9 +46,11 @@ fakeroot create_sdk_files() { fakeroot tar_sdk() { mkdir -p ${SDK_DEPLOY} cd ${SDK_OUTPUT}/${SDKPATH} - mv sysroots/${SDK_SYS} ./${BUILD_SYS} + + DEST="./${SDK_ARCH}-${SDK_OS}" + mv sysroots/${SDK_SYS} $DEST rm sysroots -rf - patchelf --set-interpreter ${@''.join('a' for n in xrange(1024))} ./${BUILD_SYS}/usr/bin/patchelf - mv ./${BUILD_SYS}/usr/bin/patchelf ./${BUILD_SYS}/usr/bin/patchelf-uninative + patchelf --set-interpreter ${@''.join('a' for n in xrange(1024))} $DEST/usr/bin/patchelf + mv $DEST/usr/bin/patchelf $DEST/usr/bin/patchelf-uninative tar ${SDKTAROPTS} -c -j --file=${SDK_DEPLOY}/${TOOLCHAIN_OUTPUTNAME}.tar.bz2 . } diff --git a/yocto-poky/meta/recipes-core/musl/files/0001-Make-dynamic-linker-a-relative-symlink-to-libc.patch b/yocto-poky/meta/recipes-core/musl/files/0001-Make-dynamic-linker-a-relative-symlink-to-libc.patch new file mode 100644 index 000000000..5490b1cba --- /dev/null +++ b/yocto-poky/meta/recipes-core/musl/files/0001-Make-dynamic-linker-a-relative-symlink-to-libc.patch @@ -0,0 +1,34 @@ +From 94c0b97b62125d8bbc92dce0694e387d5b2ad181 Mon Sep 17 00:00:00 2001 +From: Khem Raj <raj.khem@gmail.com> +Date: Sun, 10 Jan 2016 12:14:02 -0800 +Subject: [PATCH] Make dynamic linker a relative symlink to libc + +absolute symlink into $(libdir) fails to load in a cross build +environment, especially when executing qemu in usermode to run target +applications, which cross build systems often do, since not everything +can be computed during cross builds, qemu in usermode often comes to aid +in such situations to feed into cross builds. + +Signed-off-by: Khem Raj <raj.khem@gmail.com> +--- +Upstream-Status: Pending + + Makefile | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/Makefile b/Makefile +index b2226fa..0d71f7f 100644 +--- a/Makefile ++++ b/Makefile +@@ -189,7 +189,7 @@ $(DESTDIR)$(includedir)/%: include/% + $(INSTALL) -D -m 644 $< $@ + + $(DESTDIR)$(LDSO_PATHNAME): $(DESTDIR)$(libdir)/libc.so +- $(INSTALL) -D -l $(libdir)/libc.so $@ || true ++ $(INSTALL) -D -l ..$(libdir)/libc.so $@ || true + + install-libs: $(ALL_LIBS:lib/%=$(DESTDIR)$(libdir)/%) $(if $(SHARED_LIBS),$(DESTDIR)$(LDSO_PATHNAME),) + +-- +2.7.0 + diff --git a/yocto-poky/meta/recipes-core/musl/musl.inc b/yocto-poky/meta/recipes-core/musl/musl.inc new file mode 100644 index 000000000..d27867f75 --- /dev/null +++ b/yocto-poky/meta/recipes-core/musl/musl.inc @@ -0,0 +1,26 @@ +# Copyright (C) 2014 Khem Raj <raj.khem@gmail.com> +# Released under the MIT license (see COPYING.MIT for the terms) + +SUMMARY = "An implementation of the standard library for Linux-based systems" +DESCRIPTION = "A new standard library to power a new generation of Linux-based devices. \ +musl is lightweight, fast, simple, free, and strives to be correct in the sense of \ +standards-conformance and safety." + +HOMEPAGE = "http://www.musl-libc.org/" +LICENSE = "MIT" +SECTION = "libs" +LIC_FILES_CHKSUM = "file://COPYRIGHT;md5=082411391b4d1ace0d30f4c84317cc05" + +PATH_prepend = "${STAGING_BINDIR_TOOLCHAIN}.${STAGINGCC}:" +TOOLCHAIN_OPTIONS = " --sysroot=${STAGING_DIR_TCBOOTSTRAP}" + +INHIBIT_DEFAULT_DEPS = "1" + +STAGINGCC = "gcc-cross-initial-${TARGET_ARCH}" +STAGINGCC_class-nativesdk = "gcc-crosssdk-initial-${TARGET_ARCH}" + + +FILES_SOLIBSDEV = "" +FILES_${PN} += "${libdir}/lib*${SOLIBSDEV}" +INSANE_SKIP_${PN} = "dev-so" + diff --git a/yocto-poky/meta/recipes-core/musl/musl_git.bb b/yocto-poky/meta/recipes-core/musl/musl_git.bb new file mode 100644 index 000000000..d4f98191f --- /dev/null +++ b/yocto-poky/meta/recipes-core/musl/musl_git.bb @@ -0,0 +1,61 @@ +# Copyright (C) 2014 Khem Raj <raj.khem@gmail.com> +# Released under the MIT license (see COPYING.MIT for the terms) + +require musl.inc + +SRCREV = "5978eb703ce0e64dd778a88c1ffffb76fe5e2202" + +PV = "1.1.14+git${SRCPV}" + +# mirror is at git://github.com/kraj/musl.git + +SRC_URI = "git://git.musl-libc.org/musl \ + file://0001-Make-dynamic-linker-a-relative-symlink-to-libc.patch \ + " + +S = "${WORKDIR}/git" + +PROVIDES += "virtual/libc virtual/${TARGET_PREFIX}libc-for-gcc virtual/libiconv virtual/libintl" + +DEPENDS = "virtual/${TARGET_PREFIX}binutils \ + virtual/${TARGET_PREFIX}gcc-initial \ + libgcc-initial \ + linux-libc-headers \ + bsd-headers \ + " + +export CROSS_COMPILE="${TARGET_PREFIX}" + +EXTRA_OEMAKE = "" + +LDFLAGS += "-Wl,-soname,libc.so" + +CONFIGUREOPTS = " \ + --prefix=${prefix} \ + --exec-prefix=${exec_prefix} \ + --bindir=${bindir} \ + --libdir=${libdir} \ + --includedir=${includedir} \ + --syslibdir=${base_libdir} \ +" + +do_configure() { + ${S}/configure ${CONFIGUREOPTS} +} + +do_compile() { + oe_runmake +} + +do_install() { + oe_runmake install DESTDIR='${D}' + + install -d ${D}${bindir} + ln -s ../../${libdir}/libc.so ${D}${bindir}/ldd +} + +RDEPENDS_${PN}-dev += "linux-libc-headers-dev bsd-headers-dev" +RPROVIDES_${PN}-dev += "libc-dev virtual-libc-dev" +RPROVIDES_${PN} += "ldd libsegfault rtld(GNU_HASH)" + +LEAD_SONAME = "libc.so" diff --git a/yocto-poky/meta/recipes-core/ncurses/ncurses-5.9/config.cache b/yocto-poky/meta/recipes-core/ncurses/files/config.cache index 6a9217d5b..6a9217d5b 100644 --- a/yocto-poky/meta/recipes-core/ncurses/ncurses-5.9/config.cache +++ b/yocto-poky/meta/recipes-core/ncurses/files/config.cache diff --git a/yocto-poky/meta/recipes-core/ncurses/ncurses-5.9/tic-hang.patch b/yocto-poky/meta/recipes-core/ncurses/files/tic-hang.patch index cba89d26f..cba89d26f 100644 --- a/yocto-poky/meta/recipes-core/ncurses/ncurses-5.9/tic-hang.patch +++ b/yocto-poky/meta/recipes-core/ncurses/files/tic-hang.patch diff --git a/yocto-poky/meta/recipes-core/ncurses/ncurses.inc b/yocto-poky/meta/recipes-core/ncurses/ncurses.inc index ffd80ee7c..ff0117b82 100644 --- a/yocto-poky/meta/recipes-core/ncurses/ncurses.inc +++ b/yocto-poky/meta/recipes-core/ncurses/ncurses.inc @@ -6,14 +6,13 @@ LIC_FILES_CHKSUM = "file://ncurses/base/version.c;beginline=1;endline=27;md5=cbc SECTION = "libs" DEPENDS = "ncurses-native" DEPENDS_class-native = "" -INC_PR = "r15" -BINCONFIG = "${bindir}/ncurses-config" +BINCONFIG = "${bindir}/ncurses5-config ${bindir}/ncursesw5-config" inherit autotools binconfig-disabled multilib_header pkgconfig # Upstream has useful patches at times at ftp://invisible-island.net/ncurses/ -SRC_URI = "ftp://invisible-island.net/${BPN}/current/${BP}-${REVISION}.tgz" +SRC_URI = "git://anonscm.debian.org/collab-maint/ncurses.git" EXTRA_AUTORECONF = "-I m4" CONFIG_SITE =+ "${WORKDIR}/config.cache" @@ -146,9 +145,14 @@ do_test() { # Split original _install_opts to two parts. # One is the options to install contents, the other is the parameters \ # when running command "make install" -_install_opts = "\ - install.libs install.includes install.man \ -" +# Note that install.libs will also implicitly install header files, +# so we do not need to explicitly specify install.includes. +# Doing so could in fact result in a race condition, as both targets +# (install.libs and install.includes) would install the same headers +# at the same time + +_install_opts = " install.libs install.man " + _install_cfgs = "\ DESTDIR='${D}' \ PKG_CONFIG_LIBDIR='${libdir}/pkgconfig' \ @@ -265,8 +269,8 @@ BBCLASSEXTEND = "native nativesdk" PACKAGES += " \ ${PN}-tools \ - ${PN}-terminfo \ ${PN}-terminfo-base \ + ${PN}-terminfo \ " FILES_${PN} = "\ @@ -285,8 +289,8 @@ FILES_${PN}-tools = "\ ${bindir}/infotocap \ ${bindir}/captoinfo \ ${bindir}/infocmp \ - ${bindir}/clear${@['', '.${BPN\x7d']['${CLASSOVERRIDE}' == 'class-target']} \ - ${bindir}/reset${@['', '.${BPN\x7d']['${CLASSOVERRIDE}' == 'class-target']} \ + ${bindir}/clear${@['', '.${BPN}']['${CLASSOVERRIDE}' == 'class-target']} \ + ${bindir}/reset${@['', '.${BPN}']['${CLASSOVERRIDE}' == 'class-target']} \ ${bindir}/tack \ ${bindir}/tabs \ " diff --git a/yocto-poky/meta/recipes-core/ncurses/ncurses_5.9.bb b/yocto-poky/meta/recipes-core/ncurses/ncurses_5.9.bb deleted file mode 100644 index 54d27a951..000000000 --- a/yocto-poky/meta/recipes-core/ncurses/ncurses_5.9.bb +++ /dev/null @@ -1,12 +0,0 @@ -require ncurses.inc - -REVISION = "20150329" - -PR = "${INC_PR}.1" - -SRC_URI += "file://tic-hang.patch \ - file://config.cache \ -" -S = "${WORKDIR}/${BP}-${REVISION}" -SRC_URI[md5sum] = "cee991d09e69e60ebedef424804c52d4" -SRC_URI[sha256sum] = "5b64f40e4dce73e3aa83d15bd9257c6eff8790ec41150f0938bd87c0eb75828f" diff --git a/yocto-poky/meta/recipes-core/ncurses/ncurses_6.0+20160213.bb b/yocto-poky/meta/recipes-core/ncurses/ncurses_6.0+20160213.bb new file mode 100644 index 000000000..0d56481a5 --- /dev/null +++ b/yocto-poky/meta/recipes-core/ncurses/ncurses_6.0+20160213.bb @@ -0,0 +1,10 @@ +require ncurses.inc + +SRC_URI += "file://tic-hang.patch \ + file://config.cache \ +" +# commit id corresponds to the revision in package version +SRCREV = "a25949ff653ac5ae7a204381a3ebfd800feeaa01" +S = "${WORKDIR}/git" +EXTRA_OECONF += "--with-abi-version=5" +UPSTREAM_CHECK_GITTAGREGEX = "(?P<pver>\d+(\.\d+)+(\+\d+)*)" diff --git a/yocto-poky/meta/recipes-core/netbase/netbase/hosts b/yocto-poky/meta/recipes-core/netbase/netbase/hosts index 2f332451b..b94f414d5 100644 --- a/yocto-poky/meta/recipes-core/netbase/netbase/hosts +++ b/yocto-poky/meta/recipes-core/netbase/netbase/hosts @@ -1,2 +1,8 @@ 127.0.0.1 localhost.localdomain localhost +# The following lines are desirable for IPv6 capable hosts +::1 localhost ip6-localhost ip6-loopback +fe00::0 ip6-localnet +ff00::0 ip6-mcastprefix +ff02::1 ip6-allnodes +ff02::2 ip6-allrouters diff --git a/yocto-poky/meta/recipes-core/os-release/os-release.bb b/yocto-poky/meta/recipes-core/os-release/os-release.bb index c690b82b2..f519addd8 100644 --- a/yocto-poky/meta/recipes-core/os-release/os-release.bb +++ b/yocto-poky/meta/recipes-core/os-release/os-release.bb @@ -23,28 +23,26 @@ PRETTY_NAME = "${DISTRO_NAME} ${VERSION}" BUILD_ID ?= "${DATETIME}" BUILD_ID[vardepsexclude] = "DATETIME" +def sanitise_version(ver): + # VERSION_ID should be (from os-release(5)): + # lower-case string (mostly numeric, no spaces or other characters + # outside of 0-9, a-z, ".", "_" and "-") + ret = ver.replace('+', '-').replace(' ','_') + return ret.lower() + python do_compile () { import shutil with open(d.expand('${B}/os-release'), 'w') as f: for field in d.getVar('OS_RELEASE_FIELDS', True).split(): value = d.getVar(field, True) + if value and field == 'VERSION_ID': + value = sanitise_version(value) if value: - f.write('{0}={1}\n'.format(field, value)) - if d.getVar('RPM_SIGN_PACKAGES', True) == '1': - rpm_gpg_pubkey = d.getVar('RPM_GPG_PUBKEY', True) - bb.utils.mkdirhier('${B}/rpm-gpg') - distro_version = d.getVar('DISTRO_VERSION', True) or "oe.0" - shutil.copy2(rpm_gpg_pubkey, d.expand('${B}/rpm-gpg/RPM-GPG-KEY-%s' % distro_version)) + f.write('{0}="{1}"\n'.format(field, value)) } do_compile[vardeps] += "${OS_RELEASE_FIELDS}" -do_compile[depends] += "signing-keys:do_export_public_keys" do_install () { install -d ${D}${sysconfdir} install -m 0644 os-release ${D}${sysconfdir}/ - - if [ -d "rpm-gpg" ]; then - install -d "${D}${sysconfdir}/pki" - cp -r "rpm-gpg" "${D}${sysconfdir}/pki/" - fi } diff --git a/yocto-poky/meta/recipes-core/packagegroups/packagegroup-core-boot.bb b/yocto-poky/meta/recipes-core/packagegroups/packagegroup-core-boot.bb index 09f537372..bac93b89b 100644 --- a/yocto-poky/meta/recipes-core/packagegroups/packagegroup-core-boot.bb +++ b/yocto-poky/meta/recipes-core/packagegroups/packagegroup-core-boot.bb @@ -24,7 +24,7 @@ VIRTUAL-RUNTIME_init_manager ?= "sysvinit" VIRTUAL-RUNTIME_initscripts ?= "initscripts" VIRTUAL-RUNTIME_keymaps ?= "keymaps" -SYSVINIT_SCRIPTS = "${@bb.utils.contains('MACHINE_FEATURES', 'rtc', 'busybox-hwclock', '', d)} \ +SYSVINIT_SCRIPTS = "${@bb.utils.contains('MACHINE_FEATURES', 'rtc', '${VIRTUAL-RUNTIME_base-utils-hwclock}', '', d)} \ modutils-initscripts \ init-ifupdown \ ${VIRTUAL-RUNTIME_initscripts} \ @@ -33,7 +33,7 @@ SYSVINIT_SCRIPTS = "${@bb.utils.contains('MACHINE_FEATURES', 'rtc', 'busybox-hwc RDEPENDS_${PN} = "\ base-files \ base-passwd \ - busybox \ + ${VIRTUAL-RUNTIME_base-utils} \ ${@bb.utils.contains("DISTRO_FEATURES", "sysvinit", "${SYSVINIT_SCRIPTS}", "", d)} \ ${@bb.utils.contains("MACHINE_FEATURES", "keyboard", "${VIRTUAL-RUNTIME_keymaps}", "", d)} \ netbase \ diff --git a/yocto-poky/meta/recipes-core/packagegroups/packagegroup-core-sdk.bb b/yocto-poky/meta/recipes-core/packagegroups/packagegroup-core-sdk.bb index 3badd0ecf..bee1665b5 100644 --- a/yocto-poky/meta/recipes-core/packagegroups/packagegroup-core-sdk.bb +++ b/yocto-poky/meta/recipes-core/packagegroups/packagegroup-core-sdk.bb @@ -32,9 +32,11 @@ SANITIZERS_aarch64 = "" SANITIZERS_mips = "" SANITIZERS_mips64 = "" SANITIZERS_mips64n32 = "" +SANITIZERS_nios2 = "" SANITIZERS_powerpc64 = "" SANITIZERS_sparc = "" SANITIZERS_libc-musl = "" +SANITIZERS_libc-uclibc = "" RRECOMMENDS_packagegroup-core-sdk = "\ libgomp \ diff --git a/yocto-poky/meta/recipes-core/packagegroups/packagegroup-core-tools-profile.bb b/yocto-poky/meta/recipes-core/packagegroups/packagegroup-core-tools-profile.bb index 80f593379..ff2b5779a 100644 --- a/yocto-poky/meta/recipes-core/packagegroups/packagegroup-core-tools-profile.bb +++ b/yocto-poky/meta/recipes-core/packagegroups/packagegroup-core-tools-profile.bb @@ -17,7 +17,7 @@ PROFILE_TOOLS_X_aarch64 = "" PROFILE_TOOLS_SYSTEMD = "${@bb.utils.contains('DISTRO_FEATURES', 'systemd', 'systemd-analyze', '', d)}" RRECOMMENDS_${PN} = "\ - perf \ + ${PERF} \ trace-cmd \ blktrace \ ${PROFILE_TOOLS_X} \ @@ -28,14 +28,18 @@ PROFILETOOLS = "\ powertop \ latencytop \ " +PERF = "perf" +PERF_libc-musl = "" # systemtap needs elfutils which is not fully buildable on uclibc # hence we exclude it from uclibc based builds SYSTEMTAP = "systemtap" SYSTEMTAP_libc-uclibc = "" +SYSTEMTAP_libc-musl = "" SYSTEMTAP_mips = "" SYSTEMTAP_mips64 = "" SYSTEMTAP_mips64n32 = "" +SYSTEMTAP_nios2 = "" SYSTEMTAP_aarch64 = "" # lttng-ust uses sched_getcpu() which is not there on uclibc @@ -46,30 +50,27 @@ SYSTEMTAP_aarch64 = "" LTTNGUST = "lttng-ust" LTTNGUST_libc-uclibc = "" -LTTNGUST_aarch64 = "" +LTTNGUST_libc-musl = "" LTTNGTOOLS = "lttng-tools" -LTTNGTOOLS_aarch64 = "" +LTTNGTOOLS_libc-musl = "" LTTNGMODULES = "lttng-modules" -LTTNGMODULES_aarch64 = "" BABELTRACE = "babeltrace" -BABELTRACE_aarch64 = "" # valgrind does not work on mips VALGRIND = "valgrind" VALGRIND_libc-uclibc = "" +VALGRIND_libc-musl = "" VALGRIND_mips = "" VALGRIND_mips64 = "" VALGRIND_mips64n32 = "" +VALGRIND_nios2 = "" VALGRIND_arm = "" VALGRIND_aarch64 = "" -# exmap-console -# exmap-server - RDEPENDS_${PN} = "\ ${PROFILETOOLS} \ ${LTTNGUST} \ diff --git a/yocto-poky/meta/recipes-core/packagegroups/packagegroup-core-tools-testapps.bb b/yocto-poky/meta/recipes-core/packagegroups/packagegroup-core-tools-testapps.bb index 95b3988b3..e8d585e0b 100644 --- a/yocto-poky/meta/recipes-core/packagegroups/packagegroup-core-tools-testapps.bb +++ b/yocto-poky/meta/recipes-core/packagegroups/packagegroup-core-tools-testapps.bb @@ -11,13 +11,10 @@ PACKAGE_ARCH = "${MACHINE_ARCH}" inherit packagegroup -# kexec-tools doesn't work on Mips +# kexec-tools doesn't work on e5500-64b and nios2 yet KEXECTOOLS ?= "kexec" -KEXECTOOLS_mips ?= "" -KEXECTOOLS_mipsel ?= "" -KEXECTOOLS_powerpc ?= "" KEXECTOOLS_e5500-64b ?= "" -KEXECTOOLS_aarch64 ?= "" +KEXECTOOLS_nios2 ?= "" X11GLTOOLS = "\ mesa-demos \ diff --git a/yocto-poky/meta/recipes-core/packagegroups/packagegroup-self-hosted.bb b/yocto-poky/meta/recipes-core/packagegroups/packagegroup-self-hosted.bb index d38be264c..225204df1 100644 --- a/yocto-poky/meta/recipes-core/packagegroups/packagegroup-self-hosted.bb +++ b/yocto-poky/meta/recipes-core/packagegroups/packagegroup-self-hosted.bb @@ -45,9 +45,11 @@ RDEPENDS_packagegroup-self-hosted-host-tools = "\ mc-helpers-perl \ mc-helpers-python \ parted \ - pseudo \ + ${PSEUDO} \ screen \ " +PSEUDO = "pseudo" +PSEUDO_libc-musl = "" RRECOMMENDS_packagegroup-self-hosted-host-tools = "\ kernel-module-tun \ @@ -67,7 +69,6 @@ RDEPENDS_packagegroup-self-hosted-sdk = "\ cpp \ cpp-symlinks \ distcc \ - glibc-gconv-ibm850 \ file \ findutils \ g++ \ @@ -93,6 +94,7 @@ RDEPENDS_packagegroup-self-hosted-sdk = "\ " # glibc-utils: for rpcgen RDEPENDS_packagegroup-self-hosted-sdk_append_libc-glibc = "\ + glibc-gconv-ibm850 \ glibc-utils \ " RDEPENDS_packagegroup-self-hosted-debug = " \ @@ -150,7 +152,6 @@ RDEPENDS_packagegroup-self-hosted-extended = "\ perl-dev \ perl-modules \ perl-pod \ - ${PTH} \ python \ python-compiler \ python-git \ @@ -190,7 +191,6 @@ RDEPENDS_packagegroup-self-hosted-graphics = "\ libsdl \ libsdl-dev \ libx11-dev \ - python-pygtk \ gtk-theme-clearlooks \ xdg-utils \ epiphany \ @@ -198,5 +198,3 @@ RDEPENDS_packagegroup-self-hosted-graphics = "\ pcmanfm \ vte \ " -PTH = "pth" -PTH_libc-uclibc = "" diff --git a/yocto-poky/meta/recipes-core/psplash/files/0001-psplash-fb-Convert-psplash_fb_plot_pixel-to-a-static.patch b/yocto-poky/meta/recipes-core/psplash/files/0001-psplash-fb-Convert-psplash_fb_plot_pixel-to-a-static.patch deleted file mode 100644 index 93b3c6bc7..000000000 --- a/yocto-poky/meta/recipes-core/psplash/files/0001-psplash-fb-Convert-psplash_fb_plot_pixel-to-a-static.patch +++ /dev/null @@ -1,53 +0,0 @@ -From 8f5de12cc75bfaa8400adf32f30c015d8f813540 Mon Sep 17 00:00:00 2001 -From: Khem Raj <raj.khem@gmail.com> -Date: Sat, 22 Aug 2015 07:12:20 -0700 -Subject: [PATCH] psplash-fb: Convert psplash_fb_plot_pixel() to a static - inline - -This function is not used outside psplash-fb.c and by making it -static inline we keep the performance and also make it portable across -multiple compilers and gcc versions - -Signed-off-by: Khem Raj <raj.khem@gmail.com> ---- -Upstream-Status: Pending - - psplash-fb.c | 2 +- - psplash-fb.h | 8 -------- - 2 files changed, 1 insertion(+), 9 deletions(-) - -diff --git a/psplash-fb.c b/psplash-fb.c -index bd9cd9d..6d235db 100644 ---- a/psplash-fb.c -+++ b/psplash-fb.c -@@ -260,7 +260,7 @@ psplash_fb_new (int angle) - - #define OFFSET(fb,x,y) (((y) * (fb)->stride) + ((x) * ((fb)->bpp >> 3))) - --inline void -+static inline void - psplash_fb_plot_pixel (PSplashFB *fb, - int x, - int y, -diff --git a/psplash-fb.h b/psplash-fb.h -index 42592ed..c6c3144 100644 ---- a/psplash-fb.h -+++ b/psplash-fb.h -@@ -57,14 +57,6 @@ psplash_fb_destroy (PSplashFB *fb); - PSplashFB* - psplash_fb_new (int angle); - --inline void --psplash_fb_plot_pixel (PSplashFB *fb, -- int x, -- int y, -- uint8 red, -- uint8 green, -- uint8 blue); -- - void - psplash_fb_draw_rect (PSplashFB *fb, - int x, --- -2.1.4 - diff --git a/yocto-poky/meta/recipes-core/psplash/psplash_git.bb b/yocto-poky/meta/recipes-core/psplash/psplash_git.bb index b3b64799a..053742651 100644 --- a/yocto-poky/meta/recipes-core/psplash/psplash_git.bb +++ b/yocto-poky/meta/recipes-core/psplash/psplash_git.bb @@ -5,12 +5,11 @@ SECTION = "base" LICENSE = "GPLv2+" LIC_FILES_CHKSUM = "file://psplash.h;beginline=1;endline=16;md5=840fb2356b10a85bed78dd09dc7745c6" -SRCREV = "14c8f7b705de944beb4de3f296506d80871e410f" +SRCREV = "88343ad23c90fa1dd8d79ac0d784a691aa0c6d2b" PV = "0.1+git${SRCPV}" PR = "r15" SRC_URI = "git://git.yoctoproject.org/${BPN} \ - file://0001-psplash-fb-Convert-psplash_fb_plot_pixel-to-a-static.patch \ file://psplash-init \ ${SPLASH_IMAGES}" diff --git a/yocto-poky/meta/recipes-core/base-files/base-files/inputrc b/yocto-poky/meta/recipes-core/readline/files/inputrc index b5c4c8af2..b5c4c8af2 100644 --- a/yocto-poky/meta/recipes-core/base-files/base-files/inputrc +++ b/yocto-poky/meta/recipes-core/readline/files/inputrc diff --git a/yocto-poky/meta/recipes-core/readline/files/norpath.patch b/yocto-poky/meta/recipes-core/readline/readline-6.3/norpath.patch index 5d71582b7..5d71582b7 100644 --- a/yocto-poky/meta/recipes-core/readline/files/norpath.patch +++ b/yocto-poky/meta/recipes-core/readline/readline-6.3/norpath.patch diff --git a/yocto-poky/meta/recipes-core/readline/readline-6.3/readline-cve-2014-2524.patch b/yocto-poky/meta/recipes-core/readline/readline-6.3/readline-cve-2014-2524.patch deleted file mode 100644 index 98a9d810b..000000000 --- a/yocto-poky/meta/recipes-core/readline/readline-6.3/readline-cve-2014-2524.patch +++ /dev/null @@ -1,43 +0,0 @@ -readline: Security Advisory - readline - CVE-2014-2524 - -Upstream-Status: Backport - -Signed-off-by: Yue Tao <yue.tao@windriver.com> - - READLINE PATCH REPORT - ===================== - -Readline-Release: 6.3 -Patch-ID: readline63-003 - -Bug-Reported-by: -Bug-Reference-ID: -Bug-Reference-URL: - -Bug-Description: - -There are debugging functions in the readline release that are theoretically -exploitable as security problems. They are not public functions, but have -global linkage. - -Patch (apply with `patch -p0'): - -*** ../readline-6.3/util.c 2013-09-02 13:36:12.000000000 -0400 ---- util.c 2014-03-20 10:25:53.000000000 -0400 -*************** -*** 477,480 **** ---- 479,483 ---- - } - -+ #if defined (DEBUG) - #if defined (USE_VARARGS) - static FILE *_rl_tracefp; -*************** -*** 539,542 **** ---- 542,546 ---- - } - #endif -+ #endif /* DEBUG */ - - - diff --git a/yocto-poky/meta/recipes-core/readline/readline-6.3/readline-dispatch-multikey.patch b/yocto-poky/meta/recipes-core/readline/readline-6.3/readline-dispatch-multikey.patch deleted file mode 100644 index 54d1ac6eb..000000000 --- a/yocto-poky/meta/recipes-core/readline/readline-6.3/readline-dispatch-multikey.patch +++ /dev/null @@ -1,32 +0,0 @@ -From 8ef852a5be72c75e17f2510bea52455f809b56ce Mon Sep 17 00:00:00 2001 -From: Chet Ramey <chet.ramey@case.edu> -Date: Fri, 28 Mar 2014 14:07:42 -0400 -Subject: [PATCH 04/10] Readline-6.3 patch 2 - -Fixes multi-key issue identified in this thread: -http://lists.gnu.org/archive/html/bug-readline/2014-03/msg00010.html - -Upstream-Status: Backport - -Signed-off-by: Saul Wold <sgw@linux.intel.com> ---- - readline.c | 3 ++- - 1 files changed, 2 insertions(+), 1 deletions(-) - -diff --git a/readline.c b/readline.c -index eb4eae3..abb29a0 100644 ---- a/readline.c -+++ b/readline.c -@@ -744,7 +744,8 @@ _rl_dispatch_callback (cxt) - r = _rl_subseq_result (r, cxt->oldmap, cxt->okey, (cxt->flags & KSEQ_SUBSEQ)); - - RL_CHECK_SIGNALS (); -- if (r == 0) /* success! */ -+ /* We only treat values < 0 specially to simulate recursion. */ -+ if (r >= 0 || (r == -1 && (cxt->flags & KSEQ_SUBSEQ) == 0)) /* success! or failure! */ - { - _rl_keyseq_chain_dispose (); - RL_UNSETSTATE (RL_STATE_MULTIKEY); --- -1.8.3.1 - diff --git a/yocto-poky/meta/recipes-core/readline/readline.inc b/yocto-poky/meta/recipes-core/readline/readline.inc index 3f662c307..35df8b4bb 100644 --- a/yocto-poky/meta/recipes-core/readline/readline.inc +++ b/yocto-poky/meta/recipes-core/readline/readline.inc @@ -11,10 +11,8 @@ LIC_FILES_CHKSUM = "file://COPYING;md5=d32239bcb673463ab874e80d47fae504" DEPENDS += "ncurses" -SRC_URI = "${GNU_MIRROR}/readline/${BPN}-${PV}.tar.gz;name=archive \ - file://configure-fix.patch \ - file://config-dirent-symbols.patch \ - file://norpath.patch" +SRC_URI = "${GNU_MIRROR}/readline/${BPN}-${PV}.tar.gz;name=archive" +SRC_URI += "file://inputrc" inherit autotools texinfo @@ -34,6 +32,11 @@ do_install_append () { oe_libinstall -so -C shlib libreadline ${D}${libdir} rmdir ${D}${bindir} + + install -m 0755 -d ${D}${sysconfdir} + install -m 0644 ${WORKDIR}/inputrc ${D}${sysconfdir}/inputrc } BBCLASSEXTEND = "native nativesdk" + +CONFFILES_${PN} += "${sysconfdir}/inputrc" diff --git a/yocto-poky/meta/recipes-core/readline/readline_6.3.bb b/yocto-poky/meta/recipes-core/readline/readline_6.3.bb index fc362ae5a..8ec7c4ada 100644 --- a/yocto-poky/meta/recipes-core/readline/readline_6.3.bb +++ b/yocto-poky/meta/recipes-core/readline/readline_6.3.bb @@ -1,8 +1,34 @@ require readline.inc -SRC_URI += "file://readline-cve-2014-2524.patch;striplevel=0 \ - file://readline-dispatch-multikey.patch" +SRC_URI += "${GNU_MIRROR}/readline/readline-6.3-patches/readline63-001;name=patch1;apply=yes;striplevel=0 \ + ${GNU_MIRROR}/readline/readline-6.3-patches/readline63-002;name=patch2;apply=yes;striplevel=0 \ + ${GNU_MIRROR}/readline/readline-6.3-patches/readline63-003;name=patch3;apply=yes;striplevel=0 \ + ${GNU_MIRROR}/readline/readline-6.3-patches/readline63-004;name=patch4;apply=yes;striplevel=0 \ + ${GNU_MIRROR}/readline/readline-6.3-patches/readline63-005;name=patch5;apply=yes;striplevel=0 \ + ${GNU_MIRROR}/readline/readline-6.3-patches/readline63-006;name=patch6;apply=yes;striplevel=0 \ + ${GNU_MIRROR}/readline/readline-6.3-patches/readline63-007;name=patch7;apply=yes;striplevel=0 \ + ${GNU_MIRROR}/readline/readline-6.3-patches/readline63-008;name=patch8;apply=yes;striplevel=0 \ + file://configure-fix.patch \ + file://config-dirent-symbols.patch \ + file://norpath.patch" SRC_URI[archive.md5sum] = "33c8fb279e981274f485fd91da77e94a" SRC_URI[archive.sha256sum] = "56ba6071b9462f980c5a72ab0023893b65ba6debb4eeb475d7a563dc65cafd43" +SRC_URI[patch1.md5sum] = "4343f5ea9b0f42447f102fb61576b398" +SRC_URI[patch1.sha256sum] = "1a79bbb6eaee750e0d6f7f3d059b30a45fc54e8e388a8e05e9c3ae598590146f" +SRC_URI[patch2.md5sum] = "700295212f7e2978577feaee584afddb" +SRC_URI[patch2.sha256sum] = "39e304c7a526888f9e112e733848215736fb7b9d540729b9e31f3347b7a1e0a5" +SRC_URI[patch3.md5sum] = "af4963862f5156fbf9111c2c6fa86ed7" +SRC_URI[patch3.sha256sum] = "ec41bdd8b00fd884e847708513df41d51b1243cecb680189e31b7173d01ca52f" +SRC_URI[patch4.md5sum] = "11f9def89803a5052db3ba72394ce14f" +SRC_URI[patch4.sha256sum] = "4547b906fb2570866c21887807de5dee19838a60a1afb66385b272155e4355cc" +SRC_URI[patch5.md5sum] = "93721c31cd225393f80cb3aadb165544" +SRC_URI[patch5.sha256sum] = "877788f9228d1a9907a4bcfe3d6dd0439c08d728949458b41208d9bf9060274b" +SRC_URI[patch6.md5sum] = "71dc6ecce66d1489b96595f55d142a52" +SRC_URI[patch6.sha256sum] = "5c237ab3c6c97c23cf52b2a118adc265b7fb411b57c93a5f7c221d50fafbe556" +SRC_URI[patch7.md5sum] = "062a08ed60679d3c4878710b3d595b65" +SRC_URI[patch7.sha256sum] = "4d79b5a2adec3c2e8114cbd3d63c1771f7c6cf64035368624903d257014f5bea" +SRC_URI[patch8.md5sum] = "ee1c04072154826870848d8b218d7b04" +SRC_URI[patch8.sha256sum] = "3bc093cf526ceac23eb80256b0ec87fa1735540d659742107b6284d635c43787" + diff --git a/yocto-poky/meta/recipes-core/sysfsutils/sysfsutils_2.1.0.bb b/yocto-poky/meta/recipes-core/sysfsutils/sysfsutils_2.1.0.bb index b9f40f433..f9f067dca 100644 --- a/yocto-poky/meta/recipes-core/sysfsutils/sysfsutils_2.1.0.bb +++ b/yocto-poky/meta/recipes-core/sysfsutils/sysfsutils_2.1.0.bb @@ -17,6 +17,10 @@ SRC_URI = "${SOURCEFORGE_MIRROR}/linux-diag/sysfsutils-${PV}.tar.gz \ SRC_URI[md5sum] = "14e7dcd0436d2f49aa403f67e1ef7ddc" SRC_URI[sha256sum] = "e865de2c1f559fff0d3fc936e660c0efaf7afe662064f2fb97ccad1ec28d208a" + +UPSTREAM_CHECK_URI = "http://sourceforge.net/projects/linux-diag/files/sysfsutils/" +UPSTREAM_CHECK_REGEX = "/sysfsutils/(?P<pver>(\d+[\.\-_]*)+)/" + S = "${WORKDIR}/sysfsutils-${PV}" inherit autotools diff --git a/yocto-poky/meta/recipes-core/systemd/systemd-serialgetty/serial-getty@.service b/yocto-poky/meta/recipes-core/systemd/systemd-serialgetty/serial-getty@.service index 182167bef..e8b027e97 100644 --- a/yocto-poky/meta/recipes-core/systemd/systemd-serialgetty/serial-getty@.service +++ b/yocto-poky/meta/recipes-core/systemd/systemd-serialgetty/serial-getty@.service @@ -21,7 +21,7 @@ IgnoreOnIsolate=yes [Service] Environment="TERM=xterm" -ExecStart=-/sbin/agetty -8 -L --keep-baud %I @BAUDRATE@ $TERM +ExecStart=-/sbin/agetty -8 -L %I @BAUDRATE@ $TERM Type=idle Restart=always RestartSec=0 diff --git a/yocto-poky/meta/recipes-core/systemd/systemd-systemctl/systemctl b/yocto-poky/meta/recipes-core/systemd/systemd-systemctl/systemctl index 6e163bd5c..efad14ce1 100755 --- a/yocto-poky/meta/recipes-core/systemd/systemd-systemctl/systemctl +++ b/yocto-poky/meta/recipes-core/systemd/systemd-systemctl/systemctl @@ -108,7 +108,7 @@ for service in $services; do # If any new unit types are added to systemd they should be added # to this regular expression. - unit_types_re='\.\(service\|socket\|device\|mount\|automount\|swap\|target\|path\|timer\|snapshot\)$' + unit_types_re='\.\(service\|socket\|device\|mount\|automount\|swap\|target\|path\|timer\|snapshot\)\s*$' if [ "$action" = "preset" ]; then action=`egrep -sh $service $ROOT/etc/systemd/user-preset/*.preset | cut -f1 -d' '` if [ -z "$action" ]; then @@ -125,33 +125,46 @@ for service in $services; do | tr ',' '\n' \ | grep "$unit_types_re") - for r in $wanted_by; do - echo "WantedBy=$r found in $service" - if [ "$action" = "enable" ]; then - enable_service=$service - if [ "$service_template" = true -a "$instance_specified" = false ]; then - default_instance=$(sed '/^DefaultInstance[[:space:]]*=/s,[^=]*=,,p;d' "$ROOT/$service_file") - if [ -z $default_instance ]; then - echo "Template unit without instance or DefaultInstance directive, nothing to enable" - continue - else - echo "Found DefaultInstance $default_instance, enabling it" - enable_service=$(echo $service | sed "s/@/@$default_instance/") + required_by=$(sed '/^RequiredBy[[:space:]]*=/s,[^=]*=,,p;d' "$ROOT/$service_file" \ + | tr ',' '\n' \ + | grep "$unit_types_re") + + for dependency in WantedBy RequiredBy; do + if [ "$dependency" = "WantedBy" ]; then + suffix="wants" + dependency_list="$wanted_by" + elif [ "$dependency" = "RequiredBy" ]; then + suffix="requires" + dependency_list="$required_by" + fi + for r in $dependency_list; do + echo "$dependency=$r found in $service" + if [ "$action" = "enable" ]; then + enable_service=$service + if [ "$service_template" = true -a "$instance_specified" = false ]; then + default_instance=$(sed '/^DefaultInstance[[:space:]]*=/s,[^=]*=,,p;d' "$ROOT/$service_file") + if [ -z $default_instance ]; then + echo "Template unit without instance or DefaultInstance directive, nothing to enable" + continue + else + echo "Found DefaultInstance $default_instance, enabling it" + enable_service=$(echo $service | sed "s/@/@$(echo $default_instance | sed 's/\\/\\\\/g')/") + fi fi - fi - mkdir -p $ROOT/etc/systemd/system/$r.wants - ln -s $service_file $ROOT/etc/systemd/system/$r.wants/$enable_service - echo "Enabled $enable_service for $wanted_by." - else - if [ "$service_template" = true -a "$instance_specified" = false ]; then - disable_service="$ROOT/etc/systemd/system/$r.wants/`echo $service | sed 's/@/@*/'`" + mkdir -p $ROOT/etc/systemd/system/$r.$suffix + ln -s $service_file $ROOT/etc/systemd/system/$r.$suffix/$enable_service + echo "Enabled $enable_service for $r." else - disable_service="$ROOT/etc/systemd/system/$r.wants/$service" + if [ "$service_template" = true -a "$instance_specified" = false ]; then + disable_service="$ROOT/etc/systemd/system/$r.$suffix/`echo $service | sed 's/@/@*/'`" + else + disable_service="$ROOT/etc/systemd/system/$r.$suffix/$service" + fi + rm -f $disable_service + [ -d $ROOT/etc/systemd/system/$r.$suffix ] && rmdir --ignore-fail-on-non-empty -p $ROOT/etc/systemd/system/$r.$suffix + echo "Disabled ${disable_service##$ROOT/etc/systemd/system/$r.$suffix/} for $r." fi - rm -f $disable_service - [ -d $ROOT/etc/systemd/system/$r.wants ] && rmdir --ignore-fail-on-non-empty -p $ROOT/etc/systemd/system/$r.wants - echo "Disabled ${disable_service##$ROOT/etc/systemd/system/$r.wants/} for $wanted_by." - fi + done done # create the required symbolic 'Alias' links diff --git a/yocto-poky/meta/recipes-core/systemd/systemd/qemuall_io_latency-core-device.c-Change-the-default-device-timeout-to-2.patch b/yocto-poky/meta/recipes-core/systemd/systemd/0001-core-device.c-Change-the-default-device-timeout-to-2.patch index c7e171152..f7ef7a321 100644 --- a/yocto-poky/meta/recipes-core/systemd/systemd/qemuall_io_latency-core-device.c-Change-the-default-device-timeout-to-2.patch +++ b/yocto-poky/meta/recipes-core/systemd/systemd/0001-core-device.c-Change-the-default-device-timeout-to-2.patch @@ -1,23 +1,25 @@ -Upstream-Status: Inappropriate [Specific case QEMU/AB] - -From 7b8c4e0a67a79a75e1bd77df3a452a5497322108 Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?An=C3=ADbal=20Lim=C3=B3n?= <anibal.limon@linux.intel.com> -Date: Thu, 27 Aug 2015 17:58:26 -0500 -Subject: [PATCH] core/device.c: Change the default device timeout to 240 sec. +From 3bc4552117879f57522b5972b724729ca993f1ea Mon Sep 17 00:00:00 2001 +From: Khem Raj <raj.khem@gmail.com> +Date: Mon, 14 Dec 2015 04:09:19 +0000 +Subject: [PATCH 01/36] core/device.c: Change the default device timeout to 240 + sec. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit +Upstream-Status: Inappropriate [Specific case QEMU/AB] + Signed-off-by: Aníbal Limón <anibal.limon@linux.intel.com> +Signed-off-by: Khem Raj <raj.khem@gmail.com> --- src/core/device.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/core/device.c b/src/core/device.c -index e7efcf0..4ed8f08 100644 +index d201dc5..340d62a 100644 --- a/src/core/device.c +++ b/src/core/device.c -@@ -110,7 +110,7 @@ static void device_init(Unit *u) { +@@ -112,7 +112,7 @@ static void device_init(Unit *u) { * indefinitely for plugged in devices, something which cannot * happen for the other units since their operations time out * anyway. */ @@ -25,7 +27,7 @@ index e7efcf0..4ed8f08 100644 + u->job_timeout = (240 * USEC_PER_SEC); u->ignore_on_isolate = true; - u->ignore_on_snapshot = true; + } -- -1.9.1 +1.8.3.1 diff --git a/yocto-poky/meta/recipes-core/systemd/systemd/0001-fix-build-on-uClibc-exp10.patch b/yocto-poky/meta/recipes-core/systemd/systemd/0001-fix-build-on-uClibc-exp10.patch deleted file mode 100644 index 76ce4b781..000000000 --- a/yocto-poky/meta/recipes-core/systemd/systemd/0001-fix-build-on-uClibc-exp10.patch +++ /dev/null @@ -1,22 +0,0 @@ -Inspired by: http://peter.korsgaard.com/patches/alsa-utils/alsamixer-fix-build-on-uClibc-exp10.patch - -exp10 extension is not part of uClibc, so compute it. - - -Signed-off-by: Samuel Martin <s.martin49@gmail.com> - -Upstream-Status: Pending - -Index: git/src/basic/missing.h -=================================================================== ---- git.orig/src/basic/missing.h -+++ git/src/basic/missing.h -@@ -1036,3 +1036,8 @@ static inline int kcmp(pid_t pid1, pid_t - #ifndef INPUT_PROP_ACCELEROMETER - #define INPUT_PROP_ACCELEROMETER 0x06 - #endif -+ -+#ifdef __UCLIBC__ -+/* 10^x = 10^(log e^x) = (e^x)^log10 = e^(x * log 10) */ -+#define exp10(x) (exp((x) * log(10))) -+#endif /* __UCLIBC__ */ diff --git a/yocto-poky/meta/recipes-core/systemd/systemd/0001-units-Prefer-getty-to-agetty-in-console-setup-system.patch b/yocto-poky/meta/recipes-core/systemd/systemd/0002-units-Prefer-getty-to-agetty-in-console-setup-system.patch index b6ab5effc..28939eb02 100644 --- a/yocto-poky/meta/recipes-core/systemd/systemd/0001-units-Prefer-getty-to-agetty-in-console-setup-system.patch +++ b/yocto-poky/meta/recipes-core/systemd/systemd/0002-units-Prefer-getty-to-agetty-in-console-setup-system.patch @@ -1,7 +1,7 @@ -From 100e50604efc4032001a2de6a6b47853c0003817 Mon Sep 17 00:00:00 2001 +From e5f405aba347d216e7f2b73d7dd681b13be442e3 Mon Sep 17 00:00:00 2001 From: Khem Raj <raj.khem@gmail.com> Date: Fri, 20 Feb 2015 05:29:15 +0000 -Subject: [PATCH 01/11] units: Prefer getty to agetty in console setup systemd +Subject: [PATCH 02/36] units: Prefer getty to agetty in console setup systemd units Upstream-Status: Inappropriate [configuration specific] @@ -40,5 +40,5 @@ index 4522d0d..e6d499d 100644 Restart=always UtmpIdentifier=%I -- -2.1.4 +1.8.3.1 diff --git a/yocto-poky/meta/recipes-core/systemd/systemd/0003-define-exp10-if-missing.patch b/yocto-poky/meta/recipes-core/systemd/systemd/0003-define-exp10-if-missing.patch new file mode 100644 index 000000000..f183261c8 --- /dev/null +++ b/yocto-poky/meta/recipes-core/systemd/systemd/0003-define-exp10-if-missing.patch @@ -0,0 +1,33 @@ +From 699893a05edac5194f9670529bacfaeb67252edb Mon Sep 17 00:00:00 2001 +From: Khem Raj <raj.khem@gmail.com> +Date: Mon, 14 Dec 2015 00:42:49 +0000 +Subject: [PATCH 03/36] define exp10 if missing + +Inspired by: http://peter.korsgaard.com/patches/alsa-utils/alsamixer-fix-build-on-uClibc-exp10.patch + +exp10 extension is not part of uClibc, so compute it. + +Upstream-Status: Pending + +Signed-off-by: Samuel Martin <s.martin49@gmail.com> +Signed-off-by: Khem Raj <raj.khem@gmail.com> +--- + src/basic/missing.h | 5 +++++ + 1 file changed, 5 insertions(+) + +diff --git a/src/basic/missing.h b/src/basic/missing.h +index f3d3236..ee7e7ea 100644 +--- a/src/basic/missing.h ++++ b/src/basic/missing.h +@@ -1169,3 +1169,8 @@ static inline key_serial_t request_key(const char *type, const char *description + #endif + + #endif ++ ++#ifdef __UCLIBC__ ++/* 10^x = 10^(log e^x) = (e^x)^log10 = e^(x * log 10) */ ++#define exp10(x) (exp((x) * log(10))) ++#endif /* __UCLIBC__ */ +-- +1.8.3.1 + diff --git a/yocto-poky/meta/recipes-core/systemd/systemd/0022-Use-getenv-when-secure-versions-are-not-available.patch b/yocto-poky/meta/recipes-core/systemd/systemd/0004-Use-getenv-when-secure-versions-are-not-available.patch index 30e38173e..989a1fa1d 100644 --- a/yocto-poky/meta/recipes-core/systemd/systemd/0022-Use-getenv-when-secure-versions-are-not-available.patch +++ b/yocto-poky/meta/recipes-core/systemd/systemd/0004-Use-getenv-when-secure-versions-are-not-available.patch @@ -1,39 +1,35 @@ -From cb71e4beea3b3b11e5951f95c829cd2eee9fcf7b Mon Sep 17 00:00:00 2001 +From bb8d8148b16572ae17d3c308552cf73915386b05 Mon Sep 17 00:00:00 2001 From: Khem Raj <raj.khem@gmail.com> Date: Sat, 12 Sep 2015 19:10:04 +0000 -Subject: [PATCH 22/31] Use getenv when secure versions are not available +Subject: [PATCH 04/36] Use getenv when secure versions are not available musl doesnt implement secure version, so we default to it if configure does not detect a secure imeplementation Signed-off-by: Khem Raj <raj.khem@gmail.com> +Upstream-Status: Denied --- -Upstream-Status: Rejected - - src/basic/missing.h | 5 +++-- - 1 file changed, 3 insertions(+), 2 deletions(-) + src/basic/missing.h | 3 +-- + 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/basic/missing.h b/src/basic/missing.h -index bf9b490..d6dbc7d 100644 +index ee7e7ea..3170429 100644 --- a/src/basic/missing.h +++ b/src/basic/missing.h -@@ -584,13 +584,14 @@ static inline int name_to_handle_at(int fd, const char *name, struct file_handle +@@ -585,12 +585,11 @@ static inline int name_to_handle_at(int fd, const char *name, struct file_handle return syscall(__NR_name_to_handle_at, fd, name, handle, mnt_id, flags); } #endif - --#ifndef HAVE_SECURE_GETENV -+#ifdef HAVE_SECURE_GETENV + #ifndef HAVE_SECURE_GETENV # ifdef HAVE___SECURE_GETENV # define secure_getenv __secure_getenv # else - # error "neither secure_getenv nor __secure_getenv are available" +-# error "neither secure_getenv nor __secure_getenv are available" ++# define secure_getenv getenv # endif -+#else -+# define secure_getenv getenv #endif - #ifndef CIFS_MAGIC_NUMBER -- -2.5.2 +1.8.3.1 diff --git a/yocto-poky/meta/recipes-core/systemd/systemd/0003-binfmt-Don-t-install-dependency-links-at-install-tim.patch b/yocto-poky/meta/recipes-core/systemd/systemd/0005-binfmt-Don-t-install-dependency-links-at-install-tim.patch index 0e20fd054..f69e26ec5 100644 --- a/yocto-poky/meta/recipes-core/systemd/systemd/0003-binfmt-Don-t-install-dependency-links-at-install-tim.patch +++ b/yocto-poky/meta/recipes-core/systemd/systemd/0005-binfmt-Don-t-install-dependency-links-at-install-tim.patch @@ -1,7 +1,7 @@ -From 184a89caacfa00f07e7275bca592bd7dda1b541e Mon Sep 17 00:00:00 2001 +From 3436b12d40bf4f4ab7e3e16600e5f6c35a470da4 Mon Sep 17 00:00:00 2001 From: Khem Raj <raj.khem@gmail.com> Date: Fri, 20 Feb 2015 05:03:44 +0000 -Subject: [PATCH 03/11] binfmt: Don't install dependency links at install time +Subject: [PATCH 05/36] binfmt: Don't install dependency links at install time for the binfmt services use [Install] blocks so that they get created when the service is enabled @@ -23,11 +23,11 @@ Signed-off-by: Khem Raj <raj.khem@gmail.com> units/systemd-binfmt.service.in | 5 +++++ 3 files changed, 8 insertions(+), 4 deletions(-) -Index: git/Makefile.am -=================================================================== ---- git.orig/Makefile.am -+++ git/Makefile.am -@@ -4271,10 +4271,6 @@ INSTALL_DIRS += \ +diff --git a/Makefile.am b/Makefile.am +index 03341fc..629740f 100644 +--- a/Makefile.am ++++ b/Makefile.am +@@ -4387,10 +4387,6 @@ INSTALL_DIRS += \ $(prefix)/lib/binfmt.d \ $(sysconfdir)/binfmt.d @@ -38,10 +38,10 @@ Index: git/Makefile.am endif EXTRA_DIST += \ -Index: git/units/proc-sys-fs-binfmt_misc.automount -=================================================================== ---- git.orig/units/proc-sys-fs-binfmt_misc.automount -+++ git/units/proc-sys-fs-binfmt_misc.automount +diff --git a/units/proc-sys-fs-binfmt_misc.automount b/units/proc-sys-fs-binfmt_misc.automount +index 6be3893..709adef 100644 +--- a/units/proc-sys-fs-binfmt_misc.automount ++++ b/units/proc-sys-fs-binfmt_misc.automount @@ -16,3 +16,6 @@ ConditionPathIsReadWrite=/proc/sys/ [Automount] @@ -49,11 +49,11 @@ Index: git/units/proc-sys-fs-binfmt_misc.automount + +[Install] +WantedBy=sysinit.target -Index: git/units/systemd-binfmt.service.in -=================================================================== ---- git.orig/units/systemd-binfmt.service.in -+++ git/units/systemd-binfmt.service.in -@@ -11,6 +11,8 @@ Documentation=man:systemd-binfmt.service +diff --git a/units/systemd-binfmt.service.in b/units/systemd-binfmt.service.in +index d53073e..8c57ee0 100644 +--- a/units/systemd-binfmt.service.in ++++ b/units/systemd-binfmt.service.in +@@ -11,6 +11,8 @@ Documentation=man:systemd-binfmt.service(8) man:binfmt.d(5) Documentation=https://www.kernel.org/doc/Documentation/binfmt_misc.txt DefaultDependencies=no Conflicts=shutdown.target @@ -69,3 +69,6 @@ Index: git/units/systemd-binfmt.service.in + +[Install] +WantedBy=sysinit.target +-- +1.8.3.1 + diff --git a/yocto-poky/meta/recipes-core/systemd/systemd/0005-nspawn-Use-execvpe-only-when-libc-supports-it.patch b/yocto-poky/meta/recipes-core/systemd/systemd/0005-nspawn-Use-execvpe-only-when-libc-supports-it.patch deleted file mode 100644 index 55a0088c6..000000000 --- a/yocto-poky/meta/recipes-core/systemd/systemd/0005-nspawn-Use-execvpe-only-when-libc-supports-it.patch +++ /dev/null @@ -1,38 +0,0 @@ -From a7417c2e6950d55c22c1b0d15783898b8ff229ef Mon Sep 17 00:00:00 2001 -From: Khem Raj <raj.khem@gmail.com> -Date: Fri, 20 Feb 2015 05:10:37 +0000 -Subject: [PATCH 05/11] nspawn: Use execvpe only when libc supports it - -Upstream-Status: Denied [no desire for uclibc support] - -Signed-off-by: Khem Raj <raj.khem@gmail.com> ---- - src/nspawn/nspawn.c | 7 +++++++ - 1 file changed, 7 insertions(+) - -Index: git/src/nspawn/nspawn.c -=================================================================== ---- git.orig/src/nspawn/nspawn.c -+++ git/src/nspawn/nspawn.c -@@ -143,6 +143,8 @@ typedef struct CustomMount { - char **lower; - } CustomMount; - -+#include "config.h" -+ - static char *arg_directory = NULL; - static char *arg_template = NULL; - static char *arg_user = NULL; -@@ -4238,7 +4240,12 @@ static int inner_child( - a[0] = (char*) "/sbin/init"; - execve(a[0], a, env_use); - } else if (argc > optind) -+#ifdef HAVE_EXECVPE - execvpe(argv[optind], argv + optind, env_use); -+#else -+ environ = env_use; -+ execvp(argv[optind], argv + optind); -+#endif /* HAVE_EXECVPE */ - else { - chdir(home ? home : "/root"); - execle("/bin/bash", "-bash", NULL, env_use); diff --git a/yocto-poky/meta/recipes-core/systemd/systemd/0004-configure-Check-for-additional-features-that-uclibc-.patch b/yocto-poky/meta/recipes-core/systemd/systemd/0006-configure-Check-for-additional-features-that-uclibc-.patch index 8078da9bb..0d6375573 100644 --- a/yocto-poky/meta/recipes-core/systemd/systemd/0004-configure-Check-for-additional-features-that-uclibc-.patch +++ b/yocto-poky/meta/recipes-core/systemd/systemd/0006-configure-Check-for-additional-features-that-uclibc-.patch @@ -1,7 +1,7 @@ -From 4e2e8dbf3f23ab7dca32286cc0f37bff6ac49e22 Mon Sep 17 00:00:00 2001 +From bb6f1d8a000b337280541afde7cccdcfe03cdeb1 Mon Sep 17 00:00:00 2001 From: Khem Raj <raj.khem@gmail.com> Date: Fri, 20 Feb 2015 05:05:45 +0000 -Subject: [PATCH 04/11] configure: Check for additional features that uclibc +Subject: [PATCH 06/36] configure: Check for additional features that uclibc doesnt support This helps in supporting uclibc which does not have all features that @@ -14,11 +14,11 @@ Signed-off-by: Khem Raj <raj.khem@gmail.com> configure.ac | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) -Index: git/configure.ac -=================================================================== ---- git.orig/configure.ac -+++ git/configure.ac -@@ -110,6 +110,24 @@ AC_PATH_PROG([UMOUNT_PATH], [umount], [/ +diff --git a/configure.ac b/configure.ac +index f51533c..0239fd0 100644 +--- a/configure.ac ++++ b/configure.ac +@@ -112,6 +112,24 @@ AC_PATH_PROG([UMOUNT_PATH], [umount], [/usr/bin/umount], [$PATH:/usr/sbin:/sbin] AS_IF([! ln --relative --help > /dev/null 2>&1], [AC_MSG_ERROR([*** ln doesn't support --relative ***])]) @@ -43,3 +43,6 @@ Index: git/configure.ac M4_DEFINES= AC_CHECK_TOOL(OBJCOPY, objcopy) +-- +1.8.3.1 + diff --git a/yocto-poky/meta/recipes-core/systemd/systemd/0006-journal-Use-posix-fallocate-only-if-available.patch b/yocto-poky/meta/recipes-core/systemd/systemd/0006-journal-Use-posix-fallocate-only-if-available.patch deleted file mode 100644 index 631dd7746..000000000 --- a/yocto-poky/meta/recipes-core/systemd/systemd/0006-journal-Use-posix-fallocate-only-if-available.patch +++ /dev/null @@ -1,96 +0,0 @@ -From 34a61b6c9eed3fad360066fb63132ebc7e0aaaa6 Mon Sep 17 00:00:00 2001 -From: Khem Raj <raj.khem@gmail.com> -Date: Fri, 20 Feb 2015 05:12:48 +0000 -Subject: [PATCH 06/11] journal: Use posix fallocate only if available - -Some architecture ports in uclibc did not support it in past - -Upstream-Status: Denied [no desire for uclibc support] - -Signed-off-by: Khem Raj <raj.khem@gmail.com> -Signed-off-by: Chen Qi <Qi.Chen@windriver.com> ---- - src/journal/journal-file.c | 16 +++++++++++++++- - src/journal/journald-kmsg.c | 15 ++++++++++++++- - 2 files changed, 29 insertions(+), 2 deletions(-) - -diff --git a/src/journal/journal-file.c b/src/journal/journal-file.c -index 2845e05..9431171 100644 ---- a/src/journal/journal-file.c -+++ b/src/journal/journal-file.c -@@ -36,6 +36,8 @@ - #include "compress.h" - #include "fsprg.h" - -+#include "config.h" -+ - #define DEFAULT_DATA_HASH_TABLE_SIZE (2047ULL*sizeof(HashItem)) - #define DEFAULT_FIELD_HASH_TABLE_SIZE (333ULL*sizeof(HashItem)) - -@@ -354,7 +356,7 @@ static int journal_file_fstat(JournalFile *f) { - - static int journal_file_allocate(JournalFile *f, uint64_t offset, uint64_t size) { - uint64_t old_size, new_size; -- int r; -+ int r = 0; - - assert(f); - -@@ -418,9 +420,21 @@ static int journal_file_allocate(JournalFile *f, uint64_t offset, uint64_t size) - /* Note that the glibc fallocate() fallback is very - inefficient, hence we try to minimize the allocation area - as we can. */ -+#ifdef HAVE_POSIX_FALLOCATE - r = posix_fallocate(f->fd, old_size, new_size - old_size); - if (r != 0) - return -r; -+#else -+ /* Write something every 512 bytes to make sure the block is allocated */ -+ uint64_t len = new_size - old_size; -+ uint64_t offset = old_size; -+ for (offset += (len-1) % 512; len > 0; offset += 512) { -+ len -= 512; -+ if (pwrite(f->fd, "", 1, offset) != 1) -+ return -errno; -+ } -+ -+#endif /* HAVE_POSIX_FALLOCATE */ - - f->header->arena_size = htole64(new_size - le64toh(f->header->header_size)); - -diff --git a/src/journal/journald-kmsg.c b/src/journal/journald-kmsg.c -index c4216c4..a998ed5 100644 ---- a/src/journal/journald-kmsg.c -+++ b/src/journal/journald-kmsg.c -@@ -436,6 +436,7 @@ fail: - int server_open_kernel_seqnum(Server *s) { - _cleanup_close_ int fd; - uint64_t *p; -+ int r = 0; - - assert(s); - -@@ -449,7 +450,19 @@ int server_open_kernel_seqnum(Server *s) { - return 0; - } - -- if (posix_fallocate(fd, 0, sizeof(uint64_t)) < 0) { -+#ifdef HAVE_POSIX_FALLOCATE -+ r = posix_fallocate(fd, 0, sizeof(uint64_t)); -+#else -+ /* Use good old method to write zeros into the journal file -+ perhaps very inefficient yet working. */ -+ char *buf = alloca(sizeof(uint64_t)); -+ off_t oldpos = lseek(fd, 0, SEEK_CUR); -+ bzero(buf, sizeof(uint64_t)); -+ lseek(fd, 0, SEEK_SET); -+ r = write(fd, buf, sizeof(uint64_t)); -+ lseek(fd, oldpos, SEEK_SET); -+#endif /* HAVE_POSIX_FALLOCATE */ -+ if (r < 0) { - log_error_errno(errno, "Failed to allocate sequential number file, ignoring: %m"); - return 0; - } --- -2.1.4 - diff --git a/yocto-poky/meta/recipes-core/systemd/systemd/0007-use-lnr-wrapper-instead-of-looking-for-relative-opti.patch b/yocto-poky/meta/recipes-core/systemd/systemd/0007-use-lnr-wrapper-instead-of-looking-for-relative-opti.patch new file mode 100644 index 000000000..12f6ace93 --- /dev/null +++ b/yocto-poky/meta/recipes-core/systemd/systemd/0007-use-lnr-wrapper-instead-of-looking-for-relative-opti.patch @@ -0,0 +1,61 @@ +From fa5e137fbd2fb081ae897575377d718ee8cb6349 Mon Sep 17 00:00:00 2001 +From: Khem Raj <raj.khem@gmail.com> +Date: Sun, 20 Dec 2015 04:20:28 +0000 +Subject: [PATCH 07/36] use lnr wrapper instead of looking for --relative + option for ln + +Upstream-Status: Inappropriate [OE-Specific] + +Signed-off-by: Khem Raj <raj.khem@gmail.com> +--- + Makefile.am | 6 +++--- + configure.ac | 2 -- + 2 files changed, 3 insertions(+), 5 deletions(-) + +diff --git a/Makefile.am b/Makefile.am +index 629740f..82b6553 100644 +--- a/Makefile.am ++++ b/Makefile.am +@@ -243,7 +243,7 @@ define move-to-rootlibdir + $(MKDIR_P) $(DESTDIR)$(rootlibdir) && \ + so_img_name=$$(readlink $(DESTDIR)$(libdir)/$$libname) && \ + rm -f $(DESTDIR)$(libdir)/$$libname && \ +- $(LN_S) --relative -f $(DESTDIR)$(rootlibdir)/$$so_img_name $(DESTDIR)$(libdir)/$$libname && \ ++ lnr $(DESTDIR)$(rootlibdir)/$$so_img_name $(DESTDIR)$(libdir)/$$libname && \ + mv $(DESTDIR)$(libdir)/$$libname.* $(DESTDIR)$(rootlibdir); \ + fi + endef +@@ -317,7 +317,7 @@ define install-relative-aliases + while [ -n "$$1" ]; do \ + $(MKDIR_P) `dirname $(DESTDIR)$$dir/$$2` && \ + rm -f $(DESTDIR)$$dir/$$2 && \ +- $(LN_S) --relative $(DESTDIR)$$1 $(DESTDIR)$$dir/$$2 && \ ++ lnr $(DESTDIR)$$1 $(DESTDIR)$$dir/$$2 && \ + shift 2 || exit $$?; \ + done + endef +@@ -2781,7 +2781,7 @@ systemd_dbus1_generator_LDADD = \ + dbus1-generator-install-hook: + $(AM_V_at)$(MKDIR_P) $(DESTDIR)$(usergeneratordir) + $(AM_V_RM)rm -f $(DESTDIR)$(usergeneratordir)/systemd-dbus1-generator +- $(AM_V_LN)$(LN_S) --relative -f $(DESTDIR)$(systemgeneratordir)/systemd-dbus1-generator $(DESTDIR)$(usergeneratordir)/systemd-dbus1-generator ++ $(AM_V_LN)lnr $(DESTDIR)$(systemgeneratordir)/systemd-dbus1-generator $(DESTDIR)$(usergeneratordir)/systemd-dbus1-generator + + dbus1-generator-uninstall-hook: + rm -f $(DESTDIR)$(usergeneratordir)/systemd-dbus1-generator +diff --git a/configure.ac b/configure.ac +index 0239fd0..c5ab9d0 100644 +--- a/configure.ac ++++ b/configure.ac +@@ -110,8 +110,6 @@ AC_PATH_PROG([SULOGIN], [sulogin], [/usr/sbin/sulogin], [$PATH:/usr/sbin:/sbin]) + AC_PATH_PROG([MOUNT_PATH], [mount], [/usr/bin/mount], [$PATH:/usr/sbin:/sbin]) + AC_PATH_PROG([UMOUNT_PATH], [umount], [/usr/bin/umount], [$PATH:/usr/sbin:/sbin]) + +-AS_IF([! ln --relative --help > /dev/null 2>&1], [AC_MSG_ERROR([*** ln doesn't support --relative ***])]) +- + # check for few functions not implemented in uClibc + + AC_CHECK_FUNCS_ONCE(mkostemp execvpe posix_fallocate) +-- +1.8.3.1 + diff --git a/yocto-poky/meta/recipes-core/systemd/systemd/0007-util-Use-mkostemp-only-if-libc-supports-it.patch b/yocto-poky/meta/recipes-core/systemd/systemd/0007-util-Use-mkostemp-only-if-libc-supports-it.patch deleted file mode 100644 index b8ab7c4e7..000000000 --- a/yocto-poky/meta/recipes-core/systemd/systemd/0007-util-Use-mkostemp-only-if-libc-supports-it.patch +++ /dev/null @@ -1,42 +0,0 @@ -From f771407d3e0288ca0c06a894194d3ddad69b9a8e Mon Sep 17 00:00:00 2001 -From: Khem Raj <raj.khem@gmail.com> -Date: Fri, 20 Feb 2015 05:17:05 +0000 -Subject: [PATCH 07/11] util: Use mkostemp only if libc supports it - -Upstream-Status: Denied [no desire for uclibc support] - -Signed-off-by: Khem Raj <raj.khem@gmail.com> ---- - src/basic/util.c | 8 ++++++++ - 1 file changed, 8 insertions(+) - -diff --git a/src/basic/util.c b/src/basic/util.c -index dc65280..72f4665 100644 ---- a/src/basic/util.c -+++ b/src/basic/util.c -@@ -97,6 +97,8 @@ - #include "def.h" - #include "sparse-endian.h" - -+#include "config.h" -+ - int saved_argc = 0; - char **saved_argv = NULL; - -@@ -6682,7 +6684,13 @@ int mkostemp_safe(char *pattern, int flags) { - - u = umask(077); - -+#ifdef HAVE_MKOSTEMP - fd = mkostemp(pattern, flags); -+#else -+ fd = mkstemp(pattern); -+ if (fd >= 0) fcntl(fd, F_SETFD, flags); -+#endif /* HAVE_MKOSTEMP */ -+ - if (fd < 0) - return -errno; - --- -2.1.4 - diff --git a/yocto-poky/meta/recipes-core/systemd/systemd/0008-nspawn-Use-execvpe-only-when-libc-supports-it.patch b/yocto-poky/meta/recipes-core/systemd/systemd/0008-nspawn-Use-execvpe-only-when-libc-supports-it.patch new file mode 100644 index 000000000..6e6f199ef --- /dev/null +++ b/yocto-poky/meta/recipes-core/systemd/systemd/0008-nspawn-Use-execvpe-only-when-libc-supports-it.patch @@ -0,0 +1,41 @@ +From ae999ff50efb9cc82537adef7696c6f732afcfc8 Mon Sep 17 00:00:00 2001 +From: Khem Raj <raj.khem@gmail.com> +Date: Fri, 20 Feb 2015 05:10:37 +0000 +Subject: [PATCH 08/36] nspawn: Use execvpe only when libc supports it + +Upstream-Status: Denied [no desire for uclibc support] + +Signed-off-by: Khem Raj <raj.khem@gmail.com> +--- + src/nspawn/nspawn.c | 7 +++++++ + 1 file changed, 7 insertions(+) + +diff --git a/src/nspawn/nspawn.c b/src/nspawn/nspawn.c +index 5a68fec..65e65ec 100644 +--- a/src/nspawn/nspawn.c ++++ b/src/nspawn/nspawn.c +@@ -111,6 +111,8 @@ typedef enum LinkJournal { + LINK_GUEST + } LinkJournal; + ++#include "config.h" ++ + static char *arg_directory = NULL; + static char *arg_template = NULL; + static char *arg_chdir = NULL; +@@ -2637,7 +2639,12 @@ static int inner_child( + a[0] = (char*) "/sbin/init"; + execve(a[0], a, env_use); + } else if (!strv_isempty(arg_parameters)) ++#ifdef HAVE_EXECVPE + execvpe(arg_parameters[0], arg_parameters, env_use); ++#else ++ environ = env_use; ++ execvp(arg_parameters[0], arg_parameters); ++#endif /* HAVE_EXECVPE */ + else { + if (!arg_chdir) + chdir(home ?: "/root"); +-- +1.8.3.1 + diff --git a/yocto-poky/meta/recipes-core/systemd/systemd/0008-util-bypass-unimplemented-_SC_PHYS_PAGES-system-conf.patch b/yocto-poky/meta/recipes-core/systemd/systemd/0009-util-bypass-unimplemented-_SC_PHYS_PAGES-system-conf.patch index 3f4d4de08..116f3d4de 100644 --- a/yocto-poky/meta/recipes-core/systemd/systemd/0008-util-bypass-unimplemented-_SC_PHYS_PAGES-system-conf.patch +++ b/yocto-poky/meta/recipes-core/systemd/systemd/0009-util-bypass-unimplemented-_SC_PHYS_PAGES-system-conf.patch @@ -1,7 +1,7 @@ -From b45ea3bfd6635744c8a6b74d0ac701b44bb1d294 Mon Sep 17 00:00:00 2001 +From 3498f488b27f90398d7c8d1d06aac5ab684370e8 Mon Sep 17 00:00:00 2001 From: Khem Raj <raj.khem@gmail.com> -Date: Fri, 20 Feb 2015 05:19:37 +0000 -Subject: [PATCH 08/11] util: bypass unimplemented _SC_PHYS_PAGES system +Date: Mon, 14 Dec 2015 00:47:53 +0000 +Subject: [PATCH 09/36] util: bypass unimplemented _SC_PHYS_PAGES system configuration API on uclibc Upstream-Status: Inappropriate [uclibc-specific] @@ -12,10 +12,10 @@ Signed-off-by: Khem Raj <raj.khem@gmail.com> 1 file changed, 15 insertions(+) diff --git a/src/basic/util.c b/src/basic/util.c -index 72f4665..cbbe3b1 100644 +index ea1bed7..fdaf340 100644 --- a/src/basic/util.c +++ b/src/basic/util.c -@@ -6793,10 +6793,25 @@ uint64_t physical_memory(void) { +@@ -767,10 +767,25 @@ uint64_t physical_memory(void) { /* We return this as uint64_t in case we are running as 32bit * process on a 64bit kernel with huge amounts of memory */ @@ -25,7 +25,7 @@ index 72f4665..cbbe3b1 100644 + if (f == NULL) + return 0; + while (!feof(f) && fgets(line, sizeof(line)-1, f)) { -+ if (sscanf(line, "MemTotal: %l kB", &mem) == 1) { ++ if (sscanf(line, "MemTotal: %li kB", &mem) == 1) { + mem *= 1024; + break; + } @@ -40,7 +40,7 @@ index 72f4665..cbbe3b1 100644 +#endif } - void hexdump(FILE *f, const void *p, size_t s) { + int update_reboot_param_file(const char *param) { -- -2.1.4 +1.8.3.1 diff --git a/yocto-poky/meta/recipes-core/systemd/systemd/0012-implment-systemd-sysv-install-for-OE.patch b/yocto-poky/meta/recipes-core/systemd/systemd/0010-implment-systemd-sysv-install-for-OE.patch index 68b45a9a5..75fa3a54e 100644 --- a/yocto-poky/meta/recipes-core/systemd/systemd/0012-implment-systemd-sysv-install-for-OE.patch +++ b/yocto-poky/meta/recipes-core/systemd/systemd/0010-implment-systemd-sysv-install-for-OE.patch @@ -1,7 +1,7 @@ -From 5f8b9f2d276c0ddbcbf5423733a23f043d688009 Mon Sep 17 00:00:00 2001 +From 5f94f5ad46c1ded54c3797979d384e4c1eb77bb0 Mon Sep 17 00:00:00 2001 From: Khem Raj <raj.khem@gmail.com> Date: Sat, 5 Sep 2015 06:31:47 +0000 -Subject: [PATCH] implment systemd-sysv-install for OE +Subject: [PATCH 10/36] implment systemd-sysv-install for OE Use update-rc.d for enabling/disabling and status command to check the status of the sysv service @@ -13,10 +13,10 @@ Signed-off-by: Khem Raj <raj.khem@gmail.com> src/systemctl/systemd-sysv-install.SKELETON | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) -Index: git/src/systemctl/systemd-sysv-install.SKELETON -=================================================================== ---- git.orig/src/systemctl/systemd-sysv-install.SKELETON -+++ git/src/systemctl/systemd-sysv-install.SKELETON +diff --git a/src/systemctl/systemd-sysv-install.SKELETON b/src/systemctl/systemd-sysv-install.SKELETON +index a53a3e6..5d877b0 100755 +--- a/src/systemctl/systemd-sysv-install.SKELETON ++++ b/src/systemctl/systemd-sysv-install.SKELETON @@ -30,17 +30,17 @@ case "$1" in enable) # call the command to enable SysV init script $NAME here @@ -38,3 +38,6 @@ Index: git/src/systemctl/systemd-sysv-install.SKELETON ;; *) usage ;; +-- +1.8.3.1 + diff --git a/yocto-poky/meta/recipes-core/systemd/systemd/0011-nss-mymachines-Build-conditionally-when-HAVE_MYHOSTN.patch b/yocto-poky/meta/recipes-core/systemd/systemd/0011-nss-mymachines-Build-conditionally-when-HAVE_MYHOSTN.patch new file mode 100644 index 000000000..34ae64535 --- /dev/null +++ b/yocto-poky/meta/recipes-core/systemd/systemd/0011-nss-mymachines-Build-conditionally-when-HAVE_MYHOSTN.patch @@ -0,0 +1,38 @@ +From 2b2450f6b7197bff4637c0283e8784500471d083 Mon Sep 17 00:00:00 2001 +From: Khem Raj <raj.khem@gmail.com> +Date: Mon, 14 Dec 2015 00:50:01 +0000 +Subject: [PATCH 11/36] nss-mymachines: Build conditionally when + HAVE_MYHOSTNAME is set + +Fixes build failures when building with --disable-myhostname + +Upstream-Status: Pending + +Signed-off-by: Khem Raj <raj.khem@gmail.com> +--- + Makefile.am | 2 ++ + 1 file changed, 2 insertions(+) + +diff --git a/Makefile.am b/Makefile.am +index 82b6553..b3f3343 100644 +--- a/Makefile.am ++++ b/Makefile.am +@@ -4876,6 +4876,7 @@ SYSTEM_UNIT_ALIASES += \ + BUSNAMES_TARGET_WANTS += \ + org.freedesktop.machine1.busname + ++if HAVE_MYHOSTNAME + libnss_mymachines_la_SOURCES = \ + src/nss-mymachines/nss-mymachines.sym \ + src/nss-mymachines/nss-mymachines.c +@@ -4896,6 +4897,7 @@ lib_LTLIBRARIES += \ + libnss_mymachines.la + + endif ++endif + + polkitpolicy_in_files += \ + src/machine/org.freedesktop.machine1.policy.in +-- +1.8.3.1 + diff --git a/yocto-poky/meta/recipes-core/systemd/systemd/rules-whitelist-hd-devices.patch b/yocto-poky/meta/recipes-core/systemd/systemd/0012-rules-whitelist-hd-devices.patch index 8975b05e0..6143088e8 100644 --- a/yocto-poky/meta/recipes-core/systemd/systemd/rules-whitelist-hd-devices.patch +++ b/yocto-poky/meta/recipes-core/systemd/systemd/0012-rules-whitelist-hd-devices.patch @@ -1,7 +1,7 @@ -From f77b7e5626e70c3a775e993816a33af5a61dea42 Mon Sep 17 00:00:00 2001 +From 5ebc0d87565a73710dea602c00b1586d5a1364e5 Mon Sep 17 00:00:00 2001 From: Patrick Ohly <patrick.ohly@intel.com> Date: Wed, 16 Sep 2015 13:55:58 +0200 -Subject: [PATCH] rules: whitelist hd* devices +Subject: [PATCH 12/36] rules: whitelist hd* devices qemu by default emulates IDE and the linux-yocto kernel(s) use CONFIG_IDE instead of the more modern libsata, so disks appear as @@ -28,5 +28,5 @@ index 0b14bb4..1c4d97a 100644 # ignore partitions that span the entire disk TEST=="whole_disk", GOTO="persistent_storage_end" -- -2.1.4 +1.8.3.1 diff --git a/yocto-poky/meta/recipes-core/systemd/systemd/0009-sysv-generator-add-support-for-executing-scripts-und.patch b/yocto-poky/meta/recipes-core/systemd/systemd/0013-sysv-generator-add-support-for-executing-scripts-und.patch index 9ea3e83e5..ac67f6568 100644 --- a/yocto-poky/meta/recipes-core/systemd/systemd/0009-sysv-generator-add-support-for-executing-scripts-und.patch +++ b/yocto-poky/meta/recipes-core/systemd/systemd/0013-sysv-generator-add-support-for-executing-scripts-und.patch @@ -1,7 +1,7 @@ -From 8791b5b3934c55694872b6915a67340683ead91b Mon Sep 17 00:00:00 2001 +From 6736de4a3caf9a0b3c888c6cc05103ab1b86907d Mon Sep 17 00:00:00 2001 From: Khem Raj <raj.khem@gmail.com> -Date: Fri, 20 Feb 2015 05:22:52 +0000 -Subject: [PATCH 09/11] sysv-generator: add support for executing scripts under +Date: Mon, 14 Dec 2015 05:09:53 +0000 +Subject: [PATCH 13/36] sysv-generator: add support for executing scripts under /etc/rcS.d/ To be compatible, all services translated from scripts under /etc/rcS.d would @@ -12,14 +12,14 @@ Upstream-Status: Inappropriate [OE specific] Signed-off-by: Chen Qi <Qi.Chen@windriver.com> Signed-off-by: Khem Raj <raj.khem@gmail.com> --- - src/sysv-generator/sysv-generator.c | 50 ++++++++++++++++++++++++++++--------- - 1 file changed, 38 insertions(+), 12 deletions(-) + src/sysv-generator/sysv-generator.c | 47 ++++++++++++++++++++++++++++--------- + 1 file changed, 36 insertions(+), 11 deletions(-) diff --git a/src/sysv-generator/sysv-generator.c b/src/sysv-generator/sysv-generator.c -index bd67f32..6756cc6 100644 +index b5925a4..ea06d6a 100644 --- a/src/sysv-generator/sysv-generator.c +++ b/src/sysv-generator/sysv-generator.c -@@ -42,7 +42,8 @@ +@@ -44,7 +44,8 @@ typedef enum RunlevelType { RUNLEVEL_UP, @@ -29,7 +29,7 @@ index bd67f32..6756cc6 100644 } RunlevelType; static const struct { -@@ -57,6 +58,9 @@ static const struct { +@@ -59,6 +60,9 @@ static const struct { { "rc4.d", SPECIAL_MULTI_USER_TARGET, RUNLEVEL_UP }, { "rc5.d", SPECIAL_GRAPHICAL_TARGET, RUNLEVEL_UP }, @@ -39,7 +39,7 @@ index bd67f32..6756cc6 100644 /* Standard SysV runlevels for shutdown */ { "rc0.d", SPECIAL_POWEROFF_TARGET, RUNLEVEL_DOWN }, { "rc6.d", SPECIAL_REBOOT_TARGET, RUNLEVEL_DOWN } -@@ -65,7 +69,7 @@ static const struct { +@@ -67,7 +71,7 @@ static const struct { directories in this order, and we want to make sure that sysv_start_priority is known when we first load the unit. And that value we only know from S links. Hence @@ -47,27 +47,17 @@ index bd67f32..6756cc6 100644 + UP/SYSINIT must be read before DOWN */ }; - typedef struct SysvStub { -@@ -81,6 +85,8 @@ typedef struct SysvStub { - char **conflicts; + static const char *arg_dest = "/tmp"; +@@ -86,6 +90,8 @@ typedef struct SysvStub { bool has_lsb; bool reload; + bool loaded; + bool default_dependencies; + bool from_rcsd; } SysvStub; - const char *arg_dest = "/tmp"; -@@ -183,6 +189,9 @@ static int generate_unit_file(SysvStub *s) { - "Description=%s\n", - s->path, s->description); - -+ if (!s->default_dependencies) -+ fprintf(f, "DefaultDependencies=no\n"); -+ - if (!isempty(before)) - fprintf(f, "Before=%s\n", before); - if (!isempty(after)) -@@ -704,18 +713,30 @@ static int fix_order(SysvStub *s, Hashmap *all_services) { + static void free_sysvstub(SysvStub *s) { +@@ -711,17 +717,31 @@ static int fix_order(SysvStub *s, Hashmap *all_services) { if (s->has_lsb && other->has_lsb) continue; @@ -79,15 +69,14 @@ index bd67f32..6756cc6 100644 + r = strv_extend(&s->before, other->name); if (r < 0) return log_oom(); -- } -- else if (other->sysv_start_priority > s->sysv_start_priority) { + +- } else if (other->sysv_start_priority > s->sysv_start_priority) { - r = strv_extend(&s->before, other->name); + } else if (other->from_rcsd && !s->from_rcsd) { + r = strv_extend(&s->after, other->name); if (r < 0) return log_oom(); -- } -- else +- } else - continue; + } else { + if (other->sysv_start_priority < s->sysv_start_priority) { @@ -102,11 +91,11 @@ index bd67f32..6756cc6 100644 + } + else + continue; -+ } ++ } /* FIXME: Maybe we should compare the name here lexicographically? */ } -@@ -778,6 +799,8 @@ static int enumerate_sysv(LookupPaths lp, Hashmap *all_services) { +@@ -788,6 +808,8 @@ static int enumerate_sysv(const LookupPaths *lp, Hashmap *all_services) { return log_oom(); service->sysv_start_priority = -1; @@ -114,22 +103,23 @@ index bd67f32..6756cc6 100644 + service->from_rcsd = false; service->name = name; service->path = fpath; - -@@ -864,9 +887,11 @@ static int set_dependencies_from_rcnd(LookupPaths lp, Hashmap *all_services) { + name = fpath = NULL; +@@ -871,9 +893,11 @@ static int set_dependencies_from_rcnd(const LookupPaths *lp, Hashmap *all_servic if (de->d_name[0] == 'S') { -- if (rcnd_table[i].type == RUNLEVEL_UP) { +- if (rcnd_table[i].type == RUNLEVEL_UP) + if (rcnd_table[i].type == RUNLEVEL_UP || rcnd_table[i].type == RUNLEVEL_SYSINIT) { - service->sysv_start_priority = - MAX(a*10 + b, service->sysv_start_priority); + service->sysv_start_priority = MAX(a*10 + b, service->sysv_start_priority); +- + service->default_dependencies = (rcnd_table[i].type == RUNLEVEL_SYSINIT)?false:true; + service->from_rcsd = (rcnd_table[i].type == RUNLEVEL_SYSINIT)?true:false; - } - ++ } r = set_ensure_allocated(&runlevel_services[i], NULL); -@@ -878,7 +903,8 @@ static int set_dependencies_from_rcnd(LookupPaths lp, Hashmap *all_services) { - goto finish; + if (r < 0) { + log_oom(); +@@ -887,7 +911,8 @@ static int set_dependencies_from_rcnd(const LookupPaths *lp, Hashmap *all_servic + } } else if (de->d_name[0] == 'K' && - (rcnd_table[i].type == RUNLEVEL_DOWN)) { @@ -137,7 +127,7 @@ index bd67f32..6756cc6 100644 + rcnd_table[i].type == RUNLEVEL_SYSINIT)) { r = set_ensure_allocated(&shutdown_services, NULL); - if (r < 0) + if (r < 0) { -- -2.1.4 +1.8.3.1 diff --git a/yocto-poky/meta/recipes-core/systemd/systemd/0010-Make-root-s-home-directory-configurable.patch b/yocto-poky/meta/recipes-core/systemd/systemd/0014-Make-root-s-home-directory-configurable.patch index ed7ff5b09..4a576aa7d 100644 --- a/yocto-poky/meta/recipes-core/systemd/systemd/0010-Make-root-s-home-directory-configurable.patch +++ b/yocto-poky/meta/recipes-core/systemd/systemd/0014-Make-root-s-home-directory-configurable.patch @@ -1,7 +1,7 @@ -From 3dc731c1d270e2e143de621db9bd898299fd849d Mon Sep 17 00:00:00 2001 +From 786883cfa13e21f060ee6da6cabb94845f4349a0 Mon Sep 17 00:00:00 2001 From: Khem Raj <raj.khem@gmail.com> -Date: Fri, 20 Feb 2015 05:24:49 +0000 -Subject: [PATCH 10/11] Make root's home directory configurable +Date: Mon, 14 Dec 2015 05:18:20 +0000 +Subject: [PATCH 14/36] Make root's home directory configurable OpenEmbedded has a configurable home directory for root. Allow systemd to be built using its idea of what root's home directory @@ -17,19 +17,19 @@ Signed-off-by: Khem Raj <raj.khem@gmail.com> --- Makefile.am | 2 ++ configure.ac | 7 +++++++ - src/core/unit-printf.c | 2 +- + src/basic/user-util.c | 4 ++-- + src/core/namespace.c | 2 +- src/nspawn/nspawn.c | 4 ++-- - src/basic/util.c | 4 ++-- units/console-shell.service.m4.in | 4 ++-- units/emergency.service.in | 4 ++-- units/rescue.service.in | 4 ++-- 8 files changed, 20 insertions(+), 11 deletions(-) -Index: git/Makefile.am -=================================================================== ---- git.orig/Makefile.am -+++ git/Makefile.am -@@ -208,6 +208,7 @@ AM_CPPFLAGS = \ +diff --git a/Makefile.am b/Makefile.am +index b3f3343..a99e8eb 100644 +--- a/Makefile.am ++++ b/Makefile.am +@@ -202,6 +202,7 @@ AM_CPPFLAGS = \ -DLIBDIR=\"$(libdir)\" \ -DROOTLIBDIR=\"$(rootlibdir)\" \ -DROOTLIBEXECDIR=\"$(rootlibexecdir)\" \ @@ -37,7 +37,7 @@ Index: git/Makefile.am -DTEST_DIR=\"$(abs_top_srcdir)/test\" \ -I $(top_srcdir)/src \ -I $(top_builddir)/src/basic \ -@@ -5615,6 +5616,7 @@ EXTRA_DIST += \ +@@ -5713,6 +5714,7 @@ EXTRA_DIST += \ substitutions = \ '|rootlibexecdir=$(rootlibexecdir)|' \ '|rootbindir=$(rootbindir)|' \ @@ -45,11 +45,11 @@ Index: git/Makefile.am '|bindir=$(bindir)|' \ '|SYSTEMCTL=$(rootbindir)/systemctl|' \ '|SYSTEMD_NOTIFY=$(rootbindir)/systemd-notify|' \ -Index: git/configure.ac -=================================================================== ---- git.orig/configure.ac -+++ git/configure.ac -@@ -1383,6 +1383,11 @@ AC_ARG_WITH([rootlibdir], +diff --git a/configure.ac b/configure.ac +index c5ab9d0..16c83bb 100644 +--- a/configure.ac ++++ b/configure.ac +@@ -1470,6 +1470,11 @@ AC_ARG_WITH([rootlibdir], [with_rootlibdir=${libdir}]) AX_NORMALIZE_PATH([with_rootlibdir]) @@ -61,7 +61,7 @@ Index: git/configure.ac AC_ARG_WITH([pamlibdir], AS_HELP_STRING([--with-pamlibdir=DIR], [Directory for PAM modules]), [], -@@ -1474,6 +1479,7 @@ AC_SUBST([pamlibdir], [$with_pamlibdir]) +@@ -1553,6 +1558,7 @@ AC_SUBST([pamlibdir], [$with_pamlibdir]) AC_SUBST([pamconfdir], [$with_pamconfdir]) AC_SUBST([rootprefix], [$with_rootprefix]) AC_SUBST([rootlibdir], [$with_rootlibdir]) @@ -69,7 +69,7 @@ Index: git/configure.ac AC_CONFIG_FILES([ Makefile -@@ -1563,6 +1569,7 @@ AC_MSG_RESULT([ +@@ -1643,6 +1649,7 @@ AC_MSG_RESULT([ includedir: ${includedir} lib dir: ${libdir} rootlib dir: ${with_rootlibdir} @@ -77,46 +77,11 @@ Index: git/configure.ac SysV init scripts: ${SYSTEM_SYSVINIT_PATH} SysV rc?.d directories: ${SYSTEM_SYSVRCND_PATH} Build Python: ${PYTHON} -Index: git/src/core/unit-printf.c -=================================================================== ---- git.orig/src/core/unit-printf.c -+++ git/src/core/unit-printf.c -@@ -237,7 +237,7 @@ static int specifier_user_home(char spec - * best of it if we can, but fail if we can't */ - - if (!c->user || streq(c->user, "root") || streq(c->user, "0")) -- n = strdup("/root"); -+ n = strdup(ROOTHOMEDIR); - else - return -EOPNOTSUPP; - -Index: git/src/nspawn/nspawn.c -=================================================================== ---- git.orig/src/nspawn/nspawn.c -+++ git/src/nspawn/nspawn.c -@@ -4176,7 +4176,7 @@ static int inner_child( - if (envp[n_env]) - n_env ++; - -- if ((asprintf((char**)(envp + n_env++), "HOME=%s", home ? home: "/root") < 0) || -+ if ((asprintf((char**)(envp + n_env++), "HOME=%s", home ? home: ROOTHOMEDIR) < 0) || - (asprintf((char**)(envp + n_env++), "USER=%s", arg_user ? arg_user : "root") < 0) || - (asprintf((char**)(envp + n_env++), "LOGNAME=%s", arg_user ? arg_user : "root") < 0)) - return log_oom(); -@@ -4247,7 +4247,7 @@ static int inner_child( - execvp(argv[optind], argv + optind); - #endif /* HAVE_EXECVPE */ - else { -- chdir(home ? home : "/root"); -+ chdir(home ? home : ROOTHOMEDIR); - execle("/bin/bash", "-bash", NULL, env_use); - execle("/bin/sh", "-sh", NULL, env_use); - } -Index: git/src/basic/util.c -=================================================================== ---- git.orig/src/basic/util.c -+++ git/src/basic/util.c -@@ -3233,7 +3233,7 @@ int get_user_creds( +diff --git a/src/basic/user-util.c b/src/basic/user-util.c +index 19155bc..55672b3 100644 +--- a/src/basic/user-util.c ++++ b/src/basic/user-util.c +@@ -122,7 +122,7 @@ int get_user_creds( *gid = 0; if (home) @@ -125,7 +90,7 @@ Index: git/src/basic/util.c if (shell) *shell = "/bin/sh"; -@@ -4069,7 +4069,7 @@ int get_home_dir(char **_h) { +@@ -353,7 +353,7 @@ int get_home_dir(char **_h) { /* Hardcode home directory for root to avoid NSS */ u = getuid(); if (u == 0) { @@ -134,48 +99,86 @@ Index: git/src/basic/util.c if (!h) return -ENOMEM; -Index: git/units/console-shell.service.m4.in -=================================================================== ---- git.orig/units/console-shell.service.m4.in -+++ git/units/console-shell.service.m4.in +diff --git a/src/core/namespace.c b/src/core/namespace.c +index b573f00..0f70b14 100644 +--- a/src/core/namespace.c ++++ b/src/core/namespace.c +@@ -409,7 +409,7 @@ int setup_namespace( + home_dir = strjoina("-", home_dir); + run_user_dir = prefix_roota(root_directory, "/run/user"); + run_user_dir = strjoina("-", run_user_dir); +- root_dir = prefix_roota(root_directory, "/root"); ++ root_dir = prefix_roota(root_directory, ROOTHOMEDIR); + root_dir = strjoina("-", root_dir); + + r = append_mounts(&m, STRV_MAKE(home_dir, run_user_dir, root_dir), +diff --git a/src/nspawn/nspawn.c b/src/nspawn/nspawn.c +index 65e65ec..12f0ee8 100644 +--- a/src/nspawn/nspawn.c ++++ b/src/nspawn/nspawn.c +@@ -2564,7 +2564,7 @@ static int inner_child( + if (envp[n_env]) + n_env ++; + +- if ((asprintf((char**)(envp + n_env++), "HOME=%s", home ? home: "/root") < 0) || ++ if ((asprintf((char**)(envp + n_env++), "HOME=%s", home ? home: ROOTHOMEDIR) < 0) || + (asprintf((char**)(envp + n_env++), "USER=%s", arg_user ? arg_user : "root") < 0) || + (asprintf((char**)(envp + n_env++), "LOGNAME=%s", arg_user ? arg_user : "root") < 0)) + return log_oom(); +@@ -2647,7 +2647,7 @@ static int inner_child( + #endif /* HAVE_EXECVPE */ + else { + if (!arg_chdir) +- chdir(home ?: "/root"); ++ chdir(home ?: ROOTHOMEDIR); + + execle("/bin/bash", "-bash", NULL, env_use); + execle("/bin/sh", "-sh", NULL, env_use); +diff --git a/units/console-shell.service.m4.in b/units/console-shell.service.m4.in +index a345ec2..3caae7d 100644 +--- a/units/console-shell.service.m4.in ++++ b/units/console-shell.service.m4.in @@ -15,8 +15,8 @@ After=rc-local.service Before=getty.target [Service] -Environment=HOME=/root --WorkingDirectory=/root +-WorkingDirectory=-/root +Environment=HOME=@roothomedir@ -+WorkingDirectory=@roothomedir@ ++WorkingDirectory=-@roothomedir@ ExecStart=-@SULOGIN@ ExecStopPost=-@SYSTEMCTL@ poweroff Type=idle -Index: git/units/emergency.service.in -=================================================================== ---- git.orig/units/emergency.service.in -+++ git/units/emergency.service.in +diff --git a/units/emergency.service.in b/units/emergency.service.in +index fb390ea..5623a57 100644 +--- a/units/emergency.service.in ++++ b/units/emergency.service.in @@ -14,8 +14,8 @@ Conflicts=rescue.service Before=shutdown.target [Service] -Environment=HOME=/root --WorkingDirectory=/root +-WorkingDirectory=-/root +Environment=HOME=@roothomedir@ -+WorkingDirectory=@roothomedir@ ++WorkingDirectory=-@roothomedir@ ExecStartPre=-/bin/plymouth --wait quit ExecStartPre=-/bin/echo -e 'Welcome to emergency mode! After logging in, type "journalctl -xb" to view\\nsystem logs, "systemctl reboot" to reboot, "systemctl default" or ^D to\\ntry again to boot into default mode.' ExecStart=-/bin/sh -c "@SULOGIN@; @SYSTEMCTL@ --job-mode=fail --no-block default" -Index: git/units/rescue.service.in -=================================================================== ---- git.orig/units/rescue.service.in -+++ git/units/rescue.service.in -@@ -14,8 +14,8 @@ After=sysinit.target plymouth-start.serv +diff --git a/units/rescue.service.in b/units/rescue.service.in +index 92553f6..590ae17 100644 +--- a/units/rescue.service.in ++++ b/units/rescue.service.in +@@ -14,8 +14,8 @@ After=sysinit.target plymouth-start.service Before=shutdown.target [Service] -Environment=HOME=/root --WorkingDirectory=/root +-WorkingDirectory=-/root +Environment=HOME=@roothomedir@ -+WorkingDirectory=@roothomedir@ ++WorkingDirectory=-@roothomedir@ ExecStartPre=-/bin/plymouth quit - ExecStartPre=-/bin/echo -e 'Welcome to emergency mode! After logging in, type "journalctl -xb" to view\\nsystem logs, "systemctl reboot" to reboot, "systemctl default" or ^D to\\nboot into default mode.' + ExecStartPre=-/bin/echo -e 'Welcome to rescue mode! After logging in, type "journalctl -xb" to view\\nsystem logs, "systemctl reboot" to reboot, "systemctl default" or ^D to\\nboot into default mode.' ExecStart=-/bin/sh -c "@SULOGIN@; @SYSTEMCTL@ --job-mode=fail --no-block default" +-- +1.8.3.1 + diff --git a/yocto-poky/meta/recipes-core/systemd/systemd/0011-systemd-user-avoid-using-system-auth.patch b/yocto-poky/meta/recipes-core/systemd/systemd/0015-systemd-user-avoid-using-system-auth.patch index e562bca10..a35123733 100644 --- a/yocto-poky/meta/recipes-core/systemd/systemd/0011-systemd-user-avoid-using-system-auth.patch +++ b/yocto-poky/meta/recipes-core/systemd/systemd/0015-systemd-user-avoid-using-system-auth.patch @@ -1,7 +1,7 @@ -From 7e202f71785bf5a67c8a4f6b58d3585608fbfdc4 Mon Sep 17 00:00:00 2001 +From f70a1a9605cd3adac450c49a5a69da6e9acda517 Mon Sep 17 00:00:00 2001 From: Khem Raj <raj.khem@gmail.com> Date: Fri, 20 Feb 2015 05:26:25 +0000 -Subject: [PATCH 11/11] systemd-user: avoid using system-auth +Subject: [PATCH 15/36] systemd-user: avoid using system-auth In OE, we don't provide system-auth, instead, we use common-* files. So modify systemd-user file to use common-* files. @@ -11,21 +11,26 @@ Upstream-Status: Inappropriate [oe specific] Signed-off-by: Chen Qi <Qi.Chen@windriver.com> Signed-off-by: Khem Raj <raj.khem@gmail.com> --- - src/login/systemd-user | 4 ++-- + src/login/systemd-user.m4 | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) -diff --git a/src/login/systemd-user b/src/login/systemd-user -index 8112d74..99635af 100644 ---- a/src/login/systemd-user -+++ b/src/login/systemd-user -@@ -2,5 +2,5 @@ +diff --git a/src/login/systemd-user.m4 b/src/login/systemd-user.m4 +index 7933508..16b73d2 100644 +--- a/src/login/systemd-user.m4 ++++ b/src/login/systemd-user.m4 +@@ -2,10 +2,10 @@ # # Used by systemd --user instances. -account include system-auth --session include system-auth +account include common-account + + m4_ifdef(`HAVE_SELINUX', + session required pam_selinux.so close + session required pam_selinux.so nottys open + )m4_dnl +-session include system-auth +session include common-session -- -2.1.4 +1.8.3.1 diff --git a/yocto-poky/meta/recipes-core/systemd/systemd/0014-Revert-rules-remove-firmware-loading-rules.patch b/yocto-poky/meta/recipes-core/systemd/systemd/0016-Revert-rules-remove-firmware-loading-rules.patch index fe2ba5328..66905b5c5 100644 --- a/yocto-poky/meta/recipes-core/systemd/systemd/0014-Revert-rules-remove-firmware-loading-rules.patch +++ b/yocto-poky/meta/recipes-core/systemd/systemd/0016-Revert-rules-remove-firmware-loading-rules.patch @@ -1,7 +1,7 @@ -From 4f0a722489154da99e7f6b3051afde984eed2f74 Mon Sep 17 00:00:00 2001 +From 7311ecc745c17d6ed9fd9cf43039648483a87605 Mon Sep 17 00:00:00 2001 From: Jonathan Liu <net147@gmail.com> Date: Thu, 19 Mar 2015 15:01:29 +1100 -Subject: [PATCH] Revert "rules: remove firmware loading rules" +Subject: [PATCH 16/36] Revert "rules: remove firmware loading rules" This reverts commit 70e7d754ddb356fb1a2942b262f8cee9650e2a19. Userspace firmware loading support is needed for Linux < 3.7. @@ -24,5 +24,5 @@ index 0000000..f0ae684 + +SUBSYSTEM=="firmware", ACTION=="add", RUN{builtin}="firmware" -- -2.3.3 +1.8.3.1 diff --git a/yocto-poky/meta/recipes-core/systemd/systemd/0015-Revert-udev-remove-userspace-firmware-loading-suppor.patch b/yocto-poky/meta/recipes-core/systemd/systemd/0017-Revert-udev-remove-userspace-firmware-loading-suppor.patch index 6308cc73a..8e6289d4a 100644 --- a/yocto-poky/meta/recipes-core/systemd/systemd/0015-Revert-udev-remove-userspace-firmware-loading-suppor.patch +++ b/yocto-poky/meta/recipes-core/systemd/systemd/0017-Revert-udev-remove-userspace-firmware-loading-suppor.patch @@ -1,7 +1,8 @@ -From 7f074def4e32045353ba4336d703e17b8de7ec4e Mon Sep 17 00:00:00 2001 -From: Jonathan Liu <net147@gmail.com> -Date: Thu, 19 Mar 2015 15:01:33 +1100 -Subject: [PATCH] Revert "udev: remove userspace firmware loading support" +From 9a3a4e16b36e762291cd1574ec71d7954f8b5363 Mon Sep 17 00:00:00 2001 +From: Khem Raj <raj.khem@gmail.com> +Date: Mon, 14 Dec 2015 05:33:32 +0000 +Subject: [PATCH 17/36] Revert "udev: remove userspace firmware loading + support" This reverts commit be2ea723b1d023b3d385d3b791ee4607cbfb20ca. Userspace firmware loading support is needed for Linux < 3.7. @@ -9,23 +10,24 @@ Userspace firmware loading support is needed for Linux < 3.7. Upstream-Status: Inappropriate [OE specific] Signed-off-by: Jonathan Liu <net147@gmail.com> +Signed-off-by: Khem Raj <raj.khem@gmail.com> --- Makefile.am | 12 +++ - README | 9 ++- + README | 6 +- TODO | 1 + - configure.ac | 20 +++++ + configure.ac | 22 ++++++ src/udev/udev-builtin-firmware.c | 154 +++++++++++++++++++++++++++++++++++++++ src/udev/udev-builtin.c | 3 + src/udev/udev.h | 6 ++ src/udev/udevd.c | 13 ++++ - 8 files changed, 214 insertions(+), 4 deletions(-) + 8 files changed, 214 insertions(+), 3 deletions(-) create mode 100644 src/udev/udev-builtin-firmware.c -Index: git/Makefile.am -=================================================================== ---- git.orig/Makefile.am -+++ git/Makefile.am -@@ -3470,6 +3470,18 @@ libudev_core_la_LIBADD = \ +diff --git a/Makefile.am b/Makefile.am +index a99e8eb..b5c6ba7 100644 +--- a/Makefile.am ++++ b/Makefile.am +@@ -3573,6 +3573,18 @@ libudev_core_la_LIBADD = \ $(BLKID_LIBS) \ $(KMOD_LIBS) @@ -44,21 +46,11 @@ Index: git/Makefile.am if HAVE_KMOD libudev_core_la_SOURCES += \ src/udev/udev-builtin-kmod.c -Index: git/README -=================================================================== ---- git.orig/README -+++ git/README -@@ -36,7 +36,8 @@ LICENSE: - - except src/udev/* which is (currently still) GPLv2, GPLv2+ - - REQUIREMENTS: -- Linux kernel >= 3.7 -+ Linux kernel >= 3.0 -+ Linux kernel >= 3.3 for loop device partition support features with nspawn - Linux kernel >= 3.8 for Smack support - - Kernel Config Options: -@@ -51,14 +52,14 @@ REQUIREMENTS: +diff --git a/README b/README +index 41fb07a..10230ac 100644 +--- a/README ++++ b/README +@@ -50,14 +50,14 @@ REQUIREMENTS: CONFIG_PROC_FS CONFIG_FHANDLE (libudev, mount and bind mount handling) @@ -76,24 +68,24 @@ Index: git/README CONFIG_FW_LOADER_USER_HELPER=n Some udev rules and virtualization detection relies on it: -Index: git/TODO -=================================================================== ---- git.orig/TODO -+++ git/TODO -@@ -754,6 +754,7 @@ Features: - * ExecOnFailure=/usr/bin/foo +diff --git a/TODO b/TODO +index 92cc8cc..25f6849 100644 +--- a/TODO ++++ b/TODO +@@ -628,6 +628,7 @@ Features: + * rename "userspace" to "core-os" * udev: + - remove src/udev/udev-builtin-firmware.c (CONFIG_FW_LOADER_USER_HELPER=n) - move to LGPL - kill scsi_id - add trigger --subsystem-match=usb/usb_device device -Index: git/configure.ac -=================================================================== ---- git.orig/configure.ac -+++ git/configure.ac -@@ -1268,6 +1268,26 @@ fi - AM_CONDITIONAL(HAVE_MYHOSTNAME, [test "$have_myhostname" = "yes"]) +diff --git a/configure.ac b/configure.ac +index 16c83bb..36d20b5 100644 +--- a/configure.ac ++++ b/configure.ac +@@ -1353,6 +1353,25 @@ AC_ARG_ENABLE(hwdb, [AC_HELP_STRING([--disable-hwdb], [disable hardware database + AM_CONDITIONAL(ENABLE_HWDB, [test x$enable_hwdb = xyes]) # ------------------------------------------------------------------------------ +AC_ARG_WITH(firmware-path, @@ -114,23 +106,25 @@ Index: git/configure.ac +AS_IF([test "x${FIRMWARE_PATH}" != "x"], [ AC_DEFINE(HAVE_FIRMWARE, 1, [Define if FIRMWARE is available]) ]) +AM_CONDITIONAL(ENABLE_FIRMWARE, [test "x${FIRMWARE_PATH}" != "x"]) + -+ +# ------------------------------------------------------------------------------ - AC_ARG_ENABLE(hwdb, [AC_HELP_STRING([--disable-hwdb], [disable hardware database support])], - enable_hwdb=$enableval, enable_hwdb=yes) - AM_CONDITIONAL(ENABLE_HWDB, [test x$enable_hwdb = xyes]) -@@ -1574,6 +1594,7 @@ AC_MSG_RESULT([ + have_manpages=no + AC_ARG_ENABLE(manpages, AS_HELP_STRING([--disable-manpages], [disable manpages])) + AC_PATH_PROG([XSLTPROC], [xsltproc]) +@@ -1653,6 +1672,9 @@ AC_MSG_RESULT([ + SysV init scripts: ${SYSTEM_SYSVINIT_PATH} SysV rc?.d directories: ${SYSTEM_SYSVRCND_PATH} Build Python: ${PYTHON} - sphinx binary: ${SPHINX_BUILD} ++ Installation Python: ${PYTHON_BINARY} ++ sphinx binary: ${SPHINX_BUILD} + firmware path: ${FIRMWARE_PATH} PAM modules dir: ${with_pamlibdir} PAM configuration dir: ${with_pamconfdir} D-Bus policy dir: ${with_dbuspolicydir} -Index: git/src/udev/udev-builtin-firmware.c -=================================================================== +diff --git a/src/udev/udev-builtin-firmware.c b/src/udev/udev-builtin-firmware.c +new file mode 100644 +index 0000000..bd8c2fb --- /dev/null -+++ git/src/udev/udev-builtin-firmware.c ++++ b/src/udev/udev-builtin-firmware.c @@ -0,0 +1,154 @@ +/* + * firmware - Kernel firmware loader @@ -286,11 +280,11 @@ Index: git/src/udev/udev-builtin-firmware.c + .help = "kernel firmware loader", + .run_once = true, +}; -Index: git/src/udev/udev-builtin.c -=================================================================== ---- git.orig/src/udev/udev-builtin.c -+++ git/src/udev/udev-builtin.c -@@ -30,6 +30,9 @@ static const struct udev_builtin *builti +diff --git a/src/udev/udev-builtin.c b/src/udev/udev-builtin.c +index e6b36f1..cd9947e 100644 +--- a/src/udev/udev-builtin.c ++++ b/src/udev/udev-builtin.c +@@ -31,6 +31,9 @@ static const struct udev_builtin *builtins[] = { [UDEV_BUILTIN_BLKID] = &udev_builtin_blkid, #endif [UDEV_BUILTIN_BTRFS] = &udev_builtin_btrfs, @@ -300,11 +294,11 @@ Index: git/src/udev/udev-builtin.c [UDEV_BUILTIN_HWDB] = &udev_builtin_hwdb, [UDEV_BUILTIN_INPUT_ID] = &udev_builtin_input_id, [UDEV_BUILTIN_KEYBOARD] = &udev_builtin_keyboard, -Index: git/src/udev/udev.h -=================================================================== ---- git.orig/src/udev/udev.h -+++ git/src/udev/udev.h -@@ -146,6 +146,9 @@ enum udev_builtin_cmd { +diff --git a/src/udev/udev.h b/src/udev/udev.h +index 1f9c812..fa35a88 100644 +--- a/src/udev/udev.h ++++ b/src/udev/udev.h +@@ -147,6 +147,9 @@ enum udev_builtin_cmd { UDEV_BUILTIN_BLKID, #endif UDEV_BUILTIN_BTRFS, @@ -314,7 +308,7 @@ Index: git/src/udev/udev.h UDEV_BUILTIN_HWDB, UDEV_BUILTIN_INPUT_ID, UDEV_BUILTIN_KEYBOARD, -@@ -174,6 +177,9 @@ struct udev_builtin { +@@ -175,6 +178,9 @@ struct udev_builtin { extern const struct udev_builtin udev_builtin_blkid; #endif extern const struct udev_builtin udev_builtin_btrfs; @@ -324,11 +318,11 @@ Index: git/src/udev/udev.h extern const struct udev_builtin udev_builtin_hwdb; extern const struct udev_builtin udev_builtin_input_id; extern const struct udev_builtin udev_builtin_keyboard; -Index: git/src/udev/udevd.c -=================================================================== ---- git.orig/src/udev/udevd.c -+++ git/src/udev/udevd.c -@@ -116,6 +116,9 @@ struct event { +diff --git a/src/udev/udevd.c b/src/udev/udevd.c +index bb92f16..84024ac 100644 +--- a/src/udev/udevd.c ++++ b/src/udev/udevd.c +@@ -125,6 +125,9 @@ struct event { bool is_block; sd_event_source *timeout_warning; sd_event_source *timeout; @@ -338,7 +332,7 @@ Index: git/src/udev/udevd.c }; static inline struct event *node_to_event(struct udev_list_node *node) { -@@ -607,6 +610,10 @@ static int event_queue_insert(Manager *m +@@ -613,6 +616,10 @@ static int event_queue_insert(Manager *manager, struct udev_device *dev) { event->devnum = udev_device_get_devnum(dev); event->is_block = streq("block", udev_device_get_subsystem(dev)); event->ifindex = udev_device_get_ifindex(dev); @@ -349,7 +343,7 @@ Index: git/src/udev/udevd.c log_debug("seq %llu queued, '%s' '%s'", udev_device_get_seqnum(dev), udev_device_get_action(dev), udev_device_get_subsystem(dev)); -@@ -692,6 +699,12 @@ static bool is_devpath_busy(Manager *man +@@ -698,6 +705,12 @@ static bool is_devpath_busy(Manager *manager, struct event *event) { return true; } @@ -362,3 +356,6 @@ Index: git/src/udev/udevd.c /* parent device event found */ if (event->devpath[common] == '/') { event->delaying_seqnum = loop_event->seqnum; +-- +1.8.3.1 + diff --git a/yocto-poky/meta/recipes-core/systemd/systemd/0018-make-test-dir-configurable.patch b/yocto-poky/meta/recipes-core/systemd/systemd/0018-make-test-dir-configurable.patch new file mode 100644 index 000000000..5f3f2e8a5 --- /dev/null +++ b/yocto-poky/meta/recipes-core/systemd/systemd/0018-make-test-dir-configurable.patch @@ -0,0 +1,64 @@ +From 569cd3cf9806a02226d26c4104dbe44262f93d33 Mon Sep 17 00:00:00 2001 +From: Roy Li <rongqing.li@windriver.com> +Date: Fri, 22 Jan 2016 16:44:11 +0800 +Subject: [PATCH 18/36] make test dir configurable + +Upstream-Status: Pending + +test maybe be run on target in cross-compile environment, and test dir +is not the compilation dir, so make it configurable + +Signed-off-by: Roy Li <rongqing.li@windriver.com> +--- + Makefile.am | 2 +- + configure.ac | 7 +++++++ + 2 files changed, 8 insertions(+), 1 deletion(-) + +diff --git a/Makefile.am b/Makefile.am +index b5c6ba7..d3cd961 100644 +--- a/Makefile.am ++++ b/Makefile.am +@@ -203,7 +203,7 @@ AM_CPPFLAGS = \ + -DROOTLIBDIR=\"$(rootlibdir)\" \ + -DROOTLIBEXECDIR=\"$(rootlibexecdir)\" \ + -DROOTHOMEDIR=\"$(roothomedir)\" \ +- -DTEST_DIR=\"$(abs_top_srcdir)/test\" \ ++ -DTEST_DIR=\"$(testdir)/test\" \ + -I $(top_srcdir)/src \ + -I $(top_builddir)/src/basic \ + -I $(top_srcdir)/src/basic \ +diff --git a/configure.ac b/configure.ac +index 36d20b5..d96dc5a 100644 +--- a/configure.ac ++++ b/configure.ac +@@ -1494,6 +1494,11 @@ AC_ARG_WITH([roothomedir], + [], + [with_roothomedir=/root]) + ++AC_ARG_WITH([testdir], ++ AS_HELP_STRING([--with-testdir=DIR], [test file directory]), ++ [], ++ [with_testdir=${abs_top_srcdir}]) ++ + AC_ARG_WITH([pamlibdir], + AS_HELP_STRING([--with-pamlibdir=DIR], [Directory for PAM modules]), + [], +@@ -1578,6 +1583,7 @@ AC_SUBST([pamconfdir], [$with_pamconfdir]) + AC_SUBST([rootprefix], [$with_rootprefix]) + AC_SUBST([rootlibdir], [$with_rootlibdir]) + AC_SUBST([roothomedir], [$with_roothomedir]) ++AC_SUBST([testdir], [$with_testdir]) + + AC_CONFIG_FILES([ + Makefile +@@ -1669,6 +1675,7 @@ AC_MSG_RESULT([ + lib dir: ${libdir} + rootlib dir: ${with_rootlibdir} + root home dir: ${with_roothomedir} ++ test dir: ${with_testdir} + SysV init scripts: ${SYSTEM_SYSVINIT_PATH} + SysV rc?.d directories: ${SYSTEM_SYSVRCND_PATH} + Build Python: ${PYTHON} +-- +1.8.3.1 + diff --git a/yocto-poky/meta/recipes-core/systemd/systemd/0019-remove-duplicate-include-uchar.h.patch b/yocto-poky/meta/recipes-core/systemd/systemd/0019-remove-duplicate-include-uchar.h.patch new file mode 100644 index 000000000..17592f8aa --- /dev/null +++ b/yocto-poky/meta/recipes-core/systemd/systemd/0019-remove-duplicate-include-uchar.h.patch @@ -0,0 +1,42 @@ +From 3ca534935460647fed66e31aaa90b364e29eab5c Mon Sep 17 00:00:00 2001 +From: Khem Raj <raj.khem@gmail.com> +Date: Mon, 22 Feb 2016 05:59:01 +0000 +Subject: [PATCH 1/2] remove duplicate include uchar.h + +missing.h already includes it + +Signed-off-by: Khem Raj <raj.khem@gmail.com> +--- +Upstream-Status: Pending + + src/basic/escape.h | 1 - + src/basic/utf8.h | 1 - + 2 files changed, 2 deletions(-) + +diff --git a/src/basic/escape.h b/src/basic/escape.h +index deaa4de..36d437c 100644 +--- a/src/basic/escape.h ++++ b/src/basic/escape.h +@@ -23,7 +23,6 @@ + #include <stddef.h> + #include <stdint.h> + #include <sys/types.h> +-#include <uchar.h> + + #include "string-util.h" + #include "missing.h" +diff --git a/src/basic/utf8.h b/src/basic/utf8.h +index 12c272d..bea93a6 100644 +--- a/src/basic/utf8.h ++++ b/src/basic/utf8.h +@@ -22,7 +22,6 @@ + #include <stdbool.h> + #include <stddef.h> + #include <stdint.h> +-#include <uchar.h> + + #include "macro.h" + #include "missing.h" +-- +1.8.3.1 + diff --git a/yocto-poky/meta/recipes-core/systemd/systemd/0020-check-for-uchar.h-in-configure.patch b/yocto-poky/meta/recipes-core/systemd/systemd/0020-check-for-uchar.h-in-configure.patch new file mode 100644 index 000000000..a027fad1d --- /dev/null +++ b/yocto-poky/meta/recipes-core/systemd/systemd/0020-check-for-uchar.h-in-configure.patch @@ -0,0 +1,44 @@ +From e06eec89a22719c38e257fe07afff18e359114cb Mon Sep 17 00:00:00 2001 +From: Khem Raj <raj.khem@gmail.com> +Date: Mon, 22 Feb 2016 06:02:38 +0000 +Subject: [PATCH 2/2] check for uchar.h in configure + +Use ifdef to include uchar.h + +Signed-off-by: Khem Raj <raj.khem@gmail.com> +--- +Upstream-Status: Pending + + configure.ac | 1 + + src/basic/missing.h | 2 ++ + 2 files changed, 3 insertions(+) + +diff --git a/configure.ac b/configure.ac +index ecc3e6b..62f934e 100644 +--- a/configure.ac ++++ b/configure.ac +@@ -297,6 +297,7 @@ AM_CONDITIONAL([HAVE_PYTHON], [test "x$have_python" = "xyes"]) + + # ------------------------------------------------------------------------------ + ++AC_CHECK_HEADERS([uchar.h], [], []) + AC_CHECK_HEADERS([sys/capability.h], [], [AC_MSG_ERROR([*** POSIX caps headers not found])]) + AC_CHECK_HEADERS([linux/btrfs.h], [], []) + AC_CHECK_HEADERS([linux/memfd.h], [], []) +diff --git a/src/basic/missing.h b/src/basic/missing.h +index f704422..a1baa95 100644 +--- a/src/basic/missing.h ++++ b/src/basic/missing.h +@@ -34,7 +34,9 @@ + #include <stdlib.h> + #include <sys/resource.h> + #include <sys/syscall.h> ++#ifdef HAVE_UCHAR_H + #include <uchar.h> ++#endif + #include <unistd.h> + + #ifdef HAVE_AUDIT +-- +1.8.3.1 + diff --git a/yocto-poky/meta/recipes-core/systemd/systemd/0021-include-missing.h-for-getting-secure_getenv-definiti.patch b/yocto-poky/meta/recipes-core/systemd/systemd/0021-include-missing.h-for-getting-secure_getenv-definiti.patch new file mode 100644 index 000000000..5797a29e6 --- /dev/null +++ b/yocto-poky/meta/recipes-core/systemd/systemd/0021-include-missing.h-for-getting-secure_getenv-definiti.patch @@ -0,0 +1,27 @@ +From 6cedbaee7964f6a6c61b9f2c8f0b87cef9370424 Mon Sep 17 00:00:00 2001 +From: Khem Raj <raj.khem@gmail.com> +Date: Tue, 15 Dec 2015 22:51:55 +0000 +Subject: [PATCH 26/38] include missing.h for getting secure_getenv definition + +Signed-off-by: Khem Raj <raj.khem@gmail.com> +--- +Upstream-Status: Pending + + src/basic/user-util.c | 1 + + 1 file changed, 1 insertion(+) + +diff --git a/src/basic/user-util.c b/src/basic/user-util.c +index 55672b3..22c4a23 100644 +--- a/src/basic/user-util.c ++++ b/src/basic/user-util.c +@@ -38,6 +38,7 @@ + #include "path-util.h" + #include "string-util.h" + #include "user-util.h" ++#include "missing.h" + + bool uid_is_valid(uid_t uid) { + +-- +1.8.3.1 + diff --git a/yocto-poky/meta/recipes-core/systemd/systemd/0022-socket-util-don-t-fail-if-libc-doesn-t-support-IDN.patch b/yocto-poky/meta/recipes-core/systemd/systemd/0022-socket-util-don-t-fail-if-libc-doesn-t-support-IDN.patch new file mode 100644 index 000000000..96fc3d844 --- /dev/null +++ b/yocto-poky/meta/recipes-core/systemd/systemd/0022-socket-util-don-t-fail-if-libc-doesn-t-support-IDN.patch @@ -0,0 +1,36 @@ +From 71e710a6c8a3879af7d50c4cb995e0615deba5c3 Mon Sep 17 00:00:00 2001 +From: Emil Renner Berthing <systemd@esmil.dk> +Date: Sat, 12 Sep 2015 19:56:52 +0000 +Subject: [PATCH 29/38] socket-util: don't fail if libc doesn't support IDN + +Signed-off-by: Emil Renner Berthing <systemd@esmil.dk> +Signed-off-by: Khem Raj <raj.khem@gmail.com> +--- +Upstream-Status: Pending + + src/basic/socket-util.c | 9 +++++++++ + 1 file changed, 9 insertions(+) + +diff --git a/src/basic/socket-util.c b/src/basic/socket-util.c +index 5851268..aefaca5 100644 +--- a/src/basic/socket-util.c ++++ b/src/basic/socket-util.c +@@ -44,6 +44,15 @@ + #include "string-util.h" + #include "user-util.h" + #include "util.h" ++/* Don't fail if the standard library ++ * doesn't support IDN */ ++#ifndef NI_IDN ++#define NI_IDN 0 ++#endif ++ ++#ifndef NI_IDN_USE_STD3_ASCII_RULES ++#define NI_IDN_USE_STD3_ASCII_RULES 0 ++#endif + + int socket_address_parse(SocketAddress *a, const char *s) { + char *e, *n; +-- +1.8.3.1 + diff --git a/yocto-poky/meta/recipes-core/systemd/systemd/0023-build-sys-fix-build-with-libgrcypt-disabled.patch b/yocto-poky/meta/recipes-core/systemd/systemd/0023-build-sys-fix-build-with-libgrcypt-disabled.patch new file mode 100644 index 000000000..1ae3d66c7 --- /dev/null +++ b/yocto-poky/meta/recipes-core/systemd/systemd/0023-build-sys-fix-build-with-libgrcypt-disabled.patch @@ -0,0 +1,122 @@ +From b68f10bf1f7519e012da5e35fab3a57da7dc46d4 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Zbigniew=20J=C4=99drzejewski-Szmek?= <zbyszek@in.waw.pl> +Date: Sun, 27 Mar 2016 17:33:54 -0400 +Subject: [PATCH] build-sys: fix build with libgrcypt disabled + +- Move gcrypt.h include inside grcrypt-util.h. +- Allow gcrypt-util.[ch] to be compiled even without gcrypt. +This allows the logic in files using gcrypt to be simplified. + +- Fix compilation of systemd-resolve without gcrypt. +systemd-resolved already supported that. + +Upstream-Status: Backport [ https://github.com/systemd/systemd/pull/2905 ] + +Fixes [YOCTO #9219] + +Signed-off-by: Maxin B. John <maxin.john@intel.com> +--- + Makefile.am | 8 ++++---- + src/resolve/resolve-tool.c | 3 +-- + src/shared/gcrypt-util.c | 4 +++- + src/shared/gcrypt-util.h | 14 ++++++++++++++ + 4 files changed, 22 insertions(+), 7 deletions(-) + +diff --git a/Makefile.am b/Makefile.am +index 2b72a53..95eaa9a 100644 +--- a/Makefile.am ++++ b/Makefile.am +@@ -4262,7 +4262,9 @@ libsystemd_journal_internal_la_SOURCES = \ + src/journal/mmap-cache.h \ + src/journal/compress.c \ + src/journal/audit-type.h \ +- src/journal/audit-type.c ++ src/journal/audit-type.c \ ++ src/shared/gcrypt-util.h \ ++ src/shared/gcrypt-util.c + + nodist_libsystemd_journal_internal_la_SOURCES = \ + src/journal/audit_type-to-name.h +@@ -4294,9 +4296,7 @@ libsystemd_journal_internal_la_SOURCES += \ + src/journal/journal-authenticate.c \ + src/journal/journal-authenticate.h \ + src/journal/fsprg.c \ +- src/journal/fsprg.h \ +- src/shared/gcrypt-util.c \ +- src/shared/gcrypt-util.h ++ src/journal/fsprg.h + + libsystemd_journal_internal_la_LIBADD += \ + $(GCRYPT_LIBS) +diff --git a/src/resolve/resolve-tool.c b/src/resolve/resolve-tool.c +index 009cc73..14ee01c 100644 +--- a/src/resolve/resolve-tool.c ++++ b/src/resolve/resolve-tool.c +@@ -17,7 +17,6 @@ + along with systemd; If not, see <http://www.gnu.org/licenses/>. + ***/ + +-#include <gcrypt.h> + #include <getopt.h> + #include <net/if.h> + +@@ -863,7 +862,7 @@ static int resolve_openpgp(sd_bus *bus, const char *address) { + } + domain++; + +- r = string_hashsum(address, domain - 1 - address, GCRY_MD_SHA224, &hashed); ++ r = string_hashsum_sha224(address, domain - 1 - address, &hashed); + if (r < 0) + return log_error_errno(r, "Hashing failed: %m"); + +diff --git a/src/shared/gcrypt-util.c b/src/shared/gcrypt-util.c +index 4ff9452..39b544b 100644 +--- a/src/shared/gcrypt-util.c ++++ b/src/shared/gcrypt-util.c +@@ -19,10 +19,11 @@ + along with systemd; If not, see <http://www.gnu.org/licenses/>. + ***/ + ++#ifdef HAVE_GCRYPT + #include <gcrypt.h> + +-#include "hexdecoct.h" + #include "gcrypt-util.h" ++#include "hexdecoct.h" + + void initialize_libgcrypt(bool secmem) { + const char *p; +@@ -67,3 +68,4 @@ int string_hashsum(const char *s, size_t len, int md_algorithm, char **out) { + *out = enc; + return 0; + } ++#endif +diff --git a/src/shared/gcrypt-util.h b/src/shared/gcrypt-util.h +index c7652c2..cf33b3c 100644 +--- a/src/shared/gcrypt-util.h ++++ b/src/shared/gcrypt-util.h +@@ -19,7 +19,21 @@ + along with systemd; If not, see <http://www.gnu.org/licenses/>. + ***/ + ++#include <errno.h> + #include <stdbool.h> ++#include <stddef.h> ++ ++#ifdef HAVE_GCRYPT ++#include <gcrypt.h> + + void initialize_libgcrypt(bool secmem); + int string_hashsum(const char *s, size_t len, int md_algorithm, char **out); ++#endif ++ ++static inline int string_hashsum_sha224(const char *s, size_t len, char **out) { ++#ifdef HAVE_GCRYPT ++ return string_hashsum(s, len, GCRY_MD_SHA224, out); ++#else ++ return -EOPNOTSUPP; ++#endif ++} +-- +2.4.0 + diff --git a/yocto-poky/meta/recipes-core/systemd/systemd/run-ptest b/yocto-poky/meta/recipes-core/systemd/systemd/run-ptest index a2d61c289..2ae76ffaf 100644 --- a/yocto-poky/meta/recipes-core/systemd/systemd/run-ptest +++ b/yocto-poky/meta/recipes-core/systemd/systemd/run-ptest @@ -1,5 +1,6 @@ #!/bin/sh +cd tests tar -C test -xJf test/sys.tar.xz -make test/rules-test.sh.log -make test/udev-test.pl.log +make check-TESTS +cd .. diff --git a/yocto-poky/meta/recipes-core/systemd/systemd_225.bb b/yocto-poky/meta/recipes-core/systemd/systemd_229.bb index 18c244812..c23c749e2 100644 --- a/yocto-poky/meta/recipes-core/systemd/systemd_225.bb +++ b/yocto-poky/meta/recipes-core/systemd/systemd_229.bb @@ -18,67 +18,123 @@ PROVIDES = "udev" PE = "1" -DEPENDS = "kmod docbook-sgml-dtd-4.1-native intltool-native gperf-native acl readline dbus libcap libcgroup qemu-native util-linux" +DEPENDS = "kmod docbook-sgml-dtd-4.1-native intltool-native gperf-native acl readline libcap libcgroup qemu-native util-linux" SECTION = "base/shell" -inherit useradd pkgconfig autotools perlnative update-rc.d update-alternatives qemu systemd ptest gettext +inherit useradd pkgconfig autotools perlnative update-rc.d update-alternatives qemu systemd ptest gettext bash-completion -SRCREV = "e1439a1472c5f691733b8ef10e702beac2496a63" +SRCREV = "714c62b46379abb7558c544665522aca91691e10" -PV = "225+git${SRCPV}" +PV = "229+git${SRCPV}" SRC_URI = "git://github.com/systemd/systemd.git;protocol=git \ - file://0003-binfmt-Don-t-install-dependency-links-at-install-tim.patch \ - file://0004-configure-Check-for-additional-features-that-uclibc-.patch \ - file://0005-nspawn-Use-execvpe-only-when-libc-supports-it.patch \ - file://0006-journal-Use-posix-fallocate-only-if-available.patch \ - file://0007-util-Use-mkostemp-only-if-libc-supports-it.patch \ - file://0008-util-bypass-unimplemented-_SC_PHYS_PAGES-system-conf.patch \ - file://0009-sysv-generator-add-support-for-executing-scripts-und.patch \ - file://0010-Make-root-s-home-directory-configurable.patch \ - file://0011-systemd-user-avoid-using-system-auth.patch \ - file://0012-implment-systemd-sysv-install-for-OE.patch \ - file://0014-Revert-rules-remove-firmware-loading-rules.patch \ - file://0015-Revert-udev-remove-userspace-firmware-loading-suppor.patch \ file://touchscreen.rules \ file://00-create-volatile.conf \ file://init \ file://run-ptest \ - file://rules-whitelist-hd-devices.patch \ - " -SRC_URI_append_qemuall = " file://qemuall_io_latency-core-device.c-Change-the-default-device-timeout-to-2.patch" + file://0003-define-exp10-if-missing.patch \ + file://0004-Use-getenv-when-secure-versions-are-not-available.patch \ + file://0005-binfmt-Don-t-install-dependency-links-at-install-tim.patch \ + file://0006-configure-Check-for-additional-features-that-uclibc-.patch \ + file://0007-use-lnr-wrapper-instead-of-looking-for-relative-opti.patch \ + file://0008-nspawn-Use-execvpe-only-when-libc-supports-it.patch \ + file://0009-util-bypass-unimplemented-_SC_PHYS_PAGES-system-conf.patch \ + file://0010-implment-systemd-sysv-install-for-OE.patch \ + file://0011-nss-mymachines-Build-conditionally-when-HAVE_MYHOSTN.patch \ + file://0012-rules-whitelist-hd-devices.patch \ + file://0013-sysv-generator-add-support-for-executing-scripts-und.patch \ + file://0014-Make-root-s-home-directory-configurable.patch \ + file://0015-systemd-user-avoid-using-system-auth.patch \ + file://0016-Revert-rules-remove-firmware-loading-rules.patch \ + file://0017-Revert-udev-remove-userspace-firmware-loading-suppor.patch \ + file://0018-make-test-dir-configurable.patch \ + file://0019-remove-duplicate-include-uchar.h.patch \ + file://0020-check-for-uchar.h-in-configure.patch \ + file://0021-include-missing.h-for-getting-secure_getenv-definiti.patch \ + file://0022-socket-util-don-t-fail-if-libc-doesn-t-support-IDN.patch \ + file://0023-build-sys-fix-build-with-libgrcypt-disabled.patch \ +" +SRC_URI_append_libc-uclibc = "\ + file://0002-units-Prefer-getty-to-agetty-in-console-setup-system.patch \ +" +SRC_URI_append_qemuall = " file://0001-core-device.c-Change-the-default-device-timeout-to-2.patch" S = "${WORKDIR}/git" -SRC_URI_append_libc-uclibc = "\ - file://0001-units-Prefer-getty-to-agetty-in-console-setup-system.patch \ - file://0022-Use-getenv-when-secure-versions-are-not-available.patch \ - file://0001-fix-build-on-uClibc-exp10.patch \ - " -LDFLAGS_append_libc-uclibc = " -lrt" +LDFLAGS_append_libc-uclibc = " -lrt -lssp_nonshared -lssp " GTKDOC_DOCDIR = "${S}/docs/" -PACKAGECONFIG ??= "xz ldconfig \ +PACKAGECONFIG ??= "xz \ + ldconfig \ ${@bb.utils.contains('DISTRO_FEATURES', 'pam', 'pam', '', d)} \ ${@bb.utils.contains('DISTRO_FEATURES', 'x11', 'xkbcommon', '', d)} \ ${@bb.utils.contains('DISTRO_FEATURES', 'selinux', 'selinux', '', d)} \ - " + ${@bb.utils.contains('DISTRO_FEATURES', 'wifi', 'rfkill', '', d)} \ + ${@bb.utils.contains('MACHINE_FEATURES', 'efi', 'efi', '', d)} \ + binfmt \ + randomseed \ + machined \ + backlight \ + quotacheck \ + bootchart \ + hostnamed \ + ${@bb.utils.contains('TCLIBC', 'glibc', 'myhostname sysusers', '', d)} \ + hibernate \ + timedated \ + timesyncd \ + localed \ + kdbus \ + ima \ + smack \ + logind \ + firstboot \ + utmp \ + polkit \ +" +PACKAGECONFIG_remove_libc-musl = "selinux" +PACKAGECONFIG_remove_libc-musl = "smack" + +# Use the upstream systemd serial-getty@.service and rely on +# systemd-getty-generator instead of using the OE-core specific +# systemd-serialgetty.bb - not enabled by default. +PACKAGECONFIG[serial-getty-generator] = "" PACKAGECONFIG[journal-upload] = "--enable-libcurl,--disable-libcurl,curl" # Sign the journal for anti-tampering PACKAGECONFIG[gcrypt] = "--enable-gcrypt,--disable-gcrypt,libgcrypt" -# regardless of PACKAGECONFIG, libgcrypt is always required to expand -# the AM_PATH_LIBGCRYPT autoconf macro -DEPENDS += "libgcrypt" -# Compress the journal -PACKAGECONFIG[xz] = "--enable-xz,--disable-xz,xz" PACKAGECONFIG[cryptsetup] = "--enable-libcryptsetup,--disable-libcryptsetup,cryptsetup" PACKAGECONFIG[microhttpd] = "--enable-microhttpd,--disable-microhttpd,libmicrohttpd" PACKAGECONFIG[elfutils] = "--enable-elfutils,--disable-elfutils,elfutils" PACKAGECONFIG[resolved] = "--enable-resolved,--disable-resolved" PACKAGECONFIG[networkd] = "--enable-networkd,--disable-networkd" +PACKAGECONFIG[machined] = "--enable-machined,--disable-machined" +PACKAGECONFIG[backlight] = "--enable-backlight,--disable-backlight" +PACKAGECONFIG[quotacheck] = "--enable-quotacheck,--disable-quotacheck" +PACKAGECONFIG[bootchart] = "--enable-bootchart,--disable-bootchart" +PACKAGECONFIG[hostnamed] = "--enable-hostnamed,--disable-hostnamed" +PACKAGECONFIG[myhostname] = "--enable-myhostname,--disable-myhostname" +PACKAGECONFIG[rfkill] = "--enable-rfkill,--disable-rfkill" +PACKAGECONFIG[hibernate] = "--enable-hibernate,--disable-hibernate" +PACKAGECONFIG[timedated] = "--enable-timedated,--disable-timedated" +PACKAGECONFIG[timesyncd] = "--enable-timesyncd,--disable-timesyncd" +PACKAGECONFIG[localed] = "--enable-localed,--disable-localed" +PACKAGECONFIG[efi] = "--enable-efi,--disable-efi" +PACKAGECONFIG[kdbus] = "--enable-kdbus,--disable-kdbus" +PACKAGECONFIG[ima] = "--enable-ima,--disable-ima" +PACKAGECONFIG[smack] = "--enable-smack,--disable-smack" +# libseccomp is found in meta-security +PACKAGECONFIG[seccomp] = "--enable-seccomp,--disable-seccomp,libseccomp" +PACKAGECONFIG[logind] = "--enable-logind,--disable-logind" +PACKAGECONFIG[sysusers] = "--enable-sysusers,--disable-sysusers" +PACKAGECONFIG[firstboot] = "--enable-firstboot,--disable-firstboot" +PACKAGECONFIG[randomseed] = "--enable-randomseed,--disable-randomseed" +PACKAGECONFIG[binfmt] = "--enable-binfmt,--disable-binfmt" +PACKAGECONFIG[utmp] = "--enable-utmp,--disable-utmp" +PACKAGECONFIG[polkit] = "--enable-polkit,--disable-polkit" +# importd requires curl/xz/zlib/bzip2/gcrypt +PACKAGECONFIG[importd] = "--enable-importd,--disable-importd" PACKAGECONFIG[libidn] = "--enable-libidn,--disable-libidn,libidn" PACKAGECONFIG[audit] = "--enable-audit,--disable-audit,audit" PACKAGECONFIG[manpages] = "--enable-manpages,--disable-manpages,libxslt-native xmlto-native docbook-xml-dtd4-native docbook-xsl-stylesheets-native" @@ -91,6 +147,12 @@ PACKAGECONFIG[ldconfig] = "--enable-ldconfig,--disable-ldconfig,," PACKAGECONFIG[selinux] = "--enable-selinux,--disable-selinux,libselinux" PACKAGECONFIG[valgrind] = "ac_cv_header_valgrind_memcheck_h=yes ac_cv_header_valgrind_valgrind_h=yes ,ac_cv_header_valgrind_memcheck_h=no ac_cv_header_valgrind_valgrind_h=no ,valgrind" PACKAGECONFIG[qrencode] = "--enable-qrencode,--disable-qrencode,qrencode" +PACKAGECONFIG[dbus] = "--enable-dbus,--disable-dbus,dbus" +PACKAGECONFIG[coredump] = "--enable-coredump,--disable-coredump" +PACKAGECONFIG[bzip2] = "--enable-bzip2,--disable-bzip2,bzip2" +PACKAGECONFIG[lz4] = "--enable-lz4,--disable-lz4,lz4" +PACKAGECONFIG[xz] = "--enable-xz,--disable-xz,xz" +PACKAGECONFIG[zlib] = "--enable-zlib,--disable-zlib,zlib" CACHED_CONFIGUREVARS += "ac_cv_path_KILL=${base_bindir}/kill" CACHED_CONFIGUREVARS += "ac_cv_path_KMOD=${base_bindir}/kmod" @@ -118,14 +180,14 @@ CACHED_CONFIGUREVARS_class-target = "\ EXTRA_OECONF = " --with-rootprefix=${rootprefix} \ --with-rootlibdir=${rootlibdir} \ --with-roothomedir=${ROOT_HOME} \ - --disable-coredump \ --enable-split-usr \ --without-python \ --with-sysvrcnd-path=${sysconfdir} \ --with-firmware-path=/lib/firmware \ + --with-testdir=${PTEST_PATH} \ " -# uclibc does not have NSS -EXTRA_OECONF_append_libc-uclibc = " --disable-myhostname " +# per the systemd README, define VALGRIND=1 to run under valgrind +CFLAGS .= "${@bb.utils.contains('PACKAGECONFIG', 'valgrind', ' -DVALGRIND=1', '', d)}" # disable problematic GCC 5.2 optimizations [YOCTO #8291] FULL_OPTIMIZATION_append_arm = " -fno-schedule-insns -fno-schedule-insns2" @@ -140,16 +202,17 @@ do_configure_prepend() { else cp -r ${S}/units ${S}/units.pre_sed fi - sed -i '/ln --relative --help/d' ${S}/configure.ac - sed -i -e 's:\$(LN_S) --relative -f:lnr:g' ${S}/Makefile.am - sed -i -e 's:\$(LN_S) --relative:lnr:g' ${S}/Makefile.am + sed -i -e 's:-DTEST_DIR=\\\".*\\\":-DTEST_DIR=\\\"${PTEST_PATH}/tests/test\\\":' ${S}/Makefile.am + sed -i -e 's:-DCATALOG_DIR=\\\".*\\\":-DCATALOG_DIR=\\\"${PTEST_PATH}/tests/catalog\\\":' ${S}/Makefile.am } do_install() { autotools_do_install install -d ${D}/${base_sbindir} - # Provided by a separate recipe - rm ${D}${systemd_unitdir}/system/serial-getty* -f + if ${@bb.utils.contains('PACKAGECONFIG', 'serial-getty-generator', 'false', 'true', d)}; then + # Provided by a separate recipe + rm ${D}${systemd_unitdir}/system/serial-getty* -f + fi # Provide support for initramfs [ ! -e ${D}/init ] && ln -s ${rootlibexecdir}/systemd/systemd ${D}/init @@ -177,17 +240,20 @@ do_install() { # Delete journal README, as log can be symlinked inside volatile. rm -f ${D}/${localstatedir}/log/README - # Create symlinks for systemd-update-utmp-runlevel.service install -d ${D}${systemd_unitdir}/system/graphical.target.wants install -d ${D}${systemd_unitdir}/system/multi-user.target.wants install -d ${D}${systemd_unitdir}/system/poweroff.target.wants install -d ${D}${systemd_unitdir}/system/reboot.target.wants install -d ${D}${systemd_unitdir}/system/rescue.target.wants - ln -sf ../systemd-update-utmp-runlevel.service ${D}${systemd_unitdir}/system/graphical.target.wants/systemd-update-utmp-runlevel.service - ln -sf ../systemd-update-utmp-runlevel.service ${D}${systemd_unitdir}/system/multi-user.target.wants/systemd-update-utmp-runlevel.service - ln -sf ../systemd-update-utmp-runlevel.service ${D}${systemd_unitdir}/system/poweroff.target.wants/systemd-update-utmp-runlevel.service - ln -sf ../systemd-update-utmp-runlevel.service ${D}${systemd_unitdir}/system/reboot.target.wants/systemd-update-utmp-runlevel.service - ln -sf ../systemd-update-utmp-runlevel.service ${D}${systemd_unitdir}/system/rescue.target.wants/systemd-update-utmp-runlevel.service + + # Create symlinks for systemd-update-utmp-runlevel.service + if ${@bb.utils.contains('PACKAGECONFIG', 'utmp', 'true', 'false', d)}; then + ln -sf ../systemd-update-utmp-runlevel.service ${D}${systemd_unitdir}/system/graphical.target.wants/systemd-update-utmp-runlevel.service + ln -sf ../systemd-update-utmp-runlevel.service ${D}${systemd_unitdir}/system/multi-user.target.wants/systemd-update-utmp-runlevel.service + ln -sf ../systemd-update-utmp-runlevel.service ${D}${systemd_unitdir}/system/poweroff.target.wants/systemd-update-utmp-runlevel.service + ln -sf ../systemd-update-utmp-runlevel.service ${D}${systemd_unitdir}/system/reboot.target.wants/systemd-update-utmp-runlevel.service + ln -sf ../systemd-update-utmp-runlevel.service ${D}${systemd_unitdir}/system/rescue.target.wants/systemd-update-utmp-runlevel.service + fi # Enable journal to forward message to syslog daemon sed -i -e 's/.*ForwardToSyslog.*/ForwardToSyslog=yes/' ${D}${sysconfdir}/systemd/journald.conf @@ -196,23 +262,38 @@ do_install() { if [ -s ${D}${exec_prefix}/lib/tmpfiles.d/systemd.conf ]; then ${@bb.utils.contains('PACKAGECONFIG', 'networkd', ':', 'sed -i -e "\$ad /run/systemd/netif/links 0755 root root -" ${D}${exec_prefix}/lib/tmpfiles.d/systemd.conf', d)} fi + if ! ${@bb.utils.contains('PACKAGECONFIG', 'resolved', 'true', 'false', d)}; then + # if resolved is disabled, it won't handle the link of resolv.conf, so + # set it up ourselves + ln -s ../run/resolv.conf ${D}${sysconfdir}/resolv.conf + echo 'L! ${sysconfdir}/resolv.conf - - - - ../run/resolv.conf' >>${D}${exec_prefix}/lib/tmpfiles.d/etc.conf + echo 'f /run/resolv.conf 0644 root root' >>${D}${exec_prefix}/lib/tmpfiles.d/systemd.conf + fi install -Dm 0755 ${S}/src/systemctl/systemd-sysv-install.SKELETON ${D}${systemd_unitdir}/systemd-sysv-install } do_install_ptest () { - install -d ${D}${PTEST_PATH}/test - cp -rf ${S}/test/* ${D}${PTEST_PATH}/test - install -m 0755 ${B}/test-udev ${D}${PTEST_PATH}/ - install -d ${D}${PTEST_PATH}/build-aux - cp ${S}/build-aux/test-driver ${D}${PTEST_PATH}/build-aux/ - cp -rf ${B}/rules ${D}${PTEST_PATH}/ + # install data files needed for tests + install -d ${D}${PTEST_PATH}/tests/test + cp -rfL ${S}/test/* ${D}${PTEST_PATH}/tests/test + sed -i 's/"tree"/"ls"/' ${D}${PTEST_PATH}/tests/test/udev-test.pl + + install -d ${D}${PTEST_PATH}/tests/catalog + install ${S}/catalog/* ${D}${PTEST_PATH}/tests/catalog/ + + install -D ${S}/build-aux/test-driver ${D}${PTEST_PATH}/tests/build-aux/test-driver + + install -d ${D}${PTEST_PATH}/tests/rules + install ${B}/rules/* ${D}${PTEST_PATH}/tests/rules/ + # This directory needs to be there for udev-test.pl to work. install -d ${D}${libdir}/udev/rules.d - cp ${B}/Makefile ${D}${PTEST_PATH}/ - cp ${S}/test/sys.tar.xz ${D}${PTEST_PATH}/test - sed -i 's/"tree"/"ls"/' ${D}${PTEST_PATH}/test/udev-test.pl - sed -i 's#${S}#${PTEST_PATH}#g' ${D}${PTEST_PATH}/Makefile - sed -i 's#${B}#${PTEST_PATH}#g' ${D}${PTEST_PATH}/Makefile + + # install actual test binaries + install -m 0755 ${B}/test-* ${D}${PTEST_PATH}/tests/ + install -m 0755 ${B}/.libs/test-* ${D}${PTEST_PATH}/tests/ + + install ${B}/Makefile ${D}${PTEST_PATH}/tests/ } python populate_packages_prepend (){ @@ -221,14 +302,26 @@ python populate_packages_prepend (){ } PACKAGES_DYNAMIC += "^lib(udev|systemd).*" -PACKAGES =+ "${PN}-gui ${PN}-vconsole-setup ${PN}-initramfs ${PN}-analyze ${PN}-kernel-install \ - ${PN}-rpm-macros ${PN}-binfmt ${PN}-pam ${PN}-zsh ${PN}-xorg-xinitrc" +PACKAGES =+ "\ + ${PN}-gui \ + ${PN}-vconsole-setup \ + ${PN}-initramfs \ + ${PN}-analyze \ + ${PN}-kernel-install \ + ${PN}-rpm-macros \ + ${PN}-binfmt \ + ${PN}-pam \ + ${PN}-zsh-completion \ + ${PN}-xorg-xinitrc \ + ${PN}-extra-utils \ +" -SYSTEMD_PACKAGES = "${PN}-binfmt" +SYSTEMD_PACKAGES = "${@bb.utils.contains('PACKAGECONFIG', 'binfmt', '${PN}-binfmt', '', d)}" SYSTEMD_SERVICE_${PN}-binfmt = "systemd-binfmt.service" USERADD_PACKAGES = "${PN}" -USERADD_PARAM_${PN} += "--system systemd-journal-gateway; --system systemd-timesync" +USERADD_PARAM_${PN} += "${@bb.utils.contains('PACKAGECONFIG', 'microhttpd', '--system -d / -M --shell /bin/nologin systemd-journal-gateway;', '', d)}" +USERADD_PARAM_${PN} += "${@bb.utils.contains('PACKAGECONFIG', 'timesyncd', '--system -d / -M --shell /bin/nologin systemd-timesync;', '', d)}" GROUPADD_PARAM_${PN} = "-r lock; -r systemd-journal" FILES_${PN}-analyze = "${bindir}/systemd-analyze" @@ -236,10 +329,13 @@ FILES_${PN}-analyze = "${bindir}/systemd-analyze" FILES_${PN}-initramfs = "/init" RDEPENDS_${PN}-initramfs = "${PN}" -RDEPENDS_${PN}-ptest += "perl python bash" -FILES_${PN}-ptest += "${libdir}/udev/rules.d" +RDEPENDS_${PN}-ptest += "gawk make perl python bash xz \ + tzdata tzdata-americas tzdata-asia \ + tzdata-europe tzdata-africa tzdata-antarctica \ + tzdata-arctic tzdata-atlantic tzdata-australia \ + tzdata-pacific tzdata-posix" -FILES_${PN}-dbg += "${libdir}/systemd/ptest/.debug" +FILES_${PN}-ptest += "${libdir}/udev/rules.d" FILES_${PN}-gui = "${bindir}/systemadm" @@ -257,7 +353,7 @@ FILES_${PN}-rpm-macros = "${exec_prefix}/lib/rpm \ FILES_${PN}-xorg-xinitrc = "${sysconfdir}/X11/xinit/xinitrc.d/*" -FILES_${PN}-zsh = "${datadir}/zsh/site-functions" +FILES_${PN}-zsh-completion = "${datadir}/zsh/site-functions" FILES_${PN}-binfmt = "${sysconfdir}/binfmt.d/ \ ${exec_prefix}/lib/binfmt.d \ @@ -268,19 +364,64 @@ RRECOMMENDS_${PN}-binfmt = "kernel-module-binfmt-misc" RRECOMMENDS_${PN}-vconsole-setup = "kbd kbd-consolefonts kbd-keymaps" -CONFFILES_${PN} = "${sysconfdir}/systemd/journald.conf \ +FILES_${PN}-extra-utils = "\ + ${base_bindir}/systemd-escape \ + ${base_bindir}/systemd-inhibit \ + ${bindir}/systemd-detect-virt \ + ${bindir}/systemd-path \ + ${bindir}/systemd-run \ + ${bindir}/systemd-cat \ + ${bindir}/systemd-delta \ + ${bindir}/systemd-cgls \ + ${bindir}/systemd-cgtop \ + ${bindir}/systemd-stdio-bridge \ + ${base_bindir}/systemd-ask-password \ + ${base_bindir}/systemd-tty-ask-password-agent \ + ${systemd_unitdir}/system/systemd-ask-password-console.path \ + ${systemd_unitdir}/system/systemd-ask-password-console.service \ + ${systemd_unitdir}/system/systemd-ask-password-wall.path \ + ${systemd_unitdir}/system/systemd-ask-password-wall.service \ + ${systemd_unitdir}/system/sysinit.target.wants/systemd-ask-password-console.path \ + ${systemd_unitdir}/system/sysinit.target.wants/systemd-ask-password-wall.path \ + ${systemd_unitdir}/system/multi-user.target.wants/systemd-ask-password-wall.path \ + ${rootlibexecdir}/systemd/systemd-resolve-host \ + ${rootlibexecdir}/systemd/systemd-ac-power \ + ${rootlibexecdir}/systemd/systemd-activate \ + ${bindir}/systemd-nspawn \ + ${exec_prefix}/lib/tmpfiles.d/systemd-nspawn.conf \ + ${systemd_unitdir}/system/systemd-nspawn@.service \ + ${rootlibexecdir}/systemd/systemd-bus-proxyd \ + ${systemd_unitdir}/system/systemd-bus-proxyd.service \ + ${systemd_unitdir}/system/systemd-bus-proxyd.socket \ + ${rootlibexecdir}/systemd/systemd-socket-proxyd \ + ${rootlibexecdir}/systemd/systemd-reply-password \ + ${rootlibexecdir}/systemd/systemd-sleep \ + ${rootlibexecdir}/systemd/system-sleep \ + ${systemd_unitdir}/system/systemd-hibernate.service \ + ${systemd_unitdir}/system/systemd-hybrid-sleep.service \ + ${systemd_unitdir}/system/systemd-suspend.service \ + ${systemd_unitdir}/system/sleep.target \ + ${rootlibexecdir}/systemd/systemd-initctl \ + ${systemd_unitdir}/system/systemd-initctl.service \ + ${systemd_unitdir}/system/systemd-initctl.socket \ + ${systemd_unitdir}/system/sockets.target.wants/systemd-initctl.socket \ + ${rootlibexecdir}/systemd/system-generators/systemd-gpt-auto-generator \ + ${rootlibexecdir}/systemd/systemd-cgroups-agent \ +" + +CONFFILES_${PN} = "${sysconfdir}/machine-id \ + ${sysconfdir}/systemd/coredump.conf \ + ${sysconfdir}/systemd/journald.conf \ ${sysconfdir}/systemd/logind.conf \ ${sysconfdir}/systemd/system.conf \ ${sysconfdir}/systemd/user.conf" FILES_${PN} = " ${base_bindir}/* \ - ${datadir}/bash-completion \ ${datadir}/dbus-1/services \ ${datadir}/dbus-1/system-services \ ${datadir}/polkit-1 \ ${datadir}/${BPN} \ ${datadir}/factory \ - ${sysconfdir}/bash_completion.d/ \ ${sysconfdir}/dbus-1/ \ ${sysconfdir}/machine-id \ ${sysconfdir}/modules-load.d/ \ @@ -290,6 +431,7 @@ FILES_${PN} = " ${base_bindir}/* \ ${sysconfdir}/tmpfiles.d/ \ ${sysconfdir}/xdg/ \ ${sysconfdir}/init.d/README \ + ${sysconfdir}/resolv.conf \ ${rootlibexecdir}/systemd/* \ ${systemd_unitdir}/* \ ${base_libdir}/security/*.so \ @@ -297,6 +439,7 @@ FILES_${PN} = " ${base_bindir}/* \ /cgroup \ ${bindir}/systemd* \ ${bindir}/busctl \ + ${bindir}/coredumpctl \ ${bindir}/localectl \ ${bindir}/hostnamectl \ ${bindir}/timedatectl \ @@ -314,22 +457,23 @@ FILES_${PN} = " ${base_bindir}/* \ ${nonarch_base_libdir}/udev/rules.d/99-systemd.rules \ " -FILES_${PN}-dbg += "${rootlibdir}/.debug ${systemd_unitdir}/.debug ${systemd_unitdir}/*/.debug ${base_libdir}/security/.debug/" FILES_${PN}-dev += "${base_libdir}/security/*.la ${datadir}/dbus-1/interfaces/ ${sysconfdir}/rpm/macros.systemd" RDEPENDS_${PN} += "kmod dbus util-linux-mount udev (= ${EXTENDPKGV})" RDEPENDS_${PN} += "volatile-binds update-rc.d" -RRECOMMENDS_${PN} += "systemd-serialgetty systemd-vconsole-setup \ +RRECOMMENDS_${PN} += "${@bb.utils.contains('PACKAGECONFIG', 'serial-getty-generator', '', 'systemd-serialgetty', d)} \ + systemd-vconsole-setup \ + systemd-extra-utils \ systemd-compat-units udev-hwdb \ util-linux-agetty util-linux-fsck e2fsprogs-e2fsck \ kernel-module-autofs4 kernel-module-unix kernel-module-ipv6 \ os-release \ " -PACKAGES =+ "udev-dbg udev udev-hwdb" +INSANE_SKIP_${PN}-doc += " libdir" -FILES_udev-dbg += "${nonarch_base_libdir}/udev/.debug" +PACKAGES =+ "udev udev-hwdb" RPROVIDES_udev = "hotplug" @@ -397,21 +541,30 @@ ALTERNATIVE_TARGET[runlevel] = "${base_bindir}/systemctl" ALTERNATIVE_LINK_NAME[runlevel] = "${base_sbindir}/runlevel" ALTERNATIVE_PRIORITY[runlevel] ?= "300" +pkg_postinst_${PN} () { + sed -e '/^hosts:/s/\s*\<myhostname\>//' \ + -e 's/\(^hosts:.*\)\(\<files\>\)\(.*\)\(\<dns\>\)\(.*\)/\1\2 myhostname \3\4\5/' \ + -i $D${sysconfdir}/nsswitch.conf +} + +pkg_prerm_${PN} () { + sed -e '/^hosts:/s/\s*\<myhostname\>//' \ + -e '/^hosts:/s/\s*myhostname//' \ + -i $D${sysconfdir}/nsswitch.conf +} + pkg_postinst_udev-hwdb () { if test -n "$D"; then ${@qemu_run_binary(d, '$D', '${base_bindir}/udevadm')} hwdb --update \ --root $D + chown root:root $D${sysconfdir}/udev/hwdb.bin else udevadm hwdb --update fi } pkg_prerm_udev-hwdb () { - if test -n "$D"; then - exit 1 - fi - - rm -f ${sysconfdir}/udev/hwdb.bin + rm -f $D${sysconfdir}/udev/hwdb.bin } # As this recipe builds udev, respect systemd being in DISTRO_FEATURES so @@ -419,4 +572,8 @@ pkg_prerm_udev-hwdb () { python () { if not bb.utils.contains ('DISTRO_FEATURES', 'systemd', True, False, d): raise bb.parse.SkipPackage("'systemd' not in DISTRO_FEATURES") + + import re + if re.match('.*musl*', d.getVar('TARGET_OS', True)) != None: + raise bb.parse.SkipPackage("Not _yet_ supported on musl based targets") } diff --git a/yocto-poky/meta/recipes-core/sysvinit/sysvinit-inittab/start_getty b/yocto-poky/meta/recipes-core/sysvinit/sysvinit-inittab/start_getty new file mode 100644 index 000000000..6eaeb7a2b --- /dev/null +++ b/yocto-poky/meta/recipes-core/sysvinit/sysvinit-inittab/start_getty @@ -0,0 +1,5 @@ +#!/bin/sh +if [ -c /dev/$2 ] +then + /sbin/getty -L $1 $2 +fi diff --git a/yocto-poky/meta/recipes-core/sysvinit/sysvinit-inittab_2.88dsf.bb b/yocto-poky/meta/recipes-core/sysvinit/sysvinit-inittab_2.88dsf.bb index 49b1326a2..c5b8cdca9 100644 --- a/yocto-poky/meta/recipes-core/sysvinit/sysvinit-inittab_2.88dsf.bb +++ b/yocto-poky/meta/recipes-core/sysvinit/sysvinit-inittab_2.88dsf.bb @@ -4,7 +4,8 @@ LIC_FILES_CHKSUM = "file://${COREBASE}/meta/files/common-licenses/GPL-2.0;md5=80 PR = "r10" -SRC_URI = "file://inittab" +SRC_URI = "file://inittab \ + file://start_getty" S = "${WORKDIR}" @@ -15,8 +16,10 @@ do_compile() { } do_install() { - install -d ${D}${sysconfdir} + install -d ${D}${sysconfdir} install -m 0644 ${WORKDIR}/inittab ${D}${sysconfdir}/inittab + install -d ${D}${base_bindir} + install -m 0755 ${WORKDIR}/start_getty ${D}${base_bindir}/start_getty set -x tmp="${SERIAL_CONSOLES}" @@ -24,7 +27,7 @@ do_install() { do j=`echo ${i} | sed s/\;/\ /g` label=`echo ${i} | sed -e 's/tty//' -e 's/^.*;//' -e 's/;.*//'` - echo "$label:12345:respawn:${base_sbindir}/getty -L ${j}" >> ${D}${sysconfdir}/inittab + echo "$label:12345:respawn:${base_bindir}/start_getty ${j}" >> ${D}${sysconfdir}/inittab done if [ "${USE_VT}" = "1" ]; then @@ -73,7 +76,7 @@ fi # Set PACKAGE_ARCH appropriately. PACKAGE_ARCH = "${MACHINE_ARCH}" -FILES_${PN} = "${sysconfdir}/inittab" +FILES_${PN} = "${sysconfdir}/inittab ${base_bindir}/start_getty" CONFFILES_${PN} = "${sysconfdir}/inittab" USE_VT ?= "1" diff --git a/yocto-poky/meta/recipes-core/sysvinit/sysvinit/realpath.patch b/yocto-poky/meta/recipes-core/sysvinit/sysvinit/realpath.patch new file mode 100644 index 000000000..5e0dca3bf --- /dev/null +++ b/yocto-poky/meta/recipes-core/sysvinit/sysvinit/realpath.patch @@ -0,0 +1,78 @@ +Fix build on musl use realpath() API its available on all libcs + +realpath() API doesnt work on systems with PATH_MAX set to be unlimited e.g. GNU/Hurd +However for Linux it should always work + +Upstream-Status: Inappropriate[Linux specific] + +Signed-off-by: Khem Raj <raj.khem@gmail.com> + +Index: sysvinit-2.88dsf/src/ifdown.c +=================================================================== +--- sysvinit-2.88dsf.orig/src/ifdown.c 2010-03-23 07:37:01.000000000 -0700 ++++ sysvinit-2.88dsf/src/ifdown.c 2014-04-02 00:43:43.675437029 -0700 +@@ -26,11 +26,11 @@ + #include <unistd.h> + #include <time.h> + #include <string.h> ++#include <errno.h> + + #include <sys/ioctl.h> + #include <sys/socket.h> + #include <sys/time.h> +-#include <sys/errno.h> + + #include <net/if.h> + #include <netinet/in.h> +Index: sysvinit-2.88dsf/src/init.c +=================================================================== +--- sysvinit-2.88dsf.orig/src/init.c 2014-04-02 00:42:10.488770162 -0700 ++++ sysvinit-2.88dsf/src/init.c 2014-04-02 00:42:59.432103823 -0700 +@@ -49,6 +49,7 @@ + #include <utmp.h> + #include <ctype.h> + #include <stdarg.h> ++#include <sys/ttydefaults.h> + #include <sys/syslog.h> + #include <sys/time.h> + +Index: sysvinit-2.88dsf/src/mountpoint.c +=================================================================== +--- sysvinit-2.88dsf.orig/src/mountpoint.c 2009-09-10 01:28:49.000000000 -0700 ++++ sysvinit-2.88dsf/src/mountpoint.c 2014-04-02 00:44:18.248770942 -0700 +@@ -23,6 +23,7 @@ + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + ++#include <sys/types.h> + #include <sys/stat.h> + #include <unistd.h> + #include <stdlib.h> +Index: sysvinit-2.88dsf/src/killall5.c +=================================================================== +--- sysvinit-2.88dsf.orig/src/killall5.c 2014-03-26 00:49:52.982668074 -0700 ++++ sysvinit-2.88dsf/src/killall5.c 2014-04-02 00:46:45.838771653 -0700 +@@ -846,9 +846,9 @@ + char *oargv1, *pargv1; + if ((o->argv0 && p->argv0 && !strcmp(o->argv0,p->argv0))) { + if (o->argv1 && p->argv1) { +- if ((oargv1 = canonicalize_file_name(o->argv1)) == NULL) ++ if ((oargv1 = realpath(o->argv1, NULL)) == NULL) + oargv1 = strdup(o->argv1); +- if ((pargv1 = canonicalize_file_name(p->argv1)) == NULL) ++ if ((pargv1 = realpath(p->argv1, NULL)) == NULL) + pargv1 = strdup(p->argv1); + if (! strcmp(oargv1, pargv1)) { + ret = 1; +Index: sysvinit-2.88dsf/src/wall.c +=================================================================== +--- sysvinit-2.88dsf.orig/src/wall.c 2009-11-22 14:05:53.000000000 -0800 ++++ sysvinit-2.88dsf/src/wall.c 2014-04-02 00:49:15.258772217 -0700 +@@ -29,6 +29,7 @@ + #include <unistd.h> + #include <pwd.h> + #include <syslog.h> ++#include <time.h> + #include "init.h" + + diff --git a/yocto-poky/meta/recipes-core/sysvinit/sysvinit_2.88dsf.bb b/yocto-poky/meta/recipes-core/sysvinit/sysvinit_2.88dsf.bb index 5dfe39e23..884857a96 100644 --- a/yocto-poky/meta/recipes-core/sysvinit/sysvinit_2.88dsf.bb +++ b/yocto-poky/meta/recipes-core/sysvinit/sysvinit_2.88dsf.bb @@ -14,6 +14,7 @@ SRC_URI = "${SAVANNAH_GNU_MIRROR}/sysvinit/sysvinit-${PV}.tar.bz2 \ file://crypt-lib.patch \ file://pidof-add-m-option.patch \ file://0001-This-fixes-an-issue-that-clang-reports-about-mutlipl.patch \ + file://realpath.patch \ file://rcS-default \ file://rc \ file://rcS \ @@ -38,6 +39,8 @@ ALTERNATIVE_LINK_NAME[init] = "${base_sbindir}/init" ALTERNATIVE_PRIORITY[init] = "50" ALTERNATIVE_LINK_NAME[mountpoint] = "${base_bindir}/mountpoint" +ALTERNATIVE_PRIORITY[mountpoint] = "20" + ALTERNATIVE_LINK_NAME[halt] = "${base_sbindir}/halt" ALTERNATIVE_LINK_NAME[reboot] = "${base_sbindir}/reboot" ALTERNATIVE_LINK_NAME[runlevel] = "${base_sbindir}/runlevel" @@ -50,9 +53,10 @@ ALTERNATIVE_LINK_NAME[pidof] = "${base_bindir}/pidof" ALTERNATIVE_${PN}-sulogin = "sulogin" ALTERNATIVE_LINK_NAME[sulogin] = "${base_sbindir}/sulogin" -ALTERNATIVE_${PN}-doc = "mountpoint.1 last.1 mesg.1 wall.1 sulogin.8 utmpdump.1" +ALTERNATIVE_${PN}-doc = "mountpoint.1 last.1 lastb.1 mesg.1 wall.1 sulogin.8 utmpdump.1" ALTERNATIVE_LINK_NAME[last.1] = "${mandir}/man1/last.1" +ALTERNATIVE_LINK_NAME[lastb.1] = "${mandir}/man1/lastb.1" ALTERNATIVE_LINK_NAME[mesg.1] = "${mandir}/man1/mesg.1" ALTERNATIVE_LINK_NAME[mountpoint.1] = "${mandir}/man1/mountpoint.1" ALTERNATIVE_LINK_NAME[sulogin.8] = "${mandir}/man8/sulogin.8" diff --git a/yocto-poky/meta/recipes-core/uclibc/uclibc-config.inc b/yocto-poky/meta/recipes-core/uclibc/uclibc-config.inc index 8b9e41c64..ed7b52226 100644 --- a/yocto-poky/meta/recipes-core/uclibc/uclibc-config.inc +++ b/yocto-poky/meta/recipes-core/uclibc/uclibc-config.inc @@ -119,6 +119,7 @@ def features_to_uclibc_settings(d): uclibc_cfg('thumb-interwork', distro_features,'USE_BX', cnf, rem) uclibc_cfg('xattr', distro_features, 'UCLIBC_HAS_XATTR', cnf, rem) uclibc_cfg('ssp', distro_features, 'UCLIBC_HAS_SSP', cnf, rem) + uclibc_cfg('ssp', distro_features, 'UCLIBC_BUILD_SSP', cnf, rem) uclibc_cfg('argp', distro_features, 'UCLIBC_HAS_ARGP', cnf, rem) uclibc_cfg('libc-posix-clang-wchar', distro_features,'UCLIBC_HAS_WCHAR', cnf, rem) return "\n".join(cnf), "\n".join(rem) diff --git a/yocto-poky/meta/recipes-core/uclibc/uclibc-git.inc b/yocto-poky/meta/recipes-core/uclibc/uclibc-git.inc index b7184794d..a56fa7cb6 100644 --- a/yocto-poky/meta/recipes-core/uclibc/uclibc-git.inc +++ b/yocto-poky/meta/recipes-core/uclibc/uclibc-git.inc @@ -1,25 +1,17 @@ -SRCREV = "ca1c74d67dd115d059a875150e10b8560a9c35a8" +SRCREV = "003b266cbeb370a8eae91dc256197f00798c6f93" -PV = "0.9.33+git${SRCPV}" +PV = "1.0.12+git${SRCPV}" FILESEXTRAPATHS =. "${FILE_DIRNAME}/uclibc-git:" -SRC_URI = "git://uclibc.org/uClibc.git;branch=master \ +SRC_URI = "git://uclibc-ng.org/git/uclibc-ng \ + file://0001-Disable-lrount_tes-function.patch \ file://uClibc.machine \ file://uClibc.distro \ file://obstack.cfg \ file://locale.cfg \ - file://0001-Disable-lrount_tes-function.patch \ - file://0002-Add-implementation-for-copysignl-for-ppc.patch \ - file://0003-Add-argp-implementation.patch \ - file://0004-Dont-support-localised-optimizations-this-helps-to-h.patch \ - file://0005-Always-use-O2-for-compiling-fork.c.patch \ - file://0006-ldso-limited-support-for-ORIGIN-in-rpath.patch \ - file://0007-nptl-atfork-Hide-pthread_atfork-in-shared-versions.patch \ - file://0001-gcc5-optimizes-away-the-write-only-static-functions-.patch \ - file://0001-fcntl-Add-AT_EMPTY_PATH-for-all-and-O_PATH-for-arm.patch \ - file://0001-wire-in-syncfs.patch \ - file://CVE-2016-2224.patch \ - file://CVE-2016-2225.patch \ " S = "${WORKDIR}/git" + +UPSTREAM_CHECK_GITTAGREGEX = "(?P<pver>\d+\.\d+(\.\d+)*)" + diff --git a/yocto-poky/meta/recipes-core/uclibc/uclibc-git/0001-fcntl-Add-AT_EMPTY_PATH-for-all-and-O_PATH-for-arm.patch b/yocto-poky/meta/recipes-core/uclibc/uclibc-git/0001-fcntl-Add-AT_EMPTY_PATH-for-all-and-O_PATH-for-arm.patch deleted file mode 100644 index 6942db462..000000000 --- a/yocto-poky/meta/recipes-core/uclibc/uclibc-git/0001-fcntl-Add-AT_EMPTY_PATH-for-all-and-O_PATH-for-arm.patch +++ /dev/null @@ -1,42 +0,0 @@ -From 4c8f5fe7d41493e8e181941ae5a01713155f44d1 Mon Sep 17 00:00:00 2001 -From: Khem Raj <raj.khem@gmail.com> -Date: Thu, 15 Oct 2015 15:34:39 +0000 -Subject: [PATCH] fcntl: Add AT_EMPTY_PATH for all and O_PATH for arm - -Signed-off-by: Khem Raj <raj.khem@gmail.com> ---- -Upstream-Status: Pending - - include/fcntl.h | 3 +++ - libc/sysdeps/linux/arm/bits/fcntl.h | 1 + - 2 files changed, 4 insertions(+) - -diff --git a/include/fcntl.h b/include/fcntl.h -index 11000dd..8a7ad9b 100644 ---- a/include/fcntl.h -+++ b/include/fcntl.h -@@ -65,6 +65,9 @@ __BEGIN_DECLS - # define AT_SYMLINK_FOLLOW 0x400 /* Follow symbolic links. */ - # define AT_EACCESS 0x200 /* Test access permitted for - effective IDs, not real IDs. */ -+# ifdef __USE_GNU -+# define AT_EMPTY_PATH 0x1000 /* Allow empty relative pathname. */ -+# endif - #endif - - /* Do the file control operation described by CMD on FD. -diff --git a/libc/sysdeps/linux/arm/bits/fcntl.h b/libc/sysdeps/linux/arm/bits/fcntl.h -index aedc154..c6ba958 100644 ---- a/libc/sysdeps/linux/arm/bits/fcntl.h -+++ b/libc/sysdeps/linux/arm/bits/fcntl.h -@@ -50,6 +50,7 @@ - # define O_DIRECT 0200000 /* Direct disk access. */ - # define O_NOATIME 01000000 /* Do not set atime. */ - # define O_CLOEXEC 02000000 /* Set close_on_exec. */ -+# define O_PATH 010000000 /* Resolve pathname but do not open file. */ - #endif - - /* For now Linux has synchronisity options for data and read operations. --- -2.6.1 - diff --git a/yocto-poky/meta/recipes-core/uclibc/uclibc-git/0001-gcc5-optimizes-away-the-write-only-static-functions-.patch b/yocto-poky/meta/recipes-core/uclibc/uclibc-git/0001-gcc5-optimizes-away-the-write-only-static-functions-.patch deleted file mode 100644 index e622f87ba..000000000 --- a/yocto-poky/meta/recipes-core/uclibc/uclibc-git/0001-gcc5-optimizes-away-the-write-only-static-functions-.patch +++ /dev/null @@ -1,51 +0,0 @@ -From 2659fb25d32f4b29c1c96aa5730fe40e19d53ab0 Mon Sep 17 00:00:00 2001 -From: Khem Raj <raj.khem@gmail.com> -Date: Wed, 14 Oct 2015 17:38:37 -0700 -Subject: [PATCH] gcc5 optimizes away the write only static functions and we - end up with - - librt/librt_so.a(rt-unwind-resume.oS): In function `_Unwind_Resume': - rt-unwind-resume.c:(.text+0x3c): undefined reference to `libgcc_s_resume' - collect2: error: ld returned 1 exit status - make[2]: *** [lib/librt.so] Error 1 - -marking these functions explicitly used with __attribute_used__ avoids -that optimization. - -Signed-off-by: Khem Raj <raj.khem@gmail.com> ---- -Upstream-Status: Pending - - libpthread/nptl/sysdeps/unix/sysv/linux/arm/unwind-forcedunwind.c | 2 +- - libpthread/nptl/sysdeps/unix/sysv/linux/arm/unwind-resume.c | 2 +- - 2 files changed, 2 insertions(+), 2 deletions(-) - -diff --git a/libpthread/nptl/sysdeps/unix/sysv/linux/arm/unwind-forcedunwind.c b/libpthread/nptl/sysdeps/unix/sysv/linux/arm/unwind-forcedunwind.c -index f4d6f41..0c2edd7 100644 ---- a/libpthread/nptl/sysdeps/unix/sysv/linux/arm/unwind-forcedunwind.c -+++ b/libpthread/nptl/sysdeps/unix/sysv/linux/arm/unwind-forcedunwind.c -@@ -27,7 +27,7 @@ - #define __libc_fatal(x) {/*write(STDERR_FILENO, x, strlen(x));*/ abort();} - - static void *libgcc_s_handle; --static void (*libgcc_s_resume) (struct _Unwind_Exception *exc); -+static void (*libgcc_s_resume) (struct _Unwind_Exception *exc) __attribute_used__; - static _Unwind_Reason_Code (*libgcc_s_personality) - (_Unwind_State, struct _Unwind_Exception *, struct _Unwind_Context *); - static _Unwind_Reason_Code (*libgcc_s_forcedunwind) -diff --git a/libpthread/nptl/sysdeps/unix/sysv/linux/arm/unwind-resume.c b/libpthread/nptl/sysdeps/unix/sysv/linux/arm/unwind-resume.c -index f9a4ffb..f0c3047 100644 ---- a/libpthread/nptl/sysdeps/unix/sysv/linux/arm/unwind-resume.c -+++ b/libpthread/nptl/sysdeps/unix/sysv/linux/arm/unwind-resume.c -@@ -25,7 +25,7 @@ - #define __libc_dlclose dlclose - #define __libc_fatal(x) {/*write(STDERR_FILENO, x, strlen(x));*/ abort();} - --static void (*libgcc_s_resume) (struct _Unwind_Exception *exc); -+static void (*libgcc_s_resume) (struct _Unwind_Exception *exc) __attribute_used__; - static _Unwind_Reason_Code (*libgcc_s_personality) - (_Unwind_State, struct _Unwind_Exception *, struct _Unwind_Context *); - --- -2.6.1 - diff --git a/yocto-poky/meta/recipes-core/uclibc/uclibc-git/0001-wire-in-syncfs.patch b/yocto-poky/meta/recipes-core/uclibc/uclibc-git/0001-wire-in-syncfs.patch deleted file mode 100644 index 079ad6b3b..000000000 --- a/yocto-poky/meta/recipes-core/uclibc/uclibc-git/0001-wire-in-syncfs.patch +++ /dev/null @@ -1,49 +0,0 @@ -From 4f2db1b46bda5e376245ec36198b137709f069e8 Mon Sep 17 00:00:00 2001 -From: Khem Raj <raj.khem@gmail.com> -Date: Thu, 15 Oct 2015 17:03:37 +0000 -Subject: [PATCH] wire in syncfs - -Signed-off-by: Khem Raj <raj.khem@gmail.com> ---- -Upstream-Status: Pending - - include/unistd.h | 2 +- - libc/sysdeps/linux/common/syncfs.c | 13 +++++++++++++ - 2 files changed, 14 insertions(+), 1 deletion(-) - create mode 100644 libc/sysdeps/linux/common/syncfs.c - -diff --git a/include/unistd.h b/include/unistd.h -index 3793d2d..d01bb08 100644 ---- a/include/unistd.h -+++ b/include/unistd.h -@@ -1073,7 +1073,7 @@ extern char *getpass (const char *__prompt) __nonnull ((1)); - extern int fsync (int __fd); - #endif /* Use BSD || X/Open || Unix98. */ - --#if 0 /*def __USE_GNU */ -+#ifdef __USE_GNU - /* Make all changes done to all files on the file system associated - * with FD actually appear on disk. */ - extern int syncfs (int __fd) __THROW; -diff --git a/libc/sysdeps/linux/common/syncfs.c b/libc/sysdeps/linux/common/syncfs.c -new file mode 100644 -index 0000000..d2eed05 ---- /dev/null -+++ b/libc/sysdeps/linux/common/syncfs.c -@@ -0,0 +1,13 @@ -+/* vi: set sw=4 ts=4: */ -+/* -+ * fsync() for uClibc -+ * -+ * Copyright (C) 2000-2006 Erik Andersen <andersen@uclibc.org> -+ * -+ * Licensed under the LGPL v2.1, see the file COPYING.LIB in this tarball. -+ */ -+ -+#include <sys/syscall.h> -+#include <unistd.h> -+ -+_syscall1(int, syncfs, int, fd) --- -2.6.1 - diff --git a/yocto-poky/meta/recipes-core/uclibc/uclibc-git/0002-Add-implementation-for-copysignl-for-ppc.patch b/yocto-poky/meta/recipes-core/uclibc/uclibc-git/0002-Add-implementation-for-copysignl-for-ppc.patch deleted file mode 100644 index d4275c997..000000000 --- a/yocto-poky/meta/recipes-core/uclibc/uclibc-git/0002-Add-implementation-for-copysignl-for-ppc.patch +++ /dev/null @@ -1,125 +0,0 @@ -From 5d362074e5975b150a35bcfa77eab1bfa4e30de7 Mon Sep 17 00:00:00 2001 -From: Khem Raj <raj.khem@gmail.com> -Date: Sun, 16 Aug 2015 20:50:56 -0700 -Subject: [PATCH 2/7] Add implementation for copysignl for ppc - -Signed-off-by: Khem Raj <raj.khem@gmail.com> ---- -Upstream-Status: Pending - - libc/sysdeps/linux/powerpc/Makefile.arch | 2 +- - libc/sysdeps/linux/powerpc/copysignl.c | 89 ++++++++++++++++++++++++++++++++ - 2 files changed, 90 insertions(+), 1 deletion(-) - create mode 100644 libc/sysdeps/linux/powerpc/copysignl.c - -diff --git a/libc/sysdeps/linux/powerpc/Makefile.arch b/libc/sysdeps/linux/powerpc/Makefile.arch -index 4fbcb11..7c09c87 100644 ---- a/libc/sysdeps/linux/powerpc/Makefile.arch -+++ b/libc/sysdeps/linux/powerpc/Makefile.arch -@@ -5,7 +5,7 @@ - # Licensed under the LGPL v2.1, see the file COPYING.LIB in this tarball. - # - --CSRC-y := __syscall_error.c ioctl.c -+CSRC-y := __syscall_error.c ioctl.c copysignl.c - - SSRC-y := \ - __longjmp.S setjmp.S bsd-setjmp.S bsd-_setjmp.S brk.S \ -diff --git a/libc/sysdeps/linux/powerpc/copysignl.c b/libc/sysdeps/linux/powerpc/copysignl.c -new file mode 100644 -index 0000000..000f653 ---- /dev/null -+++ b/libc/sysdeps/linux/powerpc/copysignl.c -@@ -0,0 +1,89 @@ -+/* s_copysignl.c -- long double version of s_copysign.c. -+ * Conversion to long double by Ulrich Drepper, -+ * Cygnus Support, drepper@cygnus.com. -+ */ -+ -+/* -+ * ==================================================== -+ * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. -+ * -+ * Developed at SunPro, a Sun Microsystems, Inc. business. -+ * Permission to use, copy, modify, and distribute this -+ * software is freely granted, provided that this notice -+ * is preserved. -+ * ==================================================== -+ */ -+ -+/* -+ * copysignl(long double x, long double y) -+ * copysignl(x,y) returns a value with the magnitude of x and -+ * with the sign bit of y. -+ */ -+ -+#include <endian.h> -+#include <stdint.h> -+ -+#if __FLOAT_WORD_ORDER == BIG_ENDIAN -+ -+typedef union -+{ -+ long double value; -+ struct -+ { -+ int sign_exponent:16; -+ unsigned int empty:16; -+ uint32_t msw; -+ uint32_t lsw; -+ } parts; -+} ieee_long_double_shape_type; -+ -+#endif -+ -+#if __FLOAT_WORD_ORDER == LITTLE_ENDIAN -+ -+typedef union -+{ -+ long double value; -+ struct -+ { -+ uint32_t lsw; -+ uint32_t msw; -+ int sign_exponent:16; -+ unsigned int empty:16; -+ } parts; -+} ieee_long_double_shape_type; -+ -+#endif -+ -+/* Get int from the exponent of a long double. */ -+ -+#define GET_LDOUBLE_EXP(exp,d) \ -+do { \ -+ ieee_long_double_shape_type ge_u; \ -+ ge_u.value = (d); \ -+ (exp) = ge_u.parts.sign_exponent; \ -+} while (0) -+ -+/* Set exponent of a long double from an int. */ -+ -+#define SET_LDOUBLE_EXP(d,exp) \ -+do { \ -+ ieee_long_double_shape_type se_u; \ -+ se_u.value = (d); \ -+ se_u.parts.sign_exponent = (exp); \ -+ (d) = se_u.value; \ -+} while (0) -+ -+long double copysignl(long double x, long double y); -+libc_hidden_proto(copysignl); -+ -+long double copysignl(long double x, long double y) -+{ -+ uint32_t es1,es2; -+ GET_LDOUBLE_EXP(es1,x); -+ GET_LDOUBLE_EXP(es2,y); -+ SET_LDOUBLE_EXP(x,(es1&0x7fff)|(es2&0x8000)); -+ return x; -+} -+ -+libc_hidden_def(copysignl); --- -2.1.4 - diff --git a/yocto-poky/meta/recipes-core/uclibc/uclibc-git/0003-Add-argp-implementation.patch b/yocto-poky/meta/recipes-core/uclibc/uclibc-git/0003-Add-argp-implementation.patch deleted file mode 100644 index ee9448337..000000000 --- a/yocto-poky/meta/recipes-core/uclibc/uclibc-git/0003-Add-argp-implementation.patch +++ /dev/null @@ -1,5811 +0,0 @@ -From eaae816fb22929469aa4cc3402b91b512fc69549 Mon Sep 17 00:00:00 2001 -From: Salvatore Cro <salvatore.cro@st.com> -Date: Sun, 16 Aug 2015 20:53:37 -0700 -Subject: [PATCH 3/7] Add argp implementation - -Argp is an advanced support for parsing unix-style argument vectors. -In addition to the common getopt interface, it provides automatic -response -to `--help' and `--version' options and use of custom parser in -conjunction -with argp native option parser, among others. -Argp support is required by elfutils package and prelink. - -In uClibc argp functionalities has been moved from C library to -libuargp.so -Further the libc.so linker script contains an AS_NEEDED entry so that -it doesn't need to link libuargp.so explicitely. - -Signed-off-by: Salvatore Cro <salvatore.cro@st.com> -Signed-off-by: Filippo Arcidiacono <filippo.arcidiacono@st.com> -Signed-off-by: Carmelo Amoroso <carmelo.amoroso@st.com> -Signed-off-by: Khem Raj <raj.khem@gmail.com> ---- -Upstream-Status: Pending - - Makefile.in | 9 + - Makerules | 7 +- - Rules.mak | 13 + - extra/Configs/Config.in | 17 + - include/argp.h | 566 ++++++++ - libc/sysdeps/linux/common/bits/getopt_int.h | 136 ++ - libc/unistd/getopt.c | 19 +- - libuargp/Makefile | 14 + - libuargp/Makefile.in | 73 ++ - libuargp/argp-ba.c | 26 + - libuargp/argp-eexst.c | 32 + - libuargp/argp-fmtstream.c | 439 +++++++ - libuargp/argp-fmtstream.h | 314 +++++ - libuargp/argp-fs-xinl.c | 44 + - libuargp/argp-help.c | 1882 +++++++++++++++++++++++++++ - libuargp/argp-parse.c | 949 ++++++++++++++ - libuargp/argp-pv.c | 25 + - libuargp/argp-pvh.c | 32 + - libuargp/argp-xinl.c | 35 + - test/argp/Makefile | 7 + - test/argp/Makefile.in | 12 + - test/argp/argp-ex1.c | 15 + - test/argp/argp-ex2.c | 45 + - test/argp/argp-ex3.c | 153 +++ - test/argp/argp-ex4.c | 167 +++ - test/argp/argp-test.c | 209 +++ - test/argp/bug-argp1.c | 26 + - test/argp/tst-argp1.c | 118 ++ - test/argp/tst-argp2.c | 101 ++ - 29 files changed, 5481 insertions(+), 4 deletions(-) - create mode 100644 include/argp.h - create mode 100644 libc/sysdeps/linux/common/bits/getopt_int.h - create mode 100644 libuargp/Makefile - create mode 100644 libuargp/Makefile.in - create mode 100644 libuargp/argp-ba.c - create mode 100644 libuargp/argp-eexst.c - create mode 100644 libuargp/argp-fmtstream.c - create mode 100644 libuargp/argp-fmtstream.h - create mode 100644 libuargp/argp-fs-xinl.c - create mode 100644 libuargp/argp-help.c - create mode 100644 libuargp/argp-parse.c - create mode 100644 libuargp/argp-pv.c - create mode 100644 libuargp/argp-pvh.c - create mode 100644 libuargp/argp-xinl.c - create mode 100644 test/argp/Makefile - create mode 100644 test/argp/Makefile.in - create mode 100644 test/argp/argp-ex1.c - create mode 100644 test/argp/argp-ex2.c - create mode 100644 test/argp/argp-ex3.c - create mode 100644 test/argp/argp-ex4.c - create mode 100644 test/argp/argp-test.c - create mode 100644 test/argp/bug-argp1.c - create mode 100644 test/argp/tst-argp1.c - create mode 100644 test/argp/tst-argp2.c - -diff --git a/Makefile.in b/Makefile.in -index 04671a4..a450af9 100644 ---- a/Makefile.in -+++ b/Makefile.in -@@ -39,6 +39,7 @@ include $(top_srcdir)libresolv/Makefile.in - include $(top_srcdir)libutil/Makefile.in - include $(top_srcdir)libpthread/Makefile.in - include $(top_srcdir)librt/Makefile.in -+include $(top_srcdir)libuargp/Makefile.in - include $(top_srcdir)libubacktrace/Makefile.in - - # last included to catch all the objects added by others (locales/threads) -@@ -262,6 +263,7 @@ HEADERS_RM- += sgtty.h - endif - HEADERS_RM-$(HAVE_SHARED) += dlfcn.h bits/dlfcn.h - HEADERS_RM-$(PTHREADS_DEBUG_SUPPORT) += thread_db.h -+HEADERS_RM-$(UCLIBC_HAS_ARGP) += argp.h - HEADERS_RM-$(UCLIBC_HAS_BSD_ERR) += err.h - HEADERS_RM-$(UCLIBC_HAS_CRYPT) += crypt.h - HEADERS_RM-$(UCLIBC_HAS_EPOLL) += sys/epoll.h -@@ -386,6 +388,13 @@ else - -$(INSTALL) -m 755 $(top_builddir)lib/libc.so $(PREFIX)$(DEVEL_PREFIX)$(MULTILIB_DIR)/ - endif - echo "$(UBACKTRACE_ASNEEDED)" >> $(PREFIX)$(DEVEL_PREFIX)$(MULTILIB_DIR)/libc.so -+ifeq ($(UCLIBC_HAS_ARGP),y) -+# Add the AS_NEEDED entry for libuargp.so -+ if [ -f $(top_builddir)lib/libc.so -a -f $(PREFIX)$(RUNTIME_PREFIX)$(MULTILIB_DIR)/$(SHARED_MAJORNAME) ] ; then \ -+ echo "GROUP ( $(UARGP_ASNEEDED) )" >> $(PREFIX)$(DEVEL_PREFIX)$(MULTILIB_DIR)/libc.so; \ -+ fi -+endif -+ - ifeq ($(UCLIBC_HAS_THREADS),y) - ifneq ($(LINUXTHREADS_OLD),y) - ifeq ($(HARDWIRED_ABSPATH),y) -diff --git a/Makerules b/Makerules -index d6f7e24..e70050d 100644 ---- a/Makerules -+++ b/Makerules -@@ -48,6 +48,7 @@ $(eval $(call add_IS_IN_lib,libresolv,$(libresolv-a-y) $(libresolv-so-y))) - $(eval $(call add_IS_IN_lib,librt,$(librt-a-y) $(librt-so-y))) - $(eval $(call add_IS_IN_lib,libutil,$(libutil-a-y) $(libutil-so-y))) - $(eval $(call add_IS_IN_lib,libubacktrace,$(libubacktrace-a-y) $(libubacktrace-so-y))) -+$(eval $(call add_IS_IN_lib,libuargp,$(libuargp-a-y) $(libuargp-so-y))) - - shared_objs = $(libc-y:.o=.os) $(libc-shared-y) $(libc-nonshared-y) \ - $(libcrypt-so-y) $(libdl-so-y) \ -@@ -55,12 +56,12 @@ shared_objs = $(libc-y:.o=.os) $(libc-shared-y) $(libc-nonshared-y) \ - $(libpthread-so-y) $(libpthread-nonshared-y) $(libthread_db-so-y) \ - $(libresolv-so-y) $(librt-so-y) \ - $(ldso-y) \ -- $(libutil-so-y) $(libubacktrace-so-y) -+ $(libutil-so-y) $(libubacktrace-so-y) $(libuargp-so-y) - - ar_objs = $(libc-y) $(libc-static-y) $(libcrypt-a-y) \ - $(libdl-a-y) $(libintl-a-y) $(libm-a-y) $(libnsl-a-y) \ - $(libpthread-a-y) $(libthread_db-a-y) \ -- $(libresolv-a-y) $(librt-a-y) $(libutil-a-y) $(libubacktrace-a-y) -+ $(libresolv-a-y) $(librt-a-y) $(libutil-a-y) $(libubacktrace-a-y) $(libuargp-a-y) - ifeq ($(DOPIC),y) - ar_objs := $(ar_objs:.o=.os) - endif -@@ -498,7 +499,7 @@ files.dep := $(libc-a-y) $(libc-so-y) $(libc-nonshared-y) \ - $(librt-a-y) $(librt-so-y) $(libresolv-a-y) $(libresolv-so-y) \ - $(libcrypt-a-y) $(libcrypt-so-y) $(libutil-a-y) $(libutil-so-y) \ - $(libnsl-a-y) $(libnsl-so-y) $(ldso-y) $(libdl-a-y) $(libdl-so-y) \ -- $(libubacktrace-a-y) $(libubacktrace-so-y) -+ $(libubacktrace-a-y) $(libubacktrace-so-y) $(libuargp-so-y) $(libuargp-a-y) - .depends.dep := \ - $(patsubst %.s,%.s.dep,$(filter %.s,$(files.dep))) \ - $(patsubst %.o,%.o.dep,$(filter %.o,$(files.dep))) \ -diff --git a/Rules.mak b/Rules.mak -index de9ffb3..a2baf58 100644 ---- a/Rules.mak -+++ b/Rules.mak -@@ -602,6 +602,19 @@ export UBACKTRACE_ASNEEDED:=$(shell $(CC) -Wl,--help 2>/dev/null | grep -q -- -- - else - export UBACKTRACE_ASNEEDED:="" - endif -+ifeq ($(UCLIBC_HAS_ARGP),y) -+ifeq ($(HARDWIRED_ABSPATH),y) -+# Only used in installed libc.so linker script -+UARGP_FULL_NAME := $(subst //,/,$(RUNTIME_PREFIX)$(MULTILIB_DIR)/libuargp.so.$(MAJOR_VERSION)) -+else -+UARGP_FULL_NAME := libuargp.so.$(MAJOR_VERSION) -+endif -+export UARGP_ASNEEDED:=$(shell $(CC) -Wl,--help 2>/dev/null | grep -q -- --as-needed && \ -+ echo "GROUP ( AS_NEEDED ( $(UARGP_FULL_NAME) ) )" || \ -+ echo "GROUP ( $(UARGP_FULL_NAME) )") -+else -+export UARGP_ASNEEDED:="" -+endif - endif - - # Add a bunch of extra pedantic annoyingly strict checks -diff --git a/extra/Configs/Config.in b/extra/Configs/Config.in -index 242e45a..b36d4c9 100644 ---- a/extra/Configs/Config.in -+++ b/extra/Configs/Config.in -@@ -1943,6 +1943,23 @@ config UCLIBC_HAS_GNU_GETSUBOPT - Answer Y if you want to include getsubopt(). - - Most people will answer Y. -+ -+config UCLIBC_HAS_ARGP -+ bool "Support argp (as standalone shared object)" -+ default n -+ help -+ Argp is an interface for parsing unix-style argument vectors. Unlike -+ the common getopt interface, it provides many advanced features in -+ addition to parsing options, such as automatic output in response to -+ `--help' and `--version' options. -+ A library can export an argp option parser, which programs can easily -+ use in conjunction with their own option parser. -+ A new shared object "libuargp" is created. The "libc.so" linker script -+ contains the AS_NEEDED entry for getting the libuargp linked automatically. -+ Argp support is needed by elfutils libdw. -+ -+ Most people can safely answer N. -+ - endmenu - - -diff --git a/include/argp.h b/include/argp.h -new file mode 100644 -index 0000000..9d53728 ---- /dev/null -+++ b/include/argp.h -@@ -0,0 +1,566 @@ -+/* Hierarchial argument parsing, layered over getopt. -+ Copyright (C) 1995-1999, 2003, 2004, 2005, 2006, 2007, 2009 -+ Free Software Foundation, Inc. -+ This file is part of the GNU C Library. -+ Written by Miles Bader <miles at gnu.ai.mit.edu>. -+ -+ The GNU C 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.1 of the License, or (at your option) any later version. -+ -+ The GNU C 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 the GNU C Library; if not, write to the Free -+ Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA -+ 02111-1307 USA. -+ -+ Modified for uClibc by: Salvatore Cro <salvatore.cro at st.com> -+*/ -+ -+#ifndef _ARGP_H -+#define _ARGP_H -+ -+#include <stdio.h> -+#include <ctype.h> -+#include <limits.h> -+ -+#define __need_error_t -+#include <errno.h> -+ -+#ifndef __const -+# define __const const -+#endif -+ -+#ifndef __THROW -+# define __THROW -+#endif -+#ifndef __NTH -+# define __NTH(fct) fct __THROW -+#endif -+ -+#ifndef __attribute__ -+/* This feature is available in gcc versions 2.5 and later. */ -+# if __GNUC__ < 2 || (__GNUC__ == 2 && __GNUC_MINOR__ < 5) || defined(__STRICT_ANSI__) -+# define __attribute__(Spec) /* empty */ -+# endif -+/* The __-protected variants of `format' and `printf' attributes -+ are accepted by gcc versions 2.6.4 (effectively 2.7) and later. */ -+# if __GNUC__ < 2 || (__GNUC__ == 2 && __GNUC_MINOR__ < 7) || defined(__STRICT_ANSI__) -+# define __format__ format -+# define __printf__ printf -+# endif -+#endif -+ -+/* GCC 2.95 and later have "__restrict"; C99 compilers have -+ "restrict", and "configure" may have defined "restrict". */ -+#ifndef __restrict -+# if ! (2 < __GNUC__ || (2 == __GNUC__ && 95 <= __GNUC_MINOR__)) -+# if defined restrict || 199901L <= __STDC_VERSION__ -+# define __restrict restrict -+# else -+# define __restrict -+# endif -+# endif -+#endif -+ -+#ifndef __error_t_defined -+typedef int error_t; -+# define __error_t_defined -+#endif -+ -+#ifdef __cplusplus -+extern "C" { -+#endif -+ -+/* A description of a particular option. A pointer to an array of -+ these is passed in the OPTIONS field of an argp structure. Each option -+ entry can correspond to one long option and/or one short option; more -+ names for the same option can be added by following an entry in an option -+ array with options having the OPTION_ALIAS flag set. */ -+struct argp_option -+{ -+ /* The long option name. For more than one name for the same option, you -+ can use following options with the OPTION_ALIAS flag set. */ -+ __const char *name; -+ -+ /* What key is returned for this option. If > 0 and printable, then it's -+ also accepted as a short option. */ -+ int key; -+ -+ /* If non-NULL, this is the name of the argument associated with this -+ option, which is required unless the OPTION_ARG_OPTIONAL flag is set. */ -+ __const char *arg; -+ -+ /* OPTION_ flags. */ -+ int flags; -+ -+ /* The doc string for this option. If both NAME and KEY are 0, This string -+ will be printed outdented from the normal option column, making it -+ useful as a group header (it will be the first thing printed in its -+ group); in this usage, it's conventional to end the string with a `:'. */ -+ __const char *doc; -+ -+ /* The group this option is in. In a long help message, options are sorted -+ alphabetically within each group, and the groups presented in the order -+ 0, 1, 2, ..., n, -m, ..., -2, -1. Every entry in an options array with -+ if this field 0 will inherit the group number of the previous entry, or -+ zero if it's the first one, unless its a group header (NAME and KEY both -+ 0), in which case, the previous entry + 1 is the default. Automagic -+ options such as --help are put into group -1. */ -+ int group; -+}; -+ -+/* The argument associated with this option is optional. */ -+#define OPTION_ARG_OPTIONAL 0x1 -+ -+/* This option isn't displayed in any help messages. */ -+#define OPTION_HIDDEN 0x2 -+ -+/* This option is an alias for the closest previous non-alias option. This -+ means that it will be displayed in the same help entry, and will inherit -+ fields other than NAME and KEY from the aliased option. */ -+#define OPTION_ALIAS 0x4 -+ -+/* This option isn't actually an option (and so should be ignored by the -+ actual option parser), but rather an arbitrary piece of documentation that -+ should be displayed in much the same manner as the options. If this flag -+ is set, then the option NAME field is displayed unmodified (e.g., no `--' -+ prefix is added) at the left-margin (where a *short* option would normally -+ be displayed), and the documentation string in the normal place. For -+ purposes of sorting, any leading whitespace and punctuation is ignored, -+ except that if the first non-whitespace character is not `-', this entry -+ is displayed after all options (and OPTION_DOC entries with a leading `-') -+ in the same group. */ -+#define OPTION_DOC 0x8 -+ -+/* This option shouldn't be included in `long' usage messages (but is still -+ included in help messages). This is mainly intended for options that are -+ completely documented in an argp's ARGS_DOC field, in which case including -+ the option in the generic usage list would be redundant. For instance, -+ if ARGS_DOC is "FOO BAR\n-x BLAH", and the `-x' option's purpose is to -+ distinguish these two cases, -x should probably be marked -+ OPTION_NO_USAGE. */ -+#define OPTION_NO_USAGE 0x10 -+ -+struct argp; /* fwd declare this type */ -+struct argp_state; /* " */ -+struct argp_child; /* " */ -+ -+/* The type of a pointer to an argp parsing function. */ -+typedef error_t (*argp_parser_t) (int __key, char *__arg, -+ struct argp_state *__state); -+ -+/* What to return for unrecognized keys. For special ARGP_KEY_ keys, such -+ returns will simply be ignored. For user keys, this error will be turned -+ into EINVAL (if the call to argp_parse is such that errors are propagated -+ back to the user instead of exiting); returning EINVAL itself would result -+ in an immediate stop to parsing in *all* cases. */ -+#define ARGP_ERR_UNKNOWN E2BIG /* Hurd should never need E2BIG. XXX */ -+ -+/* Special values for the KEY argument to an argument parsing function. -+ ARGP_ERR_UNKNOWN should be returned if they aren't understood. -+ -+ The sequence of keys to a parsing function is either (where each -+ uppercased word should be prefixed by `ARGP_KEY_' and opt is a user key): -+ -+ INIT opt... NO_ARGS END SUCCESS -- No non-option arguments at all -+ or INIT (opt | ARG)... END SUCCESS -- All non-option args parsed -+ or INIT (opt | ARG)... SUCCESS -- Some non-option arg unrecognized -+ -+ The third case is where every parser returned ARGP_KEY_UNKNOWN for an -+ argument, in which case parsing stops at that argument (returning the -+ unparsed arguments to the caller of argp_parse if requested, or stopping -+ with an error message if not). -+ -+ If an error occurs (either detected by argp, or because the parsing -+ function returned an error value), then the parser is called with -+ ARGP_KEY_ERROR, and no further calls are made. */ -+ -+/* This is not an option at all, but rather a command line argument. If a -+ parser receiving this key returns success, the fact is recorded, and the -+ ARGP_KEY_NO_ARGS case won't be used. HOWEVER, if while processing the -+ argument, a parser function decrements the NEXT field of the state it's -+ passed, the option won't be considered processed; this is to allow you to -+ actually modify the argument (perhaps into an option), and have it -+ processed again. */ -+#define ARGP_KEY_ARG 0 -+/* There are remaining arguments not parsed by any parser, which may be found -+ starting at (STATE->argv + STATE->next). If success is returned, but -+ STATE->next left untouched, it's assumed that all arguments were consume, -+ otherwise, the parser should adjust STATE->next to reflect any arguments -+ consumed. */ -+#define ARGP_KEY_ARGS 0x1000006 -+/* There are no more command line arguments at all. */ -+#define ARGP_KEY_END 0x1000001 -+/* Because it's common to want to do some special processing if there aren't -+ any non-option args, user parsers are called with this key if they didn't -+ successfully process any non-option arguments. Called just before -+ ARGP_KEY_END (where more general validity checks on previously parsed -+ arguments can take place). */ -+#define ARGP_KEY_NO_ARGS 0x1000002 -+/* Passed in before any parsing is done. Afterwards, the values of each -+ element of the CHILD_INPUT field, if any, in the state structure is -+ copied to each child's state to be the initial value of the INPUT field. */ -+#define ARGP_KEY_INIT 0x1000003 -+/* Use after all other keys, including SUCCESS & END. */ -+#define ARGP_KEY_FINI 0x1000007 -+/* Passed in when parsing has successfully been completed (even if there are -+ still arguments remaining). */ -+#define ARGP_KEY_SUCCESS 0x1000004 -+/* Passed in if an error occurs. */ -+#define ARGP_KEY_ERROR 0x1000005 -+ -+/* An argp structure contains a set of options declarations, a function to -+ deal with parsing one, documentation string, a possible vector of child -+ argp's, and perhaps a function to filter help output. When actually -+ parsing options, getopt is called with the union of all the argp -+ structures chained together through their CHILD pointers, with conflicts -+ being resolved in favor of the first occurrence in the chain. */ -+struct argp -+{ -+ /* An array of argp_option structures, terminated by an entry with both -+ NAME and KEY having a value of 0. */ -+ __const struct argp_option *options; -+ -+ /* What to do with an option from this structure. KEY is the key -+ associated with the option, and ARG is any associated argument (NULL if -+ none was supplied). If KEY isn't understood, ARGP_ERR_UNKNOWN should be -+ returned. If a non-zero, non-ARGP_ERR_UNKNOWN value is returned, then -+ parsing is stopped immediately, and that value is returned from -+ argp_parse(). For special (non-user-supplied) values of KEY, see the -+ ARGP_KEY_ definitions below. */ -+ argp_parser_t parser; -+ -+ /* A string describing what other arguments are wanted by this program. It -+ is only used by argp_usage to print the `Usage:' message. If it -+ contains newlines, the strings separated by them are considered -+ alternative usage patterns, and printed on separate lines (lines after -+ the first are prefix by ` or: ' instead of `Usage:'). */ -+ __const char *args_doc; -+ -+ /* If non-NULL, a string containing extra text to be printed before and -+ after the options in a long help message (separated by a vertical tab -+ `\v' character). */ -+ __const char *doc; -+ -+ /* A vector of argp_children structures, terminated by a member with a 0 -+ argp field, pointing to child argps should be parsed with this one. Any -+ conflicts are resolved in favor of this argp, or early argps in the -+ CHILDREN list. This field is useful if you use libraries that supply -+ their own argp structure, which you want to use in conjunction with your -+ own. */ -+ __const struct argp_child *children; -+ -+ /* If non-zero, this should be a function to filter the output of help -+ messages. KEY is either a key from an option, in which case TEXT is -+ that option's help text, or a special key from the ARGP_KEY_HELP_ -+ defines, below, describing which other help text TEXT is. The function -+ should return either TEXT, if it should be used as-is, a replacement -+ string, which should be malloced, and will be freed by argp, or NULL, -+ meaning `print nothing'. The value for TEXT is *after* any translation -+ has been done, so if any of the replacement text also needs translation, -+ that should be done by the filter function. INPUT is either the input -+ supplied to argp_parse, or NULL, if argp_help was called directly. */ -+ char *(*help_filter) (int __key, __const char *__text, void *__input); -+ -+ /* If non-zero the strings used in the argp library are translated using -+ the domain described by this string. Otherwise the currently installed -+ default domain is used. */ -+ const char *argp_domain; -+}; -+ -+/* Possible KEY arguments to a help filter function. */ -+#define ARGP_KEY_HELP_PRE_DOC 0x2000001 /* Help text preceeding options. */ -+#define ARGP_KEY_HELP_POST_DOC 0x2000002 /* Help text following options. */ -+#define ARGP_KEY_HELP_HEADER 0x2000003 /* Option header string. */ -+#define ARGP_KEY_HELP_EXTRA 0x2000004 /* After all other documentation; -+ TEXT is NULL for this key. */ -+/* Explanatory note emitted when duplicate option arguments have been -+ suppressed. */ -+#define ARGP_KEY_HELP_DUP_ARGS_NOTE 0x2000005 -+#define ARGP_KEY_HELP_ARGS_DOC 0x2000006 /* Argument doc string. */ -+ -+/* When an argp has a non-zero CHILDREN field, it should point to a vector of -+ argp_child structures, each of which describes a subsidiary argp. */ -+struct argp_child -+{ -+ /* The child parser. */ -+ __const struct argp *argp; -+ -+ /* Flags for this child. */ -+ int flags; -+ -+ /* If non-zero, an optional header to be printed in help output before the -+ child options. As a side-effect, a non-zero value forces the child -+ options to be grouped together; to achieve this effect without actually -+ printing a header string, use a value of "". */ -+ __const char *header; -+ -+ /* Where to group the child options relative to the other (`consolidated') -+ options in the parent argp; the values are the same as the GROUP field -+ in argp_option structs, but all child-groupings follow parent options at -+ a particular group level. If both this field and HEADER are zero, then -+ they aren't grouped at all, but rather merged with the parent options -+ (merging the child's grouping levels with the parents). */ -+ int group; -+}; -+ -+/* Parsing state. This is provided to parsing functions called by argp, -+ which may examine and, as noted, modify fields. */ -+struct argp_state -+{ -+ /* The top level ARGP being parsed. */ -+ __const struct argp *root_argp; -+ -+ /* The argument vector being parsed. May be modified. */ -+ int argc; -+ char **argv; -+ -+ /* The index in ARGV of the next arg that to be parsed. May be modified. */ -+ int next; -+ -+ /* The flags supplied to argp_parse. May be modified. */ -+ unsigned flags; -+ -+ /* While calling a parsing function with a key of ARGP_KEY_ARG, this is the -+ number of the current arg, starting at zero, and incremented after each -+ such call returns. At all other times, this is the number of such -+ arguments that have been processed. */ -+ unsigned arg_num; -+ -+ /* If non-zero, the index in ARGV of the first argument following a special -+ `--' argument (which prevents anything following being interpreted as an -+ option). Only set once argument parsing has proceeded past this point. */ -+ int quoted; -+ -+ /* An arbitrary pointer passed in from the user. */ -+ void *input; -+ /* Values to pass to child parsers. This vector will be the same length as -+ the number of children for the current parser. */ -+ void **child_inputs; -+ -+ /* For the parser's use. Initialized to 0. */ -+ void *hook; -+ -+ /* The name used when printing messages. This is initialized to ARGV[0], -+ or PROGRAM_INVOCATION_NAME if that is unavailable. */ -+ char *name; -+ -+ /* Streams used when argp prints something. */ -+ FILE *err_stream; /* For errors; initialized to stderr. */ -+ FILE *out_stream; /* For information; initialized to stdout. */ -+ -+ void *pstate; /* Private, for use by argp. */ -+}; -+ -+/* Flags for argp_parse (note that the defaults are those that are -+ convenient for program command line parsing): */ -+ -+/* Don't ignore the first element of ARGV. Normally (and always unless -+ ARGP_NO_ERRS is set) the first element of the argument vector is -+ skipped for option parsing purposes, as it corresponds to the program name -+ in a command line. */ -+#define ARGP_PARSE_ARGV0 0x01 -+ -+/* Don't print error messages for unknown options to stderr; unless this flag -+ is set, ARGP_PARSE_ARGV0 is ignored, as ARGV[0] is used as the program -+ name in the error messages. This flag implies ARGP_NO_EXIT (on the -+ assumption that silent exiting upon errors is bad behaviour). */ -+#define ARGP_NO_ERRS 0x02 -+ -+/* Don't parse any non-option args. Normally non-option args are parsed by -+ calling the parse functions with a key of ARGP_KEY_ARG, and the actual arg -+ as the value. Since it's impossible to know which parse function wants to -+ handle it, each one is called in turn, until one returns 0 or an error -+ other than ARGP_ERR_UNKNOWN; if an argument is handled by no one, the -+ argp_parse returns prematurely (but with a return value of 0). If all -+ args have been parsed without error, all parsing functions are called one -+ last time with a key of ARGP_KEY_END. This flag needn't normally be set, -+ as the normal behavior is to stop parsing as soon as some argument can't -+ be handled. */ -+#define ARGP_NO_ARGS 0x04 -+ -+/* Parse options and arguments in the same order they occur on the command -+ line -- normally they're rearranged so that all options come first. */ -+#define ARGP_IN_ORDER 0x08 -+ -+/* Don't provide the standard long option --help, which causes usage and -+ option help information to be output to stdout, and exit (0) called. */ -+#define ARGP_NO_HELP 0x10 -+ -+/* Don't exit on errors (they may still result in error messages). */ -+#define ARGP_NO_EXIT 0x20 -+ -+/* Use the gnu getopt `long-only' rules for parsing arguments. */ -+#define ARGP_LONG_ONLY 0x40 -+ -+/* Turns off any message-printing/exiting options. */ -+#define ARGP_SILENT (ARGP_NO_EXIT | ARGP_NO_ERRS | ARGP_NO_HELP) -+ -+/* Parse the options strings in ARGC & ARGV according to the options in ARGP. -+ FLAGS is one of the ARGP_ flags above. If ARG_INDEX is non-NULL, the -+ index in ARGV of the first unparsed option is returned in it. If an -+ unknown option is present, ARGP_ERR_UNKNOWN is returned; if some parser -+ routine returned a non-zero value, it is returned; otherwise 0 is -+ returned. This function may also call exit unless the ARGP_NO_HELP flag -+ is set. INPUT is a pointer to a value to be passed in to the parser. */ -+extern error_t argp_parse (__const struct argp *__restrict __argp, -+ int __argc, char **__restrict __argv, -+ unsigned __flags, int *__restrict __arg_index, -+ void *__restrict __input); -+ -+/* Global variables. */ -+ -+/* If defined or set by the user program to a non-zero value, then a default -+ option --version is added (unless the ARGP_NO_HELP flag is used), which -+ will print this string followed by a newline and exit (unless the -+ ARGP_NO_EXIT flag is used). Overridden by ARGP_PROGRAM_VERSION_HOOK. */ -+extern __const char *argp_program_version; -+ -+/* If defined or set by the user program to a non-zero value, then a default -+ option --version is added (unless the ARGP_NO_HELP flag is used), which -+ calls this function with a stream to print the version to and a pointer to -+ the current parsing state, and then exits (unless the ARGP_NO_EXIT flag is -+ used). This variable takes precedent over ARGP_PROGRAM_VERSION. */ -+extern void (*argp_program_version_hook) (FILE *__restrict __stream, -+ struct argp_state *__restrict -+ __state); -+ -+/* If defined or set by the user program, it should point to string that is -+ the bug-reporting address for the program. It will be printed by -+ argp_help if the ARGP_HELP_BUG_ADDR flag is set (as it is by various -+ standard help messages), embedded in a sentence that says something like -+ `Report bugs to ADDR.'. */ -+extern __const char *argp_program_bug_address; -+ -+/* The exit status that argp will use when exiting due to a parsing error. -+ If not defined or set by the user program, this defaults to EX_USAGE from -+ <sysexits.h>. */ -+extern error_t argp_err_exit_status; -+ -+/* Flags for argp_help. */ -+#define ARGP_HELP_USAGE 0x01 /* a Usage: message. */ -+#define ARGP_HELP_SHORT_USAGE 0x02 /* " but don't actually print options. */ -+#define ARGP_HELP_SEE 0x04 /* a `Try ... for more help' message. */ -+#define ARGP_HELP_LONG 0x08 /* a long help message. */ -+#define ARGP_HELP_PRE_DOC 0x10 /* doc string preceding long help. */ -+#define ARGP_HELP_POST_DOC 0x20 /* doc string following long help. */ -+#define ARGP_HELP_DOC (ARGP_HELP_PRE_DOC | ARGP_HELP_POST_DOC) -+#define ARGP_HELP_BUG_ADDR 0x40 /* bug report address */ -+#define ARGP_HELP_LONG_ONLY 0x80 /* modify output appropriately to -+ reflect ARGP_LONG_ONLY mode. */ -+ -+/* These ARGP_HELP flags are only understood by argp_state_help. */ -+#define ARGP_HELP_EXIT_ERR 0x100 /* Call exit(1) instead of returning. */ -+#define ARGP_HELP_EXIT_OK 0x200 /* Call exit(0) instead of returning. */ -+ -+/* The standard thing to do after a program command line parsing error, if an -+ error message has already been printed. */ -+#define ARGP_HELP_STD_ERR \ -+ (ARGP_HELP_SEE | ARGP_HELP_EXIT_ERR) -+/* The standard thing to do after a program command line parsing error, if no -+ more specific error message has been printed. */ -+#define ARGP_HELP_STD_USAGE \ -+ (ARGP_HELP_SHORT_USAGE | ARGP_HELP_SEE | ARGP_HELP_EXIT_ERR) -+/* The standard thing to do in response to a --help option. */ -+#define ARGP_HELP_STD_HELP \ -+ (ARGP_HELP_SHORT_USAGE | ARGP_HELP_LONG | ARGP_HELP_EXIT_OK \ -+ | ARGP_HELP_DOC | ARGP_HELP_BUG_ADDR) -+ -+/* Output a usage message for ARGP to STREAM. FLAGS are from the set -+ ARGP_HELP_*. */ -+extern void argp_help (__const struct argp *__restrict __argp, -+ FILE *__restrict __stream, -+ unsigned __flags, char *__restrict __name); -+ -+/* The following routines are intended to be called from within an argp -+ parsing routine (thus taking an argp_state structure as the first -+ argument). They may or may not print an error message and exit, depending -+ on the flags in STATE -- in any case, the caller should be prepared for -+ them *not* to exit, and should return an appropiate error after calling -+ them. [argp_usage & argp_error should probably be called argp_state_..., -+ but they're used often enough that they should be short] */ -+ -+/* Output, if appropriate, a usage message for STATE to STREAM. FLAGS are -+ from the set ARGP_HELP_*. */ -+extern void argp_state_help (__const struct argp_state *__restrict __state, -+ FILE *__restrict __stream, -+ unsigned int __flags); -+/* Possibly output the standard usage message for ARGP to stderr and exit. */ -+extern void argp_usage (__const struct argp_state *__state); -+ -+/* If appropriate, print the printf string FMT and following args, preceded -+ by the program name and `:', to stderr, and followed by a `Try ... --help' -+ message, then exit (1). */ -+extern void argp_error (__const struct argp_state *__restrict __state, -+ __const char *__restrict __fmt, ...) -+ __attribute__ ((__format__ (__printf__, 2, 3))); -+/* Similar to the standard gnu error-reporting function error(), but will -+ respect the ARGP_NO_EXIT and ARGP_NO_ERRS flags in STATE, and will print -+ to STATE->err_stream. This is useful for argument parsing code that is -+ shared between program startup (when exiting is desired) and runtime -+ option parsing (when typically an error code is returned instead). The -+ difference between this function and argp_error is that the latter is for -+ *parsing errors*, and the former is for other problems that occur during -+ parsing but don't reflect a (syntactic) problem with the input. */ -+extern void argp_failure (__const struct argp_state *__restrict __state, -+ int __status, int __errnum, -+ __const char *__restrict __fmt, ...) -+ __attribute__ ((__format__ (__printf__, 4, 5))); -+/* Returns true if the option OPT is a valid short option. */ -+extern int _option_is_short (__const struct argp_option *__opt) __THROW; -+extern int __option_is_short (__const struct argp_option *__opt) __THROW; -+ -+/* Returns true if the option OPT is in fact the last (unused) entry in an -+ options array. */ -+extern int _option_is_end (__const struct argp_option *__opt) __THROW; -+extern int __option_is_end (__const struct argp_option *__opt) __THROW; -+ -+/* Return the input field for ARGP in the parser corresponding to STATE; used -+ by the help routines. */ -+/* We think this should not be exported */ -+extern void *__argp_input (__const struct argp *__restrict __argp, -+ __const struct argp_state *__restrict __state) -+ __THROW; -+ -+#ifdef __USE_EXTERN_INLINES -+ -+# ifndef ARGP_EI -+# define ARGP_EI __extern_inline -+# endif -+ -+ARGP_EI void -+argp_usage (__const struct argp_state *__state) -+{ -+ argp_state_help (__state, stderr, ARGP_HELP_STD_USAGE); -+} -+ -+ARGP_EI int -+__NTH (__option_is_short (__const struct argp_option *__opt)) -+{ -+ if (__opt->flags & OPTION_DOC) -+ return 0; -+ else -+ { -+ int __key = __opt->key; -+ return __key > 0 && __key <= UCHAR_MAX && isprint (__key); -+ } -+} -+ -+ARGP_EI int -+__NTH (__option_is_end (__const struct argp_option *__opt)) -+{ -+ return !__opt->key && !__opt->name && !__opt->doc && !__opt->group; -+} -+#endif /* Use extern inlines. */ -+ -+#ifdef __cplusplus -+} -+#endif -+ -+#endif /* argp.h */ -diff --git a/libc/sysdeps/linux/common/bits/getopt_int.h b/libc/sysdeps/linux/common/bits/getopt_int.h -new file mode 100644 -index 0000000..291edfe ---- /dev/null -+++ b/libc/sysdeps/linux/common/bits/getopt_int.h -@@ -0,0 +1,136 @@ -+/* Internal declarations for getopt. -+ Copyright (C) 1989-1994,1996-1999,2001,2003,2004 -+ Free Software Foundation, Inc. -+ This file is part of the GNU C Library. -+ -+ The GNU C 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.1 of the License, or (at your option) any later version. -+ -+ The GNU C 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 the GNU C Library; if not, write to the Free -+ Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA -+ 02111-1307 USA. */ -+ -+#ifndef _GETOPT_INT_H -+#define _GETOPT_INT_H 1 -+ -+extern int _getopt_internal (int ___argc, char *const *___argv, -+ const char *__shortopts, -+ const struct option *__longopts, int *__longind, -+ int __long_only) attribute_hidden; -+ -+ -+/* Reentrant versions which can handle parsing multiple argument -+ vectors at the same time. */ -+ -+/* For __ordering member */ -+enum { -+ REQUIRE_ORDER, PERMUTE, RETURN_IN_ORDER -+}; -+ -+/* Data type for reentrant functions. */ -+ -+struct _getopt_data -+{ -+ /* These have exactly the same meaning as the corresponding global -+ variables, except that they are used for the reentrant -+ versions of getopt. */ -+ int optind; -+ int opterr; -+ char *optarg; -+ smalluint optopt; /* we store characters here, a byte is enough */ -+ -+ /* Internal members. */ -+ -+ /* True if the internal members have been initialized. */ -+ smallint __initialized; -+ -+ /* Describe how to deal with options that follow non-option ARGV-elements. -+ -+ If the caller did not specify anything, -+ the default is REQUIRE_ORDER if the environment variable -+ POSIXLY_CORRECT is defined, PERMUTE otherwise. -+ -+ REQUIRE_ORDER means don't recognize them as options; -+ stop option processing when the first non-option is seen. -+ This is what Unix does. -+ This mode of operation is selected by either setting the environment -+ variable POSIXLY_CORRECT, or using `+' as the first character -+ of the list of option characters. -+ -+ PERMUTE is the default. We permute the contents of ARGV as we -+ scan, so that eventually all the non-options are at the end. -+ This allows options to be given in any order, even with programs -+ that were not written to expect this. -+ -+ RETURN_IN_ORDER is an option available to programs that were -+ written to expect options and other ARGV-elements in any order -+ and that care about the ordering of the two. We describe each -+ non-option ARGV-element as if it were the argument of an option -+ with character code 1. Using `-' as the first character of the -+ list of option characters selects this mode of operation. -+ -+ The special argument `--' forces an end of option-scanning regardless -+ of the value of `ordering'. In the case of RETURN_IN_ORDER, only -+ `--' can cause `getopt' to return -1 with `optind' != ARGC. */ -+ smallint __ordering; -+ -+ /* If the POSIXLY_CORRECT environment variable is set. */ -+ smallint __posixly_correct; -+ -+ /* The next char to be scanned in the option-element -+ in which the last option character we returned was found. -+ This allows us to pick up the scan where we left off. -+ -+ If this is zero, or a null string, it means resume the scan -+ by advancing to the next ARGV-element. */ -+ char *__nextchar; -+ -+ -+ /* Handle permutation of arguments. */ -+ -+ /* Describe the part of ARGV that contains non-options that have -+ been skipped. `first_nonopt' is the index in ARGV of the first -+ of them; `last_nonopt' is the index after the last of them. */ -+ -+ int __first_nonopt; -+ int __last_nonopt; -+ -+#if defined _LIBC && defined USE_NONOPTION_FLAGS -+ int __nonoption_flags_max_len; -+ int __nonoption_flags_len; -+# endif -+}; -+ -+/* The initializer is necessary to set OPTIND and OPTERR to their -+ default values and to clear the initialization flag. */ -+#define _GETOPT_DATA_INITIALIZER { 1, 1 } -+ -+#if 0 /* first is static on uClibc, the others not used */ -+extern int _getopt_internal_r (int ___argc, char *const *___argv, -+ const char *__shortopts, -+ const struct option *__longopts, int *__longind, -+ int __long_only, struct _getopt_data *__data); -+#endif -+#if defined __UCLIBC_HAS_GNU_GETOPT__ || defined __UCLIBC_HAS_GETOPT_LONG__ -+#ifndef __need_getopt -+extern int _getopt_long_r (int ___argc, char *const *___argv, -+ const char *__shortopts, -+ const struct option *__longopts, int *__longind, -+ struct _getopt_data *__data); -+ -+extern int _getopt_long_only_r (int ___argc, char *const *___argv, -+ const char *__shortopts, -+ const struct option *__longopts, -+ int *__longind, -+ struct _getopt_data *__data); -+#endif -+#endif -+#endif /* getopt_int.h */ -diff --git a/libc/unistd/getopt.c b/libc/unistd/getopt.c -index f63482b..db5e12c 100644 ---- a/libc/unistd/getopt.c -+++ b/libc/unistd/getopt.c -@@ -105,7 +105,7 @@ - they can distinguish the relative order of options and other arguments. */ - - #include <getopt.h> --#include "getopt_int.h" -+#include <bits/getopt_int.h> - - - /* For communication from `getopt' to the caller. -@@ -1170,6 +1170,15 @@ getopt_long (int argc, char *const *argv, const char *options, - return _getopt_internal (argc, argv, options, long_options, opt_index, 0); - } - -+int -+_getopt_long_r (int argc, char *const *argv, const char *options, -+ const struct option *long_options, int *opt_index, -+ struct _getopt_data *d) -+{ -+ return _getopt_internal_r (argc, argv, options, long_options, opt_index, -+ 0, d); -+} -+ - /* Like getopt_long, but '-' as well as '--' can indicate a long option. - If an option that starts with '-' (not '--') doesn't match a long option, - but does match a short option, it is parsed as a short option -@@ -1183,4 +1192,12 @@ getopt_long_only (int argc, char *const *argv, const char *options, - } - #endif /* __UCLIBC_HAS_GETOPT_LONG__ */ - -+int -+_getopt_long_only_r (int argc, char *const *argv, const char *options, -+ const struct option *long_options, int *opt_index, -+ struct _getopt_data *d) -+{ -+ return _getopt_internal_r (argc, argv, options, long_options, opt_index, 1, d); -+} -+ - #endif /* Not ELIDE_CODE. */ -diff --git a/libuargp/Makefile b/libuargp/Makefile -new file mode 100644 -index 0000000..45acdd9 ---- /dev/null -+++ b/libuargp/Makefile -@@ -0,0 +1,14 @@ -+# Makefile for uClibc (libuargp) -+# -+# Copyright (C) 2010 STMicroelectronics Ltd -+# Author(s): Filippo Arcidiacono <filippo.arcidiacono at st.com> -+# -+# Licensed under the LGPL v2.1, see the file COPYING.LIB in this tarball. -+# -+ -+top_srcdir=../ -+top_builddir=../ -+include $(top_builddir)Rules.mak -+all: libs -+include Makefile.in -+include $(top_srcdir)Makerules -diff --git a/libuargp/Makefile.in b/libuargp/Makefile.in -new file mode 100644 -index 0000000..1498abb ---- /dev/null -+++ b/libuargp/Makefile.in -@@ -0,0 +1,73 @@ -+# Makefile for uClibc (libuargp) -+# -+# Copyright (C) 2009, 2010 STMicroelectronics Ltd. -+# Author(s): Salvatore Cro <salvatore.cro at st.com> -+# - First implementation, embedded into libc -+# Filippo Arcidiacono <filippo.arcidiacono at st.com> -+# - Reworked for stand-alone libuargp implementation -+ -+# Licensed under the LGPL v2.1, see the file COPYING.LIB in this tarball. -+# -+ -+CFLAGS-libuargp := -DNOT_IN_libc -DIS_IN_libuargp $(SSP_ALL_CFLAGS) -+ -+LDFLAGS-libuargp.so := $(LDFLAGS) -+ -+LIBS-libuargp.so := $(LIBS) -+ -+libuargp_FULL_NAME := libuargp-$(VERSION).so -+ -+libuargp_DIR := $(top_srcdir)libuargp -+libuargp_OUT := $(top_builddir)libuargp -+ -+libuargp_SRC-y := -+libuargp_SRC-$(UCLIBC_HAS_ARGP) := $(addsuffix .c,$(addprefix argp-, ba \ -+ eexst fmtstream fs-xinl help parse pv pvh xinl)) -+ -+CFLAGS-argp-xinl.c = -fgnu89-inline -+ -+libuargp_SRC := $(addprefix $(libuargp_DIR)/,$(libuargp_SRC-y)) -+libuargp_OBJ := $(patsubst $(libuargp_DIR)/%.c,$(libuargp_OUT)/%.o,$(libuargp_SRC)) -+ -+libuargp_SRCS := $(libuargp_SRC) -+libuargp_OBJS := $(libuargp_OBJ) -+ -+ifeq ($(DOPIC),y) -+libuargp-a-y := $(libuargp_OBJS:.o=.os) -+else -+libuargp-a-y := $(libuargp_OBJS) -+endif -+libuargp-so-y := $(libuargp_OBJS:.o=.os) -+ -+lib-a-$(UCLIBC_HAS_ARGP) += $(top_builddir)lib/libuargp.a -+lib-so-$(UCLIBC_HAS_ARGP) += $(top_builddir)lib/libuargp.so -+ -+objclean-y += CLEAN_libuargp -+ -+ifeq ($(DOMULTI),n) -+ifeq ($(DOPIC),y) -+$(top_builddir)lib/libuargp.so: $(top_builddir)lib/libuargp.a $(libc.depend) -+else -+$(top_builddir)lib/libuargp.so: $(libuargp_OUT)/libuargp_so.a $(libc.depend) -+endif -+ $(call link.so,$(libuargp_FULL_NAME),$(MAJOR_VERSION)) -+else -+$(top_builddir)lib/libuargp.so: $(libuargp_OUT)/libuargp.oS $(libc.depend) -+ $(call linkm.so,$(libuargp_FULL_NAME),$(MAJOR_VERSION)) -+endif -+ -+$(libuargp_OUT)/libuargp_so.a: $(libuargp-so-y) -+ $(Q)$(RM) $@ -+ $(do_ar) -+ -+$(libuargp_OUT)/libuargp.oS: $(libuargp_SRCS) -+ $(Q)$(RM) $@ -+ $(compile-m) -+ -+$(top_builddir)lib/libuargp.a: $(libuargp-a-y) -+ $(Q)$(INSTALL) -d $(dir $@) -+ $(Q)$(RM) $@ -+ $(do_ar) -+ -+CLEAN_libuargp: -+ $(do_rm) $(addprefix $(libuargp_OUT)/*., o os oS a) -diff --git a/libuargp/argp-ba.c b/libuargp/argp-ba.c -new file mode 100644 -index 0000000..3522b02 ---- /dev/null -+++ b/libuargp/argp-ba.c -@@ -0,0 +1,26 @@ -+/* Default definition for ARGP_PROGRAM_BUG_ADDRESS. -+ Copyright (C) 1996, 1997, 1999 Free Software Foundation, Inc. -+ This file is part of the GNU C Library. -+ Written by Miles Bader <miles at gnu.ai.mit.edu>. -+ -+ The GNU C 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.1 of the License, or (at your option) any later version. -+ -+ The GNU C 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 the GNU C Library; if not, write to the Free -+ Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA -+ 02111-1307 USA. */ -+ -+/* If set by the user program, it should point to string that is the -+ bug-reporting address for the program. It will be printed by argp_help if -+ the ARGP_HELP_BUG_ADDR flag is set (as it is by various standard help -+ messages), embedded in a sentence that says something like `Report bugs to -+ ADDR.'. */ -+const char *argp_program_bug_address; -diff --git a/libuargp/argp-eexst.c b/libuargp/argp-eexst.c -new file mode 100644 -index 0000000..445b68d ---- /dev/null -+++ b/libuargp/argp-eexst.c -@@ -0,0 +1,32 @@ -+/* Default definition for ARGP_ERR_EXIT_STATUS -+ Copyright (C) 1997 Free Software Foundation, Inc. -+ This file is part of the GNU C Library. -+ Written by Miles Bader <miles at gnu.ai.mit.edu>. -+ -+ The GNU C 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.1 of the License, or (at your option) any later version. -+ -+ The GNU C 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 the GNU C 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 <sysexits.h> -+ -+#include <argp.h> -+ -+/* The exit status that argp will use when exiting due to a parsing error. -+ If not defined or set by the user program, this defaults to EX_USAGE from -+ <sysexits.h>. */ -+error_t argp_err_exit_status = EX_USAGE; -diff --git a/libuargp/argp-fmtstream.c b/libuargp/argp-fmtstream.c -new file mode 100644 -index 0000000..75227f9 ---- /dev/null -+++ b/libuargp/argp-fmtstream.c -@@ -0,0 +1,439 @@ -+/* Word-wrapping and line-truncating streams -+ Copyright (C) 1997-1999,2001,2002,2003,2005 Free Software Foundation, Inc. -+ This file is part of the GNU C Library. -+ Written by Miles Bader <miles at gnu.ai.mit.edu>. -+ -+ The GNU C 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.1 of the License, or (at your option) any later version. -+ -+ The GNU C 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 the GNU C Library; if not, write to the Free -+ Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA -+ 02111-1307 USA. -+ -+ Modified for uClibc by: Salvatore Cro <salvatore.cro at st.com> -+*/ -+ -+/* This package emulates glibc `line_wrap_stream' semantics for systems that -+ don't have that. */ -+ -+#ifdef HAVE_CONFIG_H -+# include <config.h> -+#endif -+ -+#include <stdlib.h> -+#include <string.h> -+#include <errno.h> -+#include <stdarg.h> -+#include <ctype.h> -+ -+#include "argp-fmtstream.h" -+ -+#ifndef ARGP_FMTSTREAM_USE_LINEWRAP -+ -+#ifndef isblank -+#define isblank(ch) ((ch)==' ' || (ch)=='\t') -+#endif -+ -+#if defined _LIBC && defined USE_IN_LIBIO -+# include <wchar.h> -+# include <libio/libioP.h> -+# define __vsnprintf(s, l, f, a) _IO_vsnprintf (s, l, f, a) -+#else -+# define __vsnprintf(s, l, f, a) vsnprintf (s, l, f, a) -+#endif -+ -+#define INIT_BUF_SIZE 200 -+#define PRINTF_SIZE_GUESS 150 -+ -+/* Return an argp_fmtstream that outputs to STREAM, and which prefixes lines -+ written on it with LMARGIN spaces and limits them to RMARGIN columns -+ total. If WMARGIN >= 0, words that extend past RMARGIN are wrapped by -+ replacing the whitespace before them with a newline and WMARGIN spaces. -+ Otherwise, chars beyond RMARGIN are simply dropped until a newline. -+ Returns NULL if there was an error. */ -+argp_fmtstream_t -+__argp_make_fmtstream (FILE *stream, -+ size_t lmargin, size_t rmargin, ssize_t wmargin) -+{ -+ argp_fmtstream_t fs; -+ -+ fs = (struct argp_fmtstream *) malloc (sizeof (struct argp_fmtstream)); -+ if (fs != NULL) -+ { -+ fs->stream = stream; -+ -+ fs->lmargin = lmargin; -+ fs->rmargin = rmargin; -+ fs->wmargin = wmargin; -+ fs->point_col = 0; -+ fs->point_offs = 0; -+ -+ fs->buf = (char *) malloc (INIT_BUF_SIZE); -+ if (! fs->buf) -+ { -+ free (fs); -+ fs = 0; -+ } -+ else -+ { -+ fs->p = fs->buf; -+ fs->end = fs->buf + INIT_BUF_SIZE; -+ } -+ } -+ -+ return fs; -+} -+#if 0 -+/* Not exported. */ -+#ifdef weak_alias -+weak_alias (__argp_make_fmtstream, argp_make_fmtstream) -+#endif -+#endif -+ -+/* Flush FS to its stream, and free it (but don't close the stream). */ -+void -+__argp_fmtstream_free (argp_fmtstream_t fs) -+{ -+ __argp_fmtstream_update (fs); -+ if (fs->p > fs->buf) -+ { -+#ifdef USE_IN_LIBIO -+ __fxprintf (fs->stream, "%.*s", (int) (fs->p - fs->buf), fs->buf); -+#else -+ fwrite_unlocked (fs->buf, 1, fs->p - fs->buf, fs->stream); -+#endif -+ } -+ free (fs->buf); -+ free (fs); -+} -+#if 0 -+/* Not exported. */ -+#ifdef weak_alias -+weak_alias (__argp_fmtstream_free, argp_fmtstream_free) -+#endif -+#endif -+ -+/* Process FS's buffer so that line wrapping is done from POINT_OFFS to the -+ end of its buffer. This code is mostly from glibc stdio/linewrap.c. */ -+void -+__argp_fmtstream_update (argp_fmtstream_t fs) -+{ -+ char *buf, *nl; -+ size_t len; -+ -+ /* Scan the buffer for newlines. */ -+ buf = fs->buf + fs->point_offs; -+ while (buf < fs->p) -+ { -+ size_t r; -+ -+ if (fs->point_col == 0 && fs->lmargin != 0) -+ { -+ /* We are starting a new line. Print spaces to the left margin. */ -+ const size_t pad = fs->lmargin; -+ if (fs->p + pad < fs->end) -+ { -+ /* We can fit in them in the buffer by moving the -+ buffer text up and filling in the beginning. */ -+ memmove (buf + pad, buf, fs->p - buf); -+ fs->p += pad; /* Compensate for bigger buffer. */ -+ memset (buf, ' ', pad); /* Fill in the spaces. */ -+ buf += pad; /* Don't bother searching them. */ -+ } -+ else -+ { -+ /* No buffer space for spaces. Must flush. */ -+ size_t i; -+ for (i = 0; i < pad; i++) -+ { -+#ifdef USE_IN_LIBIO -+ if (_IO_fwide (fs->stream, 0) > 0) -+ putwc_unlocked (L' ', fs->stream); -+ else -+#endif -+ putc_unlocked (' ', fs->stream); -+ } -+ } -+ fs->point_col = pad; -+ } -+ -+ len = fs->p - buf; -+ nl = memchr (buf, '\n', len); -+ -+ if (fs->point_col < 0) -+ fs->point_col = 0; -+ -+ if (!nl) -+ { -+ /* The buffer ends in a partial line. */ -+ -+ if (fs->point_col + len < fs->rmargin) -+ { -+ /* The remaining buffer text is a partial line and fits -+ within the maximum line width. Advance point for the -+ characters to be written and stop scanning. */ -+ fs->point_col += len; -+ break; -+ } -+ else -+ /* Set the end-of-line pointer for the code below to -+ the end of the buffer. */ -+ nl = fs->p; -+ } -+ else if (fs->point_col + (nl - buf) < (ssize_t) fs->rmargin) -+ { -+ /* The buffer contains a full line that fits within the maximum -+ line width. Reset point and scan the next line. */ -+ fs->point_col = 0; -+ buf = nl + 1; -+ continue; -+ } -+ -+ /* This line is too long. */ -+ r = fs->rmargin - 1; -+ -+ if (fs->wmargin < 0) -+ { -+ /* Truncate the line by overwriting the excess with the -+ newline and anything after it in the buffer. */ -+ if (nl < fs->p) -+ { -+ memmove (buf + (r - fs->point_col), nl, fs->p - nl); -+ fs->p -= buf + (r - fs->point_col) - nl; -+ /* Reset point for the next line and start scanning it. */ -+ fs->point_col = 0; -+ buf += r + 1; /* Skip full line plus \n. */ -+ } -+ else -+ { -+ /* The buffer ends with a partial line that is beyond the -+ maximum line width. Advance point for the characters -+ written, and discard those past the max from the buffer. */ -+ fs->point_col += len; -+ fs->p -= fs->point_col - r; -+ break; -+ } -+ } -+ else -+ { -+ /* Do word wrap. Go to the column just past the maximum line -+ width and scan back for the beginning of the word there. -+ Then insert a line break. */ -+ -+ char *p, *nextline; -+ int i; -+ -+ p = buf + (r + 1 - fs->point_col); -+ while (p >= buf && !isblank (*p)) -+ --p; -+ nextline = p + 1; /* This will begin the next line. */ -+ -+ if (nextline > buf) -+ { -+ /* Swallow separating blanks. */ -+ if (p >= buf) -+ do -+ --p; -+ while (p >= buf && isblank (*p)); -+ nl = p + 1; /* The newline will replace the first blank. */ -+ } -+ else -+ { -+ /* A single word that is greater than the maximum line width. -+ Oh well. Put it on an overlong line by itself. */ -+ p = buf + (r + 1 - fs->point_col); -+ /* Find the end of the long word. */ -+ do -+ ++p; -+ while (p < nl && !isblank (*p)); -+ if (p == nl) -+ { -+ /* It already ends a line. No fussing required. */ -+ fs->point_col = 0; -+ buf = nl + 1; -+ continue; -+ } -+ /* We will move the newline to replace the first blank. */ -+ nl = p; -+ /* Swallow separating blanks. */ -+ do -+ ++p; -+ while (isblank (*p)); -+ /* The next line will start here. */ -+ nextline = p; -+ } -+ -+ /* Note: There are a bunch of tests below for -+ NEXTLINE == BUF + LEN + 1; this case is where NL happens to fall -+ at the end of the buffer, and NEXTLINE is in fact empty (and so -+ we need not be careful to maintain its contents). */ -+ -+ if ((nextline == buf + len + 1 -+ ? fs->end - nl < fs->wmargin + 1 -+ : nextline - (nl + 1) < fs->wmargin) -+ && fs->p > nextline) -+ { -+ /* The margin needs more blanks than we removed. */ -+ if (fs->end - fs->p > fs->wmargin + 1) -+ /* Make some space for them. */ -+ { -+ size_t mv = fs->p - nextline; -+ memmove (nl + 1 + fs->wmargin, nextline, mv); -+ nextline = nl + 1 + fs->wmargin; -+ len = nextline + mv - buf; -+ *nl++ = '\n'; -+ } -+ else -+ /* Output the first line so we can use the space. */ -+ { -+#if defined _LIBC && defined USE_IN_LIBIO -+ __fxprintf (fs->stream, "%.*s\n", -+ (int) (nl - fs->buf), fs->buf); -+#else -+ if (nl > fs->buf) -+ fwrite_unlocked (fs->buf, 1, nl - fs->buf, fs->stream); -+ putc_unlocked ('\n', fs->stream); -+#endif -+ -+ len += buf - fs->buf; -+ nl = buf = fs->buf; -+ } -+ } -+ else -+ /* We can fit the newline and blanks in before -+ the next word. */ -+ *nl++ = '\n'; -+ -+ if (nextline - nl >= fs->wmargin -+ || (nextline == buf + len + 1 && fs->end - nextline >= fs->wmargin)) -+ /* Add blanks up to the wrap margin column. */ -+ for (i = 0; i < fs->wmargin; ++i) -+ *nl++ = ' '; -+ else -+ for (i = 0; i < fs->wmargin; ++i) -+#ifdef USE_IN_LIBIO -+ if (_IO_fwide (fs->stream, 0) > 0) -+ putwc_unlocked (L' ', fs->stream); -+ else -+#endif -+ putc_unlocked (' ', fs->stream); -+ -+ /* Copy the tail of the original buffer into the current buffer -+ position. */ -+ if (nl < nextline) -+ memmove (nl, nextline, buf + len - nextline); -+ len -= nextline - buf; -+ -+ /* Continue the scan on the remaining lines in the buffer. */ -+ buf = nl; -+ -+ /* Restore bufp to include all the remaining text. */ -+ fs->p = nl + len; -+ -+ /* Reset the counter of what has been output this line. If wmargin -+ is 0, we want to avoid the lmargin getting added, so we set -+ point_col to a magic value of -1 in that case. */ -+ fs->point_col = fs->wmargin ? fs->wmargin : -1; -+ } -+ } -+ -+ /* Remember that we've scanned as far as the end of the buffer. */ -+ fs->point_offs = fs->p - fs->buf; -+} -+ -+/* Ensure that FS has space for AMOUNT more bytes in its buffer, either by -+ growing the buffer, or by flushing it. True is returned iff we succeed. */ -+int -+__argp_fmtstream_ensure (struct argp_fmtstream *fs, size_t amount) -+{ -+ if ((size_t) (fs->end - fs->p) < amount) -+ { -+ ssize_t wrote; -+ -+ /* Flush FS's buffer. */ -+ __argp_fmtstream_update (fs); -+ -+#if defined _LIBC && defined USE_IN_LIBIO -+ __fxprintf (fs->stream, "%.*s", (int) (fs->p - fs->buf), fs->buf); -+ wrote = fs->p - fs->buf; -+#else -+ wrote = fwrite_unlocked (fs->buf, 1, fs->p - fs->buf, fs->stream); -+#endif -+ if (wrote == fs->p - fs->buf) -+ { -+ fs->p = fs->buf; -+ fs->point_offs = 0; -+ } -+ else -+ { -+ fs->p -= wrote; -+ fs->point_offs -= wrote; -+ memmove (fs->buf, fs->buf + wrote, fs->p - fs->buf); -+ return 0; -+ } -+ -+ if ((size_t) (fs->end - fs->buf) < amount) -+ /* Gotta grow the buffer. */ -+ { -+ size_t old_size = fs->end - fs->buf; -+ size_t new_size = old_size + amount; -+ char *new_buf; -+ -+ if (new_size < old_size || ! (new_buf = realloc (fs->buf, new_size))) -+ { -+ __set_errno (ENOMEM); -+ return 0; -+ } -+ -+ fs->buf = new_buf; -+ fs->end = new_buf + new_size; -+ fs->p = fs->buf; -+ } -+ } -+ -+ return 1; -+} -+ -+ssize_t -+__argp_fmtstream_printf (struct argp_fmtstream *fs, const char *fmt, ...) -+{ -+ int out; -+ size_t avail; -+ size_t size_guess = PRINTF_SIZE_GUESS; /* How much space to reserve. */ -+ -+ do -+ { -+ va_list args; -+ -+ if (! __argp_fmtstream_ensure (fs, size_guess)) -+ return -1; -+ -+ va_start (args, fmt); -+ avail = fs->end - fs->p; -+ out = __vsnprintf (fs->p, avail, fmt, args); -+ va_end (args); -+ if ((size_t) out >= avail) -+ size_guess = out + 1; -+ } -+ while ((size_t) out >= avail); -+ -+ fs->p += out; -+ -+ return out; -+} -+#if 0 -+/* Not exported. */ -+#ifdef weak_alias -+weak_alias (__argp_fmtstream_printf, argp_fmtstream_printf) -+#endif -+#endif -+ -+#endif /* !ARGP_FMTSTREAM_USE_LINEWRAP */ -diff --git a/libuargp/argp-fmtstream.h b/libuargp/argp-fmtstream.h -new file mode 100644 -index 0000000..ca7c834 ---- /dev/null -+++ b/libuargp/argp-fmtstream.h -@@ -0,0 +1,314 @@ -+/* Word-wrapping and line-truncating streams. -+ Copyright (C) 1997 Free Software Foundation, Inc. -+ This file is part of the GNU C Library. -+ Written by Miles Bader <miles at gnu.ai.mit.edu>. -+ -+ The GNU C 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.1 of the License, or (at your option) any later version. -+ -+ The GNU C 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 the GNU C Library; if not, write to the Free -+ Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA -+ 02111-1307 USA. -+ -+ Modified for uClibc by: Salvatore Cro <salvatore.cro at st.com> -+*/ -+ -+/* This package emulates glibc `line_wrap_stream' semantics for systems that -+ don't have that. If the system does have it, it is just a wrapper for -+ that. This header file is only used internally while compiling argp, and -+ shouldn't be installed. */ -+ -+#ifndef _ARGP_FMTSTREAM_H -+#define _ARGP_FMTSTREAM_H -+ -+#include <stdio.h> -+#include <string.h> -+#include <unistd.h> -+ -+#ifndef __attribute__ -+/* This feature is available in gcc versions 2.5 and later. */ -+# if __GNUC__ < 2 || (__GNUC__ == 2 && __GNUC_MINOR__ < 5) || defined(__STRICT_ANSI__) -+# define __attribute__(Spec) /* empty */ -+# endif -+/* The __-protected variants of `format' and `printf' attributes -+ are accepted by gcc versions 2.6.4 (effectively 2.7) and later. */ -+# if __GNUC__ < 2 || (__GNUC__ == 2 && __GNUC_MINOR__ < 7) || defined(__STRICT_ANSI__) -+# define __format__ format -+# define __printf__ printf -+# endif -+#endif -+ -+#if 0 /* uClibc: disabled */ -+#if (_LIBC - 0 && !defined (USE_IN_LIBIO)) \ -+ || (defined (__GNU_LIBRARY__) && defined (HAVE_LINEWRAP_H)) -+/* line_wrap_stream is available, so use that. */ -+#define ARGP_FMTSTREAM_USE_LINEWRAP -+#endif -+#else -+/* line_wrap stream NOT available */ -+# undef ARGP_FMTSTREAM_USE_LINEWRAP -+#endif -+ -+#ifdef ARGP_FMTSTREAM_USE_LINEWRAP -+/* Just be a simple wrapper for line_wrap_stream; the semantics are -+ *slightly* different, as line_wrap_stream doesn't actually make a new -+ object, it just modifies the given stream (reversibly) to do -+ line-wrapping. Since we control who uses this code, it doesn't matter. */ -+ -+#include <linewrap.h> -+ -+typedef FILE *argp_fmtstream_t; -+ -+#define argp_make_fmtstream line_wrap_stream -+#define __argp_make_fmtstream line_wrap_stream -+#define argp_fmtstream_free line_unwrap_stream -+#define __argp_fmtstream_free line_unwrap_stream -+ -+#define __argp_fmtstream_putc(fs,ch) putc(ch,fs) -+#define argp_fmtstream_putc(fs,ch) putc(ch,fs) -+#define __argp_fmtstream_puts(fs,str) fputs(str,fs) -+#define argp_fmtstream_puts(fs,str) fputs(str,fs) -+#define __argp_fmtstream_write(fs,str,len) fwrite(str,1,len,fs) -+#define argp_fmtstream_write(fs,str,len) fwrite(str,1,len,fs) -+#define __argp_fmtstream_printf fprintf -+#define argp_fmtstream_printf fprintf -+ -+#define __argp_fmtstream_lmargin line_wrap_lmargin -+#define argp_fmtstream_lmargin line_wrap_lmargin -+#define __argp_fmtstream_set_lmargin line_wrap_set_lmargin -+#define argp_fmtstream_set_lmargin line_wrap_set_lmargin -+#define __argp_fmtstream_rmargin line_wrap_rmargin -+#define argp_fmtstream_rmargin line_wrap_rmargin -+#define __argp_fmtstream_set_rmargin line_wrap_set_rmargin -+#define argp_fmtstream_set_rmargin line_wrap_set_rmargin -+#define __argp_fmtstream_wmargin line_wrap_wmargin -+#define argp_fmtstream_wmargin line_wrap_wmargin -+#define __argp_fmtstream_set_wmargin line_wrap_set_wmargin -+#define argp_fmtstream_set_wmargin line_wrap_set_wmargin -+#define __argp_fmtstream_point line_wrap_point -+#define argp_fmtstream_point line_wrap_point -+ -+#else /* !ARGP_FMTSTREAM_USE_LINEWRAP */ -+/* Guess we have to define our own version. */ -+ -+#ifndef __const -+#define __const const -+#endif -+ -+struct argp_fmtstream -+{ -+ FILE *stream; /* The stream we're outputting to. */ -+ -+ size_t lmargin, rmargin; /* Left and right margins. */ -+ ssize_t wmargin; /* Margin to wrap to, or -1 to truncate. */ -+ -+ /* Point in buffer to which we've processed for wrapping, but not output. */ -+ size_t point_offs; -+ /* Output column at POINT_OFFS, or -1 meaning 0 but don't add lmargin. */ -+ ssize_t point_col; -+ -+ char *buf; /* Output buffer. */ -+ char *p; /* Current end of text in BUF. */ -+ char *end; /* Absolute end of BUF. */ -+}; -+ -+typedef struct argp_fmtstream *argp_fmtstream_t; -+ -+/* Return an argp_fmtstream that outputs to STREAM, and which prefixes lines -+ written on it with LMARGIN spaces and limits them to RMARGIN columns -+ total. If WMARGIN >= 0, words that extend past RMARGIN are wrapped by -+ replacing the whitespace before them with a newline and WMARGIN spaces. -+ Otherwise, chars beyond RMARGIN are simply dropped until a newline. -+ Returns NULL if there was an error. */ -+extern argp_fmtstream_t __argp_make_fmtstream (FILE *__stream, -+ size_t __lmargin, -+ size_t __rmargin, -+ ssize_t __wmargin); -+extern argp_fmtstream_t argp_make_fmtstream (FILE *__stream, -+ size_t __lmargin, -+ size_t __rmargin, -+ ssize_t __wmargin); -+ -+/* Flush __FS to its stream, and free it (but don't close the stream). */ -+extern void __argp_fmtstream_free (argp_fmtstream_t __fs); -+extern void argp_fmtstream_free (argp_fmtstream_t __fs); -+ -+extern ssize_t __argp_fmtstream_printf (argp_fmtstream_t __fs, -+ __const char *__fmt, ...) -+ __attribute__ ((__format__ (printf, 2, 3))); -+extern ssize_t argp_fmtstream_printf (argp_fmtstream_t __fs, -+ __const char *__fmt, ...) -+ __attribute__ ((__format__ (printf, 2, 3))); -+ -+extern int __argp_fmtstream_putc (argp_fmtstream_t __fs, int __ch); -+extern int argp_fmtstream_putc (argp_fmtstream_t __fs, int __ch); -+ -+extern int __argp_fmtstream_puts (argp_fmtstream_t __fs, __const char *__str); -+extern int argp_fmtstream_puts (argp_fmtstream_t __fs, __const char *__str); -+ -+extern size_t __argp_fmtstream_write (argp_fmtstream_t __fs, -+ __const char *__str, size_t __len); -+extern size_t argp_fmtstream_write (argp_fmtstream_t __fs, -+ __const char *__str, size_t __len); -+ -+/* Access macros for various bits of state. */ -+#define argp_fmtstream_lmargin(__fs) ((__fs)->lmargin) -+#define argp_fmtstream_rmargin(__fs) ((__fs)->rmargin) -+#define argp_fmtstream_wmargin(__fs) ((__fs)->wmargin) -+#define __argp_fmtstream_lmargin argp_fmtstream_lmargin -+#define __argp_fmtstream_rmargin argp_fmtstream_rmargin -+#define __argp_fmtstream_wmargin argp_fmtstream_wmargin -+ -+/* Set __FS's left margin to LMARGIN and return the old value. */ -+extern size_t argp_fmtstream_set_lmargin (argp_fmtstream_t __fs, -+ size_t __lmargin); -+extern size_t __argp_fmtstream_set_lmargin (argp_fmtstream_t __fs, -+ size_t __lmargin); -+ -+/* Set __FS's right margin to __RMARGIN and return the old value. */ -+extern size_t argp_fmtstream_set_rmargin (argp_fmtstream_t __fs, -+ size_t __rmargin); -+extern size_t __argp_fmtstream_set_rmargin (argp_fmtstream_t __fs, -+ size_t __rmargin); -+ -+/* Set __FS's wrap margin to __WMARGIN and return the old value. */ -+extern size_t argp_fmtstream_set_wmargin (argp_fmtstream_t __fs, -+ size_t __wmargin); -+extern size_t __argp_fmtstream_set_wmargin (argp_fmtstream_t __fs, -+ size_t __wmargin); -+ -+/* Return the column number of the current output point in __FS. */ -+extern size_t argp_fmtstream_point (argp_fmtstream_t __fs); -+extern size_t __argp_fmtstream_point (argp_fmtstream_t __fs); -+ -+/* Internal routines. */ -+extern void _argp_fmtstream_update (argp_fmtstream_t __fs); -+extern void __argp_fmtstream_update (argp_fmtstream_t __fs); -+extern int _argp_fmtstream_ensure (argp_fmtstream_t __fs, size_t __amount); -+extern int __argp_fmtstream_ensure (argp_fmtstream_t __fs, size_t __amount); -+ -+#ifdef __OPTIMIZE__ -+/* Inline versions of above routines. */ -+ -+#if !_LIBC -+#define __argp_fmtstream_putc argp_fmtstream_putc -+#define __argp_fmtstream_puts argp_fmtstream_puts -+#define __argp_fmtstream_write argp_fmtstream_write -+#define __argp_fmtstream_set_lmargin argp_fmtstream_set_lmargin -+#define __argp_fmtstream_set_rmargin argp_fmtstream_set_rmargin -+#define __argp_fmtstream_set_wmargin argp_fmtstream_set_wmargin -+#define __argp_fmtstream_point argp_fmtstream_point -+#define __argp_fmtstream_update _argp_fmtstream_update -+#define __argp_fmtstream_ensure _argp_fmtstream_ensure -+#endif -+ -+#ifndef ARGP_FS_EI -+#define ARGP_FS_EI __extern_inline -+#endif -+ -+ARGP_FS_EI size_t -+__argp_fmtstream_write (argp_fmtstream_t __fs, -+ __const char *__str, size_t __len) -+{ -+ if (__fs->p + __len <= __fs->end || __argp_fmtstream_ensure (__fs, __len)) -+ { -+ memcpy (__fs->p, __str, __len); -+ __fs->p += __len; -+ return __len; -+ } -+ else -+ return 0; -+} -+ -+ARGP_FS_EI int -+__argp_fmtstream_puts (argp_fmtstream_t __fs, __const char *__str) -+{ -+ size_t __len = strlen (__str); -+ if (__len) -+ { -+ size_t __wrote = __argp_fmtstream_write (__fs, __str, __len); -+ return __wrote == __len ? 0 : -1; -+ } -+ else -+ return 0; -+} -+ -+ARGP_FS_EI int -+__argp_fmtstream_putc (argp_fmtstream_t __fs, int __ch) -+{ -+ if (__fs->p < __fs->end || __argp_fmtstream_ensure (__fs, 1)) -+ return *__fs->p++ = __ch; -+ else -+ return EOF; -+} -+ -+/* Set __FS's left margin to __LMARGIN and return the old value. */ -+ARGP_FS_EI size_t -+__argp_fmtstream_set_lmargin (argp_fmtstream_t __fs, size_t __lmargin) -+{ -+ size_t __old; -+ if ((size_t) (__fs->p - __fs->buf) > __fs->point_offs) -+ __argp_fmtstream_update (__fs); -+ __old = __fs->lmargin; -+ __fs->lmargin = __lmargin; -+ return __old; -+} -+ -+/* Set __FS's right margin to __RMARGIN and return the old value. */ -+ARGP_FS_EI size_t -+__argp_fmtstream_set_rmargin (argp_fmtstream_t __fs, size_t __rmargin) -+{ -+ size_t __old; -+ if ((size_t) (__fs->p - __fs->buf) > __fs->point_offs) -+ __argp_fmtstream_update (__fs); -+ __old = __fs->rmargin; -+ __fs->rmargin = __rmargin; -+ return __old; -+} -+ -+/* Set FS's wrap margin to __WMARGIN and return the old value. */ -+ARGP_FS_EI size_t -+__argp_fmtstream_set_wmargin (argp_fmtstream_t __fs, size_t __wmargin) -+{ -+ size_t __old; -+ if ((size_t) (__fs->p - __fs->buf) > __fs->point_offs) -+ __argp_fmtstream_update (__fs); -+ __old = __fs->wmargin; -+ __fs->wmargin = __wmargin; -+ return __old; -+} -+ -+/* Return the column number of the current output point in __FS. */ -+ARGP_FS_EI size_t -+__argp_fmtstream_point (argp_fmtstream_t __fs) -+{ -+ if ((size_t) (__fs->p - __fs->buf) > __fs->point_offs) -+ __argp_fmtstream_update (__fs); -+ return __fs->point_col >= 0 ? __fs->point_col : 0; -+} -+ -+#if !_LIBC -+#undef __argp_fmtstream_putc -+#undef __argp_fmtstream_puts -+#undef __argp_fmtstream_write -+#undef __argp_fmtstream_set_lmargin -+#undef __argp_fmtstream_set_rmargin -+#undef __argp_fmtstream_set_wmargin -+#undef __argp_fmtstream_point -+#undef __argp_fmtstream_update -+#undef __argp_fmtstream_ensure -+#endif -+ -+#endif /* __OPTIMIZE__ */ -+ -+#endif /* ARGP_FMTSTREAM_USE_LINEWRAP */ -+ -+#endif /* argp-fmtstream.h */ -diff --git a/libuargp/argp-fs-xinl.c b/libuargp/argp-fs-xinl.c -new file mode 100644 -index 0000000..473cbbd ---- /dev/null -+++ b/libuargp/argp-fs-xinl.c -@@ -0,0 +1,44 @@ -+/* Real definitions for extern inline functions in argp-fmtstream.h -+ Copyright (C) 1997, 2003, 2004 Free Software Foundation, Inc. -+ This file is part of the GNU C Library. -+ Written by Miles Bader <miles at gnu.ai.mit.edu>. -+ -+ The GNU C 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.1 of the License, or (at your option) any later version. -+ -+ The GNU C 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 the GNU C 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 -+ -+#define ARGP_FS_EI -+#undef __OPTIMIZE__ -+#define __OPTIMIZE__ 1 -+#include "argp-fmtstream.h" -+ -+#if 0 -+/* Not exported. */ -+/* Add weak aliases. */ -+#if _LIBC - 0 && !defined (ARGP_FMTSTREAM_USE_LINEWRAP) && defined (weak_alias) -+ -+weak_alias (__argp_fmtstream_putc, argp_fmtstream_putc) -+weak_alias (__argp_fmtstream_puts, argp_fmtstream_puts) -+weak_alias (__argp_fmtstream_write, argp_fmtstream_write) -+weak_alias (__argp_fmtstream_set_lmargin, argp_fmtstream_set_lmargin) -+weak_alias (__argp_fmtstream_set_rmargin, argp_fmtstream_set_rmargin) -+weak_alias (__argp_fmtstream_set_wmargin, argp_fmtstream_set_wmargin) -+weak_alias (__argp_fmtstream_point, argp_fmtstream_point) -+ -+#endif -+#endif -diff --git a/libuargp/argp-help.c b/libuargp/argp-help.c -new file mode 100644 -index 0000000..58a5e6e ---- /dev/null -+++ b/libuargp/argp-help.c -@@ -0,0 +1,1882 @@ -+/* Hierarchial argument parsing help output -+ Copyright (C) 1995-2003, 2004, 2005, 2006, 2007 -+ Free Software Foundation, Inc. -+ This file is part of the GNU C Library. -+ Written by Miles Bader <miles at gnu.ai.mit.edu>. -+ -+ The GNU C 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.1 of the License, or (at your option) any later version. -+ -+ The GNU C 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 the GNU C Library; if not, write to the Free -+ Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA -+ 02111-1307 USA. -+ -+ Modified for uClibc by: Salvatore Cro <salvatore.cro at st.com> -+*/ -+ -+#ifndef _GNU_SOURCE -+# define _GNU_SOURCE 1 -+#endif -+ -+#ifdef HAVE_CONFIG_H -+#include <config.h> -+#endif -+ -+/* AIX requires this to be the first thing in the file. */ -+#ifndef __GNUC__ -+# if HAVE_ALLOCA_H || defined _LIBC -+# include <alloca.h> -+# else -+# ifdef _AIX -+#pragma alloca -+# else -+# ifndef alloca /* predefined by HP cc +Olibcalls */ -+char *alloca (); -+# endif -+# endif -+# endif -+#endif -+ -+#include <stddef.h> -+#include <stdlib.h> -+#include <string.h> -+#include <assert.h> -+#include <stdarg.h> -+#include <ctype.h> -+#include <limits.h> -+#ifdef _LIBC -+# include <wchar.h> -+#endif -+ -+#include <features.h> -+#ifndef _ -+/* This is for other GNU distributions with internationalized messages. */ -+# if (defined HAVE_LIBINTL_H || defined _LIBC) && defined __UCLIBC_HAS_GETTEXT_AWARENESS__ -+# include <libintl.h> -+# ifdef _LIBC -+# undef dgettext -+# define dgettext(domain, msgid) \ -+ INTUSE(__dcgettext) (domain, msgid, LC_MESSAGES) -+# endif -+# else -+# define dgettext(domain, msgid) (msgid) -+# endif -+#endif -+ -+#ifndef _LIBC -+# if HAVE_STRERROR_R -+# if !HAVE_DECL_STRERROR_R -+char *strerror_r (int errnum, char *buf, size_t buflen); -+# endif -+# else -+# if !HAVE_DECL_STRERROR -+char *strerror (int errnum); -+# endif -+# endif -+#endif -+ -+#include <argp.h> -+#include "argp-fmtstream.h" -+#include <stdbool.h> -+#include <stdint.h> -+ -+#ifndef SIZE_MAX -+# define SIZE_MAX ((size_t) -1) -+#endif -+ -+/* User-selectable (using an environment variable) formatting parameters. -+ -+ These may be specified in an environment variable called `ARGP_HELP_FMT', -+ with a contents like: VAR1=VAL1,VAR2=VAL2,BOOLVAR2,no-BOOLVAR2 -+ Where VALn must be a positive integer. The list of variables is in the -+ UPARAM_NAMES vector, below. */ -+ -+/* Default parameters. */ -+#define DUP_ARGS 0 /* True if option argument can be duplicated. */ -+#define DUP_ARGS_NOTE 1 /* True to print a note about duplicate args. */ -+#define SHORT_OPT_COL 2 /* column in which short options start */ -+#define LONG_OPT_COL 6 /* column in which long options start */ -+#define DOC_OPT_COL 2 /* column in which doc options start */ -+#define OPT_DOC_COL 29 /* column in which option text starts */ -+#define HEADER_COL 1 /* column in which group headers are printed */ -+#define USAGE_INDENT 12 /* indentation of wrapped usage lines */ -+#define RMARGIN 79 /* right margin used for wrapping */ -+ -+/* User-selectable (using an environment variable) formatting parameters. -+ They must all be of type `int' for the parsing code to work. */ -+struct uparams -+{ -+ /* If true, arguments for an option are shown with both short and long -+ options, even when a given option has both, e.g. `-x ARG, --longx=ARG'. -+ If false, then if an option has both, the argument is only shown with -+ the long one, e.g., `-x, --longx=ARG', and a message indicating that -+ this really means both is printed below the options. */ -+ int dup_args; -+ -+ /* This is true if when DUP_ARGS is false, and some duplicate arguments have -+ been suppressed, an explanatory message should be printed. */ -+ int dup_args_note; -+ -+ /* Various output columns. */ -+ int short_opt_col; -+ int long_opt_col; -+ int doc_opt_col; -+ int opt_doc_col; -+ int header_col; -+ int usage_indent; -+ int rmargin; -+}; -+ -+/* This is a global variable, as user options are only ever read once. */ -+static struct uparams uparams = { -+ DUP_ARGS, DUP_ARGS_NOTE, -+ SHORT_OPT_COL, LONG_OPT_COL, DOC_OPT_COL, OPT_DOC_COL, HEADER_COL, -+ USAGE_INDENT, RMARGIN -+}; -+ -+/* A particular uparam, and what the user name is. */ -+struct uparam_name -+{ -+ const char name[14]; /* User name. */ -+ bool is_bool; /* Whether it's `boolean'. */ -+ uint8_t uparams_offs; /* Location of the (int) field in UPARAMS. */ -+}; -+ -+/* The name-field mappings we know about. */ -+static const struct uparam_name uparam_names[] = -+{ -+ { "dup-args", true, offsetof (struct uparams, dup_args) }, -+ { "dup-args-note", true, offsetof (struct uparams, dup_args_note) }, -+ { "short-opt-col", false, offsetof (struct uparams, short_opt_col) }, -+ { "long-opt-col", false, offsetof (struct uparams, long_opt_col) }, -+ { "doc-opt-col", false, offsetof (struct uparams, doc_opt_col) }, -+ { "opt-doc-col", false, offsetof (struct uparams, opt_doc_col) }, -+ { "header-col", false, offsetof (struct uparams, header_col) }, -+ { "usage-indent", false, offsetof (struct uparams, usage_indent) }, -+ { "rmargin", false, offsetof (struct uparams, rmargin) } -+}; -+#define nuparam_names (sizeof (uparam_names) / sizeof (uparam_names[0])) -+ -+/* Read user options from the environment, and fill in UPARAMS appropiately. */ -+static void -+fill_in_uparams (const struct argp_state *state) -+{ -+ const char *var = getenv ("ARGP_HELP_FMT"); -+ -+#define SKIPWS(p) do { while (isspace (*p)) p++; } while (0); -+ -+ if (var) -+ /* Parse var. */ -+ while (*var) -+ { -+ SKIPWS (var); -+ -+ if (isalpha (*var)) -+ { -+ size_t var_len; -+ const struct uparam_name *un; -+ int unspec = 0, val = 0; -+ const char *arg = var; -+ -+ while (isalnum (*arg) || *arg == '-' || *arg == '_') -+ arg++; -+ var_len = arg - var; -+ -+ SKIPWS (arg); -+ -+ if (*arg == '\0' || *arg == ',') -+ unspec = 1; -+ else if (*arg == '=') -+ { -+ arg++; -+ SKIPWS (arg); -+ } -+ -+ if (unspec) -+ { -+ if (var[0] == 'n' && var[1] == 'o' && var[2] == '-') -+ { -+ val = 0; -+ var += 3; -+ var_len -= 3; -+ } -+ else -+ val = 1; -+ } -+ else if (isdigit (*arg)) -+ { -+ val = atoi (arg); -+ while (isdigit (*arg)) -+ arg++; -+ SKIPWS (arg); -+ } -+ -+ un = uparam_names; -+ size_t u; -+ for (u = 0; u < nuparam_names; ++un, ++u) -+ if (strlen (un->name) == var_len -+ && strncmp (var, un->name, var_len) == 0) -+ { -+ if (unspec && !un->is_bool) -+ argp_failure (state, 0, 0, -+ dgettext (state == NULL ? NULL -+ : state->root_argp->argp_domain, -+ "\ -+%.*s: ARGP_HELP_FMT parameter requires a value"), -+ (int) var_len, var); -+ else -+ *(int *)((char *)&uparams + un->uparams_offs) = val; -+ break; -+ } -+ if (u == nuparam_names) -+ argp_failure (state, 0, 0, -+ dgettext (state == NULL ? NULL -+ : state->root_argp->argp_domain, "\ -+%.*s: Unknown ARGP_HELP_FMT parameter"), -+ (int) var_len, var); -+ -+ var = arg; -+ if (*var == ',') -+ var++; -+ } -+ else if (*var) -+ { -+ argp_failure (state, 0, 0, -+ dgettext (state == NULL ? NULL -+ : state->root_argp->argp_domain, -+ "Garbage in ARGP_HELP_FMT: %s"), var); -+ break; -+ } -+ } -+} -+ -+/* Returns true if OPT hasn't been marked invisible. Visibility only affects -+ whether OPT is displayed or used in sorting, not option shadowing. */ -+#define ovisible(opt) (! ((opt)->flags & OPTION_HIDDEN)) -+ -+/* Returns true if OPT is an alias for an earlier option. */ -+#define oalias(opt) ((opt)->flags & OPTION_ALIAS) -+ -+/* Returns true if OPT is an documentation-only entry. */ -+#define odoc(opt) ((opt)->flags & OPTION_DOC) -+ -+/* Returns true if OPT is the end-of-list marker for a list of options. */ -+#define oend(opt) __option_is_end (opt) -+ -+/* Returns true if OPT has a short option. */ -+#define oshort(opt) __option_is_short (opt) -+ -+/* -+ The help format for a particular option is like: -+ -+ -xARG, -yARG, --long1=ARG, --long2=ARG Documentation... -+ -+ Where ARG will be omitted if there's no argument, for this option, or -+ will be surrounded by "[" and "]" appropiately if the argument is -+ optional. The documentation string is word-wrapped appropiately, and if -+ the list of options is long enough, it will be started on a separate line. -+ If there are no short options for a given option, the first long option is -+ indented slighly in a way that's supposed to make most long options appear -+ to be in a separate column. -+ -+ For example, the following output (from ps): -+ -+ -p PID, --pid=PID List the process PID -+ --pgrp=PGRP List processes in the process group PGRP -+ -P, -x, --no-parent Include processes without parents -+ -Q, --all-fields Don't elide unusable fields (normally if there's -+ some reason ps can't print a field for any -+ process, it's removed from the output entirely) -+ -r, --reverse, --gratuitously-long-reverse-option -+ Reverse the order of any sort -+ --session[=SID] Add the processes from the session SID (which -+ defaults to the sid of the current process) -+ -+ Here are some more options: -+ -f ZOT, --foonly=ZOT Glork a foonly -+ -z, --zaza Snit a zar -+ -+ -?, --help Give this help list -+ --usage Give a short usage message -+ -V, --version Print program version -+ -+ The struct argp_option array for the above could look like: -+ -+ { -+ {"pid", 'p', "PID", 0, "List the process PID"}, -+ {"pgrp", OPT_PGRP, "PGRP", 0, "List processes in the process group PGRP"}, -+ {"no-parent", 'P', 0, 0, "Include processes without parents"}, -+ {0, 'x', 0, OPTION_ALIAS}, -+ {"all-fields",'Q', 0, 0, "Don't elide unusable fields (normally" -+ " if there's some reason ps can't" -+ " print a field for any process, it's" -+ " removed from the output entirely)" }, -+ {"reverse", 'r', 0, 0, "Reverse the order of any sort"}, -+ {"gratuitously-long-reverse-option", 0, 0, OPTION_ALIAS}, -+ {"session", OPT_SESS, "SID", OPTION_ARG_OPTIONAL, -+ "Add the processes from the session" -+ " SID (which defaults to the sid of" -+ " the current process)" }, -+ -+ {0,0,0,0, "Here are some more options:"}, -+ {"foonly", 'f', "ZOT", 0, "Glork a foonly"}, -+ {"zaza", 'z', 0, 0, "Snit a zar"}, -+ -+ {0} -+ } -+ -+ Note that the last three options are automatically supplied by argp_parse, -+ unless you tell it not to with ARGP_NO_HELP. -+ -+*/ -+ -+/* Returns true if CH occurs between BEG and END. */ -+static int -+find_char (char ch, char *beg, char *end) -+{ -+ while (beg < end) -+ if (*beg == ch) -+ return 1; -+ else -+ beg++; -+ return 0; -+} -+ -+struct hol_cluster; /* fwd decl */ -+ -+struct hol_entry -+{ -+ /* First option. */ -+ const struct argp_option *opt; -+ /* Number of options (including aliases). */ -+ unsigned num; -+ -+ /* A pointers into the HOL's short_options field, to the first short option -+ letter for this entry. The order of the characters following this point -+ corresponds to the order of options pointed to by OPT, and there are at -+ most NUM. A short option recorded in a option following OPT is only -+ valid if it occurs in the right place in SHORT_OPTIONS (otherwise it's -+ probably been shadowed by some other entry). */ -+ char *short_options; -+ -+ /* Entries are sorted by their group first, in the order: -+ 1, 2, ..., n, 0, -m, ..., -2, -1 -+ and then alphabetically within each group. The default is 0. */ -+ int group; -+ -+ /* The cluster of options this entry belongs to, or 0 if none. */ -+ struct hol_cluster *cluster; -+ -+ /* The argp from which this option came. */ -+ const struct argp *argp; -+}; -+ -+/* A cluster of entries to reflect the argp tree structure. */ -+struct hol_cluster -+{ -+ /* A descriptive header printed before options in this cluster. */ -+ const char *header; -+ -+ /* Used to order clusters within the same group with the same parent, -+ according to the order in which they occurred in the parent argp's child -+ list. */ -+ int index; -+ -+ /* How to sort this cluster with respect to options and other clusters at the -+ same depth (clusters always follow options in the same group). */ -+ int group; -+ -+ /* The cluster to which this cluster belongs, or 0 if it's at the base -+ level. */ -+ struct hol_cluster *parent; -+ -+ /* The argp from which this cluster is (eventually) derived. */ -+ const struct argp *argp; -+ -+ /* The distance this cluster is from the root. */ -+ int depth; -+ -+ /* Clusters in a given hol are kept in a linked list, to make freeing them -+ possible. */ -+ struct hol_cluster *next; -+}; -+ -+/* A list of options for help. */ -+struct hol -+{ -+ /* An array of hol_entry's. */ -+ struct hol_entry *entries; -+ /* The number of entries in this hol. If this field is zero, the others -+ are undefined. */ -+ unsigned num_entries; -+ -+ /* A string containing all short options in this HOL. Each entry contains -+ pointers into this string, so the order can't be messed with blindly. */ -+ char *short_options; -+ -+ /* Clusters of entries in this hol. */ -+ struct hol_cluster *clusters; -+}; -+ -+/* Create a struct hol from the options in ARGP. CLUSTER is the -+ hol_cluster in which these entries occur, or 0, if at the root. */ -+static struct hol * -+make_hol (const struct argp *argp, struct hol_cluster *cluster) -+{ -+ char *so; -+ const struct argp_option *o; -+ const struct argp_option *opts = argp->options; -+ struct hol_entry *entry; -+ unsigned num_short_options = 0; -+ struct hol *hol = malloc (sizeof (struct hol)); -+ -+ assert (hol); -+ -+ hol->num_entries = 0; -+ hol->clusters = 0; -+ -+ if (opts) -+ { -+ int cur_group = 0; -+ -+ /* The first option must not be an alias. */ -+ assert (! oalias (opts)); -+ -+ /* Calculate the space needed. */ -+ for (o = opts; ! oend (o); o++) -+ { -+ if (! oalias (o)) -+ hol->num_entries++; -+ if (oshort (o)) -+ num_short_options++; /* This is an upper bound. */ -+ } -+ -+ hol->entries = malloc (sizeof (struct hol_entry) * hol->num_entries); -+ hol->short_options = malloc (num_short_options + 1); -+ -+ assert (hol->entries && hol->short_options); -+#if SIZE_MAX <= UINT_MAX -+ assert (hol->num_entries <= SIZE_MAX / sizeof (struct hol_entry)); -+#endif -+ -+ /* Fill in the entries. */ -+ so = hol->short_options; -+ for (o = opts, entry = hol->entries; ! oend (o); entry++) -+ { -+ entry->opt = o; -+ entry->num = 0; -+ entry->short_options = so; -+ entry->group = cur_group = -+ o->group -+ ? o->group -+ : ((!o->name && !o->key) -+ ? cur_group + 1 -+ : cur_group); -+ entry->cluster = cluster; -+ entry->argp = argp; -+ -+ do -+ { -+ entry->num++; -+ if (oshort (o) && ! find_char (o->key, hol->short_options, so)) -+ /* O has a valid short option which hasn't already been used.*/ -+ *so++ = o->key; -+ o++; -+ } -+ while (! oend (o) && oalias (o)); -+ } -+ *so = '\0'; /* null terminated so we can find the length */ -+ } -+ -+ return hol; -+} -+ -+/* Add a new cluster to HOL, with the given GROUP and HEADER (taken from the -+ associated argp child list entry), INDEX, and PARENT, and return a pointer -+ to it. ARGP is the argp that this cluster results from. */ -+static struct hol_cluster * -+hol_add_cluster (struct hol *hol, int group, const char *header, int index, -+ struct hol_cluster *parent, const struct argp *argp) -+{ -+ struct hol_cluster *cl = malloc (sizeof (struct hol_cluster)); -+ if (cl) -+ { -+ cl->group = group; -+ cl->header = header; -+ -+ cl->index = index; -+ cl->parent = parent; -+ cl->argp = argp; -+ cl->depth = parent ? parent->depth + 1 : 0; -+ -+ cl->next = hol->clusters; -+ hol->clusters = cl; -+ } -+ return cl; -+} -+ -+/* Free HOL and any resources it uses. */ -+static void -+hol_free (struct hol *hol) -+{ -+ struct hol_cluster *cl = hol->clusters; -+ -+ while (cl) -+ { -+ struct hol_cluster *next = cl->next; -+ free (cl); -+ cl = next; -+ } -+ -+ if (hol->num_entries > 0) -+ { -+ free (hol->entries); -+ free (hol->short_options); -+ } -+ -+ free (hol); -+} -+ -+static int -+hol_entry_short_iterate (const struct hol_entry *entry, -+ int (*func)(const struct argp_option *opt, -+ const struct argp_option *real, -+ const char *domain, void *cookie), -+ const char *domain, void *cookie) -+{ -+ unsigned nopts; -+ int val = 0; -+ const struct argp_option *opt, *real = entry->opt; -+ char *so = entry->short_options; -+ -+ for (opt = real, nopts = entry->num; nopts > 0 && !val; opt++, nopts--) -+ if (oshort (opt) && *so == opt->key) -+ { -+ if (!oalias (opt)) -+ real = opt; -+ if (ovisible (opt)) -+ val = (*func)(opt, real, domain, cookie); -+ so++; -+ } -+ -+ return val; -+} -+ -+static __inline__ int -+__attribute__ ((always_inline)) -+hol_entry_long_iterate (const struct hol_entry *entry, -+ int (*func)(const struct argp_option *opt, -+ const struct argp_option *real, -+ const char *domain, void *cookie), -+ const char *domain, void *cookie) -+{ -+ unsigned nopts; -+ int val = 0; -+ const struct argp_option *opt, *real = entry->opt; -+ -+ for (opt = real, nopts = entry->num; nopts > 0 && !val; opt++, nopts--) -+ if (opt->name) -+ { -+ if (!oalias (opt)) -+ real = opt; -+ if (ovisible (opt)) -+ val = (*func)(opt, real, domain, cookie); -+ } -+ -+ return val; -+} -+ -+/* Iterator that returns true for the first short option. */ -+static __inline__ int -+until_short (const struct argp_option *opt, const struct argp_option *real, -+ const char *domain, void *cookie) -+{ -+ return oshort (opt) ? opt->key : 0; -+} -+ -+/* Returns the first valid short option in ENTRY, or 0 if there is none. */ -+static char -+hol_entry_first_short (const struct hol_entry *entry) -+{ -+ return hol_entry_short_iterate (entry, until_short, -+ entry->argp->argp_domain, 0); -+} -+ -+/* Returns the first valid long option in ENTRY, or 0 if there is none. */ -+static const char * -+hol_entry_first_long (const struct hol_entry *entry) -+{ -+ const struct argp_option *opt; -+ unsigned num; -+ for (opt = entry->opt, num = entry->num; num > 0; opt++, num--) -+ if (opt->name && ovisible (opt)) -+ return opt->name; -+ return 0; -+} -+ -+/* Returns the entry in HOL with the long option name NAME, or 0 if there is -+ none. */ -+static struct hol_entry * -+hol_find_entry (struct hol *hol, const char *name) -+{ -+ struct hol_entry *entry = hol->entries; -+ unsigned num_entries = hol->num_entries; -+ -+ while (num_entries-- > 0) -+ { -+ const struct argp_option *opt = entry->opt; -+ unsigned num_opts = entry->num; -+ -+ while (num_opts-- > 0) -+ if (opt->name && ovisible (opt) && strcmp (opt->name, name) == 0) -+ return entry; -+ else -+ opt++; -+ -+ entry++; -+ } -+ -+ return 0; -+} -+ -+/* If an entry with the long option NAME occurs in HOL, set it's special -+ sort position to GROUP. */ -+static void -+hol_set_group (struct hol *hol, const char *name, int group) -+{ -+ struct hol_entry *entry = hol_find_entry (hol, name); -+ if (entry) -+ entry->group = group; -+} -+ -+/* Order by group: 0, 1, 2, ..., n, -m, ..., -2, -1. -+ EQ is what to return if GROUP1 and GROUP2 are the same. */ -+static int -+group_cmp (int group1, int group2, int eq) -+{ -+ if (group1 == group2) -+ return eq; -+ else if ((group1 < 0 && group2 < 0) || (group1 >= 0 && group2 >= 0)) -+ return group1 - group2; -+ else -+ return group2 - group1; -+} -+ -+/* Compare clusters CL1 & CL2 by the order that they should appear in -+ output. */ -+static int -+hol_cluster_cmp (const struct hol_cluster *cl1, const struct hol_cluster *cl2) -+{ -+ /* If one cluster is deeper than the other, use its ancestor at the same -+ level, so that finding the common ancestor is straightforward. */ -+ while (cl1->depth > cl2->depth) -+ cl1 = cl1->parent; -+ while (cl2->depth > cl1->depth) -+ cl2 = cl2->parent; -+ -+ /* Now reduce both clusters to their ancestors at the point where both have -+ a common parent; these can be directly compared. */ -+ while (cl1->parent != cl2->parent) -+ cl1 = cl1->parent, cl2 = cl2->parent; -+ -+ return group_cmp (cl1->group, cl2->group, cl2->index - cl1->index); -+} -+ -+/* Return the ancestor of CL that's just below the root (i.e., has a parent -+ of 0). */ -+static struct hol_cluster * -+hol_cluster_base (struct hol_cluster *cl) -+{ -+ while (cl->parent) -+ cl = cl->parent; -+ return cl; -+} -+ -+/* Return true if CL1 is a child of CL2. */ -+static int -+hol_cluster_is_child (const struct hol_cluster *cl1, -+ const struct hol_cluster *cl2) -+{ -+ while (cl1 && cl1 != cl2) -+ cl1 = cl1->parent; -+ return cl1 == cl2; -+} -+ -+/* Given the name of a OPTION_DOC option, modifies NAME to start at the tail -+ that should be used for comparisons, and returns true iff it should be -+ treated as a non-option. */ -+static int -+canon_doc_option (const char **name) -+{ -+ int non_opt; -+ /* Skip initial whitespace. */ -+ while (isspace (**name)) -+ (*name)++; -+ /* Decide whether this looks like an option (leading `-') or not. */ -+ non_opt = (**name != '-'); -+ /* Skip until part of name used for sorting. */ -+ while (**name && !isalnum (**name)) -+ (*name)++; -+ return non_opt; -+} -+ -+/* Order ENTRY1 & ENTRY2 by the order which they should appear in a help -+ listing. */ -+static int -+hol_entry_cmp (const struct hol_entry *entry1, -+ const struct hol_entry *entry2) -+{ -+ /* The group numbers by which the entries should be ordered; if either is -+ in a cluster, then this is just the group within the cluster. */ -+ int group1 = entry1->group, group2 = entry2->group; -+ -+ if (entry1->cluster != entry2->cluster) -+ { -+ /* The entries are not within the same cluster, so we can't compare them -+ directly, we have to use the appropiate clustering level too. */ -+ if (! entry1->cluster) -+ /* ENTRY1 is at the `base level', not in a cluster, so we have to -+ compare it's group number with that of the base cluster in which -+ ENTRY2 resides. Note that if they're in the same group, the -+ clustered option always comes laster. */ -+ return group_cmp (group1, hol_cluster_base (entry2->cluster)->group, -1); -+ else if (! entry2->cluster) -+ /* Likewise, but ENTRY2's not in a cluster. */ -+ return group_cmp (hol_cluster_base (entry1->cluster)->group, group2, 1); -+ else -+ /* Both entries are in clusters, we can just compare the clusters. */ -+ return hol_cluster_cmp (entry1->cluster, entry2->cluster); -+ } -+ else if (group1 == group2) -+ /* The entries are both in the same cluster and group, so compare them -+ alphabetically. */ -+ { -+ int short1 = hol_entry_first_short (entry1); -+ int short2 = hol_entry_first_short (entry2); -+ int doc1 = odoc (entry1->opt); -+ int doc2 = odoc (entry2->opt); -+ const char *long1 = hol_entry_first_long (entry1); -+ const char *long2 = hol_entry_first_long (entry2); -+ -+ if (doc1) -+ doc1 = long1 != NULL && canon_doc_option (&long1); -+ if (doc2) -+ doc2 = long2 != NULL && canon_doc_option (&long2); -+ -+ if (doc1 != doc2) -+ /* `documentation' options always follow normal options (or -+ documentation options that *look* like normal options). */ -+ return doc1 - doc2; -+ else if (!short1 && !short2 && long1 && long2) -+ /* Only long options. */ -+ return strcasecmp (long1, long2); -+ else -+ /* Compare short/short, long/short, short/long, using the first -+ character of long options. Entries without *any* valid -+ options (such as options with OPTION_HIDDEN set) will be put -+ first, but as they're not displayed, it doesn't matter where -+ they are. */ -+ { -+ char first1 = short1 ? short1 : long1 ? *long1 : 0; -+ char first2 = short2 ? short2 : long2 ? *long2 : 0; -+#ifdef _tolower -+ int lower_cmp = _tolower (first1) - _tolower (first2); -+#else -+ int lower_cmp = tolower (first1) - tolower (first2); -+#endif -+ /* Compare ignoring case, except when the options are both the -+ same letter, in which case lower-case always comes first. */ -+ return lower_cmp ? lower_cmp : first2 - first1; -+ } -+ } -+ else -+ /* Within the same cluster, but not the same group, so just compare -+ groups. */ -+ return group_cmp (group1, group2, 0); -+} -+ -+/* Version of hol_entry_cmp with correct signature for qsort. */ -+static int -+hol_entry_qcmp (const void *entry1_v, const void *entry2_v) -+{ -+ return hol_entry_cmp (entry1_v, entry2_v); -+} -+ -+/* Sort HOL by group and alphabetically by option name (with short options -+ taking precedence over long). Since the sorting is for display purposes -+ only, the shadowing of options isn't effected. */ -+static void -+hol_sort (struct hol *hol) -+{ -+ if (hol->num_entries > 0) -+ qsort (hol->entries, hol->num_entries, sizeof (struct hol_entry), -+ hol_entry_qcmp); -+} -+ -+/* Append MORE to HOL, destroying MORE in the process. Options in HOL shadow -+ any in MORE with the same name. */ -+static void -+hol_append (struct hol *hol, struct hol *more) -+{ -+ struct hol_cluster **cl_end = &hol->clusters; -+ -+ /* Steal MORE's cluster list, and add it to the end of HOL's. */ -+ while (*cl_end) -+ cl_end = &(*cl_end)->next; -+ *cl_end = more->clusters; -+ more->clusters = 0; -+ -+ /* Merge entries. */ -+ if (more->num_entries > 0) -+ { -+ if (hol->num_entries == 0) -+ { -+ hol->num_entries = more->num_entries; -+ hol->entries = more->entries; -+ hol->short_options = more->short_options; -+ more->num_entries = 0; /* Mark MORE's fields as invalid. */ -+ } -+ else -+ /* Append the entries in MORE to those in HOL, taking care to only add -+ non-shadowed SHORT_OPTIONS values. */ -+ { -+ unsigned left; -+ char *so, *more_so; -+ struct hol_entry *e; -+ unsigned num_entries = hol->num_entries + more->num_entries; -+ struct hol_entry *entries = -+ malloc (num_entries * sizeof (struct hol_entry)); -+ unsigned hol_so_len = strlen (hol->short_options); -+ char *short_options = -+ malloc (hol_so_len + strlen (more->short_options) + 1); -+ -+ assert (entries && short_options); -+#if SIZE_MAX <= UINT_MAX -+ assert (num_entries <= SIZE_MAX / sizeof (struct hol_entry)); -+#endif -+ -+ mempcpy (mempcpy (entries, hol->entries, -+ hol->num_entries * sizeof (struct hol_entry)), -+ more->entries, -+ more->num_entries * sizeof (struct hol_entry)); -+ -+ mempcpy (short_options, hol->short_options, hol_so_len); -+ -+ /* Fix up the short options pointers from HOL. */ -+ for (e = entries, left = hol->num_entries; left > 0; e++, left--) -+ e->short_options += (short_options - hol->short_options); -+ -+ /* Now add the short options from MORE, fixing up its entries -+ too. */ -+ so = short_options + hol_so_len; -+ more_so = more->short_options; -+ for (left = more->num_entries; left > 0; e++, left--) -+ { -+ int opts_left; -+ const struct argp_option *opt; -+ -+ e->short_options = so; -+ -+ for (opts_left = e->num, opt = e->opt; opts_left; opt++, opts_left--) -+ { -+ int ch = *more_so; -+ if (oshort (opt) && ch == opt->key) -+ /* The next short option in MORE_SO, CH, is from OPT. */ -+ { -+ if (! find_char (ch, short_options, -+ short_options + hol_so_len)) -+ /* The short option CH isn't shadowed by HOL's options, -+ so add it to the sum. */ -+ *so++ = ch; -+ more_so++; -+ } -+ } -+ } -+ -+ *so = '\0'; -+ -+ free (hol->entries); -+ free (hol->short_options); -+ -+ hol->entries = entries; -+ hol->num_entries = num_entries; -+ hol->short_options = short_options; -+ } -+ } -+ -+ hol_free (more); -+} -+ -+/* Inserts enough spaces to make sure STREAM is at column COL. */ -+static void -+indent_to (argp_fmtstream_t stream, unsigned col) -+{ -+ int needed = col - __argp_fmtstream_point (stream); -+ while (needed-- > 0) -+ __argp_fmtstream_putc (stream, ' '); -+} -+ -+/* Output to STREAM either a space, or a newline if there isn't room for at -+ least ENSURE characters before the right margin. */ -+static void -+space (argp_fmtstream_t stream, size_t ensure) -+{ -+ if (__argp_fmtstream_point (stream) + ensure -+ >= __argp_fmtstream_rmargin (stream)) -+ __argp_fmtstream_putc (stream, '\n'); -+ else -+ __argp_fmtstream_putc (stream, ' '); -+} -+ -+/* If the option REAL has an argument, we print it in using the printf -+ format REQ_FMT or OPT_FMT depending on whether it's a required or -+ optional argument. */ -+static void -+arg (const struct argp_option *real, const char *req_fmt, const char *opt_fmt, -+ const char *domain, argp_fmtstream_t stream) -+{ -+ if (real->arg) -+ { -+ if (real->flags & OPTION_ARG_OPTIONAL) -+ __argp_fmtstream_printf (stream, opt_fmt, -+ dgettext (domain, real->arg)); -+ else -+ __argp_fmtstream_printf (stream, req_fmt, -+ dgettext (domain, real->arg)); -+ } -+} -+ -+/* Helper functions for hol_entry_help. */ -+ -+/* State used during the execution of hol_help. */ -+struct hol_help_state -+{ -+ /* PREV_ENTRY should contain the previous entry printed, or 0. */ -+ struct hol_entry *prev_entry; -+ -+ /* If an entry is in a different group from the previous one, and SEP_GROUPS -+ is true, then a blank line will be printed before any output. */ -+ int sep_groups; -+ -+ /* True if a duplicate option argument was suppressed (only ever set if -+ UPARAMS.dup_args is false). */ -+ int suppressed_dup_arg; -+}; -+ -+/* Some state used while printing a help entry (used to communicate with -+ helper functions). See the doc for hol_entry_help for more info, as most -+ of the fields are copied from its arguments. */ -+struct pentry_state -+{ -+ const struct hol_entry *entry; -+ argp_fmtstream_t stream; -+ struct hol_help_state *hhstate; -+ -+ /* True if nothing's been printed so far. */ -+ int first; -+ -+ /* If non-zero, the state that was used to print this help. */ -+ const struct argp_state *state; -+}; -+ -+/* If a user doc filter should be applied to DOC, do so. */ -+static const char * -+filter_doc (const char *doc, int key, const struct argp *argp, -+ const struct argp_state *state) -+{ -+ if (argp && argp->help_filter) -+ /* We must apply a user filter to this output. */ -+ { -+ void *input = __argp_input (argp, state); -+ return (*argp->help_filter) (key, doc, input); -+ } -+ else -+ /* No filter. */ -+ return doc; -+} -+ -+/* Prints STR as a header line, with the margin lines set appropiately, and -+ notes the fact that groups should be separated with a blank line. ARGP is -+ the argp that should dictate any user doc filtering to take place. Note -+ that the previous wrap margin isn't restored, but the left margin is reset -+ to 0. */ -+static void -+print_header (const char *str, const struct argp *argp, -+ struct pentry_state *pest) -+{ -+ const char *tstr = dgettext (argp->argp_domain, str); -+ const char *fstr = filter_doc (tstr, ARGP_KEY_HELP_HEADER, argp, pest->state); -+ -+ if (fstr) -+ { -+ if (*fstr) -+ { -+ if (pest->hhstate->prev_entry) -+ /* Precede with a blank line. */ -+ __argp_fmtstream_putc (pest->stream, '\n'); -+ indent_to (pest->stream, uparams.header_col); -+ __argp_fmtstream_set_lmargin (pest->stream, uparams.header_col); -+ __argp_fmtstream_set_wmargin (pest->stream, uparams.header_col); -+ __argp_fmtstream_puts (pest->stream, fstr); -+ __argp_fmtstream_set_lmargin (pest->stream, 0); -+ __argp_fmtstream_putc (pest->stream, '\n'); -+ } -+ -+ pest->hhstate->sep_groups = 1; /* Separate subsequent groups. */ -+ } -+ -+ if (fstr != tstr) -+ free ((char *) fstr); -+} -+ -+/* Inserts a comma if this isn't the first item on the line, and then makes -+ sure we're at least to column COL. If this *is* the first item on a line, -+ prints any pending whitespace/headers that should precede this line. Also -+ clears FIRST. */ -+static void -+comma (unsigned col, struct pentry_state *pest) -+{ -+ if (pest->first) -+ { -+ const struct hol_entry *pe = pest->hhstate->prev_entry; -+ const struct hol_cluster *cl = pest->entry->cluster; -+ -+ if (pest->hhstate->sep_groups && pe && pest->entry->group != pe->group) -+ __argp_fmtstream_putc (pest->stream, '\n'); -+ -+ if (cl && cl->header && *cl->header -+ && (!pe -+ || (pe->cluster != cl -+ && !hol_cluster_is_child (pe->cluster, cl)))) -+ /* If we're changing clusters, then this must be the start of the -+ ENTRY's cluster unless that is an ancestor of the previous one -+ (in which case we had just popped into a sub-cluster for a bit). -+ If so, then print the cluster's header line. */ -+ { -+ int old_wm = __argp_fmtstream_wmargin (pest->stream); -+ print_header (cl->header, cl->argp, pest); -+ __argp_fmtstream_set_wmargin (pest->stream, old_wm); -+ } -+ -+ pest->first = 0; -+ } -+ else -+ __argp_fmtstream_puts (pest->stream, ", "); -+ -+ indent_to (pest->stream, col); -+} -+ -+/* Print help for ENTRY to STREAM. */ -+static void -+hol_entry_help (struct hol_entry *entry, const struct argp_state *state, -+ argp_fmtstream_t stream, struct hol_help_state *hhstate) -+{ -+ unsigned num; -+ const struct argp_option *real = entry->opt, *opt; -+ char *so = entry->short_options; -+ int have_long_opt = 0; /* We have any long options. */ -+ /* Saved margins. */ -+ int old_lm = __argp_fmtstream_set_lmargin (stream, 0); -+ int old_wm = __argp_fmtstream_wmargin (stream); -+ /* PEST is a state block holding some of our variables that we'd like to -+ share with helper functions. */ -+ struct pentry_state pest = { entry, stream, hhstate, 1, state }; -+ -+ if (! odoc (real)) -+ for (opt = real, num = entry->num; num > 0; opt++, num--) -+ if (opt->name && ovisible (opt)) -+ { -+ have_long_opt = 1; -+ break; -+ } -+ -+ /* First emit short options. */ -+ __argp_fmtstream_set_wmargin (stream, uparams.short_opt_col); /* For truly bizarre cases. */ -+ for (opt = real, num = entry->num; num > 0; opt++, num--) -+ if (oshort (opt) && opt->key == *so) -+ /* OPT has a valid (non shadowed) short option. */ -+ { -+ if (ovisible (opt)) -+ { -+ comma (uparams.short_opt_col, &pest); -+ __argp_fmtstream_putc (stream, '-'); -+ __argp_fmtstream_putc (stream, *so); -+ if (!have_long_opt || uparams.dup_args) -+ arg (real, " %s", "[%s]", -+ state == NULL ? NULL : state->root_argp->argp_domain, -+ stream); -+ else if (real->arg) -+ hhstate->suppressed_dup_arg = 1; -+ } -+ so++; -+ } -+ -+ /* Now, long options. */ -+ if (odoc (real)) -+ /* A `documentation' option. */ -+ { -+ __argp_fmtstream_set_wmargin (stream, uparams.doc_opt_col); -+ for (opt = real, num = entry->num; num > 0; opt++, num--) -+ if (opt->name && ovisible (opt)) -+ { -+ comma (uparams.doc_opt_col, &pest); -+ /* Calling gettext here isn't quite right, since sorting will -+ have been done on the original; but documentation options -+ should be pretty rare anyway... */ -+ __argp_fmtstream_puts (stream, -+ dgettext (state == NULL ? NULL -+ : state->root_argp->argp_domain, -+ opt->name)); -+ } -+ } -+ else -+ /* A real long option. */ -+ { -+ __argp_fmtstream_set_wmargin (stream, uparams.long_opt_col); -+ for (opt = real, num = entry->num; num > 0; opt++, num--) -+ if (opt->name && ovisible (opt)) -+ { -+ comma (uparams.long_opt_col, &pest); -+ __argp_fmtstream_printf (stream, "--%s", opt->name); -+ arg (real, "=%s", "[=%s]", -+ state == NULL ? NULL : state->root_argp->argp_domain, stream); -+ } -+ } -+ -+ /* Next, documentation strings. */ -+ __argp_fmtstream_set_lmargin (stream, 0); -+ -+ if (pest.first) -+ { -+ /* Didn't print any switches, what's up? */ -+ if (!oshort (real) && !real->name) -+ /* This is a group header, print it nicely. */ -+ print_header (real->doc, entry->argp, &pest); -+ else -+ /* Just a totally shadowed option or null header; print nothing. */ -+ goto cleanup; /* Just return, after cleaning up. */ -+ } -+ else -+ { -+ const char *tstr = real->doc ? dgettext (state == NULL ? NULL -+ : state->root_argp->argp_domain, -+ real->doc) : 0; -+ const char *fstr = filter_doc (tstr, real->key, entry->argp, state); -+ if (fstr && *fstr) -+ { -+ unsigned int col = __argp_fmtstream_point (stream); -+ -+ __argp_fmtstream_set_lmargin (stream, uparams.opt_doc_col); -+ __argp_fmtstream_set_wmargin (stream, uparams.opt_doc_col); -+ -+ if (col > (unsigned int) (uparams.opt_doc_col + 3)) -+ __argp_fmtstream_putc (stream, '\n'); -+ else if (col >= (unsigned int) uparams.opt_doc_col) -+ __argp_fmtstream_puts (stream, " "); -+ else -+ indent_to (stream, uparams.opt_doc_col); -+ -+ __argp_fmtstream_puts (stream, fstr); -+ } -+ if (fstr && fstr != tstr) -+ free ((char *) fstr); -+ -+ /* Reset the left margin. */ -+ __argp_fmtstream_set_lmargin (stream, 0); -+ __argp_fmtstream_putc (stream, '\n'); -+ } -+ -+ hhstate->prev_entry = entry; -+ -+cleanup: -+ __argp_fmtstream_set_lmargin (stream, old_lm); -+ __argp_fmtstream_set_wmargin (stream, old_wm); -+} -+ -+/* Output a long help message about the options in HOL to STREAM. */ -+static void -+hol_help (struct hol *hol, const struct argp_state *state, -+ argp_fmtstream_t stream) -+{ -+ unsigned num; -+ struct hol_entry *entry; -+ struct hol_help_state hhstate = { 0, 0, 0 }; -+ -+ for (entry = hol->entries, num = hol->num_entries; num > 0; entry++, num--) -+ hol_entry_help (entry, state, stream, &hhstate); -+ -+ if (hhstate.suppressed_dup_arg && uparams.dup_args_note) -+ { -+ const char *tstr = dgettext (state == NULL ? NULL -+ : state->root_argp->argp_domain, "\ -+Mandatory or optional arguments to long options are also mandatory or \ -+optional for any corresponding short options."); -+ const char *fstr = filter_doc (tstr, ARGP_KEY_HELP_DUP_ARGS_NOTE, -+ state ? state->root_argp : 0, state); -+ if (fstr && *fstr) -+ { -+ __argp_fmtstream_putc (stream, '\n'); -+ __argp_fmtstream_puts (stream, fstr); -+ __argp_fmtstream_putc (stream, '\n'); -+ } -+ if (fstr && fstr != tstr) -+ free ((char *) fstr); -+ } -+} -+ -+/* Helper functions for hol_usage. */ -+ -+/* If OPT is a short option without an arg, append its key to the string -+ pointer pointer to by COOKIE, and advance the pointer. */ -+static int -+add_argless_short_opt (const struct argp_option *opt, -+ const struct argp_option *real, -+ const char *domain, void *cookie) -+{ -+ char **snao_end = cookie; -+ if (!(opt->arg || real->arg) -+ && !((opt->flags | real->flags) & OPTION_NO_USAGE)) -+ *(*snao_end)++ = opt->key; -+ return 0; -+} -+ -+/* If OPT is a short option with an arg, output a usage entry for it to the -+ stream pointed at by COOKIE. */ -+static int -+usage_argful_short_opt (const struct argp_option *opt, -+ const struct argp_option *real, -+ const char *domain, void *cookie) -+{ -+ argp_fmtstream_t stream = cookie; -+ const char *arg = opt->arg; -+ int flags = opt->flags | real->flags; -+ -+ if (! arg) -+ arg = real->arg; -+ -+ if (arg && !(flags & OPTION_NO_USAGE)) -+ { -+ arg = dgettext (domain, arg); -+ -+ if (flags & OPTION_ARG_OPTIONAL) -+ __argp_fmtstream_printf (stream, " [-%c[%s]]", opt->key, arg); -+ else -+ { -+ /* Manually do line wrapping so that it (probably) won't -+ get wrapped at the embedded space. */ -+ space (stream, 6 + strlen (arg)); -+ __argp_fmtstream_printf (stream, "[-%c %s]", opt->key, arg); -+ } -+ } -+ -+ return 0; -+} -+ -+/* Output a usage entry for the long option opt to the stream pointed at by -+ COOKIE. */ -+static int -+usage_long_opt (const struct argp_option *opt, -+ const struct argp_option *real, -+ const char *domain, void *cookie) -+{ -+ argp_fmtstream_t stream = cookie; -+ const char *arg = opt->arg; -+ int flags = opt->flags | real->flags; -+ -+ if (! arg) -+ arg = real->arg; -+ -+ if (! (flags & OPTION_NO_USAGE)) -+ { -+ if (arg) -+ { -+ arg = dgettext (domain, arg); -+ if (flags & OPTION_ARG_OPTIONAL) -+ __argp_fmtstream_printf (stream, " [--%s[=%s]]", opt->name, arg); -+ else -+ __argp_fmtstream_printf (stream, " [--%s=%s]", opt->name, arg); -+ } -+ else -+ __argp_fmtstream_printf (stream, " [--%s]", opt->name); -+ } -+ -+ return 0; -+} -+ -+/* Print a short usage description for the arguments in HOL to STREAM. */ -+static void -+hol_usage (struct hol *hol, argp_fmtstream_t stream) -+{ -+ if (hol->num_entries > 0) -+ { -+ unsigned nentries; -+ struct hol_entry *entry; -+ char *short_no_arg_opts = alloca (strlen (hol->short_options) + 1); -+ char *snao_end = short_no_arg_opts; -+ -+ /* First we put a list of short options without arguments. */ -+ for (entry = hol->entries, nentries = hol->num_entries -+ ; nentries > 0 -+ ; entry++, nentries--) -+ hol_entry_short_iterate (entry, add_argless_short_opt, -+ entry->argp->argp_domain, &snao_end); -+ if (snao_end > short_no_arg_opts) -+ { -+ *snao_end++ = 0; -+ __argp_fmtstream_printf (stream, " [-%s]", short_no_arg_opts); -+ } -+ -+ /* Now a list of short options *with* arguments. */ -+ for (entry = hol->entries, nentries = hol->num_entries -+ ; nentries > 0 -+ ; entry++, nentries--) -+ hol_entry_short_iterate (entry, usage_argful_short_opt, -+ entry->argp->argp_domain, stream); -+ -+ /* Finally, a list of long options (whew!). */ -+ for (entry = hol->entries, nentries = hol->num_entries -+ ; nentries > 0 -+ ; entry++, nentries--) -+ hol_entry_long_iterate (entry, usage_long_opt, -+ entry->argp->argp_domain, stream); -+ } -+} -+ -+/* Make a HOL containing all levels of options in ARGP. CLUSTER is the -+ cluster in which ARGP's entries should be clustered, or 0. */ -+static struct hol * -+argp_hol (const struct argp *argp, struct hol_cluster *cluster) -+{ -+ const struct argp_child *child = argp->children; -+ struct hol *hol = make_hol (argp, cluster); -+ if (child) -+ while (child->argp) -+ { -+ struct hol_cluster *child_cluster = -+ ((child->group || child->header) -+ /* Put CHILD->argp within its own cluster. */ -+ ? hol_add_cluster (hol, child->group, child->header, -+ child - argp->children, cluster, argp) -+ /* Just merge it into the parent's cluster. */ -+ : cluster); -+ hol_append (hol, argp_hol (child->argp, child_cluster)) ; -+ child++; -+ } -+ return hol; -+} -+ -+/* Calculate how many different levels with alternative args strings exist in -+ ARGP. */ -+static size_t -+argp_args_levels (const struct argp *argp) -+{ -+ size_t levels = 0; -+ const struct argp_child *child = argp->children; -+ -+ if (argp->args_doc && strchr (argp->args_doc, '\n')) -+ levels++; -+ -+ if (child) -+ while (child->argp) -+ levels += argp_args_levels ((child++)->argp); -+ -+ return levels; -+} -+ -+/* Print all the non-option args documented in ARGP to STREAM. Any output is -+ preceded by a space. LEVELS is a pointer to a byte vector the length -+ returned by argp_args_levels; it should be initialized to zero, and -+ updated by this routine for the next call if ADVANCE is true. True is -+ returned as long as there are more patterns to output. */ -+static int -+argp_args_usage (const struct argp *argp, const struct argp_state *state, -+ char **levels, int advance, argp_fmtstream_t stream) -+{ -+ char *our_level = *levels; -+ int multiple = 0; -+ const struct argp_child *child = argp->children; -+ const char *tdoc = dgettext (argp->argp_domain, argp->args_doc), *nl = 0; -+ const char *fdoc = filter_doc (tdoc, ARGP_KEY_HELP_ARGS_DOC, argp, state); -+ -+ if (fdoc) -+ { -+ const char *cp = fdoc; -+ nl = strchrnul (cp, '\n'); -+ if (*nl != '\0') -+ /* This is a `multi-level' args doc; advance to the correct position -+ as determined by our state in LEVELS, and update LEVELS. */ -+ { -+ int i; -+ multiple = 1; -+ for (i = 0; i < *our_level; i++) -+ cp = nl + 1, nl = strchrnul (cp, '\n'); -+ (*levels)++; -+ } -+ -+ /* Manually do line wrapping so that it (probably) won't get wrapped at -+ any embedded spaces. */ -+ space (stream, 1 + nl - cp); -+ -+ __argp_fmtstream_write (stream, cp, nl - cp); -+ } -+ if (fdoc && fdoc != tdoc) -+ free ((char *)fdoc); /* Free user's modified doc string. */ -+ -+ if (child) -+ while (child->argp) -+ advance = !argp_args_usage ((child++)->argp, state, levels, advance, stream); -+ -+ if (advance && multiple) -+ { -+ /* Need to increment our level. */ -+ if (*nl) -+ /* There's more we can do here. */ -+ { -+ (*our_level)++; -+ advance = 0; /* Our parent shouldn't advance also. */ -+ } -+ else if (*our_level > 0) -+ /* We had multiple levels, but used them up; reset to zero. */ -+ *our_level = 0; -+ } -+ -+ return !advance; -+} -+ -+/* Print the documentation for ARGP to STREAM; if POST is false, then -+ everything preceeding a `\v' character in the documentation strings (or -+ the whole string, for those with none) is printed, otherwise, everything -+ following the `\v' character (nothing for strings without). Each separate -+ bit of documentation is separated a blank line, and if PRE_BLANK is true, -+ then the first is as well. If FIRST_ONLY is true, only the first -+ occurrence is output. Returns true if anything was output. */ -+static int -+argp_doc (const struct argp *argp, const struct argp_state *state, -+ int post, int pre_blank, int first_only, -+ argp_fmtstream_t stream) -+{ -+ const char *text; -+ const char *inp_text; -+ void *input = 0; -+ int anything = 0; -+ size_t inp_text_limit = 0; -+ const char *doc = dgettext (argp->argp_domain, argp->doc); -+ const struct argp_child *child = argp->children; -+ -+ if (doc) -+ { -+ char *vt = strchr (doc, '\v'); -+ inp_text = post ? (vt ? vt + 1 : 0) : doc; -+ inp_text_limit = (!post && vt) ? (vt - doc) : 0; -+ } -+ else -+ inp_text = 0; -+ -+ if (argp->help_filter) -+ /* We have to filter the doc strings. */ -+ { -+ if (inp_text_limit) -+ /* Copy INP_TEXT so that it's nul-terminated. */ -+ inp_text = strndup (inp_text, inp_text_limit); -+ input = __argp_input (argp, state); -+ text = -+ (*argp->help_filter) (post -+ ? ARGP_KEY_HELP_POST_DOC -+ : ARGP_KEY_HELP_PRE_DOC, -+ inp_text, input); -+ } -+ else -+ text = (const char *) inp_text; -+ -+ if (text) -+ { -+ if (pre_blank) -+ __argp_fmtstream_putc (stream, '\n'); -+ -+ if (text == inp_text && inp_text_limit) -+ __argp_fmtstream_write (stream, inp_text, inp_text_limit); -+ else -+ __argp_fmtstream_puts (stream, text); -+ -+ if (__argp_fmtstream_point (stream) > __argp_fmtstream_lmargin (stream)) -+ __argp_fmtstream_putc (stream, '\n'); -+ -+ anything = 1; -+ } -+ -+ if (text && text != inp_text) -+ free ((char *) text); /* Free TEXT returned from the help filter. */ -+ if (inp_text && inp_text_limit && argp->help_filter) -+ free ((char *) inp_text); /* We copied INP_TEXT, so free it now. */ -+ -+ if (post && argp->help_filter) -+ /* Now see if we have to output a ARGP_KEY_HELP_EXTRA text. */ -+ { -+ text = (*argp->help_filter) (ARGP_KEY_HELP_EXTRA, 0, input); -+ if (text) -+ { -+ if (anything || pre_blank) -+ __argp_fmtstream_putc (stream, '\n'); -+ __argp_fmtstream_puts (stream, text); -+ free ((char *) text); -+ if (__argp_fmtstream_point (stream) -+ > __argp_fmtstream_lmargin (stream)) -+ __argp_fmtstream_putc (stream, '\n'); -+ anything = 1; -+ } -+ } -+ -+ if (child) -+ while (child->argp && !(first_only && anything)) -+ anything |= -+ argp_doc ((child++)->argp, state, -+ post, anything || pre_blank, first_only, -+ stream); -+ -+ return anything; -+} -+ -+/* Output a usage message for ARGP to STREAM. If called from -+ argp_state_help, STATE is the relevent parsing state. FLAGS are from the -+ set ARGP_HELP_*. NAME is what to use wherever a `program name' is -+ needed. */ -+static void -+_help (const struct argp *argp, const struct argp_state *state, FILE *stream, -+ unsigned flags, char *name) -+{ -+ int anything = 0; /* Whether we've output anything. */ -+ struct hol *hol = 0; -+ argp_fmtstream_t fs; -+ -+ if (! stream) -+ return; -+ -+#if _LIBC || (HAVE_FLOCKFILE && HAVE_FUNLOCKFILE) -+ flockfile (stream); -+#endif -+ -+ fill_in_uparams (state); -+ -+ fs = __argp_make_fmtstream (stream, 0, uparams.rmargin, 0); -+ if (! fs) -+ { -+#if _LIBC || (HAVE_FLOCKFILE && HAVE_FUNLOCKFILE) -+ funlockfile (stream); -+#endif -+ return; -+ } -+ -+ if (flags & (ARGP_HELP_USAGE | ARGP_HELP_SHORT_USAGE | ARGP_HELP_LONG)) -+ { -+ hol = argp_hol (argp, 0); -+ -+ /* If present, these options always come last. */ -+ hol_set_group (hol, "help", -1); -+ hol_set_group (hol, "version", -1); -+ -+ hol_sort (hol); -+ } -+ -+ if (flags & (ARGP_HELP_USAGE | ARGP_HELP_SHORT_USAGE)) -+ /* Print a short `Usage:' message. */ -+ { -+ int first_pattern = 1, more_patterns; -+ size_t num_pattern_levels = argp_args_levels (argp); -+ char *pattern_levels = alloca (num_pattern_levels); -+ -+ memset (pattern_levels, 0, num_pattern_levels); -+ -+ do -+ { -+ int old_lm; -+ int old_wm = __argp_fmtstream_set_wmargin (fs, uparams.usage_indent); -+ char *levels = pattern_levels; -+ -+ if (first_pattern) -+ __argp_fmtstream_printf (fs, "%s %s", -+ dgettext (argp->argp_domain, "Usage:"), -+ name); -+ else -+ __argp_fmtstream_printf (fs, "%s %s", -+ dgettext (argp->argp_domain, " or: "), -+ name); -+ -+ /* We set the lmargin as well as the wmargin, because hol_usage -+ manually wraps options with newline to avoid annoying breaks. */ -+ old_lm = __argp_fmtstream_set_lmargin (fs, uparams.usage_indent); -+ -+ if (flags & ARGP_HELP_SHORT_USAGE) -+ /* Just show where the options go. */ -+ { -+ if (hol->num_entries > 0) -+ __argp_fmtstream_puts (fs, dgettext (argp->argp_domain, -+ " [OPTION...]")); -+ } -+ else -+ /* Actually print the options. */ -+ { -+ hol_usage (hol, fs); -+ flags |= ARGP_HELP_SHORT_USAGE; /* But only do so once. */ -+ } -+ -+ more_patterns = argp_args_usage (argp, state, &levels, 1, fs); -+ -+ __argp_fmtstream_set_wmargin (fs, old_wm); -+ __argp_fmtstream_set_lmargin (fs, old_lm); -+ -+ __argp_fmtstream_putc (fs, '\n'); -+ anything = 1; -+ -+ first_pattern = 0; -+ } -+ while (more_patterns); -+ } -+ -+ if (flags & ARGP_HELP_PRE_DOC) -+ anything |= argp_doc (argp, state, 0, 0, 1, fs); -+ -+ if (flags & ARGP_HELP_SEE) -+ { -+ __argp_fmtstream_printf (fs, dgettext (argp->argp_domain, "\ -+Try `%s --help' or `%s --usage' for more information.\n"), -+ name, name); -+ anything = 1; -+ } -+ -+ if (flags & ARGP_HELP_LONG) -+ /* Print a long, detailed help message. */ -+ { -+ /* Print info about all the options. */ -+ if (hol->num_entries > 0) -+ { -+ if (anything) -+ __argp_fmtstream_putc (fs, '\n'); -+ hol_help (hol, state, fs); -+ anything = 1; -+ } -+ } -+ -+ if (flags & ARGP_HELP_POST_DOC) -+ /* Print any documentation strings at the end. */ -+ anything |= argp_doc (argp, state, 1, anything, 0, fs); -+ -+ if ((flags & ARGP_HELP_BUG_ADDR) && argp_program_bug_address) -+ { -+ if (anything) -+ __argp_fmtstream_putc (fs, '\n'); -+ __argp_fmtstream_printf (fs, dgettext (argp->argp_domain, -+ "Report bugs to %s.\n"), -+ argp_program_bug_address); -+ anything = 1; -+ } -+ -+#if _LIBC || (HAVE_FLOCKFILE && HAVE_FUNLOCKFILE) -+ funlockfile (stream); -+#endif -+ -+ if (hol) -+ hol_free (hol); -+ -+ __argp_fmtstream_free (fs); -+} -+ -+/* Output a usage message for ARGP to STREAM. FLAGS are from the set -+ ARGP_HELP_*. NAME is what to use wherever a `program name' is needed. */ -+void argp_help (const struct argp *argp, FILE *stream, -+ unsigned flags, char *name) -+{ -+ _help (argp, 0, stream, flags, name); -+} -+ -+char * -+__argp_short_program_name (void) -+{ -+# ifdef __UCLIBC_HAS_PROGRAM_INVOCATION_NAME__ -+/* -+ * uClibc provides both program_invocation_name and -+ * program_invocation_short_name -+ */ -+ return (char *) program_invocation_short_name; -+# else -+ /* FIXME: What now? Miles suggests that it is better to use NULL, -+ but currently the value is passed on directly to fputs_unlocked, -+ so that requires more changes. */ -+# if __GNUC__ -+# warning No reasonable value to return -+# endif /* __GNUC__ */ -+ return ""; -+# endif -+} -+ -+/* Output, if appropriate, a usage message for STATE to STREAM. FLAGS are -+ from the set ARGP_HELP_*. */ -+void -+argp_state_help (const struct argp_state *state, FILE *stream, unsigned flags) -+{ -+ if ((!state || ! (state->flags & ARGP_NO_ERRS)) && stream) -+ { -+ if (state && (state->flags & ARGP_LONG_ONLY)) -+ flags |= ARGP_HELP_LONG_ONLY; -+ -+ _help (state ? state->root_argp : 0, state, stream, flags, -+ state ? state->name : __argp_short_program_name ()); -+ -+ if (!state || ! (state->flags & ARGP_NO_EXIT)) -+ { -+ if (flags & ARGP_HELP_EXIT_ERR) -+ exit (argp_err_exit_status); -+ if (flags & ARGP_HELP_EXIT_OK) -+ exit (0); -+ } -+ } -+} -+ -+/* If appropriate, print the printf string FMT and following args, preceded -+ by the program name and `:', to stderr, and followed by a `Try ... --help' -+ message, then exit (1). */ -+void -+argp_error (const struct argp_state *state, const char *fmt, ...) -+{ -+ if (!state || !(state->flags & ARGP_NO_ERRS)) -+ { -+ FILE *stream = state ? state->err_stream : stderr; -+ -+ if (stream) -+ { -+ va_list ap; -+ -+#if _LIBC || (HAVE_FLOCKFILE && HAVE_FUNLOCKFILE) -+ flockfile (stream); -+#endif -+ -+ va_start (ap, fmt); -+ -+#if defined _LIBC && defined USE_IN_LIBIO -+ char *buf; -+ -+ if (_IO_vasprintf (&buf, fmt, ap) < 0) -+ buf = NULL; -+ -+ __fxprintf (stream, "%s: %s\n", -+ state ? state->name : __argp_short_program_name (), buf); -+ -+ free (buf); -+#else -+ fputs_unlocked (state ? state->name : __argp_short_program_name (), -+ stream); -+ putc_unlocked (':', stream); -+ putc_unlocked (' ', stream); -+ -+ vfprintf (stream, fmt, ap); -+ -+ putc_unlocked ('\n', stream); -+#endif -+ -+ argp_state_help (state, stream, ARGP_HELP_STD_ERR); -+ -+ va_end (ap); -+ -+#if _LIBC || (HAVE_FLOCKFILE && HAVE_FUNLOCKFILE) -+ funlockfile (stream); -+#endif -+ } -+ } -+} -+ -+/* Similar to the standard gnu error-reporting function error(), but will -+ respect the ARGP_NO_EXIT and ARGP_NO_ERRS flags in STATE, and will print -+ to STATE->err_stream. This is useful for argument parsing code that is -+ shared between program startup (when exiting is desired) and runtime -+ option parsing (when typically an error code is returned instead). The -+ difference between this function and argp_error is that the latter is for -+ *parsing errors*, and the former is for other problems that occur during -+ parsing but don't reflect a (syntactic) problem with the input. */ -+void -+argp_failure (const struct argp_state *state, int status, int errnum, -+ const char *fmt, ...) -+{ -+ if (!state || !(state->flags & ARGP_NO_ERRS)) -+ { -+ FILE *stream = state ? state->err_stream : stderr; -+ -+ if (stream) -+ { -+#if _LIBC || (HAVE_FLOCKFILE && HAVE_FUNLOCKFILE) -+ flockfile (stream); -+#endif -+ -+#if defined _LIBC && defined USE_IN_LIBIO -+ __fxprintf (stream, "%s", -+ state ? state->name : __argp_short_program_name ()); -+#else -+ fputs_unlocked (state ? state->name : __argp_short_program_name (), -+ stream); -+#endif -+ -+ if (fmt) -+ { -+ va_list ap; -+ -+ va_start (ap, fmt); -+#if defined _LIBC && defined USE_IN_LIBIO -+ char *buf; -+ -+ if (_IO_vasprintf (&buf, fmt, ap) < 0) -+ buf = NULL; -+ -+ __fxprintf (stream, ": %s", buf); -+ -+ free (buf); -+#else -+ putc_unlocked (':', stream); -+ putc_unlocked (' ', stream); -+ -+ vfprintf (stream, fmt, ap); -+#endif -+ -+ va_end (ap); -+ } -+ -+ if (errnum) -+ { -+#if (defined _LIBC && defined USE_IN_LIBIO) || defined HAVE_STRERROR_R -+ char buf[200]; -+#endif -+#if defined _LIBC && defined USE_IN_LIBIO -+ __fxprintf (stream, ": %s", -+ strerror_r (errnum, buf, sizeof (buf))); -+#else -+ putc_unlocked (':', stream); -+ putc_unlocked (' ', stream); -+# ifdef HAVE_STRERROR_R -+ fputs (strerror_r (errnum, buf, sizeof (buf)), stream); -+# else -+ fputs (strerror (errnum), stream); -+# endif -+#endif -+ } -+ -+#ifdef USE_IN_LIBIO -+ if (_IO_fwide (stream, 0) > 0) -+ putwc_unlocked (L'\n', stream); -+ else -+#endif -+ putc_unlocked ('\n', stream); -+ -+#if _LIBC || (HAVE_FLOCKFILE && HAVE_FUNLOCKFILE) -+ funlockfile (stream); -+#endif -+ -+ if (status && (!state || !(state->flags & ARGP_NO_EXIT))) -+ exit (status); -+ } -+ } -+} -diff --git a/libuargp/argp-parse.c b/libuargp/argp-parse.c -new file mode 100644 -index 0000000..86b2b24 ---- /dev/null -+++ b/libuargp/argp-parse.c -@@ -0,0 +1,949 @@ -+/* Hierarchial argument parsing, layered over getopt -+ Copyright (C) 1995-2000, 2002, 2003, 2004 Free Software Foundation, Inc. -+ This file is part of the GNU C Library. -+ Written by Miles Bader <miles at gnu.ai.mit.edu>. -+ -+ The GNU C 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.1 of the License, or (at your option) any later version. -+ -+ The GNU C 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 the GNU C Library; if not, write to the Free -+ Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA -+ 02111-1307 USA. -+ -+ Modified for uClibc by: Salvatore Cro <salvatore.cro at st.com> -+*/ -+ -+#ifdef HAVE_CONFIG_H -+#include <config.h> -+#endif -+ -+/* AIX requires this to be the first thing in the file. */ -+#ifndef __GNUC__ -+# if HAVE_ALLOCA_H || defined _LIBC -+# include <alloca.h> -+# else -+# ifdef _AIX -+#pragma alloca -+# else -+# ifndef alloca /* predefined by HP cc +Olibcalls */ -+char *alloca (); -+# endif -+# endif -+# endif -+#endif -+ -+#include <stdlib.h> -+#include <string.h> -+#include <unistd.h> -+#include <limits.h> -+#include <getopt.h> -+#include <bits/getopt_int.h> -+ -+#include <features.h> -+#ifndef _ -+/* This is for other GNU distributions with internationalized messages. -+ When compiling libc, the _ macro is predefined. */ -+# if (defined HAVE_LIBINTL_H || defined _LIBC) && defined __UCLIBC_HAS_GETTEXT_AWARENESS__ -+# include <libintl.h> -+# ifdef _LIBC -+# undef dgettext -+# define dgettext(domain, msgid) \ -+ INTUSE(__dcgettext) (domain, msgid, LC_MESSAGES) -+# endif -+# else -+# define dgettext(domain, msgid) (msgid) -+# define gettext(msgid) (msgid) -+# endif -+#endif -+#ifndef N_ -+# define N_(msgid) (msgid) -+#endif -+ -+#include <argp.h> -+ -+/* Getopt return values. */ -+#define KEY_END (-1) /* The end of the options. */ -+#define KEY_ARG 1 /* A non-option argument. */ -+#define KEY_ERR '?' /* An error parsing the options. */ -+ -+/* The meta-argument used to prevent any further arguments being interpreted -+ as options. */ -+#define QUOTE "--" -+ -+/* The number of bits we steal in a long-option value for our own use. */ -+#define GROUP_BITS CHAR_BIT -+ -+/* The number of bits available for the user value. */ -+#define USER_BITS ((sizeof ((struct option *)0)->val * CHAR_BIT) - GROUP_BITS) -+#define USER_MASK ((1 << USER_BITS) - 1) -+ -+/* EZ alias for ARGP_ERR_UNKNOWN. */ -+#define EBADKEY ARGP_ERR_UNKNOWN -+ -+/* Default options. */ -+ -+/* When argp is given the --HANG switch, _ARGP_HANG is set and argp will sleep -+ for one second intervals, decrementing _ARGP_HANG until it's zero. Thus -+ you can force the program to continue by attaching a debugger and setting -+ it to 0 yourself. */ -+static volatile int _argp_hang; -+ -+#define OPT_PROGNAME -2 -+#define OPT_USAGE -3 -+#define OPT_HANG -4 -+ -+static const struct argp_option argp_default_options[] = -+{ -+ {"help", '?', 0, 0, N_("Give this help list"), -1}, -+ {"usage", OPT_USAGE, 0, 0, N_("Give a short usage message")}, -+ {"program-name",OPT_PROGNAME,"NAME", OPTION_HIDDEN, N_("Set the program name")}, -+ {"HANG", OPT_HANG, "SECS", OPTION_ARG_OPTIONAL | OPTION_HIDDEN, -+ N_("Hang for SECS seconds (default 3600)")}, -+ {0, 0} -+}; -+ -+static error_t -+argp_default_parser (int key, char *arg, struct argp_state *state) -+{ -+ switch (key) -+ { -+ case '?': -+ argp_state_help (state, state->out_stream, ARGP_HELP_STD_HELP); -+ break; -+ case OPT_USAGE: -+ argp_state_help (state, state->out_stream, -+ ARGP_HELP_USAGE | ARGP_HELP_EXIT_OK); -+ break; -+ -+ case OPT_PROGNAME: /* Set the program name. */ -+#if defined _LIBC || HAVE_DECL_PROGRAM_INVOCATION_NAME -+ program_invocation_name = arg; -+#endif -+ /* [Note that some systems only have PROGRAM_INVOCATION_SHORT_NAME (aka -+ __PROGNAME), in which case, PROGRAM_INVOCATION_NAME is just defined -+ to be that, so we have to be a bit careful here.] */ -+ -+ /* Update what we use for messages. */ -+ state->name = strrchr (arg, '/'); -+ if (state->name) -+ state->name++; -+ else -+ state->name = arg; -+ -+#if defined _LIBC || HAVE_DECL_PROGRAM_INVOCATION_SHORT_NAME -+ program_invocation_short_name = state->name; -+#endif -+ -+ if ((state->flags & (ARGP_PARSE_ARGV0 | ARGP_NO_ERRS)) -+ == ARGP_PARSE_ARGV0) -+ /* Update what getopt uses too. */ -+ state->argv[0] = arg; -+ -+ break; -+ -+ case OPT_HANG: -+ _argp_hang = atoi (arg ? arg : "3600"); -+ while (_argp_hang-- > 0) -+ sleep (1); -+ break; -+ -+ default: -+ return EBADKEY; -+ } -+ return 0; -+} -+ -+static const struct argp argp_default_argp = -+ {argp_default_options, &argp_default_parser, NULL, NULL, NULL, NULL, "libc"}; -+ -+ -+static const struct argp_option argp_version_options[] = -+{ -+ {"version", 'V', 0, 0, N_("Print program version"), -1}, -+ {0, 0} -+}; -+ -+static error_t -+argp_version_parser (int key, char *arg, struct argp_state *state) -+{ -+ switch (key) -+ { -+ case 'V': -+ if (argp_program_version_hook) -+ (*argp_program_version_hook) (state->out_stream, state); -+ else if (argp_program_version) -+ fprintf (state->out_stream, "%s\n", argp_program_version); -+ else -+ argp_error (state, dgettext (state->root_argp->argp_domain, -+ "(PROGRAM ERROR) No version known!?")); -+ if (! (state->flags & ARGP_NO_EXIT)) -+ exit (0); -+ break; -+ default: -+ return EBADKEY; -+ } -+ return 0; -+} -+ -+static const struct argp argp_version_argp = -+ {argp_version_options, &argp_version_parser, NULL, NULL, NULL, NULL, "libc"}; -+ -+/* Returns the offset into the getopt long options array LONG_OPTIONS of a -+ long option with called NAME, or -1 if none is found. Passing NULL as -+ NAME will return the number of options. */ -+static int -+find_long_option (struct option *long_options, const char *name) -+{ -+ struct option *l = long_options; -+ while (l->name != NULL) -+ if (name != NULL && strcmp (l->name, name) == 0) -+ return l - long_options; -+ else -+ l++; -+ if (name == NULL) -+ return l - long_options; -+ else -+ return -1; -+} -+ -+ -+/* The state of a `group' during parsing. Each group corresponds to a -+ particular argp structure from the tree of such descending from the top -+ level argp passed to argp_parse. */ -+struct group -+{ -+ /* This group's parsing function. */ -+ argp_parser_t parser; -+ -+ /* Which argp this group is from. */ -+ const struct argp *argp; -+ -+ /* Points to the point in SHORT_OPTS corresponding to the end of the short -+ options for this group. We use it to determine from which group a -+ particular short options is from. */ -+ char *short_end; -+ -+ /* The number of non-option args sucessfully handled by this parser. */ -+ unsigned args_processed; -+ -+ /* This group's parser's parent's group. */ -+ struct group *parent; -+ unsigned parent_index; /* And the our position in the parent. */ -+ -+ /* These fields are swapped into and out of the state structure when -+ calling this group's parser. */ -+ void *input, **child_inputs; -+ void *hook; -+}; -+ -+/* Call GROUP's parser with KEY and ARG, swapping any group-specific info -+ from STATE before calling, and back into state afterwards. If GROUP has -+ no parser, EBADKEY is returned. */ -+static error_t -+group_parse (struct group *group, struct argp_state *state, int key, char *arg) -+{ -+ if (group->parser) -+ { -+ error_t err; -+ state->hook = group->hook; -+ state->input = group->input; -+ state->child_inputs = group->child_inputs; -+ state->arg_num = group->args_processed; -+ err = (*group->parser)(key, arg, state); -+ group->hook = state->hook; -+ return err; -+ } -+ else -+ return EBADKEY; -+} -+ -+struct parser -+{ -+ const struct argp *argp; -+ -+ /* SHORT_OPTS is the getopt short options string for the union of all the -+ groups of options. */ -+ char *short_opts; -+ /* LONG_OPTS is the array of getop long option structures for the union of -+ all the groups of options. */ -+ struct option *long_opts; -+ /* OPT_DATA is the getopt data used for the re-entrant getopt. */ -+ struct _getopt_data opt_data; -+ -+ /* States of the various parsing groups. */ -+ struct group *groups; -+ /* The end of the GROUPS array. */ -+ struct group *egroup; -+ /* An vector containing storage for the CHILD_INPUTS field in all groups. */ -+ void **child_inputs; -+ -+ /* True if we think using getopt is still useful; if false, then -+ remaining arguments are just passed verbatim with ARGP_KEY_ARG. This is -+ cleared whenever getopt returns KEY_END, but may be set again if the user -+ moves the next argument pointer backwards. */ -+ int try_getopt; -+ -+ /* State block supplied to parsing routines. */ -+ struct argp_state state; -+ -+ /* Memory used by this parser. */ -+ void *storage; -+}; -+ -+/* The next usable entries in the various parser tables being filled in by -+ convert_options. */ -+struct parser_convert_state -+{ -+ struct parser *parser; -+ char *short_end; -+ struct option *long_end; -+ void **child_inputs_end; -+}; -+ -+/* Converts all options in ARGP (which is put in GROUP) and ancestors -+ into getopt options stored in SHORT_OPTS and LONG_OPTS; SHORT_END and -+ CVT->LONG_END are the points at which new options are added. Returns the -+ next unused group entry. CVT holds state used during the conversion. */ -+static struct group * -+convert_options (const struct argp *argp, -+ struct group *parent, unsigned parent_index, -+ struct group *group, struct parser_convert_state *cvt) -+{ -+ /* REAL is the most recent non-alias value of OPT. */ -+ const struct argp_option *real = argp->options; -+ const struct argp_child *children = argp->children; -+ -+ if (real || argp->parser) -+ { -+ const struct argp_option *opt; -+ -+ if (real) -+ for (opt = real; !__option_is_end (opt); opt++) -+ { -+ if (! (opt->flags & OPTION_ALIAS)) -+ /* OPT isn't an alias, so we can use values from it. */ -+ real = opt; -+ -+ if (! (real->flags & OPTION_DOC)) -+ /* A real option (not just documentation). */ -+ { -+ if (__option_is_short (opt)) -+ /* OPT can be used as a short option. */ -+ { -+ *cvt->short_end++ = opt->key; -+ if (real->arg) -+ { -+ *cvt->short_end++ = ':'; -+ if (real->flags & OPTION_ARG_OPTIONAL) -+ *cvt->short_end++ = ':'; -+ } -+ *cvt->short_end = '\0'; /* keep 0 terminated */ -+ } -+ -+ if (opt->name -+ && find_long_option (cvt->parser->long_opts, opt->name) < 0) -+ /* OPT can be used as a long option. */ -+ { -+ cvt->long_end->name = opt->name; -+ cvt->long_end->has_arg = -+ (real->arg -+ ? (real->flags & OPTION_ARG_OPTIONAL -+ ? optional_argument -+ : required_argument) -+ : no_argument); -+ cvt->long_end->flag = 0; -+ /* we add a disambiguating code to all the user's -+ values (which is removed before we actually call -+ the function to parse the value); this means that -+ the user loses use of the high 8 bits in all his -+ values (the sign of the lower bits is preserved -+ however)... */ -+ cvt->long_end->val = -+ ((opt->key | real->key) & USER_MASK) -+ + (((group - cvt->parser->groups) + 1) << USER_BITS); -+ -+ /* Keep the LONG_OPTS list terminated. */ -+ (++cvt->long_end)->name = NULL; -+ } -+ } -+ } -+ -+ group->parser = argp->parser; -+ group->argp = argp; -+ group->short_end = cvt->short_end; -+ group->args_processed = 0; -+ group->parent = parent; -+ group->parent_index = parent_index; -+ group->input = 0; -+ group->hook = 0; -+ group->child_inputs = 0; -+ -+ if (children) -+ /* Assign GROUP's CHILD_INPUTS field some space from -+ CVT->child_inputs_end.*/ -+ { -+ unsigned num_children = 0; -+ while (children[num_children].argp) -+ num_children++; -+ group->child_inputs = cvt->child_inputs_end; -+ cvt->child_inputs_end += num_children; -+ } -+ -+ parent = group++; -+ } -+ else -+ parent = 0; -+ -+ if (children) -+ { -+ unsigned index = 0; -+ while (children->argp) -+ group = -+ convert_options (children++->argp, parent, index++, group, cvt); -+ } -+ -+ return group; -+} -+ -+/* Find the merged set of getopt options, with keys appropiately prefixed. */ -+static void -+parser_convert (struct parser *parser, const struct argp *argp, int flags) -+{ -+ struct parser_convert_state cvt; -+ -+ cvt.parser = parser; -+ cvt.short_end = parser->short_opts; -+ cvt.long_end = parser->long_opts; -+ cvt.child_inputs_end = parser->child_inputs; -+ -+ if (flags & ARGP_IN_ORDER) -+ *cvt.short_end++ = '-'; -+ else if (flags & ARGP_NO_ARGS) -+ *cvt.short_end++ = '+'; -+ *cvt.short_end = '\0'; -+ -+ cvt.long_end->name = NULL; -+ -+ parser->argp = argp; -+ -+ if (argp) -+ parser->egroup = convert_options (argp, 0, 0, parser->groups, &cvt); -+ else -+ parser->egroup = parser->groups; /* No parsers at all! */ -+} -+ -+/* Lengths of various parser fields which we will allocated. */ -+struct parser_sizes -+{ -+ size_t short_len; /* Getopt short options string. */ -+ size_t long_len; /* Getopt long options vector. */ -+ size_t num_groups; /* Group structures we allocate. */ -+ size_t num_child_inputs; /* Child input slots. */ -+}; -+ -+/* For ARGP, increments the NUM_GROUPS field in SZS by the total number of -+ argp structures descended from it, and the SHORT_LEN & LONG_LEN fields by -+ the maximum lengths of the resulting merged getopt short options string and -+ long-options array, respectively. */ -+static void -+calc_sizes (const struct argp *argp, struct parser_sizes *szs) -+{ -+ const struct argp_child *child = argp->children; -+ const struct argp_option *opt = argp->options; -+ -+ if (opt || argp->parser) -+ { -+ szs->num_groups++; -+ if (opt) -+ { -+ int num_opts = 0; -+ while (!__option_is_end (opt++)) -+ num_opts++; -+ szs->short_len += num_opts * 3; /* opt + up to 2 `:'s */ -+ szs->long_len += num_opts; -+ } -+ } -+ -+ if (child) -+ while (child->argp) -+ { -+ calc_sizes ((child++)->argp, szs); -+ szs->num_child_inputs++; -+ } -+} -+ -+ -+extern char * __argp_short_program_name (void); -+/* Initializes PARSER to parse ARGP in a manner described by FLAGS. */ -+static error_t -+parser_init (struct parser *parser, const struct argp *argp, -+ int argc, char **argv, int flags, void *input) -+{ -+ error_t err = 0; -+ struct group *group; -+ struct parser_sizes szs; -+ struct _getopt_data opt_data = _GETOPT_DATA_INITIALIZER; -+ -+ szs.short_len = (flags & ARGP_NO_ARGS) ? 0 : 1; -+ szs.long_len = 0; -+ szs.num_groups = 0; -+ szs.num_child_inputs = 0; -+ -+ if (argp) -+ calc_sizes (argp, &szs); -+ -+ /* Lengths of the various bits of storage used by PARSER. */ -+#define GLEN (szs.num_groups + 1) * sizeof (struct group) -+#define CLEN (szs.num_child_inputs * sizeof (void *)) -+#define LLEN ((szs.long_len + 1) * sizeof (struct option)) -+#define SLEN (szs.short_len + 1) -+ -+ parser->storage = malloc (GLEN + CLEN + LLEN + SLEN); -+ if (! parser->storage) -+ return ENOMEM; -+ -+ parser->groups = parser->storage; -+ parser->child_inputs = parser->storage + GLEN; -+ parser->long_opts = parser->storage + GLEN + CLEN; -+ parser->short_opts = parser->storage + GLEN + CLEN + LLEN; -+ parser->opt_data = opt_data; -+ -+ memset (parser->child_inputs, 0, szs.num_child_inputs * sizeof (void *)); -+ parser_convert (parser, argp, flags); -+ -+ memset (&parser->state, 0, sizeof (struct argp_state)); -+ parser->state.root_argp = parser->argp; -+ parser->state.argc = argc; -+ parser->state.argv = argv; -+ parser->state.flags = flags; -+ parser->state.err_stream = stderr; -+ parser->state.out_stream = stdout; -+ parser->state.next = 0; /* Tell getopt to initialize. */ -+ parser->state.pstate = parser; -+ -+ parser->try_getopt = 1; -+ -+ /* Call each parser for the first time, giving it a chance to propagate -+ values to child parsers. */ -+ if (parser->groups < parser->egroup) -+ parser->groups->input = input; -+ for (group = parser->groups; -+ group < parser->egroup && (!err || err == EBADKEY); -+ group++) -+ { -+ if (group->parent) -+ /* If a child parser, get the initial input value from the parent. */ -+ group->input = group->parent->child_inputs[group->parent_index]; -+ -+ if (!group->parser -+ && group->argp->children && group->argp->children->argp) -+ /* For the special case where no parsing function is supplied for an -+ argp, propagate its input to its first child, if any (this just -+ makes very simple wrapper argps more convenient). */ -+ group->child_inputs[0] = group->input; -+ -+ err = group_parse (group, &parser->state, ARGP_KEY_INIT, 0); -+ } -+ if (err == EBADKEY) -+ err = 0; /* Some parser didn't understand. */ -+ -+ if (err) -+ return err; -+ -+ if (parser->state.flags & ARGP_NO_ERRS) -+ { -+ parser->opt_data.opterr = 0; -+ if (parser->state.flags & ARGP_PARSE_ARGV0) -+ /* getopt always skips ARGV[0], so we have to fake it out. As long -+ as OPTERR is 0, then it shouldn't actually try to access it. */ -+ parser->state.argv--, parser->state.argc++; -+ } -+ else -+ parser->opt_data.opterr = 1; /* Print error messages. */ -+ -+ if (parser->state.argv == argv && argv[0]) -+ /* There's an argv[0]; use it for messages. */ -+ { -+ char *short_name = strrchr (argv[0], '/'); -+ parser->state.name = short_name ? short_name + 1 : argv[0]; -+ } -+ else -+ parser->state.name = __argp_short_program_name (); -+ -+ return 0; -+} -+ -+/* Free any storage consumed by PARSER (but not PARSER itself). */ -+static error_t -+parser_finalize (struct parser *parser, -+ error_t err, int arg_ebadkey, int *end_index) -+{ -+ struct group *group; -+ -+ if (err == EBADKEY && arg_ebadkey) -+ /* Suppress errors generated by unparsed arguments. */ -+ err = 0; -+ -+ if (! err) -+ { -+ if (parser->state.next == parser->state.argc) -+ /* We successfully parsed all arguments! Call all the parsers again, -+ just a few more times... */ -+ { -+ for (group = parser->groups; -+ group < parser->egroup && (!err || err==EBADKEY); -+ group++) -+ if (group->args_processed == 0) -+ err = group_parse (group, &parser->state, ARGP_KEY_NO_ARGS, 0); -+ for (group = parser->egroup - 1; -+ group >= parser->groups && (!err || err==EBADKEY); -+ group--) -+ err = group_parse (group, &parser->state, ARGP_KEY_END, 0); -+ -+ if (err == EBADKEY) -+ err = 0; /* Some parser didn't understand. */ -+ -+ /* Tell the user that all arguments are parsed. */ -+ if (end_index) -+ *end_index = parser->state.next; -+ } -+ else if (end_index) -+ /* Return any remaining arguments to the user. */ -+ *end_index = parser->state.next; -+ else -+ /* No way to return the remaining arguments, they must be bogus. */ -+ { -+ if (!(parser->state.flags & ARGP_NO_ERRS) -+ && parser->state.err_stream) -+ fprintf (parser->state.err_stream, -+ dgettext (parser->argp->argp_domain, -+ "%s: Too many arguments\n"), -+ parser->state.name); -+ err = EBADKEY; -+ } -+ } -+ -+ /* Okay, we're all done, with either an error or success; call the parsers -+ to indicate which one. */ -+ -+ if (err) -+ { -+ /* Maybe print an error message. */ -+ if (err == EBADKEY) -+ /* An appropriate message describing what the error was should have -+ been printed earlier. */ -+ argp_state_help (&parser->state, parser->state.err_stream, -+ ARGP_HELP_STD_ERR); -+ -+ /* Since we didn't exit, give each parser an error indication. */ -+ for (group = parser->groups; group < parser->egroup; group++) -+ group_parse (group, &parser->state, ARGP_KEY_ERROR, 0); -+ } -+ else -+ /* Notify parsers of success, and propagate back values from parsers. */ -+ { -+ /* We pass over the groups in reverse order so that child groups are -+ given a chance to do there processing before passing back a value to -+ the parent. */ -+ for (group = parser->egroup - 1 -+ ; group >= parser->groups && (!err || err == EBADKEY) -+ ; group--) -+ err = group_parse (group, &parser->state, ARGP_KEY_SUCCESS, 0); -+ if (err == EBADKEY) -+ err = 0; /* Some parser didn't understand. */ -+ } -+ -+ /* Call parsers once more, to do any final cleanup. Errors are ignored. */ -+ for (group = parser->egroup - 1; group >= parser->groups; group--) -+ group_parse (group, &parser->state, ARGP_KEY_FINI, 0); -+ -+ if (err == EBADKEY) -+ err = EINVAL; -+ -+ free (parser->storage); -+ -+ return err; -+} -+ -+/* Call the user parsers to parse the non-option argument VAL, at the current -+ position, returning any error. The state NEXT pointer is assumed to have -+ been adjusted (by getopt) to point after this argument; this function will -+ adjust it correctly to reflect however many args actually end up being -+ consumed. */ -+static error_t -+parser_parse_arg (struct parser *parser, char *val) -+{ -+ /* Save the starting value of NEXT, first adjusting it so that the arg -+ we're parsing is again the front of the arg vector. */ -+ int index = --parser->state.next; -+ error_t err = EBADKEY; -+ struct group *group; -+ int key = 0; /* Which of ARGP_KEY_ARG[S] we used. */ -+ -+ /* Try to parse the argument in each parser. */ -+ for (group = parser->groups -+ ; group < parser->egroup && err == EBADKEY -+ ; group++) -+ { -+ parser->state.next++; /* For ARGP_KEY_ARG, consume the arg. */ -+ key = ARGP_KEY_ARG; -+ err = group_parse (group, &parser->state, key, val); -+ -+ if (err == EBADKEY) -+ /* This parser doesn't like ARGP_KEY_ARG; try ARGP_KEY_ARGS instead. */ -+ { -+ parser->state.next--; /* For ARGP_KEY_ARGS, put back the arg. */ -+ key = ARGP_KEY_ARGS; -+ err = group_parse (group, &parser->state, key, 0); -+ } -+ } -+ -+ if (! err) -+ { -+ if (key == ARGP_KEY_ARGS) -+ /* The default for ARGP_KEY_ARGS is to assume that if NEXT isn't -+ changed by the user, *all* arguments should be considered -+ consumed. */ -+ parser->state.next = parser->state.argc; -+ -+ if (parser->state.next > index) -+ /* Remember that we successfully processed a non-option -+ argument -- but only if the user hasn't gotten tricky and set -+ the clock back. */ -+ (--group)->args_processed += (parser->state.next - index); -+ else -+ /* The user wants to reparse some args, give getopt another try. */ -+ parser->try_getopt = 1; -+ } -+ -+ return err; -+} -+ -+/* Call the user parsers to parse the option OPT, with argument VAL, at the -+ current position, returning any error. */ -+static error_t -+parser_parse_opt (struct parser *parser, int opt, char *val) -+{ -+ /* The group key encoded in the high bits; 0 for short opts or -+ group_number + 1 for long opts. */ -+ int group_key = opt >> USER_BITS; -+ error_t err = EBADKEY; -+ -+ if (group_key == 0) -+ /* A short option. By comparing OPT's position in SHORT_OPTS to the -+ various starting positions in each group's SHORT_END field, we can -+ determine which group OPT came from. */ -+ { -+ struct group *group; -+ char *short_index = strchr (parser->short_opts, opt); -+ -+ if (short_index) -+ for (group = parser->groups; group < parser->egroup; group++) -+ if (group->short_end > short_index) -+ { -+ err = group_parse (group, &parser->state, opt, -+ parser->opt_data.optarg); -+ break; -+ } -+ } -+ else -+ /* A long option. We use shifts instead of masking for extracting -+ the user value in order to preserve the sign. */ -+ err = -+ group_parse (&parser->groups[group_key - 1], &parser->state, -+ (opt << GROUP_BITS) >> GROUP_BITS, -+ parser->opt_data.optarg); -+ -+ if (err == EBADKEY) -+ /* At least currently, an option not recognized is an error in the -+ parser, because we pre-compute which parser is supposed to deal -+ with each option. */ -+ { -+ static const char bad_key_err[] = -+ N_("(PROGRAM ERROR) Option should have been recognized!?"); -+ if (group_key == 0) -+ argp_error (&parser->state, "-%c: %s", opt, -+ dgettext (parser->argp->argp_domain, bad_key_err)); -+ else -+ { -+ struct option *long_opt = parser->long_opts; -+ while (long_opt->val != opt && long_opt->name) -+ long_opt++; -+ argp_error (&parser->state, "--%s: %s", -+ long_opt->name ? long_opt->name : "???", -+ dgettext (parser->argp->argp_domain, bad_key_err)); -+ } -+ } -+ -+ return err; -+} -+ -+/* Parse the next argument in PARSER (as indicated by PARSER->state.next). -+ Any error from the parsers is returned, and *ARGP_EBADKEY indicates -+ whether a value of EBADKEY is due to an unrecognized argument (which is -+ generally not fatal). */ -+static error_t -+parser_parse_next (struct parser *parser, int *arg_ebadkey) -+{ -+ int opt; -+ error_t err = 0; -+ -+ if (parser->state.quoted && parser->state.next < parser->state.quoted) -+ /* The next argument pointer has been moved to before the quoted -+ region, so pretend we never saw the quoting `--', and give getopt -+ another chance. If the user hasn't removed it, getopt will just -+ process it again. */ -+ parser->state.quoted = 0; -+ -+ if (parser->try_getopt && !parser->state.quoted) -+ /* Give getopt a chance to parse this. */ -+ { -+ /* Put it back in OPTIND for getopt. */ -+ parser->opt_data.optind = parser->state.next; -+ /* Distinguish KEY_ERR from a real option. */ -+ parser->opt_data.optopt = KEY_END; -+ if (parser->state.flags & ARGP_LONG_ONLY) -+ opt = _getopt_long_only_r (parser->state.argc, parser->state.argv, -+ parser->short_opts, parser->long_opts, 0, -+ &parser->opt_data); -+ else -+ opt = _getopt_long_r (parser->state.argc, parser->state.argv, -+ parser->short_opts, parser->long_opts, 0, -+ &parser->opt_data); -+ /* And see what getopt did. */ -+ parser->state.next = parser->opt_data.optind; -+ -+ if (opt == KEY_END) -+ /* Getopt says there are no more options, so stop using -+ getopt; we'll continue if necessary on our own. */ -+ { -+ parser->try_getopt = 0; -+ if (parser->state.next > 1 -+ && strcmp (parser->state.argv[parser->state.next - 1], QUOTE) -+ == 0) -+ /* Not only is this the end of the options, but it's a -+ `quoted' region, which may have args that *look* like -+ options, so we definitely shouldn't try to use getopt past -+ here, whatever happens. */ -+ parser->state.quoted = parser->state.next; -+ } -+ else if (opt == KEY_ERR && parser->opt_data.optopt != KEY_END) -+ /* KEY_ERR can have the same value as a valid user short -+ option, but in the case of a real error, getopt sets OPTOPT -+ to the offending character, which can never be KEY_END. */ -+ { -+ *arg_ebadkey = 0; -+ return EBADKEY; -+ } -+ } -+ else -+ opt = KEY_END; -+ -+ if (opt == KEY_END) -+ { -+ /* We're past what getopt considers the options. */ -+ if (parser->state.next >= parser->state.argc -+ || (parser->state.flags & ARGP_NO_ARGS)) -+ /* Indicate that we're done. */ -+ { -+ *arg_ebadkey = 1; -+ return EBADKEY; -+ } -+ else -+ /* A non-option arg; simulate what getopt might have done. */ -+ { -+ opt = KEY_ARG; -+ parser->opt_data.optarg = parser->state.argv[parser->state.next++]; -+ } -+ } -+ -+ if (opt == KEY_ARG) -+ /* A non-option argument; try each parser in turn. */ -+ err = parser_parse_arg (parser, parser->opt_data.optarg); -+ else -+ err = parser_parse_opt (parser, opt, parser->opt_data.optarg); -+ -+ if (err == EBADKEY) -+ *arg_ebadkey = (opt == KEY_END || opt == KEY_ARG); -+ -+ return err; -+} -+ -+/* Parse the options strings in ARGC & ARGV according to the argp in ARGP. -+ FLAGS is one of the ARGP_ flags above. If END_INDEX is non-NULL, the -+ index in ARGV of the first unparsed option is returned in it. If an -+ unknown option is present, EINVAL is returned; if some parser routine -+ returned a non-zero value, it is returned; otherwise 0 is returned. */ -+error_t -+argp_parse (const struct argp *argp, int argc, char **argv, unsigned flags, -+ int *end_index, void *input) -+{ -+ error_t err; -+ struct parser parser; -+ -+ /* If true, then err == EBADKEY is a result of a non-option argument failing -+ to be parsed (which in some cases isn't actually an error). */ -+ int arg_ebadkey = 0; -+ -+ if (! (flags & ARGP_NO_HELP)) -+ /* Add our own options. */ -+ { -+ struct argp_child *child = alloca (4 * sizeof (struct argp_child)); -+ struct argp *top_argp = alloca (sizeof (struct argp)); -+ -+ /* TOP_ARGP has no options, it just serves to group the user & default -+ argps. */ -+ memset (top_argp, 0, sizeof (*top_argp)); -+ top_argp->children = child; -+ -+ memset (child, 0, 4 * sizeof (struct argp_child)); -+ -+ if (argp) -+ (child++)->argp = argp; -+ (child++)->argp = &argp_default_argp; -+ if (argp_program_version || argp_program_version_hook) -+ (child++)->argp = &argp_version_argp; -+ child->argp = 0; -+ -+ argp = top_argp; -+ } -+ -+ /* Construct a parser for these arguments. */ -+ err = parser_init (&parser, argp, argc, argv, flags, input); -+ -+ if (! err) -+ /* Parse! */ -+ { -+ while (! err) -+ err = parser_parse_next (&parser, &arg_ebadkey); -+ err = parser_finalize (&parser, err, arg_ebadkey, end_index); -+ } -+ -+ return err; -+} -+ -+/* Return the input field for ARGP in the parser corresponding to STATE; used -+ by the help routines. */ -+void * -+__argp_input (const struct argp *argp, const struct argp_state *state) -+{ -+ if (state) -+ { -+ struct group *group; -+ struct parser *parser = state->pstate; -+ -+ for (group = parser->groups; group < parser->egroup; group++) -+ if (group->argp == argp) -+ return group->input; -+ } -+ -+ return 0; -+} -diff --git a/libuargp/argp-pv.c b/libuargp/argp-pv.c -new file mode 100644 -index 0000000..f1227b5 ---- /dev/null -+++ b/libuargp/argp-pv.c -@@ -0,0 +1,25 @@ -+/* Default definition for ARGP_PROGRAM_VERSION. -+ Copyright (C) 1996, 1997, 1999 Free Software Foundation, Inc. -+ This file is part of the GNU C Library. -+ Written by Miles Bader <miles at gnu.ai.mit.edu>. -+ -+ The GNU C 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.1 of the License, or (at your option) any later version. -+ -+ The GNU C 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 the GNU C Library; if not, write to the Free -+ Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA -+ 02111-1307 USA. */ -+ -+/* If set by the user program to a non-zero value, then a default option -+ --version is added (unless the ARGP_NO_HELP flag is used), which will -+ print this this string followed by a newline and exit (unless the -+ ARGP_NO_EXIT flag is used). Overridden by ARGP_PROGRAM_VERSION_HOOK. */ -+const char *argp_program_version; -diff --git a/libuargp/argp-pvh.c b/libuargp/argp-pvh.c -new file mode 100644 -index 0000000..1f1d962 ---- /dev/null -+++ b/libuargp/argp-pvh.c -@@ -0,0 +1,32 @@ -+/* Default definition for ARGP_PROGRAM_VERSION_HOOK. -+ Copyright (C) 1996, 1997, 1999 Free Software Foundation, Inc. -+ This file is part of the GNU C Library. -+ Written by Miles Bader <miles at gnu.ai.mit.edu>. -+ -+ The GNU C 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.1 of the License, or (at your option) any later version. -+ -+ The GNU C 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 the GNU C 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 <argp.h> -+ -+/* If set by the user program to a non-zero value, then a default option -+ --version is added (unless the ARGP_NO_HELP flag is used), which calls -+ this function with a stream to print the version to and a pointer to the -+ current parsing state, and then exits (unless the ARGP_NO_EXIT flag is -+ used). This variable takes precedent over ARGP_PROGRAM_VERSION. */ -+void (*argp_program_version_hook) (FILE *stream, struct argp_state *state); -diff --git a/libuargp/argp-xinl.c b/libuargp/argp-xinl.c -new file mode 100644 -index 0000000..f1d3000 ---- /dev/null -+++ b/libuargp/argp-xinl.c -@@ -0,0 +1,35 @@ -+/* Real definitions for extern inline functions in argp.h -+ Copyright (C) 1997, 1998, 2004 Free Software Foundation, Inc. -+ This file is part of the GNU C Library. -+ Written by Miles Bader <miles at gnu.ai.mit.edu>. -+ -+ The GNU C 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.1 of the License, or (at your option) any later version. -+ -+ The GNU C 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 the GNU C 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 -+ -+#if defined _LIBC || defined HAVE_FEATURES_H -+# include <features.h> -+#endif -+ -+#ifndef __USE_EXTERN_INLINES -+# define __USE_EXTERN_INLINES 1 -+#endif -+#define ARGP_EI -+#undef __OPTIMIZE__ -+#define __OPTIMIZE__ 1 -+#include <argp.h> -diff --git a/test/argp/Makefile b/test/argp/Makefile -new file mode 100644 -index 0000000..616fe71 ---- /dev/null -+++ b/test/argp/Makefile -@@ -0,0 +1,7 @@ -+# uClibc argp tests -+# Licensed under the LGPL v2.1, see the file COPYING.LIB in this tarball. -+ -+top_builddir=../../ -+include ../Rules.mak -+-include Makefile.in -+include ../Test.mak -diff --git a/test/argp/Makefile.in b/test/argp/Makefile.in -new file mode 100644 -index 0000000..d81b359 ---- /dev/null -+++ b/test/argp/Makefile.in -@@ -0,0 +1,12 @@ -+# uClibc argp tests -+# Licensed under the LGPL v2.1, see the file COPYING.LIB in this tarball. -+ -+TESTS := $(addprefix argp-, ex1 ex2 ex3 ex4 test) \ -+ bug-argp1 tst-argp1 tst-argp2 -+ -+EXTRA_LDFLAGS = -luargp -+ -+OPTS_argp-ex3 = ARG1 ARG2 -+OPTS_argp-ex4 = ARG1 string1 string2 string3 -+OPTS_bug-argp1 = -- --help -+ -diff --git a/test/argp/argp-ex1.c b/test/argp/argp-ex1.c -new file mode 100644 -index 0000000..7bb5f22 ---- /dev/null -+++ b/test/argp/argp-ex1.c -@@ -0,0 +1,15 @@ -+/* Argp example #1 -- a minimal program using argp */ -+ -+/* This is (probably) the smallest possible program that -+ uses argp. It won't do much except give an error -+ messages and exit when there are any arguments, and print -+ a (rather pointless) messages for --help. */ -+ -+#include <stdlib.h> -+#include <argp.h> -+ -+int main (int argc, char **argv) -+{ -+ argp_parse (0, argc, argv, 0, 0, 0); -+ exit (0); -+} -diff --git a/test/argp/argp-ex2.c b/test/argp/argp-ex2.c -new file mode 100644 -index 0000000..c49fbac ---- /dev/null -+++ b/test/argp/argp-ex2.c -@@ -0,0 +1,45 @@ -+/* Argp example #2 -- a pretty minimal program using argp */ -+ -+/* This program doesn't use any options or arguments, but uses -+ argp to be compliant with the GNU standard command line -+ format. -+ -+ In addition to making sure no arguments are given, and -+ implementing a --help option, this example will have a -+ --version option, and will put the given documentation string -+ and bug address in the --help output, as per GNU standards. -+ -+ The variable ARGP contains the argument parser specification; -+ adding fields to this structure is the way most parameters are -+ passed to argp_parse (the first three fields are usually used, -+ but not in this small program). There are also two global -+ variables that argp knows about defined here, -+ ARGP_PROGRAM_VERSION and ARGP_PROGRAM_BUG_ADDRESS (they are -+ global variables because they will almost always be constant -+ for a given program, even if it uses different argument -+ parsers for various tasks). */ -+ -+#include <stdlib.h> -+#include <argp.h> -+ -+const char *argp_program_version = -+ "argp-ex2 1.0"; -+const char *argp_program_bug_address = -+ "<bug-gnu-utils@@gnu.org>"; -+ -+/* Program documentation. */ -+static char doc[] = -+ "Argp example #2 -- a pretty minimal program using argp"; -+ -+/* Our argument parser. The @code{options}, @code{parser}, and -+ @code{args_doc} fields are zero because we have neither options or -+ arguments; @code{doc} and @code{argp_program_bug_address} will be -+ used in the output for @samp{--help}, and the @samp{--version} -+ option will print out @code{argp_program_version}. */ -+static struct argp argp = { 0, 0, 0, doc }; -+ -+int main (int argc, char **argv) -+{ -+ argp_parse (&argp, argc, argv, 0, 0, 0); -+ exit (0); -+} -diff --git a/test/argp/argp-ex3.c b/test/argp/argp-ex3.c -new file mode 100644 -index 0000000..24d5c50 ---- /dev/null -+++ b/test/argp/argp-ex3.c -@@ -0,0 +1,153 @@ -+/* Argp example #3 -- a program with options and arguments using argp */ -+ -+/* This program uses the same features as example 2, and uses options and -+ arguments. -+ -+ We now use the first four fields in ARGP, so here's a description of them: -+ OPTIONS -- A pointer to a vector of struct argp_option (see below) -+ PARSER -- A function to parse a single option, called by argp -+ ARGS_DOC -- A string describing how the non-option arguments should look -+ DOC -- A descriptive string about this program; if it contains a -+ vertical tab character (\v), the part after it will be -+ printed *following* the options -+ -+ The function PARSER takes the following arguments: -+ KEY -- An integer specifying which option this is (taken -+ from the KEY field in each struct argp_option), or -+ a special key specifying something else; the only -+ special keys we use here are ARGP_KEY_ARG, meaning -+ a non-option argument, and ARGP_KEY_END, meaning -+ that all arguments have been parsed -+ ARG -- For an option KEY, the string value of its -+ argument, or NULL if it has none -+ STATE-- A pointer to a struct argp_state, containing -+ various useful information about the parsing state; used here -+ are the INPUT field, which reflects the INPUT argument to -+ argp_parse, and the ARG_NUM field, which is the number of the -+ current non-option argument being parsed -+ It should return either 0, meaning success, ARGP_ERR_UNKNOWN, meaning the -+ given KEY wasn't recognized, or an errno value indicating some other -+ error. -+ -+ Note that in this example, main uses a structure to communicate with the -+ parse_opt function, a pointer to which it passes in the INPUT argument to -+ argp_parse. Of course, it's also possible to use global variables -+ instead, but this is somewhat more flexible. -+ -+ The OPTIONS field contains a pointer to a vector of struct argp_option's; -+ that structure has the following fields (if you assign your option -+ structures using array initialization like this example, unspecified -+ fields will be defaulted to 0, and need not be specified): -+ NAME -- The name of this option's long option (may be zero) -+ KEY -- The KEY to pass to the PARSER function when parsing this option, -+ *and* the name of this option's short option, if it is a -+ printable ascii character -+ ARG -- The name of this option's argument, if any -+ FLAGS -- Flags describing this option; some of them are: -+ OPTION_ARG_OPTIONAL -- The argument to this option is optional -+ OPTION_ALIAS -- This option is an alias for the -+ previous option -+ OPTION_HIDDEN -- Don't show this option in --help output -+ DOC -- A documentation string for this option, shown in --help output -+ -+ An options vector should be terminated by an option with all fields zero. */ -+ -+#include <stdlib.h> -+#include <argp.h> -+ -+const char *argp_program_version = -+ "argp-ex3 1.0"; -+const char *argp_program_bug_address = -+ "<bug-gnu-utils@@gnu.org>"; -+ -+/* Program documentation. */ -+static char doc[] = -+ "Argp example #3 -- a program with options and arguments using argp"; -+ -+/* A description of the arguments we accept. */ -+static char args_doc[] = "ARG1 ARG2"; -+ -+/* The options we understand. */ -+static struct argp_option options[] = { -+ {"verbose", 'v', 0, 0, "Produce verbose output" }, -+ {"quiet", 'q', 0, 0, "Don't produce any output" }, -+ {"silent", 's', 0, OPTION_ALIAS }, -+ {"output", 'o', "FILE", 0, -+ "Output to FILE instead of standard output" }, -+ { 0 } -+}; -+ -+/* Used by @code{main} to communicate with @code{parse_opt}. */ -+struct arguments -+{ -+ char *args[2]; /* @var{arg1} & @var{arg2} */ -+ int silent, verbose; -+ char *output_file; -+}; -+ -+/* Parse a single option. */ -+static error_t -+parse_opt (int key, char *arg, struct argp_state *state) -+{ -+ /* Get the @var{input} argument from @code{argp_parse}, which we -+ know is a pointer to our arguments structure. */ -+ struct arguments *arguments = state->input; -+ -+ switch (key) -+ { -+ case 'q': case 's': -+ arguments->silent = 1; -+ break; -+ case 'v': -+ arguments->verbose = 1; -+ break; -+ case 'o': -+ arguments->output_file = arg; -+ break; -+ -+ case ARGP_KEY_ARG: -+ if (state->arg_num >= 2) -+ /* Too many arguments. */ -+ argp_usage (state); -+ -+ arguments->args[state->arg_num] = arg; -+ -+ break; -+ -+ case ARGP_KEY_END: -+ if (state->arg_num < 2) -+ /* Not enough arguments. */ -+ argp_usage (state); -+ break; -+ -+ default: -+ return ARGP_ERR_UNKNOWN; -+ } -+ return 0; -+} -+ -+/* Our argp parser. */ -+static struct argp argp = { options, parse_opt, args_doc, doc }; -+ -+int main (int argc, char **argv) -+{ -+ struct arguments arguments; -+ -+ /* Default values. */ -+ arguments.silent = 0; -+ arguments.verbose = 0; -+ arguments.output_file = "-"; -+ -+ /* Parse our arguments; every option seen by @code{parse_opt} will -+ be reflected in @code{arguments}. */ -+ argp_parse (&argp, argc, argv, 0, 0, &arguments); -+ -+ printf ("ARG1 = %s\nARG2 = %s\nOUTPUT_FILE = %s\n" -+ "VERBOSE = %s\nSILENT = %s\n", -+ arguments.args[0], arguments.args[1], -+ arguments.output_file, -+ arguments.verbose ? "yes" : "no", -+ arguments.silent ? "yes" : "no"); -+ -+ exit (0); -+} -diff --git a/test/argp/argp-ex4.c b/test/argp/argp-ex4.c -new file mode 100644 -index 0000000..c77c7ef ---- /dev/null -+++ b/test/argp/argp-ex4.c -@@ -0,0 +1,167 @@ -+/* Argp example #4 -- a program with somewhat more complicated options */ -+ -+/* This program uses the same features as example 3, but has more -+ options, and somewhat more structure in the -help output. It -+ also shows how you can `steal' the remainder of the input -+ arguments past a certain point, for programs that accept a -+ list of items. It also shows the special argp KEY value -+ ARGP_KEY_NO_ARGS, which is only given if no non-option -+ arguments were supplied to the program. -+ -+ For structuring the help output, two features are used, -+ *headers* which are entries in the options vector with the -+ first four fields being zero, and a two part documentation -+ string (in the variable DOC), which allows documentation both -+ before and after the options; the two parts of DOC are -+ separated by a vertical-tab character ('\v', or '\013'). By -+ convention, the documentation before the options is just a -+ short string saying what the program does, and that afterwards -+ is longer, describing the behavior in more detail. All -+ documentation strings are automatically filled for output, -+ although newlines may be included to force a line break at a -+ particular point. All documentation strings are also passed to -+ the `gettext' function, for possible translation into the -+ current locale. */ -+ -+#include <stdlib.h> -+#include <error.h> -+#include <argp.h> -+ -+const char *argp_program_version = -+ "argp-ex4 1.0"; -+const char *argp_program_bug_address = -+ "<bug-gnu-utils@@prep.ai.mit.edu>"; -+ -+/* Program documentation. */ -+static char doc[] = -+ "Argp example #4 -- a program with somewhat more complicated\ -+options\ -+\vThis part of the documentation comes *after* the options;\ -+ note that the text is automatically filled, but it's possible\ -+ to force a line-break, e.g.\n<-- here."; -+ -+/* A description of the arguments we accept. */ -+static char args_doc[] = "ARG1 [STRING...]"; -+ -+/* Keys for options without short-options. */ -+#define OPT_ABORT 1 /* --abort */ -+ -+/* The options we understand. */ -+static struct argp_option options[] = { -+ {"verbose", 'v', 0, 0, "Produce verbose output" }, -+ {"quiet", 'q', 0, 0, "Don't produce any output" }, -+ {"silent", 's', 0, OPTION_ALIAS }, -+ {"output", 'o', "FILE", 0, -+ "Output to FILE instead of standard output" }, -+ -+ {0,0,0,0, "The following options should be grouped together:" }, -+ {"repeat", 'r', "COUNT", OPTION_ARG_OPTIONAL, -+ "Repeat the output COUNT (default 10) times"}, -+ {"abort", OPT_ABORT, 0, 0, "Abort before showing any output"}, -+ -+ { 0 } -+}; -+ -+/* Used by @code{main} to communicate with @code{parse_opt}. */ -+struct arguments -+{ -+ char *arg1; /* @var{arg1} */ -+ char **strings; /* [@var{string}@dots{}] */ -+ int silent, verbose, abort; /* @samp{-s}, @samp{-v}, @samp{--abort} */ -+ char *output_file; /* @var{file} arg to @samp{--output} */ -+ int repeat_count; /* @var{count} arg to @samp{--repeat} */ -+}; -+ -+/* Parse a single option. */ -+static error_t -+parse_opt (int key, char *arg, struct argp_state *state) -+{ -+ /* Get the @code{input} argument from @code{argp_parse}, which we -+ know is a pointer to our arguments structure. */ -+ struct arguments *arguments = state->input; -+ -+ switch (key) -+ { -+ case 'q': case 's': -+ arguments->silent = 1; -+ break; -+ case 'v': -+ arguments->verbose = 1; -+ break; -+ case 'o': -+ arguments->output_file = arg; -+ break; -+ case 'r': -+ arguments->repeat_count = arg ? atoi (arg) : 10; -+ break; -+ case OPT_ABORT: -+ arguments->abort = 1; -+ break; -+ -+ case ARGP_KEY_NO_ARGS: -+ argp_usage (state); -+ -+ case ARGP_KEY_ARG: -+ /* Here we know that @code{state->arg_num == 0}, since we -+ force argument parsing to end before any more arguments can -+ get here. */ -+ arguments->arg1 = arg; -+ -+ /* Now we consume all the rest of the arguments. -+ @code{state->next} is the index in @code{state->argv} of the -+ next argument to be parsed, which is the first @var{string} -+ we're interested in, so we can just use -+ @code{&state->argv[state->next]} as the value for -+ arguments->strings. -+ -+ @emph{In addition}, by setting @code{state->next} to the end -+ of the arguments, we can force argp to stop parsing here and -+ return. */ -+ arguments->strings = &state->argv[state->next]; -+ state->next = state->argc; -+ -+ break; -+ -+ default: -+ return ARGP_ERR_UNKNOWN; -+ } -+ return 0; -+} -+ -+/* Our argp parser. */ -+static struct argp argp = { options, parse_opt, args_doc, doc }; -+ -+int main (int argc, char **argv) -+{ -+ int i, j; -+ struct arguments arguments; -+ -+ /* Default values. */ -+ arguments.silent = 0; -+ arguments.verbose = 0; -+ arguments.output_file = "-"; -+ arguments.repeat_count = 1; -+ arguments.abort = 0; -+ -+ /* Parse our arguments; every option seen by @code{parse_opt} will be -+ reflected in @code{arguments}. */ -+ argp_parse (&argp, argc, argv, 0, 0, &arguments); -+ -+ if (arguments.abort) -+ error (10, 0, "ABORTED"); -+ -+ for (i = 0; i < arguments.repeat_count; i++) -+ { -+ printf ("ARG1 = %s\n", arguments.arg1); -+ printf ("STRINGS = "); -+ for (j = 0; arguments.strings[j]; j++) -+ printf (j == 0 ? "%s" : ", %s", arguments.strings[j]); -+ printf ("\n"); -+ printf ("OUTPUT_FILE = %s\nVERBOSE = %s\nSILENT = %s\n", -+ arguments.output_file, -+ arguments.verbose ? "yes" : "no", -+ arguments.silent ? "yes" : "no"); -+ } -+ -+ exit (0); -+} -diff --git a/test/argp/argp-test.c b/test/argp/argp-test.c -new file mode 100644 -index 0000000..b3d573b ---- /dev/null -+++ b/test/argp/argp-test.c -@@ -0,0 +1,209 @@ -+/* Test program for argp argument parser -+ Copyright (C) 1997 Free Software Foundation, Inc. -+ This file is part of the GNU C Library. -+ Written by Miles Bader <miles at gnu.ai.mit.edu>. -+ -+ The GNU C 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.1 of the License, or (at your option) any later version. -+ -+ The GNU C 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 the GNU C 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 <time.h> -+#include <string.h> -+#include <argp.h> -+ -+const char *argp_program_version = "argp-test 1.0"; -+ -+struct argp_option sub_options[] = -+{ -+ {"subopt1", 's', 0, 0, "Nested option 1"}, -+ {"subopt2", 'S', 0, 0, "Nested option 2"}, -+ -+ { 0, 0, 0, 0, "Some more nested options:", 10}, -+ {"subopt3", 'p', 0, 0, "Nested option 3"}, -+ -+ {"subopt4", 'q', 0, 0, "Nested option 4", 1}, -+ -+ {0} -+}; -+ -+static const char sub_args_doc[] = "STRING...\n-"; -+static const char sub_doc[] = "\vThis is the doc string from the sub-arg-parser."; -+ -+static error_t -+sub_parse_opt (int key, char *arg, struct argp_state *state) -+{ -+ switch (key) -+ { -+ case ARGP_KEY_NO_ARGS: -+ printf ("NO SUB ARGS\n"); -+ break; -+ case ARGP_KEY_ARG: -+ printf ("SUB ARG: %s\n", arg); -+ break; -+ -+ case 's' : case 'S': case 'p': case 'q': -+ printf ("SUB KEY %c\n", key); -+ break; -+ -+ default: -+ return ARGP_ERR_UNKNOWN; -+ } -+ return 0; -+} -+ -+static char * -+sub_help_filter (int key, const char *text, void *input) -+{ -+ if (key == ARGP_KEY_HELP_EXTRA) -+ return strdup ("This is some extra text from the sub parser (note that it \ -+is preceded by a blank line)."); -+ else -+ return (char *)text; -+} -+ -+static struct argp sub_argp = { -+ sub_options, sub_parse_opt, sub_args_doc, sub_doc, 0, sub_help_filter -+}; -+ -+/* Structure used to communicate with the parsing functions. */ -+struct params -+{ -+ unsigned foonly; /* Value parsed for foonly. */ -+ unsigned foonly_default; /* Default value for it. */ -+}; -+ -+#define OPT_PGRP 1 -+#define OPT_SESS 2 -+ -+struct argp_option options[] = -+{ -+ {"pid", 'p', "PID", 0, "List the process PID"}, -+ {"pgrp", OPT_PGRP,"PGRP",0, "List processes in the process group PGRP"}, -+ {"no-parent", 'P', 0, 0, "Include processes without parents"}, -+ {0, 'x', 0, OPTION_ALIAS}, -+ {"all-fields",'Q', 0, 0, "Don't elide unusable fields (normally" -+ " if there's some reason ps can't" -+ " print a field for any process, it's" -+ " removed from the output entirely)" }, -+ {"reverse", 'r', 0, 0, "Reverse the order of any sort"}, -+ {"gratuitously-long-reverse-option", 0, 0, OPTION_ALIAS}, -+ {"session", OPT_SESS,"SID", OPTION_ARG_OPTIONAL, -+ "Add the processes from the session" -+ " SID (which defaults to the sid of" -+ " the current process)" }, -+ -+ {0,0,0,0, "Here are some more options:"}, -+ {"foonly", 'f', "ZOT", OPTION_ARG_OPTIONAL, "Glork a foonly"}, -+ {"zaza", 'z', 0, 0, "Snit a zar"}, -+ -+ {0} -+}; -+ -+static const char args_doc[] = "STRING"; -+static const char doc[] = "Test program for argp." -+ "\vThis doc string comes after the options." -+ "\nHey! Some manual formatting!" -+ "\nThe current time is: %s"; -+ -+static void -+popt (int key, char *arg) -+{ -+ char buf[10]; -+ if (isprint (key)) -+ sprintf (buf, "%c", key); -+ else -+ sprintf (buf, "%d", key); -+ if (arg) -+ printf ("KEY %s: %s\n", buf, arg); -+ else -+ printf ("KEY %s\n", buf); -+} -+ -+static error_t -+parse_opt (int key, char *arg, struct argp_state *state) -+{ -+ struct params *params = state->input; -+ -+ switch (key) -+ { -+ case ARGP_KEY_NO_ARGS: -+ printf ("NO ARGS\n"); -+ break; -+ -+ case ARGP_KEY_ARG: -+ if (state->arg_num > 0) -+ return ARGP_ERR_UNKNOWN; /* Leave it for the sub-arg parser. */ -+ printf ("ARG: %s\n", arg); -+ break; -+ -+ case 'f': -+ if (arg) -+ params->foonly = atoi (arg); -+ else -+ params->foonly = params->foonly_default; -+ popt (key, arg); -+ break; -+ -+ case 'p': case 'P': case OPT_PGRP: case 'x': case 'Q': -+ case 'r': case OPT_SESS: case 'z': -+ popt (key, arg); -+ break; -+ -+ default: -+ return ARGP_ERR_UNKNOWN; -+ } -+ return 0; -+} -+ -+static char * -+help_filter (int key, const char *text, void *input) -+{ -+ char *new_text; -+ struct params *params = input; -+ -+ if (key == ARGP_KEY_HELP_POST_DOC && text) -+ { -+ time_t now = time (0); -+ asprintf (&new_text, text, ctime (&now)); -+ } -+ else if (key == 'f') -+ /* Show the default for the --foonly option. */ -+ asprintf (&new_text, "%s (ZOT defaults to %x)", -+ text, params->foonly_default); -+ else -+ new_text = (char *)text; -+ -+ return new_text; -+} -+ -+static struct argp_child argp_children[] = { { &sub_argp }, { 0 } }; -+static struct argp argp = { -+ options, parse_opt, args_doc, doc, argp_children, help_filter -+}; -+ -+int -+main (int argc, char **argv) -+{ -+ struct params params; -+ params.foonly = 0; -+ params.foonly_default = random (); -+ argp_parse (&argp, argc, argv, 0, 0, ¶ms); -+ printf ("After parsing: foonly = %x\n", params.foonly); -+ return 0; -+} -diff --git a/test/argp/bug-argp1.c b/test/argp/bug-argp1.c -new file mode 100644 -index 0000000..a28cf4b ---- /dev/null -+++ b/test/argp/bug-argp1.c -@@ -0,0 +1,26 @@ -+#include <argp.h> -+ -+ -+static const struct argp_option test_options[] = -+{ -+ { NULL, 'a', NULL, OPTION_DOC, NULL }, -+ { NULL, 'b', NULL, OPTION_DOC, NULL }, -+ { NULL, 0, NULL, 0, NULL } -+}; -+ -+static struct argp test_argp = -+{ -+ test_options -+}; -+ -+ -+static int -+do_test (int argc, char *argv[]) -+{ -+ int i; -+ argp_parse (&test_argp, argc, argv, 0, &i, NULL); -+ return 0; -+} -+ -+#define TEST_FUNCTION do_test (argc, argv) -+#include "../test-skeleton.c" -diff --git a/test/argp/tst-argp1.c b/test/argp/tst-argp1.c -new file mode 100644 -index 0000000..827daca ---- /dev/null -+++ b/test/argp/tst-argp1.c -@@ -0,0 +1,118 @@ -+/* Copyright (C) 2002, 2003 Free Software Foundation, Inc. -+ This file is part of the GNU C Library. -+ Contributed by Ulrich Drepper <drepper at redhat.com>, 2002. -+ -+ The GNU C 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.1 of the License, or (at your option) any later version. -+ -+ The GNU C 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 the GNU C Library; if not, write to the Free -+ Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA -+ 02111-1307 USA. */ -+ -+#include <argp.h> -+ -+ -+ -+ -+#define OPT_TO_THREAD 300 -+#define OPT_TO_PROCESS 301 -+#define OPT_SYNC_SIGNAL 302 -+#define OPT_SYNC_JOIN 303 -+#define OPT_TOPLEVEL 304 -+ -+ -+static const struct argp_option test_options[] = -+ { -+ { NULL, 0, NULL, 0, "\ -+This is a test for threads so we allow ther user to selection the number of \ -+threads which are used at any one time. Independently the total number of \ -+rounds can be selected. This is the total number of threads which will have \ -+run when the process terminates:" }, -+ { "threads", 't', "NUMBER", 0, "Number of threads used at once" }, -+ { "starts", 's', "NUMBER", 0, "Total number of working threads" }, -+ { "toplevel", OPT_TOPLEVEL, "NUMBER", 0, -+ "Number of toplevel threads which start the other threads; this \ -+implies --sync-join" }, -+ -+ { NULL, 0, NULL, 0, "\ -+Each thread can do one of two things: sleep or do work. The latter is 100% \ -+CPU bound. The work load is the probability a thread does work. All values \ -+from zero to 100 (inclusive) are valid. How often each thread repeats this \ -+can be determined by the number of rounds. The work cost determines how long \ -+each work session (not sleeping) takes. If it is zero a thread would \ -+effectively nothing. By setting the number of rounds to zero the thread \ -+does no work at all and pure thread creation times can be measured." }, -+ { "workload", 'w', "PERCENT", 0, "Percentage of time spent working" }, -+ { "workcost", 'c', "NUMBER", 0, -+ "Factor in the cost of each round of working" }, -+ { "rounds", 'r', "NUMBER", 0, "Number of rounds each thread runs" }, -+ -+ { NULL, 0, NULL, 0, "\ -+There are a number of different methods how thread creation can be \ -+synchronized. Synchronization is necessary since the number of concurrently \ -+running threads is limited." }, -+ { "sync-signal", OPT_SYNC_SIGNAL, NULL, 0, -+ "Synchronize using a signal (default)" }, -+ { "sync-join", OPT_SYNC_JOIN, NULL, 0, "Synchronize using pthread_join" }, -+ -+ { NULL, 0, NULL, 0, "\ -+One parameter for each threads execution is the size of the stack. If this \ -+parameter is not used the system's default stack size is used. If many \ -+threads are used the stack size should be chosen quite small." }, -+ { "stacksize", 'S', "BYTES", 0, "Size of threads stack" }, -+ { "guardsize", 'g', "BYTES", 0, -+ "Size of stack guard area; must fit into the stack" }, -+ -+ { NULL, 0, NULL, 0, "Signal options:" }, -+ { "to-thread", OPT_TO_THREAD, NULL, 0, "Send signal to main thread" }, -+ { "to-process", OPT_TO_PROCESS, NULL, 0, -+ "Send signal to process (default)" }, -+ -+ { NULL, 0, NULL, 0, "Administrative options:" }, -+ { "progress", 'p', NULL, 0, "Show signs of progress" }, -+ { "timing", 'T', NULL, 0, -+ "Measure time from startup to the last thread finishing" }, -+ { NULL, 0, NULL, 0, NULL } -+ }; -+ -+/* Prototype for option handler. */ -+static error_t parse_opt (int key, char *arg, struct argp_state *state); -+ -+/* Data structure to communicate with argp functions. */ -+static struct argp argp = -+{ -+ test_options, parse_opt -+}; -+ -+ -+static int -+do_test (void) -+{ -+ int argc = 2; -+ char *argv[3] = { (char *) "tst-argp1", (char *) "--help", NULL }; -+ int remaining; -+ -+ /* Parse and process arguments. */ -+ argp_parse (&argp, argc, argv, 0, &remaining, NULL); -+ -+ return 0; -+} -+ -+ -+/* Handle program arguments. */ -+static error_t -+parse_opt (int key, char *arg, struct argp_state *state) -+{ -+ return ARGP_ERR_UNKNOWN; -+} -+ -+#define TEST_FUNCTION do_test () -+#include "../test-skeleton.c" -diff --git a/test/argp/tst-argp2.c b/test/argp/tst-argp2.c -new file mode 100644 -index 0000000..705cdca ---- /dev/null -+++ b/test/argp/tst-argp2.c -@@ -0,0 +1,101 @@ -+/* Copyright (C) 2007 Free Software Foundation, Inc. -+ This file is part of the GNU C Library. -+ Contributed by Jakub Jelinek <jakub at redhat.com>, 2007. -+ -+ The GNU C 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.1 of the License, or (at your option) any later version. -+ -+ The GNU C 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 the GNU C Library; if not, write to the Free -+ Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA -+ 02111-1307 USA. */ -+ -+#include <argp.h> -+ -+static const struct argp_option opt1[] = -+ { -+ { "opt1", '1', "NUMBER", 0, "Option 1" }, -+ { NULL, 0, NULL, 0, NULL } -+ }; -+ -+static const struct argp_option opt2[] = -+ { -+ { "opt2", '2', "NUMBER", 0, "Option 2" }, -+ { NULL, 0, NULL, 0, NULL } -+ }; -+ -+static const struct argp_option opt3[] = -+ { -+ { "opt3", '3', "NUMBER", 0, "Option 3" }, -+ { NULL, 0, NULL, 0, NULL } -+ }; -+ -+static const struct argp_option opt4[] = -+ { -+ { "opt4", '4', "NUMBER", 0, "Option 4" }, -+ { NULL, 0, NULL, 0, NULL } -+ }; -+ -+static const struct argp_option opt5[] = -+ { -+ { "opt5", '5', "NUMBER", 0, "Option 5" }, -+ { NULL, 0, NULL, 0, NULL } -+ }; -+ -+static struct argp argp5 = -+ { -+ opt5, NULL, "args doc5", "doc5", NULL, NULL, NULL -+ }; -+ -+static struct argp argp4 = -+ { -+ opt4, NULL, "args doc4", "doc4", NULL, NULL, NULL -+ }; -+ -+static struct argp argp3 = -+ { -+ opt3, NULL, "args doc3", "doc3", NULL, NULL, NULL -+ }; -+ -+static struct argp_child children2[] = -+ { -+ { &argp4, 0, "child3", 3 }, -+ { &argp5, 0, "child4", 4 }, -+ { NULL, 0, NULL, 0 } -+ }; -+ -+static struct argp argp2 = -+ { -+ opt2, NULL, "args doc2", "doc2", children2, NULL, NULL -+ }; -+ -+static struct argp_child children1[] = -+ { -+ { &argp2, 0, "child1", 1 }, -+ { &argp3, 0, "child2", 2 }, -+ { NULL, 0, NULL, 0 } -+ }; -+ -+static struct argp argp1 = -+ { -+ opt1, NULL, "args doc1", "doc1", children1, NULL, NULL -+ }; -+ -+ -+static int -+do_test (void) -+{ -+ argp_help (&argp1, stdout, ARGP_HELP_LONG, (char *) "tst-argp2"); -+ return 0; -+} -+ -+ -+#define TEST_FUNCTION do_test () -+#include "../test-skeleton.c" --- -2.1.4 - diff --git a/yocto-poky/meta/recipes-core/uclibc/uclibc-git/0004-Dont-support-localised-optimizations-this-helps-to-h.patch b/yocto-poky/meta/recipes-core/uclibc/uclibc-git/0004-Dont-support-localised-optimizations-this-helps-to-h.patch deleted file mode 100644 index 629e13c76..000000000 --- a/yocto-poky/meta/recipes-core/uclibc/uclibc-git/0004-Dont-support-localised-optimizations-this-helps-to-h.patch +++ /dev/null @@ -1,30 +0,0 @@ -From 31785c544abe8b215dbb2264fb11ee7051515797 Mon Sep 17 00:00:00 2001 -From: Khem Raj <raj.khem@gmail.com> -Date: Sun, 16 Aug 2015 20:58:59 -0700 -Subject: [PATCH 4/7] Dont support localised optimizations this helps to have a - global -O level - -Signed-off-by: Khem Raj <raj.khem@gmail.com> ---- -Upstream-Status: Pending - - libpthread/nptl/pthread_mutex_timedlock.c | 2 ++ - 1 file changed, 2 insertions(+) - -diff --git a/libpthread/nptl/pthread_mutex_timedlock.c b/libpthread/nptl/pthread_mutex_timedlock.c -index 04187f6..f56f6c5 100644 ---- a/libpthread/nptl/pthread_mutex_timedlock.c -+++ b/libpthread/nptl/pthread_mutex_timedlock.c -@@ -28,7 +28,9 @@ - * error: can't find a register in class ‘GENERAL_REGS’ while reloading ‘asm’ - */ - int -+#ifndef __OPTIMIZE__ - attribute_optimize("Os") -+#endif - pthread_mutex_timedlock ( - pthread_mutex_t *mutex, - const struct timespec *abstime) --- -2.1.4 - diff --git a/yocto-poky/meta/recipes-core/uclibc/uclibc-git/0005-Always-use-O2-for-compiling-fork.c.patch b/yocto-poky/meta/recipes-core/uclibc/uclibc-git/0005-Always-use-O2-for-compiling-fork.c.patch deleted file mode 100644 index ad9b246ab..000000000 --- a/yocto-poky/meta/recipes-core/uclibc/uclibc-git/0005-Always-use-O2-for-compiling-fork.c.patch +++ /dev/null @@ -1,33 +0,0 @@ -From 883debc22e30a947fe5858cc07ee5aebd3d07a2e Mon Sep 17 00:00:00 2001 -From: Khem Raj <raj.khem@gmail.com> -Date: Sun, 16 Aug 2015 20:59:56 -0700 -Subject: [PATCH 5/7] Always use -O2 for compiling fork.c - -When compiling in thumb mode for arm with -Os gcc gives up since it can -not find registers to spill. So we use -O2 option for compiling fork.c -It may be addressable in gcc. - -Signed-off-by: Khem Raj <raj.khem@gmail.com> ---- -Upstream-Status: Pending - - libpthread/nptl/sysdeps/unix/sysv/linux/arm/Makefile.arch | 6 ++++++ - 1 file changed, 6 insertions(+) - -diff --git a/libpthread/nptl/sysdeps/unix/sysv/linux/arm/Makefile.arch b/libpthread/nptl/sysdeps/unix/sysv/linux/arm/Makefile.arch -index 0ea0b29..0767e9c 100644 ---- a/libpthread/nptl/sysdeps/unix/sysv/linux/arm/Makefile.arch -+++ b/libpthread/nptl/sysdeps/unix/sysv/linux/arm/Makefile.arch -@@ -21,3 +21,9 @@ ASFLAGS-pt-vfork.S = -marm - CFLAGS-OMIT-pt-vfork.S = -mthumb - ASFLAGS-vfork.S = -marm - CFLAGS-OMIT-vfork.S = -mthumb -+ -+# For arm fork.c does not compile with -Os when compiling -+# in thumb1 mode -+ifeq ($(COMPILE_IN_THUMB_MODE),y) -+CFLAGS-fork.c = -O2 -+endif --- -2.1.4 - diff --git a/yocto-poky/meta/recipes-core/uclibc/uclibc-git/0006-ldso-limited-support-for-ORIGIN-in-rpath.patch b/yocto-poky/meta/recipes-core/uclibc/uclibc-git/0006-ldso-limited-support-for-ORIGIN-in-rpath.patch deleted file mode 100644 index f0d87371b..000000000 --- a/yocto-poky/meta/recipes-core/uclibc/uclibc-git/0006-ldso-limited-support-for-ORIGIN-in-rpath.patch +++ /dev/null @@ -1,233 +0,0 @@ -From b40c129ed2d53b69463883a5422dd4a012a398f9 Mon Sep 17 00:00:00 2001 -From: Junling Zheng <zhengjunling@huawei.com> -Date: Fri, 3 Apr 2015 05:02:27 +0000 -Subject: [PATCH 6/7] ldso: limited support for $ORIGIN in rpath -MIME-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit - -Derived from: -http://lists.busybox.net/pipermail/uclibc/2011-March/045003.html - -However, the above patch introduced '_dl_strchr' in ldso/ldso/dl-elf.c, -and caused the following undefined referencing compiling error: - - | .../libdl.a(libdl.os): In function `search_for_named_library': - | .../dl-elf.c:156: undefined reference to `_dl_strchr' - | collect2: error: ld returned 1 exit status - -This problem would be reproduced through compiling gdb in static mode -using uclibc. - -So, add the definition of '_dl_strchr' to fix it. The '_dl_strstr' is -added as well. - -Upstream-Status: Submitted - -Signed-off-by: Timo Teräs <timo.teras at iki.fi> -Signed-off-by: Junling Zheng <zhengjunling@huawei.com> -Signed-off-by: Khem Raj <raj.khem@gmail.com> ---- -Upstream-Status: Pending - - ldso/include/dl-string.h | 2 ++ - ldso/ldso/dl-elf.c | 79 +++++++++++++++++++++++++----------------------- - ldso/ldso/ldso.c | 18 +++++++++-- - 3 files changed, 59 insertions(+), 40 deletions(-) - -diff --git a/ldso/include/dl-string.h b/ldso/include/dl-string.h -index aacad10..14ae617 100644 ---- a/ldso/include/dl-string.h -+++ b/ldso/include/dl-string.h -@@ -204,7 +204,9 @@ static __always_inline char * _dl_get_last_path_component(char *path) - # define _dl_strcat strcat - # define _dl_strcpy strcpy - # define _dl_strcmp strcmp -+# define _dl_strchr strchr - # define _dl_strrchr strrchr -+# define _dl_strstr strstr - # define _dl_memcpy memcpy - # define _dl_memcmp memcmp - # define _dl_memset memset -diff --git a/ldso/ldso/dl-elf.c b/ldso/ldso/dl-elf.c -index 5631905..6ab7afe 100644 ---- a/ldso/ldso/dl-elf.c -+++ b/ldso/ldso/dl-elf.c -@@ -133,56 +133,60 @@ _dl_protect_relro (struct elf_resolve *l) - * in uClibc/ldso/util/ldd.c */ - static struct elf_resolve * - search_for_named_library(const char *name, unsigned rflags, const char *path_list, -- struct dyn_elf **rpnt) -+ struct dyn_elf **rpnt, const char* origin) - { -- char *path, *path_n, *mylibname; -+ char *mylibname; -+ const char *p, *pn; - struct elf_resolve *tpnt; -- int done; -+ int plen; - - if (path_list==NULL) - return NULL; - -- /* We need a writable copy of this string, but we don't -- * need this allocated permanently since we don't want -- * to leak memory, so use alloca to put path on the stack */ -- done = _dl_strlen(path_list); -- path = alloca(done + 1); -- - /* another bit of local storage */ - mylibname = alloca(2050); - -- _dl_memcpy(path, path_list, done+1); -- - /* Unlike ldd.c, don't bother to eliminate double //s */ - - /* Replace colons with zeros in path_list */ - /* : at the beginning or end of path maps to CWD */ - /* :: anywhere maps CWD */ - /* "" maps to CWD */ -- done = 0; -- path_n = path; -- do { -- if (*path == 0) { -- *path = ':'; -- done = 1; -+ for (p = path_list; p != NULL; p = pn) { -+ pn = _dl_strchr(p + 1, ':'); -+ if (pn != NULL) { -+ plen = pn - p; -+ pn++; -+ } else -+ plen = _dl_strlen(p); -+ -+ if (plen >= 7 && _dl_memcmp(p, "$ORIGIN", 7) == 0) { -+ int olen; -+ if (rflags && plen != 7) -+ continue; -+ if (origin == NULL) -+ continue; -+ for (olen = _dl_strlen(origin) - 1; olen >= 0 && origin[olen] != '/'; olen--) -+ ; -+ if (olen <= 0) -+ continue; -+ _dl_memcpy(&mylibname[0], origin, olen); -+ _dl_memcpy(&mylibname[olen], p + 7, plen - 7); -+ mylibname[olen + plen - 7] = 0; -+ } else if (plen != 0) { -+ _dl_memcpy(mylibname, p, plen); -+ mylibname[plen] = 0; -+ } else { -+ _dl_strcpy(mylibname, "."); - } -- if (*path == ':') { -- *path = 0; -- if (*path_n) -- _dl_strcpy(mylibname, path_n); -- else -- _dl_strcpy(mylibname, "."); /* Assume current dir if empty path */ -- _dl_strcat(mylibname, "/"); -- _dl_strcat(mylibname, name); -+ _dl_strcat(mylibname, "/"); -+ _dl_strcat(mylibname, name); - #ifdef __LDSO_SAFE_RUNPATH__ -- if (*mylibname == '/') -+ if (*mylibname == '/') - #endif -- if ((tpnt = _dl_load_elf_shared_library(rflags, rpnt, mylibname)) != NULL) -- return tpnt; -- path_n = path+1; -- } -- path++; -- } while (!done); -+ if ((tpnt = _dl_load_elf_shared_library(rflags, rpnt, mylibname)) != NULL) -+ return tpnt; -+ } - return NULL; - } - -@@ -234,7 +238,8 @@ struct elf_resolve *_dl_load_shared_library(unsigned rflags, struct dyn_elf **rp - if (pnt) { - pnt += (unsigned long) tpnt->dynamic_info[DT_STRTAB]; - _dl_if_debug_dprint("\tsearching RPATH='%s'\n", pnt); -- if ((tpnt1 = search_for_named_library(libname, rflags, pnt, rpnt)) != NULL) -+ if ((tpnt1 = search_for_named_library(libname, rflags, pnt, rpnt, -+ tpnt->libname)) != NULL) - return tpnt1; - } - #endif -@@ -243,7 +248,7 @@ struct elf_resolve *_dl_load_shared_library(unsigned rflags, struct dyn_elf **rp - /* Check in LD_{ELF_}LIBRARY_PATH, if specified and allowed */ - if (_dl_library_path) { - _dl_if_debug_dprint("\tsearching LD_LIBRARY_PATH='%s'\n", _dl_library_path); -- if ((tpnt1 = search_for_named_library(libname, rflags, _dl_library_path, rpnt)) != NULL) -+ if ((tpnt1 = search_for_named_library(libname, rflags, _dl_library_path, rpnt, NULL)) != NULL) - { - return tpnt1; - } -@@ -257,7 +262,7 @@ struct elf_resolve *_dl_load_shared_library(unsigned rflags, struct dyn_elf **rp - if (pnt) { - pnt += (unsigned long) tpnt->dynamic_info[DT_STRTAB]; - _dl_if_debug_dprint("\tsearching RUNPATH='%s'\n", pnt); -- if ((tpnt1 = search_for_named_library(libname, rflags, pnt, rpnt)) != NULL) -+ if ((tpnt1 = search_for_named_library(libname, rflags, pnt, rpnt, NULL)) != NULL) - return tpnt1; - } - #endif -@@ -291,7 +296,7 @@ struct elf_resolve *_dl_load_shared_library(unsigned rflags, struct dyn_elf **rp - /* Look for libraries wherever the shared library loader - * was installed */ - _dl_if_debug_dprint("\tsearching ldso dir='%s'\n", _dl_ldsopath); -- tpnt1 = search_for_named_library(libname, rflags, _dl_ldsopath, rpnt); -+ tpnt1 = search_for_named_library(libname, rflags, _dl_ldsopath, rpnt, NULL); - if (tpnt1 != NULL) - return tpnt1; - #endif -@@ -304,7 +309,7 @@ struct elf_resolve *_dl_load_shared_library(unsigned rflags, struct dyn_elf **rp - #ifndef __LDSO_CACHE_SUPPORT__ - ":" UCLIBC_RUNTIME_PREFIX "usr/X11R6/lib" - #endif -- , rpnt); -+ , rpnt, NULL); - if (tpnt1 != NULL) - return tpnt1; - -diff --git a/ldso/ldso/ldso.c b/ldso/ldso/ldso.c -index f38f9e3..3812908 100644 ---- a/ldso/ldso/ldso.c -+++ b/ldso/ldso/ldso.c -@@ -402,6 +402,20 @@ static ptrdiff_t _dl_build_local_scope (struct elf_resolve **list, - p += _dl_build_local_scope (p, q->tpnt); - return p - list; - } -+ -+static void _dl_setup_progname(const char *argv0) -+{ -+ char image[PATH_MAX]; -+ ssize_t s; -+ -+ s = _dl_readlink("/proc/self/exe", image, sizeof(image)); -+ if (s > 0 && image[0] == '/') { -+ image[s] = 0; -+ _dl_progname = _dl_strdup(image); -+ } else if (argv0) { -+ _dl_progname = argv0; -+ } -+} - - void *_dl_get_ready_to_run(struct elf_resolve *tpnt, DL_LOADADDR_TYPE load_addr, - ElfW(auxv_t) auxvt[AT_EGID + 1], char **envp, char **argv -@@ -454,9 +468,7 @@ void *_dl_get_ready_to_run(struct elf_resolve *tpnt, DL_LOADADDR_TYPE load_addr, - * been fixed up by now. Still no function calls outside of this - * library, since the dynamic resolver is not yet ready. - */ -- if (argv[0]) { -- _dl_progname = argv[0]; -- } -+ _dl_setup_progname(argv[0]); - - #ifdef __DSBT__ - _dl_ldso_dsbt = (void *)tpnt->dynamic_info[DT_DSBT_BASE_IDX]; --- -2.1.4 - diff --git a/yocto-poky/meta/recipes-core/uclibc/uclibc-git/0007-nptl-atfork-Hide-pthread_atfork-in-shared-versions.patch b/yocto-poky/meta/recipes-core/uclibc/uclibc-git/0007-nptl-atfork-Hide-pthread_atfork-in-shared-versions.patch deleted file mode 100644 index ee932c380..000000000 --- a/yocto-poky/meta/recipes-core/uclibc/uclibc-git/0007-nptl-atfork-Hide-pthread_atfork-in-shared-versions.patch +++ /dev/null @@ -1,35 +0,0 @@ -From 90516af9f776f9c2835b47fc52775dcb307a85ac Mon Sep 17 00:00:00 2001 -From: Khem Raj <raj.khem@gmail.com> -Date: Sat, 23 Jun 2012 15:59:01 -0700 -Subject: [PATCH 7/7] nptl/atfork: Hide pthread_atfork in shared versions - -Signed-off-by: Khem Raj <raj.khem@gmail.com> -Upstream-Status: Pending ---- - libpthread/nptl/Makefile.in | 3 ++- - 1 file changed, 2 insertions(+), 1 deletion(-) - -diff --git a/libpthread/nptl/Makefile.in b/libpthread/nptl/Makefile.in -index 55eeba2..8cb8fa9 100644 ---- a/libpthread/nptl/Makefile.in -+++ b/libpthread/nptl/Makefile.in -@@ -16,6 +16,7 @@ libc-shared-routines-y = forward.c libc-cancellation.c - libc-static-routines-y = alloca_cutoff.c libc-cancellation.c - libpthread-shared-only-routines-y = version.c - libpthread-static-only-routines-y = pthread_atfork.c -+ - libpthread-routines- += $(notdir $(wildcard $(libpthread_DIR)/gen_*.c)) # dummy generated files - libpthread-routines- += allocatestack.c # dummy included by pthread_create.c - libpthread-routines- += pthread_mutex_getprioceiling.c pthread_mutex_setprioceiling.c # XXX: delete those or use them! -@@ -201,7 +202,7 @@ CFLAGS-msgsnd.c = -fexceptions -fasynchronous-unwind-tables - CFLAGS-tcdrain.c = -fexceptions -fasynchronous-unwind-tables - - CFLAGS-pt-system.c = -fexceptions -I$(top_srcdir)libc/stdlib -- -+CFLAGS-pthread_atfork.c = -DNOT_IN_libc - # - # The rest of this file is uClibc specific. - # --- -2.1.4 - diff --git a/yocto-poky/meta/recipes-core/uclibc/uclibc-git/CVE-2016-2224.patch b/yocto-poky/meta/recipes-core/uclibc/uclibc-git/CVE-2016-2224.patch deleted file mode 100644 index 218b60a85..000000000 --- a/yocto-poky/meta/recipes-core/uclibc/uclibc-git/CVE-2016-2224.patch +++ /dev/null @@ -1,49 +0,0 @@ -From 16719c1a7078421928e6d31dd1dec574825ef515 Mon Sep 17 00:00:00 2001 -From: Waldemar Brodkorb <wbx@openadk.org> -Date: Sun, 17 Jan 2016 15:47:22 +0100 -Subject: [PATCH] Do not follow compressed items forever. - -It is possible to get stuck in an infinite loop when receiving a -specially crafted DNS reply. Exit the loop after a number of iteration -and consider the packet invalid. - -Signed-off-by: Daniel Fahlgren <daniel@fahlgren.se> -Signed-off-by: Waldemar Brodkorb <wbx@uclibc-ng.org> - -Upstream-status: Backport -http://repo.or.cz/uclibc-ng.git/commit/16719c1a7078421928e6d31dd1dec574825ef515 - -CVE: CVE-2016-2224 -Signed-off-by: Armin Kuster <akuster@mvista.com> - ---- - libc/inet/resolv.c | 5 ++++- - 1 file changed, 4 insertions(+), 1 deletion(-) - -Index: git/libc/inet/resolv.c -=================================================================== ---- git.orig/libc/inet/resolv.c -+++ git/libc/inet/resolv.c -@@ -666,11 +666,12 @@ int __decode_dotted(const unsigned char - bool measure = 1; - unsigned total = 0; - unsigned used = 0; -+ unsigned maxiter = 256; - - if (!packet) - return -1; - -- while (1) { -+ while (--maxiter) { - if (offset >= packet_len) - return -1; - b = packet[offset++]; -@@ -707,6 +708,8 @@ int __decode_dotted(const unsigned char - else - dest[used++] = '\0'; - } -+ if (!maxiter) -+ return -1; - - /* The null byte must be counted too */ - if (measure) diff --git a/yocto-poky/meta/recipes-core/uclibc/uclibc-git/CVE-2016-2225.patch b/yocto-poky/meta/recipes-core/uclibc/uclibc-git/CVE-2016-2225.patch deleted file mode 100644 index 0217e4bf5..000000000 --- a/yocto-poky/meta/recipes-core/uclibc/uclibc-git/CVE-2016-2225.patch +++ /dev/null @@ -1,32 +0,0 @@ -From bb01edff0377f2585ce304ecbadcb7b6cde372ac Mon Sep 17 00:00:00 2001 -From: Waldemar Brodkorb <wbx@openadk.org> -Date: Mon, 25 Jan 2016 21:11:34 +0100 -Subject: [PATCH] Make sure to always terminate decoded string - -Write a terminating '\0' to dest when the first byte of the encoded data -is 0. This corner case was previously missed. - -Signed-off-by: Daniel Fahlgren <daniel@fahlgren.se> -Signed-off-by: Waldemar Brodkorb <wbx@uclibc-ng.org> - -Upstream-Status: Backport -http://repo.or.cz/uclibc-ng.git/commit/bb01edff0377f2585ce304ecbadcb7b6cde372ac -CVE: CVE-2016-2225 -Signed-off-by: Armin Kuster <akuster@mvista.com> - ---- - libc/inet/resolv.c | 1 + - 1 file changed, 1 insertion(+) - -Index: git/libc/inet/resolv.c -=================================================================== ---- git.orig/libc/inet/resolv.c -+++ git/libc/inet/resolv.c -@@ -671,6 +671,7 @@ int __decode_dotted(const unsigned char - if (!packet) - return -1; - -+ dest[0] = '\0'; - while (--maxiter) { - if (offset >= packet_len) - return -1; diff --git a/yocto-poky/meta/recipes-core/uclibc/uclibc-git/uClibc.distro b/yocto-poky/meta/recipes-core/uclibc/uclibc-git/uClibc.distro index 3827b66e9..7785ce8bf 100644 --- a/yocto-poky/meta/recipes-core/uclibc/uclibc-git/uClibc.distro +++ b/yocto-poky/meta/recipes-core/uclibc/uclibc-git/uClibc.distro @@ -79,11 +79,11 @@ UCLIBC_HAS_GLIBC_CUSTOM_PRINTF=y UCLIBC_PRINTF_SCANF_POSITIONAL_ARGS=9 UCLIBC_HAS_SCANF_GLIBC_A_FLAG=y # UCLIBC_HAS_STDIO_BUFSIZ_NONE is not set -UCLIBC_HAS_STDIO_BUFSIZ_256=y +# UCLIBC_HAS_STDIO_BUFSIZ_256 is not set # UCLIBC_HAS_STDIO_BUFSIZ_512 is not set # UCLIBC_HAS_STDIO_BUFSIZ_1024 is not set # UCLIBC_HAS_STDIO_BUFSIZ_2048 is not set -# UCLIBC_HAS_STDIO_BUFSIZ_4096 is not set +UCLIBC_HAS_STDIO_BUFSIZ_4096=y # UCLIBC_HAS_STDIO_BUFSIZ_8192 is not set UCLIBC_HAS_STDIO_BUILTIN_BUFFER_NONE=y # UCLIBC_HAS_STDIO_BUILTIN_BUFFER_4 is not set diff --git a/yocto-poky/meta/recipes-core/uclibc/uclibc-package.inc b/yocto-poky/meta/recipes-core/uclibc/uclibc-package.inc index c1815f9a3..439f84e4f 100644 --- a/yocto-poky/meta/recipes-core/uclibc/uclibc-package.inc +++ b/yocto-poky/meta/recipes-core/uclibc/uclibc-package.inc @@ -1,6 +1,6 @@ # Ensure the uclibc-dev package is processed before uclibc-staticdev to allow # *_nonshared.a libraries to be packaged in the uclibc-dev package. -PACKAGES = "ldd uclibc-utils-dbg uclibc-utils uclibc-gconv uclibc-thread-db uclibc-argp uclibc-backtrace uclibc-libcrypt uclibc-libintl uclibc-libnsl uclibc-libresolv uclibc-libm uclibc-libdl uclibc-libutil uclibc-libpthread uclibc-librt ${PN}-dbg ${PN}-dev ${PN}-staticdev ${PN}-doc ${PN}" +PACKAGES = "ldd uclibc-utils uclibc-gconv uclibc-thread-db uclibc-argp uclibc-backtrace uclibc-libcrypt uclibc-libintl uclibc-libnsl uclibc-libresolv uclibc-libm uclibc-libdl uclibc-libutil uclibc-libpthread uclibc-librt ${PN}-dbg ${PN}-dev ${PN}-staticdev ${PN}-doc ${PN}" FILES_uclibc-libcrypt = "${base_libdir}/libcrypt*.so.* ${base_libdir}/libcrypt-*.so" FILES_uclibc-libintl = "${base_libdir}/libintl*.so.* ${base_libdir}/libintl-*.so" @@ -14,7 +14,6 @@ FILES_uclibc-librt = "${base_libdir}/librt*.so.* ${base_libdir}/librt-*.so" FILES_ldd = "${bindir}/ldd" FILES_uclibc-utils = "${bindir} ${sbindir}" -FILES_uclibc-utils-dbg += "${bindir}/.debug ${sbindir}/.debug" FILES_uclibc-gconv = "${libdir}/gconv" FILES_uclibc-thread-db = "${base_libdir}/libthread_db*" FILES_uclibc-argp = "${base_libdir}/libuargp-*.so ${base_libdir}/libuargp*.so.*" diff --git a/yocto-poky/meta/recipes-core/uclibc/uclibc.inc b/yocto-poky/meta/recipes-core/uclibc/uclibc.inc index 533aa3d95..1d42284fb 100644 --- a/yocto-poky/meta/recipes-core/uclibc/uclibc.inc +++ b/yocto-poky/meta/recipes-core/uclibc/uclibc.inc @@ -13,7 +13,6 @@ SECTION = "libs" LIC_FILES_CHKSUM = "file://COPYING.LIB;md5=a6f89e2100d9b6cdffcea4f398e37343 \ file://COPYING.LIB.boilerplate;md5=aaddeadcddeb918297e0e4afc52ce46f \ file://${S}/test/regex/testregex.c;beginline=1;endline=31;md5=234efb227d0a40677f895e4a1e26e960" -PR = "r9" require uclibc-config.inc @@ -40,6 +39,12 @@ COMPATIBLE_HOST = ".*-uclibc.*" INHIBIT_DEFAULT_DEPS = "1" +# There appears to be a parallel race in uclibc: +# GEN /extra/locale/locale_collate.h +# xargs: ../..//extra/locale/gen_collate: Text file busy +# make[1]: *** [../..//extra/locale/locale_collate.h] Error 126 +PARALLEL_MAKE = "" + # do_stage barfs on a CC with whitespace, therefore put the 'HOST_CC_ARCH' in # the CFLAGS (when building the utils). OEMAKE_NO_CC = "'STRIPTOOL=true' 'LD=${LD}'" @@ -57,13 +62,8 @@ export V="2" # -O<n> -fno-omit-frame-pointer ends up with GCC ICE on thumb as reported # http://gcc.gnu.org/bugzilla/show_bug.cgi?id=44860 # -CFLAGS_arm := "${@oe_filter_out('-fno-omit-frame-pointer', '${CFLAGS}', d)}" -UCLIBC_EXTRA_CFLAGS := "${@oe_filter_out('(-I\S+|-i\S+)', '${CFLAGS}', d)}" - -do_compile_prepend () { - unset CFLAGS CPPFLAGS CXXFLAGS LDFLAGS - oe_runmake pregen -} +CFLAGS_remove_arm = "-fno-omit-frame-pointer" +UCLIBC_EXTRA_CFLAGS = "${@oe_filter_out('(-I\S+|-i\S+)', '${CFLAGS}', d)}" configmangle = '/^KERNEL_HEADERS/d; \ /^RUNTIME_PREFIX/d; \ @@ -71,7 +71,7 @@ configmangle = '/^KERNEL_HEADERS/d; \ /^SHARED_LIB_LOADER_PREFIX/d; \ /^UCLIBC_EXTRA_CFLAGS/d; \ s,.*UCLIBC_HAS_WCHAR.*,UCLIBC_HAS_WCHAR=y,g; \ - ${@["","s,.*COMPILE_IN_THUMB_MODE.*,COMPILE_IN_THUMB_MODE=y,;"][d.getVar("ARM_INSTRUCTION_SET", True) != "arm"]} \ + ${@["","s,.*COMPILE_IN_THUMB_MODE.*,COMPILE_IN_THUMB_MODE=y,;"][d.getVar("ARM_INSTRUCTION_SET", True) == "thumb"]} \ ${@["","s,.*UCLIBC_HAS_LOCALE.*,UCLIBC_HAS_LOCALE=y,;"][d.getVar("USE_NLS", True) == "yes"]} \ ${@["","s,.*LDSO_GNU_HASH_SUPPORT.*,# LDSO_GNU_HASH_SUPPORT is not set,;"][d.getVar("TARGET_ARCH", True) in ['mips', 'mipsel', 'mips64', 'mips64el', 'avr32']]} \ /^CROSS/d; \ @@ -82,8 +82,8 @@ configmangle = '/^KERNEL_HEADERS/d; \ /HAS_FPU/d; \ ${@["","s,.*MULTILIB_DIR.*,MULTILIB_DIR=\"${baselib}\",;"][d.getVar("baselib", True) != "lib"]} \ ' -OE_FEATURES := "${@features_to_uclibc_conf(d)}" -OE_DEL := "${@features_to_uclibc_del(d)}" +OE_FEATURES = "${@features_to_uclibc_conf(d)}" +OE_DEL = "${@features_to_uclibc_del(d)}" python () { if "${OE_DEL}": d.setVar('configmangle_append', "${OE_DEL}" + "\n") diff --git a/yocto-poky/meta/recipes-core/udev/udev/devfs-udev.rules b/yocto-poky/meta/recipes-core/udev/eudev/devfs-udev.rules index 0ba1ad4e7..0ba1ad4e7 100644 --- a/yocto-poky/meta/recipes-core/udev/udev/devfs-udev.rules +++ b/yocto-poky/meta/recipes-core/udev/eudev/devfs-udev.rules diff --git a/yocto-poky/meta/recipes-core/udev/udev/init b/yocto-poky/meta/recipes-core/udev/eudev/init index 0ab028b39..0ab028b39 100644 --- a/yocto-poky/meta/recipes-core/udev/udev/init +++ b/yocto-poky/meta/recipes-core/udev/eudev/init diff --git a/yocto-poky/meta/recipes-core/udev/udev/links.conf b/yocto-poky/meta/recipes-core/udev/eudev/links.conf index 8fff922db..8fff922db 100644 --- a/yocto-poky/meta/recipes-core/udev/udev/links.conf +++ b/yocto-poky/meta/recipes-core/udev/eudev/links.conf diff --git a/yocto-poky/meta/recipes-core/udev/udev/local.rules b/yocto-poky/meta/recipes-core/udev/eudev/local.rules index d502cdd6b..d502cdd6b 100644 --- a/yocto-poky/meta/recipes-core/udev/udev/local.rules +++ b/yocto-poky/meta/recipes-core/udev/eudev/local.rules diff --git a/yocto-poky/meta/recipes-core/udev/udev/permissions.rules b/yocto-poky/meta/recipes-core/udev/eudev/permissions.rules index 205b73329..205b73329 100644 --- a/yocto-poky/meta/recipes-core/udev/udev/permissions.rules +++ b/yocto-poky/meta/recipes-core/udev/eudev/permissions.rules diff --git a/yocto-poky/meta/recipes-core/udev/udev/run.rules b/yocto-poky/meta/recipes-core/udev/eudev/run.rules index 75d71375b..75d71375b 100644 --- a/yocto-poky/meta/recipes-core/udev/udev/run.rules +++ b/yocto-poky/meta/recipes-core/udev/eudev/run.rules diff --git a/yocto-poky/meta/recipes-core/udev/udev/udev-cache b/yocto-poky/meta/recipes-core/udev/eudev/udev-cache index dcfff1cb4..dcfff1cb4 100644 --- a/yocto-poky/meta/recipes-core/udev/udev/udev-cache +++ b/yocto-poky/meta/recipes-core/udev/eudev/udev-cache diff --git a/yocto-poky/meta/recipes-core/udev/udev/udev-cache.default b/yocto-poky/meta/recipes-core/udev/eudev/udev-cache.default index a3b732698..a3b732698 100644 --- a/yocto-poky/meta/recipes-core/udev/udev/udev-cache.default +++ b/yocto-poky/meta/recipes-core/udev/eudev/udev-cache.default diff --git a/yocto-poky/meta/recipes-core/udev/udev/udev.rules b/yocto-poky/meta/recipes-core/udev/eudev/udev.rules index a19d4a0bf..a19d4a0bf 100644 --- a/yocto-poky/meta/recipes-core/udev/udev/udev.rules +++ b/yocto-poky/meta/recipes-core/udev/eudev/udev.rules diff --git a/yocto-poky/meta/recipes-core/udev/eudev_3.1.5.bb b/yocto-poky/meta/recipes-core/udev/eudev_3.1.5.bb new file mode 100644 index 000000000..ea19ec413 --- /dev/null +++ b/yocto-poky/meta/recipes-core/udev/eudev_3.1.5.bb @@ -0,0 +1,107 @@ +SUMMARY = "eudev is a fork of systemd's udev" +HOMEPAGE = "https://wiki.gentoo.org/wiki/Eudev" +LICENSE = "GPLv2.0+" +LIC_FILES_CHKSUM = "file://COPYING;md5=751419260aa954499f7abaabaa882bbe" + +DEPENDS = "glib-2.0 glib-2.0-native gperf-native kmod libxslt-native util-linux" + +PROVIDES = "udev" + +SRC_URI = "https://github.com/gentoo/${BPN}/archive/v${PV}.tar.gz \ + file://devfs-udev.rules \ + file://init \ + file://links.conf \ + file://local.rules \ + file://permissions.rules \ + file://run.rules \ + file://udev-cache \ + file://udev-cache.default \ + file://udev.rules \ +" +UPSTREAM_CHECK_URI = "https://github.com/gentoo/eudev/releases" + +SRC_URI[md5sum] = "e130f892d8744e292cb855db79935f68" +SRC_URI[sha256sum] = "ce9d5fa91e3a42c7eb95512ca0fa2a631e89833053066bb6cdf42046b2a88553" + +inherit autotools update-rc.d qemu + +EXTRA_OECONF = " \ + --sbindir=${base_sbindir} \ + --libexecdir=${nonarch_base_libdir} \ + --with-rootlibdir=${base_libdir} \ + --with-rootprefix= \ +" + +do_install_append() { + install -d ${D}${sysconfdir}/init.d + install -m 0755 ${WORKDIR}/init ${D}${sysconfdir}/init.d/udev + install -m 0755 ${WORKDIR}/udev-cache ${D}${sysconfdir}/init.d/udev-cache + sed -i s%@UDEVD@%${base_sbindir}/udevd% ${D}${sysconfdir}/init.d/udev + sed -i s%@UDEVD@%${base_sbindir}/udevd% ${D}${sysconfdir}/init.d/udev-cache + + install -d ${D}${sysconfdir}/default + install -m 0755 ${WORKDIR}/udev-cache.default ${D}${sysconfdir}/default/udev-cache + + touch ${D}${sysconfdir}/udev/cache.data + + install -d ${D}${sysconfdir}/udev/rules.d + install -m 0644 ${WORKDIR}/local.rules ${D}${sysconfdir}/udev/rules.d/local.rules + + # Use classic network interface naming scheme + touch ${D}${sysconfdir}/udev/rules.d/80-net-name-slot.rules + + # Fix for multilib systems where libs along with confs are installed incorrectly + if ! [ -d ${D}${nonarch_base_libdir}/udev ] + then + install -d ${D}${nonarch_base_libdir}/udev + mv ${D}${base_libdir}/udev ${D}${nonarch_base_libdir} + fi + + # hid2hci has moved to bluez4. removed in udev as of version 169 + rm -f ${D}${base_libdir}/udev/hid2hci +} + +INITSCRIPT_PACKAGES = "eudev udev-cache" +INITSCRIPT_NAME_eudev = "udev" +INITSCRIPT_PARAMS_eudev = "start 04 S ." +INITSCRIPT_NAME_udev-cache = "udev-cache" +INITSCRIPT_PARAMS_udev-cache = "start 36 S ." + +PACKAGES =+ "libudev" +PACKAGES =+ "udev-cache" +PACKAGES =+ "eudev-hwdb" + + +FILES_${PN} += "${libexecdir} ${nonarch_base_libdir}/udev ${bindir}/udevadm" +FILES_${PN}-dev = "${datadir}/pkgconfig/udev.pc \ + ${includedir}/libudev.h ${libdir}/libudev.so \ + ${includedir}/udev.h ${libdir}/libudev.la \ + ${libdir}/libudev.a ${libdir}/pkgconfig/libudev.pc" +FILES_libudev = "${base_libdir}/libudev.so.*" +FILES_udev-cache = "${sysconfdir}/init.d/udev-cache ${sysconfdir}/default/udev-cache" +FILES_eudev-hwdb = "${sysconfdir}/udev/hwdb.d" + +RDEPENDS_eudev-hwdb += "eudev" + +RRECOMMENDS_${PN} += "udev-cache eudev-hwdb" + +RPROVIDES_${PN} = "hotplug udev" + +python () { + if bb.utils.contains ('DISTRO_FEATURES', 'systemd', True, False, d): + raise bb.parse.SkipPackage("'systemd' in DISTRO_FEATURES") +} + +pkg_postinst_eudev-hwdb () { + if test -n "$D"; then + ${@qemu_run_binary(d, '$D', '${bindir}/udevadm')} hwdb --update --root $D + chown root:root $D${sysconfdir}/udev/hwdb.bin + else + udevadm hwdb --update + fi +} + +pkg_prerm_eudev-hwdb () { + rm -f $D${sysconfdir}/udev/hwdb.bin +} + diff --git a/yocto-poky/meta/recipes-core/udev/udev-extraconf/mount.sh b/yocto-poky/meta/recipes-core/udev/udev-extraconf/mount.sh index 3eea91085..d760328a0 100644 --- a/yocto-poky/meta/recipes-core/udev/udev-extraconf/mount.sh +++ b/yocto-poky/meta/recipes-core/udev/udev-extraconf/mount.sh @@ -8,7 +8,7 @@ MOUNT="/bin/mount" PMOUNT="/usr/bin/pmount" UMOUNT="/bin/umount" -for line in `grep -v ^# /etc/udev/mount.blacklist` +for line in `grep -h -v ^# /etc/udev/mount.blacklist /etc/udev/mount.blacklist.d/*` do if [ ` expr match "$DEVNAME" "$line" ` -gt 0 ]; then diff --git a/yocto-poky/meta/recipes-core/udev/udev-extraconf_1.1.bb b/yocto-poky/meta/recipes-core/udev/udev-extraconf_1.1.bb index 6fbd92548..ecd4a8aab 100644 --- a/yocto-poky/meta/recipes-core/udev/udev-extraconf_1.1.bb +++ b/yocto-poky/meta/recipes-core/udev/udev-extraconf_1.1.bb @@ -23,6 +23,7 @@ do_install() { install -m 0644 ${WORKDIR}/autonet.rules ${D}${sysconfdir}/udev/rules.d/autonet.rules install -m 0644 ${WORKDIR}/localextra.rules ${D}${sysconfdir}/udev/rules.d/localextra.rules + install -d ${D}${sysconfdir}/udev/mount.blacklist.d install -m 0644 ${WORKDIR}/mount.blacklist ${D}${sysconfdir}/udev/ install -d ${D}${sysconfdir}/udev/scripts/ diff --git a/yocto-poky/meta/recipes-core/udev/udev.inc b/yocto-poky/meta/recipes-core/udev/udev.inc deleted file mode 100644 index c378ae3cd..000000000 --- a/yocto-poky/meta/recipes-core/udev/udev.inc +++ /dev/null @@ -1,113 +0,0 @@ -SUMMARY = "/dev/ and hotplug management daemon" -DESCRIPTION = "udev is a daemon which dynamically creates and removes device nodes from \ -/dev/, handles hotplug events and loads drivers at boot time." -HOMEPAGE = "http://www.kernel.org/pub/linux/utils/kernel/hotplug/udev/udev.html" -LICENSE = "GPLv2.0+ & LGPLv2.1+" -LICENSE_${PN} = "GPLv2.0+" -LICENSE_libudev = "LGPLv2.1+" -LICENSE_libgudev = "LGPLv2.1+" -LIC_FILES_CHKSUM = "file://COPYING;md5=b234ee4d69f5fce4486a80fdaf4a4263 \ - file://src/COPYING;md5=17c4e5fb495e6707ac92a3864926f979 \ - file://src/gudev/COPYING;md5=fb494485a7d0505308cb68e4997cc266" - -LDFLAGS += "-lrt" - -DEPENDS = "glib-2.0 libusb usbutils pciutils glib-2.0-native gperf-native libxslt-native util-linux" -RPROVIDES_${PN} = "hotplug" - -PROVIDES = "libgudev" - -SRC_URI = "${KERNELORG_MIRROR}/linux/utils/kernel/hotplug/udev-${PV}.tar.gz \ - file://0001-Fixing-keyboard_force_release.sh-shell-script-path.patch \ - file://avoid-mouse-autosuspend.patch \ - file://run.rules \ - file://udev.rules \ - file://devfs-udev.rules \ - file://links.conf \ - file://permissions.rules \ - file://local.rules \ - file://udev-cache \ - file://udev-cache.default \ - file://add-install-ptest.patch \ - file://fix_rule-syntax-regex-ptest.patch \ - file://run-ptest \ - file://init" - -inherit autotools pkgconfig update-rc.d ptest -RDEPENDS_${PN}-ptest += "make perl python" - -libexecdir = "${base_libdir}" -EXTRA_OECONF = "--disable-introspection \ - --with-rootlibdir=${base_libdir} \ - --with-pci-ids-path=${datadir}/pci.ids \ - ac_cv_file__usr_share_pci_ids=no \ - ac_cv_file__usr_share_hwdata_pci_ids=no \ - ac_cv_file__usr_share_misc_pci_ids=yes \ - --sbindir=${base_sbindir} \ - --libexecdir=${nonarch_base_libdir} \ - --with-rootlibdir=${base_libdir} \ - --with-rootprefix= \ - --without-systemdsystemunitdir \ - " - -PACKAGES =+ "udev-cache" -PACKAGES =+ "libudev" -PACKAGES =+ "libgudev" - -INITSCRIPT_PACKAGES = "udev udev-cache" -INITSCRIPT_NAME_udev = "udev" -INITSCRIPT_PARAMS_udev = "start 04 S ." -INITSCRIPT_NAME_udev-cache = "udev-cache" -INITSCRIPT_PARAMS_udev-cache = "start 36 S ." - -FILES_${PN} += "${libexecdir} ${libdir}/ConsoleKit ${nonarch_base_libdir}/udev ${bindir}/udevadm" -RRECOMMENDS_${PN} += "udev-cache" - -# udev-utils has been removed as a package. Note that udev conflicts with udev-utils so that -# udev-utils is removed from systems on upgrade. -RCONFLICTS_${PN} += "udev-utils" -RREPLACES_${PN} += "udev-utils" - -FILES_${PN}-dbg += "${libexecdir}/.debug" -FILES_${PN}-dbg += "${base_libdir}/udev/.debug/" -FILES_${PN}-dbg += "${base_libdir}/udev/.debug/*" -FILES_${PN}-dbg += "${nonarch_base_libdir}/udev/.debug/*" -FILES_${PN}-dev = "${datadir}/pkgconfig/udev.pc \ - ${includedir}/libudev.h ${libdir}/libudev.so ${libdir}/libudev.la \ - ${libdir}/libudev.a ${libdir}/pkgconfig/libudev.pc \ - ${includedir}/gudev* ${libdir}/libgudev*.so ${libdir}/libgudev*.la \ - ${libdir}/libgudev*.a ${libdir}/pkgconfig/gudev*.pc" -FILES_libudev = "${base_libdir}/libudev.so.*" -FILES_libgudev = "${base_libdir}/libgudev*.so.* ${libdir}/libgudev*.so.*" -FILES_udev-cache = "${sysconfdir}/init.d/udev-cache ${sysconfdir}/default/udev-cache" - -do_install_append () { - install -d ${D}${sysconfdir}/init.d - install -m 0755 ${WORKDIR}/init ${D}${sysconfdir}/init.d/udev - install -m 0755 ${WORKDIR}/udev-cache ${D}${sysconfdir}/init.d/udev-cache - sed -i s%@UDEVD@%${nonarch_base_libdir}/udev/udevd% ${D}${sysconfdir}/init.d/udev - sed -i s%@UDEVD@%${nonarch_base_libdir}/udev/udevd% ${D}${sysconfdir}/init.d/udev-cache - - install -d ${D}${sysconfdir}/default - install -m 0755 ${WORKDIR}/udev-cache.default ${D}${sysconfdir}/default/udev-cache - - touch ${D}${sysconfdir}/udev/cache.data - - install -d ${D}${sysconfdir}/udev/rules.d/ - - install -m 0644 ${WORKDIR}/local.rules ${D}${sysconfdir}/udev/rules.d/local.rules - - # hid2hci has moved to bluez4. removed in udev as of version 169 - rm -f ${D}${base_libdir}/udev/hid2hci - - echo 'udev_run="/var/run/udev"' >> ${D}${sysconfdir}/udev/udev.conf -} - -# As systemd also builds udev, skip this package if we're doing a systemd build. -python () { - if bb.utils.contains ('DISTRO_FEATURES', 'systemd', True, False, d): - raise bb.parse.SkipPackage("'systemd' in DISTRO_FEATURES") -} -do_compile_ptest() { - oe_runmake test-udev -} diff --git a/yocto-poky/meta/recipes-core/udev/udev/0001-Fixing-keyboard_force_release.sh-shell-script-path.patch b/yocto-poky/meta/recipes-core/udev/udev/0001-Fixing-keyboard_force_release.sh-shell-script-path.patch deleted file mode 100644 index 41deafa91..000000000 --- a/yocto-poky/meta/recipes-core/udev/udev/0001-Fixing-keyboard_force_release.sh-shell-script-path.patch +++ /dev/null @@ -1,35 +0,0 @@ -From 0f8290c943da298abd269ca60fd8375dfb219971 Mon Sep 17 00:00:00 2001 -From: Alexandru DAMIAN <alexandru.damian@intel.com> -Date: Thu, 12 Jul 2012 12:54:48 +0300 -Subject: [PATCH] Fixing keyboard_force_release.sh shell script path - -With the introduction of rootprefix, the keyboard-force-release.sh.in -was modified to be executed with @rootprefix@/bin/sh, which is wrong -because @rootprefix@ defaults to /usr (which is correct), but the -shell is always at /bin/sh (IEEE Std 1003.2-1992). - -Therefore the interpreter for shell scripts needs to be /bin/sh at all times. - -The upstream moved to configurable root prefix, this patch taclkes a -transition bug, and will not be applied upstream. - -Upstream-Status: Inappropriate [legacy version] - -Signed-off-by: Alexandru DAMIAN <alexandru.damian@intel.com> ---- - src/keymap/keyboard-force-release.sh.in | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -diff --git a/src/keymap/keyboard-force-release.sh.in b/src/keymap/keyboard-force-release.sh.in -index dd040ce..597a3a6 100755 ---- a/src/keymap/keyboard-force-release.sh.in -+++ b/src/keymap/keyboard-force-release.sh.in -@@ -1,4 +1,4 @@ --#!@rootprefix@/bin/sh -e -+#!/bin/sh -e - # read list of scancodes, convert hex to decimal and - # append to the atkbd force_release sysfs attribute - # $1 sysfs devpath for serioX --- -1.7.9.5 - diff --git a/yocto-poky/meta/recipes-core/udev/udev/add-install-ptest.patch b/yocto-poky/meta/recipes-core/udev/udev/add-install-ptest.patch deleted file mode 100644 index bfc2e9409..000000000 --- a/yocto-poky/meta/recipes-core/udev/udev/add-install-ptest.patch +++ /dev/null @@ -1,86 +0,0 @@ -Adjustements for ptest: - -- Add 'install-ptest' rule. -- Print a standard result line for each test. -- Replace the use of "tree" with "find". - -Signed-off-by: Björn Stenberg <bjst@enea.com> -Signed-off-by: Alexandra Safta <alst@enea.com> -Upstream-Status: Pending - -Add missing files for rule-syntax-check -- Add rule-syntax-check.py -- Add the deployed udev rules to the testdata - -Signed-off-by: Max Krummenacher <max.oss.09@gmail.com> -Upstream-Status: Pending ---- a/Makefile.am 2012-03-18 16:28:14.000000000 +0100 -+++ b/Makefile.am 2013-02-18 10:03:36.531101244 +0100 -@@ -708,3 +708,18 @@ - for i in src/docs/html/*.{html,css,png}; do echo $$i; kup put $$i $$i.sign /pub/linux/utils/kernel/hotplug/libudev/; done - for i in src/gudev/docs/html/*.{html,css,png}; do rm -f $$i.sign; gpg --armor --detach-sign --output=$$i.sign $$i; done - for i in src/gudev/docs/html/*.{html,css,png}; do echo $$i; kup put $$i $$i.sign /pub/linux/utils/kernel/hotplug/gudev/; done -+ -+RULES = rules/* src/accelerometer/61-accelerometer.rules \ -+ src/cdrom_id/60-cdrom_id.rules \ -+ src/keymap/95-keyboard-force-release.rules src/keymap/95-keymap.rules \ -+ src/mtd_probe/75-probe_mtd.rules src/v4l_id/60-persistent-v4l.rules -+ -+install-ptest: -+ install test-udev $(DESTDIR) -+ cp Makefile $(DESTDIR) -+ sed -i -e 's|^Makefile:|_Makefile:|' $(DESTDIR)/Makefile -+ install -d $(DESTDIR)/test $(DESTDIR)/rules -+ (cd $(top_srcdir) && install $(TESTS) $(DESTDIR)/test) -+ (cd $(top_srcdir) && install test/rule-syntax-check.py $(DESTDIR)/test) -+ (cd $(top_srcdir) && install $(RULES) $(DESTDIR)/rules) -+ cp $(top_srcdir)/test/sys.tar.xz $(DESTDIR)/test/ ---- a/test/udev-test.pl 2012-03-18 16:43:36.000000000 +0100 -+++ b/test/udev-test.pl 2013-02-18 10:31:29.706357321 +0100 -@@ -1459,11 +1459,13 @@ - print "add: error"; - if ($rules->{exp_add_error}) { - print " as expected\n"; -+ print "XFAIL: TEST $number: $rules->{desc}: add\n"; - } else { - print "\n"; -- system("tree $udev_root"); -+ system("find $udev_root"); - print "\n"; - $error++; -+ print "FAIL: TEST $number: $rules->{desc}: add\n"; - sleep(1); - } - } -@@ -1479,15 +1481,18 @@ - print "remove: error"; - if ($rules->{exp_rem_error}) { - print " as expected\n"; -+ print "XFAIL: TEST $number: $rules->{desc}: remove\n"; - } else { - print "\n"; -- system("tree $udev_root"); -+ system("find $udev_root"); - print "\n"; - $error++; -+ print "FAIL: TEST $number: $rules->{desc}: remove\n"; - sleep(1); - } - } else { - print "remove: ok\n"; -+ print "PASS: TEST $number: $rules->{desc}: remove\n"; - } - - print "\n"; ---- a/configure.ac 2013-11-28 09:14:02.814248826 +0100 -+++ b/configure.ac 2013-11-28 09:14:34.260874296 +0100 -@@ -6,7 +6,7 @@ - [http://www.kernel.org/pub/linux/utils/kernel/hotplug/udev.html]) - AC_CONFIG_SRCDIR([src/udevd.c]) - AC_CONFIG_AUX_DIR([build-aux]) --AM_INIT_AUTOMAKE([check-news foreign 1.11 -Wall -Wno-portability silent-rules tar-pax no-dist-gzip dist-xz subdir-objects]) -+AM_INIT_AUTOMAKE([check-news foreign 1.11 -Wall -Wno-portability silent-rules tar-pax no-dist-gzip dist-xz subdir-objects serial-tests]) - AC_USE_SYSTEM_EXTENSIONS - AC_SYS_LARGEFILE - AC_CONFIG_MACRO_DIR([m4]) - diff --git a/yocto-poky/meta/recipes-core/udev/udev/avoid-mouse-autosuspend.patch b/yocto-poky/meta/recipes-core/udev/udev/avoid-mouse-autosuspend.patch deleted file mode 100644 index 2c31b33b0..000000000 --- a/yocto-poky/meta/recipes-core/udev/udev/avoid-mouse-autosuspend.patch +++ /dev/null @@ -1,25 +0,0 @@ -Source: http://cgit.freedesktop.org/systemd/systemd/commit/rules/42-usb-hid-pm.rules?id=e0386cf2809219bbdd30895f46f1f567b56902b6 - -Some USB ports on external hubs may be reported as "fixed". We only want -to auto-enable this on ports that are internal to the machine, so check -the parent state as well. - -Upstream-Status: backport - -Signed-off-by: Nitin A Kamble <nitin.a.kamble@intel.com> -2013/09/13 - -Index: udev-182/rules/42-usb-hid-pm.rules -=================================================================== ---- udev-182.orig/rules/42-usb-hid-pm.rules -+++ udev-182/rules/42-usb-hid-pm.rules -@@ -46,4 +46,9 @@ ACTION=="add", SUBSYSTEM=="usb", ATTRS{i - ACTION=="add", SUBSYSTEM=="usb", ATTR{idVendor}=="14dd", ATTR{idProduct}="0002", TEST=="power/control", ATTR{power/control}="auto" - - # USB HID devices that are internal to the machine should also be safe to autosuspend -+# And skip it for devices which are external but say "fixed" -+ACTION=="add", SUBSYSTEM=="usb", SUBSYSTEMS=="usb", ATTRS{removable}=="removable", GOTO="usb_hid_pm_end" -+ACTION=="add", SUBSYSTEM=="usb", SUBSYSTEMS=="usb", ATTRS{removable}=="unknown", GOTO="usb_hid_pm_end" - ACTION=="add", SUBSYSTEM=="usb", ATTR{bInterfaceClass}=="03", ATTRS{removable}=="fixed", TEST=="../power/control", ATTR{../power/control}="auto" -+LABEL="usb_hid_pm_end" -+ diff --git a/yocto-poky/meta/recipes-core/udev/udev/fix_rule-syntax-regex-ptest.patch b/yocto-poky/meta/recipes-core/udev/udev/fix_rule-syntax-regex-ptest.patch deleted file mode 100644 index 593c46ce0..000000000 --- a/yocto-poky/meta/recipes-core/udev/udev/fix_rule-syntax-regex-ptest.patch +++ /dev/null @@ -1,58 +0,0 @@ -The rule-syntax-check script fails with errors like this: - -Invalid line /lib/udev/rules.d/95-keymap.rules:49: ENV{DMI_VENDOR}=="ASUS*", KERNELS=="input*", ATTRS{name}=="Asus Extra Buttons", ATTR{[dmi/id]product_name}=="W3J", RUN+="keymap $name module-asus-w3j" -(' clause:', 'ATTR{[dmi/id]product_name}=="W3J"') -() - - -Move line comment from end of rules file to its own line, the regex used to -test correct syntax choke on it. - -The rule-syntax-check.py uses regex which errournessly complains on ATTR rules -of the form ATTR{[dmi/id]board_name}=="30B7" -Use the regex from systemd's script which allow [] characters and additional -compare operators - -The Makefile passes rules-test.sh script a build host path to the testdata. -Ignore the argument and use a relative path instead. - - -Signed-off-by: Max Krummenacher <max.oss.09@gmail.com> -Upstream-Status: Inappropriate (cross environment path) - -diff -Naur udev-182.orig/src/keymap/95-keymap.rules udev-182/src/keymap/95-keymap.rules ---- udev-182.orig/src/keymap/95-keymap.rules 2012-02-07 00:01:55.154640792 +0100 -+++ udev-182/src/keymap/95-keymap.rules 2015-01-24 20:58:40.156930520 +0100 -@@ -94,7 +94,8 @@ - ENV{DMI_VENDOR}=="Hewlett-Packard", ATTR{[dmi/id]product_name}=="HP G62 Notebook PC", RUN+="keymap $name 0xB2 www" - ENV{DMI_VENDOR}=="Hewlett-Packard", ATTR{[dmi/id]product_name}=="HP ProBook*", RUN+="keymap $name 0xF8 rfkill" - # HP Pavillion dv6315ea has empty DMI_VENDOR --ATTR{[dmi/id]board_vendor}=="Quanta", ATTR{[dmi/id]board_name}=="30B7", ATTR{[dmi/id]board_version}=="65.2B", RUN+="keymap $name 0x88 media" # "quick play -+# "quick play" -+ATTR{[dmi/id]board_vendor}=="Quanta", ATTR{[dmi/id]board_name}=="30B7", ATTR{[dmi/id]board_version}=="65.2B", RUN+="keymap $name 0x88 media" - - # Gateway clone of Acer Aspire One AOA110/AOA150 - ENV{DMI_VENDOR}=="Gateway*", ATTR{[dmi/id]product_name}=="*AOA1*", RUN+="keymap $name acer" -diff -Naur udev-182.orig/test/rule-syntax-check.py udev-182/test/rule-syntax-check.py ---- udev-182.orig/test/rule-syntax-check.py 2012-02-15 20:10:12.872333342 +0100 -+++ udev-182/test/rule-syntax-check.py 2015-01-24 21:08:00.496049600 +0100 -@@ -28,7 +28,7 @@ - no_args_tests = re.compile('(ACTION|DEVPATH|KERNELS?|NAME|SYMLINK|SUBSYSTEMS?|DRIVERS?|TAG|RESULT|TEST)\s*(?:=|!)=\s*"([^"]*)"$') - args_tests = re.compile('(ATTRS?|ENV|TEST){([a-zA-Z0-9/_.*%-]+)}\s*(?:=|!)=\s*"([^"]*)"$') - no_args_assign = re.compile('(NAME|SYMLINK|OWNER|GROUP|MODE|TAG|PROGRAM|RUN|LABEL|GOTO|WAIT_FOR|OPTIONS|IMPORT)\s*(?:\+=|:=|=)\s*"([^"]*)"$') --args_assign = re.compile('(ATTR|ENV|IMPORT){([a-zA-Z0-9/_.*%-]+)}\s*=\s*"([^"]*)"$') -+args_assign = re.compile('(ATTR|ENV|IMPORT|RUN){([][a-zA-Z0-9/_.*%-]+)}\s*(=|==|\+=)\s*"([^"]*)"$') - - result = 0 - buffer = '' ---- udev-182.orig/test/rules-test.sh 2012-01-29 01:15:46.000000000 +0100 -+++ udev-182/test/rules-test.sh 2015-01-24 17:53:51.201858658 +0100 -@@ -4,7 +4,7 @@ - # (C) 2010 Canonical Ltd. - # Author: Martin Pitt <martin.pitt@ubuntu.com> - --[ -n "$srcdir" ] || srcdir=`dirname $0`/.. -+srcdir=`dirname $0`/.. - - # skip if we don't have python - type python >/dev/null 2>&1 || { diff --git a/yocto-poky/meta/recipes-core/udev/udev/run-ptest b/yocto-poky/meta/recipes-core/udev/udev/run-ptest deleted file mode 100644 index 0e39806b0..000000000 --- a/yocto-poky/meta/recipes-core/udev/udev/run-ptest +++ /dev/null @@ -1,5 +0,0 @@ -#!/bin/sh - -tar -C test/ -xJf test/sys.tar.xz -make -k check-TESTS -make test-sys-distclean diff --git a/yocto-poky/meta/recipes-core/udev/udev_182.bb b/yocto-poky/meta/recipes-core/udev/udev_182.bb deleted file mode 100644 index b21635203..000000000 --- a/yocto-poky/meta/recipes-core/udev/udev_182.bb +++ /dev/null @@ -1,9 +0,0 @@ -include udev.inc - -PR = "r9" - -# module-init-tools from kmod_git will provide libkmod runtime -DEPENDS += "module-init-tools" - -SRC_URI[md5sum] = "1b964456177fbf48023dfee7db3a708d" -SRC_URI[sha256sum] = "7857ed19fafd8f3ca8de410194e8c7336e9eb8a20626ea8a4ba6449b017faba4" diff --git a/yocto-poky/meta/recipes-core/util-linux/util-linux.inc b/yocto-poky/meta/recipes-core/util-linux/util-linux.inc index 594108f68..a1614c22f 100644 --- a/yocto-poky/meta/recipes-core/util-linux/util-linux.inc +++ b/yocto-poky/meta/recipes-core/util-linux/util-linux.inc @@ -17,7 +17,7 @@ LIC_FILES_CHKSUM = "file://README.licensing;md5=1715f5ee3e01203ca1e1e0b9ee65918c file://libmount/COPYING;md5=fb93f01d4361069c5616327705373b16 \ file://libblkid/COPYING;md5=fb93f01d4361069c5616327705373b16" -inherit autotools gettext pkgconfig systemd update-alternatives python-dir +inherit autotools gettext pkgconfig systemd update-alternatives python-dir ptest bash-completion DEPENDS = "zlib ncurses" DEPENDS_append_class-native = " lzo-native" DEPENDS_append_class-nativesdk = " lzo-native" @@ -31,9 +31,10 @@ PACKAGES =+ "util-linux-agetty util-linux-fdisk util-linux-cfdisk util-linux-sfd util-linux-uuidgen util-linux-lscpu util-linux-fsck util-linux-blkid \ util-linux-mkfs util-linux-mcookie util-linux-reset \ util-linux-mkfs.cramfs util-linux-fsck.cramfs util-linux-fstrim \ - util-linux-partx ${PN}-bash-completion util-linux-hwclock \ + util-linux-partx util-linux-hwclock util-linux-mountpoint \ util-linux-findfs util-linux-getopt util-linux-sulogin" PACKAGES += "${@bb.utils.contains('PACKAGECONFIG', 'pylibmount', 'util-linux-pylibmount', '', d)}" +PACKAGES =+ "${@bb.utils.contains('DISTRO_FEATURES', 'pam', 'util-linux-runuser', '', d)}" PACKAGES_DYNAMIC = "^util-linux-lib.*" @@ -61,11 +62,12 @@ PACKAGECONFIG[libcap-ng] = "--enable-setpriv,--disable-setpriv,libcap-ng," # Build python bindings for libmount PACKAGECONFIG[pylibmount] = "--with-python --enable-pylibmount,--without-python --disable-pylibmount,python" -FILES_${PN}-bash-completion += "${datadir}/bash-completion" +# Readline support +PACKAGECONFIG[readline] = "--with-readline,--without-readline,readline" + FILES_${PN}-doc += "${datadir}/getopt/getopt-*.*" FILES_${PN}-dev += "${libdir}/${PYTHON_DIR}/dist-packages/libmount/pylibmount.la" -FILES_${PN}-dbg += "${libdir}/${PYTHON_DIR}/dist-packages/libmount/.debug/" FILES_util-linux-agetty = "${base_sbindir}/agetty" FILES_util-linux-fdisk = "${base_sbindir}/fdisk.${BPN}" @@ -85,6 +87,7 @@ FILES_util-linux-partx = "${sbindir}/partx" FILES_util-linux-hwclock = "${base_sbindir}/hwclock.${BPN}" FILES_util-linux-findfs = "${sbindir}/findfs" FILES_util-linux-getopt = "${base_bindir}/getopt.${BPN}" +FILES_util-linux-runuser = "${sbindir}/runuser" FILES_util-linux-pylibmount = "${libdir}/${PYTHON_DIR}/dist-packages/libmount/pylibmount.so \ ${libdir}/${PYTHON_DIR}/dist-packages/libmount/__init__.*" @@ -97,6 +100,7 @@ FILES_util-linux-fsck.cramfs = "${sbindir}/fsck.cramfs" FILES_util-linux-mkfs.cramfs = "${sbindir}/mkfs.cramfs" FILES_util-linux-sulogin = "${base_sbindir}/sulogin*" +FILES_util-linux-mountpoint = "${base_bindir}/mountpoint.${BPN}" # Util-linux' blkid replaces the e2fsprogs one FILES_util-linux-blkid = "${base_sbindir}/blkid*" @@ -106,8 +110,12 @@ RREPLACES_util-linux-blkid = "e2fsprogs-blkid" # reset calls 'tput' RDEPENDS_util-linux-reset += "ncurses" +RDEPENDS_util-linux-runuser += "libpam" + RDEPENDS_${PN} = "util-linux-umount util-linux-swaponoff util-linux-losetup util-linux-sulogin" -RRECOMMENDS_${PN} = "util-linux-fdisk util-linux-cfdisk util-linux-sfdisk util-linux-mount util-linux-readprofile util-linux-mkfs " +RDEPENDS_${PN} += "${@bb.utils.contains('DISTRO_FEATURES', 'pam', 'util-linux-runuser', '', d)}" + +RRECOMMENDS_${PN} = "util-linux-fdisk util-linux-cfdisk util-linux-sfdisk util-linux-mount util-linux-readprofile util-linux-mkfs util-linux-mountpoint" RRECOMMENDS_${PN}_class-native = "" RRECOMMENDS_${PN}_class-nativesdk = "" @@ -124,7 +132,7 @@ SYSTEMD_AUTO_ENABLE_${PN}-fstrim = "disable" do_compile () { set -e - oe_runmake ARCH=${TARGET_ARCH} CPU= CPUOPT= 'OPT=${CFLAGS}' + oe_runmake ARCH=${TARGET_ARCH} CPU= CPUOPT= 'OPT=${CFLAGS}' } do_install () { @@ -139,7 +147,7 @@ do_install () { sbinprogs="agetty ctrlaltdel cfdisk vipw vigr" sbinprogs_a="pivot_root hwclock mkswap mkfs.minix fsck.minix losetup swapon swapoff fdisk fsck blkid blockdev fstrim sulogin switch_root" - binprogs_a="dmesg getopt kill more umount mount login reset su" + binprogs_a="dmesg getopt kill more umount mount login reset su mountpoint" if [ "${base_sbindir}" != "${sbindir}" ]; then mkdir -p ${D}${base_sbindir} @@ -177,7 +185,7 @@ do_install_append_class-native () { rm -f ${D}${base_sbindir}/nologin } -ALTERNATIVE_PRIORITY = "100" +ALTERNATIVE_PRIORITY = "80" ALTERNATIVE_${PN} = "dmesg kill more mkswap blockdev pivot_root switch_root" ALTERNATIVE_${PN} += "mkfs.minix hexdump last lastb logger mesg renice wall" @@ -212,9 +220,6 @@ ALTERNATIVE_LINK_NAME[fsck.8] = "${mandir}/man8/fsck.8" ALTERNATIVE_LINK_NAME[uuid.3] = "${mandir}/man3/uuid.3" ALTERNATIVE_util-linux-hwclock = "hwclock" -# There seems to be problem, atleast on nslu2, with these, untill they are -# fixed the busybox ones have higher priority -ALTERNATIVE_PRIORITY[hwclock] = "10" ALTERNATIVE_LINK_NAME[hwclock] = "${base_sbindir}/hwclock" ALTERNATIVE_util-linux-fdisk = "fdisk" @@ -257,6 +262,9 @@ ALTERNATIVE_LINK_NAME[getopt] = "${base_bindir}/getopt" ALTERNATIVE_util-linux-sulogin = "sulogin" ALTERNATIVE_LINK_NAME[sulogin] = "${base_sbindir}/sulogin" +ALTERNATIVE_util-linux-mountpoint = "mountpoint" +ALTERNATIVE_LINK_NAME[mountpoint] = "${base_bindir}/mountpoint" + BBCLASSEXTEND = "native nativesdk" python do_package_prepend () { @@ -272,3 +280,32 @@ python populate_packages_prepend() { description='util-linux lib%s', extra_depends='', prepend=True, allow_links=True) } + +RDEPENDS_${PN}-ptest = "bash" + +do_compile_ptest() { + oe_runmake buildtest-TESTS +} + +do_install_ptest() { + mkdir -p ${D}${PTEST_PATH}/tests/ts + find . -maxdepth 1 -type f -perm -111 -exec cp {} ${D}${PTEST_PATH} \; + cp ${S}/tests/functions.sh ${D}${PTEST_PATH}/tests/ + cp ${S}/tests/commands.sh ${D}${PTEST_PATH}/tests/ + cp ${S}/tests/run.sh ${D}${PTEST_PATH}/tests/ + cp -pR ${S}/tests/expected ${D}${PTEST_PATH}/tests/expected + + list="bitops build-sys cal col colrm column dmesg fsck hexdump hwclock ipcs isosize login look md5 misc more namei paths schedutils script swapon tailf" + # The following tests are not installed yet: + # blkid scsi_debug module dependent + # cramfs gcc dependent + # eject gcc dependent + # fdisk scsi_debug module and gcc dependent + # lscpu gcc dependant + # libmount uuidgen dependent + # mount gcc dependant + # partx blkid dependant + for d in $list; do + cp -pR ${S}/tests/ts/$d ${D}${PTEST_PATH}/tests/ts/ + done +} diff --git a/yocto-poky/meta/recipes-core/util-linux/util-linux/avoid_parallel_tests.patch b/yocto-poky/meta/recipes-core/util-linux/util-linux/avoid_parallel_tests.patch new file mode 100644 index 000000000..46d4d3765 --- /dev/null +++ b/yocto-poky/meta/recipes-core/util-linux/util-linux/avoid_parallel_tests.patch @@ -0,0 +1,19 @@ +Ptest needs buildtest-TESTS and runtest-TESTS targets. +serial-tests is required to generate those targets. +Revert run.sh script accordingly to serialize running tests + +Signed-off-by: Tudor Florea <tudor.florea@enea.com> +Upstream-Status: Inappropriate + +diff -ruN a/configure.ac b/configure.ac +--- a/configure.ac 2014-05-27 12:37:42.119772658 +0200 ++++ b/configure.ac 2014-05-27 12:41:46.225573272 +0200 +@@ -10,7 +10,7 @@ + dnl AC_USE_SYSTEM_EXTENSIONS must be called before any macros that run + dnl the compiler (like AC_PROG_LIBTOOL) to avoid autoconf errors. + AC_USE_SYSTEM_EXTENSIONS +-AM_INIT_AUTOMAKE([-Wall foreign 1.10 tar-pax dist-bzip2 no-dist-gzip dist-xz -Wno-portability subdir-objects]) ++AM_INIT_AUTOMAKE([-Wall foreign 1.10 tar-pax dist-bzip2 no-dist-gzip dist-xz -Wno-portability subdir-objects serial-tests]) + + m4_ifdef([AM_SILENT_RULES], [AM_SILENT_RULES([yes])], + [AC_SUBST([AM_DEFAULT_VERBOSITY], [1])]) diff --git a/yocto-poky/meta/recipes-core/util-linux/util-linux/avoid_unsupported_grep_opts.patch b/yocto-poky/meta/recipes-core/util-linux/util-linux/avoid_unsupported_grep_opts.patch new file mode 100644 index 000000000..a0d5efad0 --- /dev/null +++ b/yocto-poky/meta/recipes-core/util-linux/util-linux/avoid_unsupported_grep_opts.patch @@ -0,0 +1,57 @@ +Avoid unsupported grep options + +Signed-off-by: Tudor Florea <tudor.florea@enea.com> +Upstream-Status: Pending + +diff -ruN a/ts/ipcs/headers b/ts/ipcs/headers +--- a/tests/ts/ipcs/headers 2013-09-04 11:03:36.118613250 +0200 ++++ b/teste/ts/ipcs/headers 2013-09-04 11:03:27.906958437 +0200 +@@ -22,35 +22,35 @@ + ts_init "$*" + + ts_log "test: shm headers" +-$TS_CMD_IPCS -m -t | grep --after-context=1 "^---" >> $TS_OUTPUT +-$TS_CMD_IPCS -m -p | grep --after-context=1 "^---" >> $TS_OUTPUT +-$TS_CMD_IPCS -m -c | grep --after-context=1 "^---" >> $TS_OUTPUT ++$TS_CMD_IPCS -m -t | grep -A 1 "^---" >> $TS_OUTPUT ++$TS_CMD_IPCS -m -p | grep -A 1 "^---" >> $TS_OUTPUT ++$TS_CMD_IPCS -m -c | grep -A 1 "^---" >> $TS_OUTPUT + $TS_CMD_IPCS -m -l | grep "^---" >> $TS_OUTPUT + $TS_CMD_IPCS -m -u | grep "^---" >> $TS_OUTPUT + echo >> $TS_OUTPUT + + ts_log "test: mesg headers" +-$TS_CMD_IPCS -q -t | grep --after-context=1 "^---" >> $TS_OUTPUT +-$TS_CMD_IPCS -q -p | grep --after-context=1 "^---" >> $TS_OUTPUT +-$TS_CMD_IPCS -q -c | grep --after-context=1 "^---" >> $TS_OUTPUT ++$TS_CMD_IPCS -q -t | grep -A 1 "^---" >> $TS_OUTPUT ++$TS_CMD_IPCS -q -p | grep -A 1 "^---" >> $TS_OUTPUT ++$TS_CMD_IPCS -q -c | grep -A 1 "^---" >> $TS_OUTPUT + $TS_CMD_IPCS -q -l | grep "^---" >> $TS_OUTPUT + $TS_CMD_IPCS -q -u | grep "^---" >> $TS_OUTPUT + echo >> $TS_OUTPUT + + ts_log "test: sem headers" +-$TS_CMD_IPCS -s -t | grep --after-context=1 "^---" >> $TS_OUTPUT +-$TS_CMD_IPCS -s -p | grep --after-context=1 "^---" >> $TS_OUTPUT +-$TS_CMD_IPCS -s -c | grep --after-context=1 "^---" >> $TS_OUTPUT ++$TS_CMD_IPCS -s -t | grep -A 1 "^---" >> $TS_OUTPUT ++$TS_CMD_IPCS -s -p | grep -A 1 "^---" >> $TS_OUTPUT ++$TS_CMD_IPCS -s -c | grep -A 1 "^---" >> $TS_OUTPUT + $TS_CMD_IPCS -s -l | grep "^---" >> $TS_OUTPUT + $TS_CMD_IPCS -s -u | grep "^---" >> $TS_OUTPUT + echo >> $TS_OUTPUT + + ts_log "test: all headers" +-$TS_CMD_IPCS -a | grep --after-context=1 "^---" >> $TS_OUTPUT ++$TS_CMD_IPCS -a | grep -A 1 "^---" >> $TS_OUTPUT + +-$TS_CMD_IPCS -a -t | grep --after-context=1 "^---" >> $TS_OUTPUT +-$TS_CMD_IPCS -a -p | grep --after-context=1 "^---" >> $TS_OUTPUT +-$TS_CMD_IPCS -a -c | grep --after-context=1 "^---" >> $TS_OUTPUT ++$TS_CMD_IPCS -a -t | grep -A 1 "^---" >> $TS_OUTPUT ++$TS_CMD_IPCS -a -p | grep -A 1 "^---" >> $TS_OUTPUT ++$TS_CMD_IPCS -a -c | grep -A 1 "^---" >> $TS_OUTPUT + $TS_CMD_IPCS -a -l | grep "^---" >> $TS_OUTPUT + $TS_CMD_IPCS -a -u | grep "^---" >> $TS_OUTPUT + diff --git a/yocto-poky/meta/recipes-core/util-linux/util-linux/avoid_unsupported_sleep_param.patch b/yocto-poky/meta/recipes-core/util-linux/util-linux/avoid_unsupported_sleep_param.patch new file mode 100644 index 000000000..7a63a4e05 --- /dev/null +++ b/yocto-poky/meta/recipes-core/util-linux/util-linux/avoid_unsupported_sleep_param.patch @@ -0,0 +1,20 @@ +Avoid unsupported sleep parameter + +Signed-off-by: Tudor Florea <tudor.florea@enea.com> +Upstream-Status: Pending + +diff -ruN a/simple b/simple +--- a/tests/ts/tailf/simple 2015-11-12 11:34:49.971817130 +0200 ++++ b/tests/ts/tailf/simple 2013-11-12 11:34:37.876325128 +0200 +@@ -27,9 +27,9 @@ + + $TS_CMD_TAILF $INPUT > $TS_OUTPUT 2>&1 & + +-sleep 0.5 ++sleep 1 + echo {0..9} >> $INPUT +-sleep 0.5 ++sleep 1 + + rm -f $INPUT + diff --git a/yocto-poky/meta/recipes-core/util-linux/util-linux/display_testname_for_subtest.patch b/yocto-poky/meta/recipes-core/util-linux/util-linux/display_testname_for_subtest.patch new file mode 100644 index 000000000..0eb881085 --- /dev/null +++ b/yocto-poky/meta/recipes-core/util-linux/util-linux/display_testname_for_subtest.patch @@ -0,0 +1,18 @@ +Display testname for subtest + +Signed-off-by: Tudor Florea <tudor.florea@enea.com> +Upstream-Status: Pending + +diff -ruN a/functions.sh b/functions.sh +--- a/tests/functions.sh 2015-11-12 21:32:02.434542124 +0100 ++++ b/tests/functions.sh 2015-11-12 21:40:37.095317280 +0100 +@@ -297,7 +297,7 @@ + if [ "$TS_PARALLEL" == "yes" ]; then + TS_TITLE=$(printf "%13s: %-30s ...\n%16s: %-27s ..." "$TS_COMPONENT" "$TS_DESC" "" "$TS_SUBNAME") + else +- TS_TITLE=$(printf "%16s: %-27s ..." "" "$TS_SUBNAME") ++ TS_TITLE=$(printf "%13s: %-30s ..." "$TS_COMPONENT" "$TS_SUBNAME") + echo -n "$TS_TITLE" + fi + } + diff --git a/yocto-poky/meta/recipes-core/util-linux/util-linux/fix-parallel-build.patch b/yocto-poky/meta/recipes-core/util-linux/util-linux/fix-parallel-build.patch deleted file mode 100644 index adb271ce0..000000000 --- a/yocto-poky/meta/recipes-core/util-linux/util-linux/fix-parallel-build.patch +++ /dev/null @@ -1,35 +0,0 @@ -From 774f55f9dd22c01e4041a183d8dff14811f29114 Mon Sep 17 00:00:00 2001 -From: Robert Yang <liezhi.yang@windriver.com> -Date: Fri, 4 Apr 2014 17:33:04 +0800 -Subject: [PATCH] sys-utils/Makemodule.am: fix parallel build issue - -The rule SETARCH_MAN_LINKS is used for the files under the sys-utils -dir, for example: - -echo ".so man8/setarch.8" > sys-utils/linux32.8 - -but it depends on nothing so that the sys-utils dir may not exist, we -can create the sys-utils dir to fix problem. - -Upstream-Status: Pending - -Signed-off-by: Robert Yang <liezhi.yang@windriver.com> ---- - sys-utils/Makemodule.am | 1 + - 1 file changed, 1 insertion(+) - -diff --git a/sys-utils/Makemodule.am b/sys-utils/Makemodule.am -index 6265282..62ead37 100644 ---- a/sys-utils/Makemodule.am -+++ b/sys-utils/Makemodule.am -@@ -124,6 +124,7 @@ man_MANS += $(SETARCH_MAN_LINKS) - CLEANFILES += $(SETARCH_MAN_LINKS) - - $(SETARCH_MAN_LINKS): -+ $(MKDIR_P) sys-utils - $(AM_V_GEN)echo ".so man8/setarch.8" > $@ - - install-exec-hook-setarch: --- -1.8.2.1 - diff --git a/yocto-poky/meta/recipes-core/util-linux/util-linux/ptest.patch b/yocto-poky/meta/recipes-core/util-linux/util-linux/ptest.patch new file mode 100644 index 000000000..837f18934 --- /dev/null +++ b/yocto-poky/meta/recipes-core/util-linux/util-linux/ptest.patch @@ -0,0 +1,17 @@ +Define TESTS variable + +Signed-off-by: Tudor Florea <tudor.florea@enea.com> +Upstream-Status: Pending + +diff -ruN a/Makefile.am b/Makefile.am +--- a/Makefile.am 2015-11-12 20:29:46.778396936 +0100 ++++ b/Makefile.am 2015-11-12 20:32:24.342450279 +0100 +@@ -48,7 +48,7 @@ + dist_bashcompletion_DATA = + check_PROGRAMS = + dist_check_SCRIPTS = +-TESTS = ++TESTS = $(check_PROGRAMS) + + PATHFILES = + diff --git a/yocto-poky/meta/recipes-core/util-linux/util-linux/run-ptest b/yocto-poky/meta/recipes-core/util-linux/util-linux/run-ptest new file mode 100644 index 000000000..fbc2f9b56 --- /dev/null +++ b/yocto-poky/meta/recipes-core/util-linux/util-linux/run-ptest @@ -0,0 +1,25 @@ +#!/bin/sh + +cd tests || exit 1 + +comps=$(find ts/ -type f -perm -111 -regex ".*/[^\.~]*" | sort) + + +echo +echo "-------------------- util-linux regression tests --------------------" +echo +echo " For development purpose only. " +echo " Don't execute on production system! " +echo + +res=0 +count=0 +for ts in $comps; +do + $ts | sed '{ + s/^\(.*\):\(.*\) \.\.\. OK$/PASS: \1:\2/ + s/^\(.*\):\(.*\) \.\.\. FAILED \(.*\)$/FAIL: \1:\2 \3/ + s/^\(.*\):\(.*\) \.\.\. SKIPPED \(.*\)$/SKIP: \1:\2 \3/ + }' +done + diff --git a/yocto-poky/meta/recipes-core/util-linux/util-linux/uclibc-__progname-conflict.patch b/yocto-poky/meta/recipes-core/util-linux/util-linux/uclibc-__progname-conflict.patch deleted file mode 100644 index 5031a7313..000000000 --- a/yocto-poky/meta/recipes-core/util-linux/util-linux/uclibc-__progname-conflict.patch +++ /dev/null @@ -1,32 +0,0 @@ -configure should include errno.h instead of argp.h when -checking for presence of program_invocation_short_name -uclibc defines this to be const char* unlike util-linux-ng -which defines this to be char* so this error goes unnoticed -on glibc/eglibc systems. - -here is the error it fixes - -in file included from mountP.h:14:0, - from cache.c:29: -/home/kraj/work/slugos/build/tmp-slugos-uclibc/sysroots/nslu2le/usr/include/errno.h:55:46: error: conflicting types for '__progname' -../../../include/c.h:118:14: note: previous declaration of '__progname' was here -make[3]: *** [cache.lo] Error 1 - - -Signed-off-by: Khem Raj <raj.khem@gmail.com> -Signed-off-by: Jonathan Liu <net147@gmail.com> - -Upstream-Status: Pending -Index: util-linux-2.22.1/configure.ac -=================================================================== ---- util-linux-2.22.1.orig/configure.ac -+++ util-linux-2.22.1/configure.ac -@@ -372,7 +372,7 @@ esac - - AC_MSG_CHECKING([whether program_invocation_short_name is defined]) - AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[ -- #include <argp.h> -+ #include <errno.h> - ]], [[ - program_invocation_short_name = "test"; - ]])], [ diff --git a/yocto-poky/meta/recipes-core/util-linux/util-linux/util-linux-ng-replace-siginterrupt.patch b/yocto-poky/meta/recipes-core/util-linux/util-linux/util-linux-ng-replace-siginterrupt.patch deleted file mode 100644 index 6717a75a9..000000000 --- a/yocto-poky/meta/recipes-core/util-linux/util-linux/util-linux-ng-replace-siginterrupt.patch +++ /dev/null @@ -1,33 +0,0 @@ -Upstream-Status: Pending - -Signed-off-by: Chen Qi <Qi.Chen@windriver.com> ---- - login-utils/login.c | 5 ++++- - 1 file changed, 4 insertions(+), 1 deletion(-) - -diff --git a/login-utils/login.c b/login-utils/login.c -index ebb76f5..38c881b 100644 ---- a/login-utils/login.c -+++ b/login-utils/login.c -@@ -1110,6 +1110,7 @@ int main(int argc, char **argv) - char *buff; - int childArgc = 0; - int retcode; -+ struct sigaction act; - - char *pwdbuf = NULL; - struct passwd *pwd = NULL, _pwd; -@@ -1123,7 +1124,9 @@ int main(int argc, char **argv) - timeout = (unsigned int)getlogindefs_num("LOGIN_TIMEOUT", LOGIN_TIMEOUT); - - signal(SIGALRM, timedout); -- siginterrupt(SIGALRM, 1); /* we have to interrupt syscalls like ioctl() */ -+ (void) sigaction(SIGALRM, NULL, &act); -+ act.sa_flags &= ~SA_RESTART; -+ sigaction(SIGALRM, &act, NULL); - alarm(timeout); - signal(SIGQUIT, SIG_IGN); - signal(SIGINT, SIG_IGN); --- -1.9.1 - diff --git a/yocto-poky/meta/recipes-core/util-linux/util-linux/uuid-test-error-api.patch b/yocto-poky/meta/recipes-core/util-linux/util-linux/uuid-test-error-api.patch new file mode 100644 index 000000000..1b0ff79d4 --- /dev/null +++ b/yocto-poky/meta/recipes-core/util-linux/util-linux/uuid-test-error-api.patch @@ -0,0 +1,92 @@ +This patch adds error() API implementation for non-glibc system C libs + +Upstream-Status: Pending +Signed-off-by: Khem Raj <raj.khem@gmail.com> + +Index: util-linux-2.27.1/tests/helpers/test_uuidd.c +=================================================================== +--- util-linux-2.27.1.orig/tests/helpers/test_uuidd.c ++++ util-linux-2.27.1/tests/helpers/test_uuidd.c +@@ -23,7 +23,6 @@ + * + * make uuidd uuidgen localstatedir=/var + */ +-#include <error.h> + #include <libgen.h> + #include <pthread.h> + #include <stdio.h> +@@ -39,6 +38,17 @@ + #include "xalloc.h" + #include "strutils.h" + ++#ifdef __GLIBC__ ++#include <error.h> ++#else ++extern void (*error_print_progname)(void); ++extern unsigned int error_message_count; ++extern int error_one_per_line; ++ ++void error(int, int, const char *, ...); ++void error_at_line(int, int, const char *, unsigned int, const char *, ...); ++#endif ++ + #define LOG(level,args) if (loglev >= level) { fprintf args; } + + size_t nprocesses = 4; +@@ -257,6 +267,56 @@ static void object_dump(size_t idx, obje + fprintf(stderr, "}\n"); + } + ++#ifndef __GLIBC__ ++extern char *__progname; ++ ++void (*error_print_progname)(void) = 0; ++unsigned int error_message_count = 0; ++int error_one_per_line = 0; ++ ++static void eprint(int status, int e, const char *file, unsigned int line, const char *fmt, va_list ap) ++{ ++ if (file && error_one_per_line) { ++ static const char *oldfile; ++ static unsigned int oldline; ++ if (line == oldline && strcmp(file, oldfile) == 0) ++ return; ++ oldfile = file; ++ oldline = line; ++ } ++ if (error_print_progname) ++ error_print_progname(); ++ else ++ fprintf(stderr, "%s: ", __progname); ++ if (file) ++ fprintf(stderr, "%s:%u: ", file, line); ++ vfprintf(stderr, fmt, ap); ++ if (e) ++ fprintf(stderr, ": %s", strerror(e)); ++ putc('\n', stderr); ++ fflush(stderr); ++ error_message_count++; ++ if (status) ++ exit(status); ++} ++ ++void error(int status, int e, const char *fmt, ...) ++{ ++ va_list ap; ++ va_start(ap,fmt); ++ eprint(status, e, 0, 0, fmt, ap); ++ va_end(ap); ++} ++ ++void error_at_line(int status, int e, const char *file, unsigned int line, const char *fmt, ...) ++{ ++ va_list ap; ++ va_start(ap,fmt); ++ eprint(status, e, file, line, fmt, ap); ++ va_end(ap); ++} ++#endif /* __GLIBC__ */ ++ + int main(int argc, char *argv[]) + { + size_t i, nfailed = 0, nignored = 0; diff --git a/yocto-poky/meta/recipes-core/util-linux/util-linux_2.26.2.bb b/yocto-poky/meta/recipes-core/util-linux/util-linux_2.27.1.bb index e09fdfaf5..754915831 100644 --- a/yocto-poky/meta/recipes-core/util-linux/util-linux_2.26.2.bb +++ b/yocto-poky/meta/recipes-core/util-linux/util-linux_2.27.1.bb @@ -1,4 +1,4 @@ -MAJOR_VERSION = "2.26" +MAJOR_VERSION = "2.27" require util-linux.inc # To support older hosts, we need to patch and/or revert @@ -8,17 +8,21 @@ OLDHOST_class-native = "file://util-linux-native.patch \ file://util-linux-native-qsort.patch \ " -SRC_URI += "file://util-linux-ng-replace-siginterrupt.patch \ - file://util-linux-ng-2.16-mount_lock_path.patch \ - file://uclibc-__progname-conflict.patch \ +SRC_URI += "file://util-linux-ng-2.16-mount_lock_path.patch \ file://configure-sbindir.patch \ - file://fix-parallel-build.patch \ file://runuser.pamd \ file://runuser-l.pamd \ ${OLDHOST} \ + file://ptest.patch \ + file://run-ptest \ + file://avoid_unsupported_sleep_param.patch \ + file://avoid_unsupported_grep_opts.patch \ + file://display_testname_for_subtest.patch \ + file://avoid_parallel_tests.patch \ + file://uuid-test-error-api.patch \ " -SRC_URI[md5sum] = "9bdf368c395f1b70325d0eb22c7f48fb" -SRC_URI[sha256sum] = "0e29bda142528a48a0a953c39ff63093651a4809042e1790fbd6aa8663fd9666" +SRC_URI[md5sum] = "3cd2698d1363a2c64091c2dadc974647" +SRC_URI[sha256sum] = "0a818fcdede99aec43ffe6ca5b5388bff80d162f2f7bd4541dca94fecb87a290" CACHED_CONFIGUREVARS += "scanf_cv_alloc_modifier=ms" |