Commit Graph

50 Commits

Author SHA1 Message Date
Joseph Henry
f601602cdb Resolved conflict for PR #167 2022-01-11 17:43:27 -08:00
Joseph Henry
f47d848fa4 Resolved conflict for PR #161 2022-01-11 17:39:24 -08:00
Joseph Henry
0c63732285 Merge branch 'feature_socket_err_msgs' of https://github.com/bostonrwalker/libzt into bostonrwalker-feature_socket_err_msgs 2022-01-11 12:51:22 -08:00
Joseph Henry
1d67973edb Merge branch 'feature_sendall' of https://github.com/bostonrwalker/libzt into bostonrwalker-feature_sendall 2022-01-11 09:48:20 -08:00
bostonrwalker
601032c42b Rename zt_wrap.cxx to zt_wrap.cpp
Reason: Python distutils invocation of SWIG will output "zt_wrap.cpp" instead of "zt_wrap.cxx", and if both files are present the compiler will get confused.
2022-01-11 12:17:22 -05:00
Boston Walker
c8c8a3bac2 Revert deletion of swig generated files 2021-12-31 10:34:09 -05:00
Boston Walker
894e52ab6c Migrated Python pkg mgmt to Poetry 2021-12-31 10:31:35 -05:00
Boston Walker
84b7e44873 Revert changes to libzt.py 2021-12-29 16:39:21 -05:00
Boston Walker
213f72edb9 #150 - Clean up socket error handling 2021-12-29 16:36:44 -05:00
Boston Walker
b2d53a4f5d #150 - cleaned up socket error messages 2021-12-29 16:36:44 -05:00
Boston Walker
3bb2dd4a52 Revert "#150 - cleaned up socket error messages"
This reverts commit 293f92355a.
2021-12-29 16:23:54 -05:00
Boston Walker
a4d2a83e7e Revert "#150 - Clean up socket error handling"
This reverts commit c84b3f2376.
2021-12-29 16:19:54 -05:00
Boston Walker
8bd4c3d061 Proper handling of PyBuf object 2021-12-29 11:33:46 -05:00
bostonrwalker
771a5ad905 Merge branch 'dev' into feature_timeout_methods 2021-12-28 13:39:30 -05:00
Boston Walker
ec55000ff6 Add zts_py_sendall() method 2021-12-28 13:33:58 -05:00
Boston Walker
7e690785a4 Add zts_py_settimeout() and zts_py_gettimeout() methods; Update Python c extension bindings using swig -c++ -python zt.i 2021-12-27 23:58:24 -05:00
Boston Walker
c84b3f2376 #150 - Clean up socket error handling 2021-12-27 16:34:10 -05:00
Boston Walker
99c16c4a9e Generated from swig -c++ -python zt.i 2021-12-27 16:18:45 -05:00
Boston Walker
293f92355a #150 - cleaned up socket error messages 2021-12-27 14:18:29 -05:00
Joseph Henry
d49667a55f Check Python version to determine proper timeout rounding mode 2021-05-30 21:49:16 -07:00
github-actions
54bb892aaa Code style enforcement 2021-05-31 04:21:46 +00:00
Joseph Henry
ef352cc8f3 Build fix for Python wrapper 2021-05-30 21:13:52 -07:00
Joseph Henry
7ae18961a7 Build fix for Python wrapper 2021-05-30 20:52:02 -07:00
github-actions
0a678a8c8a Code style enforcement 2021-05-31 02:52:00 +00:00
Joseph Henry
3ea146fa5b Possible fix for Python multithread bug #126 2021-05-30 19:36:19 -07:00
Joseph Henry
cd3265f8ae Add select, getsockopt, setsockopt, ioctl and fcntl to Python wrapper 2021-05-28 16:15:38 -07:00
Joseph Henry
9ee053ac36 Only invoke Python user callback if set by user 2021-05-26 18:17:37 -07:00
Joseph Henry
e7eaeadaee Remove unnecessary return statements in Python sockets error handler 2021-05-20 09:24:40 -07:00
Joseph Henry
81d03c3692 Make socket exceptions more specific to match Python semantics 2021-05-19 22:14:15 -07:00
Joseph Henry
4e0813d167 Add address getter method to Python wrapper 2021-05-19 21:33:08 -07:00
Joseph Henry
111dc7f5d9 Format Python code with (black) 2021-05-19 18:15:11 -07:00
github-actions
c4b9518361 Code style fixes 2021-05-06 07:06:35 +00:00
Joseph Henry
9151f4471c Slight re-org of C API naming convention 2021-05-05 16:19:27 -07:00
github-actions
2d2afce4f7 Code style fixes 2021-05-03 04:30:55 +00:00
Joseph Henry
6a77f0092f Update Python bindings to 1.4.0 API (WIP) 2021-05-02 21:30:21 -07:00
Joseph Henry
46eb8be174 Merge branch 'py_send_binary3' of https://github.com/linsomniac/libzt into linsomniac-py_send_binary3 2021-03-26 20:08:13 -07:00
Sean Reifschneider
5f6faaa5e8 Python send() with binary data
zts_py_send() was using strlen() to determine the length of the
send(). This works fine with strings, but fails with binary
data.

