Script 'mail_helper' called by obssrc Hello community, here is the log from the commit of package gensio for openSUSE:Factory checked in at 2026-09-09 16:22:09 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/gensio (Old) and /work/SRC/openSUSE:Factory/.gensio.new.1265 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "gensio" Wed Sep 9 16:22:09 2026 rev:29 rq:1376596 version:3.0.4 Changes: -------- --- /work/SRC/openSUSE:Factory/gensio/gensio.changes 2026-07-23 23:14:04.572142717 +0200 +++ /work/SRC/openSUSE:Factory/.gensio.new.1265/gensio.changes 2026-09-09 16:23:49.985741508 +0200 @@ -1,0 +2,17 @@ +Thu Sep 3 12:02:49 UTC 2026 - Martin Hauke <[email protected]> + +- Update to version 3.0.4 + * soapysdr would not compile static. + * Some python2 APIs were converted to Python 3 for SWIG 4.5.0 + compatibility. + * An ssh compatibility mode was added to gtlssh. This deals with + how parameters are parsed. If you invoke it as gsh, parameters + are parsed as ssh does. If invoked as gtlssh, they are parsed + like gtlssh does (which is arguably more sane). There is also + a parameter to do this. This helps when using it with git and + rsync and such. This is described in the gtlssh man page. + * In the fsk (afskmdm) gensio, low sample rates were broken + because the gain was not set properly in the FIR filter + implementation. + +------------------------------------------------------------------- Old: ---- gensio-3.0.3.tar.gz New: ---- gensio-3.0.4.tar.gz ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ gensio.spec ++++++ --- /var/tmp/diff_new_pack.DdE2h3/_old 2026-09-09 16:23:50.634768633 +0200 +++ /var/tmp/diff_new_pack.DdE2h3/_new 2026-09-09 16:23:50.636768716 +0200 @@ -27,7 +27,7 @@ %bcond_with openipmi %endif Name: gensio -Version: 3.0.3 +Version: 3.0.4 Release: 0 Summary: Library to abstract stream and packet I/O # examples/* is licenced under Apache-2.0 ++++++ gensio-3.0.3.tar.gz -> gensio-3.0.4.tar.gz ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/gensio-3.0.3/RELEASE_PROCESS.rst new/gensio-3.0.4/RELEASE_PROCESS.rst --- old/gensio-3.0.3/RELEASE_PROCESS.rst 2026-07-21 20:11:33.000000000 +0200 +++ new/gensio-3.0.4/RELEASE_PROCESS.rst 2026-08-12 02:45:29.000000000 +0200 @@ -78,8 +78,9 @@ * rm $HOME/install/Gensio/lib/*.la -* Then run the "Inno Setup Compiler" and select gensio.iss in the - main gensio directory. +* Stop gtlsshd in the task scheduler. Then run the "Inno Setup + Compiler" and select gensio.iss in the main gensio directory. Then + restart gtlsshd after the install completes. * The output will be named "Gensio.exe" in the home directory. Rename it "Gensio-x.x.x-windows.exe" and copy that to the Linux system diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/gensio-3.0.3/c++/swig/pygensio/pygensio.i new/gensio-3.0.4/c++/swig/pygensio/pygensio.i --- old/gensio-3.0.3/c++/swig/pygensio/pygensio.i 2026-07-21 20:11:33.000000000 +0200 +++ new/gensio-3.0.4/c++/swig/pygensio/pygensio.i 2026-08-12 02:45:29.000000000 +0200 @@ -132,7 +132,7 @@ ; o = PyTuple_New(len); for (i = 0; i < len; i++) - PyTuple_SetItem(o, i, PyString_FromString(val[i])); + PyTuple_SetItem(o, i, PyUnicode_FromString(val[i])); return o; } } @@ -380,7 +380,7 @@ $1 = &temp; } %typemap(argout) unsigned int *outval { - $result = PI_add_result($result, PyInt_FromLong(*$1)); + $result = PI_add_result($result, PyLong_FromLong(*$1)); } // Handling of nested waiters and python callback. diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/gensio-3.0.3/configure.ac new/gensio-3.0.4/configure.ac --- old/gensio-3.0.3/configure.ac 2026-07-21 20:11:33.000000000 +0200 +++ new/gensio-3.0.4/configure.ac 2026-08-12 02:45:29.000000000 +0200 @@ -1,7 +1,7 @@ -AC_INIT([gensio],[3.0.3],[[email protected]]) +AC_INIT([gensio],[3.0.4],[[email protected]]) AC_SUBST(gensio_VERSION_MAJOR, 3) AC_SUBST(gensio_VERSION_MINOR, 0) -AC_SUBST(gensio_VERSION_PATCH, 3) +AC_SUBST(gensio_VERSION_PATCH, 4) AC_SUBST(gensio_VERSION_STRING, ${PACKAGE_VERSION}) AC_CANONICAL_TARGET AM_INIT_AUTOMAKE([-Wall]) @@ -2066,7 +2066,7 @@ AC_MSG_ERROR("soapy enabled but libSoapySDR not found") fi BASE_LIBS="$BASE_LIBS $LIBSOAPY_LIBS" - BUILTIN_GENSIOS="$BUILTIN_GENSIOS libsoapy" + BUILTIN_GENSIOS="$BUILTIN_GENSIOS soapy" BUILTIN_SOAPY=1 ;; dynamic) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/gensio-3.0.3/gensio.iss new/gensio-3.0.4/gensio.iss --- old/gensio-3.0.3/gensio.iss 2026-07-21 20:11:33.000000000 +0200 +++ new/gensio-3.0.4/gensio.iss 2026-08-12 02:45:29.000000000 +0200 @@ -2,7 +2,7 @@ ; SEE THE DOCUMENTATION FOR DETAILS ON CREATING INNO SETUP SCRIPT FILES! #define MyAppName "Gensio" -#define MyAppVersion "3.0.3" +#define MyAppVersion "3.0.4" ; This should match "C - A" in the GENSIO_LIB_VERSION in the autoconf ; file. So if GENSIO_LIB_VERSION is "12:0:2", this value will be "10". ; "C" is the first value in GENSIO_LIB_VERSION, "A" is the last. diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/gensio-3.0.3/lib/filters.h new/gensio-3.0.4/lib/filters.h --- old/gensio-3.0.3/lib/filters.h 2026-07-21 20:11:33.000000000 +0200 +++ new/gensio-3.0.4/lib/filters.h 2026-08-12 02:45:29.000000000 +0200 @@ -318,6 +318,8 @@ else filt->do_filter = float_fir_filter; + filt->gain = gain; + /* Calculate the FIR h parameters. */ filt->coefs = calc_fir_coefs(o, framerate, cutoff, transition_freq, &filt->coefs_n); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/gensio-3.0.3/swig/python/gensio_langinfo.i new/gensio-3.0.4/swig/python/gensio_langinfo.i --- old/gensio-3.0.3/swig/python/gensio_langinfo.i 2026-07-21 20:11:33.000000000 +0200 +++ new/gensio-3.0.4/swig/python/gensio_langinfo.i 2026-08-12 02:45:29.000000000 +0200 @@ -60,7 +60,7 @@ } %typemap(argout) (long *r_int) { - PyObject *r = PyInt_FromLong(*$1); + PyObject *r = PyLong_FromLong(*$1); $result = add_python_result($result, r); } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/gensio-3.0.3/swig/python/gensio_python.h new/gensio-3.0.4/swig/python/gensio_python.h --- old/gensio-3.0.3/swig/python/gensio_python.h 2026-07-21 20:11:33.000000000 +0200 +++ new/gensio-3.0.4/swig/python/gensio_python.h 2026-08-12 02:45:29.000000000 +0200 @@ -67,9 +67,9 @@ #define OI_PI_StringCheck PyUnicode_Check #define OI_PI_FromStringAndSize PyUnicode_FromStringAndSize #else -#define OI_PI_BytesCheck PyString_Check +#define OI_PI_BytesCheck PyBytes_Check #define OI_PI_AsBytesAndSize PyString_AsStringAndSize -#define OI_PI_StringCheck PyString_Check +#define OI_PI_StringCheck PyBytes_Check #define OI_PI_FromStringAndSize PyString_FromStringAndSize #endif @@ -365,7 +365,7 @@ args = PyTuple_New(3); gensio_pyref(io); PyTuple_SET_ITEM(args, 0, io_ref.val); - o = PyInt_FromLong(err); + o = PyLong_FromLong(err); PyTuple_SET_ITEM(args, 1, o); o = PyBytes_FromStringAndSize(buf, len); PyTuple_SET_ITEM(args, 2, o); @@ -393,7 +393,7 @@ args = PyTuple_New(2); ref_gensio_data(data); PyTuple_SET_ITEM(args, 0, io_ref.val); - o = PyInt_FromLong(val); + o = PyLong_FromLong(val); PyTuple_SET_ITEM(args, 1, o); swig_finish_call(data->handler_val, func, args, true); @@ -578,7 +578,7 @@ len++; o = PyTuple_New(len); for (i = 0; i < len; i++) - PyTuple_SetItem(o, i, PyString_FromString(auxdata[i])); + PyTuple_SetItem(o, i, PyUnicode_FromString(auxdata[i])); return o; } } @@ -706,7 +706,7 @@ args = PyTuple_New(3); ref_gensio_data(data); PyTuple_SET_ITEM(args, 0, io_ref.val); - o = PyInt_FromLong(readerr); + o = PyLong_FromLong(readerr); PyTuple_SET_ITEM(args, 1, o); if (auxdata && auxdata[0]) { o = OI_PI_FromString(auxdata[0]); @@ -753,8 +753,8 @@ *buflen = len; memcpy(buf, p, *buflen); rv = 0; - } else if (PyInt_Check(o)) { - rv = PyInt_AsLong(o); + } else if (PyLong_Check(o)) { + rv = PyLong_AsLong(o); } Py_DecRef(o); } @@ -802,8 +802,8 @@ *buflen = len; } } - } else if (PyInt_Check(o)) { - rv = PyInt_AsLong(o); + } else if (PyLong_Check(o)) { + rv = PyLong_AsLong(o); } Py_DecRef(o); } @@ -842,9 +842,9 @@ args = PyTuple_New(3); ref_gensio_data(data); PyTuple_SET_ITEM(args, 0, io_ref.val); - o = PyInt_FromLong(height); + o = PyLong_FromLong(height); PyTuple_SET_ITEM(args, 1, o); - o = PyInt_FromLong(width); + o = PyLong_FromLong(width); PyTuple_SET_ITEM(args, 2, o); swig_finish_call(data->handler_val, "win_size", args, true); break; @@ -1041,7 +1041,7 @@ PyTuple_SET_ITEM(args, 0, acc_ref.val); PyTuple_SET_ITEM(args, 1, io_ref.val); if (opterr >= 0) { - o = PyInt_FromLong(opterr); + o = PyLong_FromLong(opterr); PyTuple_SET_ITEM(args, 2, o); if (optstr) { o = OI_PI_FromString(optstr); @@ -1177,8 +1177,8 @@ pwvfy->password_len = len; memcpy(pwvfy->password, p, pwvfy->password_len); rv = 0; - } else if (PyInt_Check(o)) { - rv = PyInt_AsLong(o); + } else if (PyLong_Check(o)) { + rv = PyLong_AsLong(o); } Py_DecRef(o); } @@ -1234,8 +1234,8 @@ pwvfy->password_len = len; } } - } else if (PyInt_Check(o)) { - rv = PyInt_AsLong(o); + } else if (PyLong_Check(o)) { + rv = PyLong_AsLong(o); } Py_DecRef(o); } @@ -1374,8 +1374,8 @@ args = PyTuple_New(9); PyTuple_SET_ITEM(args, 0, PyBool_FromLong(state == GENSIO_MDNS_WATCH_NEW_DATA)); - PyTuple_SET_ITEM(args, 1, PyInt_FromLong(ipinterface)); - PyTuple_SET_ITEM(args, 2, PyInt_FromLong(ipdomain)); + PyTuple_SET_ITEM(args, 1, PyLong_FromLong(ipinterface)); + PyTuple_SET_ITEM(args, 2, PyLong_FromLong(ipdomain)); PyTuple_SET_ITEM(args, 3, OI_PI_FromStringN(name)); PyTuple_SET_ITEM(args, 4, OI_PI_FromStringN(type)); PyTuple_SET_ITEM(args, 5, OI_PI_FromStringN(domain)); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/gensio-3.0.3/swig/python/python_swig_internals.h new/gensio-3.0.4/swig/python/python_swig_internals.h --- old/gensio-3.0.3/swig/python/python_swig_internals.h 2026-07-21 20:11:33.000000000 +0200 +++ new/gensio-3.0.4/swig/python/python_swig_internals.h 2026-08-12 02:45:29.000000000 +0200 @@ -52,8 +52,8 @@ #define OI_PI_FromString PyUnicode_FromString #define OI_PI_AsString PyUnicode_AsUTF8 #else -#define OI_PI_FromString PyString_FromString -#define OI_PI_AsString PyString_AsString +#define OI_PI_FromString PyUnicode_FromString +#define OI_PI_AsString PyBytes_AsString #endif GENSIO_DLL_PUBLIC diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/gensio-3.0.3/tools/gtlssh.1 new/gensio-3.0.4/tools/gtlssh.1 --- old/gensio-3.0.3/tools/gtlssh.1 2026-07-21 20:11:33.000000000 +0200 +++ new/gensio-3.0.4/tools/gtlssh.1 2026-08-12 02:45:29.000000000 +0200 @@ -17,7 +17,7 @@ .BR gsh is a synonym for .BR gtlssh -and at some point may replace it. +that runs in ssh compatibility by default. .BR gtlsshd will attempt an SCTP connection first, and fall back to TCP if that @@ -50,6 +50,25 @@ See ESCAPES below for more details on the escape character. Only handled on io1. .TP +.I \-\-ssh-compat +Enable ssh-compatible command handling. Default for gsh, off by +default for gtlssh. + +gtlssh normally handles commands by passing individual arguments over +as separate arguments then passing them to the remote command as such. +In ssh compatible mode, it will work like ssh, combining all remaining +arguments with a space between them and passing them as a single +command. + +gtlssh command handling is a little more sane, if you run "gsh server +ls '/a b'" it will do what you expect. ssh will not. But some +programs expect it to work as ssh does. + +Added in gensio-3.0.4. +.TP +.I \-\-nossh-compat +Disable ssh-compatible command handling. +.TP .I \-r|\-\-telnet Do telnet processing with RFC2217 handling. .TP diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/gensio-3.0.3/tools/gtlssh.c new/gensio-3.0.4/tools/gtlssh.c --- old/gensio-3.0.3/tools/gtlssh.c 2026-07-21 20:11:33.000000000 +0200 +++ new/gensio-3.0.4/tools/gtlssh.c 2026-08-12 02:45:29.000000000 +0200 @@ -382,6 +382,10 @@ printf(" -e, --escchar - Set the local terminal escape character.\n" " Set to -1 to disable the escape character\n" " Default is ^\\ for tty stdin and disabled for non-tty stdin\n"); + printf(" --ssh-compat - Enable ssh compatible string handling.\n" + " (default for gsh)\n"); + printf(" --nossh-compat - Disable ssh compatible string handling.\n" + " (default for no gsh)\n"); printf(" --nosctp - Disable SCTP support (default).\n"); printf(" --sctp - Disable SCTP support.\n"); printf(" --notcp - Disable TCP support.\n"); @@ -1795,7 +1799,7 @@ gensiods service_len, len; const char *transport = "sctp(readbuf=20000)"; bool user_transport = false, mdns_transport = false; - bool notcp = false, nosctp = true; + bool notcp = false, nosctp = true, ssh_compat = false; /* * The buffer sizes are carefully chosen here to mesh with ssl and * mux. ssl can encrypt up to 16384 bytes at a time, and the @@ -1812,6 +1816,15 @@ const char *mdns_type = "_iostream._tcp"; const char *val_2fa = "", *pfx_2fa = ""; + s = strrchr(argv[0], '/'); + if (s) + s++; + else + s = argv[0]; + if (strcmp(s, "gsh") == 0) + ssh_compat = true; + s = NULL; + memset(&userdata1, 0, sizeof(userdata1)); memset(&userdata2, 0, sizeof(userdata2)); userdata1.interactive = true; @@ -1910,6 +1923,12 @@ } else if ((err = cmparg_int(argc, argv, &arg, "-e", "--escchar", &escape_char))) { ; + } else if ((err = cmparg(argc, argv, &arg, NULL, "--ssh-compat", + NULL))) { + ssh_compat = true; + } else if ((err = cmparg(argc, argv, &arg, NULL, "--nossh-compat", + NULL))) { + ssh_compat = false; } else if ((err = cmparg(argc, argv, &arg, NULL, "--nomux", NULL))) { muxstr = ""; use_mux = false; @@ -2025,36 +2044,60 @@ unsigned int svclen = 0; /* User gave us a remote program. */ - for (i = arg; i < argc; i++) { - svclen += strlen(argv[i]) + 1; /* Extra space for nil at end */ - if (argv[i][0] == '\0' || argv[i][0] == '\xff') - /* See note below on why we do this. */ - svclen += 1; + if (ssh_compat) { + for (i = arg; i < argc; i++) { + if (i != arg) + svclen++; /* Leading space. */ + svclen += strlen(argv[i]); + } + svclen += 10; /* Space for "program2:" and final nil. */ + } else { + for (i = arg; i < argc; i++) { + svclen += strlen(argv[i]) + 1; /* Extra space for nil at end */ + if (argv[i][0] == '\0' || argv[i][0] == '\xff') + /* See note below on why we do this. */ + svclen += 1; + } + svclen += 9; /* Space for "program:" and final nil. */ + /* Note that ending '\0' is handled by final space. */ } - svclen += 9; /* Space for "program:" and final nil. */ - /* Note that ending '\0' is handled by final space. */ service = malloc(svclen); if (!service) { fprintf(stderr, "Unable to allocate remote program request\n"); return 1; } - strcpy(service, "program:"); - svclen = 8; - for (i = arg; i < argc; i++) { - if (argv[i][0] == '\0' || argv[i][0] == '\xff') - /* - * Send a "\xff" as the first character for an empty - * string. Otherwize and empty string will look like - * the \0\0 used to mark the end. Also add a '\xff" - * for a parameter starting with 0xff. We will drop - * it on the other side. - */ - service[svclen++] = '\xff'; - svclen += sprintf(service + svclen, "%s", argv[i]); + + if (ssh_compat) { + strcpy(service, "program2:"); + svclen = 9; + for (i = arg; i < argc; i++) { + unsigned int len = strlen(argv[i]); + + if (i != arg) + service[svclen++] = ' '; /* Leading space. */ + memcpy(service + svclen, argv[i], len); + svclen += len; + } + service[svclen++] = '\0'; + } else { + strcpy(service, "program:"); + svclen = 8; + for (i = arg; i < argc; i++) { + if (argv[i][0] == '\0' || argv[i][0] == '\xff') + /* + * Send a "\xff" as the first character for an empty + * string. Otherwize and empty string will look like + * the \0\0 used to mark the end. Also add a '\xff" + * for a parameter starting with 0xff. We will drop + * it on the other side. + */ + service[svclen++] = '\xff'; + svclen += sprintf(service + svclen, "%s", argv[i]); + service[svclen++] = '\0'; + } service[svclen++] = '\0'; } - service[svclen++] = '\0'; userdata1.ios = io1_default_notty; userdata1.interactive = false; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/gensio-3.0.3/tools/gtlsshd.c new/gensio-3.0.4/tools/gtlsshd.c --- old/gensio-3.0.3/tools/gtlsshd.c 2026-07-21 20:11:33.000000000 +0200 +++ new/gensio-3.0.4/tools/gtlsshd.c 2026-08-12 02:45:29.000000000 +0200 @@ -2258,9 +2258,7 @@ unsigned int env_len = 0; const char **penv2 = NULL; bool rv = false; -#ifndef _WIN32 char *cmdbuf = NULL; -#endif len = 0; err = gensio_control(io, 0, GENSIO_CONTROL_GET, GENSIO_CONTROL_SERVICE, @@ -2285,7 +2283,32 @@ gensio_err_to_str(err)); goto out_free; } - if (strstartswith(service, "program:")) { + if (strstartswith(service, "program2:")) { + char *str = strchr(service, ':'); + + str++; + progv = o->zalloc(o, 4 * sizeof(*progv)); + if (!progv) { + log_event(LOG_ERR, "Could not allocate progv memory"); + goto out_free; + } + + cmdbuf = gensio_strdup(o, str); + if (!cmdbuf) { + log_event(LOG_ERR, "Could not allocate command memory"); + goto out_free; + } + + progv[0] = auth->ushell; + progv[1] = "-c"; + progv[2] = cmdbuf; + progv[3] = NULL; + + /* Dummy out the program, we will set it later with a control. */ + s = gensio_alloc_sprintf(o, + "stdio(stderr-to-stdout,readbuf=16384),dummy"); + do_chdir = true; + } else if (strstartswith(service, "program:")) { char *str = strchr(service, ':'), **svals; #ifdef _WIN32 unsigned int nsvals;
