aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--mail/thunderbird/Makefile20
-rw-r--r--mail/thunderbird/distinfo6
-rw-r--r--mail/thunderbird/files/patch-addon-search30
-rw-r--r--mail/thunderbird/files/patch-bug128858742
-rw-r--r--mail/thunderbird/files/patch-bug155921370
-rw-r--r--mail/thunderbird/files/patch-bug161218416
-rw-r--r--mail/thunderbird/files/patch-bug161891443
-rw-r--r--mail/thunderbird/files/patch-bug162856712
-rw-r--r--mail/thunderbird/files/patch-bug169457533
-rw-r--r--mail/thunderbird/files/patch-bug1729459_comment1293
-rw-r--r--mail/thunderbird/files/patch-bug847568140
-rw-r--r--mail/thunderbird/files/patch-comm__third_party__rnpdefs.mozbuild10
-rw-r--r--mail/thunderbird/files/patch-cubeb-oss1324
-rw-r--r--mail/thunderbird/files/patch-env-api-keys14
14 files changed, 296 insertions, 1557 deletions
diff --git a/mail/thunderbird/Makefile b/mail/thunderbird/Makefile
index 43de586e8a11..a7e0f51283bd 100644
--- a/mail/thunderbird/Makefile
+++ b/mail/thunderbird/Makefile
@@ -1,8 +1,7 @@
# Created by: Joe Marcus Clarke <marcus@FreeBSD.org>
PORTNAME= thunderbird
-DISTVERSION= 78.14.0
-PORTREVISION= 1
+DISTVERSION= 91.2.0
CATEGORIES= mail news net-im
MASTER_SITES= MOZILLA/${PORTNAME}/releases/${DISTVERSION}/source \
MOZILLA/${PORTNAME}/candidates/${DISTVERSION}-candidates/build1/source
@@ -11,13 +10,13 @@ DISTFILES= ${DISTNAME}.source${EXTRACT_SUFX}
MAINTAINER= gecko@FreeBSD.org
COMMENT= Mozilla Thunderbird is standalone mail and news that stands above
-BUILD_DEPENDS= nspr>=4.26:devel/nspr \
- nss>=3.56:security/nss \
+BUILD_DEPENDS= nspr>=4.32:devel/nspr \
+ nss>=3.68:security/nss \
icu>=67.1,1:devel/icu \
libevent>=2.1.8:devel/libevent \
- harfbuzz>=2.6.6:print/harfbuzz \
+ harfbuzz>=2.8.1:print/harfbuzz \
graphite2>=1.3.14:graphics/graphite2 \
- png>=1.6.35:graphics/png \
+ png>=1.6.37:graphics/png \
libvpx>=1.8.2:multimedia/libvpx \
${PYTHON_PKGNAMEPREFIX}sqlite3>0:databases/py-sqlite3@${PY_FLAVOR} \
v4l_compat>0:multimedia/v4l_compat \
@@ -45,18 +44,11 @@ PORTNAME_ICON_SRC= ${PREFIX}/lib/${MOZILLA}/chrome/icons/default/default48.png
SYSTEM_PREFS= ${FAKEDIR}/lib/${PORTNAME}/defaults/pref/${PORTNAME}.js
-OPTIONS_DEFINE= LIGHTNING
-OPTIONS_DEFAULT=CANBERRA LIGHTNING
+OPTIONS_DEFAULT=CANBERRA
.include "${.CURDIR}/../../www/firefox/Makefile.options"
.include <bsd.port.pre.mk>
-.if ${PORT_OPTIONS:MLIGHTNING}
-MOZ_OPTIONS+= --enable-calendar
-.else
-MOZ_OPTIONS+= --disable-calendar
-.endif
-
post-extract:
@${SED} -e 's|@PORTNAME_ICON@|${PORTNAME_ICON:R}|;s|@MOZILLA@|${MOZILLA}|' \
<${FILESDIR}/thunderbird.desktop.in >${WRKDIR}/${MOZILLA_EXEC_NAME}.desktop
diff --git a/mail/thunderbird/distinfo b/mail/thunderbird/distinfo
index 17947d99bb3a..62589589f556 100644
--- a/mail/thunderbird/distinfo
+++ b/mail/thunderbird/distinfo
@@ -1,3 +1,3 @@
-TIMESTAMP = 1630575815
-SHA256 (thunderbird-78.14.0.source.tar.xz) = 63916611e28de0a2107ca882f56eb97ac44fd2967a3d75c082ffa5e3d58459e1
-SIZE (thunderbird-78.14.0.source.tar.xz) = 352766276
+TIMESTAMP = 1633376878
+SHA256 (thunderbird-91.2.0.source.tar.xz) = 30476803f0bd4a46d2516ac5cbb831fc580b81d5d704af17c7df81e2bb6ee075
+SIZE (thunderbird-91.2.0.source.tar.xz) = 403836192
diff --git a/mail/thunderbird/files/patch-addon-search b/mail/thunderbird/files/patch-addon-search
index 78b76a5d1fd1..38f261273f4b 100644
--- a/mail/thunderbird/files/patch-addon-search
+++ b/mail/thunderbird/files/patch-addon-search
@@ -1,11 +1,9 @@
https://github.com/mozilla/addons/issues/708
https://github.com/mozilla/addons-frontend/issues/4610
-diff --git mail/app/profile/all-thunderbird.js mail/app/profile/all-thunderbird.js
-index 75c2c5e435e35..4d8c09c02759b 100644
---- comm/mail/app/profile/all-thunderbird.js
-+++ comm/mail/app/profile/all-thunderbird.js
-@@ -153,10 +153,10 @@ pref("extensions.getAddons.maxResults", 15);
+--- comm/mail/app/profile/all-thunderbird.js.orig 2021-08-11 18:47:33.538900000 +0200
++++ comm/mail/app/profile/all-thunderbird.js 2021-08-11 18:51:30.055570000 +0200
+@@ -159,10 +159,10 @@
pref("extensions.getAddons.get.url", "https://services.addons.thunderbird.net/api/v3/addons/search/?guid=%IDS%&lang=%LOCALE%");
pref("extensions.getAddons.compatOverides.url", "https://services.addons.thunderbird.net/api/v3/addons/compat-override/?guid=%IDS%&lang=%LOCALE%");
pref("extensions.getAddons.link.url", "https://addons.thunderbird.net/%LOCALE%/%APP%/");
@@ -16,10 +14,10 @@ index 75c2c5e435e35..4d8c09c02759b 100644
-pref("extensions.webservice.discoverURL", "https://services.addons.thunderbird.net/%LOCALE%/%APP%/discovery/pane/%VERSION%/%OS%");
+pref("extensions.getAddons.search.url", "https://services.addons.thunderbird.net/%LOCALE%/%APP%/api/%API_VERSION%/search/%TERMS%/all/%MAX_RESULTS%/Linux/%VERSION%/%COMPATIBILITY_MODE%?src=thunderbird");
+pref("extensions.webservice.discoverURL", "https://services.addons.thunderbird.net/%LOCALE%/%APP%/discovery/pane/%VERSION%/Linux");
- pref("extensions.getAddons.siteRegExp", "^https://.*addons\\.thunderbird\\.net");
pref("extensions.getAddons.langpacks.url", "https://services.addons.thunderbird.net/api/v3/addons/language-tools/?app=thunderbird&type=language&appversion=%VERSION%");
+ pref("extensions.getAddons.discovery.api_url", "https://services.addons.thunderbird.net/api/v4/discovery/?lang=%LOCALE%&edition=%DISTRIBUTION%");
-@@ -180,9 +180,9 @@ pref("security.cert_pinning.enforcement_level", 1);
+@@ -191,9 +191,9 @@
// .. etc ..
//
pref("extensions.update.enabled", true);
@@ -31,11 +29,9 @@ index 75c2c5e435e35..4d8c09c02759b 100644
pref("extensions.update.interval", 86400); // Check for updates to Extensions and
// Themes every day
-diff --git toolkit/mozapps/extensions/internal/AddonRepository.jsm toolkit/mozapps/extensions/internal/AddonRepository.jsm
-index f70fd8d7e3bd8..81e8cd7764fdf 100644
---- toolkit/mozapps/extensions/internal/AddonRepository.jsm
-+++ toolkit/mozapps/extensions/internal/AddonRepository.jsm
-@@ -602,7 +602,7 @@ var AddonRepository = {
+--- toolkit/mozapps/extensions/internal/AddonRepository.jsm.orig 2021-08-11 18:52:27.424729000 +0200
++++ toolkit/mozapps/extensions/internal/AddonRepository.jsm 2021-08-11 18:54:16.222790000 +0200
+@@ -584,7 +584,7 @@
addon.version = String(aEntry.current_version.version);
if (Array.isArray(aEntry.current_version.files)) {
for (let file of aEntry.current_version.files) {
@@ -44,11 +40,9 @@ index f70fd8d7e3bd8..81e8cd7764fdf 100644
if (file.url) {
addon.sourceURI = NetUtil.newURI(file.url);
}
-diff --git toolkit/mozapps/extensions/internal/XPIDatabase.jsm toolkit/mozapps/extensions/internal/XPIDatabase.jsm
-index f70fd8d7e3bd8..81e8cd7764fdf 100644
---- toolkit/mozapps/extensions/internal/XPIDatabase.jsm
-+++ toolkit/mozapps/extensions/internal/XPIDatabase.jsm
-@@ -355,7 +355,7 @@ class AddonInternal {
+--- toolkit/mozapps/extensions/internal/XPIDatabase.jsm.orig 2021-08-11 18:55:01.952372000 +0200
++++ toolkit/mozapps/extensions/internal/XPIDatabase.jsm 2021-08-11 18:55:57.455245000 +0200
+@@ -483,7 +483,7 @@
// Something is causing errors in here
try {
for (let platform of this.targetPlatforms) {
@@ -56,4 +50,4 @@ index f70fd8d7e3bd8..81e8cd7764fdf 100644
+ if (platform.os == "Linux" || platform.os == Services.appinfo.OS) {
if (platform.abi) {
needsABI = true;
- if (platform.abi === abi)
+ if (platform.abi === abi) {
diff --git a/mail/thunderbird/files/patch-bug1288587 b/mail/thunderbird/files/patch-bug1288587
index bb3056c74d5f..0925ac98733c 100644
--- a/mail/thunderbird/files/patch-bug1288587
+++ b/mail/thunderbird/files/patch-bug1288587
@@ -2,36 +2,36 @@ diff --git a/build/moz.configure/init.configure b/build/moz.configure/init.confi
index 855214a..1e91d51 100644
--- build/moz.configure/init.configure
+++ build/moz.configure/init.configure
-@@ -251,6 +251,7 @@ option(env='PYTHON3', nargs=1, help='Python 3 interpre
- @imports(_from='mozbuild.pythonutil', _import='find_python3_executable')
- @imports(_from='mozbuild.pythonutil', _import='python_executable_version')
- @imports(_from='six', _import='ensure_text')
-+@imports(_from='__builtin__', _import='KeyError')
- def virtualenv_python3(env_python, virtualenv_name, build_env, mozconfig, help):
+@@ -238,6 +238,7 @@ option(
+ @imports(_from="mozbuild.pythonutil", _import="find_python3_executable")
+ @imports(_from="mozbuild.pythonutil", _import="python_executable_version")
+ @imports(_from="six", _import="ensure_text")
++@imports(_from="__builtin__", _import="KeyError")
+ def virtualenv_python3(env_python, build_env, mozconfig, help):
# Avoid re-executing python when running configure --help.
if help:
-@@ -283,6 +284,12 @@ def virtualenv_python3(env_python, build_env, mozconfi
- python = mozconfig['vars']['added']['PYTHON3']
- elif 'PYTHON3' in mozconfig['vars']['modified']:
- python = mozconfig['vars']['modified']['PYTHON3'][1]
-+ for i in ('env', 'vars'):
-+ for j in ('added', 'modified'):
+@@ -271,6 +272,12 @@ def virtualenv_python3(env_python, virtualenv_name, bu
+ python = mozconfig["vars"]["added"]["PYTHON3"]
+ elif "PYTHON3" in mozconfig["vars"]["modified"]:
+ python = mozconfig["vars"]["modified"]["PYTHON3"][1]
++ for i in ("env", "vars"):
++ for j in ("added", "modified"):
+ try:
-+ del mozconfig[i][j]['PYTHON3']
++ del mozconfig[i][j]["PYTHON3"]
+ except KeyError:
+ pass
log.debug("python3: executable from configuration: %r" % python)
-@@ -365,7 +372,10 @@ def virtualenv_python3(env_python, build_env, mozconfi
- sys.executable, manager.python_path))
- log.info('Re-executing in the virtualenv')
+@@ -364,7 +371,10 @@ def virtualenv_python3(env_python, virtualenv_name, bu
+ )
+ log.info("Re-executing in the virtualenv")
if env_python:
-- del os.environ['PYTHON3']
+- del os.environ["PYTHON3"]
+ try:
-+ del os.environ['PYTHON3']
++ del os.environ["PYTHON3"]
+ except KeyError:
+ pass
- # Homebrew on macOS will change Python's sys.executable to a custom
- # value which messes with mach's virtualenv handling code. Override
- # Homebrew's changes with the correct sys.executable value.
+ # Another quirk on macOS, with the system python, the virtualenv is
+ # not fully operational (missing entries in sys.path) if
+ # __PYVENV_LAUNCHER__ is set.
diff --git a/mail/thunderbird/files/patch-bug1559213 b/mail/thunderbird/files/patch-bug1559213
index 0100df8d09b0..16928f792f89 100644
--- a/mail/thunderbird/files/patch-bug1559213
+++ b/mail/thunderbird/files/patch-bug1559213
@@ -14,24 +14,24 @@ diff --git config/external/moz.build config/external/moz.build
index 03e4fa143bd1..a67d10b11fe6 100644
--- config/external/moz.build
+++ config/external/moz.build
-@@ -37,8 +37,9 @@ if not CONFIG['MOZ_SYSTEM_LIBVPX']:
- external_dirs += ['media/libvpx']
+@@ -40,8 +40,9 @@ if not CONFIG["MOZ_SYSTEM_LIBVPX"]:
+ external_dirs += ["media/libvpx"]
- if CONFIG['MOZ_AV1']:
-- external_dirs += ['media/libaom']
-- external_dirs += ['media/libdav1d']
-+ if not CONFIG['MOZ_SYSTEM_AV1']:
-+ external_dirs += ['media/libaom']
-+ external_dirs += ['media/libdav1d']
+ if CONFIG["MOZ_AV1"]:
+- external_dirs += ["media/libaom"]
+- external_dirs += ["media/libdav1d"]
++ if not CONFIG["MOZ_SYSTEM_AV1"]:
++ external_dirs += ["media/libaom"]
++ external_dirs += ["media/libdav1d"]
- if not CONFIG['MOZ_SYSTEM_PNG']:
- external_dirs += ['media/libpng']
+ if not CONFIG["MOZ_SYSTEM_PNG"]:
+ external_dirs += ["media/libpng"]
diff --git config/system-headers.mozbuild config/system-headers.mozbuild
index bcf5c4925564..48964a999a9b 100644
--- config/system-headers.mozbuild
+++ config/system-headers.mozbuild
-@@ -1304,6 +1304,14 @@ if CONFIG['MOZ_ENABLE_CONTENTMANAGER']:
- 'SelectSingleContentItemPage.h',
+@@ -1305,6 +1305,14 @@ if CONFIG['MOZ_SYSTEM_HARFBUZZ']:
+ 'harfbuzz/hb.h',
]
+if CONFIG['MOZ_SYSTEM_AV1']:
@@ -49,9 +49,9 @@ diff --git dom/media/platforms/moz.build dom/media/platforms/moz.build
index 092cee0c9b66..38e45de5b5f0 100644
--- dom/media/platforms/moz.build
+++ dom/media/platforms/moz.build
-@@ -80,6 +80,11 @@ if CONFIG['MOZ_AV1']:
- 'agnostic/AOMDecoder.cpp',
- 'agnostic/DAV1DDecoder.cpp',
+@@ -78,6 +78,11 @@ if CONFIG["MOZ_AV1"]:
+ "agnostic/AOMDecoder.cpp",
+ "agnostic/DAV1DDecoder.cpp",
]
+ if CONFIG['MOZ_SYSTEM_AV1']:
+ CXXFLAGS += CONFIG['MOZ_SYSTEM_LIBAOM_CFLAGS']
@@ -59,25 +59,25 @@ index 092cee0c9b66..38e45de5b5f0 100644
+ CXXFLAGS += CONFIG['MOZ_SYSTEM_LIBDAV1D_CFLAGS']
+ OS_LIBS += CONFIG['MOZ_SYSTEM_LIBDAV1D_LIBS']
- if CONFIG['MOZ_OMX']:
+ if CONFIG["MOZ_OMX"]:
EXPORTS += [
diff --git toolkit/moz.configure toolkit/moz.configure
index 82b5a59acf42..e2329560b42b 100644
---- toolkit/moz.configure
-+++ toolkit/moz.configure
-@@ -441,7 +441,23 @@ def av1(value):
- if value:
+--- toolkit/moz.configure.orig 2021-04-13 16:12:34.770032000 +0200
++++ toolkit/moz.configure 2021-04-18 00:03:41.432698000 +0200
+@@ -538,7 +538,23 @@
return True
--@depends(target, nasm_version, when=av1 & compile_environment)
-+option('--with-system-av1',
+
+-@depends(target, when=av1 & compile_environment)
++option("--with-system-av1",
+ help="Use system av1 (located with pkgconfig)")
+
-+system_libaom_info = pkg_check_modules('MOZ_SYSTEM_LIBAOM', 'aom >= 1.0.0',
-+ when='--with-system-av1')
++system_libaom_info = pkg_check_modules("MOZ_SYSTEM_LIBAOM", "aom >= 1.0.0",
++ when="--with-system-av1")
+
-+system_libdav1d_info = pkg_check_modules('MOZ_SYSTEM_LIBDAV1D', 'dav1d >= 0.1.1',
-+ when='--with-system-av1')
++system_libdav1d_info = pkg_check_modules("MOZ_SYSTEM_LIBDAV1D", "dav1d >= 0.1.1",
++ when="--with-system-av1")
+
+@depends(system_libaom_info, system_libdav1d_info)
+def system_av1(system_libaom_info, system_libdav1d_info):
@@ -86,15 +86,15 @@ index 82b5a59acf42..e2329560b42b 100644
+ has_av1_libs = True
+ return has_av1_libs
+
-+@depends(target, nasm_version, when=av1 & depends(system_av1)(lambda v: not v) & compile_environment)
- def dav1d_asm(target, nasm_version):
- if target.os != 'Android':
- if target.cpu == 'aarch64':
-@@ -457,6 +473,7 @@ set_config('MOZ_DAV1D_ASM', dav1d_asm)
- set_define('MOZ_DAV1D_ASM', dav1d_asm)
- set_config('MOZ_AV1', av1)
- set_define('MOZ_AV1', av1)
-+set_config('MOZ_SYSTEM_AV1', depends_if(system_av1)(lambda _: True))
++@depends(target, when=av1 & depends(system_av1)(lambda v: not v) & compile_environment)
+ def dav1d_asm(target):
+ if target.cpu in ("aarch64", "x86", "x86_64"):
+ return True
+@@ -554,6 +570,7 @@
+ set_define("MOZ_DAV1D_ASM", dav1d_asm)
+ set_config("MOZ_AV1", av1)
+ set_define("MOZ_AV1", av1)
++set_config("MOZ_SYSTEM_AV1", depends_if(system_av1)(lambda _: True))
# Built-in fragmented MP4 support.
# ==============================================================
diff --git a/mail/thunderbird/files/patch-bug1612184 b/mail/thunderbird/files/patch-bug1612184
index a969fae1f871..33d391a3b647 100644
--- a/mail/thunderbird/files/patch-bug1612184
+++ b/mail/thunderbird/files/patch-bug1612184
@@ -4,7 +4,7 @@ https://bug1612184.bmoattachments.org/attachment.cgi?id=9126363
diff -r 388a4d04e911 media/webrtc/gn-configs/ppc64_False_ppc64_freebsd.json
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
-+++ media/webrtc/gn-configs/ppc64_False_ppc64_freebsd.json Thu Feb 13 11:11:51 2020 +0100
++++ dom/media/webrtc/third_party_build/gn-configs/ppc64_False_ppc64_freebsd.json Thu Feb 13 11:11:51 2020 +0100
@@ -0,0 +1,13237 @@
+{
+ "gn_gen_args": {
@@ -13246,7 +13246,7 @@ diff -r 388a4d04e911 media/webrtc/gn-configs/ppc64_False_ppc64_freebsd.json
\ No newline at end of file
diff -r 388a4d04e911 media/webrtc/gn-configs/ppc64_True_ppc64_freebsd.json
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
-+++ media/webrtc/gn-configs/ppc64_True_ppc64_freebsd.json Thu Feb 13 11:11:51 2020 +0100
++++ dom/media/webrtc/third_party_build/gn-configs/ppc64_True_ppc64_freebsd.json Thu Feb 13 11:11:51 2020 +0100
@@ -0,0 +1,12693 @@
+{
+ "gn_gen_args": {
@@ -25943,17 +25943,17 @@ diff -r 388a4d04e911 media/webrtc/gn-configs/ppc64_True_ppc64_freebsd.json
+}
\ No newline at end of file
diff -r 388a4d04e911 media/webrtc/trunk/webrtc/moz.build
---- media/webrtc/trunk/webrtc/moz.build Wed Jan 29 05:21:52 2020 +0000
-+++ media/webrtc/trunk/webrtc/moz.build Thu Feb 13 11:12:15 2020 +0100
-@@ -291,6 +291,13 @@
- "/media/webrtc/trunk/webrtc/modules/video_processing/video_processing_neon_gn"
+--- third_party/libwebrtc/webrtc/moz.build.orig 2020-11-10 17:07:54 UTC
++++ third_party/libwebrtc/webrtc/moz.build
+@@ -312,6 +312,13 @@ if CONFIG["CPU_ARCH"] == "arm" and CONFIG["OS_TARGET"]
+ "/third_party/libwebrtc/webrtc/modules/video_processing/video_processing_neon_gn"
]
+if CONFIG["CPU_ARCH"] == "ppc64" and CONFIG["OS_TARGET"] == "FreeBSD":
+
+ DIRS += [
-+ "/media/webrtc/trunk/webrtc/api/audio_codecs/isac/audio_decoder_isac_float_gn",
-+ "/media/webrtc/trunk/webrtc/api/audio_codecs/isac/audio_encoder_isac_float_gn"
++ "/third_party/libwebrtc/webrtc/api/audio_codecs/isac/audio_decoder_isac_float_gn",
++ "/third_party/libwebrtc/webrtc/api/audio_codecs/isac/audio_encoder_isac_float_gn"
+ ]
+
if CONFIG["CPU_ARCH"] == "x86" and CONFIG["OS_TARGET"] == "FreeBSD":
diff --git a/mail/thunderbird/files/patch-bug1618914 b/mail/thunderbird/files/patch-bug1618914
index 817d00032222..c52ac49018b2 100644
--- a/mail/thunderbird/files/patch-bug1618914
+++ b/mail/thunderbird/files/patch-bug1618914
@@ -1,10 +1,17 @@
-[Wayland] Fall back to ftruncate if posix_fallocate isn't supported by filesystem.
+From cea8e6a01bb03bbe565c9bf5dd4f439f30ca953f Mon Sep 17 00:00:00 2001
+From: Jan Beich <jbeich@FreeBSD.org>
+Date: Fri, 28 Feb 2020 16:49:38 +0000
+Subject: Bug 1618914 - [Wayland] Fall back to ftruncate if posix_fallocate isn't supported by filesystem.
-diff --git widget/gtk/WindowSurfaceWayland.cpp widget/gtk/WindowSurfaceWayland.cpp
-index 9a73326399bd5..9e42a7f1c5d18 100644
---- widget/gtk/WindowSurfaceWayland.cpp
-+++ widget/gtk/WindowSurfaceWayland.cpp
-@@ -222,20 +222,21 @@ static int WaylandAllocateShmMemory(int aSize) {
+diff --git widget/gtk/WaylandShmBuffer.cpp widget/gtk/WaylandShmBuffer.cpp
+index 42eeedd3429ac..2a5c23d287413 100644
+--- widget/gtk/WaylandShmBuffer.cpp
++++ widget/gtk/WaylandShmBuffer.cpp
+@@ -67,36 +67,37 @@ static int WaylandAllocateShmMemory(int aSize) {
+ return -1;
+ }
+
+ int ret = 0;
#ifdef HAVE_POSIX_FALLOCATE
do {
ret = posix_fallocate(fd, 0, aSize);
@@ -13,8 +20,12 @@ index 9a73326399bd5..9e42a7f1c5d18 100644
+ if (ret == 0) {
+ return fd;
+ } else if (ret != ENODEV && ret != EINVAL && ret != EOPNOTSUPP) {
+ NS_WARNING(
+ nsPrintfCString("posix_fallocate() fails to allocate shm memory: %s",
+ strerror(ret))
+ .get());
close(fd);
- MOZ_CRASH("posix_fallocate() fails to allocate shm memory");
+ return -1;
}
-#else
+#endif
@@ -22,20 +33,18 @@ index 9a73326399bd5..9e42a7f1c5d18 100644
ret = ftruncate(fd, aSize);
} while (ret < 0 && errno == EINTR);
if (ret < 0) {
+ NS_WARNING(nsPrintfCString("ftruncate() fails to allocate shm memory: %s",
+ strerror(ret))
+ .get());
close(fd);
- MOZ_CRASH("ftruncate() fails to allocate shm memory");
+ fd = -1;
}
-#endif
return fd;
}
-@@ -265,8 +266,8 @@ bool WaylandShmPool::Resize(int aSize) {
- #ifdef HAVE_POSIX_FALLOCATE
- do {
- errno = posix_fallocate(mShmPoolFd, 0, aSize);
- } while (errno == EINTR);
-- if (errno != 0) return false;
-+ if (errno != 0 && errno != ENODEV && errno != EINVAL && errno != EOPNOTSUPP) return false;
- #endif
- wl_shm_pool_resize(mShmPool, aSize);
+ /* static */
+ RefPtr<WaylandShmPool> WaylandShmPool::Create(
+ const RefPtr<nsWaylandDisplay>& aWaylandDisplay, int aSize) {
+ RefPtr<WaylandShmPool> shmPool = new WaylandShmPool(aSize);
diff --git a/mail/thunderbird/files/patch-bug1628567 b/mail/thunderbird/files/patch-bug1628567
index f48f78bcfd0d..32b0dc260d22 100644
--- a/mail/thunderbird/files/patch-bug1628567
+++ b/mail/thunderbird/files/patch-bug1628567
@@ -1,8 +1,10 @@
Don't pass --target when CC/CXX contains clang
---- third_party/rust/cc/src/lib.rs.orig 2020-04-10 00:57:23 UTC
+diff --git third_party/rust/cc/src/lib.rs third_party/rust/cc/src/lib.rs
+index 9d133a0..273e520 100644
+--- third_party/rust/cc/src/lib.rs
+++ third_party/rust/cc/src/lib.rs
-@@ -2344,28 +2344,7 @@ impl Tool {
+@@ -2667,24 +2667,7 @@ impl Tool {
}
fn with_features(path: PathBuf, clang_driver: Option<&str>, cuda: bool) -> Self {
@@ -10,11 +12,7 @@ Don't pass --target when CC/CXX contains clang
- let family = if let Some(fname) = path.file_name().and_then(|p| p.to_str()) {
- if fname.contains("clang-cl") {
- ToolFamily::Msvc { clang_cl: true }
-- } else if fname.contains("cl")
-- && !fname.contains("cloudabi")
-- && !fname.contains("uclibc")
-- && !fname.contains("clang")
-- {
+- } else if fname.ends_with("cl") || fname == "cl.exe" {
- ToolFamily::Msvc { clang_cl: false }
- } else if fname.contains("clang") {
- match clang_driver {
diff --git a/mail/thunderbird/files/patch-bug1694575 b/mail/thunderbird/files/patch-bug1694575
deleted file mode 100644
index bbc563272934..000000000000
--- a/mail/thunderbird/files/patch-bug1694575
+++ /dev/null
@@ -1,33 +0,0 @@
-changeset: 569030:f875a4ffd653
-user: Mike Hommey <mh+mozilla@glandium.org>
-date: Sun Feb 28 17:47:27 2021 +0000
-summary: Bug 1694575 - Don't include mozalloc.h from the iosfwd wrapper. r=andi
-
-diff -r d31bf2fc599d -r f875a4ffd653 config/gcc-stl-wrapper.template.h
---- config/gcc-stl-wrapper.template.h Sun Feb 28 14:59:31 2021 +0000
-+++ config/gcc-stl-wrapper.template.h Sun Feb 28 17:47:27 2021 +0000
-@@ -27,7 +27,11 @@
- // # define _GLIBCXX_DEBUG 1
- #endif
-
--// Don't include mozalloc for cstdlib. See bug 1245076.
-+// Don't include mozalloc.h for cstdlib, type_traits, limits and iosfwd.
-+// See bug 1245076 (cstdlib), bug 1594027 (type_traits, limits) and
-+// bug 1694575 (iosfwd).
-+// Please be careful when adding more exceptions, especially regarding
-+// the header not directly or indirectly including <new>.
- #ifndef moz_dont_include_mozalloc_for_cstdlib
- # define moz_dont_include_mozalloc_for_cstdlib
- #endif
-@@ -40,6 +44,10 @@
- # define moz_dont_include_mozalloc_for_limits
- #endif
-
-+#ifndef moz_dont_include_mozalloc_for_iosfwd
-+# define moz_dont_include_mozalloc_for_iosfwd
-+#endif
-+
- // Include mozalloc after the STL header and all other headers it includes
- // have been preprocessed.
- #if !defined(MOZ_INCLUDE_MOZALLOC_H) && \
-
diff --git a/mail/thunderbird/files/patch-bug1729459_comment12 b/mail/thunderbird/files/patch-bug1729459_comment12
new file mode 100644
index 000000000000..dda42170f71b
--- /dev/null
+++ b/mail/thunderbird/files/patch-bug1729459_comment12
@@ -0,0 +1,93 @@
+--- modules/fdlibm/src/math_private.h.orig 2021-09-30 19:32:33.764224000 +0200
++++ modules/fdlibm/src/math_private.h 2021-10-02 22:15:33.265122000 +0200
+@@ -30,7 +30,11 @@
+ * Adapted from https://github.com/freebsd/freebsd-src/search?q=__double_t
+ */
+
+-typedef double __double_t;
++#ifdef __LP64__
++typedef double __double_t;
++#else
++typedef long double __double_t;
++#endif
+ typedef __double_t double_t;
+
+ /*
+@@ -630,7 +634,37 @@
+ return ((double)(x + 0x1.8p52) - 0x1.8p52);
+ }
+
++static inline float
++rnintf(__float_t x)
++{
++ /*
++ * As for rnint(), except we could just call that to handle the
++ * extra precision case, usually without losing efficiency.
++ */
++ return ((float)(x + 0x1.8p23F) - 0x1.8p23F);
++}
++
++#ifdef LDBL_MANT_DIG
+ /*
++ * The complications for extra precision are smaller for rnintl() since it
++ * can safely assume that the rounding precision has been increased from
++ * its default to FP_PE on x86. We don't exploit that here to get small
++ * optimizations from limiting the rangle to double. We just need it for
++ * the magic number to work with long doubles. ld128 callers should use
++ * rnint() instead of this if possible. ld80 callers should prefer
++ * rnintl() since for amd64 this avoids swapping the register set, while
++ * for i386 it makes no difference (assuming FP_PE), and for other arches
++ * it makes little difference.
++ */
++static inline long double
++rnintl(long double x)
++{
++ return (x + __CONCAT(0x1.8p, LDBL_MANT_DIG) / 2 -
++ __CONCAT(0x1.8p, LDBL_MANT_DIG) / 2);
++}
++#endif /* LDBL_MANT_DIG */
++
++/*
+ * irint() and i64rint() give the same result as casting to their integer
+ * return type provided their arg is a floating point integer. They can
+ * sometimes be more efficient because no rounding is required.
+@@ -644,6 +678,39 @@
+ sizeof(x) == sizeof(long double) ? irintl(x) : (int)(x))
+ #else
+ #define irint(x) ((int)(x))
++#endif
++
++#define i64rint(x) ((int64_t)(x)) /* only needed for ld128 so not opt. */
++
++#if defined(__i386__) && defined(__GNUCLIKE_ASM)
++static __inline int
++irintf(float x)
++{
++ int n;
++
++ __asm("fistl %0" : "=m" (n) : "t" (x));
++ return (n);
++}
++
++static __inline int
++irintd(double x)
++{
++ int n;
++
++ __asm("fistl %0" : "=m" (n) : "t" (x));
++ return (n);
++}
++#endif
++
++#if (defined(__amd64__) || defined(__i386__)) && defined(__GNUCLIKE_ASM)
++static __inline int
++irintl(long double x)
++{
++ int n;
++
++ __asm("fistl %0" : "=m" (n) : "t" (x));
++ return (n);
++}
+ #endif
+
+ #ifdef DEBUG
diff --git a/mail/thunderbird/files/patch-bug847568 b/mail/thunderbird/files/patch-bug847568
index 88511da00630..3f688427b494 100644
--- a/mail/thunderbird/files/patch-bug847568
+++ b/mail/thunderbird/files/patch-bug847568
@@ -4,7 +4,7 @@ diff --git config/system-headers.mozbuild config/system-headers.mozbuild
index 7620b4d00623..09d3db5ca8c0 100644
--- config/system-headers.mozbuild
+++ config/system-headers.mozbuild
-@@ -1299,6 +1299,19 @@ if CONFIG['MOZ_ENABLE_LIBPROXY']:
+@@ -1292,6 +1292,19 @@ if CONFIG['MOZ_ENABLE_LIBPROXY']:
'proxy.h',
]
@@ -28,16 +28,16 @@ diff --git dom/base/moz.build dom/base/moz.build
index 8e19020315ae..2fcdbb6f7b42 100644
--- dom/base/moz.build
+++ dom/base/moz.build
-@@ -543,6 +543,9 @@ if CONFIG['MOZ_BUILD_APP'] in ['browser', 'mobile/android', 'xulrunner']:
- if CONFIG['MOZ_X11']:
- CXXFLAGS += CONFIG['TK_CFLAGS']
+@@ -546,6 +546,9 @@ if CONFIG["MOZ_BUILD_APP"] in ["browser", "mobile/android", "xulrunner"]:
+ if CONFIG["MOZ_X11"]:
+ CXXFLAGS += CONFIG["TK_CFLAGS"]
-+if CONFIG['MOZ_SYSTEM_HARFBUZZ']:
-+ CXXFLAGS += CONFIG['MOZ_HARFBUZZ_CFLAGS']
++if CONFIG["MOZ_SYSTEM_HARFBUZZ"]:
++ CXXFLAGS += CONFIG["MOZ_HARFBUZZ_CFLAGS"]
+
- GeneratedFile('UseCounterList.h', script='gen-usecounters.py',
- entry_point='use_counter_list', inputs=['UseCounters.conf'])
-
+ GeneratedFile(
+ "UseCounterList.h",
+ script="gen-usecounters.py",
diff --git gfx/graphite2/geckoextra/moz.build gfx/graphite2/geckoextra/moz.build
new file mode 100644
index 0000000000000..24e8d7a03274a
@@ -112,35 +112,35 @@ diff --git gfx/moz.build gfx/moz.build
index 771f652e837a..3b358d84e384 100644
--- gfx/moz.build
+++ gfx/moz.build
-@@ -13,6 +13,14 @@ with Files('wr/**'):
- if CONFIG['MOZ_TREE_CAIRO']:
- DIRS += ['cairo']
+@@ -13,6 +13,14 @@ with Files("wr/**"):
+ if CONFIG["MOZ_TREE_CAIRO"]:
+ DIRS += ["cairo"]
-+if CONFIG['MOZ_SYSTEM_GRAPHITE2']:
-+ DIRS += ['graphite2/geckoextra']
++if CONFIG["MOZ_SYSTEM_GRAPHITE2"]:
++ DIRS += ["graphite2/geckoextra"]
+else:
-+ DIRS += ['graphite2/src' ]
++ DIRS += ["graphite2/src" ]
+
-+if not CONFIG['MOZ_SYSTEM_HARFBUZZ']:
-+ DIRS += ['harfbuzz/src']
++if not CONFIG["MOZ_SYSTEM_HARFBUZZ"]:
++ DIRS += ["harfbuzz/src"]
+
DIRS += [
- '2d',
- 'ycbcr',
+ "2d",
+ "ycbcr",
@@ -21,8 +29,6 @@ DIRS += [
- 'qcms',
- 'gl',
- 'layers',
-- 'graphite2/src',
-- 'harfbuzz/src',
- 'ots/src',
- 'thebes',
- 'ipc',
+ "qcms",
+ "gl",
+ "layers",
+- "graphite2/src",
+- "harfbuzz/src",
+ "ots/src",
+ "thebes",
+ "ipc",
diff --git gfx/skia/generate_mozbuild.py gfx/skia/generate_mozbuild.py
index e06ae3457a47..93faa61594a3 100755
--- gfx/skia/generate_mozbuild.py
+++ gfx/skia/generate_mozbuild.py
-@@ -117,6 +117,9 @@ if CONFIG['CC_TYPE'] in ('clang', 'clang-cl'):
+@@ -98,6 +98,9 @@ if CONFIG['CC_TYPE'] in ('clang', 'clang-cl'):
'-Wno-unused-private-field',
]
@@ -154,7 +154,7 @@ diff --git gfx/skia/moz.build gfx/skia/moz.build
index 2118677ca3a8..e4978b413784 100644
--- gfx/skia/moz.build
+++ gfx/skia/moz.build
-@@ -493,6 +493,9 @@ if CONFIG['CC_TYPE'] in ('clang', 'clang-cl'):
+@@ -490,6 +490,9 @@ if CONFIG['CC_TYPE'] in ('clang', 'clang-cl'):
'-Wno-unused-private-field',
]
@@ -168,49 +168,49 @@ diff --git gfx/thebes/moz.build gfx/thebes/moz.build
index 56f1b9fe3f4b..0ac1100b0df3 100644
--- gfx/thebes/moz.build
+++ gfx/thebes/moz.build
-@@ -284,7 +284,13 @@ if CONFIG['MOZ_WAYLAND']:
+@@ -287,7 +287,13 @@ if CONFIG["MOZ_WAYLAND"]:
- LOCAL_INCLUDES += CONFIG['SKIA_INCLUDES']
+ LOCAL_INCLUDES += CONFIG["SKIA_INCLUDES"]
--DEFINES['GRAPHITE2_STATIC'] = True
-+if CONFIG['MOZ_SYSTEM_GRAPHITE2']:
-+ CXXFLAGS += CONFIG['MOZ_GRAPHITE2_CFLAGS']
+-DEFINES["GRAPHITE2_STATIC"] = True
++if CONFIG["MOZ_SYSTEM_GRAPHITE2"]:
++ CXXFLAGS += CONFIG["MOZ_GRAPHITE2_CFLAGS"]
+else:
-+ DEFINES['GRAPHITE2_STATIC'] = True
++ DEFINES["GRAPHITE2_STATIC"] = True
+
-+if CONFIG['MOZ_SYSTEM_HARFBUZZ']:
-+ CXXFLAGS += CONFIG['MOZ_HARFBUZZ_CFLAGS']
++if CONFIG["MOZ_SYSTEM_HARFBUZZ"]:
++ CXXFLAGS += CONFIG["MOZ_HARFBUZZ_CFLAGS"]
- if CONFIG['CC_TYPE'] == 'clang':
+ if CONFIG["CC_TYPE"] == "clang":
# Suppress warnings from Skia header files.
diff --git intl/unicharutil/util/moz.build intl/unicharutil/util/moz.build
index cb1233c56d7e..06fb1f9f174b 100644
--- intl/unicharutil/util/moz.build
+++ intl/unicharutil/util/moz.build
@@ -25,4 +25,7 @@ UNIFIED_SOURCES += [
- 'nsUnicodeProperties.cpp',
+ "nsUnicodeProperties.cpp",
]
-+if CONFIG['MOZ_SYSTEM_HARFBUZZ']:
-+ CXXFLAGS += CONFIG['MOZ_HARFBUZZ_CFLAGS']
++if CONFIG["MOZ_SYSTEM_HARFBUZZ"]:
++ CXXFLAGS += CONFIG["MOZ_HARFBUZZ_CFLAGS"]
+
- FINAL_LIBRARY = 'xul'
+ FINAL_LIBRARY = "xul"
diff --git netwerk/dns/moz.build netwerk/dns/moz.build
index 79c26e3e7001..c4d93bc5f7dc 100644
--- netwerk/dns/moz.build
+++ netwerk/dns/moz.build
-@@ -86,3 +86,6 @@ USE_LIBS += ['icu']
+@@ -105,3 +105,6 @@ USE_LIBS += ["icu"]
- if CONFIG['CC_TYPE'] in ('clang', 'gcc'):
- CXXFLAGS += ['-Wno-error=shadow']
+ if CONFIG["CC_TYPE"] in ("clang", "gcc"):
+ CXXFLAGS += ["-Wno-error=shadow"]
+
-+if CONFIG['MOZ_SYSTEM_HARFBUZZ']:
-+ CXXFLAGS += CONFIG['MOZ_HARFBUZZ_CFLAGS']
++if CONFIG["MOZ_SYSTEM_HARFBUZZ"]:
++ CXXFLAGS += CONFIG["MOZ_HARFBUZZ_CFLAGS"]
diff --git old-configure.in old-configure.in
index 95a58b634593..b614eef85c89 100644
--- old-configure.in
+++ old-configure.in
-@@ -2639,6 +2639,27 @@ dnl ========================================================
+@@ -2303,6 +2303,27 @@ dnl ========================================================
AC_SUBST(MOZ_LINUX_32_SSE2_STARTUP_ERROR)
@@ -242,46 +242,46 @@ diff --git toolkit/library/moz.build toolkit/library/moz.build
index 24f940e1ed7e..079a575adec3 100644
--- toolkit/library/moz.build
+++ toolkit/library/moz.build
-@@ -248,6 +248,12 @@ if CONFIG['MOZ_SYSTEM_PNG']:
- if CONFIG['MOZ_SYSTEM_WEBP']:
- OS_LIBS += CONFIG['MOZ_WEBP_LIBS']
+@@ -247,6 +247,12 @@ if CONFIG["MOZ_SYSTEM_PNG"]:
+ if CONFIG["MOZ_SYSTEM_WEBP"]:
+ OS_LIBS += CONFIG["MOZ_WEBP_LIBS"]
-+if CONFIG['MOZ_SYSTEM_GRAPHITE2']:
-+ OS_LIBS += CONFIG['MOZ_GRAPHITE2_LIBS']
++if CONFIG["MOZ_SYSTEM_GRAPHITE2"]:
++ OS_LIBS += CONFIG["MOZ_GRAPHITE2_LIBS"]
+
-+if CONFIG['MOZ_SYSTEM_HARFBUZZ']:
-+ OS_LIBS += CONFIG['MOZ_HARFBUZZ_LIBS']
++if CONFIG["MOZ_SYSTEM_HARFBUZZ"]:
++ OS_LIBS += CONFIG["MOZ_HARFBUZZ_LIBS"]
+
- if CONFIG['MOZ_SYSTEM_LIBEVENT']:
- OS_LIBS += CONFIG['MOZ_LIBEVENT_LIBS']
+ if CONFIG["MOZ_SYSTEM_LIBEVENT"]:
+ OS_LIBS += CONFIG["MOZ_LIBEVENT_LIBS"]
diff --git toolkit/moz.configure toolkit/moz.configure
index 9297e4d6f501..d8e273887e4b 100644
--- toolkit/moz.configure
+++ toolkit/moz.configure
-@@ -937,6 +937,25 @@ add_old_configure_assignment('FT2_LIBS',
- add_old_configure_assignment('FT2_CFLAGS',
- ft2_info.cflags)
+@@ -1055,6 +1055,25 @@ set_config("FT2_LIBS", ft2_info.libs)
+ add_old_configure_assignment("FT2_LIBS", ft2_info.libs)
+ add_old_configure_assignment("FT2_CFLAGS", ft2_info.cflags)
+# Graphite2
+# ==============================================================
-+option('--with-system-graphite2',
++option("--with-system-graphite2",
+ help="Use system graphite2 (located with pkgconfig)")
+
-+system_graphite2 = pkg_check_modules('MOZ_GRAPHITE2', 'graphite2',
-+ when='--with-system-graphite2')
++system_graphite2 = pkg_check_modules("MOZ_GRAPHITE2", "graphite2",
++ when="--with-system-graphite2")
+
-+set_config('MOZ_SYSTEM_GRAPHITE2', depends_if(system_graphite2)(lambda _: True))
++set_config("MOZ_SYSTEM_GRAPHITE2", depends_if(system_graphite2)(lambda _: True))
+
+# HarfBuzz
+# ==============================================================
-+option('--with-system-harfbuzz',
++option("--with-system-harfbuzz",
+ help="Use system harfbuzz (located with pkgconfig)")
+
-+system_harfbuzz = pkg_check_modules('MOZ_HARFBUZZ', 'harfbuzz >= 2.6.6',
-+ when='--with-system-harfbuzz')
++system_harfbuzz = pkg_check_modules("MOZ_HARFBUZZ", "harfbuzz >= 2.7.4",
++ when="--with-system-harfbuzz")
+
-+set_config('MOZ_SYSTEM_HARFBUZZ', depends_if(system_harfbuzz)(lambda _: True))
++set_config("MOZ_SYSTEM_HARFBUZZ", depends_if(system_harfbuzz)(lambda _: True))
- # Remote agent (part of CDP based remote protocol)
- # ==============================================================
+ # Remote agent
+ # (partial implementation of Chromium Remote Debugging Protocol)
diff --git a/mail/thunderbird/files/patch-comm__third_party__rnpdefs.mozbuild b/mail/thunderbird/files/patch-comm__third_party__rnpdefs.mozbuild
new file mode 100644
index 000000000000..1042cf20ce9f
--- /dev/null
+++ b/mail/thunderbird/files/patch-comm__third_party__rnpdefs.mozbuild
@@ -0,0 +1,10 @@
+--- comm/third_party/rnpdefs.mozbuild.orig 2021-08-11 20:13:25.176921000 +0200
++++ comm/third_party/rnpdefs.mozbuild 2021-08-11 20:14:08.855374000 +0200
+@@ -43,6 +43,6 @@
+ OS_LIBS += [static_libdir, "-l:libc++.a", "-l:libc++abi.a"]
+
+
+-if CONFIG["OS_ARCH"] in ("Linux", "SunOS"):
++if CONFIG["OS_ARCH"] in ("Linux", "FreeBSD", "DragonFly", "SunOS"):
+ CFLAGS += ["-fPIC"]
+ CXXFLAGS += ["-fPIC"]
diff --git a/mail/thunderbird/files/patch-cubeb-oss b/mail/thunderbird/files/patch-cubeb-oss
deleted file mode 100644
index 41185cf141fd..000000000000
--- a/mail/thunderbird/files/patch-cubeb-oss
+++ /dev/null
@@ -1,1324 +0,0 @@
-https://github.com/kinetiknz/cubeb/pull/600
-
---- dom/media/CubebUtils.cpp.orig 2020-08-19 02:08:51 UTC
-+++ dom/media/CubebUtils.cpp
-@@ -126,7 +126,7 @@ const char kBrandBundleURL[] = "chrome://branding/locale/brand.properties";
-
- const char* AUDIOSTREAM_BACKEND_ID_STR[] = {
- "jack", "pulse", "alsa", "audiounit", "audioqueue", "wasapi",
-- "winmm", "directsound", "sndio", "opensl", "audiotrack", "kai"};
-+ "winmm", "directsound", "sndio", "opensl", "oss", "audiotrack", "kai"};
- /* Index for failures to create an audio stream the first time. */
- const int CUBEB_BACKEND_INIT_FAILURE_FIRST =
- ArrayLength(AUDIOSTREAM_BACKEND_ID_STR);
---- media/libcubeb/src/moz.build.orig 2020-08-19 02:09:19 UTC
-+++ media/libcubeb/src/moz.build
-@@ -40,6 +40,12 @@ if CONFIG['MOZ_JACK']:
- ]
- DEFINES['USE_JACK'] = True
-
-+if CONFIG['OS_ARCH'] in ('DragonFly', 'FreeBSD', 'SunOS'):
-+ SOURCES += [
-+ 'cubeb_oss.c',
-+ ]
-+ DEFINES['USE_OSS'] = True
-+
- if CONFIG['OS_ARCH'] == 'OpenBSD':
- SOURCES += [
- 'cubeb_sndio.c',
---- media/libcubeb/src/cubeb.c.orig 2020-08-19 02:09:26 UTC
-+++ media/libcubeb/src/cubeb.c
-@@ -60,6 +60,9 @@ int sun_init(cubeb ** context, char const * context_name);
- #if defined(USE_OPENSL)
- int opensl_init(cubeb ** context, char const * context_name);
- #endif
-+#if defined(USE_OSS)
-+int oss_init(cubeb ** context, char const * context_name);
-+#endif
- #if defined(USE_AUDIOTRACK)
- int audiotrack_init(cubeb ** context, char const * context_name);
- #endif
-@@ -165,6 +168,10 @@ cubeb_init(cubeb ** context, char const * context_name, char const * backend_nam
- #if defined(USE_OPENSL)
- init_oneshot = opensl_init;
- #endif
-+ } else if (!strcmp(backend_name, "oss")) {
-+#if defined(USE_OSS)
-+ init_oneshot = oss_init;
-+#endif
- } else if (!strcmp(backend_name, "audiotrack")) {
- #if defined(USE_AUDIOTRACK)
- init_oneshot = audiotrack_init;
-@@ -200,6 +207,9 @@ cubeb_init(cubeb ** context, char const * context_name, char const * backend_nam
- #if defined(USE_ALSA)
- alsa_init,
- #endif
-+#if defined (USE_OSS)
-+ oss_init,
-+#endif
- #if defined(USE_AUDIOUNIT_RUST)
- audiounit_rust_init,
- #endif
---- /dev/null
-+++ media/libcubeb/src/cubeb_oss.c
-@@ -0,0 +1,1260 @@
-+/*
-+ * Copyright © 2019-2020 Nia Alarie <nia@NetBSD.org>
-+ * Copyright © 2020 Ka Ho Ng <khng300@gmail.com>
-+ * Copyright © 2020 The FreeBSD Foundation
-+ *
-+ * Portions of this software were developed by Ka Ho Ng
-+ * under sponsorship from the FreeBSD Foundation.
-+ *
-+ * This program is made available under an ISC-style license. See the
-+ * accompanying file LICENSE for details.
-+ */
-+
-+#include <assert.h>
-+#include <ctype.h>
-+#include <limits.h>
-+#include <errno.h>
-+#include <sys/types.h>
-+#include <sys/soundcard.h>
-+#include <sys/ioctl.h>
-+#include <fcntl.h>
-+#include <unistd.h>
-+#include <pthread.h>
-+#include <stdbool.h>
-+#include <stdlib.h>
-+#include <stdio.h>
-+#include <string.h>
-+#include <poll.h>
-+#include "cubeb/cubeb.h"
-+#include "cubeb_mixer.h"
-+#include "cubeb_strings.h"
-+#include "cubeb-internal.h"
-+
-+/* Supported well by most hardware. */
-+#ifndef OSS_PREFER_RATE
-+#define OSS_PREFER_RATE (48000)
-+#endif
-+
-+/* Standard acceptable minimum. */
-+#ifndef OSS_LATENCY_MS
-+#define OSS_LATENCY_MS (8)
-+#endif
-+
-+#ifndef OSS_NFRAGS
-+#define OSS_NFRAGS (4)
-+#endif
-+
-+#ifndef OSS_DEFAULT_DEVICE
-+#define OSS_DEFAULT_DEVICE "/dev/dsp"
-+#endif
-+
-+#ifndef OSS_DEFAULT_MIXER
-+#define OSS_DEFAULT_MIXER "/dev/mixer"
-+#endif
-+
-+#define ENV_AUDIO_DEVICE "AUDIO_DEVICE"
-+
-+#ifndef OSS_MAX_CHANNELS
-+# if defined(__FreeBSD__) || defined(__DragonFly__)
-+/*
-+ * The current maximum number of channels supported
-+ * on FreeBSD is 8.
-+ *
-+ * Reference: FreeBSD 12.1-RELEASE
-+ */
-+# define OSS_MAX_CHANNELS (8)
-+# elif defined(__sun__)
-+/*
-+ * The current maximum number of channels supported
-+ * on Illumos is 16.
-+ *
-+ * Reference: PSARC 2008/318
-+ */
-+# define OSS_MAX_CHANNELS (16)
-+# else
-+# define OSS_MAX_CHANNELS (2)
-+# endif
-+#endif
-+
-+#if defined(__FreeBSD__) || defined(__DragonFly__)
-+#define SNDSTAT_BEGIN_STR "Installed devices:"
-+#define SNDSTAT_USER_BEGIN_STR "Installed devices from userspace:"
-+#define SNDSTAT_FV_BEGIN_STR "File Versions:"
-+#endif
-+
-+static struct cubeb_ops const oss_ops;
-+
-+struct cubeb {
-+ struct cubeb_ops const * ops;
-+
-+ /* Our intern string store */
-+ pthread_mutex_t mutex; /* protects devid_strs */
-+ cubeb_strings *devid_strs;
-+};
-+
-+struct oss_stream {
-+ oss_devnode_t name;
-+ int fd;
-+ void * buf;
-+
-+ struct stream_info {
-+ int channels;
-+ int sample_rate;
-+ int fmt;
-+ int precision;
-+ } info;
-+
-+ unsigned int frame_size; /* precision in bytes * channels */
-+ bool floating;
-+};
-+
-+struct cubeb_stream {
-+ struct cubeb * context;
-+ void * user_ptr;
-+ pthread_t thread;
-+ bool doorbell; /* (m) */
-+ pthread_cond_t doorbell_cv; /* (m) */
-+ pthread_cond_t stopped_cv; /* (m) */
-+ pthread_mutex_t mtx; /* Members protected by this should be marked (m) */
-+ bool thread_created; /* (m) */
-+ bool running; /* (m) */
-+ bool destroying; /* (m) */
-+ cubeb_state state; /* (m) */
-+ float volume /* (m) */;
-+ struct oss_stream play;
-+ struct oss_stream record;
-+ cubeb_data_callback data_cb;
-+ cubeb_state_callback state_cb;
-+ uint64_t frames_written /* (m) */;
-+ unsigned int nfr; /* Number of frames allocated */
-+ unsigned int nfrags;
-+ unsigned int bufframes;
-+};
-+
-+static char const *
-+oss_cubeb_devid_intern(cubeb *context, char const * devid)
-+{
-+ char const *is;
-+ pthread_mutex_lock(&context->mutex);
-+ is = cubeb_strings_intern(context->devid_strs, devid);
-+ pthread_mutex_unlock(&context->mutex);
-+ return is;
-+}
-+
-+int
-+oss_init(cubeb **context, char const *context_name) {
-+ cubeb * c;
-+
-+ (void)context_name;
-+ if ((c = calloc(1, sizeof(cubeb))) == NULL) {
-+ return CUBEB_ERROR;
-+ }
-+
-+ if (cubeb_strings_init(&c->devid_strs) == CUBEB_ERROR) {
-+ goto fail;
-+ }
-+
-+ if (pthread_mutex_init(&c->mutex, NULL) != 0) {
-+ goto fail;
-+ }
-+
-+ c->ops = &oss_ops;
-+ *context = c;
-+ return CUBEB_OK;
-+
-+fail:
-+ cubeb_strings_destroy(c->devid_strs);
-+ free(c);
-+ return CUBEB_ERROR;
-+}
-+
-+static void
-+oss_destroy(cubeb * context)
-+{
-+ pthread_mutex_destroy(&context->mutex);
-+ cubeb_strings_destroy(context->devid_strs);
-+ free(context);
-+}
-+
-+static char const *
-+oss_get_backend_id(cubeb * context)
-+{
-+ return "oss";
-+}
-+
-+static int
-+oss_get_preferred_sample_rate(cubeb * context, uint32_t * rate)
-+{
-+ (void)context;
-+
-+ *rate = OSS_PREFER_RATE;
-+ return CUBEB_OK;
-+}
-+
-+static int
-+oss_get_max_channel_count(cubeb * context, uint32_t * max_channels)
-+{
-+ (void)context;
-+
-+ *max_channels = OSS_MAX_CHANNELS;
-+ return CUBEB_OK;
-+}
-+
-+static int
-+oss_get_min_latency(cubeb * context, cubeb_stream_params params,
-+ uint32_t * latency_frames)
-+{
-+ (void)context;
-+
-+ *latency_frames = (OSS_LATENCY_MS * params.rate) / 1000;
-+ return CUBEB_OK;
-+}
-+
-+static void
-+oss_free_cubeb_device_info_strings(cubeb_device_info *cdi)
-+{
-+ free((char *)cdi->device_id);
-+ free((char *)cdi->friendly_name);
-+ free((char *)cdi->group_id);
-+ cdi->device_id = NULL;
-+ cdi->friendly_name = NULL;
-+ cdi->group_id = NULL;
-+}
-+
-+#if defined(__FreeBSD__) || defined(__DragonFly__)
-+/*
-+ * Check if the specified DSP is okay for the purpose specified
-+ * in type. Here type can only specify one operation each time
-+ * this helper is called.
-+ *
-+ * Return 0 if OK, otherwise 1.
-+ */
-+static int
-+oss_probe_open(const char *dsppath, cubeb_device_type type,
-+ int *fdp, oss_audioinfo *resai)
-+{
-+ oss_audioinfo ai;
-+ int error;
-+ int oflags = (type == CUBEB_DEVICE_TYPE_INPUT) ? O_RDONLY : O_WRONLY;
-+ int dspfd = open(dsppath, oflags);
-+ if (dspfd == -1)
-+ return 1;
-+
-+ ai.dev = -1;
-+ error = ioctl(dspfd, SNDCTL_AUDIOINFO, &ai);
-+ if (error < 0) {
-+ close(dspfd);
-+ return 1;
-+ }
-+
-+ if (resai)
-+ *resai = ai;
-+ if (fdp)
-+ *fdp = dspfd;
-+ else
-+ close(dspfd);
-+ return 0;
-+}
-+
-+struct sndstat_info {
-+ oss_devnode_t devname;
-+ const char *desc;
-+ cubeb_device_type type;
-+ int preferred;
-+};
-+
-+static int
-+oss_sndstat_line_parse(char *line, int is_ud, struct sndstat_info *sinfo)
-+{
-+ char *matchptr = line, *n = NULL;
-+ struct sndstat_info res;
-+
-+ memset(&res, 0, sizeof(res));
-+
-+ n = strchr(matchptr, ':');
-+ if (n == NULL)
-+ goto fail;
-+ if (is_ud == 0) {
-+ unsigned int devunit;
-+
-+ if (sscanf(matchptr, "pcm%u: ", &devunit) < 1)
-+ goto fail;
-+
-+ if (snprintf(res.devname, sizeof(res.devname), "/dev/dsp%u", devunit) < 1)
-+ goto fail;
-+ } else {
-+ if (n - matchptr >= (ssize_t)(sizeof(res.devname) - strlen("/dev/")))
-+ goto fail;
-+
-+ strlcpy(res.devname, "/dev/", sizeof(res.devname));
-+ strncat(res.devname, matchptr, n - matchptr);
-+ }
-+ matchptr = n + 1;
-+
-+ n = strchr(matchptr, '<');
-+ if (n == NULL)
-+ goto fail;
-+ matchptr = n + 1;
-+ n = strrchr(matchptr, '>');
-+ if (n == NULL)
-+ goto fail;
-+ *n = 0;
-+ res.desc = matchptr;
-+ matchptr = n + 1;
-+
-+ n = strchr(matchptr, '(');
-+ if (n == NULL)
-+ goto fail;
-+ matchptr = n + 1;
-+ n = strrchr(matchptr, ')');
-+ if (n == NULL)
-+ goto fail;
-+ *n = 0;
-+ if (!isdigit(matchptr[0])) {
-+ if (strstr(matchptr, "play") != NULL)
-+ res.type |= CUBEB_DEVICE_TYPE_OUTPUT;
-+ if (strstr(matchptr, "rec") != NULL)
-+ res.type |= CUBEB_DEVICE_TYPE_INPUT;
-+ } else {
-+ int p, r;
-+ if (sscanf(matchptr, "%dp:%*dv/%dr:%*dv", &p, &r) != 2)
-+ goto fail;
-+ if (p > 0)
-+ res.type |= CUBEB_DEVICE_TYPE_OUTPUT;
-+ if (r > 0)
-+ res.type |= CUBEB_DEVICE_TYPE_INPUT;
-+ }
-+ matchptr = n + 1;
-+ if (strstr(matchptr, "default") != NULL)
-+ res.preferred = 1;
-+
-+ *sinfo = res;
-+ return 0;
-+
-+fail:
-+ return 1;
-+}
-+
-+/*
-+ * XXX: On FreeBSD we have to rely on SNDCTL_CARDINFO to get all
-+ * the usable audio devices currently, as SNDCTL_AUDIOINFO will
-+ * never return directly usable audio device nodes.
-+ */
-+static int
-+oss_enumerate_devices(cubeb * context, cubeb_device_type type,
-+ cubeb_device_collection * collection)
-+{
-+ cubeb_device_info *devinfop = NULL;
-+ char *line = NULL;
-+ size_t linecap = 0;
-+ FILE *sndstatfp = NULL;
-+ int collection_cnt = 0;
-+ int is_ud = 0;
-+ int skipall = 0;
-+
-+ devinfop = calloc(1, sizeof(cubeb_device_info));
-+ if (devinfop == NULL)
-+ goto fail;
-+
-+ sndstatfp = fopen("/dev/sndstat", "r");
-+ if (sndstatfp == NULL)
-+ goto fail;
-+ while (getline(&line, &linecap, sndstatfp) > 0) {
-+ const char *devid = NULL;
-+ struct sndstat_info sinfo;
-+ oss_audioinfo ai;
-+
-+ if (!strncmp(line, SNDSTAT_FV_BEGIN_STR, strlen(SNDSTAT_FV_BEGIN_STR))) {
-+ skipall = 1;
-+ continue;
-+ }
-+ if (!strncmp(line, SNDSTAT_BEGIN_STR, strlen(SNDSTAT_BEGIN_STR))) {
-+ is_ud = 0;
-+ skipall = 0;
-+ continue;
-+ }
-+ if (!strncmp(line, SNDSTAT_USER_BEGIN_STR, strlen(SNDSTAT_USER_BEGIN_STR))) {
-+ is_ud = 1;
-+ skipall = 0;
-+ continue;
-+ }
-+ if (skipall || isblank(line[0]))
-+ continue;
-+
-+ if (oss_sndstat_line_parse(line, is_ud, &sinfo))
-+ continue;
-+
-+ devinfop[collection_cnt].type = 0;
-+ switch (sinfo.type) {
-+ case CUBEB_DEVICE_TYPE_INPUT:
-+ if (type & CUBEB_DEVICE_TYPE_OUTPUT)
-+ continue;
-+ break;
-+ case CUBEB_DEVICE_TYPE_OUTPUT:
-+ if (type & CUBEB_DEVICE_TYPE_INPUT)
-+ continue;
-+ break;
-+ case 0:
-+ continue;
-+ }
-+
-+ if (oss_probe_open(sinfo.devname, type, NULL, &ai))
-+ continue;
-+
-+ devid = oss_cubeb_devid_intern(context, sinfo.devname);
-+ if (devid == NULL)
-+ continue;
-+
-+ devinfop[collection_cnt].device_id = strdup(sinfo.devname);
-+ asprintf((char **)&devinfop[collection_cnt].friendly_name, "%s: %s",
-+ sinfo.devname, sinfo.desc);
-+ devinfop[collection_cnt].group_id = strdup(sinfo.devname);
-+ devinfop[collection_cnt].vendor_name = NULL;
-+ if (devinfop[collection_cnt].device_id == NULL ||
-+ devinfop[collection_cnt].friendly_name == NULL ||
-+ devinfop[collection_cnt].group_id == NULL) {
-+ oss_free_cubeb_device_info_strings(&devinfop[collection_cnt]);
-+ continue;
-+ }
-+
-+ devinfop[collection_cnt].type = type;
-+ devinfop[collection_cnt].devid = devid;
-+ devinfop[collection_cnt].state = CUBEB_DEVICE_STATE_ENABLED;
-+ devinfop[collection_cnt].preferred =
-+ (sinfo.preferred) ? CUBEB_DEVICE_PREF_ALL : CUBEB_DEVICE_PREF_NONE;
-+ devinfop[collection_cnt].format = CUBEB_DEVICE_FMT_S16NE;
-+ devinfop[collection_cnt].default_format = CUBEB_DEVICE_FMT_S16NE;
-+ devinfop[collection_cnt].max_channels = ai.max_channels;
-+ devinfop[collection_cnt].default_rate = OSS_PREFER_RATE;
-+ devinfop[collection_cnt].max_rate = ai.max_rate;
-+ devinfop[collection_cnt].min_rate = ai.min_rate;
-+ devinfop[collection_cnt].latency_lo = 0;
-+ devinfop[collection_cnt].latency_hi = 0;
-+
-+ collection_cnt++;
-+
-+ void *newp = reallocarray(devinfop, collection_cnt + 1,
-+ sizeof(cubeb_device_info));
-+ if (newp == NULL)
-+ goto fail;
-+ devinfop = newp;
-+ }
-+
-+ free(line);
-+ fclose(sndstatfp);
-+
-+ collection->count = collection_cnt;
-+ collection->device = devinfop;
-+
-+ return CUBEB_OK;
-+
-+fail:
-+ free(line);
-+ if (sndstatfp)
-+ fclose(sndstatfp);
-+ free(devinfop);
-+ return CUBEB_ERROR;
-+}
-+
-+#else
-+
-+static int
-+oss_enumerate_devices(cubeb * context, cubeb_device_type type,
-+ cubeb_device_collection * collection)
-+{
-+ oss_sysinfo si;
-+ int error, i;
-+ cubeb_device_info *devinfop = NULL;
-+ int collection_cnt = 0;
-+ int mixer_fd = -1;
-+
-+ mixer_fd = open(OSS_DEFAULT_MIXER, O_RDWR);
-+ if (mixer_fd == -1) {
-+ LOG("Failed to open mixer %s. errno: %d", OSS_DEFAULT_MIXER, errno);
-+ return CUBEB_ERROR;
-+ }
-+
-+ error = ioctl(mixer_fd, SNDCTL_SYSINFO, &si);
-+ if (error) {
-+ LOG("Failed to run SNDCTL_SYSINFO on mixer %s. errno: %d", OSS_DEFAULT_MIXER, errno);
-+ goto fail;
-+ }
-+
-+ devinfop = calloc(si.numaudios, sizeof(cubeb_device_info));
-+ if (devinfop == NULL)
-+ goto fail;
-+
-+ collection->count = 0;
-+ for (i = 0; i < si.numaudios; i++) {
-+ oss_audioinfo ai;
-+ cubeb_device_info cdi = { 0 };
-+ const char *devid = NULL;
-+
-+ ai.dev = i;
-+ error = ioctl(mixer_fd, SNDCTL_AUDIOINFO, &ai);
-+ if (error)
-+ goto fail;
-+
-+ assert(ai.dev < si.numaudios);
-+ if (!ai.enabled)
-+ continue;
-+
-+ cdi.type = 0;
-+ switch (ai.caps & DSP_CAP_DUPLEX) {
-+ case DSP_CAP_INPUT:
-+ if (type & CUBEB_DEVICE_TYPE_OUTPUT)
-+ continue;
-+ break;
-+ case DSP_CAP_OUTPUT:
-+ if (type & CUBEB_DEVICE_TYPE_INPUT)
-+ continue;
-+ break;
-+ case 0:
-+ continue;
-+ }
-+ cdi.type = type;
-+
-+ devid = oss_cubeb_devid_intern(context, ai.devnode);
-+ cdi.device_id = strdup(ai.name);
-+ cdi.friendly_name = strdup(ai.name);
-+ cdi.group_id = strdup(ai.name);
-+ if (devid == NULL || cdi.device_id == NULL || cdi.friendly_name == NULL ||
-+ cdi.group_id == NULL) {
-+ oss_free_cubeb_device_info_strings(&cdi);
-+ continue;
-+ }
-+
-+ cdi.devid = devid;
-+ cdi.vendor_name = NULL;
-+ cdi.state = CUBEB_DEVICE_STATE_ENABLED;
-+ cdi.preferred = CUBEB_DEVICE_PREF_NONE;
-+ cdi.format = CUBEB_DEVICE_FMT_S16NE;
-+ cdi.default_format = CUBEB_DEVICE_FMT_S16NE;
-+ cdi.max_channels = ai.max_channels;
-+ cdi.default_rate = OSS_PREFER_RATE;
-+ cdi.max_rate = ai.max_rate;
-+ cdi.min_rate = ai.min_rate;
-+ cdi.latency_lo = 0;
-+ cdi.latency_hi = 0;
-+
-+ devinfop[collection_cnt++] = cdi;
-+ }
-+
-+ collection->count = collection_cnt;
-+ collection->device = devinfop;
-+
-+ if (mixer_fd != -1)
-+ close(mixer_fd);
-+ return CUBEB_OK;
-+
-+fail:
-+ if (mixer_fd != -1)
-+ close(mixer_fd);
-+ free(devinfop);
-+ return CUBEB_ERROR;
-+}
-+
-+#endif
-+
-+static int
-+oss_device_collection_destroy(cubeb * context,
-+ cubeb_device_collection * collection)
-+{
-+ size_t i;
-+ for (i = 0; i < collection->count; i++) {
-+ oss_free_cubeb_device_info_strings(&collection->device[i]);
-+ }
-+ free(collection->device);
-+ collection->device = NULL;
-+ collection->count = 0;
-+ return 0;
-+}
-+
-+static unsigned int
-+oss_chn_from_cubeb(cubeb_channel chn)
-+{
-+ switch (chn) {
-+ case CHANNEL_FRONT_LEFT:
-+ return CHID_L;
-+ case CHANNEL_FRONT_RIGHT:
-+ return CHID_R;
-+ case CHANNEL_FRONT_CENTER:
-+ return CHID_C;
-+ case CHANNEL_LOW_FREQUENCY:
-+ return CHID_LFE;
-+ case CHANNEL_BACK_LEFT:
-+ return CHID_LR;
-+ case CHANNEL_BACK_RIGHT:
-+ return CHID_RR;
-+ case CHANNEL_SIDE_LEFT:
-+ return CHID_LS;
-+ case CHANNEL_SIDE_RIGHT:
-+ return CHID_RS;
-+ default:
-+ return CHID_UNDEF;
-+ }
-+}
-+
-+static unsigned long long
-+oss_cubeb_layout_to_chnorder(cubeb_channel_layout layout)
-+{
-+ unsigned int i, nchns = 0;
-+ unsigned long long chnorder = 0;
-+
-+ for (i = 0; layout; i++, layout >>= 1) {
-+ unsigned long long chid = oss_chn_from_cubeb((layout & 1) << i);
-+ if (chid == CHID_UNDEF)
-+ continue;
-+
-+ chnorder |= (chid & 0xf) << nchns * 4;
-+ nchns++;
-+ }
-+
-+ return chnorder;
-+}
-+
-+static int
-+oss_copy_params(int fd, cubeb_stream * stream, cubeb_stream_params * params,
-+ struct stream_info * sinfo)
-+{
-+ unsigned long long chnorder;
-+
-+ sinfo->channels = params->channels;
-+ sinfo->sample_rate = params->rate;
-+ switch (params->format) {
-+ case CUBEB_SAMPLE_S16LE:
-+ sinfo->fmt = AFMT_S16_LE;
-+ sinfo->precision = 16;
-+ break;
-+ case CUBEB_SAMPLE_S16BE:
-+ sinfo->fmt = AFMT_S16_BE;
-+ sinfo->precision = 16;
-+ break;
-+ case CUBEB_SAMPLE_FLOAT32NE:
-+ sinfo->fmt = AFMT_S32_NE;
-+ sinfo->precision = 32;
-+ break;
-+ default:
-+ LOG("Unsupported format");
-+ return CUBEB_ERROR_INVALID_FORMAT;
-+ }
-+ if (ioctl(fd, SNDCTL_DSP_CHANNELS, &sinfo->channels) == -1) {
-+ return CUBEB_ERROR;
-+ }
-+ if (ioctl(fd, SNDCTL_DSP_SETFMT, &sinfo->fmt) == -1) {
-+ return CUBEB_ERROR;
-+ }
-+ if (ioctl(fd, SNDCTL_DSP_SPEED, &sinfo->sample_rate) == -1) {
-+ return CUBEB_ERROR;
-+ }
-+ /* Mono layout is an exception */
-+ if (params->layout != CUBEB_LAYOUT_UNDEFINED && params->layout != CUBEB_LAYOUT_MONO) {
-+ chnorder = oss_cubeb_layout_to_chnorder(params->layout);
-+ if (ioctl(fd, SNDCTL_DSP_SET_CHNORDER, &chnorder) == -1)
-+ LOG("Non-fatal error %d occured when setting channel order.", errno);
-+ }
-+ return CUBEB_OK;
-+}
-+
-+static int
-+oss_stream_stop(cubeb_stream * s)
-+{
-+ pthread_mutex_lock(&s->mtx);
-+ if (s->thread_created && s->running) {
-+ s->running = false;
-+ s->doorbell = false;
-+ pthread_cond_wait(&s->stopped_cv, &s->mtx);
-+ }
-+ if (s->state != CUBEB_STATE_STOPPED) {
-+ s->state = CUBEB_STATE_STOPPED;
-+ pthread_mutex_unlock(&s->mtx);
-+ s->state_cb(s, s->user_ptr, CUBEB_STATE_STOPPED);
-+ } else {
-+ pthread_mutex_unlock(&s->mtx);
-+ }
-+ return CUBEB_OK;
-+}
-+
-+static void
-+oss_stream_destroy(cubeb_stream * s)
-+{
-+ pthread_mutex_lock(&s->mtx);
-+ if (s->thread_created) {
-+ s->destroying = true;
-+ s->doorbell = true;
-+ pthread_cond_signal(&s->doorbell_cv);
-+ }
-+ pthread_mutex_unlock(&s->mtx);
-+ pthread_join(s->thread, NULL);
-+
-+ pthread_cond_destroy(&s->doorbell_cv);
-+ pthread_cond_destroy(&s->stopped_cv);
-+ pthread_mutex_destroy(&s->mtx);
-+ if (s->play.fd != -1) {
-+ close(s->play.fd);
-+ }
-+ if (s->record.fd != -1) {
-+ close(s->record.fd);
-+ }
-+ free(s->play.buf);
-+ free(s->record.buf);
-+ free(s);
-+}
-+
-+static void
-+oss_float_to_linear32(void * buf, unsigned sample_count, float vol)
-+{
-+ float * in = buf;
-+ int32_t * out = buf;
-+ int32_t * tail = out + sample_count;
-+
-+ while (out < tail) {
-+ int64_t f = *(in++) * vol * 0x80000000LL;
-+ if (f < -INT32_MAX)
-+ f = -INT32_MAX;
-+ else if (f > INT32_MAX)
-+ f = INT32_MAX;
-+ *(out++) = f;
-+ }
-+}
-+
-+static void
-+oss_linear32_to_float(void * buf, unsigned sample_count)
-+{
-+ int32_t * in = buf;
-+ float * out = buf;
-+ float * tail = out + sample_count;
-+
-+ while (out < tail) {
-+ *(out++) = (1.0 / 0x80000000LL) * *(in++);
-+ }
-+}
-+
-+static void
-+oss_linear16_set_vol(int16_t * buf, unsigned sample_count, float vol)
-+{
-+ unsigned i;
-+ int32_t multiplier = vol * 0x8000;
-+
-+ for (i = 0; i < sample_count; ++i) {
-+ buf[i] = (buf[i] * multiplier) >> 15;
-+ }
-+}
-+
-+/* 1 - Stopped by cubeb_stream_stop, otherwise 0 */
-+static int
-+oss_audio_loop(cubeb_stream * s, cubeb_state *new_state)
-+{
-+ cubeb_state state = CUBEB_STATE_STOPPED;
-+ int trig = 0;
-+ int drain = 0;
-+ struct pollfd pfds[2];
-+ unsigned int ppending, rpending;
-+
-+ pfds[0].fd = s->play.fd;
-+ pfds[0].events = POLLOUT;
-+ pfds[1].fd = s->record.fd;
-+ pfds[1].events = POLLIN;
-+
-+ ppending = 0;
-+ rpending = s->bufframes;
-+
-+ if (s->record.fd != -1) {
-+ if (ioctl(s->record.fd, SNDCTL_DSP_SETTRIGGER, &trig)) {
-+ LOG("Error %d occured when setting trigger on record fd", errno);
-+ state = CUBEB_STATE_ERROR;
-+ goto breakdown;
-+ }
-+ trig |= PCM_ENABLE_INPUT;
-+ if (ioctl(s->record.fd, SNDCTL_DSP_SETTRIGGER, &trig)) {
-+ LOG("Error %d occured when setting trigger on record fd", errno);
-+ state = CUBEB_STATE_ERROR;
-+ goto breakdown;
-+ }
-+ memset(s->record.buf, 0, s->bufframes * s->record.frame_size);
-+ }
-+
-+ while (1) {
-+ long nfr = 0;
-+
-+ pthread_mutex_lock(&s->mtx);
-+ if (!s->running || s->destroying) {
-+ pthread_mutex_unlock(&s->mtx);
-+ break;
-+ }
-+ pthread_mutex_unlock(&s->mtx);
-+ if (s->play.fd == -1 && s->record.fd == -1) {
-+ /*
-+ * Stop here if the stream is not play & record stream,
-+ * play-only stream or record-only stream
-+ */
-+
-+ goto breakdown;
-+ }
-+
-+ while ((s->bufframes - ppending) >= s->nfr && rpending >= s->nfr) {
-+ long n = ((s->bufframes - ppending) < rpending) ? s->bufframes - ppending : rpending;
-+ char *rptr = NULL, *pptr = NULL;
-+ if (s->record.fd != -1)
-+ rptr = (char *)s->record.buf;
-+ if (s->play.fd != -1)
-+ pptr = (char *)s->play.buf + ppending * s->play.frame_size;
-+ if (s->record.fd != -1 && s->record.floating) {
-+ oss_linear32_to_float(s->record.buf, s->record.info.channels * n);
-+ }
-+ nfr = s->data_cb(s, s->user_ptr, rptr, pptr, n);
-+ if (nfr == CUBEB_ERROR) {
-+ state = CUBEB_STATE_ERROR;
-+ goto breakdown;
-+ }
-+ if (pptr) {
-+ float vol;
-+
-+ pthread_mutex_lock(&s->mtx);
-+ vol = s->volume;
-+ pthread_mutex_unlock(&s->mtx);
-+
-+ if (s->play.floating) {
-+ oss_float_to_linear32(pptr, s->play.info.channels * nfr, vol);
-+ } else {
-+ oss_linear16_set_vol((int16_t *)pptr, s->play.info.channels * nfr, vol);
-+ }
-+ }
-+ if (pptr) {
-+ ppending += nfr;
-+ assert(ppending <= s->bufframes);
-+ }
-+ if (rptr) {
-+ assert(rpending >= nfr);
-+ rpending -= nfr;
-+ memmove(rptr, rptr + nfr * s->record.frame_size,
-+ (s->bufframes - nfr) * s->record.frame_size);
-+ }
-+ if (nfr < n) {
-+ if (s->play.fd != -1) {
-+ drain = 1;
-+ break;
-+ } else {
-+ /*
-+ * This is a record-only stream and number of frames
-+ * returned from data_cb() is smaller than number
-+ * of frames required to read. Stop here.
-+ */
-+
-+ state = CUBEB_STATE_STOPPED;
-+ goto breakdown;
-+ }
-+ }
-+ }
-+
-+ ssize_t n, frames;
-+ int nfds;
-+
-+ pfds[0].revents = 0;
-+ pfds[1].revents = 0;
-+
-+ nfds = poll(pfds, 2, 1000);
-+ if (nfds == -1) {
-+ if (errno == EINTR)
-+ continue;
-+ LOG("Error %d occured when polling playback and record fd", errno);
-+ state = CUBEB_STATE_ERROR;
-+ goto breakdown;
-+ } else if (nfds == 0)
-+ continue;
-+
-+ if ((pfds[0].revents & (POLLERR | POLLHUP)) ||
-+ (pfds[1].revents & (POLLERR | POLLHUP))) {
-+ LOG("Error occured on playback, record fds");
-+ state = CUBEB_STATE_ERROR;
-+ goto breakdown;
-+ }
-+
-+ if (pfds[0].revents) {
-+ while (ppending > 0) {
-+ size_t bytes = ppending * s->play.frame_size;
-+ if ((n = write(s->play.fd, (uint8_t *)s->play.buf, bytes)) < 0) {
-+ if (errno == EINTR)
-+ continue;
-+ if (errno == EAGAIN) {
-+ if (drain)
-+ continue;
-+ break;
-+ }
-+ state = CUBEB_STATE_ERROR;
-+ goto breakdown;
-+ }
-+ frames = n / s->play.frame_size;
-+ pthread_mutex_lock(&s->mtx);
-+ s->frames_written += frames;
-+ pthread_mutex_unlock(&s->mtx);
-+ ppending -= frames;
-+ memmove(s->play.buf, (uint8_t *)s->play.buf + n,
-+ (s->bufframes - frames) * s->play.frame_size);
-+ }
-+ }
-+ if (pfds[1].revents) {
-+ while (s->bufframes - rpending > 0) {
-+ size_t bytes = (s->bufframes - rpending) * s->record.frame_size;
-+ size_t read_ofs = rpending * s->record.frame_size;
-+ if ((n = read(s->record.fd, (uint8_t *)s->record.buf + read_ofs, bytes)) < 0) {
-+ if (errno == EINTR)
-+ continue;
-+ if (errno == EAGAIN)
-+ break;
-+ state = CUBEB_STATE_ERROR;
-+ goto breakdown;
-+ }
-+ frames = n / s->record.frame_size;
-+ rpending += frames;
-+ }
-+ }
-+ if (drain) {
-+ state = CUBEB_STATE_DRAINED;
-+ goto breakdown;
-+ }
-+ }
-+
-+ return 1;
-+
-+breakdown:
-+ pthread_mutex_lock(&s->mtx);
-+ *new_state = s->state = state;
-+ s->running = false;
-+ pthread_mutex_unlock(&s->mtx);
-+ return 0;
-+}
-+
-+static void *
-+oss_io_routine(void *arg)
-+{
-+ cubeb_stream *s = arg;
-+ cubeb_state new_state;
-+ int stopped;
-+
-+ do {
-+ pthread_mutex_lock(&s->mtx);
-+ if (s->destroying) {
-+ pthread_mutex_unlock(&s->mtx);
-+ break;
-+ }
-+ pthread_mutex_unlock(&s->mtx);
-+
-+ stopped = oss_audio_loop(s, &new_state);
-+ if (s->record.fd != -1)
-+ ioctl(s->record.fd, SNDCTL_DSP_HALT_INPUT, NULL);
-+ if (!stopped)
-+ s->state_cb(s, s->user_ptr, new_state);
-+
-+ pthread_mutex_lock(&s->mtx);
-+ pthread_cond_signal(&s->stopped_cv);
-+ if (s->destroying) {
-+ pthread_mutex_unlock(&s->mtx);
-+ break;
-+ }
-+ while (!s->doorbell) {
-+ pthread_cond_wait(&s->doorbell_cv, &s->mtx);
-+ }
-+ s->doorbell = false;
-+ pthread_mutex_unlock(&s->mtx);
-+ } while (1);
-+
-+ pthread_mutex_lock(&s->mtx);
-+ s->thread_created = false;
-+ pthread_mutex_unlock(&s->mtx);
-+ return NULL;
-+}
-+
-+static inline int
-+oss_calc_frag_shift(unsigned int frames, unsigned int frame_size)
-+{
-+ int n = 4;
-+ int blksize = (frames * frame_size + OSS_NFRAGS - 1) / OSS_NFRAGS;
-+ while ((1 << n) < blksize)
-+ n++;
-+ return n;
-+}
-+
-+static inline int
-+oss_get_frag_params(unsigned int shift)
-+{
-+ return (OSS_NFRAGS << 16) | shift;
-+}
-+
-+static int
-+oss_stream_init(cubeb * context,
-+ cubeb_stream ** stream,
-+ char const * stream_name,
-+ cubeb_devid input_device,
-+ cubeb_stream_params * input_stream_params,
-+ cubeb_devid output_device,
-+ cubeb_stream_params * output_stream_params,
-+ unsigned int latency_frames,
-+ cubeb_data_callback data_callback,
-+ cubeb_state_callback state_callback,
-+ void * user_ptr)
-+{
-+ int ret = CUBEB_OK;
-+ unsigned int playnfr = 0, recnfr = 0;
-+ cubeb_stream *s = NULL;
-+ const char *defdsp;
-+
-+ if (!(defdsp = getenv(ENV_AUDIO_DEVICE)) || *defdsp == '\0')
-+ defdsp = OSS_DEFAULT_DEVICE;
-+
-+ (void)stream_name;
-+ if ((s = calloc(1, sizeof(cubeb_stream))) == NULL) {
-+ ret = CUBEB_ERROR;
-+ goto error;
-+ }
-+ s->state = CUBEB_STATE_STOPPED;
-+ s->record.fd = s->play.fd = -1;
-+ s->nfr = latency_frames;
-+ if (input_device != NULL) {
-+ strlcpy(s->record.name, input_device, sizeof(s->record.name));
-+ } else {
-+ strlcpy(s->record.name, defdsp, sizeof(s->record.name));
-+ }
-+ if (output_device != NULL) {
-+ strlcpy(s->play.name, output_device, sizeof(s->play.name));
-+ } else {
-+ strlcpy(s->play.name, defdsp, sizeof(s->play.name));
-+ }
-+ if (input_stream_params != NULL) {
-+ unsigned int nb_channels;
-+ if (input_stream_params->prefs & CUBEB_STREAM_PREF_LOOPBACK) {
-+ LOG("Loopback not supported");
-+ ret = CUBEB_ERROR_NOT_SUPPORTED;
-+ goto error;
-+ }
-+ nb_channels = cubeb_channel_layout_nb_channels(input_stream_params->layout);
-+ if (input_stream_params->layout != CUBEB_LAYOUT_UNDEFINED &&
-+ nb_channels != input_stream_params->channels) {
-+ LOG("input_stream_params->layout does not match input_stream_params->channels");
-+ ret = CUBEB_ERROR_INVALID_PARAMETER;
-+ goto error;
-+ }
-+ if (s->record.fd == -1) {
-+ if ((s->record.fd = open(s->record.name, O_RDONLY | O_NONBLOCK)) == -1) {
-+ LOG("Audio device \"%s\" could not be opened as read-only",
-+ s->record.name);
-+ ret = CUBEB_ERROR_DEVICE_UNAVAILABLE;
-+ goto error;
-+ }
-+ }
-+ if ((ret = oss_copy_params(s->record.fd, s, input_stream_params,
-+ &s->record.info)) != CUBEB_OK) {
-+ LOG("Setting record params failed");
-+ goto error;
-+ }
-+ s->record.floating = (input_stream_params->format == CUBEB_SAMPLE_FLOAT32NE);
-+ s->record.frame_size = s->record.info.channels * (s->record.info.precision / 8);
-+ recnfr = (1 << oss_calc_frag_shift(s->nfr, s->record.frame_size)) / s->record.frame_size;
-+ }
-+ if (output_stream_params != NULL) {
-+ unsigned int nb_channels;
-+ if (output_stream_params->prefs & CUBEB_STREAM_PREF_LOOPBACK) {
-+ LOG("Loopback not supported");
-+ ret = CUBEB_ERROR_NOT_SUPPORTED;
-+ goto error;
-+ }
-+ nb_channels = cubeb_channel_layout_nb_channels(output_stream_params->layout);
-+ if (output_stream_params->layout != CUBEB_LAYOUT_UNDEFINED &&
-+ nb_channels != output_stream_params->channels) {
-+ LOG("output_stream_params->layout does not match output_stream_params->channels");
-+ ret = CUBEB_ERROR_INVALID_PARAMETER;
-+ goto error;
-+ }
-+ if (s->play.fd == -1) {
-+ if ((s->play.fd = open(s->play.name, O_WRONLY | O_NONBLOCK)) == -1) {
-+ LOG("Audio device \"%s\" could not be opened as write-only",
-+ s->play.name);
-+ ret = CUBEB_ERROR_DEVICE_UNAVAILABLE;
-+ goto error;
-+ }
-+ }
-+ if ((ret = oss_copy_params(s->play.fd, s, output_stream_params,
-+ &s->play.info)) != CUBEB_OK) {
-+ LOG("Setting play params failed");
-+ goto error;
-+ }
-+ s->play.floating = (output_stream_params->format == CUBEB_SAMPLE_FLOAT32NE);
-+ s->play.frame_size = s->play.info.channels * (s->play.info.precision / 8);
-+ playnfr = (1 << oss_calc_frag_shift(s->nfr, s->play.frame_size)) / s->play.frame_size;
-+ }
-+ /* Use the largest nframes among playing and recording streams */
-+ s->nfr = (playnfr > recnfr) ? playnfr : recnfr;
-+ s->nfrags = OSS_NFRAGS;
-+ s->bufframes = s->nfr * s->nfrags;
-+ if (s->play.fd != -1) {
-+ int frag = oss_get_frag_params(oss_calc_frag_shift(s->nfr, s->play.frame_size));
-+ if (ioctl(s->record.fd, SNDCTL_DSP_SETFRAGMENT, &frag))
-+ LOG("Failed to set record fd with SNDCTL_DSP_SETFRAGMENT. frag: 0x%x",
-+ frag);
-+ }
-+ if (s->record.fd != -1) {
-+ int frag = oss_get_frag_params(oss_calc_frag_shift(s->nfr, s->record.frame_size));
-+ if (ioctl(s->record.fd, SNDCTL_DSP_SETFRAGMENT, &frag))
-+ LOG("Failed to set record fd with SNDCTL_DSP_SETFRAGMENT. frag: 0x%x",
-+ frag);
-+ }
-+ s->context = context;
-+ s->volume = 1.0;
-+ s->state_cb = state_callback;
-+ s->data_cb = data_callback;
-+ s->user_ptr = user_ptr;
-+
-+ if (pthread_mutex_init(&s->mtx, NULL) != 0) {
-+ LOG("Failed to create mutex");
-+ goto error;
-+ }
-+ if (pthread_cond_init(&s->doorbell_cv, NULL) != 0) {
-+ LOG("Failed to create cv");
-+ goto error;
-+ }
-+ if (pthread_cond_init(&s->stopped_cv, NULL) != 0) {
-+ LOG("Failed to create cv");
-+ goto error;
-+ }
-+ s->doorbell = false;
-+
-+ if (s->play.fd != -1) {
-+ if ((s->play.buf = calloc(s->bufframes, s->play.frame_size)) == NULL) {
-+ ret = CUBEB_ERROR;
-+ goto error;
-+ }
-+ }
-+ if (s->record.fd != -1) {
-+ if ((s->record.buf = calloc(s->bufframes, s->record.frame_size)) == NULL) {
-+ ret = CUBEB_ERROR;
-+ goto error;
-+ }
-+ }
-+
-+ *stream = s;
-+ return CUBEB_OK;
-+error:
-+ if (s != NULL) {
-+ oss_stream_destroy(s);
-+ }
-+ return ret;
-+}
-+
-+static int
-+oss_stream_thr_create(cubeb_stream * s)
-+{
-+ if (s->thread_created) {
-+ s->doorbell = true;
-+ pthread_cond_signal(&s->doorbell_cv);
-+ return CUBEB_OK;
-+ }
-+
-+ if (pthread_create(&s->thread, NULL, oss_io_routine, s) != 0) {
-+ LOG("Couldn't create thread");
-+ return CUBEB_ERROR;
-+ }
-+
-+ return CUBEB_OK;
-+}
-+
-+static int
-+oss_stream_start(cubeb_stream * s)
-+{
-+ s->state_cb(s, s->user_ptr, CUBEB_STATE_STARTED);
-+ pthread_mutex_lock(&s->mtx);
-+ /* Disallow starting an already started stream */
-+ assert(!s->running && s->state != CUBEB_STATE_STARTED);
-+ if (oss_stream_thr_create(s) != CUBEB_OK) {
-+ pthread_mutex_unlock(&s->mtx);
-+ s->state_cb(s, s->user_ptr, CUBEB_STATE_ERROR);
-+ return CUBEB_ERROR;
-+ }
-+ s->state = CUBEB_STATE_STARTED;
-+ s->thread_created = true;
-+ s->running = true;
-+ pthread_mutex_unlock(&s->mtx);
-+ return CUBEB_OK;
-+}
-+
-+static int
-+oss_stream_get_position(cubeb_stream * s, uint64_t * position)
-+{
-+ pthread_mutex_lock(&s->mtx);
-+ *position = s->frames_written;
-+ pthread_mutex_unlock(&s->mtx);
-+ return CUBEB_OK;
-+}
-+
-+static int
-+oss_stream_get_latency(cubeb_stream * s, uint32_t * latency)
-+{
-+ int delay;
-+
-+ if (ioctl(s->play.fd, SNDCTL_DSP_GETODELAY, &delay) == -1) {
-+ return CUBEB_ERROR;
-+ }
-+
-+ /* Return number of frames there */
-+ *latency = delay / s->play.frame_size;
-+ return CUBEB_OK;
-+}
-+
-+static int
-+oss_stream_set_volume(cubeb_stream * stream, float volume)
-+{
-+ if (volume < 0.0)
-+ volume = 0.0;
-+ else if (volume > 1.0)
-+ volume = 1.0;
-+ pthread_mutex_lock(&stream->mtx);
-+ stream->volume = volume;
-+ pthread_mutex_unlock(&stream->mtx);
-+ return CUBEB_OK;
-+}
-+
-+static int
-+oss_get_current_device(cubeb_stream * stream, cubeb_device ** const device)
-+{
-+ *device = calloc(1, sizeof(cubeb_device));
-+ if (*device == NULL) {
-+ return CUBEB_ERROR;
-+ }
-+ (*device)->input_name = stream->record.fd != -1 ?
-+ strdup(stream->record.name) : NULL;
-+ (*device)->output_name = stream->play.fd != -1 ?
-+ strdup(stream->play.name) : NULL;
-+ return CUBEB_OK;
-+}
-+
-+static int
-+oss_stream_device_destroy(cubeb_stream * stream, cubeb_device * device)
-+{
-+ (void)stream;
-+ free(device->input_name);
-+ free(device->output_name);
-+ free(device);
-+ return CUBEB_OK;
-+}
-+
-+static struct cubeb_ops const oss_ops = {
-+ .init = oss_init,
-+ .get_backend_id = oss_get_backend_id,
-+ .get_max_channel_count = oss_get_max_channel_count,
-+ .get_min_latency = oss_get_min_latency,
-+ .get_preferred_sample_rate = oss_get_preferred_sample_rate,
-+ .enumerate_devices = oss_enumerate_devices,
-+ .device_collection_destroy = oss_device_collection_destroy,
-+ .destroy = oss_destroy,
-+ .stream_init = oss_stream_init,
-+ .stream_destroy = oss_stream_destroy,
-+ .stream_start = oss_stream_start,
-+ .stream_stop = oss_stream_stop,
-+ .stream_reset_default_device = NULL,
-+ .stream_get_position = oss_stream_get_position,
-+ .stream_get_latency = oss_stream_get_latency,
-+ .stream_get_input_latency = NULL,
-+ .stream_set_volume = oss_stream_set_volume,
-+ .stream_get_current_device = oss_get_current_device,
-+ .stream_device_destroy = oss_stream_device_destroy,
-+ .stream_register_device_changed_callback = NULL,
-+ .register_device_collection_changed = NULL};
diff --git a/mail/thunderbird/files/patch-env-api-keys b/mail/thunderbird/files/patch-env-api-keys
index e20b012f27cf..a97a99d6b54a 100644
--- a/mail/thunderbird/files/patch-env-api-keys
+++ b/mail/thunderbird/files/patch-env-api-keys
@@ -2,20 +2,20 @@
--- build/moz.configure/keyfiles.configure
+++ build/moz.configure/keyfiles.configure
-@@ -18,6 +18,7 @@ def keyfile(desc, help=None, callback=lambda x: x):
- @checking('for the %s key' % desc, lambda x: x and x is not no_key)
- @imports(_from='__builtin__', _import='open')
- @imports(_from='__builtin__', _import='IOError')
-+ @imports(_from='os', _import='environ')
+@@ -19,6 +19,7 @@ def keyfile(desc, default=None, help=None, callback=lambda x: x):
+ @checking("for the %s key" % desc, lambda x: x and x is not no_key)
+ @imports(_from="__builtin__", _import="open")
+ @imports(_from="__builtin__", _import="IOError")
++ @imports(_from="os", _import="environ")
def keyfile(value):
if value:
try:
-@@ -28,7 +29,7 @@ def keyfile(desc, help=None, callback=lambda x: x):
+@@ -29,7 +30,7 @@ def keyfile(desc, default=None, help=None, callback=lambda x: x):
raise FatalCheckError("'%s' is empty." % value[0])
except IOError as e:
raise FatalCheckError("'%s': %s." % (value[0], e.strerror))
- return no_key
-+ return environ.get('MOZ_%s_KEY' % desc.upper().replace(' ', '_')) or no_key
++ return environ.get("MOZ_%s_KEY" % desc.upper().replace(" ", "_")) or no_key
return keyfile