To fix this, I have removed the string encoding code, and
converted to using the Buffer protocol as is done in the
Python socketmodule send() implementation. This does mean
that this send() implementation only takes byte-like objects.

The workaround for this could be at the python level rather
than the C++ level.

NOTE: This implementation has a bug in the exception handling
if a non-bytes-like object is passed. You get an exception,
but the exception is not accurate, it reports the TypeError,
but the actual raised exception is due to there being a return
value when the error indicator is set. I spent a few hours
trying to fix this but was unable to. I'm afraid I just couldn't
figure it out.

My SSH proxy was misbehaving because the second block
of data going from the client to the server had a NUL byte as
the first byte to send, so the send was returning 0 bytes
sent, but that was due to send() being told to send 0 bytes.

With this, my SSH proxy is now working, including able to run
an rsync of my boot initrd over SSH over ZeroTier entirely in
userspace.
2021-03-20 13:01:50 -06:00
Sean Reifschneider
2ca8e01864 Fixing some bugs in socket blocking.
There were some bugs in my blocking code that are fixed in this.
I had the setblocking() flag reversed, and wasn't passing the
flag along to the underlying code properly.
2021-03-19 10:44:29 -06:00
Sean Reifschneider
14e70ec876 Assorted Python changes based on a code review.
Many changes were based on conventions in the Python socketmodule.

Changed many of the docstrings to match the Python socket library
conventions and enhancing them.  I can either remove the prototype
part or add it to other docstrings in the library, depending on
feedback I get.

Changed setblocking to use the flag argument instead of always
just setting NONBLOCK.

Added enable/disable threading around more lwip calls.

Implementing optional backlog on listen().

Removing a few seemingly unneeded Py_INCREF(Py_None) calls.

Moved getblocking function based on alpha sorting of names.
2021-03-18 22:55:37 -06:00
Joseph Henry
2e2a66c9f7 Move Python license into ext/THIRDPARTY.txt 2021-03-17 14:34:51 -07:00
Joseph Henry
73e26c1a79 Bugfix: Check argument types and encodings in zts_py_send() 2021-03-16 23:30:14 -07:00
Joseph Henry
bf1788919b Merge branch 'py_recv_bytes' of https://github.com/linsomniac/libzt into linsomniac-py_recv_bytes 2021-03-16 18:58:43 -07:00
Sean Reifschneider
7dbf42d899 Attempt to fix zts_recv for Python.
There were a few I'm attempting to fix in zts_py_recv():

Was allocating a static buffer of 4096, but taking whatever
length the user passed in.  This change allocates a PyBytes
object of the size the user requests.

Was converting to a string without giving a size.  Which probably
led to the UnicodeDecodeError I was seeing below, trying to
decode a character beyond the received bytes.  Would also lead
to problems reading binary data that included embedded NULs.
Used the number of bytes received as the size of the returned data.

Variable "err" was being used, changed that to "bytes_read" as
that's what lwip_recv() returns, with <0 bytes read indicating
error.

Read data was being returned as a Unicode string, leading to this
response when I tried talking to my SSH server:

    UnicodeDecodeError: 'utf-8' codec can't decode
    byte 0xa1 in position 42: invalid start byte

My ssh banner is 40 bytes long, so I think position 42 was outside
the received buffer.  Changed it to a PyBytes response as is
normal for network data.  This code was cribbed from the Python
socketmodule

This was producing this error, as it was still returning the tuple:

    SystemError: <built-in function zts_py_recv> returned a
    result with an error set

This indicates that the UnicodeDecodeError had set an exception,
but a tuple was being returned instead of NULL.

In the case of a lwip_recv() error, the error response was not
being sent back to the wrapper code.  Instead, a "return NULL;"
was done.  I changed this case to return the tuple (err, None)
to the wrapper.

NOTE: this code built using "./build.sh host-python release", but
there was some sort of build problem I didn't understand which
produced a _libzt.so that I couldn't import, due to:

    ImportError: dynamic module does not define module export
    function (PyInit__libzt)

So I don't have a way to test these changes.
2021-03-16 15:52:55 -06:00
Joseph Henry
2c5c1a6a5f Expose lwIP's DNS API in zts_* API. Fix preprocessor build bug 2021-03-16 00:31:45 -07:00
Joseph Henry
2a515822c8 Remove networking functions that can be found elsewhere 2021-03-15 01:59:18 -07:00
Joseph Henry
575cfc364e Remove non-standard API function accept4() 2021-03-13 21:22:44 -08:00
Joseph Henry
07a5830302 Add Python extension module wrapper code 2021-03-12 21:17:37 -08:00
Joseph Henry
dd6cf48d61 Run Python language bindings and example code through a linter and formatter 2021-03-07 21:11:21 -08:00
Joseph Henry
5072d993b1 Implement more of the Python language binding. Minor adjustments to PyPI package 2021-03-05 00:18:11 -08:00
Joseph Henry
64a0d5d0d7 Add working Python wrapper and examples (WIP) 2021-03-01 21:10:39 -08:00