]> arthur.barton.de Git - bup.git/commitdiff
bup_py_bytes_main: add to support py 3.6 compat
authorRob Browning <rlb@defaultvalue.org>
Sat, 27 Mar 2021 18:54:54 +0000 (13:54 -0500)
committerRob Browning <rlb@defaultvalue.org>
Sun, 28 Mar 2021 21:25:18 +0000 (16:25 -0500)
Signed-off-by: Rob Browning <rlb@defaultvalue.org>
Makefile
dev/python.c
lib/cmd/bup.c
src/bup/compat.c [new file with mode: 0644]
src/bup/compat.h [new file with mode: 0644]

index 028894eba686884f3af973199ef0fcce4b9208cd..75dd85c3b0ada1850f5ad2266a5b6c100a3d5a44 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -158,11 +158,11 @@ config/config.h: config/config.vars
 clean_paths += config/config.h.tmp
 
 cc_bin = $(CC) $(embed_cflags) $(CFLAGS) $^ $(embed_ldflags) $(LDFLAGS) -fPIE \
-  $(OUTPUT_OPTION)
+  -I src $(OUTPUT_OPTION)
 
 clean_paths += dev/python-proposed
 generated_dependencies += dev/python-proposed.d
-dev/python-proposed: dev/python.c
+dev/python-proposed: dev/python.c src/bup/compat.c src/bup/io.c
        rm -f dev/python
        $(cc_bin)
 
@@ -174,18 +174,18 @@ dev/python: dev/python-proposed
 clean_paths += dev/bup-exec
 generated_dependencies += dev/bup-exec.d
 dev/bup-exec: CFLAGS += -D BUP_DEV_BUP_EXEC=1
-dev/bup-exec: lib/cmd/bup.c src/bup/io.c
+dev/bup-exec: lib/cmd/bup.c src/bup/compat.c src/bup/io.c
        $(cc_bin)
 
 clean_paths += dev/bup-python
 generated_dependencies += dev/bup-python.d
 dev/bup-python: CFLAGS += -D BUP_DEV_BUP_PYTHON=1
-dev/bup-python: lib/cmd/bup.c src/bup/io.c
+dev/bup-python: lib/cmd/bup.c src/bup/compat.c src/bup/io.c
        $(cc_bin)
 
 clean_paths += lib/cmd/bup
 generated_dependencies += lib/cmd/bup.d
-lib/cmd/bup: lib/cmd/bup.c src/bup/io.c
+lib/cmd/bup: lib/cmd/bup.c src/bup/compat.c src/bup/io.c
        $(cc_bin)
 
 clean_paths += lib/bup/_helpers$(soext)
index 0c4150818e0e324b01be0bacbc69513021db7be0..88df9e2d2c97ee35868f48d4bce955a97cca38a5 100644 (file)
@@ -8,10 +8,14 @@
 //   http://docs.python.org/3/c-api/intro.html#include-files
 #include <Python.h>
 
-#if PY_MAJOR_VERSION > 2
-#define bup_py_main Py_BytesMain
-# else
-#define bup_py_main Py_Main
+#include "bup/compat.h"
+
+#if PY_MAJOR_VERSION == 3 && PY_MINOR_VERSION < 8
+# define bup_py_main bup_py_bytes_main
+#elif PY_MAJOR_VERSION > 2
+# define bup_py_main Py_BytesMain
+#else
+# define bup_py_main Py_Main
 #endif
 
 int main(int argc, char **argv)
index 636c017967eedd231be7b67282bf715fa392f48d..132f62ed99e24a5a46db9277364ae7b973817b93 100644 (file)
@@ -21,6 +21,7 @@
 #include <sys/types.h>
 #include <unistd.h>
 
+#include "bup/compat.h"
 #include "bup/io.h"
 
 static int prog_argc = 0;
@@ -311,10 +312,12 @@ prepend_lib_to_pythonpath(const char * const exec_path,
     free(parent);
 }
 
-#if PY_MAJOR_VERSION > 2
-#define bup_py_main Py_BytesMain
-# else
-#define bup_py_main Py_Main
+#if PY_MAJOR_VERSION == 3 && PY_MINOR_VERSION < 8
+# define bup_py_main bup_py_bytes_main
+#elif PY_MAJOR_VERSION > 2
+# define bup_py_main Py_BytesMain
+#else
+# define bup_py_main Py_Main
 #endif
 
 #if defined(BUP_DEV_BUP_PYTHON) && defined(BUP_DEV_BUP_EXEC)
diff --git a/src/bup/compat.c b/src/bup/compat.c
new file mode 100644 (file)
index 0000000..a1ae8ee
--- /dev/null
@@ -0,0 +1,44 @@
+
+#define PY_SSIZE_T_CLEAN
+#define _GNU_SOURCE  1 // asprintf
+#undef NDEBUG
+
+// According to Python, its header has to go first:
+//   http://docs.python.org/2/c-api/intro.html#include-files
+//   http://docs.python.org/3/c-api/intro.html#include-files
+#include <Python.h>
+
+#include "bup/compat.h"
+#include "bup/io.h"
+
+#if PY_MAJOR_VERSION == 3 && PY_MINOR_VERSION < 8
+
+int bup_py_bytes_main(int argc, char **argv)
+{
+    wchar_t **wargv = PyMem_RawMalloc(argc * sizeof(wchar_t *));
+    if (!wargv)
+        die(2, "memory insufficient to decode command line arguments");
+    int i;
+    for (i = 0; i < argc; i++) {
+        size_t wargn;
+        wargv[i] = Py_DecodeLocale(argv[i], &wargn);
+        if (!wargv[i]) {
+            switch (wargn) {
+            case (size_t) -1:
+                die(2, "too little memory to decode command line argument %d\n",
+                    i);
+                break;
+            case (size_t) -2:
+                die(2, "unable to decode command line argument %d\n", i);
+                break;
+            default:
+                die(2, "unexpected error from Py_DecodeLocale(): %zu\n", wargn);
+                break;
+            }
+            exit(2);
+        }
+    }
+    return Py_Main(argc, wargv);
+}
+
+#endif // PY_MAJOR_VERSION == 3 && PY_MINOR_VERSION < 8
diff --git a/src/bup/compat.h b/src/bup/compat.h
new file mode 100644 (file)
index 0000000..2e3797c
--- /dev/null
@@ -0,0 +1,3 @@
+#pragma once
+
+int bup_py_bytes_main(int argc, char **argv);