sortix-mirror/ports/python/python.patch
Jonas 'Sortie' Termansen 9588b0d3db Add ports to the Sortix repository.
This change imports the ports collection from the former porttix and srctix
repositories and converts them to port(5) files with metadata pointing to
the upstream release tarballs with patches checked into this repository.
Ports are now developed and versioned along with the operating system and
are automatically built per the PACKAGES environment variable. The patches
are licensed under the same license as the relevant ports.

Tix has gained support for the new port(5) format. tix-port(8) is the new
high level ports build even point that handles downloading pstream releases
into the new mirror cache directory, applying the patches, building the port
with the lower-level tix-build(8), and finally installing the binary
package. The new tix-vars(8) program parses port(5) files and the new
tix-rmdiff(8) program produces input for tix-rmpatch(8).

The old doc/ directory is discontinued in favor of manual pages documenting
the new ports system.

The obsolete porttix-create(8) and srctix-create(8) programs are removed.
2022-06-13 22:29:53 +02:00

1217 lines
38 KiB
Diff

diff -Paur --no-dereference -- python.upstream/config.sub python/config.sub
--- python.upstream/config.sub
+++ python/config.sub
@@ -1360,7 +1360,7 @@
| -hpux* | -unos* | -osf* | -luna* | -dgux* | -auroraux* | -solaris* \
| -sym* | -kopensolaris* | -plan9* \
| -amigaos* | -amigados* | -msdos* | -newsos* | -unicos* | -aof* \
- | -aos* | -aros* \
+ | -aos* | -aros* | -sortix* \
| -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \
| -clix* | -riscos* | -uniplus* | -iris* | -rtu* | -xenix* \
| -hiux* | -386bsd* | -knetbsd* | -mirbsd* | -netbsd* \
diff -Paur --no-dereference -- python.upstream/configure python/configure
--- python.upstream/configure
+++ python/configure
@@ -3253,6 +3253,9 @@
*-*-cygwin*)
ac_sys_system=Cygwin
;;
+ *-*-sortix*)
+ ac_sys_system=Sortix
+ ;;
*)
# for now, limit cross builds to known configurations
MACHDEP="unknown"
@@ -3299,9 +3302,8 @@
_host_cpu=
;;
*)
- # for now, limit cross builds to known configurations
- MACHDEP="unknown"
- as_fn_error $? "cross build not supported for $host" "$LINENO" 5
+ _host_cpu=$host_cpu
+ ;;
esac
_PYTHON_HOST_PLATFORM="$MACHDEP${_host_cpu:+-$_host_cpu}"
fi
@@ -9279,7 +9281,9 @@
CYGWIN*)
LDSHARED="gcc -shared -Wl,--enable-auto-image-base"
LDCXXSHARED="g++ -shared -Wl,--enable-auto-image-base";;
- *) LDSHARED="ld";;
+ *)
+ LDSHARED='$(CC) -shared'
+ LDCXXSHARED='$(CXX) -shared';;
esac
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $LDSHARED" >&5
@@ -9619,6 +9623,50 @@
# pthread (first!) on Linux
fi
+# check if we need libiconv for iconv functions
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for libiconv in -liconv" >&5
+$as_echo_n "checking for libiconv in -liconv... " >&6; }
+if ${ac_cv_lib_iconv_iconv+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-liconv $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char libiconv ();
+int
+main ()
+{
+return libiconv ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ ac_cv_lib_iconv_libiconv=yes
+else
+ ac_cv_lib_iconv_libiconv=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_iconv_libiconv" >&5
+$as_echo "$ac_cv_lib_iconv_libiconv" >&6; }
+if test "x$ac_cv_lib_iconv_libiconv" = xyes; then :
+
+$as_echo "#define WITH_LIBICONV 1" >>confdefs.h
+
+ LIBS="-liconv $LIBS"
+fi
+
# check if we need libintl for locale functions
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for textdomain in -lintl" >&5
$as_echo_n "checking for textdomain in -lintl... " >&6; }
@@ -12709,7 +12757,7 @@
if test "${enable_ipv6+set}" = set; then
ac_cv_buggy_getaddrinfo="no -- configured with --(en|dis)able-ipv6"
else
- ac_cv_buggy_getaddrinfo=yes
+ ac_cv_buggy_getaddrinfo="no -- because you assume correctness when cross-compiling"
fi
else
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
@@ -12808,7 +12856,7 @@
if ac_fn_c_try_run "$LINENO"; then :
ac_cv_buggy_getaddrinfo=no
else
- ac_cv_buggy_getaddrinfo=yes
+ ac_cv_buggy_getaddrinfo="no -- because you assume correctness when cross-compiling"
fi
rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
conftest.$ac_objext conftest.beam conftest.$ac_ext
@@ -15712,7 +15760,7 @@
# first curses header check
ac_save_cppflags="$CPPFLAGS"
-CPPFLAGS="$CPPFLAGS -I/usr/include/ncursesw"
+# PATCH: Removed cross-compilation unsafe include path addition.
for ac_header in curses.h ncurses.h
do :
@@ -15908,6 +15956,12 @@
if test "x$cross_compiling" = xyes; then
if test "${ac_cv_file__dev_ptmx+set}" != set; then
+ ac_cv_file__dev_ptmx=yes
+ fi
+ if test "${ac_cv_file__dev_ptc+set}" != set; then
+ ac_cv_file__dev_ptc=no
+ fi
+ if test "${ac_cv_file__dev_ptmx+set}" != set; then
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for /dev/ptmx" >&5
$as_echo_n "checking for /dev/ptmx... " >&6; }
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: not set" >&5
diff -Paur --no-dereference -- python.upstream/configure.ac python/configure.ac
--- python.upstream/configure.ac
+++ python/configure.ac
@@ -385,6 +385,9 @@
*-*-cygwin*)
ac_sys_system=Cygwin
;;
+ *-*-sortix*)
+ ac_sys_system=Sortix
+ ;;
*)
# for now, limit cross builds to known configurations
MACHDEP="unknown"
@@ -431,9 +434,8 @@
_host_cpu=
;;
*)
- # for now, limit cross builds to known configurations
- MACHDEP="unknown"
- AC_MSG_ERROR([cross build not supported for $host])
+ _host_cpu=$host_cpu
+ ;;
esac
_PYTHON_HOST_PLATFORM="$MACHDEP${_host_cpu:+-$_host_cpu}"
fi
@@ -2535,7 +2537,9 @@
CYGWIN*)
LDSHARED="gcc -shared -Wl,--enable-auto-image-base"
LDCXXSHARED="g++ -shared -Wl,--enable-auto-image-base";;
- *) LDSHARED="ld";;
+ *)
+ LDSHARED='$(CC) -shared'
+ LDCXXSHARED='$(CXX) -shared';;
esac
fi
AC_MSG_RESULT($LDSHARED)
@@ -2679,6 +2683,12 @@
# pthread (first!) on Linux
fi
+# check if we need libiconv for iconv functions
+AC_CHECK_LIB(iconv, libiconv,
+ [AC_DEFINE(WITH_ICONV, 1,
+ [Define to 1 if libiconv is needed for iconv functions.])
+ LIBS="-liconv $LIBS"])
+
# check if we need libintl for locale functions
AC_CHECK_LIB(intl, textdomain,
[AC_DEFINE(WITH_LIBINTL, 1,
@@ -3871,7 +3881,7 @@
if test "${enable_ipv6+set}" = set; then
ac_cv_buggy_getaddrinfo="no -- configured with --(en|dis)able-ipv6"
else
- ac_cv_buggy_getaddrinfo=yes
+ ac_cv_buggy_getaddrinfo="no -- because you assume correctness when cross-compiling"
fi]))
fi
@@ -4980,6 +4990,12 @@
dnl NOTE: Inform user how to proceed with files when cross compiling.
if test "x$cross_compiling" = xyes; then
if test "${ac_cv_file__dev_ptmx+set}" != set; then
+ ac_cv_file__dev_ptmx=yes
+ fi
+ if test "${ac_cv_file__dev_ptc+set}" != set; then
+ ac_cv_file__dev_ptc=no
+ fi
+ if test "${ac_cv_file__dev_ptmx+set}" != set; then
AC_MSG_CHECKING([for /dev/ptmx])
AC_MSG_RESULT([not set])
AC_MSG_ERROR([set ac_cv_file__dev_ptmx to yes/no in your CONFIG_SITE file when cross compiling])
diff -Paur --no-dereference -- python.upstream/Include/py_curses.h python/Include/py_curses.h
--- python.upstream/Include/py_curses.h
+++ python/Include/py_curses.h
@@ -48,18 +48,25 @@
#include <ncurses.h>
#else
#include <curses.h>
+#endif
+/* PATCH: Some declarations are in term.h/termcap.h in Sortix's libcurses. */
#ifdef HAVE_TERM_H
/* for tigetstr, which is not declared in SysV curses */
#include <term.h>
+#if __has_include(<termcap.h>)
+#include <termcap.h>
#endif
#endif
#ifdef HAVE_NCURSES_H
/* configure was checking <curses.h>, but we will
use <ncurses.h>, which has all these features. */
+/* PATCH: Sortix's libcurses doesn't have a public _ISPAD */
+#ifdef _ISPAD
#ifndef WINDOW_HAS_FLAGS
#define WINDOW_HAS_FLAGS 1
#endif
+#endif
#ifndef MVWDELCH_IS_EXPRESSION
#define MVWDELCH_IS_EXPRESSION 1
#endif
diff -Paur --no-dereference -- python.upstream/Lib/ctypes/__init__.py python/Lib/ctypes/__init__.py
--- python.upstream/Lib/ctypes/__init__.py
+++ python/Lib/ctypes/__init__.py
@@ -429,7 +429,15 @@
elif _sys.platform == "cygwin":
pythonapi = PyDLL("libpython%d.%d.dll" % _sys.version_info[:2])
else:
- pythonapi = PyDLL(None)
+ # PATCH: Sortix doesn't have dynamic linking yet, but parts of ctypes are
+ # still useful without it, so ignore an error.
+ try:
+ pythonapi = PyDLL(None)
+ except OSError:
+ if _sys.platform == "sortix":
+ pythonapi = None
+ else:
+ raise
if _os.name == "nt":
diff -Paur --no-dereference -- python.upstream/Makefile.pre.in python/Makefile.pre.in
--- python.upstream/Makefile.pre.in
+++ python/Makefile.pre.in
@@ -604,6 +604,7 @@
*\ -s*|s*) quiet="-q";; \
*) quiet="";; \
esac; \
+ test $(MACHDEP) = sortix || \
$(RUNSHARED) CC='$(CC)' LDSHARED='$(BLDSHARED)' OPT='$(OPT)' \
_TCLTK_INCLUDES='$(TCLTK_INCLUDES)' _TCLTK_LIBS='$(TCLTK_LIBS)' \
$(PYTHON_FOR_BUILD) $(srcdir)/setup.py $$quiet build
@@ -1145,20 +1146,25 @@
else true; \
fi
(cd $(DESTDIR)$(BINDIR); $(LN) -s python$(VERSION)$(EXE) python3$(EXE))
+ -if test -f $(DESTDIR)$(BINDIR)/python$(EXE) -o -h $(DESTDIR)$(BINDIR)/python$(EXE); \
+ then rm -f $(DESTDIR)$(BINDIR)/python$(EXE); \
+ else true; \
+ fi
+ (cd $(DESTDIR)$(BINDIR); $(LN) -s python$(VERSION)$(EXE) python$(EXE))
-if test "$(VERSION)" != "$(LDVERSION)"; then \
- rm -f $(DESTDIR)$(BINDIR)/python$(VERSION)-config; \
- (cd $(DESTDIR)$(BINDIR); $(LN) -s python$(LDVERSION)-config python$(VERSION)-config); \
rm -f $(DESTDIR)$(LIBPC)/python-$(LDVERSION).pc; \
(cd $(DESTDIR)$(LIBPC); $(LN) -s python-$(VERSION).pc python-$(LDVERSION).pc); \
fi
- -rm -f $(DESTDIR)$(BINDIR)/python3-config
- (cd $(DESTDIR)$(BINDIR); $(LN) -s python$(VERSION)-config python3-config)
-rm -f $(DESTDIR)$(LIBPC)/python3.pc
(cd $(DESTDIR)$(LIBPC); $(LN) -s python-$(VERSION).pc python3.pc)
-rm -f $(DESTDIR)$(BINDIR)/idle3
(cd $(DESTDIR)$(BINDIR); $(LN) -s idle$(VERSION) idle3)
+ -rm -f $(DESTDIR)$(BINDIR)/idle
+ (cd $(DESTDIR)$(BINDIR); $(LN) -s idle$(VERSION) idle)
-rm -f $(DESTDIR)$(BINDIR)/pydoc3
(cd $(DESTDIR)$(BINDIR); $(LN) -s pydoc$(VERSION) pydoc3)
+ -rm -f $(DESTDIR)$(BINDIR)/pydoc
+ (cd $(DESTDIR)$(BINDIR); $(LN) -s pydoc$(VERSION) pydoc)
-rm -f $(DESTDIR)$(BINDIR)/2to3
(cd $(DESTDIR)$(BINDIR); $(LN) -s 2to3-$(VERSION) 2to3)
-rm -f $(DESTDIR)$(BINDIR)/pyvenv
@@ -1411,7 +1417,6 @@
$(INSTALL_SCRIPT) $(srcdir)/Modules/makesetup $(DESTDIR)$(LIBPL)/makesetup
$(INSTALL_SCRIPT) $(srcdir)/install-sh $(DESTDIR)$(LIBPL)/install-sh
$(INSTALL_SCRIPT) python-config.py $(DESTDIR)$(LIBPL)/python-config.py
- $(INSTALL_SCRIPT) python-config $(DESTDIR)$(BINDIR)/python$(LDVERSION)-config
@if [ -s Modules/python.exp -a \
"`echo $(MACHDEP) | sed 's/^\(...\).*/\1/'`" = "aix" ]; then \
echo; echo "Installing support files for building shared extension modules on AIX:"; \
@@ -1637,6 +1642,8 @@
-o -name '*.orig' -o -name '*.rej' \
-o -name '*.bak' ')' \
-exec rm -f {} ';'
+ -rm -rf $(srcdir)/Lib/plat-sortix
+ -rm -f Misc/python-config.sh
# Check for smelly exported symbols (not starting with Py/_Py)
smelly: all
diff -Paur --no-dereference -- python.upstream/Modules/_cursesmodule.c python/Modules/_cursesmodule.c
--- python.upstream/Modules/_cursesmodule.c
+++ python/Modules/_cursesmodule.c
@@ -116,7 +116,7 @@
#defines many common symbols (such as "lines") which breaks the
curses module in other ways. So the code will just specify
explicit prototypes here. */
-extern int setupterm(char *,int,int *);
+/* PATCH: We use term.h now so let that header declare setupterm. */
#ifdef __sgi
#include <term.h>
#endif
@@ -142,6 +142,14 @@
#include "clinic/_cursesmodule.c.h"
+/* PATCH: Avoid conflict with <term.h> as described above now that we use it. */
+#ifdef lines
+#undef lines
+#endif
+#ifdef columns
+#undef columns
+#endif
+
/* Definition of exception curses.error */
static PyObject *PyCursesError;
@@ -475,7 +483,10 @@
Window_NoArgNoReturnVoidFunction(wclear)
Window_OneArgNoReturnVoidFunction(idcok, int, "i;True(1) or False(0)")
+/* PATCH: Sortix's libcurses doesn't have these declarations. */
+#ifndef __sortix__
Window_OneArgNoReturnVoidFunction(immedok, int, "i;True(1) or False(0)")
+#endif
Window_OneArgNoReturnVoidFunction(wtimeout, int, "i;delay")
Window_NoArg2TupleReturnFunction(getyx, int, "ii")
@@ -499,7 +510,9 @@
Window_OneArgNoReturnFunction(notimeout, int, "i;True(1) or False(0)")
Window_OneArgNoReturnFunction(scrollok, int, "i;True(1) or False(0)")
Window_OneArgNoReturnFunction(winsdelln, int, "i;nlines")
+#ifndef __sortix__
Window_OneArgNoReturnFunction(syncok, int, "i;True(1) or False(0)")
+#endif
Window_TwoArgNoReturnFunction(mvwin, int, "ii;y,x")
Window_TwoArgNoReturnFunction(mvderwin, int, "ii;y,x")
@@ -2024,7 +2037,9 @@
{"hline", (PyCFunction)PyCursesWindow_Hline, METH_VARARGS},
{"idcok", (PyCFunction)PyCursesWindow_idcok, METH_VARARGS},
{"idlok", (PyCFunction)PyCursesWindow_idlok, METH_VARARGS},
+#ifndef __sortix__
{"immedok", (PyCFunction)PyCursesWindow_immedok, METH_VARARGS},
+#endif
{"inch", (PyCFunction)PyCursesWindow_InCh, METH_VARARGS},
{"insch", (PyCFunction)PyCursesWindow_InsCh, METH_VARARGS},
{"insdelln", (PyCFunction)PyCursesWindow_winsdelln, METH_VARARGS},
@@ -2060,7 +2075,9 @@
{"subpad", (PyCFunction)PyCursesWindow_SubWin, METH_VARARGS},
{"subwin", (PyCFunction)PyCursesWindow_SubWin, METH_VARARGS},
{"syncdown", (PyCFunction)PyCursesWindow_wsyncdown, METH_NOARGS},
+#ifndef __sortix__
{"syncok", (PyCFunction)PyCursesWindow_syncok, METH_VARARGS},
+#endif
{"syncup", (PyCFunction)PyCursesWindow_wsyncup, METH_NOARGS},
{"timeout", (PyCFunction)PyCursesWindow_wtimeout, METH_VARARGS},
{"touchline", (PyCFunction)PyCursesWindow_TouchLine, METH_VARARGS},
@@ -2152,6 +2169,7 @@
NoArgNoReturnVoidFunction(flushinp)
NoArgNoReturnVoidFunction(noqiflush)
+#ifndef __sortix__
static PyObject *
PyCurses_filter(PyObject *self)
{
@@ -2161,6 +2179,7 @@
Py_INCREF(Py_None);
return Py_None;
}
+#endif
static PyObject *
PyCurses_Color_Content(PyObject *self, PyObject *args)
@@ -2232,6 +2251,7 @@
return PyBytes_FromStringAndSize(&ch, 1);
}
+#ifndef __sortix__
static PyObject *
PyCurses_getsyx(PyObject *self)
{
@@ -2244,6 +2264,7 @@
return Py_BuildValue("(ii)", y, x);
}
+#endif
#ifdef NCURSES_MOUSE_VERSION
static PyObject *
@@ -2355,6 +2376,7 @@
}
#ifndef STRICT_SYSV_CURSES
+#ifndef __sortix__
/* No has_key! */
static PyObject * PyCurses_has_key(PyObject *self, PyObject *args)
{
@@ -2371,6 +2393,7 @@
Py_INCREF(Py_True);
return Py_True;
}
+#endif
#endif /* STRICT_SYSV_CURSES */
static PyObject *
@@ -2938,6 +2961,7 @@
}
#endif /* HAVE_CURSES_RESIZE_TERM */
+#ifndef __sortix__
static PyObject *
PyCurses_setsyx(PyObject *self, PyObject *args)
{
@@ -2957,6 +2981,7 @@
Py_INCREF(Py_None);
return Py_None;
}
+#endif
static PyObject *
PyCurses_Start_Color(PyObject *self)
@@ -3055,6 +3080,7 @@
return PyBytes_FromString(result);
}
+#ifndef __sortix__
static PyObject *
PyCurses_TypeAhead(PyObject *self, PyObject *args)
{
@@ -3066,6 +3092,7 @@
return PyCursesCheckERR(typeahead( fd ), "typeahead");
}
+#endif
static PyObject *
PyCurses_UnCtrl(PyObject *self, PyObject *args)
@@ -3165,6 +3192,7 @@
}
#endif
+#ifndef __sortix__
static PyObject *
PyCurses_Use_Env(PyObject *self, PyObject *args)
{
@@ -3183,6 +3211,7 @@
Py_INCREF(Py_None);
return Py_None;
}
+#endif
#ifndef STRICT_SYSV_CURSES
static PyObject *
@@ -3221,21 +3250,27 @@
{"echo", (PyCFunction)PyCurses_echo, METH_VARARGS},
{"endwin", (PyCFunction)PyCurses_endwin, METH_NOARGS},
{"erasechar", (PyCFunction)PyCurses_EraseChar, METH_NOARGS},
+#ifndef __sortix__
{"filter", (PyCFunction)PyCurses_filter, METH_NOARGS},
+#endif
{"flash", (PyCFunction)PyCurses_flash, METH_NOARGS},
{"flushinp", (PyCFunction)PyCurses_flushinp, METH_NOARGS},
#ifdef NCURSES_MOUSE_VERSION
{"getmouse", (PyCFunction)PyCurses_GetMouse, METH_NOARGS},
{"ungetmouse", (PyCFunction)PyCurses_UngetMouse, METH_VARARGS},
#endif
+#ifndef __sortix__
{"getsyx", (PyCFunction)PyCurses_getsyx, METH_NOARGS},
+#endif
{"getwin", (PyCFunction)PyCurses_GetWin, METH_O},
{"has_colors", (PyCFunction)PyCurses_has_colors, METH_NOARGS},
{"has_ic", (PyCFunction)PyCurses_has_ic, METH_NOARGS},
{"has_il", (PyCFunction)PyCurses_has_il, METH_NOARGS},
+#ifndef __sortix__
#ifndef STRICT_SYSV_CURSES
{"has_key", (PyCFunction)PyCurses_has_key, METH_VARARGS},
#endif
+#endif
{"halfdelay", (PyCFunction)PyCurses_HalfDelay, METH_VARARGS},
{"init_color", (PyCFunction)PyCurses_Init_Color, METH_VARARGS},
{"init_pair", (PyCFunction)PyCurses_Init_Pair, METH_VARARGS},
@@ -3279,7 +3314,9 @@
{"resize_term", (PyCFunction)PyCurses_Resize_Term, METH_VARARGS},
#endif
{"savetty", (PyCFunction)PyCurses_savetty, METH_NOARGS},
+#ifndef __sortix__
{"setsyx", (PyCFunction)PyCurses_setsyx, METH_VARARGS},
+#endif
{"setupterm", (PyCFunction)PyCurses_setupterm,
METH_VARARGS|METH_KEYWORDS},
{"start_color", (PyCFunction)PyCurses_Start_Color, METH_NOARGS},
@@ -3289,7 +3326,9 @@
{"tigetnum", (PyCFunction)PyCurses_tigetnum, METH_VARARGS},
{"tigetstr", (PyCFunction)PyCurses_tigetstr, METH_VARARGS},
{"tparm", (PyCFunction)PyCurses_tparm, METH_VARARGS},
+#ifndef __sortix__
{"typeahead", (PyCFunction)PyCurses_TypeAhead, METH_VARARGS},
+#endif
{"unctrl", (PyCFunction)PyCurses_UnCtrl, METH_VARARGS},
{"ungetch", (PyCFunction)PyCurses_UngetCh, METH_VARARGS},
#if defined(HAVE_CURSES_RESIZETERM) || defined(HAVE_CURSES_RESIZE_TERM)
@@ -3298,7 +3337,9 @@
#ifdef HAVE_NCURSESW
{"unget_wch", (PyCFunction)PyCurses_Unget_Wch, METH_VARARGS},
#endif
+#ifndef __sortix__
{"use_env", (PyCFunction)PyCurses_Use_Env, METH_VARARGS},
+#endif
#ifndef STRICT_SYSV_CURSES
{"use_default_colors", (PyCFunction)PyCurses_Use_Default_Colors, METH_NOARGS},
#endif
diff -Paur --no-dereference -- python.upstream/Modules/expat/xmlparse.c python/Modules/expat/xmlparse.c
--- python.upstream/Modules/expat/xmlparse.c
+++ python/Modules/expat/xmlparse.c
@@ -693,9 +693,15 @@
static unsigned long
generate_hash_secret_salt(void)
{
+#if defined(__sortix__)
+ unsigned long result;
+ arc4random_buf(&result, sizeof(result));
+ return result;
+#else
unsigned int seed = time(NULL) % UINT_MAX;
srand(seed);
return rand();
+#endif
}
static XML_Bool /* only valid for root parser */
diff -Paur --no-dereference -- python.upstream/Modules/faulthandler.c python/Modules/faulthandler.c
--- python.upstream/Modules/faulthandler.c
+++ python/Modules/faulthandler.c
@@ -14,6 +14,10 @@
# include <sys/resource.h>
#endif
+#if defined(__sortix__) && !defined(SIGSTKSZ)
+#define SIGSTKSZ (64 * 1024) /* just some value */
+#endif
+
/* Allocate at maximum 100 MB of the stack to raise the stack overflow */
#define STACK_OVERFLOW_MAX_SIZE (100*1024*1024)
diff -Paur --no-dereference -- python.upstream/Modules/fcntlmodule.c python/Modules/fcntlmodule.c
--- python.upstream/Modules/fcntlmodule.c
+++ python/Modules/fcntlmodule.c
@@ -288,6 +288,10 @@
Py_BEGIN_ALLOW_THREADS
ret = flock(fd, code);
Py_END_ALLOW_THREADS
+#elif defined(__sortix__)
+ errno = ENOSYS;
+ PyErr_SetFromErrno(PyExc_IOError);
+ return NULL;
#else
#ifndef LOCK_SH
@@ -371,6 +375,11 @@
#define LOCK_UN 8 /* unlock */
#endif /* LOCK_SH */
{
+#if defined(__sortix__)
+ errno = ENOSYS;
+ PyErr_SetFromErrno(PyExc_IOError);
+ return NULL;
+#else
struct flock l;
if (code == LOCK_UN)
l.l_type = F_UNLCK;
@@ -410,6 +419,7 @@
Py_BEGIN_ALLOW_THREADS
ret = fcntl(fd, (code & LOCK_NB) ? F_SETLK : F_SETLKW, &l);
Py_END_ALLOW_THREADS
+#endif
}
if (ret < 0) {
PyErr_SetFromErrno(PyExc_IOError);
diff -Paur --no-dereference -- python.upstream/Modules/getpath.c python/Modules/getpath.c
--- python.upstream/Modules/getpath.c
+++ python/Modules/getpath.c
@@ -131,6 +131,11 @@
return err;
}
+static const char* fix_empty_prefix(const char* path)
+{
+ return path[0] ? path : "/";
+}
+
static void
reduce(wchar_t *dir)
{
@@ -492,8 +497,8 @@
wchar_t *lib_python;
_pythonpath = Py_DecodeLocale(PYTHONPATH, NULL);
- _prefix = Py_DecodeLocale(PREFIX, NULL);
- _exec_prefix = Py_DecodeLocale(EXEC_PREFIX, NULL);
+ _prefix = Py_DecodeLocale(fix_empty_prefix(PREFIX), NULL);
+ _exec_prefix = Py_DecodeLocale(fix_empty_prefix(EXEC_PREFIX), NULL);
lib_python = Py_DecodeLocale("lib/python" VERSION, NULL);
if (!_pythonpath || !_prefix || !_exec_prefix || !lib_python) {
diff -Paur --no-dereference -- python.upstream/Modules/mmapmodule.c python/Modules/mmapmodule.c
--- python.upstream/Modules/mmapmodule.c
+++ python/Modules/mmapmodule.c
@@ -599,7 +599,7 @@
#ifdef MS_WINDOWS
return PyLong_FromLong((long) FlushViewOfFile(self->data+offset, size));
-#elif defined(UNIX)
+#elif defined(UNIX) && !defined(__sortix__)
/* XXX semantics of return value? */
/* XXX flags for msync? */
if (-1 == msync(self->data + offset, size, MS_SYNC)) {
diff -Paur --no-dereference -- python.upstream/Modules/posixmodule.c python/Modules/posixmodule.c
--- python.upstream/Modules/posixmodule.c
+++ python/Modules/posixmodule.c
@@ -5734,15 +5734,6 @@
#endif /* HAVE_SCHED_H */
-/* AIX uses /dev/ptc but is otherwise the same as /dev/ptmx */
-/* IRIX has both /dev/ptc and /dev/ptmx, use ptmx */
-#if defined(HAVE_DEV_PTC) && !defined(HAVE_DEV_PTMX)
-#define DEV_PTY_FILE "/dev/ptc"
-#define HAVE_DEV_PTMX
-#else
-#define DEV_PTY_FILE "/dev/ptmx"
-#endif
-
#if defined(HAVE_OPENPTY) || defined(HAVE_FORKPTY) || defined(HAVE_DEV_PTMX)
#ifdef HAVE_PTY_H
#include <pty.h>
@@ -5807,7 +5798,7 @@
goto error;
#else
- master_fd = open(DEV_PTY_FILE, O_RDWR | O_NOCTTY); /* open master */
+ master_fd = posix_openpt(O_RDWR | O_NOCTTY); /* open master */
if (master_fd < 0)
goto posix_error;
@@ -8925,6 +8916,7 @@
return posix_error();
#endif
+#ifdef HAVE_PUTENV
/* Remove the key from posix_putenv_garbage;
* this will cause it to be collected. This has to
* happen after the real unsetenv() call because the
@@ -8934,6 +8926,7 @@
/* really not much we can do; just leak */
PyErr_Clear();
}
+#endif
Py_RETURN_NONE;
}
#endif /* HAVE_UNSETENV */
diff -Paur --no-dereference -- python.upstream/Modules/resource.c python/Modules/resource.c
--- python.upstream/Modules/resource.c
+++ python/Modules/resource.c
@@ -9,6 +9,10 @@
#include <unistd.h>
#endif
+#if defined(__sortix__) && !defined(RLIM_NLIMITS)
+#define RLIM_NLIMITS __RLIMIT_NUM_DECLARED
+#endif
+
/* On some systems, these aren't in any header file.
On others they are, with inconsistent prototypes.
We declare the (default) return type, to shut up gcc -Wall;
@@ -83,6 +87,7 @@
PyFloat_FromDouble(doubletime(ru.ru_utime)));
PyStructSequence_SET_ITEM(result, 1,
PyFloat_FromDouble(doubletime(ru.ru_stime)));
+#if !defined(__sortix__)
PyStructSequence_SET_ITEM(result, 2, PyLong_FromLong(ru.ru_maxrss));
PyStructSequence_SET_ITEM(result, 3, PyLong_FromLong(ru.ru_ixrss));
PyStructSequence_SET_ITEM(result, 4, PyLong_FromLong(ru.ru_idrss));
@@ -97,6 +102,7 @@
PyStructSequence_SET_ITEM(result, 13, PyLong_FromLong(ru.ru_nsignals));
PyStructSequence_SET_ITEM(result, 14, PyLong_FromLong(ru.ru_nvcsw));
PyStructSequence_SET_ITEM(result, 15, PyLong_FromLong(ru.ru_nivcsw));
+#endif
if (PyErr_Occurred()) {
Py_DECREF(result);
diff -Paur --no-dereference -- python.upstream/Modules/Setup.dist python/Modules/Setup.dist
--- python.upstream/Modules/Setup.dist
+++ python/Modules/Setup.dist
@@ -97,6 +97,8 @@
COREPYTHONPATH=$(DESTPATH)$(SITEPATH)$(TESTPATH)$(MACHDEPPATH)$(EXTRAMACHDEPPATH)
PYTHONPATH=$(COREPYTHONPATH)
+# PATCH: Build all the modules into the python binary rather than shared libs.
+
# The modules listed here can't be built as shared libraries for
# various reasons; therefore they are listed here instead of in the
@@ -164,45 +166,44 @@
# it, depending on your system -- see the GNU readline instructions.
# It's okay for this to be a shared library, too.
-#readline readline.c -lreadline -ltermcap
+readline readline.c -lreadline -ltermcap
# Modules that should always be present (non UNIX dependent):
-#array arraymodule.c # array objects
-#cmath cmathmodule.c _math.c # -lm # complex math library functions
-#math mathmodule.c _math.c # -lm # math library functions, e.g. sin()
-#_struct _struct.c # binary structure packing/unpacking
-#_weakref _weakref.c # basic weak reference support
+array arraymodule.c # array objects
+cmath cmathmodule.c # -lm # complex math library functions
+math mathmodule.c _math.c # -lm # math library functions, e.g. sin()
+_struct _struct.c # binary structure packing/unpacking
#_testcapi _testcapimodule.c # Python C API test module
-#_random _randommodule.c # Random number generator
-#_elementtree -I$(srcdir)/Modules/expat -DHAVE_EXPAT_CONFIG_H -DUSE_PYEXPAT_CAPI _elementtree.c # elementtree accelerator
-#_pickle _pickle.c # pickle accelerator
-#_datetime _datetimemodule.c # datetime accelerator
-#_bisect _bisectmodule.c # Bisection algorithms
-#_heapq _heapqmodule.c # Heap queue algorithm
-#_asyncio _asynciomodule.c # Fast asyncio Future
+_random _randommodule.c # Random number generator
+_elementtree -I$(srcdir)/Modules/expat -DHAVE_EXPAT_CONFIG_H -DUSE_PYEXPAT_CAPI _elementtree.c # elementtree accelerator
+_pickle _pickle.c # pickle accelerator
+_datetime _datetimemodule.c # datetime accelerator
+_bisect _bisectmodule.c # Bisection algorithms
+_heapq _heapqmodule.c # Heap queue algorithm
+_asyncio _asynciomodule.c # Fast asyncio Future
-#unicodedata unicodedata.c # static Unicode character database
+unicodedata unicodedata.c # static Unicode character database
# Modules with some UNIX dependencies -- on by default:
# (If you have a really backward UNIX, select and socket may not be
# supported...)
-#fcntl fcntlmodule.c # fcntl(2) and ioctl(2)
+fcntl fcntlmodule.c # fcntl(2) and ioctl(2)
#spwd spwdmodule.c # spwd(3)
-#grp grpmodule.c # grp(3)
-#select selectmodule.c # select(2); not on ancient System V
+grp grpmodule.c # grp(3)
+select selectmodule.c # select(2); not on ancient System V
# Memory-mapped files (also works on Win32).
-#mmap mmapmodule.c
+mmap mmapmodule.c
# CSV file helper
-#_csv _csv.c
+_csv _csv.c
# Socket module helper for socket(2)
-#_socket socketmodule.c
+_socket socketmodule.c
# Socket module helper for SSL support; you must comment out the other
# socket line above, and possibly edit the SSL variable:
@@ -210,6 +211,7 @@
#_ssl _ssl.c \
# -DUSE_SSL -I$(SSL)/include -I$(SSL)/include/openssl \
# -L$(SSL)/lib -lssl -lcrypto
+_ssl _ssl.c -DUSE_SSL -lssl -lcrypto
# The crypt module is now disabled by default because it breaks builds
# on many systems (where -lcrypt is needed), e.g. Linux (I believe).
@@ -223,10 +225,10 @@
# are not supported by all UNIX systems:
#nis nismodule.c -lnsl # Sun yellow pages -- not everywhere
-#termios termios.c # Steen Lumholt's termios module
-#resource resource.c # Jeremy Hylton's rlimit interface
+termios termios.c # Steen Lumholt's termios module
+resource resource.c # Jeremy Hylton's rlimit interface
-#_posixsubprocess _posixsubprocess.c # POSIX subprocess module helper
+_posixsubprocess _posixsubprocess.c # POSIX subprocess module helper
# Multimedia modules -- off by default.
# These don't work for 64-bit platforms!!!
@@ -242,17 +244,18 @@
# The _md5 module implements the RSA Data Security, Inc. MD5
# Message-Digest Algorithm, described in RFC 1321.
-#_md5 md5module.c
+_md5 md5module.c
# The _sha module implements the SHA checksum algorithms.
# (NIST's Secure Hash Algorithms.)
-#_sha1 sha1module.c
-#_sha256 sha256module.c
-#_sha512 sha512module.c
+_sha1 sha1module.c
+_sha256 sha256module.c
+_sha512 sha512module.c
+_sha3 _sha3/sha3module.c
# _blake module
-#_blake2 _blake2/blake2module.c _blake2/blake2b_impl.c _blake2/blake2s_impl.c
+_blake2 _blake2/blake2module.c _blake2/blake2b_impl.c _blake2/blake2s_impl.c
# The _tkinter module.
#
@@ -298,7 +301,7 @@
# -lX11
# Lance Ellinghaus's syslog module
-#syslog syslogmodule.c # syslog daemon interface
+syslog syslogmodule.c # syslog daemon interface
# Curses support, requiring the System V version of curses, often
@@ -307,9 +310,9 @@
#
# First, look at Setup.config; configure may have set this for you.
-#_curses _cursesmodule.c -lcurses -ltermcap
+_curses _cursesmodule.c -lcurses -ltermcap
# Wrapper for the panel library that's part of ncurses and SYSV curses.
-#_curses_panel _curses_panel.c -lpanel -lncurses
+_curses_panel _curses_panel.c -lpanel -lncurses
# Modules that provide persistent dictionary-like semantics. You will
@@ -336,10 +339,10 @@
# Helper module for various ascii-encoders
-#binascii binascii.c
+binascii binascii.c
# Fred Drake's interface to the Python parser
-#parser parsermodule.c
+parser parsermodule.c
# Lee Busby's SIGFPE modules.
@@ -357,12 +360,12 @@
#fpectl fpectlmodule.c ...
# Test module for fpectl. No extra libraries needed.
-#fpetest fpetestmodule.c
+fpetest fpetestmodule.c
# Andrew Kuchling's zlib module.
# This require zlib 1.1.3 (or later).
# See http://www.gzip.org/zlib/
-#zlib zlibmodule.c -I$(prefix)/include -L$(exec_prefix)/lib -lz
+zlib zlibmodule.c -I$(prefix)/include -L$(exec_prefix)/lib -lz
# Interface to the Expat XML parser
#
@@ -375,22 +378,29 @@
#
# More information on Expat can be found at www.libexpat.org.
#
-#pyexpat expat/xmlparse.c expat/xmlrole.c expat/xmltok.c pyexpat.c -I$(srcdir)/Modules/expat -DHAVE_EXPAT_CONFIG_H -DUSE_PYEXPAT_CAPI
+pyexpat expat/xmlparse.c expat/xmlrole.c expat/xmltok.c pyexpat.c -I$(srcdir)/Modules/expat -DHAVE_EXPAT_CONFIG_H -DUSE_PYEXPAT_CAPI
# Hye-Shik Chang's CJKCodecs
# multibytecodec is required for all the other CJK codec modules
-#_multibytecodec cjkcodecs/multibytecodec.c
+_multibytecodec cjkcodecs/multibytecodec.c
-#_codecs_cn cjkcodecs/_codecs_cn.c
-#_codecs_hk cjkcodecs/_codecs_hk.c
-#_codecs_iso2022 cjkcodecs/_codecs_iso2022.c
-#_codecs_jp cjkcodecs/_codecs_jp.c
-#_codecs_kr cjkcodecs/_codecs_kr.c
-#_codecs_tw cjkcodecs/_codecs_tw.c
+_codecs_cn cjkcodecs/_codecs_cn.c
+_codecs_hk cjkcodecs/_codecs_hk.c
+_codecs_iso2022 cjkcodecs/_codecs_iso2022.c
+_codecs_jp cjkcodecs/_codecs_jp.c
+_codecs_kr cjkcodecs/_codecs_kr.c
+_codecs_tw cjkcodecs/_codecs_tw.c
# Example -- included for reference only:
# xx xxmodule.c
# Another example -- the 'xxsubtype' module shows C-level subtyping in action
xxsubtype xxsubtype.c
+
+# PATCH: The rest of the modules that weren't mentioned in this file.
+_bz2 _bz2module.c -lbz2
+_ctypes _ctypes/callbacks.c _ctypes/callproc.c _ctypes/cfield.c _ctypes/_ctypes.c _ctypes/_ctypes_test.c _ctypes/malloc_closure.c _ctypes/stgdict.c -lffi
+_lsprof _lsprof.c rotatingtree.c
+_lzma _lzmamodule.c -llzma
+_opcode _opcode.c
diff -Paur --no-dereference -- python.upstream/Modules/socketmodule.c python/Modules/socketmodule.c
--- python.upstream/Modules/socketmodule.c
+++ python/Modules/socketmodule.c
@@ -83,6 +83,17 @@
*/
+#if defined(__sortix__)
+struct hostent
+{
+ char *h_name;
+ char **h_aliases;
+ int h_addrtype;
+ int h_length;
+ char **h_addr_list;
+};
+#endif
+
#ifdef __APPLE__
#include <AvailabilityMacros.h>
/* for getaddrinfo thread safety test on old versions of OS X */
@@ -479,6 +490,12 @@
#define INADDR_NONE (-1)
#endif
+#if defined(__sortix__)
+#define h_errno 0
+#define gethostbyname(a) ((void) (a), (struct hostent*) NULL)
+#define gethostbyaddr(a, b, c) ((void) (a), (void) (b), (void) (c), (struct hostent*) NULL)
+#endif
+
/* XXX There's a problem here: *static* functions are not supposed to have
a Py prefix (or use CapitalizedWords). Later... */
@@ -5628,6 +5645,10 @@
static PyObject*
socket_inet_aton(PyObject *self, PyObject *args)
{
+/* PATCH: Sortix only has the modern inet_pton. */
+#if defined(HAVE_INET_PTON) && !defined(HAVE_INET_ATON) && !defined(HAVE_INET_ADDR)
+ struct in_addr buf;
+#else
#ifdef HAVE_INET_ATON
struct in_addr buf;
#endif
@@ -5639,11 +5660,21 @@
/* Have to use inet_addr() instead */
unsigned int packed_addr;
#endif
+#endif
char *ip_addr;
if (!PyArg_ParseTuple(args, "s:inet_aton", &ip_addr))
return NULL;
+#if defined(HAVE_INET_PTON) && !defined(HAVE_INET_ATON) && !defined(HAVE_INET_ADDR)
+ if (inet_pton(AF_INET, ip_addr, &buf))
+ return PyBytes_FromStringAndSize((char *)(&buf),
+ sizeof(buf));
+
+ PyErr_SetString(PyExc_OSError,
+ "illegal IP address string passed to inet_aton");
+ return NULL;
+#else
#ifdef HAVE_INET_ATON
@@ -5688,6 +5719,8 @@
#endif
#endif
+
+#endif
}
PyDoc_STRVAR(inet_ntoa_doc,
@@ -5700,6 +5733,7 @@
{
Py_buffer packed_ip;
struct in_addr packed_addr;
+ char addr[INET_ADDRSTRLEN];
if (!PyArg_ParseTuple(args, "y*:inet_ntoa", &packed_ip)) {
return NULL;
@@ -5715,7 +5749,9 @@
memcpy(&packed_addr, packed_ip.buf, packed_ip.len);
PyBuffer_Release(&packed_ip);
- return PyUnicode_FromString(inet_ntoa(packed_addr));
+ /* PATCH: Sortix only has the modern inet_ntop. */
+ inet_ntop(AF_INET, &packed_addr, addr, sizeof(addr));
+ return PyUnicode_FromString(addr);
}
#if defined(HAVE_INET_PTON) || defined(MS_WINDOWS)
diff -Paur --no-dereference -- python.upstream/Modules/_ssl.c python/Modules/_ssl.c
--- python.upstream/Modules/_ssl.c
+++ python/Modules/_ssl.c
@@ -101,6 +101,9 @@
#if (OPENSSL_VERSION_NUMBER >= 0x10100000L) && !defined(LIBRESSL_VERSION_NUMBER)
# define OPENSSL_VERSION_1_1 1
+/* PATCH: The libressl shipped with Sortix is new enough.*/
+#elif !defined(OPENSSL_VERSION_1_1) && defined(LIBRESSL_VERSION_NUMBER) && 0x3000200fL <= LIBRESSL_VERSION_NUMBER
+# define OPENSSL_VERSION_1_1 1
#endif
/* Openssl comes with TLSv1.1 and TLSv1.2 between 1.0.0h and 1.0.1
diff -Paur --no-dereference -- python.upstream/Modules/timemodule.c python/Modules/timemodule.c
--- python.upstream/Modules/timemodule.c
+++ python/Modules/timemodule.c
@@ -1198,13 +1198,25 @@
#if defined(HAVE_TZNAME) && !defined(__GLIBC__) && !defined(__CYGWIN__)
PyObject *otz0, *otz1;
tzset();
+#if defined(__sortix__) && !defined(__SORTIX_HAS_TIMEZONE__)
+ PyModule_AddIntConstant(m, "timezone", 0);
+#else
PyModule_AddIntConstant(m, "timezone", timezone);
+#endif
#ifdef HAVE_ALTZONE
PyModule_AddIntConstant(m, "altzone", altzone);
#else
+#if defined(__sortix__) && !defined(__SORTIX_HAS_ALTZONE__)
+ PyModule_AddIntConstant(m, "altzone", 0);
+#else
PyModule_AddIntConstant(m, "altzone", timezone-3600);
#endif
+#endif
+#if defined(__sortix__) && !defined(__SORTIX_HAS_DAYLIGHT__)
+ PyModule_AddIntConstant(m, "daylight", 0);
+#else
PyModule_AddIntConstant(m, "daylight", daylight);
+#endif
otz0 = PyUnicode_DecodeLocale(tzname[0], "surrogateescape");
otz1 = PyUnicode_DecodeLocale(tzname[1], "surrogateescape");
PyModule_AddObject(m, "tzname", Py_BuildValue("(NN)", otz0, otz1));
diff -Paur --no-dereference -- python.upstream/Python/fileutils.c python/Python/fileutils.c
--- python.upstream/Python/fileutils.c
+++ python/Python/fileutils.c
@@ -1387,7 +1387,9 @@
wchar_t *resolved_path, size_t resolved_path_size)
{
char *cpath;
+#if !defined(__sortix__)
char cresolved_path[MAXPATHLEN];
+#endif
wchar_t *wresolved_path;
char *res;
size_t r;
@@ -1396,12 +1398,21 @@
errno = EINVAL;
return NULL;
}
+#if defined(__sortix__)
+ res = realpath(cpath, NULL);
+#else
res = realpath(cpath, cresolved_path);
+#endif
PyMem_Free(cpath);
if (res == NULL)
return NULL;
+#if defined(__sortix__)
+ wresolved_path = Py_DecodeLocale(res, &r);
+ free(res);
+#else
wresolved_path = Py_DecodeLocale(cresolved_path, &r);
+#endif
if (wresolved_path == NULL) {
errno = EINVAL;
return NULL;
@@ -1411,7 +1422,11 @@
errno = EINVAL;
return NULL;
}
+#if defined(__sortix__)
+ wcslcpy(resolved_path, wresolved_path, resolved_path_size);
+#else
wcsncpy(resolved_path, wresolved_path, resolved_path_size);
+#endif
PyMem_RawFree(wresolved_path);
return resolved_path;
}
diff -Paur --no-dereference -- python.upstream/Python/random.c python/Python/random.c
--- python.upstream/Python/random.c
+++ python/Python/random.c
@@ -1,9 +1,15 @@
+#if defined(__sortix__)
+#define HAVE_ARC4RANDOM
+#endif
+
#include "Python.h"
#ifdef MS_WINDOWS
# include <windows.h>
/* All sample MSDN wincrypt programs include the header below. It is at least
* required with Min GW. */
# include <wincrypt.h>
+#elif defined(HAVE_ARC4RANDOM)
+# include <stdlib.h>
#else
# include <fcntl.h>
# ifdef HAVE_SYS_STAT_H
@@ -26,6 +32,7 @@
static int _Py_HashSecret_Initialized = 0;
#endif
+#ifndef HAVE_ARC4RANDOM
#ifdef MS_WINDOWS
static HCRYPTPROV hCryptProv = 0;
@@ -351,6 +358,7 @@
}
#endif
+#endif /* !defined(HAVE_ARC4RANDOM) */
/* Fill buffer with pseudo-random bytes generated by a linear congruent
generator (LCG):
@@ -373,6 +381,7 @@
}
}
+#if !defined(HAVE_ARC4RANDOM)
/* If raise is zero:
- Don't raise exceptions on error
- Don't call PyErr_CheckSignals() on EINTR (retry directly the interrupted
@@ -401,6 +410,7 @@
return dev_urandom(buffer, size, blocking, raise);
#endif
}
+#endif /* !defined(HAVE_ARC4RANDOM) */
/* Fill buffer with size pseudo-random bytes from the operating system random
number generator (RNG). It is suitable for most cryptographic purposes
@@ -414,7 +424,12 @@
int
_PyOS_URandom(void *buffer, Py_ssize_t size)
{
+#ifdef HAVE_ARC4RANDOM
+ arc4random_buf(buffer, size);
+ return 0;
+#else
return pyurandom(buffer, size, 1, 1);
+#endif
}
/* Fill buffer with size pseudo-random bytes from the operating system random
@@ -428,7 +443,12 @@
int
_PyOS_URandomNonblock(void *buffer, Py_ssize_t size)
{
+#ifdef HAVE_ARC4RANDOM
+ arc4random_buf(buffer, size);
+ return 0;
+#else
return pyurandom(buffer, size, 0, 1);
+#endif
}
void
@@ -469,6 +489,7 @@
}
}
else {
+#ifndef HAVE_ARC4RANDOM
int res;
/* _PyRandom_Init() is called very early in the Python initialization
@@ -480,6 +501,9 @@
if (res < 0) {
Py_FatalError("failed to get random numbers to initialize Python");
}
+#else
+ arc4random_buf(secret, secret_size);
+#endif
}
}
@@ -491,7 +515,7 @@
CryptReleaseContext(hCryptProv, 0);
hCryptProv = 0;
}
-#elif defined(PY_GETENTROPY)
+#elif defined(HAVE_ARC4RANDOM) || defined(PY_GETENTROPY)
/* nothing to clean */
#else
dev_urandom_close();