sortix-mirror/ports/python/python.patch

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 -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();